feat(use-case-controls): relevant als Stufe statt Hard-Filter + Provenance
CI / test-python-backend (push) Successful in 30s
CI / test-python-document-crawler (push) Has been skipped
CI / guardrail-integrity (push) Has been skipped
CI / test-python-dsms-gateway (push) Has been skipped
CI / secret-scan (push) Has been skipped
CI / dep-audit (push) Has been skipped
CI / sbom-scan (push) Has been skipped
CI / build-sha-integrity (push) Successful in 12s
CI / validate-canonical-controls (push) Successful in 12s
CI / loc-budget (push) Successful in 25s
CI / go-lint (push) Has been skipped
CI / detect-changes (push) Successful in 15s
CI / python-lint (push) Has been skipped
CI / nodejs-lint (push) Has been skipped
CI / branch-name (push) Has been skipped
CI / nodejs-build (push) Successful in 3m9s
CI / test-go (push) Has been skipped
CI / iace-gt-coverage (push) Has been skipped
CI / test-python-backend (push) Successful in 30s
CI / test-python-document-crawler (push) Has been skipped
CI / guardrail-integrity (push) Has been skipped
CI / test-python-dsms-gateway (push) Has been skipped
CI / secret-scan (push) Has been skipped
CI / dep-audit (push) Has been skipped
CI / sbom-scan (push) Has been skipped
CI / build-sha-integrity (push) Successful in 12s
CI / validate-canonical-controls (push) Successful in 12s
CI / loc-budget (push) Successful in 25s
CI / go-lint (push) Has been skipped
CI / detect-changes (push) Successful in 15s
CI / python-lint (push) Has been skipped
CI / nodejs-lint (push) Has been skipped
CI / branch-name (push) Has been skipped
CI / nodejs-build (push) Successful in 3m9s
CI / test-go (push) Has been skipped
CI / iace-gt-coverage (push) Has been skipped
Der harte relevant=true-Filter versteckte ~25% des Korpus (40.926 Atome), ~70% davon echte Pflichten (500er-Validierung). relevant wird zur Stufe: - Service: tier-Param (core=Default schuetzt Agent/CRA; all=alles inkl. review), ORDER BY relevant DESC; pro Control relevant/tier/source_type (own_library bei license_rule=3, sonst derived) + source_regulation/article; core_count/review_count. Pure Helper tier_label + source_type (+ Tests). - Route: optionaler tier-Query (default core) — contract-safe (additiv). - Frontend: Coverage-Drill-down /sdk/coverage/[useCase] — Kern-Pflichten vs. "zur fachlichen Pruefung", je mit Herkunfts-Badge; Uebersicht zeigt Delta. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -3,9 +3,23 @@ import {
|
||||
licenseTierBadgeClass,
|
||||
commercialBadgeClass,
|
||||
groupUseCases,
|
||||
provenanceLabel,
|
||||
provenanceBadgeClass,
|
||||
splitByTier,
|
||||
severityBadgeClass,
|
||||
type UseCaseRow,
|
||||
type ControlItem,
|
||||
} from './_helpers'
|
||||
|
||||
const ctrl = (over: Partial<ControlItem>): ControlItem => ({
|
||||
id: 'id',
|
||||
title: 'T',
|
||||
relevant: true,
|
||||
tier: 'core',
|
||||
source_type: 'derived',
|
||||
...over,
|
||||
})
|
||||
|
||||
const uc = (over: Partial<UseCaseRow>): UseCaseRow => ({
|
||||
key: 'x',
|
||||
label: 'X',
|
||||
@@ -52,4 +66,44 @@ describe('coverage helpers', () => {
|
||||
])
|
||||
expect(groups.map((g) => g.group)).toEqual(['document', 'mystery'])
|
||||
})
|
||||
|
||||
it('provenance label: own library vs derived (with document + article)', () => {
|
||||
expect(provenanceLabel(ctrl({ source_type: 'own_library' }))).toBe(
|
||||
'Eigene Bibliothek',
|
||||
)
|
||||
expect(
|
||||
provenanceLabel(
|
||||
ctrl({ source_type: 'derived', source_regulation: 'DSGVO' }),
|
||||
),
|
||||
).toBe('Abgeleitet · DSGVO')
|
||||
expect(
|
||||
provenanceLabel(
|
||||
ctrl({
|
||||
source_type: 'derived',
|
||||
source_regulation: 'DSGVO',
|
||||
source_article: 'Art. 30',
|
||||
}),
|
||||
),
|
||||
).toBe('Abgeleitet · DSGVO Art. 30')
|
||||
// derived but no document known → graceful fallback
|
||||
expect(provenanceLabel(ctrl({ source_type: 'derived' }))).toBe('Abgeleitet')
|
||||
})
|
||||
|
||||
it('provenance + severity badge classes', () => {
|
||||
expect(provenanceBadgeClass('own_library')).toContain('amber')
|
||||
expect(provenanceBadgeClass('derived')).toContain('blue')
|
||||
expect(severityBadgeClass('critical')).toContain('red')
|
||||
expect(severityBadgeClass('high')).toContain('orange')
|
||||
expect(severityBadgeClass(null)).toContain('gray')
|
||||
})
|
||||
|
||||
it('splitByTier separates core (relevant) from review', () => {
|
||||
const { core, review } = splitByTier([
|
||||
ctrl({ id: 'a', relevant: true }),
|
||||
ctrl({ id: 'b', relevant: false, tier: 'review' }),
|
||||
ctrl({ id: 'c', relevant: true }),
|
||||
])
|
||||
expect(core.map((c) => c.id)).toEqual(['a', 'c'])
|
||||
expect(review.map((c) => c.id)).toEqual(['b'])
|
||||
})
|
||||
})
|
||||
|
||||
Reference in New Issue
Block a user