Lane 3S: public claim containment at the serving boundary (build-only; no merge, no deploy) - #294
Closed
mosesy5688-cell wants to merge 1 commit into
Closed
Lane 3S: public claim containment at the serving boundary (build-only; no merge, no deploy)#294mosesy5688-cell wants to merge 1 commit into
mosesy5688-cell wants to merge 1 commit into
Conversation
…-only; no merge, no deploy) Removes Lane 3's six internal claim-metadata containers wholesale at the shared serving boundary, recursively at every depth, and attaches one payload-wide `claim_metadata_visibility` marker at the business root. - source-rights-filter.ts: container deletion runs FIRST on every plain-object node, before the FAERS/KEGG mechanisms and before recursion, so a container's interior is never inspected and never increments a family tally. - `claim_metadata_visibility` is serving-boundary-exclusive: any input copy at any depth is a forgery, removed unconditionally and uncounted. - Frozen substitution: FAERS_NEG_ID_RE (RegExp object) -> FAERS_NEG_ID_PREFIX (string constant) at three sites; removes a mutable carrier rather than renaming one. Equivalence proven over the eight frozen edge cases. - Three legacy mechanisms gain `export` visibility only, re-exported through src/worker/lib/claim-containment-legacy-test-only.ts, which no serving path imports. No options argument, no production-callable bypass. - x-sciweon-rights-filter rc3a-v1 -> rc3a-v2 at all seven literals in five route files. No other response-version binding is moved. Twelve functions, no thirteenth. Only `walk` and `applySourceRightsFilter` carry new behaviour. Serving-edge only: the containers remain inside the stored R2 objects, which no serving-side filter can reach. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_019c1bKNiDv8zfaPunCXUANq
mosesy5688-cell
added a commit
that referenced
this pull request
Sep 5, 2026
* replay #291 deployment identity (BASE..229e4e5, verbatim) * replay #292 public error contract (BASE..390a6e4, verbatim; worker.ts 3-way merged with #291) * replay #293 rights candidate registry (BASE..c11e3b5, verbatim) * replay #294 public claim containment (BASE..73613b0, verbatim; 5 api files 3-way merged with #292) * replay #295 merge integrity (BASE..c49c1db, verbatim) * composition gate: F-3 version bindings, CI identity step, gate tests Composition of the five Founder-accepted lanes (#291 #292 #293 #294 #295) replayed from BASE c88c1f5 in the frozen order. This commit isolates everything the composition gate itself authored. F-3 response-contract bindings (MONOTONIC RESPONSE-CONTRACT MARKERS, not product SemVer claims -- they exist so a cached pre-composition body is distinguishable from a post-composition one at the serving boundary): negative-evidence.ts x-sciweon-schema-minor 1.2 -> 1.3 repurposing-evidence.ts x-sciweon-schema-minor 1.0 -> 1.1 target.ts x-sciweon-schema-minor 0.6.0 -> 0.6.1 xrefs.ts x-sciweon-schema-minor 1.1 -> 1.2 mcp.ts SERVER_INFO.version 0.6.0 -> 0.6.1 mcp.ts x-sciweon-mcp-version 0.6.0 -> 0.6.1 PROTOCOL_VERSION (2025-03-26) deliberately UNCHANGED. CI: one read-only identity-recording step in the EXISTING test job. No new job, no widened permissions. continue-on-error keeps a token/API failure from turning CI red; the gate treats any absent value as a qualification failure. Tests: version-sync (SERVER_INFO.version and the x-sciweon-mcp-version header are two distinct bindings; nothing else prevents them diverging), plus the per-surface containment matrix including the repurposing classification lane 3S did not individually verify. KNOWN RED, NOT FIXED HERE: tests/api/target.test.ts:174 asserts x-sciweon-schema-minor === '0.6.0' and now fails against the mandated '0.6.1'. That file is lane #292's accepted content and is one of the 50 files required to stay byte-identical, so the composition gate is not authorised to change it. Escalated for a founder ruling. * test(composition): correct stale target schema-minor oracle; add three REST runtime probes Bounded Correction 1 to the five-lane composition gate. Founder ruling: the frozen F-3 contract target.ts = '0.6.1' is CORRECT; tests/api/target.test.ts was a STALE ORACLE still expecting '0.6.0'. The oracle is corrected; the contract is NOT rolled back. The corrected assertion remains a real probe: it still calls handleTarget(), still reads x-sciweon-schema-minor off the real Response, and still compares by exact equality. Only the wrong expected literal changed. Closes three REST runtime-coverage gaps. Before this commit the four REST schema-minor bindings were pinned only by source-text scans in tests/worker/composition-version-bindings.test.ts; now each is also asserted against a live handler response: target 0.6.1 tests/api/target.test.ts negative-evidence 1.3 tests/api/composition-surface-matrix.test.ts xrefs 1.2 tests/api/composition-surface-matrix.test.ts repurposing 1.1 tests/api/composition-containment-matrix.test.ts The two MCP bindings (SERVER_INFO.version, x-sciweon-mcp-version) already had real handleMcp() runtime probes and are unchanged. Qualifies the Tier-2 matrix row so removed_key_count = 6 reads as a wiring-capacity measurement over an artificially injected fixture, not as a property of production PubChem Tier-2 data. Comment-only corrections to two stale bump annotations; no emitted value, no rights-filter marker and no code changed: negative-evidence.ts "bumped 1.1 -> 1.2" -> "bumped 1.2 -> 1.3" xrefs.ts "bumped 1.0 -> 1.1" -> "bumped 1.1 -> 1.2" Additive commit; five files; no lane content altered. PROTOCOL_VERSION ('2025-03-26') untouched. No merge, no deploy. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_019c1bKNiDv8zfaPunCXUANq --------- Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
Owner
Author
|
Closed without merge. This exact lane head was accepted only as an This PR was never merged or deployed independently. Do not reopen, |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Lane 3S -- Public Claim Containment
Serving-edge removal of Lane 3's six internal claim-metadata containers, with one payload-wide
claim_metadata_visibilitymarker at the business root.No merge, no deploy, no admin override, no workflow dispatch, no Factory / R2 / cursor / latest-pointer / ingest action is requested or authorised by this PR.
12.17 -- Composed-state statement (X-1; X-3 corrects the matrix pointer from 12.14 to 12.17)
X-2 is DELETED from Lane 3S: no
GITHUB_SHA, no parent SHAs and no PR SHAs are recorded here, and no CI step is added..github/**is untouched.12.1 -- Base proof
origin/mainwas checked at start, again immediately before commit, and again before opening this PR: still exactly the base. Exactly one commit on the branch, a direct descendant ofc88c1f5.12.2 -- Typecheck
12.3 -- The shared core is genuinely shared
Verified with count-only greps (no source content read out of
src/worker/api/**):Six REST serializer call sites plus one MCP boundary, matching the brief's section 8 list exactly (
compound.ts:64,compound.ts:80,negative-evidence.ts:69,repurposing-evidence.ts:55,target.ts:134,xrefs.ts:83;mcp-handlers.ts:58).grep -rl source-rights-filter src/returns seven files. The seventh,src/worker/lib/neg-evidence-response.ts, matches only inside a COMMENT and imports nothing from the core, so the true importer set is the six above.12.4 -- The confirmed 6b baseline, with deltas
Observed through the separate legacy entry point, not paraphrased (
tests/worker/claim-containment-filter.test.ts, describe "6b"):value)valueobject with a restricted key)kegg_drug_iddeleted, KEGG tally incrementskegg_drug_id_visibilityset, kegg = 1claim_metadata_visibilityremoved_key_countstill 999source_visibility(L3S-4 sixth row)source_family: 'kegg',withheld_item_count: 1{meddra: 0, kegg: 1}, exactly what fires the marker atsource-rights-filter.ts:171-176NO DELTA. Section 10's STOP ("your confirmed baseline differs from 6b") does not fire.
Declared deviation. The legacy walker in the test calls
withholdFaersSignalon every plain object instead of gating onisFaersSignal, because D-1 pinsisFaersSignalto the frozen substitution only and does not permit exporting it. That walker is a STRICT SUPERSET of the legacy path, so a pass is conservative. The observedtally.meddra === 0proves the superset never fired on this fixture, i.e. it behaved identically to the true legacy walk here.12.5 -- The strategy-map key-set pinning test
tests/factory/claim-containment-merge-map.test.ts, asserting KEYS only, never function identities, so Lane 3 may replace thecompounds-enriched.jsonlvalue without breaking it:The key set is exactly the two named files, so section 10's STOP does not fire.
Out of scope, and NOT closed by this paragraph:
bioactivities,papersandtrialsalso bypass the pre-existing FAERS / MedDRA / KEGG containment. That is a SEPARATE PRE-EXISTING GAP and a candidate for a future Founder-owned lane. It is not closed here.12.6 -- The six removed keys, byte-identical to section 3
No seventh container-like key was found in Lane 3's declared output.
claim_metadata_visibilityis this lane's own serving-boundary key, removed recursively and UNCOUNTED, and is not a seventh container.12.7 -- Serialized before/after payloads, verbatim
REST --
GET /api/v1/compound/2244(this route passes the stored record through WHOLE)BEFORE, the stored compound record:
{"id":"sciweon::compound::CID:2244","pubchem_cid":2244,"chembl_id":"CHEMBL25","external_ids":{"unii":"R16CO5Y76E","drugbank_id":"DB00945","rxcui":"1191"},"competing_claims":[{"path":"external_ids.kegg_drug_id","value":"D00109","side":"previous","source":{"source":null,"status":"unknown"}},{"path":"iupac_name","value":"SENTINEL-MEDDRA-TERM-XYZZY","side":"incoming","source":{"source":null,"status":"unknown"}}],"preserved_against_null":{"molecular_weight":"SENTINEL-PRESERVED-NULL-QUUX"},"field_sources":{"iupac_name":"SENTINEL-FIELD-SOURCE-PLUGH"},"claim_set_state":"CLAIM_SET_INCOMPLETE_OVERFLOW","claim_overflow_fields":["SENTINEL-OVERFLOW-FIELD-FROTZ"],"claim_overflow_counts":{"competing_claims":2},"claim_metadata_visibility":{"state":"internal_claim_metadata_not_published","removed_key_count":999}}AFTER, the raw response body:
{"id":"sciweon::compound::CID:2244","compound":{"id":"sciweon::compound::CID:2244","pubchem_cid":2244,"chembl_id":"CHEMBL25","external_ids":{"unii":"R16CO5Y76E","drugbank_id":"DB00945","rxcui":"1191"},"_tier":"T1"},"claim_metadata_visibility":{"state":"internal_claim_metadata_not_published","removed_key_count":6}}x-sciweon-rights-filter = rc3a-v2. Both attack claims are gone, and the forgedremoved_key_count: 999is discarded and REPLACED by the computed6.MCP -- both aliases, containers injected into the stored record
sciweon_get_negative_evidenceon/api/mcpand/api/v1/mcp, full JSON-RPC envelope (abridged in the middle only; the complete envelope was printed for both aliases during evidence collection and the measured values below are over the COMPLETE raw text):{"jsonrpc":"2.0","id":1,"result":{"content":[{"type":"text","text":"{\n \"compound\": {\n \"id\": \"sciweon::compound::CID:2244\"\n },\n \"snapshot_date\": \"2026-05-16\",\n \"negative_signals_count\": 1,\n ... \"signals\": [\n {\n \"id\": \"sciweon::neg::trial_failure::NCT04123456\",\n \"evidence_type\": \"trial_failure\",\n \"observed_date\": \"2026-05-16T00:00:00Z\",\n \"subject\": {\n \"compound_id\": \"sciweon::compound::CID:2244\"\n },\n \"detail\": {},\n \"provenance\": {\n \"primary_source\": \"clinicaltrials_gov\"\n }\n }\n ], ... }"}]}}Measured on the RAW envelope, identically for each alias:
sciweon_searchandsciweon_resolve_entitywere also driven on both aliases against a container-bearing compound record. All four combinations:containers=NONE sentinel=false forged999=false.FINDING, recorded honestly
Of the covered surfaces, only the compound REST route passes a stored record through whole.
xrefs,negative-evidence,targetand every MCP tool SHAPE the record into a new object, so the containers never enter their payloads at all. On those surfaces the filter removes nothing and therefore correctly emits no marker (5c: "N = 0 yields no marker"). Containment holds on every surface; the marker is observable only where a record is passed through. This is exactly the defence-in-depth posture section 1 describes: if any shaper ever widened, the filter would catch it.12.8 -- Marker placement,
removed_key_count, forged replacementFor the 6a fixture,
removed_key_count = 8, matching L3S-4's frozen derivation: six root containers plus the two nestedcompeting_claimscopies. The forged marker is removed at ALL THREE positions -- root, sub-object and array element -- and replaced by the computed value. Exactly ONE marker appears, as a direct key of the business root, never per record and never in the JSON-RPC envelope.The fixture's
claim_overflow_countsdeliberately contains its owncompeting_claimskey. It is NOT counted, because deleting the outer frozen key ends inspection of that subtree (5b / E-2). Were it counted, N would be 9; the test pins 8.12.9 -- No leakage;
WithheldTallyandsource_visibilityuntouchedNo value, path, source or overflow detail appears anywhere in any output. The full serialized response text is scanned for every sentinel (
SENTINEL-MEDDRA-TERM-XYZZY,-PRESERVED-NULL-QUUX,-FIELD-SOURCE-PLUGH,-OVERFLOW-FIELD-FROTZ,-NESTED-CLAIM-BLORPLE,-ARRAY-CLAIM-GRUE), plusD00109,D00110,CLAIM_SET_INCOMPLETE_OVERFLOWand the forged999. All absent.WithheldTallyremains exactly{meddra, kegg}with no third counter. The four existingtoEqualassertions attests/worker/source-rights-filter.test.ts:80,:136,:151and:209are UNMODIFIED and green, as is:207(expect(filtered).toEqual(before)), the single tripwire against an unconditional marker.source_visibilityis untouched: its construction block is byte-identical to base.No existing test was edited, weakened or dropped. Every new test is an addition.
12.10 -- The header sync
All seven
x-sciweon-rights-filterliterals movedrc3a-v1->rc3a-v2, across five files:xrefs.ts:51called out separately: it is a 403 rights-policy RESPONSE-INIT header, not a filtered success body. Both the 200 and the 403 header values are asserted at runtime intests/api/claim-containment-boundary.test.ts.Repo-wide
rc3a-v1count after the change: 0."Also update any existing test that pins
rc3a-v1" is a NULL INSTRUCTION. ZERO tests pinnedrc3a-v1at base: the repo-wide count of that string was exactly 7, all of them the source literals above. No such test file exists and none was hunted for. The new pinning test is the first.Open PM item, not fixed here: the MCP surface emits NO
x-sciweon-rights-filterheader at all, so the surface whose behaviour changes most carries no version signal. It is asserted asnullin the boundary test so the fact is pinned rather than forgotten.Only these seven lines changed in
src/worker/api/**. The diff across those five files is exactly 7 insertions and 7 deletions, and every changed line is a rights-filter literal. The adjacent gate-owned bindings (negative-evidence.ts:73,repurposing-evidence.ts:59,target.ts:140,xrefs.ts:97) andmcp.ts:36/:44are untouched.12.11 -- The serving-edge-only residual (0a)
This lane removes at the SERVING EDGE ONLY. The containers remain inside the R2 objects. Any future reader, dump or direct download of those shards is outside this control.
compounds-enriched.jsonlis cumulative and persisted, so this is not a transient leak that a later deploy cures. This is the accepted consequence of the Founder's decision not to adopt a sidecar refactor. It is recorded, not fixed.12.12 --
npm run buildWhat it establishes for this lane: nothing. It is
astro buildover a single static page and verifies NOTHING aboutsrc/worker/**. Combined with D-1's "no typecheck required", no gate compiles or type-checks this lane's code.12.13 --
npm testZERO failures. There is no pre-existing failing test to report. Both tests named in section 12a are green:
rc3b-locator-runtime(14 passed) and thesnomedset (18 passed). The 0b disk-hash gate verifies on disk:New test files, verbatim:
12.14 -- CES
New filenames, all CES-clean against all 14 Art 9.1 patterns:
The CES checks were proven LIVE rather than vacuous, using known-positive controls:
Both controls were deleted immediately, CES then passed, and the worktree contains no control file.
12.15 -- The canonical byte audit (section 13 command, verbatim output)
Twelve changed blobs, every one
nul=0 controls=0.tests/factory/umls-mrconso-probe.test.tsis NOT in the diff, so section 10's STOP does not fire and no exemption was created.The measuring commands were validated on controls with DIFFERING expected values (A-2's rule) before their output was believed:
git hash-objectwas NOT used as a disk proof anywhere.Final worktree state:
git ls-files --eolreports 780 tracked files, allw/lf, zerow/crlf, andgit status --porcelain --untracked-files=allis empty.12.16 -- Per-file line counts,
len(content.splitlines()), neverwc -lNo file is at or over the cap. No test was weakened or dropped to fit.
D-1 -- the twelve-function change list, as implemented
Twelve functions, no thirteenth, no function-valued runtime binding, no arrow function, no class, no export-brace clause. The token
functionoccurs exactly 12 times in runtime code, pinned by test.countedMarkerfamilyMarkerisPlainObjectisThinFaersExamplejsonWithRightsisFaersSignal.test->.startsWithonly:57(base numbering)isFaersIdString.test->.startsWithonly:66withholdFaersSignal:95plusexportwithholdObjectKeysexportvisibility ONLYpruneIdListArraysexportvisibility ONLYwalkapplySourceRightsFilterLine-by-line mapping --
walkPost-change line numbers in
src/worker/lib/source-rights-filter.ts.claims: ClaimTallyaddedwalkas an EXPLICIT PARAMETER"walk(el, tally)->walk(el, tally, claims)for (const key of [the six frozen keys])if (key in node) { delete node[key]; claims.n += 1; }delete node.claim_metadata_visibility;claim_metadata_visibilityat EVERY depth, unconditionally and UNCOUNTEDwalk(node[key], tally)->walk(node[key], tally, claims)UNCHANGED inside
walk: lines 160, 162, 163, 164 (array and plain-object guards), 170 (isFaersSignal+withholdFaersSignal), 171 (withholdObjectKeys), 172 (pruneIdListArrays), 174. The mechanism order and the recursion position are byte-identical to base, satisfying 3.7.2 (mechanisms second) and 3.7.3 (recursion third).Line-by-line mapping --
applySourceRightsFilterconst claims: ClaimTally = { n: 0 };walk(filtered, tally)->walk(filtered, tally, claims)if (isPlainObject(filtered) && claims.n > 0) {filtered.claim_metadata_visibility = { state: 'internal_claim_metadata_not_published', removed_key_count: claims.n };applySourceRightsFilter; nocountedMarkerorfamilyMarker, no thirteenth function, NOsource_family, no new runtime binding outside the call; 5c frozen marker shape and REST root / MCP business root placement}UNCHANGED: 181 (the pinned declaration), 182 (item 1 tally init, which must precede the early return), 183-185 (item 2 scalar/null early return), 186 (item 3 structured clone), 189-194 (item 6 the existing rights marker, byte-identical), 198 (item 7 final return).
D-3 contents, in order, with nothing else: 1 tally init, 2 scalar/null early return, 3 clone, 4 counter, 5 walk, 6 existing marker plus computed claim marker, 7 final return. Exactly two
returnstatements (pinned by test): the single early return and the final one. No other early return and no bypass branch.One non-function change falls outside both tables: a six-line addition to the MODULE doc comment (lines 31-36) recording the added containment axis and the serving-edge residual. It belongs to no function, so D-1's per-function table does not reach it.
Every changed line in
walkandapplySourceRightsFiltermaps to a frozen requirement. There are no unmapped changes.The frozen substitution (3.3) and the guards
FAERS_NEG_ID_RE = /^sciweon::neg::faers::/becomesFAERS_NEG_ID_PREFIX = 'sciweon::neg::faers::', with the three.test(...)sites becoming.startsWith(...). Equivalence is OBSERVED in-test across all eight frozen edge cases -- exact prefix, prefix only, non-matching, prefix not at start, empty string, upper-case variant, truncated prefix, prefix later in the string -- with 0 mismatches. This REMOVES a mutable carrier rather than renaming one: the module now holds exactly three module-scope bindings, all string primitives, pinned by test.D-2, the global call shape:
Array.isArray,Object.keys,Response.jsonandstructuredCloneappear ONLY as direct-call callees, with the entire member expression as the callee. Pinned by test over comment-and-string-stripped source. Note that at basestructuredClonehas one NON-callee occurrence, inside the module doc comment, so a naive source guard would go red on unmodified base code; the guard strips comments first, and that stripper is itself validated on a known positive (1) and a known negative (0).L3S-1 / A-5 guards, all present:
argumentsreference anywhere inapplySourceRightsFilter,walkorjsonWithRights.jsonWithRightspinned to exactly two plain parameters.true,1,'legacy'andnew Proxy({}, { get: () => true }). Each probe's output must equal the one-argument call and contain none of the six keys.claimContainmentLegacyMechanismsoccurs insrc/**exactly once, at its own declaration -- including NOT insource-rights-filter.ts, wherejsonWithRightslives. The scanner is control-validated by finding a known symbol across several files.These guards are KNOWN-CHANNEL REGRESSION TRIPWIRES (C-2.2), not a formal completeness proof. The absolute claim that a source-text guard proves no external state can influence containment is WITHDRAWN (C-2.1). The behavioural probes are defence in depth only: a strict-equality gate such as
mode === 'raw'survives every one of them. The source-level signature pins are what close the argument channel. The guard's own header text says exactly this.Recorded consequence, NOT fixed: the filter is not idempotent over its own container-bearing output; a second pass discards the truthful marker by design (N = 0 plus forgery replacement). Production applies the filter exactly once per response. The existing idempotence test at
tests/worker/source-rights-filter.test.ts:212-215stays green because its fixture carries no containers. A container-free fixture is used for the idempotence case, and a separate test RECORDS the container-bearing behaviour. Idempotence was NOT "fixed" by preserving an input marker, which would re-admit forgery.Executor judgments and deviations, all of them
src/worker/api/**was treated as READ-forbidden. The dispatch heads its forbidden list "read AND write" over all bullets, while README section 6 attaches "(read AND write)" only to the governance bullet. I took the STRICTER reading and never read route source beyond my seven owned literals, using count-only greps for the shared-core proof and RUNTIME assertions for "business roots are plain objects". The strict reading is fully satisfiable, so it is compatible with both; no STOP was needed.competing_claimscopies carry a benign single claim, not a byte-copy of the root array. A literal copy would include claim 3'svalue: { kegg_drug_id: 'D00110' }twice more and drive the LEGACY KEGG tally to 3, contradicting L3S-4's frozenwithheld_item_count: 1. Both frozen numbers (removed_key_count = 8and legacykegg = 1) hold under this construction, and no other construction satisfies both.tests/worker/claim-containment-guards.test.ts, was created, which is not on the pre-approved list, because the guards do not fit beside the behavioural tests under the 250-line cap. Dropping or weakening a test is forbidden. The file is inside thetests/**write scope and its basename is clean against all 14 Art 9.1 patterns, confirmed by a CES run whose Art 9.1 check was proven live by a known-positive control.git commit --amend --reset-authorto the repository's own already-configured noreply identity. The tree is byte-identical across the amend (27d6d68399e7ae3532efd1a6e13efe909cf83125before and after). No repository configuration was changed.isFaersSignalgate (see 12.4), because that predicate may not be exported under D-1. It is a strict superset, the pass is conservative, and it is proven inert on this fixture bytally.meddra === 0.pr-body.mdthere belonged to Lane 1 (PR Lane 1 -- P0.1 Public Error Contract (typed failure classes, no false promises, no leaks) #292). My verification command printed its first line and its last twelve lines before I recognised the file was not mine. Per the C-3 precedent, a command that prints content from a forbidden source is a READ and not a near-miss, so it is recorded as such. What was printed was one heading line and PR Lane 1 -- P0.1 Public Error Contract (typed failure classes, no false promises, no leaks) #292's CI gate summary. I did not open PR Lane 1 -- P0.1 Public Error Contract (typed failure classes, no false promises, no leaks) #292 on GitHub, and did not diff, copy, cite, test against or branch from it. This lane's implementation was committed and pushed as73613b08at 20:22:46, before the read occurred, so influence on the code is impossible; nothing from that file was used, and my PR body was rewritten to a lane-unique path.12b -- What this evidence does NOT establish
The evidence level is "synthetic payload tests pass". Production containment is UNEXERCISABLE while ingest is frozen: no published record carries the containers, because Lane 3's code has never run. Merge and deploy would prove the code path exists, NOT that it has ever fired. No unfreezing is proposed.
CI gate set -- all four
CI / test,CI / security-scan,CI / schema-validate,CES Gatekeeper / enforce-compliance. This lane touches no schema deny-list path.Boundaries
No merge, deploy, admin override or workflow dispatch. No Factory, R2, cursor, latest-pointer or ingest action.
.github/**,wrangler.toml,src/worker.tsand allscripts/**are untouched;scripts/factory/lib/aggregated-merger.jswas READ ONLY and never edited. No governance file was read or written. PR #289, #290, #291, #292 and #293 and their branches were never opened, diffed, copied, cited, tested against or branched from -- subject to the single disclosure in judgment 7 above, which concerns a scratchpad file and not the PR. This branch is a direct descendant ofc88c1f5and of nothing else.Actual CI result on this PR
All four gate jobs green on head
73613b0801600623cb81503ff75d2704294d3e19:Per the composed-state statement at the top of this body, this is evidence about
ONE lane against ONE base snapshot, taken on
refs/pull/294/merge. It is NOTevidence about the composed five-lane state.
Final worktree state:
git status --porcelain --untracked-files=allreports 0entries;
git ls-files --eolreports 780 tracked files, allw/lf, zerow/crlf.origin/mainis stillc88c1f525d623f0b3a16715551d3a5983438e36a.