[GH-ISSUE #3937] [Bug] Reconstruction coverage ignores contradictions on required claim surfaces #1543

Closed
opened 2026-10-16 21:06:55 +00:00 by bsakaguchi · 5 comments
Owner

Originally created by @coygeek on GitHub (Oct 15, 2026).
Original GitHub issue: https://github.com/morluto/rea/issues/3937

Before submitting

  • I searched the open and closed issues for a related report.
  • I removed credentials, tokens, private paths, and sensitive target data.

Area

Evidence, artifacts, or reconstruction

Observed behavior

The public coverage evaluator returns ready when an active contradiction names the only surface of a required claim, unless the caller also lists that surface independently in the boundary or repeats the affected claim ID in the contradiction. The response omits both the contradiction reason and its resolution probe. This can cause a caller to accept reconstruction closure despite a recorded conflict affecting required behavior.

I observed the following results from the generated requests. Every command exited zero, and every request passed the coverage parser before CLI invocation.

affected:        ready,  reasons [], recommended_probes []
explicitSurface: failed, active-contradiction, resolve_contradiction probe
explicitClaim:   failed, active-contradiction, resolve_contradiction probe
resolved:        ready,  reasons [], recommended_probes []
unrelated:       ready,  reasons [], recommended_probes []

The affected response also omitted the distinct contradiction Evidence record from its returned citations; both explicit controls retained it. The same active conflict therefore changes the closure outcome solely through redundant association metadata. These observations establish public CLI behavior. MCP registration reaches the same application evaluator according to source inspection; I did not execute an MCP request.

Reproduction

  1. From the baseline checkout root, run the following block. It creates every request outside the checkout, isolates CLI HOME, supplies fresh verifier proof, and invokes the public CLI once per case. Preserve the printed results before removing the generated directory.
probe_dir="$(mktemp -d)"
export PROBE_DIR="$probe_dir"
mkdir "$PROBE_DIR/home"
HOME="$PROBE_DIR/home" node --input-type=module <<'NODE'
import { writeFileSync } from 'node:fs';
import { resolve, join } from 'node:path';
import { pathToFileURL } from 'node:url';
import { spawnSync } from 'node:child_process';
const load = name => import(pathToFileURL(resolve('dist/domain/' + name + '.js')));
const { createEvidence } = await load('evidence');
const { createEvidenceBundle } = await load('evidenceBundle');
const { createReconstructionVerifierContract, createReconstructionCoverageData } = await load('reconstructionCoverage');
const digest = c => c.repeat(64);
const record = (operation, result) => createEvidence(undefined,
  { id: 'sample', name: 'Sample', version: '1' },
  { operation, parameters: {}, result, authority: 'controlled-replay', confidence: 'observed' });
const pass = record('verify', { status: 'pass' });
const conflict = record('compare', { status: 'different', surface_id: 'cli.help' });
const contract = createReconstructionVerifierContract({
  verifier_id: 'verify.help', claim_ids: ['claim.help'], dimensions: ['output'],
  authority: 'controlled-replay', max_age_ms: 86400000, minimum_repeats: 1,
  normalization_sha256: digest('4'), normalization_removes_dimensions: false
});
const coverage = {
  evidence_bundle: createEvidenceBundle([pass, conflict]),
  artifacts: [{ artifact_id: 'app', artifact_sha256: digest('1'), version: '1',
    environment_sha256: digest('2'), evidence_ids: [pass.evidence_id] }],
  surfaces: ['cli.version', 'cli.help'].map(surface_id => ({ surface_id,
    family: 'cli-command', artifact_id: 'app', occurrence_id: null,
    location: 'bin/app', authority: 'observed', dependency_surface_ids: [], evidence_ids: [pass.evidence_id] })),
  owners: ['cli.version', 'cli.help'].map(surface_id => ({ surface_id, ownership: {
    disposition: 'implemented', owner_path: 'src/cli.ts', owner_export: null,
    owner_sha256: digest('3'), path_state: 'present', package_state: 'distributed', authority_route: 'none' } })),
  claims: [{ claim_id: 'claim.help', title: 'Help agrees', kind: 'behavioral',
    surface_ids: ['cli.help'], required_dimensions: ['output'], required_authority: 'controlled-replay' }],
  verifier_contracts: [contract],
  verifier_results: [{ verifier_id: contract.verifier_id, contract_sha256: contract.contract_sha256,
    observed_at: new Date().toISOString(), status: 'pass', covered_claim_ids: ['claim.help'],
    covered_dimensions: ['output'], artifact_sha256s: [digest('1')], owner_sha256s: [digest('3')],
    normalization_sha256: digest('4'), repeats: 1, evidence_ids: [pass.evidence_id] }],
  residual_unknown_ids: [],
  contradictions: [{ contradiction_id: 'conflict.help', status: 'active', surface_ids: ['cli.help'],
    claim_ids: [], evidence_ids: [pass.evidence_id, conflict.evidence_id] }],
  package_proofs: [{ proof_id: 'build', kind: 'build', status: 'pass', artifact_sha256s: [digest('1')], evidence_ids: [pass.evidence_id] }],
  boundaries: [{ boundary_id: 'replacement', title: 'Replacement', required_surface_ids: ['cli.version'],
    required_claim_ids: ['claim.help'], required_package_proof_kinds: ['build'], allowed_dispositions: [], allowed_unknown_ids: [] }]
};
const variants = { affected: coverage };
variants.explicitSurface = structuredClone(coverage);
variants.explicitSurface.boundaries[0].required_surface_ids.push('cli.help');
variants.explicitClaim = structuredClone(coverage);
variants.explicitClaim.contradictions[0].claim_ids.push('claim.help');
variants.resolved = structuredClone(coverage);
variants.resolved.contradictions[0].status = 'resolved';
variants.unrelated = structuredClone(coverage);
variants.unrelated.surfaces.push({ ...coverage.surfaces[0], surface_id: 'cli.other' });
variants.unrelated.contradictions[0].surface_ids = ['cli.other'];
for (const [name, data] of Object.entries(variants)) {
  createReconstructionCoverageData(data);
  const file = join(process.env.PROBE_DIR, name + '.json');
  writeFileSync(file, JSON.stringify({ coverage: data, boundary_id: 'replacement' }));
  const run = spawnSync(process.execPath, ['scripts/rea.mjs', 'evaluate-reconstruction-coverage', file, '--json'], { encoding: 'utf8' });
  writeFileSync(join(process.env.PROBE_DIR, name + '.stdout'), run.stdout);
  writeFileSync(join(process.env.PROBE_DIR, name + '.stderr'), run.stderr);
  const result = JSON.parse(run.stdout);
  console.log(JSON.stringify({ name, exit: run.status, status: result.status, reasons: result.reasons, recommended_probes: result.recommended_probes }));
}
NODE
  1. Compare affected with explicitSurface and explicitClaim. All have the same required claim, passing proof and active contradiction. The first requires cli.version independently and requires claim.help, which names cli.help; its contradiction names cli.help with an empty claim list. The second additionally lists cli.help as a required surface. The third keeps the original boundary and adds claim.help to the contradiction.
  2. Check resolved and unrelated as controls. The first resolves the same contradiction, and the second moves it to a separate inventoried surface that the required claim does not name.

Expected behavior

The named boundary must withhold ready while an active contradiction affects its required claim. A contradiction naming that claim's only surface must retain active-contradiction, produce failed, and recommend resolving the contradiction, just as when the affected surface or claim is explicitly repeated. Resolved contradictions and contradictions unrelated to the boundary must continue to allow closure when the other checks pass.

The public tool contract promises evidence-backed evaluation against a named boundary and says contradictions fail closed. The input permits a required claim to reference a surface independently of the boundary's explicit surface list, and permits contradictions to identify affected surfaces without naming claims.

Impact and scope

A valid bounded request receives an incorrect ready decision and loses the conflict reason and resolution probe for required behavior. The executed CLI cases demonstrate the failure without establishing harm to a real reconstruction or a broader population frequency.

Workaround: Add the affected required claim ID to the contradiction's claim list. The executed explicitClaim control then returns failed with the expected contradiction reason while preserving the original boundary, all Evidence, and the active conflict.

REA version

rea 6.5.0 at source commit 4692bb3330

Runtime and platform

Node 24.18.0; macOS arm64

Target and artifact context

Synthetic authenticated reconstruction Evidence with two fully owned CLI surfaces and a fresh verifier result. An active contradiction names the required claim surface only.

Interface

CLI

Earliest failure stage

Native analysis or reconstruction

Relevant output or evidence

  • Expected source: src/contracts/applicationToolContracts.ts:218, the public evaluate_reconstruction_coverage contract promises that contradictions fail closed; src/domain/reconstructionCoverage.ts:138 permits surface-specific contradiction associations, :160 permits independent required surface and claim lists, and :381 maps an active contradiction reason to failed.
  • Failure source: The public CLI results above; source-derived explanation at src/domain/reconstructionCoverageEvaluation.ts:384, where risk evaluation only intersects contradiction surface IDs with explicit required surface IDs, or contradiction claim IDs with explicit required claim IDs. It does not include the surfaces referenced by required claims. The built runtime contains the same predicate in dist/domain/reconstructionCoverageEvaluation.js:191.
  • Reachability evidence: src/cli/applicationCommands.ts:169 registers the JSON command and invokes the application evaluator; src/application/ReconstructionCoverageService.ts:17 parses the request and calls closure evaluation; src/domain/reconstructionCoverage.ts:267 validates references and invokes risk evaluation. No guard requires redundant surface or claim associations. src/server/registerApplicationTools/coverage.ts:16 registers the matching MCP tool with the same application evaluator.
  • Existing regression baseline: The focused reconstruction-coverage source suite passed all 16 existing tests. No source or test file was modified.

Typed outcome or recovery expected

Run the same generated requests with fresh verifier proof. The affected request must return failed with an active-contradiction reason for conflict.help, retain its Evidence, and provide a resolution probe. Keep both explicit controls failing for the same active contradiction. Keep the resolved and unrelated controls ready so that restoration preserves boundary scoping. The implementation may choose how it determines that an active contradiction affects a required claim.

Analysis or suspected cause

Source-derived explanation and exact locators are in Relevant output or evidence. Provider and transport limits are stated there separately from reproduced results.

Additional context

Related issue #3890 concerns owner checks for claim-only surfaces. This case has complete owners and reaches a separate active-contradiction selection branch; restoring ownership checks alone leaves this failure. Issue #3889 concerns conflicting package proofs. Adding the affected claim ID to the contradiction is a demonstrated workaround. Related issues #3354 and #3357 concern transitive inventory and weak cited Evidence respectively.

Freshness check: the cited source and contract files have no changes between the tested source commit and upstream main at 22ec8bdb2f.

Originally created by @coygeek on GitHub (Oct 15, 2026). Original GitHub issue: https://github.com/morluto/rea/issues/3937 ### Before submitting - [x] I searched the open and closed issues for a related report. - [x] I removed credentials, tokens, private paths, and sensitive target data. ### Area Evidence, artifacts, or reconstruction ### Observed behavior The public coverage evaluator returns `ready` when an active contradiction names the only surface of a required claim, unless the caller also lists that surface independently in the boundary or repeats the affected claim ID in the contradiction. The response omits both the contradiction reason and its resolution probe. This can cause a caller to accept reconstruction closure despite a recorded conflict affecting required behavior. I observed the following results from the generated requests. Every command exited zero, and every request passed the coverage parser before CLI invocation. ```text affected: ready, reasons [], recommended_probes [] explicitSurface: failed, active-contradiction, resolve_contradiction probe explicitClaim: failed, active-contradiction, resolve_contradiction probe resolved: ready, reasons [], recommended_probes [] unrelated: ready, reasons [], recommended_probes [] ``` The affected response also omitted the distinct contradiction Evidence record from its returned citations; both explicit controls retained it. The same active conflict therefore changes the closure outcome solely through redundant association metadata. These observations establish public CLI behavior. MCP registration reaches the same application evaluator according to source inspection; I did not execute an MCP request. ### Reproduction 1. From the baseline checkout root, run the following block. It creates every request outside the checkout, isolates CLI HOME, supplies fresh verifier proof, and invokes the public CLI once per case. Preserve the printed results before removing the generated directory. ```sh probe_dir="$(mktemp -d)" export PROBE_DIR="$probe_dir" mkdir "$PROBE_DIR/home" HOME="$PROBE_DIR/home" node --input-type=module <<'NODE' import { writeFileSync } from 'node:fs'; import { resolve, join } from 'node:path'; import { pathToFileURL } from 'node:url'; import { spawnSync } from 'node:child_process'; const load = name => import(pathToFileURL(resolve('dist/domain/' + name + '.js'))); const { createEvidence } = await load('evidence'); const { createEvidenceBundle } = await load('evidenceBundle'); const { createReconstructionVerifierContract, createReconstructionCoverageData } = await load('reconstructionCoverage'); const digest = c => c.repeat(64); const record = (operation, result) => createEvidence(undefined, { id: 'sample', name: 'Sample', version: '1' }, { operation, parameters: {}, result, authority: 'controlled-replay', confidence: 'observed' }); const pass = record('verify', { status: 'pass' }); const conflict = record('compare', { status: 'different', surface_id: 'cli.help' }); const contract = createReconstructionVerifierContract({ verifier_id: 'verify.help', claim_ids: ['claim.help'], dimensions: ['output'], authority: 'controlled-replay', max_age_ms: 86400000, minimum_repeats: 1, normalization_sha256: digest('4'), normalization_removes_dimensions: false }); const coverage = { evidence_bundle: createEvidenceBundle([pass, conflict]), artifacts: [{ artifact_id: 'app', artifact_sha256: digest('1'), version: '1', environment_sha256: digest('2'), evidence_ids: [pass.evidence_id] }], surfaces: ['cli.version', 'cli.help'].map(surface_id => ({ surface_id, family: 'cli-command', artifact_id: 'app', occurrence_id: null, location: 'bin/app', authority: 'observed', dependency_surface_ids: [], evidence_ids: [pass.evidence_id] })), owners: ['cli.version', 'cli.help'].map(surface_id => ({ surface_id, ownership: { disposition: 'implemented', owner_path: 'src/cli.ts', owner_export: null, owner_sha256: digest('3'), path_state: 'present', package_state: 'distributed', authority_route: 'none' } })), claims: [{ claim_id: 'claim.help', title: 'Help agrees', kind: 'behavioral', surface_ids: ['cli.help'], required_dimensions: ['output'], required_authority: 'controlled-replay' }], verifier_contracts: [contract], verifier_results: [{ verifier_id: contract.verifier_id, contract_sha256: contract.contract_sha256, observed_at: new Date().toISOString(), status: 'pass', covered_claim_ids: ['claim.help'], covered_dimensions: ['output'], artifact_sha256s: [digest('1')], owner_sha256s: [digest('3')], normalization_sha256: digest('4'), repeats: 1, evidence_ids: [pass.evidence_id] }], residual_unknown_ids: [], contradictions: [{ contradiction_id: 'conflict.help', status: 'active', surface_ids: ['cli.help'], claim_ids: [], evidence_ids: [pass.evidence_id, conflict.evidence_id] }], package_proofs: [{ proof_id: 'build', kind: 'build', status: 'pass', artifact_sha256s: [digest('1')], evidence_ids: [pass.evidence_id] }], boundaries: [{ boundary_id: 'replacement', title: 'Replacement', required_surface_ids: ['cli.version'], required_claim_ids: ['claim.help'], required_package_proof_kinds: ['build'], allowed_dispositions: [], allowed_unknown_ids: [] }] }; const variants = { affected: coverage }; variants.explicitSurface = structuredClone(coverage); variants.explicitSurface.boundaries[0].required_surface_ids.push('cli.help'); variants.explicitClaim = structuredClone(coverage); variants.explicitClaim.contradictions[0].claim_ids.push('claim.help'); variants.resolved = structuredClone(coverage); variants.resolved.contradictions[0].status = 'resolved'; variants.unrelated = structuredClone(coverage); variants.unrelated.surfaces.push({ ...coverage.surfaces[0], surface_id: 'cli.other' }); variants.unrelated.contradictions[0].surface_ids = ['cli.other']; for (const [name, data] of Object.entries(variants)) { createReconstructionCoverageData(data); const file = join(process.env.PROBE_DIR, name + '.json'); writeFileSync(file, JSON.stringify({ coverage: data, boundary_id: 'replacement' })); const run = spawnSync(process.execPath, ['scripts/rea.mjs', 'evaluate-reconstruction-coverage', file, '--json'], { encoding: 'utf8' }); writeFileSync(join(process.env.PROBE_DIR, name + '.stdout'), run.stdout); writeFileSync(join(process.env.PROBE_DIR, name + '.stderr'), run.stderr); const result = JSON.parse(run.stdout); console.log(JSON.stringify({ name, exit: run.status, status: result.status, reasons: result.reasons, recommended_probes: result.recommended_probes })); } NODE ``` 2. Compare `affected` with `explicitSurface` and `explicitClaim`. All have the same required claim, passing proof and active contradiction. The first requires `cli.version` independently and requires `claim.help`, which names `cli.help`; its contradiction names `cli.help` with an empty claim list. The second additionally lists `cli.help` as a required surface. The third keeps the original boundary and adds `claim.help` to the contradiction. 3. Check `resolved` and `unrelated` as controls. The first resolves the same contradiction, and the second moves it to a separate inventoried surface that the required claim does not name. ### Expected behavior The named boundary must withhold `ready` while an active contradiction affects its required claim. A contradiction naming that claim's only surface must retain `active-contradiction`, produce `failed`, and recommend resolving the contradiction, just as when the affected surface or claim is explicitly repeated. Resolved contradictions and contradictions unrelated to the boundary must continue to allow closure when the other checks pass. The public tool contract promises evidence-backed evaluation against a named boundary and says contradictions fail closed. The input permits a required claim to reference a surface independently of the boundary's explicit surface list, and permits contradictions to identify affected surfaces without naming claims. ### Impact and scope A valid bounded request receives an incorrect ready decision and loses the conflict reason and resolution probe for required behavior. The executed CLI cases demonstrate the failure without establishing harm to a real reconstruction or a broader population frequency. Workaround: Add the affected required claim ID to the contradiction's claim list. The executed explicitClaim control then returns failed with the expected contradiction reason while preserving the original boundary, all Evidence, and the active conflict. ### REA version rea 6.5.0 at source commit 4692bb33300c7cb77b095b6cc0c33da861c1b860 ### Runtime and platform Node 24.18.0; macOS arm64 ### Target and artifact context Synthetic authenticated reconstruction Evidence with two fully owned CLI surfaces and a fresh verifier result. An active contradiction names the required claim surface only. ### Interface CLI ### Earliest failure stage Native analysis or reconstruction ### Relevant output or evidence - Expected source: `src/contracts/applicationToolContracts.ts:218`, the public `evaluate_reconstruction_coverage` contract promises that contradictions fail closed; `src/domain/reconstructionCoverage.ts:138` permits surface-specific contradiction associations, `:160` permits independent required surface and claim lists, and `:381` maps an active contradiction reason to `failed`. - Failure source: The public CLI results above; source-derived explanation at `src/domain/reconstructionCoverageEvaluation.ts:384`, where risk evaluation only intersects contradiction surface IDs with explicit required surface IDs, or contradiction claim IDs with explicit required claim IDs. It does not include the surfaces referenced by required claims. The built runtime contains the same predicate in `dist/domain/reconstructionCoverageEvaluation.js:191`. - Reachability evidence: `src/cli/applicationCommands.ts:169` registers the JSON command and invokes the application evaluator; `src/application/ReconstructionCoverageService.ts:17` parses the request and calls closure evaluation; `src/domain/reconstructionCoverage.ts:267` validates references and invokes risk evaluation. No guard requires redundant surface or claim associations. `src/server/registerApplicationTools/coverage.ts:16` registers the matching MCP tool with the same application evaluator. - Existing regression baseline: The focused reconstruction-coverage source suite passed all 16 existing tests. No source or test file was modified. ### Typed outcome or recovery expected Run the same generated requests with fresh verifier proof. The affected request must return `failed` with an `active-contradiction` reason for `conflict.help`, retain its Evidence, and provide a resolution probe. Keep both explicit controls failing for the same active contradiction. Keep the resolved and unrelated controls ready so that restoration preserves boundary scoping. The implementation may choose how it determines that an active contradiction affects a required claim. ### Analysis or suspected cause Source-derived explanation and exact locators are in Relevant output or evidence. Provider and transport limits are stated there separately from reproduced results. ### Additional context Related issue #3890 concerns owner checks for claim-only surfaces. This case has complete owners and reaches a separate active-contradiction selection branch; restoring ownership checks alone leaves this failure. Issue #3889 concerns conflicting package proofs. Adding the affected claim ID to the contradiction is a demonstrated workaround. Related issues #3354 and #3357 concern transitive inventory and weak cited Evidence respectively. Freshness check: the cited source and contract files have no changes between the tested source commit and upstream main at 22ec8bdb2f7d4626587f23b1eed4a207df600386.
Author
Owner

@XinwangTao commented on GitHub (Oct 15, 2026):

Confirmed: an active contradiction that names the only surface of a required claim must not yield ready coverage — the affected run returning ready while explicitSurface/explicitClaim fail shows the closure verdict depends on redundant association metadata instead of the contradiction itself. Coverage should treat the contradiction as unresolved on every affected required surface (and surface it in reasons/probes), not only when the caller happens to repeat the surface or claim ID.

<!-- gh-comment-id:6186159372 --> @XinwangTao commented on GitHub (Oct 15, 2026): Confirmed: an active contradiction that names the only surface of a required claim must not yield ready coverage — the affected run returning ready while explicitSurface/explicitClaim fail shows the closure verdict depends on redundant association metadata instead of the contradiction itself. Coverage should treat the contradiction as unresolved on every affected required surface (and surface it in reasons/probes), not only when the caller happens to repeat the surface or claim ID.
Author
Owner

@matbrgz commented on GitHub (Oct 20, 2026):

Cross-referencing with canonical issue #3354 and siblings #3889, #3890 regarding contradiction resolution on required claim surfaces in reconstruction coverage. Cataloged under Cluster BR in consolidation tracker #4330.

<!-- gh-comment-id:6297983141 --> @matbrgz commented on GitHub (Oct 20, 2026): Cross-referencing with canonical issue #3354 and siblings #3889, #3890 regarding contradiction resolution on required claim surfaces in reconstruction coverage. Cataloged under Cluster BR in consolidation tracker #4330.
Author
Owner

@XinwangTao commented on GitHub (Oct 21, 2026):

Agree this belongs with #3889/#3890 under the same contradiction-on-required-surface cluster. One thing worth making explicit in whichever fix lands: the affected case (contradiction names the only surface, caller adds no redundant association metadata) is the default way callers construct these requests, so the regression test should assert that plain affected returns failed with the active-contradiction reason and resolve_contradiction probe — matching explicitSurface/explicitClaim rather than only pinning the metadata-dependent divergence described here.

<!-- gh-comment-id:6305729375 --> @XinwangTao commented on GitHub (Oct 21, 2026): Agree this belongs with #3889/#3890 under the same contradiction-on-required-surface cluster. One thing worth making explicit in whichever fix lands: the affected case (contradiction names the only surface, caller adds no redundant association metadata) is the default way callers construct these requests, so the regression test should assert that plain affected returns failed with the active-contradiction reason and resolve_contradiction probe — matching explicitSurface/explicitClaim rather than only pinning the metadata-dependent divergence described here.
Author
Owner

@XinwangTao commented on GitHub (Oct 21, 2026):

Agree this belongs with #3889/#3890 under the same contradiction-on-required-surface cluster. One thing worth making explicit in whichever fix lands: the affected case (contradiction names the only surface, caller adds no redundant association metadata) is the default way callers construct these requests, so the regression test should assert that plain affected returns failed with the active-contradiction reason and resolve_contradiction probe — matching explicitSurface/explicitClaim rather than only pinning the metadata-dependent divergence described here.

<!-- gh-comment-id:6305738432 --> @XinwangTao commented on GitHub (Oct 21, 2026): Agree this belongs with #3889/#3890 under the same contradiction-on-required-surface cluster. One thing worth making explicit in whichever fix lands: the affected case (contradiction names the only surface, caller adds no redundant association metadata) is the default way callers construct these requests, so the regression test should assert that plain affected returns failed with the active-contradiction reason and resolve_contradiction probe — matching explicitSurface/explicitClaim rather than only pinning the metadata-dependent divergence described here.
Author
Owner

@morluto commented on GitHub (Oct 23, 2026):

Resolved on main in a35b9335a. Risk evaluation consumes the same effective scope as required claims and ownership. The executed claim-only active contradiction control returns failed and retains reason/probe/citations. Validation: src/domain/reconstructionCoverage.test.ts — claim-only active contradiction; recorded execution at b03a15e6d. Thirty coverage tests passed with authenticated synthetic workspaces, including complete control. Public CLI/MCP test is present but not recorded as executed; no external provider involved.

<!-- gh-comment-id:6376140921 --> @morluto commented on GitHub (Oct 23, 2026): Resolved on main in [a35b9335a](https://github.com/morluto/rea/commit/a35b9335a0124674ee5e3abe8c075f1fff6b4fa6). Risk evaluation consumes the same effective scope as required claims and ownership. The executed claim-only active contradiction control returns failed and retains reason/probe/citations. Validation: `src/domain/reconstructionCoverage.test.ts` — claim-only active contradiction; recorded execution at `b03a15e6d`. Thirty coverage tests passed with authenticated synthetic workspaces, including complete control. Public CLI/MCP test is present but not recorded as executed; no external provider involved.
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
morluto/rea#1543
No description provided.