@ikon85/agent-workflow-kit 0.44.1 → 0.45.0

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 (67) hide show
  1. package/.agents/skills/audit-skills/SKILL.md +7 -4
  2. package/.agents/skills/code-review/SKILL.md +7 -4
  3. package/.agents/skills/codebase-design/DESIGN-IT-TWICE.md +7 -4
  4. package/.agents/skills/improve-codebase-architecture/INTERFACE-DESIGN.md +7 -4
  5. package/.agents/skills/improve-codebase-architecture/SKILL.md +7 -4
  6. package/.agents/skills/orchestrate-wave/SKILL.md +1 -1
  7. package/.agents/skills/orchestrate-wave/references/dispatch-subagents.md +9 -0
  8. package/.agents/skills/orchestrate-wave/references/dispatch-workflow.md +9 -0
  9. package/.agents/skills/research/SKILL.md +7 -4
  10. package/.agents/skills/to-issues/SKILL.md +25 -4
  11. package/.claude/skills/audit-skills/SKILL.md +7 -4
  12. package/.claude/skills/code-review/SKILL.md +7 -4
  13. package/.claude/skills/codebase-design/DESIGN-IT-TWICE.md +7 -4
  14. package/.claude/skills/codex-build/SKILL.md +13 -0
  15. package/.claude/skills/codex-review/SKILL.md +13 -0
  16. package/.claude/skills/grill-me-codex/SKILL.md +14 -0
  17. package/.claude/skills/grill-with-docs-codex/SKILL.md +14 -0
  18. package/.claude/skills/improve-codebase-architecture/INTERFACE-DESIGN.md +7 -4
  19. package/.claude/skills/improve-codebase-architecture/SKILL.md +7 -4
  20. package/.claude/skills/orchestrate-wave/SKILL.md +1 -1
  21. package/.claude/skills/orchestrate-wave/references/dispatch-subagents.md +9 -0
  22. package/.claude/skills/orchestrate-wave/references/dispatch-workflow.md +9 -0
  23. package/.claude/skills/research/SKILL.md +7 -4
  24. package/.claude/skills/skill-manifest.json +34 -23
  25. package/.claude/skills/to-issues/SKILL.md +25 -4
  26. package/README.md +71 -0
  27. package/agent-workflow-kit.package.json +149 -45
  28. package/package.json +1 -1
  29. package/scripts/doctrine-migration/index.mjs +296 -0
  30. package/scripts/kit-release.mjs +41 -9
  31. package/src/cli.mjs +521 -80
  32. package/src/commands/routing-status.mjs +288 -0
  33. package/src/commands/update.mjs +9 -1
  34. package/src/consumer-migrations.json +23 -1
  35. package/src/lib/bundle.mjs +158 -2
  36. package/src/lib/consumerMigrations.mjs +55 -0
  37. package/src/lib/dispatchJournal.mjs +300 -0
  38. package/src/lib/dispatchPlan.mjs +286 -0
  39. package/src/lib/dispatchReceipt.mjs +226 -89
  40. package/src/lib/frontendWorkloads.mjs +35 -33
  41. package/src/lib/routeDispatcher.mjs +367 -70
  42. package/src/lib/routingAccessGraph.mjs +265 -20
  43. package/src/lib/routingAccessGraphStore.mjs +300 -0
  44. package/src/lib/routingAdapters/claude.mjs +104 -4
  45. package/src/lib/routingAdapters/codex.mjs +132 -7
  46. package/src/lib/routingAdapters/hostBridge.mjs +291 -0
  47. package/src/lib/routingCatalog.mjs +201 -24
  48. package/src/lib/routingDispatchLease.mjs +253 -0
  49. package/src/lib/routingEvidenceCache.mjs +78 -0
  50. package/src/lib/routingIntent.mjs +176 -10
  51. package/src/lib/routingIntentClassifier.mjs +137 -0
  52. package/src/lib/routingInventory/snapshots/claude.json +49 -0
  53. package/src/lib/routingInventory/snapshots/codex.json +109 -0
  54. package/src/lib/routingInventory.mjs +182 -0
  55. package/src/lib/routingPolicy.mjs +193 -6
  56. package/src/lib/routingProfile.mjs +1251 -123
  57. package/src/lib/routingProfilePolicy.mjs +156 -0
  58. package/src/lib/routingProfileStorage.mjs +299 -0
  59. package/src/lib/routingResolver.mjs +369 -86
  60. package/src/lib/routingSources/artificialAnalysis.mjs +19 -7
  61. package/src/lib/routingSources/benchlm.mjs +5 -0
  62. package/src/lib/routingSources/codeArena.mjs +13 -3
  63. package/src/lib/routingSources/deepswe.mjs +19 -5
  64. package/src/lib/routingSources/openhands.mjs +17 -4
  65. package/src/lib/routingSources/openhandsFrontend.mjs +13 -3
  66. package/src/lib/safeText.mjs +26 -0
  67. package/src/lib/updateCandidate.mjs +36 -3
