Skip to content

release: sync Cursor pstack 0.15.0 as Open Pstack 1.4.0 - #60

Merged
ericlitman merged 6 commits into
mainfrom
pstack-2-sync
Sep 8, 2026
Merged

release: sync Cursor pstack 0.15.0 as Open Pstack 1.4.0#60
ericlitman merged 6 commits into
mainfrom
pstack-2-sync

Conversation

@ericlitman

@ericlitman ericlitman commented Sep 8, 2026

Copy link
Copy Markdown
Owner

Closes #61. Tracks PSTACK-2.

What changed

Open Pstack 1.4.0 syncs Cursor pstack 0.15.0 (71ed0d1), four upstream commits after the recorded 0.14.7 point. How's critique mode and the how critics role are retired, and the two critic references are deleted. Two principle leaves are added, principle-attack-the-premise and principle-test-behavior-not-implementation, each with a narrow local correction recorded in CHANGES.md. The rest is upstream's density and punctuation passes applied on top of the port's Claude Code and Codex adaptations, plus the exact 361,140-byte logo and the verbatim upstream README.

Out of scope: make-bot-ui, the invocation-blocking flags, the Cursor-only model defaults, the Claude manifest logo field, and upstream's new "about 40 lines" squash-body cutoff. All existing exclusions in UPSTREAM.md stand.

Plan: docs/plans/upstream-0.15.0.md. Lever: scripts/upstream-audit.py inventories the range (96 paths), and scripts/upstream-merge.py applies it mechanically (24 verbatim, 32 clean three-way merges, 32 files with 65 hand-resolved hunks, 2 deletions). A reviewer can rerun both against 56bfd14 and 71ed0d1.

Blast Radius

Every pstack skill body changes prose. The rules the port depends on (PR 44 shipping guards, Sol defaults, provider dispatch, user-invocable: false) are covered by tests/skill-collision-repro.sh; removing one protected shipping instruction makes it fail, restoring it passes. A user with an old 16-row model sheet keeps working; the how critics row has no consumer, and setup reports it as an unknown role before any write.

Verification

  • Bun tests (158 pass), strict typecheck, static invariants, and plugin validation pass on the host.
  • The exact candidate is installed in every affected harness.
  • The changed behavior passes from each real user surface.
  • The installed version, action, and observed result appear below.

Host gates on dfdbd60: bun install, test, typecheck, manifest parse, static invariants, diff --check, no conflict markers, logo bytes and size, README verbatim, critic refs gone, no how critics role, 54 skills / 23 principles, no Cursor-only terms in skill bodies, claude plugin validate. All pass.

Live evidence:

Claude Code. Candidate dfdbd60 loaded from the worktree with claude -p --plugin-dir plugins/pstack in a fresh session on a one-file fixture repo. The init event reports plugin pstack version 1.4.0 from that path. Action: "Invoke the pstack:how skill and explain how upstream-audit.py classifies a changed path. Simple question." Observed: the session invoked Skill pstack:how, read how/references/explainer-prompt.md and provider-dispatch.md, took the simple path, and started exactly one pstack:pstack-fable-max explainer lane. No critic lane, no critique rubric read. It returned a grounded explanation of the classification table (Overview, How It Works, Gotchas). Transcript archived locally.

Codex. Same candidate skill tree exposed to a fresh codex exec session as the fixture repo's .agents/skills (workspace-write sandbox with network). Action: same How question. Observed: Codex read how/SKILL.md, the explainer prompt, provider-dispatch.md, and codex-tools.md, chose the simple path, and dispatched one read-only external claude:fable@max explainer through pstack-runner. Receipt: status complete, exit code 0, provider reported claude-fable-5-1, model verification passed. No explorers, no critics, no parent-model substitution. Two earlier attempts under read-only and no-network sandboxes failed at dispatch for sandbox reasons (runner cannot write receipts; child claude got ENOTFOUND), and in both the session refused to substitute itself, which is the contract.

Retained port rules. PSTACK_STATIC_ONLY=1 bash tests/skill-collision-repro.sh passes on the candidate. Deleting the "Stop before any rebase, force-push, retarget, arm, or merge" instruction from shipping.md makes it fail with "Shipping can mutate the frontier before every merge request is confirmed off"; restoring it passes.

🤖 Generated with Claude Code

ericlitman and others added 4 commits September 8, 2026 14:49
Make How explain-only and remove its unused panel role from setup, tests, and callers.
Add the premise and behavior-testing principles with narrow correctness fixes in their bodies, descriptions, and index entries.
Keep the upstream merge lever with the sync and correct the active reference documentation.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Import the upstream density and punctuation passes with the exact logo and README mirror.
Reapply the Claude Code and Codex substitutions while preserving provider dispatch and the port's shipping safeguards.
Keep concise PR guidance without the 40-line cutoff, and make Reflect explicit-only.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Record the pinned upstream revision, imported changes, retired How role, and two local principle corrections.
Set the port manifests to 1.4.0 and document the verified catalog of 54 shared skills and 23 principles.
Restate the exclusions and preserve the installed-candidate evidence gate before release.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
@greptile-apps

