Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/upstream-sha
Original file line number Diff line number Diff line change
@@ -1 +1 @@
eb4db2b55b2b7dec3d9282754cddf0a56bf4ff10
e73df471cd4bd918367e99f3dd9c51bd53ddf5f0
5 changes: 3 additions & 2 deletions PORTING.md

Large diffs are not rendered by default.

3 changes: 2 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -127,6 +127,7 @@ the full rules and playbooks live in [`skills/poteto-mode/SKILL.md`](./skills/po
| [`/why`](./skills/why/SKILL.md) | you want to know why something was built this way. discovers available MCPs at run time and queries each evidence category in parallel (source control, issue tracker, long-form docs, real-time chat, infra observability, error tracking, analytics warehouse). |
| [`/recall`](./skills/recall/SKILL.md) | you're starting or resuming work and want your recent context on a topic rebuilt from your own chat history and the shared record, handed back as a tight current-state brief. |
| [`/ketchup`](./skills/ketchup/SKILL.md) | you want what changed in this chat since your last message, in plain words and small visuals, with every item waiting on you listed and decidable from the reply alone, even when that makes the reply long. |
| [`/ketchup-video`](./skills/ketchup-video/SKILL.md) | you want the `/ketchup` catch-up as a short silent video of slides, with the calls waiting on you as text under it. |
| [`/blast-radius`](./skills/blast-radius/SKILL.md) | you have a small-looking change and want to know what else it could break, with the one fact it's safe because of proven by running code, not asserted. |
| [`/architect`](./skills/architect/SKILL.md) | you're about to write code that crosses a function boundary and want the caller's usage, types, and module shape settled first. |
| [`/arena`](./skills/arena/SKILL.md) | you want N parallel attempts at the same thing, then to grab the best parts of each. |
Expand Down Expand Up @@ -310,7 +311,7 @@ tools/gate-check.sh test

The `lint` tier checks cross-suite references, the [mode entry byte budget](./skills/pstack-harness/references/skill-retention.md), personal home paths, the generated subagent bundle, the promise ledger, the shipped models config, and skill reference spelling (`tools/test_skill_references.py`). The skill reference spelling scope and exceptions are documented in [PORTING.md](./PORTING.md#substitution-map). `skill-ci check` runs the shared skill checks, as described below. The `test` tier runs the tools, promise, and setup-pstack unit suites. It installs the poteto-mode and pr-recap sketch dependencies with their frozen lockfiles, runs both Bun test suites and poteto-mode's typecheck, then runs the statechart script tests with `node --test`. Each check belongs to one tier, except skill reference spelling and the repository mode entry byte-budget check, which the tools unit suite also runs. The script runs every check in the selected tier, prints a PASS or FAIL line for each, and exits nonzero if any check fails. Unit suites and Bun tests must report tests, not a zero-test success.

The statechart suite skips TLC-dependent tests when `TLA2TOOLS` is unset or points to a missing file. Run `node skills/statechart/scripts/statechart.mjs --help` for TLC setup requirements.
The statechart suite resolves TLC through the script's setup helper and skips TLC-dependent tests if that resolution fails. Run `node skills/statechart/scripts/statechart.mjs --help` for TLC setup requirements, including automatic installation through mise.

`python3 tools/check-personal-paths.py` scans the names and current contents of every Git-tracked file for concrete account names below `/Users/<account>` or `/home/<account>`. It scans symlink target spelling without following the link, skips contents containing NUL bytes as binary, and decodes other bytes with UTF-8 replacement. Filenames are checked even for binary files. Exact file-scoped content exceptions cover existing synthetic fixtures. An unused exception fails the default working-tree check used by the gate and CI. Index and pushed-tip modes suppress exact known synthetic matches without requiring every fixture to exist in each snapshot. Diagnostics redact account names and identify the file and line without printing source contents. Line 0 identifies a filename finding. Exit 1 means a personal path was found. Exit 2 means file acquisition or exception validation failed, or no tracked text files were inspected. A successful scan exits 0 and reports the number of tracked text files checked. Pre-push exits 0 without scanning when Git supplies no nondeleted local tips. The required CI `skills` job runs this checker explicitly, alongside the shared skill-ci checks.

Expand Down
2 changes: 2 additions & 0 deletions docs/guide/10-recipes-and-pitfalls.md
Original file line number Diff line number Diff line change
Expand Up @@ -160,6 +160,8 @@ That's the whole prompt. [`/bro`](../../skills/bro/SKILL.md) restates the last m

[`/ketchup`](../../skills/ketchup/SKILL.md) tells you in plain words what changed since your last message, then lists each call waiting on you with its pick, evidence, and risk. It changes nothing while it reports.

To watch the catch-up instead, run [`/ketchup-video`](../../skills/ketchup-video/SKILL.md). It shows what happened in a short silent video of slides, and lists the calls waiting on you as text under it.

## The pitfalls

- **Enumerating skills in the prompt.** "use /how then /architect then /arena" reorders steps the playbook already sequences. State the goal and constraints. Name a skill only to override a default.
Expand Down
80 changes: 62 additions & 18 deletions evals/promises/ledger.json
Original file line number Diff line number Diff line change
Expand Up @@ -1775,6 +1775,25 @@
"skills/ketchup/SKILL.md"
]
},
"ketchup-video-shows-catch-up-as-video": {
"check": "static",
"claim": "/ketchup-video shows the catch-up in a short silent video of slides and lists the calls waiting on the user as text under it.",
"evidence": [
{
"file": "skills/ketchup-video/SKILL.md",
"quote": "Show what happened in a short silent video instead of its summary and visuals."
},
{
"file": "skills/ketchup-video/SKILL.md",
"quote": "The reply is ketchup's opening sentence, the embedded video, one line naming any work left that you can do yourself, and the action items."
}
],
"harness_sensitive": false,
"owners": [
"skills/ketchup-video/SKILL.md",
"skills/ketchup/SKILL.md"
]
},
"land-prompt-routes-to-shipping": {
"check": "live",
"claim": "`land the stack.` runs the Shipping playbook.",
Expand Down Expand Up @@ -3410,21 +3429,22 @@
"claim": "In an audit, the chart marks the steps where the code model and the spec differ, and each rule either breaks is a numbered path.",
"evidence": [
{
"file": "skills/statechart/scripts/statechart.mjs",
"quote": "With --against, red states break a rule in"
"file": "skills/statechart/scripts/statechart-help.mjs",
"quote": "state takes the worse of its two models' colors"
},
{
"file": "skills/statechart/scripts/statechart.mjs",
"file": "skills/statechart/scripts/statechart-help.mjs",
"quote": "A label \"with the fix, STEP\" or \"in the spec, STEP\" is a step that only the other model takes."
},
{
"file": "skills/statechart/scripts/statechart.mjs",
"file": "skills/statechart/scripts/statechart-help.mjs",
"quote": "A thick blue border and numbered labels mark the bug."
}
],
"harness_sensitive": false,
"owners": [
"skills/statechart/scripts/statechart.mjs"
"skills/statechart/scripts/statechart.mjs",
"skills/statechart/scripts/statechart-help.mjs"
]
},
"statechart-audits-code-against-spec": {
Expand All @@ -3448,11 +3468,11 @@
"evidence": [
{
"file": "skills/statechart/SKILL.md",
"quote": "Use `from-chart` when there is no model and the PM should agree on the behavior before anyone writes or changes the code."
"quote": "Use `from-chart` when there is no model, and the people who own the behavior should agree on it before anyone builds or changes it."
},
{
"file": "skills/statechart/SKILL.md",
"quote": "Add one `%% never` line per rule, with the PM's sentence."
"quote": "Add one `%% never` line per rule, with the reader's sentence."
},
{
"file": "skills/statechart/SKILL.md",
Expand All @@ -3470,11 +3490,11 @@
"evidence": [
{
"file": "skills/statechart/SKILL.md",
"quote": "Draw what an app's user sees as a Mermaid statechart from a TLA+ model."
"quote": "Draw how any system moves between states, such as a product flow, a protocol, or a service, as a Mermaid statechart from a TLA+ model."
},
{
"file": "skills/statechart/SKILL.md",
"quote": "Label each state with what is on the screen"
"quote": "Label each state with what the reader can observe or cares about, such as \"Paying\" in an app"
},
{
"file": "skills/statechart/SKILL.md",
Expand All @@ -3492,25 +3512,30 @@
"evidence": [
{
"file": "skills/statechart/SKILL.md",
"quote": "Each bug TLC finds is a numbered path."
"quote": "Each bug is a numbered path with blue borders to a state that breaks a rule."
},
{
"file": "skills/statechart/SKILL.md",
"quote": "States are gray if they work, red if still wrong, and green if fixed."
"file": "skills/statechart/scripts/statechart-help.mjs",
"quote": "Gray states work. Red states break a rule."
},
{
"file": "skills/statechart/SKILL.md",
"quote": "Keep variable and action names out of labels."
},
{
"file": "skills/statechart/SKILL.md",
"quote": "If there is an open fix, model it from the code and pass that model as `--fixed`."
"quote": "If there is a proposed fix, model it and pass that model as `--fixed`."
},
{
"file": "skills/statechart/scripts/statechart-help.mjs",
"quote": "fix, and green states are fixed by it or exist only with it."
}
],
"harness_sensitive": false,
"owners": [
"skills/statechart/SKILL.md",
"skills/statechart/scripts/statechart.mjs"
"skills/statechart/scripts/statechart.mjs",
"skills/statechart/scripts/statechart-help.mjs"
]
},
"statechart-reader-rules-become-invariants": {
Expand All @@ -3519,7 +3544,7 @@
"evidence": [
{
"file": "skills/statechart/SKILL.md",
"quote": "Write each rule the PM agrees to as one invariant, with the PM's sentence as its comment."
"quote": "Write each rule that the reader agrees to as one invariant, with the reader's sentence as its comment."
},
{
"file": "skills/statechart/SKILL.md",
Expand All @@ -3537,7 +3562,7 @@
"evidence": [
{
"file": "skills/statechart/SKILL.md",
"quote": "Replay each bug's story against the real code, as a test or a live repro, one step per model action."
"quote": "When the model describes code, replay each bug's story against the real code, as a test or a live repro, one step per model action."
},
{
"file": "skills/statechart/SKILL.md",
Expand All @@ -3555,7 +3580,7 @@
"evidence": [
{
"file": "skills/statechart/SKILL.md",
"quote": "For each difference it prints, ask the PM whether the code is wrong or the chart needs a correction."
"quote": "For each difference it prints, ask the reader whether the code is wrong or the chart needs a correction."
}
],
"harness_sensitive": false,
Expand All @@ -3574,7 +3599,7 @@
},
{
"file": "skills/statechart/SKILL.md",
"quote": "Draw the chart the PM agrees to."
"quote": "Draw the chart that the reader agrees to."
},
{
"file": "skills/statechart/SKILL.md",
Expand Down Expand Up @@ -11868,6 +11893,15 @@
],
"text": "Writing a skill matches the [Authoring or modifying a skill playbook](../../skills/poteto-mode/playbooks/authoring-a-skill.md), which drafts the `SKILL.md` in the [agentskills.io](https://agentskills.io) format, validates the frontmatter and links, and ships the result through the Opening a PR playbook."
},
"dbf2d6ecabb8": {
"class": "context",
"file": "10-recipes-and-pitfalls.md",
"sources": [
"upstream",
"port"
],
"text": "To watch the catch-up instead, run [`/ketchup-video`](../../skills/ketchup-video/SKILL.md)."
},
"dc1ae2001c3b": {
"class": "context",
"file": "09-make-it-yours.md",
Expand Down Expand Up @@ -13190,6 +13224,16 @@
],
"text": "`/poteto-mode` picks the playbook, runs the other skills as the steps need them, and shows you the evidence."
},
"fe89b2fd0770": {
"class": "promise",
"file": "10-recipes-and-pitfalls.md",
"promise": "ketchup-video-shows-catch-up-as-video",
"sources": [
"upstream",
"port"
],
"text": "It shows what happened in a short silent video of slides, and lists the calls waiting on you as text under it."
},
"fe89bf16b8de": {
"class": "promise",
"file": "04-design.md",
Expand Down
47 changes: 47 additions & 0 deletions evals/promises/results/2026-10-24-sync-e73df47.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
# Upstream sync verification, 2026-10-24

## Examined revision

This sync ports the upstream cursor/plugins commits that touch `pstack/` from `eb4db2b55b2b7dec3d9282754cddf0a56bf4ff10` to `e73df471cd4bd918367e99f3dd9c51bd53ddf5f0`. The live cases ran with `--skills-at 96a676ac40a670942502ff6518e56870167cd3ac` (`96a676ac`), the sync commit. The commit that adds this report changes only this file and `.github/upstream-sha`.

## Changed live owners

- `skills/poteto-help/SKILL.md` gains the `/ketchup-video` row. It owns `poteto-help-finds-need-and-routes`.
- `skills/setup-pstack/scripts/skill-listing.py` gains `ketchup-video` in `PSTACK_SKILLS`. It owns `deslop-hands-unsettled-comments-to-no-comments`, `name-only-skills-stay-unloaded-unnamed`, `routed-skill-loads-after-compaction`, and `routed-skill-loads-when-named`.
- `skills/swarm/SKILL.md` changes "the table" to "a result table" in Phase D. It owns `swarm-fans-out-and-aggregates`, `swarm-returns-one-report-with-gaps`, `swarm-workers-report-pass-issues-blocked`, and `swarm-splits-verification-by-feature-map`.
- `skills/reflect/SKILL.md` gained the rule against editing an installed skill copy in the runner's commit. The operator then chose to leave #800 out, so the landed `reflect` matches `main`, and `reflect-three-reviewers-then-synthesizer` has no changed owner.

`reflect-three-reviewers-then-synthesizer` and `swarm-splits-verification-by-feature-map` are bound only to deferred cases (`reflect-run`, `verify-skill-run`), so they did not run.

The seven bound cases ran once each with `evals/promises/live.py run`. `live.py report` rendered this matrix:

| promise | claude-code | codex | hermes | grok |
|---|---|---|---|---|
| `deslop-hands-unsettled-comments-to-no-comments` | not run | PASS | not run | not run |
| `name-only-skills-stay-unloaded-unnamed` | not run | PASS | INCONCLUSIVE (adapter) | not run |
| `poteto-help-finds-need-and-routes` | not run | PASS (2) | INCONCLUSIVE (2, adapter) | not run |
| `routed-skill-loads-after-compaction` | not run | refused (`unapproved_worktree`) | not run | not run |
| `routed-skill-loads-when-named` | not run | refused (`unapproved_worktree`) | INCONCLUSIVE (adapter) | not run |
| `swarm-fans-out-and-aggregates` | not run | INCONCLUSIVE | not run | not run |
| `swarm-returns-one-report-with-gaps` | not run | PASS | not run | not run |
| `swarm-workers-report-pass-issues-blocked` | not run | PASS | not run | not run |

## Cases that did not run or produced no evidence, needing judgment

- **Claude Code, every case.** Preflight raised `IsolationUnavailable: unsupported executable: /Applications/ChatGPT.app/Contents/Resources/codex-cli/codex-path/rg`. This is the same pinned-`rg` cause that the 2026-10-22 receipt recorded. It also makes four `test_claude_code` native tests error on `main` at `0bc7cf9`.
- **Grok, every case.** The wave stopped before any case: `grok login is not usable: the host token expired at 2026-10-24T11:20Z`. A maintainer must run `grok login`.
- **Hermes.** Four cases ran. Each graded INCONCLUSIVE with `the harness transcript could not be read: missing-state: EvidenceRefused: native main database is absent`, so these grades carry no evidence. `name-only-route-after-compact` stopped the batch with `turn 1 cannot resume: no earlier turn reported a Hermes session id`, so `deslop-handoff` and `swarm-run` did not run. The adapter needs a fix for the local Hermes image.
- **Codex, `name-only-route-figure-it-out` and `name-only-route-after-compact`.** The grader refused both runs with `unapproved_worktree` (`/private/tmp/pstack-migration-review.7go25ci8` and `/private/tmp/relay-comments-bxb4c3hx`). The leads made scratch worktrees outside the run's approved paths. The 2026-10-22 receipt recorded the same refusal for the compaction case.
- **Codex, `swarm-fans-out-and-aggregates`.** INCONCLUSIVE: `worker briefs are encrypted; the package-to-worker mapping cannot be read`. The trace shows 4 worker spawns for 4 packages.

## Comparison baseline

The newest earlier receipt is [the eb4db2b sync receipt](2026-10-22-sync-eb4db2b.md). Its Codex rows for the shared promises are PASS for `deslop-hands-unsettled-comments-to-no-comments`, `name-only-skills-stay-unloaded-unnamed`, `routed-skill-loads-when-named`, and `poteto-help-finds-need-and-routes` (2), and refused for `routed-skill-loads-after-compaction`. This run matches each of those rows, except `routed-skill-loads-when-named`, which moves from PASS to a grader refusal with no verdict. That refusal is about where the lead put scratch work, not about which skill loaded.

That receipt has no swarm rows. The newest swarm rows are in [2026-10-03](2026-10-03.md), which measures the tree before its own fixes and names no swarm fix in "Fixed in this stack". Its Codex row is INCONCLUSIVE for `swarm-fans-out-and-aggregates` and PASS for the other two swarm promises, the same as this run.

No Codex verdict regressed to FAIL. The Claude Code, Grok, and Hermes columns have no current evidence.

## Other verification

The upstream-aware ledger audit returned zero problems. The `tools/gate-check.sh` lint tier passed. `skill-ci check` exited zero. In the test tier, four `test_claude_code` native tests error with the same message on `main` at `0bc7cf9`. The statechart tier ran 150 tests: 128 passed, 18 failed, and 4 were skipped. The same 18 fail on upstream's own tree at `e73df47` on this host. With `TMPDIR` set to a path that has no symlink, 4 fail.
2 changes: 1 addition & 1 deletion evals/promises/test_static.py
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,7 @@
"maintain-verification-skill", "documentation-impact", "show-me-your-work", "figure-it-out",
"automate-me", "reflect", "technical-writing", "bro", "setup-pstack", "poteto-mode",
"poteto-help", "typescript-best-practices", "benchmark-checklist", "correct", "make-bot-ui",
"ketchup", "in-your-own-words", "sharpen", "create-formal-verification-skill",
"ketchup", "ketchup-video", "in-your-own-words", "sharpen", "create-formal-verification-skill",
"maintain-formal-verification-skill", "statechart",
}
GUIDE_LINKED_SKILLS = GUIDE_SLASH_SKILLS | set(PRINCIPLE_RULES) | {"pr-recap"}
Expand Down
Loading
Loading