@1aboveio/skills 1.0.16 → 1.0.17

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 (82) 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 +9 -7
  6. package/skills/app-dev/android-development/references/feature-work.md +3 -2
  7. package/skills/app-dev/android-development/references/gotchas.md +13 -0
  8. package/skills/app-dev/android-development/references/setup.md +8 -5
  9. package/skills/app-dev/android-development/references/ui-journeys.md +83 -11
  10. package/skills/app-dev/app-debug/SKILL.md +1 -1
  11. package/skills/app-dev/better-auth/SKILL.md +1 -1
  12. package/skills/app-dev/data-catalog/SKILL.md +1 -1
  13. package/skills/app-dev/data-quality/SKILL.md +1 -1
  14. package/skills/app-dev/ios-foundation/SKILL.md +1 -1
  15. package/skills/app-dev/monorepo/SKILL.md +1 -1
  16. package/skills/app-dev/nextjs-fullstack/SKILL.md +1 -1
  17. package/skills/app-dev/prisma-setup/SKILL.md +1 -1
  18. package/skills/app-dev/pyspark/SKILL.md +1 -1
  19. package/skills/app-dev/python-backend/SKILL.md +1 -1
  20. package/skills/app-dev/shadcn/SKILL.md +1 -1
  21. package/skills/app-dev/zod-v4/SKILL.md +1 -1
  22. package/skills/cicd/cloud-build/SKILL.md +1 -1
  23. package/skills/cicd/cloud-debug/SKILL.md +1 -1
  24. package/skills/cicd/cloud-deploy/SKILL.md +1 -1
  25. package/skills/cicd/docker/SKILL.md +1 -1
  26. package/skills/cicd/github-actions/SKILL.md +1 -1
  27. package/skills/cicd/github-flow/SKILL.md +1 -1
  28. package/skills/cicd/google-cloud/SKILL.md +1 -1
  29. package/skills/cicd/mergify/SKILL.md +1 -1
  30. package/skills/cicd/podman/SKILL.md +1 -1
  31. package/skills/content/article-review/SKILL.md +1 -1
  32. package/skills/content/article-to-image/SKILL.md +1 -1
  33. package/skills/content/flowchart-svg/SKILL.md +1 -1
  34. package/skills/content/image-gen/SKILL.md +1 -1
  35. package/skills/content/mermaid/SKILL.md +1 -1
  36. package/skills/content/wechat-article-writer/SKILL.md +1 -1
  37. package/skills/content/wechat-publisher/SKILL.md +1 -1
  38. package/skills/content/wechat-search/SKILL.md +1 -1
  39. package/skills/content/xai-search/SKILL.md +1 -1
  40. package/skills/core/distill-writing/SKILL.md +1 -1
  41. package/skills/core/doc-to-md/SKILL.md +1 -1
  42. package/skills/core/editorial-review/SKILL.md +1 -1
  43. package/skills/core/house-style/SKILL.md +1 -1
  44. package/skills/core/plain-language/SKILL.md +1 -1
  45. package/skills/core/polish-cn/SKILL.md +1 -1
  46. package/skills/core/reg-parser/SKILL.md +1 -1
  47. package/skills/core/terminology/SKILL.md +1 -1
  48. package/skills/core/write-doc/SKILL.md +1 -1
  49. package/skills/core/write-report/SKILL.md +1 -1
  50. package/skills/engineering/better-review/SKILL.md +1 -1
  51. package/skills/engineering/e2e-test/SKILL.md +1 -1
  52. package/skills/engineering/engineering/SKILL.md +1 -1
  53. package/skills/engineering/engineering-runtime/SKILL.md +1 -1
  54. package/skills/engineering/engineering-runtime/coherence/workflow.json +13 -13
  55. package/skills/engineering/ensure-coverage/SKILL.md +1 -1
  56. package/skills/engineering/golden-path/SKILL.md +1 -1
  57. package/skills/engineering/harness-runtime/SKILL.md +1 -1
  58. package/skills/engineering/harness-runtime/agent-catalog.mjs +2 -1
  59. package/skills/engineering/resolve-issues/SKILL.md +11 -9
  60. package/skills/engineering/resolve-issues/references/exploration.md +60 -18
  61. package/skills/engineering/resolve-issues/references/implementation.md +1 -1
  62. package/skills/engineering/resolve-issues/references/preflight.md +47 -22
  63. package/skills/engineering/resolve-issues/references/review.md +2 -1
  64. package/skills/engineering/resolve-issues/references/shared-modules.md +58 -4
  65. package/skills/engineering/resolve-issues/references/task-plan.md +30 -10
  66. package/skills/engineering/resolve-issues/scripts/findings-reuse.mjs +1 -1
  67. package/skills/engineering/resolve-issues/scripts/next-actions.mjs +7 -7
  68. package/skills/engineering/resolve-issues/scripts/plan-sync.mjs +1 -1
  69. package/skills/engineering/resolve-issues/scripts/size-check.mjs +6 -5
  70. package/skills/engineering/resolve-release/SKILL.md +1 -1
  71. package/skills/engineering/rush-issues/SKILL.md +1 -1
  72. package/skills/engineering/rush-release/SKILL.md +1 -1
  73. package/skills/engineering/test-quality/SKILL.md +1 -1
  74. package/skills/risk-compliance/compliance-audit/SKILL.md +1 -1
  75. package/skills/risk-compliance/contract-compare/SKILL.md +1 -1
  76. package/skills/risk-compliance/contract-review/SKILL.md +1 -1
  77. package/skills/risk-compliance/doc-authenticity/SKILL.md +1 -1
  78. package/skills/risk-compliance/fraud-detection/SKILL.md +1 -1
  79. package/skills/risk-compliance/payment-analysis/SKILL.md +1 -1
  80. package/skills/risk-compliance/portfolio-payment-analysis/SKILL.md +1 -1
  81. package/skills/risk-compliance/similar-domain/SKILL.md +1 -1
  82. package/skills/risk-compliance/tld-detection/SKILL.md +1 -1
