Skip to content

retro 2026-10-20: plan as the record of done, verdict boxes in the gate, workflow setup, three contradictions - #25

Merged
leegmoore merged 18 commits into
limfrom
retro/2026-10-20
Oct 22, 2026
Merged

leegmoore merged 18 commits into
limfrom
retro/2026-10-20

Conversation

@leegmoore

@leegmoore leegmoore commented Oct 22, 2026 •

Copy link
Copy Markdown

The pstack changes from the 2026-10-20 retro, in Lee's words in ~/.local/state/pstack/retro/rounds/2026-10-20/decisions.md. Based on #24 (upstream sync), which brings in the formal verification skills used here.

What changes for agents

  • The plan is the record of done. multi-phase-plan keeps the per-PR verify boxes and adds an optional Verify, model. block for a PR whose risk is event order, run with the project's formal verification skill. A new ## Appendix. Later work and scope cuts lists scope cuts and splits later work into decided no (each with its reason) and owed. Close-out files tickets only from owed and names every scope cut. autopilot-full closes out from that list. check-plan.mjs checks all of this, and requires schedule_task in place of the literal /loop 1h, only for a plan whose How to read this has the template's new line "This plan is the record of done." A plan written before this PR keeps the checks it had, and its own Appendix E (such as the operator's reserved calls) is never read as the new appendix. Every plan gets its verdict box ids printed.
  • Verdict and gate. Under the pstack-verdict: line, the verdict lists each required box as box <id>: done, n/a. <reason> or skipped. <what did not run>. Every agent posts as the same GitHub account, so no PR comment can waive a skip. The lead waives one on the gate run that merges, --accept-skip <id>=<reason>, once per box. Before merging, the gate posts one PR comment listing each waived box and reason, and the waived column of its run log records them. An empty reason, a bad or repeated id, or a box the verdict did not skip exits 2 and merges nothing. merge-gate --plan <file> --plan-pr <id> refuses a verdict that omits a box, lists a box more than once, has an unreadable box line, gives n/a or skipped without a reason, or has a skip the run did not waive. Only the box lines under the counted verdict line count, so an edit that leaves an older verdict's boxes above a new verdict line does not carry them over. check-plan and the gate read a plan's blocks and boxes with one parser in plan-boxes.mjs. A block changes only at a recognized block heading, and a box is nested only when it sits inside the list item above it, so the gate requires exactly the boxes check-plan checks. Findings outside the boxes stay the approver's call.
  • Deferrals. bugbot-triage: a "can't happen" race deferral carries the model check's result when the plan has a Verify, model block. Review cost alone is not a reason to defer. A deferral goes into the Later work appendix.
  • Workflow setup. poteto-mode's Playbooks section: after picking the playbook, set up a T3 thread workflow fitted to the work in a handful of chunks, tell the user, ask in chat while they are there and use the question tool only when they are away. Every workflow ends with a cleanup step run by a subagent over the scope the lead lists. The store todo file stays as the fallback.
  • Handback through ketchup in autonomous-run, feature, bug-fix, refactoring, perf-issue, hillclimb, visual-parity and shipping.
  • The three contradictions. autonomous-run, autopilot-full and multi-phase-plan no longer send Claude leads to /loop or Monitor. pause-safely writes the resume note to ~/.local/state/pstack/resume/<session>.md, which ~/lim-v2/bin/resume-note-hook reads, and session-pickup looks there. Reflect saves and summarizes, raises only decisions that can't wait, and applies nothing. Its reviewers report what happened with evidence and a classification (bad port, bad application, contradiction, genuine gap).
  • Heartbeat. autonomous-run: each heartbeat retests the blocker it reports before repeating it.
  • Retro scripts. retro.mjs register --model <provider>/<model>@<run-N|date> keeps every model a thread ran on, shown in REGISTRY.md and the round README. The backup finds gitleaks at $GITLEAKS_PATH if set, else on PATH, else the newest ~/lim/service/gitleaks/*/bin/gitleaks. When none runs it fails the scan step, pushes nothing, and REGISTRY.md names each place it looked.

Verification

  • GC2's real verdict (feat(group-chat): port the engine onto the in-process thread port t3code-v2#18, issuecomment-6262808190) is kept verbatim in merge-gate/fixtures/gc2-verdict.md. The gate refuses it because it omits all 16 required boxes. merge-gate --check --plan <real plan> --plan-pr GC2 on the live PR refuses it the same way. The fixture plan yields the same 16 ids as the real plan.
  • Skip waivers: a pstack-skip: line in any comment counts for nothing. Tests cover Codex's case at ab2994d (an older verifier's comment signs perf, a later verifier skips it), the round 1 reproduction (pstack-skip: perf by=codex/gpt-6.1-sol under a Codex verdict), and a verifier writing the lead's name. Each is refused without --accept-skip. At ab2994d, Codex's case and the forged-name case would merge. A waived skip passes, and the PR comment is posted once, before the merge, with the reason, and the run log records it. A failed post, or a verdict that stops skipping the box before the merge, merges nothing. Ignoring omitted boxes fails the tests.
  • Codex's four findings at acda474 each have a test that failed there. Indented lanes get their ids, in check-plan and through --plan. Bold text inside a verify block keeps the boxes after it. Box lines above the counted verdict line are ignored. A box listed twice is refused.
  • bun test in poteto-mode/scripts: 223 pass. bun run typecheck clean. retro.test.mjs: 49 pass. check-t3-port: clean, 32 tests pass. check-pstack-docs: 0 problems.
  • check-plan.mjs on the template skeleton reports only the placeholder model it reported before this PR. On the running limhealth-next port and staging plans it gives the same exit code and the same problem lines as at lim (0 and 0 problems, 1 and 20), adding only the verdict box id lines. Its output on both plans is byte-identical to acda474's and ab2994d's.

Before this lands

  • Per Lee's step 7, the counterpart verifier replays the group chat run against this PR before it merges.

🤖 Generated with Claude Code

@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Oct 22, 2026 •

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review ✅ Completed 2026-10-22T03:32:16.048200Z 17779f3 Manual request
ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: d59628c448

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread pstack/skills/poteto-mode/scripts/plan-boxes.mjs Outdated
Comment thread pstack/skills/poteto-mode/scripts/merge-gate/read.ts Outdated
Comment thread pstack/skills/poteto-mode/scripts/merge-gate/gate.ts
@leegmoore

Copy link
Copy Markdown
Author

pstack-verdict: FAIL head=d59628c4485e92832c167496bca47bb5146ac4f2 base=408b02f65e1091f3bc432d38d0dd82083b7b07f5 by=codex/gpt-6.1-sol

Two blocking findings, independently reproduced at this head:

  • [P1] Retro backup cannot find the installed scanner. retro.mjs:449–455 invokes only bare gitleaks; line 520 blocks every pending backup when it is absent from PATH. The installed /home/leemoore/lim/service/gitleaks/8.30.1/bin/gitleaks reports 8.30.1 but is not on this host's PATH. In a temporary retro store with a local bare remote, the parent backed up a harmless registration; the head logged backup scan failed (gitleaks is not on PATH...), recorded failure.step=scan, and advanced only the local commit, leaving the remote SHA unchanged. Setting GITLEAKS_PATH did not help. Giving the head process the installed binary's directory on PATH made scanning and backup succeed. Resolve the actual installed/configured scanner as part of this change while preserving fail-closed behavior. The PR's claim that gitleaks is not installed is incorrect.
  • [P1] The verifier can authorize its own skip by posting a second comment. gate.ts:235–252 excludes only the verdict comment's id; lines 435–439 accept any resulting skip with the same box id. Using the actual CLI, the repo's fake-forge harness and temporary Git repositories: a Codex PASS+NOTES verdict listing perf as skipped, followed by a separate pstack-skip: perf by=codex/gpt-6.1-sol I am the verifier and accept my own skip., exits 0 with WOULD MERGE and 1 skip signed by the lead. No lead signed it. The existing self-signing test covers only a signature inside the verdict comment. Check the separate signature's signer against the verifier/lead distinction too.

All four requested checks completed:

  • GC2 gate: substantive refusal confirmed. Ran this head's merge-gate --repo liminal-ai/t3code-v2 --pr 18 --check --plan /home/leemoore/.local/state/pstack/docs/t3gchat-fork-plan.md --plan-pr GC2 from the t3code-v2 clone. Exit 1: missing: Plan boxes. The verdict omits 16 required boxes of GC2, naming unit-1 through unit-5, live-1 through live-10 and perf. This was not a usage/parse failure. The already-merged historical PR also fails the open-PR and current-diff requirements; the repo's open-PR fixture separately passes its historical-refusal test.
  • Replay saved, bullets with evidence, to /home/leemoore/.local/state/pstack/retro/rounds/2026-10-20/replay.md. Read the supplied root audit, cross-model review, root and relevant owner trails, real plan, and the original T3 thread directly with t3_thread_read. Summary: (a) GC2's missing verification is caught, subject to the skip defect above; (b) owed/decided-no separation reduces indiscriminate ticket filing but does not guarantee coherent grouping into four or five tickets; (c) the scope-cuts list would expose desktop/remote omissions at handback, without correcting the scope decision itself; (d) review cost alone is now explicitly rejected as GC5's deferral reason; (e) invented three-round limits and five human sign-offs remain unsolved; (f) the original Connect handoff is not prevented, although retesting its blocker could shorten the false wait. Accurate Lee-decided/agent-proposed marking would expose provenance in (e), but would not itself prevent those gates, and would not catch (f), whose plan already assigned the check to the root. The replay also evaluates E1 (keep reasons) and E2 (reserved calls) for both cases.
  • gitleaks: FAIL, as reproduced above; no real backup store was mutated.
  • Existing plans: compatibility issue confirmed; automatic hourly stall not established. The active limhealth-next-port-plan.md passes the parent validator and fails the head for missing Owed, scope-cut close-out text, close-out schedule deletion and the new appendix. The staging plan already failed its parent for documented customizations; head adds the same four failures. Orchestrate state has port-p8 and tooling-1 building. Their hourly prompt rereads playbooks but does not call check-plan; neither orch nor merge-gate's plan-box reader runs the full validator. Thus the next explicit validation fails, but a claim that the next hourly reread mechanically stalls or cancels the program is unsupported. Its existing Appendix E is Lee's reserved calls and its findings go to a discussion list; reconcile that live plan deliberately rather than reinterpreting those sections as owed tickets.

Checked all eight brief areas against Lee's decisions: (1) plan sections and optional model checks match, with the compatibility note above; (2) verdict coverage works, lead waiver enforcement fails; (3) owed-only close-out/scope disclosure and conditional model evidence match, with the replay's stated limits; (4) customized workflow setup, consolidated chunks, question timing and scoped cleanup match; (5) named single-task handbacks use ketchup; (6) persistent timers, durable resume path and observational reflect replace the three contradictions; (7) heartbeat retests its blocker; (8) model-history registration works, scanner discovery fails. The prose changes are placed at the relevant decisions. The unsolved human-gate cases should remain described as unsolved, per Lee's decision.

Validation: frozen Bun install; 205/205 Bun tests; both strict typechecks; 46/46 retro tests; T3 port check clean and 32/32 port tests; documentation check zero problems. Reviewed in an isolated worktree. Origin CLI is absent, so forge operations used gh with the explicit repository. No install, merge, production action, Linear write or message to another thread was performed.

leegmoore added a commit that referenced this pull request Oct 22, 2026
…/service

The verifier's FAIL on #25 showed the installed scanner at
~/lim/service/gitleaks/8.30.1/bin is not on PATH, and GITLEAKS_PATH had no
effect. These tests fail at d59628c.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
leegmoore added a commit that referenced this pull request Oct 22, 2026
…refused

Reproduces the verifier's finding on #25: a Codex PASS+NOTES verdict with
perf skipped, then a separate 'pstack-skip: perf by=codex/gpt-6.1-sol' comment,
exits 0 with WOULD MERGE at d59628c. Every agent posts as one GitHub account,
so only by= tells the verifier from the lead. Also pins that a skip line with
no signer never counts.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: acda474b17

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread pstack/skills/poteto-mode/scripts/plan-boxes.mjs Outdated
@leegmoore

Copy link
Copy Markdown
Author

pstack-verdict: PASS head=acda474b17da3835f4de4f84bd2321face0334c4 base=408b02f65e1091f3bc432d38d0dd82083b7b07f5 by=codex/gpt-6.1-sol

Round 2 independent verification. No blocking findings. Both round-one P1 findings are fixed, and the existing-plan compatibility issue is resolved.

  • Scanner discovery passes. Used the actual retro.mjs, temporary stores and local bare backup remotes, with PATH containing git and flock but no gitleaks. With the real home, it found /home/leemoore/lim/service/gitleaks/8.30.1/bin/gitleaks and pushed successfully. With an empty temporary home and GITLEAKS_PATH naming that binary through a temporary symlink, it also scanned and pushed. In both cases the remote matched the local HEAD. With no scanner in any supported location, it recorded failure.step=scan, named the searched locations in stderr and REGISTRY.md, and left the remote unchanged. An invalid configured path also refused the backup. The round-one script still fails with the same installed scanner off PATH, confirming the behavior changed. Registration continues to return 0 while preserving its local record when backup fails, as documented.
  • Self-signed skips are refused. Exercised the real merge-gate CLI entry point with the repository's fake forge, temporary Git repositories and GC2's actual plan. A Codex verdict skipping perf plus a separate Codex pstack-skip: exits 1 with unsigned skip: perf. A mixed-case signer, surrounding whitespace/extra spaces, and tab-separated variants also refuse. A separate skip signed by claudeAgent/claude-opus-5-5 exits 0 with WOULD MERGE and 1 skip signed by the lead. Every probe used --check; none merged.
  • In-flight plans retain their checks. Compared head against origin/lim at a3bd495. The real limhealth port plan exits 0 with no errors in both. The staging plan exits 1 with the same 20 error lines, byte for byte. Adding the opt-in sentence to a temporary copy of the port plan makes head refuse for the missing Owed, scope-cut and schedule cleanup markers and the missing named Later work appendix. Its existing Appendix E does not substitute for that appendix.
  • GC2 still refuses for omitted boxes. Ran head's gate against liminal-ai/t3code-v2#18 with --check --plan /home/leemoore/.local/state/pstack/docs/t3gchat-fork-plan.md --plan-pr GC2. Exit 1 names all 16 omissions, unit-1 through unit-5, live-1 through live-10, and perf. The historical PR also fails the already-merged/current-change checks; the separate open-PR fixture passes its omitted-box refusal test. This is a substantive plan-box refusal, not a usage failure.

Read the round-one brief, verdict and replay, Lee's decisions, the implementation brief and latest PR description. Reviewed d59628c..acda474 and reread the whole PR for regressions across all eight implementation areas. The prose remains at the planning, verification, deferral, workflow, close-out and handback decisions it changes. The replay was not redone or modified. Its limits remain applicable: ticket grouping still requires judgment, scope disclosure does not correct scope choices, and invented human gates and the original Connect handoff remain unsolved, as Lee decided.

Validation at this head: frozen Bun install succeeds; 210/210 Bun tests; both strict typechecks; 49/49 retro tests; T3 port check clean and 32/32 port tests; documentation check zero problems. Reviewed in a detached worktree, removed afterward along with the test repositories. Origin CLI is absent, so forge operations used gh with the explicit repository. No installation into the agent directories, merge, production action, real backup-store mutation, Linear write or message to another thread was performed.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: ab2994d8d4

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread pstack/skills/poteto-mode/scripts/merge-gate/gate.ts Outdated
@leegmoore

Copy link
Copy Markdown
Author

pstack-verdict: PASS head=ab2994d8d416b1de67dae3c4041c336ba3b3a90c base=408b02f65e1091f3bc432d38d0dd82083b7b07f5 by=codex/gpt-6.1-sol

Independent verification of acda474..ab2994d, with a regression read of the gate and plan parsing. I did not author the code; the fixer was Claude Opus 5.5. Read the general verification brief, shipping step 1, FORK.md, the round-two fix brief, and the previous PASS verdict at acda474. No new findings.

All four original findings reproduce at acda474 and are refused at this head. These probes use the actual merge-gate CLI main, argument parsing, Git reads and verdict hashing, with the repository's fake forge and temporary Git remotes. Every probe uses --check and asserts no forge merge call:

  • Indented boxes: with one, two or three spaces before the ten top-level live boxes, check-plan accepts the plan at both revisions. At acda474 its verdict IDs omit every live lane and a verdict omitting those lanes returns WOULD MERGE. At ab2994d check-plan prints all ten IDs and the gate exits 1 naming live-1 through live-10 as omitted.
  • Bold text in a verify block: inserting **Linux.** before lane 6 leaves check-plan accepting the plan at both revisions. At acda474 the gate drops live-6 through live-10 and returns WOULD MERGE without their dispositions. At ab2994d it exits 1 naming those five omissions.
  • Stale boxes in an edited verdict comment: an old verdict followed by all 16 done lines, then a fresh verdict with no box lines, returns WOULD MERGE at acda474. At ab2994d it exits 1 naming all 16 omissions. The complete single-verdict control passes at both revisions.
  • Duplicate dispositions: adding a second live-1 line passes at acda474, both when the duplicate says done and when it says n/a with a reason. Both cases exit 1 at ab2994d with listed more than once: live-1.

Regression checks:

  • GC2 still refuses: the live --check against feat(group-chat): port the engine onto the in-process thread port t3code-v2#18 and the actual t3gchat-fork-plan.md exits 1 and names all 16 missing dispositions: unit-1 through unit-5, live-1 through live-10, and perf. It also refuses separately because that historical PR is merged and its current change cannot be hashed. The fake-forge run with the real plan and recorded historical verdict confirms the missing-box refusal independently. Self-signed perf skips still refuse with unsigned skip: perf.
  • Real box inventories: independently enumerated source checkbox lines and compared them with the shared parser and generated IDs across all PR sections. No required box is dropped or double-counted. The group chat plan has 101 required IDs across seven sections; its five nested unit substeps remain attached to their parent boxes. The limhealth port plan has 111 required IDs across nine sections; staging has 91 across nine. Each perf block still produces one disposition ID for its four measurement boxes. All three plans' IDs match acda474.
  • In-flight compatibility: check-plan stdout, stderr and exit status on both limhealth-next plans are byte-identical to acda474. Against origin/lim at a3bd495, exit codes and all problem lines are unchanged, and stdout differs only by the added verdict-ID lines. Port remains exit 0 with zero problems; staging remains exit 1 with the same 20 problems.
  • Suites: 216/216 Bun tests; bun run typecheck passes both strict projects; 49/49 retro tests; T3 port check clean and 32/32 port tests; documentation check zero problems; delta whitespace check clean.

Used detached worktrees for both revisions and removed them and the temporary test repositories afterward. Origin CLI is absent, so forge operations used gh with the explicit repository. The Bun suite's orch subprocess automatically ran the frozen dependency bootstrap in the disposable head worktree; no installation into ~/.agents or ~/.claude occurred. No merge, production action, Linear write or message to another thread was performed. This review covers the requested delta and parser/gate regressions; it does not replace or revise the previous full review and replay.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 183a5d3ec5

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread pstack/skills/poteto-mode/playbooks/pause-safely.md
@leegmoore

Copy link
Copy Markdown
Author

pstack-verdict: PASS head=183a5d3ec566d1f07adf62e6256861d7d54eb9ff base=408b02f65e1091f3bc432d38d0dd82083b7b07f5 by=codex/gpt-6.1-sol

Independent verification of ab2994d..183a5d3, with a regression read of the gate. I did not write this code. The fixer was Claude Opus 5.5. Read the general verification rules, shipping step 1, FORK.md, Lee's decision, the round-three fix brief, prior briefs and verdicts, and the current PR description. No new findings.

  • Comment waivers are gone. Used the actual CLI main with the repo's fake forge, real Git reads and verdict hashing, temporary Git remotes, and GC2's real plan. Also launched the executable entry point through a fake gh transport. At ab2994d, an older Claude verifier's pstack-skip line lets a later Codex verdict skip perf and returns WOULD MERGE. A verifier forging the lead's name also passes there. Both refuse at 183a5d3 without --accept-skip. The original round-one separate self-signature under the Codex verifier's own name already refuses at ab2994d and continues to refuse at this head. Same-comment self-signatures refuse too. Arbitrary approval prose, copied gate waiver comments, CLI flag text, JSON waiver objects, extra box lines in separate comments and multiple signer names do not waive the selected verdict's skipped box. The read path no longer parses comment waivers.
  • Explicit waivers work. A skipped perf box with --accept-skip perf= passes. One-waiver and two-waiver merge probes each post exactly one comment listing every waived box and reason, naming the verdict and head, before exactly one fake merge call. runs.tsv records the reasons and merged outcome. --check records would-merge and its waivers while posting and merging nothing. The executable-level probe confirms the same comment ordering and log contents through GhGitHub.
  • Errors merge nothing. Missing waiver arguments, missing equals/reasons, empty or whitespace-only reasons, empty or malformed ids, repeated ids, and ids absent from the verdict or marked done/n/a exit 2 and are logged as errors. General argument errors, either half of the plan-option pair, an unknown plan section and an unreadable plan also exit 2. Skipped boxes without their own disposition reason and duplicate dispositions still refuse even with an explicit waiver. A rejected comment post and a thrown post error both refuse with zero merge calls. If the fresh verdict marks the waived box done or n/a, omits it, becomes FAIL/malformed, or disappears, the gate posts and merges nothing. The executable probes separately confirm post failure and verdict change.
  • The lead instructions match Lee's decision. shipping.md steps 1 and 4 and multi-phase-plan.md put the waiver on the lead's gate invocation. The gate says the reason on the PR before merging. Findings outside the required boxes remain the approver's call. No playbook still instructs the lead to post pstack-skip lines. This removes the failed premise that a comment's by= field authenticates its signer.
  • GC2 still refuses substantively. The live --check against feat(group-chat): port the engine onto the in-process thread port t3code-v2#18 with the real t3gchat-fork-plan.md exits 1 for all 16 omitted dispositions, unit-1 through unit-5, live-1 through live-10 and perf. Its historical merged state and unhashable current empty change also refuse independently. The fake-forge historical-verdict probe confirms the same missing-box refusal on an open PR.
  • Plan compatibility is unchanged. check-plan stdout, stderr and exit status on both real limhealth-next plans are byte-identical to ab2994d. Port exits 0 with zero problems. Staging exits 1 with the same 20 problems.
  • All suites pass. 223/223 Bun tests, both strict typecheck projects, 49/49 retro tests, T3 port check clean and 32/32 port tests, documentation check zero problems, and delta whitespace check clean. Independent probes additionally cover the parent/head cases and error paths above.

Used separate detached worktrees for parent and head. Existing dependencies were copied into the disposable worktrees; no installer ran. Both worktrees and the independent probes' temporary repositories were removed. Origin CLI is absent, so forge operations used gh with the explicit repository. No real merge, agent-directory installation, production action, Linear write or message to another thread was performed. This verdict covers the requested delta and gate regressions; the previous full review and replay retain their stated scope and limits.

leegmoore and others added 18 commits October 21, 2026 20:25
* fix(pstack): make a brand with a type guard, not as

Upstream 0317eb8 (cursor#700), taken unchanged.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* docs(pstack): port upstream's docs refresh and docs-vs-tree check

Port of upstream 019a6a2 (cursor#704). The guide and README take upstream's
plain-language pass, and scripts/check-pstack-docs.mjs comes in as is.
Left out: the Claude Code plugin install text and custom-mode wording
(Install row), and the generated harness tree.

The check found three skills the fork bundles that the README never
listed (control-cli, control-ui, deslop, copied from cursor-team-kit),
so the README table now lists them.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* fix(pstack): list every waiting item so each ketchup call is decidable

Port of upstream 16541c6 (cursor#692) and bc14437 (cursor#708). Every item waiting
on the user is listed with its pick, evidence and risk, and items are
never cut to stay under a word count.

Adapted for T3: screenshots and recordings stay inline, and diagrams
and charts stay on the html_render page, in place of Mermaid and
/visualize (Visuals row). The description keeps the named-only ending
without disable-model-invocation (Skill visibility row).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* feat(pstack): add the formal verification skills and offer them in setup

Port of upstream 4382e68 (cursor#709), f9be7aa (cursor#715), 6b78e9f (cursor#721),
7b353f7 (cursor#716) and the guide line from d457567 (cursor#724).
create-formal-verification-skill and maintain-formal-verification-skill
come in with upstream's text. setup-pstack gains step 8, the formal
verification offer. poteto-help, its recipes, the README and the guide
mention both skills.

Adapted for T3: both descriptions end with the named-only sentence and
drop disable-model-invocation (Skill visibility row). poteto-help keeps
the fork's per-user install steps and T3 note, with upstream's new
setup offer added to its step 2 (Install row). The guide's Claude Code
install line is left out (Install row). Version bumps are left out.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* fix(pstack): restore /sharpen to rewriting the prompt

Port of upstream 75fabac (cursor#712) and 88d4751 (cursor#729), taken over the
fork's do-the-work version at Lee's call in the 2026-10-20 retro.
/sharpen asks four questions, then hands back the rewritten prompt and
leaves the user's choices open. README, guide and poteto-help follow.

Adapted for T3: the description keeps the named-only ending without
disable-model-invocation (Skill visibility row). Version bump left out.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* docs(fork): log sync 2 and move the sync point to f2bad52

Records each upstream commit from 101b274 to f2bad52 as take, adapt or
skip, and adds check-pstack-docs.mjs to the checks a sync runs.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* fix(pstack): allow the negative-control break and name the project skill path in the formal verification skills

Codex review on PR 24: the maintain skill's edit scope forbade the scratch break its
own step 5 requires, and the create skill never said where the project skill lives.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* fix(pstack): let the create skill's handoff break the code, and let maintain report updated and bug together

Codex review on PR 24 (r2): the create skill forbade the scratch break its own handoff
check needs, and the maintain skill asked for one outcome while allowing two.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
…en gitleaks is missing

register takes --model <provider>/<model>@<from>, repeatable, where
<from> is a run ordinal from t3_thread_read's recentRuns or a date. Every
model is kept in order, so a thread that changed lead models shows each
one. REGISTRY.md and the round README list them.

The backup used to treat a missing gitleaks as no hits and push. It now
fails the scan step, pushes nothing, says so on stderr and heads
REGISTRY.md with the failure until a write backs up cleanly.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Lee's decision in the 2026-10-20 retro: reflect saves and summarizes in
a few lines, surfaces only product or ops decisions that can't wait,
and applies nothing. Approval, filing and skill edits move to the retro
round's open and close.

The three reviewer briefs now ask for what happened, with evidence and
a classification (bad port, bad application, contradiction, genuine
gap), not principles routed to skills. The synthesizer checks and merges
those observations by incident instead of sorting proposals into
Accepted, Rejected and Backlog. The save step records each model the
thread ran on. README, guide and poteto-help follow.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…e notes in the store

Three installed instructions contradicted the role file and the
resume-note hook (2026-10-20 retro, step 1):

- autonomous-run step 2, autopilot-full and multi-phase-plan told a
  Claude lead to use /loop or Monitor. The role file's Waking and
  polling section says those die when the session restarts, so every
  lead now uses T3's schedule_task. check-plan.mjs stops requiring the
  literal /loop 1h marker and requires schedule_task instead.
- pause-safely wrote the resume note to /tmp. It now goes to
  ~/.local/state/pstack/resume/<session>.md, which
  ~/lim-v2/bin/resume-note-hook reads after a compaction, and
  session-pickup looks there.

autonomous-run also says each heartbeat retests the blocker it reports
before repeating it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
From the 2026-10-20 retro. The plan already held the verify boxes, the
fix bar and the scope, but later stages did not read it back, so
deferrals piled into tickets and scope cuts reached Lee as his own
discovery.

- multi-phase-plan keeps the per-PR verify boxes and adds an optional
  Verify, model block for a PR whose risk is the order of events
  (queues, Stop, retries, restarts), run with the project's formal
  verification skill. A new Appendix E lists scope cuts and splits later
  work into decided no, each with its reason, and owed. Close the
  program files tickets only from owed and names every scope cut.
- autopilot-full closes out from that list and names the scope cuts in
  its reply.
- bugbot-triage: a deferral that says a race cannot happen carries the
  model check's result when the plan has a Verify, model block, and
  review cost alone is not a reason to defer.
- check-plan.mjs checks the new blocks and appendix, and prints each
  PR's verdict box ids. plan-boxes.mjs holds the fence and box rules so
  the merge gate reads plans the same way.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…signed skip

Lee's merge-gate decision in the 2026-10-20 retro: each PR gets a short
must-verify list from its plan, the approver may waive an item with a
reason on the PR, and findings outside the list stay the approver's
call.

- shipping step 1: under the pstack-verdict line, the verdict lists each
  required box of the PR's plan section as done, n/a with a reason, or
  skipped. A skip needs the lead's signed pstack-skip line on the PR,
  and until then the verdict is not a pass.
- merge-gate takes --plan <file> --plan-pr <id> and adds a Plan boxes
  requirement. It refuses a verdict that omits a required box, a box
  line it cannot read, n/a or skipped with no reason, and a skip no one
  with a role in the repo signed outside the verdict comment. Skips are
  checked with no plan given too.
- Tested on GC2's real verdict
  (liminal-ai/t3code-v2#18, issuecomment-6262808190), kept verbatim in
  fixtures/gc2-verdict.md, against a plan fixture with GC2's 16 boxes.
  The gate refuses it. Run against the real plan in the pstack store,
  merge-gate --check refuses it the same way.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The autopilots already end by catching the operator up per the ketchup
skill. The build playbooks that hand finished work back did not:
autonomous-run, feature, bug-fix, refactoring, perf-issue, hillclimb,
visual-parity and shipping now do, keeping each playbook's own content.
Read-only and planning playbooks (investigation, the forensics, eval,
prototype, multi-phase-plan) keep their replies, since the answer is
the reply.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…laybook

Lee's decision in the 2026-10-20 retro: once the playbook is picked and
the agent has decided how to use it, the agent sets up a T3 thread
workflow from a template or open-ended, fitted to the actual work in a
handful of consolidated steps, and tells the user it is set up. A step
that waits on the user is asked in chat while the user is there, and
the question tool is for getting their attention when they are away.

Every workflow ends with a cleanup step. The lead lists what it
remembers creating and the scope it worked in, a cleanup subagent
scours that scope and deletes what is clearly from the run, and the
user is asked only about the rest.

The pstack-store todo file stays as the fallback where workflows are
off. session-pickup reads the thread's workflow, and FORK.md's Todo
list row says so.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…/service

The verifier's FAIL on #25 showed the installed scanner at
~/lim/service/gitleaks/8.30.1/bin is not on PATH, and GITLEAKS_PATH had no
effect. These tests fail at d59628c.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…vice

The backup ran bare `gitleaks`, so on a host where the scanner is installed
but not on PATH every push stopped at the scan step. A GITLEAKS_PATH that
does not run fails closed rather than falling back, and the not-found error
names each place it looked.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…refused

Reproduces the verifier's finding on #25: a Codex PASS+NOTES verdict with
perf skipped, then a separate 'pstack-skip: perf by=codex/gpt-6.1-sol' comment,
exits 0 with WOULD MERGE at d59628c. Every agent posts as one GitHub account,
so only by= tells the verifier from the lead. Also pins that a skip line with
no signer never counts.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
findSignedSkips excluded only the verdict comment itself, so the verifier
could accept its own skip by posting a second comment.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…checks

At d59628c the running limhealth-next port plan fails the new Owed, scope
cut, schedule_task and Later work requirements, and an existing appendix
whose title mentions later work is taken for the new one. These tests fail
there: a plan without the template's opt-in keeps the checks it had, the
template opts in, and only the exact new title counts.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The template's How to read this now writes "This plan is the record of
done.", and only a plan with that line must carry the Owed, scope cut and
schedule_task close-out and the Later work appendix. Other plans keep the
checks they were written under, /loop 1h included. The appendix is
"## Appendix. Later work and scope cuts", found by that exact title, so a
plan's own Appendix E, such as the operator's reserved calls, is never
read as it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Codex's four findings on acda474, each failing here: lanes indented in the
plan get no ids, bold text inside a verify block drops the boxes after it,
box lines above the counted verdict line still count, and a box listed twice
passes.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…with one parser

plan-boxes.mjs now owns the block and box reading both use. A block changes
only at a recognized block heading, so bold text such as **Linux.** inside a
verify block keeps the boxes after it. A box is nested only when it sits
inside the list item above it, so lanes indented one to three spaces get
their live ids, and check-plan checks lanes, perf items and empty blocks
against the same top-level boxes the gate requires.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…h box once

Box lines above the counted verdict line belong to an older verdict an edit
left behind, so they no longer count toward the current one. A box listed
more than once is refused, since the verdict then does not say which status
holds.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…n a PR comment

Every agent posts as the same GitHub account, so no PR comment can show
that the lead accepted a skip. Two fixes that read a by= field in a
comment both failed: a verifier could sign its own skip, and then an
older verifier's comment could sign a later verifier's skip.

The lead is the only agent that runs the gate to merge, so the waiver
moves onto that run: --accept-skip <id>=<reason>, repeatable. The gate
accepts a skipped box only when the run waives it with a reason. Before
it merges, it posts one PR comment listing each waived box and reason,
and a new waived column in runs.tsv records them. An empty reason, a
bad id, a repeated id, or a box the verdict did not skip is a usage
error. pstack-skip: parsing is gone, and shipping and multi-phase-plan
tell the lead to use the flag.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@leegmoore
leegmoore changed the base branch from sync/upstream-0.15.29 to lim October 22, 2026 03:25
@leegmoore

Copy link
Copy Markdown
Author

@codex review

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 17779f3350

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread pstack/skills/poteto-mode/scripts/merge-gate/plan.ts
@leegmoore
leegmoore merged commit a5caa93 into lim Oct 22, 2026
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