@1aboveio/skills 1.0.20 → 1.0.22

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (92) hide show
  1. package/.codex-plugin/plugin.json +1 -1
  2. package/.codex-plugin/resources.json +154 -151
  3. package/package.json +4 -4
  4. package/skills/app-dev/airflow/SKILL.md +1 -1
  5. package/skills/app-dev/android-development/SKILL.md +1 -1
  6. package/skills/app-dev/app-debug/SKILL.md +1 -1
  7. package/skills/app-dev/better-auth/SKILL.md +1 -1
  8. package/skills/app-dev/data-catalog/SKILL.md +1 -1
  9. package/skills/app-dev/data-quality/SKILL.md +1 -1
  10. package/skills/app-dev/ios-foundation/SKILL.md +1 -1
  11. package/skills/app-dev/maestro/SKILL.md +8 -1
  12. package/skills/app-dev/monorepo/SKILL.md +1 -1
  13. package/skills/app-dev/nextjs-fullstack/SKILL.md +1 -1
  14. package/skills/app-dev/prisma-setup/SKILL.md +1 -1
  15. package/skills/app-dev/pyspark/SKILL.md +1 -1
  16. package/skills/app-dev/python-backend/SKILL.md +1 -1
  17. package/skills/app-dev/shadcn/SKILL.md +1 -1
  18. package/skills/app-dev/zod-v4/SKILL.md +1 -1
  19. package/skills/cicd/cloud-build/SKILL.md +1 -1
  20. package/skills/cicd/cloud-debug/SKILL.md +1 -1
  21. package/skills/cicd/cloud-deploy/SKILL.md +1 -1
  22. package/skills/cicd/docker/SKILL.md +1 -1
  23. package/skills/cicd/github-actions/SKILL.md +8 -2
  24. package/skills/cicd/github-actions/references/debugging.md +21 -0
  25. package/skills/cicd/github-actions/references/pipeline.md +26 -0
  26. package/skills/cicd/github-actions/references/post-deploy-and-publishing.md +7 -0
  27. package/skills/cicd/github-actions/scripts/watch-run.mjs +511 -0
  28. package/skills/cicd/github-flow/SKILL.md +35 -9
  29. package/skills/cicd/github-flow/scripts/watch-checks.mjs +561 -0
  30. package/skills/cicd/google-cloud/SKILL.md +1 -1
  31. package/skills/cicd/mergify/SKILL.md +2 -2
  32. package/skills/cicd/mergify/references/diagnosis.md +6 -1
  33. package/skills/cicd/mergify/references/watch-contract.md +10 -7
  34. package/skills/cicd/mergify/scripts/watch-pr-delivery-core.mjs +15 -30
  35. package/skills/cicd/podman/SKILL.md +1 -1
  36. package/skills/content/article-review/SKILL.md +1 -1
  37. package/skills/content/article-to-image/SKILL.md +1 -1
  38. package/skills/content/flowchart-svg/SKILL.md +1 -1
  39. package/skills/content/image-gen/SKILL.md +1 -1
  40. package/skills/content/mermaid/SKILL.md +1 -1
  41. package/skills/content/wechat-article-writer/SKILL.md +1 -1
  42. package/skills/content/wechat-publisher/SKILL.md +1 -1
  43. package/skills/content/wechat-search/SKILL.md +1 -1
  44. package/skills/content/xai-search/SKILL.md +1 -1
  45. package/skills/core/distill-writing/SKILL.md +1 -1
  46. package/skills/core/doc-to-md/SKILL.md +1 -1
  47. package/skills/core/editorial-review/SKILL.md +1 -1
  48. package/skills/core/house-style/SKILL.md +1 -1
  49. package/skills/core/plain-language/SKILL.md +1 -1
  50. package/skills/core/polish-cn/SKILL.md +1 -1
  51. package/skills/core/reg-parser/SKILL.md +1 -1
  52. package/skills/core/terminology/SKILL.md +1 -1
  53. package/skills/core/write-doc/SKILL.md +1 -1
  54. package/skills/core/write-report/SKILL.md +1 -1
  55. package/skills/engineering/better-review/SKILL.md +1 -1
  56. package/skills/engineering/better-review/references/passes.md +5 -0
  57. package/skills/engineering/e2e-test/SKILL.md +8 -1
  58. package/skills/engineering/engineering/SKILL.md +1 -1
  59. package/skills/engineering/engineering-runtime/SKILL.md +1 -1
  60. package/skills/engineering/engineering-runtime/coherence/workflow.json +13 -13
  61. package/skills/engineering/ensure-coverage/SKILL.md +8 -1
  62. package/skills/engineering/golden-path/SKILL.md +5 -1
  63. package/skills/engineering/harness-runtime/SKILL.md +2 -1
  64. package/skills/engineering/harness-runtime/contracts.md +2 -0
  65. package/skills/engineering/harness-runtime/references/subagent-sessions.md +75 -0
  66. package/skills/engineering/resolve-issues/SKILL.md +25 -6
  67. package/skills/engineering/resolve-issues/references/ci.md +14 -4
  68. package/skills/engineering/resolve-issues/references/delivery-progress.md +3 -1
  69. package/skills/engineering/resolve-issues/references/done.md +8 -6
  70. package/skills/engineering/resolve-issues/references/expire.md +2 -2
  71. package/skills/engineering/resolve-issues/references/exploration.md +10 -3
  72. package/skills/engineering/resolve-issues/references/implementation.md +73 -51
  73. package/skills/engineering/resolve-issues/references/preflight.md +6 -0
  74. package/skills/engineering/resolve-issues/references/review.md +18 -19
  75. package/skills/engineering/resolve-issues/references/shared-modules.md +7 -1
  76. package/skills/engineering/resolve-issues/references/task-plan.md +18 -10
  77. package/skills/engineering/resolve-issues/scripts/next-actions.mjs +42 -32
  78. package/skills/engineering/resolve-release/SKILL.md +1 -1
  79. package/skills/engineering/resolve-release/references/publish.md +12 -4
  80. package/skills/engineering/resolve-release/references/workspace-npm.md +6 -4
  81. package/skills/engineering/rush-issues/SKILL.md +1 -1
  82. package/skills/engineering/rush-release/SKILL.md +1 -1
  83. package/skills/engineering/test-quality/SKILL.md +1 -1
  84. package/skills/risk-compliance/compliance-audit/SKILL.md +1 -1
  85. package/skills/risk-compliance/contract-compare/SKILL.md +1 -1
  86. package/skills/risk-compliance/contract-review/SKILL.md +1 -1
  87. package/skills/risk-compliance/doc-authenticity/SKILL.md +1 -1
  88. package/skills/risk-compliance/fraud-detection/SKILL.md +1 -1
  89. package/skills/risk-compliance/payment-analysis/SKILL.md +1 -1
  90. package/skills/risk-compliance/portfolio-payment-analysis/SKILL.md +1 -1
  91. package/skills/risk-compliance/similar-domain/SKILL.md +1 -1
  92. package/skills/risk-compliance/tld-detection/SKILL.md +1 -1
