Skip to content

2.0.0-rc.19: Lauren's e73df47, statechart charts any system, a ketchup-video skill, and reflect keeps its edits out of the plugin cache - #46

Merged
chhoumann merged 5 commits into
mainfrom
sync/e73df47
Oct 24, 2026
Merged

chhoumann merged 5 commits into
mainfrom
sync/e73df47

Conversation

@chhoumann

@chhoumann chhoumann commented Oct 24, 2026 •

Copy link
Copy Markdown
Owner

Release 2.0.0-rc.19. t3-pstack moves to Lauren Tan's pstack at cursor/plugins e73df47 from 4ec7ffa, for all three components. Only pstack changed upstream (0.15.30 to 0.15.32).

Upstream commits and what T3 needed

Upstream What it does T3 adaptation
#791 statechart up to date with the Pele renderer statechart charts how any system moves between states, not only an app's screens. PNGs come from Pele and resvg (installed once with npm into ~/.cache/statechart) in place of the Mermaid CLI. With no TLA2TOOLS, TLC 1.7.4 and Java install with mise. The bundled OutputFolder model is removed. New render, --cover, and goal rules through --expect-broken. About 13 new script modules and a rewritten test file. None. The skill names no Cursor mechanism, and the directory is byte-identical to upstream, file modes included. The new tests run under the existing CI job "Skill script tests" (node --test plugins/pstack/skills/*/scripts/test/*.test.mjs) with no workflow change. Without mise or TLA2TOOLS the TLC tests skip, as before.
#794 create-formal-verification-skill A generated verify skill for a TLA+ model reads each result with /statechart, named only. None.
#797 new ketchup-video skill, poteto-help row The /ketchup catch-up as a short silent video of slides, with the waiting calls as text under it. One anchored insert: embed the video as a Markdown image whose target is its absolute path. T3's chat renders a Markdown image with a video extension as an inline player (t3code ChatMarkdown.tsx), and T3 tells every model it can embed videos that way. Keeps Lauren's disable-model-invocation, so on Claude Code it runs as /t3-pstack:ketchup-video when the user types it. On Codex it is $t3-pstack:ketchup-video, and Codex 0.164 ignores the flag, as it does for every skill that keeps it.
#800 reflect routes edits out of the plugin cache Never edit a skill under plugins/cache/. Show the local destination before approval, then copy the skill folder there and edit the copy. Never open a PR or push. A new reflect rule replaces Lauren's .cursor/skills and ~/.cursor/skills with each harness's directories. It keeps plugins/cache/ (both harnesses install plugins under that segment) and names ${CLAUDE_CONFIG_DIR:-~/.claude}/plugins/cache/ and ${CODEX_HOME:-~/.codex}/plugins/cache/. The copy goes to .claude/skills/ or ${CLAUDE_CONFIG_DIR:-~/.claude}/skills/ on Claude Code and .agents/skills/ or ~/.agents/skills/ on Codex. Checked on this Mac. codex debug prompt-input with probe skills in a throwaway home showed Codex 0.164 reading ~/.agents/skills, $CODEX_HOME/skills, .agents/skills, and .codex/skills, and not .claude/skills. claude -p --output-format stream-json against a dead API endpoint in a throwaway home showed Claude Code 2.1.310 listing ~/.claude/skills (or $CLAUDE_CONFIG_DIR/skills in its place) and .claude/skills, and not .agents/skills. "Never open a PR or push" stays.
#801 watch-pr fork heads in stack discovery A fork's head never becomes a parent in the stack. None. github.ts and types.ts are declared forks, and the three-way merge was clean.
#802 watch-pr caps polling sleeps at the deadline Each polling sleep stops at the time left. policy.ts and policy.test.ts are declared forks, and the three-way merge was clean. The port's own BLOCKED-confirmation wait still slept a full interval, so it now uses the same capped sleep, with a test in the port-only verdicts.test.ts (Bugbot's finding).
#803 check-plan inline code delimiters Strips inline code spans whose backtick runs match. None.
#804 orch prefers the active PR A branch with closed or merged PRs beside one open PR resolves to the open one. None.
#805 worktree-audit GNU stat and date Picks GNU or BSD flags once. None. Merged cleanly into the declared fork. It changes nothing at runtime on T3, because the port's rule leaves the transcript scan empty.
#807 swarm renumber Phase A is 1 to 4, Phase B points at step 3, Phase D asks for "a result table". The swarm Phase B rule now anchors on "the step 3 model" and says "the step 3 target". The port's copy took the new text before the sync, so the merge saw the same change on both sides, the way the f9be7aa sync handled a moved anchor.
#792, #798 version bumps Upstream manifests. Excluded paths.
#806 README Notes Claude Code leaves auto-update off for third-party marketplaces. Excluded path, like #797's README and recipes-guide rows. The installer already turns on auto-update for each home's t3-pstack marketplace (tools/install/claude.mjs).

