Skip to content

sync: upstream 88d4751 (/sharpen returns only the rewritten prompt) - #283

Closed
mdsmithaustin wants to merge 2 commits into
mainfrom
sync/upstream-attempt-20261020T152304Z.0BbTqw
Closed

mdsmithaustin wants to merge 2 commits into
mainfrom
sync/upstream-attempt-20261020T152304Z.0BbTqw

Conversation

@mdsmithaustin

Copy link
Copy Markdown
Owner

Syncs upstream cursor/plugins pstack/ from d457567 to 88d4751.

Upstream commits

  • 88d4751 pstack: restore /sharpen to the original prompt, return only the rewrite (#729). /sharpen no longer frames a task and then does it. It now asks four things (what a top professional would add, the rawest material, the methods and tools, and an outside check), rewrites the prompt, and leaves the user's choices open.
    • skills/sharpen/SKILL.md: took upstream's new description and body. Dropped disable-model-invocation: true per the substitution map. The existing agents/openai.yaml gate stays.
    • README.md: took upstream's new /sharpen row. In place of upstream's "runs only when you type /sharpen", it uses the port's gated wording ("it doesn't load from its description (on claude code, once /setup-pstack sets the skill listing), so type /sharpen"), the same as the /poteto-help and /in-your-own-words rows.
    • skills/poteto-help/SKILL.md, skills/poteto-help/references/recipes.md, docs/guide/02-poteto-mode.md, docs/guide/10-recipes-and-pitfalls.md: took upstream's text verbatim. The port's text before the sync matched upstream's old text.
    • tools/skill-trigger-cases.json: changed the sharpen row's description_contains from Sharpen a task to deeper, not bigger so it matches the new description, and reworded its example request. implicit_allowed stays false.
    • .cursor-plugin/plugin.json and plugin.json version bumps: not ported (substitution map).
    • .github/upstream-sha → 88d47514b82e7c44f00f2b2a72ff6dd12158038c.

No single-model cuts, agent changes, or skill or playbook additions, renames, or removals.

Guide promises

  • Removed the units for the old sharpen sentences: 0f77d985e3fc, 25321c29d8ee, 370107715792, and 924614a9e8a9 (all promise), plus 6c303f8ac2d4 and 8616da1694e0 (context). Both guides dropped them.
  • Added new units with sources upstream and port. Promise units: b1e90eb13b4e, 9ead3f17f124, 1dd47905086a, 123a352a331d, 3e74944d2a28. Context units: ff45621c7b54, b78bf6d55700, eb1880162cb5.
  • Replaced the promise sharpen-frames-task-before-work with sharpen-rewrites-prompt-without-doing-task (static, owner skills/sharpen/SKILL.md). Its six evidence quotes come from the new skill body. The old id said the skill does the work, which is no longer true, and no test or case referenced it.
  • Needs judgment: the new claim includes "doesn't do the task". The skill text implies this ("Before rewriting it, do four things … Then rewrite my prompt") but no sentence states it. Upstream's skill text is the same. No live case checks it.

Checks

Tools: real bun and rg from mise installs ahead of the shims, with Python chosen by tools/gate-check.sh.

  • tools/gate-check.sh lint: PASS (rerun after the results file was added)
  • tools/gate-check.sh test: PASS (tools, promise, and setup-pstack unit tests, poteto-mode bun install, tests, and typecheck)
  • python3 evals/promises/ledger.py audit --upstream-ref upstream/main: 0 problems
  • skill-ci check: 4 of 4 checks, 0 failed

Nothing failed, so no main baseline comparison was needed.

Live (step 8): the only live promise whose owners changed is poteto-help-finds-need-and-routes. Its two cases ran once each on Claude Code, Codex, Hermes, and Grok Build: 8 of 8 PASS. The matrix is in evals/promises/results/2026-10-20-sync-88d4751.md.

CI: none had run when this PR opened. Only CI results that actually run count. The local checks above do not stand in for the Docker suites or other CI-only checks.

Published as a draft under the scheduled-sync exception to no-mistakes, which covers this branch only.

@mdsmithaustin

Copy link
Copy Markdown
Owner Author

Closing as superseded. main already ported upstream 88d4751 (cursor/plugins#729) in 9122605, and .github/upstream-sha on main reads 88d47514b82e7c44f00f2b2a72ff6dd12158038c.

That commit keeps the four upstream asks and adds rewrite-only and original-deliverable boundaries, because live runs showed the exact upstream wording let Hermes execute the task and let Claude Code and Grok add deliverables. PORTING.md records those boundaries for future syncs. It also keeps the stable promise ID sharpen-frames-task-before-work with a replaced claim.

This branch conflicts with main in evals/promises/ledger.json, skills/sharpen/SKILL.md, and tools/skill-trigger-cases.json. Resolving it this branch's way would revert those boundaries. Its one unique artifact is evals/promises/results/2026-10-20-sync-88d4751.md (poteto-help 8 of 8 live PASS), which stays readable on this PR.

@mdsmithaustin
mdsmithaustin deleted the sync/upstream-attempt-20261020T152304Z.0BbTqw branch October 21, 2026 01:07
@mdsmithaustin

Copy link
Copy Markdown
Owner Author

Prototype variant 1 of 3, throwaway. Compact recap of PR 289, posted here only to test GitHub rendering.

Recap. Risk: low (judgment). Eval tooling only. Base bfe834de, head 081421a9. 13 files, +554 −30.

Risk note. live.py run now exits 2 after any grade-time refusal and keeps running later cases. No skill text changes.

Area Files Lines What changed
Batch control live.py +41 −10 A grade refusal prints as refusal, the batch continues, and main exits 2. boundary_unavailable and unknown_authorization stop it at once.
Grading boundary grade_boundary.py +22 −2 _before_turns admits harness scratch roots. New _Root.remove deletes a directory without following links.
Grok trace harnesses/grok.py +18 −3 Turn numbers skip /compact. History rewrites land in x_compactions.
Oracles oracles.py +14 −3 Two FAIL paths now return INCONCLUSIVE, one of them with needs_judge.
Report report.py +17 −2 A retained Hermes run/ copy no longer counts twice.
Docs, results README.md, results/2026-10-20-grader-fix.md +68 −8 Behavior docs and the rerun report.
Tests 4 test files, 2 Grok fixtures +374 −2 Each fix has its own tests.

Figure 1. A grade-time refusal now returns to main as data, and only two controller-level reasons stop the batch early.

sequenceDiagram
    participant M as main
    participant R as run_case
    participant B as grade_boundary
    participant G as grade
    M->>R: runs one case
    R->>B: declares tmp scratch roots as allocations
    R->>R: drives the harness turns
    R->>B: removes poteto-mode/scripts/node_modules without following links
    R->>G: grades the sealed run
    alt grade refuses
        G-->>R: raises GradeRefused
        R-->>M: returns a screen with refusal
        M->>M: stops with exit 2 on a controller-level reason
        M->>M: otherwise runs the next case and exits 2 at the end
    else grade finishes
        G-->>R: returns verdicts
        R-->>M: returns a screen with verdicts
    end
Loading

@mdsmithaustin

Copy link
Copy Markdown
Owner Author

Prototype variant 2 of 3, throwaway. Rich recap of PR 289, posted here only to test GitHub rendering.

Verdict. Grading refusals that ended a live-eval batch are either prevented or recorded, and three oracle and report paths stop overstating results. Risk: low (judgment). Base bfe834de, head 081421a9. 13 files, +554 −30. Eval tooling only.

Files

[+] added, [~] modified, [-] removed (none).

evals/promises/
├── README.md ............................. [~] +10 −8
├── grade_boundary.py ..................... [~] +22 −2
├── harnesses/grok.py ..................... [~] +18 −3
├── live.py ............................... [~] +41 −10
├── oracles.py ............................ [~] +14 −3
├── report.py ............................. [~] +17 −2
├── results/2026-10-20-grader-fix.md ...... [+] +58
├── test_grok.py .......................... [~] +44
├── test_live.py .......................... [~] +214 −2
├── test_oracles.py ....................... [~] +66
├── test_report.py ........................ [~] +38
└── testdata/grok_compaction/ ............. [+] 2 files, +12

Key changes

  1. Scratch worktrees are graded. Before, _before_turns declared only run.project.parent, so a worktree under <run>/tmp refused unapproved_worktree. After, live.SCRATCH_ROOTS names tmp per harness, plus the Hermes profile cache, and run_case creates and declares them before turns.
  2. The watch-pr bootstrap no longer trips the link check. Before, bun install left node_modules links under the installed skills and grading refused unsafe_link. After, run_case calls the new _Root.remove on poteto-mode/scripts/node_modules before harvest. A link at scripts or node_modules still refuses.
  3. A grade refusal no longer ends the batch. Before, GradeRefused from grade() escaped run_case (inferred, since main caught only LoginRequired). After, the screen carries refusal, later cases run, and main exits 2. boundary_unavailable and unknown_authorization stop the batch at once.
  4. Grok turns after /compact keep their numbers. Before, prompt_index was the turn, and Grok's count skips /compact. After, turn_of_index skips LOCAL_COMMANDS, and each compaction_meta rewrite adds one x_compactions entry.
  5. Two oracle FAILs become INCONCLUSIVE. read_only_pin returns INCONCLUSIVE when a chat_history compaction rewrote the graded turn and the Investigation read is missing. Edits still fail. doc_impact_before_completion sends "independent review" wording to the judge with needs_judge instead of failing.
  6. Retained Hermes pairs count once. Before, collect and listing_states read every verdict.json under the output directory. After, run_verdicts skips a pair's run/ copy when its original run is under that directory.

Grading path, before and after

Figure 1. Two refusal sources are cleared before grading, and any refusal left over is recorded instead of ending the batch.

flowchart LR
    subgraph before["Before, bfe834de"]
        direction TB
        b1["authorize project parent only"]
        b2["drive turns"]
        b3["harvest and seal"]
        b4["grade"]
        b5["[-] GradeRefused escapes run_case"]
        b6["[-] batch ends"]
    end
    subgraph after["After, 081421a9"]
        direction TB
        a1["[~] authorize project parent and scratch roots"]
        a2["drive turns"]
        a3["[+] remove bootstrap node_modules"]
        a4["harvest and seal"]
        a5["grade"]
        a6["[+] screen carries refusal"]
        a7{"[+] controller-level reason?"}
        a8["[+] stop batch, exit 2"]
        a9["[+] run next case, exit 2 at end"]
    end
    b1 -- "starts" --> b2
    b2 -- "leaves tree for" --> b3
    b3 -- "hands sealed run to" --> b4
    b4 -- "raises" --> b5
    b5 -- "ends" --> b6
    a1 -- "starts" --> a2
    a2 -- "leaves tree for" --> a3
    a3 -- "clears links for" --> a4
    a4 -- "hands sealed run to" --> a5
    a5 -- "records refusal in" --> a6
    a6 -- "checks" --> a7
    a7 -- "yes, stops" --> a8
    a7 -- "no, continues" --> a9
Loading

Risks

Risk Where Level (judgment) What to check
live.py run exits 2 for a partial batch, and 3 still means a login stop live.main medium Any wrapper that treats nonzero as "nothing graded"
The run deletes a directory inside the project grade_boundary._Root.remove low Parents open with O_NOFOLLOW and a link refuses. A swap between stat and rmtree has no test (guess).
INCONCLUSIVE can hide a real miss oracles.read_only_pin, oracles.doc_impact_before_completion low Only the compacted turn or judge-routed wording qualifies. Edits still fail.
Grok turn falls back to the raw index grok.turn_of_index low Out-of-range prompt_index returns unchanged

Review order

  1. Core logic. live.run_case and live.main, grade_boundary._Root.remove and _before_turns, and the two oracles.py branches. Tests are test_live.GradeRefusalBatch, BootstrapDependencies, ScratchWorktrees, test_oracles.ReadOnlyPinAfterCompaction, and AuthorResultInOtherWords.
  2. Wiring. harnesses/grok.py turn numbering and x_compactions, report.run_verdicts, and the live.py constants. Tests are test_grok.CompactedHistory and three test_report cases.
  3. Boilerplate. README.md, results/2026-10-20-grader-fix.md, and the two testdata/grok_compaction fixtures.

@mdsmithaustin

Copy link
Copy Markdown
Owner Author

Prototype variant 3 of 3, throwaway. Component diff recap of PR 289, posted here only to test GitHub rendering of Mermaid C4.

Base bfe834de, head 081421a9. 13 files, +554 −30. Risk: low (judgment). [+] added, [~] changed, [-] removed (none). Unmarked nodes and edges are unchanged context.

Figure 1. The PR adds 3 components and changes 7, all inside evals/promises, and removes none.

C4Component
    title Component diff for PR 289, evals/promises grading path
    Container_Boundary(livepy, "live.py") {
        Component(main, "[~] main", "Python", "continues after a grade refusal, exits 2")
        Component(runcase, "[~] run_case", "Python", "creates scratch roots, clears bootstrap modules, returns a screen")
    }
    Container_Boundary(gb, "grade_boundary.py") {
        Component(beforeturns, "[~] _before_turns", "Python", "declares scratch allocations")
        Component(remove, "[+] _Root.remove", "Python", "deletes a directory without following links")
        Component(grade, "grade", "Python", "raises GradeRefused")
    }
    Container_Boundary(grokpy, "harnesses/grok.py") {
        Component(parse, "[~] parse_session, harvest", "Python", "records compaction rewrites")
        Component(turnidx, "[+] turn_of_index", "Python", "skips /compact in turn numbers")
    }
    Container_Boundary(orc, "oracles.py") {
        Component(pin, "[~] read_only_pin", "Python", "INCONCLUSIVE after a rewrite")
        Component(doc, "[~] doc_impact_before_completion", "Python", "routes independent review wording to the judge")
    }
    Container_Boundary(rep, "report.py") {
        Component(collect, "[~] collect, listing_states", "Python", "iterate run_verdicts")
        Component(rv, "[+] run_verdicts", "Python", "skips retained Hermes copies")
    }
    Rel(main, runcase, "[~] reads refusal from")
    Rel(runcase, beforeturns, "[~] authorizes scratch roots via")
    Rel(runcase, remove, "[+] clears node_modules with")
    Rel(runcase, parse, "harvests Grok trace through")
    Rel(parse, turnidx, "[+] numbers turns with")
    Rel(runcase, grade, "[~] catches GradeRefused from")
    Rel(grade, pin, "runs")
    Rel(grade, doc, "runs")
    Rel(collect, rv, "[+] lists verdicts through")
    UpdateLayoutConfig($c4ShapeInRow="2", $c4BoundaryInRow="2")
Loading

Evidence per changed node

  • [~] main is live.py main. It gains refused, returns 2 when screen["refusal"]["reason"] is in BATCH_REFUSALS, and ends with return 2 if refused else 0.
  • [~] run_case is live.py run_case. It builds scratch from SCRATCH_ROOTS[harness], calls project.remove(module.SKILLS_DIR / BOOTSTRAP_MODULES), sets refusal = refused.receipt on GradeRefused, and returns screen instead of root.
  • [~] _before_turns is grade_boundary.py _before_turns(run, scratch=()), which passes allocations=(run.project.parent, *scratch).
  • [+] _Root.remove is grade_boundary.py _Root.remove(rel). It stats with follow_symlinks=False, raises unsafe_link or unsafe_object, and calls shutil.rmtree(name, dir_fd=parent).
  • [~] parse_session, harvest is harnesses/grok.py. A compaction_meta record opens one {"source": "chat_history"} entry, and harvest emits it as x_compactions.
  • [+] turn_of_index is harnesses/grok.py turn_of_index(prompt_index, prompts), which skips LOCAL_COMMANDS = ("/compact",).
  • [~] read_only_pin is oracles.py read_only_pin. It computes rewritten from x_compactions and returns inconclusive(...) when the route read is missing.
  • [~] doc_impact_before_completion is oracles.py. It finds independent review in the reply or turn texts and returns inconclusive(..., needs_judge=True, excerpt=...).
  • [+] run_verdicts and [~] collect, listing_states are report.py. run_verdicts skips run/verdict.json when pair.json names an original_root under the output directory.
  • Context edges. grade runs oracles.py per the README, not per this diff.

@mdsmithaustin

Copy link
Copy Markdown
Owner Author

Story prototype 1 of 4, throwaway. A story strip for PR 289, built from its commits, its verdict comment, and the results files on main. Variant A is Mermaid timeline. Variant B, a 5-node flowchart LR, is under it for comparison.

Story. 7 runs refused at grading now grade, and one refusal no longer ends the batch.

A. timeline

timeline
    title PR 289, grading refusals
    Problem : 7 runs refused at grading
    Root cause : tmp/ worktrees never approved
               : watch-pr left a symlink
    Fix : sign tmp/ in before turns
        : drop bootstrap links unfollowed
    Proof : rerun graded all 7
    For you : batches grade and go on
Loading
Beat One sentence Evidence
Problem The 2026-10-20 sync wave left 7 Grok and Hermes runs refused at grading, and each uncaught refusal ended the rest of its batch. sync results L13-21
Root cause Arena and review worktrees live under the run's tmp/, which the grade authorization never declared, and the watch-pr bootstrap left a node_modules/.bin symlink that the pre-grade walk refuses. sync results L18-19, red tests d31d81f3
Fix run_case signs each harness's scratch roots in as allocations before the turns, deletes the watch-pr node_modules without following links, and turns a grade-time refusal into a refusal record. 22bf7481
Proof The rerun graded all 7 previously refused runs with no refusal and no stopped batch, and the trail review passed at head 081421a9. grader-fix results L3, L9-17, tests ScratchWorktrees, BootstrapDependencies, GradeRefusalBatch, verdict PASS+NOTES
For you An evaluator's live.py run batch now grades runs that used tmp/ worktrees or watch-pr, and a run-specific refusal prints a receipt and the batch goes on, exiting 2 at the end. README L130, L136

The strip leaves out three smaller fixes in the same PR. It renumbers Grok turns after /compact, counts a retained Hermes pair once, and sends an author result in other words to the judge.

B. flowchart LR, same five beats
flowchart LR
    P["Problem<br/>7 runs refused<br/>at grading"] --> R["Root cause<br/>tmp/ worktrees and<br/>a watch-pr symlink"]
    R --> F["Fix<br/>sign tmp/ in,<br/>drop links"]
    F --> V["Proof<br/>rerun graded<br/>all 7"]
    V --> U["For you<br/>batches grade<br/>and go on"]
Loading

@mdsmithaustin

Copy link
Copy Markdown
Owner Author

Story prototype 2 of 4, throwaway. A proof trail for PR 293, still open, built from its 27 commits, CI, and two local trail-review verdict files that were never posted on the PR. Runs of commits are collapsed. An X marks red test commits, a square marks no-mistakes gate rounds.

Story. Two trail reviews failed, the same class of miss came back, and round 2 changed the premise.
---
config:
  gitGraph:
    mainBranchName: "PR 293"
---
gitGraph LR:
    commit id: "build 429cef7"
    commit id: "gate x2 47d40c6" type: HIGHLIGHT tag: "review 1 FAIL"
    commit id: "5 red tests" type: REVERSE
    commit id: "5 fixes 785bd55"
    commit id: "docs ab16d2a"
    commit id: "gate x3 d47b97a" type: HIGHLIGHT tag: "review 2 FAIL"
    commit id: "4 red tests" type: REVERSE
    commit id: "fix c78d87e" tag: "premise: scan every block"
    commit id: "3 fixes e6c53d0"
    commit id: "docs 23c1d9f" tag: "review 3 pending"
Loading
Round Commits What happened Evidence
Build 9fbc35d, 429cef7, gate 9107c50, 47d40c6 Evaluator, fixtures and tests, then two no-mistakes review fixes. commits
Review 1 head 7434ccd, the same 4 commits before a rebase (inferred from author dates) FAIL with 7 findings. The blocker was an unsupported carrier that hid a complete mixed batch and exited 0 SATISFIED. local verdict r1
Fix 1 5 red/fix pairs: 8797e17/0e3f5bd, 60db6a3/c15e074, dcd93f8/3cb79d5, 35c45ad/d35bd0a, 4507d1e/785bd55, docs ab16d2a Each red commit fails on its own tree (5, 3, 2, 4 and 1 failures) and its fix passes. local verdict r2, red-first check
Gate 24436f4, ad9bc44, d47b97a Three no-mistakes review rounds. The reviewer's bisect puts finding A in 24436f4. local verdict r2, finding A
Review 2 head d47b97a FAIL. In A, a truncated reread after a valid read was a proven FAIL. In B, an escaped batch in a supported carrier exited 0 SATISFIED, and the reviewer calls B the same class as review 1's blocker. C and D reported manifest errors as model violations. local verdict r2
Fix 2 red 07362e2, 42e307d, 028c7d3, 7dd611e, then fixes c78d87e, 9321172, df8acfb, e6c53d0, docs 23c1d9f The premise changed. Governing-body detection no longer depends on carrier classification, and c78d87e scans every output block, raw and decoded, for plain and escaped bodies. Red-first for this round is not checked yet. round 2 fix brief (local), c78d87e
Now head 23c1d9f CI 7 of 7 green. No round 3 verdict is on file. checks

@mdsmithaustin

Copy link
Copy Markdown
Owner Author

Story prototype 3 of 4, throwaway. What the user sees for PR 289. An evaluator runs live.py run on the 7 cases that were refused at grading. Before is the 2026-10-20 sync wave. After is the grader-fix rerun.

Story. Before, the first refused run ended the batch. After, all 7 runs grade in one batch.

Before. The grader refuses the run, and nothing catches the refusal.

sequenceDiagram
    participant E as Evaluator
    participant L as live.py run
    participant A as Agent
    participant G as Grader
    E->>L: run the batch
    L->>A: case 1 turns
    A-->>L: tmp/ worktree or watch-pr link
    L->>G: grade case 1
    G-->>L: GradeRefused
    L-->>E: uncaught, batch ends
    Note over E,G: later cases never run
Loading

After. Scratch roots are signed in before the turns, and bootstrap links are gone before grading.

sequenceDiagram
    participant E as Evaluator
    participant L as live.py run
    participant A as Agent
    participant G as Grader
    E->>L: run the batch
    L->>L: sign tmp/ in as allocation
    L->>A: case 1 turns
    A-->>L: tmp/ worktree or watch-pr link
    L->>L: drop node_modules, no follow
    L->>G: grade case 1
    G-->>L: verdicts
    Note over L,G: same for cases 2 to 7
    L-->>E: 7 of 7 graded
Loading
Before, 2026-10-20 sync wave After, grader-fix rerun
Refused at grading 7 runs, 5 on Grok and 2 on Hermes 0
What a refusal did The uncaught GradeRefused ended the batch, so 5 cases were rerun one per process. A receipt under refusal, the batch goes on, exit 2 at the end (README L136). No run needed it here.
Verdicts for the 7 none 4 PASS, 1 graded with no FAIL, 1 with a PASS and an oracle FAIL, 1 INCONCLUSIVE
Fixed path exercised 4 of 7 runs, through a review or arena worktree under tmp/ or through watch-pr. The other 3 made no tmp/ worktree this time.

Fix commit 22bf7481, red tests first in d31d81f3.

@mdsmithaustin

Copy link
Copy Markdown
Owner Author

Story prototype 4 of 4, throwaway. The number that moved in PR 289, from the 2026-10-20 sync results and the grader-fix results on main. Variant A is a Mermaid xychart-beta horizontal bar chart. Variant B is a headline with no chart.

Story. Runs refused at grading went from 7 to 0 on the same 7 cases.

A. xychart-beta horizontal

---
config:
  xyChart:
    width: 560
    height: 220
    showDataLabel: true
    showDataLabelOutsideBar: true
---
xychart-beta horizontal
    title "Runs refused at grading, same 7 cases"
    x-axis ["2026-10-20 sync", "grader-fix rerun"]
    y-axis "runs refused" 0 --> 10
    bar [7, 0]
Loading

Claim. With PR 289's grader, none of the 7 previously refused runs was refused. Measured with one run per case, the grader refused 5 Grok runs and 2 Hermes runs on 2026-10-20 and none in the rerun of those cases.

What the number does not show. Only 4 of the 7 reruns went through a fixed path, a worktree under tmp/ or watch-pr. The other 3 made no tmp/ worktree this time, so their 0 says nothing about the fix. The skills pin also moved, from 7a9a3ddb to 8731b6eb.

B. No chart

Refused at grading went from 7 to 0 on the same 7 cases, one run each. 4 of the 7 reruns exercised the fix. Per case in the results table.

@mdsmithaustin

Copy link
Copy Markdown
Owner Author

Recap trial, PR #285, version 1. Throwaway. Written by an agent following a draft recipe, posted here only to check how it reads and renders.

Recap. In one Claude Code session, compaction kept only the first 20,000 characters of the poteto-mode entry and cut its Babysit and Shipping routes (issue 265), so the entry now opens with a recovery rule and the playbook index and moves the trigger, delegation, and writing rules into references under a 16,000-byte lint budget, and a posted PASS+NOTES verdict and seven green checks cover the head.

Risk. Medium. The trigger list moved out of skills/poteto-mode/SKILL.md into skills/poteto-mode/references/task-triggers.md, so every task now depends on the agent reading that file on each invocation, resume, and scope change. Check the read rule in Apply the mode and the 244 bytes of headroom left under the budget.

Base 8731b6eb on main, head bc43c972. 21 files, +236 -129.

Area Files Lines What changed
Mode entry skills/poteto-mode/SKILL.md +49 -90 A recovery rule and the playbook index now come first, and Apply the mode says when to read each new reference.
Extracted references skills/poteto-mode/references/delegation.md (new), skills/poteto-mode/references/task-triggers.md (new), skills/poteto-mode/references/writing.md (new) +56 -0 The old triggers, Subagents, Writing the reply, and Comments text moved here verbatim. Each file adds a title and a one-line read condition, and only relative paths and one link changed.
Playbooks and persona skills/poteto-mode/playbooks/*.md, agents/poteto-agent.md, skills/pstack-harness/references/subagents/roles.json +8 -7 Pause now records, and pickup now restores, the active playbook path and current step. Old section names point at the new references.
Retention evidence skills/pstack-harness/SKILL.md, skills/pstack-harness/references/skill-retention.md (new) +20 -0 A dated table records what each runtime documents and what was observed about skill retention after compaction.
Budget check tools/check-mode-entry-size.py (new), tools/test_mode_entry_size.py (new), tools/gate-check.sh, tools/test_personal_paths.py +80 -1 A new lint check fails when the entry passes 16,000 UTF-8 bytes, and tests cover the boundary, a missing file, and invalid UTF-8.
User docs and ledger README.md, PORTING.md, docs/guide/01-setup.md, skills/poteto-help/SKILL.md, evals/promises/ledger.json +23 -31 The README links the recovery rule and the retention evidence and keeps retyping /poteto-mode as the fallback. The setup guide and poteto-help point there, and the ledger cites the new reference files.

Reading order.

  1. Core logic. The Recover after compaction or truncation and Apply the mode sections of skills/poteto-mode/SKILL.md, then skills/poteto-mode/references/task-triggers.md and tools/check-mode-entry-size.py.
  2. Wiring. tools/gate-check.sh, tools/test_mode_entry_size.py, skills/poteto-mode/playbooks/session-pickup.md, skills/poteto-mode/playbooks/pause-safely.md, and skills/pstack-harness/references/skill-retention.md.
  3. Boilerplate. skills/poteto-mode/references/delegation.md and skills/poteto-mode/references/writing.md (moved text), evals/promises/ledger.json, roles.json, and the doc pointers.

These pointers are a start, not the review. Read the whole diff, because a defect can sit in a file this recap ranks low.

Beat What happened Evidence
Problem After compaction in one Claude Code session, the reattached entry ended mid-word in the playbook index. The agent then merged three PRs without the watcher that the Babysit playbook requires. Issue 265
Root cause The base entry put the playbook index last, at lines 124 to 154. Under the 20,000-character cut that issue 265 reports, 20 of its 25 routes fall past the cut, Babysit and Shipping among them. Base index
Fix The first commit moves the recovery rule and the index to the top, moves trigger, delegation, and writing rules into three references, and adds the byte-budget lint check. e9475102
Proof At bc43c972, the verdict reports both mise gates passing and one recovery run with an actual compaction, and all seven CI checks passed. The PR body describes the recovery checks as Codex runs. A paired run on the base also passed, and no native Claude Code compaction was observed. PASS+NOTES, lint run
For the user After a known compaction, an agent rereads the entry, the task triggers, and the active playbook before its next governed action. A maintainer gets a lint failure when the entry grows past 16,000 bytes. Recovery rule

Before. At base, the lint tier of tools/gate-check.sh runs seven checks, and none of them reads the entry's size.

sequenceDiagram
    participant M as Maintainer
    participant G as gate-check.sh
    M->>G: runs the lint tier
    G-->>M: prints 7 PASS or FAIL lines
    Note over G: no check reads the entry size
Loading

After. At head, the lint tier also runs tools/check-mode-entry-size.py, which exits 1 when the entry passes 16,000 bytes, so the gate prints FAIL lint: mode entry byte budget and exits 1.

sequenceDiagram
    participant M as Maintainer
    participant G as gate-check.sh
    participant C as check-mode-entry-size.py
    M->>G: runs the lint tier
    G->>C: [+] runs the byte budget check
    C-->>G: exits 1 above 16,000 bytes
    G-->>M: prints a FAIL line and exits 1
Loading

Headline. The entry fell from 24,079 bytes to 15,756 bytes, under the new 16,000-byte budget. The playbook routes that start past the issue's 20,000-character cut fell from 20 of 25 to 0 of 25, and the last route now starts at byte 8,134.

What it does not show. Bytes are not tokens. Claude Code documents its limit in tokens, and the repository says this budget is not a token conversion or a retention guarantee. No run in this PR shows Claude Code keeping the new entry after compaction. Retention evidence

Proof trail. Three review rounds ran on three heads, and the last one posted PASS+NOTES on bc43c972.

Highlighted commits are the heads that each round reviewed, shown under their SHAs after the rebase. git range-diff shows dfa2003c unchanged as 28ff822d and 67f966a8 unchanged as 336e5d88. No commit adds a failing case before its fix.

---
config:
  gitGraph:
    mainBranchName: "PR 285"
---
gitGraph LR:
    commit id: "author x4 7bfc1c6c"
    commit id: "fix x2 044d0f38"
    commit id: "docs 28ff822d" type: HIGHLIGHT tag: "r1 finding"
    commit id: "fix x2 e2345e4f"
    commit id: "lint 336e5d88" type: HIGHLIGHT tag: "r2 fixed"
    commit id: "review dc5ce83a"
    commit id: "docs bc43c972" type: HIGHLIGHT tag: "r3 PASS"
Loading
Round Head Verdict What changed after it
1 dfa2003c Review finding that the task triggers now read as optional 336e5d88 requires reading and applying the task triggers on every invocation, resume, and task scope change.
2 67f966a8 Low, which the comment itself labels historical and not the current verdict dc5ce83a adds the task triggers to the recovery rule. bc43c972 replaces the Session pickup recovery checklist with a link to that rule.
3 bc43c972 PASS+NOTES Nothing. The PR merged at this head.

The no-mistakes note in the PR body rates the change Medium because the recovery rule did not require rereading the task triggers, with 177 bytes of headroom. That headroom matches the 15,823-byte entry at 336e5d88, so the note probably describes that commit, before dc5ce83a added the triggers to the recovery rule (a guess from the byte count). The verdict names two open gaps. Standalone recovery reads are not enforced (#287), and an earlier routing-oracle defect is unchanged (#279). Both issues are now closed.

@mdsmithaustin

Copy link
Copy Markdown
Owner Author

Recap trial, PR #285, version 2. Throwaway. Written by an agent following a draft recipe, posted here only to check how it reads and renders.

Recap. Compaction can hide workflow routes, so this change puts recovery and playbook selection first and requires complete guidance before action, with a posted final-head PASS+NOTES review.

Risk. Medium. Recovery changes the agent's workflow contract, and the final-head trial did not fully follow the standalone-read procedure. Check the recovery rule against the posted verification limits.

Base 8731b6eb on main, head bc43c972. 21 files, +236 -129.

Area Files Lines What changed
Recovery and routing skills/poteto-mode/SKILL.md +49 -90 Put recovery and playbook routes first, record the active playbook, and require task triggers on invocation, resume, and scope change.
Extracted rules skills/poteto-mode/references/delegation.md (new), skills/poteto-mode/references/task-triggers.md (new), skills/poteto-mode/references/writing.md (new) +56 -0 Move trigger, delegation, and writing rules into references with explicit load conditions in the entry.
Playbook and help callers skills/poteto-mode/playbooks/autopilot-full.md, skills/poteto-mode/playbooks/bug-fix.md, skills/poteto-mode/playbooks/pause-safely.md, skills/poteto-mode/playbooks/session-pickup.md, skills/poteto-help/SKILL.md +7 -6 Update moved-rule links and preserve the playbook, step, worklist, gates, and grants across recovery.
Runtime evidence skills/pstack-harness/SKILL.md, skills/pstack-harness/references/skill-retention.md (new) +20 -0 Add conditional retention guidance that separates documented contracts, observations, and unknowns.
Byte-budget enforcement tools/check-mode-entry-size.py (new), tools/test_mode_entry_size.py (new), tools/gate-check.sh, tools/test_personal_paths.py +80 -1 Add an inclusive 16,000-byte UTF-8 limit, exercise its CLI boundaries, wire lint, and update the interpreter test's check count.
Delegate metadata agents/poteto-agent.md, skills/pstack-harness/references/subagents/roles.json +3 -3 Point the persona and generated bundle at the delegation reference.
Documentation and promises README.md, PORTING.md, docs/guide/01-setup.md, evals/promises/ledger.json +21 -29 Update continuation guidance, contributor checks, and promise evidence for the moved rules.

Reading order.

  1. Core logic. Read recovery and routing, then the task triggers.
  2. Wiring. Follow Session pickup and Pause safely, then inspect the checker and its CLI tests.
  3. Boilerplate. Skim the persona descriptions, generated roles bundle, and ledger relocations after checking the retention limits.

These pointers are a start, not the review. Read the whole diff, because a defect can sit in a file this recap ranks low.

Story. The fix addresses lost workflow guidance after compaction while keeping recovery evidence bounded.

Beat What happened Evidence
Problem Issue 265 reports lost later playbook routes and merges without the required watcher after compaction. Reported incident, base's late routes
Root cause The playbook index followed long inline rules, and the base entry had no explicit compaction recovery procedure. Base entry, base index
Fix Put recovery and routes first, require complete returned guidance, and make trigger reads mandatory during recovery and normal application. Recovery, mandatory triggers, recovery-trigger fix
Proof The posted review at bc43c972 reports both canonical mise gates passed and native recovery before the watcher. It records incomplete standalone-read compliance and makes no general reliability claim. Final-head PASS+NOTES, head CI skills run
For the user After known compaction, the agent is instructed to restore the same task and its gates without a new pause or repeated completed work. Continuation rule, user guidance

Before. Base guidance tells the user to invoke the mode again if it stops applying. This diagram shows the documented fallback. Base README

sequenceDiagram
    participant U as User
    participant A as Agent
    participant F as Skill files
    U->>A: Invokes mode again after it stops
    A->>F: Reads mode instructions
    F-->>A: Returns mode entry
Loading

After. The head directs the agent to reread complete governing files and restore task state before its next governed action after known compaction. This diagram shows the required procedure. Head recovery rule

sequenceDiagram
    participant U as User
    participant A as Agent
    participant F as Skill files
    U->>A: Continues the current task
    A->>F: Rereads mode on its own [+]
    F-->>A: Returns complete entry [+]
    A->>F: Reads triggers and active step [+]
    F-->>A: Returns complete guidance [+]
    A->>A: Restores task state and gates [+]
Loading

Headline. The whole mode entry fell from 24,079 UTF-8 bytes, n=1 base snapshot, to 15,756 UTF-8 bytes, n=1 head snapshot. Base file, head file

What it does not show. The inclusive 16,000-byte budget is repository policy, not a token conversion or a runtime retention guarantee. The posted comparison also reports that the base recovered successfully, so it establishes no general recovery improvement. Budget scope, comparison limits

Proof trail. Posted reviews span three heads, and the final verdict preserves the procedural compliance gap.

Proof trail. The graph groups the current twelve commits into ten guidance edits and two final fixes. The highlighted commit has the posted final-head review. Earlier review heads remain in the table below.

---
config:
  gitGraph:
    mainBranchName: "PR 285"
---
gitGraph LR:
    commit id: "[~] edits x10 336e5d88"
    commit id: "[~] triggers dc5ce83a"
    commit id: "[~] pickup bc43c972" type: HIGHLIGHT tag: "PASS+NOTES"
Loading
Round Head Verdict What changed after it
1 dfa2003c COMMENTED The reviewer said triggers now read as optional, and the author reported restoring mandatory reads in the next reviewed head.
2 67f966a8 COMMENTED The retained historical record is not the current verdict; later commits explicitly require triggers during recovery and replace Session pickup's recovery guidance with the authoritative link.
3 bc43c972 PASS+NOTES No later PR commit appears in the fetched record; fresh merge preparation and the shipped merge gate remain required by the verdict.

The first two review submissions have empty bodies. The trigger objection and replies and historical record supply their context. Current trigger fix and pickup fix are in the current commit sequence.

The final posted verdict reports 7 of 7 GitHub checks succeeded at bc43c972. Its fresh native trial returned complete guidance before watcher readiness and one intercepted local merge. The normal trial batched governing files in one outer response, so full procedural compliance is not claimed. Standalone-read enforcement is tracked in issue 287, and the earlier routing-oracle defect remains in issue 279. Pipeline Test observations at dc5ce83a belong to that earlier head. Controlled local forge observations are not actual PR merges. Final-head evidence and limits

@mdsmithaustin

Copy link
Copy Markdown
Owner Author

Recap trial, PR #274, version 1. Throwaway. Written by an agent following a draft recipe, posted here only to check how it reads and renders.

Recap. Read-only scan, parse, and watch helpers inherited the lead's model, so this PR gives them a configurable routine role, and head CI plus a posted review support the change.

Risk. Medium. The role changes model selection across several callers, and the posted review notes missing tests or ledger quotes for six caller edits.

Base f7a27730 on main, head e822fe64. 18 files, +107 -36.

Area Files Lines What changed
Role configuration skills/setup-pstack/SKILL.md, skills/setup-pstack/examples/pstack-models.md, skills/setup-pstack/references/models-config.md, skills/setup-pstack/scripts/check-models-config.py +5 -2 Adds routine to the accepted roles, setup instructions, scope reference, and shipped model defaults.
Scan and watch callers skills/automate-me/SKILL.md, skills/poteto-mode/SKILL.md, skills/poteto-mode/playbooks/autonomous-run.md, skills/poteto-mode/playbooks/runtime-forensics.md, skills/poteto-mode/playbooks/session-pickup.md, skills/poteto-mode/playbooks/trace-forensics.md, skills/poteto-mode/playbooks/worktree-cleanup.md, skills/principle-guard-the-context-window/SKILL.md +8 -8 Routes read-only scans, artifact parsing, and watchers through routine and the existing Spawn a role procedure.
Orchestration contract skills/poteto-mode/scripts/orch/role-contract.json +1 -0 Adds routine to singleRoles.
Tests tests/skills/setup-pstack/scripts/test_check_models_config.py, tools/test_orch_role_contract.py +29 -0 Adds cases for four CLI defaults, a user override, and single-role contract membership.
User and porting docs PORTING.md, docs/guide/01-setup.md +5 -4 Explains the role, its port-specific routing, and the exception to unsuffixed flat defaults.
Promise ledger evals/promises/ledger.json +59 -22 Adds the routine-role promise and updates budget wording, watcher evidence, and guide-unit mappings.

Reading order.

  1. Core logic. Read the accepted role set and shipped defaults.
  2. Wiring. Trace poteto-mode spawn defaults, transcript mining, then the playbook callers in the table.
  3. Boilerplate. Check the orchestration contract against its membership tests, then skim the docs and ledger.

These pointers are a start, not the review. Read the whole diff, because a defect can sit in a file this recap ranks low.

Evidence and limits. The new resolver cases cover Claude Code, Codex, Grok, Hermes, and a user override. On this head, the lint workflow and skill-checks workflow succeeded, and the posted review reports PASS+NOTES. Those records do not establish live scan quality, cost savings, or latency gains.

Before. With shipped defaults at base, these helpers fall through to default and inherit the lead's model, per the spawn rule and default entry.

sequenceDiagram
    participant L as Lead
    participant R as Resolver
    participant W as Helper
    L->>R: Resolves default for a scan
    R-->>L: Returns inherit-parent
    L->>W: Spawns with the lead model
    W-->>L: Returns a reduced finding
Loading

After. The new spawn rule selects routine, whose shipped bindings are sonnet@medium and, under Codex, gpt-6-luna@medium.

sequenceDiagram
    participant L as Lead
    participant R as Resolver
    participant W as Helper
    L->>R: Resolves routine for a scan [+]
    R-->>L: Returns the routine binding [+]
    L->>W: Spawns with resolved settings [~]
    W-->>L: Returns a reduced finding
Loading

@mdsmithaustin

Copy link
Copy Markdown
Owner Author

Recap trial, PR #274, version 2. Throwaway. Written by an agent following a draft recipe, posted here only to check how it reads and renders.

Recap. Read-only scan, parse, and watch subagents named no role and fell through to default, which runs them on the lead's model, so eight spawn sites now name a new routine role that ships as sonnet@medium (gpt-6-luna@medium on Codex), and new resolver tests, passing CI, and a posted PASS+NOTES verdict on the head back it.

Risk. Medium. Eight spawn sites move off the lead's model to sonnet@medium, so check that each site is read-only and returns a reduced finding. The ledger quotes the routine wording at only two of those sites, skills/poteto-mode/SKILL.md and skills/poteto-mode/playbooks/autonomous-run.md.

Base f7a27730 on main, head e822fe64. 18 files, +107 -36.

Area Files Lines What changed
Role roster skills/setup-pstack/scripts/check-models-config.py, skills/poteto-mode/scripts/orch/role-contract.json, skills/setup-pstack/examples/pstack-models.md +4 -1 The resolver and the role contract accept routine, and the shipped defaults set it to sonnet@medium and to gpt-6-luna@medium under ## codex.
Spawn sites skills/poteto-mode/SKILL.md, skills/poteto-mode/playbooks/*.md, skills/automate-me/SKILL.md, skills/principle-guard-the-context-window/SKILL.md +8 -8 Each site puts its scan, parse, or watcher subagent on the routine role, and seven of the eight add a pointer to Spawn a role.
Setup and porting docs skills/setup-pstack/SKILL.md, skills/setup-pstack/references/models-config.md, docs/guide/01-setup.md, PORTING.md +7 -5 The docs define the role's scope, say that routine is the one flat line with a written effort, and record it as a port addition.
Tests tests/skills/setup-pstack/scripts/test_check_models_config.py, tools/test_orch_role_contract.py +29 -0 New tests pin the resolved routine arm on all four harnesses, a user override, and its place in singleRoles.
Promise ledger evals/promises/ledger.json +59 -22 The ledger adds the setup-configures-routine-role promise, rewords one claim and one quote, and replaces two guide units with three new ones.

Reading order.

  1. Core logic. ROLES in check-models-config.py (line 22), the two routine lines in examples/pstack-models.md (lines 27 and 49), and the tests test_routine_ships_a_medium_effort_scan_model_on_every_harness and test_routine_is_a_single_role_in_the_artifact.
  2. Wiring. The routine sentence at each of the eight sites. Start with the Task defaults paragraph in skills/poteto-mode/SKILL.md (line 98).
  3. Boilerplate. evals/promises/ledger.json, docs/guide/01-setup.md, and PORTING.md.

These pointers are a start, not the review. Read the whole diff, because a defect can sit in a file this recap ranks low.

Before. At base, a scan site named no role. Step 1 of Spawn a role sent it to default, which ships as inherit-parent, so the subagent ran on the lead's model.

sequenceDiagram
    participant L as Lead
    participant R as Resolver
    participant S as Scan subagent
    L->>R: resolves default
    R-->>L: returns inherit-parent
    L->>S: spawns with no model field
    S-->>L: returns finding from lead model
Loading

After. The site names routine. On Claude Code the resolver returns sonnet at medium. On Codex it returns gpt-6-luna at medium, on Grok Build grok-4.7 at medium, and on Hermes inherit-parent at medium, as the new test pins. Because the role now resolves to a written effort on every harness, the fork rule no longer allows a fork at these sites. No test in this PR exercises a spawn site, so its tests prove the resolver and the defaults, not that each site names the role.

sequenceDiagram
    participant L as Lead
    participant R as Resolver
    participant S as Scan subagent
    L->>R: [~] resolves routine
    R-->>L: [~] returns sonnet@medium
    L->>S: [~] spawns on sonnet at medium
    S-->>L: returns reduced finding
Loading

@mdsmithaustin

Copy link
Copy Markdown
Owner Author

Recap trial, PR #293, version 1. Throwaway. Written by an agent following a draft recipe, posted here only to check how it reads and renders.

Recap. A native recovery trial batched complete guidance into one outer response, so this PR adds an offline evaluator that checks packaging alongside content and timing, and the posted head review reports passing CLI tests and CI.

Risk. Medium. Verdicts depend on reviewer-supplied requirements, boundaries, and action classifications. Check those inputs before treating a result as recovery compliance. Scope contract

Base 5b99800f on main, head 23c1d9f3. 13 files, +1896 -1.

Area Files Lines What changed
Evaluator evals/skill-recovery/evaluate.py (new) +663 -0 Binds evidence by hash, classifies outer responses, and evaluates recovery windows without model or service calls.
CLI regressions tools/test_skill_recovery.py (new) +801 -0 Exercises the public CLI for malformed evidence, mixed reads, repair timing, chunks, and multiple windows.
Public controls evals/skill-recovery/fixtures/* (new) +332 -0 Adds sanitized failure projections, a synthetic repair control, frozen guidance, reviewed manifests, and provenance notes.
Documentation evals/README.md, evals/skill-recovery/README.md (new) +100 -1 Registers the evaluator and documents its CLI, manifest, supported formats, verdicts, and limits.

Reading order.

  1. Core logic. Read _measure and _evaluate for packaging, the first-action cutoff, and retained repair history.
  2. Wiring. Read _bodies, _trace, and _bind for carrier parsing, call pairing, hashes, and claim validation, then main for JSON and exit codes.
  3. Regression evidence. Start with test_committed_controls and the fixture provenance notes, then read the remaining CLI cases.
  4. Boilerplate. Skim the evaluation catalog addition after checking the manifest and input contracts.

These pointers are a start, not the review. Read the whole diff, because a defect can sit in a file this recap ranks low.

Story. Complete guidance in separate inner blocks can still violate the standalone outer-response rule.

Beat What happened Evidence
Problem The recorded native compaction failure delivered complete guidance together rather than as standalone outer responses. Sanitized projection and provenance
Root cause Separate inner command results shared one outer response, so complete bytes alone did not satisfy the packaging rule. Mixed response blocks, packaging classifier
Fix The offline evaluator keeps outer call identity and judges exact content, packaging, transport, and action order separately. Evaluator implementation commit, assessment logic
Proof At head 23c1d9f3, the posted PASS+NOTES review reports 68 passing CLI tests on Python 3.14.8 and 3.12.14, and all seven CI checks pass. No reviewed real recovery window was replayed with real governing files. Posted head review, skill-checks run, lint run, PR analysis run
For the user Reviewers get JSON verdicts and distinct exits for satisfied, failed, inconclusive, and non-applicable assessments, with failed attempts retained after repair. CLI results, repair rules

Before. Base 5b99800f has no skill-recovery CLI to assess a saved recording and reviewed manifest. The evaluator is added by this PR.

sequenceDiagram
    participant R as Reviewer
    participant S as Saved recording
    participant E as Recovery evaluator
    R->>S: inspects recovery responses
    S-->>R: shows bodies and call boundaries
    Note over E: [-] CLI absent at base
Loading

After. The new CLI reports FAIL for the complete mixed-response control and SATISFIED_WITH_REPAIRS for the synthetic entry repair. This changes offline assessment, not native agent execution. Control expectations, scope limit

sequenceDiagram
    participant R as Reviewer
    participant S as Saved recording
    participant E as Recovery evaluator
    R->>E: [+] supplies trace and manifest
    E->>S: [+] checks bytes and call boundaries
    E-->>R: [+] reports FAIL for mixed control
    R->>E: [+] supplies synthetic repair control
    E-->>R: [+] reports SATISFIED_WITH_REPAIRS
Loading

Review limits. The posted PASS+NOTES review leaves documentation precision notes about canonical JSON escapes and notice matching, plus a missing metadata-copy regression case. Its local full test gate hit four host executable-isolation errors that also occurred on base, despite green CI.

The public controls are sanitized projections and a synthetic contrast, not fresh native trials. The review accepts the scan's two-level JSON escape limit. The manifest still determines which guidance and actions count. Scan scope, posted limit assessment

@mdsmithaustin

Copy link
Copy Markdown
Owner Author

Recap trial, PR #293, version 2. Throwaway. Written by an agent following a draft recipe, posted here only to check how it reads and renders.

Recap. Issue 287 found a Codex recovery that read two governing files in one outer tool response, so evaluate.py grades saved Codex JSONL against a reviewed manifest for content, packaging, transport, and order, and its 68 CLI tests pass at the head in CI and in the posted PASS+NOTES review.

Risk. Low. Every file is new except a docs edit to evals/README.md, and no code outside this PR calls the evaluator. Check the claim checks at the end of _bind. The posted review found that they miss a governing body escaped three JSON levels deep or written in non-canonical JSON, and either miss can yield a false SATISFIED. The review rated both non-blocking because its census of real sessions found 0 such blocks.

Base 5b99800f on main, head 23c1d9f3. 13 files, +1896 -1. Merged as e649e23a, whose tree matches the head.

Area Files Lines What changed
Evaluator evals/skill-recovery/evaluate.py (new) +663 -0 A standard-library CLI parses native Codex call and output records, binds them to a reviewed manifest by SHA-256, and grades each recovery window up to its first governed call.
Tests tools/test_skill_recovery.py (new) +801 -0 68 test methods run the CLI as a subprocess against generated recordings and the three committed fixtures, and assert exit codes and report fields.
Fixtures evals/skill-recovery/fixtures/ (new) +332 -0 Three hand-built JSONL recordings with manifests (mixed-full and pickup-late-entry expect FAIL, repaired-entry expects SATISFIED_WITH_REPAIRS), two one-line guidance files, and a provenance note.
Docs evals/skill-recovery/README.md (new), evals/README.md +100 -1 A new README states the CLI, manifest, and native-input contract, and evals/README.md gains an index row and a third fixture exception.

Reading order.

  1. Core logic. _evaluate decides each window's status, marks repaired attempts, and picks the overall exit code. _measure returns the packaging and the transport flags for one outer response. The claim checks at the end of _bind raise undeclared_governing_body, inconsistent_read_claims, and split_read_claim. They use _encodings, _hits, and _region.
  2. Wiring. _bodies and _trace pair native call records with their outputs and classify each block's carrier. main binds the inputs, turns any input error into exit 2, and prints one JSON report. The manifest and native-input reference is the contract the tests check.
  3. Boilerplate. The JSONL recordings and manifests under evals/skill-recovery/fixtures/, the prepare and rebind helpers in tools/test_skill_recovery.py, and the two edits to evals/README.md.

These pointers are a start, not the review. Read the whole diff, because a defect can sit in a file this recap ranks low.

@mdsmithaustin

Copy link
Copy Markdown
Owner Author

Recap trial, PR #282, version 1. Throwaway. Written by an agent following a draft recipe, posted here only to check how it reads and renders.

Recap. The partial post-sync screen needed a replacement, so this PR records the reruns at 7a9a3ddb, and the posted review reports PASS+NOTES after checking the matrix totals and run metadata.

Risk. Low. The diff adds only a results report and changes no runtime code. Check the tested pin before applying its conclusions to newer skills.

Base ded31f3e on main, head 4ae556d6. 1 file, +140 -0.

Area Files Lines What changed
Evaluation record evals/promises/results/2026-10-20-sync-7a9a3ddb.md (new) +140 -0 Records the verdict matrix, failure classifications, grading refusals, historical comparisons, and follow-ups.

The posted PASS+NOTES review verifies the model and effort values against run records and leaves optional wording notes. The head's lint, skill-checks, and PR workflow runs succeeded. These checks do not establish live behavior at the PR head.

Reading order.

  1. Core evidence. Read the report's scope and grading limits first. The runs tested 7a9a3ddb; later changes to owner files are outside that measurement.
  2. Results and interpretation. Read the matrix and totals, then the FAIL classifications. The report distinguishes known gaps, borderline behavior, and oracle errors.
  3. Comparisons and next steps. Finish with the baseline limits and follow-ups. This PR records proposed grader, oracle, and case changes without implementing them.

These pointers are a start, not the review. Read the whole diff, because a defect can sit in a file this recap ranks low.

Headline. Claude Code's graded coverage rose from 5 of 35 runnable changed-owner cases in the October 19 screen to 35 of 35 in the October 20 screen. See the prior scope and the new scope.

What it does not show. Greater coverage does not establish a pass-rate improvement. The new screen covers 35 of 55 runnable live cases and 53 of 112 live promises. It records 150 PASS, 58 INCONCLUSIVE, and 14 FAIL verdicts, with seven runs refused at grading across Hermes and Grok. The run directories remain outside the repository. See the totals, coverage limit, and run locations and refusals.

@mdsmithaustin

Copy link
Copy Markdown
Owner Author

Recap trial, PR #282, version 2. Throwaway. Written by an agent following a draft recipe, posted here only to check how it reads and renders.

Recap. Step 8 of Syncing from upstream needs a rerun of each live promise whose owner files changed, and the 2026-10-19 record was only PARTIAL, so this PR adds 2026-10-20-sync-7a9a3ddb.md with 35 cases on four harnesses and a class for each of its 14 FAILs, and the round-3 verdict and all 7 checks pass on the head.

Risk. Low. The PR adds one results file and changes no code. The verdicts come from run directories kept outside the repository, so a reviewer can check the file's arithmetic and reasoning but cannot re-derive a verdict from the repository. Check the claim on line 5 that the sync caused none of the 14 FAILs against the FAIL table.

Base ded31f3e on main, head 4ae556d6. 1 file, +140 -0.

The round-3 verdict on this head is PASS+NOTES. All 7 checks on the head passed, including the CI runs PR #282, lint, and skill-checks.

Area Files Lines What changed
Promise results evals/promises/results/2026-10-20-sync-7a9a3ddb.md (new) +140 -0 Records the post-sync live reruns pinned to 7a9a3ddb, with a 53-promise matrix, a class for each FAIL, the 7 refused runs, a comparison with earlier results, and follow-ups.

Reading order.

  1. Core logic. The status and the claim that the sync caused no FAIL (lines 3-5). Then the FAIL table, which classes 10 FAILs as KNOWN, 2 as REAL and borderline, and 2 as ORACLE (lines 90-109).
  2. Wiring. What ran, which runs the grader refused, and why each refusal is a grader gap (lines 7-23). Then the comparison with 2026-10-19-sync-d457567.md and with the "Fixed in this stack" rows of 2026-10-03.md (lines 111-132).
  3. Boilerplate. The matrix rows (lines 27-81). A recount of those rows matches the totals on lines 83-87. Then the open follow-ups (lines 134-140).

The round-3 verdict lists optional notes that this head leaves open. One says that the claim on line 128, that no fixed row is worse than recorded, covers only measured rows.

These pointers are a start, not the review. Read the whole diff, because a defect can sit in a file this recap ranks low.

Headline. The post-sync record grows from 102 verdicts on three harnesses to 222 verdicts on four. Of the 222, 150 are PASS, 58 are INCONCLUSIVE, and 14 are FAIL.

Harness Pass rate in 2026-10-19-sync-d457567.md Pass rate in this PR
Claude Code 10 of 19 44 of 60
Codex 42 of 51 50 of 59
Hermes 4 of 32 22 of 58
Grok not measured 34 of 45

Sources are the 2026-10-19 totals at the base and this PR's totals at the head.

What it does not show. The two files ran different case sets. Claude Code ran 5 cases on 2026-10-19 and 35 here (line 113), so a change in rate does not compare the same cases. Each cell holds one graded run per case and harness, and the 7 refused runs have no verdict. On Hermes, the harvest guard caused 28 of its 34 INCONCLUSIVE verdicts (line 132). The matrix measures 7a9a3ddb. It does not measure fab7600d or ded31f3e, which merged later and changed owner files of promises in this matrix (line 9).

@mdsmithaustin

Copy link
Copy Markdown
Owner Author

Hero prototype 285 Mermaid, throwaway. One GitHub-rendered flowchart TB for PR 285, laid out as why, what, how, and proof. Facts come from gh pr view, gh pr diff, and the code at the PR head, run in a disposable clone. Its accTitle and accDescr carry the alt text.

---
config:
  flowchart:
    wrappingWidth: 330
    nodeSpacing: 20
    rankSpacing: 26
    padding: 8
---
flowchart TB
  accTitle: PR 285 hero, Mermaid variant
  accDescr: Compaction kept only the first 20,000 characters of poteto-mode, which cut 20 of 25 playbook routes including Babysit and Shipping and let an agent merge without the watcher, so PR 285 moves the recovery rule and playbook index to the top, extracts three references, and adds a 16,000-byte lint budget, leaving 0 of 25 routes past the cut.
  classDef why fill:#fff8c5,stroke:#9a6700,color:#1f2328
  classDef del fill:#ffebe9,stroke:#cf222e,color:#1f2328
  classDef add fill:#dafbe1,stroke:#1a7f37,color:#1f2328
  classDef chg fill:#ddf4ff,stroke:#0969da,color:#1f2328
  classDef note fill:#f6f8fa,stroke:#8c959f,color:#59636e,stroke-dasharray:4 3
  subgraph WHY["WHY · issue 265"]
    direction TB
    W1["In one session, compaction kept only the first<br/>20,000 chars of poteto-mode. The copy ended:<br/>“…Refactoring (rename, extract, inline, de”"]
    W2["Then an agent merged 3 PRs with no watcher<br/>(Babysit: watch-pr READY before merge)"]
    W1 --> W2
  end
  subgraph WHAT["WHAT · 21 files, +236 −129"]
    direction TB
    E["~ SKILL.md −90 +49<br/>recovery rule + playbook index moved first"]
    R["+ 3 references: task-triggers,<br/>delegation, writing"]
    L["+ check-mode-entry-size.py<br/>16,000-byte lint budget"]
    E -- "rules move to" --> R
    E -- "guarded by" --> L
  end
  subgraph HOW["HOW · where the 20,000-char cut lands"]
    direction LR
    B["− BEFORE 8731b6eb<br/>24,079 bytes<br/>index at chars 17,994–24,033<br/><b>20 of 25 routes cut</b><br/>incl. Babysit, Shipping"]
    A["+ AFTER bc43c972<br/>15,756 bytes<br/>index at chars 1,795–8,229<br/><b>0 of 25 routes cut</b><br/>last route at char 8,134"]
    B --> A
  end
  subgraph PROOF["PROOF"]
    direction TB
    P1["head's check, base: FAIL 24079/16000, exit 1<br/>head's check, head: PASS 15756/16000, exit 0<br/>PASS+NOTES review · 7 of 7 checks green"]
    N["not shown: the cut is one reported session, and bytes are not tokens. The recovery run was Codex. No Claude Code compaction ran."]
    P1 --> N
  end
  WHY --> WHAT --> HOW --> PROOF
  class W1,W2 why
  class E chg
  class R,L,A,P1 add
  class B del
  class N note
  style WHY fill:#ffffff,stroke:#d0d7de
  style WHAT fill:#ffffff,stroke:#d0d7de
  style HOW fill:#ffffff,stroke:#d0d7de
  style PROOF fill:#ffffff,stroke:#d0d7de
Loading

@mdsmithaustin

Copy link
Copy Markdown
Owner Author

Hero prototype 285 story card, throwaway. A hand-authored HTML card for PR 285, rendered to PNG at 2x with pinned Chromium and attached with gh pr comment --attach. Facts come from gh pr view, gh pr diff, and the code at the PR head, run in a disposable clone.

PR 285 story: in one session compaction kept only the first 20,000 characters of the poteto-mode entry, cutting 20 of its 25 playbook routes including Babysit and Shipping before an agent merged 3 PRs without the watcher, so the fix moves the recovery rule and playbook index to the top, extracts three references, and adds a 16,000-byte lint that fails the old 24,079-byte entry and passes the new 15,756-byte entry, which has 0 routes past the cut.

@mdsmithaustin

Copy link
Copy Markdown
Owner Author

Hero prototype 285 annotated artifact, throwaway. The real base and head text of skills/poteto-mode/SKILL.md and the real output of the head's tools/check-mode-entry-size.py on both, with callouts, for PR 285. Facts come from gh pr view, gh pr diff, and the code at the PR head, run in a disposable clone.

PR 285 story: in one session compaction kept only the first 20,000 characters of the poteto-mode entry, cutting 20 of its 25 playbook routes including Babysit and Shipping before an agent merged 3 PRs without the watcher, so the fix moves the recovery rule and playbook index to the top, extracts three references, and adds a 16,000-byte lint that fails the old 24,079-byte entry and passes the new 15,756-byte entry, which has 0 routes past the cut.

@mdsmithaustin

Copy link
Copy Markdown
Owner Author

Hero prototype 285 to-scale 2-up, throwaway. Both versions of the entry drawn to scale from their real section offsets, side by side against the same cut, for PR 285. Facts come from gh pr view, gh pr diff, and the code at the PR head, run in a disposable clone.

PR 285 story: in one session compaction kept only the first 20,000 characters of the poteto-mode entry, cutting 20 of its 25 playbook routes including Babysit and Shipping before an agent merged 3 PRs without the watcher, so the fix moves the recovery rule and playbook index to the top, extracts three references, and adds a 16,000-byte lint that fails the old 24,079-byte entry and passes the new 15,756-byte entry, which has 0 routes past the cut.

Format probe: the same diagram as an SVG attachment

PR 285 to-scale diagram as SVG, same story as the PNG above.

@mdsmithaustin

Copy link
Copy Markdown
Owner Author

Hero prototype 274 Mermaid, throwaway. One GitHub-rendered flowchart TB for PR 274, laid out as why, what, how, and proof. Facts come from gh pr view, gh pr diff, and the code at the PR head, run in a disposable clone. Its accTitle and accDescr carry the alt text.

---
config:
  flowchart:
    wrappingWidth: 330
    nodeSpacing: 20
    rankSpacing: 26
    padding: 8
---
flowchart TB
  accTitle: PR 274 hero, Mermaid variant
  accDescr: Eight read-only scan, parse, and watch spawn sites named no role, so they fell through to default and ran on the lead's model, and PR 274 names them on a new routine role that resolves to sonnet at medium on Claude Code and gpt-6-luna at medium on Codex, proven by resolver tests and green CI.
  classDef why fill:#fff8c5,stroke:#9a6700,color:#1f2328
  classDef del fill:#ffebe9,stroke:#cf222e,color:#1f2328
  classDef add fill:#dafbe1,stroke:#1a7f37,color:#1f2328
  classDef chg fill:#ddf4ff,stroke:#0969da,color:#1f2328
  classDef note fill:#f6f8fa,stroke:#8c959f,color:#59636e,stroke-dasharray:4 3
  subgraph WHY["WHY · commit 53e7815"]
    direction TB
    W1["8 read-only spawn sites named no role:<br/>transcript mining, artifact parsing, watchers.<br/>So they took default = inherit-parent and<br/>ran on the lead's model and effort."]
  end
  subgraph WHAT["WHAT · 18 files, +107 −36"]
    direction TB
    S["~ 8 caller sentences now say<br/>“… on the routine role”"]
    C["+ routine in ROLES and<br/>role-contract singleRoles"]
    D["+ shipped defaults<br/>routine: sonnet@medium<br/>codex: gpt-6-luna@medium"]
    S -- "resolved by" --> C
    C -- "reads" --> D
  end
  subgraph HOW["HOW · resolver output, base vs head"]
    direction LR
    B["− BEFORE f7a27730<br/>resolve routine:<br/>unknown role, exit 2<br/>so: default, inherit-parent<br/>on all 4 harnesses"]
    A["+ AFTER e822fe64<br/>resolve routine:<br/>Claude Code sonnet@medium<br/>Codex gpt-6-luna@medium<br/>Grok grok-4.7@medium *<br/>Hermes inherit-parent@medium *"]
    B --> A
  end
  subgraph PROOF["PROOF"]
    direction TB
    P1["3 new tests: 4 harness defaults, a user<br/>override, contract membership<br/>7 of 7 checks green · PASS+NOTES review"]
    N["not shown: no live cost, latency, or quality run. * Grok spawns take no effort, and Hermes keeps the parent model. 6 of 8 site edits have no test or ledger quote."]
    P1 --> N
  end
  WHY --> WHAT --> HOW --> PROOF
  class W1 why
  class S chg
  class C,D,A,P1 add
  class B del
  class N note
  style WHY fill:#ffffff,stroke:#d0d7de
  style WHAT fill:#ffffff,stroke:#d0d7de
  style HOW fill:#ffffff,stroke:#d0d7de
  style PROOF fill:#ffffff,stroke:#d0d7de
Loading

@mdsmithaustin

Copy link
Copy Markdown
Owner Author

Hero prototype 274 story card, throwaway. A hand-authored HTML card for PR 274, rendered to PNG at 2x with pinned Chromium and attached with gh pr comment --attach. Facts come from gh pr view, gh pr diff, and the code at the PR head, run in a disposable clone.

PR 274 story: eight read-only scan, parse, and watch spawn sites named no role and inherited the lead's model through default, so the PR adds a routine role that resolves to sonnet@medium on Claude Code, gpt-6-luna@medium on Codex, grok-4.7@medium on Grok, and inherit-parent@medium on Hermes, pinned by three new tests and green CI.

@mdsmithaustin

Copy link
Copy Markdown
Owner Author

Hero prototype 274 annotated artifact, throwaway. Real check-models-config.py --resolve output on base and head for each harness, plus real diff lines, with callouts, for PR 274. Facts come from gh pr view, gh pr diff, and the code at the PR head, run in a disposable clone.

PR 274 story: eight read-only scan, parse, and watch spawn sites named no role and inherited the lead's model through default, so the PR adds a routine role that resolves to sonnet@medium on Claude Code, gpt-6-luna@medium on Codex, grok-4.7@medium on Grok, and inherit-parent@medium on Hermes, pinned by three new tests and green CI.

@mdsmithaustin

Copy link
Copy Markdown
Owner Author

Hero prototype 274 rewiring 2-up, throwaway. The same 8 spawn sites wired to default before and to routine after, with real resolver values, for PR 274. Facts come from gh pr view, gh pr diff, and the code at the PR head, run in a disposable clone.

PR 274 story: eight read-only scan, parse, and watch spawn sites named no role and inherited the lead's model through default, so the PR adds a routine role that resolves to sonnet@medium on Claude Code, gpt-6-luna@medium on Codex, grok-4.7@medium on Grok, and inherit-parent@medium on Hermes, pinned by three new tests and green CI.

@mdsmithaustin

Copy link
Copy Markdown
Owner Author

Design A for PR 274, throwaway

Read-only scan, parse, and watch helpers named no role, so they resolved through default to the lead's model and effort; PR 274 adds a routine role, names it at all eight call sites, and resolves it to medium effort and, except on Hermes, a model per harness.

Eight call sites, automate-me, session-pickup, trace-forensics, guard-the-context-window, runtime-forensics, worktree-cleanup, autonomous-run, and poteto-mode, were wired to default, which is inherit-parent, the lead's model. They are now wired to routine, which resolves to sonnet@medium on Claude Code, gpt-6-luna@medium on Codex, grok-4.7@medium on Grok Build, and inherit-parent@medium on Hermes.

Not covered. No live run measured cost or scan quality, Grok Build runs the role at session effort, and six of the eight call-site edits have no test or ledger quote.

@mdsmithaustin

Copy link
Copy Markdown
Owner Author

Design B for PR 274, throwaway

Read-only scan, parse, and watch helpers named no role, so they resolved through default to the lead's model and effort; PR 274 adds a routine role, names it at all eight call sites, and resolves it to medium effort and, except on Hermes, a model per harness.

Whiteboard sketch. Eight read-only scan, parse, and watch helpers had an arrow to default, the lead's model and effort, which is crossed out. A new arrow goes to routine, which maps Claude Code to sonnet, Codex to gpt-6-luna, Grok Build to grok-4.7, and Hermes to the lead's model, all at medium effort.

Not covered. No live run measured cost or scan quality, Grok Build runs the role at session effort, and six of the eight call-site edits have no test or ledger quote.

@mdsmithaustin

Copy link
Copy Markdown
Owner Author

Design C for PR 274, throwaway

Read-only scan, parse, and watch helpers named no role, so they resolved through default to the lead's model and effort; PR 274 adds a routine role, names it at all eight call sites, and resolves it to medium effort and, except on Hermes, a model per harness.

Eight call sites, automate-me, session-pickup, trace-forensics, guard-the-context-window, runtime-forensics, worktree-cleanup, autonomous-run, and poteto-mode, join one connector. Before, it led to the default role, inherit-parent model and effort on all four harnesses. After, it leads to routine, which resolves to sonnet@medium on Claude Code, gpt-6-luna@medium on Codex, grok-4.7@medium on Grok Build, and inherit-parent@medium on Hermes.

Not covered. No live run measured cost or scan quality, Grok Build runs the role at session effort, and six of the eight call-site edits have no test or ledger quote.

@mdsmithaustin

Copy link
Copy Markdown
Owner Author

Design D for PR 274, throwaway

Read-only scan, parse, and watch helpers named no role, so they resolved through default to the lead's model and effort; PR 274 adds a routine role, names it at all eight call sites, and resolves it to medium effort and, except on Hermes, a model per harness.

Two identical panels. Before, eight call sites lead to default, which is inherit-parent on Claude Code, Codex, Grok Build, and Hermes. After, the same eight lead to routine, which resolves to sonnet@medium on Claude Code, gpt-6-luna@medium on Codex, grok-4.7@medium on Grok Build, and inherit-parent@medium on Hermes.

Not covered. No live run measured cost or scan quality, Grok Build runs the role at session effort, and six of the eight call-site edits have no test or ledger quote.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant