Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
19 commits
Select commit Hold shift + click to select a range
a90888b
refactor(pstack): resolve the orchestrate frontier from the PR base c…
leegmoore Oct 17, 2026
90a7edb
feat(pstack): match each subagent's effort to the job, lowering only
leegmoore Oct 17, 2026
862f4c7
feat(pstack): run one full swarm per multi-phase PR and a single veri…
leegmoore Oct 17, 2026
265b10d
refactor(pstack): cut the shipping playbook to its principles
leegmoore Oct 17, 2026
02a8ed4
refactor(pstack): cut the autopilot playbooks to their principles and…
leegmoore Oct 17, 2026
fa256b5
fix(pstack): treat an owner-approval Code Review Gate as the gate, an…
leegmoore Oct 17, 2026
5c7537a
docs(pstack): record the sync PR C decisions for ce649c0 and 8043881
leegmoore Oct 17, 2026
e477da3
fix(pstack): keep autopilot trails in the root's store and probe chil…
leegmoore Oct 17, 2026
bac6cef
fix(pstack): never lower verification effort, and keep the role ceili…
leegmoore Oct 17, 2026
979bc6e
fix(pstack): keep shipping's fallback heartbeat on both forges
leegmoore Oct 17, 2026
739cd29
fix(pstack): sync chain branches from origin before orch frontier set
leegmoore Oct 17, 2026
660c836
fix(orch): list open children with a limit and anchor a branch on its…
leegmoore Oct 17, 2026
d9260ed
feat(scripts): guard the Effort row in the T3 port check
leegmoore Oct 17, 2026
669117f
docs(pstack): record the trail, owner polling and frontier fork fixes…
leegmoore Oct 17, 2026
13edcdc
fix(pstack): give a cloud autopilot owner a poll it can run
leegmoore Oct 17, 2026
c84a290
orch/store: prefer OPEN PR when multiple for head branch; error on tr…
cursoragent Oct 17, 2026
3c2f8f6
Merge remote changes into sync/c-big-port and resolve conflicts in or…
cursoragent Oct 17, 2026
5154831
fix(pstack): make autopilot owner reports wake the root and read ever…
leegmoore Oct 17, 2026
01528d9
fix(pstack): check trail comments before copying them, and spell out …
leegmoore Oct 17, 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
4 changes: 2 additions & 2 deletions FORK-SYNC-LOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -26,8 +26,8 @@ One table per sync. One row per upstream commit that touches `pstack/` or the co
| `3177dab` | chore(pstack): bump to 0.15.22 (#605) | skip (planned) | | version bump |
| `dbf4981` | refactor(pstack): reword /in-your-own-words around goals and the problem (#606) | adapt | B | taken with 7d8d909, version bump left out |
| `c86f349` | refactor(pstack): make /ketchup read like /bro in 150 words (#609) | adapt (planned) | D | /ketchup rewrite |
| `ce649c0` | feat(pstack): match subagent effort to the job, drop Graphite from orchestrate, and cut playbooks to principles (#613) | adapt (planned) | C | effort rule as lower-only, no Claude fast (Speed row), Graphite out, swarm cadence, shorter playbooks with T3 steps kept |
| `8043881` | pstack: autopilot loops catch the operator up with /ketchup (#616) | adapt (planned) | C | autopilot loops use /ketchup |
| `ce649c0` | feat(pstack): match subagent effort to the job, drop Graphite from orchestrate, and cut playbooks to principles (#613) | adapt | C | effort rule lower-only with no fast clause (Effort and Speed rows), verifiers and owners as delegate_task children (Subagents and Model per role rows), watch_pull_request plus heartbeat and origin/lim re-reads in shipping and the autopilots (Waking and Trunk rows), owner trails under autopilot/<run-slug>/<repo>/<branch>/ in the pstack store with a cloud owner's rows relayed through marked PR comments because its VM cannot reach the store, and owners that poll with watch-pr and report CODE-READY by PR comment while the root holds the watch (Todo list, Subagents and Waking rows), Graphite out with the orch frontier on gh or origin and the remote's HEAD as trunk (Trunk row). Fork fixes on top of upstream's frontier resolver: open children are listed with --state open and an explicit --limit that fails when filled, where upstream's --state all with gh's default 30 rows dropped an open child past the first page, and a branch anchors on its unique open PR with --prs to pick among several merged or closed ones, where upstream rejected any branch with two PRs. Owners poll without watch_pull_request: a local owner runs the installed watch-pr, a cloud owner polls gh pr view and the reviewThreads GraphQL query because its VM has no pstack, and reports reach the root by t3_thread_send or a 10-minute poll |
| `8043881` | pstack: autopilot loops catch the operator up with /ketchup (#616) | adapt | C | taken inside the autopilot rewrite, whose T3 steps follow the Waking and Trunk rows |
| `79afd75` | feat(pstack): add /sharpen (#615) | adapt | B | visible and named-only (Skill visibility row) |
| `1e5c90a` | chore(pstack): bump to 0.15.24 (#617) | skip (planned) | | version bump |
| `afd51cf` | feat(pstack): have /ketchup explain changes with screenshots, videos, and diagrams (#628) | adapt (planned) | D | /ketchup screenshots and videos via T3 tools |
Expand Down
1 change: 1 addition & 0 deletions FORK.md
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ pstack upstream is written for Cursor. This fork runs it from T3 Code, where one
| Subagents | Cursor `Task` with `subagent_type`, `readonly`, `environment` | a T3 `delegate_task` child, `mode: "async"`, with an explicit `target` (omitted only when the role line says `auto` or `inherit-parent`) | Only T3's tool reaches every provider from one lead. A child's task ends with its turn, so its brief tells it never to end the turn to wait. |
| Model per role | `~/.cursor/rules/pstack-models.mdc`, slugs such as `grok-4.7-xhigh-fast` | the pstack roles block in `~/lim-v2/AGENTS.md`, entries `<providerInstanceId>/<model> <option>=<value>` | Every harness under `~/lim-v2` reads that one file, and T3 takes provider, model and options as separate fields. |
| Speed | a `-fast` slug, used when the job is urgent | Grok and GPT may run fast freely. Claude fast mode only on work the operator names in the session, and only that work. Retries, reviewers, verifiers and later tasks are covered only if the operator names them too. | Grok usage is plentiful. Claude fast mode spends rate limit fast, and a broad reading of one approval gets out of hand. |
| Effort | each spawn raises or lowers the role's effort for the job, up to max | each spawn keeps the role line's effort for judgment, review and design, may lower it for routine work, and never raises it above the role line | A raise spends Claude rate limit per spawn, and the `hardest tasks` line already covers the hardest work, so the role file stays the single source of model choice. |
| Waking | Cursor background agents and polling scripts | T3 `watch_pull_request`, child-completion wakes, and a fallback heartbeat per "Waking and polling" in `~/lim-v2/AGENTS.md` | A T3 lead that ends its turn is woken only by an event. A heartbeat covers what the watch misses. |
| Todo list | the harness's todo tool | the harness's todo tool if it has one, otherwise a checklist file under `todos/` in the pstack store, named in the first message | T3's Claude harness has no todo tool. A file also survives a pause and a pickup. |
| Trunk | `origin/main` | `origin/lim` for pstack itself, the repo's default branch elsewhere | The fork's default branch is `lim`. Hourly audit ticks re-read playbooks from `origin/lim`. |
Expand Down
2 changes: 1 addition & 1 deletion pstack/skills/arena/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ Every candidate gets the same prompt, so the prompt is the contract.

1. State the artifact each candidate is producing.
2. Derive the rubric, 3-6 concrete gradeable criteria for what success looks like on *this* task. It is the picker's tool in Phase D. Candidates only see the task.
3. Pick the runners. Use the `arena runners` line in the role file (`~/lim-v2/AGENTS.md` or `~/lim-v2/CLAUDE.md`). If the file or that line is missing, default to one each on `claudeAgent/claude-opus-5-5 effort=xhigh` and `cursor/grok-4.7 reasoning_effort=xhigh fastMode=true`. An `auto` or `inherit-parent` entry in this line or the cross-judge line means the parent model, so omit `target` for it. If `delegate_task` rejects a configured entry, run that seat on its family's default and say so. The families are claude, gpt, and grok, by model name. The gpt family's default is `codex/gpt-6.1-sol reasoningEffort=high`. With no family match, use `claudeAgent/claude-opus-5-5 effort=xhigh`. If it rejects a default, use the closest model of the same family that `orchestrator_capabilities` lists. Spawn more runners when the arena covers multiple design directions. Use the same model N times when the work is generation-bound rather than judgment-sensitive.
3. Pick the runners. Use the `arena runners` line in the role file (`~/lim-v2/AGENTS.md` or `~/lim-v2/CLAUDE.md`). If the file or that line is missing, default to one each on `claudeAgent/claude-opus-5-5 effort=xhigh` and `cursor/grok-4.7 reasoning_effort=xhigh fastMode=true`. An `auto` or `inherit-parent` entry in this line or the cross-judge line means the parent model, so omit `target` for it. If `delegate_task` rejects a configured entry, run that seat on its family's default and say so. The families are claude, gpt, and grok, by model name, and a `composer-*` model counts as grok. The gpt family's default is `codex/gpt-6.1-sol reasoningEffort=high`. With no family match, use `claudeAgent/claude-opus-5-5 effort=xhigh`. If it rejects a default, use the closest model of the same family that `orchestrator_capabilities` lists. The original role's effort ceiling survives every fallback, the nearest supported level included, so a fallback never runs above the configured entry's effort. Spawn more runners when the arena covers multiple design directions. Use the same model N times when the work is generation-bound rather than judgment-sensitive. Pick each subagent's effort for the job, per the Subagents section of the **poteto-mode** skill.
4. Give each candidate its own output dir, `/tmp/arena-<slug>/candidate-<n>/`, outside any worktree, per the **separate-before-serializing-shared-state** principle skill. Its rationale and any non-code artifact go there. A candidate that writes code also gets its own git worktree. It commits the code there and passes it on as a commit SHA, never as the worktree's path, because the worktree is removed when the candidate is done.

## Phase B: Fan out
Expand Down
2 changes: 1 addition & 1 deletion pstack/skills/automate-me/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ Update mode changes the rest of the flow:

List this project's T3 threads before fanning out with `t3_thread_list` (newest first, defaulting to the calling thread's project; follow `nextCursor` to the end). Use only those. Don't read other projects' threads. `t3_thread_read` accepts any thread ID, so that scope is yours to keep.

Survey recent agent conversations within that scope for recurring patterns. Run multiple parallel subagents across slices of history (e.g. last 2-4 weeks, split into 3 slices so each has enough material). Each slice mining subagent reads the thread IDs the parent provides with `t3_thread_read` (`view: "activity"` when tool evidence matters, following `nextPosition` and `nextTextOffset`), looks for the signals below, and returns a short structured list of patterns it saw with evidence pointers. Default signals worth hunting:
Survey recent agent conversations within that scope for recurring patterns. Run multiple parallel subagents across slices of history (e.g. last 2-4 weeks, split into 3 slices so each has enough material). Pick each subagent's effort for the job, per the Subagents section of the **poteto-mode** skill. Each slice mining subagent reads the thread IDs the parent provides with `t3_thread_read` (`view: "activity"` when tool evidence matters, following `nextPosition` and `nextTextOffset`), looks for the signals below, and returns a short structured list of patterns it saw with evidence pointers. Default signals worth hunting:

- Response preferences (length, tone, format, "dumb it down" corrections)
- Delegation habits (subagents, models, specialized workflows, parallelism)
Expand Down
2 changes: 1 addition & 1 deletion pstack/skills/figure-it-out/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ Decompose into atomic, independently-landable units. Sequence riskiest-unknown-f

- Build the verification harness before the work, with the baseline captured from the pre-change state, so the check reads as "old value vs new value".
- For one-way-door design decisions, run the **architect** skill (it runs **arena**). Skip it for mechanical work whose shape is already concrete. A second arena over a settled design is over-engineering (the **laziness-protocol** principle skill).
- Decide what fans out. Parallelize only across seams, and give each worker its own worktree or branch (the **separate-before-serializing-shared-state** principle skill). Don't over-fan.
- Decide what fans out. Parallelize only across seams, and give each worker its own worktree or branch (the **separate-before-serializing-shared-state** principle skill). Don't over-fan. Pick each subagent's effort for the job, per the Subagents section of the **poteto-mode** skill.
- Write the designed phase list down. That list is what the human reviews.

Then execute the design. Add its steps to the todolist as concrete items between the Phase C and Phase D entries. Run each under the Phase C loop discipline, and weave the Phase D log through them, a row as each step lands, rather than saving the whole trail for the end.
Expand Down
2 changes: 1 addition & 1 deletion pstack/skills/how/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ description: "Use for \"how does X work\", code walkthroughs before changing som

Explore the codebase to answer "how does X work?" questions. Produce architectural explanations at the level of a senior engineer onboarding onto a subsystem, enough to build a working mental model, not so much that it reads like annotated source code.

Every spawn is a `delegate_task` child (`mode: "async"`) in a read-only role: its prompt says no file writes and no external mutation. Explorers use the `how explorer` line in the role file (`~/lim-v2/AGENTS.md` or `~/lim-v2/CLAUDE.md`) (default `cursor/grok-4.7 reasoning_effort=xhigh fastMode=true`), and every explainer uses the `how explainer` line (default `claudeAgent/claude-opus-5-5 effort=xhigh`). Set `delegate_task`'s `target` to that line's entry, or to the default if the file or the line is missing. Omit `target` when the value is `auto` or `inherit-parent`. If `delegate_task` rejects an entry, use the default and say so. If it rejects the default, use the closest model of the same family that `orchestrator_capabilities` lists.
Every spawn is a `delegate_task` child (`mode: "async"`) in a read-only role: its prompt says no file writes and no external mutation. Explorers use the `how explorer` line in the role file (`~/lim-v2/AGENTS.md` or `~/lim-v2/CLAUDE.md`) (default `cursor/grok-4.7 reasoning_effort=xhigh fastMode=true`), and every explainer uses the `how explainer` line (default `claudeAgent/claude-opus-5-5 effort=xhigh`). Set `delegate_task`'s `target` to that line's entry, or to the default if the file or the line is missing. Omit `target` when the value is `auto` or `inherit-parent`. If `delegate_task` rejects an entry, use the default and say so. If it rejects the default, use the closest model of the same family that `orchestrator_capabilities` lists. Pick each subagent's effort for the job, per the Subagents section of the **poteto-mode** skill.

Each child's final message is its findings or explanation.

Expand Down
4 changes: 2 additions & 2 deletions pstack/skills/interrogate/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -32,9 +32,9 @@ Launch all reviewers in a single message as `delegate_task` children (`mode: "as

Each reviewer gets a read-only role (its brief says no file writes and no external mutation), its findings as its final message, and `target` set to its configured entry, or its table default when there is no configured line. Omit `target` for an `auto` or `inherit-parent` entry, so that reviewer runs on the parent model.

If `delegate_task` rejects a configured entry, run that reviewer on its family's table default and say so. The families are claude, gpt, and grok, by model name. The gpt family has no table row, so its default is `codex/gpt-6.1-sol reasoningEffort=high`. With no family match, use Reviewer A's default. If it rejects a table default, spawn with the closest equivalent that `orchestrator_capabilities` lists (prefer the same family and reasoning tier), and open a separate PR to update the default table. Do not block the review on the model issue. Never treat an alias entry as a rejected entry or apply either fallback to it.
If `delegate_task` rejects a configured entry, run that reviewer on its family's table default and say so. The families are claude, gpt, and grok, by model name, and a `composer-*` model counts as grok. The gpt family has no table row, so its default is `codex/gpt-6.1-sol reasoningEffort=high`. With no family match, use Reviewer A's default. If it rejects a table default, spawn with the closest equivalent that `orchestrator_capabilities` lists (prefer the same family and reasoning tier), and open a separate PR to update the default table. Do not block the review on the model issue. The original role's effort ceiling survives every fallback, the nearest supported level included, so a fallback never runs above the configured entry's effort. Never treat an alias entry as a rejected entry or apply either fallback to it.

Read `references/reviewer-prompt.md` and fill in the same template for every reviewer with the stated intent, the diff or file contents, the rubric from `references/rubric.md`, and the code-quality lens from `references/code-quality-review.md`.
Read `references/reviewer-prompt.md` and fill in the same template for every reviewer with the stated intent, the diff or file contents, the rubric from `references/rubric.md`, and the code-quality lens from `references/code-quality-review.md`. Pick each subagent's effort for the job, per the Subagents section of the **poteto-mode** skill.

## Step 4, Synthesize

Expand Down
2 changes: 1 addition & 1 deletion pstack/skills/no-comments/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ Use the caller's files or diff. Otherwise use the current diff against the base

## Steps

1. Spawn Comment Sicko as a `delegate_task` child. Its brief is pstack's `agents/comment-sicko.md` (`../../agents/comment-sicko.md` from this skill) verbatim, plus the scope. Do not restate its rules. It edits comments in your checkout, so don't write while it runs. Its report is its final message.
1. Spawn Comment Sicko as a `delegate_task` child. Its brief is pstack's `agents/comment-sicko.md` (`../../agents/comment-sicko.md` from this skill) verbatim, plus the scope. Pick each subagent's effort for the job, per the Subagents section of the **poteto-mode** skill. Do not restate its rules. It edits comments in your checkout, so don't write while it runs. Its report is its final message.
2. Inspect its report and diff. Reject application-code edits, scope escapes, exception-protected deletions, misstated `MUST KILL` reasons, and flags that treat kept intentional code as guilty. Reshape flags on our-code surprises stay actionable. Do not restore those comments. A keep survives only with proof it is about something we cannot change. Audit missed scoped lint and TypeScript suppressions. Correctness or safety suppressions stay actionable `MUST KILL`s. Restore deletions only with exact exceptions and scoped proof. Before accepting thin `IMPORTANT` or `do not remove` kills or keeps, run `/how` or `/why` on their symbol. If a kill is ambiguous, do not restore. If a keep is refuted or still ambiguous, delete it. Revert and rerun one rejected report with the failure named. Reject a second, report it open, and fail `/no-comments`.
3. Fix trivial accepted flags directly by deleting a dead path, dropping a parameter, or using the real API. If any fix needs a shape, run `/architect` once for the accepted set and surrounding code. Stop at the sketch. Architect shapes. Step 4 implements.
4. Implement the smallest root-cause fix in scope. Remove every named workaround. If the root cause is out of scope, land the smallest in-scope fix and report the rest open. The **principle-fix-root-causes** and **principle-redesign-from-first-principles** skills guide intent only. Neither authorizes widening the fence nor fixing instances outside it. Never bolt on symptom guards.
Expand Down
Loading