@1aboveio/skills 1.0.16 → 1.0.18

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 (102) hide show
  1. package/.codex-plugin/plugin.json +1 -1
  2. package/.codex-plugin/resources.json +178 -150
  3. package/README.md +1 -1
  4. package/package.json +5 -4
  5. package/skills/app-dev/airflow/SKILL.md +1 -1
  6. package/skills/app-dev/android-development/SKILL.md +14 -10
  7. package/skills/app-dev/android-development/references/diagnosis.md +4 -6
  8. package/skills/app-dev/android-development/references/feature-work.md +3 -2
  9. package/skills/app-dev/android-development/references/gotchas.md +7 -0
  10. package/skills/app-dev/android-development/references/init.md +5 -2
  11. package/skills/app-dev/android-development/references/setup.md +9 -5
  12. package/skills/app-dev/android-development/references/ui-journeys.md +12 -55
  13. package/skills/app-dev/android-development/scripts/failure_capture.py +23 -84
  14. package/skills/app-dev/android-development/scripts/init.mjs +2 -1
  15. package/skills/app-dev/android-development/scripts/maestro_failure.py +43 -387
  16. package/skills/app-dev/android-development/scripts/test_maestro_failure.py +113 -424
  17. package/skills/app-dev/app-debug/SKILL.md +1 -1
  18. package/skills/app-dev/better-auth/SKILL.md +1 -1
  19. package/skills/app-dev/data-catalog/SKILL.md +1 -1
  20. package/skills/app-dev/data-quality/SKILL.md +1 -1
  21. package/skills/app-dev/ios-foundation/SKILL.md +1 -1
  22. package/skills/app-dev/maestro/LICENSE +3 -0
  23. package/skills/app-dev/maestro/SKILL.md +112 -0
  24. package/skills/app-dev/maestro/references/android-connection.md +54 -0
  25. package/skills/app-dev/maestro/references/authoring.md +113 -0
  26. package/skills/app-dev/maestro/references/diagnosis.md +50 -0
  27. package/skills/app-dev/maestro/references/evidence.md +74 -0
  28. package/skills/app-dev/maestro/references/journeys.md +100 -0
  29. package/skills/app-dev/maestro/references/migration.md +35 -0
  30. package/skills/app-dev/maestro/release-check.mjs +95 -0
  31. package/skills/app-dev/maestro/scripts/failure_record.py +110 -0
  32. package/skills/app-dev/maestro/scripts/maestro_failure.py +481 -0
  33. package/skills/app-dev/maestro/scripts/test_maestro_failure.py +710 -0
  34. package/skills/app-dev/monorepo/SKILL.md +1 -1
  35. package/skills/app-dev/nextjs-fullstack/SKILL.md +1 -1
  36. package/skills/app-dev/prisma-setup/SKILL.md +1 -1
  37. package/skills/app-dev/pyspark/SKILL.md +1 -1
  38. package/skills/app-dev/python-backend/SKILL.md +1 -1
  39. package/skills/app-dev/shadcn/SKILL.md +1 -1
  40. package/skills/app-dev/zod-v4/SKILL.md +1 -1
  41. package/skills/cicd/cloud-build/SKILL.md +1 -1
  42. package/skills/cicd/cloud-debug/SKILL.md +1 -1
  43. package/skills/cicd/cloud-deploy/SKILL.md +1 -1
  44. package/skills/cicd/docker/SKILL.md +1 -1
  45. package/skills/cicd/github-actions/SKILL.md +1 -1
  46. package/skills/cicd/github-flow/SKILL.md +1 -1
  47. package/skills/cicd/google-cloud/SKILL.md +1 -1
  48. package/skills/cicd/mergify/SKILL.md +1 -1
  49. package/skills/cicd/podman/SKILL.md +1 -1
  50. package/skills/content/article-review/SKILL.md +1 -1
  51. package/skills/content/article-to-image/SKILL.md +1 -1
  52. package/skills/content/flowchart-svg/SKILL.md +1 -1
  53. package/skills/content/image-gen/SKILL.md +1 -1
  54. package/skills/content/mermaid/SKILL.md +1 -1
  55. package/skills/content/wechat-article-writer/SKILL.md +1 -1
  56. package/skills/content/wechat-publisher/SKILL.md +1 -1
  57. package/skills/content/wechat-search/SKILL.md +1 -1
  58. package/skills/content/xai-search/SKILL.md +1 -1
  59. package/skills/core/distill-writing/SKILL.md +1 -1
  60. package/skills/core/doc-to-md/SKILL.md +1 -1
  61. package/skills/core/editorial-review/SKILL.md +1 -1
  62. package/skills/core/house-style/SKILL.md +1 -1
  63. package/skills/core/plain-language/SKILL.md +1 -1
  64. package/skills/core/polish-cn/SKILL.md +1 -1
  65. package/skills/core/reg-parser/SKILL.md +1 -1
  66. package/skills/core/terminology/SKILL.md +1 -1
  67. package/skills/core/write-doc/SKILL.md +1 -1
  68. package/skills/core/write-report/SKILL.md +1 -1
  69. package/skills/engineering/better-review/SKILL.md +1 -1
  70. package/skills/engineering/e2e-test/SKILL.md +1 -1
  71. package/skills/engineering/engineering/SKILL.md +1 -1
  72. package/skills/engineering/engineering-runtime/SKILL.md +1 -1
  73. package/skills/engineering/engineering-runtime/coherence/workflow.json +13 -13
  74. package/skills/engineering/ensure-coverage/SKILL.md +1 -1
  75. package/skills/engineering/golden-path/SKILL.md +1 -1
  76. package/skills/engineering/harness-runtime/SKILL.md +1 -1
  77. package/skills/engineering/harness-runtime/agent-catalog.mjs +46 -12
  78. package/skills/engineering/harness-runtime/contracts.md +1 -1
  79. package/skills/engineering/resolve-issues/SKILL.md +11 -9
  80. package/skills/engineering/resolve-issues/references/exploration.md +60 -18
  81. package/skills/engineering/resolve-issues/references/implementation.md +1 -1
  82. package/skills/engineering/resolve-issues/references/preflight.md +47 -22
  83. package/skills/engineering/resolve-issues/references/review.md +2 -1
  84. package/skills/engineering/resolve-issues/references/shared-modules.md +58 -4
  85. package/skills/engineering/resolve-issues/references/task-plan.md +30 -10
  86. package/skills/engineering/resolve-issues/scripts/findings-reuse.mjs +1 -1
  87. package/skills/engineering/resolve-issues/scripts/next-actions.mjs +7 -7
  88. package/skills/engineering/resolve-issues/scripts/plan-sync.mjs +1 -1
  89. package/skills/engineering/resolve-issues/scripts/size-check.mjs +6 -5
  90. package/skills/engineering/resolve-release/SKILL.md +1 -1
  91. package/skills/engineering/rush-issues/SKILL.md +1 -1
  92. package/skills/engineering/rush-release/SKILL.md +1 -1
  93. package/skills/engineering/test-quality/SKILL.md +1 -1
  94. package/skills/risk-compliance/compliance-audit/SKILL.md +1 -1
  95. package/skills/risk-compliance/contract-compare/SKILL.md +1 -1
  96. package/skills/risk-compliance/contract-review/SKILL.md +1 -1
  97. package/skills/risk-compliance/doc-authenticity/SKILL.md +1 -1
  98. package/skills/risk-compliance/fraud-detection/SKILL.md +1 -1
  99. package/skills/risk-compliance/payment-analysis/SKILL.md +1 -1
  100. package/skills/risk-compliance/portfolio-payment-analysis/SKILL.md +1 -1
  101. package/skills/risk-compliance/similar-domain/SKILL.md +1 -1
  102. package/skills/risk-compliance/tld-detection/SKILL.md +1 -1
@@ -36,7 +36,8 @@
36
36
  // PI_AGENT_CATALOG_COMMAND JSON argv array: '["node","/abs/agent-catalog.mjs"]'
37
37
  // (preferred when arguments are needed), or a bare
38
38
  // executable token: 'pi-agent-catalog'.
39
- // default pi-agent-catalog on PATH.
39
+ // default pi-agent-catalog on PATH, then (Pi only) the
40
+ // catalog in Pi's installed npm packages on ENOENT.
40
41
  // A bare token cannot carry arguments — that is deliberate, so no quoting rule
41
42
  // sneaks shell semantics in. Nothing here runs npm/npx, resolves a sibling
42
43
  // checkout, or reads a registry.
@@ -48,8 +49,9 @@
48
49
  // install (`~/.agents/skills/{resolve-issues,harness-runtime}`). No path in this
49
50
  // file is relative to a source-domain layout.
50
51
  import { spawnSync } from 'node:child_process'
51
- import { readFileSync } from 'node:fs'
52
- import { resolve as resolvePath } from 'node:path'
52
+ import { readFileSync, statSync } from 'node:fs'
53
+ import { homedir } from 'node:os'
54
+ import { join, resolve as resolvePath } from 'node:path'
53
55
 
54
56
  export const AGENT_CATALOG_PROTOCOL_VERSION = 1
55
57
  export const DEFAULT_AGENT_CATALOG_COMMAND = 'pi-agent-catalog'
@@ -210,6 +212,27 @@ export function resolveCatalogCommand(env = process.env) {
210
212
  return parseCommandSpec(spec)
211
213
  }
212
214
 