@@ -122,10 +122,13 @@ otherwise stay invisible.
122
122
 
123
123
  ### 2. Audit in parallel — one subagent per skill
124
124
 
125
- Before dispatch, resolve a provider-neutral Routing intent through
126
- `src/lib/routeDispatcher.mjs` and require a Dispatch receipt from the shared
127
- spawn guard. A detected transport is not authorization; AFK dispatch stops
128
- unless requested/applied route, model/effort enforcement, environment
125
+ Before dispatch, resolve a provider-neutral Routing intent — an explicit intent
126
+ block first, otherwise the workflow classifier and authorize the whole run
127
+ once through a Dispatch plan whose hash binds every unit, intent, route and
128
+ reason. Dispatch only through `src/lib/routeDispatcher.mjs`, and require a
129
+ Dispatch receipt from the shared spawn guard that carries the authorization id
130
+ the plan recorded. A detected transport is not authorization; AFK dispatch
131
+ stops unless requested/applied route, model/effort enforcement, environment
129
132
  precedence, and catalog/access/policy revisions are proved.
130
133
 
131
134
  Run **one read-only research subagent per skill** — several in parallel in a
@@ -81,10 +81,13 @@ When `projectEnrichment` is active, read `docs/agents/code-review.md` first. App
81
81
 
82
82
  ## Execution
83
83
 
84
- Before dispatch, resolve a provider-neutral Routing intent through
85
- `src/lib/routeDispatcher.mjs` and require a Dispatch receipt from the shared
86
- spawn guard. A detected transport is not authorization; AFK dispatch stops
87
- unless requested/applied route, model/effort enforcement, environment
84
+ Before dispatch, resolve a provider-neutral Routing intent — an explicit intent
85
+ block first, otherwise the workflow classifier and authorize the whole run
86
+ once through a Dispatch plan whose hash binds every unit, intent, route and
87
+ reason. Dispatch only through `src/lib/routeDispatcher.mjs`, and require a
88
+ Dispatch receipt from the shared spawn guard that carries the authorization id
89
+ the plan recorded. A detected transport is not authorization; AFK dispatch
90
+ stops unless requested/applied route, model/effort enforcement, environment
88
91
  precedence, and catalog/access/policy revisions are proved.
89
92
 
90
93
  - Run both axes as **parallel sub-agents** — separate context each, so neither poisons the other's read. Give the Standards sub-agent the Standards sources **plus** the full Fowler baseline in its prompt; it has no other way to see the baseline.
@@ -18,10 +18,13 @@ Show this to the user, then immediately proceed to Step 2. The user reads and th
18
18
 
19
19
  ### 2. Spawn sub-agents
20
20
 
21
- Before dispatch, resolve a provider-neutral Routing intent through
22
- `src/lib/routeDispatcher.mjs` and require a Dispatch receipt from the shared
23
- spawn guard. A detected transport is not authorization; AFK dispatch stops
24
- unless requested/applied route, model/effort enforcement, environment
21
+ Before dispatch, resolve a provider-neutral Routing intent — an explicit intent
22
+ block first, otherwise the workflow classifier and authorize the whole run
23
+ once through a Dispatch plan whose hash binds every unit, intent, route and
24
+ reason. Dispatch only through `src/lib/routeDispatcher.mjs`, and require a
25
+ Dispatch receipt from the shared spawn guard that carries the authorization id
26
+ the plan recorded. A detected transport is not authorization; AFK dispatch
27
+ stops unless requested/applied route, model/effort enforcement, environment
25
28
  precedence, and catalog/access/policy revisions are proved.
26
29
 
27
30
  <!-- mirror-xform:start codex-parallel-subagent-dispatch -->
@@ -18,10 +18,13 @@ Show this to the user, then immediately proceed to Step 2. The user reads and th
18
18
 
19
19
  ### 2. Spawn sub-agents
20
20
 
21
- Before dispatch, resolve a provider-neutral Routing intent through
22
- `src/lib/routeDispatcher.mjs` and require a Dispatch receipt from the shared
23
- spawn guard. A detected transport is not authorization; AFK dispatch stops
24
- unless requested/applied route, model/effort enforcement, environment
21
+ Before dispatch, resolve a provider-neutral Routing intent — an explicit intent
22
+ block first, otherwise the workflow classifier and authorize the whole run
23
+ once through a Dispatch plan whose hash binds every unit, intent, route and
24
+ reason. Dispatch only through `src/lib/routeDispatcher.mjs`, and require a
25
+ Dispatch receipt from the shared spawn guard that carries the authorization id
26
+ the plan recorded. A detected transport is not authorization; AFK dispatch
27
+ stops unless requested/applied route, model/effort enforcement, environment
25
28
  precedence, and catalog/access/policy revisions are proved.
