diff --git a/apps/server/src/pstack/PstackPack.test.ts b/apps/server/src/pstack/PstackPack.test.ts index e9bc1de5deca0..19045124d9ee3 100644 --- a/apps/server/src/pstack/PstackPack.test.ts +++ b/apps/server/src/pstack/PstackPack.test.ts @@ -279,7 +279,10 @@ it.layer(NodeServices.layer)("PstackPack", (it) => { records: [], }; const expansion = (yield* pack.expandComposer(input, { createdBy: "user" })).text; - assert.include(expansion!, "- architect runners: [1] inherit [2] inherit"); + assert.include( + expansion!, + "- architect runners (panel, one child per seat): [1] inherit [2] inherit", + ); assert.include(expansion!, "Fallback: architect runners seat 1"); assert.equal( (yield* pack.expandComposer( @@ -378,7 +381,7 @@ it.layer(NodeServices.layer)("PstackPack", (it) => { }).pipe(Effect.provide(fixture.layer)); assert.include( expansion.text, - '- architect runners: [1] {"providerInstanceId":"claudeAgent_ready"', + '- architect runners (panel, one child per seat): [1] {"providerInstanceId":"claudeAgent_ready"', ); assert.notInclude(expansion.text, "Fallback: architect runners seat 1"); }), diff --git a/apps/server/src/pstack/pstackModels.test.ts b/apps/server/src/pstack/pstackModels.test.ts index bd571b048e32b..714c2b32b1ead 100644 --- a/apps/server/src/pstack/pstackModels.test.ts +++ b/apps/server/src/pstack/pstackModels.test.ts @@ -120,20 +120,57 @@ it.effect("leaves speed to the provider unless the models file sets it", () => }), ); -it.effect("disabled providers fall back visibly without shrinking panels", () => +it.effect.each([ + { label: "arena runners", panel: true }, + { label: "architect runners", panel: true }, + { label: "interrogate reviewers", panel: true }, + { label: "feature, refactoring", panel: false }, + { label: "arena cross-judge pool", panel: false }, + { label: "swarm workers", panel: false }, +])("unavailable seats preserve panels but do not pollute pools: $label", ({ label, panel }) => Effect.sync(() => { + const roleFile = parseModelsFile(file.replace("architect runners:", `${label}:`)); + const roleDefaults = [{ ...defaults[0]!, label }]; const result = resolveRoles({ ...availability, - file: parseModelsFile(file), - defaults, + file: roleFile, + defaults: roleDefaults, providers: providers.map((provider) => ({ ...provider, enabled: false })), capableInstanceIds, }); - assert.deepEqual(result.roles[0]!.seats, [{ kind: "inherit" }, { kind: "inherit" }]); - assert.equal( - result.diagnostics[0], - "Fallback: architect runners seat 1 claudeAgent/claude-opus-5-5 unavailable (Provider instance is disabled.); runs on the parent model.", + assert.deepEqual( + result.roles[0]!.seats, + panel ? [{ kind: "inherit" }, { kind: "inherit" }] : [{ kind: "inherit" }], + ); + assert.equal(result.diagnostics.length, 2); + assert.include( + result.diagnostics[0]!, + `Fallback: ${label} seat 1 claudeAgent/claude-opus-5-5 unavailable (Provider instance is disabled.)`, + ); + const partial = resolveRoles({ + ...availability, + file: roleFile, + defaults: roleDefaults, + providers: providers.map((provider, index) => ({ ...provider, enabled: index !== 0 })), + capableInstanceIds, + }); + assert.deepEqual( + partial.roles[0]!.seats.map((seat) => seat.kind), + panel ? ["inherit", "target"] : ["target"], + ); + assert.include(partial.diagnostics[0]!, `Fallback: ${label} seat 1`); + const aliases = resolveRoles({ + ...availability, + file: parseModelsFile(`${label}: auto, inherit-parent, missing/model`), + defaults: roleDefaults, + providers, + capableInstanceIds, + }); + assert.deepEqual( + aliases.roles[0]!.seats, + Array.from({ length: panel ? 3 : 2 }, () => ({ kind: "inherit" })), ); + assert.include(aliases.diagnostics[0]!, `Fallback: ${label} seat 3 missing/model`); }), ); it.effect("missing models file maps upstream family and effort, ignoring -fast", () => @@ -247,7 +284,11 @@ it.effect("formats the adapter block exactly and omits empty notes", () => packDir: "/pack", modelsPath: "/models.md", resolved: { - roles: [{ role: "architect runners", seats: [{ kind: "inherit" }] }], + roles: [ + { role: "architect runners", seats: [{ kind: "inherit" }] }, + { role: "interrogate reviewers", seats: [{ kind: "inherit" }, { kind: "inherit" }] }, + { role: "feature, refactoring", seats: [{ kind: "inherit" }, { kind: "inherit" }] }, + ], diagnostics: [], }, }), @@ -260,6 +301,8 @@ it.effect("formats the adapter block exactly and omits empty notes", () => "Read /skills/arena/SKILL.md and follow it.", "Resolved roles (exact delegate_task targets; they override any model a skill or names):", "- architect runners: [1] inherit", + "- interrogate reviewers (panel, one child per seat): [1] inherit [2] inherit", + "- feature, refactoring (pool, pick one per spawn): [1] inherit [2] inherit", "", ].join("\n"), ); diff --git a/apps/server/src/pstack/pstackModels.ts b/apps/server/src/pstack/pstackModels.ts index 7449691080b1a..843e53f09b935 100644 --- a/apps/server/src/pstack/pstackModels.ts +++ b/apps/server/src/pstack/pstackModels.ts @@ -4,7 +4,7 @@ import { type ServerProvider, } from "@t3tools/contracts"; import { getProviderOptionCurrentValue } from "@t3tools/shared/model"; -import { type PstackRoleDefault } from "@t3tools/pstack"; +import { PSTACK_PANEL_ROLES, type PstackRoleDefault } from "@t3tools/pstack"; import { delegationProviderConstraints, invalidOptionSelections, @@ -161,7 +161,8 @@ export function resolveRoles( role.defaultValue .split(",") .map((slug) => defaultSeat(slug.trim(), input.providers, constraintsFor)); - const seats = entries.map((seat, index): Seat => { + const panel = PSTACK_PANEL_ROLES.has(role.label); + const seats = entries.map((seat, index): Seat | undefined => { if (seat.kind === "inherit") return seat; const entry = seat.entry; const provider = input.providers.find( @@ -193,16 +194,20 @@ export function resolveRoles( reason ??= invalidOptionSelections(options, descriptors).join(" ") || undefined; if (reason !== undefined) { diagnostics.push( - `Fallback: ${role.label} seat ${index + 1} ${entry.providerInstanceId}/${entry.model} unavailable (${reason}); runs on the parent model.`, + `Fallback: ${role.label} seat ${index + 1} ${entry.providerInstanceId}/${entry.model} unavailable (${reason}); ${panel ? "runs on the parent model." : "excluded from pool; uses the parent model if no seats remain."}`, ); - return { kind: "inherit" }; + return panel ? { kind: "inherit" } : undefined; } return { kind: "target", target: { providerInstanceId: entry.providerInstanceId, model: entry.model, options }, }; }); - return { role: role.label, seats }; + const available = seats.filter((seat) => seat !== undefined); + return { + role: role.label, + seats: available.length > 0 ? available : [{ kind: "inherit" } as const], + }; }); return { roles, diagnostics }; } @@ -220,10 +225,15 @@ export function formatPstackBlock(input: { `: ${input.modelsPath}`, ...input.skillNames.map((name) => `Read /skills/${name}/SKILL.md and follow it.`), "Resolved roles (exact delegate_task targets; they override any model a skill or names):", - ...input.resolved.roles.map( - ({ role, seats }) => - `- ${role}: ${seats.map((seat, index) => `[${index + 1}] ${seat.kind === "inherit" ? "inherit" : JSON.stringify(seat.target)}`).join(" ")}`, - ), + ...input.resolved.roles.map(({ role, seats }) => { + const rule = + seats.length > 1 + ? PSTACK_PANEL_ROLES.has(role) + ? " (panel, one child per seat)" + : " (pool, pick one per spawn)" + : ""; + return `- ${role}${rule}: ${seats.map((seat, index) => `[${index + 1}] ${seat.kind === "inherit" ? "inherit" : JSON.stringify(seat.target)}`).join(" ")}`; + }), ...(input.resolved.diagnostics.length === 0 ? [] : ["Notes:", ...input.resolved.diagnostics.map((note) => `- ${note}`)]), diff --git a/docs/user/pstack.md b/docs/user/pstack.md index fb083f74aeccf..942fd8fd1b565 100644 --- a/docs/user/pstack.md +++ b/docs/user/pstack.md @@ -16,10 +16,13 @@ and keeps your model choices. ## Choose models once Run `$pstack:setup-pstack` in any thread. It reads the providers and models this environment offers, -asks for a reasoning budget, shows every pstack role with its model, and saves your choices for every +asks for a reasoning budget, shows every pstack role with its models, and saves your choices for every provider's threads on this machine. Run it again to change them, or after you enable or add a provider. Until you run it, pstack uses its own defaults where this environment offers those models. +List several models on a role to give pstack a pool that picks one per spawn. Arena runners, +architect runners, and interrogate reviewers are panels that run every model listed. + ## Run a workflow Type `$` or `/` in the composer and pick a `pstack:` skill, for example `$pstack:architect design the @@ -27,9 +30,9 @@ cache layer`. Start rigorous work with `$pstack:poteto-mode`; it picks the other Helper agents appear under the thread as tasks you can open, follow, or stop. Use `$pstack:automate-maintainer` or `$pstack:automate-team` to capture a maintainer’s or team’s engineering conventions. -When a role's provider is turned off or no longer offers the model, that helper runs on your thread's -own model instead, and the reply says `Fallback: …`. Turn the provider back on, or run -`$pstack:setup-pstack` to choose another model. +When a model becomes unavailable, pools use their remaining choices; if none remain, they use your +thread’s model. Panels keep every seat, using your thread’s model for unavailable entries. The reply +explains each unavailable choice with `Fallback: …`; run `$pstack:setup-pstack` to change it. ## Good to know diff --git a/packages/pstack/UPSTREAM.json b/packages/pstack/UPSTREAM.json index 82f899b9bb6f6..4d851392e63a1 100644 --- a/packages/pstack/UPSTREAM.json +++ b/packages/pstack/UPSTREAM.json @@ -1,8 +1,8 @@ { "repository": "https://github.com/ScriptedAlchemy/pstack-t3code", - "commit": "72ce8cda5f4c2b9ed413d3360378af861187291b", - "subtreeHash": "60b40eb3e77fb0832479226e65df66504fead7cb", - "version": "0.15.32-t3code.1", + "commit": "3fb34e1854572c88259bd4092be1894713ee7994", + "subtreeHash": "fd4fec719979e22e33188f8dd92a9a9d0d3a606d", + "version": "0.15.32-t3code.2", "files": { ".gitignore": { "sha256": "8ffe9de56bd30c1a95cd945262d6e3ac355ada4111551dde41f67851b9f1fc55", @@ -149,11 +149,11 @@ "executable": false }, "plugin.json": { - "sha256": "60ba9a8f82249c2a55a07503205096ad343935b593be1389aed038a7144c302d", + "sha256": "cd62e4e678d68b28cc47c2351e9b44ee1930378a7374900ad431bc70677f9263", "executable": false }, "skills/architect/SKILL.md": { - "sha256": "0124cef5ab18becdf9b74ae38b67f09f90f7e93dee4da5858dce62125a9d3aea", + "sha256": "af607fce2619de80661d71d63118f73d3aee2ebb80ae6100cfb6fb19afd70c26", "executable": false }, "skills/architect/references/design-red-flags.md": { @@ -169,11 +169,11 @@ "executable": false }, "skills/arena/SKILL.md": { - "sha256": "258a4178aa78bfb0c184cb6c4de50193403e61d20db681ba8da04645bddc5afb", + "sha256": "3ef9ed8b9bfb7e46666d807dee9ab7bdb863a43cb8ebec0523dcee7ec71df17a", "executable": false }, "skills/automate-maintainer/SKILL.md": { - "sha256": "e53ad00ede4e98c000e7708efbb9e5b17c86ec01b6b6e0b364c0be56267bbdfc", + "sha256": "95c17880de2b4521d57df49c60274148f9c90710974b5be37e73674611f12feb", "executable": false }, "skills/automate-maintainer/references/evaluation.md": { @@ -193,11 +193,11 @@ "executable": false }, "skills/automate-me/SKILL.md": { - "sha256": "9d51497128df81670b1c6a42cfa56c306816cdb06455322f17e01d62808aad1f", + "sha256": "d45c2dfaccdfface448151d2d196b0167d19b7981fdfa7a167964942d0e0f92e", "executable": false }, "skills/automate-team/SKILL.md": { - "sha256": "9a4f4cb1ea45377e5ca29f4e289b67cc9df42d1e60403c4ac151fb861974c6c7", + "sha256": "1c4f25014af5adec96a1c5d68c5d872988248daceb7b9a15df6a5d39f98b7a75", "executable": false }, "skills/automate-team/references/roster-discovery.md": { @@ -241,11 +241,11 @@ "executable": false }, "skills/figure-it-out/SKILL.md": { - "sha256": "576c3f1003faa50497048e2aaad0fb1d8f6adbc598d2b070dfffa872d036d44a", + "sha256": "04ff6765a9f29dd9f9c74050fe6c91cfde03bc554d1174f2e645c32b97c9f0bd", "executable": false }, "skills/how/SKILL.md": { - "sha256": "5efd68277f2243e4785111ccec13778a478eb5df393ced6e13a170100b02c074", + "sha256": "7bcb12d931074187e3fe175aa119270290771931f9384aac05cde758c97f5596", "executable": false }, "skills/how/references/explainer-prompt.md": { @@ -261,7 +261,7 @@ "executable": false }, "skills/interrogate/SKILL.md": { - "sha256": "e8c8c69c83e80b3eb81d01eea87219d878104dab581882ed47c1757369b11140", + "sha256": "ec27cbedd6e40a60cf17307d5e190bddb1a5556a1c6647494f89c2677b3daa77", "executable": false }, "skills/interrogate/references/code-quality-review.md": { @@ -293,7 +293,7 @@ "executable": false }, "skills/maintain-verification-skill/SKILL.md": { - "sha256": "c55cbc459140ad396b2dd91c95959c7dc597fa1ce55a439772178e8a709401a6", + "sha256": "0ac81df9688c0578a6487d7c06a6fba90fe59f23dd274ab38f5771968cbee72b", "executable": false }, "skills/make-bot-ui/SKILL.md": { @@ -301,7 +301,7 @@ "executable": false }, "skills/no-comments/SKILL.md": { - "sha256": "9f338b9ab171a5454b1e5feb5652b0d0d2ad8478d50a641ad1ef7d8b41943b68", + "sha256": "d7d633c6c1dca4b4ebde68b92e4a2c1cb675c1ae1c6092af5dc40268e7cc9053", "executable": false }, "skills/poteto-help/SKILL.md": { @@ -317,7 +317,7 @@ "executable": false }, "skills/poteto-mode/SKILL.md": { - "sha256": "d74763f526c1699b31f6907f42f5bf590d5a739b0ee259a722519a8316ada8ca", + "sha256": "9668120a717d135e8ce746bb4bd7276388864479a533d62ee0f5a2db12412086", "executable": false }, "skills/poteto-mode/playbooks/authoring-a-skill.md": { @@ -597,11 +597,11 @@ "executable": false }, "skills/recall/SKILL.md": { - "sha256": "8200f570f22d29376b233dc94b22be1364ef95211617e422ab0b16827747881a", + "sha256": "2eb3a991d0cdeddb03ce805b1b37006a7c4f140429842ee58be72f94760eb4b6", "executable": false }, "skills/reflect/SKILL.md": { - "sha256": "e3805f198ef878165bc6188efe42b840e4991395ad126bd2afd1b9da8598d2da", + "sha256": "145ce88ba06ff69a5dd007b7e26111406d2749f4f29a1c6d1b19e33736673217", "executable": false }, "skills/reflect/references/divergent-reviewer.md": { @@ -621,7 +621,7 @@ "executable": false }, "skills/setup-pstack/SKILL.md": { - "sha256": "560a8459df37a2bdb6761c833ee6319dba661743007fefcd53f4e6a3c8e535f3", + "sha256": "de963997e508ac129b03927ab21f11f3690e9e205c1bf1bdf29a5eed290f8c1e", "executable": false }, "skills/sharpen/SKILL.md": { @@ -629,7 +629,7 @@ "executable": false }, "skills/show-me-your-work/SKILL.md": { - "sha256": "b8feeed9e7548933bcf4986422e087dc2095b2bb88967603ef2f86f6a4e52f2f", + "sha256": "dde5838d662842d2d66e38942b2e8d8c693cb0412aca63ebfaa73161f5370a50", "executable": false }, "skills/show-me-your-work/references/decision-log-template.tsv": { @@ -749,7 +749,7 @@ "executable": false }, "skills/swarm/SKILL.md": { - "sha256": "eedffdbb04a5d75f6be28266e1f6ff2edbe868f23dc7fc968b817726597865cc", + "sha256": "7d7f9728009f5ccb51dff7584fbf46f5fdcc0c1650f9de4cc420ab3ab6a03e65", "executable": false }, "skills/tdd/SKILL.md": { @@ -777,7 +777,7 @@ "executable": false }, "skills/why/SKILL.md": { - "sha256": "693a375ae6f415da10b88d27cb4c3ca8db39a8ec1860f91a80e78f4550caef3f", + "sha256": "4bfc3b9efebbd4fcd80d8476c9b3317858ec691f5ca47ea7d7e87dc7841df71f", "executable": false }, "skills/why/references/epistemics.md": { diff --git a/packages/pstack/src/index.ts b/packages/pstack/src/index.ts index 5f65a5f25f123..2fa542c84258c 100644 --- a/packages/pstack/src/index.ts +++ b/packages/pstack/src/index.ts @@ -3,7 +3,7 @@ import * as NodeCrypto from "node:crypto"; import * as NodePath from "node:path"; import { readManifest } from "./files.ts"; -export { parsePstackRoleDefaults, type PstackRoleDefault } from "./roles.ts"; +export { parsePstackRoleDefaults, PSTACK_PANEL_ROLES, type PstackRoleDefault } from "./roles.ts"; export const PSTACK_SKILL_PREFIX = "pstack:"; export const PSTACK_LAYOUT_VERSION = 3; diff --git a/packages/pstack/src/roles.ts b/packages/pstack/src/roles.ts index 00bd7b8d04693..1bc823cf79384 100644 --- a/packages/pstack/src/roles.ts +++ b/packages/pstack/src/roles.ts @@ -1,3 +1,9 @@ +export const PSTACK_PANEL_ROLES: ReadonlySet = new Set([ + "arena runners", + "architect runners", + "interrogate reviewers", +]); + export interface PstackRoleDefault { readonly label: string; readonly defaultValue: string; diff --git a/packages/pstack/upstream/plugin.json b/packages/pstack/upstream/plugin.json index dcadef1b3db4a..fc801c354a58a 100644 --- a/packages/pstack/upstream/plugin.json +++ b/packages/pstack/upstream/plugin.json @@ -1,7 +1,7 @@ { "$schema": "https://agent-plugins.org/schemas/1.0.0/plugin.schema.json", "name": "pstack", - "version": "0.15.32-t3code.1", + "version": "0.15.32-t3code.2", "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. T3 Code-native port with automate-maintainer and automate-team.", "author": { "name": "Lauren Tan" diff --git a/packages/pstack/upstream/skills/architect/SKILL.md b/packages/pstack/upstream/skills/architect/SKILL.md index ac458ed8d8b7f..112a888d714d7 100644 --- a/packages/pstack/upstream/skills/architect/SKILL.md +++ b/packages/pstack/upstream/skills/architect/SKILL.md @@ -6,7 +6,7 @@ disable-model-invocation: true # Architect -Use `delegate_task` for every spawn. Copy the named role's exact resolved target from `` into `target`, including the complete `options` array. An `inherit` seat omits `target`. Repeat fallback notes and compare the spawn's provider, model, and options with the request. Report a rejected or mismatched target; never substitute one. If a required role is missing, stop that spawn. Call `orchestrator_capabilities` once before the first delegation. Start each brief with the absolute `` and `` paths; include the relevant resolved role lines when children will delegate. Retain every `taskId`. With `mode: "async"`, spawn the wave and end the turn; completion wakes the parent. Do not poll children. Use `mode: "wait"` only when this turn needs the result; a wait timeout does not cancel the child. Cancel replaced or unneeded work with `task_cancel`. +Use `delegate_task` for every spawn. Arena runners, architect runners, and interrogate reviewers are panels: one child per seat, including fallbacks. Every other role is a pool: pick the seat whose model best fits the job; spread same-role children in a wave across seats. Arena cross-judges prefer a different model family. Copy the chosen target from `` exactly, including all options; `inherit` means the parent model and omits `target`. If a pool spawn is rejected, report it and try the next seat; never invent targets or change options. Repeat fallback notes and report provider, model, or option mismatches. If a required role is missing, stop that spawn. Call `orchestrator_capabilities` once before the first delegation. Start each brief with the absolute `` and `` paths; include the relevant resolved role lines when children will delegate. Retain every `taskId`. With `mode: "async"`, spawn the wave and end the turn; completion wakes the parent. Do not poll children. Use `mode: "wait"` only when this turn needs the result; a wait timeout does not cancel the child. Cancel replaced or unneeded work with `task_cancel`. Sketch types, function signatures, class shapes, and module boundaries with `not implemented` bodies and pseudocode. Synthesize across multiple model perspectives, then fill in code against the chosen sketch. diff --git a/packages/pstack/upstream/skills/arena/SKILL.md b/packages/pstack/upstream/skills/arena/SKILL.md index 6996a15741d15..aa3e3d98ae487 100644 --- a/packages/pstack/upstream/skills/arena/SKILL.md +++ b/packages/pstack/upstream/skills/arena/SKILL.md @@ -6,7 +6,7 @@ disable-model-invocation: true # Arena -Use `delegate_task` for every spawn. Copy the named role's exact resolved target from `` into `target`, including the complete `options` array. An `inherit` seat omits `target`. Repeat fallback notes and compare the spawn's provider, model, and options with the request. Report a rejected or mismatched target; never substitute one. If a required role is missing, stop that spawn. Call `orchestrator_capabilities` once before the first delegation. Start each brief with the absolute `` and `` paths; include the relevant resolved role lines when children will delegate. Retain every `taskId`. With `mode: "async"`, spawn the wave and end the turn; completion wakes the parent. Do not poll children. Use `mode: "wait"` only when this turn needs the result; a wait timeout does not cancel the child. Cancel replaced or unneeded work with `task_cancel`. +Use `delegate_task` for every spawn. Arena runners, architect runners, and interrogate reviewers are panels: one child per seat, including fallbacks. Every other role is a pool: pick the seat whose model best fits the job; spread same-role children in a wave across seats. Arena cross-judges prefer a different model family. Copy the chosen target from `` exactly, including all options; `inherit` means the parent model and omits `target`. If a pool spawn is rejected, report it and try the next seat; never invent targets or change options. Repeat fallback notes and report provider, model, or option mismatches. If a required role is missing, stop that spawn. Call `orchestrator_capabilities` once before the first delegation. Start each brief with the absolute `` and `` paths; include the relevant resolved role lines when children will delegate. Retain every `taskId`. With `mode: "async"`, spawn the wave and end the turn; completion wakes the parent. Do not poll children. Use `mode: "wait"` only when this turn needs the result; a wait timeout does not cancel the child. Cancel replaced or unneeded work with `task_cancel`. Open a plan using the harness plan tool, or a list in the reply with one entry per phase (Frame, Fan out, Cross-judge, Pick, Graft, Verify) before launching anything. diff --git a/packages/pstack/upstream/skills/automate-maintainer/SKILL.md b/packages/pstack/upstream/skills/automate-maintainer/SKILL.md index ecdca14e45d3f..2d5ed793052c8 100644 --- a/packages/pstack/upstream/skills/automate-maintainer/SKILL.md +++ b/packages/pstack/upstream/skills/automate-maintainer/SKILL.md @@ -6,7 +6,7 @@ disable-model-invocation: true # Automate maintainer -Use `delegate_task` for every spawn. Copy the named role's exact resolved target from `` into `target`, including the complete `options` array. An `inherit` seat omits `target`. Repeat fallback notes and compare the spawn's provider, model, and options with the request. Report a rejected or mismatched target; never substitute one. If a required role is missing, stop that spawn. Call `orchestrator_capabilities` once before the first delegation. Start each brief with the absolute `` and `` paths; include the relevant resolved role lines when children will delegate. Retain every `taskId`. With `mode: "async"`, spawn the wave and end the turn; completion wakes the parent. Do not poll children. Use `mode: "wait"` only when this turn needs the result; a wait timeout does not cancel the child. Cancel replaced or unneeded work with `task_cancel`. +Use `delegate_task` for every spawn. Arena runners, architect runners, and interrogate reviewers are panels: one child per seat, including fallbacks. Every other role is a pool: pick the seat whose model best fits the job; spread same-role children in a wave across seats. Arena cross-judges prefer a different model family. Copy the chosen target from `` exactly, including all options; `inherit` means the parent model and omits `target`. If a pool spawn is rejected, report it and try the next seat; never invent targets or change options. Repeat fallback notes and report provider, model, or option mismatches. If a required role is missing, stop that spawn. Call `orchestrator_capabilities` once before the first delegation. Start each brief with the absolute `` and `` paths; include the relevant resolved role lines when children will delegate. Retain every `taskId`. With `mode: "async"`, spawn the wave and end the turn; completion wakes the parent. Do not poll children. Use `mode: "wait"` only when this turn needs the result; a wait timeout does not cancel the child. Cancel replaced or unneeded work with `task_cancel`. Turn named GitHub maintainers' engineering activity into mode skills. Collect each person's evidence separately, then synthesize shared conventions, ownership, and disagreements. Use [automate-me](../automate-me/SKILL.md) for the user's conversation history and [automate-team](../automate-team/SKILL.md) when the roster needs discovery. diff --git a/packages/pstack/upstream/skills/automate-me/SKILL.md b/packages/pstack/upstream/skills/automate-me/SKILL.md index c0abc435ed2a3..62edaf8ea49e5 100644 --- a/packages/pstack/upstream/skills/automate-me/SKILL.md +++ b/packages/pstack/upstream/skills/automate-me/SKILL.md @@ -6,7 +6,7 @@ disable-model-invocation: true # Automate me -Use `delegate_task` for every spawn. Copy the named role's exact resolved target from `` into `target`, including the complete `options` array. An `inherit` seat omits `target`. Repeat fallback notes and compare the spawn's provider, model, and options with the request. Report a rejected or mismatched target; never substitute one. If a required role is missing, stop that spawn. Call `orchestrator_capabilities` once before the first delegation. Start each brief with the absolute `` and `` paths; include the relevant resolved role lines when children will delegate. Retain every `taskId`. With `mode: "async"`, spawn the wave and end the turn; completion wakes the parent. Do not poll children. Use `mode: "wait"` only when this turn needs the result; a wait timeout does not cancel the child. Cancel replaced or unneeded work with `task_cancel`. +Use `delegate_task` for every spawn. Arena runners, architect runners, and interrogate reviewers are panels: one child per seat, including fallbacks. Every other role is a pool: pick the seat whose model best fits the job; spread same-role children in a wave across seats. Arena cross-judges prefer a different model family. Copy the chosen target from `` exactly, including all options; `inherit` means the parent model and omits `target`. If a pool spawn is rejected, report it and try the next seat; never invent targets or change options. Repeat fallback notes and report provider, model, or option mismatches. If a required role is missing, stop that spawn. Call `orchestrator_capabilities` once before the first delegation. Start each brief with the absolute `` and `` paths; include the relevant resolved role lines when children will delegate. Retain every `taskId`. With `mode: "async"`, spawn the wave and end the turn; completion wakes the parent. Do not poll children. Use `mode: "wait"` only when this turn needs the result; a wait timeout does not cancel the child. Cancel replaced or unneeded work with `task_cancel`. A guided flow for turning the user's working conventions into a skill agents will follow. The output is one `-mode` skill tailored to them (e.g. `jay-mode`, `priya-mode`). diff --git a/packages/pstack/upstream/skills/automate-team/SKILL.md b/packages/pstack/upstream/skills/automate-team/SKILL.md index c2c239e5edfdf..77eec539d92f2 100644 --- a/packages/pstack/upstream/skills/automate-team/SKILL.md +++ b/packages/pstack/upstream/skills/automate-team/SKILL.md @@ -6,7 +6,7 @@ disable-model-invocation: true # Automate team -Use `delegate_task` for every spawn. Copy the named role's exact resolved target from `` into `target`, including the complete `options` array. An `inherit` seat omits `target`. Repeat fallback notes and compare the spawn's provider, model, and options with the request. Report a rejected or mismatched target; never substitute one. If a required role is missing, stop that spawn. Call `orchestrator_capabilities` once before the first delegation. Start each brief with the absolute `` and `` paths; include the relevant resolved role lines when children will delegate. Retain every `taskId`. With `mode: "async"`, spawn the wave and end the turn; completion wakes the parent. Do not poll children. Use `mode: "wait"` only when this turn needs the result; a wait timeout does not cancel the child. Cancel replaced or unneeded work with `task_cancel`. +Use `delegate_task` for every spawn. Arena runners, architect runners, and interrogate reviewers are panels: one child per seat, including fallbacks. Every other role is a pool: pick the seat whose model best fits the job; spread same-role children in a wave across seats. Arena cross-judges prefer a different model family. Copy the chosen target from `` exactly, including all options; `inherit` means the parent model and omits `target`. If a pool spawn is rejected, report it and try the next seat; never invent targets or change options. Repeat fallback notes and report provider, model, or option mismatches. If a required role is missing, stop that spawn. Call `orchestrator_capabilities` once before the first delegation. Start each brief with the absolute `` and `` paths; include the relevant resolved role lines when children will delegate. Retain every `taskId`. With `mode: "async"`, spawn the wave and end the turn; completion wakes the parent. Do not poll children. Use `mode: "wait"` only when this turn needs the result; a wait timeout does not cancel the child. Cancel replaced or unneeded work with `task_cancel`. Discover a repository's active core contributors and build a mode from their observed engineering conventions. Use [automate-maintainer](../automate-maintainer/SKILL.md) for mining, attribution, group synthesis, authoring, and evaluation; read it before collecting training evidence. diff --git a/packages/pstack/upstream/skills/figure-it-out/SKILL.md b/packages/pstack/upstream/skills/figure-it-out/SKILL.md index c6b3c8514dddb..d6f1dec017c4d 100644 --- a/packages/pstack/upstream/skills/figure-it-out/SKILL.md +++ b/packages/pstack/upstream/skills/figure-it-out/SKILL.md @@ -6,7 +6,7 @@ disable-model-invocation: true # Figure it out -Use `delegate_task` for every spawn. Copy the named role's exact resolved target from `` into `target`, including the complete `options` array. An `inherit` seat omits `target`. Repeat fallback notes and compare the spawn's provider, model, and options with the request. Report a rejected or mismatched target; never substitute one. If a required role is missing, stop that spawn. Call `orchestrator_capabilities` once before the first delegation. Start each brief with the absolute `` and `` paths; include the relevant resolved role lines when children will delegate. Retain every `taskId`. With `mode: "async"`, spawn the wave and end the turn; completion wakes the parent. Do not poll children. Use `mode: "wait"` only when this turn needs the result; a wait timeout does not cancel the child. Cancel replaced or unneeded work with `task_cancel`. +Use `delegate_task` for every spawn. Arena runners, architect runners, and interrogate reviewers are panels: one child per seat, including fallbacks. Every other role is a pool: pick the seat whose model best fits the job; spread same-role children in a wave across seats. Arena cross-judges prefer a different model family. Copy the chosen target from `` exactly, including all options; `inherit` means the parent model and omits `target`. If a pool spawn is rejected, report it and try the next seat; never invent targets or change options. Repeat fallback notes and report provider, model, or option mismatches. If a required role is missing, stop that spawn. Call `orchestrator_capabilities` once before the first delegation. Start each brief with the absolute `` and `` paths; include the relevant resolved role lines when children will delegate. Retain every `taskId`. With `mode: "async"`, spawn the wave and end the turn; completion wakes the parent. Do not poll children. Use `mode: "wait"` only when this turn needs the result; a wait timeout does not cancel the child. Cancel replaced or unneeded work with `task_cancel`. When the task matches no playbook, design one. The deliverable before any code is the workflow itself: a sequence of phases that scales rigor to the task, runs the scientific method, and leaves a decision trail a human can audit after stepping away. diff --git a/packages/pstack/upstream/skills/how/SKILL.md b/packages/pstack/upstream/skills/how/SKILL.md index fa21ee8639a9f..e7f7e4a64a9e6 100644 --- a/packages/pstack/upstream/skills/how/SKILL.md +++ b/packages/pstack/upstream/skills/how/SKILL.md @@ -6,7 +6,7 @@ disable-model-invocation: true # How -Use `delegate_task` for every spawn. Copy the named role's exact resolved target from `` into `target`, including the complete `options` array. An `inherit` seat omits `target`. Repeat fallback notes and compare the spawn's provider, model, and options with the request. Report a rejected or mismatched target; never substitute one. If a required role is missing, stop that spawn. Call `orchestrator_capabilities` once before the first delegation. Start each brief with the absolute `` and `` paths; include the relevant resolved role lines when children will delegate. Retain every `taskId`. With `mode: "async"`, spawn the wave and end the turn; completion wakes the parent. Do not poll children. Use `mode: "wait"` only when this turn needs the result; a wait timeout does not cancel the child. Cancel replaced or unneeded work with `task_cancel`. +Use `delegate_task` for every spawn. Arena runners, architect runners, and interrogate reviewers are panels: one child per seat, including fallbacks. Every other role is a pool: pick the seat whose model best fits the job; spread same-role children in a wave across seats. Arena cross-judges prefer a different model family. Copy the chosen target from `` exactly, including all options; `inherit` means the parent model and omits `target`. If a pool spawn is rejected, report it and try the next seat; never invent targets or change options. Repeat fallback notes and report provider, model, or option mismatches. If a required role is missing, stop that spawn. Call `orchestrator_capabilities` once before the first delegation. Start each brief with the absolute `` and `` paths; include the relevant resolved role lines when children will delegate. Retain every `taskId`. With `mode: "async"`, spawn the wave and end the turn; completion wakes the parent. Do not poll children. Use `mode: "wait"` only when this turn needs the result; a wait timeout does not cancel the child. Cancel replaced or unneeded work with `task_cancel`. 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. diff --git a/packages/pstack/upstream/skills/interrogate/SKILL.md b/packages/pstack/upstream/skills/interrogate/SKILL.md index c0de4a237897e..cee4489e66a11 100644 --- a/packages/pstack/upstream/skills/interrogate/SKILL.md +++ b/packages/pstack/upstream/skills/interrogate/SKILL.md @@ -6,7 +6,7 @@ disable-model-invocation: true # Interrogate -Use `delegate_task` for every spawn. Copy the named role's exact resolved target from `` into `target`, including the complete `options` array. An `inherit` seat omits `target`. Repeat fallback notes and compare the spawn's provider, model, and options with the request. Report a rejected or mismatched target; never substitute one. If a required role is missing, stop that spawn. Call `orchestrator_capabilities` once before the first delegation. Start each brief with the absolute `` and `` paths; include the relevant resolved role lines when children will delegate. Retain every `taskId`. With `mode: "async"`, spawn the wave and end the turn; completion wakes the parent. Do not poll children. Use `mode: "wait"` only when this turn needs the result; a wait timeout does not cancel the child. Cancel replaced or unneeded work with `task_cancel`. +Use `delegate_task` for every spawn. Arena runners, architect runners, and interrogate reviewers are panels: one child per seat, including fallbacks. Every other role is a pool: pick the seat whose model best fits the job; spread same-role children in a wave across seats. Arena cross-judges prefer a different model family. Copy the chosen target from `` exactly, including all options; `inherit` means the parent model and omits `target`. If a pool spawn is rejected, report it and try the next seat; never invent targets or change options. Repeat fallback notes and report provider, model, or option mismatches. If a required role is missing, stop that spawn. Call `orchestrator_capabilities` once before the first delegation. Start each brief with the absolute `` and `` paths; include the relevant resolved role lines when children will delegate. Retain every `taskId`. With `mode: "async"`, spawn the wave and end the turn; completion wakes the parent. Do not poll children. Use `mode: "wait"` only when this turn needs the result; a wait timeout does not cancel the child. Cancel replaced or unneeded work with `task_cancel`. Spawn one reviewer per configured model to adversarially review code changes. The adversarial signal comes from model diversity, not assigned personas. The deliverable is a synthesized verdict. Do NOT auto-apply changes. diff --git a/packages/pstack/upstream/skills/maintain-verification-skill/SKILL.md b/packages/pstack/upstream/skills/maintain-verification-skill/SKILL.md index 15295a4681e96..1f960e5ea26e2 100644 --- a/packages/pstack/upstream/skills/maintain-verification-skill/SKILL.md +++ b/packages/pstack/upstream/skills/maintain-verification-skill/SKILL.md @@ -6,7 +6,7 @@ disable-model-invocation: true # Maintain a verification skill -Use `delegate_task` for every spawn. Copy the named role's exact resolved target from `` into `target`, including the complete `options` array. An `inherit` seat omits `target`. Repeat fallback notes and compare the spawn's provider, model, and options with the request. Report a rejected or mismatched target; never substitute one. If a required role is missing, stop that spawn. Call `orchestrator_capabilities` once before the first delegation. Start each brief with the absolute `` and `` paths; include the relevant resolved role lines when children will delegate. Retain every `taskId`. With `mode: "async"`, spawn the wave and end the turn; completion wakes the parent. Do not poll children. Use `mode: "wait"` only when this turn needs the result; a wait timeout does not cancel the child. Cancel replaced or unneeded work with `task_cancel`. +Use `delegate_task` for every spawn. Arena runners, architect runners, and interrogate reviewers are panels: one child per seat, including fallbacks. Every other role is a pool: pick the seat whose model best fits the job; spread same-role children in a wave across seats. Arena cross-judges prefer a different model family. Copy the chosen target from `` exactly, including all options; `inherit` means the parent model and omits `target`. If a pool spawn is rejected, report it and try the next seat; never invent targets or change options. Repeat fallback notes and report provider, model, or option mismatches. If a required role is missing, stop that spawn. Call `orchestrator_capabilities` once before the first delegation. Start each brief with the absolute `` and `` paths; include the relevant resolved role lines when children will delegate. Retain every `taskId`. With `mode: "async"`, spawn the wave and end the turn; completion wakes the parent. Do not poll children. Use `mode: "wait"` only when this turn needs the result; a wait timeout does not cancel the child. Cancel replaced or unneeded work with `task_cancel`. A feature map rots the moment the app changes. This skill is the upkeep loop for a skill generated by `$pstack:create-verification-skill` (or any project-local verification skill with a feature map). The unit of rigor is the feature, not every sentence: cover every feature file from source and exercise every feature live, without terminalising every bullet. diff --git a/packages/pstack/upstream/skills/no-comments/SKILL.md b/packages/pstack/upstream/skills/no-comments/SKILL.md index f6cbba6fa8885..97f84ca40e1b6 100644 --- a/packages/pstack/upstream/skills/no-comments/SKILL.md +++ b/packages/pstack/upstream/skills/no-comments/SKILL.md @@ -6,7 +6,7 @@ disable-model-invocation: true # No comments -Use `delegate_task` for every spawn. Copy the named role's exact resolved target from `` into `target`, including the complete `options` array. An `inherit` seat omits `target`. Repeat fallback notes and compare the spawn's provider, model, and options with the request. Report a rejected or mismatched target; never substitute one. If a required role is missing, stop that spawn. Call `orchestrator_capabilities` once before the first delegation. Start each brief with the absolute `` and `` paths; include the relevant resolved role lines when children will delegate. Retain every `taskId`. With `mode: "async"`, spawn the wave and end the turn; completion wakes the parent. Do not poll children. Use `mode: "wait"` only when this turn needs the result; a wait timeout does not cancel the child. Cancel replaced or unneeded work with `task_cancel`. +Use `delegate_task` for every spawn. Arena runners, architect runners, and interrogate reviewers are panels: one child per seat, including fallbacks. Every other role is a pool: pick the seat whose model best fits the job; spread same-role children in a wave across seats. Arena cross-judges prefer a different model family. Copy the chosen target from `` exactly, including all options; `inherit` means the parent model and omits `target`. If a pool spawn is rejected, report it and try the next seat; never invent targets or change options. Repeat fallback notes and report provider, model, or option mismatches. If a required role is missing, stop that spawn. Call `orchestrator_capabilities` once before the first delegation. Start each brief with the absolute `` and `` paths; include the relevant resolved role lines when children will delegate. Retain every `taskId`. With `mode: "async"`, spawn the wave and end the turn; completion wakes the parent. Do not poll children. Use `mode: "wait"` only when this turn needs the result; a wait timeout does not cancel the child. Cancel replaced or unneeded work with `task_cancel`. Spawn Comment Sicko. Act on accepted findings. diff --git a/packages/pstack/upstream/skills/poteto-mode/SKILL.md b/packages/pstack/upstream/skills/poteto-mode/SKILL.md index d3693e173ffc8..f4bfcb70eca1a 100644 --- a/packages/pstack/upstream/skills/poteto-mode/SKILL.md +++ b/packages/pstack/upstream/skills/poteto-mode/SKILL.md @@ -92,7 +92,7 @@ Read the leaf skill in full for any principle you apply. Each entry names when i **Use the poteto-agent persona for code-writing delegates and ad-hoc helpers inside playbook steps.** Start the `delegate_task` brief with the absolute `` and `` paths, then "Act as the agent defined in /agents/poteto-agent.md; read it first and treat its body as your role. The poteto-mode skill is /skills/poteto-mode/SKILL.md." The parent runs the playbook. Routed workflows (`how`, `why`, `interrogate`, `reflect`, `swarm`) supply their own roles and briefs. -**Defaults for every `delegate_task` call.** Use `delegate_task` for every spawn. Copy the named role's exact resolved target from `` into `target`, including the complete `options` array. An `inherit` seat omits `target`. Repeat fallback notes and compare the spawn's provider, model, and options with the request. Report a rejected or mismatched target; never substitute one. If a required role is missing, stop that spawn. Call `orchestrator_capabilities` once before the first delegation. Start each brief with the absolute `` and `` paths; include the relevant resolved role lines when children will delegate. Retain every `taskId`. With `mode: "async"`, spawn the wave and end the turn; completion wakes the parent. Do not poll children. Use `mode: "wait"` only when this turn needs the result; a wait timeout does not cancel the child. Cancel replaced or unneeded work with `task_cancel`. Use the `feature, refactoring`, `bug-fix`, `perf-issue`, or `hillclimb` role for the matching code playbook. Hardest changes use `hardest tasks`; prose and judgment use `judgment and prose`; verification uses `swarm workers`. Research and review briefs say "Do not edit files, commit, or push" and the parent checks `git status` afterward. Set `role` to the closest of `implementation`, `research`, `review`, `design`, `test`, or `general`. +**Defaults for every `delegate_task` call.** Use `delegate_task` for every spawn. Arena runners, architect runners, and interrogate reviewers are panels: one child per seat, including fallbacks. Every other role is a pool: pick the seat whose model best fits the job; spread same-role children in a wave across seats. Arena cross-judges prefer a different model family. Copy the chosen target from `` exactly, including all options; `inherit` means the parent model and omits `target`. If a pool spawn is rejected, report it and try the next seat; never invent targets or change options. Repeat fallback notes and report provider, model, or option mismatches. If a required role is missing, stop that spawn. Call `orchestrator_capabilities` once before the first delegation. Start each brief with the absolute `` and `` paths; include the relevant resolved role lines when children will delegate. Retain every `taskId`. With `mode: "async"`, spawn the wave and end the turn; completion wakes the parent. Do not poll children. Use `mode: "wait"` only when this turn needs the result; a wait timeout does not cancel the child. Cancel replaced or unneeded work with `task_cancel`. Use the `feature, refactoring`, `bug-fix`, `perf-issue`, or `hillclimb` role for the matching code playbook. Hardest changes use `hardest tasks`; prose and judgment use `judgment and prose`; verification uses `swarm workers`. Research and review briefs say "Do not edit files, commit, or push" and the parent checks `git status` afterward. Set `role` to the closest of `implementation`, `research`, `review`, `design`, `test`, or `general`. **Honor the resolved role.** Targets in `` override every model named in a persona, harness rule, or models file. Do not adjust model, effort, or other options for a spawn. Change role choices through `$pstack:setup-pstack`; they take effect on the next pstack invocation. Panels retain every resolved seat, including inherited ones. diff --git a/packages/pstack/upstream/skills/recall/SKILL.md b/packages/pstack/upstream/skills/recall/SKILL.md index 1d4764cc15092..138b27763e386 100644 --- a/packages/pstack/upstream/skills/recall/SKILL.md +++ b/packages/pstack/upstream/skills/recall/SKILL.md @@ -6,7 +6,7 @@ disable-model-invocation: true # Recall -Use `delegate_task` for every spawn. Copy the named role's exact resolved target from `` into `target`, including the complete `options` array. An `inherit` seat omits `target`. Repeat fallback notes and compare the spawn's provider, model, and options with the request. Report a rejected or mismatched target; never substitute one. If a required role is missing, stop that spawn. Call `orchestrator_capabilities` once before the first delegation. Start each brief with the absolute `` and `` paths; include the relevant resolved role lines when children will delegate. Retain every `taskId`. With `mode: "async"`, spawn the wave and end the turn; completion wakes the parent. Do not poll children. Use `mode: "wait"` only when this turn needs the result; a wait timeout does not cancel the child. Cancel replaced or unneeded work with `task_cancel`. +Use `delegate_task` for every spawn. Arena runners, architect runners, and interrogate reviewers are panels: one child per seat, including fallbacks. Every other role is a pool: pick the seat whose model best fits the job; spread same-role children in a wave across seats. Arena cross-judges prefer a different model family. Copy the chosen target from `` exactly, including all options; `inherit` means the parent model and omits `target`. If a pool spawn is rejected, report it and try the next seat; never invent targets or change options. Repeat fallback notes and report provider, model, or option mismatches. If a required role is missing, stop that spawn. Call `orchestrator_capabilities` once before the first delegation. Start each brief with the absolute `` and `` paths; include the relevant resolved role lines when children will delegate. Retain every `taskId`. With `mode: "async"`, spawn the wave and end the turn; completion wakes the parent. Do not poll children. Use `mode: "wait"` only when this turn needs the result; a wait timeout does not cancel the child. Cancel replaced or unneeded work with `task_cancel`. **Before you start or resume work, you rebuild the user's recent working context and hand back a tight capsule of where things stand now and what to do next.** diff --git a/packages/pstack/upstream/skills/reflect/SKILL.md b/packages/pstack/upstream/skills/reflect/SKILL.md index f62296ab4c5d2..5ebbb23bc2fd1 100644 --- a/packages/pstack/upstream/skills/reflect/SKILL.md +++ b/packages/pstack/upstream/skills/reflect/SKILL.md @@ -6,7 +6,7 @@ disable-model-invocation: true # Reflect -Use `delegate_task` for every spawn. Copy the named role's exact resolved target from `` into `target`, including the complete `options` array. An `inherit` seat omits `target`. Repeat fallback notes and compare the spawn's provider, model, and options with the request. Report a rejected or mismatched target; never substitute one. If a required role is missing, stop that spawn. Call `orchestrator_capabilities` once before the first delegation. Start each brief with the absolute `` and `` paths; include the relevant resolved role lines when children will delegate. Retain every `taskId`. With `mode: "async"`, spawn the wave and end the turn; completion wakes the parent. Do not poll children. Use `mode: "wait"` only when this turn needs the result; a wait timeout does not cancel the child. Cancel replaced or unneeded work with `task_cancel`. +Use `delegate_task` for every spawn. Arena runners, architect runners, and interrogate reviewers are panels: one child per seat, including fallbacks. Every other role is a pool: pick the seat whose model best fits the job; spread same-role children in a wave across seats. Arena cross-judges prefer a different model family. Copy the chosen target from `` exactly, including all options; `inherit` means the parent model and omits `target`. If a pool spawn is rejected, report it and try the next seat; never invent targets or change options. Repeat fallback notes and report provider, model, or option mismatches. If a required role is missing, stop that spawn. Call `orchestrator_capabilities` once before the first delegation. Start each brief with the absolute `` and `` paths; include the relevant resolved role lines when children will delegate. Retain every `taskId`. With `mode: "async"`, spawn the wave and end the turn; completion wakes the parent. Do not poll children. Use `mode: "wait"` only when this turn needs the result; a wait timeout does not cancel the child. Cancel replaced or unneeded work with `task_cancel`. Mine the current conversation for durable learnings, then route them into skill edits. diff --git a/packages/pstack/upstream/skills/setup-pstack/SKILL.md b/packages/pstack/upstream/skills/setup-pstack/SKILL.md index b7a7a545db024..c43e2d15b57d4 100644 --- a/packages/pstack/upstream/skills/setup-pstack/SKILL.md +++ b/packages/pstack/upstream/skills/setup-pstack/SKILL.md @@ -26,11 +26,11 @@ Read ``. Preserve its `# budget:` line and current choices. Drop roles a **(b) Apply it.** Keep family, list, and alias choices on repeat runs. Match default `claude-*` models to enabled `claudeAgent` instances, `gpt-*` to `codex`, and `grok-*` to `grok`, offering the advertised model. If a family is unavailable, ask for a choice; propose another available family for mixed panels rather than inventing a model. Preserve all panel seats. -Find the advertised select option whose values contain at least two of `low`, `medium`, `high`, `xhigh`, `max`. Use its actual ID, including `thinking` or `variant` where advertised. Budgets target `max`, `xhigh`, `high`, or `medium` respectively. Set each real entry, including panel entries, to the requested value or the highest advertised ladder value below it. With none, mark the entry as needing a choice. Aliases, models without an effort option, and explicitly chosen off-ladder settings stay unchanged. Never select off-ladder settings under a budget. +Find the advertised select option whose values contain at least two of `low`, `medium`, `high`, `xhigh`, `max`. Use its actual ID, including `thinking` or `variant` where advertised. Budgets target `max`, `xhigh`, `high`, or `medium` respectively. Set every concrete entry, in pools and panels, to the requested value or the highest advertised ladder value below it. With none, mark the entry as needing a choice. Aliases, models without an effort option, and explicitly chosen off-ladder settings stay unchanged. Never select off-ladder settings under a budget. Do not choose a latency or priority option automatically. Write such an option only when the user explicitly selects it. A budget change preserves any explicitly selected non-effort options. -**(c) Show and confirm.** Show all 17 roles with provider instance, model, and chosen options, marking unavailable entries. Offer the detected models plus `inherit-parent` and `auto`, both of which run on the parent model. Ask whether to accept or change roles. Arena runners, architect runners, and interrogate reviewers run one child per seat, aliases included. Arena selects one seat from its cross-judge pool, preferring a different model family. `swarm workers` supplies the worker target unless a race has explicitly resolved arm targets. +**(c) Show and confirm.** Show all 17 roles with provider instance, model, and chosen options, marking unavailable entries. Let the user choose several models for any role from any detected provider instance, plus `inherit-parent` and `auto` for the parent model. Arena runners, architect runners, and interrogate reviewers are panels that run every seat; all other roles are pools that pick one seat per spawn and spread simultaneous children across seats. Arena cross-judges prefer a different model family. When two or more model families are available, offer a mixed pool for `feature, refactoring`, `bug-fix`, and `swarm workers`; keep the current choices unless accepted. Ask whether to accept or change roles. A swarm model race still needs explicitly resolved arm targets. ### 4. Validate @@ -60,7 +60,7 @@ architect runners: claude-opus-5-5-xhigh, grok-4.7-xhigh interrogate reviewers: claude-opus-5-5-xhigh, grok-4.7-xhigh ``` -Overwrite `` with no frontmatter: comment lines, `# budget: