Skip to content

sync(upstream): port eb4db2b..e73df47 (statechart update, ketchup-video, script fixes) - #304

Merged
mdsmithaustin merged 6 commits into
mainfrom
sync/upstream-attempt-20261024T152305Z.PEmymq
Oct 24, 2026
Merged

mdsmithaustin merged 6 commits into
mainfrom
sync/upstream-attempt-20261024T152305Z.PEmymq

Conversation

@mdsmithaustin

@mdsmithaustin mdsmithaustin commented Oct 24, 2026 •

Copy link
Copy Markdown
Owner

Ports the upstream cursor/plugins commits that touch pstack/ from eb4db2b to e73df47, and records e73df47 in .github/upstream-sha.

Upstream commits

Commit Change What the port did
7698375 (#776), 4ec7ffa (#779), 076f4b2 (#791) statechart: six fixes, comment cleanup, the Pele renderer, and the generalized "reader" wording Copied upstream's scripts in full, because the port's copies matched eb4db2b exactly. Removed scripts/model/, as upstream did. The test and the new band.mmd and regions.mmd fixtures go under tests/skills/statechart/, with imports pointing at skills/statechart/scripts/. SKILL.md drops disable-model-invocation. One fixture path ~/Count.tla became /srv/u/Count.tla, because the personal-paths lint rejects /home/<name>.
00d5dec (#794) create-formal-verification-skill tells generated TLA+ verify skills to read results with statechart Ported, with the sibling-skill row applied: "the pstack statechart skill" in place of /statechart.
3c0fdb4 (#797) new ketchup-video skill Added it. The gate is agents/openai.yaml, not the frontmatter flag. "Follow /ketchup" became "Use the ketchup skill.", and the description says "as the ketchup skill does". The user-typed /ketchup-video and /ketchup passage is in USER_FACING. Registered in PSTACK_SKILLS, the trigger cases, the README table, the poteto-help table, GUIDE_SLASH_SKILLS, and guide page 10.
7054003 (#800) reflect never edits a skill under the Cursor plugin cache Left out by operator decision; PORTING records why. See below.
96dec8e (#801) watch-pr tells fork heads apart during stack discovery Applied cleanly. The two subprocess tests now import the module from skills/ and pass a host, which the port's Repository requires.
fe096ef (#802) watch-pr caps polling sleeps at the deadline Applied cleanly.
86c2448 (#803) check-plan matches multi-backtick inline code Applied. Kept the port's own check-plan test next to upstream's two new tests.
3c596e7 (#804) orch prefers a branch's open PR over closed or merged history Applied to the port's Origin path (originBranchPullRequest). Upstream's tests were rewritten as Origin-path tests. The port's own Origin ambiguity cases now use two active PRs (open and draft) or two closed PRs. The port's gh bulk path now applies the same rule, by operator decision. See below.
e73df47 (#807) swarm: renumber Phase A, fix the dangling table reference The port's Phase A already numbers 1 to 5, and Phase B already says "step 4". Took only "a result table" in Phase D.
f83fbe6 (#805) worktree-audit: GNU stat and date Not ported. PORTING says to keep the port's Python mtime code, which already works with GNU tools.
a0b0ad9 (#806) README note on Claude Code marketplace auto-update Not ported. Cursor's Claude Code plugin install is not ported (substitution map, now citing #806).
642289e, b1a1298 version bumps to 0.15.31 and 0.15.32 Not ported. The port has no plugin.json.

PORTING.md records #806 in the plugin-install row, and records #804's Origin-only scope in the Orchestrate bullet.

Operator decisions (2026-10-24)

  • reflect (#800): left out. The port has no plugin cache, and npx skills installs into the same .agents/skills/ directories a copy would go to, so the rule names no safe destination. skills/reflect/SKILL.md matches main, and PORTING records #800 as left out.
  • orch (#804): applied to the gh path too. GitHub frontier discovery now prefers a branch's open PR over its closed or merged history, as the Origin path does. Two open PRs on a branch, or history alone with no open PR, still fail. A red-first test in orch.test.ts covers it, and the poteto-mode bun suite passes (554).
  • statechart wording: accepted. The guides keep "what the user sees". App flows are still a named case in the skill.
  • CodeQL js/incomplete-multi-character-sanitization in upstream's statechart test helper textLines() was dismissed as used in tests. The helper strips tags from the tool's own SVG to compare label text, and the result never reaches HTML.
  • Gate edits reverted. The no-mistakes document step rewrote the README statechart row and ported guide sentences. The row is restored to upstream's text, and the guide to its ledger-classified wording. Its TLC sentence in README stays, because upstream's statechart now installs TLC through mise.
  • Statechart tests on macOS: 18 fail, as upstream's do. With mise on PATH, upstream's new statechart tests install TLC and run. The independent verifier reproduced the same 18 failures on upstream's own tree at e73df47 on this host. The causes are rename tests that rely on LD_PRELOAD, which macOS ignores; /var vs /private/var path comparisons; and MISE_CEILING_PATHS against a symlinked temp folder. CI has no mise, so it skips them. The port keeps upstream's tests unchanged, and a follow-up issue tracks the macOS fixes and a green TLC run.

Guide promises

  • New unit dbf2d6ecabb8 (10-recipes-and-pitfalls.md, "To watch the catch-up instead, run /ketchup-video."), sources upstream and port, class context.
  • New unit fe89b2fd0770 (the same page, "It shows what happened in a short silent video of slides…"), sources upstream and port, class promise, bound to the new static promise ketchup-video-shows-catch-up-as-video. It quotes two sentences of skills/ketchup-video/SKILL.md.
  • Re-quoted evidence for statechart-audit-marks-differences-and-bug-paths, statechart-checks-agreed-chart-rules-before-code, statechart-draws-user-view-from-tla-model, statechart-marks-states-and-numbers-bug-paths (which also gains a quote for green states), statechart-reader-rules-become-invariants, statechart-replays-bugs-in-real-code, statechart-shows-code-chart-differences, and statechart-writes-tla-skeleton-from-agreed-chart. statechart-help.mjs is added to the owners of the first and fourth.
  • ledger.py audit --upstream-ref upstream/main: 0 problems.

Checks

Tools: the real bun 1.4.2 and rg 15.1.0 from mise installs, put ahead of the shims; Node 24.20.0. I compared against a main baseline worktree at 0bc7cf9, fetched just before.

  • tools/gate-check.sh lint: all PASS.
  • tools/gate-check.sh test: FAIL. Two tiers fail:
    • promise unit tests. Four test_claude_code native tests error (NativeGit ×3, NativeClaude ×1) with IsolationUnavailable: unsupported executable: /Applications/ChatGPT.app/Contents/Resources/codex-cli/codex-path/rg. This is pre-existing: the same tests fail with the same message on main.
    • statechart node tests. 150 tests: 128 pass, 18 fail, 4 skipped. These are new upstream tests, so main has no counterpart (on main the old suite gives 27 pass and 31 skipped). The same 18 tests fail on upstream's own tree at e73df47 on this macOS host, so the port's relocation does not cause them. With TMPDIR set to a path that has no symlink, 14 of them pass. The 4 left are rename-failure simulation tests. Needs judgment: these look host-specific (macOS /var → /private/var, and an untrusted mise.toml in a temp dir). CI on Ubuntu is authoritative for this tier.
    • Every other tier passed: tools unit tests, setup-pstack, the poteto-mode bun tests and typecheck, and pr-recap.
  • python3 evals/promises/ledger.py audit --upstream-ref upstream/main: 0 problems.
  • skill-ci check: exit 0.

Live promise cases

Receipt: evals/promises/results/2026-10-24-sync-e73df47.md, run with --skills-at 96a676a.

  • Codex: poteto-help PASS ×2, name-only-unnamed PASS, deslop-handoff PASS, swarm-run PASS / PASS / INCONCLUSIVE. The INCONCLUSIVE is for fan-out: the worker briefs are encrypted. Two name-only-route-* runs were refused with unapproved_worktree.
  • Claude Code: did not run. Preflight hit the same pinned-rg IsolationUnavailable.
  • Grok: did not run. The host login token expired, so grok login is needed.
  • Hermes: 4 runs graded INCONCLUSIVE, because the adapter could not read the transcript (native main database is absent). The batch then stopped on the compaction case, so deslop-handoff and swarm-run did not run.
  • reflect-run and verify-skill-run are deferred cases and did not run.

No CI checks have run on this branch yet. The results above are local only.

⚠️ Medium: The locally authored changes are correct and meet the intent: open PRs win over history on both the gh and Origin frontier paths, with errors kept for two open PRs or history only; fork heads are excluded from watch-pr stacks; sleeps are capped at the deadline with no zero-length busy loop; reflect #800 is left out and recorded in PORTING. Risk is still medium because a large upstream statechart rewrite (about 5,100 script lines and a 5,500-line test suite) could not be checked against upstream e73df47 here, and the receipt records 18 statechart test failures on this host, which also fail on upstream's own tree.

Updates from git push no-mistakes

@mdsmithaustin
mdsmithaustin marked this pull request as ready for review October 24, 2026 18:08
@mdsmithaustin

Copy link
Copy Markdown
Owner Author

Verdict: PASS+NOTES
Head: 2c654ee
Patch-id: d1be86aae3b431dd7d98a5d43463d4588e38d176
Docs: pass

Independent Shipping verification (trail reviewer, opus@xhigh). The checkout was detached at the head. Base 0bc7cf93, upstream eb4db2b..e73df47.

  1. Fidelity holds. The table accounts for all 15 upstream commits that touch pstack/ in the range, and upstream/main has none after e73df47.

    • statechart: every script is byte-identical to upstream e73df47, and scripts/model/ is gone. SKILL.md differs from upstream only by the dropped disable-model-invocation line, and the agents/openai.yaml gate stays. The test and the four fixtures under tests/skills/statechart/scripts/test/ differ from upstream only in the import paths, the scripts root, and /home/u/Count.tla → /srv/u/Count.tla.
    • #794, ketchup-video, #801, #802, #803, #807: create-formal-verification-skill has the sibling-skill row applied. ketchup-video follows the frontmatter and sibling-skill rows plus a USER_FACING entry. It appears in every step-5 list: PSTACK_SKILLS, the trigger row (implicit_allowed: false), the README row, the poteto-help row (both match upstream), GUIDE_SLASH_SKILLS, and the page 10 sentence, which also matches upstream. The poteto-help "didn't load" row does not apply, because the skill is gated. The watch-pr and check-plan code hunks match upstream exactly, and their tests differ only in import paths and host. For swarm, only the Phase D wording applies, because the port holds #634's Phase A cut.
    • orch #804: the Origin path matches upstream's branchPullRequest change.
    • #805, #806, and the version bumps are not ported. worktree-audit.sh is unchanged, and the port has no plugin.json. skills/reflect/SKILL.md equals main, and PORTING records #800 as left out.
  2. orch gh path (operator decision 2). I confirmed red-first. With the 8-line filter in store.ts removed, "prefers a branch's open PR over its closed or merged history" fails with multiple PRs for checked out branch stack/open. With the filter back, it passes. Two open PRs on one branch still error: the gh case with two OPEN rows, and the Origin case with open plus draft. History alone still errors: on the gh path, a MERGED and a CLOSED PR on the base branch, and on the Origin path, two closed PRs.

  3. Local checks (macOS, Node 24.20.0, bun 1.4.2, rg 15.1.0):

    • statechart.mjs --help: exit 0.
    • poteto-mode bun: 554 pass, 1 skip, 0 fail. Typecheck: exit 0.
    • gate-check.sh lint: all PASS.
    • ledger.py audit --upstream-ref upstream/main: 0 problems.
    • skill-ci check: exit 0.
    • gate-check.sh test: two tiers FAIL. Promise unit tests have the 4 test_claude_code IsolationUnavailable errors on the host rg pin. The PR leaves the harness untouched, and PR 307 is still open, so these come from the host. The statechart tier fails as note 4 describes.
    • CI on this head is green. The skills job's statechart step ran 150 tests: 58 pass, 0 fail, 92 skipped.
  4. The statechart tier needs an operator call before landing. Locally it runs 150 tests: 128 pass, 18 fail, 4 skipped. I ran upstream's own tree at e73df47 on this host, and the same 18 tests fail, so the port did not cause them. The causes are in upstream's tests and tooling:

    • The rename shims use LD_PRELOAD, which macOS ignores, so these runs exit 0 where the tests expect 2.
    • Several assertions compare /var/... paths against /private/var/....
    • tlc-tools.mjs sets MISE_CEILING_PATHS to the temp folder's unresolved path. mise searches from the resolved path, so it climbs past that folder to the test's untrusted mise.toml. So the help's "need no trust" promise fails on macOS when TMPDIR is a symlink.

    These tests are new, so under PORTING step 7 they are not pre-existing failures. None of the recorded operator decisions accepts them. After merge, gate-check.sh test stays red on macOS. CI skips the TLC and PNG tests, as upstream's CI does, so no environment runs that part of the suite green. Record an operator decision to accept this, or add a port fix (skip the preload tests outside Linux, and resolve the temp folder path before setting the ceiling), and offer the fix upstream.

  5. The PR body has stale rows. The #800 row says "Ported with the path substitution", but the PR leaves #800 out. The #804 row says "The port's gh bulk path is left alone", but the gh path now filters. The statechart row names the fixture ~/Count.tla, but upstream's is /home/u/Count.tla. Correct these before landing.

  6. The branch needs an update. main is at d597999c (chore(deps): bump opentype.js from 1.3.4 to 2.0.0 in /skills/pr-recap/scripts/sketch #302, fix(poteto-mode): exclude PR recaps from review acknowledgments #305). Neither touches this PR's files except a different PORTING bullet, and GitHub reports the PR as mergeable. main requires up-to-date branches, so update the branch, then recheck the head and patch-id against this block before running merge-gate.

  7. Docs (review mode, pass):

    • README: the statechart and ketchup-video rows match upstream e73df47. The TLC sentence is accurate against statechart-help.mjs and tlc-tools.mjs.
    • PORTING: the #806 row, the Orchestrate #804 bullet (both paths and both cases that still fail), and the reflect #800 bullet all match the code.
    • Guide: page 6 is unchanged in the net diff, and its wording follows operator decision 3. Page 10 matches upstream, with units dbf2d6ecabb8 and fe89b2fd0770 classified.
    • poteto-help and ketchup-video: checked.
    • Receipt: its changed-live-owner list matches the ledger (9 live promises), there are 7 cases, its baseline rows match the 2026-10-22 and 2026-10-03 receipts, and its statechart counts match my run.

    Two optional notes:

    • README could say that the first test run with mise on PATH installs TLC and Java (about 305 MB), and that the PNG tests npm-install Pele and resvg.
    • The Orchestrate playbook does not state the open-PR-over-history rule. PORTING does, and upstream left the playbook unchanged.

mdsmithaustin and others added 6 commits October 24, 2026 12:32
…eo, script fixes)

Port upstream cursor/plugins commits touching pstack/ from eb4db2b to
e73df47:

- 7698375 (#776), 4ec7ffa (#779), 076f4b2 (#791): statechart skill and
  scripts brought to upstream; tests stay under tests/skills/statechart.
- 00d5dec (#794): create-formal-verification-skill points generated TLA+
  verify skills at the statechart skill.
- 3c0fdb4 (#797): new ketchup-video skill, gated through agents/openai.yaml.
- 7054003 (#800): reflect never edits an installed skill copy (needs judgment).
- 96dec8e (#801), fe096ef (#802): watch-pr fork heads and deadline sleeps.
- 86c2448 (#803): check-plan matching inline code delimiters.
- 3c596e7 (#804): orch prefers a branch's open PR, Origin path only.
- e73df47 (#807): swarm Phase D wording.

Not ported: b1a1298/642289e version bumps, a0b0ad9 (#806) Claude Code
marketplace note, f83fbe6 (#805) worktree-audit stat/date (the port
already reads mtimes with Python).
Write e73df471cd4bd918367e99f3dd9c51bd53ddf5f0 to .github/upstream-sha and
add evals/promises/results/2026-10-24-sync-e73df47.md for the changed live
owners (poteto-help, skill-listing, swarm, reflect).
… path

The port has no plugin cache, and npx skills installs into the same
directories a copy would go to, so #800's rule names no safe destination.
PORTING records it as left out. GitHub frontier discovery now prefers a
branch's open PR over its closed or merged history, as the Origin path
does since #804; two open PRs, or only historical ones, still fail.
@mdsmithaustin
mdsmithaustin force-pushed the sync/upstream-attempt-20261024T152305Z.PEmymq branch from 2c654ee to 542d07e Compare October 24, 2026 18:41
@mdsmithaustin
mdsmithaustin merged commit d7ae919 into main Oct 24, 2026
7 checks passed
@mdsmithaustin
mdsmithaustin deleted the sync/upstream-attempt-20261024T152305Z.PEmymq branch October 24, 2026 18:53
mdsmithaustin added a commit that referenced this pull request Oct 24, 2026
 live promises (#310)

Record the Claude Code live promise runs owed since the ripgrep pin
blocked them, now unblocked by #307. Eight bound cases ran at d7ae919 and
cover the promises whose owners changed in #297, #300, and #304: 9 PASS,
1 INCONCLUSIVE handed to a judge, and no FAIL. Two turns hit the
300-second cap after the routed skill had loaded. Swarm workers were all
BLOCKED because the sandbox cannot read dirname; #309 tracks that.
mdsmithaustin added a commit that referenced this pull request Oct 25, 2026
A sync keeps only the edits the entry lists. It missed two older ones: the
imports and scripts constant that point back into skills/ since #297 moved
the file to tests/, and the /srv/u fixture path that check-personal-paths.py
needs since #304. It also cited a test-location rule by a name PORTING.md
never defines, so it now names the entry that states the rule. The count
covers the new fake-mise findTlc test.
mdsmithaustin added a commit that referenced this pull request Oct 25, 2026
A sync keeps only the edits the entry lists. It missed two older ones: the
imports and scripts constant that point back into skills/ since #297 moved
the file to tests/, and the /srv/u fixture path that check-personal-paths.py
needs since #304. It also cited a test-location rule by a name PORTING.md
never defines, so it now names the entry that states the rule. The count
covers the new fake-mise findTlc test.
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