@@ -0,0 +1,75 @@
1
+ # Saved subagent conversations on Pi
2
+
3
+ Use this contract when an engineering workflow continues a Pi worker after its
4
+ attempt has finished. Other harnesses use their advertised continuation API.
5
+
6
+ ## Check the active interface
7
+
8
+ Read the tool schema advertised in the current turn. Continuation requires
9
+ `subagent_spawn` with `session_id`; a tool name or an installed package version
10
+ alone does not establish that the running extension has loaded that parameter.
11
+ A stale running extension may need the human's `/reload` after an update. Report
12
+ that mismatch and use the workflow's documented fallback; updating packages or
13
+ changing tool permissions is a separate authorized action.
14
+
15
+ ## Record the conversation separately from the attempt
16
+
17
+ Keep these values from the actual launch receipt:
18
+
19
+ - `runId`: the attempt used for results, failures, logs, and the active worker slot.
20
+ - `sessionId`: the native Pi conversation used for later follow-up.
21
+ - `cwd`: the worker's recorded workspace.
22
+
23
+ Every continuation creates a new `runId` while keeping `sessionId`. Read the
24
+ native session id from the structured receipt, batch launch entry, or explicit
25
+ `session_id` in list output. An attempt id is not a substitute, even when the two
26
+ happen to match on the first launch.
27
+
28
+ For an older plan missing `sessionId`, locate the exact recorded `runId` in
29
+ `subagent_list` and record its native `session_id` before continuing. Use
30
+ `all: true` when it is outside the caller's folder. If that identity cannot be
31
+ verified, report unavailable continuity and follow the workflow's explicit
32
+ replacement path with its saved evidence.
33
+
34
+ ## Continue through spawn
35
+
36
+ ```javascript
37
+ subagent_spawn({ session_id: owner.sessionId, prompt: "Fix the remaining findings." })
38
+ ```
39
+
40
+ The prompt is the next turn, not a repetition of the original assignment or role.
41
+ Keep the saved worker configuration; pass model or effort only for an explicit,
42
+ authorized escalation supported by the current schema. Record the returned new
43
+ attempt id and verify that its session id is still the selected conversation.
44
+ Per-job `session_id` in `subagent_spawn_batch` has the same meaning; the shared
45
+ batch options do not select one conversation for every job.
46
+
47
+ The caller may be a different foreground session. Completion reports to that
48
+ caller. Continue from a completed attempt; a running or orphaned writer must
49
+ settle before another continuation starts. A failed, killed, lost, or otherwise
50
+ refused attempt follows the workflow's recovery or replacement rules rather than
51
+ selecting an older completion. Current mandatory permissions still apply.
52
+ Missing history or workspace is a refusal, not permission to create a replacement
53
+ conversation under the same identity.
54
+
55
+ ## Discover locally or globally
56
+
57
+ `subagent_list()` searches the current folder and descendants across foreground
58
+ sessions. `subagent_list({ all: true })` searches globally. Each row identifies
59
+ both the attempt and the saved conversation. `session_name` is a convenience for
60
+ one exact, unambiguous name in the local folder scope; a workflow with recorded
61
+ ownership uses its exact `sessionId` rather than choosing a worker by name.
62
+ Duplicate names require an explicit session id.
63
+
64
+ ## Keep the lifecycle small
65
+
66
+ Native session history and completed launch recipes persist by default.
67
+ `subagent_resume`, `subagent_release`, and `retain_session` are not part of this
68
+ contract. A completed attempt frees its capacity slot automatically. Ordinary
69
+ workspace/resource cleanup remains owned by the workflow; no session-release
70
+ acknowledgement is required. Preserving history does not keep a deleted workspace
71
+ available for later continuation.
72
+
73
+ Keep the implementation conversation through repairs. An unfinished review may
74
+ continue only within the workflow's existing HEAD and scope rules. A completed
75
+ independent review round gets a fresh reviewer for the next required round.
@@ -8,7 +8,7 @@ dependencies:
8
8
  - better-review
9
9
  - golden-path
10
10
  - harness-runtime
11
- release-version: 0.50.0
11
+ release-version: 0.50.2
12
12
  ---
13
13
  **Updates:** Once/session run `node <skill-base-dir>/release-check.mjs`.
14
14
  # Resolve issues
@@ -119,15 +119,31 @@ Read each procedure right before its stage; never substitute your own.
119
119
  - **Proof.** Treat producer reports as claims until the reviewer or CI checks them. Tests and diagnostic probes
