@1aboveio/skills 1.0.19 → 1.0.20

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 (81) hide show
  1. package/.codex-plugin/plugin.json +1 -1
  2. package/.codex-plugin/resources.json +143 -143
  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 +1 -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 +1 -1
  24. package/skills/cicd/github-flow/SKILL.md +1 -1
  25. package/skills/cicd/google-cloud/SKILL.md +1 -1
  26. package/skills/cicd/mergify/SKILL.md +1 -1
  27. package/skills/cicd/podman/SKILL.md +1 -1
  28. package/skills/content/article-review/SKILL.md +1 -1
  29. package/skills/content/article-to-image/SKILL.md +1 -1
  30. package/skills/content/flowchart-svg/SKILL.md +1 -1
  31. package/skills/content/image-gen/SKILL.md +1 -1
  32. package/skills/content/mermaid/SKILL.md +1 -1
  33. package/skills/content/wechat-article-writer/SKILL.md +1 -1
  34. package/skills/content/wechat-publisher/SKILL.md +1 -1
  35. package/skills/content/wechat-search/SKILL.md +1 -1
  36. package/skills/content/xai-search/SKILL.md +1 -1
  37. package/skills/core/distill-writing/SKILL.md +1 -1
  38. package/skills/core/doc-to-md/SKILL.md +1 -1
  39. package/skills/core/editorial-review/SKILL.md +1 -1
  40. package/skills/core/house-style/SKILL.md +1 -1
  41. package/skills/core/plain-language/SKILL.md +1 -1
  42. package/skills/core/polish-cn/SKILL.md +1 -1
  43. package/skills/core/reg-parser/SKILL.md +1 -1
  44. package/skills/core/terminology/SKILL.md +1 -1
  45. package/skills/core/write-doc/SKILL.md +1 -1
  46. package/skills/core/write-report/SKILL.md +1 -1
  47. package/skills/engineering/better-review/SKILL.md +5 -4
  48. package/skills/engineering/better-review/references/passes.md +15 -0
  49. package/skills/engineering/better-review/references/result.md +14 -0
  50. package/skills/engineering/e2e-test/SKILL.md +1 -1
  51. package/skills/engineering/engineering/SKILL.md +1 -1
  52. package/skills/engineering/engineering-runtime/SKILL.md +1 -1
  53. package/skills/engineering/engineering-runtime/coherence/workflow.json +13 -13
  54. package/skills/engineering/ensure-coverage/SKILL.md +1 -1
  55. package/skills/engineering/golden-path/SKILL.md +1 -1
  56. package/skills/engineering/harness-runtime/SKILL.md +1 -1
  57. package/skills/engineering/resolve-issues/SKILL.md +11 -8
  58. package/skills/engineering/resolve-issues/references/ci.md +3 -1
  59. package/skills/engineering/resolve-issues/references/delivery-progress.md +16 -0
  60. package/skills/engineering/resolve-issues/references/done.md +7 -0
  61. package/skills/engineering/resolve-issues/references/dropbox.md +31 -6
  62. package/skills/engineering/resolve-issues/references/expire.md +6 -3
  63. package/skills/engineering/resolve-issues/references/implementation.md +67 -6
  64. package/skills/engineering/resolve-issues/references/review.md +42 -9
  65. package/skills/engineering/resolve-issues/references/task-plan.md +17 -2
  66. package/skills/engineering/resolve-issues/scripts/dropbox.mjs +2 -1
  67. package/skills/engineering/resolve-issues/scripts/next-actions.mjs +79 -4
  68. package/skills/engineering/resolve-issues/scripts/review-verdict.mjs +63 -10
  69. package/skills/engineering/resolve-release/SKILL.md +1 -1
  70. package/skills/engineering/rush-issues/SKILL.md +1 -1
  71. package/skills/engineering/rush-release/SKILL.md +1 -1
  72. package/skills/engineering/test-quality/SKILL.md +1 -1
  73. package/skills/risk-compliance/compliance-audit/SKILL.md +1 -1
  74. package/skills/risk-compliance/contract-compare/SKILL.md +1 -1
  75. package/skills/risk-compliance/contract-review/SKILL.md +1 -1
  76. package/skills/risk-compliance/doc-authenticity/SKILL.md +1 -1
  77. package/skills/risk-compliance/fraud-detection/SKILL.md +1 -1
  78. package/skills/risk-compliance/payment-analysis/SKILL.md +1 -1
  79. package/skills/risk-compliance/portfolio-payment-analysis/SKILL.md +1 -1
  80. package/skills/risk-compliance/similar-domain/SKILL.md +1 -1
  81. package/skills/risk-compliance/tld-detection/SKILL.md +1 -1
@@ -369,7 +369,7 @@
369
369
  "repository": "1aboveio/ai",
370
370
  "revision": "main"
371
371
  },
