Skip to content

pstack: restore /sharpen to the original prompt, return only the rewrite - #729

Merged
poteto merged 4 commits into
mainfrom
lauren/restore-sharpen-original-834c
Oct 20, 2026
Merged

poteto merged 4 commits into
mainfrom
lauren/restore-sharpen-original-834c

Conversation

@poteto

@poteto poteto commented Oct 20, 2026 •

Copy link
Copy Markdown
Collaborator

Why

/sharpen on main drifted from the prompt it came from. It now asks different questions, and it ends with "then do the work" instead of handing back a rewritten prompt. A drift eval found that the main version lost the original's four asks. Those asks are what a top professional would add, the rawest material, the methods and tools, and an outside check. The one place where main beat the original was leaving the user's choices open.

This PR restores the original prompt's words and appends one sentence. /sharpen now only returns a rewritten prompt and never does the task. The docs, guide, and /poteto-help text that said it "does the work" now match that behavior.

What changed

pstack/skills/sharpen/SKILL.md: the body is the original prompt with its four asks as a numbered list, plus one appended paragraph:

Leave choices that are mine to make open instead of deciding them.

The list format clears three of pstack's own prose rules that the inline original broke: technical-writing "Use periods, not semicolons", technical-writing "Make text in parentheses a full grammatical unit", and unslop rule 13 "no parentheses". The original separated its asks with semicolons and (1) to (4) markers. The only new words are "do four things", so that a complete sentence introduces the list. No word was removed.

The frontmatter keeps the skill wrapper (disable-model-invocation: true), and the description now matches the restored behavior.

Some candidate additions from the main version were left out because the drift eval showed no gain for them:

  • "Always keep one outside check": the original already scored at the ceiling.
  • "Better, not bigger" and "what the user is really after": the gains were small, and the score was lower or equal for most models.
  • "Over- or underspecified", "loosen constraints", and "no framing": none was linked to a gain.

These files now describe /sharpen as returning a rewritten prompt that doesn't do the task:

  • pstack/README.md
  • pstack/docs/guide/02-poteto-mode.md
  • pstack/docs/guide/10-recipes-and-pitfalls.md
  • pstack/skills/poteto-help/SKILL.md
  • pstack/skills/poteto-help/references/recipes.md

Nothing else in pstack calls /sharpen or relies on it doing the task.

The version goes from 0.15.28 to 0.15.29, and harness/pstack/claude-code was regenerated.

Eval

Two preregistered rounds compared the restored text against the original on six held-out scenarios from fields that the drift eval did not use: grant writing, endurance coaching, tenant law, hiring, medication review, and vegetable gardening. Three models from three vendors (Anthropic, OpenAI, and xAI) ran each scenario twice per arm in sandboxed runs. Judges from the other vendors graded blind, with 2 judges per packet across 36 packets per round. Round 1 tested the inline text. Round 2 tested the numbered-list text in this PR against the same original replies, with the same harness, scenarios, judges, and gates.

Item Original Inline text (round 1) List text (round 2)
Four asks (each 0–2) 2.00 / 2.00 / 1.94 / 1.99 1.96 / 2.00 / 1.96 / 2.00 1.94 / 2.00 / 1.96 / 1.97
Full rewritten prompt 36/36 36/36 36/36
Leaves the user's choices open (0–1) 0.50 1.00 (+0.47) 1.00 (+0.50, 95% CI +0.35 to +0.65, higher for all 3 models)
Replies the judges scored as partly doing the task 1/36 2/36 0/36
Judges preferred over the original 82% 82%

The original's column shows its round-2 grades. Each change is against the original's grades from the same round. For choices left open, the original scored 0.53 in round 1 and 0.50 in round 2.

Verdict for the list text: pass on every gate. The four asks match the original, every reply is a full rewritten prompt, no reply does the task, and the appended sentence shows its gain. The format kept the inline text's behavior.

The task-execution bar is zero replies. It failed in round 1 and passes in round 2, but the format change did not clearly cause that. The judges graded the same original replies again in round 2, and the original's count went from 2 to 1. So this flag moves by about one reply between gradings. On reading, no flagged reply in either round writes the plan or does the task. The flags come from concrete expert numbers in the "what a professional would do" section, which is the original's first ask.

Checks: node scripts/generate-pstack-harness-trees.mjs --check, node scripts/check-pstack-docs.mjs, and node scripts/validate-plugins.mjs all pass.

Open in Web Open in Cursor 

Note

Low Risk
Documentation and skill prompt text only; no runtime code, auth, or data paths change.

Reviewed by Cursor Bugbot for commit 9713a6a. Bugbot is set up for automated code reviews on this repo. Configure here.

cursoragent and others added 4 commits October 20, 2026 01:05
…ve choices open

Co-authored-by: lauren <poteto@users.noreply.github.com>
Co-authored-by: lauren <poteto@users.noreply.github.com>
Co-authored-by: lauren <poteto@users.noreply.github.com>
Drops the semicolons and the (1) to (4) markers that broke technical-writing
and unslop rule 13. Adds "do four things" so a complete sentence introduces
the list. Every other word is unchanged.

Co-authored-by: lauren <poteto@users.noreply.github.com>
@cursor

cursor Bot commented Oct 20, 2026

Copy link
Copy Markdown

Verdict: PASS+NOTES

Independent verifier (I did not write this PR). Head 9713a6a, compared with parent main at ddf824a. The branch is 0 behind and 4 ahead of main, and its merge base is main's tip.

The skill text

  • The body of pstack/skills/sharpen/SKILL.md has the words of the original prompt. A word-level diff against the original adds only "do four things" and "Leave choices that are mine to make open instead of deciding them." It removes no word. The four asks are a numbered list.
  • harness/pstack/claude-code/skills/sharpen/SKILL.md is byte-identical to the source.
  • The tested arm L in the eval bundle (variants/L/SKILL.md, sha256 563dfc46…) is byte-identical to the branch file. Arm A matches the original prompt.

Repo checks

Check main ddf824a head 9713a6a
node scripts/validate-plugins.mjs valid valid
node scripts/generate-pstack-harness-trees.mjs --check up to date up to date
node scripts/check-pstack-docs.mjs 0 problems, 32 of 32 commands in the guide 0 problems, 32 of 32 in the guide
Claude Code tree regenerated from scratch, diff -r against the committed tree – identical

Docs

All 16 changed files were read. Every /sharpen mention in pstack/ now says that it names the four asks, hands back a rewritten prompt, leaves the user's choices open, and does not do the task. These mentions are in README.md, guide chapters 02 and 10, poteto-help's intent table, and recipes.md. No mention still says "does the work". Each harness file mirrors its source. The version is 0.15.29 in all four plugin manifests.

/sharpen run as a user would, parent against head

Two fresh agents got the same request in a field the eval did not use: "Write me a cover letter for a junior data analyst job at a regional hospital. I have a stats degree and two years doing reporting at a credit union." Each agent had one skill body loaded, as /sharpen <args> loads it.

main text head text
Writes the cover letter Yes, a full letter with bracketed blanks No
Answers the four asks Not shown Yes, all four, with a separate section for each
Returns a rewritten prompt No Yes, a full prompt
Leaves the user's choices open Some, as blanks in the letter Yes, the prompt ends with 6 choices to ask the user about: tone and length, lead accomplishments, the reason for the move, the addressee, a work sample, and which tools to emphasize

Eval

I checked the eval data against the PR body and the eval doc. Round 2's summary.json gives the same numbers:

  • Four asks within −0.06 of the original.
  • Full rewrites: 36 of 36.
  • Replies that partly do the task (judge mean ≥ 1): 0 of 36 for L, 1 of 36 for the original.
  • Choices left open: +0.50, 95% CI +0.35 to +0.65.
  • Judges preferred L: 82%.
  • pass: true.

After I extracted the bundles, 15 of the 16 frozen inputs matched frozen-hashes.txt in each round.

Notes (do not block the merge)

  1. I could not check one frozen input, /srv/sxh/run-one.sh, because it exists only on the eval machine.
  2. A reply still gives the four-ask analysis before the rewritten prompt, as the original asks. The docs describe this correctly. "Return only the rewrite" in the title means that the reply does not do the task. It does not mean the reply has no analysis.
  3. My parent-against-head run is one prompt on one model. It is a spot check on top of the 108-run eval, not a replacement for it.

CI validate and Cursor Bugbot both passed on 9713a6a. There are no review threads.