215
+ function installedPiCatalogCommand(request, env) {
216
+ if (request.harness !== 'pi' || env?.[AGENT_CATALOG_COMMAND_ENV]?.trim()) return null
217
+ const configuredRoot = request.userRoot || env?.PI_CODING_AGENT_DIR || join(homedir(), '.pi', 'agent')
218
+ const root = configuredRoot === '~' ? homedir()
219
+ : configuredRoot.startsWith('~/') ? join(homedir(), configuredRoot.slice(2)) : configuredRoot
220
+ for (const entry of [
221
+ ['pi-better-harness', 'bin', 'pi-agent-catalog.mjs'],
222
+ ['pi-better-subagents', 'agent-catalog.mjs'],
223
+ ]) {
224
+ const script = resolvePath(root, 'npm', 'node_modules', ...entry)
225
+ try {
226
+ if (statSync(script).isFile()) {
227
+ return { executable: process.execPath, args: [script], source: 'pi-installed' }
228
+ }
229
+ } catch (error) {
230
+ if (error.code !== 'ENOENT' && error.code !== 'ENOTDIR') throw error
231
+ }
232
+ }
233
+ return null
234
+ }
235
+
213
236
  function normalizeAvailable(value, label = 'available') {
214
237
  if (value === undefined) return { ok: true, available: [] }
215
238
  if (!Array.isArray(value)) {
@@ -620,7 +643,8 @@ export function buildCatalogRequest({
620
643
  if (normalizedAvailable.available.length === 0) {
621
644
  return blocked(
622
645
  AGENT_CATALOG_BLOCK_CODES.CAPABILITIES_MISSING,
623
- 'no current-turn models were supplied; the harness must advertise its available models for this turn',
646
+ 'no current-turn models were supplied: the resolver input has no available[] entries; '
647
+ + 'collect verified host model and effort evidence before retrying; this does not establish that the harness lacks worker support',
624
648
  )
625
649
  }
626
650
  if (foregroundModel !== null && foregroundModel !== undefined && !nonEmptyString(foregroundModel)) {
@@ -863,17 +887,27 @@ export function resolveAgentCatalog({
863
887
  }
864
888
  const commandResult = resolveCatalogCommand(env)
865
889
  if (!commandResult.ok) return commandResult
866
- const { command } = commandResult
890
+ let { command } = commandResult
891
+ const invoke = () => runner({
892
+ executable: command.executable,
893
+ args: command.args,
894
+ input: `${JSON.stringify(request)}\n`,
895
+ timeoutMs,
896
+ env,
897
+ })
867
898
 
868
899
  let run
869
900
  try {
870
- run = runner({
871
- executable: command.executable,
872
- args: command.args,
873
- input: `${JSON.stringify(request)}\n`,
874
- timeoutMs,
875
- env,
876
- })
901
+ run = invoke()
902
+ // Only a missing default command permits installed-package lookup. An
903
+ // explicit choice or a resolver that ran and failed stays authoritative.
904
+ if (run?.error?.code === 'ENOENT') {
905
+ const installed = installedPiCatalogCommand(request, env)
906
+ if (installed) {
907
+ command = installed
908
+ run = invoke()
909
+ }
910
+ }
877
911
  } catch (error) {
878
912
  return blocked(
879
913
  AGENT_CATALOG_BLOCK_CODES.COMMAND_UNAVAILABLE,
@@ -14,4 +14,4 @@ When no supported native question tool is advertised, concise free-text input is
14
14
 
15
15
  Model discovery and catalog persistence remain separate from question planning. Current-turn tool availability is never inferred from model or harness configuration. Source-tree imports outside `skills/engineering` are unsupported until an installation-aware adapter entrypoint exists; consumers must not copy the runtime to work around that boundary.
16
16
 
17
- `agent-catalog.mjs` is the consumer bridge to the harness-owned agent catalog: one versioned JSON request on stdin (`version`, `harness`, `cwd`, `available`, `foregroundModel`, `fallbackToForeground`, `launchCapabilities`, `hostPreferences`, `overrides`, `tiers`, …) and one JSON response on stdout with four worker slots. It resolves the resolver command from `PI_AGENT_CATALOG_COMMAND` (a JSON argv array, or one bare executable token) or defaults to `pi-agent-catalog` on PATH, runs it with no shell, bounds its output and runtime, and validates the response. Those host fields are validated and forwarded unchanged — nothing is inferred or completed here, so an unstated launch control or tier stays unstated. A missing, broken, or declining resolver is a reported block; the bridge never falls back to a skill-owned model ladder and never installs anything. `discover-models.mjs` and `model-catalog.mjs` remain for consumers that still import them and are no longer part of model-slot selection.
17
+ `agent-catalog.mjs` is the consumer bridge to the harness-owned agent catalog: one versioned JSON request on stdin (`version`, `harness`, `cwd`, `available`, `foregroundModel`, `fallbackToForeground`, `launchCapabilities`, `hostPreferences`, `overrides`, `tiers`, …) and one JSON response on stdout with four worker slots. It resolves the resolver command from `PI_AGENT_CATALOG_COMMAND` (a JSON argv array, or one bare executable token) or defaults to `pi-agent-catalog` on PATH. For Pi only, when that default command is missing (`ENOENT`), it checks the installed `pi-better-harness` then standalone `pi-better-subagents` catalog under `<agent-dir>/npm/node_modules` and invokes the first installed entrypoint through the current Node executable. The agent directory is the request's `userRoot`, then `PI_CODING_AGENT_DIR`, then `~/.pi/agent`. Explicit commands and resolvers that execute but fail remain authoritative; there is no project-checkout search or second resolver after a catalog failure. The bridge runs with no shell, bounds its output and runtime, and validates the response. Those host fields are validated and forwarded unchanged — nothing is inferred or completed here, so an unstated launch control or tier stays unstated. A missing, broken, or declining resolver is a reported block; the bridge never falls back to a skill-owned model ladder and never installs anything. `discover-models.mjs` and `model-catalog.mjs` remain for consumers that still import them and are no longer part of model-slot selection.
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: resolve-issues
3
- description: "Slash/explicit-only (/resolve-issues). Drive an issue, epic, or feature spec to reviewed, green PRs, one per issue, merged or handed back merge-ready: preflight, task map, exploration and a per-issue slice check, isolated implementers within live host capacity, then per issue its PR, independent better-review, CI, and queue/merge (or merge-ready hand-back) as soon as it is done. Asks once, at the end of preflight (target branch, merge mode, scheduler mode, plan) and resolves the worker roles' models as run metadata instead of asking, then never blocks on the human; small non-blocking problems collect in a dropbox, posted at the end as grouped ready-for-agent issues. /rush-issues is its no-questions shortcut. Do not auto-select. Use for whole-spec delivery, including high-risk work; risk changes model and validation depth, never the workflow. NOT for release work (resolve-release)."
3
+ description: "Slash/explicit-only (/resolve-issues). Drive an issue, epic, or feature spec to reviewed, green PRs, one per issue, merged or handed back merge-ready: preflight assessment with an explorer only for planning unknowns, a per-issue slice check, isolated implementers within live host capacity, then per issue its PR, independent better-review, CI, and queue/merge (or merge-ready hand-back) as soon as it is done. Asks once, at the end of preflight (target branch, merge mode, scheduler mode, plan) and resolves the worker roles' models as run metadata instead of asking, then never blocks on the human; small non-blocking problems collect in a dropbox, posted at the end as grouped ready-for-agent issues. /rush-issues is its no-questions shortcut. Do not auto-select. Use for whole-spec delivery, including high-risk work; risk changes model and validation depth, never the workflow. NOT for release work (resolve-release)."
4
4
  disable-model-invocation: true
5
5
  metadata:
6
6
  workflow-role: coordinator
@@ -8,7 +8,7 @@ dependencies:
8
8
  - better-review
9
9
  - golden-path
10
10
  - harness-runtime
11
- release-version: 0.48.0
11
+ release-version: 0.49.0
12
12
  ---
13
13
  **Updates:** Once/session run `node <skill-base-dir>/release-check.mjs`.
14
14
  # Resolve issues
@@ -54,7 +54,7 @@ after 2 fix rounds without a new low of open P0/P1 path rows; no fixed round cap
54
54
 
55
55
  ```text
56
56
  preflight: ready label -> model fills -> plan draft
57
- -> exploration -> size check (only scope or an open question holds a unit, with a split)
57
+ -> preflight assessment (optional explorer) -> size check (only scope or an open question holds a unit, with a split)
58
58
  -> one approval (target branch, merge mode, scheduler mode, plan)
59
59
  -> schedule runnable units within live host capacity:
60
60
  prepare a unit's workspace when its first worker is admitted (never all units up front)
@@ -77,9 +77,9 @@ Read each procedure right before its stage; never substitute your own.
77
77
 
78
78
  | Stage | Procedure |
79
79
  |---|---|
80
- | Preflight: ready label, models, plan draft, exploration, size check, approval; what any filed text may say | [references/preflight.md](references/preflight.md) ([Filed text](references/preflight.md#filed-text)) |
80
+ | Preflight: ready label, models, plan draft, assessment, size check, approval; what any filed text may say | [references/preflight.md](references/preflight.md) ([Filed text](references/preflight.md#filed-text)) |
81
81
  | Task plan shape and live board | [references/task-plan.md](references/task-plan.md) |
82
- | Exploration (preflight step 4) | [references/exploration.md](references/exploration.md) |
82
+ | Preflight assessment and optional exploration (step 4) | [references/exploration.md](references/exploration.md) |
83
83
  | Implementation loop and opening each PR | [references/implementation.md](references/implementation.md) |
84
84
  | Read-only warehouse canary | [references/canary.md](references/canary.md) |
85
85
  | Owned workspaces: plan, prepare, cleanup, recover, inventory | [references/workspaces.md](references/workspaces.md) |
@@ -105,7 +105,8 @@ Read each procedure right before its stage; never substitute your own.
105
105
  check. When a journey or case you run fails, copy its `NATIVE_FAILURE` line (or the failing step, error and
106
106
  evidence path) into the unit's plan row; an exit code alone is not a failure record.
107
107
  Leave code changes to workers so your attention stays on scheduling, and record each worker as the
108
- unit's `workerKind` (`implement`, `fix`, `review`). Exploration continues the run's one explorer. After a context compaction, read this file in
108
+ unit's `workerKind` (`implement`, `fix`, `review`). You own preflight findings;
109
+ delegate unresolved planning unknowns under [exploration.md](references/exploration.md#choose-the-owner). After a context compaction, read this file in
109
110
  full again before your next step: the summary keeps the run's state, not these rules. Fill
110
111
  free slots before starting your own work, stay within [expire.md](references/expire.md)'s limit, and send
111
112
  large output to files (read only the lines you need). Expect Pi's **Completions while busy: Steer active run**
@@ -149,12 +150,13 @@ Follow [preflight.md](references/preflight.md):
149
150
  efforts are run metadata, never a question.
150
151
  2. **Provisional target:** the default branch.
151
152
  3. **Plan draft:** one unit per issue, links, delivery mode; show the board.
152
- 4. **Exploration:** have one explorer record each unit's `slice` and,
153
- separately, its `proof`, in every run; reuse prior findings for units
153
+ 4. **Preflight assessment:** record each unit's `slice` and,
154
+ separately, its `proof`, yourself for clear work; use an explorer only
155
+ for concrete planning unknowns. Reuse prior findings for units
154
156
  whose evidence did not change
155
157
  ([exploration.md](references/exploration.md#reuse-first)).
156
158
  5. **Size check:** run `size-check.mjs` (exit 0; read `verdict`). On `hold` or `stop`, hold the listed
157
- units (their dependents wait, not started) and draft their splits (yours when none is drafted); on `exploration-unfinished`, continue the explorer.
159
+ units (their dependents wait, not started) and draft their splits (yours when none is drafted); on `exploration-unfinished`, complete the findings using step 4's owner routing.
158
160
  6. **Approval:** ask once for target, merge mode, scheduler mode, and plan;
159
161
  record the answers; plan each unit's branch, workspace, base, and lifecycle
160
162
  intent, and prepare a workspace only when its first worker is admitted
@@ -1,16 +1,44 @@
1
1
  # Exploration
2
2
 
3
- **One explorer per run, after the plan draft, records what sizes, orders, and
4
- blocks the units: behaviors, missing prerequisites, proof, line estimates,
5
- dependencies, contracts, and the questions that hold a unit.**
3
+ **Every run gets a coordinator-owned preflight assessment after the plan draft:**
4
+ behaviors, missing prerequisites, proof, line estimates, dependencies, contracts,
5
+ and the questions that hold a unit. A dedicated explorer is optional.
6
6
  In a one-unit run, leave `contracts`, `dependsOn`, and `stacksOn` empty.
7
7
 
8
- ## Spawn
8
+ ## Choose the owner
9
+
10
+ Read the issues, applicable repository guidance, and the few code or test paths
11
+ needed to check the plan. For clear, bounded work, write the findings yourself.
12
+ The findings are planning state, not product code; keep detailed code discovery
13
+ with implementers.
14
+
15
+ Delegate when a concrete unknown could change the plan: uncertain cross-unit
16
+ dependencies or contracts, unclear boundaries or likely splitting, or an unfamiliar
17
+ validation setup. Name the unknown and the affected units in the explorer's brief.
18
+ Multiple units or a high-risk label alone do not require an explorer; unresolved
19
+ planning uncertainty does. An unanswered product decision stays an open question,
20
+ not an invitation for the explorer to invent a requirement.
21
+
22
+ Use the same record and size check for both paths. Resolve each unit's planning
23
+ unknowns or record its open human decision before approval. On later scope or base
24
+ changes, apply this routing again only to affected units.
25
+
26
+ Resolve the assessment target to an exact commit before reading code: initially
27
+ the provisional target, then the approved target after a branch change. Record
28
+ that SHA as findings `base`; use it explicitly for reuse checks and any explorer
29
+ checkout. The coordinator's current branch is not evidence of the assessment target.
30
+
31
+ ## Optional explorer
32
+
33
+ Use at most one explorer at a time per run, on the fleet `explore` row, within
34
+ live host capacity. Reuse that explorer for further investigation when available.
35
+ Give it only the affected units and unknowns. While it writes findings, it owns
36
+ that file exclusively; collect its result before the coordinator updates it.
9
37
 
10
38
  | Field | Value |
11
39
  |---|---|
12
40
  | Model | The explorer fill ([preflight.md](preflight.md#1-model-slots)) |
13
- | Workspace | Read-only checkout of the provisional target; write only the findings directory |
41
+ | Workspace | Read-only checkout at the assessment target SHA; write only the findings directory |
14
42
  | Task plan | Absolute `task-plan.json` path; its unit ids key the findings |
15
43
  | Prior findings | Newest `.resolve-issues/rush/*/exploration/findings.json` for the same spec locator, if any |
16
44
  | Deadline | 15 minutes, plus 1 minute per unit beyond 4 |
@@ -18,15 +46,23 @@ In a one-unit run, leave `contracts`, `dependsOn`, and `stacksOn` empty.
18
46
 
19
47
  ## Reuse first
20
48
 
21
- **When prior findings exist, explore only the units whose evidence changed.**
22
- Run, before spawning, and give the explorer its output:
49
+ **Reuse requires unchanged requirements as well as unchanged code evidence.**
50
+ First compare each unit's current criteria, dependency contracts, relevant guidance,
51
+ and recorded decisions with the prior assessment. Reassess affected units even if
52
+ the helper below says `reuse`; it checks Git evidence paths, not those inputs.
53
+ When the prior inputs cannot be established, reassess that unit.
54
+
55
+ Run the code-evidence check against the exact assessment target, not the caller's
56
+ `HEAD`; include the output and any forced reassessments in an explorer brief:
23
57
 
24
58
  ```bash
25
59
  node <skill-base-dir>/scripts/findings-reuse.mjs \
26
- --prior <prior findings.json> --units <this run's unit ids, comma-separated>
60
+ --prior <prior findings.json> --units <this run's unit ids, comma-separated> \
61
+ --head <assessment-target-SHA>
27
62
  ```
28
63
 
29
- - `reuse`: copy the entry unchanged, with the new `base`.
64
+ - `reuse`: copy the entry unchanged only when the non-code inputs above also
65
+ match, with the new `base`.
30
66
  - `recheck`: re-explore the entry; its `changed` files are where to look.
31
67
  - `new`: explore from scratch.
32
68
 
@@ -34,7 +70,9 @@ Example: a resumed run starts after earlier units merged `src/charge/`; only
34
70
  the two units whose evidence names `src/charge/` are re-explored, the other
35
71
  four are copied.
36
72
 
37
- ## Brief
73
+ ## Assessment record
74
+
75
+ The coordinator and any delegated explorer use these rules:
38
76
 
39
77
  1. **Scaffold, then save one unit at a time.** Keep an existing
40
78
  `findings.json`; otherwise create it with `version: 2`, the `base` SHA,
@@ -106,7 +144,7 @@ four are copied.
106
144
  journey; `local` runs that Charge journey script on an owned emulator,
107
145
  not the repository's default phone journey.
108
146
  - Findings saved before `local` and `skill` existed are unfinished:
109
- continue the explorer to add them, even when reusing the rest.
147
+ add them before the size check, even when reusing the rest.
110
148
  - `physical`: evidence only a real device gives; else empty.
111
149
 
112
150
  - `groups` and `setups` (only when `slice.newProductBehaviorCount` is
@@ -193,10 +231,14 @@ it then.
193
231
 
194
232
  ## Completion
195
233
 
196
- Confirm the findings exist, the model read-back matches, and no product source
197
- changed. Never edit the findings yourself. Run the size check; on `exploration-unfinished` or
198
- tool failures, continue the explorer with the errors. At the deadline, have it
199
- save what it has and stop; continue it in the same directory for the units
200
- still empty while size-check problems plus empty units reach new lows, then follow
201
- [expire.md](expire.md). Never skip exploration;
202
- reuse is not skipping.
234
+ Confirm the findings exist and no product source changed. For delegated work,
235
+ also confirm the model read-back matches and inspect the result. Run the size
236
+ check; `exploration-unfinished` means complete or repair the findings, not spawn
237
+ a worker automatically. Correct a missing field yourself when the evidence is
238
+ clear; continue the explorer only for unresolved investigation.
239
+
240
+ At an explorer's deadline, have it save what it has and stop. Inspect its partial
241
+ findings, complete clear entries yourself, and continue investigation only for
242
+ remaining unknowns while size-check problems plus empty units reach new lows;
243
+ then follow [expire.md](expire.md). Finish the fleet `explore` row once the
244
+ assessment and size check are complete, even when no explorer was needed.
@@ -76,7 +76,7 @@ the same work. A passing setup check is not a substitute for the blocked behavio
76
76
  No additional report or result schema is required.
77
77
 
78
78
  Have the implementer treat findings as leads, find its own code, and report
79
- any `product`, `scope`, `design`, or `approval` question the explorer missed and any
79
+ any `product`, `scope`, `design`, or `approval` question the assessment missed and any
80
80
  human-only proof. Report each question in the result's `decisionNeeded`
81
81
  ([expire.md](expire.md#decide-before-you-defer)); add each proof as a
82
82
  handback step. Never edit `findings.json`.
@@ -11,10 +11,22 @@ until step 6.
11
11
  node <skill-base-dir>/scripts/plan-sync.mjs --find-run --runs .resolve-issues/rush --issue <owner/name#123>
12
12
  ```
13
13
 
14
- When it prints a directory, resume that run (`next-actions.mjs --run <dir> --resume` with
15
- [fresh capacity](implementation.md#live-capacity))
16
- instead of starting another; its plan picks up whatever the tree gained
17
- since. It exits 0 whether or not it found a run: no run prints nothing on stdout
14
+ When it prints a directory, reuse that run instead of starting another. Before
15
+ calling the scheduler, reload its plan, decisions and standing orders. Refresh the
16
+ source requirements as described under [issue-tree sync](task-plan.md#issue-tree-sync)
17
+ and resolve the recorded target to its current exact SHA. Apply
18
+ [assessment reuse](exploration.md#reuse-first) against those inputs.
19
+
20
+ If assessment was interrupted, findings are incomplete, or affected requirements or
21
+ target evidence changed, complete step 4 and rerun step 5 for those units before
22
+ scheduling them. Finish any outstanding step 6 approval once; preserve choices
23
+ already approved. A saved size stop remains held until reassessment clears it or
24
+ its `runWhole` recommendation is accepted. Do not treat a scheduler action as proof
25
+ that assessment or approval finished.
26
+
27
+ Then resume with `next-actions.mjs --run <dir> --resume` and
28
+ [fresh capacity](implementation.md#live-capacity); its plan picks up whatever the
29
+ tree gained since. The run finder exits 0 whether or not it found a run: no run prints nothing on stdout
18
30
  (`--json`: `{"found":false}`). Example: `/rush-issues #12` finds the run whose saved tree holds
19
31
  #12 and resumes it, never a second run beside it.
20
32
 
@@ -28,7 +40,7 @@ The script exits 0 whenever it ran (2 if it could not); read `outcome` in its JS
28
40
 
29
41
  - **`ready`:** continue. An open issue is work, whatever its sub-issues
30
42
  say: each `rollups` entry (open, every sub-issue closed) is a unit; the
31
- explorer records what is left, or that nothing is, and then the handback
43
+ assessment records what is left, or that nothing is, and then the handback
32
44
  says "close #N". Example: held #40's filed prerequisite #41 closed;
33
45
  #40 is a rollup and stays a unit.
34
46
  - **`unlabeled`:** continue as on `ready`, and record the `missing` issues for
@@ -78,9 +90,11 @@ posts them; they join this run's end-of-run review
78
90
 
79
91
  ## 1. Model slots
80
92
 
81
- Write this turn's host evidence to a temporary JSON file and run the fast path
82
- ([shared-modules.md](shared-modules.md#model-slots)); record its fills by exact id
83
- and effort. The skill names the roles — implementer, explorer, diagnoser,
93
+ Follow [model slots](shared-modules.md#model-slots): on Pi, inspect the live native
94
+ catalog first after checking task overrides and authoritative host preferences;
95
+ use the portable resolver when native role resolution is unavailable or cannot
96
+ validate either exact request. Record the actual fills by
97
+ exact id and effort. The skill names the roles — implementer, explorer, diagnoser,
84
98
  reviewer — and the harness agent catalog chooses the models, so rank nothing and
85
99
  copy nothing from a ladder. The fills are run metadata: show each role's model
86
100
  and effort on the board and never ask which model should implement. A model the
@@ -92,14 +106,23 @@ add the repository's deterministic domain checks and review depth, never change
92
106
  the workflow or re-choose the model.
93
107
 
94
108
  Pass a pinned implementer (`implementer=<id[@effort]>` in the invocation) as
95
- `--implementer`. Any `ok: false` result ends the run at preflight with its `code`
96
- and `reason`, starting nothing: `pinned-implementer-unavailable` means the pinned
97
- model is unavailable and no other implementer is substituted, and
98
- `catalog-unavailable` or `capabilities-missing` means this host cannot resolve
99
- roles yet. Never revive the old picker or reuse an earlier run's pick.
109
+ `--implementer` on the portable path. A declined result stops preflight with its
110
+ `code` and `reason`, starting nothing: `pinned-implementer-unavailable` means the
111
+ pinned model is unavailable and no other implementer is substituted;
112
+ `catalog-unavailable` means the portable resolver could not be invoked.
113
+ `capabilities-missing` means its input lacks model evidence: repair an omitted
114
+ field from current host evidence and retry, or report precisely what could not
115
+ be obtained. It does not establish a missing harness capability. Never revive
116
+ the old picker or reuse an earlier run's pick.
100
117
  Example: `/rush-issues 1aboveio/ai#1545 implementer=gpt-6-luna@high` on a host
101
118
  whose catalog does not offer `gpt-6-luna` stops at preflight and starts nothing.
102
119
 
120
+ **Catalog limitation:** optional exploration skips the worker, not catalog
121
+ resolution. Both paths still require all four fills, including
122
+ the explorer, even for coordinator-only assessment. Report a missing explorer as
123
+ a catalog block; do not extract other fills from a declined response or substitute
124
+ a model. Explorer-independent resolution needs a supported upstream protocol.
125
+
103
126
  ## 2. Provisional target
104
127
 
105
128
  Fetch remote heads; record the default branch as `targetBranch`.
@@ -118,11 +141,13 @@ Example: epic #12's #20 (signed release and go/no-go) and #21
118
141
  (physical acceptance) stay out of the plan; the run ends when its code units
119
142
  land instead of waiting on them.
120
143
 
121
- ## 4. Explore
144
+ ## 4. Assess the plan
122
145
 
123
- Run [exploration.md](exploration.md) on the provisional target, with any
124
- prior findings for the same spec. On tool failures or a size-check `exploration-unfinished` verdict,
125
- continue the explorer with the errors. Add the links the findings show.
146
+ Follow [exploration.md](exploration.md#choose-the-owner) on the provisional
147
+ target, reusing prior findings for the same spec. Write findings yourself for
148
+ clear work; delegate concrete planning unknowns to an optional explorer.
149
+ On tool failures or `exploration-unfinished`, complete the affected findings
150
+ using the same owner routing. Add the links the findings show.
126
151
 
127
152
  ## 5. Size check
128
153
 
@@ -154,7 +179,7 @@ by row 1 of [Never block on the human](#never-block-on-the-human).
154
179
  | `ok`, `warn` | Continue |
155
180
  | `hold` | Hold the `held` units (their dependents wait, not started); start the `runnable` units |
156
181
  | `stop` | Run-wide failure or every unit held; draft the held units' splits |
157
- | `exploration-unfinished` | Continue the explorer with the error |
182
+ | `exploration-unfinished` | Complete the findings using step 4's owner routing |
158
183
  | exit 2 | Fix the plan or command |
159
184
 
160
185
  Only scope and open questions hold a unit; proof only warns. Add each
@@ -285,7 +310,7 @@ Example: `/resolve-issues` answered "run the rest" files nothing;
285
310
  prerequisites keeps its unit, now depending on them.
286
311
  Example: #30 splits into #50 and #51, so the sync adds both, drops 30,
287
312
  and unit 34, `blocked_by` #30, now waits on 50 and 51.
288
- 4. Continue the explorer for the new units only; rerun the size check.
313
+ 4. Assess the new units only using step 4's owner routing; rerun the size check.
289
314
  5. Split a still-held slice again only while splitting makes progress: its
290
315
  largest slice is smaller than the one before.
291
316
  Example: a 7,287-line unit split into 3,455 and 2,150 lines; a held
@@ -348,16 +373,16 @@ in one interaction, with the native single-choice tool when there is one:
348
373
 
349
374
  Record each answer in `decisions`, then:
350
375
 
351
- - New target: fetch it, continue the explorer to recheck the findings, rerun
376
+ - New target: fetch it, reassess affected findings using step 4's owner routing, rerun
352
377
  the size check; ask again only if it worsens to `hold` or `stop`.
353
- - Trim: drop the scope, continue the explorer to remove its questions and
378
+ - Trim: drop the scope, remove its findings, questions and
354
379
  handback items, rerun the size check.
355
380
  - File the splits: follow [File a split](#file-a-split); ask again only if
356
381
  the size check returns `stop`.
357
382
  - Move to later: mark the units `blocked` (`blockedReason: human-decision`, `humanItem: 1`, the human's words as `humanNeed`); they stay in
358
383
  this run's plan and resume with it (one run per spec). Never start a
359
384
  separate follow-up run for the same spec.
360
- - Answer: record it, continue the explorer to set the question
385
+ - Answer: record it, set the question
361
386
  `resolved: true`, rerun the size check.
362
387
  - Run the rest: mark held units `blocked` (`blockedReason: size-hold`) with the split path;
363
388
  their dependents stay not started (`pending`).
@@ -11,7 +11,8 @@ restate its rules in the brief beyond the two below.
11
11
  - Reviewer model: a different id from the implementer's
12
12
  ([preflight.md](preflight.md#1-model-slots)). Launch the reviewer with the
13
13
  plan's recorded reviewer fill — its `launch`, `instructions`, `selection` and
14
- `catalogDigest` ([task-plan.md](task-plan.md#worker-selection-on-resume)) — as
14
+ native `catalogRevision` or portable `catalogDigest`
15
+ ([task-plan.md](task-plan.md#worker-selection-on-resume)) — as
15
16
  structured launch arguments, never as brief text and never a model id
16
17
  hardcoded here. On Pi that `launch` is what the live role resolver receives,
17
18
  `{ role }` unless an explicit task override or this host's own preference
@@ -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