Another run landed the study for this date first (#7003, merged while this run was working; I checked for an open process: study PR at the start and found none, the race CLAUDE.md "Duplicate PRs" describes). That report did not do the sample audit or --tree, and its clone was shallow. This addendum adds those, and its counts supersede #7003's where they differ (815 vs 814 merged is a PR landing in between). Read 2026-10-15.md first. Window: the same, 2026-10-01 to 2026-10-15.
Window
2026-10-01 to 2026-10-15. Commit counts are on origin/main after git fetch --unshallow origin main (10,702 commits; the plain --unshallow only deepened to 471 until it finished).
Evidence (commands)
| Measure | Value | Source | |
|---|---|---|---|
Commits on main in window | 1,580 (227 on 10-14 alone) | `git log origin/main --since=2026-10-01 --oneline \ | wc -l` |
| PRs merged | 815 | PR search is:merged merged:>=2026-10-01 | |
| PRs closed unmerged | 42 (about 5%) | PR search is:closed is:unmerged closed:>=2026-10-01 | |
| "new venture" commits | 686 (43% of commits) | `git log ... --format=%s \ | grep -c 'new venture'` |
Run-log commits (Log run, prompts: log run) | 142 (9%) | same, grep | |
| Merge-main commits | 108 (7%) | same, grep | |
| Post-merge fix-ups with a CI-shaped title | 11 | grep for dead page, unblock, fixes N red, restore .*order | |
| Same venture name merged twice | 1 (grain-store-or-sell-calculator) | uniq -d on <slug>: new venture subjects | |
| Run records | 175 (170 research, 2 ventures, 1 each process / redteam / review) | python3 prompts/promptctl.py measure | |
| Red team catch rate | 73% of 22 non-equivalent faults (16 caught, 6 escaped); 100% after guards | same | |
unlanded_work.py | only this branch, until pushed | python3 platform/ci/unlanded_work.py |
run_workflow_locally.py --tree on main (11 workflows selected): the five that finished before this report was written passed (agent-permission-harness, conflict-markers, duplicate-symbols, link-contrast, page-integrity). One failed: pages-freshness, "published snapshot is stale: built from fdae045c, but the default branch is now at 6fdb61c4". That is the known lag of the gh-pages branch behind main, not a code defect; nobody published it in this run (publishing is for a run that merges a served surface). The remaining workflows in the sweep were still running at the time of writing and are not counted. CI starvation was not classified: no CI run was read.
Not measured: per-PR "failures before green", because this session reads PRs through search only and did not pull check runs for 800 PRs. "Too few cases to tell" for CI-on-PR; see Findings.
Sample audit
Five merged PRs picked with shuf over git log subjects ending (#N) (the random source was fixed so the pick is repeatable). One pick was a goals-file doc change (#6989) and one a research-mirror commit (#488, upstream repo), so the sample was topped up from the same list with the nearest venture and the research project below.
| PR / project | Re-run | Definition of done | Finding |
|---|---|---|---|
| #6938 uk-rent-a-room-relief-calculator | node --test 22/22 | README, VENTURE.yaml, LICENSE, usage.mjs, disclaimer, launched.json entry | clean |
| #6703 winery-excise-tax-calculator | 27/27 | same, disclaimer in FAQ and footer | clean |
| #6591 speaker-fee-calculator | 28/28 | same | clean |
| #6980 in-freelancer-advance-tax-set-aside-calculator | 25/25 | same | clean |
research/garment-twonodemet (commit ec7525d7d96) | pytest 5 passed; experiments/run.py output byte-identical to the committed results.txt | README has method, results, limitations, AI-assistance line, citation note | clean. I did not re-verify the Zhang et al. (2019) citation; the README itself says it was not re-read |
Audit limits: the venture pages were checked for presence of a disclaimer and usage module, not for the correctness of the tax or fee numbers they compute. I did not run the browser checks.
Read together: the sampled PRs were sound. The defects in the window are not in the first-merge diff but in the repository-wide invariants a new venture must also satisfy (below).
Findings by root cause
| # | Root cause | Count in window | Why the process lets it through |
|---|---|---|---|
| 1 | A new venture page violates a site-wide invariant the venture's own tests do not cover: launch date missing from launched.json, launched.json key order, mirror not regenerated, [hidden] CSS rule, broken inline script, missing </head> | 11 fix-up commits (#6975, #6963, #6962, #6900, #6914, #6895, #6894, #6792, #6761, #6729, #6561) | The checks that catch these (platform/pages, platform/marketing, the Pages publish check) live outside the venture's node --test glob. A venture author's green local run is honest and still wrong. They show up as red main or as a blocked Pages publish |
| 2 | Two sessions do the same fix or venture | 2 pairs of fix-ups both merged (#6894/#6895, #6962/#6963); 4 pairs where one was closed unmerged (#6698/#6699, #6343/#6347, #6337/#6338, #6265/#6266); 1 venture name merged twice | The duplicate check is "look at open PRs", which cannot see a PR that merged minutes earlier. CLAUDE.md already records this for comparison pages and offers surface-budget.mjs; there is no equivalent for "is this slug or this fix already in flight" |
| 3 | Run bookkeeping dominates history | 142 run-log commits plus 108 merge-main commits, 250 of 1,580 (16%) | Each session appends its own log commit and merges main into its branch. Not defects, but they bury the commits the fix grep above has to read |
| 4 | Instruction text costs time | promptctl.py measure doc-friction: CLAUDE.md 5 reports (about 1,000 lines of incident history; checklist loop stops at the first failing module on clean main; 26 gitops tests fail on clean main when gh is preinstalled). This run: bare pip install landed in a different interpreter than python3, and apt had no python3-pytest | The file records every incident as a paragraph and deletes none |
Thin evidence: (a) root cause 1 counts only commits whose titles say what they fix; fixes titled otherwise are missed, so 11 is a floor. (b) The 5% unmerged rate is not split by cause (duplicate, abandoned, superseded); I read titles, not bodies. (c) Run records are 97% research from the upstream repo and say nothing about ventures (2 records), so per-track success rates do not generalise. (d) "Merged?" is unknown for 167 of 175 records.
Recommendations (ranked by effect over cost)
| # | Problem (count) | Change | Touches | Metric | Who | ||||
|---|---|---|---|---|---|---|---|---|---|
| 1 | Venture invariants checked only after merge (11 fix-ups) | One command, node platform/pages/venture-preflight.mjs <slug> (new), that runs the launched.json/launch-date, key-order, [hidden], inline-script-parses and regen --verify checks for one slug, and is the single line the ventures prompt names. Prefer reusing the existing test files with a slug filter over new logic | platform/pages/, ventures sub-prompt | fix-up commits per 100 new ventures (11 per 686 now) | agent | ||||
| 2 | Same fix/venture done twice (2 merged pairs, 4 closed pairs, 1 repeated name) | Make session_gate.py / promptctl route print open PR titles and branches touching the chosen slug, and fail a push whose <slug>: new venture subject already exists on origin/main | portfolio/ledger/session_gate.py, or a check in platform/ci/ | repeated <slug>: new venture subjects (1 now); closed-unmerged venture PRs (4 pairs now) | agent | ||||
| 3 | CLAUDE.md incident history (5 friction reports; about 1,000 lines) | Move dated incident narratives into docs/history/, keep the commands and the one-line reason; delete the superseded Hetzner and starvation prose that says it is superseded | CLAUDE.md | instruction lines read per run; doc_friction reports naming CLAUDE.md | agent (the owner's goals.md is untouched) | ||||
| 4 | 26 gitops/tests/test_worker_run.py failures on clean main when gh exists; the platform/ci loop uses `\ | \ | break` and stops at the first of three modules failing on clean main | Fix or skip-with-reason those tests so a clean tree is green; replace `\ | \ | break` with a loop that reports every failure | gitops/tests/, platform/ci/, CLAUDE.md checklist | local checklist exit code on clean main | agent |
| 5 | Pages snapshot behind main (pages-freshness red in the tree sweep) | Decide who publishes. Either the owner sets PAGES_BRANCH_PUBLISH=true so the workflow does it, or the sub-prompts stop saying every session should | .github/workflows/publish-pages-branch.yml, owner variable | pages_state.py current/stale at start of a run | owner (the variable); agent (prompt text) | ||||
| 6 | Run records cannot say whether a PR merged (167 of 175 unknown) | promptctl record should resolve the PR number to its upstream repo, or accept --repo | prompts/promptctl.py | records with merged known | agent (already reported to the review track by an earlier run) |
Implemented in this PR
Only a one-line doc fix, not a recommendation above: CLAUDE.md line 371 said pip install pytest; on this run bare pip installed into /usr/lib/python3/dist-packages while python3 is /usr/local/bin/python3, and import numpy failed afterwards. It now says python3 -m pip install pytest, which worked here, and notes that apt had no python3-pytest on 2026-10-15. This matches the file's own python3 -m rule. The six recommendations above are left for later runs.
Follow-up on the last report
Follow-up on #7003's report: its recommendations were not yet adopted at the time of writing (same hour). Its finding 1 (hand-edited launched.json) and finding 3 (venture page defects) are the same root cause as finding 1 here; this addendum adds the missing sample audit (four ventures and one research project clean) and a count of 11 post-merge fix-ups.