Port changes kept

The four watch-pr files and worktree-audit.sh were three-way merged. For each, upstream's changed lines between 4ec7ffa and e73df47 and the port's changed lines in the sync commit are identical, so Lauren's fixes landed whole. The port's own parts are still there: the settle overlay, the in-flight check states, the no-checks reads, the BLOCKED confirmation, and the audit's ignored-file and reflog holds with its T3 transcript stub. --bootstrap was not used. The other forks, including fakes.test-helper.ts, cli.ts, and render.ts, were left alone.

Commits

  1. Sync Lauren's pstack to e73df47 (#791-#807). bun tools/sync.mjs for pstack, cursor-team-kit, and thermos (the last two with no file changes), and the three tools/substitutions.json rule changes.
  2. Release 2.0.0-rc.19: docs, notices, and manifests. VERSION, manifests, package.json, the CHANGES entry with its behavior-delta table, NOTICE pins, and the README's pin, tag, and skill count (65 to 66).
  3. Correct rc.19's release notes and reflect's Claude Code cache path. Review round 1 fixes, below.
  4. Point reflect's Claude Code skills copy at the config home. A redirected Claude Code home reads $CLAUDE_CONFIG_DIR/skills, not ~/.claude/skills.
  5. Cap watch-pr's BLOCKED confirmation wait at the deadline. Bugbot's finding, below.

