Skip to content

port upstream pstack through 0.15.36 - #45

Merged
caelaxie merged 1 commit into
mainfrom
cursor/port-upstream-0.15.36-b366
Oct 28, 2026
Merged

caelaxie merged 1 commit into
mainfrom
cursor/port-upstream-0.15.36-b366

Conversation

@caelaxie

Copy link
Copy Markdown
Contributor

synced to c742dd6. compared e73df47..c742dd6 for pstack/. that range is the whole upstream pstack history after the previous sync, and origin/main of cursor/plugins is that commit. version is 0.15.36 in plugin.json, .devin-plugin/plugin.json, and the readme marker.

upstream range, oldest first:

  • 34b1b7c (#977) statechart compiler
  • 7c7bde7 (#978) bump to 0.15.33
  • 740d2c0 (#982) qualified action names in property traces
  • 164ced1 (#983) bump to 0.15.34
  • 519d36a (#981) wait for the reap in the statechart SIGKILL view test
  • ab1f702 (#986) skill updates (poteto-mode, autopilot playbooks, interrogate, arena, ketchup-video, principle-explain-the-number, orchestrate, readme and guide) and bump to 0.15.35
  • c742dd6 (#1043) agentic Orchestrate, delete the orch scripts, bump to 0.15.36

deslop, control-cli, and control-ui are byte-identical at e73df47 and at c742dd6 (same blobs as devin-pstack #44). not recopied.

verbatim, no devin edits:

  • skills/statechart/scripts/** replaced with the compiler, corpus, and tests. old .mjs scripts deleted.
  • skills/statechart/references/render.md added.
  • skills/poteto-mode/playbooks/autopilot-stack.md replaced.
  • skills/poteto-mode/scripts/package.json test script drops orch.
  • skills/poteto-mode/scripts/orch/ deleted (orch.ts, orch.test.ts, store.ts).
  • skills/interrogate/references/ deleted (the four review docs the rewrite removed).

devin-only changes, per file:

  • plugin.json and .devin-plugin/plugin.json: version 0.15.36. homepage and repository stay on this port.
  • README.md: marker points at c742dd6 / 0.15.36. table rows for autopilot-stack, ketchup-video, interrogate, and statechart take the upstream wording with the existing /pstack: prefix.
  • docs/guide/04-design.md, 06-verify-and-ship.md, 07-overnight.md: upstream wording, /pstack: prefix kept, existing Devin session wording kept.
  • docs/guide/10-recipes-and-pitfalls.md: same, plus the auto pitfall stays "spawn the role's subagents with subagent_general or subagent_explore".
  • skills/statechart/SKILL.md: upstream compiler skill. triggers: [user]. /statechart is /pstack:statechart.
  • skills/principle-explain-the-number/SKILL.md: upstream text. triggers: [user].
  • skills/create-formal-verification-skill/SKILL.md: drops "which of those violations a change fixes". /pstack:statechart kept.
  • skills/ketchup-video/SKILL.md: subtitled video. triggers: [user]. /pstack:ketchup and /pstack:ketchup-video kept.
  • skills/poteto-help/SKILL.md and references/recipes.md: upstream rows and prompts. /pstack: prefix, cloud Devin session wording, and the Devin webhook row kept.
  • skills/arena/SKILL.md: new drop-a-seat rule and the skip-the-judge rule, in the existing profile language (~/.devin/rules/pstack-models.md, pstack-M / pstack-M-ro, subagent_general / subagent_explore, devin models list, swe-2-high). auto on the cross-judge line never judges. On Fusion, prefer a judge outside both the lead's and the sidekick's families, else outside the lead's. a fusion-* slug is still a rejected slug.
  • skills/interrogate/SKILL.md: upstream rewrite (findings survive only when a rerun proves them; it calls arena phases). triggers: [user]. generalPurpose is the write profile arena phase A step 3 maps (pstack-M, or subagent_general for auto / inherit-parent).
  • skills/setup-pstack/SKILL.md: the cross-judge sentence is the new one (one judge, other family, list order, alias never judges). Fusion note, ask_user_question, and Adaptive wording stay.
  • skills/poteto-mode/SKILL.md: new first-message trigger, Explain the Number applies before you measure, is_background: true also covers a steer or resume, and a rejected adjusted slug falls through the calling skill's fallback then devin models list / the auto mapping. Autopilot-stack is autopilot-full without the merge. Fusion paragraphs stay.
  • skills/poteto-mode/playbooks/autonomous-run.md: mid-run discoveries that support the goal. ask_user_question and Devin's /loop stay.
  • skills/poteto-mode/playbooks/autopilot-full.md: upstream rebase, verify, blocking, and reply rules. owners stay cloud Devin sessions (devin --cloud). /deslop and /pstack:no-comments stay. control-cli and control-ui stay plain skill names.
  • skills/poteto-mode/playbooks/babysit.md: an Autopilot-stack owner rebases its own branch the same way an Autopilot-full owner does. Origin and GitHub watcher wording stays.
  • skills/poteto-mode/playbooks/opening-a-pr.md: the subagent runs /deslop and /pstack:no-comments and reports merge-ready. interrogate and STACK-READY are gone.
  • skills/poteto-mode/playbooks/multi-phase-plan.md: pick autopilot-full when the run may merge, autopilot-stack when the operator lands the PRs. verdict checklist matches upstream. explores with profile: "pstack:poteto-agent".
  • skills/poteto-mode/playbooks/orchestrate.md: replaced with the short agentic playbook. Task is run_subagent. workers are cloud Devin sessions (devin --cloud -p), leaf-level, because a cloud session cannot spawn pstack-* profiles. program state goes in the current agent's store (path in the system prompt), not a project tracker. control-cli and control-ui are named with no plugin qualifier. no orch script calls.

skipped:

  • pstack/.cursor-plugin/plugin.json. cursor plugin manifest. the only change in range is the version bump, and this port's manifests are plugin.json and .devin-plugin/plugin.json.
  • no .claude-plugin file changed in the range.
  • docs/harness/claude-code.md did not change in the range and is not part of this port.

tests:

  • plugin validator: 61 skills, 2 agents, 23 playbooks.
  • bash -n on skills/poteto-mode/scripts/worktree-audit.sh and skills/show-me-your-work/scripts/log.sh.
  • skills/poteto-mode/scripts: bun run typecheck and bun run test (watch-pr and check-plan). 61 pass, 0 fail.
  • skills/statechart/scripts: node --test test/*.test.ts on Node v22.23.4. 267 pass, 0 fail, 67 skipped. the skips are the plain-TLC differential cases, which the suite itself skips unless TLA2TOOLS points at tla2tools.jar. corpus replay, the SIGKILL reap test, and the Pele render tests ran.
  • the devin CLI was not run. it needs a login. harness proof for regular mode and fusion mode stays with the owner.
Open in Web Open in Cursor 

Sync pstack from e73df47 through c742dd6: the statechart compiler,
skill updates through 0.15.35, and the agentic Orchestrate playbook
with the orch scripts removed. Version is 0.15.36.

Co-authored-by: Kaitian Xie <[email protected]>

@caelaxie caelaxie left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

verdict: changes requested (harness proof missing). not merging yet.

checked on head bc31134:

  • scope matches upstream e73df47..c742dd6 (0.15.33 → 0.15.36). version 0.15.36 in plugin.json, .devin-plugin/plugin.json, readme marker.
  • no added lines mention cursor-team-kit, .cursor/, or a cursor plugin manifest. .cursor-plugin/plugin.json correctly skipped.
  • deslop / control-cli / control-ui untouched (byte-identical upstream, same as #44).
  • orch scripts and interrogate references deleted like upstream.
  • ci Validate plugin green.

blocking:

  • the body says the devin cli wasn't run. this touches plugin content (statechart compiler, orchestrate, interrogate, arena, poteto-mode), so it needs devin harness proof in both regular mode and fusion mode: devin plugins install --local (or the wrapper pinned to the full head sha bc31134, not a symlink) + devin plugins list, showing pstack 0.15.36 and the changed skills loaded, including statechart, interrogate, and the three embedded ones (deslop, control-cli, control-ui). an installed-copy check of skills/statechart/scripts running from the installed plugin is a plus.

post the proof as a pr comment or in the body and i'll re-review. no issue linkage needed unless this fixes one.

Copy link
Copy Markdown
Contributor Author

harness proof

real devin cli on a local box (no cloud agent, no git clone). pr head bc3113448230dc292ff66eebbeee5ac041dcfb72, checked with git ls-remote refs/pull/45/head before install and again before cleanup. version goes to 0.15.36.

  • cli: devin 3000.11.205 (6dea39440ae3). devin auth status → Logged in (via Devin).
  • read-only throughout. live turns ran in a trusted scratch dir whose allowlist only permits reads (Write(**)/Edit(**) denied). i added no allowlist entries, and no ~/.config/devin/agents/ profiles existed before or after.
# requirement result
1 --local wrapper pinned to the full head sha bc3113448230dc292ff66eebbeee5ac041dcfb72, then devin plugins list shows pstack v0.15.36 (required) ✅ pass
2 install cache: 576 files all cmp-identical to raw @ head (incl. all 356 statechart corpus files), 0 symlinks, file list = head tree (576 = 576) ✅ pass
3 skills/poteto-mode/scripts/orch/ and skills/interrogate/references/ absent; statechart ts compiler (scripts/statechart, frontends/, passes/, backends/) and references/render.md present; deslop, control-cli, control-ui present ✅ pass
4 rg -i cursor-team-kit (and team-kit) over the installed cache: no matches ✅ pass
5 devin skills list: 61 /pstack: skills ✅ pass
6 live regular turns (swe-2-max): statechart, arena, interrogate, orchestrate load and answer from their text ✅ pass
7 live fusion turns (fusion-claude-opus-5-5-medium-sidekick-swe-2-medium): same ✅ pass
8 --cloud exists in this cli (see 6) ✅ exists, with a caveat
9 cleanup: wrapper and pstack removed, thermos left alone, end state = before ✅ pass

1. install / list

$ devin plugins list          # before
Installed plugins

  • thermos v1.0.0

$ cat wrap-pr45/.devin-plugin/plugin.json
{ "name": "pstack-harness-pr45", "version": "0.0.0",
  "requiredPlugins": [ { "source": "github", "repo": "pstack-ports/devin-pstack",
                         "sha": "bc3113448230dc292ff66eebbeee5ac041dcfb72" } ] }
$ devin plugins install --local -y /workspace/devin-harness/wrap-pr45
This install will add:
  • pstack-harness-pr45 v0.0.0
  • pstack v0.15.36 (required)
      ... (61 /pstack: skills)
✓ Installed pstack-harness-pr45.
  auto-installed required plugins: pstack
exit=0
$ devin plugins list
Installed plugins

  • thermos v1.0.0
  • pstack-harness-pr45 v0.0.0
  • pstack v0.15.36 (required)

2. install cache: tree, symlinks, cmp

$ cd ~/.local/share/devin/cli/plugins/cache/github.com_pstack-ports_devin-pstack-816793bb/0.15.36
$ ls ../
0.15.36
$ grep -n '"version"' .devin-plugin/plugin.json plugin.json
.devin-plugin/plugin.json:3:  "version": "0.15.36",
plugin.json:4:  "version": "0.15.36",
$ find . -type l | wc -l
0
$ curl -fsSL "https://api.github.com/repos/pstack-ports/devin-pstack/git/trees/bc3113448230dc292ff66eebbeee5ac041dcfb72?recursive=1"   # blobs -> head.txt
truncated False
symlinks/submodules in tree: []
$ wc -l head.txt inst.txt
  576 head.txt
  576 inst.txt
$ comm -3 head.txt inst.txt
(empty)
$ while read f; do cmp -s $f raw/$f ...; done < inst.txt   # raw = raw.githubusercontent.com @ head
IDENTICAL=576 DIFF/ERR=0
$ test -e skills/poteto-mode/scripts/orch      -> absent
$ test -e skills/interrogate/references        -> absent
$ ls skills/statechart/scripts skills/statechart/references
skills/statechart/references:
render.md
skills/statechart/scripts:
backends  frontends  ir.ts  package.json  passes  pipeline.ts  run.ts  statechart  statechart.ts  test  tsconfig.json  worker.ts
$ ls skills/{deslop,control-cli,control-ui}
SKILL.md  SKILL.md  SKILL.md
$ ls -d skills/*/ | wc -l
61
$ rg -i cursor-team-kit .
rg exit=1 (no matches)
$ rg -i team-kit .
rg exit=1 (no matches)

3. skills

$ devin skills list | grep -c /pstack:
61

4. live turns (read-only, describe-only)

each mode ran four turns via --prompt-file from the scratch dir: /pstack:statechart (compiler step, quote SKILL.md and render.md headings), /pstack:arena (drop-seat and skip-the-judge rules), /pstack:interrogate (what cursor's generalPurpose seat maps to), /pstack:poteto-mode (orchestrate playbook: worker spawning, any orch scripts). every prompt said describe only, run/write nothing, quote the heading and give the loaded path. exit codes are devin's own ($? right after devin -p). no turn needed a retry.

before each mode, from the scratch dir:

$ devin plugins list
Installed plugins

  • thermos v1.0.0
  • pstack-harness-pr45 v0.0.0
  • pstack v0.15.36 (required)

$ devin skills list | grep -c /pstack:
61
$ devin skills list | grep -E "/pstack:(statechart|interrogate|deslop|control-cli|control-ui) "
  /pstack:statechart [user] (~/.local/share/devin/cli/plugins/cache/github.com_pstack-ports_devin-pstack-816793bb/0.15.36/skills/statechart) - Check a TLA+ model of a system that moves betwe...
  /pstack:control-cli [user,model] (~/.local/share/devin/cli/plugins/cache/github.com_pstack-ports_devin-pstack-816793bb/0.15.36/skills/control-cli) - Build or adapt a local harness to drive...
  /pstack:control-ui [user,model] (~/.local/share/devin/cli/plugins/cache/github.com_pstack-ports_devin-pstack-816793bb/0.15.36/skills/control-ui) - Build or adapt a local browser/CDP harnes...
  /pstack:interrogate [user] (~/.local/share/devin/cli/plugins/cache/github.com_pstack-ports_devin-pstack-816793bb/0.15.36/skills/interrogate) - Use for "interrogate", "adversarial review", ...
  /pstack:deslop [user,model] (~/.local/share/devin/cli/plugins/cache/github.com_pstack-ports_devin-pstack-816793bb/0.15.36/skills/deslop) - Remove AI-generated code slop and clean up code s...

the output was identical before the regular and the fusion runs (logs/pr45-live-regular.log, logs/pr45-live-fusion.log). in every export of both modes, the [user,model] skills show up in <available_skills> from the 0.15.36 cache:

- **deslop**: ... (source: ~/.local/share/devin/cli/plugins/cache/github.com_pstack-ports_devin-pstack-816793bb/0.15.36/skills/deslop/SKILL.md)
- **control-cli**: ... (source: .../0.15.36/skills/control-cli/SKILL.md)
- **control-ui**: ... (source: .../0.15.36/skills/control-ui/SKILL.md)

statechart, interrogate, arena, and poteto-mode are [user]-only, so they aren't in <available_skills>. the slash command injects their SKILL.md body as the user message instead, and each export's user message starts with that body (# Statechart ..., # Arena ..., # Interrogate ..., # Poteto mode ...).

regular: devin -p --model swe-2-max (export model SWE-2 Max, no sidekick tool)

  • /pstack:statechart, exit 0. reads the cached statechart/SKILL.md and references/render.md
    (1) The compiler is `<skill dir>/scripts/statechart SPEC.tla [--config FILE] [--view FILE] [--out DIR]`. `scripts/statechart.ts` is TypeScript, so it must run under a runtime that executes TypeScript. The first run installs TLC and Java with mise and needs the network.
    HEADING: # Statechart
    RENDER-HEADING: # Render a chart
    PATH: ~/.local/share/devin/cli/plugins/cache/github.com_pstack-ports_devin-pstack-816793bb/0.15.36/skills/statechart/references/render.md
    
  • /pstack:arena, exit 0
    QUOTE: "If dropped seats leave fewer than two runners, add runners until there are two, or one when the line has one entry."
    QUOTE: "If none of those runs, skip the judge, pick the base alone in Phase D, and say so."
    HEADING: # Arena
    
  • /pstack:interrogate, exit 0
    QUOTE: Spawn each adversary on the write profile Phase A step 3 maps (`pstack-M`, or `subagent_general` for `auto` or `inherit-parent`).
    No — the skill text references no `references/` files (only the **arena** and **in-your-own-words** skills), and the directory contains only SKILL.md.
    HEADING: # Interrogate
    
  • /pstack:poteto-mode → orchestrate, exit 0. reads the cached playbooks/orchestrate.md
    Orch scripts. NO. The playbook says "Call no scripts, run no polling loops, and never relay messages or status between agents." ... "Run it with your own tools. Spawn workers with `run_subagent`."
    HEADING: ### Orchestrate
    PATH: ~/.local/share/devin/cli/plugins/cache/github.com_pstack-ports_devin-pstack-816793bb/0.15.36/skills/poteto-mode/playbooks/orchestrate.md
    

fusion: devin -p --model fusion-claude-opus-5-5-medium-sidekick-swe-2-medium (export model Fusion (Claude Opus 5.5 Medium + SWE-2 Medium), sidekick tool listed)

  • /pstack:statechart, exit 0
    The code is `scripts/statechart.ts`, which is TypeScript, so you have to run it with a runtime that can execute TypeScript. ... The first run uses mise to install TLC and Java, so it needs network access.
    HEADING: # Statechart
    RENDER-HEADING: # Render a chart
    
  • /pstack:arena, exit 0
    QUOTE: "If dropped seats leave fewer than two runners, add runners until there are two, or one when the line has one entry."
    QUOTE: "If none of those runs, skip the judge, pick the base alone in Phase D, and say so."
    HEADING: # Arena
    
  • /pstack:interrogate, exit 0
    If the entry is `auto` or `inherit-parent`, it is `subagent_general`. Your rule file sets it to `inherit-parent`, so in this setup that means `subagent_general`.
    HEADING: # Interrogate
    
    ("your rule file" is real. this box has an always-on ~/.cursor/rules/pstack-models.mdc with interrogate reviewers: inherit-parent, and devin injected it as a rule. it predates this run, and i didn't touch it.)
  • /pstack:poteto-mode → orchestrate, exit 0
    Workers are spawned with `run_subagent`. A worker runs as a cloud Devin session (`devin --cloud -p "<brief>"`) by default. It runs locally only when the work needs this machine ...
    Orch scripts. NO. The playbook doesn't mention `scripts/orch`, `orch.ts` or `store.ts`.
    HEADING: ### Orchestrate
    

none of the eight turns made a write, edit, exec, subagent, or sidekick call. the only tool calls were find_file_by_name, read, and grep.

5. --cloud

$ devin --help
      --cloud
          Drive Devin cloud sessions instead of the local agent
          The REPL talks to `devin acp --cloud`, which relays ACP to the Devin cloud ACP WebSocket. ...
  cloud      Start a Devin Cloud session (same as --cloud) or manage cloud resources
$ devin acp --help
      --cloud
          Relay to Devin cloud instead of running the local agent. ...

so devin --cloud exists in 3000.11.205. one caveat for orchestrate.md. it says both "Spawn workers with run_subagent" and "Run workers as a cloud Devin session (devin --cloud -p "<brief>")". in these exports, run_subagent takes only title, task, profile, is_background, and resume, with no cloud option. a cloud worker therefore has to be a separate devin --cloud -p cli invocation (an exec), not a run_subagent call. i didn't start a cloud session, so --cloud -p running non-interactively is untested here.

6. re-check and cleanup

$ git ls-remote https://github.com/pstack-ports/devin-pstack refs/pull/45/head
bc3113448230dc292ff66eebbeee5ac041dcfb72	refs/pull/45/head
$ devin plugins remove pstack-harness-pr45 -y
✓ Removed pstack-harness-pr45.
  note: auto-installed required plugins were left in place: pstack
$ devin plugins remove pstack -y
✓ Removed pstack.
$ devin plugins list
Installed plugins

  • thermos v1.0.0
$ devin skills list | grep -c /pstack:
0

end state matches pr45-before.log.

no code was changed, and no secrets appear in this comment.

@caelaxie caelaxie left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

pass. harness proof on bc31134 (issuecomment-6458411523): sha-pinned --local install, 576/576 cmp, 0 symlinks, pstack v0.15.36, skills listed, 4/4 live turns exit 0 in swe-2-max and fusion; ci green.
orchestrate.md matches upstream c742dd6 apart from the run_subagent / devin --cloud mapping main already had. not blocking.

@caelaxie
caelaxie merged commit 393968a into main Oct 28, 2026
1 check passed
@caelaxie
caelaxie deleted the cursor/port-upstream-0.15.36-b366 branch October 28, 2026 01:45
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