Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
79 commits
Select commit Hold shift + click to select a range
40d506c
Merge pull request #180 from ericlitman/release/174-1.8.0
mergify[bot] Oct 13, 2026
73099b0
feat(registry): add GPT-6 Luna, Sonnet and the exact Opus 5.5 pin (#54)
ericlitman Oct 14, 2026
d0d7edd
docs: describe every Claude family's native agents and the exact pin …
ericlitman Oct 14, 2026
9415e5c
feat(runner): add a read-only Devin provider with SWE-2 and SWE-1.6 (…
ericlitman Oct 14, 2026
cb51eea
fix(verify): prove the new families' probe routes and the Codex mirro…
ericlitman Oct 14, 2026
8610e89
feat(runner): let a model-sheet setting give Codex writer lanes full …
ericlitman Oct 14, 2026
36f58d9
fix(verify): prove the new native agents directly and check the Codex…
ericlitman Oct 14, 2026
172086b
fix(verify): test Sonnet migration in setup, reject native-agent mode…
ericlitman Oct 14, 2026
768d0f0
Merge pull request #182 from ericlitman/feat/54-luna-pins-sonnet
mergify[bot] Oct 14, 2026
dbf2574
Merge PR #182's final head into feat/69-devin-provider
ericlitman Oct 14, 2026
508fb29
Merge main into feat/69-devin-provider before review
ericlitman Oct 14, 2026
c50514a
fix(runner): refuse Devin lanes in repositories with .devin/ config, …
ericlitman Oct 14, 2026
156578d
fix(setup): refuse read-only providers for architect runners, prove t…
ericlitman Oct 14, 2026
ecd24c4
Merge pull request #183 from ericlitman/feat/69-devin-provider
mergify[bot] Oct 14, 2026
e2daf0b
Merge PR #183's final head into feat/80-codex-full-access-writer
ericlitman Oct 14, 2026
ca397f7
Merge main into feat/80-codex-full-access-writer before review
ericlitman Oct 14, 2026
7166557
fix(verify): quote the browser case's paths, and prove setup and pare…
ericlitman Oct 14, 2026
dda93d6
fix(verify): dispatch a bounded Codex writer live, control configure'…
ericlitman Oct 14, 2026
53b6d59
Merge pull request #184 from ericlitman/feat/80-codex-full-access-writer
mergify[bot] Oct 14, 2026
7f8c6ca
build: add root check scripts so Unfret registers and shares them (#185)
ericlitman Oct 14, 2026
6c25e20
verify: map the root package.json and ci.yml to project proof (#185)
ericlitman Oct 14, 2026
3fa7f0b
verify: give the unit tests a real account when USER and LOGNAME are …
ericlitman Oct 14, 2026
f1c88d8
Merge pull request #186 from ericlitman/feat/185-root-check-scripts
mergify[bot] Oct 14, 2026
a648c54
release: Open Pstack 1.9.0 with Luna, Sonnet, the Opus 5.5 pin, Devin…
Oct 15, 2026
b151645
test(verify): keep fixture git out of the host's global config (#172)
ericlitman Oct 15, 2026
6c8eda4
Merge pull request #193 from ericlitman/test/172-fixture-git-isolation
mergify[bot] Oct 16, 2026
f53309c
Merge branch 'main' into release/190-1.9.0
mergify[bot] Oct 16, 2026
7cf8cc6
Merge pull request #192 from ericlitman/release/190-1.9.0
mergify[bot] Oct 16, 2026
d8eeb4d
skills: import in-your-own-words and sharpen from Cursor pstack 0.15.…
Oct 15, 2026
d462f0a
sync: port Cursor pstack 0.15.21-0.15.25 skill content (#191)
Oct 15, 2026
90a89e3
release: sync Cursor pstack 0.15.25 as Open Pstack 1.10.0 (#191)
Oct 15, 2026
51dac0f
feat(runner): let adapters set run-owned environment and lane config …
ericlitman Oct 16, 2026
3e513d7
feat(runner): add a read-only OpenCode provider with DeepSeek V4.1 Fl…
ericlitman Oct 16, 2026
5710758
feat(runner): add a read-only DeepSeek Harness (dsh) provider (#159)
ericlitman Oct 16, 2026
502569d
feat(runner): add a read-only Amp provider with DeepSeek V4.1 Flash (…
ericlitman Oct 16, 2026
61f8f4d
feat(runner): add a read-only Antigravity (agy) provider with Gemini …
ericlitman Oct 16, 2026
b274055
feat(runner): refuse a dsh other than the measured 0.2.0-rc.2 (#159)
ericlitman Oct 16, 2026
22aff42
Merge pull request #194 from ericlitman/sync/191-cursor-pstack-0.15.25
mergify[bot] Oct 16, 2026
9c80520
feat(runner): add a read-only Cursor CLI provider with Composer 2.5 a…
ericlitman Oct 16, 2026
8ab2c7d
Merge remote-tracking branch 'origin/main' into feat/68-159-158-37-wo…
ericlitman Oct 16, 2026
791f7ad
fix(runner): keep home config out of read-only lanes (#68, #37, #158,…
ericlitman Oct 16, 2026
c69b5c4
fix(runner): pin every dsh sandbox and approval row in the lane patch…
ericlitman Oct 16, 2026
c65b385
fix(runner): run dsh lanes on a run-owned dsh home; fail agy turns th…
ericlitman Oct 16, 2026
72c469a
fix(runner): refuse a dsh lane whose cwd holds .env; resolve DSH_HOME…
ericlitman Oct 16, 2026
3f45dfa
fix(runner): refuse lanes whose project-config walk would reach the h…
ericlitman Oct 16, 2026
08556cd
fix(runner): refuse an OpenCode lane whose effective permissions exce…
ericlitman Oct 16, 2026
dd27230
refactor(runner): move OpenCode, Amp and Cursor out of this PR (#68, …
ericlitman Oct 16, 2026
680fc2e
test(runner): compare config-carried effort line by line (#159)
ericlitman Oct 16, 2026
d5c2543
test(runner): check dsh's default effort on its own line (#159)
ericlitman Oct 16, 2026
515ed3d
Merge pull request #196 from ericlitman/feat/68-159-158-37-worker-pro…
mergify[bot] Oct 16, 2026
e99abd7
release: Open Pstack 1.11.0 with the DeepSeek Harness and Antigravity…
ericlitman Oct 16, 2026
3b8dae6
Merge pull request #199 from ericlitman/release/198-open-pstack-1.11.0
mergify[bot] Oct 16, 2026
c5841de
verify: enforce live-gate feature selection (#200)
ericlitman Oct 16, 2026
4e6d971
Merge pull request #201 from ericlitman/feat/200-verify-feature-selec…
mergify[bot] Oct 16, 2026
e679251
feat(runner): add OpenCode as a read-only external provider (#68)
ericlitman Oct 16, 2026
fe2bf51
docs(review): read-only means pstack's own CLI settings, with no refu…
ericlitman Oct 16, 2026
2094580
Merge pull request #205 from ericlitman/docs/203-review-trust-operato…
mergify[bot] Oct 16, 2026
58ad12f
refactor(runner): drop OpenCode's pre-launch guard and .opencode/ ref…
ericlitman Oct 16, 2026
095b127
Merge origin/main for #205's REVIEW.md read-only scope sentences befo…
ericlitman Oct 16, 2026
1e8e2c6
Merge pull request #202 from ericlitman/feat/68-opencode-runner
mergify[bot] Oct 16, 2026
c3b19a9
release: Open Pstack 1.12.0 with the OpenCode provider (#206)
ericlitman Oct 16, 2026
cbc2734
feat(runner): add Amp as a read-only external provider (#158)
ericlitman Oct 16, 2026
0b6970b
Merge pull request #207 from ericlitman/release/206-open-pstack-1.12.0
mergify[bot] Oct 16, 2026
753eb85
Merge branch 'main' into feat/158-amp-runner
mergify[bot] Oct 16, 2026
5fb1fca
Merge pull request #208 from ericlitman/feat/158-amp-runner
mergify[bot] Oct 16, 2026
a9aa914
release: Open Pstack 1.13.0 with the Amp provider (#209)
ericlitman Oct 16, 2026
f8b193c
Merge pull request #210 from ericlitman/release/209-open-pstack-1.13.0
mergify[bot] Oct 16, 2026
3e7b1c3
feat(runner): add Cursor CLI as a read-only external provider (#71)
ericlitman Oct 16, 2026
f2ece1e
Merge pull request #211 from ericlitman/feat/71-cursor-runner
mergify[bot] Oct 16, 2026
757a044
release: Open Pstack 1.14.0 with the Cursor CLI provider (#213)
ericlitman Oct 16, 2026
2d5fe99
Merge pull request #214 from ericlitman/release/213-open-pstack-1.14.0
mergify[bot] Oct 16, 2026
25617b2
refactor(runner): drop the Devin, agy and dsh repository refusals (#204)
ericlitman Oct 16, 2026
3d46e72
docs(runner): disclose the agy and Devin config walk, and name the pr…
ericlitman Oct 16, 2026
ae3f98d
Merge pull request #215 from ericlitman/feat/204-remove-repository-re…
mergify[bot] Oct 16, 2026
39cb5e4
release: Open Pstack 1.15.0 without the Devin, agy and dsh repository…
ericlitman Oct 16, 2026
cf7febd
Update pstack with Cursor 0.15.28 formal verification skills
fitziboy3-source Oct 19, 2026
0da302d
Fix fork verification coverage and Windows flag fixture
fitziboy3-source Oct 19, 2026
60a092c
Route native verification and exercise formal model maintenance
fitziboy3-source Oct 19, 2026
de9b419
Require native consent for formal fixture skill writes
fitziboy3-source Oct 19, 2026
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 @@ -9,7 +9,7 @@
"name": "pstack",
"source": "./plugins/pstack",
"description": "if you want to go fast, go deep first. pstack helps you write less, but higher quality code. rigorous agent workflows you can parallelize with confidence.",
"version": "1.8.0",
"version": "1.15.0-adam.20261019",
"author": {
"name": "Lauren Tan (original)"
},
Expand Down
22 changes: 18 additions & 4 deletions .claude/skills/verify-open-pstack/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,11 @@ EVIDENCE="$SESSION/live" # must not exist yet
.claude/skills/verify-open-pstack/scripts/verify.sh run --pr "$PR" --feature claude:project-skill --self-test --output "$EVIDENCE"
```

Pick the features that exercise the PR's changed behavior and pass each as `--feature <harness>:<feature>`, repeatable. List the same features in the PR body, where review sees them. A runtime change needs at least one `--feature`; the run fails before any install without one. The run exercises only the named features, plus `project-skill` in both harnesses under `--self-test`. It never falls back to the classified set, and a full sweep is never the default.
Pick the features that exercise the PR's changed behavior and pass each as `--feature <harness>:<feature>`, repeatable. List the same features in the PR body, where review sees them. The run exercises only the named features, plus `project-skill` in both harnesses when classification reaches it or under `--self-test`. Before any install or GitHub write, `verify.sh run` makes three checks:

- Scope: a runtime change needs at least one `--feature`, and every named feature must be in the PR's classified reach. The refusal names each refused feature and the reachable set. A manifest change that only bumps the version reaches only `hook:startup` in that manifest's harness.
- Count: the run prints the number of headless sessions the named features and automatic `project-skill` checks will start.
- Limit: above 12 sessions, the run refuses unless you pass `--wide "<reason>"`. The reason must be printable ASCII, at most 160 characters, without backticks or angle brackets. The evidence comment records the planned count and the reason.

Reuse the Claude Code and Codex logins you already have; no extra login or credential source flags. Omit `--self-test` for ordinary plugin verification; it is mandatory for this skill's delivery. An agent runs and judges the whole gate from a non-TTY shell; nothing prompts a person. `--runner-route PROVIDER:MODEL@EFFORT`, repeatable, replaces the runner recipe's default route, a role default from the installed candidate's model catalog, for each parent whose provider differs from the route's.

Expand All @@ -41,7 +45,7 @@ Temporary, GitHub, and fixture state remain run-owned; Git configuration is disa

## Drive

Read `features/README.md` and the document for every named feature. Path classification still runs: it decides whether the PR has a runtime change, and an unmapped path fails closed. It does not choose the features; the agent does. `no runtime change` launches no harness unless `--self-test` is requested.
Read `features/README.md` and the document for every named feature. Path classification computes the features the PR can reach, and an unmapped path fails closed. It does not choose the features; the agent does. `no runtime change` launches no harness unless `--self-test` is requested.

Create detached exact-head candidate checkouts and run-owned temporary/fixture state, only for harnesses with a named feature. Every named feature resolves to a recipe in `features/recipes.ts` before the first session starts: one or more cases, each with a fixture, a prompt, and an assertion the trusted parent evaluates. A feature without a recipe fails as `missing-recipe:<harness>/<feature>`; `assets:codex` fails as `unsupported-native-consumer` until it has a recipe. Each case runs as one fresh headless session, sequentially, and setup never runs alongside anything.

Expand Down Expand Up @@ -71,10 +75,10 @@ Each headless session exits on its own. Verify any setup restoration before publ

- `scripts/verify.sh doctor --output <fresh-absolute-external-directory>`: parent capability and login-state report, no installation/publication.
- `scripts/verify.sh doctor --candidate --output <fresh-run-owned-directory>`: candidate-safe self-test probe; no publisher authentication probing.
- `scripts/verify.sh run --pr <positive-number> --feature <harness>:<feature>... [--self-test] [--runner-route PROVIDER:MODEL@EFFORT]... --output <fresh-absolute-external-directory>`: headless exact-head verification of the named features with machine-checked recipes; no terminal or prompts. The evidence comment lists only the features that ran.
- `scripts/verify.sh run --pr <positive-number> --feature <harness>:<feature>... [--self-test] [--runner-route PROVIDER:MODEL@EFFORT]... [--wide <reason>] --output <fresh-absolute-external-directory>`: headless exact-head verification of the named features with machine-checked recipes; no terminal or prompts. The evidence comment lists only the features that ran.
- `features/recipes.ts`: per-feature headless cases and assertions.
- `bun run test` and `bun run typecheck`: development checks after a separate frozen dependency install, not live proof.
- `features/registry.json`: maintained path ownership; it decides runtime versus no runtime change, and unknown runtime paths block.
- `features/registry.json`: maintained path ownership; it decides which features a PR can reach, and unknown runtime paths block.

Read receipts as data, never shell input. Do not put credentials in prompts or public artifacts.

Expand All @@ -99,3 +103,13 @@ Read receipts as data, never shell input. Do not put credentials in prompts or p
- scripts/verify.sh
- scripts/verify.test.ts
- scripts/verify.ts

## Subscription account routing

When the operator uses the harness account router, pass `--account-router /absolute/path/to/account-router` and one explicit `--native-model HARNESS:MODEL@EFFORT` for each selected harness. On Adam's model sheet these are `claude:opus@high` and `codex:gpt-6-astra@xhigh`. The router must have its matching `pstack-verify-run` launcher installed beside it. Missing support stops the run; never retry native sessions outside the router.

The launcher receives one private request per native case, chooses the account through the router, validates the final isolated configuration against that admitted subscription, and links Codex authentication only for the admitted session. Plugin installation needs no authentication. Each case retains its account and terminal receipts privately; publication contains only their hashes. A failed or uncertain session retains candidate state for inspection. Cancellation asks the router to stop its child and write terminal evidence.

This route supports ordinary single-session recipes with fixed native permissions. Setup, external runner exercises, and agent preload fail before the first session; they need a separate admitted contract. The poteto-mode invocation exercise resolves a supplied model sheet without dispatch. Formal creation and maintenance use the bounded capacity fixture described in `features/skill-invocation.md`.

Routed Claude sessions use the launcher's native permission channel for Write/Edit of the formal fixtures' `.claude/skills/verify-capacity/SKILL.md`. The operator must approve that scoped policy before enabling it. Other permission requests are denied and decisions stay in the private terminal receipt. Use native file tools for that skill; a denied edit fails the case. The maintenance assertion still requires the actual skill's sync commit to advance.
16 changes: 10 additions & 6 deletions .claude/skills/verify-open-pstack/features/README.md
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
# Maintained feature map

The agent running the verifier picks the features that exercise the PR's changed behavior, passes each as `--feature <harness>:<feature>`, and lists them in the PR body, where review sees them. The run exercises only those features, plus `project-skill` in both harnesses under `--self-test`. A full sweep of every feature the paths touch is never the default. The ownership table below says which surfaces a changed path can affect, to guide that choice; it does not select them.
The ownership table below says which features a changed path reaches. `SKILL.md` says how to pick the named features from that reach and how `verify.sh run` checks them.

`registry.json` is the machine-readable ownership map. Classification decides whether a PR has a runtime change, which requires at least one `--feature`. `core.ts` supports exact paths and terminal `/**` only. Unknown paths fail closed; rename classification includes both paths. Runtime markdown, references, playbooks, hooks, manifests, and scripts are runtime even when their extension looks documentary.
`registry.json` is the machine-readable ownership map. Classification turns the changed paths into the reachable `<harness>:<feature>` set; an empty set is `no runtime change`. `core.ts` supports exact paths and terminal `/**` only. Unknown paths fail closed; rename classification includes both paths. Runtime markdown, references, playbooks, hooks, manifests, and scripts are runtime even when their extension looks documentary.

| Ownership | Surfaces a change can affect |
| --- | --- |
| `skills` | One `skill-invocation:<name>` exercise per selected skill, in both harnesses |
| `shared` | All listed skills, setup, runner, and shipped tools in both harnesses; `hook:startup` for `plugins/pstack/hooks/**` |
| `shared` | All listed skills, setup, runner, shipped tools, and `hook:startup` in both harnesses, and Claude's `agent-preload:poteto-agent`; a version-only manifest change reaches less, as described below |
| `catalog` | The generated model catalog and native agents, and the registry sources: `catalog`, `setup`, and `runner`, and no skill check |
| `assets` | Installed UI/resource surface for each actual consumer found in the pinned plugin manifests |
| `setup` | Installed setup/model configuration with byte-exact daily Claude file restoration before publication |
Expand All @@ -16,11 +16,15 @@ The agent running the verifier picks the features that exercise the PR's changed
| `project` | Native discovery/invocation of this verifier in both harnesses |
| `nonRuntime` | Explicit ordinary repository documentation, policy, non-shipped assets, and unit-test paths; no plugin harness launch |

A change to `plugins/pstack/.claude-plugin/plugin.json`, `.claude-plugin/marketplace.json`, or `plugins/pstack/.codex-plugin/plugin.json` is version-only when the merge base and the head hold the same regular file with the same mode, both sides parse as JSON objects, at least one version string changed (top-level `version`, or `plugins[].version` in the marketplace), and nothing else differs. A version-only change reaches only `hook:startup`: the two Claude files in Claude, the Codex manifest in Codex. `.agents/plugins/marketplace.json` has no version and always takes the shared expansion.

Asset ownership is consumer-driven, not blanket shared ownership. Inspect the exact candidate's plugin manifests. At present, `plugins/pstack/assets/logo.png` is referenced only by `plugins/pstack/.codex-plugin/plugin.json`, so a logo-only change selects the installed Codex asset surface and does not invent a Claude exercise. New shipped assets must be added to `assets` and must have a real manifest consumer; missing, ambiguous, or unknown consumption fails closed.

A registered skill's `agents/openai.yaml` controls Codex invocation and selects that skill's Codex surface. Other metadata filenames remain unmapped. The formal verification creation and maintenance skills each have their own entry in `registry.json`.

`bootstrap.ts` belongs to `tools`; exercise its actual consumers, `orch` and `watch-pr`, including dependency bootstrapping rather than the unrelated external runner.

Catalog paths take precedence over `shared` and over the skill match, so `references/model-catalog.md` and the generated agents select only `catalog`, `setup`, and `runner`. Each generated agent is listed by exact path; a new one is unmapped until it is added to `catalog`. Skill-owned `SKILL.md`, `references/**`, and `playbooks/**` select their skill. Additional executable paths must be registered explicitly. `core.ts` assigns the Codex transcript resolver, `poteto-mode/scripts/resolve-codex-transcript.ts`, and its launcher, `poteto-mode/scripts/resolve-codex-transcript`, to `reflect` by their exact paths, so a change to it selects `skill-invocation:reflect` rather than the unrelated shipped-tool recipe. Shared consumed mappings select every dependent skill conservatively. The coverage test inventories tracked plugin files; new unmapped files block CI and runs. Deleted skill surfaces cannot silently disappear from evidence: choose a surviving documented entry point demonstrating the intended removal, or report blocked.
Catalog paths take precedence over `shared` and over the skill match, so `references/model-catalog.md` and the generated agents select only `catalog`, `setup`, and `runner`. Each generated agent is listed by exact path; a new one is unmapped until it is added to `catalog`. Skill-owned `SKILL.md`, `references/**`, and `playbooks/**` select their skill. poteto-mode's `SKILL.md` also reaches Claude's `agent-preload:poteto-agent`, because poteto-agent preloads it. Additional executable paths must be registered explicitly. `core.ts` assigns the Codex transcript resolver, `poteto-mode/scripts/resolve-codex-transcript.ts`, and its launcher, `poteto-mode/scripts/resolve-codex-transcript`, to `reflect` by their exact paths, so a change to it selects `skill-invocation:reflect` rather than the unrelated shipped-tool recipe. Shared consumed mappings select every dependent skill conservatively. The coverage test inventories tracked plugin files; new unmapped files block CI and runs. Deleted skill surfaces cannot silently disappear from evidence: choose a surviving documented entry point demonstrating the intended removal, or report blocked.

The feature documents below define sub-features, user entry points, driving instructions, and gotchas. Review each changed sub-feature in the diff. Record all changed sub-feature actions in the feature's transcript and artifact. Do not run destructive application work in the maintainer checkout.

Expand All @@ -35,6 +39,6 @@ The feature documents below define sub-features, user entry points, driving inst
- `recipes.ts`: the headless cases and machine-checked assertions for every selectable feature. A named feature without one fails the run as `missing-recipe` before any session starts. A recipe proves a lookup or a read with a fixture value the model cannot derive from the prompt, such as a per-run `crypto.randomUUID()` marker, compared in the structured result. A command's text can show which tool the parent called, but it never proves what that tool read or produced, so do not add command-text or tool-output pattern checks for that.
- `agent-preload:poteto-agent` (Claude only): the parent dispatches `pstack:poteto-agent` through the Agent tool and asks it for the first Core principle of the preloaded poteto-mode skill without invoking `Skill` or reading files. The check needs that Agent call, `Laziness Protocol` in the reply the parent writes to `result.md`, and no `Skill` call or `Read` of poteto-mode's `SKILL.md` among the child's own tool calls.

Consumed `AGENTS.md`/`CLAUDE.md` instructions and `tests/skill-collision-repro.sh` select `project-skill`. `.mergify.yml` is explicitly `nonRuntime`. There are no blanket no-runtime exemptions for `.github/**`, `tests/**`, or `scripts/**`: unregistered instruction/enforcement paths fail closed until their ownership is reviewed and mapped.
Consumed `AGENTS.md`/`CLAUDE.md` instructions, `tests/skill-collision-repro.sh`, `.github/workflows/ci.yml` and the root `package.json`, whose scripts CI runs, select `project-skill`. `.mergify.yml` is explicitly `nonRuntime`. There are no blanket no-runtime exemptions for `.github/**`, `tests/**`, or `scripts/**`: unregistered instruction/enforcement paths fail closed until their ownership is reviewed and mapped.

Explicit non-runtime repository changes are `no runtime change`. Changes to this verifier are runtime changes and must run from the candidate head. `--self-test` adds `project-skill` in both harnesses, deduplicated with a named one, and is mandatory for this skill's delivery PR. Plugin-runtime proof and local CLI proof remain separate.
Explicit non-runtime repository changes are `no runtime change`. Plugin-runtime proof and local CLI proof remain separate.
Loading
Loading