## MODIFIED Requirements ### Requirement: Verifier SHALL fact-check Executor answers The system SHALL have a Verifier Agent that reads structured Executor claims and the tool call history, then produces a structured verdict based on claim derivability. #### Scenario: PASS verdict when all claims have evidence - **WHEN** all critical claims in `executor_structured_output.claims` have direct observation or reasonable inference support in tool call results - **AND** at least one critical claim has direct observation - **AND** no critical claim is contradicted, unsupported, external unknown, or overstated - **AND** `gatekeeper_result.status` is not `fail` - **THEN** the Verifier MAY output verdict="PASS" with groundedness_score ≥ 0.5 #### Scenario: LOW_CONFID verdict with partial evidence - **WHEN** no critical claim contradicts the tool results - **AND** some critical claims are `unsupported`, `external_unknown`, or `overstated` - **THEN** the Verifier SHALL output verdict="LOW_CONFID" #### Scenario: LOW_CONFID verdict with only inference support - **WHEN** no critical claim contradicts the tool results - **AND** all critical claims are only `reasonable_inference` - **THEN** the Verifier SHALL output verdict="LOW_CONFID" #### Scenario: REJECT verdict when claims contradict evidence - **WHEN** any critical claim in `executor_structured_output.claims` contradicts tool call results - **OR** the claim fabricates a key entity, error code, or conclusion that does not exist in the tool evidence - **THEN** the Verifier SHALL output verdict="REJECT" #### Scenario: Structured Executor claims are verified first - **WHEN** `executor_structured_output.claims` is present and valid - **THEN** Verifier SHALL verify each structured claim against `tool_trace_summary` through `claim_checks` - **AND** each claim's evidence bindings SHALL reference existing trace or invocation identifiers when those identifiers are available - **AND** a claim with fabricated or missing evidence references SHALL NOT be classified as `direct_observation` - **AND** Verifier SHALL NOT add extra confirmed facts from `executor_final_answer` that are absent from `executor_structured_output.claims` #### Scenario: Malformed structured output cannot pass through natural language fallback - **WHEN** Executor does not return parseable structured output - **THEN** Verifier SHALL NOT produce an effective `PASS` by extracting facts from `executor_final_answer` - **AND** the effective verdict SHALL be `LOW_CONFID` ### Requirement: Verifier SHALL output structured JSON The Verifier SHALL output a JSON object with verdict, groundedness_score, claim_checks array, compatibility facts_checked array, and rationale. #### Scenario: claim-level verifier output is accepted - **WHEN** the Verifier checks Executor V2 structured output - **THEN** the output SHALL contain `verdict`, `groundedness_score`, `critical_fact_count`, `claim_checks`, `facts_checked`, and `rationale` - **AND** `claim_checks` SHALL be the primary V2 verification result - **AND** `facts_checked` SHALL remain available for compatibility ### Requirement: facts_checked SHALL use a fixed classification set The system SHALL continue to expose legacy `facts_checked` using its fixed verification classification set. #### Scenario: claim checks are mapped to legacy facts - **WHEN** Verifier output contains `claim_checks` - **THEN** ChatService SHALL derive compatibility `facts_checked` - **AND** `direct_observation` SHALL map to `direct_evidence` - **AND** `reasonable_inference` and `overstated` SHALL map to `indirect_support` - **AND** `unsupported` and `external_unknown` SHALL map to `no_evidence` - **AND** `contradicted` SHALL map to `contradicted` ### Requirement: Verifier SHALL be observable The Verifier's verdict SHALL be persisted for observability. #### Scenario: claim checks written to self_evaluation - **WHEN** the Verifier evaluation is persisted - **THEN** `diagnosis_session.self_evaluation.verifier_evaluation` SHALL include `claim_checks` - **AND** it SHALL continue to include compatibility `facts_checked` - **AND** existing fields such as `verdict`, `groundedness_score`, `rationale`, `executor_output_parse_status`, `tool_trace_summary`, and `gatekeeper_result` SHALL be preserved ### Requirement: Verifier SHALL consume explicit verification inputs The Verifier SHALL receive explicit verification inputs rather than inferring them only from raw conversation history. #### Scenario: structured claims are the primary verification target - **WHEN** `executor_output_parse_status.status` is `valid` - **AND** `executor_structured_output.claims` is available - **THEN** Verifier SHALL verify each claim through `claim_checks` - **AND** Verifier SHALL NOT add extra confirmed facts from `executor_final_answer` that are absent from `executor_structured_output.claims` #### Scenario: malformed structured output cannot pass through natural language fallback - **WHEN** `executor_output_parse_status.status` is `missing` or `malformed` - **THEN** Verifier SHALL NOT produce an effective `PASS` by extracting facts from `executor_final_answer` - **AND** the effective verdict SHALL be `LOW_CONFID` ### Requirement: Executor Gatekeeper SHALL validate deterministic structured-output failures The system SHALL run deterministic Gatekeeper checks after Executor output parsing and before Verifier model execution. #### Scenario: gatekeeper fail prevents PASS - **WHEN** `gatekeeper_result.status` is `fail` - **AND** the Verifier model returns `verdict = "PASS"` - **THEN** ChatService SHALL downgrade the effective verdict - **AND** the effective verdict SHALL NOT be `PASS` #### Scenario: invocation reference failure downgrades to reject - **WHEN** `gatekeeper_result.failed_rules` contains `evidence.invocation_ref` - **AND** the Verifier model returns `verdict = "PASS"` - **THEN** ChatService SHALL set the effective verdict to `REJECT` ## ADDED Requirements ### Requirement: Verifier claim checks SHALL use a fixed derivability classification set The Verifier SHALL classify each structured claim using a fixed derivability classification set. #### Scenario: claim check verification values are constrained - **WHEN** Verifier emits `claim_checks` - **THEN** each item SHALL use one of `direct_observation`, `reasonable_inference`, `overstated`, `unsupported`, `external_unknown`, or `contradicted` #### Scenario: claim check evidence references remain auditable - **WHEN** Verifier emits `claim_checks` - **THEN** each claim check SHALL include `claim_id`, `verification`, `detail`, and `evidence_refs` - **AND** every evidence ref SHALL preserve available `trace_ref`, `tool_name`, and `source_invocation_ids`