From a921c2fac6b1bebeb7b4882d18d182502afc86d1 Mon Sep 17 00:00:00 2001 From: 3metaJun <251347867+3metaJun@users.noreply.github.com> Date: Fri, 18 Sep 2026 01:11:43 +0800 Subject: [PATCH 1/2] chore(upstream): adopt pstack operator-pronoun fixes Adopt the operator-neutral pronoun and in-chat status tick fixes from pstack f5bdd6826fd0a0d9cbc4347134c3a74a200b9d9d (cursor/plugins #362). Skip upstream's model-default and budget changes; mstack keeps portable role configuration and its own default example. The migration tests previously equated the working tree with released content, which broke on any unreleased skill edit. Legacy fixtures and digest-provenance assertions now read the latest released tag; the post-install shared-copy assertion reads the working tree because the installer stages from it. Verified: node scripts/skill-baseline.mjs --check, node scripts/check-upstream.mjs --source , npm test (206 tests, 205 pass, 0 fail; 1 skipped-by-count nuance: 206 total). --- profiles/skill-manifest.json | 18 +++++++++--------- profiles/upstream-manifest.json | 6 +++--- profiles/upstreams.json | 2 +- scripts/install-migration.test.mjs | 10 +++++++--- scripts/migration-integration.test.mjs | 12 +++++++++--- skills/meta-mode/SKILL.md | 2 +- skills/meta-mode/playbooks/autopilot-full.md | 6 +++--- skills/meta-mode/playbooks/autopilot-stack.md | 6 +++--- skills/meta-mode/playbooks/multi-phase-plan.md | 6 +++--- 9 files changed, 39 insertions(+), 29 deletions(-) diff --git a/profiles/skill-manifest.json b/profiles/skill-manifest.json index 00bc968..d798eac 100644 --- a/profiles/skill-manifest.json +++ b/profiles/skill-manifest.json @@ -1,7 +1,7 @@ { "version": 1, "sources": { - "pstack": "7366ac128bdf95f45e6734f412b49a4031800169", + "pstack": "f5bdd6826fd0a0d9cbc4347134c3a74a200b9d9d", "mattpocock/skills": "6654f6b60cd9d5be8b54c6fafe44346dabeb3b76" }, "files": { @@ -205,14 +205,14 @@ "skills/meta-mode/playbooks/autopilot-full.md": { "upstream": "pstack", "source": "skills/poteto-mode/playbooks/autopilot-full.md", - "sourceDigest": "52f69170bd7fa6b436992d90d3ef7fba893201e0b497297b416e9aea0e567d5f", - "targetDigest": "0a649471ca2e98d91e2a83c05437ff6c5e4137769df8e12352cc8651c9c27579" + "sourceDigest": "2042a89a0399b5fe700110bc03746899536c10f0df186e9fb15bbd4a2f6dfce5", + "targetDigest": "be9eeb3df8df26671d5e134b14b337d9b2fa311e096d1ee6c66c06c6c55c047b" }, "skills/meta-mode/playbooks/autopilot-stack.md": { "upstream": "pstack", "source": "skills/poteto-mode/playbooks/autopilot-stack.md", - "sourceDigest": "66364cd3a2286cbecfb73d3a7bf7d1fa387ede8525d37ef22b69d4ac03c2c5b2", - "targetDigest": "eb6f902e29a3546d50d95a6f5989654a5ecaa83c94a07a91495e812a923c803f" + "sourceDigest": "60e0d997f7b369004a02089c71b9091d3f8e9bc0b4a3c1142598380faa7722fd", + "targetDigest": "7a3dd0ab570560e1051e38fd16711914dacd476202be358e25c0f34c917a2b45" }, "skills/meta-mode/playbooks/babysit.md": { "upstream": "pstack", @@ -253,8 +253,8 @@ "skills/meta-mode/playbooks/multi-phase-plan.md": { "upstream": "pstack", "source": "skills/poteto-mode/playbooks/multi-phase-plan.md", - "sourceDigest": "63426a55519fbc4fb9f00baf5cc7b1148f70dfb62ad360a0f6533d287dd36edf", - "targetDigest": "62c9a4b1d6bd6e5ad718af0d4972432773afa5af10ae05b8b751f0fc117ac78f" + "sourceDigest": "b823e05b64bbef84ae5169717c5fab1d9ab5079625996271e3aa7abcdce7b8ad", + "targetDigest": "51f824fa3caae6bd0fd69852f66387ef2e203e6c15f8f8982cf20d0d22965bf1" }, "skills/meta-mode/playbooks/opening-a-pr.md": { "upstream": "pstack", @@ -342,8 +342,8 @@ "skills/meta-mode/SKILL.md": { "upstream": "pstack", "source": "skills/poteto-mode/SKILL.md", - "sourceDigest": "6bbf35cb2111c358461c7ba90f210dad4573f3a3ada92f6459eac0c69d83b01a", - "targetDigest": "798df0dae0ca4959b81d6465b1c3c392ffc5cefd98f5b0834a53262eb1b2fa86" + "sourceDigest": "b3c505602b82fb3641a3983e9c46fb974881faa12ece1af804fae27afb7be532", + "targetDigest": "4efa5f64e1f6bd01fd08eb6fb720ab4c84c7f3d787fff9df71d0e07ab65b73fe" }, "skills/no-comments/SKILL.md": { "upstream": "pstack", diff --git a/profiles/upstream-manifest.json b/profiles/upstream-manifest.json index aeffd94..f85b333 100644 --- a/profiles/upstream-manifest.json +++ b/profiles/upstream-manifest.json @@ -1,6 +1,6 @@ { "source": "https://github.com/cursor/plugins/tree/main/pstack", - "commit": "7366ac128bdf95f45e6734f412b49a4031800169", + "commit": "f5bdd6826fd0a0d9cbc4347134c3a74a200b9d9d", "artifacts": { "agents": { "agents/comment-reviewer.md": "c0fd0383008da45fc78cfac17b9007d62c42f87ad1c8d5c2fb658b1fd01f7c82", @@ -108,8 +108,8 @@ "target": "2f04984c34d64ad8119eac43f24298d480528b14a9876d672aee0c942aa0c2da" }, "meta-mode": { - "source": "9319963075ef537e1d83edc4814f6bc6a7c90779ea261227934c984a0a5e88fb", - "target": "798df0dae0ca4959b81d6465b1c3c392ffc5cefd98f5b0834a53262eb1b2fa86" + "source": "d5817d996f6da294c86cacb2bd1b0c40c85968844a6afd194fe69efa8654878f", + "target": "4efa5f64e1f6bd01fd08eb6fb720ab4c84c7f3d787fff9df71d0e07ab65b73fe" }, "no-comments": { "source": "5c5b0882297d704c3a9720c52b7a793c68b013eaf717989f0945624efdfe2b05", diff --git a/profiles/upstreams.json b/profiles/upstreams.json index 954bf6b..da55191 100644 --- a/profiles/upstreams.json +++ b/profiles/upstreams.json @@ -1,7 +1,7 @@ { "pstack": { "repository": "https://github.com/cursor/plugins/tree/main/pstack", - "commit": "7366ac128bdf95f45e6734f412b49a4031800169", + "commit": "f5bdd6826fd0a0d9cbc4347134c3a74a200b9d9d", "renames": { "poteto-mode": "meta-mode", "setup-pstack": "setup-mstack", diff --git a/scripts/install-migration.test.mjs b/scripts/install-migration.test.mjs index df764ff..5e99b49 100644 --- a/scripts/install-migration.test.mjs +++ b/scripts/install-migration.test.mjs @@ -1,5 +1,6 @@ import assert from "node:assert/strict"; import { createHash } from "node:crypto"; +import { execFileSync } from "node:child_process"; import { existsSync, mkdirSync, mkdtempSync, readFileSync, rmSync, symlinkSync, writeFileSync } from "node:fs"; import { tmpdir } from "node:os"; import { dirname, join, resolve } from "node:path"; @@ -91,12 +92,15 @@ test("disabled discovery migration does not inspect unknown custom copies", (t) test("digest provenance includes actual released canonical and Claude adapter content", () => { const data = JSON.parse(readFileSync(join(repository, "profiles", "legacy-skill-digests.json"), "utf8")); assert.deepEqual(data.sources, ["v0.2.0", "v0.2.1", "v0.3.0", "v0.4.0"]); + // Ownership digests cover released versions; the working tree may carry + // unreleased edits, so read the latest released tag instead of the live file. + const releasedVersion = JSON.parse(execFileSync("git", ["show", "v0.4.1:package.json"], { encoding: "utf8" })).version; + const released = (name) => execFileSync("git", ["show", `v${releasedVersion}:skills/${name}/SKILL.md`], { encoding: "utf8", maxBuffer: 16 * 1024 * 1024 }); for (const name of ["meta-mode", "show-me-your-work"]) { - const text = readFileSync(join(repository, "skills", name, "SKILL.md"), "utf8").replaceAll("\r\n", "\n"); - const hash = createHash("sha256").update(text).digest("hex"); + const hash = createHash("sha256").update(released(name).replaceAll("\r\n", "\n")).digest("hex"); assert.equal(data.skills[name].includes(hash), true, name); } - const canonical = readFileSync(join(repository, "skills", "show-me-your-work", "SKILL.md"), "utf8").replaceAll("\r\n", "\n"); + const canonical = released("show-me-your-work").replaceAll("\r\n", "\n"); const claude = canonical.replace( "metadata:\n requirements: Node.js 18 or newer for scripts/log.mjs\n", 'compatibility: "Node.js 18 or newer is required for scripts/log.mjs."\n', diff --git a/scripts/migration-integration.test.mjs b/scripts/migration-integration.test.mjs index 3a3a0f2..5bf3f56 100644 --- a/scripts/migration-integration.test.mjs +++ b/scripts/migration-integration.test.mjs @@ -1,4 +1,5 @@ import assert from "node:assert/strict"; +import { execFileSync } from "node:child_process"; import { existsSync, mkdirSync, mkdtempSync, readFileSync, readdirSync, rmSync, writeFileSync } from "node:fs"; import { tmpdir } from "node:os"; import { dirname, join, relative, resolve } from "node:path"; @@ -6,6 +7,11 @@ import { spawnSync } from "node:child_process"; import test from "node:test"; const installer = resolve("scripts", "install.mjs"); +// Legacy fixtures must match released content the digest list covers; the +// working tree can carry unreleased edits. The installer stages from the +// working tree, so post-install assertions read the live file instead. +const releasedVersion = JSON.parse(execFileSync("git", ["show", "v0.4.1:package.json"], { encoding: "utf8" })).version; +const releasedCanonical = execFileSync("git", ["show", `v${releasedVersion}:skills/meta-mode/SKILL.md`], { encoding: "utf8", maxBuffer: 16 * 1024 * 1024 }); const canonical = readFileSync(resolve("skills", "meta-mode", "SKILL.md"), "utf8"); function snapshot(root) { @@ -37,7 +43,7 @@ function fixture(t) { mkdirSync(dirname(path), { recursive: true }); writeFileSync(path, content); } - function installOld(harness, { content = canonical, receipt = false, name = "meta-mode" } = {}) { + function installOld(harness, { content = releasedCanonical, receipt = false, name = "meta-mode" } = {}) { const path = join(roots[harness], name); write(join(path, "SKILL.md"), content); write(join(path, "local-support.txt"), `${harness} supporting content`); @@ -116,7 +122,7 @@ test("a later retirement failure restores previously retired copies and Claude c assert.match(result.stderr, /Rollback results:/); assert.ok(result.stdout.includes(`backup: ${opencode} ->`), "OpenCode retirement must have committed before the injected failure"); for (const [harness, target] of [["opencode", opencode], ["pi", pi], ["claude", claude]]) { - assert.equal(readFileSync(join(target, "SKILL.md"), "utf8"), canonical); + assert.equal(readFileSync(join(target, "SKILL.md"), "utf8"), releasedCanonical); assert.equal(readFileSync(join(target, "local-support.txt"), "utf8"), `${harness} supporting content`); } assert.equal(existsSync(join(f.roots.shared, "meta-mode")), false); @@ -128,7 +134,7 @@ test("migration archives authenticated crashed stages and preserves unselected o const remoteStage = join(f.roots.opencode, ".mstack-stage.old"); const unselectedStage = join(f.roots.pi, ".mstack-stage.unselected"); const emptyStage = join(f.roots.shared, ".harness-skills-stage-empty"); - f.write(join(localStage, "SKILL.md"), canonical); + f.write(join(localStage, "SKILL.md"), releasedCanonical); f.write(join(localStage, "support.txt"), "Preserve crashed local support"); f.write(join(remoteStage, "SKILL.md"), "---\nname: meta-mode\ndescription: Customized installed copy\n---\nRemote stage body\n"); f.write(join(remoteStage, ".mstack-install.json"), JSON.stringify({ package: "@3metajun/mstack", schemaVersion: 1 })); diff --git a/skills/meta-mode/SKILL.md b/skills/meta-mode/SKILL.md index 91ea7af..0cb4f7c 100644 --- a/skills/meta-mode/SKILL.md +++ b/skills/meta-mode/SKILL.md @@ -188,7 +188,7 @@ A large or cross-cutting effort (a migration across many call sites, an ambitiou - **Autonomous run.** A long task to drive to completion without stopping ("run until done", "/loop until X"). `playbooks/autonomous-run.md`. - **Orchestrate.** A standing project handed to one coordinator chat: multi-day, many stacked PRs, dozens to hundreds of subagents, minimal human turns ("run this whole project", "own this migration until it lands"). Distinct from Autonomous run, which drives one task to a predicate. Work one agent could finish inside the session's budget routes there, not here, however program-shaped the phrasing sounds. `playbooks/orchestrate.md`. - **Autopilot-full.** A queue of independent PRs run to merged with full autonomy. One owner per PR carries build through merge, and the root swarm-verifies each merge-ready head before its owner merges ("autopilot this queue", "full autopilot", one-owner-per-PR programs). `playbooks/autopilot-full.md`. -- **Autopilot-stack.** A queue of changes built and verified with full autonomy, delivered as one linear reviewed base-branch stack the operator lands herself ("autopilot-stack", "stack them, don't ship", "build the stack, I'll land it"). `playbooks/autopilot-stack.md`. +- **Autopilot-stack.** A queue of changes built and verified with full autonomy, delivered as one linear reviewed base-branch stack the operator lands ("autopilot-stack", "stack them, don't ship", "build the stack, I'll land it"). `playbooks/autopilot-stack.md`. - **Session pickup.** Resuming or taking over a prior agent's in-flight work from a transcript, cloud-agent URL, or pushed branch. `playbooks/session-pickup.md`. - **Pause safely.** Suspending in-flight work cleanly so it can be resumed, on an explicit pause, going offline, a Harness restart, or imminent context compaction. The complement to Session pickup. Full steps: `playbooks/pause-safely.md`. - **Multi-phase or multi-PR plan.** Work that spans phases or stacked PRs. `playbooks/multi-phase-plan.md`. diff --git a/skills/meta-mode/playbooks/autopilot-full.md b/skills/meta-mode/playbooks/autopilot-full.md index d441ffc..ac24896 100644 --- a/skills/meta-mode/playbooks/autopilot-full.md +++ b/skills/meta-mode/playbooks/autopilot-full.md @@ -2,12 +2,12 @@ **You own the verdicts, never the PRs. One owner runs each PR from build to merge, and nothing merges without your clean swarm verdict.** For "autopilot this queue", "full autopilot", and one-owner-per-PR programs. Orchestrate runs a standing program whose coordinator lands verified work itself and whose workers never merge. Here each PR's owner carries the whole lifecycle through the merge, and the root keeps only verification, countersigns, and audits. -1. **Mark the operator's items and honor state-then-wait.** Items the operator names stay hers. She reviews and she clicks, and no owner merges one. When she asks for the protocol or the plan to be stated, deliver the statement and stop. Execution starts only on her explicit go. On that go, arm a `/goal` with the full program objective. The goal continues across turns until the queue is done. +1. **Mark the operator's items and honor state-then-wait.** Items the operator names stay with the operator. The operator reviews and clicks, and no owner merges one. When the operator asks for the protocol or the plan to be stated, deliver the statement and stop. Execution starts only on the operator's explicit go. On that go, arm a `/goal` with the full program objective. The goal continues across turns until the queue is done. 2. **Spawn one owner per PR with the full lifecycle and an early trail.** Resolve the forge once for the program. GitHub CLI (`gh`) is the default. If `command -v origin` succeeds and Origin can resolve the repository, use `origin pr ...` for PR create, edit, view, watch, and merge operations. Otherwise stay on `gh` and record the fallback. Never require Graphite (`gt`). One remote worker per PR owns the build, first push, ready PR, proof on the real artifact, review-comment triage, prose cleanup with `unslop`, the **no-comments** skill, a rebase onto current trunk, the babysit loop to green (`playbooks/babysit.md`), and the merge itself. Every owner starts a `decisions.tsv` trail per the **show-me-your-work** skill, pushes its first branch snapshot, and opens the PR ready, never draft. Open the PR before self-proof so the URL, decisions, and checks form a durable trail. Keep `decisions.tsv` uncommitted and return it with the reports. The rebase always precedes babysit and never waits for drift or conflicts. The merge is the one step an owner may not take alone. Step 4 gates it. 3. **Run owners in true parallel and never stack.** Many owners at once when PRs are self-contained: one writer per branch, disjoint files, cross-PR drift absorbed by rebase. Only genuinely overlapping work serializes. Self-contained PRs branch straight off main, and sequenced work is merge-then-branch. One exception: an owner that must split a genuinely dependent change may hold a short private base-branch stack. 4. **Swarm-verify every merge-ready head before its merge.** At the owner's merge-ready head SHA, fan out parallel independent verifiers per the **swarm** skill and aggregate to one verdict. The lanes re-run the gates at that SHA and prove the load-bearing behavior on the real surface. Audit the receipts and the diff, distrusting the PR body. **Regression lane against trunk.** Run the same load-bearing scenario on current trunk. If trunk does not have the feature, record that fact and gate the behavior the diff adds plus the end state the user waits for instead of pretending trunk can produce it. The live lane is the floor, and a verdict without it is not clean. No merge without the root's clean verdict. Findings go back to the owner for fix-forward, and the new head gets a fresh swarm and a fresh verdict. -5. **On a clean verdict the owner merges and takes the next item.** The owner merges only from a head freshly rebased onto trunk. The merge-ready report is made at a trunk-current head, and the swarm verdict pins that SHA. If trunk moves again before the merge, the patch-id rule in `playbooks/shipping.md` governs re-verification. A new head voids the verdict unless the patch-id is unchanged. The owner squash-merges its own PR through the resolved forge and picks up its next self-contained item from the queue. The operator's full-autonomy grant plus the root's clean verdict is the merge authorization that babysitting alone never has. Operator-named items stop at merge-ready and wait for her click. +5. **On a clean verdict the owner merges and takes the next item.** The owner merges only from a head freshly rebased onto trunk. The merge-ready report is made at a trunk-current head, and the swarm verdict pins that SHA. If trunk moves again before the merge, the patch-id rule in `playbooks/shipping.md` governs re-verification. A new head voids the verdict unless the patch-id is unchanged. The owner squash-merges its own PR through the resolved forge and picks up its next self-contained item from the queue. The operator's full-autonomy grant plus the root's clean verdict is the merge authorization that babysitting alone never has. Operator-named items stop at merge-ready and wait for the operator's click. 6. **Run the root layer.** A genuinely new raise of a pinned gate or budget value (a limit CI only lets tighten) needs your fresh countersign, granted only after verifier proof. Absorbing values that already landed on main is drift, not a raise. Run an audit tick over all owners roughly every 30 minutes. A local root arms each tick as a real terminal `/loop`. The loop uses a monitored-shell 30-minute sleep and emits an output-notification sentinel. A cloud root uses the existing cloud-sleeper wake chain instead. Never leave the cadence to memory or lossy completion notifications. At each tick, re-read `/meta-mode/playbooks/autopilot-full.md` from the active skill installation, then re-read the armed `/goal`. Audit the operation against both. Fix drift during that tick. Probe each owner with a generic liveness or status check, and collect the decision trails. Count only side effects as progress: commits, pushes, PR or check deltas, and store reports. Treat a lane that passes its expected runtime without a side effect as stuck. Stand it down and dispatch a replacement at once. Do not wait for a polite return. When merges batch, run a retro pass and a post-merge bot-comment sweep. -7. **Stand down instantly on the operator's stop.** Her hold or stand-down reaches every owner as a zero-writes order immediately. Owners hold their briefs until she releases them. +7. **Stand down instantly on the operator's stop.** The operator's hold or stand-down reaches every owner as a zero-writes order immediately. Owners hold their briefs until the operator releases them. **Reply:** the queue with each PR's owner, state, and head SHA. Each verdict and the swarm that produced it. What merged and what each owner took next. Countersigns granted and why. Open operator gates. Where the collected decision trails live. diff --git a/skills/meta-mode/playbooks/autopilot-stack.md b/skills/meta-mode/playbooks/autopilot-stack.md index a1c672f..0200bea 100644 --- a/skills/meta-mode/playbooks/autopilot-stack.md +++ b/skills/meta-mode/playbooks/autopilot-stack.md @@ -1,15 +1,15 @@ ### Autopilot-stack -**You own the stack, never the landing. Build and verify the queue with full autonomy, then hand the operator one linear base-branch stack she reviews and lands herself.** The sibling of **Autopilot-full**. +**You own the stack, never the landing. Build and verify the queue with full autonomy, then hand the operator one linear base-branch stack to review and land.** The sibling of **Autopilot-full**. 1. **Run the owner loop unchanged.** Resolve the forge once for the program. GitHub CLI (`gh`) is the default. If `command -v origin` succeeds and Origin can resolve the repository, use `origin pr ...` for PR create, edit, view, watch, and merge operations. Otherwise stay on `gh` and record the fallback. Never require Graphite (`gt`). One remote worker per PR owns its change end to end: build, first push, a ready PR opened before self-proof, self-proof, review-comment triage, prose cleanup with `unslop`, the **no-comments** skill, and babysit to green per `playbooks/babysit.md`. Owners parallelize when the work is self-contained. Every owner starts a `decisions.tsv` trail per the **show-me-your-work** skill, pushes its first branch snapshot, and opens the PR ready, never draft. Keep the trail uncommitted and return it in the report. 2. **Audit on the wake chain.** The root runs an audit tick roughly every 30 minutes. A local root arms each tick as a real terminal `/loop`. The loop uses a monitored-shell 30-minute sleep and emits an output-notification sentinel. A cloud root uses the existing cloud-sleeper wake chain instead. Never leave the cadence to memory or lossy completion notifications. At each tick, re-read `/meta-mode/playbooks/autopilot-stack.md` from the active skill installation, then re-read the armed `/goal`. Audit the operation against both. Fix drift during that tick. Probe each owner with a generic liveness or status check. Count only side effects as progress: commits, pushes, PR or check deltas, and store reports. Treat a lane that passes its expected runtime without a side effect as stuck. Stand it down and dispatch a replacement at once. Do not wait for a polite return. -3. **Hold the operator gates.** State-then-wait, so a request to state the plan is not a go. On her explicit go, arm a `/goal` with the full program objective. The goal continues across turns until the chain is done. On her stop, every owner takes an immediate zero-writes hold. +3. **Hold the operator gates.** State-then-wait, so a request to state the plan is not a go. On the operator's explicit go, arm a `/goal` with the full program objective. The goal continues across turns until the chain is done. On the operator's stop, every owner takes an immediate zero-writes hold. 4. **Verify at STACK-READY.** The owner reports STACK-READY with the exact head SHA. The root swarm-verifies that SHA, fan-out per the **swarm** skill: parallel independent verifiers re-running the gates at that SHA, a live runtime floor over the load-bearing behavior, and a receipts-and-diff audit that distrusts the PR body. The swarm aggregates to one verdict. Findings go back to the owner, and nothing enters the stack unverified. 5. **Append on a clean verdict, never ship.** No owner merges, arms auto-merge, or closes. A clean verdict appends the PR to the one linear base-branch stack, in verified order or an order the operator specified. 6. **Single writer on topology, parallel writers on builds.** Owners push only their own branches and report the tip, current base, and intended parent. The root is the only topology writer. To append a PR, fetch the intended parent, rebase the child branch onto that exact parent tip, push with `--force-with-lease` only after an `ls-remote` check, and set the PR base to the parent branch. Create it with `origin pr create --status open --base ` or `gh pr create --base ` according to the resolved forge. Retarget an existing PR with `origin pr edit --base ` or `gh pr edit --base `. Only the root PR targets trunk. Never submit or register the chain through `gt`. 7. **Absorb drift at the root, then re-verify what moved.** The root fetches current trunk and rebases the chain from bottom to top. When a rebase surfaces conflicts in an owner's files, that owner fixes its own slice and the root pushes the result. A rebase rewrites every SHA above it and voids verdicts at the old SHAs. Compare the stable `git patch-id` for each PR's base-to-head diff at its verdict SHA against its new base-to-head diff. An unchanged patch-id preserves the code verdict. Any changed patch goes back through step 4 before delivery. Re-run mergeability and CI after every rewritten push even when the patch-id is unchanged. The countersign rule is unchanged from Autopilot-full. A genuinely new pin raises a stop for the root's fresh countersign. Absorbing drift of landed values is not a raise. -8. **Deliver the chain.** The deliverable is one linear chain of verified PRs, reviewable bottom-up in the resolved forge, every link carrying its verifier verdict in the PR body or a comment. The operator reviews and lands it, with her own clicks or with merge-when-ready she arms herself. +8. **Deliver the chain.** The deliverable is one linear chain of verified PRs, reviewable bottom-up in the resolved forge, every link carrying its verifier verdict in the PR body or a comment. The operator reviews and lands it, with their own clicks or by arming merge-when-ready. **Choosing between the autopilots.** Autopilot-full when the PRs are independent and landing authority is granted. Autopilot-stack when the operator wants review before landing, the work is sequenced or coupled, or merge authority is withheld. diff --git a/skills/meta-mode/playbooks/multi-phase-plan.md b/skills/meta-mode/playbooks/multi-phase-plan.md index e6a49e6..f137032 100644 --- a/skills/meta-mode/playbooks/multi-phase-plan.md +++ b/skills/meta-mode/playbooks/multi-phase-plan.md @@ -31,8 +31,8 @@ Tests alone are not sufficient verification. A PR is verified only when its unit ### Arm the program -- [ ] State the protocol and this plan to the operator, then stop. Start execution only on her explicit go. -- [ ] On her go, arm a `/goal` with this exact text. "" +- [ ] State the protocol and this plan to the operator, then stop. Start execution only on the operator's explicit go. +- [ ] On the operator's go, arm a `/goal` with this exact text. "" - [ ] Read these from the active skill installation at program start. Re-read them at every tick. - [ ] `/meta-mode/playbooks/.md` - [ ] `/swarm/SKILL.md` @@ -40,7 +40,7 @@ Tests alone are not sufficient verification. A PR is verified only when its unit - [ ] `/meta-mode/playbooks/opening-a-pr.md` - [ ] `/` - [ ] Arm the 30-minute audit tick. In a local session, a real terminal `/loop`. In a cloud root, a cloud-sleeper wake chain. Never leave the cadence to memory. -- [ ] Use this tick prompt, verbatim. "Re-read the execution playbook from the active skill installation and the armed /goal. Audit the operation against both and fix drift in this tick. Probe every active lane and judge progress by side effects only. Stand down a stuck lane and dispatch its replacement now. Then send the operator a status message, whether or not anything changed, with the queue table of PR, owner, state, and head SHA, the verdicts since the last tick, what merged, open operator gates, and blockers." +- [ ] Use this tick prompt, verbatim. "Re-read the execution playbook from the active skill installation and the armed /goal. Audit the operation against both and fix drift in this tick. Probe every active lane and judge progress by side effects only. Stand down a stuck lane and dispatch its replacement now. Then post a status message to the operator in chat, whether or not anything changed, with the queue table of PR, owner, state, and head SHA, the verdicts since the last tick, what merged, open operator gates, and blockers." - [ ] On the operator's hold or stand-down, send every owner a zero-writes order at once. ### Spawn owners From 14feb6e99558a5e58a68a1d27519abeb058748c1 Mon Sep 17 00:00:00 2001 From: 3metaJun <251347867+3metaJun@users.noreply.github.com> Date: Fri, 18 Sep 2026 01:44:56 +0800 Subject: [PATCH 2/2] fix(ci): align upstream pin and fetch release tags --- .github/workflows/validate.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/validate.yml b/.github/workflows/validate.yml index 0597e45..11cbbd7 100644 --- a/.github/workflows/validate.yml +++ b/.github/workflows/validate.yml @@ -17,6 +17,8 @@ jobs: runs-on: ${{ matrix.os }} steps: - uses: actions/checkout@fbc6f3992d24b796d5a048ff273f7fcc4a7b6c09 # v5 + with: + fetch-depth: 0 - uses: actions/setup-node@a0853c24544627f65ddf259abe73b1d18a591444 # v5 with: node-version: ${{ matrix.node }} @@ -43,7 +45,7 @@ jobs: - uses: actions/checkout@fbc6f3992d24b796d5a048ff273f7fcc4a7b6c09 # v5 with: repository: cursor/plugins - ref: 7366ac128bdf95f45e6734f412b49a4031800169 + ref: f5bdd6826fd0a0d9cbc4347134c3a74a200b9d9d path: .upstream/cursor-plugins sparse-checkout: pstack - uses: actions/checkout@fbc6f3992d24b796d5a048ff273f7fcc4a7b6c09 # v5