Verification

  • bun tools/generate.mjs --check passes.
  • GIT_CONFIG_GLOBAL=/dev/null bun test tests/ --timeout 30000 passes 550, skips 46, fails 0.
  • Skill script tests (node --test plugins/pstack/skills/*/scripts/test/*.test.mjs) on Linux with Node 20.20.2, TLC 1.7.4 (checksum matches the pin), and Temurin 21 pass 146 and skip 4 (fonts, a PID namespace, a mise-only case), with 0 failing. Without TLC, as CI runs it, 58 pass and 92 skip. On macOS with TLC, 128 pass, 5 skip, and 17 fail. All 17 are the tests' macOS assumptions: a path relative to the run's folder where the Mac temp folder sits behind the /var symlink, a rename failed through LD_PRELOAD, which macOS ignores, and /var against /private/var.
  • node statechart.mjs render on a bundled two-region test chart wrote a correct PNG with Pele on macOS.
  • poteto-mode scripts: bun run typecheck passes, bun test orch watch-pr check-plan.test.ts passes 133 of 133, and the Prettier check passes. shellcheck passes on the merged worktree-audit.sh.
  • T3_PSTACK_E2E=1 bun test tests/install-e2e.test.mjs passes 9 and fails 3. The same 3 fail on unmodified origin/main on the same Mac. All three are Codex hook-trust checks under the local Codex CLI 0.164, and this PR touches neither the installer nor the hooks. They need their own follow-up.
  • bun tools/sync.mjs <component> e73df47 --dry-run exits 0 for pstack, cursor-team-kit, and thermos, with no undeclared fork, denylist hit, or unused substitution.

Neither hooks file changes.

Review

Round 1 ran Fable 5.1 (xhigh) and GPT-6-Astra (xhigh). Neither found a critical issue.

  • Astra, high. Codex 0.164 ignores disable-model-invocation, so ketchup-video stays model-invocable on Codex. This holds for every skill that keeps the flag and predates this sync (rc.17's entry says so for statechart). A Codex policy file for one skill would be a port-wide design change, so it is not in this PR. The CHANGES sentence that implied Codex honors the flag is corrected.
  • Fable, low. The CHANGES sentence about #806 called excluded paths "outside every synced component" and repeated itself. Corrected.
  • Fable, nit. reflect named ${CODEX_HOME:-~/.codex} but a bare ~/.claude. It now names ${CLAUDE_CONFIG_DIR:-~/.claude}/plugins/cache/, since the installer also installs into redirected Claude Code homes.

Round 2 reviewed that fix diff and the deferral. Both reviewers found nothing and accepted the deferral. A Claude Code probe then showed that a redirected home reads $CLAUDE_CONFIG_DIR/skills in place of ~/.claude/skills, so reflect's user-skills destination on Claude Code now names ${CLAUDE_CONFIG_DIR:-~/.claude}/skills/ too. Without that, a copy made in a redirected home would land where that home never reads it.

Round 3 reviewed that commit. Astra found nothing and reproduced the Claude Code probe. Fable's first round 3 run stopped on API errors and was replaced. The replacement found no critical or high issue, reproduced the probe, and noted one low, pre-existing gap outside this diff. automate-me's rule also names a bare ~/.claude/skills/. That is left for a follow-up.

Cursor Bugbot, medium. #802's deadline cap missed the port's own BLOCKED-confirmation wait in pollUntilTerminal, which still slept a full interval. Confirmed with a new test in verdicts.test.ts that first failed (exit 6 after 60 seconds on a 30-second timeout), then fixed by routing that wait through the capped sleep. The test now passes (exit 5 at 30 seconds), along with all 134 script tests. This last fix came after the three review rounds, so Fable and Astra have not reviewed it.


Note

Medium Risk
Touches PR watching, orchestration frontier resolution, and skill-install paths (reflect), plus a large statechart rewrite with auto-installed TLC/Java and npm render deps; behavior changes are mostly in agent tooling rather than app runtime.

Overview
Release 2.0.0-rc.19 bumps t3-pstack to upstream pstack e73df47 (0.15.32) and adds the 66th skill.

The statechart skill is reworked for general system flows, not PM-only app screens: TLC/Java install via mise when TLA2TOOLS is missing, PNG output via Pele/resvg instead of Mermaid CLI, render CHART.mmd, --cover, and --expect-broken for goal rules. The bundled OutputFolder model is removed.

New /ketchup-video delivers /ketchup as a silent slide video (T3 embeds via absolute-path Markdown image). reflect copies approved skill edits into project or user skills dirs instead of plugins/cache/. create-formal-verification-skill points generated TLA+ verify skills at /statechart.

watch-pr ignores fork heads in stack discovery and caps polling sleeps (including BLOCKED confirmation) at the deadline. orch picks the sole open PR when closed/merged history shares a branch. check-plan ignores punctuation inside matching multi-backtick spans. worktree-audit uses GNU or BSD stat/date flags.

Version pins, notices, README skill count, and CHANGES document the sync; port-only rules cover ketchup-video embedding and reflect’s Claude/Codex skill paths.

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

All three components move from 4ec7ffa to e73df47. Upstream changed only
pstack. statechart catches up with Lauren's source copy (#791). PNGs come
from Pele and resvg in place of the Mermaid CLI, TLC installs with mise
when TLA2TOOLS is unset, the bundled OutputFolder model is gone, and the
skill charts how any system moves between states, not only an app's
screens. create-formal-verification-skill tells a generated verify skill
to read each model-check result with /statechart (#794). The new
ketchup-video skill gives the /ketchup catch-up as a short silent video
of slides, and poteto-help lists it (#797). reflect never edits a skill
under plugins/cache/. It shows the local destination before approval,
then copies the skill there and edits the copy (#800). watch-pr no
longer takes a fork's head as a parent in stack discovery (#801) and
caps each polling sleep at the deadline (#802). check-plan strips inline
code spans whose backtick runs match (#803), orch prefers a branch's open
PR over closed or merged ones (#804), worktree-audit reads transcript
times with GNU stat and date as well as BSD (#805), and swarm's Phase A
is numbered 1 to 4 with Phase B pointing at step 3 (#807).

Three rules in tools/substitutions.json change. swarm's Phase B rule
anchors on "the step 3 model" and its replacement says "the step 3
`target`". The port's copy took the new text before the sync, so the
three-way merge saw the same change on both sides. A new reflect rule
rewrites the destination sentence for T3. It names each harness's plugin
cache and the project and user skills directories, .claude/skills on
Claude Code and .agents/skills on Codex. codex debug prompt-input in a
throwaway home showed Codex 0.164 reading ~/.agents/skills,
$CODEX_HOME/skills, .agents/skills, and .codex/skills, and not
.claude/skills. A new ketchup-video insert says to embed the video as a
Markdown image whose target is its absolute path, which T3's chat
renders as a player.

bun tools/sync.mjs updated or added each file cleanly. It merged the
four watch-pr forks and worktree-audit.sh with no conflict, and each
merged file carries exactly upstream's changed lines beside the port's
own. The statechart directory is byte-identical to upstream at e73df47,
file modes included. --bootstrap was not used, and cursor-team-kit and
thermos synced with no file changes. #792 and #798 bump upstream's
manifests and #806 edits its README, all excluded paths.
VERSION, the manifests, and package.json move to 2.0.0-rc.19. CHANGES.md
gets the entry with its behavior-delta table and the test runs at
e73df47. NOTICE.md, NOTICE-skills.md, poteto-mode's copy of the notice,
and the README point at upstream e73df47, and the README's pinned
installer command names the new tag. The skill count moves to 66 with
ketchup-video.

@cursor cursor Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Cursor Bugbot has reviewed your changes using high effort and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 0f13a09. Configure here.

Comment thread plugins/pstack/skills/poteto-mode/scripts/watch-pr/policy.ts
The CHANGES entry no longer implies that Codex honors ketchup-video's
disable-model-invocation. Codex 0.164 ignores the flag, as it does for
every skill that keeps it, so the entry says so. It also says #797's
README and recipes-guide rows and #806's README note are excluded paths,
in place of calling them outside every synced component.

reflect's T3 rule names the Claude Code plugin cache as
${CLAUDE_CONFIG_DIR:-~/.claude}/plugins/cache/, matching the Codex form,
since the installer also installs into redirected Claude Code homes. The
port's copy of reflect took the same text, and the pin dry run passes.
reflect's T3 rule now sends an approved Claude Code user-skill copy to
${CLAUDE_CONFIG_DIR:-~/.claude}/skills/<skill>/. Claude Code 2.1.310,
started in a throwaway home with a dead API endpoint, listed skills from
$CLAUDE_CONFIG_DIR/skills in place of ~/.claude/skills when the variable
was set, and from the project's .claude/skills, and never from
.agents/skills. A copy under ~/.claude/skills would be invisible to a
redirected home. The port's reflect copy and the CHANGES entry carry the
same text, and the pin dry run passes.
pstack #802 moved pollUntilTerminal's query-retry and poll sleeps onto a
helper that stops at the time left before the deadline. The port's own
wait while it confirms a BLOCKED read, which upstream does not have,
still slept a full interval, so a watcher whose deadline fell inside
that wait slept past it and could report a merge blocker after its
timeout. It now uses the same helper.

The new test in verdicts.test.ts runs the watcher with a 30-second
timeout on a frontier that stays BLOCKED. Before the change it slept to
60 seconds and exited 6 with a blocker; now it exits 5 with TIMEOUT at
30 seconds. CHANGES.md records the change beside #802.
@chhoumann
chhoumann merged commit 2619a2d into main Oct 24, 2026
12 checks passed
@chhoumann
chhoumann deleted the sync/e73df47 branch October 24, 2026 13:55
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.

1 participant