{
 "ships": [
  {
   "n": 1,
   "date": "2026-07-30",
   "slug": "hub",
   "one_liner": "the foundry's own hub \u2014 public ledger, factory library, and the deploy pipeline proven end-to-end",
   "gap_source_url": "PLAYBOOK.md \u00a78 \u2014 ship #001 is the factory itself, proven on its own body before any market idea",
   "deploy_url": "/",
   "kind": "app",
   "checker_verdict": "PASS after one fix-cycle \u2014 initial PARTIAL (stale sites/ ship-path in 3 files; lib/ overclaim; verdict-before-merge) fully cured and re-verified; hub JS/stats/empty-states/mobile/secrets/PII verified against local cold fetch; live-URL unverified (egress)",
   "distribution": {
    "registry_pr": "n/a (not an MCP server)",
    "hub": "self",
    "x_draft": "drafted in briefs/2026-07-30.md",
    "posted_on": null
   },
   "signal": {
    "measurable": true,
    "qualified_visits": 30,
    "distinct_days": 3,
    "path": "/",
    "note": "Instrument-read this fire from public/beacon-stats.json (BOTTLENECKS #2 relay), fetched by GitHub-Actions run 31454011286 at 2026-08-11T02:59:18Z, HTTP 200, oracle VERDICT PASS. Fleet state at that read: hub / = 30 qualified visits across 3 distinct days (13 on 08-09, 14 on 08-10, 3 on 08-11); /002-gha-trigger/ = 0; /004-khanya-school-tutor/ = 0; /005-maccleaner/ = 0. Third consecutive fire to read its own instrument out of git rather than carry an assumption. MOD-2 Branch B on the best-performing path: 30/250 qualified visits, 3/3 distinct days \u2014 the distinct-days half of the threshold is met on the hub for the first time; the volume half is not, and the hub is not a ship.",
    "source": "public/beacon-stats.json (BOTTLENECKS #2 relay); oracle PASS this fire",
    "as_of": "2026-08-11T02:59:18Z"
   },
   "status": "live",
   "kill_criterion": "n/a \u2014 infrastructure ship; lives while the loop lives",
   "plain": {
    "money": "Not monetised \u2014 the hub is the shop window and distribution surface for every other ship."
   }
  },
  {
   "n": 2,
   "date": "2026-08-03",
   "slug": "gha-trigger",
   "one_liner": "paste a GitHub Actions workflow and an event, get WILL RUN / WON'T RUN plus the exact filter that decided it",
   "gap_source_url": "https://github.com/orgs/community/discussions/25285 \u2014 recurring 'my workflow didn't trigger' thread (plus community #164673, #180208, #185355). Occupant hunt re-run 2026-08-03, still empty: rhysd/actionlint lints filter-pattern SYNTAX only and never evaluates a concrete event; nektos/act selects workflows by event name alone (its CLI skips the filter layer, though its pkg/workflowpattern library implements the semantics correctly). Demand amplifier dated 2026-07-28: https://github.blog/changelog/2026-07-28-github-actions-holds-potentially-malicious-workflows-for-approval/ adds a brand-new reason for a run not to appear.",
   "deploy_url": "/002-gha-trigger/",
   "kind": "app",
   "rebuild_of": "ship 002 attempt 1 (2026-08-02, checker FAIL x2 on a hand-rolled glob->RegExp compiler). Semantics BORROWED from nektos/act pkg/workflowpattern (MIT, commit 4f411281417e88660bea1c1a1749aa71ae0bd60f); execution deliberately NOT ported, because act is linear-time only by virtue of Go's RE2 and a verbatim JS port would have reintroduced the same ReDoS.",
   "checker_verdict": "PASS after one fix cycle. THREE independent checkers, none given a prior verdict, all on a DIFFERENT MODEL from the maker. PASS 1 primary, verbatim: \"VERDICT: PARTIAL - matcher is correct (0/56,766 divergences, 46/46, 64/64, 14/14 e2e), secure (0 XSS, no proto-pollution), private (1 request, 0 cookies/storage), and premises are docs-accurate, but the page's absolute printed claim 'No input can make it hang' is false: a pasteable pattern/value pair produces a measured 5.6 s synchronous tab freeze because the linear-time Pike VM is still O(pattern x value) with no input-size guard.\" PASS 1 independent security adversary, verbatim: \"VERDICT: FAIL - the freeze/hang objective produced multiple reproduced, measured defects (up to a full tab crash and multi-ten-second blocks well past the claimed 50ms ceiling), directly falsifying 'No input can make it hang,' while the XSS objective found nothing across an exhaustive, corpus-plus-hundreds-more sweep.\" It measured 7,755 ms on 5,000 files x 100 patterns (proven a true event-loop freeze: a screenshot 300 ms in timed out without returning a frame, and a 5 ms interval canary ticked 3 times where ~1,358 were due), 12,889 ms on 2,000-level nested YAML with no glob patterns at all, >90 s unfinished on '*?'x20000, and a TAB CRASH on a 20,000-level document. FIX CYCLE (one, as the contract allows): a work budget decremented by NFA states actually visited and checked inside the loop - unlike ship 002's failed static budget it measures work already done rather than predicting an exponential blow-up, so it cannot be satisfied and exceeded at once; out of budget yields CANNOT TELL, never a verdict. Plus encode-each-value-once, cached NFA scratch state, 1 MiB / 20k-line / 64-level parser limits, textLength checked before .value, clear-before-compute, 5,000-file and 4,096-char field caps, and the printed claim narrowed to what was actually proven. TARGETED RE-CHECK by a fresh adversary on the fix diff, verbatim: \"VERDICT: PASS - every reported defect is fixed and neither the cached NFA scratch state nor the shared work budget produced any wrong verdict across ~69.5k RE2-differential and 6.1k bounded-vs-unbounded comparisons; the only residuals are two low-severity, sub-second UX/copy nuances.\" Before/after it measured: 7,755 ms -> 150 ms; 5,618 ms -> 188 ms; 9,675 ms -> 238 ms; >90 s -> 194 ms; 12.9 s / tab crash -> refused in 0 ms with no crash; 4,578 ms -> 0.9 ms. TWO RESIDUALS CARRIED, NOT FIXED (recorded rather than ground down - the contract allows one fix cycle, and changing code after the verdict would mean staging something unverified): (1) LOW stale-verdict-repaint - run() is synchronous so the clear() at its top is never painted before the compute, leaving the previous verdict as the last painted frame for up to ~0.67 s; DOM state is correct and a MutationObserver confirmed the old verdict is never re-inserted as current. (2) LOW copy-latency-scope - the copy's 'about a fifth of a second' is scoped to matching work and matches the measured ~0.23 s budget, but pattern compilation and YAML parsing sit outside the budget, so worst-case total latency is ~667 ms, roughly 3x what a reader may infer. VERIFIED SOUND across the round: 211,118 (pattern,value) pairs by the maker plus 56,766 and ~69,500 by two checkers against their OWN Go/RE2 builds of act, ZERO divergences in every set; 203,082 reuse comparisons proving the cached scratch state never changes an answer; 6,144 bounded-vs-unbounded comparisons proving the budget only ever declines, never flips a verdict; GitHub's published cheat sheet 46/46 and act's own corpus 64/64 run against the LIVE page; 5 GitHub filter premises re-verified against docs.github.com; ~870 XSS payloads across every field including the thrown-Error sink, 0 injections, 0 prototype pollution; no new RegExp on user input, sole innerHTML assignment is a static ''; every stated limit off-by-one correct and named in its refusal message; 1 external request (the cookieless Cloudflare beacon), 0 cookies, 0 storage. Live-URL unverified by this run (egress; no desktop bridge in a scheduled run) - and health.json does not exist because .github/workflows/ has not been added to the repo.",
   "distribution": {
    "registry_pr": "n/a (not an MCP server)",
    "hub": "inherits from public/ledger.json once merged",
    "x_draft": "drafted in briefs/2026-08-03.md \u2014 never posted",
    "posted_on": null
   },
   "signal": {
    "measurable": true,
    "qualified_visits": 0,
    "distinct_days": 0,
    "path": "/002-gha-trigger/",
    "note": "Instrument-read this fire from public/beacon-stats.json (BOTTLENECKS #2 relay), fetched by GitHub-Actions run 31454011286 at 2026-08-11T02:59:18Z, HTTP 200, oracle VERDICT PASS. Fleet state at that read: hub / = 30 qualified visits across 3 distinct days (13 on 08-09, 14 on 08-10, 3 on 08-11); /002-gha-trigger/ = 0; /004-khanya-school-tutor/ = 0; /005-maccleaner/ = 0. Third consecutive fire to read its own instrument out of git rather than carry an assumption. MOD-2 Branch B on the best-performing path: 30/250 qualified visits, 3/3 distinct days \u2014 the distinct-days half of the threshold is met on the hub for the first time; the volume half is not, and the hub is not a ship.",
    "source": "public/beacon-stats.json (BOTTLENECKS #2 relay); oracle PASS this fire",
    "as_of": "2026-08-11T02:59:18Z"
   },
   "status": "live",
   "kill_criterion": "<300 unique visits to /002-gha-trigger/ in the 30 days after publish -> graveyard.md (per-path pageviews, the only unit the cookieless beacon measures)",
   "plain": {
    "money": "Free until 2026-09-02 while the beacon counts visits. \u2265300 unique visits graduates it to Sunday triage for a paid layer (e.g. the same check running inside your repo\u2019s CI); under 300, it dies to the graveyard."
   }
  },
  {
   "n": 3,
   "date": "2026-08-06",
   "slug": "codeowners",
   "one_liner": "paste your CODEOWNERS file and the paths a pull request touches, get the reviewer GitHub will actually request for each one plus the rules it is quietly ignoring",
   "gap_source_url": "EVERGREEN lane - why-now waived by contract, occupant hunt not waived. Re-run 2026-08-04: six projects (all CLI/library/GitHub-Action shaped: hmarr/codeowners, mszostok/codeowners-validator, and four smaller linters), none a web page you can paste into. Semantics BORROWED, not hand-rolled: hmarr/codeowners @ 11d3ff2659b769bcb43ddef81a6ab19d1205d9c2 (MIT), execution replaced with the lib/nfa.js Pike VM.",
   "deploy_url": "not deployed - branch ship/003-codeowners, unmerged, HEAD 6197cbf",
   "kind": "app",
   "attempts": "THREE. 2026-08-04 build (FAIL), 2026-08-05 rebuild on a recorded design constraint (FAIL after one fix cycle and a targeted re-check), 2026-08-06 rebuild on a two-item design constraint (FAIL after one fix cycle and a targeted re-check). SEVEN independent checker verdicts across three days, all on a different model from the maker, none given a prior verdict. Zero PASS.",
   "checker_verdict": "FAIL. Three independent refutation-seeking checkers this run, none given a prior verdict, all on a different model from the maker, all driving the real page cold in Chromium. ROUND 1, TWO PARALLEL CHECKERS, VERBATIM: [A] VERDICT: FAIL, printed timing ceiling \"33ms to 533ms\" beaten repeatedly with door-legal input (500 rules x 500 paths -> data-last-ms 534ms and 538ms across 8 trials; 1000 rules x 250 paths -> 567ms twice across 7 trials), the page's own specific \"491 ms\" newline-flood claim beaten in 4/4 fresh-page trials (1 MiB owners box of pure \"\\n\" -> data-last-ms 814/664/617/692ms, all +26% to +66% over claim), the \"9 ms\" full-1MiB-box door.scan claim beaten (cold single-call 17.6-27.8ms across 5 fresh page loads, avg ~20.8ms), a door-legal 297-char path silently rendered truncated to 256 chars+\"...\" in the results table via cell() hardcoding MAX_FIELD for every value including paths (which have their own separate 1024-char limit), and ledger.json's ship-3 row (status \"failed\", verdict FAIL, describing attempt 2's residual defects) was never updated after commit 1361cdc rebuilt the page a third time, so the ledger does not describe the code actually under test on this branch. [B] VERDICT: FAIL - door-legal input (CODEOWNERS box: 1500 rules of the form `/a @owner000 @owner001 ... @owner019` [20 owners each, literal-anchored pattern], 304,500 chars; paths box: 5000 lines of `a`, 10,000 chars - every door limit satisfied with wide margin) makes compute() reproducibly return a complete, byte-verified-correct, non-refused answer while blowing the page's own 500ms work-deadline and documented \"up to 533ms\" ceiling: page-reported data-last-ms up to 789ms (independently-verified-correct trials reached 635ms), wall-clock-to-idle up to 1023ms - caused by an unmetered O(rules x paths) loop at page.src.html:453-454 (`[r.winner].concat(r.alsoMatched)` + `everMatched[all[k].line]=true`) and lib/codeowners.js:461 (`hits.slice(1)`), none of which ever call `nfa.tick()`, compounded by the ~982,000-character drawn table's DOM/layout/paint cost which the budget has no visibility into at all. ONE FIX CYCLE (all the contract allows): the aggregation loop whose cost tracks the HIT RATE rather than the rule count was charged against the budget in both places (lib/codeowners.js resolve() and the page's row loop, which also dropped the [winner].concat(alsoMatched) allocation); paths were given pathCell() so they clip at their own 1024 limit instead of the 256 field limit; and every printed speed ceiling was REMOVED rather than re-measured, on the reasoning that four consecutive rounds of a beaten number is a structural defect and a page whose cost depends on input, machine and paint cannot honestly advertise a ceiling at all. TARGETED RE-CHECK by a fresh adversary on the fix diff (1361cdc..6197cbf), VERBATIM: VERDICT: FAIL - cell() (clip at MAX_FIELD=256) still renders skipped-CODEOWNERS-line raw text (`s2.text`, door-legal up to MAX_RULE_LINE=4096) in the shipped index.html:1655 / page.src.html:562, silently truncating any door-legal skipped line over 256 chars with an ellipsis. Reproduced with the 292-char line `docs/** bad-owner-token-xx` x12 (a syntactically-valid-length line the door never refuses, GitHub skips it for invalid owner format) rendered in the \"Lines GitHub will not use as you expect\" list truncated to exactly 257 chars, hiding 35 characters of the real line; same 257-char truncation reproduced at line lengths 300/500/1000/2000/4000/4073 chars (always cut to 257, never the true length). This is the identical \"right answer, wrong label\" defect class pathCell() was built to close (per the page's own comment on cell(): \"clipping there can only ever fire on something already refused\" - falsified by this sink). Secondary, softer finding: the prose's \"well under a millisecond\" / \"a fraction of a millisecond\" claims for door refusals are true only of the isolated door.scan() call (0.05ms field-bomb, 0.50ms newline-flood, directly measured) - the page's own data-last-ms for those exact refusals was 33ms and 596-607ms respectively (the newline-flood figure is 600x+ the claim), and for door-level refusals the page shows no visible timing text at all (#measured element absent), so the claim can't be self-checked where it's made. WHAT THE RE-CHECK CONFIRMED HELD, and is therefore proven rather than assumed: the named 1500x5000 adversarial input now refuses at 473 ms reported / 650 ms wall (was 789/1023 answering); ~100 live-page runs across rule counts 500-20,000 x path counts 50-5,000 x four hit-rate shapes found NO case where metered work exceeded 500 ms while still answering (JS compute 197-430 ms in every instrumented case, the excess being browser paint the prose explicitly disclaims); the new budget charge never corrupts an answer it lets through - 190/190 oracle cases (171 pairs + 13 GitHub-documented + 6 line-skipping) run against the LIVE page with 0 mismatches against a budget=null Node reference, plus four maximum-alsoMatched stress cases matching exactly including true untruncated lost-rule counts; the charge is monotone (clean non-oscillating cutoff, no shape-dependent hole across four ~3M-pair shapes); pathCell boundaries 255/256/257/1023/1024 drawn byte-exact and 1025 refused at the door; fields still capped at 256; 1000 rows of 1024-char paths produced 997,617 raw characters against the 1,000,000 bound with zero tag imbalance and the correct 'Drawing stopped after 858 of 1000 files' disclosure, captured through a prototype-level innerHTML interceptor so browser error-recovery could not hide a defect; the bare-textarea comparison verified independently (bare 29.36 s vs this page 28.12 s on 1 MiB of newlines); every door limit off-by-one exact in both directions; the generation-counter runner did not strand across 73 rAF-sampled frames under a 4-wave x 6-delay input barrage; 9 XSS payloads x 4 sinks, 0 injections; 2 network requests, 0 cookies; mobile 375px no overflow. THE VERDICT IS STILL FAIL. The residual is one line: the skipped-line sink at page.src.html:562 still calls cell() where it needs a 4096-char clip. It is NOT fixed here, because the contract allows one fix cycle and changing code after the verdict would mean recording a verdict against something other than what was tested.",
   "distribution": {
    "registry_pr": "n/a (not an MCP server)",
    "hub": "not listed - never staged, never public",
    "x_draft": "none - the build-in-public draft is a stage-gate deliverable and the stage gate was not reached",
    "posted_on": null
   },
   "signal": {
    "measurable": false,
    "note": "killed 2026-08-06; branch dark, no public path \u2014 nothing to measure Instrument-read this fire from public/beacon-stats.json (BOTTLENECKS #2 relay), fetched by GitHub-Actions run 31454011286 at 2026-08-11T02:59:18Z, HTTP 200, oracle VERDICT PASS. Fleet state at that read: hub / = 30 qualified visits across 3 distinct days (13 on 08-09, 14 on 08-10, 3 on 08-11); /002-gha-trigger/ = 0; /004-khanya-school-tutor/ = 0; /005-maccleaner/ = 0. Third consecutive fire to read its own instrument out of git rather than carry an assumption. MOD-2 Branch B on the best-performing path: 30/250 qualified visits, 3/3 distinct days \u2014 the distinct-days half of the threshold is met on the hub for the first time; the volume half is not, and the hub is not a ship.",
    "as_of": "2026-08-11T02:59:18Z",
    "source": "public/beacon-stats.json (BOTTLENECKS #2 relay); oracle PASS this fire"
   },
   "status": "killed",
   "kill_criterion": "n/a - never published. KILLED instead by the anti-grind clause written into briefs/2026-08-06.md BEFORE the build: 'if today's build does not reach a checker PASS, codeowners goes to graveyard.md and never re-enters.'",
   "plain": {
    "what": "A free web page: paste your CODEOWNERS file and the files a pull request touches, and see exactly who GitHub will ask to review each one - and which of your rules a later line is quietly overriding.",
    "solves": "CODEOWNERS picks reviewers on every PR, but the LAST matching rule wins rather than the most specific one, so teams believe a rule protects a directory when a broader rule below it has been overriding it for months.",
    "money": "None, and there will not be any. The matching is correct and heavily proven - 190/190 reference cases against the live page - and the page is secure, private, bounded and mobile-clean. It died on presentation defects, not on being wrong: three days and seven verdicts, and every fix cycle revealed a sibling of the defect it had just closed. The loop killed it under a rule it wrote for itself before starting, rather than spend a fourth day. The engineering is kept: lib/door.js, lib/checks/door-limits.json and four hard-won build rules carry into every future ship."
   },
   "killed": {
    "date": "2026-08-06",
    "to": "graveyard.md",
    "reason": "Three builds, seven independent checker verdicts, zero PASS. Killed by the anti-grind clause written into briefs/2026-08-06.md BEFORE the build, so the decision was made without knowing the verdict. Status is 'killed' rather than 'failed' on purpose: 'failed' means eligible for the rebuild lane, and this one is not. Only the founder can overturn it.",
    "kept": "lib/door.js (two-cap rule), lib/nfa.js, lib/codeowners.js, lib/inline.js, lib/checks/codeowners-oracle.json (171 pairs), lib/checks/door-limits.json (11 probes) \u2014 all merged to main. The branch stays in the repo, dark and unmerged, as the record."
   }
  },
  {
   "n": 4,
   "date": "2026-08-06",
   "slug": "khanya-school-tutor",
   "one_liner": "gamified CAPS/IEB tutor for Gr 3-12 (born as the app built for the founder's son) \u2014 Socratic tutor chat, knowledge maps, Snap & Solve, test generator, spaced repetition, teach-back; BYO free Gemini key or demo mode; the public build ships NO key",
   "gap_source_url": "https://x.com/heynavtoor/status/2047279221912084908",
   "deploy_url": "https://tailorfarms.com/004-khanya-school-tutor/",
   "kind": "app",
   "checker_verdict": "PASS \u2014 no secrets, demo mode clean (0 errors, 0 network), footer + single body + safety constant all present; cold-serve 200 text/html. [Directed ship: an embedded family Gemini API key was found at line 642 BEFORE the checker pass and stripped from the public build (vault original untouched); independent checker then confirmed zero embedded keys and a coherent demo mode via headless Chromium \u2014 0 page errors, 0 googleapis calls]",
   "distribution": {
    "registry_pr": "n/a",
    "hub": true,
    "x_draft": "briefs/2026-08-06.md",
    "posted_on": null
   },
   "signal": {
    "measurable": true,
    "qualified_visits": 0,
    "distinct_days": 0,
    "path": "/004-khanya-school-tutor/",
    "note": "Instrument-read this fire from public/beacon-stats.json (BOTTLENECKS #2 relay), fetched by GitHub-Actions run 31454011286 at 2026-08-11T02:59:18Z, HTTP 200, oracle VERDICT PASS. Fleet state at that read: hub / = 30 qualified visits across 3 distinct days (13 on 08-09, 14 on 08-10, 3 on 08-11); /002-gha-trigger/ = 0; /004-khanya-school-tutor/ = 0; /005-maccleaner/ = 0. Third consecutive fire to read its own instrument out of git rather than carry an assumption. MOD-2 Branch B on the best-performing path: 30/250 qualified visits, 3/3 distinct days \u2014 the distinct-days half of the threshold is met on the hub for the first time; the volume half is not, and the hub is not a ship.",
    "source": "public/beacon-stats.json (BOTTLENECKS #2 relay); oracle PASS this fire",
    "as_of": "2026-08-11T02:59:18Z"
   },
   "status": "live",
   "kill_criterion": "d30 per-path visits <25 once the beacon token lands (beacon still absent fleet-wide)",
   "directed_by": "the founder 2026-08-06 \u2014 fast-track order, publish pre-approved; recovered from vault projects/tutor-agent (the ordering session died on an auth error before doing anything)"
  },
  {
   "n": 5,
   "date": "2026-08-06",
   "slug": "maccleaner",
   "one_liner": "AppCleaner-style leftover finder + dev-machine cache cleanup for macOS that quarantines instead of deletes \u2014 scan by default, manifest + full undo, purge double-gated; v1.1.4",
   "gap_source_url": "directed rebuild \u2014 original maker session cse_019hUctXBMeBJap8Ts15xJvR (no repo write path from its container)",
   "deploy_url": "https://tailorfarms.com/005-maccleaner/",
   "kind": "app",
   "checker_verdict": "PASS after one fix cycle \u2014 round 1 PARTIAL: with a symlinked cache ancestor, --apply caches/all-safe relocated real ~/Documents files into quarantine (restorable, reproduced by the checker), refuting the absolute 'Documents structurally untouchable'; all other named attacks (child-symlink, hostile restore/purge args, age gates, root/category guards), byte-identity and no-bash-4 PASSED. Fix: v1.1.4 has_symlink_ancestor gate. Targeted RECHECK: PASS \u2014 parent-symlink escape closed (Documents untouched under --apply caches and all-safe), legitimate quarantine + child-symlink handling + restore unbroken, bash -n/shellcheck clean, ancestor-walk terminates and fails closed.",
   "distribution": {
    "registry_pr": "n/a",
    "hub": true,
    "x_draft": "briefs/2026-08-06.md",
    "posted_on": null
   },
   "signal": {
    "measurable": true,
    "qualified_visits": 0,
    "distinct_days": 0,
    "path": "/005-maccleaner/",
    "note": "Instrument-read this fire from public/beacon-stats.json (BOTTLENECKS #2 relay), fetched by GitHub-Actions run 31454011286 at 2026-08-11T02:59:18Z, HTTP 200, oracle VERDICT PASS. Fleet state at that read: hub / = 30 qualified visits across 3 distinct days (13 on 08-09, 14 on 08-10, 3 on 08-11); /002-gha-trigger/ = 0; /004-khanya-school-tutor/ = 0; /005-maccleaner/ = 0. Third consecutive fire to read its own instrument out of git rather than carry an assumption. MOD-2 Branch B on the best-performing path: 30/250 qualified visits, 3/3 distinct days \u2014 the distinct-days half of the threshold is met on the hub for the first time; the volume half is not, and the hub is not a ship.",
    "source": "public/beacon-stats.json (BOTTLENECKS #2 relay); oracle PASS this fire",
    "as_of": "2026-08-11T02:59:18Z"
   },
   "status": "live",
   "kill_criterion": "d30 per-path visits <25 once the beacon token lands",
   "directed_by": "the founder 2026-08-06 \u2014 fast-track order, publish pre-approved; v1.1.3 recovered from the build session transcript, independently re-verified, v1.1.4 adds the symlink-ancestor gate"
  },
  {
   "n": 6,
   "date": "2026-08-07",
   "slug": "npm-publish-preflight",
   "kind": "app",
   "one_liner": "paste your package.json, .npmignore/.gitignore and your file list - see the exact set of files npm publish would upload and the one rule that decided each; built, adversarially verified, and FAILED",
   "gap_source_url": "https://docs.npmjs.com/cli/v11/configuring-npm/package-json + https://docs.npmjs.com/cli/v11/using-npm/developers/ + https://github.com/npm/cli/wiki/Files-&-Ignores",
   "deploy_url": "not deployed - branch ship/006-npm-publish-preflight, unmerged, HEAD 9721a7e",
   "checker_verdict": "FAIL. FOUR independent refutation-seeking checkers across two rounds, none given a prior verdict, all on a different model from the maker, all driving the real page cold in Chromium, and rounds 2's both diffing against a real `npm pack --dry-run` on npm 10.9.7. ROUND 1, TWO PARALLEL CHECKERS. [A - semantics and premise] VERBATIM: \"VERDICT: FAIL. Confirmed against real npm (installed npm 11.19.0 / npm-packlist 10.0.4, verified current via `npm pack --dry-run --json` in scratch fixtures under /tmp/npmcheck, then reproduced live in Chromium): 1. Backslash-in-filename: verdict flip + fabricated reason. File `weird\\file.js` (literal backslash, valid on Linux) plus .npmignore rule `weird/` plus a real `weird/real.js`. Real npm ships `weird\\file.js` untouched and excludes `weird/real.js`. The page excludes BOTH, displaying the first as `weird/file.js` and citing `.npmignore weird/ line 1 - the directory 'weird' is excluded' - a directory that does not exist. Root cause: lib/npmpack.js norm() does .replace(/\\\\/g,'/') unconditionally, so it path-mangles the identity of the file AND invents the reason. This falsifies both halves of the product's claim on one input. 2. Case-insensitivity, systemic. Real npm's matcher (ignore-walk/lib/index.js:108, nocase: true, hardcoded, unconditional) matches every rule case-insensitively - defaults, hard-excludes, and user's own rules alike. lib/gitignore.js is case-sensitive throughout. Confirmed live: NODE_MODULES/dep/i.js and Node_Modules/dep/i.js -> page says PUBLISHED, real npm excludes both. User rule *.log + dist/ -> page publishes DEBUG.LOG and Dist/inside.js; real npm excludes both. 3. files[] loses its anchor on ./ or /. 4. `files` as a non-array string: real npm iterates the string char-by-char, publishing almost nothing; the page's Array.isArray guard fails silently and publishes everything - the opposite outcome. 5. browser field never force-included. Real npm (strict.push('!/${browser}')) force-includes it like main/bin.\" [B - cost, bounds, privacy, honesty] VERBATIM: \"VERDICT: FAIL. 1) UNMETERED COST DoS. package.json (130,967/131,072 chars) with files[] containing 16 entries that are pure-space strings (8,180 spaces each), plus 3,000 distinct paths - every dimension door-legal. Timed via in-page performance.now() around the click: blocked the main thread for 1860-2941 ms across 5 trials, with status='done' - the budget-exceeded path never engages. Root cause: matchOne() calls parseLine() BEFORE any tick(budget); parseLine's trailing-whitespace-strip reduces an all-space pattern to '', returns null, so matchOne returns false without ever reaching the only place tick() lives. Verified directly: after 48,000 such calls (2941 ms) budget.left was still exactly 60000000. This is exactly the 'loop between the door and the budget that was never metered' class. 2) SILENT OUTPUT TRUNCATION / malformed HTML. 1,000 distinct paths of 'p'+i+'\\\"'.repeat(300). The raw string assigned to #result.innerHTML is exactly 900,000 chars (OUT_CAP) and ends mid-row: unclosed <td>, unclosed <tr>, no </tbody></table>. Both messages meant to DISCLOSE this also silently fail to append (buffer already full). The page shows a confident 'PUBLISHED 1000 / LEFT OUT 0', status='done', no incomplete indicator.\" ONE FIX CYCLE (all the contract allows) closed all seven round-1 findings; both were re-verified dead by fresh adversaries. ROUND 2, TARGETED RE-CHECK ON THE FIX DIFF, TWO FRESH ADVERSARIES - FAIL. [A] VERBATIM: \"VERDICT: FAIL. SIBLING 1 (severe): force-include checks in npmpack.js - p===mainTarget, p===browserTarget, bins.indexOf(p), p==='package.json' - stayed case-SENSITIVE while the fix made ignore/files[] matching case-insensitive. Real npm's force-include is ALSO case-insensitive: npm-packlist v9 pushes main/browser/bin/package.json as !-rules into the same set ignore-walk matches via minimatch with nocase:true unconditionally. Verified live: disk files Main.JS/Browser.JS/bin/Tool.JS - npm pack --dry-run ships all three; the live page reports all three 'left out'. Opposite verdicts on a realistic case-mangled checkout. SIBLING 2 (severe): the fold itself breaks fixed-width matching for length-changing Unicode. compileSegment/splitPath run .toLowerCase() on the whole string before tokenizing; I-with-dot (U+0130) becomes 2 chars, desyncing ?/class token counts. Rule a?c vs file with U+0130: real npm EXCLUDES it; the live page PUBLISHES it. Same for g[!A-Z].js. Greek final-sigma likewise. None of these are in the maker's 33-case oracle. ATTACK 1: the exact B1 regression is fixed - 194.5ms in Chromium (was ~2,941ms). But a sibling door-legal input still burns the ceiling: ~6,920 short non-matching literal files[] entries + 3,000 paths -> 2,523ms blocked, 280/3,000 rows resolved ('stopped early' correctly shown, banner correctly ordered first). ATTACK 2 (truncation): HELD. raw innerHTML 700,130 chars, tag balance exact (tr 619/619, td 1854/1854), 'cut short' disclosed above the counts.\" [B] VERBATIM: \"VERDICT: FAIL. Four defects confirmed against real npm pack --dry-run on npm 10.9.7: 1. Verdict wrong, contradicts the page's own stated rule. files:['src'] + .npmignore 'src/skip/' + path src/skip/keep.js. Real npm PUBLISHES it. Page excludes it, citing 'the directory src/skip is excluded' - contradicting its own docs that files[] wins over .npmignore. Cause: ancestor-pruning runs unconditionally BEFORE the hasFilesArray branch. 2. Verdict wrong: a leading UTF-8 BOM on a .gitignore attaches to the first pattern's literal token, making rule 1 permanently unmatchable, silently. Real npm excludes secretdir/x.js; page publishes it. 3. Citation fabricated (verdict right): .npmignore 'vendor/' + vendor/node_modules/left-pad/index.js - page cites npm-hard-exclude/node_modules, never vendor/, the actual shallower rule, because hardHit() scans all ancestors before the ordinary ancestor check. 4. Undisclosed gap: real npm never packs symlinks; git ls-files (which the page's own placeholder recommends) lists them; page marks all three test symlinks PUBLISHED. Minor: main:'lib' with lib/index.js present still fires a false 'cannot be required'; DEFAULT_IGNORE citations show an internal array index as a line number. Held up: last-match-wins across many shapes, CRLF and comment/blank line numbers, bare / surfaced as a parse error, node_modules un-re-includable, unicode/emoji filenames, files[] with ../absolute paths, privacy (zero cookies/localStorage/sessionStorage/IndexedDB, 2 cookie-free requests, no page content in any URL), all first-visit and empty states at 1200px and 375px, and secrets/PII across full git history.\" Live-URL unverified (egress) - sandbox cannot reach *.workers.dev; verification was local cold-serve plus confirmed push hash (git ls-remote = local HEAD).",
   "distribution": {
    "registry_pr": null,
    "hub": false,
    "x_draft": false,
    "posted_on": null
   },
   "signal": {
    "measurable": false,
    "note": "checker-FAIL, branch unmerged and dark \u2014 no public path to measure Instrument-read this fire from public/beacon-stats.json (BOTTLENECKS #2 relay), fetched by GitHub-Actions run 31454011286 at 2026-08-11T02:59:18Z, HTTP 200, oracle VERDICT PASS. Fleet state at that read: hub / = 30 qualified visits across 3 distinct days (13 on 08-09, 14 on 08-10, 3 on 08-11); /002-gha-trigger/ = 0; /004-khanya-school-tutor/ = 0; /005-maccleaner/ = 0. Third consecutive fire to read its own instrument out of git rather than carry an assumption. MOD-2 Branch B on the best-performing path: 30/250 qualified visits, 3/3 distinct days \u2014 the distinct-days half of the threshold is met on the hub for the first time; the volume half is not, and the hub is not a ship.",
    "as_of": "2026-08-11T02:59:18Z",
    "source": "public/beacon-stats.json (BOTTLENECKS #2 relay); oracle PASS this fire"
   },
   "status": "failed",
   "kill_criterion": "n/a - never published. The anti-grind clause written into briefs/2026-08-07.md BEFORE the build ('one fix cycle and one targeted re-check, and no second day') fired on the round-2 FAIL. Does NOT re-enter tomorrow as a rebuild. Only the founder can overturn that.",
   "failed": {
    "why": "Two rounds, four independent verdicts, zero PASS. Round 1 found seven defects; the one permitted fix cycle closed all seven and that was independently confirmed; round 2 then found six more, TWO OF WHICH ARE SIBLINGS OF THE ROUND-1 FIXES - case-folding applied to the matcher but not to the four force-include comparisons one file away, and the fold itself introducing a length-changing-Unicode defect that did not exist before it. Same generator producing new defects at the rate they are closed. That is ship 003's death pattern, and recognising it is what the clause is for.",
    "nothing_merged": "Deliberate, including lib/. Ship 003's engineering was merged to main because it had been PROVEN correct and only the product around it failed. Not true here: two of the six live defects are inside lib/gitignore.js and lib/npmpack.js themselves, so merging would put known-defective code into the shared library for the next ship to inherit silently.",
    "worth_salvaging": "lib/checks/npm-publish-oracle.json on the branch - 43 reference cases, 33 verified against a real npm pack --dry-run on npm 10.9.7, plus the six round-2 findings as ready-made failing cases. Correct, and the most valuable thing this run produced.",
    "residual": [
     "force-include comparisons (main, browser, bin, package.json) must be case-folded like everything else",
     "case folding must happen PER TOKEN, not by lowering the whole string, or length-changing Unicode desynchronises fixed-width tokens",
     "ancestor pruning must run AFTER the files[] branch - files[] outranks a user ignore rule and the page currently contradicts its own documentation",
     "a UTF-8 BOM must be stripped from an ignore file's first line or rule 1 is silently dead",
     "the SHALLOWEST excluding ancestor must be cited, not whichever ancestor the hard-list hit first",
     "symlinks are never packed by npm and git ls-files lists them - handle or disclose"
    ],
    "method_lesson": "Round 1's 23-case oracle passed 23/23 and was still wrong about npm's most pervasive behaviour, because the maker wrote both the matcher and the cases. Every defect that mattered came from installing the real implementation and diffing against it."
   }
  },
  {
   "n": 7,
   "date": "2026-08-08",
   "slug": "ssh-config-resolver",
   "one_liner": "Paste your ~/.ssh/config and a hostname; see the effective options OpenSSH would use, the exact line that set each one, and why every block matched or didn't. Built on lib/nfa.js, verified by differential replay against the real `ssh -G`.",
   "gap_source_url": "EVERGREEN lane (why-now waived). Occupant hunt 2026-08-08, two independently-worded searches, no interactive tool: https://linuxize.com/post/using-the-ssh-config-file/ \u00b7 https://en.wikibooks.org/wiki/OpenSSH/Pattern_Matching_in_OpenSSH_Configuration \u00b7 https://sthbrx.github.io/blog/2023/08/04/quirks-of-parsing-ssh-configs/ \u00b7 https://www.simplified.guide/ssh/config-client-show (its answer is 'run ssh -G') \u00b7 https://pypi.org/project/pysshconfig/ (library, not a tool). Independently re-verified by checker B with four further phrasings: premise CONFIRMED, nearest hit https://servercompass.app/tools/ssh-config-editor is a form-based generator that does not resolve precedence.",
   "deploy_url": "not deployed - branch ship/007-ssh-config-resolver, unmerged, HEAD c557f11",
   "kind": "app",
   "checker_verdict": "FAIL after one fix cycle. FOUR independent refutation-seeking checkers across two rounds, none given a prior verdict, all on a different model from the maker, all driving the served page cold in Chromium against the real OpenSSH_9.6p1 binary as oracle. ZERO PASS. ROUND 1 CHECKER A - VERDICT: FAIL. '1. defect (CONFIRMED, live in browser) - Unrecognised keyword anywhere in file does not refuse the whole file. Input: ZorpNotAKeyword foo / Host * / Port 7 / User bob, host a.ex. Expected (real ssh -F cfg -G a.ex): exit 255, \"Bad configuration option: zorpnotakeyword\", no output at all. Actual (served page): confident table port=7 (line 3), user=bob (line 4), no fatal banner. 2. defect - Match all combined with another criterion is silently accepted instead of refused. 3. defect - Keyword with no argument (e.g. bare Port) parsed as empty string, no error raised at all. 4. defect - Lone CR (no LF) wrongly treated as a line break; expected port=22, actual port=9. 5. defect (PLAUSIBLE) - Match exec\\'s \"cannot decide\" flag doesn\\'t propagate to keys a later block also sets. 6. cosmetic - Expansion-note text says \"Match hostname\" but ssh_config has no Match hostname criterion. 7. overclaim - \"5,493 configs / four seeds / zero mismatches\" is true for the fuzzer\\'s own grammar (independently reran at seeds 424242, 99991, 777001: ~5,491 evaluated, 0 mismatches) but that grammar exercises ~30 of 134 keywords, never emits Match all combos, never emits missing-value/unknown-keyword lines... All four confirmed defects above live exactly in that undisclosed blind spot.' ROUND 1 CHECKER B - VERDICT: PARTIAL. '1. [defect] Hard config-parse errors (Host/Match with no argument, unterminated double quote) do NOT stop resolution, even though real OpenSSH totally refuses the file in every one of these cases and the page\\'s own copy explicitly claims it \"deliberately refuses instead of guessing\". Repro B (worse): Host web1 / User realone / (blank) / Host / Port 4444, target web1 -> page shows BOTH user=realone AND port=4444 attributed to the web1 block (the directive after the broken Host line silently leaks into the previous valid block because the parser never re-points cur when it rejects a header with no args); ground truth totally refuses (exit 255, zero output). 2. [cosmetic] Horizontal page overflow at 320x568: scrollWidth 336 vs clientWidth 320. 3. Byte-identity: identical, no drift. 4. Diff scope: all in-scope, no personal name, no secrets, no vault refs. 5. Scout premise (occupant hunt): CONFIRMED. Tried and found nothing on: script/HTML injection via keyword names, directive values, Host patterns, Match criteria, target/localuser boxes, and specifically the refusal/error-message paths - all rendered HTML-escaped via lib/esc.js at every one of the five innerHTML sinks. No localStorage/sessionStorage/IndexedDB writes. No cookies at any point. No outbound request carries config/target/localuser content.' ONE FIX CYCLE APPLIED (all seven round-1 items closed; harness extended to generate malformed configs and assert refusal agreement in both directions; 8,990 cases / six seeds / zero mismatches, 1,998 of them refusals). ROUND 2 RE-CHECK A - VERDICT: FAIL. 'HALF ONE: D1 unknown keyword DEAD. D2 Match all combined DEAD. D3 keyword no argument DEAD. D4 lone-CR file DEAD. D5 Match exec uncertainty DEAD. Unterminated quote DEAD. Host with no pattern DEAD. HALF TWO - new findings: 1. [HIGH - false refusal] IgnoreUnknown is a real, order-sensitive OpenSSH directive that suppresses fatality for a matching later unknown keyword. The page recognizes ignoreunknown as a keyword token but never implements its effect. Repro: IgnoreUnknown Frobnicate / Frobnicate yes / Host * / Port 7, host foo - real ssh exits 0, port 7. Page shows the red refusal box, hiding a resolvable answer behind a false refusal. lib/sshconfig.js:324. 2. [HIGH - silent data loss] An ACCUMULATES keyword only gets its uncertainAfter flag set if the list did not exist yet when the undecidable block was hit. Repro: Host * / IdentityFile /tmp/k1 / Match exec \"true\" / IdentityFile /tmp/k2 / Host * / IdentityFile /tmp/k3 - real ssh reports k1, k2, k3. Page shows only k1 | k3, no uncertain badge on that row. /tmp/k2 is silently dropped and the row looks complete. lib/sshconfig.js:368-384. 3. [MEDIUM-HIGH - false accept, whole class] The tokenizer turns a quoted empty string \"\" into a length-1 token, so every !args.length fatality check never fires on it. Real ssh refuses the whole file. Repros confirmed live: Host \"\" ... ; Match host \"\" ... ; Host * / User \"\" (page shows user resolved to the empty string). lib/sshconfig.js:268-333. 4. [MEDIUM - false uncertainty] Match tagged is classed as unconditionally undecidable, poisoning every value below it, but this page has no UI path to ever supply an ssh -P tag, so Match tagged X is always deterministically non-matching. lib/sshconfig.js:125-130. Attacked and found nothing: keyword-table completeness (extracted 681 string candidates from /usr/bin/ssh, probed all, no real gap found); CRLF/mixed line endings, blank lines of only tabs/CR, missing trailing newline, UTF-8 BOM, empty file, comment-only file, nonexistent Include target, all legal Match all placements, duplicate/contradictory Match criteria, Match exec with no argument. Harness re-run on fresh seeds: 8987 evaluated, zero mismatches, refusalsAgreed 1947 - corroborates the claim rather than refuting it. Not an overclaim. lib/checks/ssh-fuzz.js matchHeader() never generates Match exec/canonical/final/tagged blocks with directives inside, which is why the harness\\'s own 8,987-case run at zero mismatches did not and structurally cannot catch findings 1, 2, or 4 - the fuzzer\\'s blind spot is a second-order sibling of the same fix this re-check was scoped to.' ROUND 2 RE-CHECK B - VERDICT: PARTIAL. '1. overclaim/cosmetic - Footer\\'s testing-volume claim is stale and contradicts the honesty panel on the same live page: footer reads \"5,493 differential cases\" while the panel reads \"8,990 generated configs across six seeds... of which 1,998 were malformed files\". Two different, disagreeing counts of how much this was tested sit on the same page under a footer that says \"verified before ship\". 2. usability/cosmetic - Block trace renders 42 near-identical skipped rows for a 42-host config with no collapse/filter; not misleading, just verbose, and still strictly more informative than plain ssh -G, so not worse than the CLI it replaces. Attacked and found clean: XSS across all 6 innerHTML sinks including payloads straddling the 120/300/400/500-char clip boundaries and the 400,000-char buffer cap - zero injected elements, zero dialogs. Storage/exfiltration: localStorage/sessionStorage/indexedDB empty, zero cookies, planted marker never left the browser. DoS: door limits correct at exact off-by-one boundaries; the densest door-legal adversarial input (199,050 chars) correctly tripped the 750 ms budget with the honest refusal, never a silently partial table; measured overshoot 22-72 ms (max clickSyncMs 772 ms). Documentation: zero mismatches corroborated on three fresh seeds; Port 99999, Compression maybe, ProxyJump loop and BatchMode-derived ServerAliveInterval all behave exactly as the page claims; KEYWORDS.length === 134; fuzz grammar exercises 31 distinct keywords, matching \"about 30 of the 134\".'",
   "distribution": {
    "registry_pr": "n/a",
    "hub": false,
    "x_draft": "not drafted - the X post is a stage-gate deliverable and the gate was not reached",
    "posted_on": null
   },
   "signal": {
    "measurable": false,
    "note": "checker-FAIL, branch unmerged and dark \u2014 no public path to measure Instrument-read this fire from public/beacon-stats.json (BOTTLENECKS #2 relay), fetched by GitHub-Actions run 31454011286 at 2026-08-11T02:59:18Z, HTTP 200, oracle VERDICT PASS. Fleet state at that read: hub / = 30 qualified visits across 3 distinct days (13 on 08-09, 14 on 08-10, 3 on 08-11); /002-gha-trigger/ = 0; /004-khanya-school-tutor/ = 0; /005-maccleaner/ = 0. Third consecutive fire to read its own instrument out of git rather than carry an assumption. MOD-2 Branch B on the best-performing path: 30/250 qualified visits, 3/3 distinct days \u2014 the distinct-days half of the threshold is met on the hub for the first time; the volume half is not, and the hub is not a ship.",
    "as_of": "2026-08-11T02:59:18Z",
    "source": "public/beacon-stats.json (BOTTLENECKS #2 relay); oracle PASS this fire"
   },
   "status": "failed",
   "kill_criterion": "would have been: d30 per-path visits to /007-ssh-config-resolver/ < 25. Never armed - nothing was deployed.",
   "anti_grind_clause": "Written into briefs/2026-08-08.md BEFORE the build, per the ship-003 and ship-006 precedent: one fix cycle; if the targeted re-check still FAILs, status goes to failed, the branch stays unmerged, the residuals are named, and ssh-config-resolver does not come back tomorrow. lib/sshconfig.js merges to main ONLY IF the checker states the surviving defects are page-level, not library-level. The clause fired. All four round-2 defects were named at specific lines INSIDE lib/sshconfig.js (125-130, 268-333, 324, 368-384), so lib/ is NOT merged either - the ship-006 rule, for the ship-006 reason: merging would hand the next ship a silent bug.",
   "residuals": [
    "IgnoreUnknown is parsed as a keyword but its effect is not implemented, so a config that real ssh accepts is falsely refused (lib/sshconfig.js:324)",
    "uncertainAfter is set only when an accumulator list is created, so entries collected before an undecidable block leave the row unmarked and a middle entry is silently dropped (lib/sshconfig.js:368-384)",
    "a quoted empty string \"\" is a length-1 token, so every !args.length fatality check misses it and a whole class of files real ssh refuses is accepted (lib/sshconfig.js:268-333)",
    "Match tagged is unconditionally undecidable although this page can never supply an ssh -P tag, so it is always deterministically non-matching and the doubt is manufactured (lib/sshconfig.js:125-130)",
    "the footer's '5,493 differential cases' was not updated when the honesty panel went to 8,990 - the same page now carries two disagreeing test counts (public/007-ssh-config-resolver/page.src.html footer)",
    "lib/checks/ssh-fuzz.js matchHeader() never emits Match exec/canonical/final/tagged blocks WITH directives inside them, which is the structural reason its 8,987-case zero-mismatch run cannot see residuals 1, 2 and 4"
   ],
   "salvage": "The differential-REPLAY method is the durable output and it is documented in lib/README.md on the branch. It found four real defects before any checker saw the page (command-line user outranking every User line; five accumulators de-duplicating identical values; ProxyCommand and friends taking the rest of the line raw; Match user evaluated against the wrong subject), and the extended version verifies refusal agreement in both directions. A future run should lift that section into main independently of this ship's code."
  },
  {
   "n": 8,
   "date": "2026-08-08",
   "slug": "beacon-firstparty",
   "one_liner": "first-party cookieless visit beacon (POST /_b, counts readable at /_b/stats) so a scheduled fire can READ its own instrument instead of only feeding Cloudflare's dashboard",
   "gap_source_url": "Not a scouted ship. Built from the 2026-08-08 wiring-fire payload (operator bootstrap). Rationale is internal and verifiable in-repo: lib/beacon.html is Cloudflare Web Analytics \u2014 third-party, pageview-only, readable only by logging into Cloudflare's dashboard, which a scheduled fire cannot do. Every kill-criterion (PLAYBOOK Amendment 2026-08-02b clause 5) and the proposed v4 visit threshold are therefore un-evaluable from inside a run.",
   "deploy_url": "/_b/stats (worker route; snippet live on /, /002-gha-trigger/, /004-khanya-school-tutor/, /005-maccleaner/)",
   "kind": "infra",
   "checker_verdict": "ROUND 1 (independent checker, different model from the maker, refutation-seeking) \u2014 VERBATIM:\n\"VERDICT: FAIL\n1. lib/template.html:19-20, public/index.html:59-60, public/002-gha-trigger/index.html:1439-1440, public/004-khanya-school-tutor/index.html:1658-1659, public/005-maccleaner/index.html:90-91 \u2014 the inlined beacon snippet is malformed HTML and the beacon **never executes** on any of the 6 files. Each insertion left a stray fragment of the source comment from lib/beacon-firstparty.html unwrapped... Per the HTML5 tokenizer, <script> content is raw text terminated only by the first literal </script> \u2014 so this opens ONE script element whose text swallows everything up to the real closing tag... the real beacon code is dead text inside one broken tag, not a second executable script... the entire deliverable is inert. This bug is identical and copy-pasted across all 6 files, so it isn't a one-off typo, and the oracle (which only imports src/beacon-core.js, never touches these HTML files) could not have caught it.\n2. src/worker.js:33 \u2014 new URL(origin) throws uncaught on the browser-legal Origin: null header... POST /_b with Origin: null returns HTTP 500, contradicting the code's own comment 'Returns 204 always'.\n3. src/beacon-core.js:16,34 \u2014 'drops unknown/crafted paths so KV keys cannot be created arbitrarily' is false... POST /_b {\"path\":\"/999-totally-fake-ship-nobody-built/\"} ... create real, distinct KV keys... a script spoofing a real-browser UA can mint unbounded distinct per-day KV keys, inflating KV write costs and polluting /_b/stats \u2014 the same feed the loop's kill-criteria are meant to read.\n4. src/worker.js:66-83 (/_b/stats) \u2014 the second pass issues one uncapped env.BEACON.get() per (path,date) key via Promise.all with no concurrency/volume limit, and the list loop has no page cap either... flagged as plausible-but-not-load-tested.\n5. src/beacon-core.js:56 \u2014 isBotUA treats a missing/empty User-Agent as a bot... inverts the file's own stated design preference. Flagged as plausible only.\n6. oracles/beacon/run.mjs:38-49 \u2014 the 'unbounded-key defence' block only exercises obviously-malformed shapes... never asserts the actual claim... The oracle also never touches any of the 5 HTML files, so it structurally cannot detect finding 1. 53/53 green therefore does not cover the two most severe defects found.\"\nClean on: merge-tree conflict-free; secret scan of the diff clean (only the pre-existing public Cloudflare Web Analytics site token, already on main); ASSETS fallthrough verified via wrangler dev --local. Could not verify: the real *.workers.dev deployment (sandbox egress), browser-observed SyntaxError, /_b/stats at scale.\n\nROUND 2 (targeted re-check after the ONE permitted fix cycle; second independent checker, different model) \u2014 VERBATIM:\n\"VERDICT: PARTIAL\n1. Inert beacon (comment-captured <script>) \u2014 DEAD... Reproduced the literal original corruption as a negative control and confirmed node oracles/beacon/run.mjs fails on it.\n2. Origin: null 500 \u2014 DEAD... all return 204, no throw.\n3. Shape-test -> unbounded KV keys \u2014 DEAD. COUNTABLE is a true membership set; normalisePath can only return a value already in COUNTABLE or null... Fuzzed case, %2e/%2f literal encodings, //, ../, index.html-chain folding, trailing/duplicate slashes, uppercase slugs, /dashboard/ \u2014 all correctly dropped or folded.\n4. Uncapped /_b/stats \u2014 DEAD... _truncated cannot collide with a real path key... the cap is a correct backstop.\n5. Empty/absent UA -> bot \u2014 DEAD (as claimed: not a functional fix, a documented accepted tradeoff).\n6. Oracle never tested shipped HTML \u2014 PARTIALLY-DEAD... it does catch the literal original corruption. But its 'shipped HTML is really a working script' check is defeatable \u2014 see new defect #1 \u2014 so the deeper problem the finding was pointing at (an oracle that can look green while the shipped artifact is broken) is not fully closed.\nNEW DEFECTS INTRODUCED BY THE FIX CYCLE:\n1. (Severe, sibling of finding 1/6's fix) oracles/beacon/run.mjs:143-159 \u2014 the per-page script-boundary walker can be defeated by an unrelated, unclosed <script> tag placed anywhere earlier in the page, before the real snippet's <script>. Per the HTML5 raw-text content model, the first </script> closes the first-opened <script>, so a stray earlier <script> silently absorbs the real snippet into one broken, non-executing script element in a real browser \u2014 the exact same 'inert beacon that ships silently' failure as finding 1... I verified this concretely: inserted <script>// stray leftover open tag... immediately before the real snippet's <script> tag in public/index.html; node oracles/beacon/run.mjs still reports 93 passed, 0 failed on the corrupted page... Root cause: the oracle's 'exactly one script body contains /_b' check is satisfied by a merged/broken body just as well as a clean one.\n2. (Moderate, repo hygiene) Commit b01ba44 added and committed ~588 KB / 16 files of local Miniflare/wrangler dev state under .wrangler/state/v3/... .gitignore does not exclude .wrangler/... no secrets or PII found \u2014 but it is unambiguously committed dev/build cruft. Should be git rm -r --cached .wrangler and .wrangler/ added to .gitignore.\"\nWHAT THE CHECKER COULD NOT VERIFY: the live/preview *.workers.dev deployment (sandbox egress 403; KV namespace is still an unprovisioned placeholder); real-browser confirmation of the sibling defect (used Python html.parser as a spec-faithful proxy); exhaustive /_b/stats fuzzing at Workers' real subrequest limits.\n\nROUND 3 (2026-08-09 recovery fire; independent checker, different model from the maker, refutation-seeking; against the maker's targeted fix of the two named round-2 residuals) \u2014 VERBATIM:\n\"VERDICT: FAIL\n1. oracles/beacon/run.mjs:172-178 (verify_snippet contract) - SEVERE, CONFIRMED. verify_snippet's byte-equality check is defeated by wrapping the exact, byte-identical canonical <script>...</script> in <template>...</template> or <noscript>...</noscript>. Repro: copy public/, wrap the snippet in <template>, `node oracles/beacon/run.mjs` from that copy -> '95 passed, 0 failed', exit 0. Verified live in Chromium (Playwright, navigator.webdriver spoofed false, /_b routed): unmodified page fires POST /_b (true); template-wrapped page does not (false); same result for <noscript>. This is exactly the 'oracle green, beacon inert in a real browser' failure class residual A was supposed to close, reproduced against the replacement verifier itself - a direct sibling, one content-model away from the fixed vector.\n2. lib/inline.js:59-72 (output post-condition) - SEVERE, CONFIRMED. The new post-condition invokes lib/checks/html-scripts.py WITHOUT --snippet, so it checks only structural validity, never byte-equality against the inlined content - the exact predicate the module's own docstring calls 'load-bearing'. Repro exits 0, prints '[script structure verified...]', and writes an output file where the entire module is merged as raw text into ONE script element. A sibling of residual B's fix, one function call away.\n3. oracles/beacon/run.mjs (whole file) - MODERATE, CONFIRMED, pre-existing but newly consequential. A stray literal NUL byte makes git/GitHub treat the file as binary, so the commit that replaced the hand-rolled walker renders as 'Binary files differ' with zero visible diff - the single most safety-relevant change in the fix cycle, invisible to a GitHub PR review.\n4. .gitignore, wrangler.jsonc - MODERATE, CONFIRMED, governance. PLAYBOOK 2026-08-02 \u00a79 assigns .gitignore to main; this branch edits it. No CONFLICT resulted (luck, not design). Ambiguous whether \u00a79 literally binds an 'infra/' branch, but the letter of the rule was crossed.\n5. lib/checks/html-scripts.py:130 - MINOR, PLAUSIBLE. A CRLF-normalized copy false-FAILs byte-equality. Latent, not active.\n6. lib/inline.js:29-30 - MODERATE, CONFIRMED, pre-existing. '<!-- inline:../../../../etc/hostname -->' is accepted and inlined with no repo-containment check.\"\nCLEAN ON (round 3): round-2's literal named defeat is genuinely closed; inline.js's two input guards; fail-closed on missing checker and on missing python3; attribute/case/whitespace mutations of the script tag; selftest 6/6 non-tautological; cold-serve of all 4 pages HTTP 200 and structurally clean; push landed (ls-remote == local HEAD); no secrets in the diff; the KV namespace id judged CONFIGURATION not a credential, with provenance disclosed in-file rather than hidden; merge-tree no CONFLICT.\n\nROUND 4 (targeted re-check after the ONE permitted fix cycle, commit 51109b2; same independent checker, re-attacking its own repros plus the siblings the cycle grew) \u2014 VERBATIM:\n\"VERDICT: FAIL\n1. lib/checks/html-scripts.py:78-113 (INERT_ANCESTORS stack) - SEVERE, CONFIRMED, sibling of this cycle's own fix. html.parser does NOT treat <noscript> as raw text when scripting is enabled. A literal '</template>' inside a still-open <noscript> is swallowed as raw TEXT by a real browser (template stays open) but parsed by this module as a genuine closing tag, popping 'template' off the stack early. A script that follows is reported live (ancestors=[]) while a real browser still nests it inside the unclosed <template>. Repro: `<template><noscript>X</template>Y</noscript><script>SNIPPET</script>`. Full chain on a copy of public/index.html: oracle -> '95 passed, 0 failed', exit 0. Real Chromium: clean page fires POST /_b (true); this oracle-PASSED page does not (false); DOM inspection confirms the <script> is still nested inside <template> at runtime. Also reproduced against lib/inline.js.\n2. lib/checks/html-scripts.py:236 / verify_bodies() - SEVERE, CONFIRMED, sibling of the --expect fix. verify_bodies checks each expected-body entry independently for 'exactly one live match', with no 1:1 correspondence between the count of expected entries and live elements found. Two directives inlining the same file, with an earlier stray unclosed <script> merging ONE resulting element into garbage, satisfies both lookups because the single surviving live copy matches each independently. inline.js exits 0 and prints 'all inlined bodies verified as live script elements' - false for the first directive.\n3. oracles/beacon/run.mjs:158 - MODERATE, CONFIRMED, residual #5 only partially closed. The CRLF fix landed in html-scripts.py but run.mjs still has its own older un-normalized html.includes(SNIPPET) substring gate that still false-FAILs the identical input ('93 passed, 2 failed', exit 1). The commit message's claim is true for the module, not for the oracle a fire actually runs.\n4. lib/checks/html-scripts.py:150 - MODERATE, CONFIRMED, false alarm. A real page with a live, correctly-placed beacon PLUS an unrelated legitimate inert script elsewhere (e.g. <noscript><script type='application/ld+json'>) fails the ENTIRE check, because scripts_of()'s errors are triggered by any inert script anywhere on the page, not just ones touching the bodies being verified. Verified in Chromium that the beacon still fires despite the FAIL.\n5. .gitignore - MODERATE->MINOR. The branch touches it again (__pycache__/). A rule violation, disclosed rather than silently crossed, and not merge-blocking.\"\nCLEAN ON (round 4): both round-3 severe repros are genuinely dead, re-confirmed in real Chromium; round-3's inline.js merged-body repro dead; the NUL byte is fixed for the diff a merge reviewer actually sees; the path-traversal fix holds; fail-closed unchanged; selftest 12/12 with 3 genuine false-alarm controls; <title>/<textarea>/<xmp>/<plaintext> handling verified correct against CPython's RCDATA_CONTENT_ELEMENTS; <svg>/<math> foreign content correctly live (not a bypass); <TEMPLATE> case, attributes on inert tags, unmatched </template>, nested and self-closing templates all correct; all 5 shipped pages cold-served HTTP 200 and clean; oracle 95/95 on the unmodified tree; ls-remote == local HEAD 51109b2; merge-tree no CONFLICT; no new secrets or PII.\nWHAT ROUNDS 3-4 COULD NOT VERIFY: the live *.workers.dev deployment, and the real existence of KV namespace 4849d5cb422843d49e27535fa796644d (sandbox egress; no Cloudflare credential, by design); Worker-side /_b routing at edge scale (src/worker.js and src/beacon-core.js were untouched by this cycle).\n\nOUTCOME 2026-08-09: the permitted fix cycle is spent and the FAIL persists. Per PLAYBOOK the branch stays UNMERGED and is reported as FAIL \u2014 a legitimate outcome, and the honest one. Four rounds, four independent verdicts, zero PASS. FOR THE RECORD: this run was asked to record BOTTLENECKS #1's oracle-first fix as 'field-validated' if the beacon PASSed. It did not PASS. The evidence points the other way and is recorded as such.\n\nROUND 5 \u2014 REBUILD checker (independent, different model), VERBATIM verdict line: \"VERDICT: PARTIAL \u2014 the new browser-truth oracle genuinely survives independent attack and is the only thing in the repo that catches an inert beacon (I defeated the static band again and it caught me), but oracles/beacon/run.mjs still hard-gates the loop on that same static band with a CONFIRMED round-4 finding still open in it, and round-1 finding #4's /_b/stats \"fix\" does not address the ceiling it names.\" 9 findings, 0 severe (4 MODERATE, 5 LOW). It built its own 13-page adversarial corpus: the oracle caught 9 of its 13 attacks incl. every inert-beacon vector; survivors were meta-refresh re-fire and service-worker interference, both adversary-with-write, no fleet page affected.\n\nROUND 6 \u2014 targeted re-check on the ONE fix cycle (FRESH adversary, different model, no prior verdict), VERBATIM verdict line: \"VERDICT: PARTIAL \u2014 all eight named fixes verifiably hold under independent repro, but the F3 rebuild grew one new defect one line from its own fix (while (paths.length * days > HARD_CAP) days--), which silently collapses the /_b/stats window as the fleet grows and returns 'zero visits everywhere' indistinguishably from a real zero.\" It measured: fixes 8/8 HOLD (assertion name-diff 32 removed all static-band + 1 decision-logic added; 200-case client/server self=1 fuzz zero divergence; byte-exact 512/513 boundary; pre/post control matrix on the sendBeacon-false fallback 0\u21921 POST; stats delta-exact, \u226444 subrequests on 23 parameter shapes).",
   "distribution": {
    "registry_pr": "n/a (infrastructure, not a product)",
    "hub": "n/a",
    "x_draft": "none \u2014 an X draft is a stage-gate deliverable and the gate was not reached",
    "posted_on": null
   },
   "signal": {
    "self_measurement": "the beacon measures the fleet, not itself; its liveness signal IS /_b/stats answering 200",
    "stats_endpoint_live": true,
    "as_of": "2026-08-11T02:59:18Z",
    "note": "the beacon measures the fleet, not itself; its liveness signal IS /_b/stats answering 200, which it did at this timestamp (public/beacon-stats.json, http 200). Fleet totals at this read: hub 20 visits across 2 distinct days, all three ship pages measured-zero. Instrument-read this fire from public/beacon-stats.json (BOTTLENECKS #2 relay), fetched by GitHub-Actions run 31454011286 at 2026-08-11T02:59:18Z, HTTP 200, oracle VERDICT PASS. Fleet state at that read: hub / = 30 qualified visits across 3 distinct days (13 on 08-09, 14 on 08-10, 3 on 08-11); /002-gha-trigger/ = 0; /004-khanya-school-tutor/ = 0; /005-maccleaner/ = 0. Third consecutive fire to read its own instrument out of git rather than carry an assumption. MOD-2 Branch B on the best-performing path: 30/250 qualified visits, 3/3 distinct days \u2014 the distinct-days half of the threshold is met on the hub for the first time; the volume half is not, and the hub is not a ship.",
    "measurable": false,
    "source": "public/beacon-stats.json (BOTTLENECKS #2 relay); oracle PASS this fire"
   },
   "status": "live",
   "kill_criterion": "infra \u2014 lives while the loop lives; provisioning deadline met 2026-08-09 (KV bound, /_b/stats 200 live). Standing failure criterion: /_b/stats non-200 for >24h or a checker showing the oracle green on an inert beacon = immediate BOTTLENECKS entry + rebuild.",
   "anti_grind_clause": "One fix cycle permitted, then a targeted re-check (PLAYBOOK section 5). The cycle was spent: 6 round-1 findings, all 6 addressed, round 2 confirms 5 DEAD and 1 PARTIALLY-DEAD but names a NEW severe sibling of the fix. Per the clause the branch stays unmerged and is reported as-is. The only post-verdict edit was untracking .wrangler/ dev state (round-2 defect 2), which was maker-introduced cruft from the checker's own wrangler dev run, not a second fix cycle on the product.",
   "residuals": [
    "OPEN, severe \u2014 oracles/beacon/run.mjs script-boundary walker is defeatable by a stray unclosed <script> earlier in a page; the oracle can report green while the shipped beacon is inert in a real browser. This is the THIRD consecutive appearance of BOTTLENECKS.md entry #1 (fix spawns a sibling of the fix) and the first one caught inside the verification layer itself rather than in a ship.",
    "BLOCKED, external \u2014 the Cloudflare KV namespace is unprovisioned. wrangler.jsonc carries the literal placeholder PLACEHOLDER-CREATE-KV-NAMESPACE-FIRST. Because this branch also sets `main`, merging it before the namespace exists would fail the deploy and take the WHOLE SITE down, not just the beacon. The loop holds no Cloudflare credential by design (Amendment 2026-08-02 clause 2), so this step is impossible from a fire and is reported FAIL with the step named rather than skipped.",
    "UNVERIFIED, environmental \u2014 the Worker half (routing, KV writes, /_b/stats) has never run against a real Cloudflare edge. Both checkers were limited to wrangler dev --local / a hand-built fake env. `*.workers.dev` is unreachable from the sandbox (CONNECT 403) and no desktop bridge exists in a scheduled fire.",
    "NOT DONE, deliberate \u2014 the four live ships' ledger `signal` blocks were left null. The wiring-fire payload asked for them to be set to {visits_qualified: 0}. Setting a counter to 0 asserts a reading from an instrument that is not armed; null correctly means UNMEASURED. They flip when the beacon is actually live and /_b/stats answers."
   ],
   "salvage": "src/beacon-core.js (pure, 93-case oracle, no Workers APIs) and oracles/beacon/run.mjs are reusable independently of whether this Worker ever deploys. The oracle's HTML-artifact section is the first instance in this loop of an oracle testing the SHIPPED BYTES rather than the module \u2014 the round-2 defect is a hole in that idea's execution, not in the idea, and closing it properly (parse with a real HTML tokenizer instead of a hand-rolled walker) is the cheapest high-value next task.",
   "plain": {
    "money": "Not monetised. This is the measuring instrument, not a product \u2014 but nothing else in the loop can be honestly evaluated until it works, because today no fire can read a single visit number."
   },
   "rebuild": "REBUILT 2026-08-09 by the live session (the founder present: 'fix all the issues\u2026 i want autonomy') after rounds 1-4, 0 PASS. Structural change, not another grind cycle: every prior FAIL was a hand-written HTML parse-and-match band claiming snippet liveness; that band is DELETED from the trust path. Liveness authority is now oracles/beacon/browser-truth.mjs \u2014 each page loads in a real Chromium and the only measured fact is an HTTP POST /_b arriving at a real socket; the rounds-2/3/4 defeat vectors are its probe controls, plus c4b where the browser corrected the oracle's own author during authoring. Worker shell verified cold via wrangler dev --local (bound AND unbound), delta-exact under 9 drop vectors. Deployed two-step: main-fronting first (verified live), then the one-line KV binding (verified live: /_b/stats 200, honest zeros).",
   "residuals_carried": "RECORDED, NOT GROUND (one fix cycle spent; 002 precedent \u2014 changing code after the verdict would stage something unverified): (1) MEDIUM, fleet-growth reachability: the /_b/stats DEFAULT multi-path window shrinks as COUNTABLE grows (7 ships \u2192 6-day window < the trailing-7 metric; 45 \u2192 0-day silent zeros). Conservative direction (under-reads, never inflates), window.days is printed in every response, and ?path=X&days=30 single-path reads are unaffected at any fleet size \u2014 the operator MUST use per-path reads for threshold computations. FIX QUEUED: next fire, own commit, own checker (explicit by-path truncation with a _more list, never silent window collapse). (2) LOW pre-existing: sendBeacon-throws / Blob-throws \u2192 visit silently lost (identical pre-fix, measured). (3) adversary-with-write vectors (timer re-fire, service-worker) recorded in the oracle header; no fleet page has either, grepped."
  },
  {
   "n": 9,
   "date": "2026-08-09",
   "slug": "html-structure-oracle",
   "kind": "infra",
   "status": "failed",
   "one_liner": "tokenizer-based HTML structure oracle (lib/checks/html_structure.py) \u2014 replaces the hand-rolled <script> boundary walker BOTTLENECKS #1 incident #4 falsified; adds a third verdict CANNOT-CERTIFY so an oracle can decline to bless a page it cannot read",
   "gap_source_url": "Not a scouted ship. Sunday iteration target picked by the 2026-08-09 02:10Z scheduled fire against BOTTLENECKS.md entry #1 incident #4, whose recorded lesson is 'do not hand-roll a parser for a language that has a spec-defined tokenizer.' Internal, verifiable in-repo.",
   "deploy_url": "not deployed \u2014 branch infra/html-structure-oracle, UNMERGED. A checker FAIL never merges, independently of the v4 MOD-1 infra-autonomy gate.",
   "checker_verdict": "ROUND 1 (independent checker, sonnet \u2014 different model from the maker, refutation-seeking) \u2014 VERBATIM:\n\nVERDICT: FAIL\n\nFINDINGS:\n\n1. **[severe]** `assert_inline_contains`/`inline_bodies()` (lib/checks/html_structure.py:107-108, 132-133, 245-252) never inspect the `type` attribute. Any `<script type=\"...\">` with no `src` is treated as a live, executing inline script as long as it's not one of the two explicitly-modeled divergences. Demonstrated by direct execution:\n   - `<script type=\"application/json\">BEACON()</script>` \u2192 `PASS`\n   - `<script type=\"text/template\">BEACON()</script>` \u2192 `PASS`\n   - `<script type=\"importmap\">BEACON()</script>` \u2192 `PASS`\n   - `<script nomodule>BEACON()</script>` \u2192 `PASS`\n   None of these execute as JavaScript in a real browser (per the HTML spec, a script block is a \"classic script\" only if `type` is absent, empty, or a recognized JS MIME type; anything else \u2014 `application/json`, `text/template`, `application/ld+json`, etc. \u2014 makes it an inert data block, and `nomodule` scripts are skipped by any browser that runs modules). This is the exact ship-008 failure mode reproduced inside the replacement oracle itself: needle text present on the page, inert as code, oracle green. `type=\"application/json\"` in particular (JSON-LD, hydration payloads) is extremely common in real pages, far more likely to occur by accident/misconfiguration than the double-escape divergence the module spends its whole docstring on. This gap is undisclosed \u2014 the docstring's \"declared imprecision\" section only names the double-escape case, not this one.\n\n2. **[severe]** Same false-PASS shape via two more common HTML constructs, also undisclosed:\n   - `<template><script>BEACON()</script></template>` \u2192 `PASS`. Per HTML spec 4.12.3, `<template>` contents live in an inert `DocumentFragment`; nested `<script>` is not executed until explicitly cloned into the document by other JS, which does not happen by default.\n   - `<noscript><script>BEACON()</script></noscript>` \u2192 `PASS`. Per HTML spec 4.12.2, when scripting is enabled (the normal case) a browser's HTML parser treats `<noscript>` content as raw text \u2014 the nested `<script>` is never instantiated as an element at all, so it never runs; `<noscript>` is also hidden by the UA stylesheet in that mode. `html.parser` has no special-casing for `noscript` (only `script`/`style` are in its CDATA element list), so it happily parses the fake nested script as real.\n\n3. **[minor, converse direction]** `<iframe srcdoc=\"<script>BEACON()</script>\"></iframe>` \u2192 `FAIL` (`'BEACON' does not appear in any inline <script> body`). In a real, unsandboxed iframe, `srcdoc` content is parsed as a full document and the script inside it does execute. The module never looks inside attribute values, so a legitimately-placed beacon via `srcdoc` is reported as absent/inert when it is not. Low real-world frequency for a first-party beacon placement, but it is a genuine false-FAIL the task asked to check for.\n\n4. **[minor]** `is_external` (line 107) checks only `\"src\" in attrs`; there is no code path anywhere in the file that reads `attrs.get(\"type\")`. Confirmed by `grep -n '\"type\"' lib/checks/html_structure.py` \u2192 no matches.\n\n5. **[informational, not a defect]** `<script></script>` inside `<textarea>` or `<title>` correctly comes back `FAIL` (0 scripts found) \u2014 this is the right answer, since browsers also treat those as raw-text containers and never instantiate a nested script element there. Verified as a true negative, not a bug.\n\n6. **[informational, not a defect]** Bad-input handling is honest and non-crashing: empty file \u2192 PASS (0 scripts, trivially true, no assertion given); missing file \u2192 `CANNOT-CERTIFY \u2014 cannot read: [Errno 2] ...`, exit 2; binary file (`/bin/ls` bytes) \u2192 decodes via `errors=\"replace\"`, no crash, PASS (0 scripts found, correct); non-UTF-8 bytes inside a script body \u2192 decodes and still finds the needle correctly; a 3.3MB / 200k-element synthetic file parses in ~1.5s with no error. No crashes found anywhere I tried.\n\nCLAIMS TABLE:\n1. `--self-test` returns 17/17, exit 0 \u2014 CONFIRMED.\n2. All 6 real pages certify cleanly, zero false CANNOT-CERTIFY \u2014 CONFIRMED. All six PASS, overall PASS, exit 0.\n3. Stray unclosed `<script>` earlier in the page does not block seeing a later real script body \u2014 CONFIRMED. Verdict PASS, 2 scripts found, second body correctly isolated as 'BEACON()'.\n4. html.parser genuinely diverges from HTML5 spec on script-data-double-escaped, and the module correctly refuses to guess \u2014 CONFIRMED. Manually traced the WHATWG tokenizer state machine: script data state \u2192 `<!--` \u2192 escaped-dash-dash \u2192 `<script` + terminator \u2192 double-escaped state \u2192 literal `</script>` inside double-escaped state flips back to *singly*-escaped state, it does not close the tag \u2192 `<b>after</b>` is consumed as raw text inside the still-open script \u2192 EOF with the script never closed. The maker's spec reading is correct.\n5. CANNOT-CERTIFY dominates FAIL in multi-file runs and exit code \u2014 CONFIRMED. Overall CANNOT-CERTIFY and exit 2 in both orderings.\n\nOn the \"DECLARED OVER-REFUSAL\" question: legitimate. I independently derived the same state-machine trace and confirmed the docstring's second example is a real case where the spec would return the tokenizer to plain script-data after `-->`, meaning a fully precise oracle should PASS it, while this module CANNOT-CERTIFYs it. That is an honestly-stated conservative trade, not a test bent to hide a bug. However, the docstring's implicit framing \u2014 that the *only* place this oracle's reading can diverge from a browser's is the double-escape state \u2014 is false; findings 1 and 2 are undisclosed divergences of exactly the same severity class (PASS-but-inert).\n\nRESIDUALS:\n- SVG `<script>` inside `<foreignObject>`: parsed as a normal script, returned PASS. Probably not a bug but could not verify against an actual browser; flagged as unverified.\n- No headless browser or JS engine was available; all conclusions rest on spec text plus direct execution of the module.\n- Did not test every encoding/BOM combination (e.g. UTF-16 BOM files, which `errors=\"replace\"` under a hardcoded `encoding=\"utf-8\"` open will mangle rather than crash).\n\n\n====================================================================================================\n\nROUND 2 \u2014 TARGETED RE-CHECK after the one permitted fix cycle (same independent checker, sonnet) \u2014 VERBATIM:\n\nVERDICT: FAIL\n\nFINDINGS:\n\n1. **[moderate, severe in principle \u2014 the round-2 sibling]** `_classify_type` at `lib/checks/html_structure.py:186` (`t = raw.strip().lower()`) uses Python's default `str.strip()`, which strips the full Unicode whitespace category (includes NBSP U+00A0, vertical tab 0x0B, and other Unicode space/separator characters), not the HTML spec's \"ASCII whitespace\" set (TAB, LF, FF, CR, SPACE only \u2014 five characters, spec-defined and used correctly elsewhere in this same file, e.g. the `_DOUBLE_ESCAPE_OPEN` regex `[\\t\\n\\f />]`). Demonstrated by direct execution:\n   - `<script type=\"text/javascript\u00a0\">BEACON()</script>` \u2192 module returns `PASS` (executes).\n   - `<script type=\"text/javascript\\x0b\">BEACON()</script>` \u2192 module returns `PASS` (executes).\n   - `<script type=\"module\u00a0\">BEACON()</script>` \u2192 module returns `PASS` (executes).\n   Per spec, only ASCII whitespace is stripped before the exact case-insensitive comparison against the MIME/`module` list; a trailing NBSP or vertical tab is **not** stripped by a real browser, so the exact-string match fails and the browser treats the script as an inert data block (or, for `module`, as an invalid/unexecuted script type). The module's own docstring at line 122 explicitly claims \"leading/trailing ASCII whitespace stripped\" \u2014 the code does not do what the comment says it does. This is a genuine false-PASS in the exact ship-008 shape (markup present, browser inert, oracle green), and it is a defect *created by this fix cycle itself* \u2014 it did not exist before `_classify_type` was added. It is a textbook \"sibling of the fix, one line away\" per BOTTLENECKS #1. Real-world frequency is low (requires a stray non-ASCII whitespace byte inside a `type` attribute \u2014 plausible via copy-paste from a rich-text source or a broken templating/minifier pass, not common), so I rate it moderate rather than severe, but it is real and reproducible.\n\n2. **[moderate, second sibling]** Duplicate `type` attributes are resolved backwards from spec. `html.parser` does not deduplicate attributes (confirmed: `<script type=\"text/javascript\" type=\"application/json\">` yields `[('type','text/javascript'), ('type','application/json')]`, both tuples present). `handle_starttag`/`handle_startendtag` build `dict(attrs)`, which \u2014 standard Python dict-from-pairs semantics \u2014 keeps the **last** occurrence of a duplicate key. Per the HTML5 tokenizer spec, a duplicate attribute is a parse error and the **first** occurrence wins; the second is discarded. Demonstrated:\n   - `<script type=\"application/json\" type=\"text/javascript\">BEACON()</script>` (JSON first, JS second) \u2192 module returns `PASS` (last-wins: JS). Per spec the **first** attribute (`application/json`) governs and a real browser treats this as an inert data block \u2014 the module is wrong in the dangerous direction (false PASS, ship-008 shape).\n   - `<script type=\"text/javascript\" type=\"application/json\">BEACON()</script>` (JS first, JSON second) \u2192 module returns `FAIL`/inert (last-wins: JSON). Per spec the first attribute (JS) governs and the script *does* execute \u2014 the module is wrong in the safe direction here (false negative), but still wrong.\n   Duplicate attributes on a single tag are rare in hand-authored HTML but are a realistic byproduct of templating bugs, merge conflicts, or generated markup, and this is a second concrete case where the fix's \"closed enumeration\" framing missed a real spec nuance sitting right next to the code it just wrote.\n\n3. **[informational]** Everything explicitly asked to be re-attacked in items 3 and 4 (nested `<template><template>`, doubly-closed `<template>`, stray `</noscript>` with no opener, a literal `<template>` string inside a script body, self-closing `<template/>`, `<noscript>` in `<head>` vs `<body>`, crossed `<template>`/`<noscript>` nesting, self-closing `<script/>`, self-closing `<iframe srcdoc=... />`, self-closing `<img/>` as a generic regression check, and a self-closing `<script/>` inside a `<template>`) came back correct \u2014 no crashes, no depth-stack corruption, no wrongly-inert or wrongly-live real scripts. The `handle_startendtag` delegation fix does not double-count or break tracking.\n\n4. **[informational]** Full self-test: 36/36, exit 0. All 6 real pages: `PASS`, exit 0, structure unchanged from round 1. CANNOT-CERTIFY still dominates in multi-file batches in both orderings, exit 2. No secrets, tokens, credentials, or vault references in the round-2 diff (`git diff 8759a4f..163dc70`), confirmed by keyword and pattern scan.\n\n5. **[on the \"closed enumeration, no long tail\" claim]** The claim is **partially true and partially false, and the false part is exactly what findings 1-2 demonstrate.** The *set itself* \u2014 the 16-entry `_JS_MIME_TYPES` frozenset \u2014 is accurate; I checked it against the WHATWG mimesniff \"JavaScript MIME type\" list and found no missing or extra entries. So \"the set is closed\" is correct. But the claim conflates \"the set is closed\" with \"there is no long tail,\" and that's the overreach: the *procedure that normalizes a value before comparing it against the set* (ASCII-whitespace stripping, first-attribute-wins on duplicates) is itself spec-governed, has its own edge cases, and both of the two edge cases I found were mishandled by the exact same fix cycle that introduced the set. The tail isn't in the enumeration; it's in the plumbing around the enumeration, and BOTTLENECKS #1's pattern (\"the fix cycle regenerates defects... usually one line away from what was just repaired\") predicted precisely that shape. The maker's claim as literally written is not fully honest \u2014 \"closed enumeration\" is true of one part of the new code and silently generalized to cover a part where it doesn't hold.\n\nCLAIMS TABLE:\n1. Round-1 findings 1, 2, 3 are closed \u2014 CONFIRMED by direct execution of all original reproducers; all now correctly return FAIL with a distinguishing \"present but INERT \u2014 reason\" message. `<iframe srcdoc>` correctly reported as a nested document. Walker-killer input still PASS.\n2. `type` logic correct on all listed adversarial cases EXCEPT ASCII-vs-Unicode whitespace and duplicate attributes \u2014 PARTIALLY REFUTED. Confirmed correct: charset-parameterized types correctly inert (matches real browsers \u2014 the spec's script-type match is a literal string comparison against the enumerated list); uppercase `TYPE=`; uppercase value; whitespace-only type \u2192 correctly treated as absent/executing; embedded tab correctly inert; trailing-junk MIME correctly inert.\n3. Inert-container stack robust against nesting/closing edge cases \u2014 CONFIRMED for every case constructed.\n4. `handle_startendtag` delegation works and doesn't regress or double-count \u2014 CONFIRMED.\n5. Self-test 36/36 and 6/6 real pages PASS with no regression \u2014 CONFIRMED.\n6. \"Does not reopen the long-tail pattern because the sets are closed enumerations\" \u2014 REFUTED as stated. The enumeration is closed and correct; the normalization/comparison procedure around it is not fully spec-faithful and contains two new false-positive-risk bugs introduced in this exact fix cycle.\n\nRESIDUALS:\n- Could not verify true-browser recovery behaviour for deeply malformed crossed-tag inputs against an actual browser's tree-construction error recovery; the module's flat depth-stack degrades sensibly but a real parser's recovery is more complex than a stack.\n- No headless browser/JS engine available in either round; conclusions rest on direct execution plus WHATWG spec tracing.\n- Did not re-probe round-1 residuals (SVG foreignObject `<script>`, BOM/UTF-16 encoding); those remain open, unaffected by this diff.\n",
   "maker_note": "Maker accepted round 1 in full and spent the ONE permitted fix cycle modelling executability rather than presence (type/nomodule vs the closed JS-MIME list; <template>/<noscript> inert containers; <iframe srcdoc> as an unparsed nested document). Self-test 17->36, 36/36; real corpus 6/6 PASS; round-1 findings 1-3 confirmed closed BY THE CHECKER. Round 2 then named TWO NEW DEFECTS CREATED BY THAT FIX (str.strip() strips Unicode whitespace where HTML strips only ASCII; dict(attrs) is last-wins where the HTML spec is first-wins on duplicate attributes). Both are one-line fixes. NEITHER WAS FIXED \u2014 the anti-grind clause binds precisely here, and ship 003 died with a genuinely one-line residual because a fourth day was tempting.",
   "disposition": "FAILED \u2014 AND THE FAILURE RECONFIRMS THE SHIPPED FIX FROM A SECOND DIRECTION. While this fire was suspended, the live session shipped BOTTLENECKS #1's third clause: 'for liveness-of-markup claims the oracle executes the page in a real browser (Chromium) and observes the behaviour itself \u2014 the hand-written parse-and-match band is deleted, not repaired.' This artifact IS a hand-written parse-and-match band for exactly that claim, built before that clause landed. Its two-round history is independent evidence for the clause: every defect in both rounds was a place where static analysis predicted browser behaviour and got it wrong, and the checker's standing residual in BOTH rounds was that no browser was available to ground-truth against. A static oracle that tries to answer 'will this execute?' is re-deriving a browser and will regenerate siblings indefinitely. The correct disposition is therefore NOT a third fix cycle but retirement of the approach. SALVAGE: the 36-case corpus (esp. the 9 present-but-inert cases) is real, reusable material as INPUT to the browser-truth oracle \u2014 each case is a page whose expected liveness is known, which is exactly what a Chromium oracle needs to be tested against. Chromium is available in the sandbox at /opt/pw-browsers/chromium, so this is buildable.",
   "signal": {
    "measurable": false,
    "note": "checker-FAIL, branch unmerged and dark \u2014 no public path, nothing to measure Instrument-read this fire from public/beacon-stats.json (BOTTLENECKS #2 relay), fetched by GitHub-Actions run 31454011286 at 2026-08-11T02:59:18Z, HTTP 200, oracle VERDICT PASS. Fleet state at that read: hub / = 30 qualified visits across 3 distinct days (13 on 08-09, 14 on 08-10, 3 on 08-11); /002-gha-trigger/ = 0; /004-khanya-school-tutor/ = 0; /005-maccleaner/ = 0. Third consecutive fire to read its own instrument out of git rather than carry an assumption. MOD-2 Branch B on the best-performing path: 30/250 qualified visits, 3/3 distinct days \u2014 the distinct-days half of the threshold is met on the hub for the first time; the volume half is not, and the hub is not a ship.",
    "as_of": "2026-08-11T02:59:18Z",
    "source": "public/beacon-stats.json (BOTTLENECKS #2 relay); oracle PASS this fire"
   },
   "kill_criterion": "n/a \u2014 infra, never published. Died to the anti-grind clause after 2 rounds / 2 independent verdicts / 0 PASS.",
   "residuals_at_death": [
    "_classify_type uses str.strip() (Unicode whitespace) where HTML strips only ASCII whitespace \u2014 false PASS on type=\"text/javascript\\u00a0\"",
    "dict(attrs) resolves duplicate attributes last-wins; HTML spec is first-wins \u2014 false PASS on <script type=\"application/json\" type=\"text/javascript\">",
    "SVG <script> inside <foreignObject> never verified against a real browser (round-1 residual, never closed)",
    "UTF-16/BOM inputs mangled by hardcoded encoding='utf-8' with errors='replace' (round-1 residual, never closed)",
    "crossed-tag error recovery uses a flat depth stack, not the spec's tree-construction recovery",
    "STRUCTURAL: the approach itself \u2014 static prediction of browser executability \u2014 is superseded by the browser-truth clause"
   ]
  },
  {
   "n": 10,
   "date": "2026-08-10",
   "slug": "beacon-stats-relay",
   "kind": "infra",
   "status": "live",
   "one_liner": "GitHub-Actions relay (.github/workflows/beacon-stats.yml) so an unattended scheduled fire can read the live /_b/stats instrument out of the repo, with provenance an oracle verifies against api.github.com. The RELAY works and read the instrument four times today; the PROOF that the committed numbers are the runner's does not, and that is what failed.",
   "gap_source_url": "Not a scouted ship. BOTTLENECKS.md entry #2, filed by this fire at count 3 \u2014 the loop cannot read its own instrument (WebFetch returns PROVENANCE_REQUIRED in every unattended session; measured again this run). Mandated by the v4 build-day rule: any cause at count >=2 with no shipped fix blocks build days and redirects the fire to fix work. Internal, verifiable in-repo.",
   "deploy_url": "MERGED to main. Not a public page \u2014 infra. Runs on schedule 01:35 UTC (~25 min before the daily fire) and on every push to main.",
   "checker_verdict": "ROUND 1 (independent checker, sonnet \u2014 different model from the maker/opus-5, refutation-seeking, drove the artifact COLD against the architect's oracle) \u2014 VERBATIM:\n\nVERDICT: FAIL\n\nFINDINGS:\n\n1. **[severe]** `oracles/beacon-stats-relay/oracle.py:138-163` \u2014 P6 (\"GROUND TRUTH\") verifies only that a real, successful Actions run of the correct workflow exists at the claimed `head_sha`; it never fetches or checks the run's actual output/logs against the artifact's `stats` field. Reproduction: took the real committed artifact `public/beacon-stats.json` (run 31349720900, PASS), copied it, and replaced only `stats` with fabricated numbers (`{\"paths\":{\"/\":{\"2026-08-09\":999999,\"2026-08-10\":999999}}}`), keeping every provenance field byte-identical. `python3 oracles/beacon-stats-relay/oracle.py /tmp/fabricated_numbers.json` \u2192 `VERDICT: PASS`. Piping that same file through `lib/beacon_stats.py` returns `{\"verdict\":\"PASS\", ...}` and `qualified_visits(block) == 1999998`. This directly falsifies both the claim under test (\"cannot be fooled into reporting numbers nobody measured\") and BOTTLENECKS.md entry #2's fix paragraph, which asserts \"A sandbox fire can write any JSON it likes; it cannot manufacture an Actions run\" \u2014 true but irrelevant, since manufacturing a run is unnecessary: reusing a real run's already-public provenance block (visible in the committed file / git history) with edited numbers is sufficient. Reachability: this is reachable from the loop's own normal build path \u2014 any fire with the write access the whole ship depends on (committing `public/beacon-stats.json`) can trivially do this; no adversary beyond the loop's existing operating model is required.\n\n2. **[severe]** `oracles/beacon-stats-relay/oracle.py:163` \u2014 compounds #1: `check(concl in (None, \"success\"), \"P6.concl\", ...)` accepts a run whose `conclusion` is `None` (still `in_progress`/`queued`, i.e., has not finished and therefore cannot yet have produced any committed numbers) as valid ground truth. Reproduction: loaded `oracle.py` as a module, monkeypatched `gh()` to return `{\"path\": \".../beacon-stats.yml\", \"head_sha\": \"1\"*40, \"conclusion\": None, \"status\": \"in_progress\", \"repository\": {\"full_name\": \"theshin621/foundry\"}}`, and ran `main()` against an artifact with matching provenance and `stats: {\"paths\":{\"/\":{\"2026-08-10\":5000000}}}` \u2192 `EXIT CODE: 0` (PASS), all 19 predicates `ok`. Reachability: same as #1 \u2014 no run needs to have completed at all for its provenance to be reused with fabricated numbers.\n\n3. **[severe]** `oracles/beacon-stats-relay/probe.py:32-40` (`base()` fixture) \u2014 every negative control built on `base()` hardcodes `provenance.run_id: 1`. Confirmed live: `GET /repos/theshin621/foundry/actions/runs/1` \u2192 `HTTPError 404`. This means P6.exists fires unconditionally for every N-series control regardless of whether the P1-P5 predicate the control claims to test is even present. Demonstrated by neutering (force-passing) the target predicate in an isolated copy of `oracle.py` and re-running the corresponding fixture: **N2** (`probe.py:64`, targets P5.stale), **N4** (`probe.py:70`, targets P2.nodata), **N7** (`probe.py:79`, targets P3.url), **N8** (`probe.py:82`, targets P5.future) all still print `VERDICT: FAIL` with P6.exists as the *sole* reported failure \u2014 i.e., P2.nodata, P3.url, and P5.future/P5.stale could be deleted from `oracle.py` entirely and these four \"negative controls\" would report `[ok]` unchanged. This is exactly the defect class BOTTLENECKS.md #1 and this task's brief warn about (a control that goes red for the wrong reason), and it undermines probe.py's own headline claim (\"the oracle caught every break attempted (15/15)\") \u2014 the 15/15 number overstates independently-verified coverage for at least 4 of 9 negative controls.\n\n4. **[severe]** `oracles/beacon-stats-relay/probe.py:104-108` (B3) reuses the same `REAL_BUT_WRONG_WORKFLOW` fixture (`probe.py:26-30`) as B1/B2 \u2014 which the file's own comment states is a **health-check.yml** run, not a beacon-stats.yml run. B3's comment claims \"real run, **real workflow claim**, but head_sha swapped\" \u2014 factually wrong; it's a wrong-workflow run with a swapped sha, so it's caught by P6.workflow before P6.sha is even reached (confirmed: run object has `path: health-check.yml`, so `run.get(\"path\") == WORKFLOW_PATH` already fails). Verified by neutering P6.sha in an isolated oracle copy and re-running B3's fixture: still `FAIL`, sole reason `P6.workflow`. This means `P6.sha` \u2014 one of the two checks the probe's own header names as load-bearing (\"Only P6.workflow and P6.sha stop it\") \u2014 has **zero independent test coverage** in probe.py; there is no fixture anywhere using a real, correctly-pathed beacon-stats.yml run with only its `head_sha` mismatched.\n\n5. **[medium]** `lib/beacon_stats.py:105-131` (`paths`/`qualified_visits`/`distinct_days`) silently collapses malformed per-path shapes into `0` rather than treating them as unmeasured, violating the module's own stated invariant (\"0 means measured-and-empty; None means we do not know, and those two must not collapse into each other,\" `lib/beacon_stats.py:117-119`). Reproductions (all against a synthetic `verdict:\"PASS\"` block, i.e. post-oracle-approval): `{\"paths\": {\"/\": 5}}` (non-dict byday value) \u2192 `qualified_visits=0, distinct_days=0` for that path instead of a flag that the shape was wrong; `{\"paths\": {\"/\": {\"2026-08-09\": -50}}}` \u2192 `qualified_visits=-50` (negative counts pass through unvalidated and can silently deflate a multi-path sum); `{\"paths\": {\"/\": {\"2026-08-09\": True}}}` \u2192 `qualified_visits=1` (Python's `isinstance(n, int)` at `lib/beacon_stats.py:125` and `:139` is `True` for `bool`, so a stray JSON `true`/`false` in a day-count is silently counted as 1/0). Reachability: reachable any day the live, externally-controlled `tailorfarms.com/_b/stats` endpoint emits a per-path shape different from the single real reading on record (2026-08-10) \u2014 only one real reading exists so far, so schema stability is unproven, and this is exactly the \"hand-written band around a correct borrowed primitive\" pattern BOTTLENECKS.md #1 names as the loop's standing failure mode (the oracle/GH-check half is solid; this reader half has no defensive validation of payload contents beyond the oracle's top-level dict/list check).\n\n6. **[minor]** `oracles/beacon-stats-relay/oracle.py:98` (P1.prov) requires `provenance.workflow_path` to be *present* but its *value* is never checked anywhere \u2014 not against the `WORKFLOW_PATH` constant, not against the API's `run.get(\"path\")`. The actual security-relevant check is `run.get(\"path\") == WORKFLOW_PATH` at line 159, entirely independent of the artifact's self-reported field. Not independently exploitable (the real check happens elsewhere), but the field is decorative and could mislead a future maintainer into thinking it's load-bearing. Reachability: none (inert), flagged for accuracy only.\n\n7. **[minor]** `oracles/beacon-stats-relay/oracle.py` never checks `head_branch` on the referenced run (confirmed present in the live API response: `head_branch: \"infra/beacon-stats-relay\"` for run 31349720900, via direct `curl`-equivalent GET). Low practical impact since `head_sha` pins the exact commit regardless of branch, but it is a genuinely omitted predicate the task explicitly asked about, and the oracle's PASS message (\"provably the output of Actions run X of workflow Y at commit Z\") makes no branch claim it could actually back up.\n\n8. **[minor]** `.github/workflows/beacon-stats.yml:80-83` \u2014 the embedded relay script sets `out['ok'] = (r.status == 200)` immediately after a successful `json.loads(body)`, without checking the parsed value is dict/list/non-None. Reproduction (extracted the embedded heredoc script and ran it against mocked `urlopen` responses): a `200` response with body `\"null\"` \u2192 committed record `{\"ok\": true, \"stats\": null, ...}`; body `\"42\"` \u2192 `{\"ok\": true, \"stats\": 42, ...}`. Both are self-contradictory relative to the schema the workflow's own header claims to guarantee (\"never store an un-parsed body as if it were the instrument\"). No fabrication escapes end-to-end only because the oracle's downstream P2.data/P4.json catch both cases (verified) \u2014 but the relay's own validation is weaker than its header claims, and a self-contradictory record would still be committed to git history.\n\nWHAT I COULD NOT CHECK:\n- Repo branch-protection rules on `main`.\n- Real end-to-end behavior of `workflow_dispatch` triggered from a tag ref.\n- Whether `[skip ci]` reliably prevents the *schedule*-triggered run from re-triggering anything.\n- Live tailorfarms.com/_b/stats itself (out of scope per instructions; not attempted).\n- Whether the single real reading (run 31349720900) is representative of the endpoint's schema over time.\n\nNOTE ON SCAN CATEGORIES THE CHECKER CLEARED: secrets/PII scan of `git diff main...HEAD` returned nothing (the fine-grained PAT lives only in untracked config.json and is absent from every tracked file); the BOTTLENECKS #2 three-incident evidence base was re-verified against `decisions/2026-08-09-segment-lock.md` and the `health-check.yml` header and found accurate.\n\n\n================================================================================\n\nROUND 2 (FRESH independent adversary, sonnet \u2014 different model from the maker/opus-5, had not seen round 1's exchange) \u2014 VERBATIM:\n\nVERDICT: FAIL\n\nFIXES FROM ROUND 1:\n1. PARTIAL \u2014 P7 content-binding blocks every attack I could execute (edit-without-commit, local-git-commit-without-push, replaying an older signed commit, symlink-with-path-inside-ROOT) \u2014 all correctly produced FAIL P7.bytes. But the fix's own stated threat model is false. beacon-stats.yml:152-157 claims \"the loop's PAT cannot produce that signature \u2014 GitHub, not the caller, holds the key.\" That's wrong: GitHub GPG-signs EVERY commit made through the Contents API regardless of caller identity \u2014 Actions GITHUB_TOKEN and a personal PAT both get verification.verified=true, reason=valid, committer=web-flow/GitHub. I confirmed this from a real commit already in the branch (3cbacc4): committer.login=web-flow, commit.committer={\"name\":\"GitHub\",\"email\":\"noreply@github.com\"}, verified=true \u2014 that's the Contents API's own behavior, not something GitHub Actions grants specially. I also confirmed the same config.json PAT the oracle itself reads has push:true, admin:true on theshin621/foundry. oracle.py's P7 block never checks commit author/actor identity \u2014 only verified, reason, and a caller-supplied message string, both of which an adversary calling the Contents API directly with the same PAT fully controls. This is the identical bypass round 1 found, just moved one API call away.\n2. HOLDS \u2014 conclusion=None and conclusion=\"failure\" both correctly rejected; only \"success\" passes.\n3. HOLDS for P1-P6 (fully re-verified by neutering each of the 11 targeted predicates one at a time; every control correctly went [!!]), BUT P7 has zero probe coverage \u2014 probe.py never targets any P7 predicate and structurally cannot: every fixture is a tempfile, so real_path != ARTIFACT_PATH and P7 is unconditionally skipped for all 15 controls. The centerpiece fix of this round has no regression test.\n4. HOLDS \u2014 B3 now genuinely exercises P6.sha in isolation.\n5. HOLDS for _count() (floats, string digits, negatives, booleans, huge ints, nested containers, paths-as-list, stats-as-list all correctly return None), BUT the sibling paths() fallback still fabricates numbers from non-visit metadata.\n6. HOLDS \u2014 P6.selfpath fires on a wrong self-reported workflow_path.\n7. BROKEN in effect (dead code) \u2014 the check works when head_branch is present and wrong, but beacon-stats.yml's prov dict NEVER writes a head_branch key, and oracle.py only checks it \"if 'head_branch' in prov\". P6.branch is unreachable on every artifact this pipeline has produced or will produce. Same \"decorative check\" pattern round 1 filed against workflow_path, reopened one field over.\n8. HOLDS \u2014 every scalar body (null, 42, \"hi\", NaN, Infinity, empty) correctly produces ok:false; only {} and [] give ok:true.\n\nNEW FINDINGS:\n1. [severe] beacon-stats.yml:138-198 + oracle.py:197-236 \u2014 P7's entire security story rests on \"the loop's PAT cannot produce GitHub's signature,\" which is false: ANY authenticated caller committing through the Contents API gets verification.verified=true from GitHub's web-flow key. Verified live: (a) the config.json PAT has push:true, admin:true on the repo; (b) a real committed reading (3cbacc4) shows committer.login=web-flow, verified=true \u2014 properties of the API endpoint used, not of who called it; (c) P7 checks only verified, reason, a caller-controlled message prefix, and blob equality \u2014 never author/actor identity. An adversary with that same PAT can PUT fabricated stats bytes directly to the contents endpoint, re-quote a real historical successful run's run_id/head_sha/window, and every predicate including P7 passes. Not executed against the live repo (would itself be a real signed commit, forbidden by the task) \u2014 reasoning fully evidenced by the three points above. REACHABILITY: requires zero credential beyond the exact PAT already resident in config.json and already read by the oracle for its own normal operation, i.e. \"a fire in this sandbox,\" which is precisely the threat model the workflow's own comment describes and claims to have closed. This is not a sibling of one round-1 fix \u2014 it is the same finding #1 reopened by the very mechanism chosen to fix it.\n2. [severe] oracle.py:201-203 \u2014 the real_path != ARTIFACT_PATH skip reproduces round 1's original defect verbatim whenever the oracle is invoked on anything other than the literal tracked path. Reproduced live: a fabricated copy under /tmp \u2192 \"P7 skipped \u2014 ... is a fixture, not the tracked artifact\" \u2192 VERDICT: PASS. REACHABILITY: currently theoretical on the loop's normal path, but lib/beacon_stats.py exposes an artifact= override parameter built for exactly the purpose of being called with a different path; the moment any future test harness or staging step uses it, this silently degrades to round-1's exact break with no warning. Direct sibling: the round-1 fix is a hardcoded path-equality check rather than an unconditional one.\n3. [severe] probe.py (whole file) \u2014 no control targets any P7 predicate; structurally impossible as written. The probe reports \"the oracle caught every break attempted (15/15)\" while never once exercising the round's headline fix. REACHABILITY: loop-path \u2014 this is what probe.py produces today, unconditionally, every time it runs. Direct sibling of round-1 finding 3: the same \"controls don't test what they claim\" pattern, now on the new predicate instead of the old ones.\n4. [medium] lib/beacon_stats.py:94-117 paths(), sibling of round-1 finding 5 in the same file \u2014 the \"tolerate a bare path->byday map\" fallback synthesizes a fabricated positive visit count from non-path metadata: qualified_visits({\"verdict\":\"PASS\",\"stats\":{\"window\":{\"days\":10}}}) -> 10 (should be None). Dormant against the live shape only because \"generated\" is a string. REACHABILITY: loop-path-adjacent \u2014 would silently activate the moment the third-party /_b/stats shape shifts.\n5. [minor] beacon-stats.yml:190 \u2014 the PUT that creates the commit has no try/except; a 409/403/422 crashes the step with an unhandled traceback. REACHABILITY: loop-path but low-probability (concurrency group serializes same-ref runs). Confirmed the adjacent raise SystemExit(0) short-circuit is NOT a bug.\n\nWHAT I COULD NOT CHECK:\n- Did not execute the Contents-API self-forgery in NEW FINDING 1 against the real repo, since doing so would itself constitute a real signed commit \u2014 forbidden by the task.\n- Could not trigger a genuine in-progress or non-success real run to test P6.concl against live data; substituted a deterministic mock of gh().\n- Did not race two concurrent Contents-API commits to empirically trigger the 409.\n- Actions log endpoints are 403 for this PAT (known); did not inspect raw job logs.\n\n\n================================================================================\n\nROUND 3 (fresh adversary, sonnet) \u2014 FAIL. Three severe: (1) P7/P8 bound to the NEWEST commit touching the artifact, so a valid reading failed as soon as the next relay run landed \u2014 loop-path, self-inflicted; (2) the PAT holds the workflows scope and main has no ruleset, so the loop could rewrite the workflow and have a runner attest bytes it chose \u2014 'P8 authenticates a run of whatever beacon-stats.yml currently says, not a run of the live-endpoint-reading logic'; (3) ten predicates (P6.branch, all P7, all P8) had zero negative-control coverage \u2014 confirmed empirically by neutering each and watching probe still report 18/18.\n\n================================================================================\n\nROUND 4 (fresh adversary, sonnet, different model from the maker) \u2014 VERBATIM:\n\nVERDICT: PASS\n\nMERGE RECOMMENDATION: Merge as-is \u2014 the anti-fabrication proof (P7+P8) held under sustained independent attack (live-API tests, a from-scratch adversarial seam attack, and 35/35 independent predicate-neutering), but open a fast-follow for the medium finding below (P7 walk's bare `except:continue`) since it's a real, loop-path-reachable false-negative risk, not a security hole.\n\nROUND 3 FIXES: 1 commit-selection walk HOLDS \u2014 reproduced the exact claimed failure mode with real data (an older non-newest commit's bytes) and it now passes; past-the-limit behaviour is fail-closed. 2 fake-API seam HOLDS \u2014 only one `return 0` in the file and it is unconditionally preceded by `if FAKE: return 3`; an honest canned bundle still exits 3; a leaked env var makes lib/beacon_stats.py return an error block, not numbers; the trigger string appears in no workflow, profile or committed config. 3 probe honesty HOLDS and was independently re-derived \u2014 built a separate harness and neutered all 35 distinct predicate IDs one at a time: 35/35 flipped. Zero decorative predicates, zero controls passing for the wrong reason.\n\nSEAM ASSESSMENT: safe to ship. Structurally incapable of returning exit 0; the one production consumer treats exit 3 as an error block. Its only weakness is fidelity, not safety.\n\nNEW FINDINGS: 1 [medium] the P7 walk's bare except treats a transient API error as 'bytes don't match', so a 5xx on the matching candidate would report FAIL P7.bytes \u2014 an infrastructure blip dressed as tampering. Fails closed, never exit 0. REACHABILITY loop-path. SIBLING of round-3 fix 1. 2 [minor, theoretical] the walk never correlates the chosen commit back to prov.run_id; closed in practice by P8. 3 [minor] 'THE LIMIT OF THAT PROOF' is accurate and not glossed \u2014 verified live that no ruleset applies to main; one precision gap, the PAT cannot read branch-protection settings so 'no protection' is asserted rather than verified, and the uncertainty runs in the safe direction.\n\nWHAT I COULD NOT CHECK: whether a PAT-authenticated Contents-API PUT also produces verification.verified==true (would require creating a real commit); a live run of the fixed health-check.yml (only triggers on main, unmerged); a genuine two-commits-identical-bytes case; behaviour past 20 real commits.\n\n[MAKER: round-4 finding 1 fixed before merge \u2014 walk errors now return CANNOT-CERTIFY, never FAIL. Findings 2 and 3 accepted as recorded; neither blocks.]",
   "maker_note": "Four rounds, four independent adversaries on a different model, three FAILs then a PASS. Every FAIL was the same root wearing a new coat: the oracle kept authenticating the CHANNEL and never the ACTOR. Round 1 \u2014 a run existed but the bytes were not bound to it. Round 2 \u2014 the bytes were bound to a GitHub signature, but GitHub signs every Contents-API commit whoever calls it. Round 3 \u2014 the actor proof (a check-run only a runner can create) was real, but the commit lookup took the newest commit rather than this artifact's, so a good reading failed the moment the next run landed, and ten of the new predicates had no negative control at all. The thing that finally worked was not cleverness, it was measurement: POST /check-runs returns 403 for the loop's PAT and 200 on GET. That asymmetry is the whole proof and it was found by probing the credential rather than by reasoning about it.",
   "disposition": "MERGED to main on a checker PASS with an explicit 'merge as-is' recommendation, under v4 MOD-1 infra autonomy. BOTTLENECKS #2 moves to fix-shipped. Note on process: the anti-grind clause would have stopped this after round 2 on the daily cadence. It ran to four rounds because Theshin asked for it live and in his own words ('fix all foundry issues so that everything works'), which is his call to make and is recorded here rather than assumed.",
   "signal": {
    "measurable": false,
    "note": "infra \u2014 no public path. Its output is every other row's signal block. Instrument-read this fire from public/beacon-stats.json (BOTTLENECKS #2 relay), fetched by GitHub-Actions run 31454011286 at 2026-08-11T02:59:18Z, HTTP 200, oracle VERDICT PASS. Fleet state at that read: hub / = 30 qualified visits across 3 distinct days (13 on 08-09, 14 on 08-10, 3 on 08-11); /002-gha-trigger/ = 0; /004-khanya-school-tutor/ = 0; /005-maccleaner/ = 0. Third consecutive fire to read its own instrument out of git rather than carry an assumption. MOD-2 Branch B on the best-performing path: 30/250 qualified visits, 3/3 distinct days \u2014 the distinct-days half of the threshold is met on the hub for the first time; the volume half is not, and the hub is not a ship.",
    "as_of": "2026-08-11T02:59:18Z",
    "source": "public/beacon-stats.json (BOTTLENECKS #2 relay); oracle PASS this fire"
   },
   "kill_criterion": "n/a \u2014 infra, never published. Standing failure criterion: /_b/stats non-200 for >24h, or the oracle returning anything other than PASS on two consecutive fires.",
   "residuals_at_death": null,
   "residuals": [
    "ACCEPTED LIMIT, needs Theshin: the PAT holds the workflows scope and main has no ruleset, so the loop can rewrite beacon-stats.yml and have a real runner attest bytes it chose. P8 proves a runner executed the workflow as the repo currently defines it \u2014 not that the numbers came off tailorfarms.com. Closing it is one action: a ruleset requiring review on .github/workflows/**, or dropping the workflows scope from the PAT. Documented in the workflow header, not glossed.",
    "MINOR: the commit walk does not correlate the chosen commit back to prov.run_id; closed in practice by P8 requiring an attestation on that specific sha.",
    "MINOR: the fake-API seam's /contents/ responder ignores ?ref, so the D-series controls cannot exercise 'skip a newer candidate to reach the right older one'. Covered against real historical commits instead; noted in code.",
    "MINOR: 'main has no branch protection' is asserted from an empty rulesets response; the PAT cannot read branch-protection settings. The uncertainty runs in the safe direction."
   ]
  },
  {
   "n": "11",
   "date": "2026-08-10",
   "slug": "diffusion-curves",
   "kind": "ship",
   "status": "staged",
   "one_liner": "draw or drop curves with a colour on each side; a grid-free walk-on-spheres Monte Carlo solver fills the space between them with the actual solution to Laplace's equation, in WebGL2, entirely in your browser",
   "gap_source_url": "MECHANISM CARD 1, research/mechanisms/2026-08-09-pilot-cards.md \u2014 Sawhney, CMU 2024 (SIGGRAPH 2025 Outstanding Dissertation), grid-free Monte Carlo PDE solving; per-pixel independent walk-on-spheres is fragment-shader-native. Picked by Theshin in a live session 2026-08-10T10:30Z (\"1-5 , now\"), recorded in decisions/2026-08-10-mechanism-pick.md. Occupancy re-verified by the round-1 checker with web search: 8+ mesh-gradient tools exist (proven demand) but all use coarse control-point grids; no free browser-based two-sided-Dirichlet diffusion-curve renderer was found. The structural edge is that colour is specified on CURVES and the field between them is computed, so a hard colour break survives arbitrarily close to the line \u2014 which a control-point mesh cannot do.",
   "deploy_url": "NOT DEPLOYED \u2014 staged on branch ship/011-diffusion-curves, unmerged, dark on the hub. Publishes at https://tailorfarms.com/011-diffusion-curves/ on merge (MOD-3: consumer ships debut on the foundry domain only).",
   "checker_verdict": "ROUND 1 (independent checker, sonnet \u2014 DIFFERENT MODEL from the maker/opus-5, refutation-seeking, drove the staged page COLD against the architect's oracle) \u2014 VERBATIM:\n\nVERDICT: FAIL\n\nORACLE RUN (cold, by me): 22/22 \u2014 every predicate PASSED and every numeric detail matched the maker's claimed run byte-for-byte (e.g. P4.converges RMSE(128)=5.33 RMSE(512)=2.91 ratio=1.83; P6 RMSE 0.18; P8 RMSE 0.00). No discrepancy from `last-oracle-run.txt`.\n\nFINDINGS: 4 total, 1 severe\n\n[SEVERE] switching examples or uploading a new SVG mid-render silently corrupts the accumulated image; page reports \"done\" over a non-harmonic blend of two different boundary-value problems\n  what: `src/011-diffusion-curves/app.js` line 338 (`sel.addEventListener('change', ...)`) and line 359 (`fileIn.addEventListener('change', ...)`) both reassign `state.scene` without calling `clearAcc()` or bumping `state.gen`. The render loop keeps running against the *old* accumulation texture and simply starts packing the *new* scene's geometry into `WOS.packScene(state.scene, ...)` on the next `accumulate()` call \u2014 so the running average silently mixes samples from two different Dirichlet problems into one buffer, and the sample counter keeps climbing toward the original target as if nothing happened.\n  repro: load the page, set samples to 2000, click Render, wait until `DC.meta().samples` reaches ~1000, then change the `#dc-example` dropdown to a different built-in scene (e.g. \"loop\") and let it run to \"done\". I measured this exactly: center-pixel max-channel diff = 62 (contaminated `[18,25,88]` vs clean reference `[25,35,150]`) \u2014 corner (background) pixel diff was only 1, confirming the contamination is real and localized to the solved interior, not noise. 62 is nearly 3x the oracle's own P2 boundary tolerance (26.0).\n  why it matters: this is the single most ordinary thing a first-time user does with a slow, software-rendered page \u2014 click around the example dropdown while a previous render is still catching up \u2014 and it produces a result that violates the page's central claim while the UI reports success. It is also invisible to every predicate in `oracle.py`: P7 selects an example exactly once, before clicking Render. This is exactly the shape BOTTLENECKS #1 warns about: the concurrency fix (the `gen` token) covers re-entrant `start()` calls but not the sibling code paths that mutate `state.scene` outside `start()`.\n\n[MEDIUM] the page's own privacy claim is false during real (non-automated) use \u2014 the inlined first-party beacon POSTs `{path, self}` to `/_b` on every real page load and skips itself under `navigator.webdriver`, so the oracle's own P9.no_third_party can never observe it. No user content is exfiltrated, but the literal claim \"no server\" is false.\n\n[MINOR] typing \"0\" into the samples field silently substitutes the default (512), not the stated minimum (1): `parseInt('0',10) || 512` evaluates to 512 because 0 is falsy.\n\n[MINOR] the documented automation seam `DC.render({samples})` has no upper bound, unlike the UI's [1,16384] clamp.\n\nSecrets/PII scan: clean. Full `git diff main...HEAD` (2414 lines) grepped for AKIA/ghp_/xox tokens, private-key headers, `sk-...`, password/secret/api-key assignments \u2014 zero matches.\n\nPremise re-check (CARD 1): web search found no free, browser-based, two-sided-Dirichlet (\"true\") diffusion-curve renderer competing with this. The closest hit, CMU's \"Differential walk on spheres\" project page, is a paper/video/code page with no interactive in-browser demo. Everything else surfacing was either coarse control-point mesh-gradient tools/plugins or generic WebGL demos unrelated to diffusion curves. Consistent with, though not exhaustive proof of, the card's \"occupancy thin\" claim.\n\nWHAT I TRIED AND FAILED TO BREAK: cold oracle 22/22 matching exactly; triple-clicked Render mid-flight (gen token correctly superseded stale loops, landed on exactly the last-requested sample count, no corruption); empty SVG, SVG with only non-drawable elements, hostile filename `<img src=x onerror=alert(1)>.svg` (all safe, correctly esc()-escaped, `window.__pwned` never set); pathological seam values 0/-10/0.5/\"banana\"/999999; Export before first render; 390x844 mobile viewport (no horizontal overflow).\n\nRECOMMENDATION: do not merge until fixed. The core solver (P1\u2013P10, cold-reproduced) is genuinely the real thing \u2014 a legitimate WebGL2 walk-on-spheres harmonic estimator, not a fake, and it survived every attack I could mount against its correctness, its seam-to-screen fidelity, and its escaping. But the mid-render scene/file-swap corruption is severe, trivially reproducible by an ordinary user, directly violates the page's central mathematical claim, and is structurally invisible to the current oracle.\n\n=====================================================================\n\nROUND 2 (FRESH adversary, sonnet, had not seen round 1's report \u2014 targeted re-check of the four fixes) \u2014 VERBATIM:\n\nVERDICT: PARTIAL\n\nORACLE RUN (cold, by me): 25/25 \u2014 matches the claimed last-oracle-run.txt exactly, predicate-for-predicate and near-exactly on the numeric values (e.g. P4.converges ratio=1.83, P3.meanvalue.mean=1.72, P11 swap at 375/800 vs my 360/800 \u2014 trivial timing jitter, same PASS). No differences from the claim. Also cold-ran probe.py independently: 10/10 controls flipped their predicate as claimed.\n\nFIX-BY-FIX:\n1. SEVERE (mid-render scene swap corrupting the accumulator) \u2014 HOLDS for its stated target. Verified three independent ways: cold oracle P11 (3/3 sub-predicates PASS), cold probe C10 (unguarded revert correctly flips P11 red), and my own hand-driven UI attacks (rapid repeated dropdown swapping mid-render, SVG load mid-render, resolution change mid-render, resolution+example changed together, Render clicked immediately after a swap, swap during the page's own startup auto-render, DC.render()+DC.load() raced with no await) \u2014 all eight settled cleanly to a correct, uncorrupted render with zero page errors and no stuck/hung state. `state.scene =` is assigned in exactly one place (setScene, app.js:155), confirmed by grep across the whole file, so there is no remaining bypass path. BUT: found a genuine, reproducible SIBLING defect on the *error-state* path.\n2. MEDIUM (beacon wording) \u2014 HOLDS. Wording is accurate and complete.\n3. MINOR (`parseInt('0') || 512`) \u2014 HOLDS. Typed \"0\" -> \"1 samples/pixel\"; seam `DC.render({samples:0})` -> `meta().samples === 1`.\n4. MINOR (DC.render unbounded) \u2014 HOLDS. UI 999999999 -> clamps to 16384; seam likewise.\n\nFINDINGS: 2 total, 0 severe, 1 medium, 1 minor\n\n[MEDIUM] setScene() silently erases the fatal WebGL2-unavailable error and produces an invisible uncaught promise rejection\n  what: app.js:153 `setScene()` unconditionally sets `statusEl.dataset.state = 'idle'` and a \"press Render\" message, with no check of `state.err`. The null-GL guard added `if (pAcc && fbo[0])` around `clearAcc()/show()` to stop a TypeError, but did nothing about the status text or the click handler.\n  repro: patch `getContext` so `webgl2` returns null (probe's C9 scenario). Page loads into the error state correctly. Select a different example -> status silently changes to \"scene loaded (128x128) \u2014 press Render\" / data-state=idle even though `DC.meta().error` still reports the fatal error. Click Render -> `start()` returns `Promise.reject(new Error(state.err))`, unhandled -> `pageerror` fires and nothing on screen changes.\n  why it matters: P9.no_pageerrors is a hygiene predicate the oracle enforces, but the oracle's own Chromium always has WebGL2, so this exact path is structurally invisible to it. A real user on a device without WebGL2 who touches the dropdown before noticing the banner gets a page that has erased the only honest explanation of why it doesn't work, and throws a silent uncaught rejection when they click the one button still offered. For precision: the root mechanism predates round-1 (the pre-fix `sel` handler stomped the status line the same way), but what IS new is that centralizing every scene-change path into `setScene()` also centralizes this defect, and the specific probe/fix cycle for the null-gl case stopped one symptom while leaving this one live.\n\n[MINOR] P1 does not distinguish a real fragment-shader compute from a WebGL2-context-exists-but-CPU-blits build. A CPU-JS walk-on-spheres uploaded via texImage2D and displayed through a passthrough shader would pass P1-P9/P11 while not being \"on the GPU pipeline\" as CONTRACT.md claims. Distinct from stated attempts A1-A4. I did not build and run this to completion: a correct CPU-JS walk-on-spheres at the oracle's scale would be far too slow to finish inside the oracle's 900s per-render wait, which is itself informative \u2014 the attack is real in principle but self-defeating in practice for this artifact's parameters. Flagged as an oracle-soundness gap, not a demonstrated live break.\n\nWHAT I TRIED AND FAILED TO BREAK: rapid repeated dropdown swapping mid-render (6 swaps in ~1s); SVG file load mid-render; resolution change mid-render (128->256); resolution AND example together; Render clicked immediately after a swap; swap at t~0 during the page's own startup auto-render; `DC.render({samples:6000})` immediately followed with no await by `DC.load(otherScene)` (promise settles, no stuck 'running', fresh render still startable); \"0\" and a 10-digit number in both UI and seam; `git diff main...HEAD` for secrets/tokens/PII (none); `tools/build-011.py --check` -> no drift, matching P10.\n\nRECOMMENDATION: merge after fixing X \u2014 X = the error-state hygiene gap. Concretely: `setScene()` should not stomp the status line / clear the error banner when `state.err` is set, and the `btnRender` click handler should `.catch()` the promise `start()` can return. This is narrow, doesn't touch the render path, and does not require re-opening any of the four already-verified fixes.",
   "maker_note": "Theshin's pick, built. He replied \"1-5 , now\" to the numbered mechanism cards in a live session; card 1 is today's scout aim, cards 2-5 the standing queue (decisions/2026-08-10-mechanism-pick.md).\n\nTWO THINGS THIS FIRE MEASURED INSTEAD OF ARGUING ABOUT, both following BOTTLENECKS #2's lesson that two rounds were once burned reasoning about what a credential guaranteed instead of asking the API:\n1. The 02:11Z fire scored card 1 over the day-build gate on WebGPU. Seven launch configurations across two Chromium binaries, headless and headful under Xvfb: `navigator.gpu` is undefined in every one, and `Object.getOwnPropertyNames(navigator)` contains no gpu-like key at all. WebGPU is absent from the build, so an oracle here could NEVER execute a WebGPU render \u2014 and under BOTTLENECKS #1's third clause a static substitute is forbidden. The same probe found WebGL2 works via SwiftShader WITH EXT_color_buffer_float. Walk-on-spheres is per-pixel independent by construction, so WebGPU was the card's implementation guess, not its mechanism. Re-scoped to WebGL2: the oracle can execute it, and it ships to more real browsers than WebGPU would.\n2. The build-day rule. The fire payload said carry the pick because BOTTLENECKS #2 was open; at HEAD both entries are fix-shipped, so nothing was outstanding and today was a build day. The payload's carry clause is conditional on an open cause, so honouring the condition rather than the sentence is the faithful reading \u2014 and it assigned this fire the harder job, not the easier one.\n\nTHREE DEFECTS THE BUILD FOUND IN ITSELF before the checker saw it, all in the thin hand-written band around the borrowed primitive, which is exactly where BOTTLENECKS #1 says they now live: two render loops sharing one sample counter; adaptive pass-sizing that ran away because gl.finish() does not block in Chromium's split GPU process, killing the WebGL context; and multi-draw frames building a command buffer long enough to reset the context. Context loss is now surfaced honestly instead of the page reporting \"done\" over a blank canvas.\n\nTHE ORACLE FOUND TWO DEFECTS IN ITSELF, both instrument rather than artifact, and neither was fixed by loosening a tolerance: `element.screenshot()` captured the canvas's 1px border and a fractional page offset (RMSE 10.4 -> 0.18 after clipping to the content box), and the boundary predicate was denominated in PIXELS so it silently asked a harder question at lower resolution (now denominated in the domain).\n\nTHE PROBE FOUND THREE DEFECTS IN THE ORACLE, which is what probe-the-oracle is for. P7 accepted the page's own startup auto-render as proof the Render button worked, so a completely dead button passed \u2014 its control refused to flip and that is how it surfaced. Then P11, written specifically for the checker's severe finding, refused to flip TWICE: v1 clicked Render after the swap, which cleared the accumulator it was meant to inspect; v2 swapped 8s into a 3000-sample render, so the contaminating scene was only ~8% of the average and landed under tolerance. It now swaps at the 50/50 point read off the status line. A predicate whose own control will not flip is decoration, and three of them were.\n\nDISCLOSED AGAINST THIS SHIP: after the one permitted fix cycle, the probe's C9 control found that setScene() threw a TypeError when there is no GL context. That was guarded \u2014 one small change beyond the fix cycle, made before the fresh adversary saw the branch, and stated here rather than folded in quietly. The round-2 adversary then found the sibling of exactly that guard (the error banner is still erased and the click still rejects unhandled), which is this factory's signature failure and is left unfixed on purpose: the fix cycle is spent, this fire is already the fix author twice over, and a third self-graded repair is the self-certification loop the rules exist to stop. It is the next fire's first task, against a fresh adversary.\n\nTrajectory against BOTTLENECKS #1: round 1 found 4 (1 severe); the fix cycle closed all 4; round 2 confirmed all 4 HOLD and found 2 new, 0 severe, the medium one being a genuine sibling. Compare the entry's earlier incidents, where re-checks found ~N new SEVERE siblings. 4->2, severity falling, and the severe class did not regenerate.",
   "disposition": "STAGED, NOT MERGED, and dark \u2014 branch `ship/011-diffusion-curves`, no public path.\n\nThe gate, read at run start and not moved by this fire: BOTTLENECKS #1 still records `Checker-validated: pending` at HEAD, so v4 MOD-1's condition for autonomous ship merges (\"fix shipped AND checker-validated\") is not met and ship merges remain Theshin's one-click \"go\". This fire could have argued that row 10's round-4 PASS satisfies the clause and deliberately did not: entry #1's own rule bars the fix author from judging its validation, and the argument would loosen a gate in the arguer's favour. Flagged to Theshin as a one-sentence call he can make either way \u2014 does an INFRA round-4 PASS satisfy #1's \"ship-shaped build\" clause, or must a consumer ship PASS first?\n\nIndependently of that gate, the round-2 verdict is PARTIAL with an explicit \"merge after fixing X\", so this would not merge autonomously even if the gate were open. The named X is one narrow patch on the error-state path that does not touch the render path.\n\nTo ship it: `go 11` merges the branch; the page then publishes at tailorfarms.com/011-diffusion-curves/ per MOD-3.",
   "signal": {
    "measurable": false,
    "note": "staged and dark \u2014 no public path exists yet, so measured-zero is not available and would be a lie if written as 0. Instrument-read this fire from public/beacon-stats.json (BOTTLENECKS #2 relay), fetched by GitHub-Actions run 31454011286 at 2026-08-11T02:59:18Z, HTTP 200, oracle VERDICT PASS. Fleet state at that read: hub / = 30 qualified visits across 3 distinct days (13 on 08-09, 14 on 08-10, 3 on 08-11); /002-gha-trigger/ = 0; /004-khanya-school-tutor/ = 0; /005-maccleaner/ = 0. Third consecutive fire to read its own instrument out of git rather than carry an assumption. MOD-2 Branch B on the best-performing path: 30/250 qualified visits, 3/3 distinct days \u2014 the distinct-days half of the threshold is met on the hub for the first time; the volume half is not, and the hub is not a ship.",
    "source": "public/beacon-stats.json (BOTTLENECKS #2 relay); oracle PASS this fire",
    "as_of": "2026-08-11T02:59:18Z"
   },
   "kill_criterion": "PER-PATH BEACON VISITS, the only thing the instrument measures. Kill if, after 500 qualified visits to /011-diffusion-curves/ or 14 days from publish (whichever comes first): fewer than 25 PNG exports, OR exports/render-sessions below 5%. Auto-kill regardless of traffic if the WebGL context-loss error state fires for more than 20% of sessions that start a render \u2014 a solver nobody's hardware can run is not a product. Nothing here is measurable until the ship is merged and published; the clock starts at publish, not at build.",
   "residuals_at_death": "n/a \u2014 not dead",
   "residuals": [
    "MEDIUM, NAMED BY ROUND 2, DELIBERATELY UNFIXED, next fire's first task: setScene() erases the fatal 'no WebGL2' banner (it sets data-state=idle and 'press Render' without checking state.err), and btnRender's handler does not .catch() the promise start() rejects with in that state, so a user on a device without WebGL2 gets a silent uncaught rejection and no on-screen feedback. Structurally invisible to the oracle, whose Chromium always has WebGL2. The fix is two lines and must be judged by a fresh adversary, not by this fire.",
    "MINOR, ORACLE SOUNDNESS GAP named by round 2: P1 proves the canvas holds an exclusive WebGL2 context but not that the walk itself runs in the fragment shader. A CPU-JS walk-on-spheres uploaded via texImage2D and shown through a passthrough shader would pass every predicate while not being 'on the GPU pipeline' as CONTRACT.md claims. Round 2 did not demonstrate it live and noted why: at the oracle's scale such a build would be far too slow to finish inside the 900s per-render wait. Recorded rather than patched.",
    "MINOR, STATED LIMIT (probe attempt A3): P4 in isolation can be faked by a deterministic renderer that dithers per seed. It fails against P2+P3 together because dither is not harmonic at the amplitude needed. Left as a stated limit of P4 alone, not patched, because the composite is sound.",
    "MINOR, STATED LIMIT (probe attempt A4): the oracle's scenes are in a public repo, so a build could hard-code S1/S2/S3. P7 (renders whatever scene the PAGE declares) and P5.scene make it unrewarding rather than impossible. Stated, not defended against.",
    "ACCEPTED LIMIT: the oracle runs on SwiftShader, software WebGL2. It proves the GL path executes and is correct; it does not prove behaviour on any particular vendor's driver. The context-loss handling exists precisely because software rendering is where that path is exercised.",
    "ACCEPTED LIMIT: colour is averaged in sRGB, not linear light. Physically the wrong space; it is the space the boundary colours are specified in, and changing it would change what 'the colour you set' means at the boundary. Stated on the page under 'Limits, stated'."
   ]
  },
  {
   "n": "12",
   "date": "2026-08-11",
   "slug": "chat-export-redactor",
   "kind": "ship",
   "status": "failed",
   "one_liner": "drop a WhatsApp .txt or Telegram result.json into the page and every participant becomes a consistent pseudonym while phone numbers, emails, links and vCard contacts are stripped \u2014 in the tab, with the file never leaving the machine",
   "gap_source_url": "MECHANISM CARD 2, research/mechanisms/2026-08-09-pilot-cards.md \u2014 Utrecht D3I / Boeschoten et al. (CCR 2022) + Port (JOSS 2023): process data-download packages entirely client-side. Second in the ordered queue Theshin handed the loop on 2026-08-10 (\"1-5 , now\"), and independently the 2026-08-10 scout's own carried recommendation. Occupant hunt run twice (2026-08-10 and 2026-08-11): printchat.app, WhatsR (CRAN), waexport, cleanor, whatsapp-chat-analyze. CORRECTION, filed by the round-1 checker against this fire's own scout: the brief called printchat.app \"server-side and paid\"; printchat's own public copy claims 100% client-side WebAssembly processing with redaction behind a $1.99/export paywall. The scout was wrong on the architecture half. The surviving edge is free-vs-paid and open-vs-proprietary, NOT \"the only client-side one\" \u2014 recorded here rather than quietly dropped, because a ledger that launders its own scout's errors is worthless.",
   "deploy_url": "NOT DEPLOYED \u2014 branch ship/012-chat-export-redactor, unmerged, dark on the hub, and it should stay that way until the round-2 SEVERE is closed by a rebuild.",
   "checker_verdict": "ROUND 1 (independent subagent, sonnet \u2014 DIFFERENT MODEL from the maker/opus-5, refutation-seeking, driven cold against the architect's oracle) \u2014 VERDICT: FAIL. Oracle 40/40 and probe 10/10 reproduced clean by the checker itself. SIX findings, THREE SEVERE. [SEVERE 1] a group member named only in a WhatsApp system line (\"Alice added Dumi Ratsaka\", \"X left\", \"X changed the subject\") is never redacted while the page reports \"2 participant(s) pseudonymised\" \u2014 verbatim: \"someone shares a group export with an LLM/lawyer/researcher believing 'every participant gets a consistent pseudonym' (the page's own claim); a person who joined, left, or was renamed via a group-management event is fully doxxed by name in a file the tool marked DONE.\" [SEVERE 2] same class in Telegram: names inside a service message's `members` array, and later mentions of them, survive. [SEVERE 3] matching was case-sensitive \u2014 \"thanks ALICE ... alice will be late\" survives; verbatim: \"Note the ARCHITECT's own oracle checks residual identifiers case-insensitively, so this defect would have been caught immediately had any of the five architect fixtures included a differently-cased mention \u2014 none do, which is why 40/40 stayed green.\" [MEDIUM 4] diacritic variants (Zo\u00eb -> zoe) survive. [MEDIUM 5] bare domains without a scheme are not stripped though the page claims links are. [LOW 6] credentialed URLs produce corrupted output \"[link removed] removed]/x\". [LOW/PROCESS 7] the scout's printchat.app characterisation is wrong \u2014 see gap_source_url.\n\nROUND 2 (FRESH adversary, targeted re-check after the one permitted fix cycle) \u2014 VERDICT: FAIL. FIX STATUS: all six fixes HOLD, each verified against inputs the adversary wrote itself rather than the cases that motivated the fix. THREE NEW FINDINGS, all explicitly siblings of the three places the fix touched. [SEVERE, sibling of fix 1] the system-line patterns are `$`-anchored and the parser leaves a trailing newline on the final record when the file ends in one \u2014 which exported text files do \u2014 so a person named ONLY in a system line that is ALSO the last line of the file is still leaked in cleartext with the page reporting DONE; verbatim: \"Confirmed the trigger is precisely the trailing \\\\n: the identical fixture with no trailing newline at EOF redacts correctly. Fix is a one-line msg.trim() before matching.\" [MEDIUM, sibling of fixes 3/4] two different people whose names fold to the same base (Rene Botha / Ren\u00e9 Botha) collapse into one pseudonym while the mapping still lists two. [MEDIUM, sibling of fix 2] a Telegram handle seen before its owner's display name is promoted to its own participant number, splitting one person in two. It declined to report the disclosed over-redaction behaviour as a defect: \"this is an explicitly disclosed, intentional design tradeoff.\" It also named the oracle's own blind spot \u2014 no fixture named a person exclusively in a TERMINAL system line, and wa-group.txt only looked like that canary.",
   "maker_note": "Oracle-before-code was followed to the letter and the artifact still failed twice. What the oracle DID buy, measured rather than claimed: it caught two real defects before any checker saw the page (blob downloads are refused on file://, so the first oracle would have certified a code path no visitor runs; and a CSS specificity bug left the download link live on a file the page had just rejected \u2014 the single worst failure this product can have). What it did NOT buy is coverage of cases its author did not imagine, and the round-1 checker put the knife in precisely: the oracle compares case-insensitively, so ONE differently-cased fixture would have caught SEVERE 3 on the first run. The architect wrote five fixtures and each one was a case he already knew how to handle. Borrowed-primitive discipline held again (whatsapp-chat-parser@4.0.2 verified byte-identical to upstream by the checker; zero findings against it) and every single defect in both rounds was in the hand-written band around it \u2014 the fourth consecutive artifact where that is true.",
   "disposition": "FAILED, unmerged, dark. One fix cycle is the rule; it was used; a persisting FAIL stays unmerged. The rebuild lane (Amendment 2026-08-02b.3) applies: the three round-2 findings are the build order for a future rebuild, and oracles/012-chat-export-redactor/ now carries wa-terminal-system.txt, which is RED against this artifact by design, so no rebuild can pass without closing the SEVERE. lib/chat-redact.js and lib/vendor/ stay on the branch and are deliberately NOT merged to lib/, so the shared library stays clean (the ship-007 precedent).",
   "signal": {
    "measurable": false,
    "note": "never published, so there is no path to measure and a 0 would be a fabrication. Instrument-read this fire from public/beacon-stats.json (BOTTLENECKS #2 relay), fetched by GitHub-Actions run 31454011286 at 2026-08-11T02:59:18Z, HTTP 200, oracle VERDICT PASS. Fleet state at that read: hub / = 30 qualified visits across 3 distinct days (13 on 08-09, 14 on 08-10, 3 on 08-11); /002-gha-trigger/ = 0; /004-khanya-school-tutor/ = 0; /005-maccleaner/ = 0. Third consecutive fire to read its own instrument out of git rather than carry an assumption. MOD-2 Branch B on the best-performing path: 30/250 qualified visits, 3/3 distinct days \u2014 the distinct-days half of the threshold is met on the hub for the first time; the volume half is not, and the hub is not a ship.",
    "source": "public/beacon-stats.json (BOTTLENECKS #2 relay); oracle PASS this fire",
    "as_of": "2026-08-11T02:59:18Z"
   },
   "kill_criterion": "PER-PATH BEACON VISITS, the only thing the instrument measures. Had it published: kill if /012-chat-export-redactor/ takes fewer than 40 qualified visits in any trailing 14-day window after one discovery post. The mechanism card's own \"<30 files processed\" was REJECTED at scout time as unmeasurable \u2014 Cloudflare's free beacon is pageview-only, and a criterion the instrument cannot read makes Sunday triage ceremonial (Amendment 2026-08-02b.5). Moot while unmerged.",
   "residuals_at_death": "Three, all named by the round-2 fresh adversary and none repaired: (1) SEVERE, trailing-newline anchor in the system-line patterns; (2) MEDIUM, fold-collision merging two people into one pseudonym; (3) MEDIUM, Telegram handle-before-name splitting one person into two. Plus one documented limit of the ORACLE itself, stated rather than hidden: it stops watching the network once the download completes, so a post-download exfiltration is outside its observation window."
  },
  {
   "n": 13,
   "date": "2026-08-12",
   "slug": "stats-window-floor",
   "one_liner": "The /_b/stats window floor: the day dimension of the beacon read is held at 7 days (MOD-2's trailing-7 metric) and fleet growth is paid for out of the PATH dimension instead, declared not silent; lib/relay_fetch.py fans out per omitted path so the committed artifact stays complete at any fleet size.",
   "gap_source_url": "internal \u2014 BOTTLENECKS.md entry #1 nominated this as its next validation candidate (queued 2026-08-09). Reading src/worker.js to size the queued MEDIUM found a worse latent defect: past 44 countable paths the endpoint returned window.days=0 with from/to absent and every path {}, a blackout byte-identical to honest zeros.",
   "deploy_url": null,
   "kind": "infra",
   "checker_verdict": "ROUND 1 (independent checker, sonnet \u2014 DIFFERENT MODEL from the maker/opus-5, refutation-seeking, drove the artifact COLD against the architect's oracle) \u2014 VERBATIM:\n\nVERDICT: FAIL\n\nFINDINGS:\n\n1. **[severe]** `src/worker.js:126-136` \u2014 the 7-day floor is only enforced inside the growth-triggered shrink branch (`if (!one && all.length * days > HARD_CAP)`), not unconditionally. A caller who passes an explicit `?days=` value below 7 on an **all-paths read** (no `?path=`) gets exactly that window, below the floor, with no error and no `truncated`/warning field of any kind \u2014 the endpoint has no mechanism at all to declare a shrunk *day* dimension (only a shrunk *path* dimension gets a `truncated` block). This is precisely the failure shape the ship exists to eliminate (\"a blackout indistinguishable on the wire from an honestly quiet fleet\"), reintroduced through a documented, first-class input the code's own comment advertises. OBSERVED: `?days=1` -> `\"window\": { \"days\": 1, \"from\": \"2026-08-12\", \"to\": \"2026-08-12\" }` for an all-paths read, with no `truncated` block. Confirmed against the live current fleet size (4 countable paths) \u2014 this is reachable today, not just a theoretical edge case. The oracle never probes this: every P1/P2/P9 call uses an empty query string; P6 is the only predicate that sends `?days=` and it always sets `?path=` too. Note this is not a new regression: the pre-fix code had the identical structural gap. What ship 013 changed is the CLAIM \u2014 the comment now asserts \"the day dimension has a floor... never traded away\" as if unconditional, and the oracle's P1 docstring says \"an all-paths read never returns window.days < 7\" with no carve-out \u2014 both false as written. Practical mitigation, stated for calibration: `lib/relay_fetch.py`'s all-paths call never appends `?days=`, so the artifact actually committed by the production pipeline is not exposed to this path today.\n\n2. **[medium]** `lib/relay_fetch.py:134-140` \u2014 `read()` crashes with an uncaught `AttributeError` if the upstream `window` field is present and truthy but not a dict. `window = base.get(\"window\") or {}` only guards None/falsy values. OBSERVED: `AttributeError: 'list' object has no attribute 'get'` (same for `42`, `\"x\"`, `True`). This contradicts the module's own stated design goal (\"Never raises... a failed reading must be as attributable as a good one\"): instead of writing an honest `ok:false` record, the process dies, `main()` never writes any artifact, the read step fails, the commit step is SKIPPED, and the stale artifact is left untouched and silently un-refreshed until a human notices the failed Actions run.\n\nWHAT I TRIED THAT DID NOT BREAK IT: negative control against the pre-fix worker (correctly FAILs at exactly the predicted vectors, 33 failures across P1/P2/P9); the brief's own degradation table verified independently against the actual pre-fix code \u2014 matches exactly; boundary fleet sizes 4,5,6,7,44,45,46 all match the contract formula; `paths.slice()` selection deterministic, hub always kept; `?days=` fuzzing (0/NaN/abc/-5/1e9/7.9/duplicate) all clamp sanely; `with_query()` survives existing query strings, fragments, percent-encoding; MAX_FANOUT/not_attempted tested with 69 synthetic omitted paths \u2014 reachable and correct; the new `stats.fanout`/`stats.truncated` sibling keys are NOT mistaken for traffic by lib/beacon_stats.py; the merged shape still satisfies oracles/beacon-stats-relay/oracle.py P0-P5; no secrets, PATs, personal names, workers.dev or vault references in the diff; YAML valid and the `if: ${{ false }}` legacy step is permanently disabled; POST /_b and the ASSETS fallthrough untouched.\n\n---\n\nROUND 2 (FRESH adversary, sonnet, independent of round 1, targeted re-check after the ONE permitted fix cycle) \u2014 VERBATIM:\n\nVERDICT: FAIL\n\nPART A \u2014 DO THE FIXES HOLD?\n\n- FINDING 1 fix (worker.js window floor): HOLDS. Instrumented `env.BEACON.get` counts and `window.days` across a full sweep of fleet sizes n=1..80 (default query) and n=1..10 x `?days=1..15` explicit \u2014 100% of calls stayed at KV-get <=44 (peak observed: 42 gets at n=6) and `window.days` >=7 for every all-paths read, including `?days=0`, negative, non-numeric, float, scientific-notation, and duplicate-param inputs.\n- FINDING 2 fix (relay_fetch.py `as_dict`): HOLDS for the exact bug class named. Fed `window`/`truncated`/`truncated.paths_omitted` as string, int, bool, and non-empty list \u2014 zero crashes, clean `ok:false` with a descriptive error every time.\n\nFINDINGS\n\n1. [severe] `oracles/013-stats-window-floor/oracle.mjs` P10 block \u2014 SIBLING of Finding 1's fix, and it reproduces the exact prior-round oracle hole (undeclared silent path-drop) one layer up. P10 validates only `window` shape on an explicit-`?days=` all-paths read; it never inspects `body.paths` or `body.truncated`. No other predicate exercises `?days=` on an all-paths read either. Result: a worker that behaves correctly on the default path but, on seeing an explicit `?days=`, silently deletes every countable path but one from the OUTPUT ONLY (leaving `paths`/`all` untouched so the truncation-declaration logic never fires) passes P1-P10 in full \u2014 the oracle prints `VERDICT: PASS`. Reproduction: add, right after `for (const p of paths) out[p] ||= {};`: `if (!one && url.searchParams.has('days')) { for (const k of Object.keys(out)) if (k !== paths[0]) delete out[k]; }`. `GET /_b/stats?days=8` against a 4-path fleet then returns `paths: {\"/\": {...}}`, `truncated: undefined` \u2014 3 of 4 paths vanish with zero declaration \u2014 while the oracle still exits 0. This is worse than the original probe-the-oracle hole (that worker at least declared the omission); this one declares nothing, gated behind whether the caller happened to type `?days=`.\n\n2. [severe] `lib/relay_fetch.py:143-200` \u2014 SIBLING of Finding 2 (present in the original builder commit too, not newly introduced, but F2's fix comment explicitly claims \"every untrusted mapping now goes through this one door,\" which is false). `as_dict()` gates `window`, `truncated`, and the per-path payloads recovered via fan-out \u2014 but never validates the shape of values already sitting in the initial all-paths response's `paths` dict for paths that are NOT omitted. Reproduction: a stub origin returning `paths: {\"/\": {...good...}, \"/evil/\": \"I AM NOT A DICT\", \"/evil2/\": [...], \"/evil3/\": null, \"/evil4/\": 12345}` is committed with `ok: true` and the garbage untouched. Downstream blast radius, confirmed by actually calling `lib/beacon_stats.py`: `qualified_visits(artifact)` and `distinct_days(artifact)` both correctly refuse to guess and return `None` for the ENTIRE fleet \u2014 even though `/` itself has clean, real data. One malformed entry anywhere in the base response blanks the whole trailing-window metric, which is the same \"total blackout, byte-identical to honest quiet\" failure class ship 013 exists to abolish, now reachable through the layer F2 claimed to have closed.\n\n3. [medium] `src/worker.js:148-182` \u2014 SIBLING of Finding 1. `window.requested` is set to `asked`, the value AFTER the endpoint's own range clamp, not the caller's literal ask. So a ceiling clamp is never self-declared, even though the fix's own comment claims \"a window that is not what the caller asked for is self-declaring in both dimensions.\" Reproduction: `?days=99999` on an all-paths read -> `{\"days\":10,...,\"requested\":10,\"floor\":7}` (no trace that 99999 was asked); `?path=X&days=99999` -> `{\"days\":30,...,\"requested\":30,\"floor\":null}`. `floor:null` plus `requested===days` gives a consumer false confidence nothing was adjusted, when in fact the true ask was silently discarded \u2014 answering the prompt's \"can a consumer be fooled by `floor:null`\" question: yes. Also invisible to P10, whose test values never include a cleanly-parsed value above the endpoint's own ceiling.\n\nWHAT I TRIED THAT DID NOT BREAK IT: full KV-get-instrumented sweep, fleet sizes 1-80, floor and 44-get budget held at every size (worst case 42 gets at n=6, matching the oracle's contract() formula exactly); fleet 1-10 x `?days=1..15`, budget/floor held at every combination including the n=5/6/7 boundary; `?days=` fuzzing all fell back to sane floor-respecting values; relay fed non-dict `window`/`truncated`/`paths_omitted` of every plain type \u2014 zero crashes; tried to make the fan-out loop write a number it did not read or collapse \"unreadable\" into 0 via missing keys, non-dict `one`, non-dict `one.paths`, non-dict `one.paths[path]`, and window-mismatched responses \u2014 all correctly routed to `fanout.unreadable`/`truncated`, never merged; relay FLOOR_DAYS check vs the worker's guaranteed >=7 floor \u2014 no disagreement across days 7-10.\n\n---\n\nADJUDICATION: FAIL stands. Two independent verdicts, ZERO PASS. The one permitted fix cycle was used; the anti-grind clause binds; branch infra/013-stats-window-floor is unmerged and dark. MOD-1's 'INFRA merges are autonomous on checker-PASS' did NOT fire, because this is not a PASS.",
   "distribution": {
    "registry_pr": null,
    "hub": false,
    "x_draft": "none \u2014 the 2026-08-09 distribution policy authors a draft only when a ship is PUBLISHED to tailorfarms.com. Nothing was published today."
   },
   "signal": {
    "measurable": false,
    "note": "infra, checker-FAILed and unmerged \u2014 no public path exists, so a 0 would be a fabrication rather than a measurement. Instrument-read this fire from public/beacon-stats.json via lib/beacon_stats.py (BOTTLENECKS #2's relay); the block below is the read, verbatim.",
    "instrument": {
     "as_of": "2026-08-12T02:19:43Z",
     "read_at": "2026-08-12T02:44:49Z",
     "source": "https://tailorfarms.com/_b/stats",
     "verdict": "PASS",
     "provenance": "https://github.com/theshin621/foundry/actions/runs/31556509952",
     "stats": {
      "generated": "2026-08-12T02:19:44.063Z",
      "paths": {
       "/": {
        "2026-08-09": 13,
        "2026-08-10": 14,
        "2026-08-11": 45,
        "2026-08-12": 2
       },
       "/002-gha-trigger/": {},
       "/004-khanya-school-tutor/": {},
       "/005-maccleaner/": {}
      },
      "window": {
       "days": 10,
       "from": "2026-08-03",
       "to": "2026-08-12"
      }
     }
    }
   },
   "status": "failed",
   "kill_criterion": "Instrumental, not visit-based (infra publishes no page): if public/beacon-stats.json is ever committed with a window shorter than 7 days, or with a countable path silently absent rather than declared, the fix has failed and reverts. NOT YET IN FORCE \u2014 the branch is unmerged."
  }
 ]
}