Skip to content

Close the six confirmed holes from the adversarial intake verification - #21

Merged
joshft merged 1 commit into
masterfrom
intake-hardening
Aug 18, 2026
Merged

Close the six confirmed holes from the adversarial intake verification#21
joshft merged 1 commit into
masterfrom
intake-hardening

Conversation

@joshft

@joshft joshft commented Aug 18, 2026

Copy link
Copy Markdown
Owner

The design reviewer (resumed session) attacked the merged intake implementation with live fixtures and confirmed six defects: probe-order self-supply, parent-symlink boundary bypass, cross-supplier dedupe suppressing refutation, empty-required-document gate satisfaction, duplicate-JSON-key outcome smuggling, and unscrubbed rejection fields. All six are closed with regression tests pinning the exact attack. Plus: accumulating binding markers, an explanation note for discarded external passes on LLM claims, supplier version + config digest in the audit records. Two reviewer recommendations consciously declined and documented in DESIGN.md. Schema 0.0.13.

🤖 Generated with Claude Code

https://claude.ai/code/session_015GeUG1gboWiZSnFyzQghyp

The design reviewer attacked the merged implementation with live
fixtures and confirmed six defects; each fix carries a regression test:

1. Read intake documents BEFORE any repository probe executes — a
   changed test demonstrably wrote the configured document during its
   own probe run and minted T4 for itself.
2. Canonical containment for the out-of-tree boundary: every path
   component of the document and the repo root is symlink-resolved
   before the prefix check (a symlinked parent smuggled an in-tree
   file past the lexical version), the final component opens with
   O_NOFOLLOW, regularity is judged on the opened fd, and size bounds
   ride a limited reader on that single open.
3. Supplier-scoped duplicate keys: one supplier's pass no longer
   suppresses another's counterexample on the same raw probe id
   (refutation dominance was demonstrably violated). A contradictory
   duplicate within one supplier fails the run loudly.
4. Required means USABLE: an admitted document with zero accepted rows
   blocks the gate.
5. Strict decoding rejects duplicate JSON keys at any depth — the
   stdlib's last-wins parsing smuggled a verified outcome behind a
   counterexample, and duplicate keys would make future signatures
   ambiguous.
6. Every stored external field is scrubbed (now including DEL and C1)
   and bounded — a live ESC reached the text receipt through a
   rejected row.

Also from the same review: binding markers accumulate so in-tree
coverage cannot hide an acting external row; a discarded external pass
on an LLM claim is now explained on the remainder row; intake records
carry the supplier version and the config digest. Two recommendations
are consciously declined and documented (open mechanism tokens;
invoker-supplied paths in stderr diagnostics). Schema 0.0.13.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015GeUG1gboWiZSnFyzQghyp
@github-actions

Copy link
Copy Markdown

correctful receipt

12 claims — ✅ 12 verified · ❌ 0 refuted · ⚠️ 0 unverified

Change: origin/master...HEAD (9ff2118..eb1786a · input:63c8c0a301ea) — 7 files

⚠️ Unverified remainder (0) — what nothing checked

Empty — every harvested claim reached a probe.

✅ Verified (12)
Tier Claim Statement
T1-assertion TestContradictoryVerdictsFailLoudly Contradictory Verdicts Fail Loudly
T1-assertion TestCrossSupplierCounterexampleSurvives Cross Supplier Counterexample Survives
T1-assertion TestDuplicateJSONKeysRejected Duplicate JSONKeys Rejected
T1-assertion TestParentSymlinkCannotSmuggleInTreeFiles Parent Symlink Cannot Smuggle In Tree Files
T1-assertion TestRequiredNeedsUsableEvidence Required Needs Usable Evidence
T1-assertion TestRejectedRowsAreScrubbed Rejected Rows Are Scrubbed
T1-assertion TestConfigValidatesLoudly Config Validates Loudly
T1-assertion TestInTreePathsRejected In Tree Paths Rejected
T1-assertion TestAdmissionGates Admission Gates
T1-assertion TestAuthorityComesFromTheProfile Authority Comes From The Profile
T1-assertion TestOutcomeVocabulary Outcome Vocabulary
T1-assertion TestRowRejections Row Rejections

Harvest coverage: 7 files — 3 claimed · 4 scanned · 0 unread
3 spec-id mention(s) not minted as claims — the repo defines no spec-id corpus, so a reference has no possible referent

schema 0.0.13 · correctful v0.0.0-20260818014146-eb1786a2ee15 eb1786a · exit gate: refuted claims block; the remainder informs, never fails

@joshft
joshft merged commit 3b8756f into master Aug 18, 2026
1 check passed
@joshft
joshft deleted the intake-hardening branch August 18, 2026 01:43
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