26
29
 
27
30
  <!-- mirror-xform:start codex-parallel-subagent-dispatch -->
@@ -43,10 +43,13 @@ This skill is _informed_ by the project's domain model. The domain language give
43
43
 
44
44
  Read the project's domain glossary and any ADRs in the area you're touching first.
45
45
 
46
- Before dispatch, resolve a provider-neutral Routing intent through
47
- `src/lib/routeDispatcher.mjs` and require a Dispatch receipt from the shared
48
- spawn guard. A detected transport is not authorization; AFK dispatch stops
49
- unless requested/applied route, model/effort enforcement, environment
46
+ Before dispatch, resolve a provider-neutral Routing intent — an explicit intent
47
+ block first, otherwise the workflow classifier and authorize the whole run
48
+ once through a Dispatch plan whose hash binds every unit, intent, route and
49
+ reason. Dispatch only through `src/lib/routeDispatcher.mjs`, and require a
50
+ Dispatch receipt from the shared spawn guard that carries the authorization id
51
+ the plan recorded. A detected transport is not authorization; AFK dispatch
52
+ stops unless requested/applied route, model/effort enforcement, environment
50
53
  precedence, and catalog/access/policy revisions are proved.
51
54
 
52
55
  <!-- mirror-xform:start codex-explorer-dispatch -->
@@ -109,7 +109,7 @@ node scripts/readiness.mjs check --skill orchestrate-wave --json
109
109
  Pass only host-supplied inventory through `capabilityAdapter.claude` or `.codex`,
110
110
  then call the selector. It returns exactly one target; missing or `unknown` evidence
111
111
  degrades A → B → C. A model claim is not evidence; do not emulate a missing primitive.
112
- Before any spawn, resolve the provider-neutral Routing intent through the shared resolver and spawn guard, then use the active Claude or Codex adapter. Codex contributes only its dated host attestation through `routingAdapters/codex.mjs`; it does not create a second catalog, Access graph, or Routing policy. A detected transport is not authorization. The Dispatch receipt must show requested and applied route, model/effort enforcement, environment precedence on mismatch, and catalog/access/policy revisions. AFK blocks unverified, unauthorized, overridden, unenforced, or silently degraded routes; a Codex host without model and effort selectors blocks differentiated AFK before spawn, and unreachable routes follow policy handoff/inherit/block exactly.
112
+ Before dispatch, resolve a provider-neutral Routing intent — an explicit intent block first, otherwise the workflow classifier — and authorize the whole run once through a Dispatch plan whose hash binds every unit, intent, route and reason. Dispatch only through `src/lib/routeDispatcher.mjs`, and require a Dispatch receipt from the shared spawn guard that carries the authorization id the plan recorded. A detected transport is not authorization; AFK dispatch stops unless requested/applied route, model/effort enforcement, environment precedence, and catalog/access/policy revisions are proved. Before any spawn, resolve the provider-neutral Routing intent through the shared resolver and spawn guard, then use the active Claude or Codex adapter. Codex contributes only its dated host attestation through `routingAdapters/codex.mjs`; it does not create a second catalog, Access graph, or Routing policy. A detected transport is not authorization. The Dispatch receipt must show requested and applied route, model/effort enforcement, environment precedence on mismatch, and catalog/access/policy revisions. AFK blocks unverified, unauthorized, overridden, unenforced, or silently degraded routes; a Codex host without model and effort selectors blocks differentiated AFK before spawn, and unreachable routes follow policy handoff/inherit/block exactly.
113
113
  - **Path A:** requires the literal `Workflow` tool, callable and permitted, plus
114
114
  individually proven named phases, run identity, runtime output validation,
115
115
  journal, and resume. Then read [its recipe](references/dispatch-workflow.md).
@@ -54,6 +54,15 @@ Reconciliation is never delegated to a subagent.
54
54
 
55
55
  ## Round 2 — Build
56
56
 
57
+ Before dispatch, resolve a provider-neutral Routing intent — an explicit intent
58
+ block first, otherwise the workflow classifier — and authorize the whole run
59
+ once through a Dispatch plan whose hash binds every unit, intent, route and
60
+ reason. Dispatch only through `src/lib/routeDispatcher.mjs`, and require a
61
+ Dispatch receipt from the shared spawn guard that carries the authorization id
62
+ the plan recorded. A detected transport is not authorization; AFK dispatch
63
+ stops unless requested/applied route, model/effort enforcement, environment
64
+ precedence, and catalog/access/policy revisions are proved.
65
+
57
66
  For the current reconciled batch, spawn **one builder per slice**, again as one