372
- "contentDigest": "93ac20a3d5d41b233b13e521ba1b65d0a3e339958422a56ffad00a844656a23f",
372
+ "contentDigest": "46f0a76cadebab0a7de8dabf7a93eb194c7f41e0c872fa9c1a04dec86ee0fd88",
373
373
  "digestExcludes": []
374
374
  },
375
375
  {
@@ -382,7 +382,7 @@
382
382
  "repository": "1aboveio/ai",
383
383
  "revision": "main"
384
384
  },
385
- "contentDigest": "915715a605bf78f6f69cb8c95f7227548a6d71a6ef0ce502b5b5c5a357676d19",
385
+ "contentDigest": "e1a794446b04b5b70d356ceb9bbbe2a3c518eac486286d5905da98a3d038de65",
386
386
  "digestExcludes": []
387
387
  },
388
388
  {
@@ -395,7 +395,7 @@
395
395
  "repository": "1aboveio/ai",
396
396
  "revision": "main"
397
397
  },
398
- "contentDigest": "1ef2fd2ad328c373c7c6fe42007908766860cd8051e1807739797303aaadeae4",
398
+ "contentDigest": "451349ddb0393831abe922cd66c77dd96ea6a4bdd6950c1546e507f5d056dc84",
399
399
  "digestExcludes": []
400
400
  },
401
401
  {
@@ -408,7 +408,7 @@
408
408
  "repository": "1aboveio/ai",
409
409
  "revision": "main"
410
410
  },
411
- "contentDigest": "3c9509027191a2b2612f3905defb5ed9c47580709ba77b46c0e8433d354c4d33",
411
+ "contentDigest": "b4c6ae8cb2e708e3695330e65567aab4a301b963d86a4b6706c324fd5e56a36e",
412
412
  "digestExcludes": []
413
413
  },
414
414
  {
@@ -421,7 +421,7 @@
421
421
  "repository": "1aboveio/ai",
422
422
  "revision": "main"
423
423
  },
424
- "contentDigest": "5e419edc77397a9021a24fc9da83d07c83aa786853dcb24916d8fb2655f81ea9",
424
+ "contentDigest": "2dc4ffd9d459c1c61ff9472caf6b318bd45531995d8b8f142e775252c496b22b",
425
425
  "digestExcludes": []
426
426
  },
427
427
  {
@@ -434,7 +434,7 @@
434
434
  "repository": "1aboveio/ai",
435
435
  "revision": "main"
436
436
  },
437
- "contentDigest": "ecee12f24d18d49ec1be030e3f831c3d07a66f37b0b16aa5efef365ca381e558",
437
+ "contentDigest": "25ac49e98ce28203feccc17b4f85c67627db9c979511cca349df9dd1fe156d58",
438
438
  "digestExcludes": []
439
439
  },
440
440
  {
@@ -447,7 +447,7 @@
447
447
  "repository": "1aboveio/ai",
448
448
  "revision": "main"
449
449
  },
450
- "contentDigest": "2fbd1a9e15087045fa80b47d9b6db8695009c900c2e4aeeab71207875b071c74",
450
+ "contentDigest": "bde840d0e6ea6d333c48b47f2635c31c54e1e86a1beee21e26d5a9788c5f7977",
451
451
  "digestExcludes": []
452
452
  },
453
453
  {
@@ -460,7 +460,7 @@
460
460
  "repository": "1aboveio/ai",
461
461
  "revision": "main"
462
462
  },
463
- "contentDigest": "8c33282acdf9a7b3ba3adf46065249126efdd8669487ad7def1b4302155db3dd",
463
+ "contentDigest": "be04047cebb486d9f0b56c59705210038c13ce8f3f10c5ecf7acb361f3a56d0c",
464
464
  "digestExcludes": []
465
465
  },
466
466
  {
@@ -473,7 +473,7 @@
473
473
  "repository": "1aboveio/ai",
474
474
  "revision": "main"
475
475
  },
476
- "contentDigest": "e612b320be1b3aee539a26494e2048e0bbdc1947166fa4cffbdfe8085a64b50a",
476
+ "contentDigest": "d7c62210fdfdfa3504a056a8977aa3b67370b65f92d5d32e001fd394fabd44bd",
477
477
  "digestExcludes": []
478
478
  },
479
479
  {
@@ -486,7 +486,7 @@
486
486
  "repository": "1aboveio/ai",
487
487
  "revision": "main"
488
488
  },
489
- "contentDigest": "53732d354995ca40c0325b2f860a4facf2e79b9d6d373fbc76a5ce5b3a1f1e29",
489
+ "contentDigest": "f1acfff02ba2ddb0e0d4ffbcd9b5411a394b3b38e9a48ab2ab01ba46fb9bed1f",
490
490
  "digestExcludes": []
491
491
  },
492
492
  {
@@ -499,7 +499,7 @@
499
499
  "repository": "1aboveio/ai",
500
500
  "revision": "main"
501
501
  },
