Repository navigation
pstack: restore /sharpen to the original prompt, return only the rewrite - #729
Conversation
…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>
Verdict: PASS+NOTESIndependent verifier (I did not write this PR). Head The skill text
Repo checks
DocsAll 16 changed files were read. Every
|
| 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)
- I could not check one frozen input,
/srv/sxh/run-one.sh, because it exists only on the eval machine. - 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.
- 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.
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
…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)
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.
## 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.
<!-- 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> <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> </div> Co-authored-by: Cursor Agent <cursoragent@cursor.com> Co-authored-by: Kaitian Xie <caelaxie@users.noreply.github.com>
Why
/sharpenon 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.
/sharpennow only returns a rewritten prompt and never does the task. The docs, guide, and/poteto-helptext 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: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", andunsloprule 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:
These files now describe
/sharpenas returning a rewritten prompt that doesn't do the task:pstack/README.mdpstack/docs/guide/02-poteto-mode.mdpstack/docs/guide/10-recipes-and-pitfalls.mdpstack/skills/poteto-help/SKILL.mdpstack/skills/poteto-help/references/recipes.mdNothing else in pstack calls
/sharpenor relies on it doing the task.The version goes from
0.15.28to0.15.29, andharness/pstack/claude-codewas 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.
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, andnode scripts/validate-plugins.mjsall pass.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.