From 190f6397847782d88e7a2c4d862516b8689f0ed8 Mon Sep 17 00:00:00 2001 From: davegilligan Date: Mon, 25 May 2026 16:45:41 +0200 Subject: [PATCH] Make dbn-legal-agent-v3 checker context-aware; wire into LegalAnalysisAgent MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Three fixes: 1. bootstrap.php dbnToolsRunLegalCheck(): prepend first 350 chars of synthesis text to the v3 user message so it validates actual content, not just general law. 2. BvjAnalyzerAgent: fix engine guard — was skipping check for claude_sonnet/haiku; now skips only when dbn_legal_v3 is the synthesis model (it already IS the check). 3. LegalAnalysisAgent: add post-synthesis dbnToolsRunLegalCheck() call after Pass 3; add 'legal_check' key to runFullAnalysis() return. Co-Authored-By: Claude Sonnet 4.6 --- includes/BvjAnalyzerAgent.php | 7 ++++--- includes/LegalAnalysisAgent.php | 10 ++++++++++ includes/bootstrap.php | 9 ++++++++- 3 files changed, 22 insertions(+), 4 deletions(-) diff --git a/includes/BvjAnalyzerAgent.php b/includes/BvjAnalyzerAgent.php index 04aba32..9357f62 100644 --- a/includes/BvjAnalyzerAgent.php +++ b/includes/BvjAnalyzerAgent.php @@ -958,9 +958,10 @@ PROMPT; ]; } - // Step 6b: dbn-legal-agent targeted legal Q&A check (azure + gpu engines only; - // skipped when dbn_legal_v3 is the synthesis engine — it already IS the legal model). - if (in_array($engine, ['azure_mini', 'azure_full', 'gpu'], true)) { + // Step 6b: dbn-legal-agent targeted legal Q&A check. + // Skipped only when dbn_legal_v3 is the synthesis engine — it already IS the legal model. + // All other engines (azure_mini, azure_full, gpu, claude_sonnet, claude_haiku) get the check. + if ($engine !== 'dbn_legal_v3') { $checkFindings = dbnToolsRunLegalCheck( (string)($json['advocacy_brief'] ?? ''), $docType diff --git a/includes/LegalAnalysisAgent.php b/includes/LegalAnalysisAgent.php index ab3b7b6..1e73edf 100644 --- a/includes/LegalAnalysisAgent.php +++ b/includes/LegalAnalysisAgent.php @@ -362,6 +362,15 @@ PROMPT; $emit('progress', ['step' => 'synthesising', 'detail' => 'Synthesising overall assessment…']); $synth = $this->synthesise($answered, $language, $docType); + // Post-synthesis legal check — dbn-legal-agent-v3 validates the overall assessment + $legalCheck = []; + try { + $legalCheck = dbnToolsRunLegalCheck( + mb_strimwidth($synth['overall_assessment'], 0, 800), + $docType + ); + } catch (Throwable) {} + return [ 'ok' => true, 'issues' => $answered, @@ -370,6 +379,7 @@ PROMPT; 'disclaimer' => $synth['disclaimer'], 'doc_type' => $docType, 'model' => self::LEGAL_MODEL, + 'legal_check' => $legalCheck, 'latency_ms' => (int)round(microtime(true) * 1000) - $startMs, ]; } diff --git a/includes/bootstrap.php b/includes/bootstrap.php index c43bed4..016a836 100644 --- a/includes/bootstrap.php +++ b/includes/bootstrap.php @@ -1175,12 +1175,19 @@ function dbnToolsRunLegalCheck(string $brief, string $docType): array $sysMsg = 'Du er en ekspert på norsk barnevernsloven og EMD-praksis. Svar alltid på norsk med korrekt juridisk terminologi. Bruk terskler fra barnevernsloven 2021: § 4-25 krever «klar nødvendighet». Strand Lobben mot Norge (37283/13) setter krav om rehabiliteringsplan før adopsjon. Aldri oppfinn paragrafnumre, saksnumre eller dommernavn.'; + // Prepend a short snippet of the actual synthesis text so v3 answers in context, + // not just as a general law quiz. Strip HTML tags and cap at 350 chars. + $snippet = mb_strimwidth(strip_tags($brief), 0, 350, '…'); + $userMsg = $snippet !== '' + ? "Tekst fra dokumentet:\n{$snippet}\n\n{$question}" + : $question; + $text = ''; try { $response = dbnToolsCallGpuLlm( [ ['role' => 'system', 'content' => $sysMsg], - ['role' => 'user', 'content' => $question], + ['role' => 'user', 'content' => $userMsg], ], $opts );