@@ -37,9 +37,56 @@ Owner: the harness agent catalog. The workflow names four **roles** — implemen
37
37
  explorer, diagnoser (escalation), reviewer — and the harness decides which model
38
38
  fills each one and how that role is launched on this host. The shared bridge is
39
39
  [`harness-runtime/agent-catalog.mjs`](../../harness-runtime/agent-catalog.mjs);
40
- this skill owns no ladder, no tier ranking, and no model list. Write this turn's
41
- host evidence to a temporary JSON file first (any writable path; the run directory
42
- does not exist yet at step 1):
40
+ this skill owns no ladder, no tier ranking, and no model list.
41
+
42
+ ### Native Pi preflight
43
+
44
+ When Pi advertises `agents_catalog` and role-based spawning, use the live catalog
45
+ for a run with no task model/effort override or separately declared authoritative
46
+ host preference. Check those inputs before selecting this path: an unpinned task
47
+ can still have `hostPreferences`. The native catalog resolves roles against this
48
+ session's model registry and effort support; a second, caller-built inventory is
49
+ unnecessary.
50
+
51
+ 1. Call `agents_catalog` with `action: "list"`, then `action: "inspect"` for
52
+ `developer`, `explorer`, and `reviewer`. Inspect all three even when the explorer
53
+ will not run. The diagnoser uses the same developer role.
54
+ 2. Require each inspection's live `launchable: yes` and `availability: available`,
55
+ with its actual resolved model and effort. `definitionValid` and
56
+ `catalogLaunchable` alone establish only definition validity, not runtime
57
+ availability. A missing or blocked live decision stops preflight with that
58
+ diagnostic; saved defaults do not replace it.
59
+ 3. Record the catalog revision and each role's **actual** model and effort as run
60
+ metadata. A tier fallback can differ from the displayed default. Use the
61
+ developer result for implementer and diagnoser. Require the reviewer's actual
62
+ model id to differ from the implementer's, regardless of effort; otherwise
63
+ stop and report the conflict without choosing a replacement.
64
+ Save each fill in `selections` as `source: "native-catalog"`, `role`, `id`
65
+ (actual model), `key` (`id@effort` when effort is present), `effort` (actual
66
+ effort), `launch: { role }`, `instructions`
67
+ from the inspection, and the observed `catalogRevision`. Retain the native
68
+ inspection as `selection` evidence, including requested/actual values and
69
+ availability. This is native provenance, not a fabricated portable
70
+ `selection` object or `catalogDigest`.
71
+ 4. Record the later launch by role (`{ role: "developer" }`, `{ role: "explorer" }`, or
72
+ `{ role: "reviewer" }`), adding the task brief and authorized workspace/tool
73
+ controls. The native catalog applies its live instructions and defaults again
74
+ at admission. Record actual launch provenance if it differs from preflight.
75
+
76
+ This completes model preflight; continue to the provisional target without
77
+ running `preflight-models.mjs` or manufacturing `available[]`. Worker capacity is
78
+ a separate scheduling input, not model evidence. An explicit task model or effort
79
+ override or authoritative host model/effort preference still needs validation for
80
+ that exact request: use the portable path below when the native inspection cannot
81
+ validate it and preserve its structured launch fields. Keep the request; an
82
+ unresolved request does not authorize a default launch.
83
+
84
+ ### Portable preflight
85
+
86
+ For a host without native role resolution, or a task override or authoritative
87
+ host preference requiring portable validation, write observed host capabilities
88
+ to a temporary JSON file (any writable path; the run directory does not exist yet
89
+ at step 1):
43
90
 