502
- "contentDigest": "61f8b7f04887b86338984f03527fdaf66ec90df7ff89c19ee9dca6f362fe212a",
502
+ "contentDigest": "cd858ed046f7c4ecb10817307e906a8057db5b8fb5a8c8e9334ef04aff34b9b2",
503
503
  "digestExcludes": []
504
504
  },
505
505
  {
@@ -512,13 +512,13 @@
512
512
  "repository": "1aboveio/ai",
513
513
  "revision": "main"
514
514
  },
515
- "contentDigest": "ad9bdbfbaeb4c575f8fad5b53367403096594aafce8e686926ddb734c185155a",
515
+ "contentDigest": "c3cbfef912ac7448710a7ed5a5014a76928d0350e2032c264c3e0a3212468b6d",
516
516
  "digestExcludes": [
517
517
  "coherence/workflow.json"
518
518
  ]
519
519
  }
520
520
  ],
521
- "releaseIdentity": "2ed547516d442d0bfad21952001956420f71a972849049507530f80ad16eda83",
521
+ "releaseIdentity": "b2e273424d4ceb9a24d78ad163daeb516538defae3f7e6ebea4f59edb055df9a",
522
522
  "lifecycleAuthority": "native-skills-cli",
523
523
  "repairRecipe": {
524
524
  "id": "engineering-workflow-dependency-first",
@@ -2,7 +2,7 @@
2
2
  name: ensure-coverage
3
3
  description: "Define or audit behavior-first test criteria — ACs, required test levels, mock/integration/E2E policy — across three axes: breadth (Coverage Ledger), depth (over-mocking), presentation (perceivability of browser surfaces). NOT judging whether a single test is any good (test-quality), authoring browser tests (e2e-test), reviewing a PR (better-review), or delivering issues (resolve-issues)."
4
4
  disable-model-invocation: true
5
- release-version: 0.49.1
5
+ release-version: 0.50.0
6
6
  ---
7
7
  **Updates:** Once/session run `node <skill-base-dir>/release-check.mjs`.
8
8
  # Ensure Coverage
@@ -3,7 +3,7 @@ name: golden-path
3
3
  description: "Golden-path E2E: the short list of user journeys whose failure blocks a release, kept in a repo as one contract (golden-paths.json) with a generated GOLDEN_PATHS.md and a generated GitHub Actions workflow, and run against a local build or a deployed URL for an ALIVE/DEAD verdict. Use to set golden paths up in a repo ('init golden paths', 'add golden-path CI'), to migrate an older smoke.manifest.json or a hand-built smoke setup ('audit', 'migrate smoke'), to add, change, or remove a golden path, to ask 'is the build alive?' or run them before a PR or release, or when a change touches a flow listed in GOLDEN_PATHS.md. NOT for writing the Playwright specs themselves (e2e-test), deciding what a change must prove (ensure-coverage), or general workflow YAML (github-actions)."
4
4
  dependencies:
5
5
  - e2e-test
6
- release-version: 0.49.1
6
+ release-version: 0.50.0
7
7
  ---
8
8
  **Updates:** Once/session run `node <skill-base-dir>/release-check.mjs`.
9
9
  # Golden path
@@ -3,7 +3,7 @@ name: harness-runtime
3
3
  description: Internal import-only library shared by first-party engineering packages. Not a workflow skill; never select or invoke it as a user capability.
4
4
  disable-model-invocation: true
5
5
  user-invocable: false
6
- release-version: 0.49.1
6
+ release-version: 0.50.0
7
7
  ---
8
8
  **Updates:** Once/session run `node <skill-base-dir>/release-check.mjs`.
9
9
  # Harness Runtime
@@ -8,7 +8,7 @@ dependencies:
8
8
  - better-review
9
9
  - golden-path
10
10
  - harness-runtime
11
- release-version: 0.49.1
11
+ release-version: 0.50.0
12
12
  ---
13
13
  **Updates:** Once/session run `node <skill-base-dir>/release-check.mjs`.
14
14
  # Resolve issues
@@ -63,8 +63,8 @@ preflight: ready label -> model fills -> plan draft
63
63
  -> when a unit's code is done, for that unit:
64
64
  rebase on its parent (stack, chain) or the target (wait)
65
65
  -> independent review, while CI runs -> review-verdict.mjs decides:
66
- `pass`: review passes (P2 goes to the dropbox, never fixed
67
- here; P3 is skipped); `fix`: only its fixBrief (P0/P1),
66
+ `pass`: review passes (route P2 by its contribution to delivery;
67
+ P3 is skipped); `fix`: its fixBrief (P0/P1) plus explicitly selected supporting P2,
68
68
  push, re-review; `review-again`: review again
69
69
  -> CI red: fix, push; after a passing review, carry it (no reviewer)
70
70
  -> review passed and CI green on one HEAD: mark ready
@@ -116,8 +116,10 @@ Read each procedure right before its stage; never substitute your own.
116
116
  - **The human.** Ask once, at the approval. Record every decision, correction, and scope change in
117
117
  `decisions` at once, and each standing instruction in `standingOrders`; re-read the standing orders on
118
118
  resume and before any push, enqueue, data write, or deletion. Default merge mode is `autonomous`.
119
- - **Proof.** Treat producer reports as claims until the reviewer or CI checks them. A check that exits 0 needs no
120
- further evidence. A unit owes coding acceptance only: its criteria at its `proof.level` plus the required CI
119
+ - **Proof.** Treat producer reports as claims until the reviewer or CI checks them. Tests and diagnostic probes
120
+ encode failure in their exit status under [Proof](references/implementation.md#proof); printing an exception
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
121
123
  on its final HEAD. Integrated release acceptance (a device or system campaign the spec or repository assigns
122
124
  to a release or campaign gate) runs at that gate, never per unit; the handback links its owning issue. Produce
123
125
  no evidence documents; the plan, findings, and reviews are the only records.
@@ -169,7 +171,8 @@ efforts are run metadata, never a question.
169
171
  ### 2. Implement and open the PR
170
172
 
171
173
  Give each unit a branch, its prepared workspace, and an implementer with its findings entry
172
- and parents' contracts; state outcome and validation, not method. Refill
174
+ and parents' contracts; retain its [implementation owner](references/implementation.md#implementation-owner)
175
+ through review/CI fixes, separately from its active worker slot. State outcome and validation, not method. Refill
173
176
  slots at once. At a unit's first coherent commit its PR opens as a draft, so CI
174
177
  starts and the work is safe; later work goes to the same PR (in a Mergify stack
175
178
  repository, amend the one commit); review starts when its code is done
@@ -178,13 +181,13 @@ the unit's own PR branch need no approval.
178
181
 
179
182
  ### 3. Review
180
183
 
181
- Spawn one `better-review` reviewer once the unit's code is done, unless a
184
+ Spawn one fresh `better-review` reviewer once the unit's code is done, unless a
182
185
  trusted complete result for that HEAD is posted on the PR; it runs alongside
183
186
  CI. From round 2, carry a HEAD that follows a pass, else pick the tier: a
184
187
  carry or skip writes its record and spawns no reviewer ([review.md](references/review.md#tier-then-verdict)).
185
188
  Merge [GitHub reviews](references/review.md#github-reviews) into its result,
186
189
  run `review-verdict.mjs`, and follow the `verdict` it prints (exit 0; 2 only if it could not run): `pass`; `fix`, give the
187
- `fixBrief` (P0/P1 only) to a fix worker as its `action` says, then review
190
+ `fixBrief` (P0/P1), its retained reproducers and any selected supporting P2 under [dropbox routing](references/dropbox.md#supporting-p2-work) to the implementation owner as its `action` says, then review
188
191
  again; `review-again`; `handback`, defer the PR with its open findings; `wait`,
189
192
  request the awaited re-review; `decide`, answer the `decide` file
190
193
  ([expire.md](references/expire.md#decide-before-you-defer)) and rerun with `--decision`.
@@ -105,7 +105,9 @@ provider shows that PR merged.
105
105
 
106
106
  Clean that unit's workspace and resources, then finish it, in every scheduler
107
107
  mode: `next-actions.mjs` prints `cleanup-workspace` until its cleanup settles.
108
- First record the intent through the [checkpoint mechanism](task-plan.md#checkpoints) (`lifecycle.cleanup`
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`
109
111
  `{state: applying, headSha: <the unit's headSha>}`), then run:
110
112
 
111
113
  ```bash
@@ -13,6 +13,12 @@ units keep their own checkpoints and continue in parallel within actual resource
13
13
  observation that would distinguish the remaining causes. Run the relevant host,
14
14
  integration or device check before another broad acceptance cycle. After a correction,
15
15
  run affected checks and the required delivery checks, not extra assurance work.
16
+ - **Keep the repair's contract intact.** Reproduce the reported input/state and check
17
+ the observable result the existing criteria require. Reuse sufficient checks; an added
18
+ regression establishes the condition that reaches the failure. If that operation exposes
19
+ another failure of the same contract, continue the repair while preserving earlier
20
+ assertions. Return when affected criteria and required local checks pass, or an existing
21
+ stop/handback condition applies. This adds no fixed journey or test layer.
16
22
  - **Justify infrastructure before adding it.** State which existing criterion requires
17
23
  it, why the current path cannot provide that proof, and the smallest alternative.
18
24
  Record the choice in the existing decision/note, within current authorization. Routine
@@ -39,6 +45,13 @@ issue or automatic scheduler gate. They do not waive required validation.
39
45
 
40
46
  ## Every brief contains
41
47
 
48
+ Use the full checklist for a fresh or replacement worker. For a retained conversation,
49
+ send the new feedback, current checkpoint, latest failure/fix brief and local evidence,
50
+ current standing orders and changed decisions, affected skill/proof pointers, and new
51
+ result path. Re-read the saved source/criteria after context loss; do not resend the original
52
+ role or whole assignment already in that session. This shorter continuation keeps the same
53
+ acceptance bar, launch-authority rules and history; it is not a new setup or proof campaign.
54
+
42
55
  - the source and criteria, as a file already in the run directory
43
56
  - the plan's `standingOrders`, verbatim, and the decisions that answer this unit's questions
44
57
  - absolute run, workspace, and findings paths; for implementers, the unit's
@@ -51,6 +64,9 @@ issue or automatic scheduler gate. They do not waive required validation.
51
64
  test; retain the same checkpoint/history when changing workers
52
65
  - for a fix after a failed check or case, the last `failure` block (case, step, error,
53
66
  evidence path) verbatim, so the worker starts from the cause
67
+ - for review fixes, the generated brief's `reproducers` with their original triggers,
68
+ source rounds/HEADs, command, workspace-relative cwd, expected result and retained evidence;
69
+ run them against the candidate, rather than replaying in the reviewer's old checkout
54
70
  - a concise worker-specific contract: business outcome and context, full acceptance,
55
71
  security and quality requirements, and principles relevant to the assigned work; a
56
72
  reviewer gets review.md's two rules instead. Do not forward coordinator scheduling
@@ -15,6 +15,13 @@ 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.
24
+
18
25
  Clean every delivered unit's workspace and resources before the report, in every
19
26
  scheduler mode ([workspaces.md](workspaces.md#cleanup-after-delivery-before-finish)).
20
27
  Its `lifecycle.cleanup` is `complete`, or `retained` with the current `headSha`
@@ -8,8 +8,9 @@ Workers report problems; you route them.
8
8
 
9
9
  ## Route every problem
10
10
 
11
- Ask these in order; the first yes decides. Never route by the stated P-number:
12
- labels miss in both directions.
11
+ Skip P3: no repair, dropbox entry or follow-up issue. For the remaining problems,
12
+ ask these in order; the first yes decides. A P2 label alone does not decide whether
13
+ work supports this delivery.
13
14
 
14
15
  1. **Could it hurt someone now?** Security, auth, tenancy, money, data loss,
15
16
  a failure users see, a flake that knocks other PRs out of the queue, or a
@@ -19,15 +20,17 @@ labels miss in both directions.
19
20
  Example: a reviewer notes, as P2, that a provider webhook amount is parsed
20
21
  without a check, "unreachable today". The input is external: file it now.
21
22
  2. **Does it stop this unit from being finished or proven?** Small and in the
22
- unit's files: fix it in the unit. A question: take its automatic answer
23
+ unit's files: fix it in the unit; for P2, first record the explicit selection
24
+ under [Supporting P2 work](#supporting-p2-work). A question: take its automatic answer
23
25
  ([preflight.md](preflight.md#never-block-on-the-human)); defer it only when it is human-only. Anything else outside the unit's files, code or
24
26
  environment: an [infrastructure failure](expire.md#infrastructure-failures).
25
27
  Example: the shared test helper the unit's tests need is broken on the
26
28
  target: an infrastructure failure.
27
29
  3. **Did this unit cause it?** Fix it in the unit, however small; it costs
28
30
  less now than as an issue. `dropbox.mjs check` decides (`inDiff` true inside the
29
- unit's diff), and `add` refuses an implementer entry there. A reviewer's
30
- P2 never starts a fix round: it stays in the dropbox marked `inDiff`.
31
+ unit's diff), and `add` refuses an implementer entry there. For a reviewer's P2,
32
+ `inDiff` records location, not repair authorization: apply the supporting-work
33
+ test below; otherwise keep it in the dropbox.
31
34
  4. **Would fixing it change nothing** for behavior or for a reader? A style
32
35
  nit, a smell no documented rule names, hardening the
33
36
  code shows cannot trigger (internal input only, and this unit adds no new
@@ -44,6 +47,28 @@ labels miss in both directions.
44
47
  Record a blocking relation with `--blocks <#n | owner/name#n | issue URL>`:
45
48
  the posted issue says `Blocks #n` so a later run takes it first.
46
49
 
50
+ ## Supporting P2 work
51
+
52
+ Select a P2 for the current unit only when it directly enables an existing
53
+ authorized outcome, agreed verification or delivery. For example, include the
54
+ unit's new regression module in its existing CI test list. Nearby cleanup,
55
+ optional hardening and unrelated performance work stay deferred, even inside the diff.
56
+
57
+ Record the finding/dropbox id, existing criterion and concrete reason in the plan's
58
+ `decisions`, and include that selection in the implementer or fix brief. Keep P2
59
+ nonblocking: its severity alone changes no verdict, fix counter or acceptance bar.
60
+ Use the existing implementation or fix work when available. When review already
61
+ passed, return the unit to implementation for the selected repair while retaining
62
+ its passed review. After the repair push, use the existing post-pass carry and final
63
+ CI rules; it does not reopen the blocking review loop.
64
+
65
+ After the selected work is verified, record its SHA and check result in the unit's
66
+ existing result/note and mark the dropbox entry with `--drop "fixed on <sha>; <check
67
+ and result>"` so it is not filed as unfinished work. Leave the original review
68
+ unchanged. If the work is not completed, retain its pending entry and report it
69
+ truthfully. Shared-environment changes and changes to required checks keep their
70
+ existing authorization boundaries.
71
+
47
72
  ## Commands
48
73
 
49
74
  ```bash
@@ -56,7 +81,7 @@ node $D add --dropbox <run>/dropbox.json --unit <id> --source implementer \
56
81
  --summary "<one line: what is wrong>" [--pr <url>] [--blocks <issue>] \
57
82
  --git <workspace> --base <review base>
58
83
  # coordinator, after every review round, before the verdict: adds every P2 (P3 is skipped),
59
- # then route each new entry; questions 1, 4, 5 change it:
84
+ # then route each new entry, including any explicitly selected supporting work:
60
85
  node $D from-review --dropbox <run>/dropbox.json --review <run>/reviews/<unit>-r<N>.json \
61
86
  --pr <url> --git <unit review clone> --base <review base>
62
87
  node $D post --dropbox <run>/dropbox.json --repo <owner/name> --ids D3 # 1: file now
@@ -235,15 +235,18 @@ missing, or names a step without a reason.
235
235
  | Review: `review-verdict.mjs` verdict `fix` | Follow its `action` ([review.md](review.md#fix-loop)). |
236
236
  | Review: `review-verdict.mjs` verdict `handback` (`not-converging`) | Stop fixing; mark the unit `blocked` (`blockedReason: review-handback`) and defer the PR with its open findings on its issue. |
237
237
  | Review: `review-verdict.mjs` verdict `decide`, or a worker's `decisionNeeded` | [Decide before you defer](#decide-before-you-defer). |
238
- | CI: a fix cycle without progress | Treat the failing check as the failing test: the next fix worker runs on the escalation model with that check as its only target. 2 cycles in a row without progress: `blocked` (`blockedReason: retry-ci`), deferred on its issue. |
238
+ | CI: a fix cycle without progress | Treat the failing check as the failing test: continue the implementation owner with the required escalation fill and that check as its only target, using the [continuation/replacement selection](task-plan.md#worker-selection-on-resume) rather than fabricating a pin. 2 cycles in a row without progress: `blocked` (`blockedReason: retry-ci`), deferred on its issue. |
239
239
  | Too big for one attempt | Resume in the kept workspace while each resume makes [progress](#retry-by-failure-mode); after 2 in a row without verified checkpoint/failure-count progress, draft a split in `<run>/splits/`, file it into the spec's tree, and run the slices the sync adds ([preflight.md](preflight.md#put-every-filed-issue-in-the-tree)). |
240
240
  | A required proof the unit has no environment for yet | The unit builds it; see [Proof stays with its unit](#proof-stays-with-its-unit). |
241
241
  | Dependency | Fix the edge; resume when runnable. |
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 in the kept workspace with the findings entry, never the old
246
- transcript. Record a queue stall with the
245
+ Continue the retained owner in the kept workspace with the current checkpoint, findings
246
+ and failure evidence. If its process state or required selection prevents continuation,
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
249
+ rather than an old transcript. Keep the response limits and history above. Record a queue stall with the
247
250
  provider pending as a wait and watch again. End the run only when
248
251
  `next-actions.mjs`, invoked with [live capacity](implementation.md#live-capacity), prints `finish`, and never claim the spec complete.
249
252
 
@@ -53,6 +53,55 @@ independent clone prepared before its first spawn; after that, never pass
53
53
  `git_clone_workspace:true` again, and use `sandbox:false` only when the caller
54
54
  accepts unrestricted writes.
55
55
 
56
+ ## Implementation owner
57
+
58
+ Keep one implementation conversation per unit through local proof, independent review,
59
+ review fixes and CI repairs. Its saved conversation outlives the active worker slot: launch
60
+ 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.
79
+
80
+ A missing history/workspace, an unusable saved owner, or an owner that cannot continue
81
+ 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,
103
+ keeping its round and existing full-review fallback.
104
+
56
105
  ## Brief
57
106
 
58
107
  Add to SKILL.md's brief list: whole-spec context and neighboring unit
@@ -83,8 +132,8 @@ handback step. Never edit `findings.json`.
83
132
 
84
133
  ## Per-unit loop
85
134
 
86
- On `resume` (in flight, no worker, code not done), restart the unit's
87
- implementer in its kept workspace with the brief and its findings entry.
135
+ On `resume` (in flight, no worker, code not done), continue the unit's
136
+ [implementation owner](#implementation-owner) in its kept workspace with the current brief.
88
137
 
89
138
  1. **Implement:** change only the unit's scope; commit coherent progress.
90
139
  2. **Validate:** prove the criteria with the repository's checks: the
@@ -119,13 +168,25 @@ implementer in its kept workspace with the brief and its findings entry.
119
168
  not prohibit long local tests or builds needed for the assigned validation.
120
169
 
121
170
  After 2 fix cycles without progress, or a stuck or late worker, follow
122
- [expire.md](expire.md). Start the next worker in the same workspace with the
123
- findings entry, the failing command and its output, and `git diff <base>`,
124
- never the old
125
- transcript.
171
+ [expire.md](expire.md). Apply the next response through the retained owner where its
172
+ completed conversation and required launch controls permit continuation. A replacement
173
+ 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
175
+ workers those local facts rather than copying the old transcript. Keep all progress counters.
126
176
 
127
177
  ## Proof
128
178
 
179
+ - **Make diagnostic failures executable.** Reuse the existing test runner/assertions.
180
+ A standalone probe exits nonzero for an unexpected exception, failed assertion or
181
+ result outside the expected contract. A catch used to add context rethrows or sets
182
+ a nonzero exit; log capture and cleanup preserve that failure status. For shell
183
+ pipelines, preserve the tested command's failure, for example with `set -o pipefail`.
184
+ An expected-exception test passes only when it asserts the expected exception and
185
+ relevant contract details; no exception or the wrong exception fails. Assess the
186
+ process status under that contract, rather than having the model classify log text.
187
+ Coordination commands that exit 0 to return a structured verdict keep that protocol;
188
+ read their verdict as documented. Record the command, status and failing step in
189
+ the existing result/failure fields; no new harness or evidence document is needed.
129
190
  - Prove `browser` and `emulator` levels with the existing end-to-end suite;
130
191
  with none, the unit builds the journey its proof needs
131
192
  ([expire.md](expire.md#proof-stays-with-its-unit)).
@@ -8,6 +8,13 @@ restate its rules in the brief beyond the two below.
8
8
 
9
9
  ## Brief
10
10
 
11
+ - Start a fresh reviewer conversation after each completed review round; the existing
12
+ scope script still chooses delta/full/skip, so freshness adds no review round or test
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.
11
18
  - Reviewer model: a different id from the implementer's
12
19
  ([preflight.md](preflight.md#1-model-slots)). Launch the reviewer with the
13
20
  plan's recorded reviewer fill — its `launch`, `instructions`, `selection` and
@@ -119,9 +126,23 @@ the unfinished work rather than repeating the whole assignment; preserve complet
119
126
  valid passes. A wrong HEAD or invalid scope must be corrected, not carried as
120
127
  completed proof.
121
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.
138
+
122
139
  If that reviewer cannot continue, state why replacement is necessary, which
123
140
  retained evidence the replacement reads, and what it redoes before launching it.
124
- The replacement reviews every pass with `tier: "full"`. Keep the round number,
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,
125
146
  `fixRound`, unit `attempt` and earlier round files; incompleteness neither resets
126
147
  history nor counts as progress. Launch the replacement from the same recorded
127
148
  reviewer fill, in the same structured launch arguments as [the brief](#brief)
@@ -221,10 +242,10 @@ the PR author; `github-reviews.mjs` reads them and decides what blocks.
221
242
 
222
243
  - **P0/P1** block (`better-review`'s severity table defines them): fix on the
223
244
  unit branch, validate, review again.
224
- - **P2** never blocks, never reaches a fix worker, and never starts a round.
225
- Its dropbox entry is its whole disposition. Route each new entry by the
226
- [dropbox questions](dropbox.md#route-every-problem): file it now, drop it,
227
- or make it a decision when one says so.
245
+ - **P2** never blocks or starts a blocking-fix round by severity alone. Route each
246
+ entry by the [dropbox questions](dropbox.md#route-every-problem); explicitly selected
247
+ [supporting P2 work](dropbox.md#supporting-p2-work) may be fixed in the unit.
248
+ Keep unrelated P2 in the dropbox; preserve the severity and review verdict.
228
249
  - **P3** is skipped: no dropbox entry, no issue, no round. A P3 that still
229
250
  reaches the result file (a posted result, an older reviewer) is ignored.
230
251
  - Dispose of every P0-P2 finding: `resolved` on the reviewed HEAD, or `deferred`
@@ -232,13 +253,24 @@ the PR author; `github-reviews.mjs` reads them and decides what blocks.
232
253
 
233
254
  ## Fix loop
234
255
 
235
- Give the fix worker only the `fixBrief`, and act on its `action`:
256
+ Give the [implementation owner](implementation.md#implementation-owner) the `fixBrief`
257
+ and act on its `action`. Keep the generated `reproducers` intact: their source rounds,
258
+ HEADs and original triggers identify earlier witnesses, not passing results on this
259
+ candidate. Read the retained cases and run against the candidate workspace at their
260
+ relative `cwd`; preserve their input/state and expected contract when adapting a checkout
261
+ path. `reproducerGaps` identifies malformed historical metadata without supplying a runnable
262
+ command: inspect the original record, establish a valid candidate-local case, and report any
263
+ remaining gap without rewriting history. Findings without an executable witness retain their
264
+ existing requirement evidence.
265
+ Add only supporting P2
266
+ explicitly selected under [dropbox routing](dropbox.md#supporting-p2-work), with the
267
+ recorded criterion and reason; the generated blocker list remains P0/P1 only.
236
268
 
237
269
  | `action` | When | Fix worker |
238
270
  |---|---|---|
239
271
  | `fix` | first blocking round | Make the smallest complete fix for each finding's `rule` and close every applicable row in its `paths`; do not require centralization. |
240
272
  | `test-first` | a P0/P1 survived the last fix | On the escalation model, for each `recurring` finding, before changing code: name the broken rule and its concrete open paths, reuse sufficient tests and add focused cases for missing proof, and see the open cases fail. Fix the rule until the applicable cases pass. A table-driven test may cover several paths; no new architecture is required. |
241
- | `one-by-one` | the last fix introduced new P0/P1 | One fix worker per finding, in turn, each with the smallest change that closes every row of its `paths` at the rule's owner. |
273
+ | `one-by-one` | the last fix introduced new P0/P1 | The implementation owner fixes findings sequentially in its continued session, each with the smallest change that closes every row of its `paths` at the rule's owner. |
242
274
 
243
275
  **Fix the broken rule on every applicable path, without requiring a refactor.**
244
276
  A shared owner is useful when it makes the fix smaller and clearer; it is not a
@@ -251,8 +283,9 @@ different-person sign-in cases without inventing unrelated event combinations.
251
283
  Have each fix worker run the checks its change affects and return the
252
284
  commands and results; push, and let CI run. Then pick the new HEAD's
253
285
  [tier](#tier-then-verdict): a fix is delta or full, never skip, so spawn the
254
- next round's reviewer with the previous result file and the `fixBrief`. Deferred P2
255
- return only if now rated P1. Record `reviewedHead` only on a `pass` verdict. A later
286
+ next round's fresh reviewer with the previous result file and the `fixBrief`, naming any
287
+ supporting P2 changed in that patch. Deferred P2 return as findings only if now rated
288
+ P1; evaluate changed supporting work as part of the fix diff. Record `reviewedHead` only on a `pass` verdict. A later
256
289
  commit, a CI fix included, needs its own `pass`: a [carry](#carry-after-a-pass) when this round passed.
257
290
 
258
291
  A `decide` verdict pauses the fix loop on a question: a spec finding came back after a
@@ -92,6 +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
98
  | `estimatedLines` | Preflight assessment estimate |
96
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 |
97
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)) |
@@ -142,7 +145,10 @@ what a later launch of the slot repeats; a pair of model ids is not.
142
145
  (`open`, `resolved`, `deferred`), `resolvedHead`, `dropboxId` or `followUpUrl`. Copy them
143
146
  from `review-verdict.mjs`: on `fix` its `fix` list as `open`; on `pass` its
144
147
  `deferred` list as `deferred` and every open P0/P1 as `resolved`. Never defer
145
- a P0/P1.
148
+ a P0/P1. For selected [supporting P2 work](dropbox.md#supporting-p2-work), record the
149
+ selection in `decisions`; after verification, mark its plan finding `resolved` with
150
+ `resolvedHead` and put the check/result in the unit's existing note/result. Preserve
151
+ the original review and retire its pending dropbox entry as documented there.
146
152
 
147
153
  `decisions` entry: id, timestamp, the human's words, what it changes,
148
154
  `supersedes` when it replaces one, and `answers`: the run-relative file of each
@@ -153,7 +159,16 @@ recommendation's reason; its human's words are the invocation.
153
159
 
154
160
  ### Worker selection on resume
155
161
 
156
- **A launch repeats the saved fill, never a reconstruction of it.** On Pi the
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.
170
+
171
+ **A fresh or replacement launch repeats the saved fill, never a reconstruction of it.** On Pi the
157
172
  launch authority stays the live role resolver ([shared-modules.md](shared-modules.md#model-slots)):
158
173
  its `launch` is `{ role }` unless an explicit task override or this host's own
159
174
  preference asked for a model or effort, and a resolved role default is never
@@ -20,7 +20,8 @@
20
20
  // --line, any change to the file counts)? Prints { inDiff, do }: `inDiff` true means fix it in this unit.
21
21
  // add: append one entry; the coordinator is the only writer. An implementer entry inside the
22
22
  // unit's diff is refused (`refused` in the output) because the unit caused it. A review entry inside the diff
23
- // is kept and marked `inDiff`: the review loop never fixes P2. The same location, kind and
23
+ // is kept and marked `inDiff`: the coordinator selects supporting work by the delivery
24
+ // criterion, not location or severity alone. The same location, kind and
24
25
  // summary (or, for a review, the same unit and finding id) is one entry. `--decision` records
25
26
  // a question for the human: never posted, listed in the handback. Prints { id, duplicate, inDiff }.
26
27
  // from-review: add every P2 in a review result that has no followUpUrl or dropboxId, and