@poteto
poteto marked this pull request as ready for review October 20, 2026 02:21
@poteto
poteto merged commit 88d4751 into main Oct 20, 2026
2 checks passed
@poteto
poteto deleted the lauren/restore-sharpen-original-834c branch October 20, 2026 02:25
creedants added a commit to creedants/pstack-t3 that referenced this pull request Oct 20, 2026
Syncs upstream pstack to 0.15.29 (cursor/plugins#729), which restores
`/sharpen` to its original prompt and returns only the rewritten prompt.

## What changed

- `vendor/pstack/` matches upstream `pstack/` at 88d47514b8, and
`upstream.json` and the README badge name 0.15.29.
- `skills/sharpen/SKILL.md` ships the new upstream prompt through the
build. It needs no override.
- `t3/overrides/poteto-help/SKILL.md` and `references/recipes.md` carry
upstream's one-line sharpen changes with the `$sharpen` prefix. Nothing
else in them changes, and their lock entries are refreshed.

## Verification

- All 172 vendored files match upstream's blobs, and the vendored tree
hash equals upstream's `pstack/` subtree.
- `python3 scripts/run_tests.py` passes in four parts. `python3
scripts/build.py` leaves no diff, and `python3 scripts/check.py` prints
`ok`.

Kind: upkeep
SmailG added a commit to SmailG/claude-cursor-plugins that referenced this pull request Oct 20, 2026
…ginal prompt, return only the rewrite (cursor#729)

chore: sync with cursor/plugins — pstack: restore /sharpen to the original prompt, return only the rewrite (cursor#729)
mstephenholl added a commit to mstephenholl/pstack-claude-codex that referenced this pull request Oct 20, 2026
Upstream: cursor/plugins@a66a8931c2dd

Closes #24. `merge-upstream.py` stopped on a conflict that needed a
person, so this pull request finishes that merge by hand. Upstream has
moved past the issue's `88d4751` since then, but the newer commits touch
nothing the port keeps.

## From upstream

- **`sharpen`**: back to upstream's original prompt (cursor#729). It asks four
expert questions and returns only the rewritten prompt.
- **`create-formal-verification-skill`**: TLA+ as the default for
ordering questions in any language, generated inputs when no verifier
supports the language (cursor#721), and a recorded coverage list and sync
commit in the generated skill. Its hand-off now points users to
`/maintain-formal-verification-skill`.
- **`maintain-formal-verification-skill`**: new (cursor#716). It brings a
project's formal verification back in line after code changes that
skipped the check, and says whether each failure is drift in the
verification or a bug in the code.

## Conflict resolved

- **`setup-pstack/SKILL.md`**: upstream's only change was a new step
offering a formal verification skill (cursor#715). The rest of upstream's side
of the conflict was its own Cursor version of this skill, which the port
replaces. I kept the port's version and added the offer as step 7,
worded the port's way: read
`~/.agents/pstack/skills/create-formal-verification-skill/SKILL.md` and
follow it, instead of invoking the skill wherever Cursor installed
pstack.

## Ported

- **`maintain-formal-verification-skill`** (separate commit): it finds
and updates a project-local verify skill, so it gets the
`pstack-harness` pointer, whose rules say where to search for project
skills in Claude Code and Codex. It is user-only, so it gets the Codex
policy file. It is added to `SKILLS` in `port/install.sh`. The README
now lists each verification skill next to its maintain skill, so
"Keeping that skill accurate" sits under the skill it refers to again.

## Proof

- 252 unit tests and `install_test.sh` pass, and `check.py` reports 0
problems across 54 pstack skills.
- Not run: `port/smoke/smoke.py`. It tests the installed copy in
`~/.agents/pstack` and needs Codex, which isn't on this machine. Its
scenarios don't cover `sharpen`, `setup-pstack`, or either formal
verification skill.
mdsmithaustin added a commit to mdsmithaustin/pstack that referenced this pull request Oct 20, 2026
## Why

`/sharpen` still used the older upstream prompt that performs the task. Port upstream [#729](cursor/plugins#729) to restore its four numbered asks and rewritten-prompt output. Live testing also exposed task execution on Hermes and added implementation deliverables on Claude Code and Grok.

## What changed

- Port the skill, README, usage guides, help routing and recipe, trigger metadata, upstream marker, and guide ledger.
- Preserve portable invocation controls and add explicit rewrite-only and original-deliverable boundaries while keeping the four upstream asks intact.
- Record the local boundaries in PORTING.md and commit a receipt for the final runtime revision, including the earlier failures and observed coverage limits.

## Scope

This covers the #729 prompt-rewrite contract and its maintained usage documentation. The historical prose audit is a separate read-only report.

## Tradeoffs

The local boundary prose extends #729 because the exact upstream wording did not reliably stop execution or preserve scope across supported harnesses. PORTING.md tells future syncs to retain those boundaries.

## Blast Radius

Users receive framing answers and a rewritten prompt, then decide whether to run it. The change affects `/sharpen` output, help routing, and their documentation.

## Guide promises

Keep the stable `sharpen-frames-task-before-work` promise ID. Replace its obsolete claim and quotes, remove six stale guide units, classify eight replacement units, and bind its source evidence to the final scope-preserving rewrite instruction.

## Verification

- The final four-harness validation exercised 26 live CLI turns on the current runtime bytes. The committed receipt separates those observations from earlier failures and historical canonical grades. Claude's conditional model-setup question remains explicitly unverified in that sample.
- Fresh current-run Codex smoke validation exercises all five runtime scenario groups. Prior canonical help cases passed eight of eight on unchanged help-owner bytes.
- Staged lint, `skill-ci check`, ledger and whitespace checks pass. Independent documentation review passes. Current required CI and the final independent Shipping verdict are checked before merge.
caelaxie added a commit to pstack-ports/devin-pstack that referenced this pull request Oct 21, 2026
<!-- CURSOR_AGENT_PR_BODY_BEGIN -->
synced to
[`88d4751`](cursor/plugins@88d4751).
compared `d457567..main` for `pstack/`; later commits on upstream `main`
through
[`190d287`](cursor/plugins@190d287)
do not touch `pstack/`. version is `0.15.29` in `plugin.json`,
`.devin-plugin/plugin.json`, and the readme marker.

ported:
-
[`88d4751`](cursor/plugins@88d4751)
([#729](cursor/plugins#729)) restore `/sharpen`
to the original prompt and return only the rewrite. the four asks are a
numbered list. guide pages 2 and 10, poteto-help, and recipes match.
slash commands keep the `/pstack:` prefix. `disable-model-invocation:
true` stays `triggers: [user]`. the version bumps to `0.15.29`. the same
bump is in `.devin-plugin/plugin.json` and the readme marker, which is
where this repo records the version.

skipped:
- `harness/pstack/claude-code/` copies in
[#729](cursor/plugins#729). this port does not
carry the generated claude code tree.
- [#729](cursor/plugins#729)
`pstack/.cursor-plugin/plugin.json`. cursor packaging. the version bump
lands in `.devin-plugin/plugin.json` instead.
- [#729](cursor/plugins#729) upstream readme
skill-table row for `/sharpen`. this port's readme is a pointer, not a
copy of the upstream catalog. the version marker is bumped. the skill is
indexed in poteto-help, the guide, and recipes.

harness proof (install, `devin plugins list`, exercising
`/pstack:sharpen`) will follow as a comment. the devin cli can't log in
from this cloud environment.

<!-- CURSOR_AGENT_PR_BODY_END -->

<div><a
href="https://cursor.com/agents/bc-bf8417c3-b3aa-578a-802c-c397d0ff82c9?cursor_ref=pr_footer&cursor_cta=open_in_web"><picture><source
media="(prefers-color-scheme: dark)"
srcset="https://cursor.com/assets/images/open-in-web-dark.png"><source
media="(prefers-color-scheme: light)"
srcset="https://cursor.com/assets/images/open-in-web-light.png"><img
alt="Open in Web" width="114" height="28"
src="https://cursor.com/assets/images/open-in-web-dark.png"></picture></a>&nbsp;<a
href="https://cursor.com/background-agent?bcId=bc-bf8417c3-b3aa-578a-802c-c397d0ff82c9&cursor_ref=pr_footer&cursor_cta=open_in_cursor"><picture><source
media="(prefers-color-scheme: dark)"
srcset="https://cursor.com/assets/images/open-in-cursor-dark.png"><source
media="(prefers-color-scheme: light)"
srcset="https://cursor.com/assets/images/open-in-cursor-light.png"><img
alt="Open in Cursor" width="131" height="28"
src="https://cursor.com/assets/images/open-in-cursor-dark.png"></picture></a>&nbsp;</div>

Co-authored-by: Cursor Agent <cursoragent@cursor.com>
Co-authored-by: Kaitian Xie <caelaxie@users.noreply.github.com>
leegmoore added a commit to liminal-ai/pstack-lim that referenced this pull request Oct 22, 2026
* 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>
leegmoore added a commit to liminal-ai/pstack-lim that referenced this pull request Oct 22, 2026
…te, workflow setup, three contradictions (#25)

* sync: upstream cursor/plugins 101b274 to f2bad52 (pstack 0.15.29) (#24)

* 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>

* fix(retro): record each model a thread ran on, and stop the backup when 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>

* fix(reflect): record what happened and apply nothing

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>

* fix(poteto-mode): wake on schedule_task in every lead, and keep resume 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>

* feat(poteto-mode): make the plan the record of what done means

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>

* feat(merge-gate): refuse a verdict that omits a plan box or has an unsigned 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>

* feat(poteto-mode): hand single-task work back through ketchup

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>

* feat(poteto-mode): set up a thread workflow right after picking the playbook

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>

* test(retro): the backup finds gitleaks through GITLEAKS_PATH or ~/lim/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>

* fix(retro): resolve gitleaks from GITLEAKS_PATH, PATH, then ~/lim/service

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>

* test(merge-gate): a skip the verifier signs in a separate comment is 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>

* fix(merge-gate): a skip signed with the verifier's by= does not count

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>

* test(check-plan): plans written before the record of done keep their 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>

* fix(check-plan): the later-work checks apply only to plans that opt in

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>

* test(merge-gate): plan box ids, stale box lines and duplicate boxes

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>

* fix(check-plan): check-plan and the merge gate read blocks and boxes 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>

* fix(merge-gate): count only the box lines under the verdict line, each 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>

* fix(merge-gate): the lead waives a skipped box on the gate run, not in 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>

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
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.

2 participants