58
67
  concurrent batch joined by an explicit wait. Give each builder the verbatim
59
68
  builder contract, its reconciled allowlist, and its required commands. Resolve
@@ -48,6 +48,15 @@ current reconciled batch, make one `agent()` call per slice with explicit
48
48
  the reconciled allowlist and required commands in each verbatim builder prompt;
49
49
  the main thread still performs `semanticVerify` on every returned report.
50
50
 
51
+ Before dispatch, resolve a provider-neutral Routing intent — an explicit intent
52
+ block first, otherwise the workflow classifier — and authorize the whole run
53
+ once through a Dispatch plan whose hash binds every unit, intent, route and
54
+ reason. Dispatch only through `src/lib/routeDispatcher.mjs`, and require a
55
+ Dispatch receipt from the shared spawn guard that carries the authorization id
56
+ the plan recorded. A detected transport is not authorization; AFK dispatch
57
+ stops unless requested/applied route, model/effort enforcement, environment
58
+ precedence, and catalog/access/policy revisions are proved.
59
+
51
60
  Before each `agent()` call, resolve its provider-neutral Routing intent and pass
52
61
  the decision through the shared spawn guard and active surface adapter. The
53
62
  Claude adapter must attest Workflow model/effort precedence in the current
@@ -11,10 +11,13 @@ Before applying this Core skill, run `node scripts/project-skill-extension.mjs i
11
11
  Project extensions may specialize Project details, but cannot weaken Core user gates, safety, ownership, or validation. A contradiction blocks and requires an Explicit fork.
12
12
  <!-- project-extension:protocol-v1:end -->
13
13
 
14
- Before dispatch, resolve a provider-neutral Routing intent through
15
- `src/lib/routeDispatcher.mjs` and require a Dispatch receipt from the shared
16
- spawn guard. A detected transport is not authorization; AFK dispatch stops
17
- unless requested/applied route, model/effort enforcement, environment
14
+ Before dispatch, resolve a provider-neutral Routing intent — an explicit intent
15
+ block first, otherwise the workflow classifier and authorize the whole run
16
+ once through a Dispatch plan whose hash binds every unit, intent, route and
17
+ reason. Dispatch only through `src/lib/routeDispatcher.mjs`, and require a
18
+ Dispatch receipt from the shared spawn guard that carries the authorization id
19
+ the plan recorded. A detected transport is not authorization; AFK dispatch
20
+ stops unless requested/applied route, model/effort enforcement, environment
18
21
  precedence, and catalog/access/policy revisions are proved.
19
22
 
20
23
  Spin up a **background agent** to do the research, so you keep working while it reads.
@@ -436,6 +436,20 @@ Reference the blocking ticket(s), or "None - can start immediately".
436
436
  **Decision:** <chosen option + why it wins on the criteria that matter + what was consciously traded off>
437
437
  **Verdict sink:** <ADR / this body / follow-up slice #N>
438
438
 
439
+ ## Routing intent
440
+ <!-- Provider-neutral and durable: the dimensions of the WORK, never a model,
441
+ effort, or provider name. Written as ONE blank-line-delimited block so the
442
+ dispatching surface can read it as the explicit intent instead of guessing
443
+ from workflow signals; a second such block in the body makes it ambiguous
444
+ and unreadable. Keys and vocabularies are owned by the intent schema. -->
445
+ intent-version: 2
446
+ routing-intent: <judgment | development | mechanical>
447
+ reasoning-intent: <deep | balanced | light>
448
+ task-shape: <single-step | multi-step | long-horizon>
449
+ risk: <low | moderate | high>
450
+ autonomy-requirement: <supervised | afk>
451
+ context-need: <focused | repository | long-context>
452
+
439
453
  ## Handoff Start Command
440
454
  <!-- SELF-CONTAINED: scope + live-verify live HERE, never as a "see anchor
441
455
  handoff" pointer — the anchor carries no per-slice handoff blocks anymore, and a
@@ -444,7 +458,7 @@ Reference the blocking ticket(s), or "None - can start immediately".
444
458
  ```
