[GH-ISSUE #6217] [Bug] Artifact integrity contradictions support static/runtime cochange hypotheses #3785

Closed
opened 2026-10-31 00:44:01 +00:00 by bsakaguchi · 1 comment
Owner

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

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

correlate_static_and_runtime counts a selected artifact integrity contradiction as a supporting cochange hypothesis. In the observed MCP workflow, two ASAR members had identical bytes and different integrity trust, while a synthetic retained runtime pair differed in terminal output. The correlation returned static.status: "contradiction" and static.conclusion_kind: "contradiction" alongside observed_pattern: "cochanged", classification: "hypothesis", and one counted hypothesis.

Reproduction

In a prepared checkout, save the following test as tests/boundary/mcp/correlationIntegrityRepro.test.ts, then run the command below. This is the executed verifier test with its temporary filename replaced by the neutral filename shown here. One completed run reproduced the behavior and passed the genuine-content-change control. An initial harness-only attempt stopped before artifact inspection because it tried to parse the open response as Evidence; the test below corrects that helper.

verify_root=$(mktemp -d)
mkdir -p "$verify_root/home" "$verify_root/dsh" "$verify_root/config" "$verify_root/cache"
HOME="$verify_root/home" DSH_HOME="$verify_root/dsh" XDG_CONFIG_HOME="$verify_root/config" XDG_CACHE_HOME="$verify_root/cache" REA_VERIFY_ROOT="$verify_root" node node_modules/vitest/vitest.mjs run tests/boundary/mcp/correlationIntegrityRepro.test.ts --maxWorkers=1
import { mkdir, mkdtemp, readFile, rm, writeFile } from "node:fs/promises";
import { join } from "node:path";
import { tmpdir } from "node:os";
import { createPackageWithOptions } from "@electron/asar";
import { Client, InMemoryTransport } from "@modelcontextprotocol/client";
import { expect, it } from "vitest";
import { ArtifactProvider } from "../../../src/artifacts/ArtifactProvider.js";
import { createEvidence, parseEvidence, type Evidence } from "../../../src/domain/evidence.js";
import { artifactInventoryResultSchema } from "../../../src/domain/artifactGraph.js";
import { staticRuntimeCorrelationResultSchema } from "../../../src/domain/staticRuntimeCorrelation.js";
import { jsonValueSchema } from "../../../src/domain/jsonValue.js";
import { emptyUnverifiedProcessCapture, accountFullyObservedProcessCapture } from "../../../src/domain/process/processCapture.fixture.js";
import { createServer } from "../../../src/server/createServer.js";
import { createTestBinarySession } from "../../fixtures/binarySession.js";
import { artifactMcpCall } from "../../../scripts/lib/artifact-e2e.mjs";

it("counts an artifact integrity contradiction as supporting cochange", async () => {
  const root = await mkdtemp(join(process.env.REA_VERIFY_ROOT ?? tmpdir(), "correlation-integrity-"));
  const session = createTestBinarySession(new ArtifactProvider(process.env));
  const server = createServer({ kind: "session", session });
  const client = new Client({ name: "correlation-repro", version: "1" });
  try {
    const [ct, st] = InMemoryTransport.createLinkedPair();
    await server.connect(st);
    await client.connect(ct);
    const call = async (name: string, args: Record<string, unknown>) => {
      const response = await artifactMcpCall(client, { name, arguments: args });
      expect(response.isError, JSON.stringify(response)).not.toBe(true);
      return parseEvidence(response.structuredContent);
    };
    const original = "console.log('ok');\n";
    const modified = "console.log('no');\n";
    const observations: Evidence[] = [];
    const members = [];
    for (const [name, text] of [["stale", original], ["verified", modified], ["control", original]] as const) {
      const source = join(root, name);
      await mkdir(source);
      await writeFile(join(source, "main.js"), text);
      const archive = join(root, `${name}.asar`);
      await createPackageWithOptions(source, archive, {});
      if (name === "stale") {
        const bytes = await readFile(archive);
        const offset = bytes.indexOf(original);
        expect(offset).toBeGreaterThanOrEqual(0);
        bytes.write(modified, offset, "utf8");
        await writeFile(archive, bytes);
      }
      const opened = await artifactMcpCall(client, { name: "open_binary", arguments: { path: archive } });
      expect(opened.isError, JSON.stringify(opened)).not.toBe(true);
      const inspected = await call("inspect_artifact", { integrity_policy: "record-and-continue" });
      observations.push(inspected);
      const payload = inspected.normalized_result as { substeps: { evidence: unknown }[] };
      const inventory = artifactInventoryResultSchema.parse(parseEvidence(payload.substeps[0]!.evidence).normalized_result);
      members.push(inventory.occurrences.find(row => row.logical_path === "main.js")!);
    }
    expect(members.map(m => m.hash_status)).toEqual(["mismatched", "verified", "verified"]);
    expect(members[0]!.artifact_id).toBe(members[1]!.artifact_id);
    const contradicted = await call("compare_artifacts", { left: observations[0], right: observations[1] });
    expect(contradicted.normalized_result).toMatchObject({ changes: expect.arrayContaining([expect.objectContaining({ logical_path: "main.js", classification: "contradiction", dimensions: ["integrity"] })]) });
    const changed = await call("compare_artifacts", { left: observations[2], right: observations[1] });
    expect(changed.normalized_result).toMatchObject({ changes: expect.arrayContaining([expect.objectContaining({ logical_path: "main.js", classification: "changed" })]) });
    // Synthetic retained captures isolate the correlation consumer; no target is launched.
    const capture = (data: string) => {
      const base = emptyUnverifiedProcessCapture();
      return createEvidence(undefined, { id: "rea-process", name: "REA deterministic process harness", version: "3" }, {
        predicateType: "rea.process-capture", operation: "capture_process_scenario", parameters: { fixture: data },
        result: jsonValueSchema.parse(accountFullyObservedProcessCapture({ ...base, frames: [{ sequence: 0, at_ms: 0, data }] })),
        confidence: "observed", authority: "controlled-replay",
        environment: { id: "fixture", platform: "fixture", architecture: "fixture", isolation: "process" },
      });
    };
    const runtime = await call("compare_process_captures", { left: capture("before"), right: capture("after") });
    expect(runtime.normalized_result).toMatchObject({ terminal: "changed", first_divergence: { status: "found", dimension: "terminal" } });
    const correlate = async (comparison: Evidence) => {
      const response = await call("correlate_static_and_runtime", {
        static_comparisons: [comparison], runtime_comparisons: [runtime], mappings: [{
          static: { comparison_evidence_id: comparison.evidence_id, selector: { kind: "artifact", logical_path: "main.js" } },
          runtime: { comparison_evidence_id: runtime.evidence_id, dimension: "terminal" },
          side_alignment: "left_to_left", hypothesis: { statement: "Static member change co-occurs with terminal change.", expected_pattern: "cochanged" },
        }],
      });
      return staticRuntimeCorrelationResultSchema.parse(response.normalized_result);
    };
    const bad = await correlate(contradicted);
    const control = await correlate(changed);
    expect(bad).toMatchObject({ status: "correlated", summary: { hypotheses: 1, contradictions: 0, unresolved: 0 }, correlations: { items: [{ static: { status: "contradiction", conclusion_kind: "contradiction" }, runtime: { status: "changed" }, observed_pattern: "cochanged", classification: "hypothesis" }] } });
    expect(control).toMatchObject({ status: "correlated", summary: { hypotheses: 1 }, correlations: { items: [{ static: { status: "changed" }, observed_pattern: "cochanged", classification: "hypothesis" }] } });
    const project = (result: typeof bad) => ({ status: result.status, summary: result.summary, static: result.correlations.items[0]!.static.status, conclusion_kind: result.correlations.items[0]!.static.conclusion_kind, runtime: result.correlations.items[0]!.runtime.status, observed_pattern: result.correlations.items[0]!.observed_pattern, classification: result.correlations.items[0]!.classification });
    console.log(JSON.stringify({ memberBytesIdentical: members[0]!.artifact_id === members[1]!.artifact_id, hashStatuses: members.map(m => m.hash_status), contradiction: project(bad), genuineChangeControl: project(control) }));
  } finally {
    await Promise.all([client.close(), server.close()]);
    const closed = await session.close();
    expect(closed.ok).toBe(true);
    await rm(root, { recursive: true, force: true });
  }
});

Expected behavior

Preserve the distinction between an artifact integrity contradiction and an observed static member change. When the selected finding establishes only that declared and observed hashes disagree, it must not support a cochanged hypothesis as though it established changed member content. Preserve the contradiction and source citations; an unresolved or contradictory outcome is acceptable. A genuine static-content change paired with changed terminal output should remain eligible to support an explicit cochange hypothesis. This does not establish causality.

The registered correlation contract evaluates exact selected findings. The integrity continuation contract identifies a mismatch as a contradiction between declared and observed hashes. The original differential-workflow requirements in #37 require separating observed changes, hypotheses, contradictions and unresolved branches.

Impact and scope

P2: a bounded analytical-result defect that misstates support for the caller's hypothesis and increments the hypothesis count. The response retains the selected static contradiction fields, so callers can inspect those fields and withhold that hypothesis. The test observed those fields and retained source comparison records. No data loss, automatic reconstruction acceptance, or severe downstream incident was exercised. Broader frequency and other formats are NOT_ENOUGH_INFO; only the generated ASAR case and this MCP transport were run.

REA version

Source commit c465ff5a81 (main)

Runtime and platform

Node.js v26.12.0; macOS 27.0.1; arm64; Vitest 5.0.3. The repository pins Node 24.18.0; the executed run used the installed Node version. No native decompiler was needed.

Target and artifact context

Three generated ASAR archives containing main.js. One was packaged with console.log('ok'); followed by a newline and then had its embedded bytes replaced with the equal-length console.log('no'); text, leaving a stale declared digest. A second was correctly packaged from the replacement text, giving identical observed member bytes. A third correctly packaged the original text as a genuine-content-change control. Runtime inputs were synthetic canonical retained capture fixtures with different terminal frames; no target process was launched.

Interface

MCP

Earliest failure stage

Native analysis or reconstruction

Relevant output or evidence

The real artifact provider and public artifact comparator produced an integrity contradiction for identical main.js member bytes. The public runtime comparator accepted canonical synthetic capture fixtures and reported terminal changed. The public correlation call then returned:

{"status":"correlated","summary":{"hypotheses":1,"contradictions":0,"unresolved":0},"static":"contradiction","conclusion_kind":"contradiction","runtime":"changed","observed_pattern":"cochanged","classification":"hypothesis"}

The response passed the SDK's validation against the actual advertised output schema. The separate verified-artifact control had a genuine main.js content change and also returned a supporting hypothesis. No real application runtime capture or reconstruction verification was executed.

The test also printed memberBytesIdentical=true and hashStatuses=["mismatched","verified","verified"]. The first two artifacts therefore demonstrate that the selected integrity finding alone does not establish changed member content.

Typed outcome or recovery expected

Withhold the supporting cochange hypothesis and its hypothesis count for this integrity-only contradiction, while retaining the contradiction and Evidence closure. The precise unresolved or contradictory representation can follow the existing result contract.

Analysis or suspected cause

Source-derived: the artifact integrity classifier emits contradiction before comparing member content. The selected-static projection preserves its contradiction status and conclusion kind. The observed-pattern calculation then treats any non-unchanged status other than unknown or truncated as changed. The hypothesis classification accepts the resulting cochanged pattern. This explains the observed response without requiring a change to the artifact producer.

Additional context

Related #5866 reports incorrect supporting/contradicting roles in the artifact comparison's unknown ledger; this report concerns the correlation consumer's hypothesis result. #2798 addresses inconsistent function-comparison aggregates, rather than this valid artifact-integrity finding. Searches covered open/closed issues and PRs with the tool name, staticRuntimeCorrelation filename, and cochanged/contradiction/integrity symptoms; no matching report was found.

Fetched upstream main at ce5bc8cb01. Inspection of relevant changes found canonical digest refactoring but no change to this status classification. Persistence on that revision is source-derived; execution used the revision stated above. The test's assertions describe the incorrect baseline behavior and its valid-change control, not a fixed implementation.

Originally created by @coygeek on GitHub (Oct 22, 2026). Original GitHub issue: https://github.com/morluto/rea/issues/6217 ### 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 `correlate_static_and_runtime` counts a selected artifact integrity contradiction as a supporting cochange hypothesis. In the observed MCP workflow, two ASAR members had identical bytes and different integrity trust, while a synthetic retained runtime pair differed in terminal output. The correlation returned `static.status: "contradiction"` and `static.conclusion_kind: "contradiction"` alongside `observed_pattern: "cochanged"`, `classification: "hypothesis"`, and one counted hypothesis. ### Reproduction In a prepared checkout, save the following test as `tests/boundary/mcp/correlationIntegrityRepro.test.ts`, then run the command below. This is the executed verifier test with its temporary filename replaced by the neutral filename shown here. One completed run reproduced the behavior and passed the genuine-content-change control. An initial harness-only attempt stopped before artifact inspection because it tried to parse the open response as Evidence; the test below corrects that helper. ```sh verify_root=$(mktemp -d) mkdir -p "$verify_root/home" "$verify_root/dsh" "$verify_root/config" "$verify_root/cache" HOME="$verify_root/home" DSH_HOME="$verify_root/dsh" XDG_CONFIG_HOME="$verify_root/config" XDG_CACHE_HOME="$verify_root/cache" REA_VERIFY_ROOT="$verify_root" node node_modules/vitest/vitest.mjs run tests/boundary/mcp/correlationIntegrityRepro.test.ts --maxWorkers=1 ``` ```ts import { mkdir, mkdtemp, readFile, rm, writeFile } from "node:fs/promises"; import { join } from "node:path"; import { tmpdir } from "node:os"; import { createPackageWithOptions } from "@electron/asar"; import { Client, InMemoryTransport } from "@modelcontextprotocol/client"; import { expect, it } from "vitest"; import { ArtifactProvider } from "../../../src/artifacts/ArtifactProvider.js"; import { createEvidence, parseEvidence, type Evidence } from "../../../src/domain/evidence.js"; import { artifactInventoryResultSchema } from "../../../src/domain/artifactGraph.js"; import { staticRuntimeCorrelationResultSchema } from "../../../src/domain/staticRuntimeCorrelation.js"; import { jsonValueSchema } from "../../../src/domain/jsonValue.js"; import { emptyUnverifiedProcessCapture, accountFullyObservedProcessCapture } from "../../../src/domain/process/processCapture.fixture.js"; import { createServer } from "../../../src/server/createServer.js"; import { createTestBinarySession } from "../../fixtures/binarySession.js"; import { artifactMcpCall } from "../../../scripts/lib/artifact-e2e.mjs"; it("counts an artifact integrity contradiction as supporting cochange", async () => { const root = await mkdtemp(join(process.env.REA_VERIFY_ROOT ?? tmpdir(), "correlation-integrity-")); const session = createTestBinarySession(new ArtifactProvider(process.env)); const server = createServer({ kind: "session", session }); const client = new Client({ name: "correlation-repro", version: "1" }); try { const [ct, st] = InMemoryTransport.createLinkedPair(); await server.connect(st); await client.connect(ct); const call = async (name: string, args: Record<string, unknown>) => { const response = await artifactMcpCall(client, { name, arguments: args }); expect(response.isError, JSON.stringify(response)).not.toBe(true); return parseEvidence(response.structuredContent); }; const original = "console.log('ok');\n"; const modified = "console.log('no');\n"; const observations: Evidence[] = []; const members = []; for (const [name, text] of [["stale", original], ["verified", modified], ["control", original]] as const) { const source = join(root, name); await mkdir(source); await writeFile(join(source, "main.js"), text); const archive = join(root, `${name}.asar`); await createPackageWithOptions(source, archive, {}); if (name === "stale") { const bytes = await readFile(archive); const offset = bytes.indexOf(original); expect(offset).toBeGreaterThanOrEqual(0); bytes.write(modified, offset, "utf8"); await writeFile(archive, bytes); } const opened = await artifactMcpCall(client, { name: "open_binary", arguments: { path: archive } }); expect(opened.isError, JSON.stringify(opened)).not.toBe(true); const inspected = await call("inspect_artifact", { integrity_policy: "record-and-continue" }); observations.push(inspected); const payload = inspected.normalized_result as { substeps: { evidence: unknown }[] }; const inventory = artifactInventoryResultSchema.parse(parseEvidence(payload.substeps[0]!.evidence).normalized_result); members.push(inventory.occurrences.find(row => row.logical_path === "main.js")!); } expect(members.map(m => m.hash_status)).toEqual(["mismatched", "verified", "verified"]); expect(members[0]!.artifact_id).toBe(members[1]!.artifact_id); const contradicted = await call("compare_artifacts", { left: observations[0], right: observations[1] }); expect(contradicted.normalized_result).toMatchObject({ changes: expect.arrayContaining([expect.objectContaining({ logical_path: "main.js", classification: "contradiction", dimensions: ["integrity"] })]) }); const changed = await call("compare_artifacts", { left: observations[2], right: observations[1] }); expect(changed.normalized_result).toMatchObject({ changes: expect.arrayContaining([expect.objectContaining({ logical_path: "main.js", classification: "changed" })]) }); // Synthetic retained captures isolate the correlation consumer; no target is launched. const capture = (data: string) => { const base = emptyUnverifiedProcessCapture(); return createEvidence(undefined, { id: "rea-process", name: "REA deterministic process harness", version: "3" }, { predicateType: "rea.process-capture", operation: "capture_process_scenario", parameters: { fixture: data }, result: jsonValueSchema.parse(accountFullyObservedProcessCapture({ ...base, frames: [{ sequence: 0, at_ms: 0, data }] })), confidence: "observed", authority: "controlled-replay", environment: { id: "fixture", platform: "fixture", architecture: "fixture", isolation: "process" }, }); }; const runtime = await call("compare_process_captures", { left: capture("before"), right: capture("after") }); expect(runtime.normalized_result).toMatchObject({ terminal: "changed", first_divergence: { status: "found", dimension: "terminal" } }); const correlate = async (comparison: Evidence) => { const response = await call("correlate_static_and_runtime", { static_comparisons: [comparison], runtime_comparisons: [runtime], mappings: [{ static: { comparison_evidence_id: comparison.evidence_id, selector: { kind: "artifact", logical_path: "main.js" } }, runtime: { comparison_evidence_id: runtime.evidence_id, dimension: "terminal" }, side_alignment: "left_to_left", hypothesis: { statement: "Static member change co-occurs with terminal change.", expected_pattern: "cochanged" }, }], }); return staticRuntimeCorrelationResultSchema.parse(response.normalized_result); }; const bad = await correlate(contradicted); const control = await correlate(changed); expect(bad).toMatchObject({ status: "correlated", summary: { hypotheses: 1, contradictions: 0, unresolved: 0 }, correlations: { items: [{ static: { status: "contradiction", conclusion_kind: "contradiction" }, runtime: { status: "changed" }, observed_pattern: "cochanged", classification: "hypothesis" }] } }); expect(control).toMatchObject({ status: "correlated", summary: { hypotheses: 1 }, correlations: { items: [{ static: { status: "changed" }, observed_pattern: "cochanged", classification: "hypothesis" }] } }); const project = (result: typeof bad) => ({ status: result.status, summary: result.summary, static: result.correlations.items[0]!.static.status, conclusion_kind: result.correlations.items[0]!.static.conclusion_kind, runtime: result.correlations.items[0]!.runtime.status, observed_pattern: result.correlations.items[0]!.observed_pattern, classification: result.correlations.items[0]!.classification }); console.log(JSON.stringify({ memberBytesIdentical: members[0]!.artifact_id === members[1]!.artifact_id, hashStatuses: members.map(m => m.hash_status), contradiction: project(bad), genuineChangeControl: project(control) })); } finally { await Promise.all([client.close(), server.close()]); const closed = await session.close(); expect(closed.ok).toBe(true); await rm(root, { recursive: true, force: true }); } }); ``` ### Expected behavior Preserve the distinction between an artifact integrity contradiction and an observed static member change. When the selected finding establishes only that declared and observed hashes disagree, it must not support a cochanged hypothesis as though it established changed member content. Preserve the contradiction and source citations; an unresolved or contradictory outcome is acceptable. A genuine static-content change paired with changed terminal output should remain eligible to support an explicit cochange hypothesis. This does not establish causality. The [registered correlation contract](https://github.com/morluto/rea/blob/c465ff5a814b8e1a386fc547cbcd94df5c35f086/src/contracts/sessionToolContracts.ts#L137) evaluates exact selected findings. The [integrity continuation contract](https://github.com/morluto/rea/blob/c465ff5a814b8e1a386fc547cbcd94df5c35f086/docs/mcp-contracts.md#L973) identifies a mismatch as a contradiction between declared and observed hashes. The original differential-workflow requirements in #37 require separating observed changes, hypotheses, contradictions and unresolved branches. ### Impact and scope P2: a bounded analytical-result defect that misstates support for the caller's hypothesis and increments the hypothesis count. The response retains the selected static contradiction fields, so callers can inspect those fields and withhold that hypothesis. The test observed those fields and retained source comparison records. No data loss, automatic reconstruction acceptance, or severe downstream incident was exercised. Broader frequency and other formats are NOT_ENOUGH_INFO; only the generated ASAR case and this MCP transport were run. ### REA version Source commit c465ff5a814b8e1a386fc547cbcd94df5c35f086 (main) ### Runtime and platform Node.js v26.12.0; macOS 27.0.1; arm64; Vitest 5.0.3. The repository pins Node 24.18.0; the executed run used the installed Node version. No native decompiler was needed. ### Target and artifact context Three generated ASAR archives containing main.js. One was packaged with console.log('ok'); followed by a newline and then had its embedded bytes replaced with the equal-length console.log('no'); text, leaving a stale declared digest. A second was correctly packaged from the replacement text, giving identical observed member bytes. A third correctly packaged the original text as a genuine-content-change control. Runtime inputs were synthetic canonical retained capture fixtures with different terminal frames; no target process was launched. ### Interface MCP ### Earliest failure stage Native analysis or reconstruction ### Relevant output or evidence The real artifact provider and public artifact comparator produced an integrity contradiction for identical main.js member bytes. The public runtime comparator accepted canonical synthetic capture fixtures and reported terminal changed. The public correlation call then returned: ```json {"status":"correlated","summary":{"hypotheses":1,"contradictions":0,"unresolved":0},"static":"contradiction","conclusion_kind":"contradiction","runtime":"changed","observed_pattern":"cochanged","classification":"hypothesis"} ``` The response passed the SDK's validation against the actual advertised output schema. The separate verified-artifact control had a genuine main.js content change and also returned a supporting hypothesis. No real application runtime capture or reconstruction verification was executed. The test also printed memberBytesIdentical=true and hashStatuses=["mismatched","verified","verified"]. The first two artifacts therefore demonstrate that the selected integrity finding alone does not establish changed member content. ### Typed outcome or recovery expected Withhold the supporting cochange hypothesis and its hypothesis count for this integrity-only contradiction, while retaining the contradiction and Evidence closure. The precise unresolved or contradictory representation can follow the existing result contract. ### Analysis or suspected cause Source-derived: the [artifact integrity classifier](https://github.com/morluto/rea/blob/c465ff5a814b8e1a386fc547cbcd94df5c35f086/src/domain/artifactComparison.ts#L315) emits contradiction before comparing member content. The [selected-static projection](https://github.com/morluto/rea/blob/c465ff5a814b8e1a386fc547cbcd94df5c35f086/src/domain/staticRuntimeCorrelation.ts#L306) preserves its contradiction status and conclusion kind. The [observed-pattern calculation](https://github.com/morluto/rea/blob/c465ff5a814b8e1a386fc547cbcd94df5c35f086/src/domain/staticRuntimeCorrelation.ts#L376) then treats any non-unchanged status other than unknown or truncated as changed. The [hypothesis classification](https://github.com/morluto/rea/blob/c465ff5a814b8e1a386fc547cbcd94df5c35f086/src/domain/staticRuntimeCorrelation.ts#L227) accepts the resulting cochanged pattern. This explains the observed response without requiring a change to the artifact producer. ### Additional context Related #5866 reports incorrect supporting/contradicting roles in the artifact comparison's unknown ledger; this report concerns the correlation consumer's hypothesis result. #2798 addresses inconsistent function-comparison aggregates, rather than this valid artifact-integrity finding. Searches covered open/closed issues and PRs with the tool name, staticRuntimeCorrelation filename, and cochanged/contradiction/integrity symptoms; no matching report was found. Fetched upstream main at ce5bc8cb0149c230e571126e2e7d9f43c86a823d. Inspection of relevant changes found canonical digest refactoring but no change to this status classification. Persistence on that revision is source-derived; execution used the revision stated above. The test's assertions describe the incorrect baseline behavior and its valid-change control, not a fixed implementation.
Author
Owner

@gongfpp commented on GitHub (Oct 22, 2026):

I would like to take a focused fix at the correlation classification boundary: keep integrity contradictions unresolved rather than infer an observed change, preserve the selected finding and source citations, and add a real ASAR/MCP regression with a genuine-content-change control. I will also check function conclusion_kind and runtime contradiction handling at that same boundary so a status-only patch does not leave equivalent cases behind. Truncation/unknown precedence and ordinary cochange hypotheses should remain intact; no new output fields or target authority are proposed. Is anyone already working on this? #6298 addresses the separate process aggregate/schema issue, not this fix. This AI-assisted PR will stay draft pending human-owner review and readiness.

<!-- gh-comment-id:6337364542 --> @gongfpp commented on GitHub (Oct 22, 2026): I would like to take a focused fix at the correlation classification boundary: keep integrity contradictions unresolved rather than infer an observed change, preserve the selected finding and source citations, and add a real ASAR/MCP regression with a genuine-content-change control. I will also check function conclusion_kind and runtime contradiction handling at that same boundary so a status-only patch does not leave equivalent cases behind. Truncation/unknown precedence and ordinary cochange hypotheses should remain intact; no new output fields or target authority are proposed. Is anyone already working on this? #6298 addresses the separate process aggregate/schema issue, not this fix. This AI-assisted PR will stay draft pending human-owner review and readiness.
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#3785
No description provided.