Skip to content

feat(immune): Evidence Pack red-team — surface skipped existence check (inert signal) - #1515

Merged
DealAppSeo merged 1 commit into
mainfrom
claude/2026-11-04-evidence-pack-skip-signal
Nov 5, 2026
Merged

DealAppSeo merged 1 commit into
mainfrom
claude/2026-11-04-evidence-pack-skip-signal

Conversation

@DealAppSeo

Copy link
Copy Markdown
Owner

Red-team of the merged bricks (#1513 Lane A, #1514 Evidence Pack)

Adversarial pass on the two inert bricks, hunting a false-pass — a brick reporting ok/verified/correct when the underlying reality is not. One real no-silent-failure gap found and fixed here; two others flagged (one Sean-MAJOR, one theoretical).

Fixed here (LOW, inert)

Silent skip of the existence check. When rows cite trinity_tasks:<id> but the caller omits taskEvidence, the increment-2 existence/done join never runs, yet the pack still returns ok:true — a skipped check reading as a pass (r10 / THE_ONE §10). Live: all 656 rows are task citations [V 2026-11-04], so it is 100% applicable.

Fix: a non-gating signal task_existence_check_skipped (detail {citing_rows, cited_tasks}) emitted whenever rows cite tasks but no taskEvidence was supplied. ok is unchanged — the opt-in is intentional; this is the tripwire for when a task-bearing caller forgets it, and it is distinct from the cited_task_exists invariant (check RAN and FAILED).

  • Pure reducer, zero callers in any scoring path → cannot change live state (r23: ship on convergence).
  • 17/17 jest green (+3 adversarial/signal tests; the net-negative test updated to assert the honest signal set).

Flagged, NOT changed

  • Lane A deliverable binding (Sean MAJOR). lane-a-dryrun.ts builds the receipt's artifact_hash from the hash of the verdict string {id,verdict:TRUE}, not from deliverable_sha256. The deliverable hash is surfaced but never bound into the signed receipt or the would-write row — an eventual +1 would credit contractId+verdict with no cryptographic tie to the artifact. Binding it changes the signed public receipt = Sean's gate.
  • Opaque evidence_id (theoretical). A non-task, non-hash, non-empty evidence_id passes increment-1 grounding and is exempt from increment-2. 0 such rows in prod today; recommend a shape signal once the immune evidence_kind starts writing, not a gating tightening now.

Grok co-signed the fix and both flags (D-054 concur). D-147 to be logged.

🤖 Generated with Claude Code

…ck (inert signal)

Red-team of the merged increment-2 join (#1514) found a no-silent-failure gap:
when rows cite trinity_tasks:<id> but the caller omits taskEvidence, the
existence/done join never runs yet the pack still returns ok=true -- a skipped
check reading as a pass (r10 / THE_ONE §10). All 656 live rows are task citations
[V 2026-11-04], so it is 100% applicable.

Fix (pure, inert, zero scoring-path callers): a NON-GATING signal
'task_existence_check_skipped' (detail {citing_rows, cited_tasks}) whenever rows
cite tasks but no taskEvidence was supplied. ok is unchanged -- the opt-in is
intentional; this is the tripwire for when a task-bearing caller forgets it, and
it is distinct from the cited_task_exists invariant (check RAN and FAILED).

17/17 jest green. Grok co-signed (D-054 concur). Flagged-not-changed: binding
deliverable_sha256 into the Lane A signed receipt (Sean MAJOR) and an opaque-
evidence_id shape check (theoretical -- 0 live rows).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@strix-security

strix-security Bot commented Nov 5, 2026 •

Copy link
Copy Markdown

Strix Security Review

✅ No open security findings.

PR summary: Adds a non-gating `task_existence_check_skipped` signal to the inert Evidence Pack reducer so a pack built from task-citing rows without caller-supplied `taskEvidence` reports that the existence/done join never ran, plus tests for the new signal. `ok` and the existing invariants are unchanged.

Review summary

This PR only adds a non-gating diagnostic to a pure, caller-driven reducer: rows that cite trinity_tasks:<id> while no taskEvidence was supplied now produce a task_existence_check_skipped signal (with citing_rows/cited_tasks detail), leaving ok and all invariants untouched. I read the full reducer and the accompanying test changes. The new code introduces no attacker-reachable sink — it writes fixed-key numbers into an in-memory signal list, emits on every skipped-join case without a way to suppress it, and cannot be bypassed with an empty-but-present taskEvidence object (the join still runs and cited_task_exists trips). Search confirms the reducer has no callers, so no downstream gate on signals or ok changes behaviour. The item the author flagged (Lane A not binding deliverable_sha256 into the signed receipt) is in lane-a-dryrun.ts, which is not part of this diff, so it is outside this review's scope. No security issue introduced by the changed lines.

Review 1 on this PR · e4ed9a6 · requested Nov 5 00:43 UTC when the PR was opened


Reviewed by Strix
Re-run review · Configure security review settings

@DealAppSeo
DealAppSeo enabled auto-merge (squash) November 5, 2026 00:43

@strix-security strix-security Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This PR only adds a non-gating diagnostic to a pure, caller-driven reducer: rows that cite trinity_tasks:<id> while no taskEvidence was supplied now produce a task_existence_check_skipped signal (with citing_rows/cited_tasks detail), leaving ok and all invariants untouched. I read the full reducer and the accompanying test changes. The new code introduces no attacker-reachable sink — it writes fixed-key numbers into an in-memory signal list, emits on every skipped-join case without a way to suppress it, and cannot be bypassed with an empty-but-present taskEvidence object (the join still runs and cited_task_exists trips). Search confirms the reducer has no callers, so no downstream gate on signals or ok changes behaviour. The item the author flagged (Lane A not binding deliverable_sha256 into the signed receipt) is in lane-a-dryrun.ts, which is not part of this diff, so it is outside this review's scope. No security issue introduced by the changed lines.


Reviewed by Strix
Configure security review settings

@DealAppSeo
DealAppSeo merged commit af51b05 into main Nov 5, 2026
18 checks passed
@DealAppSeo
DealAppSeo deleted the claude/2026-11-04-evidence-pack-skip-signal branch November 5, 2026 00:47
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant