Process study 2026-10-15, addendum (sample audit and full-history counts)

Process report · 2026-10-15 · prompts/process/reports/2026-10-15-addendum.md

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)

MeasureValueSource
Commits on main in window1,580 (227 on 10-14 alone)`git log origin/main --since=2026-10-01 --oneline \wc -l`
PRs merged815PR search is:merged merged:>=2026-10-01
PRs closed unmerged42 (about 5%)PR search is:closed is:unmerged closed:>=2026-10-01
"new venture" commits686 (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 commits108 (7%)same, grep
Post-merge fix-ups with a CI-shaped title11grep for dead page, unblock, fixes N red, restore .*order
Same venture name merged twice1 (grain-store-or-sell-calculator)uniq -d on <slug>: new venture subjects
Run records175 (170 research, 2 ventures, 1 each process / redteam / review)python3 prompts/promptctl.py measure
Red team catch rate73% of 22 non-equivalent faults (16 caught, 6 escaped); 100% after guardssame
unlanded_work.pyonly this branch, until pushedpython3 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 / projectRe-runDefinition of doneFinding
#6938 uk-rent-a-room-relief-calculatornode --test 22/22README, VENTURE.yaml, LICENSE, usage.mjs, disclaimer, launched.json entryclean
#6703 winery-excise-tax-calculator27/27same, disclaimer in FAQ and footerclean
#6591 speaker-fee-calculator28/28sameclean
#6980 in-freelancer-advance-tax-set-aside-calculator25/25sameclean
research/garment-twonodemet (commit ec7525d7d96)pytest 5 passed; experiments/run.py output byte-identical to the committed results.txtREADME has method, results, limitations, AI-assistance line, citation noteclean. 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 causeCount in windowWhy the process lets it through
1A 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
2Two sessions do the same fix or venture2 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 twiceThe 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"
3Run bookkeeping dominates history142 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
4Instruction text costs timepromptctl.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-pytestThe 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)ChangeTouchesMetricWho
1Venture 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 logicplatform/pages/, ventures sub-promptfix-up commits per 100 new ventures (11 per 686 now)agent
2Same 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/mainportfolio/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
3CLAUDE.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 supersededCLAUDE.mdinstruction lines read per run; doc_friction reports naming CLAUDE.mdagent (the owner's goals.md is untouched)
426 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 mainFix or skip-with-reason those tests so a clean tree is green; replace `\\break` with a loop that reports every failuregitops/tests/, platform/ci/, CLAUDE.md checklistlocal checklist exit code on clean mainagent
5Pages 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 variablepages_state.py current/stale at start of a runowner (the variable); agent (prompt text)
6Run records cannot say whether a PR merged (167 of 175 unknown)promptctl record should resolve the PR number to its upstream repo, or accept --repoprompts/promptctl.pyrecords with merged knownagent (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.