120
120
  encode failure in their exit status under [Proof](references/implementation.md#proof); printing an exception
121
121
  and returning 0 is not a passing check. Coordination CLIs keep their documented structured-verdict contracts.
122
- A unit owes coding acceptance only: its criteria at its `proof.level` plus the required CI
123
- on its final HEAD. Integrated release acceptance (a device or system campaign the spec or repository assigns
124
- to a release or campaign gate) runs at that gate, never per unit; the handback links its owning issue. Produce
125
- no evidence documents; the plan, findings, and reviews are the only records.
122
+ Apply the [Acceptance criteria](#acceptance-criteria) contract below. Use the plan,
123
+ findings, reviews and CI artifacts as the records; produce an additional checklist or
124
+ evidence document only when the issue or repository requires it, deriving results from actual runs.
126
125
  - **Delivery.** A dependent starts on its parent's finished code. Stack its PR on the parent's (a GitHub-native
127
126
  stack) under a live Mergify queue; chain it when the merge keeps commits; else open it once the parent merges. Live
128
127
  steps are only the read-only warehouse canary (never blocks) and the isolated, run-owned resources
129
128
  [preflight.md](references/preflight.md#never-block-on-the-human) allows.
130
129
 
130
+ ## Acceptance criteria
131
+
132
+ Treat Acceptance Criteria, other issue requirements and later corrections as the contract.
133
+ Reuse or implement automated tests at the lowest sufficient level. Workers deliver behavior
134
+ and tests, run focused local checks, and return with CI pending. CI qualifies the candidate;
135
+ the coordinator verifies results. Human or hardware criteria stay pending until their step passes.
136
+
137
+ At preflight, record coverage, missing automation, the CI lane and manual remainder in
138
+ findings. Reuse sufficient tests; one may cover several criteria. Acceptance-focused issues
139
+ are supported: automate criteria, fix in-scope defects and qualify results in CI.
140
+ Tests added or code merged alone do not satisfy acceptance.
141
+
142
+ Defer acceptance only when the issue or agreed policy assigns it to a later gate; link
143
+ its owner. An issue requesting the campaign remains incomplete until its criteria pass.
144
+ Preserve required checks and merge rules. Surface missing execution or enforcement;
145
+ change neither branch protection nor acceptance scope without authorization.
146
+
131
147
  ## Delivery progress
132
148
 
133
149
  Before briefing or continuing a unit, read [delivery-progress.md](references/delivery-progress.md).
@@ -171,7 +187,7 @@ efforts are run metadata, never a question.
171
187
  ### 2. Implement and open the PR
172
188
 
173
189
  Give each unit a branch, its prepared workspace, and an implementer with its findings entry
174
- and parents' contracts; retain its [implementation owner](references/implementation.md#implementation-owner)
190
+ and parents' contracts; keep its [implementation owner](references/implementation.md#implementation-owner)
175
191
  through review/CI fixes, separately from its active worker slot. State outcome and validation, not method. Refill
176
192
  slots at once. At a unit's first coherent commit its PR opens as a draft, so CI
177
193
  starts and the work is safe; later work goes to the same PR (in a Mergify stack
@@ -219,6 +235,9 @@ that same `planRevision`.
219
235
 
220
236
  ## Done
221
237
 
238
+ Check each issue's [acceptance contract](#acceptance-criteria) against qualifying results;
239
+ record later-gate obligations. A merged PR does not close pending acceptance.
240
+
222
241
  First [clean every delivered unit's environment](references/done.md#clean-before-handoff), then
223
242
  [settle blocked units](references/done.md#settle-blocked-units). Every PR is reviewed, green on its exact HEAD, and merged (`autonomous`) or
224
243
  handed back merge-ready (`supervised`). For a blocked unit, hand back it, its
@@ -7,6 +7,18 @@ the queue owner's watcher where applicable. Workers may make short status reads
7
7
  fetch failed logs for diagnosis, but must not run `gh run watch`,
8
8
  `gh pr checks --watch`, a delivery watcher, or create background monitoring.
9
9
 
10
+ Qualify the issue's Acceptance Criteria as well as required repository checks.
11
+ Verify that the mapped tests actually ran in the assigned lane against the intended
12
+ candidate and their assertions cover the claimed behavior. A skipped case, missing
13
+ acceptance job, or green unrelated check is not acceptance. Use CI results and artifacts
14
+ for any required checklist; retain manual or explicitly later-gate obligations with
15
+ their owner. Worker completion with CI pending is not issue acceptance. Queue checks
16
+ qualify the combined candidate; post-deploy checks qualify the deployed revision.
17
+ Require each result at its assigned stage: PR admission checks before enqueue,
18
+ queue acceptance before merge, and deployed acceptance after deployment or before
19
+ promotion as specified. Queue-only acceptance is pending at admission, not missing
20
+ PR CI; it cannot be required to pass before the queue candidate exists.
21
+
10
22
  1. Watch the required checks for every pushed HEAD. Pushes to the unit's own
11
23
  PR branch need no approval. Green means every required check ran and passed
12
24
  on that HEAD: a check that never reported is missing, not passed. Example: a
@@ -105,10 +117,8 @@ provider shows that PR merged.
105
117
 
106
118
  Clean that unit's workspace and resources, then finish it, in every scheduler
107
119
  mode: `next-actions.mjs` prints `cleanup-workspace` until its cleanup settles.
108
- First [release any session retention still held](implementation.md#settle-session-retention)
109
- for it, even while other units remain active; a conversation launched without protection has
110
- nothing to release. Then record the intent through the [checkpoint mechanism](task-plan.md#checkpoints) (`lifecycle.cleanup`
111
- `{state: applying, headSha: <the unit's headSha>}`), then run:
120
+ Record the intent through the [checkpoint mechanism](task-plan.md#checkpoints) (`lifecycle.cleanup`
121
+ `{state: applying, headSha: <the unit's headSha>}`), while other units remain active, then run:
112
122
 
113
123
  ```bash
114
124
  node <skill-base-dir>/scripts/cleanup-runs.mjs cleanup --run <run> --unit <unit> \
@@ -45,7 +45,7 @@ issue or automatic scheduler gate. They do not waive required validation.
45
45
 
46
46
  ## Every brief contains
47
47
 
48
- Use the full checklist for a fresh or replacement worker. For a retained conversation,
48
+ Use the full checklist for a fresh or replacement worker. For a continued conversation,
49
49
  send the new feedback, current checkpoint, latest failure/fix brief and local evidence,
50
50
  current standing orders and changed decisions, affected skill/proof pointers, and new
51
51
  result path. Re-read the saved source/criteria after context loss; do not resend the original
@@ -59,6 +59,8 @@ acceptance bar, launch-authority rules and history; it is not a new setup or pro
59
59
  - model id, effort, and a required read-back
60
60
  - an absolute skill path when the stage invokes a leaf skill; for validating, the unit's `proof.suite` `skill` (read it first) and `local`, when set
61
61
  - the outcome and validation, with no prescribed method or evidence format
62
+ - the Acceptance Criteria mapping: existing or missing tests, qualifying CI lane,
63
+ and manual or explicitly later-gate obligations; include any issue-required checklist
62
64
  - the [immediate acceptance checkpoint](#delivery-progress), existing baseline (or none),
63
65
  and, for a continuation, the last result, remaining uncertainty and next distinguishing
64
66
  test; retain the same checkpoint/history when changing workers
@@ -15,12 +15,9 @@ nothing is left to settle.
15
15
 
16
16
  ## Clean before handoff
17
17
 
18
- [Release any session retention still held](implementation.md#settle-session-retention) for each
19
- unit before normal workspace cleanup; this also applies at each merge while other units
20
- continue. A launch that asked for none has nothing to release, and an acknowledgement is
21
- recorded only where protection was actually held. Record any
22
- resource intentionally kept under the existing lifecycle; never claim it was cleaned
23
- because its worker exited.
18
+ Clean each delivered unit's workspace and resources at its settlement; this also applies at
19
+ each merge while other units continue. Record any resource intentionally kept under the
20
+ existing lifecycle; never claim it was cleaned because its worker exited.
24
21
 
25
22
  Clean every delivered unit's workspace and resources before the report, in every
26
23
  scheduler mode ([workspaces.md](workspaces.md#cleanup-after-delivery-before-finish)).
@@ -31,6 +28,11 @@ cancelled, pending, or merge-ready handed-back unit that keeps its environment.
31
28
 
32
29
  ## Close the run
33
30
 
31
+ Before closing, distinguish run completion from issue acceptance. Verify the issue's
32
+ Acceptance Criteria against qualifying CI results and required manual results. Keep
33
+ an issue open when its own acceptance remains pending, even if its automation PR
34
+ merged or its human-only remainder was excluded. Link that obligation in the report.
35
+
34
36
  After the report ([SKILL.md](../SKILL.md#done)):
35
37
 
36
38
  The run is done when nothing it can do is left: every unit landed,
@@ -242,10 +242,10 @@ missing, or names a step without a reason.
242
242
  | A capability the unit needs is missing and no unit builds it (a shared driver, fixture, or hook) | Build it inside the first unit that needs it; units that need it later get `dependsOn` on that unit. Only when that puts the unit past the size check's line limit, file it as its own issue beside them, with `blocked_by` on the units that use it, never on their parent issue. Example: three proof units each need a device-state reader: the first builds it, the other two depend on the first. |
243
243
  | [Human-only](#human-only) blocker | Take its automatic answer ([preflight.md](preflight.md#never-block-on-the-human)); when that defers it, mark `blocked` (`blockedReason: human-decision`, its `humanItem` and `humanNeed`), keep the work, and record what is needed on its owning issue; never ship part of the unit. |
244
244
 
245
- Continue the retained owner in the kept workspace with the current checkpoint, findings
245
+ Continue the saved owner in the kept workspace with the current checkpoint, findings
246
246
  and failure evidence. If its process state or required selection prevents continuation,
247
247
  use an explicit replacement under the [owner contract](implementation.md#implementation-owner),
248
- keeping its old session reference for settlement; replacement briefs use those local facts
248
+ keeping the replaced reference as evidence; replacement briefs use those local facts
249
249
  rather than an old transcript. Keep the response limits and history above. Record a queue stall with the
250
250
  provider pending as a wait and watch again. End the run only when
251
251
  `next-actions.mjs`, invoked with [live capacity](implementation.md#live-capacity), prints `finish`, and never claim the spec complete.
@@ -125,6 +125,12 @@ The coordinator and any delegated explorer use these rules:
125
125
  5. **`layers`:** the parts changed (`backend`, `web`, `android`, `shared`,
126
126
  `migration`).
127
127
  6. **`proof`:**
128
+ Map the issue's Acceptance Criteria and other binding requirements to existing
129
+ tests, missing automation, the qualifying CI lane, and any manual remainder in
130
+ the existing notes/proof fields. Preserve criterion identifiers when supplied;
131
+ no new ledger or schema is required. For acceptance-focused issues, include
132
+ implementing the cases and connecting their execution to CI in the unit's scope.
133
+
128
134
  - `level`: the weakest the run can reach that shows the behaviors work:
129
135
  `unit`, `database`, `browser`, or `emulator`.
130
136
  - `suite` (`browser`/`emulator` only): the repository's end-to-end suite
@@ -157,9 +163,10 @@ The coordinator and any delegated explorer use these rules:
157
163
  Example: a campaign's 25 scenario groups each cover one feature issue; 20
158
164
  share "owned emulator, database, and fixture pool" (900 lines).
159
165
 
160
- `level` is coding acceptance. Integrated acceptance the spec or repository
161
- assigns to a later gate (a release device campaign, all-ABI or signed
162
- builds, a cross-feature journey) goes in `handback`, naming its gate.
166
+ `level` selects the test depth for automated acceptance. Put integrated acceptance
167
+ in `handback`, naming its gate and owner, only when the issue or agreed repository
168
+ policy assigns it to a later gate. A cross-feature or device journey is not deferred
169
+ merely because it is expensive; an issue requesting that acceptance still owes it.
163
170
  7. **`estimatedLines`: your honest estimate of changed source and test
164
171
  lines,** excluding generated files and docs, including every missing
165
172
  prerequisite. Do not pad it: the size check scales it by 1.3.
@@ -27,7 +27,8 @@ the coordinator.
27
27
  not the backend suite.
28
28
  5. **Run focused checks locally; CI runs the rest.**
29
29
  Example: run the touched package's tests and typecheck, push, and let CI
30
- run the full matrix. Never rebuild a release device campaign in a unit.
30
+ run the full matrix. Run release campaigns only at their assigned gate;
31
+ implement campaign automation when the current issue requests it.
31
32
  6. **Report in one short record and return.**
32
33
  Example: "Persists the Charge layout per installation. Ran charge tests
33
34
  and typecheck: pass. CI: pending. Pending: release device campaign
@@ -55,51 +56,62 @@ accepts unrestricted writes.
55
56
 
56
57
  ## Implementation owner
57
58
 
59
+ On Pi, read the shared [saved conversation contract](../../harness-runtime/references/subagent-sessions.md)
60
+ for the active schema check, discovery scope, and conversation lifecycle. The rules below
61
+ bind that contract to unit ownership and review repairs.
62
+
58
63
  Keep one implementation conversation per unit through local proof, independent review,
59
64
  review fixes and CI repairs. Its saved conversation outlives the active worker slot: launch
60
65
  each worker normally, single or batch as the assignment needs, and record the receipt as
61
- `implementationOwner` ([task-plan.md](task-plan.md#shape)). `retain_session` is optional
62
- protection from later cleanup, not a precondition for continuing: a completed conversation is
63
- resumed by its `runId` whether or not retention was requested, and the harness never asks for
64
- it on resume. Request it only when this caller needs the conversation protected through a long
65
- wait before cleanup, using the exact argument the launched tool advertises and never inventing
66
- one for a call that lacks it. A parked owner has no live process and reserves no slot. The
67
- coordinator still owns scheduling, plan writes, external CI, readiness and delivery;
68
- reviewers use separate conversations.
69
-
70
- `next-actions.mjs` supplies `continuation`, `workerKind`, and, for
71
- `owner-resume`, `owner`. Resume that completed attempt with
72
- `subagent_resume({id: owner.runId, prompt: <current brief>})`; record the new attempt ID
73
- without changing the conversation ID. Selection follows [continuation versus new launch](task-plan.md#worker-selection-on-resume): omit model/effort for ordinary continuation. Use only
74
- authorized, supported explicit overrides; when a required role-only fill cannot be expressed
75
- by the resume API, replace from that fill with the retained evidence instead of creating a
76
- pin from its resolved model ID. Clear `worker` when an attempt
77
- ends, but keep `implementationOwner` while review or CI is pending. Keep all counters and
78
- earlier results across attempts. `one-by-one` fixes findings sequentially in this owner.
66
+ `implementationOwner` ([task-plan.md](task-plan.md#shape)): the native `sessionId` and that
67
+ attempt's `runId`, kept as separate fields. A parked owner has no live process and reserves
68
+ no slot. The coordinator still owns scheduling, plan writes, external CI, readiness and
69
+ delivery; reviewers use separate conversations.
70
+
71
+ Continuation is a spawn into the saved session, not a resume call:
72
+ `subagent_spawn({session_id: owner.sessionId, prompt: <current brief>})` continues that exact
73
+ native session and returns a new attempt `runId` with the same `sessionId`. Record the new
74
+ `runId` as `implementationOwner.runId` and keep the `sessionId`. Never pass an attempt `runId`
75
+ as `session_id`, and never invent a session id a receipt does not hold: a first launch can show
76
+ similar-looking ids, which is not evidence they are interchangeable. Continue from a completed
77
+ attempt: a running or orphaned writer settles first. A conversation started
78
+ from another foreground session still continues: the launch origin does not restrict
79
+ continuation. `subagent_list()` covers the caller's folder and descendants across foreground
80
+ sessions; `all: true` searches globally.
81
+ In a batch, the job's own selector continues that job's session.
82
+
83
+ `next-actions.mjs` supplies `continuation`, `workerKind`, and, for `owner-resume` or
84
+ `owner-recovery`, `owner`.
85
+ Selection follows [continuation versus new launch](task-plan.md#worker-selection-on-resume):
86
+ omit model/effort for ordinary continuation. Use only authorized, supported explicit
87
+ overrides; when a required role-only fill cannot be expressed by the continuation call,
88
+ replace from that fill with the retained evidence instead of creating a pin from its resolved
89
+ model ID. `session_name` selects an existing conversation by an exact, unambiguous name
90
+ within the caller's folder and descendants; it does not name a new conversation. Fresh
91
+ launches omit both session selectors and may use an advertised fresh-launch naming control.
92
+ A workflow that records ids continues
93
+ `implementationOwner.sessionId` rather than looking a session up by name. Clear `worker` when
94
+ an attempt ends, but keep `implementationOwner` while review or CI is pending. Keep all
95
+ counters and earlier results across attempts. `one-by-one` fixes findings sequentially in this
96
+ owner.
79
97
 
80
98
  A missing history/workspace, an unusable saved owner, or an owner that cannot continue
81
99
  requires an explicit replacement reason and the retained checkpoint, failures and reproducer
82
- references in the replacement brief. Try the saved conversation first: a `retentionReleased`
83
- marker says only that optional protection lapsed, so it is not a replacement reason by itself
84
- and the conversation it names usually still resumes. Report lost continuity; never label a
85
- new conversation a resume. Existing recovery/stop rules still apply, and old plans without
86
- an owner use the fresh-worker path. Do not install or update the harness during a run merely
87
- to obtain continuation.
88
-
89
- ### Settle session retention
90
-
91
- When this unit settles (merged, cancelled, deferred or handed back merge-ready), release any
92
- retention still held for its `implementationOwner`, `reviewSession` and `retiredSessions` with
93
- `subagent_release({id: <runId>})` before its normal workspace/resource cleanup. Only a
94
- conversation launched with `retain_session` has anything to release, so a normal launch skips
95
- this and a second release is not owed. Record the acknowledgement on that reference when it
96
- was actually held; an unavailable or refused release stays explicit rather than being
97
- recorded as done.
98
-
99
- Reopening is the ordinary case: resume the saved conversation even when its protection was
100
- released, because release stops protection and leaves the history in place. Start a fresh
101
- replacement only when continuation is genuinely unavailable, and carry the original
102
- checkpoint/findings/counters into it. The same rule covers a released unfinished review,
100
+ references in the replacement brief. Report lost continuity; never label a new conversation a
101
+ resume. Existing recovery/stop rules still apply, and old plans without an owner use the
102
+ fresh-worker path. Do not install or update the harness during a run merely to obtain
103
+ continuation.
104
+
105
+ A plan written before this contract may hold `implementationOwner {runId}` and no `sessionId`.
106
+ `next-actions.mjs` prints `continuation: "owner-recovery"` for it: first match that exact
107
+ `runId` in `subagent_list({all: true})` or in the verified spawn receipt. A match that names
108
+ its session continues that session and records both ids; with no match, launch an explicit
109
+ replacement with the retained evidence and say why. A `retentionReleased` field left on an old
110
+ plan is inert history: no step reads it, reverses it, or owes a release for it.
111
+
112
+ Reopening is the ordinary case: continue the saved session; there is no release step in the way.
113
+ Start a fresh replacement only when continuation is genuinely unavailable, and carry the
114
+ original checkpoint/findings/counters into it. The same rule covers an unfinished review,
103
115
  keeping its round and existing full-review fallback.
104
116
 
105
117
  ## Brief
@@ -156,8 +168,10 @@ On `resume` (in flight, no worker, code not done), continue the unit's
156
168
  step, error message and evidence path the worker observed. An exit code alone is
157
169
  not a failure; keep the first failure separate from cleanup errors. Fix workers
158
170
  write the same file. Return
159
- nothing else: no artifact hashes, version inventories, screenshots,
160
- copied logs, or earlier attempts. For a continuation, include the current checkpoint,
171
+ only that result by default. When the issue or repository requires a checklist
172
+ or evidence document, produce it from actual results and link CI artifacts;
173
+ otherwise omit artifact hashes, inventories, screenshots and copied logs.
174
+ For a continuation, include the current checkpoint,
161
175
  outcome and relevant prior-result links in the existing integration notes; do not
162
176
  duplicate the full attempt history. After focused validation, the permitted push,
163
177
  and the result, return without waiting for external CI or PR monitoring. Report
@@ -168,14 +182,19 @@ On `resume` (in flight, no worker, code not done), continue the unit's
168
182
  not prohibit long local tests or builds needed for the assigned validation.
169
183
 
170
184
  After 2 fix cycles without progress, or a stuck or late worker, follow
171
- [expire.md](expire.md). Apply the next response through the retained owner where its
185
+ [expire.md](expire.md). Apply the next response through the saved owner where its
172
186
  completed conversation and required launch controls permit continuation. A replacement
173
187
  uses the same workspace and the findings entry, failing command/output and `git diff <base>`;
174
- record why it replaces the owner and retain its session reference as above. Give replacement
188
+ record why it replaces the owner and keep the replaced reference as evidence. Give replacement
175
189
  workers those local facts rather than copying the old transcript. Keep all progress counters.
176
190
 
177
191
  ## Proof
178
192
 
193
+ - **Implement the acceptance contract.** Read the issue's Acceptance Criteria and
194
+ the preflight mapping. Reuse sufficient tests and add missing assertions at the
195
+ lowest level that exercises the required behavior. Ensure CI selects and executes
196
+ them in the assigned lane. Return test/criterion references and pending CI or manual
197
+ obligations in the existing result; the coordinator qualifies acceptance.
179
198
  - **Make diagnostic failures executable.** Reuse the existing test runner/assertions.
180
199
  A standalone probe exits nonzero for an unexpected exception, failed assertion or
181
200
  result outside the expected contract. A catch used to add context rethrows or sets
@@ -226,12 +245,11 @@ workers those local facts rather than copying the old transcript. Keep all progr
226
245
  failure ([expire.md](expire.md#infrastructure-failures)): one bounded
227
246
  investigation that fixes what the run can; a shared blocker issue only
228
247
  when the cause stays unfound or its fix is human-only. Keep the rest moving.
229
- - Keep `proof.physical` and integrated release acceptance out of the unit's
230
- acceptance. A device campaign, all-ABI or signed build, or cross-feature
231
- journey the spec or repository assigns to a release or campaign gate runs
232
- at that gate: never rebuild it in the unit. Report it as pending in the
233
- result; the coordinator records it once in its owning issue, never as
234
- passed.
248
+ - Keep `proof.physical` and explicitly assigned later release acceptance pending
249
+ at their named gate and owning issue. Build the automated tests the current issue
250
+ requests even when CI runs them as a campaign. If the current issue requests the
251
+ campaign's result, test implementation alone is not completion. Report manual or
252
+ unavailable checks as pending, never passed.
235
253
 
236
254
  ## Scheduling
237
255
 
@@ -384,11 +402,15 @@ parent another child holds.
384
402
  line's PRs bottom first (`--base <targetBranch>` when it is not the default
385
403
  branch); with the Mergify stack hooks installed, push with the `mergify`
386
404
  skill's `stack-push.mjs` instead. Keep the body to one short record:
387
- `Closes #<issue>`, the behavior delivered, the checks run with their
405
+ the issue link, the behavior delivered, the checks run with their
388
406
  results, and any outstanding blocker or pending obligation as an issue
389
407
  link; add the parent PR in `stack` and `chain` mode. CI posts its own run link; cite
390
408
  CI-generated artifacts where provenance is required, never hashes or
391
409
  logs copied by hand.
410
+ Use `Closes #<issue>` only when merging this PR will satisfy that issue's own
411
+ acceptance contract. With outstanding manual or post-merge acceptance, use
412
+ `Refs #<issue>` in both the PR body and commit message so merging automation
413
+ does not close the original issue. The coordinator closes it after acceptance.
392
414
  3. Record the PR URL and `headSha`; once the code is done, start review while CI runs. Mark the
393
415
  PR ready only when review passes and CI is green on the same HEAD
394
416
  ([ci.md](ci.md)).
@@ -155,6 +155,12 @@ Example: epic #12's #20 (signed release and go/no-go) and #21
155
155
  (physical acceptance) stay out of the plan; the run ends when its code units
156
156
  land instead of waiting on them.
157
157
 
158
+ An automated browser or emulator acceptance campaign is implementable work, including
159
+ when it proves already-merged features. Include its tests, CI execution and requested
160
+ results in scope. For mixed automated/manual criteria, keep the automation unit and
161
+ record the human-only remainder with its owner; report the original issue incomplete
162
+ until that remainder passes. Exclusion records a pending obligation, not acceptance.
163
+
158
164
  ## 4. Assess the plan
159
165
 
160
166
  Follow [exploration.md](exploration.md#choose-the-owner) on the provisional
@@ -11,10 +11,10 @@ restate its rules in the brief beyond the two below.
11
11
  - Start a fresh reviewer conversation after each completed review round; the existing
12
12
  scope script still chooses delta/full/skip, so freshness adds no review round or test
13
13
  campaign. Give it retained records and code evidence as claims to verify, not an
14
- implementer transcript. Launch it normally and keep its attempt reference as
15
- `reviewSession`, separate from `implementationOwner`, so an unfinished same-HEAD round
16
- can continue in that saved conversation; `retain_session` is optional protection, not
17
- what makes it continuable. A round after a completed review is a fresh conversation.
14
+ implementer transcript. Launch it normally and keep its `sessionId` and latest attempt
15
+ `runId` as `reviewSession`, separate from `implementationOwner`, so an unfinished
16
+ same-HEAD round can continue in that saved session; a round after a completed review is a
17
+ fresh conversation.
18
18
  - Reviewer model: a different id from the implementer's
19
19
  ([preflight.md](preflight.md#1-model-slots)). Launch the reviewer with the
20
20
  plan's recorded reviewer fill — its `launch`, `instructions`, `selection` and
@@ -126,23 +126,22 @@ the unfinished work rather than repeating the whole assignment; preserve complet
126
126
  valid passes. A wrong HEAD or invalid scope must be corrected, not carried as
127
127
  completed proof.
128
128
 
129
- On Pi, use `subagent_resume({id: reviewSession.runId, prompt: <unfinished work>})`
130
- when that attempt completed as a process and its saved conversation is available;
131
- update only its attempt reference, keeping this review's round, HEAD and counter.
132
- A killed/lost attempt or an unavailable continuation follows replacement below. Once the
133
- review record is complete, the next required review is a fresh conversation. Clear an
134
- unpinned `reviewSession` directly. If it holds retention, release that protection before
135
- clearing; on failure, save its exact reference and error in `retiredSessions` before clearing
136
- so settlement can retry while the fresh review proceeds. Never use a reviewer as the
137
- implementation owner.
129
+ On Pi, use `subagent_spawn({session_id: reviewSession.sessionId, prompt: <unfinished work>})`
130
+ when that attempt completed as a process and its saved session is available; it returns a new
131
+ attempt `runId` on the same session, so record that `runId` and keep the `sessionId`, preserving
132
+ this review's round, HEAD and counter. A saved record holding only `runId` needs recovery first:
133
+ match that exact attempt in `subagent_list({all: true})` or the verified spawn receipt, continue
134
+ the session it names, and replace it with retained evidence if nothing matches; never pass the
135
+ attempt id as `session_id`. A killed/lost attempt or an unavailable continuation follows
136
+ replacement below. Once the review record is complete, the next required review is a fresh
137
+ conversation. Clear `reviewSession` when the round completes; keep a replaced reviewer's
138
+ reference in `retiredSessions` as evidence, with no release operation owed. Never use a
139
+ reviewer as the implementation owner.
138
140
 
139
141
  If that reviewer cannot continue, state why replacement is necessary, which
140
- retained evidence the replacement reads, and what it redoes before launching it.
141
- A `retentionReleased` marker on the old reference is not a reason by itself: released
142
- protection leaves the saved conversation in place, so try it again before replacing it.
143
- While an old reference is still worth resuming or still needs release, keep it as an entry
144
- in `retiredSessions` ([task-plan.md](task-plan.md#shape)) rather than dropping it; a later
145
- release of the new session does not release the old conversation. The replacement reviews every pass with `tier: "full"`. Keep the round number,
142
+ retained evidence the replacement reads, and what it redoes before launching it. A
143
+ `retentionReleased` field on an old reference is inert history, not a replacement reason.
144
+ The replacement reviews every pass with `tier: "full"`. Keep the round number,
146
145
  `fixRound`, unit `attempt` and earlier round files; incompleteness neither resets
147
146
  history nor counts as progress. Launch the replacement from the same recorded
148
147
  reviewer fill, in the same structured launch arguments as [the brief](#brief)
@@ -157,7 +157,13 @@ and substitute nothing.
157
157
 
158
158
  **A blocked result ends the run.** `ok: false` — no resolver, no capabilities,
159
159
  a declined request, an unadvertised launch control, a missing native selection —
160
- means report its `code` and `reason` and start nothing. Never reuse an earlier
160
+ means report its `code` and `reason` and start nothing. An unsupported control
161
+ required by the fresh-launch fill is the same block. A missing continuation selector
162
+ alone makes the saved conversation unavailable: report the active schema and use the
163
+ [explicit evidenced replacement](implementation.md#implementation-owner) from the
164
+ authorized fresh-launch fill. It does not block other runnable units. Refreshing a stale
165
+ runtime (`/reload`) is the user's action; never fabricate a call or install/update the
166
+ harness mid-run. Never reuse an earlier
161
167
  pick, never fall back to the skill-owned catalog, and never let the reviewer share
162
168
  the implementer's model id: the catalog enforces independence, and re-picking a
163
169
  replacement here would silently break it.
@@ -92,9 +92,9 @@ Fleet `status`: `pending`, `in-flight`, `succeeded`, `failed`,
92
92
  | `attempt`, `retries`, `escalations` | Attempt number; cycle counts; escalation-model attempts |
93
93
  | `worker`, `workerSince`, `clock` | Slot identifier of any worker running for the unit (implementer, reviewer, fix), `null` when none; when that worker started (ISO time, for [stuck-worker checks](expire.md#waits)); attempt and cumulative wall time |
94
94
  | `workerKind` | `implement`, `fix`, or `review`, set with `worker`; the [live-capacity scheduler](implementation.md#live-capacity) (`next-actions.mjs`) prints `worker-kind` for any other kind or none. An infrastructure diagnosis or a test-first worker is a `fix` worker. The explorer is the `explore` fleet row's worker, never a unit's; a merge-queue watcher is not a worker |
95
- | `implementationOwner` | Optional saved implementation conversation: `{runId, sessionId?, cwd?, kind?, retentionReleased?}`. `runId` is its latest attempt; `kind` is `implement` (default) or `fix`, never `review`; `cwd`, when recorded, matches `workspace`. Save spawn/resume receipts here, independently of `worker`; a parked owner occupies no slot. The scheduler emits `owner-resume` for a usable owner or an explicit `ownerUnavailable` reason for replacement; `retentionReleased: true` only records that optional cleanup protection lapsed, so it never makes the owner unusable and the saved conversation stays the resume target while the harness holds it. Old plans remain readable. See [ownership](implementation.md#implementation-owner). |
96
- | `reviewSession` | Optional `{runId, sessionId?, head, round, retentionReleased?}` for the current unfinished review. Keep it only for same-HEAD/same-scope continuation, and clear it when that round completes so the next completed-review round starts fresh. A `retentionReleased` marker is history, not a reason to replace: try the same round's saved conversation while it exists. It is never an implementation owner or a slot reservation. |
97
- | `retiredSessions` | Optional references kept beside a replaced implementation owner or unfinished reviewer: `{runId, sessionId?, kind, retentionReleased?, reason?}`. Only for a conversation still worth resuming or still holding protection that must be released later; an ordinary resume or replacement needs no entry here, and a later release of the new session does not release an older conversation. |
95
+ | `implementationOwner` | Saved implementation conversation: `{sessionId, runId?, cwd?, kind?}`. `sessionId` is the native session to continue and is what `subagent_spawn({session_id})` takes; `runId` is that session's latest attempt, never a `session_id`. `kind` is `implement` (default) or `fix`, never `review`; `cwd`, when recorded, matches `workspace`. Save the spawn receipt here, independently of `worker`; a parked owner occupies no slot. The scheduler emits `owner-resume` for a usable owner, `owner-recovery` for a legacy record that holds only an attempt id, or an explicit `ownerUnavailable` reason for replacement. `retentionReleased` on an old plan is inert history: nothing reads or releases it. Old plans remain readable. See [ownership](implementation.md#implementation-owner). |
96
+ | `reviewSession` | Optional `{sessionId, runId?, head, round}` for the current unfinished review: the same session/attempt split, continued only for the same HEAD and scope. Clear it when that round completes, so the next completed-review round starts fresh. It is never an implementation owner or a slot reservation. |
97
+ | `retiredSessions` | Optional references kept beside a replaced implementation owner or unfinished reviewer: `{sessionId?, runId?, kind, reason?}`. Only as evidence for the replacement brief and for the record; no release operation is owed. |
98
98
  | `estimatedLines` | Preflight assessment estimate |
99
99
  | `sizeCheck` | Measures, `verdict` (the size check's per-unit verdict; `stop` means held), scope and proof verdicts, split or verification path; `runWhole: true` once a recommendation to run a held unit whole is accepted |
100
100
  | `note` | SHA, expiry reason code, failure and response, or blocker; for active debugging, the immediate acceptance checkpoint, baseline/result link and next distinguishing test ([delivery progress](../SKILL.md#delivery-progress)) |
@@ -160,13 +160,21 @@ recommendation's reason; its human's words are the invocation.
160
160
  ### Worker selection on resume
161
161
 
162
162
  Distinguish resuming the workflow from continuing one saved conversation. For an ordinary
163
- same-conversation `subagent_resume`, pass its attempt ID and new feedback, omitting role,
164
- model and effort so the harness preserves its recorded recipe. The resume tool's schema
165
- may differ from spawn: do not replay a role selector it cannot accept. A required changed
166
- selection can continue only through controls both explicitly authorized and advertised by
167
- that API; otherwise record why replacement is needed and launch fresh from the required
168
- fill with its retained evidence. A resolved role default alone never authorizes a model pin.
169
- Keep the original model/effort as run evidence and preserve all review/progress counters.
163
+ same-conversation continuation call `subagent_spawn({session_id: <saved sessionId>, prompt:
164
+ <new feedback>})`: it continues that exact native session and returns a new attempt id, so omit
165
+ role, model and effort and let the harness preserve its recorded recipe. An attempt `runId` is
166
+ never a `session_id`, and no session id is invented for a record that lacks one. A batch carries
167
+ its selector per job: each job in `subagent_spawn_batch({shared, jobs})` names its own session;
168
+ the shared part does not. There is no public resume, release or retain-session call in this
169
+ contract, so never invoke one. If only the continuation selector is missing, report the
170
+ actual schema and lost continuity, then use the explicit evidenced replacement from the
171
+ authorized fresh-launch fill. If that fresh fill requires an unsupported control, the
172
+ catalog's blocked-result rule applies. `/reload` is the user's action; never install or
173
+ update the harness mid-run to gain a capability. A required changed selection can continue only through controls both explicitly
174
+ authorized and advertised by that call; otherwise record why replacement is needed and launch
175
+ fresh from the required fill with its retained evidence. A resolved role default alone never
176
+ authorizes a model pin. Keep the original model/effort as run evidence and preserve all
177
+ review/progress counters.
170
178
 
171
179
  **A fresh or replacement launch repeats the saved fill, never a reconstruction of it.** On Pi the
172
180
  launch authority stays the live role resolver ([shared-modules.md](shared-modules.md#model-slots)):