Friction Ledger

What went wrong, grouped by root cause. Each cluster gathers the frictions agents logged in their session logs; occurrences are kept for 14 days, and the page opens on the last 7. The frictions-to-fixes Skill keeps it current. Fixed clusters stay listed: what went wrong matters as much as what is still open. With merged PRs a cluster reads fix landed (no occurrence since, under 3 days), likely fixed (quiet for longer) or still recurring (occurrences after the latest PR); a merge is an attempt, not proof. One reads accepted when the owner accepts its cost, whatever its PRs; its occurrences are still counted. A cluster sits in the list where it ranks higher. Click a cluster (▸) to expand its cause, merged PRs, sessions and logged frictions.

Counts, severity and ranking use only those; merged PRs and fix states use all 14 days. The strip on each row shows the sessions that hit it per UTC day, as the agents reported them; a green line under a day marks a merged fix; hover a strip for the dates.

Most severe 33

The two highest severities reached, ranked by worst severity, then how often it hit that, then total.

  • 13sessionsAgents or their reviewer helpers described how a script, guard, rule or the code behaves from memory, or claimed "only", "every" or "nothing" without checking the whole set.moderateaccepted 10-28 · PRs #2626, #2453, #2378, #2336Sessions per day since 2026-10-26: 2026-10-26 1, 2026-10-27 2, 2026-10-28 4, 2026-10-29 3, 2026-10-30 3. A fix merged on 2026-10-28

    How a script, guard, rule, harness setting, data format or the code's current state behaves is written from recall instead of read from its source, or a scope claim (only, every, nothing, never) is made after checking one item of the set; this includes a reviewer or rater subagent's own finding. A reviewer, the owner or a later check finds it false. glassbox-improve's lead now proposes only facts found in the source (PR #2626). A helper's claim the main agent passed on unchecked belongs in relayed-subagent-claims. Signals: a claim about what merge-pr.ts, a guard, an ADR rule or a config does; "only X changed"; a reviewer finding a check proved false.

    References: issue #2504 closed not planned on 2026-10-25: the owner accepts the cost. Three prose fixes (#2336, #2378, #2453) didn't hold; in the latest moderate case the false claims were caught before the push; a line per Skill would repeat CLAUDE.md's Verify before you state.

    Merged PRs to fix it

    Newest first, up to 5. Merged to fix it, which does not prove it worked.

    • glassbox-improve's lead proposes only facts and wording found in the source (an absence claim most of all), and its researcher checks an absence claim against every code location. PR #2626 2026-10-28
    • blog-post takes rule-location claims from the loaded rule file, not only the ADR, and re-checks edits made after the report. PR #2453 2026-10-23
    • Restored the shorter "Verify before you state" bullet in CLAUDE.md, and the Standards reviewer in clear-backlog-build now flags a count or subagent claim that cites no source. PR #2378 2026-10-21
    • CLAUDE.md "Verify before you state" now names subagent reports, script behaviour from recall, "only"/"every"/"nothing" claims and one-test causes; "One home per fact" says to grep for other statements when changing one. PR #2336 2026-10-20

    Occurrences

    Newest first: date (links to the session log) → the session's goal.

    • 2026-10-30 →Scheduled sync of the Glass Box guide pages to mainminor
    • 2026-10-30 →Visitor-loop run on the Midden: three blind visitors, consensus fixesminor
    • 2026-10-30 →Scheduled blog post: Eyra on the fact-check fingerprintminor
    • 2026-10-29 →Clear the issue backlog (clear-backlog run)minor
    • 2026-10-29 →Prune-trial verdicts that flag moderate damage and rising Friction ratesminor
    • 2026-10-29 →Glass Box guide improvement run: rate every page, raise the weakest, promote ready draftsnit
    • 2026-10-28 →Raise the Glass Box guide by rater consensus (glassbox-improve, 2026-10-28)moderate
    • 2026-10-28 →Cluster the Friction Ledger by harm, not by slipnit
    • 2026-10-28 →Raise the Glass Box guide's weakest pages, then fix what the run hitminor
    • 2026-10-28 →Clear the issue backlog in one runminor
    • 2026-10-27 →One linear shell tokenizer for the hint hooksmoderate
    • 2026-10-27 →Check the session-branch push claim in issue 2577minor
    • 2026-10-26 →Scheduled blog post: one Persona post on a recent real eventnit

    Logged frictions and proposed solution

    As described by the agents that hit it.

    • I first wrote that the new page-checks rule fails on any motive, from memory of the diff; the standards reviewer caught it (only because fails, so warns). → Read the problems vs warnings split in page-checks.ts before describing it.2026-10-30
    • Season notes I wrote overclaimed their source comments (derived durations, 'unmerged'); caught only by code-review. → Write notes by quoting the source comment first.2026-10-30
    • Misread the 28th triage option (a), an agent-run git diff step, as a check enforced by code, and built Karen's whole reply thesis on it until the fact-checker caught it. → Quote an option's own sentence next to my paraphrase before drafting a thesis on it; the checker step worked as designed.2026-10-30
    • Told the owner the 'hearsay' line was cut from dispatch-subagents; it was cut from audit-skills, and dispatch-subagents lost a different line. Caught before building → Quote a cut line only from the diff, with its path, before naming it in a question2026-10-29
    • Wrote friction-rates.ts reading an `id` field from session logs from recall; the field is `session`, so the first run counted 0 hits → Check a data file's field names (head one log) before coding against it; running the script caught it2026-10-29
    • I stated in a status line that the hints and auto-imports writers had no findings; the hints writer had been sent findings. Caught and corrected in my next message. → Check the sent-message list before summarising who got findings (CLAUDE.md: verify before you state).2026-10-29
    • My fix brief to the HITL writer proposed 'None looks for the approval label before a build', which was false (guest-build's poll-guest-tickets.ts) → A researcher brief for an absence claim names every code location, including .agents/skills/*/scripts/, and I propose no wording I haven't grepped2026-10-28
    • An audit agent quoted 'the hint loaded the rules anyway' from occurrences whose description lacks it; the text sat in their solution field, so I re-checked every quote. → Have audit briefs name which field a quote comes from.2026-10-28
    • Checking fable's Nuxt layers false claim took five reads through @nuxt/kit and c12 dist code before it proved a misreading. → None needed; a false claim needs a source check. The learning below saves the next run the walk.2026-10-28
    • I assumed a missing ruleVerdicts field meant a log predated the field and wrote an exemption on that; the writer omits it for any zero-verdict session, which the Spec review caught before push. → Check how a field is written (transcript-trace.ts) before reading its absence as a log-age marker.2026-10-28
    • My first grilling round stated commandWords was linear without measuring it; a Fable verifier found it quadratic and crash-prone → Before claiming a performance property in a proposal, run a quick timing probe on adversarial input2026-10-27
    • My first #2577 comment said a cloud run needs the owner's permission for separate branches; the owner corrected that written repo instructions already grant it, so I edited the comment. → Treat a Skill's written step as the explicit permission the harness system prompt asks for.2026-10-27
    • A Standards reviewer wrongly claimed the closureRefusal line anchor was off by one and a Spec reviewer wrongly said +33 -20 was one commit's numstat; both needed my own git and API checks. → Brief reviewers to verify anchors with git show before calling them wrong.2026-10-26
  • 3sessionsA glassbox-improve run spent many rater, researcher and writer agents and review rounds on a few small page changes.moderatefix landed 10-30 · PRs #2711, #2688Sessions per day since 2026-10-26: 2026-10-29 3. A fix merged on 2026-10-29, 2026-10-30

    glassbox-improve v1 re-graded after each round, took every structural step two raters raised (about 35 subagents) and had the lead paste page and draft lists into each rater brief by hand. PR #2688 (v2) dropped re-grade rounds and ranks structural raises; PR #2711 caps a run at 3 structural steps, fills rater briefs from the tally and saves hand-backs in pairs. The first-run cooling-off cost is glassbox-improve-first-run-cost. Signals: 'rounds', 'raters twice', 'about 35 subagents', 'token cost', 'under-10 guidance', 'brief pasted by hand'.

    Merged PRs to fix it

    Newest first, up to 5. Merged to fix it, which does not prove it worked.

    • Caps each run at 3 structural steps by queue (waiting candidates first), fills rater briefs from the tally, and saves subagent hand-backs in pairs. PR #2711 2026-10-30
    • glassbox-improve v2 drops re-grade rounds and the page cap, splits pages among the three raters with a script and reports every intermediate result in the PR body. PR #2688 2026-10-29

    Occurrences

    Newest first: date (links to the session log) → the session's goal.

    • 2026-10-29 →Raise the weakest Glass Box guide pages by rater consensusmoderate
    • 2026-10-29 →Weekly rater-consensus improvement run on the Glass Box guideminor
    • 2026-10-29 →Glass Box guide improvement run: rate every page, raise the weakest, promote ready draftsmoderate

    Logged frictions and proposed solution

    As described by the agents that hit it.

    • Re-grade rounds churn: each round a rater found a new deficit in Cloud sessions (a count, a lede, then a false watch item), costing three rounds of three raters. → glassbox-improve could fix a deficit list per page from the first re-grade and treat only new false claims after that, since a fresh opus rater finds something every time.2026-10-29
    • Rater and writer subagents cost several full rounds (three raters twice, two researchers, two writers twice) for two small pages, and the last round still found a different single-rater point. → Cap the process to one re-grade round for a two-page run, or let the last re-grade be one rater on the pages that changed.2026-10-29
    • The Skill's remit takes every structural step two raters raise: 10 promotions, a new Lesson and a re-cut meant about 35 subagents against the Skill's under-10 workflow size guidance, and large token cost. → Cap structural steps per run (for example the three best by rank sum) or state in glassbox-improve that the guideline does not apply.2026-10-29
  • 2sessionsA fix or screenshot was reported as working, but the page actually rendered wrong, and no test or look caught it until later.moderatelikely fixed 10-28 · PR #2614Sessions per day since 2026-10-26: 2026-10-27 2. A fix merged on 2026-10-28

    An agent or impl subagent claims a visual fix works from code or its own screenshots without checking the computed styles or the real render, so the bug survives until a reviewer or the owner finds it. Signals: 'reported as green', 'never rendered', 'no test or screenshot covered it', dark-mode or theme tokens, CSS variables bound on :root.

    Merged PRs to fix it

    Newest first, up to 5. Merged to fix it, which does not prove it worked.

    • verifying-ui-changes.md: a screenshot can't confirm a colour, tint or scheme fix; read the computed colour and pin it with an e2e assert. PR #2614 2026-10-28

    Occurrences

    Newest first: date (links to the session log) → the session's goal.

    • 2026-10-27 →Keep Tinkerfund Inventor portraits in light colours in dark modemoderate
    • 2026-10-27 →Atlas 404 drawn as an engraved platemoderate

    Logged frictions and proposed solution

    As described by the agents that hit it.

    • f1b551f27 claimed a dark-mode fix that never rendered; no test or screenshot covered it, so the bug survived three weeks. → Pin colour-scheme fixes with a computed-style e2e assert, as this PR does.2026-10-27
    • Impl subagent reported the Canopy smudge as green in its screenshots; it was grey (theme.css binds --sig-1 on :root so Biome classes never re-tint it). → Read hand-back screenshots yourself before review; the atlas-specimen Skill could note that a plate outside the Specimen page must re-bind --sig-1.2026-10-27
  • 2sessionsThe first glassbox-improve run rated every page and draft, costing far more than the fixes it found.moderatelikely fixed 10-28 · PR #2618Sessions per day since 2026-10-26: 2026-10-27 2. A fix merged on 2026-10-28

    Before PR #2618 the first-run cooling-off fallback (14 days) made every guide page and draft eligible, so each rater read hundreds of sources for few fixes; since then only pages the last two runs changed (or an open PR touches) cool off. Signals: 'cooling-off', 'raters', ~300k-token raters, glassbox-improve.

    Merged PRs to fix it

    Newest first, up to 5. Merged to fix it, which does not prove it worked.

    • glassbox-improve step 1 drops the 14-day cooling-off fallback; cooling-off covers only pages the last two runs changed or an open PR touches. PR #2618 2026-10-28

    Occurrences

    Newest first: date (links to the session log) → the session's goal.

    • 2026-10-27 →First glassbox-improve run on the Glass Box guidemoderate
    • 2026-10-27 →Document the Glass Box quality bar and design a Skill to raise the guide unattendedmoderate

    Logged frictions and proposed solution

    As described by the agents that hit it.

    • First-run cooling-off fallback (14 days) covered every guide page and draft, so three ~300k-token raters bought only two false-claim fixes → Change glassbox-improve step 1 so a first run's fallback can't cool the whole guide (issue #2604)2026-10-27
    • My 14-day cooling-off fallback for the first runs cooled all 37 guide pages and 30 drafts, so run 1 (~$21, three raters) could fix only two false claims; I had warned runs would be small but never counted what the window covered. → Before shipping a filter, run it once against main and count what it excludes.2026-10-27
  • 6sessionsAgents stated counts in PR bodies, issues, chat, briefs and notifications without counting, and had to correct them.moderateaccepted 10-25 · PRs #2537, #2483, #2378, #2336Sessions per day since 2026-10-26: 2026-10-26 1, 2026-10-27 2, 2026-10-28 1, 2026-10-29 1, 2026-11-01 1

    A number (verdict counts, line totals, items in a list, running agents) is written from an estimate, memory or a report not yet final, in a GitHub body, a chat reply, a subagent brief or a notification, instead of being tallied from every item. Signals: "about N", a corrected count, "without counting", "without tallying", "from memory". Counts a script or filter got wrong are in counts-from-wrong-filter.

    References: Issue #2659 closed not planned on 2026-10-29: the owner accepts the cost. 4 minor or nit recurrences since 2026-10-25, each self-caught. Prune Trial opened 2026-10-25 by PR #2537 was judged and deleted by the 2026-10-28 prune run (PR #2641): no major or blocker Friction in 48 sessions. Issue #2522 closed by PR #2537.

    Merged PRs to fix it

    Newest first, up to 5. Merged to fix it, which does not prove it worked.

    • Cut the Verify-before-you-state family to one plain home in CLAUDE.md and dropped its restatements in four Skills and the build reviewer. PR #2537 2026-10-25
    • Made prune-trial take the line delta from git diff --numstat against the cut's parent, and corrected the pr-workflow.md trial's delta to -2. PR #2483 2026-10-24
    • Restored the shorter "Verify before you state" bullet in CLAUDE.md, and the Standards reviewer in clear-backlog-build now flags a count or subagent claim that cites no source. PR #2378 2026-10-21
    • CLAUDE.md "Verify before you state" now names subagent reports, script behaviour from recall, "only"/"every"/"nothing" claims and one-test causes; "One home per fact" says to grep for other statements when changing one. PR #2336 2026-10-20

    Occurrences

    Newest first: date (links to the session log) → the session's goal.

    Logged frictions and proposed solution

    As described by the agents that hit it.

    • First PR body claimed 33 claims checked and 3 fixed without counting the report; I counted 32 rows and 1 wrong and edited the body. → Count the fact-check rows before writing the tally.2026-11-01
    • The Q2/Q3 picks to accept two Friction clusters rested on 'every recurrence is minor' without a per-session rate; the owner's question exposed a doubled rate for one → Triage briefs for regression issues should compare per-session rates before and after the fix, not severities alone2026-10-29
    • First PR body miscounted fact-check verdicts; I caught it and corrected the body before CI. → Tally verdicts from the checker reply before writing the body.2026-10-28
    • I wrote an uncounted claim tally (54) into the PR body, then recounted the fact-check rows (49) and corrected it. → Count rows before writing the tally.2026-10-27
    • The ledger numbers (66/67) were stale after review-fix edits and had to be recomputed and re-committed. → Compute numstat and the ledger entry only after the review fixes land.2026-10-27
    • Told the user '31 misses' in a progress note from an eyeballed list; the scripted count is 30. Broke CLAUDE.md's verify-before-you-state; caught before the report. → Print the count from the script before stating any number, even in an interim update.2026-10-26
  • 6sessionsThe hosting environment's network proxy blocked sites and downloads the work needed, with no way to override it in the session.moderatestill recurring · 5 since last fix · PRs #2647, #2119, #2030Sessions per day since 2026-10-26: 2026-10-28 1, 2026-10-29 3, 2026-10-30 1, 2026-10-31 1. A fix merged on 2026-10-28

    The cloud agent proxy or its DNS refuses a host (github.com/user-attachments, content.nuxt.com, zod.dev, nitro.build, nuxt.com, docs.github.com, the deployed site) with a 403 or connection failure and no in-session override; the fix is to list the host and its workaround in environment-caveats.md, and since PR #2647 the Glass Box page guide fetches blocked GitHub docs from raw.githubusercontent.com. Signals: proxy 403, curl 000, a DNS failure from WebFetch. Auto-mode classifier denials (a deleted pushed branch, a review subagent's script, a force-with-lease push) with no shared fix also stay here; CI job logs are ci-job-logs-unreachable, Self-Modification denials auto-mode-self-modification-denials.

    References: issue #2695

    Merged PRs to fix it

    Newest first, up to 5. Merged to fix it, which does not prove it worked.

    • Glass Box EVERY-PAGE.md falls back to fetching raw.githubusercontent.com/github/docs when docs.github.com is blocked, instead of sparse-cloning github/docs. PR #2647 2026-10-28
    • verifying-ui-changes.md now says the deployed site is blocked in cloud sessions (plus a preview.ts review verb). PR #2119 2026-10-16
    • Documented more blocked hosts and not to retry them, and that a skipped question is not a failure. PR #2030 2026-10-15

    Occurrences

    Newest first: date (links to the session log) → the session's goal.

    Logged frictions and proposed solution

    As described by the agents that hit it.

    • Posted a PR verdict comment with a placeholder SHA and had to edit it; the closing PR's branch needed a force push, which the auto-mode classifier denied, so I pushed it as a fast-forward. → Get the head SHA before writing the verdict; after a merged PR, check whether the reset branch is a fast-forward of the remote before forcing.2026-10-31
    • Force-with-lease push of the branch restarted after merge was denied by the auto-mode classifier; I fast-forwarded the old tip onto main and cherry-picked instead (one extra call). → pr-workflow: for a restarted branch, fast-forward the old tip onto main and cherry-pick, never force-push.2026-10-30
    • The auto-mode classifier denied the Glass Box subagent's git push with no reason, after the brief and Journal agents had pushed the same way; the branch is stranded until the owner answers → Have the orchestrator, not the subagent, push reviewed branches, so one permission context covers every push2026-10-29
    • vuejs.org and nuxt.com were blocked, so each official-docs URL needed a fallback to raw.githubusercontent.com source and could not be fetched live. → Name raw.githubusercontent.com docs sources in EVERY-PAGE's blocked-network fallback so every writer and rater starts there.2026-10-29
    • Survey subagent: print-ledger-occurrence --append aborts the whole call on one held session, forcing grep pre-checks; gh api --paginate failed through the proxy. → Let --append skip held sessions and report them; note the proxy pagination workaround in github-integration.md.2026-10-29
    • A force-with-lease push of the restarted session branch was denied by the auto-mode classifier. The remote branch had been deleted on merge, so a plain push worked; one wasted call. → The restart-after-merge recipe in the system prompt should say to try a plain push first, since the remote branch is deleted on merge.2026-10-28
  • 2sessionsThe inspect-session Skill's paging recipe stopped short of the events it was sent for, or lost pages, so reads needed resumes or refetches.moderatelikely fixed 10-29 · PRs #2666, #2566, #2463Sessions per day since 2026-10-26: 2026-10-27 1, 2026-10-29 1. A fix merged on 2026-10-26, 2026-10-29

    inspect-session's partial read (page cap, newest-first walk) and full-read fetchers (cursor ranges, spill files) hit the page limit before the target events, mistake a bad server page for a cursor loop, leave an inline page unsaved, or overwrite same-named spill files. Signals: 'hit its page limit', 'never reached the session start', 'cursor loop', 'same tool-results file name', 'inline page unsaved'.

    Notes: 2026-10-31 survey: issue #2694 closed not planned 2026-10-30 as superseded by PR #2688 (rater grades go in the run PR body, removing the use case); status reset to open.

    Merged PRs to fix it

    Newest first, up to 5. Merged to fix it, which does not prove it worked.

    • inspect-session estimates the pages from the session's duration before choosing a read, and a partial read never stops because paging is slow. PR #2666 2026-10-29
    • inspect-session briefs save every fetched list_events page under Out with a unique name. PR #2566 2026-10-26
    • inspect-session says the tool-results spill cut-off is likely counted in tokens, so no character count predicts it. PR #2463 2026-10-23

    Occurrences

    Newest first: date (links to the session log) → the session's goal.

    • 2026-10-29 →Redesign glassbox-improve to grade toward the best pagesmoderate
    • 2026-10-27 →Document the Glass Box quality bar and design a Skill to raise the guide unattendedminor

    Logged frictions and proposed solution

    As described by the agents that hit it.

    • inspect-session could not recover #2650's first-round raters: list_events skipped 40 minutes and rejected the cursor past the gap as Invalid. → Have run PR bodies carry every rater grade (now in glassbox-improve v2) so events are never the only record.2026-10-29
    • The inspect-session agent for the 97-minute multi-model session stopped after 34 of 184 pages, judging paging too slow, despite page limit 9999; it needed a resume. → inspect-session's full-read route (parallel range fetch) fits sessions over about 25 pages; I should have estimated the page count from duration and used it.2026-10-27
  • 2sessionsA session log or archive sweep broke a test, turning every open change red, and the archived dashboard's size broke the smoke test.moderatelikely fixed 10-28 · PRs #2620, #2394, #2108Sessions per day since 2026-10-26: 2026-10-28 2. A fix merged on 2026-10-28

    Session logs and Digests land on main without a gate (ADR-0009), and the retention sweep moves logs to archived, while e2e and unit tests read specific logs' text or current paths, so the sweep or one log turns the gate red for the Digest PR and others. PR #2620 caps the dashboard at 1000 sessions and reads the smoke test's HTML in Node, which retires the archived page's size (10 MB) as a cause. Signals: a gate red after an archive sweep, a test reading content/current/sessions by path, an assertion on a log's wording, 'Request content was evicted from inspector cache'.

    References: issue #2105 closed 2026-10-28 with label wontfix and no PR; PR #2620 (merged 2026-10-28) capped the archived dashboard at 1000 sessions.

    Merged PRs to fix it

    Newest first, up to 5. Merged to fix it, which does not prove it worked.

    • The Journal dashboard loads only the newest 1000 sessions and the smoke test fetches server HTML in Node, so the archived page no longer outgrows Chrome's response-body buffer. PR #2620 2026-10-28
    • A unit test that read a session log by its current path now reads the archived copy, so the retention sweep no longer turns the gate red. PR #2394 2026-10-22
    • Removed a browser-test assertion that an archived session log's wording could turn red. PR #2108 2026-10-16

    Occurrences

    Newest first: date (links to the session log) → the session's goal.

    Logged frictions and proposed solution

    As described by the agents that hit it.

    • Archive sweep makes the archived-page e2e test fail deterministically (body evicted from inspector cache); cost two gate runs and a baseline build to diagnose. → Fix expectServerRendered in tests/support/e2e.ts to read the body before hydration, then run the sweep.2026-10-28
    • The archived dashboard silently outgrew Chrome's 10 MB body buffer; nothing warned until the digest run's gate failed twice. → The new cap and Node-side refetch; a page-size budget check in e2e could flag growth earlier.2026-10-28
  • 2sessionsA rule or selection step drafted for a Skill or the ledger had a logic flaw that only later reviewers caught, costing extra rounds.moderatefix landed 10-30 · PR #2697Sessions per day since 2026-10-26: 2026-10-27 1, 2026-10-28 1. A fix merged on 2026-10-30

    The author drafts a new ordering, splitting or selection rule without trying it on the cases it must handle (a ranking direction, two clusters of the same shape); reviewers or the owner find the flaw after the draft. Signals: 'first draft', 'reviewers flagged', 'would have raised the best pages', 'the user had to settle it'.

    Merged PRs to fix it

    Newest first, up to 5. Merged to fix it, which does not prove it worked.

    • CLAUDE.md asks to run a new ordering, split or selection rule on two concrete cases before showing it PR #2697 2026-10-30

    Occurrences

    Newest first: date (links to the session log) → the session's goal.

    • 2026-10-28 →Cluster the Friction Ledger by harm, not by slipmoderate
    • 2026-10-27 →Document the Glass Box quality bar and design a Skill to raise the guide unattendedminor

    Logged frictions and proposed solution

    As described by the agents that hit it.

    • My first split rule (split only a different friction, keep a fix-caught slip) let me split one cluster and keep two of the same shape; both reviewers flagged it and the user had to settle it. → Ask the deciding question with a worked pair of examples before applying a rule to data.2026-10-28
    • My first Skill draft selected the 'lowest average rank first' while raters ranked best first, so it would have raised the best pages; its rater brief also asked for hundreds of source reads per rater. The Fable review caught both before the build. → Trace a selection rule with a two-page example before handing a design to review.2026-10-27
  • 1sessionThe inspect-session Skill's full read of a short session cost several helper agents and a hand fix before its pages could be merged.moderatestill recurring · 1 since last fix · PR #2307Sessions per day since 2026-10-26: 2026-10-29 1

    inspect-session's full-read recipe (parallel Haiku fetchers over cursor ranges, merged by flatten.ts) ran even for an 11-page session and wrote abbreviated page paths that flatten.ts could not merge. Signals: a full read costing ~190k tokens for a short session, flatten failing on page paths, issue #2306.

    Notes: 2026-10-31 survey: issue #2694 closed not planned 2026-10-30 as superseded by PR #2688 (rater grades go in the run PR body, removing the use case); status reset to open.

    Merged PRs to fix it

    Newest first, up to 5. Merged to fix it, which does not prove it worked.

    • inspect-session takes bare page names, does a partial read for short sessions and has a replies selector. PR #2307 2026-10-19

    Occurrences

    Newest first: date (links to the session log) → the session's goal.

    • 2026-10-29 →Redesign glassbox-improve to grade toward the best pagesmoderate

    Logged frictions and proposed solution

    As described by the agents that hit it.

    • Recovering five sessions' rater hand-backs cost about 1.1M subagent tokens; one session needed 98 event pages sequentially. → Same fix: intermediate results in the PR body; inspect-session full-read mode for long sessions.2026-10-29
  • 1sessionA new Lesson page repeated the same error the batch of edits was fixing.moderateopen Sessions per day since 2026-10-26: 2026-10-27 1

    A promotion or rewrite batch fixes a wrong claim in some pages while a freshly written page restates it, caught only in review. Signals: 'repeated the error the same batch was fixing', Lesson, review round.

    Notes: 2026-10-28 design: a dispatch-subagents brief bullet dropped: one occurrence, review caught it, and the line would sit in an open trial's territory.

    Occurrences

    Newest first: date (links to the session log) → the session's goal.

    • 2026-10-27 →Review and improve the Glass Box guide with several modelsmoderate

    Logged frictions and proposed solution

    As described by the agents that hit it.

    • The new operating-model Lesson repeated the 'new dependency is unenforced' error the same batch was fixing; it took a review round to catch → Put verified corrections from the triggering review into every parallel page agent's brief, not only the fixer's2026-10-27
  • 1sessionNew text, or a proposed field or rule, repeated a fact that already has a home, and a reviewer or the owner had to catch it.moderateopen Sessions per day since 2026-10-26: 2026-10-28 1

    Agents add a sentence, rejected alternative or excerpt that restates a fact kept elsewhere (CLAUDE.md "One home per fact"): ADR rewrite agents, a build adding two ADR-0003 sentences, a lesson draft repeating ADR-0028 and an excerpt, a proposed frontmatter field or path-scoped rule whose content a doc already holds, a writer whose Why bullets repeated a concept a sibling page owns despite a brief asking for one sentence; the build reviewers passed some of it. Signals: "duplicated", "one home", "already covered", "repeated", the owner or raters asking about overlap.

    Notes: 2026-10-20 design: no separate fix designed: rides on PR #2336's CLAUDE.md "One home per fact" grep sentence plus review; not recurred since 2026-10-16.

    Occurrences

    Newest first: date (links to the session log) → the session's goal.

    • 2026-10-28 →Raise the Glass Box guide one step (glassbox-improve run)moderate

    Logged frictions and proposed solution

    As described by the agents that hit it.

    • My writer brief said to give sibling-owned reasons one sentence, but the Why bullets still repeated Human-in-the-loop; raters flagged it three times and the page ended at B after two fix rounds. → Brief a promotion writer to diff each Why bullet against the Lessons its ADRs appear in before committing, naming those Lessons.2026-10-28
  • 1sessionA session refused a reviewer's finding on its own judgement, then every later rater raised it again and a fix round was needed.moderateopen Sessions per day since 2026-10-26: 2026-10-28 1

    The orchestrator of a graded run (glassbox-improve) dismisses a Standards finding without asking the owner or checking the cited rule; each re-rater then raises the same point, so the fix round the dismissal saved is spent anyway. Signals: 'I refused a Standards finding', 'all three re-raters raised it', 'costing a fix round'.

    Notes: 2026-10-29 design: judge a refused finding against Rejected alternatives dropped: one judgement call; re-raters' consensus is already the backstop (glassbox-improve step 3); revisit on a second occurrence

    Occurrences

    Newest first: date (links to the session log) → the session's goal.

    • 2026-10-28 →Raise the Glass Box guide by rater consensus (glassbox-improve, 2026-10-28)moderate

    Logged frictions and proposed solution

    As described by the agents that hit it.

    • I refused a Standards finding on attribution's Block-posts ADR trace; all three re-raters then raised it, costing a fix round → Judge an ADR-trace finding against the ADR's Rejected alternatives and When to revisit, not only its Why2026-10-28
  • 1sessionSession logs cannot tell a file written through Bash from one written with Edit or Write, so analyses of which edits a hook missed rest on inference.moderateopen Sessions per day since 2026-10-26: 2026-10-26 1

    A session log's filesEdited unions transcript and commit files and records no tool per write, so classifying misses of a hook (adr-read-hint) needed tool-count inference and transcript reads, leaving some unresolved. Signals: 'filesEdited', 'Bash write from an Edit', 'unresolved misses'.

    Notes: 2026-10-27 design: log Bash writes separately from Edit/Write dropped: the owner dropped this on #2432 (proposal 7); #2570's adrHints now measures misses without a new field

    Occurrences

    Newest first: date (links to the session log) → the session's goal.

    • 2026-10-26 →Measure the ADR read hint after 3 days, then extend it to Bash commitsmoderate

    Logged frictions and proposed solution

    As described by the agents that hit it.

    • Session logs can't tell a Bash write from an Edit/Write (filesEdited unions transcript and commit files), so classifying 30 misses needed tool-count inference plus two transcript reads, and 11 stay unresolved. → Owner to decide whether a derived field should split edit sources (data-shape question, proposal 7 on #2432).2026-10-26
  • 1sessionA warning fired when an agent said it had not read a doc that the tracker saw it read through the shell, usually because a helper agent had read it.moderateaccepted 10-16 · PRs #2160, #1792, #1725, #1485Sessions per day since 2026-10-26: 2026-10-29 1

    The advisory fires when an agent marks `(not read)` a doc the detector credited from shell output, often one a subagent opened; the detector is usually right, and `--author` hides subagent shell reads (#1786 re-triage). Signals: the boilerplate "credited from shell output, but the session marked it (not read)" with no evidence the crediting command missed the file. A credit from output that did not come from the doc is shell-read-detector-false-credit.

    References: Issue #2355 (regression of #2160) closed not planned on 2026-10-21 (wontfix): the owner accepts the cost. Issue #1786 closed by PR #2160 (superseded by #1941/#1943); #2160 only made the advisory text neutral. Detector left as is.

    Merged PRs to fix it

    Newest first, up to 5. Merged to fix it, which does not prove it worked.

    • Made the shell-read advisory's text neutral: it no longer calls a disputed credit a false positive and tells the agent to check the transcript for the earlier reader. PR #2160 2026-10-16
    • Session logging now refuses '(not read)' for docs the Read tool opened, and shows where each read came from. PR #1792 2026-10-11
    • The read detector stopped crediting docs that merely appeared quoted in GitHub or session-log output. PR #1725 2026-10-10
    • The read detector now counts doc reads via extensionless wildcards and 'git log -p'. PR #1485 2026-09-29

    Occurrences

    Newest first: date (links to the session log) → the session's goal.

    • 2026-10-29 →Redesign glassbox-improve to grade toward the best pagesmoderate

    Logged frictions and proposed solution

    As described by the agents that hit it.

    • SHELL-READ-DETECTION: for f in SKILL.md rater-brief.md researcher-brief.md writer-brief.md; do echo "=== $f"; cat $f; done read all four glassbox-improve files but was not credited. → shell-reads.ts could expand a for-loop over literal names into reads of each path (.agents/skills/glassbox-improve/SKILL.md and the three briefs).2026-10-29
  • 1sessionA Skill's frontmatter with invalid YAML passed three reviews and the gate, and only audit-skills caught it.moderatelikely fixed 10-28 · PR #2639Sessions per day since 2026-10-26: 2026-10-27 1. A fix merged on 2026-10-28

    A SKILL.md description with an unquoted ': ' is invalid YAML, so the flag it carries (disable-model-invocation) may be silently ignored. Since PR #2639 a unit spec in pnpm test parses every Skill's frontmatter and names the failing file. Signals: 'invalid YAML', 'unquoted', SKILL.md frontmatter, description.

    Merged PRs to fix it

    Newest first, up to 5. Merged to fix it, which does not prove it worked.

    • tests/unit/skill-frontmatter.spec.ts parses every Skill's SKILL.md frontmatter in pnpm test: valid YAML, name matches the folder, non-empty description. PR #2639 2026-10-28

    Occurrences

    Newest first: date (links to the session log) → the session's goal.

    • 2026-10-27 →Document the Glass Box quality bar and design a Skill to raise the guide unattendedmoderate

    Logged frictions and proposed solution

    As described by the agents that hit it.

    • I wrote the glassbox-improve description with an unquoted ': ', which is invalid YAML; three reviews and the gate missed it, audit-skills caught it (#2608) and an audit-docs sweep quoted it. → Parse a new Skill's frontmatter with the repo's yaml package before committing; #2608 proposes a gate check.2026-10-27
  • 1sessionAgents wrote a regex or heuristic without first running it on the real data, and review found it misfired.moderateopen Sessions per day since 2026-10-26: 2026-10-26 1

    A text transform, regex or detection heuristic is written from an assumed input shape and committed before it is run against the real files or historical data it will process; a reviewer then finds the cases it breaks. Signals: "regex written without checking the real data", "heuristic misfired on N claims", a reviewer catching a pattern's misses.

    Notes: 2026-10-23 design: a general run-it-on-real-data rule dropped: the three transforms differ in kind, code-review caught two before push, and Verify before you state already covers the third.

    Occurrences

    Newest first: date (links to the session log) → the session's goal.

    • 2026-10-26 →Measure the ADR read hint after 3 days, then extend it to Bash commitsmoderate

    Logged frictions and proposed solution

    As described by the agents that hit it.

    • Commit detection took three review rounds: two regex fixes still backtracked exponentially, then the tokenizer was quadratic on unquoted escapes, before an escape-aware tokenizer held. → For hook input parsing, start with a tokenizer whose alternatives start with distinct characters, and time adversarial runs before the first review.2026-10-26
  • 2sessionsAn edit to a doc, Skill or rule left other statements or references that contradicted it or pointed at removed text, caught only by review.minorstill recurring · 3 since last fix · PR #2336Sessions per day since 2026-10-26: 2026-10-30 1, 2026-10-31 1

    After adding, changing, moving or cutting a section, rule, field or test, the author did not grep the same file and its consumers (docs, Skills, scripts, tests, typechecked callers, code comments, cross-references) for statements it overrides or references it breaks. Signals: a leftover line contradicting a new section, a dangling section reference, callers pointing at a removed section, a required field breaking another spec's typecheck, a test assertion built on a matcher or order the suite lacks; caught by code-review or the gate.

    References: issue #2753

    Merged PRs to fix it

    Newest first, up to 5. Merged to fix it, which does not prove it worked.

    • CLAUDE.md "Verify before you state" now names subagent reports, script behaviour from recall, "only"/"every"/"nothing" claims and one-test causes; "One home per fact" says to grep for other statements when changing one. PR #2336 2026-10-20

    Occurrences

    Newest first: date (links to the session log) → the session's goal.

    • 2026-10-31 →Scheduled visitor-loop run on the Tinkerfund: three blind visitors, fix consensus problems, build one featureminor
    • 2026-10-30 →Visitor-loop run on the Midden: three blind visitors, consensus fixesminor

    Logged frictions and proposed solution

    As described by the agents that hit it.

    • gate:scoped failed twice (e2e assertion used a Playwright matcher the suite lacks; Popular order assertion broke under the cap) because I did not grep the tests first. → Grep tests for the behaviour before changing it, and run typecheck on test edits.2026-10-31
    • Adding a required DigSeason field broke a typecheck in find.spec.ts that I did not grep for; first gate run failed after about 10 minutes. → Grep consumers of a changed type before the gate, as CLAUDE.md says for facts.2026-10-30
  • 2sessionspr-workflow's review rules sent tiny first pushes and small follow-up commits through full two-agent code-review rounds whose cost far exceeded what they found.minoropen Sessions per day since 2026-10-26: 2026-10-26 1, 2026-10-27 1

    pr-workflow.md asks for code-review before a first push (PRs #1853, #1854) and on a larger follow-up; before PR #2321's simple-change bar a 1- to 6-line diff, and since then a prose cut already probed, a 40-line review-fix commit or a 2-line one, ran two-agent rounds costing 120k-370k subagent tokens for little or cosmetic findings. The opposite miss is prepush-gate-review-skipped. Signals: 'follow-up rule', 'further code-review rounds', 'two review agents for a N-line diff', 'subagent tokens'.

    Notes: 2026-10-28 design: a looser follow-up review bar dropped: three of six predate the simple-change bar, the others read pr-workflow.md and followed it, and ADR-0004 rejects skipping review for prose. dropped: a policy change for a human, not a fix.

    Occurrences

    Newest first: date (links to the session log) → the session's goal.

    • 2026-10-27 →Scheduled sweep: turn recurring session Frictions into fixesminor
    • 2026-10-26 →Measure the ADR read hint after 3 days, then extend it to Bash commitsminor

    Logged frictions and proposed solution

    As described by the agents that hit it.

    • Running code-review with two subagents on a 4-line doc change, after a rewrap round, cost about 120k subagent tokens to find nothing blocking. → Let pr-workflow's simple-change test cover a one-sentence addition to a Skill that adds no new rule.2026-10-27
    • pr-workflow's follow-up rule sent four review-fix commits through further reviews (about 370k subagent tokens). Each round did find a real bug, but most of the cost came from the regex path. → None proposed: pr-workflow.md is in an open Prune Trial, so the cost is logged here for its verdict.2026-10-26
  • 2sessionsThe ledger append script refused a whole call because one session was already in the entry, so the survey had to retry without it.minorfix landed 11-01 · PR #2755Sessions per day since 2026-10-26: 2026-10-29 1, 2026-10-31 1. A fix merged on 2026-11-01

    print-ledger-occurrence.ts --append writes through ledger-set.ts, which refuses a session the entry already holds or the call repeats (PR #2366's content test, PR #2567's named refusal); extract-frictions --unledgered still offers that session's other Frictions, so one call fails whole and is re-run. Signals: '--append fails whole', 'refuses a session already in an entry', 'no way to upgrade its severity'.

    References: Comes from the fixes PR #2366 and #2567 for survey-appends-duplicate-sessions (a session written twice into one entry).

    Notes: 2026-10-28 design: survey-brief.md wording on holding a session dropped: the file is in the open frictions-to-fixes-briefs-mismatch Prune Trial territory (PR #2539); a script flag would defeat the call's atomic safety. dropped: one extra call.

    Merged PRs to fix it

    Newest first, up to 5. Merged to fix it, which does not prove it worked.

    • print-ledger-occurrence --append now names every failing entry in one error, still writing nothing on any failure. PR #2755 2026-11-01

    Occurrences

    Newest first: date (links to the session log) → the session's goal.

    Logged frictions and proposed solution

    As described by the agents that hit it.

    • Survey subagent's batched --append aborted wholly on one already-held session, writing nothing; it reran 36 triples one at a time, over two minutes. → Make print-ledger-occurrence.ts --append skip and report held sessions instead of aborting the batch.2026-10-31
    • Survey subagent: print-ledger-occurrence --append aborts the whole call on one held session, forcing grep pre-checks; gh api --paginate failed through the proxy. → Let --append skip held sessions and report them; note the proxy pagination workaround in github-integration.md.2026-10-29
  • 2sessionsBranches built in parallel edited the same lines of a shared file, and the second to merge needed a manual merge.minoropen Sessions per day since 2026-10-26: 2026-10-27 1, 2026-10-29 1

    One run builds branches in parallel that edit the same lines of one shared file (Where next lists, a stamped pointer line, a roster table), and nothing orders or groups them; signals: merge conflicts on adjacent shared lines between a run's own PRs, restamps, lists re-grown past the cap. Strays 01JuCbPD and 013RCsUF are conflicts with main changed by another session (fixes: fetch before pushing; land large moves quickly).

    Notes: 2026-10-21 design: a rule on parallel branches dropped: the five occurrences have different causes, one is already fixed by a cap in the contract, and the cost is one merge step.

    Occurrences

    Newest first: date (links to the session log) → the session's goal.

    • 2026-10-29 →Find and fix stale facts across Terrarium's overview docsminor
    • 2026-10-27 →Review and improve the Glass Box guide with several modelsminor

    Logged frictions and proposed solution

    As described by the agents that hit it.

    • PR #2677 got no CI checks because the branch conflicted with main. A glassbox-improve run had re-pinned four of the same pages while the branch sat unpushed. → Before opening a PR from a branch that waited a while, run git merge-tree against origin/main; GitHub runs no pull_request workflow on an unmergeable PR2026-10-29
    • Two promotion agents each edited the other's draft link before moving it; cherry-picks conflicted on both moved drafts → Tell promotion agents not to touch another promoted draft; repoint links in the join pass2026-10-27
  • 2sessionsA reviewer subagent could not read all the docs or pages it was given, so its coverage was thin and cost a resume or went unread.minorfix landed 10-31 · PR #2734Sessions per day since 2026-10-26: 2026-10-28 1, 2026-10-30 1. A fix merged on 2026-10-31

    A reviewer or audit subagent is handed more files than it can read (the whole docs set, Skills, journal pages, glossaries); it reports partial coverage or has to be resumed, doubling its cost. Signals: 'covered only a fraction', 'reviewers reported thin coverage', 'had to be resumed', 'unread'.

    Merged PRs to fix it

    Newest first, up to 5. Merged to fix it, which does not prove it worked.

    • audit-docs rotates coverage: reviewers B and C skip areas the last two runs' Covered line names, end replies with unread Live files, and are never resumed. PR #2734 2026-10-31

    Occurrences

    Newest first: date (links to the session log) → the session's goal.

    • 2026-10-30 →Scheduled audit of the Platform's docs for drift and duplicationminor
    • 2026-10-28 →Scheduled audit of the repo's live docsminor

    Logged frictions and proposed solution

    As described by the agents that hit it.

    • Reviewers reported thin coverage (Skills, journal pages, glossaries unread) because three agents cannot read the whole repo. → Split reviewers by directory as well as lens, or rotate the covered directories across runs.2026-10-30
    • Single-home reviewer covered only a fraction of the docs and had to be resumed, doubling its cost. → Brief reviewers with an explicit file list and ask for coverage in the reply.2026-10-28
  • 1sessionThe backlog build script reports a branch as failed when review hits its three-round limit with only small findings left, so the main agent fixes them by hand.minorstill recurring · 2 since last fix · PR #2140Sessions per day since 2026-10-26: 2026-10-31 1

    reviewBranch in .claude/workflows/clear-backlog-build.js returns status 'failed' with openFindings when round 3 still has worthFixing findings; clear-backlog SKILL.md section 3 says only 'failed: fix the brief and re-run'. Signals: 'review capped at 3 rounds', 'came back failed at the 3-round cap'.

    Merged PRs to fix it

    Newest first, up to 5. Merged to fix it, which does not prove it worked.

    • clear-backlog §3 now says what to do when a branch fails at the review cap with open findings. PR #2140 2026-10-16

    Occurrences

    Newest first: date (links to the session log) → the session's goal.

    Logged frictions and proposed solution

    As described by the agents that hit it.

    • clear-backlog-build hit its 3-round review cap on a prose-only #2725 branch, leaving one finding to fix by hand → Brief scope lines should match the done-when line; the brief named only some §3.3 calls while done-when covered all2026-10-31
  • 1sessionAgents that only answered a question forgot to write their session log, and the user had to ask whether it was done.minorstill recurring · 3 since last fix · PR #1801Sessions per day since 2026-10-26: 2026-10-29 1

    CLAUDE.md asks for close-session when a session only answers a question, or when its work is done without a PR; the session waits for a follow-up or the end instead, and the user has to ask whether it was logged. Signals: 'did not invoke close-session after answering', 'the user had to ask "Logged?"', no PR in the session.

    References: Issue #2209 closed 2026-10-17: the owner left the answer-only half out of scope of PR #2217, and PR #2381 kept it out.

    Merged PRs to fix it

    Newest first, up to 5. Merged to fix it, which does not prove it worked.

    • Added a CLAUDE.md rule to run close-session when a session only answers a question. PR #1801 2026-10-12

    Occurrences

    Newest first: date (links to the session log) → the session's goal.

    • 2026-10-29 →Find and fix stale facts across Terrarium's overview docsminor

    Logged frictions and proposed solution

    As described by the agents that hit it.

    • The first two turns only answered a question (reading docs), and I did not invoke close-session at the end of them as CLAUDE.md asks → Treat a pure read-and-summarize turn as session closure and invoke close-session; re-invoking later is safe2026-10-29
  • 1sessionAgents settled on a cause or on which PR made a change from one test or a commit list, and it was wrong.minorstill recurring · 1 since last fix · PRs #2378, #2336Sessions per day since 2026-10-26: 2026-10-27 1

    A diagnosis or attribution (why something behaves as it does, which PR made a change) is generalised from partial evidence, a single test or a merge-commit list, without varying one factor per test or reading the diff. Signals: "from one test", "without checking its diff", a cause reversed by a controlled test or git show.

    Merged PRs to fix it

    Newest first, up to 5. Merged to fix it, which does not prove it worked.

    • Restored the shorter "Verify before you state" bullet in CLAUDE.md, and the Standards reviewer in clear-backlog-build now flags a count or subagent claim that cites no source. PR #2378 2026-10-21
    • CLAUDE.md "Verify before you state" now names subagent reports, script behaviour from recall, "only"/"every"/"nothing" claims and one-test causes; "One home per fact" says to grep for other statements when changing one. PR #2336 2026-10-20

    Occurrences

    Newest first: date (links to the session log) → the session's goal.

    • 2026-10-27 →Keep Tinkerfund Inventor portraits in light colours in dark modeminor

    Logged frictions and proposed solution

    As described by the agents that hit it.

    • Guessed a first fix (tf-tokens class alone) and spent a production build on it before probing the portrait's computed styles. → Read computed color-scheme and token values with a Playwright probe before the first fix attempt.2026-10-27
  • 1sessionAgents ran long commands (the gate, the full test suite) in the foreground or with a shell &, instead of with the background option.minoraccepted 10-23 · PRs #2443, #2271, #1790Sessions per day since 2026-10-26: 2026-10-30 1

    Sessions run commands over 2 minutes (pnpm gate:scoped, the full vitest suite, chains of long commands) in the foreground with a long timeout, or background them with a shell & instead of run_in_background, although CLAUDE.md says to use run_in_background and a log; only a guard would reach them. Signals: a foreground gate or vitest run, a 600s timeout expiring, a shell-& gate start.

    References: issue #2426 closed not planned on 2026-10-26: the owner accepts the cost. The backgrounding Prune Trial (verdict f89929a37) found no major or blocker damage over 53 sessions, so no guard gets built.

    Merged PRs to fix it

    Newest first, up to 5. Merged to fix it, which does not prove it worked.

    • Cut long-command backgrounding to one home: CLAUDE.md's Self-verification bullet tightened and blog-post §10's restatement dropped. PR #2443 2026-10-23
    • CLAUDE.md now says to start any command over 2 minutes with run_in_background and a redirected log, dropping the foreground-with-timeout option. PR #2271 2026-10-19
    • Rewrote the rule so a long command may run in the foreground if given a long enough timeout. PR #1790 2026-10-11

    Occurrences

    Newest first: date (links to the session log) → the session's goal.

    • 2026-10-30 →Visitor-loop run on the Midden: three blind visitors, consensus fixesminor

    Logged frictions and proposed solution

    As described by the agents that hit it.

    • Foreground merge-pr.ts hit the 600s tool limit while polling a slow CI gate; I had to relaunch it in the background. → Run merge-pr.ts with run_in_background from the start, as CLAUDE.md says for long commands.2026-10-30
  • 1sessionTwo instructions seemed to disagree on whether to run the long gate check in the background, so agents stopped to work out which applied.minorstill recurring · 1 since last fix · PR #2525Sessions per day since 2026-10-26: 2026-10-30 1

    dispatch-subagents section 3 tells a dispatched subagent to run pnpm gate:scoped in the foreground (a guard denies a subagent's backgrounding), while CLAUDE.md's Self-verification bullet tells the session to start it with run_in_background; an orchestrator reading section 3 takes the subagent line as its own and sees a contradiction, though CLAUDE.md already says a dispatched subagent can't background. Signals: "dispatch-subagents says run the gate in the foreground", "CLAUDE.md says run_in_background", the gate-run choice in a session that dispatches.

    Merged PRs to fix it

    Newest first, up to 5. Merged to fix it, which does not prove it worked.

    • dispatch-subagents §3's foreground-gate line is now phrased as a line for a subagent's brief, so it no longer reads as conflicting with CLAUDE.md. PR #2525 2026-10-25

    Occurrences

    Newest first: date (links to the session log) → the session's goal.

    • 2026-10-30 →Scheduled sweep: turn recent session Frictions into fixesminor

    Logged frictions and proposed solution

    As described by the agents that hit it.

    • impl-brief step 2 and CLAUDE.md say to run the gate in the background, but the subagent hook blocks that for dispatched agents; the agent ran it foreground. → Say in impl-brief step 2 that a dispatched agent runs the gate in the foreground.2026-10-30
  • 1sessionA backgrounded check run reported done early with a cut-off log, so the agent started more runs that overlapped and overwrote each other's build.minorfix landed 10-31 · PR #2737Sessions per day since 2026-10-26: 2026-10-29 1. A fix merged on 2026-10-31

    A second gate:scoped run started while the first was alive and the overlapping runs clobbered .nuxt, the build lock and a shared log: after a background task's completion notice arrived early with a truncated log, or after a chained command whose first step failed silently. PR #2737 (2026-10-31) makes gate.ts refuse a second run in the same checkout (pid lock in the git dir); the early completion notice itself is unchanged. Signals: 'gate already running', 'overlapped', 'clobbered .nuxt', 'build lock', an early 'completed' notice for a gate.

    Notes: 2026-10-25 design: a per-checkout lock in scripts/gate/gate.ts (Human-only) that refuses a second run dropped: one occurrence, and the cause was relaunching on an early completed notice instead of checking ps; revisit on a second occurrence. 2026-10-30 survey: issue #2660 closed 2026-10-29 with no gate lock merged on main; status reset to open.

    Merged PRs to fix it

    Newest first, up to 5. Merged to fix it, which does not prove it worked.

    • gate:scoped takes a per-checkout pid lock and exits 1 if a live gate already runs there; a dead pid is taken over. PR #2737 2026-10-31

    Occurrences

    Newest first: date (links to the session log) → the session's goal.

    Logged frictions and proposed solution

    As described by the agents that hit it.

    • Chained validate, commit and gate with && after a grep that matched nothing, then started a second gate while the first still ran; both shared a log and build, giving a false EXIT 1. → Run the gate alone with its own log file; never chain it after a grep. A pushed-gate note about shared builds in the dispatch docs would help.2026-10-29
  • 1sessionAn agent guessed what the owner meant by a short or ambiguous instruction instead of asking, and the work took a detour until the owner corrected it.minoropen Sessions per day since 2026-10-26: 2026-10-31 1

    An ambiguous owner instruction or reference (a session type, "link the concepts", the period's focus) is resolved by the agent's first guess, not one clarifying question; the owner then reframes or corrects it, sometimes twice. An irreversible step taken on a bare "Yes" that answered two questions at once counts too. Signals: "meant", "had to reframe", "two more owner prompts", "detour until corrected", a merge on an answer to a combined question.

    Notes: 2026-10-20 design: a pr-workflow.md step-4 sentence (do not merge while a question you asked the owner about this PR is unanswered) dropped: one occurrence of that boundary; revisit on a fourth. 2026-10-23 design: the pr-workflow.md step-4 sentence dropped again: 01DtK8w6 (moved here by the re-cluster, dated 2026-10-12) is a bare Yes to two combined questions, a different boundary (ask a merge as its own question), and no occurrence is new; pr-workflow.md is in the open Prune Trial (PR #2412), revisit when it is judged. 2026-10-25 design: no change: the five occurrences are five different boundaries (a session type, "link the concepts", "last N days", a bare Yes to two questions, a lens name), nothing new unites them, pr-workflow.md is in the open Prune Trial (PR #2412), and CLAUDE.md "Ask before building" already says to ask; revisit when a fourth shares one boundary.

    Occurrences

    Newest first: date (links to the session log) → the session's goal.

    Logged frictions and proposed solution

    As described by the agents that hit it.

    • Started #2721's build on an ambiguous 'Agree' and later flip-flopped on Q7 answers, stopping two build runs mid-flight → When an answer changes a pick under build, confirm the full option before relaunching; ask the clarifying question first, per the owner's stated preference2026-10-31
  • 1sessionAgents built or hardened a change without first asking whether it should exist at all.minorstill recurring · 1 since last fix · PRs #2535, #2206, #1821Sessions per day since 2026-10-26: 2026-10-27 1

    An agent implements or hardens a solution before asking whether the change should exist or how big it should be; the triage-brief shape was fixed 2026-10-06 (auto-triage SKILL line 57), later cases differ.

    References: issue #2520 closed by PR #2535

    Merged PRs to fix it

    Newest first, up to 5. Merged to fix it, which does not prove it worked.

    • Added a general 'Question the premise' bullet to CLAUDE.md's Working conventions, in the wording the owner approved. PR #2535 2026-10-25
    • The premise rule now fires when a change is recommended, implemented or hardened, and drops any part with no reason from the current goal. PR #2206 2026-10-17
    • Added a working rule to ask whether a change should exist and how big, before building it. PR #1821 2026-10-12

    Occurrences

    Newest first: date (links to the session log) → the session's goal.

    • 2026-10-27 →Document the Glass Box quality bar and design a Skill to raise the guide unattendedminor

    Logged frictions and proposed solution

    As described by the agents that hit it.

    • I designed the running out-of-remit issue without checking that the Friction Ledger already clusters run problems; run 1's finding landed in both, and the owner had to point it out. → Before adding a place to record findings, check what the Ledger and session-log fields already capture.2026-10-27
  • 1sessionA GitHub issue search returned nothing for something that exists, so a "no match" claim rested on weak evidence.minorlikely fixed 10-28 · PRs #2646, #744Sessions per day since 2026-10-26: 2026-10-28 1. A fix merged on 2026-10-28

    mcp__github__search_issues matches fuzzily and can return zero results or miss a merged fix for plain queries; github-integration.md already warns that total_count 0 is not proof (issue #741) but sessions state 'no match' from one search. PR #2646 moved visitor-loop to list-and-filter, and its git log origin/main --grep check on a shallow clone then also said no match for an existing merged PR. Signals: 'search returned no match', 'returned zero results for plain queries', a refiner or later search finding the issue or PR.

    Merged PRs to fix it

    Newest first, up to 5. Merged to fix it, which does not prove it worked.

    • visitor-loop section 3 lists open issues with list-open-issues.ts and checks merged PRs with git log origin/main --grep instead of searching; github-integration.md unchanged. PR #2646 2026-10-28
    • github-integration.md warns that a search's total_count 0 is not proof of absence and to cross-check with a narrow list scan. PR #744 2026-07-30

    Occurrences

    Newest first: date (links to the session log) → the session's goal.

    • 2026-10-28 →Visitor-loop run on the Blog: fix consensus findings, build one featureminor

    Logged frictions and proposed solution

    As described by the agents that hit it.

    • The tally's `git log origin/main --grep` search ran on a shallow clone and said no match for threads; a merged PR (2383) already existed. Only the refiner's GitHub search caught it. → visitor-loop step 3 should use GitHub search for merged PRs, or unshallow first.2026-10-28
  • 1sessionDiagrams, illustrations and layouts shipped, or nearly did, without the visual check they needed: the Skill's screenshot step, or a human's look before publishing.minorstill recurring · 1 since last fix · PRs #2563, #2107, #1821Sessions per day since 2026-10-26: 2026-10-27 1. A fix merged on 2026-10-26

    Visual work ships after at most the agent's own screenshot check, or with that check skipped or not yet back, and the human first sees it once published. Signals: 'screenshot step skipped', 'pushed before the screenshot-review agent returned', a self-merged illustration, unreadable at 390px, the owner judging a published visual poor.

    Merged PRs to fix it

    Newest first, up to 5. Merged to fix it, which does not prove it worked.

    • Glass Box pages are screenshotted only when layout, a feature or a diagram changed; glassbox-update points to EVERY-PAGE.md's Check. PR #2563 2026-10-26
    • The read-first hint now points to verifying-ui-changes.md when a session takes a screenshot. PR #2107 2026-10-16
    • Added a rule: show a rough draft of diagrams and layouts for reaction before polishing; passing checks is not enough. PR #1821 2026-10-12

    Occurrences

    Newest first: date (links to the session log) → the session's goal.

    Logged frictions and proposed solution

    As described by the agents that hit it.

    • I told the user I would self-merge once green before checking verifying-ui-changes, which requires a human's eye on an illustration from a brief; caught it before merging. → The ui-verification rule summary could state the human-eye requirement for illustrations, not only point to the doc.2026-10-27
  • 1sessionReading what a saved clear-backlog Workflow returned took hand-written parsing: at first the result sat one level deeper than expected, later the helper script lacked the view needed.minorlikely fixed 10-27 · PRs #2589, #2350, #2030Sessions per day since 2026-10-26: 2026-10-26 1. A fix merged on 2026-10-27

    A saved Workflow's .output nests the script's return value under a `result` key and can run to about 90 KB. #2030 documented the key and run-summary.ts (#2350, #2589) prints triage, build and verdict views, but a view it lacks (a triage brief field, merging several runs into an authored log) sends the orchestrator back to ad-hoc node or YAML scripts. Signals: 'first parse found nothing', 'node -e parser', 'hand-written merge script', 'run-summary.ts could'.

    Merged PRs to fix it

    Newest first, up to 5. Merged to fix it, which does not prove it worked.

    • run-summary.ts --verdicts now merges the verdicts of several saved runs into one block. PR #2589 2026-10-27
    • Added run-summary.ts, which reads the return value under result from a saved workflow output (triage, build and verdict views). PR #2350 2026-10-20
    • Backlog-clearing instructions now say saved workflow output nests the return value under a 'result' key. PR #2030 2026-10-15

    Occurrences

    Newest first: date (links to the session log) → the session's goal.

    Logged frictions and proposed solution

    As described by the agents that hit it.

    • Merging four workflow runs' run-summary --verdicts output into my own ruleVerdicts/docsRead took a hand-written YAML merge script in .throwaway. → Give run-summary.ts a mode that merges --verdicts into an authored log YAML, keeping the orchestrator's own entries and appending subagent reasons.2026-10-26

Most frequent 49

The other clusters, ranked by how many sessions hit them.

  • 31sessionsAgents read the doc CLAUDE.md names before a git, GitHub or screenshot step only after taking that step, when the hint points to it.minoraccepted 10-15 · PRs #2066, #1793Sessions per day since 2026-10-26: 2026-10-26 2, 2026-10-27 9, 2026-10-28 8, 2026-10-29 6, 2026-10-30 4, 2026-10-31 1, 2026-11-01 1

    CLAUDE.md's read-first triggers are prose, and read-first-hint.ts (#1793, the triage docs since #2446) points to the doc only after the first matching git, GitHub, issue-write or screenshot call (PostToolUse). The owner accepted these late reads as a cost in PR #2066 instead of a deny guard (#1819 closed, not refiled): the hint now says a late read that clears the call is not a Friction. Signals: a late read of git-conventions.md, github-integration.md, issue-tracker.md, triage-labels.md or verifying-ui-changes.md after the hint fired, or the hint firing again after a shell read it does not count. A search the fields guard refused is github-search-fields-guard-deny; a wrong label from unread triage docs is triage-docs-unread-before-labelling; other docs have their own entries: pr-workflow-unread-before-push, pr-workflow-read-in-part, dispatch-subagents-skill-unread.

    References: PR #2066 (merged): the owner accepts late reads; split from binding-docs-skipped for #2146

    Merged PRs to fix it

    Newest first, up to 5. Merged to fix it, which does not prove it worked.

    • Hint now says a late read that clears the call is not a Friction. PR #2066 2026-10-15
    • Added a hint pointing to the git and GitHub docs at a session's first matching call. PR #1793 2026-10-11

    Occurrences

    Newest first: date (links to the session log) → the session's goal.

    Logged frictions and proposed solution

    As described by the agents that hit it.

    • Filed issues without reading triage-labels.md first, as CLAUDE.md requires; I used the needs-triage label the Skill names. The hook reminded me afterwards. → Read issue-tracker.md and triage-labels.md whole before the first issue_write.2026-11-01
    • Ran git fetch origin main before reading docs/agents/git-conventions.md, which CLAUDE.md requires before the first non-read-only git command. → Read the doc first; the fetch itself was harmless.2026-10-31
    • Ran git log with --grep on origin/main to read a merge time before reading git-conventions.md, which the hook then asked for; the read changed nothing. → None needed; the hook's own text says a late read is no Friction when the call was right.2026-10-30
    • Chained git status, git log and the git-conventions read in one call, so the first git commands ran before the required doc was read. → Read the doc in its own call before any git command.2026-10-30
    • Ran several GitHub reads before reading docs/agents/github-integration.md, which CLAUDE.md requires first; a hook reminded me afterwards. → Read the doc at the first GitHub step of a scheduled run.2026-10-30
    • Ran a read-only git log/diff in a refiner subagent without git-conventions; also I forgot the read-before-first-git rule was satisfied only via a cat in a combined command. → Brief refiner to read docs/agents/git-conventions.md.2026-10-30
    • Read git-conventions.md and the dispatch-subagents Skill only after hooks blocked my first git command and first Agent call, not before as CLAUDE.md says. → Read the triggered docs before the first git command or subagent brief.2026-10-29
    • Called search_issues and ran git fetch/log before reading github-integration.md and git-conventions.md, which CLAUDE.md requires first; hooks reminded me afterwards. → Read both docs at the first GitHub or git step of a scheduled audit.2026-10-29
    • Ran git fetch in the same batch as reading git-conventions.md instead of reading it first, as CLAUDE.md requires. → Read the doc in a separate earlier call before any git command.2026-10-29
    • Called pull_request_read before reading github-integration.md, which CLAUDE.md requires before the first GitHub operation; a hook reminded me afterwards. → Read the doc in the first batch of tool calls, alongside git-conventions.2026-10-29
    • Ran the window script and other git commands before reading git-conventions.md; a hook flagged it afterwards. → Read git-conventions.md first, as CLAUDE.md says.2026-10-29
    • Ran git log to draw a conclusion before reading git-conventions.md, against CLAUDE.md's read-first rule; the hint caught it. → Read git-conventions before the first history query; the hint already fires, so no new rule.2026-10-29
    • Read git-conventions.md and github-integration.md only after the first git/GitHub operation, not before, as CLAUDE.md requires. → Read the triggered docs before the first git or GitHub command.2026-10-28
    • Read git-conventions.md and github-integration.md only after hooks fired post first git and GitHub calls, although CLAUDE.md requires them before. → Load both when the audit Skill is invoked so a scheduled run reads them up front.2026-10-28
    • Ran git branch --show-current alongside git status before reading git-conventions.md; the hook flagged the late read. → Read git-conventions.md before any git command beyond a bare status.2026-10-28
    • Ran git fetch in the same batch as reading git-conventions.md, so the required read came after the first git command. → Read required docs in their own call before any git command.2026-10-28
    • Ran git fetch in the same parallel batch as reading git-conventions.md, so the read wasn't strictly first → Read the CLAUDE.md trigger doc in its own call before any non-status git command2026-10-28
    • Read git-conventions.md after the first git log command, not before as CLAUDE.md requires. → Read the triggered doc before the first git command beyond status and diff.2026-10-28
    • Ran git rev-parse and branch --show-current before reading git-conventions.md; a PostToolUse hook reminded me. No harm, the doc did not change my calls. → Fine as is; the hint worked. Reading the doc first costs nothing but is not needed for read-only rev-parse.2026-10-28
    • Ran git log and a fetch-bearing script before reading git-conventions.md; a hook reminded me afterwards. → Read the doc when the task starts with git; the hook already catches it.2026-10-28
    • Ran git status and the digest list before reading git-conventions.md, against CLAUDE.md's before-first-git-command trigger; read it right after. → Read git-conventions.md first in the digest Skill's step 1.2026-10-27
    • Ran git remote -v and git fetch before reading docs/agents/git-conventions.md, against CLAUDE.md; a hook flagged it. No harm. → Read git-conventions.md before any git command beyond status and diff, even read-only ones.2026-10-27
    • Read git-conventions.md only after my first git command, when a hook prompted, instead of before as CLAUDE.md requires. → Load the doc at session start for scheduled Skills that always run git.2026-10-27
    • Ran git rev-parse --is-shallow-repository before reading git-conventions.md; the hook flagged it → The command was harmless; clear-backlog §1's unshallow check could note it is exempt from the read-first trigger2026-10-27
    • Ran git rev-parse HEAD before reading docs/agents/git-conventions.md, which CLAUDE.md asks for before git beyond status/diff → Harmless read-only command; the hint fired after. Read the doc first or treat rev-parse as exempt like status2026-10-27
    • Ran git fetch and git log to judge whether f1b551f27 was on main before reading git-conventions.md, as CLAUDE.md requires. → Read it at the first git command beyond status; a hook reminder fired only after the fact.2026-10-27
    • Ran git log on hook history to draw a conclusion before reading git-conventions.md, against CLAUDE.md read-first → The read-first hint fired after the call; it worked as designed, no change needed2026-10-27
    • Ran git fetch and git log before reading docs/agents/git-conventions.md; a hook flagged it after the call. → Read git-conventions.md before the first git command beyond status and diff, as CLAUDE.md says; harmless here since both were read-only.2026-10-27
    • Filed the issue before reading triage-labels.md, which CLAUDE.md requires before filing; the label I used was right. → Read the listed docs when the trigger first applies, not after the hook asks.2026-10-27
    • Ran my first git command before reading docs/agents/git-conventions.md; the PostToolUse hook flagged it. No harm came of it. → Read the doc at the first git command, as CLAUDE.md says.2026-10-26
    • Ran git log before reading docs/agents/git-conventions.md, against CLAUDE.md's before-first-git-command trigger; the read-first hint caught it, no harm. → Read git-conventions.md before any git log used to draw a conclusion, even in a question-only session.2026-10-26
  • 27sessionsAn end-of-turn reminder told agents to commit and push while checks were still running.minoraccepted 10-05 · PRs #1612, #1588Sessions per day since 2026-10-26: 2026-10-26 3, 2026-10-27 4, 2026-10-28 6, 2026-10-29 6, 2026-10-30 3, 2026-10-31 3, 2026-11-01 2

    The Stop hook demands commit and push on every turn while a gate, build or fact-check subagent is still running, against ADR-0004's push-after-gate rule.

    References: issue #2233: the owner accepts the cost, since the nag comes from the harness-side stop-hook-git-check.sh (issue #1653) and repo rules already say to decline it. Not for a survey to re-propose: the owner alone may revisit pushing the branch early and opening the PR after review, once the pr-workflow.md prune trial is judged

    Merged PRs to fix it

    Newest first, up to 5. Merged to fix it, which does not prove it worked.

    • Moved the end-of-turn reminder caveat into the main project instructions so more sessions read it. PR #1612 2026-10-05
    • Documented that the end-of-turn commit reminder cannot see running checks: commit work in progress, never push unverified work. PR #1588 2026-10-04

    Occurrences

    Newest first: date (links to the session log) → the session's goal.

    • 2026-11-01 →Write the 2026-10-31 Journal Digestnit
    • 2026-11-01 →Weekly check of the Platform's own Skillsnit
    • 2026-10-31 →Write the 2026-10-30 Journal Digestnit
    • 2026-10-31 →Weekly check of the Platform's own Skillsnit
    • 2026-10-31 →Scheduled visitor-loop run on the Tinkerfund: three blind visitors, fix consensus problems, build one featurenit
    • 2026-10-30 →Write the 2026-10-29 Journal Digestnit
    • 2026-10-30 →Scheduled blog post: Eyra on the fact-check fingerprintnit
    • 2026-10-30 →Scheduled prune trial of the Platform's agent instructionsnit
    • 2026-10-29 →Raise the weakest Glass Box guide pages by rater consensusminor
    • 2026-10-29 →Find and fix stale facts across Terrarium's overview docsnit
    • 2026-10-29 →Scheduled prune of agent instructionsnit
    • 2026-10-29 →Weekly rater-consensus improvement run on the Glass Box guidenit
    • 2026-10-29 →Redesign glassbox-improve to grade toward the best pagesnit
    • 2026-10-29 →Glass Box guide improvement run: rate every page, raise the weakest, promote ready draftsnit
    • 2026-10-28 →Scheduled audit of the repo's live docsnit
    • 2026-10-28 →Raise the Glass Box guide's weakest pages, then fix what the run hitnit
    • 2026-10-28 →Cluster the Friction Ledger by harm, not by slipnit
    • 2026-10-28 →Turn recent session Frictions into fixesnit
    • 2026-10-28 →Scheduled prune-trial run on the Platform's instructionsnit
    • 2026-10-28 →Visitor-loop run on the Blog: fix consensus findings, build one featurenit
    • 2026-10-27 →Write the 2026-10-26 Journal Digest and archive aged-out contentnit
    • 2026-10-27 →Scheduled sweep: turn recurring session Frictions into fixesnit
    • 2026-10-27 →Write one Blog post as Eyranit
    • 2026-10-27 →Atlas 404 drawn as an engraved platenit
    • 2026-10-26 →Write the 2026-10-25 Journal Digest and archive aged-out contentnit
    • 2026-10-26 →Scheduled blog post: one Persona post on a recent real eventnit
    • 2026-10-26 →Scheduled prune trial of the Platform's agent instructionsnit

    Logged frictions and proposed solution

    As described by the agents that hit it.

    • Stop hook asked to push or commit four times while reviews and the gate were pending; ADR-0004 overrides it but each prompt cost a turn. → The hook should skip while a gate or review subagent is running.2026-11-01
    • The Stop hook asked me to push four times while the review and gate were pending, as ADR-0004 anticipates; each was a wasted turn. → Let the hook stay quiet while a code-review is outstanding.2026-11-01
    • The Stop hook asked to push five times while the fact-check, review and gate were pending, each costing a turn. → The hook should stay quiet while a branch has a pending ADR-0004 review.2026-10-31
    • Stop hook asked for a push three times while review and gate were still pending. → Have the Stop hook skip the nag while a review or background gate is running.2026-10-31
    • Stop hook asked to push after every turn while the gate and review were pending; ADR-0004 correctly overrode it, but each prompt cost a turn. → Have the stop hook stay quiet while a gate or review is running in the background.2026-10-31
    • The Stop hook asked to push five times while the fact-check, review and gate were pending, each costing a turn. → Have the hook stay quiet while a background agent or gate is running.2026-10-30
    • The Stop hook asked to push five times while the review, fact-check and gate were pending, repeating text that cost turns and risked an early push. → Let the Stop hook stay quiet when a blog-post run's gate has not yet run.2026-10-30
    • Stop hook asked to push four times while the probe, reviews and gate were pending; ADR-0004 says to ignore it, so each was a wasted turn. → Have the Stop hook stay quiet on a branch whose gate and review have not yet run.2026-10-30
    • The Stop hook asked me to push nine times while ADR-0004 required code-review and gate first; each ask cost a turn of explanation. → Have the Stop hook skip its push request while a Skill's review or gate steps are still running, or say the ADR-0004 order in its text.2026-10-29
    • The Stop hook asked three times to push before the gate and review had finished; pr-workflow.md says to ignore it, but each prompt cost a turn → Have the Stop hook stay quiet while a gate:scoped run is in flight for that branch2026-10-29
    • Stop hook asked twice to push while the gate was still running; waiting cost two idle turns but kept ADR-0004 intact. → None needed; the hook cannot see a pending gate.2026-10-29
    • Stop hook asked to push about eight times while ADR-0004 required code-review and gate:scoped first; each reply had to restate why I was holding. → Make the Stop hook skip its push nag while a background gate or review subagent is running in the session.2026-10-29
    • Stop hook asked to push while gate:scoped was running, against ADR-0004's order. → User-scope hook; skip the push request while a gate run is pending.2026-10-29
    • The Stop hook asked me to push seven times while review and the gate were still pending; ADR-0004 already says to wait, but each reminder cost a turn of explanation. → Have the Stop hook skip the reminder while a branch has no push yet and a scheduled Skill's review steps are running, or point to the ADR-0004 clause.2026-10-29
    • Stop hook asked to push twice while the review and gate were still running, against the push-after-gate rule. → Stop hook could skip its nag when a gate run is in flight.2026-10-28
    • The Stop hook asked me to push six times while raters, writers and the gate were still running; each turn I had to restate why not. → stop-hook-git-check could stay quiet while a dispatched agent or a backgrounded gate is still running in the session.2026-10-28
    • The Stop hook asked to push about eight times while reviews, audits and the gate were still running; each needed a reply. → Harness-side hook, already tracked as stop-hook-nag (accepted).2026-10-28
    • The Stop hook asked me five times to push while the required gate was still running, which would have pushed before it passed; I declined each time. → The Stop hook could skip its nag while a gate:scoped log is open or a gate run is in progress.2026-10-28
    • The Stop hook demanded a push five times while review and gate were still running, which ADR-0004 puts before the first push. → Stop hook could skip the nag while a background gate is running.2026-10-28
    • Stop hook repeatedly asked to push uncommitted/unreviewed work, conflicting with ADR-0004's review-then-gate-then-push order. → Hook could skip the nag while a scheduled run is mid-review.2026-10-28
    • The Stop hook asked to commit and push four times while the fact-check, reviews and gate were pending; ADR-0004 says review and gate first. → Make the Stop hook skip when a review or gate is pending.2026-10-27
    • Stop hook asked to push the ledger commits three times while the gate was still running and the Skill says review and gate come first. → The hook could skip its nag while a gate:scoped run or a Skill-ordered review is pending.2026-10-27
    • Repeated Stop-hook push nags arrived while gate:scoped ran in the background; I had to hold the push each time. → Stop hook could skip its nag while a gate log is still running.2026-10-27
    • The Stop hook asked to push the impl branch while review fixes were still pending. → None needed; ADR-0004 says to ignore it until review is clean.2026-10-27
    • Stop hook asked to commit and push three times while the fact-check and gate were running; ADR-0004 says review and gate first. → Have the Stop hook skip its push nag while a background gate or subagent runs.2026-10-26
    • The Stop hook asked to push five times while the review, fact-check and gate were still running, each time needing a reply to hold the push. → Let the Stop hook stay quiet while a scheduled-run gate or subagent is in flight.2026-10-26
    • Stop hook asked to push three times while the probe and gate were pending; ADR-0004 says review and gate first. → Let the Stop hook skip its push nag while a background gate or agent runs (known, #2233).2026-10-26
  • 23sessionsAgents called a subagent or workflow before reading the dispatch-subagents Skill, so a safety check refused the call and they had to retry.minoraccepted Sessions per day since 2026-10-26: 2026-10-26 4, 2026-10-27 3, 2026-10-28 3, 2026-10-29 4, 2026-10-30 5, 2026-10-31 3, 2026-11-01 1

    PR #2550's guard denies the first Agent, Workflow or SendMessage call until the dispatch-subagents Skill is read; agents reach the dispatch first (often a Skill's saved workflow such as clear-backlog-explore, or the visitor dispatches) and resend after reading. Signals: 'dispatch-read guard blocked', 'blocked ... until I read dispatch-subagents', a dispatch repeated unchanged.

    References: Comes from PR #2550, the fix for dispatch-subagents-skill-unread (briefs written without the Skill). Issue #2580 closed not planned on 2026-10-27: the owner accepts the one-retry cost; saved workflows stay unexempted, since clear-backlog-build takes orchestrator-written briefs.

    Occurrences

    Newest first: date (links to the session log) → the session's goal.

    Logged frictions and proposed solution

    As described by the agents that hit it.

    • Called the first Agent call before reading dispatch-subagents, as CLAUDE.md requires before any subagent brief; the guard blocked it and the brief was resent. → Read dispatch-subagents right after the Skill's fact-check step names a subagent.2026-11-01
    • Workflow call blocked by the dispatch-read guard; I had not read dispatch-subagents before launching clear-backlog-explore, though nothing in it changed the call → clear-backlog could name the dispatch-subagents read before §1's workflow call, or the guard could exempt saved workflows that brief their own agents2026-10-31
    • The dispatch-read guard blocked my first Agent call until I read dispatch-subagents SKILL.md; I had read the git, GitHub and PR docs but not that Skill before briefing. → Name dispatch-subagents in the blog-post Skill's step 6 so it is read before the first brief.2026-10-31
    • Agent call was blocked by the dispatch-read guard because I had not read dispatch-subagents before writing the visitor briefs; three briefs had to be resent. → Have the visitor-loop Skill name dispatch-subagents in step 2.2026-10-31
    • First Agent call was blocked by the dispatch-read guard because I had not read dispatch-subagents first; one retry. → Read dispatch-subagents right after the digest Skill says to spawn a fact-check agent.2026-10-30
    • Skipped CLAUDE.md's dispatch-subagents read before the first Workflow call; the dispatch-read guard blocked it and forced a retry → clear-backlog §1 could name dispatch-subagents as a read before running the explore workflow, or the guard is enough2026-10-30
    • The dispatch-read guard blocked my first blind-read Agent call because I had not read the dispatch-subagents Skill, which CLAUDE.md requires before writing a brief. → Read dispatch-subagents at the point of the first brief, or have the blog-post Skill's step 6 name it as a pre-read.2026-10-30
    • Dispatch-read guard denied my first Agent call until I read dispatch-subagents; I knew the rule but had not opened it yet. → None needed; the guard worked as designed.2026-10-30
    • Agent dispatch was blocked by the dispatch-read guard because I had not read dispatch-subagents yet; one wasted call set and a retry. → The visitor-loop Skill could name dispatch-subagents so it is read before step 2.2026-10-30
    • Read git-conventions.md and the dispatch-subagents Skill only after hooks blocked my first git command and first Agent call, not before as CLAUDE.md says. → Read the triggered docs before the first git command or subagent brief.2026-10-29
    • Called the Agent tool before reading dispatch-subagents SKILL.md; the dispatch-read guard blocked the call, costing one retry. → Read the Skill when the frictions-to-fixes Skill first says to dispatch, or have the Skill name the read at its start.2026-10-29
    • The dispatch-read guard denied the first clear-backlog-explore call until I read dispatch-subagents; one retry (accepted cost, #2580) → None; owner accepted this cost2026-10-29
    • Dispatch-read guard blocked all three visitor Agent calls until I read dispatch-subagents SKILL.md, though the briefs were verbatim from visitor-loop. → visitor-loop's step 2 could name dispatch-subagents as a pre-read, or the guard could skip a Skill's verbatim briefs.2026-10-29
    • The first Workflow call was blocked by the dispatch-read guard because I had not read dispatch-subagents first, although a saved workflow writes its own briefs. → Exempt a named saved-workflow run from the dispatch-read guard, or make clear-backlog say to read dispatch-subagents before section 1.2026-10-28
    • dispatch-read guard rejected the Agent call because I read the .claude/skills symlink path, not .agents/skills; one extra read and retry. → Have the guard accept either path of the same Skill file.2026-10-28
    • Dispatched the three visitors before reading dispatch-subagents; the dispatch-read guard blocked all three calls and they were resent unchanged. → CLAUDE.md names the trigger; visitor-loop step 2 could say to read dispatch-subagents first.2026-10-28
    • The dispatch-read guard blocked the first clear-backlog-explore Workflow call until I read dispatch-subagents (the #2580 cost, now accepted) → Accepted by the owner in #2580; read dispatch-subagents at the start of a clear-backlog run2026-10-27
    • The dispatch-read guard blocked my first Agent call because I had not read dispatch-subagents SKILL.md; one wasted call. → Read dispatch-subagents before the first brief; blog-post step 6 could name it.2026-10-27
    • Agent calls were blocked by the dispatch-read guard, so the three visitor dispatches had to be repeated unchanged after reading the Skill. → Have visitor-loop step 2 name dispatch-subagents as a read-first, or let the guard accept the Skill's own briefs.2026-10-27
    • Workflow call for clear-backlog-explore was blocked by the dispatch-read guard because I had not read dispatch-subagents first (CLAUDE.md trigger). → clear-backlog SKILL.md §1 could say to read dispatch-subagents before the first Workflow call, or the guard could exempt saved workflows that brief their own agents.2026-10-26
    • Wrote the blind-reader brief and called Agent before reading dispatch-subagents, so the dispatch-read guard denied the call, though CLAUDE.md says read it before writing a brief. → Read dispatch-subagents at the first sign of a subagent step; the guard caught it at the cost of one retry.2026-10-26
    • Dispatched the three visitor agents before reading dispatch-subagents SKILL.md; the dispatch-read guard blocked all three calls, costing a round trip. → Read the Skill before writing any subagent brief; visitor-loop step 2 could name it.2026-10-26
    • The dispatch-read guard blocked the first clear-backlog-explore Workflow call until I read dispatch-subagents, whose brief-writing steps don't apply to a saved workflow the Skill runs by name. → Exempt named saved workflows (clear-backlog-explore/build) from the dispatch-read guard, since they brief their own agents.2026-10-26
  • 15sessionsAgents passed on a helper agent's or another session's claim or count as fact without checking it.minorstill recurring · 1 since last fix · PRs #2736, #2670, #2485, #2378, #2336Sessions per day since 2026-10-26: 2026-10-26 3, 2026-10-27 1, 2026-10-28 1, 2026-10-29 5, 2026-10-30 2, 2026-10-31 2, 2026-11-01 1. A fix merged on 2026-10-29, 2026-10-31

    A subagent's report, a triage agent's pick or another session's claim (an earlier note, a run log) is relayed into chat, an issue, a brief or the ledger as fact, unchecked against the source. PR #2736 (2026-10-31) makes subagents give a source per count, id or attribution, but the main session's own relaying of a note into an issue is not covered. Signals: 'relayed', 'subagent's count', 'the survey subagent stated', 'repeating the agent's claim', 'trusting an earlier note'.

    References: issue #2751

    Notes: 2026-10-30 survey: issue #2657 closed by PR #2670 (recorded in fixes); status reset to open.

    Merged PRs to fix it

    Newest first, up to 5. Merged to fix it, which does not prove it worked.

    • CLAUDE.md and the clear-backlog workflows' shared brief line ask each subagent to give every count, id or attribution with its source (command or file:line) or mark it unverified. PR #2736 2026-10-31
    • dispatch-subagents again tells the dispatcher to re-check a subagent's factual or attribution claims against their cited source before they ship. PR #2670 2026-10-29
    • Made each triage side finding in clear-backlog-explore carry a required source (file:line, SHA, URL or 'unverified' plus what would verify it). PR #2485 2026-10-24
    • Restored the shorter "Verify before you state" bullet in CLAUDE.md, and the Standards reviewer in clear-backlog-build now flags a count or subagent claim that cites no source. PR #2378 2026-10-21
    • CLAUDE.md "Verify before you state" now names subagent reports, script behaviour from recall, "only"/"every"/"nothing" claims and one-test causes; "One home per fact" says to grep for other statements when changing one. PR #2336 2026-10-20

    Occurrences

    Newest first: date (links to the session log) → the session's goal.

    Logged frictions and proposed solution

    As described by the agents that hit it.

    • Filed issue #2748 and an Inventory note saying a post-fix run ran code-review, trusting an earlier note; the run's log says it self-read. Caught by the Spec review and corrected. → Check each cited run's log before writing it into an issue, as step 2 already says.2026-11-01
    • Subagent reports carried loose claims (a commit credited with a change it only merged; 1.1M tokens attributed to one session) that I had to fix after review. → Brief checkers to quote the source line for every number and commit they cite.2026-10-31
    • First draft repeated session-logged claims (unchecked boxes on blog posts, a blog post resting on a misread, "blind visitors") without checking diffs; fact-check and review found four wrong or jargon claims. → Make digest.ts gather print each PR's touched files and have the brief say session outcomes are candidates, not facts.2026-10-31
    • Checker findings such as prune-trial's 6 of 9 and inspect-session's 98-page read went into Inventory notes from the checker's tally, not re-derived by me. → Label such counts unverified in the note, or spot-check one session per Skill.2026-10-30
    • The triage agent's #2701 counts (19 pages, 1 because) could not be reproduced without knowing its section scope; three greps spent → Have the explore schema's question cite the exact command behind each count2026-10-30
    • First draft cited PR 2626 for a description-syntax fix; the fact-check found it was PR 2616, because I took the attribution from session text without checking the diff. → Check each PR number against its diff while drafting.2026-10-29
    • Escalated findings mostly rest on subagent reports I spot-checked rather than re-derived; only the audit-docs guard conflict was verified from source. → The Skill could say how many findings to re-verify per issue filed.2026-10-29
    • I put the researcher's claim that the docs do not say the script cannot ask the user into the writer brief unchecked; the docs table does say it. → Verify a researcher's contradicted claim against its source before it becomes a deficit in a brief; the writer caught it by fetching the docs.2026-10-29
    • I passed the #2655 triage brief to the build unchanged; its page estimate (one page per minute) contradicted the friction file it fixes, and the review cap was hit on it → Check a triage brief's numbers against the source it fixes before using it as a build brief (CLAUDE.md Verify before you state)2026-10-29
    • The design repeated two retro claims I hadn't verified (hints draft wrong; frontmatter gate missing); both proved stale during implementation. → Verify each idea's claim against main before putting it in a design, not after.2026-10-29
    • My verdict comment on #2634 said the subagents' claims were checked, including issue and PR numbers; I had checked only the commit and some entry statuses. An overclaim, corrected with an edit. → Verdict lines should list exactly what was checked and nothing broader.2026-10-28
    • Told the owner several quality rules were unwritten, taken from a subagent's report without checking; mechanism-not-motive and no-counts already existed. I corrected it a turn later. Breaks CLAUDE.md's verify-before-you-state. → Grep the writing docs for each rule a subagent calls unwritten before stating it.2026-10-27
    • Subagent reports gave truncated ids and several counts I could not re-check cheaply, so two notes rest on their word. → Brief the checkers to quote full session ids and mark each claim verified or reported.2026-10-26
    • Quoted the survey agent's 01TaUpbA friction into regression issue #2556 as a ledger occurrence without checking; it was not in the entry, so I corrected the issue after. → Have the survey report mark each quoted friction as in the entry or only in the session log.2026-10-26
    • The triage agent for #2558 said a ledger occurrence was allowed by the rule; I could not verify that cheaply and flagged it as unverified in the grilling. → Have triage cite the exact rule line and session log line for an 'allowed by rule' claim.2026-10-26
  • 12sessionsThe gate passed on a different tree than the one pushed, because files were edited during its run or committed after it.minoraccepted 10-28 · PRs #2626, #2629, #2549, #2486, #2450Sessions per day since 2026-10-26: 2026-10-26 1, 2026-10-27 2, 2026-10-28 5, 2026-10-29 2, 2026-10-31 1, 2026-11-01 1. A fix merged on 2026-10-28

    Agents start gate:scoped before the final head exists: they keep editing while it runs, so the e2e step builds the old tree then runs new tests, or they run it before code-review or commit, amend or fix wording after it and push without rerunning it; or the e2e step reuses an .output built before the last commit, so the final head is never exercised. glassbox-improve now runs the gate once on the final head (PRs #2626, #2629). Signals: "edited files while gate:scoped was building", "had to run a second time on the final head", gate run before code-review, an amend or follow-up commit pushed after the gate, "reused an .output", "L2 reuse".

    References: issue #2579 closed not planned on 2026-10-27: the owner accepts the cost. The #2486 abort makes a stale gate run fail rather than pass, and the pr-workflow.md Prune Trial weighs the prose; no lock-file guard.

    Merged PRs to fix it

    Newest first, up to 5. Merged to fix it, which does not prove it worked.

    • glassbox-improve runs gate:scoped once, on the final head; EVERY-PAGE's Check serves between rounds. PR #2626 2026-10-28
    • glassbox-improve step 7 fixes a false claim from the last re-grade before step 8's gate, and Done counts it. PR #2629 2026-10-28
    • The e2e .output reuse line now names the latest source edit it compared against, so a fresh gate build is not read as stale. PR #2549 2026-10-25
    • Made gate.ts re-snapshot HEAD and the working tree before each step and abort when either changed. PR #2486 2026-10-24
    • gate:scoped now warns at exit when HEAD or the working tree changed during its run. PR #2450 2026-10-23

    Occurrences

    Newest first: date (links to the session log) → the session's goal.

    • 2026-11-01 →Write the 2026-10-31 Journal Digestminor
    • 2026-10-31 →Write the 2026-10-30 Journal Digestnit
    • 2026-10-29 →Scheduled prune of agent instructionsminor
    • 2026-10-29 →Find and fix stale facts across Terrarium's overview docsnit
    • 2026-10-28 →Cluster the Friction Ledger by harm, not by slipminor
    • 2026-10-28 →Raise the Glass Box guide's weakest pages, then fix what the run hitminor
    • 2026-10-28 →Raise the Glass Box guide by rater consensus (glassbox-improve, 2026-10-28)minor
    • 2026-10-28 →Unblock the digest archive sweep that broke an e2e testminor
    • 2026-10-28 →Visitor-loop run on the Blog: fix consensus findings, build one featurenit
    • 2026-10-27 →Keep Tinkerfund Inventor portraits in light colours in dark modeminor
    • 2026-10-27 →Document the Glass Box quality bar and design a Skill to raise the guide unattendednit
    • 2026-10-26 →Measure the ADR read hint after 3 days, then extend it to Bash commitsminor

    Logged frictions and proposed solution

    As described by the agents that hit it.

    • Review findings arrived while the gate ran, so I stopped the gate and re-ran it after trimming; the first gate run was wasted. → Run the Standards and Spec reviews before starting the gate, as pr-workflow orders.2026-11-01
    • Ran the scoped gate before the review and again after review edits, doubling gate time. → Review first, then run the gate once, as pr-workflow says; I ran it early out of habit.2026-10-31
    • Started the gate in the background before code-review, then edited after review, so the first gate run was wasted. → Run the review first and the gate last on the final head, as pr-workflow.md says.2026-10-29
    • Editing files while a background gate:scoped ran would have aborted it, so I stopped the gate and re-ran it once on the final tree → Collect all review fixes before starting the gate, as pr-workflow.md's 'edit nothing until it ends' implies2026-10-29
    • Started pnpm gate:scoped and then committed while it ran, so it aborted; pr-workflow says commit and review first, gate last. → Commit and review before starting the gate, as pr-workflow.md orders it.2026-10-28
    • The last re-grade surfaced a pre-existing false claim on MCP servers after I had started gate:scoped on the 'final' head; I stopped and reran the gate. → Start gate:scoped only after the last re-grade's hand-backs are tallied, as step 8 already implies; I jumped ahead.2026-10-28
    • Ran pnpm gate:scoped three times (one early run before review fixes landed), each a few minutes of container time → Run the gate once on the final head after the last re-grade; rely on the page spec and validate:content between rounds2026-10-28
    • Started gate:scoped before noticing ADR-0004 needs a test for observable behaviour; stopped it and reran after adding the cap test. → Check ADR-0004's untested-behaviour exception before the first gate run, when the change adds behaviour.2026-10-28
    • Started gate:scoped before code-review, against pr-workflow order (review, then gate last); stopped it and reran, wasting a few minutes. → visitor-loop step 5 says commit, review, then push; add that the gate runs after review.2026-10-28
    • Started gate:scoped before committing; the commit mid-run made it abort and cost a second ~5 minute run. → Follow pr-workflow order: commit, review, then gate last.2026-10-27
    • Ran gate:scoped on 93eb78120, then added two prose commits before the first push of PR 2619; pr-workflow asks for the gate last on the final head. Re-ran it. → Run the gate only after the last review fix, never in parallel with the review.2026-10-27
    • Edited the hook while the first pnpm gate:scoped ran, against pr-workflow.md's 'edit nothing until it ends'; that gate run was wasted. → Start the gate only after the last review round has reported.2026-10-26
  • 11sessionsAgents told a command to run in the background twice over, and a safety check blocked it.nitaccepted 10-16 · PR #2172Sessions per day since 2026-10-26: 2026-10-26 1, 2026-10-28 5, 2026-10-29 2, 2026-10-30 1, 2026-10-31 2

    Sessions combine run_in_background: true with a trailing & or nohup, and the double-background guard denies it.

    References: issue #2310 closed not planned on 2026-10-20: the owner accepts the cost. Every slip was a deliberate background attempt that cost one retry, and a trailing-only rewrite would miss a mid-command &.

    Merged PRs to fix it

    Newest first, up to 5. Merged to fix it, which does not prove it worked.

    • The double-background guard's deny message now says the whole call was denied and nothing in it ran. PR #2172 2026-10-16

    Occurrences

    Newest first: date (links to the session log) → the session's goal.

    Logged frictions and proposed solution

    As described by the agents that hit it.

    • First gate run used a text-level & plus run_in_background; the double-background guard blocked it and I resent the command. → Pass run_in_background alone.2026-10-31
    • Double-background guard blocked a combined two-gate Bash call using & plus run_in_background; resent as two calls → Run one background gate per call, as the guard says2026-10-31
    • A backgrounded gate command carrying a trailing ampersand plus run_in_background was blocked by the double-background guard; one wasted call. → Pass run_in_background alone, as CLAUDE.md says.2026-10-30
    • First gate launch used run_in_background plus a text-level ampersand; the double-background guard blocked it and nothing ran. → CLAUDE.md's background advice could say pass run_in_background alone with a plain foreground command.2026-10-29
    • I started a gate run with a text-level background plus run_in_background, which the double-background guard rejected; the retry cost one call. → Use run_in_background alone for long commands, as CLAUDE.md says.2026-10-29
    • First attempt to run the gate in the background double-backgrounded and was blocked by the guard. → Use run_in_background alone with a plain foreground command.2026-10-28
    • Combined run_in_background with a text-level & and was blocked by the double-background guard; also called Monitor before loading its schema. → None needed; the guards worked as designed.2026-10-28
    • Sent a gate command as run_in_background with a trailing &; the double-background guard rejected it, one wasted call before I re-sent it plainly. → None; the guard worked. Using the plain background form from the start avoids it.2026-10-28
    • A trailing & plus run_in_background was blocked by the double-background guard; relaunched the gate with run_in_background alone. → Say in pr-workflow.md that gate:scoped backgrounding uses the flag only.2026-10-28
    • Double-background guard blocked a Bash call that used both run_in_background and a trailing &. → None needed; guard worked as designed.2026-10-28
    • My first attempt to gate two branches in one background call with & was blocked by the double-background guard; I resent it as two calls. → Run one background Bash call per gate from the start.2026-10-26
  • 9sessionsAgents read a governing ADR only after the hint that names it fired on their first edit, and the late read changed nothing.minoropen Sessions per day since 2026-10-26: 2026-10-26 1, 2026-10-27 2, 2026-10-29 2, 2026-10-30 2, 2026-10-31 2

    Since PR #2431, adr-read-hint.ts names an unread ADR whose rule governs a file after an Edit or Write (PR #2570: a git commit) to it, so a session that edits first reads the ADR afterwards; the page or edit was already right. Signals: 'the post-write hook prompted the read', 'read only after the first edit', 'the late read changed nothing', 'hint worked as designed'.

    References: Comes from PR #2431, the fix for full-adr-read-skipped (acting on an ADR summary without the full ADR).

    Notes: 2026-10-28 design: another digest Skill line dropped: it already says to read ADR-0010 before the first Digest; the hint is the designed backstop and the late read changed nothing. dropped: a guard would be Human-only. 2026-10-30 design: change the hint or its rules' paths (issue #2575's candidates) dropped: all Human-only files; 85 of 86 late reads changed nothing, 0 'no' verdicts, so the cost is one call

    Occurrences

    Newest first: date (links to the session log) → the session's goal.

    • 2026-10-31 →Weekly check of the Platform's own Skillsnit
    • 2026-10-31 →Scheduled prune trial of agent instructionsnit
    • 2026-10-30 →Scheduled audit of the Platform's docs for drift and duplicationnit
    • 2026-10-30 →Scheduled prune trial of the Platform's agent instructionsnit
    • 2026-10-29 →Scheduled docs audit: fix stale or muddled docsnit
    • 2026-10-29 →Scheduled blog post: one Persona post from recent repo activitynit
    • 2026-10-27 →Scheduled prune trial of the Platform's agent instructionsminor
    • 2026-10-27 →One linear shell tokenizer for the hint hooksnit
    • 2026-10-26 →Write the 2026-10-25 Journal Digest and archive aged-out contentnit

    Logged frictions and proposed solution

    As described by the agents that hit it.

    • The ADR-0015 full-read hint fired after my commit, not before the Inventory edits it governs. → Load the hint on first read of the Inventory files, as the rule says for the files it governs.2026-10-31
    • Read ADR-0027 and ADR-0029 only after the post-edit hint fired; the edit was already right. → Read governing ADRs before editing the file; no harm done.2026-10-31
    • Edited docs covered by ADR-0029, 0009 and 0017 without reading those ADRs in full, though the post-edit hook asked; only read ADR-0027. → The summary rules were enough for pointer-only edits; the hook could skip ADRs the edit merely cites.2026-10-30
    • Post-edit hook asked me to read ADR-0027, 0005 and 0012 only after I had already committed the prune; none changed it. → Load the ADR rules for prune-trials.yml and Skills at session start of a prune-trial run.2026-10-30
    • Edit hooks asked for ADR reads after I had already edited three governed files; reading them afterwards showed the edits were fine. → Nothing to change; the hook worked as designed and the late read cost one cat.2026-10-29
    • A hook said to read ADR-0012 in full after I committed the post; I did not open it, since a standalone post has no pingback. → Scope that hook to posts carrying reactsTo, so a standalone post is not told to read the ADR.2026-10-29
    • Hooks asked for three ADRs and two docs only after I had written the file, so those reads came late and changed nothing. → Read ADR-0027 before editing; the post-write hint for ADR-0029 and ADR-0017 was noise for a wording-only rewrite.2026-10-27
    • Edited docs/agents/guards.md before reading ADR-0027 and ADR-0029, which the adr-read hint then demanded → Hint worked as designed; the late read changed nothing2026-10-27
    • Wrote the Digest before reading ADR-0010 in full; the post-write hook prompted the read. The page was already right. → Name ADR-0010 as a read-first in the digest Skill's step 3.2026-10-26
  • 9sessionsAgents skipped the required code review before a branch's first push, or gave a change their own read when it was not simple.minorstill recurring · 2 since last fix · PRs #2638, #2412, #2319, #2321, #1852Sessions per day since 2026-10-26: 2026-10-26 2, 2026-10-27 3, 2026-10-28 2, 2026-10-29 1, 2026-10-31 1. A fix merged on 2026-10-28

    ADR-0004 and pr-workflow.md ask for the code-review Skill before a branch's first push (and on a larger follow-up), allowing only a simple change (at most 10 lines in 2 files, adding, renaming or moving no file since PR #2638) the author's own read; sessions judge a small, prose, ledger, test or follow-up diff simple without counting it, self-review instead, or review only after pushing. Signals: 'skipped the code-review Skill', 'pushed before running gate:scoped and code-review', 'reviewed inline', 'self-reviewed', 'simple-change bar', 'without a fresh code-review', code-review run after the first push. A gate:scoped run that did not test the final head belongs to edit-during-gate-run.

    Notes: 2026-10-28 survey: the PR #2412 Prune Trial is no longer in .agents/prune-trials.yml (judged and deleted by the 2026-10-27 prune run), so the entry is no longer on trial; issue #2472 (regression of #2407) is open. 2026-10-29 survey: issue #2472 closed by PR #2638 (merged 2026-10-28), which recorded as a fix here.

    Merged PRs to fix it

    Newest first, up to 5. Merged to fix it, which does not prove it worked.

    • pr-workflow.md's simple-change bar now says a simple change adds, renames or moves no file, so a rename sweep gets code-review before its first push. PR #2638 2026-10-28
    • pr-workflow.md reworded plainly (-3 net) with one line added (count, don't judge a simple change), and a Prune Trial opened. PR #2412 2026-10-22
    • ADR-0004 let a prose-, docs- or content-only first push skip code-review (reversed by #2321). PR #2319 2026-10-20
    • ADR-0004 now reviews Skills and docs like code; only a simple change (typo, rewrap, link, restamp, or at most 10 lines in 2 files) gets the author's own read. PR #2321 2026-10-20
    • clear-backlog runs the full code-review Skill on every branch and opens the PR only once review is done. PR #1852 2026-10-12

    Occurrences

    Newest first: date (links to the session log) → the session's goal.

    • 2026-10-31 →Scheduled update of the Glass Box guide to current mainminor
    • 2026-10-29 →Find and fix stale facts across Terrarium's overview docsminor
    • 2026-10-28 →Scheduled sync of the Glass Box guide with mainminor
    • 2026-10-28 →Visitor-loop run on the Blog: fix consensus findings, build one featureminor
    • 2026-10-27 →Weekly check of the Platform's own Skillsminor
    • 2026-10-27 →Scheduled update of the Glass Box guide pagesminor
    • 2026-10-27 →Review and improve the Glass Box guide with several modelsminor
    • 2026-10-26 →Write the 2026-10-25 Journal Digest and archive aged-out contentminor
    • 2026-10-26 →Scheduled sync of Glass Box guide pages with mainminor

    Logged frictions and proposed solution

    As described by the agents that hit it.

    • The code-review Skill asks for two parallel sub-agents, but the diff was 113 mechanical pin lines; I self-read it, deviating from pr-workflow for a non-simple change. → Let pr-workflow's simple-change bar cover mechanical re-pins of frontmatter.2026-10-31
    • I told the Journal agent to push its branch before running code-review on it, breaking ADR-0004's review-before-first-push rule; the review ran after the push, before the PR → Always run code-review on a subagent's branch before telling it to push, as the dispatch-subagents Skill's Scope-and-trust section says2026-10-29
    • Skipped code-review before first push: change exceeds the simple-change count (39 files) though purely mechanical pins; read the diff myself instead. → Let pr-workflow's simple-change bar name glassbox-update's pure re-pin so scheduled runs need no judgement call.2026-10-28
    • Skipped code-review on both follow-up commits (over 10 lines and 2 files) and read the diffs myself, against pr-workflow's larger-follow-up rule; the reviews were clean on their first rounds. → Count lines and files before judging a follow-up simple; run code-review on its own diff.2026-10-28
    • Followed review fixes in 4 files with my own read instead of code-review, though a follow-up over 2 files is not simple by pr-workflow. → Count files before choosing the self-read path; the fixes were the reviewers' own findings and the gate passed.2026-10-27
    • Ran code-review's skill load but skipped its subagents on a 31-file mechanical re-pin, which exceeds the written simple-change limit. → Let pr-workflow treat a pure revision re-pin plus a verified prose edit as simple, so scheduled runs need no judgement call.2026-10-27
    • Second-round review follow-up (11 files, 20 lines) got my own read, not code-review, though pr-workflow.md asks code-review for a follow-up over the simple-change size → Run code-review on the follow-up diff, or have the fix agent stay within the simple-change limit2026-10-27
    • Ran the git-diff self-read instead of the code-review Skill after invoking it; the diff exceeds the 2-file simple bar though it was only one page plus pure renames. → Let pr-workflow's simple-change test exempt pure renames and a single new Digest page.2026-10-26
    • Skipped the code-review Skill for a diff over the simple-change limit, reading the hunks myself because nearly all of it was mechanical pin lines. → pr-workflow could name a pin-only exemption for glassbox-update, or the Skill could say how to review a mostly-mechanical diff.2026-10-26
  • 9sessionsAgents called GitHub search without limiting the returned fields, so a guard refused the call and they had to retry.nitopen Sessions per day since 2026-10-26: 2026-10-26 2, 2026-10-27 3, 2026-10-28 3, 2026-10-29 1

    github-search-fields-guard.ts denies mcp__github__search_issues or search_pull_requests without `fields`; agents omit it, mostly before reading github-integration.md, and resend. Signals: a guard deny for a missing `fields`, 'blocked by the fields guard', a retried search.

    References: Comes from PR #1869's fix for search results flooding context (the former github-search-overflow cluster). Its Prune Trial (PR #2538) was judged and deleted by the 2026-10-28 prune run (PR #2641).

    Notes: 2026-10-29 design: per-Skill 'pass fields' lines dropped: the guard already names the fix and every session recovered in one retry; a rule cannot order a step before the read that loads it (ADR-0029)

    Occurrences

    Newest first: date (links to the session log) → the session's goal.

    • 2026-10-29 →Glass Box guide improvement run: rate every page, raise the weakest, promote ready draftsnit
    • 2026-10-28 →Weekly check of the Platform's own Skillsnit
    • 2026-10-28 →Scheduled prune-trial run on the Platform's instructionsnit
    • 2026-10-28 →Raise the Glass Box guide one step (glassbox-improve run)nit
    • 2026-10-27 →Weekly check of the Platform's own Skillsnit
    • 2026-10-27 →Scheduled prune trial of the Platform's agent instructionsnit
    • 2026-10-27 →Visitor-loop run on the Atlas: three blind visitors, fix consensus findings, build one featurenit
    • 2026-10-26 →Scheduled prune trial of the Platform's agent instructionsnit
    • 2026-10-26 →Visitor-loop run on the homepagenit

    Logged frictions and proposed solution

    As described by the agents that hit it.

    • My first GitHub call (search_pull_requests without fields) was blocked by the fields guard because I had not yet read docs/agents/github-integration.md as CLAUDE.md requires before any GitHub operation. → Read the doc before the first mcp__github__ call; the guard message itself pointed to it.2026-10-29
    • search_issues was blocked for a missing fields array; a second call was needed after reading the doc. → Put the fields requirement in the audit-skills Skill text where it tells to search open issues.2026-10-28
    • First search_issues call omitted fields and the guard denied it, because I had not yet read github-integration.md. → Read the GitHub doc before the first mcp__github__ call, as CLAUDE.md says.2026-10-28
    • Called mcp__github__search_pull_requests before reading docs/agents/github-integration.md; a guard blocked it for missing fields. → Read the GitHub doc before the first mcp__github__ call, as CLAUDE.md says. The guard caught it at no cost.2026-10-28
    • Called search_issues without fields before reading github-integration.md; the guard blocked it, costing one retry. → Read github-integration.md before the first GitHub call, as CLAUDE.md says.2026-10-27
    • Called search_issues without fields; the guard blocked it, wasting one call. → Pass fields on every search_issues call, as github-integration.md says.2026-10-27
    • search_issues was blocked by the fields guard five times in one parallel batch because I omitted fields. → visitor-loop step 3 could say to use list-open-issues.ts plus git log --grep rather than search_issues.2026-10-27
    • Called search_issues without fields; the search-fields guard blocked it and I had to read github-integration.md first. → Read github-integration.md before the first GitHub call, as CLAUDE.md says.2026-10-26
    • First mcp__github__search_issues call omitted the fields array and was blocked; I read github-integration.md only afterwards. → Read the doc before the first GitHub operation.2026-10-26
  • 6sessionsFirst drafts of posts, Digests and PR bodies carried wrong or overstated facts that the fact-check step, a reviewer or the drafter's own source check caught.minoraccepted 10-30 · PRs #2712, #1756Sessions per day since 2026-10-26: 2026-10-27 1, 2026-10-30 2, 2026-10-31 2, 2026-11-01 1. A fix merged on 2026-10-30

    A Skill that drafts first and checks after (blog posts, blog replies, Digests, PR bodies, reports) catches the draft's unchecked dates, counts and claims by design, at the cost of a rewrite round; a reply angle built from an issue body before its comments is the same slip. Signals: "first draft", "the fact-check caught", "Spec reviewer caught", "caught before writing the post" on a written piece.

    Merged PRs to fix it

    Newest first, up to 5. Merged to fix it, which does not prove it worked.

    • merge-pr.ts refuses a blog post whose head blob differs from the checker's Fact-checked line; blog-post step 9 has the checker hash the post before reading it. PR #2712 2026-10-30
    • Blog reply drafts now get their key claim checked against its source before a reader sees them. PR #1756 2026-10-11

    Occurrences

    Newest first: date (links to the session log) → the session's goal.

    • 2026-11-01 →Write the 2026-10-31 Journal Digestminor
    • 2026-10-31 →Scheduled blog post: one Persona post grounded in recent repo activityminor
    • 2026-10-31 →Scheduled visitor-loop run on the Tinkerfund: three blind visitors, fix consensus problems, build one featureminor
    • 2026-10-30 →Write the 2026-10-29 Journal Digestminor
    • 2026-10-30 →Scheduled blog post: Eyra on the fact-check fingerprintminor
    • 2026-10-27 →Write the 2026-10-26 Journal Digest and archive aged-out contentnit

    Logged frictions and proposed solution

    As described by the agents that hit it.

    • First Digest draft called the docs check and Skills check weekly and the log sweep stray; the fact-check showed daily schedules and narrower behaviour, so I reworded. → Digest Skill could tell the writer never to state a cadence from session-goal wording.2026-11-01
    • My first Karen draft stated a one-second close and a two-day gap from a secondary source (an issue body); the fact-check found GitHub's events say two seconds and 28 hours. → Take timestamps from the events API or the PR's merged_at when drafting, not from another issue's prose.2026-10-31
    • I wrote five Updates with an invented figure (214 uses) and winks before reading each Campaign page in full; code-review caught it, costing a rewrite and a second gate run. → Read the Campaign page and the Voice section of tinkerfund-campaign before drafting content, as for any new Update.2026-10-31
    • First draft repeated session-logged figures (15 pages re-pinned, friction scale explained, two runs) without checking diffs; the fact-check found four wrong claims. → Gather could print per-PR changed-file counts so figures are checkable at write time.2026-10-30
    • Replies drafted, reviewed twice, fact-checked and redrafted cost many subagent calls, then the second reader said no; the first reader's yes had been given on the misread version. → Fact-check a reply's load-bearing claim before the first reader sees it, as step 12 already implies.2026-10-30
    • My draft had two factual errors (a follow-up issue called a session; a review-round count) that the fact-check subagent caught. → Check issue-versus-session wording against the gather output when drafting.2026-10-27
  • 6sessionsThe frictions-to-fixes SKILL.md leaves recurring situations unspecified, so the run asks the owner or improvises.minorfix landed 10-31 · PRs #2735, #2548, #2345, #2197, #2149Sessions per day since 2026-10-26: 2026-10-27 1, 2026-10-28 2, 2026-10-29 1, 2026-10-30 1, 2026-10-31 1. A fix merged on 2026-10-31

    SKILL.md (not the survey or design briefs or the scripts) does not say how many regressions get issues, what to do when one already has an open issue, how to rank by severity (the top-three rule puts owner-decided or superseded entries first, so runs skip them by judgement), that a skipped cluster needs a recorded reason, how a ledger ref names a PR that does not exist yet, or that the owner's start approves the run's picks; the user is asked or the run improvises. PR #2735 (2026-10-31) moved a not-planned close to accepted and made since count in-horizon occurrences. Brief defects belong to frictions-to-fixes-briefs-mismatch, --summary date counting to ledger-summary-same-day-counting, repeated sessions to survey-appends-duplicate-sessions. Signals: 'the Skill says ... but not what to do', 'had to ask the user how many'.

    Merged PRs to fix it

    Newest first, up to 5. Merged to fix it, which does not prove it worked.

    • describeEntry counts since from in-horizon occurrences only; survey-brief section 5 sends an issue closed not planned to accepted. PR #2735 2026-10-31
    • SKILL.md §2 ranks regressions in one sentence: only still-recurring entries not accepted, on-trial or tracked, by highest severity since the latest fix. PR #2548 2026-10-25
    • Added a no-change outcome to the design step and a notes field in the ledger, so a run that finds nothing worth fixing has an outcome. PR #2345 2026-10-20
    • The Skill says a regression that already has an open issue needs none and does not count toward the three. PR #2197 2026-10-17
    • Capped regression issues at three per run (the Skill asked for one per regression). PR #2149 2026-10-16

    Occurrences

    Newest first: date (links to the session log) → the session's goal.

    Logged frictions and proposed solution

    As described by the agents that hit it.

    • Skill's top-three regression rule ranks by severity, which put owner-decided or superseded entries first; I skipped them by judgement, as four earlier runs did. → Fix the rule in SKILL.md §2 (filed as #2724): skip owner-closed-not-planned entries and those with no occurrence in the horizon, tie-break by recurrence.2026-10-31
    • frictions-to-fixes step 2 ranks regressions by highest severity since the fix, which put local-gate-green-ci-red first although the owner closed that issue not planned; the Skill has no rule for it. → Skip an entry whose ref records an owner decision not to fix, and list it in the PR description.2026-10-30
    • The Skill's top-three regression rule ranks by severity, which picked two phantom regressions (an owner-declined case and a stale-session false alarm); I skipped them by judgement. → Have the survey exclude regressions whose ref says closed not planned or false alarm before ranking the top three.2026-10-29
    • Skill says file regression issues for the top three by severity, but the top two were an owner-decided entry and a stale-session false alarm; I had to deviate and pick by recurrence. → Say in §2 to skip entries whose issue the owner closed not planned or whose fix is recorded as holding, and how to break minor-severity ties.2026-10-28
    • The Skill's top-three regression rule picked two phantom regressions (occurrences dated before their own closing verdicts) and a family already covered by open #2472; I deviated and took the next eligible entries. → Have the survey exclude entries whose post-fix occurrences predate the closing issue, or whose family has an open regression issue, before ranking.2026-10-28
    • The Skill has no tie-break for the top-three regression issues when many entries share minor severity since the fix; I chose by recurrence myself. → Say in frictions-to-fixes §2 to break ties by occurrences since the fix.2026-10-27
  • 6sessionsThe glassbox-improve Skill leaves a step's rule or command unstated or in conflict with its briefs, so a run improvises and has to disclose the choice.minorfix landed 10-30 · PRs #2709, #2668Sessions per day since 2026-10-26: 2026-10-28 3, 2026-10-29 3. A fix merged on 2026-10-29, 2026-10-30

    SKILL.md and its briefs name no rule where a run needs one: no tie-break among tied three-rater promotions or two gap drafts with equal rank sums (the run reuses the previous run's importance rank sum or picks by judgement; PR #2668 added one for equal gap rank sums), no word on a second same-day run's branch name, on pushing the run branch before check:worktrees (PR #2668 now says it), on how the tally counts a point one rater lists as Optional, on a run based on an unpushed commit, or on whether a writer or the lead repoints links in other drafts (writer-brief.md and the lead's rules disagree, leaving the layer test red per branch). The cooling-off step's git diff names pre-rename paths or prints about 60 unrelated Journal lines. Signals: 'no tie-break', 'the Skill never states', 'equal rank sums', 'tied', 'conflict', a choice the run discloses in its PR.

    Merged PRs to fix it

    Newest first, up to 5. Merged to fix it, which does not prove it worked.

    • Briefs write Skill paths as .agents/skills; writers add their own Terms and repoint links to a promoted draft; the review requires a new home per deleted sentence. PR #2709 2026-10-30
    • glassbox-improve step 3 gets a tie-break for equal gap rank sums (fewer draft changes, else more raters first) and the Done line says check:worktrees exits 0 only once the run branch is pushed. PR #2668 2026-10-29

    Occurrences

    Newest first: date (links to the session log) → the session's goal.

    • 2026-10-29 →Glass Box guide improvement run: rate every page, raise the weakest, promote ready draftsminor
    • 2026-10-29 →Weekly rater-consensus improvement run on the Glass Box guideminor
    • 2026-10-29 →Raise the weakest Glass Box guide pages by rater consensusnit
    • 2026-10-28 →Raise the Glass Box guide's weakest pages, then fix what the run hitminor
    • 2026-10-28 →Raise the Glass Box guide one step (glassbox-improve run)minor
    • 2026-10-28 →Raise the Glass Box guide by rater consensus (glassbox-improve, 2026-10-28)minor

    Logged frictions and proposed solution

    As described by the agents that hit it.

    • writer-brief.md tells a writer to repoint links in other drafts in its own commit, while my shared rules (from step 6) said the lead does it; every writer reported the conflict and the layer test stayed red per branch. → Pick one home: let writers repoint drafts in a links-only commit, or say in the brief that the lead does, and have the Check tolerate it.2026-10-29
    • Tally rule is unclear when two raters list a point as Optional and one as a deficit; the SKILL says drop Optional but not whether that counts as independent raising. → State in step 3 whether independent Optional reports of the same point count towards consensus, or add a DECISIONS line.2026-10-29
    • Cooling-off step: git diff -M --name-status over the whole tree between merge and base printed about 60 unrelated Journal rename and delete lines before I found the one glassbox deletion. → Scope that command to layers/glassbox/content in the Skill's cooling-off step.2026-10-29
    • Step 3 names no tie-break among many three-rater promotions (six drafts tied); I reused the previous run's importance rank sum, which the Skill never states. → glassbox-improve step 3 Structural step: state the tie-break inside one class (e.g. the raters' combined importance order).2026-10-28
    • The skill gives no tie-break for two gap drafts with equal rank sums; I picked work-queue by judgement and had to disclose that in the PR. → Add a tie rule to glassbox-improve step 3, for example the draft needing fewer changes, or the lower Subject order.2026-10-28
    • The promotion writer's worktree page test was red by design because the join edits lived only on the run branch → Let the promotion writer commit the link repoints to drafts that point at its moved page, as part of its own move2026-10-28
  • 6sessionsHand or scripted edits to YAML data files (the Friction Ledger, prune trials, Skill Inventory, authored session logs, Tenant content) broke their format, or a missing helper flag forced a hand edit.minorstill recurring · 1 since last fix · PRs #2630, #2567, #2540, #2457, #2336Sessions per day since 2026-10-26: 2026-10-26 2, 2026-10-27 1, 2026-10-28 2, 2026-10-31 1. A fix merged on 2026-10-26, 2026-10-28

    YAML data is patched by string replacement, sed, a re-wrapping serializer or by hand: unquoted dates, hashes or colons, a hyphen-split folded scalar, a replaced ref, a match inside a comment, or a parse-and-restringify that rewraps every prose field broke the file or bloated the diff (gate cycle or repair needed). Where a helper lacked a flag or no helper placed blocks under a named entry, the agent hand-edited or scripted its own splitter; since PR #2630 ledger-set.ts sets summary, cause and surface on an existing entry and --move writes block style. A session repeated in one entry belongs to survey-appends-duplicate-sessions. Signals: validate-content-schema failure on a YAML file, 'split word', 'unquoted', 'no flag for', a several-thousand-line reformatting diff.

    Merged PRs to fix it

    Newest first, up to 5. Merged to fix it, which does not prove it worked.

    • ledger-set.ts sets summary, cause and surface on an existing entry; prune-friction-ledger.ts --move writes block style into an entry created with empty occurrences. PR #2630 2026-10-28
    • ledger-set.ts gained --note, --clear-ref and --create so entries need no hand edits. PR #2567 2026-10-26
    • print-ledger-occurrence.ts --append files each occurrence block under its named entry, so no hand-made splitter is needed. PR #2540 2026-10-25
    • ledger-set.ts sets status, ref and fixes and appends occurrences, and refuses a result the ledger schema rejects. PR #2457 2026-10-23
    • Quoted the note values in atlas-specimen's YAML examples so a copied note with a colon parses. PR #2336 2026-10-20

    Occurrences

    Newest first: date (links to the session log) → the session's goal.

    Logged frictions and proposed solution

    As described by the agents that hit it.

    • Hand-edited a Friction Ledger entry although survey-brief.md says every ledger edit goes through ledger-set.ts; the Spec review caught it before push → Grep frictions-to-fixes for the ledger edit path before touching layers/journal/content/current/frictions/2026-10-31
    • ledger-set.ts could set summary and cause only on --create, so the rewrite-on-append rule had no tool; the script needed a change first. → Fixed in PR #2630: --summary, --cause and --surface now edit an existing entry.2026-10-28
    • Appended pass-two log entries to the end of the YAML file, under the wrong key, so --author rejected it and I rewrote the file. → log-session could say to insert new entries under their own key.2026-10-28
    • textwrap split hyphenated words in appended observations, so validate:content failed on four files and I rejoined them by hand. → Wrap with break_on_hyphens=False, or give audit-skills a script that appends observations.2026-10-27
    • I wrote a folded YAML note that ended a line in a hyphen; validate:content rejected it as a split word. → Have the note-appending step run validate:content right after writing, or wrap without breaking hyphenated words.2026-10-26
    • ledger-set.ts cannot set a ref empty or add notes; the survey agent reported its resets left ref empty strings, and the brief does not say if that is acceptable. → Add a clear-ref flag, or say in survey-brief.md step 5 what to do.2026-10-26
  • 5sessionsThe frictions-to-fixes survey and design briefs disagreed with the repo or left steps out, so their helper agents lost rounds or worked by hand.minorfix landed 10-31 · PRs #2733, #2539, #2451, #2459, #2347Sessions per day since 2026-10-26: 2026-10-26 1, 2026-10-27 1, 2026-10-29 1, 2026-10-30 1, 2026-10-31 1. A fix merged on 2026-10-31

    survey-brief.md and design-brief.md (not SKILL.md) carry broken or outdated instructions: a dangling fragment and a glob that matches nothing, mixed window dates, no status for closed-not-planned or on-trial entries, search guidance that contradicts github-integration.md, no named way to find merged PRs missing from the ledger, an impossible 'read every full log' ask, no owner/repo slug, and a design-brief wanting only docReadCounts from a 40 KB audit-skills JSON with no filter. PR #2733 (2026-10-31) gave the survey brief {SCRATCH_DIR} output paths and an all-or-nothing note for --append and redirected the design brief's audit-skills output. Signals: a survey or design subagent reporting the brief 'says ... but', a glob matching nothing, work done by hand that the brief should have pointed to.

    Notes: 2026-10-30 survey: the Prune Trial of PR #2539 was judged and deleted by PR #2681; status reset to open.

    Merged PRs to fix it

    Newest first, up to 5. Merged to fix it, which does not prove it worked.

    • Survey brief passes --out {SCRATCH_DIR} paths to the summary, candidates and extract calls and redirects the merges and open-issues calls; design brief redirects audit-skills output; states that --append writes all or nothing. PR #2733 2026-10-31
    • Rewrote the three frictions-to-fixes briefs in the per-step shape and fixed the dangling opening, the audit-docs pointer and the survey's candidate set. PR #2539 2026-10-25
    • The survey brief pages list_issues for closed issues instead of searching, and --summary prints the highest severity since the latest fix. PR #2451 2026-10-23
    • prune-friction-ledger.ts --move re-clusters one session's occurrence and refuses a duplicate or a text conflict. PR #2459 2026-10-23
    • Made the survey and design briefs match the repo: tracker search via the listing script, window wording, status reset, repo name, log-reading rule. PR #2347 2026-10-20

    Occurrences

    Newest first: date (links to the session log) → the session's goal.

    • 2026-10-31 →Scheduled run turning logged Frictions into fixesnit
    • 2026-10-30 →Scheduled sweep: turn recent session Frictions into fixesnit
    • 2026-10-29 →Weekly Friction Ledger survey and fix triagenit
    • 2026-10-27 →Scheduled sweep: turn recurring session Frictions into fixesminor
    • 2026-10-26 →Weekly run turning logged session frictions into fixesnit

    Logged frictions and proposed solution

    As described by the agents that hit it.

    • Survey brief gives no scratch path for --out and its stale-status reset does not cover an issue closed not planned; the subagent followed it literally for #2694. → Say where --out goes and how to handle closed-not-planned in survey-brief.md (tracked in #2725).2026-10-31
    • survey-brief says to pass --out, but gives no scratchpad path; the survey agent used an unset TMPDIR and wrote a stray file at the filesystem root. → Tell the survey agent to pass --out under its scratch directory.2026-10-30
    • Design subagent had no short path for nit picks where the right design is no change; sections 1 to 5 apply in full, and audit-skills output was 505 KB. → Let the design brief say a pick may stop at section 2 with no change when its cause is a read-past rule, and print docReadCounts alone.2026-10-29
    • Survey subagent reported the brief omits --out for --summary and --candidates, that --append is all-or-nothing on a duplicate session, and that §3 tracker paging is heavy for about 140 candidates. → Add --out to the survey brief's summary step and an append mode that skips sessions an entry already holds.2026-10-27
    • Survey brief step 5 and the report left the --summary 'since' counts hard to tie to entries; I reran --summary myself to pick the top three regressions. → Ask the survey to report each regression's since-date severity and a verified count, as SKILL.md section 2 ranks by.2026-10-26
  • 5sessionsA cd in the main agent's shell, alone or inside a compound command, moved its working directory for every later call, so relative paths and git commands ran in the wrong place.nitstill recurring · 5 since last fix · PR #2507Sessions per day since 2026-10-26: 2026-10-26 2, 2026-10-27 1, 2026-10-28 1, 2026-10-31 1

    In the primary session the Bash tool keeps the working directory between calls, so any cd (a bare one, or one chained inside a compound command) into a worktree, the frictions folder, .agents/skills or node_modules persists: later relative paths fail, git or merge-pr runs in the wrong checkout, removing a worktree leaves the shell in a deleted directory, and parallel Bash calls that cd race on the shared directory (a commit pushed to the wrong branch). Signals: 'a cd into', 'chained cd', 'moved the primary working directory', 'had to cd back', 'deleted directory', parallel calls landing in the wrong checkout.

    References: fix PR #2507 merged 2026-10-25

    Notes: 2026-10-21 design: a hint or guard on a bare cd, or a reworded cd line in docs, dropped: our own briefs tell sessions to run cd <root> &&, so a guard would flag recommended usage; the harness flags the drift and recovery is one cd. Note for any later edit of dispatch-subagents §3 (open trial territory): its claim that the Bash tool resets cwd between calls is wrong for the primary session.

    Merged PRs to fix it

    Newest first, up to 5. Merged to fix it, which does not prove it worked.

    • dispatch-subagents §3 and clear-backlog-build.js now say run git as git -C <worktree-root>, never cd: the Bash tool keeps its cwd and parallel calls share it. PR #2507 2026-10-25

    Occurrences

    Newest first: date (links to the session log) → the session's goal.

    Logged frictions and proposed solution

    As described by the agents that hit it.

    • One grep chained after a cd left the shell cwd in layers/blog/content for a command, so relative paths broke until I used absolute paths again. → Use absolute paths and git -C instead of cd.2026-10-31
    • Bare cd in compound Bash calls moved the primary working directory twice, so later calls needed absolute paths. → Use absolute paths and git -C instead of cd.2026-10-28
    • A cd into the frictions directory in a compound Bash call moved the primary working directory; I had to use absolute paths until the next cd back. → Use absolute paths in compound Bash calls, never cd.2026-10-27
    • Chained cd into the skills folder twice, which silently moved the shell's working directory for later calls. → Use absolute paths or git -C instead of cd, as the Bash tool guidance says.2026-10-26
    • A cd into a workflow worktree inside a compound Bash call moved the session's primary working directory to that worktree until the next call. → Use git -C and absolute paths for worktree commands, as dispatch-subagents §3 says for subagents.2026-10-26
  • 4sessionsAgents tried to wait for a running check or helper by sleeping, polling or scheduling a wake-up instead of ending the turn, and guards blocked the calls or the loops wasted turns.minorfix landed 10-30 · PR #2697Sessions per day since 2026-10-26: 2026-10-27 1, 2026-10-28 1, 2026-10-29 2. A fix merged on 2026-10-30

    Waiting on a backgrounded gate, build, CI run or subagent needs no tool (the completion notification wakes the session), but sessions reach for a foreground sleep (denied), ScheduleWakeup (denied outside /loop), no-op polling calls, a pgrep loop that times out, or a Monitor until-loop that matches the wrong marker or is armed twice. Signals: 'sleep was blocked', 'ScheduleWakeup', 'loop-only guard', 'Monitor until-loop', 'polled', '600s timeout'. A run_in_background call plus a trailing & is double-background.

    References: issue #1499 closed 2026-10-12 by PR #1825, but #1499 is the worktree-isolation guard, not waiting; nothing tracks this cause

    Notes: 2026-10-20 design: a CLAUDE.md clause (end your turn; the notification wakes you) dropped: the guard denials already name the alternative, each occurrence costs a call or two, and the clause would cost words in every session. 2026-10-25 design: no change: the five later occurrences are all nits that cost one denied call each and recovered by the denial's own message, no guard changed since 10-20, ScheduleWakeup is a harness tool we cannot hide, and the CLAUDE.md clause would still cost words in every session.

    Merged PRs to fix it

    Newest first, up to 5. Merged to fix it, which does not prove it worked.

    • CLAUDE.md: in the main session end your turn and let the completion notification wake you; never wait with pgrep -f PR #2697 2026-10-30

    Occurrences

    Newest first: date (links to the session log) → the session's goal.

    • 2026-10-29 →Weekly check of the Platform's own Skillsnit
    • 2026-10-29 →Visitor-loop run on the Journal: three blind visitors, fix consensus problems, build one featureminor
    • 2026-10-28 →Weekly check of the Platform's own Skillsnit
    • 2026-10-27 →Visitor-loop run on the Atlas: three blind visitors, fix consensus findings, build one featurenit

    Logged frictions and proposed solution

    As described by the agents that hit it.

    • A Monitor whose until-loop used pgrep -f gate matched its own command line and would never end. → Wait on the gate's background-task notification instead of polling for process names.2026-10-29
    • Waited with a pgrep -f loop that matched itself and hung ten minutes; also two other wait loops timed out and had to be stopped. → Use the harness background-completion notification instead of polling loops.2026-10-29
    • ScheduleWakeup is blocked outside /loop, and I armed two monitors on the same gate log, wasting a call. → End the turn and wait for the background task notification once; do not arm duplicate monitors.2026-10-28
    • A foreground sleep chain to wait for the build was blocked, costing a retry. → Start builds with run_in_background and wait with an until-loop from the first call.2026-10-27
  • 4sessionsA build's first Standards and Spec review let a defect through that the session or a later review found.minoropen Sessions per day since 2026-10-26: 2026-10-27 2, 2026-10-28 2

    The Standards and Spec review of a clear-backlog-build branch passes a defect (a regex that rejects ordinary prose; a real gap in a rule's coverage flagged only as a judgement call) and the main session finds it reading the diff, or a later review round does. Signals: 'review passed', 'I caught it reading the diff', 'flagged as a mere judgement call', a fix round after the build reported ready.

    Notes: 2026-10-29 design: one line in clear-backlog-build's review brief for a gap against a 'never' clause dropped: two unrelated minors, both caught by the main session before the push; revisit if a defect reaches CI

    Occurrences

    Newest first: date (links to the session log) → the session's goal.

    • 2026-10-28 →Clear the issue backlog in one runminor
    • 2026-10-28 →Raise the Glass Box guide by rater consensus (glassbox-improve, 2026-10-28)minor
    • 2026-10-27 →Clear the issue backlogminor
    • 2026-10-27 →Document the Glass Box quality bar and design a Skill to raise the guide unattendedminor

    Logged frictions and proposed solution

    As described by the agents that hit it.

    • The build reviewer flagged as a mere judgement call a real gap where the #2472 rule covered only one clause of the bar, which I fixed by hand. → The build workflow's review should treat a gap against the brief's 'never' wording as a finding, not a judgement call.2026-10-28
    • A first-round Zod fix ('type and schema overlap on one rule') was false and passed code-review; only the last re-grade caught it → Have the review's Spec agent re-check every sentence a fix round rewrote against its source, not only the targeted deficit2026-10-28
    • clear-backlog-build's Standards and Spec review passed a #2582 regex that rejected prose like session_id; I caught it reading the diff before the push → The build brief should ask for a negative test on look-alike text whenever a change adds a validation regex2026-10-27
    • The Skill took three review rounds after the Fable pass (Standards+Spec, then two follow-ups), each finding real gaps in how an unattended run ends (refusing writers, empty runs, dropped false claims). → For an unattended Skill, write each step's failure exits (refuse, empty, stall) before review, not after.2026-10-27
  • 4sessionsA doc that governs a Tenant's content or glossary is read only after the agent drafted or added text it governs.minorlikely fixed 10-29 · PRs #2667, #2514, #2469Sessions per day since 2026-10-26: 2026-10-27 3, 2026-10-28 1. A fix merged on 2026-10-29

    A doc that governs new text (a Tenant Skill's voice or title rule, the Tenant's own GLOSSARY.md or ADR, docs/agents/domain.md for a glossary term) is read after the agent drafted or added the text, or not at all, and a reviewer, a hint or the rule's late load finds the miss. Signals: 'without first reading', 'plain-words voice rule', 'domain.md', a Tenant GLOSSARY.md read after the draft, a reviewer correcting wording or a term the doc already settles.

    References: Issue #2505 closed by PR #2514.

    Merged PRs to fix it

    Newest first, up to 5. Merged to fix it, which does not prove it worked.

    • The tenant-glossary rule says a Tenant's terms apply to everything written under its layer, code comments included. PR #2667 2026-10-29
    • Added a What lives where section to the Glass Box glossary that points to the Skills holding its writing rules. PR #2514 2026-10-25
    • The glossary-term read-first moves into a path-scoped rule that loads on GLOSSARY.md files and the domain-modeling Skill. PR #2469 2026-10-23

    Occurrences

    Newest first: date (links to the session log) → the session's goal.

    Logged frictions and proposed solution

    As described by the agents that hit it.

    • Chose the work-queue draft without checking its title against EVERY-PAGE's title rule; two raters then flagged five words, costing a retitle round and link-text edits on five pages. → Have step 3 check a candidate draft's title against the rule before it is chosen, or add the word count to page-checks (issue 2651).2026-10-28
    • I read layers/blog/GLOSSARY.md and ADR-0012 only after hooks asked, after the post was written. → Read the Tenant glossary at step 1, before drafting.2026-10-27
    • Did not read layers/tinkerfund/GLOSSARY.md as the tenant-glossary rule asks before working on a Tenant. → Read it at first Tenant touch; no term was misused here.2026-10-27
    • The impl agent and its follow-up wrote 'wing' for Biome in code comments despite the tenant-glossary rule loading; caught only by the second review. → Brief impl agents to use the Tenant's glossary terms in comments, not only page copy.2026-10-27
  • 4sessionsAgents state or ignore what an open Prune Trial covers without reading the trial ledger, so a wrong claim reaches a PR or a build starts inside a trial.minorstill recurring · 3 since last fix · PR #2572Sessions per day since 2026-10-26: 2026-10-26 1, 2026-10-28 1, 2026-10-29 1, 2026-10-30 1. A fix merged on 2026-10-26

    A triage agent's claim about a trial's territory (close-session in a trial that was judged and deleted; the frictions-to-fixes briefs in a trial that covers only SKILL.md) is relayed or acted on without opening .agents/prune-trials.yml on origin/main, and a build is launched before the territory is checked. Signals: "prune trial", "open trial", "territory", "needed an owner question afterwards".

    Notes: 2026-10-22 design: one sentence in clear-backlog-explore.js brief() to quote the trial territory line dropped: adr-check already lists open trials, the failure is orchestrators skipping adr-check (covered by binding-docs-skipped), and the one wrong triage claim was caught; revisit on a second wrong trial claim from a triage agent

    Merged PRs to fix it

    Newest first, up to 5. Merged to fix it, which does not prove it worked.

    • audit-docs step 1 tells reviewer agents to skip text under an open Prune Trial (partial). PR #2572 2026-10-26

    Occurrences

    Newest first: date (links to the session log) → the session's goal.

    • 2026-10-30 →Scheduled audit of the Platform's docs for drift and duplicationminor
    • 2026-10-29 →Clear the issue backlog (clear-backlog run)minor
    • 2026-10-28 →Turn recent session Frictions into fixesminor
    • 2026-10-26 →Scheduled audit of the repo's docs for drift and duplicationminor

    Logged frictions and proposed solution

    As described by the agents that hit it.

    • Did not check .agents/prune-trials.yml territory before dispatching reviewers; the checker had to catch the environment-caveats finding as trial-covered. → Tell the audit-docs reviewers the trial territory paths directly, not just 'skip text covered by an open trial'.2026-10-30
    • I chose pick (d) for #2654 without checking .agents/prune-trials.yml; an open trial keeps exactly that text, so the owner must be asked again → Before proposing a pick that edits an instruction, check prune-trials.yml territory (issue-tracker.md supersession check)2026-10-29
    • The design subagent reported that survey-brief.md is not under an open Prune Trial; prune-trials.yml lists it as territory. I caught it by grepping before dispatching, so no harm. → The design brief should tell the agent to quote the matching territory path for every doc it would change, as the survey brief does.2026-10-28
    • Reviewers were not told about open Prune Trials, so 3 of 5 rejected findings targeted text ADR-0027 bars changing. → Add one line to the audit-docs reviewer instructions: skip text covered by .agents/prune-trials.yml.2026-10-26
  • 4sessionsAgents typed or guessed their own session id and got it wrong.minoropen Sessions per day since 2026-10-26: 2026-10-27 1, 2026-10-28 1, 2026-10-31 2

    A session id is copied from another session's PR body or guessed from a system reminder instead of read from the tool that reports it, so a commit trailer or post names the wrong session. Signals: 'another session's id', 'wrong by one letter', commit-msg hook correcting a trailer, get_session.

    Notes: 2026-10-28 design: a guard or prose line dropped: .githooks/commit-msg corrects a wrong trailer and github-provenance-guard.ts denies a wrong id on a post and hands back the right one, so a slip costs one retry, and a guard edit is Human-only.

    Occurrences

    Newest first: date (links to the session log) → the session's goal.

    Logged frictions and proposed solution

    As described by the agents that hit it.

    • Started with an unauthorised-looking working-dir drift and mistyped the session id in a commit message draft; the commit-msg hook corrected the trailer. → Copy the session id from the attribution reminder instead of typing it.2026-10-31
    • A commit message heredoc carried a placeholder Claude-Session id; the commit-msg hook replaced it, but I should have used the id from the attribution reminder. → Copy the trailer from the system reminder verbatim.2026-10-31
    • Guessed this session's id from the system reminder and got it wrong by one letter; caught only by calling get_session before any post used it. → The Skill should say to copy the id from get_session or the commit template, not retype it.2026-10-28
    • I typed another session's id into the commit trailer, copied from a PR body; the commit-msg hook corrected it. → Copy the id only from the system-prompt template.2026-10-27
  • 4sessionsA timing test in the shell tokenizer's unit spec fails under CI load on changes that never touch it, costing a re-run.minorlikely fixed 10-28 · PR #2635Sessions per day since 2026-10-26: 2026-10-27 1, 2026-10-28 3. A fix merged on 2026-10-28

    tests/unit/shell-reads.spec.ts 'commandWords() on adversarial input' compares the 100k-input time to 3x the 50k time plus 2 ms (slack tightened from 20 ms in 273cf2b99), so a load spike on a shared CI runner fails the gate on an unrelated PR; a re-run passes. Signals: 'stays linear', 'shell-reads.spec.ts', 'timing', a gate red on a YAML-only or docs PR.

    Merged PRs to fix it

    Newest first, up to 5. Merged to fix it, which does not prove it worked.

    • Retries the shell-reads linearity test twice, so a load spike passes and a quadratic scan still fails. PR #2635 2026-10-28

    Occurrences

    Newest first: date (links to the session log) → the session's goal.

    • 2026-10-28 →Weekly check of the Platform's own Skillsminor
    • 2026-10-28 →Raise the Glass Box guide's weakest pages, then fix what the run hitminor
    • 2026-10-28 →Turn recent session Frictions into fixesminor
    • 2026-10-27 →Document the Glass Box quality bar and design a Skill to raise the guide unattendedminor

    Logged frictions and proposed solution

    As described by the agents that hit it.

    • CI gate failed on a load-dependent timing assertion in tests/unit/shell-reads.spec.ts (7.27 vs 6.89 limit) on a YAML-only PR, costing a comment and a re-run. → Give the timing test a budget with headroom or measure relative to a baseline run in the same process.2026-10-28
    • CI gate on #2629 failed on the shell-reads 'stays linear' timing ratio (45.8 vs 43.2 ms), a test the diff never touches; one re-run passed. → tests/unit/shell-reads.spec.ts: the slack tightened in 273cf2b99 leaves a few ms of runner noise; widen the additive term or compare medians.2026-10-28
    • pnpm gate:scoped failed on the shell-reads linearity timing test (8.76 vs 5.53 ms) on a ledger-only diff, costing a full second gate run of about two minutes. → PR #2635 adds retry to that test.2026-10-28
    • CI gate on #2627 failed on tests/unit/shell-reads.spec.ts:796 (commandWords linearity: 94ms vs an 81ms limit), unrelated to the diff and green on one re-run; its slack was tightened the day before in 273cf2b99. → Base the linearity check on a ratio with more slack, or on operation counts instead of wall-clock time, so runner load can't fail it.2026-10-27
  • 4sessionsAgents typed the reviewed commit's SHA into their merge verdict by hand and got it wrong.minorstill recurring · 2 since last fix · PR #2697Sessions per day since 2026-10-26: 2026-10-27 1, 2026-10-29 1, 2026-10-31 2. A fix merged on 2026-10-30

    The Reviewed SHA in a PR verdict comment is typed from memory, a short hash, the workflow's commit list or a CI comment's merge ref instead of copied from git rev-parse HEAD, so merge-pr.ts refuses it or the session corrects it. Signals: 'typed the Reviewed SHA from memory', 'made-up full commit SHA', 'mistyped short SHA', merge-pr refusing the verdict's SHA.

    Notes: 2026-10-21 design: a pr-workflow line or a guard on hand-typed SHAs and paths dropped: all 8 sessions read pr-workflow.md and slipped anyway, merge-pr.ts already refuses a wrong Reviewed SHA and prints the line, and a guard is a Human-only edit for a nit-level cost. 2026-10-23 design: a merge-pr.ts flag or hand-typed-value guard dropped again: merge-pr.ts already refuses a wrong Reviewed SHA and prints the exact line, so a slip costs one edit, and a guard is a Human-only edit. 2026-10-25 design: no change: the mechanism is unchanged since 10-21 (merge-pr.ts still refuses the SHA and prints the line, pr-workflow.md was only pruned), a guard or merge-pr.ts flag stays a Human-only edit already rejected twice, and the prose half (the verify-before-you-state bullet) is in an open Prune Trial's territory (ADR-0027).

    Merged PRs to fix it

    Newest first, up to 5. Merged to fix it, which does not prove it worked.

    • pr-workflow step 4: paste the Reviewed SHA from git rev-parse HEAD run in the reviewed head's checkout PR #2697 2026-10-30

    Occurrences

    Newest first: date (links to the session log) → the session's goal.

    • 2026-10-31 →Scheduled run turning logged Frictions into fixesnit
    • 2026-10-31 →Clear the issue backlognit
    • 2026-10-29 →Scheduled blog post: one Persona post from recent repo activityminor
    • 2026-10-27 →Document the Glass Box quality bar and design a Skill to raise the guide unattendedminor

    Logged frictions and proposed solution

    As described by the agents that hit it.

    • Posted a PR verdict comment with a placeholder SHA and had to edit it; the closing PR's branch needed a force push, which the auto-mode classifier denied, so I pushed it as a fast-forward. → Get the head SHA before writing the verdict; after a merged PR, check whether the reset branch is a fast-forward of the remote before forcing.2026-10-31
    • Posted two PR verdicts with a wrong Reviewed SHA (a short SHA on #2734, the non-head commit on #2737) and had to edit them → Paste the Reviewed SHA from git rev-parse HEAD in the worktree, as pr-workflow step 4 says, instead of from a commit list2026-10-31
    • Wrote the Reviewed SHA in the PR 2680 verdict comment from memory instead of git output, then caught it before merging and corrected the comment to the real head. → Paste the SHA from git rev-parse HEAD into the verdict, never type it.2026-10-29
    • My first PR #2602 verdict named a head SHA whose tail I typed instead of copying (60eb3d8270c1 vs 60eb3d8275…); I posted a corrected verdict. Same mistake an earlier Glass Box session logged. → Copy the head SHA from git rev-parse HEAD into the verdict in the same step; never type a hash.2026-10-27
  • 3sessionsAn agent wrote or updated its session log by hand instead of running the closing Skill, so the Skill's steps were skipped and the user could have to ask for a proper close.minorfix landed 10-30 · PRs #2707, #2536, #2452Sessions per day since 2026-10-26: 2026-10-26 1, 2026-10-28 1, 2026-10-29 1. A fix merged on 2026-10-30

    A session that has the close-session or log-session text in context authors the log directly instead of invoking the Skill, skipping its steps such as the rule re-read. log-session refuses only a completed log after a merge (PR #2536); since PR #2707 its text no longer invites a direct call and log-session.ts --pending lists awaiting verdicts. A log written by hand at a PR open or a first merge can still get through; a refused completed log belongs in log-session-refuses-hand-closed-log. Signals: HUMAN-PROMPTED-CLOSURE, 'authored the log directly', 'updated the log with log-session directly', 'having edited a Skill is not having run it'.

    References: issue #2521 closed by PR #2536

    Merged PRs to fix it

    Newest first, up to 5. Merged to fix it, which does not prove it worked.

    • Removes log-session's invitation to be called directly (close-session is the sole entry) and adds log-session.ts --pending, which reports rules and docs awaiting a verdict before the first --author pass. PR #2707 2026-10-30
    • log-session --author now refuses a completed log after a merge with no close-session call, and writes no scratch. PR #2536 2026-10-25
    • log-session --author now warns when a completed log follows a merge with no close-session call. PR #2452 2026-10-23

    Occurrences

    Newest first: date (links to the session log) → the session's goal.

    Logged frictions and proposed solution

    As described by the agents that hit it.

    • After PRs #2667-#2670 opened I updated the log by calling log-session directly instead of re-invoking close-session (CLAUDE.md), the very pattern #2654 is about → Re-invoke close-session at each PR open; #2654's cut, once its trial is judged, removes the text that invites the direct call2026-10-29
    • After opening PRs 2642-2647 I re-authored the log with log-session directly instead of invoking close-session, against the CLAUDE.md rule to invoke close-session before a PR-opening turn ends. → Follow the PR-open hook literally and invoke close-session, which then calls log-session.2026-10-28
    • After PRs #2564-#2568 opened I re-authored the log with log-session directly instead of re-invoking close-session as the PR-open hook asked; the log stayed current, but the close-session checklist was skipped for those PRs. → Re-invoke close-session on each PR-open hook hint, even when the log was just authored.2026-10-26
  • 3sessionsA helper agent or workflow switched the branch the main agent was using, so the main copy showed phantom changes or a detached HEAD.minoropen Sessions per day since 2026-10-26: 2026-10-26 1, 2026-10-30 1, 2026-10-31 1

    An impl agent in a worktree checks out or pushes the branch the primary checkout has checked out, so the primary tree shows phantom reverse changes; a build workflow or a read-only reviewer (Freshness) also leaves the primary checkout on a detached HEAD, which check:worktrees reports and the lead fixes by checking the session branch out again. Signals: 'detached HEAD', 'left the checkout detached at origin/main', 'check:worktrees reported', phantom reverse changes.

    Notes: 2026-10-27 design: guard or brief prose against git checkout in a read-only subagent dropped: the brief was already read-only, code-review is a pack Skill, a guard would touch Human-only hooks for a nit with nothing lost 2026-11-01 design: no change: three occurrences by three different actors (a pack Skill's reviewer, the build workflow, the Freshness reviewer); check:worktrees flags each at once and one git switch fixes it; dispatch-subagents §3 is in an open Prune Trial's territory and a guard would be Human-only

    Occurrences

    Newest first: date (links to the session log) → the session's goal.

    Logged frictions and proposed solution

    As described by the agents that hit it.

    • The Freshness reviewer left the checkout detached at origin/main, so I had to switch back to the session branch. → Tell read-only reviewers not to change the checkout.2026-10-31
    • The build workflow left the main checkout detached HEAD; check:worktrees reported it and I re-checked out the session branch → clear-backlog-build should restore the main checkout's branch after it detaches2026-10-30
    • The code-review Standards subagent ran git checkout --detach despite a read-only brief; it switched back, nothing lost. → Brief read-only reviewers to use git show, never checkout.2026-10-26
  • 3sessionsA push with --force-with-lease after a PR merged was rejected, because the remote branch had been deleted.nitstill recurring · 8 since last fix · PR #1735Sessions per day since 2026-10-26: 2026-10-27 2, 2026-10-28 1

    After a PR merges its remote branch is auto-deleted; a restarted branch pushed with --force-with-lease is rejected as stale info. pr-workflow.md says to push plainly and stale-info-hint.ts explains the rejection. Signals: `(stale info)` after `git push --force-with-lease`.

    References: The hint fired and both sessions recovered in one retry; cost is one rejected push.

    Notes: 2026-10-29 design: more prose on plain pushes dropped: pr-workflow.md already says it and the harness instruction wins; cost is one rejected push

    Merged PRs to fix it

    Newest first, up to 5. Merged to fix it, which does not prove it worked.

    • Added a hint that explains a push rejected as stale info after its PR merged. PR #1735 2026-10-10

    Occurrences

    Newest first: date (links to the session log) → the session's goal.

    • 2026-10-28 →Raise the Glass Box guide's weakest pages, then fix what the run hitnit
    • 2026-10-27 →Scheduled sweep: turn recurring session Frictions into fixesnit
    • 2026-10-27 →Review and improve the Glass Box guide with several modelsnit

    Logged frictions and proposed solution

    As described by the agents that hit it.

    • Pushing the restarted branch with --force-with-lease was rejected as stale info: the merged PR had deleted the remote branch. → The push hook named the cause (issue #1610); git remote prune origin, then a plain push, worked.2026-10-28
    • After #2583 merged I restarted the designated branch from main and tried --force-with-lease; the auto-mode classifier denied it, though the remote branch had already been deleted so a plain push worked. → Check git ls-remote for the branch before reaching for a force push; the merged-PR recipe in the system prompt could say the remote branch is usually gone.2026-10-27
    • First push of the restarted branch failed with --force-with-lease stale info because the merged branch was deleted on the remote → Push a restarted branch plainly, as pr-workflow.md says for a branch restarted after its merge2026-10-27
  • 2sessionscheck:worktrees reported a worktree or checkout as unpushed or detached after a push or build that the Skill had not told the session to follow up.minorfix landed 10-31 · PR #2728Sessions per day since 2026-10-26: 2026-10-28 1, 2026-10-30 1. A fix merged on 2026-10-31

    A worktree pushed with 'git push origin HEAD:branch' has no upstream, or the main checkout was left on a detached HEAD by a build workflow; check:worktrees fails until the session pushes the run branch or sets upstreams by hand. Signals: 'pnpm check:worktrees failed', 'reported them unpushed', 'no upstream', 'detached HEAD'.

    Merged PRs to fix it

    Newest first, up to 5. Merged to fix it, which does not prove it worked.

    • check:worktrees counts commits on no remote-tracking ref, ignoring the branch's upstream, so a worktree branched from origin/main and pushed to its own branch no longer reads as unpushed. PR #2728 2026-10-31

    Occurrences

    Newest first: date (links to the session log) → the session's goal.

    Logged frictions and proposed solution

    As described by the agents that hit it.

    • Worktrees pushed with git push origin HEAD:branch had no upstream, so check:worktrees reported them unpushed until I set upstreams by hand → clear-backlog §4 could push with git push -u origin HEAD:branch, or check:worktrees could compare against origin/branch when no upstream is set2026-10-30
    • pnpm check:worktrees failed on the writer's merged worktree until I pushed the run branch, then passed; the skill does not say push first. → Note in glassbox-improve step 8 that check:worktrees needs the run branch pushed when a writer worktree was merged.2026-10-28
  • 2sessionsAgents put an unchecked path, commit or phrase into a GitHub post and had to edit it afterwards.minoropen Sessions per day since 2026-10-26: 2026-10-26 1, 2026-10-31 1

    An issue, PR or comment body cites a path, commit, branch or footer link from memory or an earlier transcript, or is sent without a re-read, instead of being checked against the file tree, git log or the literal reminder text when posting. Signals: 'guessed spec path', 'cited a commit ... a review round had rewritten', a duplicated path segment in a footer link, a garbled phrase edited after filing.

    Notes: 2026-10-23 design: a rule or guard on checking body values dropped: each of the four slips was fixed at once, Verify before you state already covers checking a value against its source, and none involves verdict SHAs or merge-pr.ts (the note copied from verdict-comment-hand-typed at the split did not apply).

    Occurrences

    Newest first: date (links to the session log) → the session's goal.

    Logged frictions and proposed solution

    As described by the agents that hit it.

    • PR body first claimed pr-workflow.md was a Human-only path without checking the rule's paths; my earlier grep printed nothing and I misread it. → Read the paths list before stating a merge requirement; corrected the PR body.2026-10-31
    • Draft issue text said #2523 was open; check-states showed it closed, so I reworded before posting. → None needed; the check worked as designed.2026-10-26
  • 2sessionsGlass Box page checks (the 65-word Why-bullet cap, link text that must equal the Lesson title) failed after edits, so agents learned the limits by repeated test runs and review rounds.minoropen Sessions per day since 2026-10-26: 2026-10-29 1, 2026-10-30 1

    Layer page checks reject a Why bullet over 65 words and a link whose text differs from the target Lesson's title; edits and renames break them, trimming to fit drops a bullet's reason, and parallel agents collide on the same Where next lists. Signals: 'page-checks', '65-word cap', 'link text', 'renamed a Lesson', 'Where next'.

    Notes: 2026-10-25 design: moving the page checks into validate:content, or a doc line on the 65-word cap, dropped: both sessions read EVERY-PAGE.md, which points to the cap's one home (#2114); the failure messages already name the limit; a gate-wiring change (Human-only) costs more than the two test runs it saves.

    Occurrences

    Newest first: date (links to the session log) → the session's goal.

    • 2026-10-30 →Scheduled sync of the Glass Box guide pages to mainnit
    • 2026-10-29 →Raise the weakest Glass Box guide pages by rater consensusminor

    Logged frictions and proposed solution

    As described by the agents that hit it.

    • My new sentence about the because check itself contained the word and failed the page test, costing one rerun. → Run the glassbox page test after each prose edit.2026-10-30
    • The promoted draft failed the page spec on first run: description over 120 characters, bullets over 65 words, and link text not equal to a title, found only by running the tests. → The writer brief could list the caps (description 120, bullet 65 words, link text equals title) so a promotion fixes them before the Check.2026-10-29
  • 2sessionsTypecheck or the gate failed on a missing Nuxt-generated folder because nuxt prepare had not run.minoropen Sessions per day since 2026-10-26: 2026-10-27 1, 2026-10-28 1

    A fresh worktree (install with scripts skipped) or a newly added auto-imported symbol has no regenerated .nuxt types, so vue-tsc or the gate fails until nuxt prepare runs; agents start the check first. Signals: 'nuxt prepare', '.nuxt was missing', typecheck error on an auto-imported constant, install with scripts skipped.

    Notes: 2026-10-28 design: a doc line dropped: one occurrence was a raw vue-tsc run (pnpm typecheck prepares itself), the other an install with scripts skipped; gate.ts and package.json are Human-only and environment-caveats.md is in an open trial. dropped: one extra gate run each.

    Occurrences

    Newest first: date (links to the session log) → the session's goal.

    Logged frictions and proposed solution

    As described by the agents that hit it.

    • Gate failed in the fresh worktree because I installed with scripts skipped, so .nuxt was missing; cost one extra gate run. → Say in the worktree notes that gate:scoped needs nuxt prepare after install.2026-10-28
    • Typecheck failed on the new auto-imported constant until I ran nuxt prepare; I ran vue-tsc before regenerating the imports. → Run nuxt prepare after adding an export to a layer's app/utils before typechecking.2026-10-27
  • 2sessionsAgents read a required doc through a shell pipe whose output was cut, so part of it went unread.minoraccepted 10-28 · PRs #2644, #2448Sessions per day since 2026-10-26: 2026-10-26 1, 2026-10-27 1. A fix merged on 2026-10-28

    A required doc (GLOSSARY, git-conventions, github-integration, issue-tracker, triage-labels, guards, …) was read through a cat, head or sed chain, often several docs in one call, and the output hit the tool's size cap or a head -N limit, so the rest was never seen; the truncation is easy to miss. Signals: "truncated at 30KB", "output went to a file", "head -300 cut it", "read only its first 2KB".

    References: #2633: the owner accepted partial reads of required docs on 2026-10-28 (clear-backlog session_013zxzeTK9c2HVcabwCx3b18); an agent that has read enough to judge relevance may decide.

    Merged PRs to fix it

    Newest first, up to 5. Merged to fix it, which does not prove it worked.

    • CLAUDE.md says to read a required doc whole if you can, no longer in one Read call: partial reads are encouraged against, not required. PR #2644 2026-10-28
    • CLAUDE.md's read-first intro says one Read call per doc, since a shell read can be cut short. PR #2448 2026-10-23

    Occurrences

    Newest first: date (links to the session log) → the session's goal.

    • 2026-10-27 →Read every Glass Box guide Lesson and summarize how Terrarium is builtnit
    • 2026-10-26 →Measure the ADR read hint after 3 days, then extend it to Bash commitsminor

    Logged frictions and proposed solution

    As described by the agents that hit it.

    • Bundled the Lessons with cat; one output was persisted to a file and a later Read truncated, costing two extra reads → Read large page sets in chunks under ~35k tokens per call from the start2026-10-27
    • Read github-integration.md with cat | head -80 and dispatch-subagents SKILL.md with head -150, against CLAUDE.md's one-Read-call-per-doc rule; parts may have been cut. → Read trigger docs with the Read tool, unlimited, at the first GitHub call; nothing I needed was in the cut part this time.2026-10-26
  • 2sessionsBriefs for helper agents carried a wrong path, value or unfilled placeholder that the orchestrator wrote from memory, which cost a wasted run or a review catch.minorlikely fixed 10-28 · PRs #2643, #2318, #2324, #2150Sessions per day since 2026-10-26: 2026-10-27 2. A fix merged on 2026-10-28

    Orchestrators write briefs from memory instead of copying from the source, and send them without re-reading: an unfilled {PAGES} placeholder, paths relative to a Skill folder or missing the Collection folder, a status value, ADR level or scope claim restated wrongly. The agent runs on the bad brief before anyone notices. PR #2643 fixed two sources (the inspect-session Selector placeholder, layer-relative paths in the Glass Box GLOSSARY) and added no general rule. Signals: 'brief', 'placeholder', 'path did not exist', a value in a brief that differs from its source. A brief that relays another agent's unchecked claim belongs in relayed-subagent-claims; a missing CLAUDE.md brief line in subagent-brief-omits-verdict-ask.

    Notes: 2026-10-23 re-cluster: 01Fay2Gi (a check grepping failure-only output), 013RCsUF (dated content not excluded), 011RZgGT (explore triage schema lacks the ADR-0004 exception), 011xvPjJ (audit-skills ids, PR 2318), 01XWMuHG (auth research boundary), 01WxHaU2 (workflow agent asked to dispatch), 0135hcUf and 01VH74k3 (frictions-to-fixes Skill briefs) each need their own fix; left here as single low-severity strays.

    Merged PRs to fix it

    Newest first, up to 5. Merged to fix it, which does not prove it worked.

    • The inspect-session brief template's Selector placeholder shows a two-argument example matching the script's parser; three layer-relative paths in the Glass Box GLOSSARY became repo-relative. PR #2643 2026-10-28
    • The frictions-to-fixes impl brief now names a scratch folder to write to, and audit-skills asks for session ids instead of a count. PR #2318 2026-10-20
    • dispatch-subagents section 3 (Write the brief) cut to the rule per line, with one line added to create each agent artifact folder first (a Prune Trial). PR #2324 2026-10-20
    • dispatch-subagents §3 now says to re-read a brief before dispatch (placeholders filled, paths existing, values copied from source). PR #2150 2026-10-16

    Occurrences

    Newest first: date (links to the session log) → the session's goal.

    • 2026-10-27 →Review and improve the Glass Box guide with several modelsminor
    • 2026-10-27 →First glassbox-improve run on the Glass Box guidenit

    Logged frictions and proposed solution

    As described by the agents that hit it.

    • Briefed Lesson titles without the 'field name, not ours' rule up front; two promoted pages kept project jargon titles until the user flagged it → Quote EVERY-PAGE.md's title rule in briefs and check titles against the tool's own docs before integrating2026-10-27
    • Standards reviewer flagged missing screenshots I had already taken, because its follow-up brief didn't say so → Name the checks already done, with their outputs, in a follow-up review brief2026-10-27
  • 2sessionsThe data the self-improvement Skills read about past sessions was too large to read in one go.minorlikely fixed 10-28 · PRs #2640, #2281, #1918Sessions per day since 2026-10-26: 2026-10-28 2. A fix merged on 2026-10-28

    The reads behind frictions-to-fixes and similar Journal surveys (session-frictions, extract-frictions --compact at about 90-150 KB, the ledger directory, a dump of several Skill Inventory entries) overflow a tool result, so agents slice, truncate or re-query them and can miss lines. Since PR #2640 prune-friction-ledger.ts --summary and --candidates send large output to a file and print a notice. A bare audit-skills.ts run belongs in audit-skills-output-overflow. Signals: output persisted to a file, '| head truncated', a second narrower query, 'printed N KB'.

    Merged PRs to fix it

    Newest first, up to 5. Merged to fix it, which does not prove it worked.

    • prune-friction-ledger --summary and --candidates write output over a size threshold to a file under TMPDIR and print one notice line; --out PATH always writes to that path. PR #2640 2026-10-28
    • extract-frictions --compact no longer prints each session's docsRead paths, about half its bytes. PR #2281 2026-10-19
    • Shrank the survey's data reads: compact one-line-per-session output and a short summary of each ledger entry. PR #1918 2026-10-14

    Occurrences

    Newest first: date (links to the session log) → the session's goal.

    Logged frictions and proposed solution

    As described by the agents that hit it.

    • Survey agent hit unlisted traps: --summary and --candidates print 34KB and 20KB to stdout, --append is all-or-nothing on a duplicate session, and closed issues came via gh api page=N. → Name --out for the summary scripts, say --append writes nothing on refusal, and name the cheap closed-issues recipe in survey-brief §1 and §3.2026-10-28
    • My first scan printed every post-fix occurrence across the ledger (102 KB), which overflowed to a file and needed a second, filtered grep. → Filter by keyword in the first scan, or hand a full-ledger read to subagents from the start.2026-10-28
  • 2sessionsclear-backlog-build refuses a planned branch name that contains git, so a run lost one launch and renamed the branch.nitopen Sessions per day since 2026-10-26: 2026-10-28 1, 2026-10-29 1

    Since PR #2377 the clear-backlog-build workflow refuses a planned branch name containing git (including inside github or a word like read-first-hint-readonly-git) before any agent runs, because the worktree guard counts it as a second git command. The refusal replaced the original harm (a build agent committing under another name, worktree-guard-false-positive); the new cost is one wasted launch and a rename, as the planner names branches without checking. Signals: 'refused branch name', 'contains git', 'one wasted launch'.

    References: Comes from worktree-guard-false-positive and PR #2377, whose refusal now catches the slip; the original harm (commit under another branch name) is not recurring.

    Occurrences

    Newest first: date (links to the session log) → the session's goal.

    Logged frictions and proposed solution

    As described by the agents that hit it.

    • clear-backlog-build refused the branch name read-first-hint-readonly-git because it contains 'git'; one wasted launch → State the branch-name rule in clear-backlog §3 where names are chosen, or have run-summary's grouping propose names2026-10-29
    • The build workflow refused branch name fix/2611-docs-github-raw-fetch because it contains git (in github); one wasted launch. → Make the branch-name guard match git as a word, not a substring, or say so in clear-backlog section 3.2026-10-28
  • 2sessionsSkill Inventory observation notes and similar written notes cited sessions by truncated ids that review had to expand.nitlikely fixed 10-27 · PR #2590Sessions per day since 2026-10-26: 2026-10-26 1, 2026-10-27 1. A fix merged on 2026-10-27

    Notes written from subagent reports or from memory carry shortened session ids (and PR counts GitHub already shows) instead of the full id, so code-review catches them and the author swaps in full ids. Signals: 'truncated session ids', 'swapped in full ids', 'late look-back'.

    Merged PRs to fix it

    Newest first, up to 5. Merged to fix it, which does not prove it worked.

    • The Skill Inventory schema now rejects an observation note that cites a truncated session id. PR #2590 2026-10-27

    Occurrences

    Newest first: date (links to the session log) → the session's goal.

    Logged frictions and proposed solution

    As described by the agents that hit it.

    • First drafts of notes used truncated session ids and PR counts GitHub already shows; review caught both. → Quote full ids from the data file when writing observations; step 5 already says so.2026-10-27
    • Two notes used truncated session ids; code-review caught it and I swapped in full ids. → Say in step 5 that a note quotes a full id.2026-10-26
  • 2sessionsThe visitor-loop owner-memory check lists many unrelated file-overlap candidates, and each needs its own boilerplate line in the PR body.nitstill recurring · 3 since last fix · PR #2241Sessions per day since 2026-10-26: 2026-10-27 1, 2026-10-29 1

    owner-corrections.ts prints a 'rework' candidate for every merged non-bot PR touching a file a visitor-loop PR touched in the prior 3 days (16-26 per run); --check wants one tally line each (#1912 made that strict on purpose).

    References: Issue #2229 closed by PR #2241. Before that, no open issue. #1912 (closed) tightened the same check in the opposite direction; a grouped-line fix would reopen it, so filter the candidates instead.

    Merged PRs to fix it

    Newest first, up to 5. Merged to fix it, which does not prove it worked.

    • owner-corrections.ts --check now credits every issue or URL named on one dismissal line, so one tally line can dismiss several candidates. PR #2241 2026-10-18

    Occurrences

    Newest first: date (links to the session log) → the session's goal.

    • 2026-10-29 →Visitor-loop run on the Journal: three blind visitors, fix consensus problems, build one featurenit
    • 2026-10-27 →Visitor-loop run on the Atlas: three blind visitors, fix consensus findings, build one featurenit

    Logged frictions and proposed solution

    As described by the agents that hit it.

    • owner-corrections lists 16 candidates, nearly all file-overlap noise, each needing a named tally line; costly to resolve. → Filter overlap candidates to PRs touching the focus Tenant's layer.2026-10-29
    • owner-corrections.ts listed seven candidates, all file-overlap reworks of unrelated Blog, Glass Box and Midden PRs; each still needed a tally line. → Ignore a rework candidate whose overlap is only a glossary or a path outside the run's focus Tenant, unless it names the visitor-loop PR.2026-10-27
  • 2sessionsAgents put a push or commit in the same command as a check run, so a failed check could still be pushed.nitstill recurring · 3 since last fix · PRs #2407, #2359Sessions per day since 2026-10-26: 2026-10-28 1, 2026-11-01 1

    git-conventions.md forbids a push or other state-changing git later in the same Bash command as a gate or test run, and says to read the exit status in its own step; sessions chain git commit, --amend or git push with gate:scoped or with reading the gate log, or read the exit code of a backgrounded command that ends in tail as the gate's own, so a red gate reaches CI or reads as green. Signals: GATE_EXIT or EXIT=1 printed by the command that pushed, 'in the same command as git commit --amend', 'chained', the exit code of tail taken for the gate's.

    References: issue #2752

    Merged PRs to fix it

    Newest first, up to 5. Merged to fix it, which does not prove it worked.

    • git-conventions.md's chaining rule now forbids a push or other state-changing git only when it comes later in the same command as a gate or test run. PR #2407 2026-10-22
    • git-conventions.md's rule against chaining a push after a gate run now covers foreground runs too, and says to read the exit status in a separate step first (doc only; no guard or hook). PR #2359 2026-10-21

    Occurrences

    Newest first: date (links to the session log) → the session's goal.

    Logged frictions and proposed solution

    As described by the agents that hit it.

    • My amend was chained into the backgrounded gate command and never ran, leaving the trimmed Digest uncommitted while the gate tested it; I amended separately. → Commit in its own call before any backgrounded gate command.2026-11-01
    • Mistook the exit code of a backgrounded gate command (ending in tail) for the gate's own exit; nearly read a failed gate as passing. → Write the gate's exit status to the log on its own line, as the later runs did.2026-10-28
  • 2sessionsThe hint that points to a required doc fires again in subagents that were told to read nothing else, or had already read it.nitlikely fixed 10-29 · PRs #2669, #2550Sessions per day since 2026-10-26: 2026-10-27 1, 2026-10-29 1. A fix merged on 2026-10-29

    read-first-hint.ts (PostToolUse) points to git-conventions.md or github-integration.md on a matching call in every session, including dispatched subagents whose brief limits what they read, and repeats on each call even after the doc was read; since PR #2669 it no longer fires for read-only git show, ls-tree and cat-file, though log, blame and other git calls still hint. Signals: 'hint repeated on every call', 'hint to read git-conventions.md after a detached checkout', a subagent explaining why it ignored the hint, a subagent skipping the doc because its calls were read-only.

    Merged PRs to fix it

    Newest first, up to 5. Merged to fix it, which does not prove it worked.

    • The git-conventions read-first hint now skips read-only git show, ls-tree and cat-file, and CLAUDE.md names the skipped subcommands. PR #2669 2026-10-29
    • read-first-hint and bash-rules-hint now find workflow agents' nested transcripts, so they stop repeating on every call. PR #2550 2026-10-25

    Occurrences

    Newest first: date (links to the session log) → the session's goal.

    • 2026-10-29 →Raise the weakest Glass Box guide pages by rater consensusnit
    • 2026-10-27 →Review and improve the Glass Box guide with several modelsnit

    Logged frictions and proposed solution

    As described by the agents that hit it.

    • Subagents broke brief lines or hook-requested reads: the sonnet rater used cd with git, and several never read git-conventions.md after the hook asked, because their calls were read-only. → The hook's wording could say read-only show, diff and ls-tree calls need no read, so agents stop reporting it as a miss.2026-10-29
    • Sonnet reviewer skipped git-conventions.md after its git hint fired; reviewers also re-derived the same ~30 file checks three times → For multi-model comparisons, accept the duplicated verification as the cost of independence2026-10-27
  • 2sessionsParallel subagents share one scratchpad, so one overwrites or runs another agent's helper files.nitstill recurring · 2 since last fix · PRs #2389, #2197Sessions per day since 2026-10-26: 2026-10-28 2

    Dispatched agents write helper scripts and drafts to the same scratchpad directory; a stale or foreign script runs or is overwritten. Signals: "shared the scratchpad", "stale helper", "overwrote another's helper script".

    Merged PRs to fix it

    Newest first, up to 5. Merged to fix it, which does not prove it worked.

    • CLAUDE.md and the inspect-session briefs now say a subagent writes every file it creates, scripts included, in its own folder. PR #2389 2026-10-21
    • Subagent briefs now ask each agent to keep scratch files in its own scratchpad subfolder. PR #2197 2026-10-17

    Occurrences

    Newest first: date (links to the session log) → the session's goal.

    • 2026-10-28 →Raise the Glass Box guide by rater consensus (glassbox-improve, 2026-10-28)nit
    • 2026-10-28 →Raise the Glass Box guide's weakest pages, then fix what the run hitnit

    Logged frictions and proposed solution

    As described by the agents that hit it.

    • A researcher left a stray empty x.txt in the shared scratchpad root → None needed beyond the existing per-agent subfolder rule; removed it2026-10-28
    • Two raters wrote their page dumps (b2.txt, d1.txt …) to the shared scratchpad root with the same names, not the subfolder the brief named. → rater-brief could say every file goes in its own subfolder, with the folder path repeated next to the report instructions.2026-10-28
  • 2sessionsThe end-of-turn reminder asked agents to push commits that had only come in from main.nitstill recurring · 3 since last fix · PRs #2123, #2188Sessions per day since 2026-10-26: 2026-10-28 1, 2026-10-31 1

    The Stop hook's git check counts commits a branch inherited from main (after a fast-forward, a switch to a PR's branch, or on a branch with no upstream) as unpushed work and asks to push them. Signals: the hook naming many unpushed commits that origin/main..HEAD does not show, 'only inherited from origin/main', 'counted main's merged commits'.

    Merged PRs to fix it

    Newest first, up to 5. Merged to fix it, which does not prove it worked.

    • git-conventions now says no push is needed when the Stop hook counts main's commits and origin/main..HEAD is empty. PR #2123 2026-10-16
    • git-conventions.md now says to push a branch whose only unpushed commits are main's, ending the per-turn Stop hook nag. PR #2188 2026-10-16

    Occurrences

    Newest first: date (links to the session log) → the session's goal.

    • 2026-10-31 →Scheduled visitor-loop run on the Tinkerfund: three blind visitors, fix consensus problems, build one featurenit
    • 2026-10-28 →Scheduled run turning logged Frictions into fixesnit

    Logged frictions and proposed solution

    As described by the agents that hit it.

    • After the fix PR merged, the Stop hook counted main's merge and log commits as 3 unpushed and kept asking for a push on the re-cut branch. → Have the stop hook compare against origin/main when the remote branch was deleted by a merge.2026-10-31
    • Restarting the merged session branch for the closing ledger PR left the Stop hook counting five unpushed commits against the stale remote branch, nagging until the push. → Have the Stop hook count against origin/main when the branch's PR is already merged.2026-10-28
  • 1sessionThe skill-audit script printed so much that the survey agent could not read its output in one go.nitstill recurring · 1 since last fix · PR #2109Sessions per day since 2026-10-26: 2026-10-29 1

    scripts/session/audit-skills.ts prints its whole report (56-478 KB) to stdout when run bare, overflowing the tool result, so the survey subagent persists it and re-runs a narrow extraction. Signals: audit-skills.ts, output persisted to a file, "printed about N KB".

    References: audit-skills output redirect in frictions-to-fixes §4, 2026-10-16

    Merged PRs to fix it

    Newest first, up to 5. Merged to fix it, which does not prove it worked.

    • The survey instructions now say to save the large skill-audit output to a file and read only one part. PR #2109 2026-10-16

    Occurrences

    Newest first: date (links to the session log) → the session's goal.

    Logged frictions and proposed solution

    As described by the agents that hit it.

    • Design subagent had no short path for nit picks where the right design is no change; sections 1 to 5 apply in full, and audit-skills output was 505 KB. → Let the design brief say a pick may stop at section 2 with no change when its cause is a read-past rule, and print docReadCounts alone.2026-10-29
  • 1sessionA failed git add or commit inside a chained command meant the commit never happened, and the agent reviewed or gated the wrong state.nitstill recurring · 1 since last fix · PR #2525Sessions per day since 2026-10-26: 2026-10-31 1

    A git add with an ignored pathspec, or a commit given both -m and -F, errors; `&&` skips the commit (or the commit fails unseen) and the session carries on, reading an older HEAD or running the gate on an uncommitted tree. git-conventions.md covers only a branch rename or create chained with the commit. Signals: 'git add' error, 'HEAD stayed on an old commit', 'git log -1 showed an older commit', 'both -m and -F'.

    Merged PRs to fix it

    Newest first, up to 5. Merged to fix it, which does not prove it worked.

    • Its git-conventions section now also covers a git add of an ignored path and a commit given both -m and -F, and says to read git log -1 before the gate. PR #2525 2026-10-25

    Occurrences

    Newest first: date (links to the session log) → the session's goal.

    Logged frictions and proposed solution

    As described by the agents that hit it.

    • A chained Python edit failed on an assertion but the following git add and commit still ran, committing the unedited Digest; I amended afterward. → Never put a commit after a step that can fail in the same call; check exit status first, as git-conventions already says.2026-10-31
  • 1sessionAgents could not read a CI job's log in cloud sessions, so they guessed why a check failed instead of reading its annotations.nitstill recurring · 1 since last fix · PR #2441Sessions per day since 2026-10-26: 2026-10-27 1

    The REST job-log endpoint redirects to a blob host the agent proxy blocks (403 Forbidden for gh api or curl on actions/jobs/<id>/logs), and mcp__github__get_job_logs returns one enormous line whose tail shows only cleanup, while the check run's annotations name the failing lint or test; sessions that miss this guess the cause from a local build or a truncated log tail. Signals: "job logs", "403", "blob storage", get_job_logs overflow or a tail of cleanup lines, a misdiagnosed CI failure or a wasted local build before reading the annotations.

    Merged PRs to fix it

    Newest first, up to 5. Merged to fix it, which does not prove it worked.

    • github-integration.md now says to read a red check's failure annotations before its log, since the REST job-log download 403s in the cloud. PR #2441 2026-10-23

    Occurrences

    Newest first: date (links to the session log) → the session's goal.

    • 2026-10-27 →Visitor-loop run on the Atlas: three blind visitors, fix consensus findings, build one featurenit

    Logged frictions and proposed solution

    As described by the agents that hit it.

    • PR 2595's label check failed on a GitHub 504 before any logic ran; diagnosing it meant slicing a 57KB one-line job log. → Have the failure wake name the HTTP status, or let get_job_logs return only the last error line.2026-10-27
  • 1sessionThe rule to stay on one git branch clashed with tasks that need another branch or several pull requests.nitopen Sessions per day since 2026-10-26: 2026-10-26 1

    CLAUDE.md's "Stay on the branch your session started on" and the session's designated-branch instruction collide with tasks that need a PR's branch, several independent PRs or a worktree, so the session asks or breaks the rule. Signals: 'designated branch', 'against stay on the branch', a new branch cut and undone.

    Notes: 2026-10-20 design: a repo doc granting pushes to other branches dropped: the harness pins one pushable branch and a repo doc cannot grant that; issue-tracker.md already says to flag it upfront and ask.

    Occurrences

    Newest first: date (links to the session log) → the session's goal.

    • 2026-10-26 →Scheduled audit of the repo's docs for drift and duplicationnit

    Logged frictions and proposed solution

    As described by the agents that hit it.

    • Worked on a local branch audit-docs/2026-10-26 and pushed it to the designated session branch rather than staying on it. → Rename the session branch instead of cutting a second one.2026-10-26
  • 1sessionAfter a merge, agents wrote the completed session log by hand, so the logging script warned or refused and they had to run the closing Skill and try again.nitopen Sessions per day since 2026-10-26: 2026-10-27 1

    log-session --author warns (PR #2452) and, since PR #2536, refuses a completed log after a merge with no close-session call, so a session that authors the log first loses a call and then invokes close-session. Signals: 'the script warned', 'warning fired', 'refused until close-session ran', 'one extra call'.

    References: Comes from the fixes PR #2452 and #2536 for close-session-bypassed-by-hand-log (a log closed by hand, skipping close-session, so the user had to ask for a proper close).

    Notes: 2026-10-28 design: dropped: the refusal is the designed enforcement of #2536 and names the fix; cost is one call.

    Occurrences

    Newest first: date (links to the session log) → the session's goal.

    • 2026-10-27 →Scheduled audit of the repo's prose for drift and contradictionnit

    Logged frictions and proposed solution

    As described by the agents that hit it.

    • Re-authored the log as completed straight through log-session after the merge; it refused until close-session ran, costing one extra call. → After a merge, invoke close-session first, as its re-invoke line says; I went by memory of the earlier flow.2026-10-27
  • 1sessionAgents subscribed to a pull request by guessing its number before the create call returned, then had to resubscribe.nitopen Sessions per day since 2026-10-26: 2026-10-27 1

    The session calls subscribe_pr_activity with the expected next PR number in the same turn as create_pull_request, and the guess is off by one when another PR lands first. Signals: 'guessing the next number', 'unsubscribe and resubscribe'.

    Notes: 2026-10-23 design: a subscribe-after-create sentence or guard dropped: the only home is ADR-0003 (Human-only, an ADR summary cannot add to its ADR) or a guard that cannot tell a guess from a real number, and a wrong guess costs one resubscribe.

    Occurrences

    Newest first: date (links to the session log) → the session's goal.

    • 2026-10-27 →Review and improve the Glass Box guide with several modelsnit

    Logged frictions and proposed solution

    As described by the agents that hit it.

    • Subscribed to PR #2599 in the same call batch as creating the PR, guessing its number; the real PR was #2600, so one wrong subscribe had to be undone → Subscribe only after create_pull_request returns the PR number2026-10-27
  • 1sessionA container or worker restart silently killed running workflows and gate runs, and the main agent only found out later.nitstill recurring · 3 since last fix · PR #2140Sessions per day since 2026-10-26: 2026-10-29 1

    Container/worker restart kills background workflows and gate runs (exit 137); clear-backlog SKILL.md does not say to check run liveness after a resume or that resumeFromRunId needs the original args. Signals: 'container restart killed', 'exit 137', 'args.session required'.

    Merged PRs to fix it

    Newest first, up to 5. Merged to fix it, which does not prove it worked.

    • clear-backlog §3 now says a restart kills running workflows and a resumeFromRunId resume must pass the original args. PR #2140 2026-10-16

    Occurrences

    Newest first: date (links to the session log) → the session's goal.

    • 2026-10-29 →Redesign glassbox-improve to grade toward the best pagesnit

    Logged frictions and proposed solution

    As described by the agents that hit it.

    • The worker process restarted mid code-review; state survived but the review dispatch had to be redone. → None needed beyond committing before long steps, which held.2026-10-29
  • 1sessionDoc reviewers' quoted sentences did not match the file's line breaks, so exact-text edits failed and had to be redone.nitstill recurring · 2 since last fix · PR #1957Sessions per day since 2026-10-26: 2026-10-28 1

    Since PR #1821, audit-docs and other doc reviewer subagents quote the sentence instead of citing lines, but they flatten or rewrap multi-line text, so an Edit or scripted replace on the quote fails and a checker must re-find the real text. Signals: 'flat sentences', 'differed in line wrapping', 'exact-string edits failed'.

    References: Comes from PR #1821, the fix for the former reviewer-line-ranges-off cluster (reviewers citing wrong line numbers).

    Merged PRs to fix it

    Newest first, up to 5. Merged to fix it, which does not prove it worked.

    • Doc-audit reviewers now keep line breaks when quoting a sentence, so exact-text edits no longer fail. PR #1957 2026-10-14

    Occurrences

    Newest first: date (links to the session log) → the session's goal.

    Logged frictions and proposed solution

    As described by the agents that hit it.

    • git log -S with a quoted ADR sentence found nothing because the source wraps that sentence across two lines; extra searches before I used a shorter phrase. → Note in git-conventions that -S needs a single-line phrase for wrapped Markdown.2026-10-28
  • 1sessionA rewrite, reword or trim changed what the text meant, dropping or tightening a rule, and review had to catch it.nitopen Sessions per day since 2026-10-26: 2026-10-29 1

    An agent rewriting a Skill, doc or definition to a stated goal (plain rewrite, prune, compression) works from a mental checklist instead of diffing old against new rule by rule: it drops a rule, pointer, qualifier or why that was meant to stay, or adds a stricter rule. Signals: "lost a rule", "dropped ... exception", "a prune must not change meaning", "review caught both".

    Notes: 2026-10-23 design: a rewrite-discipline line dropped: the two newer sessions were caught by code-review before merge, no session shipped the drift, and the candidate homes sit in open Prune Trial territory.

    Occurrences

    Newest first: date (links to the session log) → the session's goal.

    Logged frictions and proposed solution

    As described by the agents that hit it.

    • First prune dropped four rules and the ledger claimed every rule was kept; code-review caught it before the push. → List every rule in the section before trimming and check each against the new text.2026-10-29
  • 1sessionA helper agent built in a worktree on a branch name the session could not push, so its commits had to be moved by hand.nitlikely fixed 10-27 · PR #2584Sessions per day since 2026-10-26: 2026-10-26 1. A fix merged on 2026-10-27

    A worktree-isolated build or impl agent commits on its own local branch (worktree-wf_..., or a name of its choosing) rather than the session's designated pushable branch, so the orchestrator needs a refspec push or a cherry-pick, and the Stop hook asks to push the other branch. Signals: 'worktree-wf_', 'refspec push', 'cherry-pick its commits onto my branch'.

    Merged PRs to fix it

    Newest first, up to 5. Merged to fix it, which does not prove it worked.

    • clear-backlog §4 now names git push origin HEAD:<branch> for a build whose branch the main checkout holds. PR #2584 2026-10-27

    Occurrences

    Newest first: date (links to the session log) → the session's goal.

    Logged frictions and proposed solution

    As described by the agents that hit it.

    • The build workflow could not check out the session branch (held by the main checkout), so it committed on a worktree branch and I had to push HEAD to the session branch by hand. → clear-backlog-build could push via HEAD:<name> by design, or the Skill could say the session branch name is always held by the main checkout.2026-10-26