feat(advisor): evidence-framed header + bindingness contract seam
Rework the Compliance Advisor header ("Diese Antwort stuetzt sich auf")
to describe the EVIDENCE rather than the documents: binding
Rechtsgrundlagen split from Leitlinien (soft-law guidance), a
per-regulation breakdown, plus Abbildungen, Fussnoten and Evidence Units.
No fabricated trust score — objective counts only.
- bindingness is a canonical Legal-KG fact (APEX rule): added an optional
EvidenceUnit.bindingness contract seam; the FE renders the split from it
and degrades to a neutral per-regulation breakdown when it is absent
(SDK/RAG asked via board to populate it in /retrieve).
- evidence-grouping.ts: pure, tested grouping/counting model.
- route.ts: optional `audience` field (tonality) kept out of the retrieval
question; answers lead with a "Kurz gesagt" summary, structured by theme.
- E2E + unit tests updated for the evidence framing.
Not deployed.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
@@ -40,7 +40,7 @@ const ANSWER = {
|
||||
clarity: { is_underspecified: false, dominant_context: 'cyber', concentration: 0.88 },
|
||||
answer: 'Die Meldung erfolgt unverzüglich [1].',
|
||||
evidence: [
|
||||
{ evidence_id: 'e1', document: 'CRA', section: 'Art. 14', paragraph: 'Abs. 1', snippet: 'unverzüglich melden' },
|
||||
{ evidence_id: 'e1', document: 'CRA', section: 'Art. 14', paragraph: 'Abs. 1', snippet: 'unverzüglich melden', bindingness: 'binding' },
|
||||
],
|
||||
citations: [
|
||||
{ citation_id: 'c1', number: 1, evidence_id: 'e1', document: 'CRA', section: 'Art. 14', paragraph: 'Abs. 1' },
|
||||
@@ -77,7 +77,10 @@ test.describe('Compliance Advisor — Clarity Gate', () => {
|
||||
|
||||
await expect(sdkPage.getByText(/unverzüglich/)).toBeVisible()
|
||||
await expect(sdkPage.getByTitle('Beleg 1 anzeigen')).toBeVisible()
|
||||
await expect(sdkPage.getByText('Cyber Resilience Act (CRA)')).toBeVisible()
|
||||
// bindingness present -> header splits into Rechtsgrundlagen vs Leitlinien (evidence framing)
|
||||
await expect(sdkPage.getByText('Rechtsgrundlagen').first()).toBeVisible()
|
||||
// family name resolved for the user (shown both in the summary breakdown and the evidence card)
|
||||
await expect(sdkPage.getByText('Cyber Resilience Act (CRA)').first()).toBeVisible()
|
||||
})
|
||||
|
||||
test('clarify -> pick a context -> scoped answer', async ({ sdkPage }) => {
|
||||
|
||||
Reference in New Issue
Block a user