445
459
  Welle <N> · Slice <X> (<closes #x | refs #<prd#>, Parent #<prd#>>). Read #<prd#> for decisions.
446
460
  Start skill: 🧭 Design Grill → /grill-with-docs · 🔬 Verify Spike → /verify-spike · 📐 Trade-off/Research → /decision-gate · AFK → /implement · HITL → /grill-me → /implement.
447
- Routing intent: `routing-intent: <judgment | development | mechanical>` · `reasoning-intent: <deep | balanced | light>`. The dispatching surface resolves the current executable route; never persist that provider route here.
461
+ Routing intent: the body's `## Routing intent` block read it as the explicit intent. The dispatching surface resolves the current executable route from it; never persist that provider route here.
448
462
  Worktree: your project's worktree helper, or `git worktree add`
449
463
  Scope (<N> files) — REQUIRED FIELD, blast-radius estimate at cut time; the build session checks it against its own recon findings, >2x deviation → STOP:
450
464
  - <concrete file + change>
@@ -453,10 +467,17 @@ PR: <closes #x | Part of #<prd#> — NEVER closes on the anchor>.
453
467
  ```
454
468
  <!-- mirror-xform:end -->
455
469
 
470
+ Every published issue carries that block, gate slices included — an unstated
471
+ intent forces the dispatching surface to classify from workflow signals, and a
472
+ guess is what the block exists to replace. Fill each dimension from the slice
473
+ itself: `autonomy-requirement: afk` only for the AFK bucket (§5c), `supervised`
474
+ for every HITL slice.
475
+
456
476
  At execution time, consume that provider-neutral intent only through
457
- `src/lib/routeDispatcher.mjs` and its shared spawn guard. The active Claude or
458
- Codex adapter must produce Dispatch receipt v2 with requested/applied route,
459
- model/effort enforcement, precedence, and catalog/access/policy revisions
477
+ `src/lib/routeDispatcher.mjs` and its shared spawn guard, under the Dispatch
478
+ plan that authorized the run. The active Claude or Codex adapter must produce
479
+ Dispatch receipt v2 with requested/applied route, model/effort enforcement,
480
+ precedence, the plan's authorization id, and catalog/access/policy revisions
460
481
  before an AFK subagent starts; the durable issue never claims that proof.
461
482
  </issue-template>
462
483
 
@@ -122,10 +122,13 @@ otherwise stay invisible.
122
122
 
123
123
  ### 2. Audit in parallel — one subagent per skill
124
124
 
125
- Before dispatch, resolve a provider-neutral Routing intent through
126
- `src/lib/routeDispatcher.mjs` and require a Dispatch receipt from the shared
127
- spawn guard. A detected transport is not authorization; AFK dispatch stops
128
- unless requested/applied route, model/effort enforcement, environment
125
+ Before dispatch, resolve a provider-neutral Routing intent — an explicit intent
126
+ block first, otherwise the workflow classifier and authorize the whole run
127
+ once through a Dispatch plan whose hash binds every unit, intent, route and
128
+ reason. Dispatch only through `src/lib/routeDispatcher.mjs`, and require a
129
+ Dispatch receipt from the shared spawn guard that carries the authorization id
130
+ the plan recorded. A detected transport is not authorization; AFK dispatch
131
+ stops unless requested/applied route, model/effort enforcement, environment
129
132
  precedence, and catalog/access/policy revisions are proved.
130
133
 
131
134
  Run **one read-only research subagent per skill** — several in parallel in a
@@ -81,10 +81,13 @@ When `projectEnrichment` is active, read `docs/agents/code-review.md` first. App
81
81
 
82
82
  ## Execution
83
83
 
84
- Before dispatch, resolve a provider-neutral Routing intent through
85
- `src/lib/routeDispatcher.mjs` and require a Dispatch receipt from the shared
86
- spawn guard. A detected transport is not authorization; AFK dispatch stops
87
- unless requested/applied route, model/effort enforcement, environment
84
+ Before dispatch, resolve a provider-neutral Routing intent — an explicit intent
85
+ block first, otherwise the workflow classifier and authorize the whole run
86
+ once through a Dispatch plan whose hash binds every unit, intent, route and
87
+ reason. Dispatch only through `src/lib/routeDispatcher.mjs`, and require a
88
+ Dispatch receipt from the shared spawn guard that carries the authorization id
89
+ the plan recorded. A detected transport is not authorization; AFK dispatch
90
+ stops unless requested/applied route, model/effort enforcement, environment
88
91
  precedence, and catalog/access/policy revisions are proved.
89
92
 
90
93
  - Run both axes as **parallel sub-agents** — separate context each, so neither poisons the other's read. Give the Standards sub-agent the Standards sources **plus** the full Fowler baseline in its prompt; it has no other way to see the baseline.
@@ -18,10 +18,13 @@ Show this to the user, then immediately proceed to Step 2. The user reads and th
18
18
 
19
19
  ### 2. Spawn sub-agents
20
20
 
21
- Before dispatch, resolve a provider-neutral Routing intent through
22
- `src/lib/routeDispatcher.mjs` and require a Dispatch receipt from the shared
23
- spawn guard. A detected transport is not authorization; AFK dispatch stops
24
- unless requested/applied route, model/effort enforcement, environment
21
+ Before dispatch, resolve a provider-neutral Routing intent — an explicit intent
22
+ block first, otherwise the workflow classifier and authorize the whole run
23
+ once through a Dispatch plan whose hash binds every unit, intent, route and
24
+ reason. Dispatch only through `src/lib/routeDispatcher.mjs`, and require a
25
+ Dispatch receipt from the shared spawn guard that carries the authorization id
26
+ the plan recorded. A detected transport is not authorization; AFK dispatch
27
+ stops unless requested/applied route, model/effort enforcement, environment
25
28
  precedence, and catalog/access/policy revisions are proved.
26
29
 
27
30
  <!-- mirror-xform:start codex-parallel-subagent-dispatch -->
@@ -21,6 +21,19 @@ The role-flip of `/codex-review`: there, Claude builds the plan and Codex critiq
21
21
 
22
22
  ## Prerequisites (verify once, fast)
23
23
 
24
+ Before dispatch, resolve a provider-neutral Routing intent — an explicit intent
25
+ block first, otherwise the workflow classifier — and authorize the whole run
26
+ once through a Dispatch plan whose hash binds every unit, intent, route and
27
+ reason. Dispatch only through `src/lib/routeDispatcher.mjs`, and require a
28
+ Dispatch receipt from the shared spawn guard that carries the authorization id
29
+ the plan recorded. A detected transport is not authorization; AFK dispatch
30
+ stops unless requested/applied route, model/effort enforcement, environment
31
+ precedence, and catalog/access/policy revisions are proved.
32
+
33
+ `scripts/codex-exec.sh` is the transport that decision names, never a
34
+ second router: the wrapper applies the resolved pair and its rollout file
35
+ is the readback the receipt quotes. Echoing a config default is not proof.
36
+
24
37
  - Let `scripts/codex-exec.sh` preflight Codex before launch. It enforces the
25
38
  exact tested-version allowlist, authentication, platform, and capabilities;
26
39
  surface any failure rather than retrying silently.
@@ -19,6 +19,19 @@ This is a **deliberate, high-stakes tool** — reach for it on auth, data models
19
19
 
20
20
  ## Prerequisites (verify once, fast)
21
21
 
22
+ Before dispatch, resolve a provider-neutral Routing intent — an explicit intent
23
+ block first, otherwise the workflow classifier — and authorize the whole run
24
+ once through a Dispatch plan whose hash binds every unit, intent, route and
25
+ reason. Dispatch only through `src/lib/routeDispatcher.mjs`, and require a
26
+ Dispatch receipt from the shared spawn guard that carries the authorization id
27
+ the plan recorded. A detected transport is not authorization; AFK dispatch
28
+ stops unless requested/applied route, model/effort enforcement, environment
29
+ precedence, and catalog/access/policy revisions are proved.
30
+
31
+ `scripts/codex-exec.sh` is the transport that decision names, never a
32
+ second router: the wrapper applies the resolved pair and its rollout file
33
+ is the readback the receipt quotes. Echoing a config default is not proof.
34
+
22
35
  - Let `scripts/codex-exec.sh` preflight Codex before launch. It enforces the
23
36
  exact tested-version allowlist, authentication, platform, and capabilities;
24
37
  surface any failure to the user rather than retrying silently.
@@ -86,6 +86,20 @@ Act 1 (grill) complete — plan locked with the user. MAX_ROUNDS=<n>.
86
86
  Now hand the locked plan to Codex for adversarial review. Same engine, mechanics verified end-to-end (2026-06-04).
87
87
 
88
88
  ### Prerequisites (verify once, fast)
89
+
90
+ Before dispatch, resolve a provider-neutral Routing intent — an explicit intent
91
+ block first, otherwise the workflow classifier — and authorize the whole run
92
+ once through a Dispatch plan whose hash binds every unit, intent, route and
93
+ reason. Dispatch only through `src/lib/routeDispatcher.mjs`, and require a
94
+ Dispatch receipt from the shared spawn guard that carries the authorization id
95
+ the plan recorded. A detected transport is not authorization; AFK dispatch
96
+ stops unless requested/applied route, model/effort enforcement, environment
97
+ precedence, and catalog/access/policy revisions are proved.
98
+
99
+ `scripts/codex-exec.sh` is the transport that decision names, never a
100
+ second router: the wrapper applies the resolved pair and its rollout file
101
+ is the readback the receipt quotes. Echoing a config default is not proof.
102
+
89
103
  - Let `scripts/codex-exec.sh` preflight Codex before launch. It enforces the
90
104
  exact tested-version allowlist, authentication, platform, and capabilities;
91
105
  surface any failure rather than retrying silently.
@@ -170,6 +170,20 @@ Act 1 (grill-with-docs) complete — plan locked, CONTEXT.md/ADRs updated. MAX_R
170
170
  Hand the locked plan to Codex for adversarial review. Mechanics verified end-to-end (2026-06-04).
171
171
 
172
172
  ### Prerequisites
173
+
174
+ Before dispatch, resolve a provider-neutral Routing intent — an explicit intent
175
+ block first, otherwise the workflow classifier — and authorize the whole run
176
+ once through a Dispatch plan whose hash binds every unit, intent, route and
177
+ reason. Dispatch only through `src/lib/routeDispatcher.mjs`, and require a
178
+ Dispatch receipt from the shared spawn guard that carries the authorization id
179
+ the plan recorded. A detected transport is not authorization; AFK dispatch
180
+ stops unless requested/applied route, model/effort enforcement, environment
181
+ precedence, and catalog/access/policy revisions are proved.
182
+
183
+ `scripts/codex-exec.sh` is the transport that decision names, never a
184
+ second router: the wrapper applies the resolved pair and its rollout file
185
+ is the readback the receipt quotes. Echoing a config default is not proof.
186
+
173
187
  - Let `scripts/codex-exec.sh` preflight Codex before launch. It enforces the
174
188
  exact tested-version allowlist, authentication, platform, and capabilities;
175
189
  surface any failure rather than retrying silently.
@@ -18,10 +18,13 @@ Show this to the user, then immediately proceed to Step 2. The user reads and th
18
18
 
19
19
  ### 2. Spawn sub-agents
20
20
 
21
- Before dispatch, resolve a provider-neutral Routing intent through
22
- `src/lib/routeDispatcher.mjs` and require a Dispatch receipt from the shared
23
- spawn guard. A detected transport is not authorization; AFK dispatch stops
24
- unless requested/applied route, model/effort enforcement, environment
21
+ Before dispatch, resolve a provider-neutral Routing intent — an explicit intent
22
+ block first, otherwise the workflow classifier and authorize the whole run
23
+ once through a Dispatch plan whose hash binds every unit, intent, route and
24
+ reason. Dispatch only through `src/lib/routeDispatcher.mjs`, and require a
25
+ Dispatch receipt from the shared spawn guard that carries the authorization id
26
+ the plan recorded. A detected transport is not authorization; AFK dispatch
27
+ stops unless requested/applied route, model/effort enforcement, environment
25
28
  precedence, and catalog/access/policy revisions are proved.
26
29
 
27
30
  <!-- mirror-xform:start codex-parallel-subagent-dispatch -->
@@ -43,10 +43,13 @@ This skill is _informed_ by the project's domain model. The domain language give
43
43
 
44
44
  Read the project's domain glossary and any ADRs in the area you're touching first.
45
45
 
46
- Before dispatch, resolve a provider-neutral Routing intent through
47
- `src/lib/routeDispatcher.mjs` and require a Dispatch receipt from the shared
48
- spawn guard. A detected transport is not authorization; AFK dispatch stops
49
- unless requested/applied route, model/effort enforcement, environment
46
+ Before dispatch, resolve a provider-neutral Routing intent — an explicit intent
47
+ block first, otherwise the workflow classifier and authorize the whole run
48
+ once through a Dispatch plan whose hash binds every unit, intent, route and
49
+ reason. Dispatch only through `src/lib/routeDispatcher.mjs`, and require a
50
+ Dispatch receipt from the shared spawn guard that carries the authorization id
51
+ the plan recorded. A detected transport is not authorization; AFK dispatch
52
+ stops unless requested/applied route, model/effort enforcement, environment
50
53
  precedence, and catalog/access/policy revisions are proved.
51
54
 
52
55
  <!-- mirror-xform:start codex-explorer-dispatch -->
@@ -109,7 +109,7 @@ node scripts/readiness.mjs check --skill orchestrate-wave --json
109
109
  Pass only host-supplied inventory through `capabilityAdapter.claude` or `.codex`,
110
110
  then call the selector. It returns exactly one target; missing or `unknown` evidence
111
111
  degrades A → B → C. A model claim is not evidence; do not emulate a missing primitive.
112
- Before any spawn, resolve the provider-neutral Routing intent through the shared resolver and spawn guard, then use the active Claude or Codex adapter. Codex contributes only its dated host attestation through `routingAdapters/codex.mjs`; it does not create a second catalog, Access graph, or Routing policy. A detected transport is not authorization. The Dispatch receipt must show requested and applied route, model/effort enforcement, environment precedence on mismatch, and catalog/access/policy revisions. AFK blocks unverified, unauthorized, overridden, unenforced, or silently degraded routes; a Codex host without model and effort selectors blocks differentiated AFK before spawn, and unreachable routes follow policy handoff/inherit/block exactly.
112
+ Before dispatch, resolve a provider-neutral Routing intent — an explicit intent block first, otherwise the workflow classifier — and authorize the whole run once through a Dispatch plan whose hash binds every unit, intent, route and reason. Dispatch only through `src/lib/routeDispatcher.mjs`, and require a Dispatch receipt from the shared spawn guard that carries the authorization id the plan recorded. A detected transport is not authorization; AFK dispatch stops unless requested/applied route, model/effort enforcement, environment precedence, and catalog/access/policy revisions are proved. Before any spawn, resolve the provider-neutral Routing intent through the shared resolver and spawn guard, then use the active Claude or Codex adapter. Codex contributes only its dated host attestation through `routingAdapters/codex.mjs`; it does not create a second catalog, Access graph, or Routing policy. A detected transport is not authorization. The Dispatch receipt must show requested and applied route, model/effort enforcement, environment precedence on mismatch, and catalog/access/policy revisions. AFK blocks unverified, unauthorized, overridden, unenforced, or silently degraded routes; a Codex host without model and effort selectors blocks differentiated AFK before spawn, and unreachable routes follow policy handoff/inherit/block exactly.
113
113
  - **Path A:** requires the literal `Workflow` tool, callable and permitted, plus
114
114
  individually proven named phases, run identity, runtime output validation,
115
115
  journal, and resume. Then read [its recipe](references/dispatch-workflow.md).
@@ -54,6 +54,15 @@ Reconciliation is never delegated to a subagent.
54
54
 
55
55
  ## Round 2 — Build
56
56
 
57
+ Before dispatch, resolve a provider-neutral Routing intent — an explicit intent
58
+ block first, otherwise the workflow classifier — and authorize the whole run
59
+ once through a Dispatch plan whose hash binds every unit, intent, route and
60
+ reason. Dispatch only through `src/lib/routeDispatcher.mjs`, and require a
61
+ Dispatch receipt from the shared spawn guard that carries the authorization id
62
+ the plan recorded. A detected transport is not authorization; AFK dispatch
63
+ stops unless requested/applied route, model/effort enforcement, environment
64
+ precedence, and catalog/access/policy revisions are proved.
65
+
57
66
  For the current reconciled batch, spawn **one builder per slice**, again as one
58
67
  concurrent batch joined by an explicit wait. Give each builder the verbatim
59
68
  builder contract, its reconciled allowlist, and its required commands. Resolve
@@ -48,6 +48,15 @@ current reconciled batch, make one `agent()` call per slice with explicit
48
48
  the reconciled allowlist and required commands in each verbatim builder prompt;
49
49
  the main thread still performs `semanticVerify` on every returned report.
50
50
 
51
+ Before dispatch, resolve a provider-neutral Routing intent — an explicit intent
52
+ block first, otherwise the workflow classifier — and authorize the whole run
53
+ once through a Dispatch plan whose hash binds every unit, intent, route and
54
+ reason. Dispatch only through `src/lib/routeDispatcher.mjs`, and require a
55
+ Dispatch receipt from the shared spawn guard that carries the authorization id
56
+ the plan recorded. A detected transport is not authorization; AFK dispatch
57
+ stops unless requested/applied route, model/effort enforcement, environment
58
+ precedence, and catalog/access/policy revisions are proved.
59
+
51
60
  Before each `agent()` call, resolve its provider-neutral Routing intent and pass
52
61
  the decision through the shared spawn guard and active surface adapter. The
53
62
  Claude adapter must attest Workflow model/effort precedence in the current
@@ -11,10 +11,13 @@ Before applying this Core skill, run `node scripts/project-skill-extension.mjs i
11
11
  Project extensions may specialize Project details, but cannot weaken Core user gates, safety, ownership, or validation. A contradiction blocks and requires an Explicit fork.
12
12
  <!-- project-extension:protocol-v1:end -->
13
13
 
14
- Before dispatch, resolve a provider-neutral Routing intent through
15
- `src/lib/routeDispatcher.mjs` and require a Dispatch receipt from the shared
16
- spawn guard. A detected transport is not authorization; AFK dispatch stops
17
- unless requested/applied route, model/effort enforcement, environment
14
+ Before dispatch, resolve a provider-neutral Routing intent — an explicit intent
15
+ block first, otherwise the workflow classifier and authorize the whole run
16
+ once through a Dispatch plan whose hash binds every unit, intent, route and
17
+ reason. Dispatch only through `src/lib/routeDispatcher.mjs`, and require a
18
+ Dispatch receipt from the shared spawn guard that carries the authorization id
19
+ the plan recorded. A detected transport is not authorization; AFK dispatch
20
+ stops unless requested/applied route, model/effort enforcement, environment
18
21
  precedence, and catalog/access/policy revisions are proved.
19
22
 
20
23
  Spin up a **background agent** to do the research, so you keep working while it reads.