44
91
  ```json
45
92
  { "available": [{ "model": "provider/model", "nativeModel": "host-id", "supportedEfforts": ["medium", "high"] }],
@@ -54,7 +101,7 @@ a field you cannot observe is left out, and the bridge never completes one.
54
101
 
55
102
  | Field | Meaning |
56
103
  |---|---|
57
- | `available[]` | This turn's models. `nativeModel` is required for a harness whose slots are launched by a bare host id (Codex); pass the ids the spawn primitive advertises, unchanged. `supportedEfforts` is the host's verified list per model. |
104
+ | `available[]` | This turn's models. Each entry needs verified `supportedEfforts`; IDs alone from configuration or `discover-models.mjs` do not supply effort support. `nativeModel` is required for a harness whose slots are launched by a bare host id (Codex); pass the advertised mapping unchanged. |
58
105
  | `launchCapabilities` | The launch controls this host exposes: `model`, `effort`, `instructions`, each a boolean. All three must be stated; omission is not "probably true". A native id and an effort say what the catalog chose, never that the adapter can set it. |
59
106
  | `hostPreferences` | This host's own role preferences, keyed by **role** (`developer`, `explorer`, `reviewer`), each `{ model?, effort? }`. Below a task override and above the role default: it is how a host says "this machine runs the developer role on this model". |
60
107
  | `fallbackToForeground` | Set `true` only when this host may use the foreground model as a fallback. Pi always may; another harness must opt in. Absent, no foreground fallback happens for it. |
@@ -115,6 +162,13 @@ pick, never fall back to the skill-owned catalog, and never let the reviewer sha
115
162
  the implementer's model id: the catalog enforces independence, and re-picking a
116
163
  replacement here would silently break it.
117
164
 
165
+ `capabilities-missing` describes incomplete resolver input, not proof that the
166
+ host cannot launch workers. Check the supplied file and this turn's native
167
+ capability source before declaring a harness limitation. Repair an omitted field
168
+ from verified evidence and retry preflight; if that evidence is unavailable,
169
+ report the exact missing input. Never derive effort ranges from a selected role
170
+ default or use free worker slots as a model inventory.
171
+
118
172
  **No fallback is invented.** The catalog substitutes only an available model from
119
173
  the same tier's configured `candidates`, and never for an explicit request: an
120
174
  unavailable pin or host preference blocks rather than sliding to a neighbour, and
@@ -1,6 +1,6 @@
1
1
  # Task plan
2
2
 
3
- Draft the plan in preflight, before exploration, and update it on every
3
+ Draft the plan in preflight, before the assessment, and update it on every
4
4
  worker and stage transition.
5
5
 
6
6
  ## Initialize the run
@@ -92,7 +92,7 @@ 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
- | `estimatedLines` | Explorer estimate |
95
+ | `estimatedLines` | Preflight assessment estimate |
96
96
  | `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
97
  | `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)) |
98
98
  | `pr`, `headSha`, `reviewedHead` | PR URL, current HEAD (recorded from the implementer's first pushed commit on, so the draft PR opens early), last HEAD whose verdict was `pass` (reviewed or carried) |
@@ -123,10 +123,14 @@ rehydrate read it, and `next-actions.mjs` exits 2 without it), `planRevision`, `
123
123
  (`owner/name#N` or an issue URL; any other name turns off the issue-tree sync),
124
124
  exploration path, `decisions`, `standingOrders`, `schedulerMode` (`full`, `narrow`, or `off`), timestamps, and `excluded` (issues in the
125
125
  tree that are deliberately not units, each `{issue, reason}`: release or
126
- approval gates, and rollups the explorer found empty). A run resumed from an
126
+ approval gates, and rollups the assessment found empty). A run resumed from an
127
127
  older wave run keeps `merged` (unit ids merged by earlier runs).
128
128
 
