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 .claude-plugin/marketplace.json
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
"name": "t3-pstack",
"source": "./plugins/pstack",
"description": "pstack for T3 Code: rigorous agent workflows whose panels and fan-outs run across model families through T3. Original pstack by Lauren Tan (poteto).",
"version": "2.0.0-rc.17"
"version": "2.0.0-rc.18"
}
]
}
13 changes: 13 additions & 0 deletions CHANGES.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,19 @@

This file is the release changelog, with one `## <version> - <title>` entry per release, newest first. The Cursor-to-T3 rewrite rules live in [`tools/substitutions.json`](tools/substitutions.json), and the [sync boundary](CONTRIBUTING.md#the-sync-boundary) in `CONTRIBUTING.md` defines how a change to upstream's skill content is declared.

## 2.0.0-rc.18 - Lauren's `4ec7ffa`: statechart stops on inputs it used to chart wrong without saying so

t3-pstack moves to Lauren Tan's pstack at cursor/plugins `4ec7ffa` for all three components. Only pstack changed upstream, only in the `statechart` skill, and its version stays at 0.15.30 ([pstack #776](https://github.com/cursor/plugins/pull/776) and [pstack #779](https://github.com/cursor/plugins/pull/779)). Before this, a run could draw a wrong chart or exit with the wrong code and not say so. The label map now stops on a variable or field that the `--fixed` or `--against` model lacks, where it used to give it the current model's start value. New `--config`, `--fixed-config`, and `--against-config` flags name each model's config. The agreed spec is never checked with the code model's config, and a missing config stops the run and lists the configs beside the spec. A rule the agreed config does not check reads "not checked" in the stories, where they used to say the agreed spec keeps it. When TLC finds a broken rule and then throws a Java exception, the run keeps the paths TLC printed, marks the rule broken, and warns that the charts can miss states. On a file system that cannot rename into the output folder (`ENOSYS`, `EXDEV`, or `EISDIR`, as on FUSE mounts), it copies the files into place. TLC checks each rule with one worker per CPU and checks a broken rule again with one worker, which gives the shortest paths. Each `PROPERTY` gets its own TLC run, `--expect-broken` accepts it, and a rule listed as both `INVARIANT` and `PROPERTY` is checked once. With `--against`, each story says whether a config beside the agreed spec expects the bug. With `--fixed` or `--against`, the run lists each condition of an action that no `\* file:line` comment ties to code. `SKILL.md` asks for those citations, says what a valid replay is, and asks the hand-off to say whether the spec already lists each bug. The test of each TLC run's temp folder accepts `Naturals.tla` anywhere under it, where TLC 1.8.0 puts it. #779 changes no behavior. It deletes script comments that repeat the code, and renames helpers so the name says what the comment did. `splitComments` becomes `splitCommentsKeepingOffsets`, `checkTlcOutput` becomes `tlcOutputWarning`, `quote` becomes `escapeMermaidQuotes`, and `luminance` becomes `wcagRelativeLuminance`, and one `PRIMES_OR_UNCHANGED` regex replaces two copies. `bun tools/sync.mjs` updated `SKILL.md`, `lib.mjs`, `statechart.mjs`, `tlc-to-chart.mjs`, and the test file cleanly, and each is byte-identical to upstream. No substitution, fork, or hook changed, and the 15 declared forks are untouched. At `7698375`, with TLC 1.7.4 on Linux and Node 20, 66 of the 67 skill tests pass and the PID-namespace test skips. With the TLC 1.8.0 prerelease, the `PROPERTY` test fails because 1.8.0 words a broken temporal property as "Temporal property X was violated.", which the scripts do not read yet, as #776 says. At `4ec7ffa` without TLC, 29 pass and 38 skip, and `from-spec` on the bundled `OutputFolder` model with TLC 1.7.4 exits 0 with all five rules holding. The README's skill count stays at 65. The copies #776 and #779 change under `harness/pstack/claude-code/` sit outside every synced component. At `4ec7ffa` each component's dry run reports no undeclared fork, no denylist hit, and no substitution that matches nothing. Neither hooks file changes.

| Change | 2.0.0-rc.17 | 2.0.0-rc.18 | Source |
| --- | --- | --- | --- |
| A label map that reads a variable the `--fixed` or `--against` model lacks | Uses the current model's start value. | Stops and names it. | pstack #776 |
| The config `--against` checks the agreed spec with | `AGREED.cfg`, or the code model's `SPEC.cfg` when there is none. | `AGREED.cfg` or `--against-config`, never the code model's. `--config` and `--fixed-config` name the others. | pstack #776 |
| A rule the agreed config does not check | The stories say the agreed spec keeps it. | The stories say "not checked". | pstack #776 |
| TLC throws after it finds a broken rule | The run stops on TLC's error. | The run keeps the printed paths, marks the rule broken, and warns. | pstack #776 |
| An output folder that cannot take a rename, as on FUSE | Publishing fails. | The files are copied into place. | pstack #776 |
| `PROPERTY` rules | Stay in every TLC run, and `--expect-broken` refuses them. | One TLC run each, and a broken one names TLC's counterexample file. | pstack #776 |

## 2.0.0-rc.17 - Lauren's `eb4db2b`: a skill that draws a TLA+ model as a statechart a PM can read

t3-pstack moves to Lauren Tan's pstack at cursor/plugins `eb4db2b` for all three components. Only pstack changed upstream, and its version moves to 0.15.30. The new `statechart` skill draws what an app's user sees as a Mermaid statechart generated from a TLA+ model, so a PM or a designer can judge the design without reading TLA+ ([pstack #741](https://github.com/cursor/plugins/pull/741)). TLC checks each rule the PM agrees to as an invariant. Each state is gray when it works, red when it is still wrong, and green when an open fix fixes it, and each class of counterexample is drawn as a numbered path. `from-spec` draws the chart from a model, `--fixed` shows what an open fix changes, and `--against` audits the code against an existing spec. `from-chart` turns a chart the PM agreed to into a TLA+ skeleton and compares the drawn chart with it. The skill is a `SKILL.md` and about 6,000 lines of Node scripts with a bundled `OutputFolder` model and a `node:test` suite. The agent runs them with `node`, which the installer already requires. The scripts find TLC only through `TLA2TOOLS`, the path to `tla2tools.jar`, and `JAVA`, and without `TLA2TOOLS` they say where to download it and exit 2. `--png` renders each chart through `npx @mermaid-js/mermaid-cli`. It keeps Lauren's `disable-model-invocation`, so on Claude Code it runs when the user types `/t3-pstack:statechart`. On Codex it is `$t3-pstack:statechart`, and Codex ignores the flag. poteto-help gains its row. `bun tools/sync.mjs` added the skill and updated poteto-help cleanly through existing substitutions, and the 12 new files are byte-identical to upstream. The skill names no Cursor tool, path, model, command, or subagent, so no rule was added, and the 15 declared forks are untouched. A new CI job, Skill script tests, runs `node --test plugins/pstack/skills/*/scripts/test/*.test.mjs` on Node 20, the step #741 added to upstream's `validate-plugins.yml`. The runner has no TLC, so 31 of the 58 tests skip there. With TLC 1.7.4 on Linux and Node 20, 57 pass and the PID-namespace test skips. On macOS two TLC tests fail on their own assumptions, not the scripts': one compares a `/var` temp path with Java's `/private/var` form, and one needs `LD_PRELOAD`, which macOS ignores. The README's skill count moves to 65. #741's version bump, upstream's README row, its guide page under `docs/guide/`, and its copies under `harness/pstack/claude-code/` sit outside every synced component. At `eb4db2b` each component's dry run reports no undeclared fork, no denylist hit, and no substitution that matches nothing. Neither hooks file changes.
Expand Down
6 changes: 3 additions & 3 deletions NOTICE-skills.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,9 @@ This plugin contains MIT-licensed work from six sources. The copyright notices a

| Included work | Upstream | Copyright | License |
| --- | --- | --- | --- |
| The pstack skills, principles, scripts, and the `poteto-agent` and `comment-sicko` definitions | [cursor/plugins/pstack](https://github.com/cursor/plugins/tree/eb4db2b55b2b7dec3d9282754cddf0a56bf4ff10/pstack) | (c) 2026 Lauren Tan | [MIT](LICENSE) |
| `deslop`, `make-pr-easy-to-review`, `fix-ci`, `fix-merge-conflicts`, `get-pr-comments`, and `what-did-i-get-done` | [cursor/plugins/cursor-team-kit](https://github.com/cursor/plugins/tree/eb4db2b55b2b7dec3d9282754cddf0a56bf4ff10/cursor-team-kit) | (c) 2026 Cursor | [MIT](LICENSE-cursor-team-kit) |
| `thermos`, `thermo-nuclear-review`, `thermo-nuclear-code-quality-review`, and the `thermo-nuclear-review-subagent` and `thermo-nuclear-code-quality-review-subagent` definitions | [cursor/plugins/thermos](https://github.com/cursor/plugins/tree/eb4db2b55b2b7dec3d9282754cddf0a56bf4ff10/thermos) | (c) 2026 Cursor | [MIT](LICENSE-thermos) |
| The pstack skills, principles, scripts, and the `poteto-agent` and `comment-sicko` definitions | [cursor/plugins/pstack](https://github.com/cursor/plugins/tree/4ec7ffa173eaa70d3d9467a627baf0954645a353/pstack) | (c) 2026 Lauren Tan | [MIT](LICENSE) |
| `deslop`, `make-pr-easy-to-review`, `fix-ci`, `fix-merge-conflicts`, `get-pr-comments`, and `what-did-i-get-done` | [cursor/plugins/cursor-team-kit](https://github.com/cursor/plugins/tree/4ec7ffa173eaa70d3d9467a627baf0954645a353/cursor-team-kit) | (c) 2026 Cursor | [MIT](LICENSE-cursor-team-kit) |
| `thermos`, `thermo-nuclear-review`, `thermo-nuclear-code-quality-review`, and the `thermo-nuclear-review-subagent` and `thermo-nuclear-code-quality-review-subagent` definitions | [cursor/plugins/thermos](https://github.com/cursor/plugins/tree/4ec7ffa173eaa70d3d9467a627baf0954645a353/thermos) | (c) 2026 Cursor | [MIT](LICENSE-thermos) |
| The session-start hook scripts, `read-sheet.sh`, and `reflect/scripts/find-transcript.mjs`, which t3-pstack modified, and four `poteto-mode` rules, the worktree and head-guard rules in the Feature, Opening a PR, and Shipping playbooks, three `watch-pr` fixes, and the ignored-file and reflog-only-commit holds in `poteto-mode/scripts/worktree-audit.sh`, which t3-pstack reworded or adapted for T3, and the plugin icon | [michael-denyer/pstack-claude](https://github.com/michael-denyer/pstack-claude) | (c) 2026 Michael Denyer | [MIT](LICENSE) |
| The plain-remove prune step in the worktree-cleanup playbook, which t3-pstack adapted | [sergchil/jutsu](https://github.com/sergchil/jutsu/commit/da9442422c72cc99442c1ce3500d2f2485234a31) | (c) 2026 Sergey Chilingaryan | [MIT](LICENSE) |
| `poteto-mode/scripts/resolve-codex-transcript` and `resolve-codex-transcript.ts`, which t3-pstack modified | [ericlitman/open-pstack](https://github.com/ericlitman/open-pstack/tree/c5c8e237c324359a3d1929037da78fe66da3d1ed/plugins/pstack/skills/poteto-mode/scripts), [PR #151](https://github.com/ericlitman/open-pstack/pull/151) | (c) 2026 Eric A. Litman and Donncha O'Toole | [MIT](LICENSE) |
Expand Down
6 changes: 3 additions & 3 deletions NOTICE.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,9 @@ t3-pstack is a port of [pstack](https://github.com/cursor/plugins/tree/main/psta

| Component | Upstream | Copyright | License | License file |
| --- | --- | --- | --- | --- |
| Every skill under `plugins/pstack/skills/` except those named in the next two rows, `plugins/pstack/agents/poteto-agent.md`, `plugins/pstack/agents/comment-sicko.md`, and the vendored scripts under `plugins/pstack/skills/poteto-mode/scripts/` | [cursor/plugins/pstack @ eb4db2b](https://github.com/cursor/plugins/tree/eb4db2b55b2b7dec3d9282754cddf0a56bf4ff10/pstack) | (c) 2026 Lauren Tan | MIT | [LICENSE](LICENSE) |
| `plugins/pstack/skills/{deslop,fix-ci,fix-merge-conflicts,get-pr-comments,make-pr-easy-to-review,what-did-i-get-done}/` | [cursor/plugins/cursor-team-kit @ eb4db2b](https://github.com/cursor/plugins/tree/eb4db2b55b2b7dec3d9282754cddf0a56bf4ff10/cursor-team-kit) | (c) 2026 Cursor | MIT | [LICENSE-cursor-team-kit](LICENSE-cursor-team-kit) |
| `plugins/pstack/skills/{thermos,thermo-nuclear-review,thermo-nuclear-code-quality-review}/`, `plugins/pstack/agents/thermo-nuclear-review-subagent.md`, `plugins/pstack/agents/thermo-nuclear-code-quality-review-subagent.md` | [cursor/plugins/thermos @ eb4db2b](https://github.com/cursor/plugins/tree/eb4db2b55b2b7dec3d9282754cddf0a56bf4ff10/thermos) | (c) 2026 Cursor | MIT | [LICENSE-thermos](LICENSE-thermos) |
| Every skill under `plugins/pstack/skills/` except those named in the next two rows, `plugins/pstack/agents/poteto-agent.md`, `plugins/pstack/agents/comment-sicko.md`, and the vendored scripts under `plugins/pstack/skills/poteto-mode/scripts/` | [cursor/plugins/pstack @ 4ec7ffa](https://github.com/cursor/plugins/tree/4ec7ffa173eaa70d3d9467a627baf0954645a353/pstack) | (c) 2026 Lauren Tan | MIT | [LICENSE](LICENSE) |
| `plugins/pstack/skills/{deslop,fix-ci,fix-merge-conflicts,get-pr-comments,make-pr-easy-to-review,what-did-i-get-done}/` | [cursor/plugins/cursor-team-kit @ 4ec7ffa](https://github.com/cursor/plugins/tree/4ec7ffa173eaa70d3d9467a627baf0954645a353/cursor-team-kit) | (c) 2026 Cursor | MIT | [LICENSE-cursor-team-kit](LICENSE-cursor-team-kit) |
| `plugins/pstack/skills/{thermos,thermo-nuclear-review,thermo-nuclear-code-quality-review}/`, `plugins/pstack/agents/thermo-nuclear-review-subagent.md`, `plugins/pstack/agents/thermo-nuclear-code-quality-review-subagent.md` | [cursor/plugins/thermos @ 4ec7ffa](https://github.com/cursor/plugins/tree/4ec7ffa173eaa70d3d9467a627baf0954645a353/thermos) | (c) 2026 Cursor | MIT | [LICENSE-thermos](LICENSE-thermos) |
| `tools/sync.mjs`, `tools/generate.mjs`, `tools/validate-skills.mjs`, `tools/plugin.mjs`, `plugins/pstack/skills/reflect/scripts/find-transcript.mjs`, `plugins/pstack/hooks/session-start.sh`, `plugins/pstack/hooks/session-start.ps1`, `plugins/pstack/skills/setup-pstack/scripts/read-sheet.sh`, and the tests that cover them, each modified by t3-pstack | [michael-denyer/pstack-claude](https://github.com/michael-denyer/pstack-claude), as merged into t3-pstack through 1.0.14 | (c) 2026 Michael Denyer | MIT | [LICENSE](LICENSE) |
| Four rules in `plugins/pstack/skills/poteto-mode/SKILL.md` (load a platform's skill before deploying, stop an abandoned agent and confirm it stopped, keep a review gate closed with no independent reviewer, the `todo.md` fallback), the per-delegate worktree rule in `playbooks/feature.md`, the stop-live-agents rule in `playbooks/opening-a-pr.md`, the `--match-head-commit` guard in `playbooks/shipping.md`, and the review-gate, stale-check, and no-checks fixes in `plugins/pstack/skills/poteto-mode/scripts/watch-pr/` with their tests in `verdicts.test.ts`, each reworded or adapted for T3 by t3-pstack | [michael-denyer/pstack-claude](https://github.com/michael-denyer/pstack-claude), pull requests [#95](https://github.com/michael-denyer/pstack-claude/pull/95), [#97](https://github.com/michael-denyer/pstack-claude/pull/97), and [#153](https://github.com/michael-denyer/pstack-claude/pull/153) for watch-pr | (c) 2026 Michael Denyer | MIT | [LICENSE](LICENSE) |
| The ignored-file and reflog-only-commit holds in `plugins/pstack/skills/poteto-mode/scripts/worktree-audit.sh`, ported from JavaScript to bash, and their wording in `playbooks/worktree-cleanup.md`, with the test cases in `tests/worktree-audit.test.mjs`; the plugin icon with its C2PA manifest removed (`plugins/pstack/.claude-plugin/icon.png`, `plugins/pstack/assets/pstack-icon.png`) and `tests/image-metadata.test.mjs` | [michael-denyer/pstack-claude](https://github.com/michael-denyer/pstack-claude), pull requests [#277](https://github.com/michael-denyer/pstack-claude/pull/277) and [#271](https://github.com/michael-denyer/pstack-claude/pull/271) | (c) 2026 Michael Denyer | MIT | [LICENSE](LICENSE) |
Expand Down
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ npx -y github:chhoumann/t3-pstack update
npx -y github:chhoumann/t3-pstack doctor
```

`npx -y github:chhoumann/t3-pstack` runs the installer from the latest commit on `main`. That is the rolling channel, the same one each home's marketplace auto-updates from. To run one release's installer, name its tag, as in `npx -y github:chhoumann/t3-pstack#v2.0.0-rc.17 doctor`.
`npx -y github:chhoumann/t3-pstack` runs the installer from the latest commit on `main`. That is the rolling channel, the same one each home's marketplace auto-updates from. To run one release's installer, name its tag, as in `npx -y github:chhoumann/t3-pstack#v2.0.0-rc.18 doctor`.

`install` and `update` are the same command, and a second run changes nothing. With Node 20 or later, it installs or updates the `t3-pstack@t3-pstack` plugin in every Claude Code and Codex config home T3 can run: `~/.claude` and `~/.codex`, `$CLAUDE_CONFIG_DIR` and `$CODEX_HOME`, and the home of each `claudeAgent` and `codex` instance in T3's settings, disabled ones included. Name any other home with `--claude-home <dir>` or `--codex-home <dir>`. Each home's `t3-pstack` marketplace must come from `chhoumann/t3-pstack`, or from `--source <owner/repo|git URL|dir>` on the same run, and a home whose marketplace has another source is left as it is. A local directory needs a path such as `./t3-pstack`, since `owner/repo` always means GitHub. On Codex it also trusts t3-pstack's session-start hook, once its hooks file is the one this release pins. Codex runs a plugin's hook only once it is trusted, and T3's Codex sessions never ask, so without this step the hook never runs. Run `update` after each release.

Expand All @@ -34,7 +34,7 @@ The plugin carries 65 skill directories, 24 of them `principle-*` leaves, and 4

## Staying current

This repository syncs from Lauren's tree directly, synced against upstream `eb4db2b`. `tools/upstream.json` pins each component, `tools/substitutions.json` holds the rewrite rules and a denylist of Cursor terms, and `tools/forks.json` declares every file the port keeps in its own form and why. `bun tools/sync.mjs <component> <sha>` derives each upstream file through the rules, merges it three ways with the port's copy, and fails on an undeclared fork, a denylist hit, or a rule that no longer matches upstream. [CONTRIBUTING.md](CONTRIBUTING.md#the-sync-boundary) has the details.
This repository syncs from Lauren's tree directly, synced against upstream `4ec7ffa`. `tools/upstream.json` pins each component, `tools/substitutions.json` holds the rewrite rules and a denylist of Cursor terms, and `tools/forks.json` declares every file the port keeps in its own form and why. `bun tools/sync.mjs <component> <sha>` derives each upstream file through the rules, merges it three ways with the port's copy, and fails on an undeclared fork, a denylist hit, or a rule that no longer matches upstream. [CONTRIBUTING.md](CONTRIBUTING.md#the-sync-boundary) has the details.

## Data handling

Expand Down
2 changes: 1 addition & 1 deletion VERSION
Original file line number Diff line number Diff line change
@@ -1 +1 @@
2.0.0-rc.17
2.0.0-rc.18
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "t3-pstack",
"private": true,
"version": "2.0.0-rc.17",
"version": "2.0.0-rc.18",
"description": "The installer and development tooling for t3-pstack, Lauren Tan's pstack rewritten in place for T3 Code. The plugin itself lives in plugins/pstack.",
"author": {
"name": "Christian Bager Bach Houmann",
Expand Down
2 changes: 1 addition & 1 deletion plugins/pstack/.claude-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "t3-pstack",
"displayName": "t3-pstack (pstack for T3 Code)",
"version": "2.0.0-rc.17",
"version": "2.0.0-rc.18",
"description": "pstack for T3 Code: Lauren Tan's pstack with its Cursor mechanics rewritten in place for T3, so subagents, panels, schedules, and PR watches dispatch through T3's orchestration and panels mix Claude, GPT, and Grok.",
"author": {
"name": "Christian Bager Bach Houmann",
Expand Down
2 changes: 1 addition & 1 deletion plugins/pstack/.codex-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "t3-pstack",
"version": "2.0.0-rc.17",
"version": "2.0.0-rc.18",
"description": "pstack for T3 Code on a Codex host: Lauren Tan's pstack with its Cursor mechanics rewritten in place for T3, so subagents, panels, schedules, and PR watches dispatch through T3's orchestration.",
"author": {
"name": "Christian Bager Bach Houmann",
Expand Down
Loading
Loading