greptile-apps Bot commented Sep 8, 2026

Copy link
Copy Markdown

Too many files changed for review (103 files, 100 file limit).

Bypass the limit by tagging @greptile-apps to review.

@ericlitman
ericlitman marked this pull request as ready for review September 8, 2026 20:02
@mergify

mergify Bot commented Sep 8, 2026

Copy link
Copy Markdown

Tick the box to add this pull request to the merge queue (same as @mergifyio queue).

  • Queue this pull request

@openswebot openswebot 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.

Open SWE Review found 3 potential issues.

Open in Web

Comment thread plugins/pstack/skills/how/SKILL.md Outdated
Comment thread docs/plans/upstream-0.15.0.md Outdated
Comment thread scripts/upstream-merge.py Outdated
…elete

The sync had added `user-invocable: false` to how, why, unslop, and
typescript-best-practices, which hides the documented slash commands.
Main never carried that flag on those four; UPSTREAM.md excludes every
invocation-blocking flag for them. The merge lever now refuses to
overwrite or delete a port-edited file on an upstream add or delete and
reports it for review instead. The plan names GitHub issue #61 as the
repository's canonical tracker.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
@ericlitman

Copy link
Copy Markdown
Owner Author

Open SWE round 1, adjudicated against the code. All three findings held and are fixed in 4cb58f6.

  • user-invocable: false on how/why/unslop/typescript-best-practices. Real regression. origin/main never carried the flag on those four, and UPSTREAM.md excludes every invocation-blocking flag for them. It entered through commit 0044ae5 via a mislabeled rule in the implementation brief. The four lines are removed; the principle leaves keep the flag as before. CHANGES.md now says so.
  • Tracking. Issue Sync Cursor pstack 0.15.0 #61 predates this PR and is the repository's canonical tracker per AGENTS.md. The plan now names it, and the PR closes it. Linear PSTACK-2 is the operator's batch queue and mirrors the same work.
  • Lever auto-applies diverged add/delete rows. Real, reproduced: a synthetic audit with all four add/delete rows relabeled port-diverged-review mutated the tree. The script now reports those rows as conflicts and mutates nothing (rerun: conflicted 4, removed 0, zero files changed). Behavior for this range is unchanged: 24 verbatim, 32 clean, 32 conflicted, 2 removed.

Host gates rerun on 4cb58f6: all pass. One Bun run showed a single transient failure that did not reproduce on the immediate rerun (158/158); recorded in the batch ledger.

The plan doc lives in this repository, so it follows AGENTS.md and names
only the GitHub issue. It also records that the upstream correction
proposal was dropped at execution.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
@ericlitman

Copy link
Copy Markdown
Owner Author

Open SWE round 2: two findings confirmed resolved, one still open on the plan doc's Linear mention. Fixed in the next commit: the plan now names only GitHub issue #61, and its stale "prepare an upstream proposal" paragraph now records that the proposal was dropped at execution. The repository's own docs follow AGENTS.md; the operator's queue lives outside the repository.

@ericlitman
ericlitman merged commit 64f174e into main Sep 8, 2026
4 checks passed
@ericlitman

Copy link
Copy Markdown
Owner Author

/gavel rerun

ericlitman pushed a commit that referenced this pull request Sep 8, 2026
…safe rows

The Gavel panel review of PR #60 raised five defects in the lever. It
now refuses to run unless HEAD is the audited port commit and every
mapped path is clean, reports excluded and non-regular entries instead
of crashing on them, treats an already-matching addition as a no-op,
writes its three-way inputs to a temporary directory instead of sibling
files, and applies the upstream executable bit. upstream-merge-probe.py
reproduces each case plus the real 0.15.0 range. Against the previous
script it fails all eight checks, six on behavior and two only on the
summary wording; against this one all eight pass.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
ericlitman added a commit that referenced this pull request Sep 8, 2026
…ry merges (#62)

The Gavel panel review of #60 found the upstream merge lever could overwrite work done after the audit; it now refuses to run unless HEAD is the audited commit and mapped paths are clean, reports excluded and diverged rows instead of applying them, keeps the executable bit, uses a temporary directory for merge inputs, skips the status check when nothing is mapped, and reports git merge-file failures on binaries instead of chmodding. scripts/upstream-merge-probe.py reproduces each case plus the real 0.15.0 range. Findings about repository shapes this tree does not produce were waived on the head with their disproofs.
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.

Sync Cursor pstack 0.15.0

1 participant