129
- `selections` records each slot's fill as `preflight-models.mjs` returned it —
129
+ `selections` records each slot's fill from the selected
130
+ [model-preflight path](shared-modules.md#model-slots). A native Pi fill records
131
+ `source: "native-catalog"`, `role`, actual `id`, `key` and `effort`, `launch: { role }`,
132
+ inspected `instructions`, `catalogRevision` and the retained native inspection
133
+ as `selection`. A portable fill is what `preflight-models.mjs` returned —
130
134
  `id`, `key`, `effort`, `role`, `launch`, `instructions`, `selection`, and the
131
135
  `catalogDigest` it was resolved under — beside the explicit task or host override
132
136
  that produced it, when one did
@@ -162,10 +166,10 @@ to another launch or rewrite them.
162
166
  A plan saved before `selections` holds model ids and efforts and nothing saying
163
167
  who chose them. Read such a value as evidence of what ran, never as a pin: do
164
168
  not pass it as an explicit Pi model or effort. Before launching new workers,
165
- rerun `preflight-models.mjs` for this host ([preflight.md](preflight.md#1-model-slots))
169
+ repeat this host's model-preflight path ([preflight.md](preflight.md#1-model-slots))
166
170
  with only the overrides the run can evidence — a `standingOrders` line, a
167
171
  human-authored decision, or an explicit override in the invocation, never an
168
- agent recommendation or stored metadata alone — and record the fills it returns
172
+ agent recommendation or stored metadata alone — and record its resolved fills
169
173
  as `selections`. When an override's provenance, or a launch control the current
170
174
  host must advertise, cannot be established, block the new launch and name what
171
175
  is missing: report the code and reason and start nothing, rather than guessing a
@@ -173,6 +177,15 @@ pin. Workers already running or finished keep their configuration and history.
173
177
  A resume asks no model question; a human who changes one does so as a separate
174
178
  task input, recorded as a decision and resolved the same way.
175
179
 
180
+ For `source: "native-catalog"`, recheck current task overrides and authoritative
181
+ host preferences on resume. With neither, repeat live native inspection rather
182
+ than demanding a portable `catalogDigest` or running the portable script. A newly
183
+ declared preference or override returns through the exact-request validation path;
184
+ do not replay role-only defaults in its place. Keep
185
+ the old inspection as historical evidence; refresh preflight selection metadata
186
+ without rewriting any worker's actual launch history. A native inspection is not
187
+ an override, and its saved model and effort never become launch arguments.
188
+
176
189
  ### Standing orders
177
190
 
178
191
  **`standingOrders` are the run's only constraints.** A numbered list, one
@@ -212,14 +225,20 @@ Example: someone files #61 under epic #12 mid-run; the next resume prints
212
225
  - A failed fetch keeps the saved tree; a partial one never drops a unit or
213
226
  changes dependencies. A failed fetch before finishing never finishes:
214
227
  `next-actions.mjs` with [live capacity](implementation.md#live-capacity) prints `sync` until a fetch reads the tree.
215
- - `set-deps` only adds; a dependency the explorer recorded stays.
228
+ - At start and resume, fetch current spec and existing unit issue bodies from
229
+ their source and compare their criteria with the saved requirements, decisions,
230
+ contracts and relevant guidance. The tree fetch updates membership and links,
231
+ not issue bodies; unchanged sync output does not establish unchanged criteria.
232
+ Reassess affected units under [assessment reuse](exploration.md#reuse-first),
233
+ or reassess when the prior inputs cannot be established, before scheduling them.
234
+ - `set-deps` only adds; a dependency recorded in findings stays.
216
235
  - `cycle`: units depend on, or are chained on, each other, so none can move.
217
236
  Remove the link that is not a real dependency (on GitHub and in the plan);
218
237
  for a `stacksOn` loop, restack the unit it names onto the target.
219
238
  - `blocked-outside`: put the blocker into the tree (as a sibling of the
220
239
  waiting issue) or remove the link; never leave a unit waiting on an issue
221
240
  the run cannot see.
222
- - A rollup the explorer finds empty goes to `excluded` with "nothing left:
241
+ - A rollup the assessment finds empty goes to `excluded` with "nothing left:
223
242
  close it", and into the handback.
224
243
  - A unit that depends on an `excluded` issue waits for a human: it stays
225
244
  `pending` (not started), `next-actions.mjs` with [live capacity](implementation.md#live-capacity) gives it no action, and
@@ -230,7 +249,7 @@ Example: someone files #61 under epic #12 mid-run; the next resume prints
230
249
  ## Scope changes
231
250
 
232
251
  Record a new requirement as a decision, update the affected criteria,
233
- continue the explorer on affected and new units, rerun the size check, and
252
+ reassess affected and new units using [owner routing](exploration.md#choose-the-owner), rerun the size check, and
234
253
  show the board. Put the change in in-flight units' next brief; never copy
235
254
  files into a running workspace. Add new units as rows and schedule them
236
255
  normally.
@@ -313,7 +332,8 @@ text board. Keep the board and file in agreement. Never show an unsaved transiti
313
332
 
314
333
  ## Board
315
334
 
316
- Show the first board before the explorer spawn, as a record.
335
+ Show the first board before the preflight assessment, as a record. The fleet
336
+ `explore` row tracks that assessment, with a worker only when one is delegated.
317
337
 
318
338
  ```text
319
339
  resolve-issues rev 12 workers 2 elapsed 18m delivery stack
@@ -66,7 +66,7 @@ export function findingsReuse({ prior, units, head = 'HEAD' }) {
66
66
  let baseKnown = typeof prior?.base === 'string' && prior.base.trim() !== ''
67
67
  let changed = []
68
68
  if (baseKnown) {
69
- try { changed = git(['diff', '--name-only', prior.base, headSha]).split('\n').filter(Boolean) } catch { baseKnown = false }
69
+ try { changed = git(['diff', '--name-only', '--no-renames', prior.base, headSha]).split('\n').filter(Boolean) } catch { baseKnown = false }
70
70
  }
71
71
  const ids = units?.length ? units : Object.keys(prior?.units ?? {})
72
72
  return { base: prior?.base ?? null, head: headSha, ...decideReuse(prior, ids, changed, baseKnown) }
@@ -16,8 +16,8 @@
16
16
  // GitHub call. Sync after the run files an issue
17
17
  // unblock a unit marked blocked without a reason from BLOCK_REASONS
18
18
  // (`blockedReason`), or human-decision without `humanItem` (1-5) and
19
- // `humanNeed`: reopen it now; and on --resume, every blocked unit:
20
- // reopen it with fresh limits; its next step follows. A note never keeps a
19
+ // `humanNeed`: reopen it now; on --resume, reopen prior blocks with fresh
20
+ // limits except a current size stop without accepted runWhole. A note never keeps a
21
21
  // unit blocked. A complete review at the unit's HEAD that holds a P0/P1 but
22
22
  // wrote no fix brief and awaits no GitHub reviewer (a handback) gets a
23
23
  // fresh full round, so review-verdict hands it back again only if its
@@ -122,7 +122,7 @@ import { BLOCKING } from './review-verdict.mjs'
122
122
  export const WORKER_KINDS = Object.freeze(['implement', 'fix', 'review'])
123
123
  export const SKILL_PATH = join(dirname(dirname(fileURLToPath(import.meta.url))), 'SKILL.md')
124
124
  // Printed after every text call, and by rehydrate.mjs after a compaction.
125
- export const RULES = 'Per unit, run only implement, fix, and review workers, recorded as workerKind: no planning, architecture, product, or setup workers. Exploration continues the run\'s one explorer, on the fleet explore row. You coordinate: never edit product code. In full mode take every step from next-actions.mjs; in every mode the run ends only when it reports done. A HEAD after a passing review is carried; any other new HEAD takes the tier rereview-scope.mjs picks, never yours. Decide before you defer: a question a worker or review raises is answered and recorded, then the unit continues; retrying or deferring never answers it. Never block on the human: take the automatic answer and keep going. Fix the root cause, never only its symptom. Before each scheduling pass, refresh subagent_settings and pass its snapshot with --capacity-json; do not reuse a run-start budget or subtract workflow workers again.'
125
+ export const RULES = 'Per unit, run only implement, fix, and review workers, recorded as workerKind: no planning, architecture, product, or setup workers. You own preflight findings; use an optional explorer on the fleet explore row only for concrete planning unknowns (exploration.md). You coordinate: never edit product code. In full mode take every step from next-actions.mjs; in every mode the run ends only when it reports done. A HEAD after a passing review is carried; any other new HEAD takes the tier rereview-scope.mjs picks, never yours. Decide before you defer: a question a worker or review raises is answered and recorded, then the unit continues; retrying or deferring never answers it. Never block on the human: take the automatic answer and keep going. Fix the root cause, never only its symptom. Before each scheduling pass, refresh subagent_settings and pass its snapshot with --capacity-json; do not reuse a run-start budget or subtract workflow workers again.'
126
126
  export const DEFAULT_QUIET_MINUTES = 45
127
127
  // The reasons a unit may stay blocked (expire.md#reason-codes). Waiting on another unit, an
128
128
  // infrastructure or external blocker (a tree issue the unit waits on), and a size hold in a rush
@@ -205,15 +205,15 @@ export function nextActions(plan, reviews = {}, capacity, { resume = false, now,
205
205
  if (!Array.isArray(saved) || saved.length === 0) throw new NextActionsError('task plan has no units')
206
206
  const excluded = excludedIds(plan)
207
207
  const gates = (u) => (u.dependsOn ?? []).map(String).filter((d) => excluded.has(d))
208
- // In a rush run, a size-held unit is split, never deferred: it gets `split` until the sync
209
- // drops it (split into sub-issues) or a rerun size check clears it.
208
+ // A current size stop survives resume. Rush splits it; a normal run may hand it back.
210
209
  const shortcut = plan.skill === 'rush-issues'
211
- const sizeHeld = (u) => shortcut && (u.sizeCheck?.verdict ?? u.sizeCheck?.scope) === 'stop' && u.sizeCheck?.runWhole !== true && !codeDone(u)
210
+ const heldForSize = (u) => (u.sizeCheck?.verdict ?? u.sizeCheck?.scope) === 'stop' && u.sizeCheck?.runWhole !== true && !codeDone(u)
212
211
  && !hasWorker(u) && u.status !== 'succeeded' && u.status !== 'cancelled' && gates(u).length === 0
213
212
  && !excluded.has(String(u.id))
213
+ const sizeHeld = (u) => shortcut && heldForSize(u)
214
214
  const reasonOk = (u) => BLOCK_REASONS.includes(u.blockedReason) && !(shortcut && u.blockedReason === 'size-hold')
215
215
  && (u.blockedReason !== 'human-decision' || namesHumanItem(u))
216
- const reopen = (u) => (resume || !reasonOk(u)) && u.status === 'blocked' && !hasWorker(u) && gates(u).length === 0 && !sizeHeld(u)
216
+ const reopen = (u) => (resume || !reasonOk(u)) && u.status === 'blocked' && !hasWorker(u) && gates(u).length === 0 && !heldForSize(u)
217
217
  // `stack` and `chain` both open a child's PR once its parents' PRs are open; only the PR base differs.
218
218
  if (plan.deliveryMode !== undefined && !['stack', 'chain', 'wait'].includes(plan.deliveryMode)) throw new NextActionsError(`deliveryMode must be stack, chain, or wait: ${JSON.stringify(plan.deliveryMode)}`)
219
219
  const chain = plan.deliveryMode === 'chain'
@@ -139,7 +139,7 @@ export function planSync(plan, tree) {
139
139
  const { deps } = wants(key)
140
140
  const id = idFor(key, repo)
141
141
  const rollup = (node.children ?? []).length > 0
142
- add('add-unit', id, `add unit ${id} for ${key} "${node.title}"${deps.length ? ` with dependsOn [${deps.join(', ')}]` : ''}: fetch its issue into the run, continue the explorer for it, rerun the size check${rollup ? '; every sub-issue is closed, so the explorer records what is left or that nothing is (then hand back "close it")' : ''}`, { issue: key, dependsOn: deps })
142
+ add('add-unit', id, `add unit ${id} for ${key} "${node.title}"${deps.length ? ` with dependsOn [${deps.join(', ')}]` : ''}: fetch its issue into the run, assess it using exploration.md's owner routing, rerun the size check${rollup ? '; every sub-issue is closed, so record what is left or that nothing is (then hand back "close it")' : ''}`, { issue: key, dependsOn: deps })
143
143
  }
144
144
  for (const [key, u] of byKey) {
145
145
  if (DONE.has(u.status)) continue
@@ -30,7 +30,8 @@
30
30
  // (ok, warn, hold, stop, or exploration-unfinished); 2 for a bad plan or command.
31
31
  // `exploration-unfinished` (printed as `{ verdict, reason }`) means findings that are unreadable,
32
32
  // not version 2, or missing a planned unit, its `slice`, its `proof`, or its `estimatedLines`;
33
- // only the explorer fixes it. --exit-verdict restores the old exit codes for one release
33
+ // complete the preflight findings using exploration.md's owner routing.
34
+ // --exit-verdict restores the old exit codes for one release
34
35
  // (deprecated): 0 for ok/warn, 4 for hold, 1 for stop, 3 for exploration-unfinished.
35
36
 
36
37
  import { readFileSync } from 'node:fs'
@@ -78,7 +79,7 @@ export const FINDINGS_VERSION = 2
78
79
 
79
80
  export class SizeCheckError extends Error {}
80
81
 
81
- // Unfinished exploration: the explorer, not the orchestrator, fixes it.
82
+ // Unfinished assessment; keep the exported error and verdict compatible with saved runs.
82
83
  export class ExplorationUnfinished extends SizeCheckError {}
83
84
 
84
85
  function unitsOf(plan) {
@@ -262,9 +263,9 @@ function environmentChecks(units, byUnit) {
262
263
  // ---- The whole check ----
263
264
 
264
265
  // A unit counts as explored once its entry carries a valid `slice`, `proof`,
265
- // and `estimatedLines`; the explorer's scaffold (an empty entry per unit) does not pass.
266
+ // and `estimatedLines`; a scaffold (an empty entry per unit) does not pass.
266
267
  function findingsUnitsOf(findings, units) {
267
- const unfinished = (why) => new ExplorationUnfinished(`exploration unfinished: ${why}; continue the explorer`)
268
+ const unfinished = (why) => new ExplorationUnfinished(`exploration unfinished: ${why}; complete the preflight findings`)
268
269
  if (findings?.version !== FINDINGS_VERSION) throw unfinished(`findings version is ${JSON.stringify(findings?.version)}, expected ${FINDINGS_VERSION}`)
269
270
  const byUnit = findings.units
270
271
  if (!byUnit || typeof byUnit !== 'object' || Array.isArray(byUnit)) throw unfinished('findings has no units map')
@@ -481,7 +482,7 @@ if (isMainModule(import.meta.url)) {
481
482
  process.exitCode = opts.exitVerdict ? EXIT[result.verdict] : 0
482
483
  } catch (error) {
483
484
  if (error instanceof ExplorationUnfinished) {
484
- // Unfinished exploration is an answer (the explorer continues), not a failure of the script.
485
+ // Incomplete findings are an answer, not a failure of the script.
485
486
  process.stdout.write(`${JSON.stringify({ verdict: 'exploration-unfinished', reason: error.message }, null, 2)}\n`)
486
487
  process.exitCode = process.argv.includes('--exit-verdict') ? 3 : 0
487
488
  } else {
@@ -4,7 +4,7 @@ description: "Slash/explicit-only (/resolve-release). Full GitHub Flow release f
4
4
  disable-model-invocation: true
5
5
  metadata:
6
6
  workflow-role: coordinator
7
- release-version: 0.48.0
7
+ release-version: 0.48.1
8
8
  ---
9
9
  **Updates:** Once/session run `node <skill-base-dir>/release-check.mjs`.
10
10
  # Resolve release
@@ -6,7 +6,7 @@ metadata:
6
6
  workflow-role: coordinator
7
7
  dependencies:
8
8
  - resolve-issues
9
- release-version: 0.48.0
9
+ release-version: 0.48.1
10
10
  ---
11
11
  **Updates:** Once/session run `node <skill-base-dir>/release-check.mjs`.
12
12
  # Rush issues (shortcut of resolve-issues)
@@ -6,7 +6,7 @@ metadata:
6
6
  workflow-role: coordinator
7
7
  dependencies:
8
8
  - resolve-release
9
- release-version: 0.48.0
9
+ release-version: 0.48.1
10
10
  ---
11
11
  **Updates:** Once/session run `node <skill-base-dir>/release-check.mjs`.
12
12
  # Rush release (shortcut of resolve-release)
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: test-quality
3
3
  description: "Seven principles for tests that catch real bugs, and an audit that reports weak, redundant, and not-coverage tests without fixing them. Use when writing, changing, or reviewing tests, or when asked whether tests are useful, redundant, over-mocked, flaky, only assert static text, or test config files, or asked to make a slow test suite faster without losing coverage, or when the user asks to write the testing conventions into a repo's CONTRIBUTING.md. NOT defining what a spec must prove (ensure-coverage) or authoring browser tests (e2e-test)."
4
- release-version: 0.48.0
4
+ release-version: 0.48.1
5
5
  ---
6
6
  **Updates:** Once/session run `node <skill-base-dir>/release-check.mjs`.
7
7
  # Test Quality
@@ -2,7 +2,7 @@
2
2
  name: compliance-audit
3
3
  version: 2.9.0
4
4
  description: "Audit operations against financial-compliance checklists (AML/KYC, VARS, PCI-DSS, TPA oversight, onboarding, transaction monitoring). Produces tracker.md (with a tracker.xlsx export) and phase-trail.md with layered validation; cites evidence by original filename. Input: reg-parser or the built-in VARS checklist."
5
- release-version: 0.48.0
5
+ release-version: 0.48.1
6
6
  ---
7
7
  **Updates:** Once/session run `node <skill-base-dir>/release-check.mjs`.
8
8
  # Compliance Audit
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: contract-compare
3
3
  description: "Compare two or more contracts side-by-side for structured diff, gap analysis, and benchmarking. Use when: comparing contracts or agreements, contract diff, compare terms, vendor-vs-vendor, compare our template vs theirs, compliance gap between contracts. NOT for single-contract risk review — use contract-review for that."
4
- release-version: 0.48.0
4
+ release-version: 0.48.1
5
5
  ---
6
6
  **Updates:** Once/session run `node <skill-base-dir>/release-check.mjs`.
7
7
  # Contract Compare
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: contract-review
3
3
  description: "Review contracts for legal, commercial, and compliance risks via convert → chunk review → merge → validate (+ optional mandate preprocessing). Use for reviewing, auditing, or checking any contract, agreement, NDA, MSA, or SLA; input a file path (PDF/DOCX/TXT) or pasted text."
4
- release-version: 0.48.0
4
+ release-version: 0.48.1
5
5
  ---
6
6
  **Updates:** Once/session run `node <skill-base-dir>/release-check.mjs`.
7
7
  # Contract Review
@@ -3,7 +3,7 @@ name: doc-authenticity
3
3
  version: 0.4.1
4
4
  description: "Screen PDF documents and raster images for fabrication, tampering, Photoshop or other image-editor use, and content validity. Detects file type, runs format-specific authenticity forensics, classifies bank statements, conversation logs, invoices, agreements, and other documents, then applies type-specific validity checks. Produces separate authenticity (NO_EVIDENCE_OF_MODIFICATION / SUSPICIOUS / LIKELY_MODIFIED / INCONCLUSIVE) and validity (VALID / INVALID / INCONCLUSIVE) verdicts. Use whenever a user asks whether a document, screenshot, scan, statement, invoice, contract, chat log, receipt, or payment evidence is genuine, original, edited, Photoshopped, manipulated, fake, or valid."
5
5
  disable-model-invocation: true
6
- release-version: 0.48.0
6
+ release-version: 0.48.1
7
7
  ---
8
8
  **Updates:** Once/session run `node <skill-base-dir>/release-check.mjs`.
9
9
  # Document and Image Authenticity
@@ -12,7 +12,7 @@ description: >
12
12
  impact, and a business report. Use for fraud, scam, mule, account-takeover,
13
13
  chargeback, dispute, transfer, collection, or payout risk analysis even when the
14
14
  user does not name this skill.
15
- release-version: 0.48.0
15
+ release-version: 0.48.1
16
16
  ---
17
17
  **Updates:** Once/session run `node <skill-base-dir>/release-check.mjs`.
18
18
  # Fraud Detection
@@ -14,7 +14,7 @@ description: >
14
14
  transactions" — even if they do not say payment-analysis. Do NOT use for
15
15
  fraud rule discovery (fraud-detection) or TLD / MCC-miscoding
16
16
  clusters (tld-detection).
17
- release-version: 0.48.0
17
+ release-version: 0.48.1
18
18
  ---
19
19
  **Updates:** Once/session run `node <skill-base-dir>/release-check.mjs`.
20
20
  # Payment Analysis
@@ -5,7 +5,7 @@ description: >
5
5
  and investigate selected merchants' authorization, settlement and disputes,
6
6
  including descriptor mapping and overlapping exports. Portfolio-level payment
7
7
  overviews belong to payment-analysis; fraud rule discovery belongs to fraud-detection.
8
- release-version: 0.48.0
8
+ release-version: 0.48.1
9
9
  ---
10
10
  **Updates:** Once/session run `node <skill-base-dir>/release-check.mjs`.
11
11
  # Portfolio payment analysis
@@ -8,7 +8,7 @@ description: >
8
8
  links, an entity chain, and a watchlist for the operator's next domains.
9
9
  Not transaction data (tld-detection) or fraud rules (fraud-detection).
10
10
  disable-model-invocation: true
11
- release-version: 0.48.0
11
+ release-version: 0.48.1
12
12
  ---
13
13
  **Updates:** Once/session run `node <skill-base-dir>/release-check.mjs`.
14
14
  # Similar Domain
@@ -6,7 +6,7 @@ description: >
6
6
  patterns, with USD and BIN-country currency views, group profiles and priorities.
7
7
  Not payment-analysis, fraud-detection, or website research.
8
8
  disable-model-invocation: true
9
- release-version: 0.48.0
9
+ release-version: 0.48.1
10
10
  ---
11
11
  **Updates:** Once/session run `node <skill-base-dir>/release-check.mjs`.
12
12
  # TLD detection