@open-agent-toolkit/cli 0.2.25 → 0.2.27

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 (87) hide show
  1. package/assets/NOTICES.md +156 -0
  2. package/assets/docs/cli-utilities/configuration.md +42 -11
  3. package/assets/docs/contributing/explainer-kit-verification.md +125 -0
  4. package/assets/docs/contributing/index.md +1 -0
  5. package/assets/docs/reference/troubleshooting.md +47 -0
  6. package/assets/docs/workflows/projects/artifacts.md +24 -6
  7. package/assets/docs/workflows/projects/dispatch-ceiling.md +67 -16
  8. package/assets/docs/workflows/skills/explainer-kit-providers.md +144 -0
  9. package/assets/docs/workflows/skills/explainer-kit.md +121 -69
  10. package/assets/docs/workflows/skills/index.md +1 -0
  11. package/assets/public-package-versions.json +4 -4
  12. package/assets/skills/explainer-kit/SKILL.md +18 -3
  13. package/assets/skills/explainer-kit/recipes/project-recap.json +43 -16
  14. package/assets/skills/explainer-kit/references/contracts.md +167 -20
  15. package/assets/skills/explainer-kit/references/golden-conformance.md +80 -0
  16. package/assets/skills/explainer-kit/references/visual-authoring.md +92 -0
  17. package/assets/skills/explainer-kit/references/visual-review.md +57 -0
  18. package/assets/skills/explainer-kit/schemas/author-request.v2.schema.json +172 -1
  19. package/assets/skills/explainer-kit/schemas/build-record.schema.json +7 -1
  20. package/assets/skills/explainer-kit/schemas/fact-base.schema.json +38 -2
  21. package/assets/skills/explainer-kit/schemas/manifest.schema.json +25 -1
  22. package/assets/skills/explainer-kit/schemas/run-request.schema.json +4 -0
  23. package/assets/skills/explainer-kit/schemas/set-plan.v1.schema.json +149 -0
  24. package/assets/skills/explainer-kit/schemas/visual-review-request.v1.schema.json +117 -0
  25. package/assets/skills/explainer-kit/schemas/visual-review-result.v1.schema.json +80 -0
  26. package/assets/skills/explainer-kit/scripts/lib/browser-runtime.mjs +148 -4
  27. package/assets/skills/explainer-kit/scripts/lib/catalog.mjs +243 -0
  28. package/assets/skills/explainer-kit/scripts/lib/contracts.mjs +586 -8
  29. package/assets/skills/explainer-kit/scripts/lib/diagram.mjs +285 -8
  30. package/assets/skills/explainer-kit/scripts/lib/durability.mjs +35 -0
  31. package/assets/skills/explainer-kit/scripts/lib/fact-base.mjs +144 -8
  32. package/assets/skills/explainer-kit/scripts/lib/package-coverage.mjs +379 -0
  33. package/assets/skills/explainer-kit/scripts/lib/png.mjs +287 -0
  34. package/assets/skills/explainer-kit/scripts/lib/qa.mjs +280 -8
  35. package/assets/skills/explainer-kit/scripts/lib/recipes.mjs +132 -3
  36. package/assets/skills/explainer-kit/scripts/lib/records.mjs +513 -21
  37. package/assets/skills/explainer-kit/scripts/lib/render.mjs +67 -3
  38. package/assets/skills/explainer-kit/scripts/lib/s3-static.mjs +43 -1
  39. package/assets/skills/explainer-kit/scripts/lib/set-plan.mjs +208 -0
  40. package/assets/skills/explainer-kit/scripts/lib/source-backlinks.mjs +218 -0
  41. package/assets/skills/explainer-kit/scripts/lib/visual-review.mjs +380 -0
  42. package/assets/skills/explainer-kit/scripts/render-qa.mjs +48 -10
  43. package/assets/skills/explainer-kit/scripts/run.mjs +859 -134
  44. package/assets/skills/oat-explainer-kit/SKILL.md +40 -12
  45. package/assets/skills/oat-explainer-kit/references/author-callback.md +12 -10
  46. package/assets/skills/oat-explainer-kit/references/lifecycle-contract.md +40 -2
  47. package/assets/skills/oat-explainer-kit/references/visual-review-callback.md +72 -0
  48. package/assets/skills/oat-explainer-kit/scripts/bind-project-sources.mjs +167 -5
  49. package/assets/skills/oat-explainer-kit/scripts/finalize-tracked-run.mjs +92 -5
  50. package/assets/skills/oat-explainer-kit/scripts/run.mjs +324 -2
  51. package/assets/skills/oat-project-autonomous/references/gate-inventory.md +1 -1
  52. package/assets/skills/oat-project-document/references/docs/autonomy-contract.md +1 -1
  53. package/assets/skills/oat-project-implement/SKILL.md +9 -11
  54. package/assets/skills/oat-project-implement/references/dispatch-and-dry-run.md +18 -9
  55. package/assets/skills/oat-project-implement/references/docs/autonomy-contract.md +1 -1
  56. package/assets/skills/oat-project-implement/references/phase-execution.md +13 -4
  57. package/assets/skills/oat-project-pr-final/references/docs/autonomy-contract.md +1 -1
  58. package/assets/skills/oat-project-quick-start/references/docs/autonomy-contract.md +1 -1
  59. package/dist/commands/config/index.d.ts.map +1 -1
  60. package/dist/commands/config/index.js +27 -3
  61. package/dist/commands/project/archive/archive-utils.d.ts +1 -0
  62. package/dist/commands/project/archive/archive-utils.d.ts.map +1 -1
  63. package/dist/commands/project/archive/archive-utils.js +109 -42
  64. package/dist/commands/project/archive/explainer-package-coverage.d.ts +14 -0
  65. package/dist/commands/project/archive/explainer-package-coverage.d.ts.map +1 -0
  66. package/dist/commands/project/archive/explainer-package-coverage.js +27 -0
  67. package/dist/commands/project/archive/explainer-source-backlinks.d.ts +18 -0
  68. package/dist/commands/project/archive/explainer-source-backlinks.d.ts.map +1 -0
  69. package/dist/commands/project/archive/explainer-source-backlinks.js +27 -0
  70. package/dist/commands/project/archive/push-runner.d.ts +2 -1
  71. package/dist/commands/project/archive/push-runner.d.ts.map +1 -1
  72. package/dist/commands/project/archive/push-runner.js +5 -1
  73. package/dist/commands/project/dispatch-ceiling/index.d.ts.map +1 -1
  74. package/dist/commands/project/dispatch-ceiling/index.js +90 -0
  75. package/dist/config/dispatch-notices.d.ts +8 -0
  76. package/dist/config/dispatch-notices.d.ts.map +1 -0
  77. package/dist/config/dispatch-notices.js +79 -0
  78. package/dist/config/dispatch-policy-options.d.ts +2 -0
  79. package/dist/config/dispatch-policy-options.d.ts.map +1 -1
  80. package/dist/config/dispatch-policy-options.js +14 -2
  81. package/dist/providers/identity/dispatch-report.d.ts +17 -0
  82. package/dist/providers/identity/dispatch-report.d.ts.map +1 -1
  83. package/dist/providers/identity/dispatch-report.js +30 -0
  84. package/dist/release/public-package-contract.d.ts +6 -0
  85. package/dist/release/public-package-contract.d.ts.map +1 -1
  86. package/dist/release/public-package-contract.js +75 -0
  87. package/package.json +2 -2
@@ -12,7 +12,7 @@ import {
12
12
  } from './resolve-config.mjs';
13
13
  import { resolveExplainerOutputRoot } from './resolve-paths.mjs';
14
14
 
15
- const MINIMUM_CORE_VERSION = '2.0.0';
15
+ export const MINIMUM_CORE_VERSION = '2.0.3';
16
16
  const ADAPTER_ROOT = resolve(dirname(fileURLToPath(import.meta.url)), '..');
17
17
 
18
18
  export async function runOatExplainer({
@@ -32,10 +32,18 @@ export async function runOatExplainer({
32
32
  defaultMode,
33
33
  renderStrategy,
34
34
  retainRawArtDirection = false,
35
+ planSet,
36
+ planSetModulePath,
35
37
  author,
36
38
  authorModulePath,
37
39
  critic,
38
40
  criticModulePath,
41
+ browserSession,
42
+ browserSessionModulePath,
43
+ browserProbe,
44
+ browserProbeModulePath,
45
+ visualCritic,
46
+ visualCriticModulePath,
39
47
  coreOptions = {},
40
48
  }) {
41
49
  const compatibility = await checkCoreCompatibility({
@@ -54,6 +62,14 @@ export async function runOatExplainer({
54
62
  error.compatibility = compatibility;
55
63
  throw error;
56
64
  }
65
+ if (!supportsAdaptiveSetPlanning(compatibility.installedVersion)) {
66
+ const error = new Error(
67
+ `Installed explainer-kit ${compatibility.installedVersion} does not provide adaptive set planning. Run \`oat tools update --pack utility --scope user\`.`,
68
+ );
69
+ error.code = 'E_CORE_INCOMPATIBLE';
70
+ error.compatibility = compatibility;
71
+ throw error;
72
+ }
57
73
 
58
74
  const resolvedConfig = await resolveExplainerConfig({
59
75
  repoRoot,
@@ -73,6 +89,7 @@ export async function runOatExplainer({
73
89
  const projectRoot = resolve(repoRoot, activeProject);
74
90
  const bound = await bindProjectSources({
75
91
  projectRoot,
92
+ repoRoot,
76
93
  recipe,
77
94
  suppliedFactBasePath,
78
95
  });
@@ -115,16 +132,53 @@ export async function runOatExplainer({
115
132
  authorModulePath,
116
133
  coreOptions,
117
134
  });
135
+ const lifecycleSetPlanner = await resolveLifecycleSetPlanner({
136
+ planSet,
137
+ planSetModulePath,
138
+ coreOptions,
139
+ required: recipe === 'project-recap' && mode === 'unattended',
140
+ });
118
141
  const lifecycleCritic = await resolveLifecycleCritic({
119
142
  critic,
120
143
  criticModulePath,
121
144
  coreOptions,
122
145
  });
146
+ const reviewProvidersRequired =
147
+ recipe === 'project-recap' && mode === 'unattended';
148
+ const lifecycleBrowserSession = await resolveLifecycleBrowserSession({
149
+ core,
150
+ browserSession,
151
+ browserSessionModulePath,
152
+ browserProbe,
153
+ browserProbeModulePath,
154
+ coreOptions,
155
+ required: reviewProvidersRequired,
156
+ });
157
+ const lifecycleVisualCritic = await resolveLifecycleVisualCritic({
158
+ visualCritic,
159
+ visualCriticModulePath,
160
+ coreOptions,
161
+ required: reviewProvidersRequired,
162
+ });
163
+ assertDistinctProviderRoles({
164
+ author: lifecycleAuthor,
165
+ factCritic: lifecycleCritic,
166
+ browserProbe: lifecycleBrowserSession?.probe,
167
+ visualCritic: lifecycleVisualCritic,
168
+ });
123
169
  const result = await core.runExplainer(request, {
124
170
  ...coreOptions,
171
+ ...(lifecycleSetPlanner && { planSet: lifecycleSetPlanner }),
125
172
  ...(lifecycleAuthor && { author: lifecycleAuthor }),
126
173
  ...(lifecycleCritic && { critic: lifecycleCritic }),
174
+ ...(lifecycleBrowserSession && {
175
+ browserSession: lifecycleBrowserSession,
176
+ }),
177
+ ...(lifecycleVisualCritic && { visualCritic: lifecycleVisualCritic }),
127
178
  ...(bound.sourceLoader && { sourceLoader: bound.sourceLoader }),
179
+ ...(bound.sourceProvenance && {
180
+ sourceProvenance: bound.sourceProvenance,
181
+ }),
128
182
  reviewedSource: bound.reviewedSource,
129
183
  });
130
184
  const criticContractError = result?.errors?.find(
@@ -145,6 +199,74 @@ export async function runOatExplainer({
145
199
  };
146
200
  }
147
201
 
202
+ export function supportsAdaptiveSetPlanning(version) {
203
+ if (typeof version !== 'string') return false;
204
+ const match = version.match(/^(\d+)\.(\d+)\.(\d+)(?:-|$)/);
205
+ if (!match) return false;
206
+ const [major, minor, patch] = match.slice(1).map(Number);
207
+ return (
208
+ major === 2 &&
209
+ (minor > 0 ||
210
+ (minor === 0 && patch >= Number(MINIMUM_CORE_VERSION.split('.')[2])))
211
+ );
212
+ }
213
+
214
+ async function resolveLifecycleSetPlanner({
215
+ planSet,
216
+ planSetModulePath,
217
+ coreOptions,
218
+ required,
219
+ }) {
220
+ if (coreOptions?.planSet !== undefined) {
221
+ throw new TypeError(
222
+ 'coreOptions.planSet is not supported at the OAT adapter boundary; supply planSet directly.',
223
+ );
224
+ }
225
+ if (planSet !== undefined && typeof planSet !== 'function') {
226
+ throw new TypeError('planSet must be a function when supplied.');
227
+ }
228
+ if (planSet !== undefined && planSetModulePath !== undefined) {
229
+ throw new Error(
230
+ 'Supply only one provider-neutral set planner callback or set planner module entry point.',
231
+ );
232
+ }
233
+ if (planSet === undefined && planSetModulePath === undefined) {
234
+ if (!required) return null;
235
+ const error = new Error(
236
+ 'Unattended OAT project recaps require exactly one provider-neutral set planner callback or set planner module entry point.',
237
+ );
238
+ error.code = 'E_SET_PLANNER_REQUIRED';
239
+ throw error;
240
+ }
241
+ if (planSetModulePath === undefined) {
242
+ return planSet;
243
+ }
244
+ if (
245
+ typeof planSetModulePath !== 'string' ||
246
+ planSetModulePath.trim().length === 0
247
+ ) {
248
+ throw new TypeError('planSetModulePath must be a non-empty path.');
249
+ }
250
+
251
+ let plannerModule;
252
+ try {
253
+ plannerModule = await import(
254
+ pathToFileURL(resolve(planSetModulePath.trim())).href
255
+ );
256
+ } catch (cause) {
257
+ throw new Error(
258
+ `Unable to load provider-neutral set planner module at ${planSetModulePath}.`,
259
+ { cause },
260
+ );
261
+ }
262
+ if (typeof plannerModule.planSet !== 'function') {
263
+ throw new TypeError(
264
+ 'Provider-neutral set planner module must export a planSet function.',
265
+ );
266
+ }
267
+ return plannerModule.planSet;
268
+ }
269
+
148
270
  async function resolveLifecycleAuthor({
149
271
  author,
150
272
  authorModulePath,
@@ -255,7 +377,7 @@ async function resolveLifecycleCritic({
255
377
  if (!callback) {
256
378
  return null;
257
379
  }
258
- return async (request) => {
380
+ const wrapped = async (request) => {
259
381
  const result = await callback(request);
260
382
  if (
261
383
  !result ||
@@ -273,6 +395,206 @@ async function resolveLifecycleCritic({
273
395
  }
274
396
  return result;
275
397
  };
398
+ return markProviderIdentity(wrapped, callback);
399
+ }
400
+
401
+ async function resolveLifecycleBrowserSession({
402
+ core,
403
+ browserSession,
404
+ browserSessionModulePath,
405
+ browserProbe,
406
+ browserProbeModulePath,
407
+ coreOptions,
408
+ required,
409
+ }) {
410
+ if (coreOptions?.browserProbe !== undefined) {
411
+ throw new TypeError(
412
+ 'coreOptions.browserProbe is not supported at the OAT adapter boundary; supply browserSession directly.',
413
+ );
414
+ }
415
+ if (browserProbe !== undefined || browserProbeModulePath !== undefined) {
416
+ throw new TypeError(
417
+ 'Bare browserProbe callbacks are not supported at the OAT adapter boundary; supply a branded browserSession created by createBrowserProbeSession().',
418
+ );
419
+ }
420
+ if (coreOptions?.browserSession !== undefined) {
421
+ throw new TypeError(
422
+ 'coreOptions.browserSession is not supported at the OAT adapter boundary; supply browserSession directly.',
423
+ );
424
+ }
425
+ if (browserSession !== undefined && browserSessionModulePath !== undefined) {
426
+ throw new Error(
427
+ 'Supply only one browser session descriptor or browser session module entry point.',
428
+ );
429
+ }
430
+ let resolvedSession = browserSession;
431
+ if (browserSessionModulePath !== undefined) {
432
+ if (
433
+ typeof browserSessionModulePath !== 'string' ||
434
+ browserSessionModulePath.trim().length === 0
435
+ ) {
436
+ throw new TypeError('browserSessionModulePath must be a non-empty path.');
437
+ }
438
+ let sessionModule;
439
+ try {
440
+ sessionModule = await import(
441
+ pathToFileURL(resolve(browserSessionModulePath.trim())).href
442
+ );
443
+ } catch (cause) {
444
+ throw new Error(
445
+ `Unable to load browser session module at ${browserSessionModulePath}.`,
446
+ { cause },
447
+ );
448
+ }
449
+ resolvedSession = sessionModule.browserSession;
450
+ }
451
+ if (!resolvedSession) {
452
+ if (!required) return null;
453
+ const error = new Error(
454
+ 'Unattended OAT project recaps require exactly one branded launched-Chromium browser session descriptor or browser session module entry point.',
455
+ );
456
+ error.code = 'E_BROWSER_PROBE_REQUIRED';
457
+ throw error;
458
+ }
459
+ if (typeof core.assertBrowserProbeSession !== 'function') {
460
+ const error = new Error(
461
+ 'Compatible explainer-kit does not export browser session validation.',
462
+ );
463
+ error.code = 'E_CORE_INCOMPATIBLE';
464
+ throw error;
465
+ }
466
+ try {
467
+ return core.assertBrowserProbeSession(resolvedSession, {
468
+ allowFixture: !required,
469
+ });
470
+ } catch (cause) {
471
+ const error = new Error(
472
+ `Browser session validation failed: ${cause?.message ?? String(cause)}`,
473
+ { cause },
474
+ );
475
+ error.code = 'E_BROWSER_PROBE_REQUIRED';
476
+ throw error;
477
+ }
478
+ }
479
+
480
+ async function resolveLifecycleVisualCritic({
481
+ visualCritic,
482
+ visualCriticModulePath,
483
+ coreOptions,
484
+ required,
485
+ }) {
486
+ if (coreOptions?.visualCritic !== undefined) {
487
+ throw new TypeError(
488
+ 'coreOptions.visualCritic is not supported at the OAT adapter boundary; supply visualCritic directly.',
489
+ );
490
+ }
491
+ const callback = await resolveProviderCallback({
492
+ callback: visualCritic,
493
+ modulePath: visualCriticModulePath,
494
+ exportName: 'visualCritic',
495
+ label: 'visual critic',
496
+ });
497
+ if (!callback) {
498
+ if (!required) return null;
499
+ const error = new Error(
500
+ 'Unattended OAT project recaps require exactly one provider-neutral visual critic callback or visual critic module entry point.',
501
+ );
502
+ error.code = 'E_VISUAL_CRITIC_REQUIRED';
503
+ throw error;
504
+ }
505
+ const wrapped = async (request, evidenceInput) => {
506
+ const result = await callback(request, evidenceInput);
507
+ if (
508
+ !result ||
509
+ typeof result !== 'object' ||
510
+ result.schemaVersion !== 'explainer-kit.visual-review-result/v1' ||
511
+ typeof result.reviewId !== 'string' ||
512
+ !/^[a-z0-9][a-z0-9._-]*$/.test(result.reviewId) ||
513
+ result.requestId !== request?.requestId ||
514
+ result.requestHash !== request?.requestHash ||
515
+ typeof result.reviewedAt !== 'string' ||
516
+ Number.isNaN(Date.parse(result.reviewedAt)) ||
517
+ !['pass', 'correct', 'fail'].includes(result.disposition) ||
518
+ !Array.isArray(result.artifactIds) ||
519
+ result.artifactIds.length !== request?.renderedArtifacts?.length ||
520
+ result.artifactIds.some(
521
+ (artifactId, index) =>
522
+ artifactId !== request.renderedArtifacts[index]?.artifactId,
523
+ ) ||
524
+ !Array.isArray(result.findings) ||
525
+ result.findings.some((finding) => !finding || typeof finding !== 'object')
526
+ ) {
527
+ throw new Error(
528
+ 'Provider-neutral visual critic result does not match the visual review result contract.',
529
+ );
530
+ }
531
+ return result;
532
+ };
533
+ return markProviderIdentity(wrapped, callback);
534
+ }
535
+
536
+ async function resolveProviderCallback({
537
+ callback,
538
+ modulePath,
539
+ exportName,
540
+ label,
541
+ }) {
542
+ if (callback !== undefined && typeof callback !== 'function') {
543
+ throw new TypeError(`${exportName} must be a function when supplied.`);
544
+ }
545
+ if (callback !== undefined && modulePath !== undefined) {
546
+ throw new Error(
547
+ `Supply only one provider-neutral ${label} callback or ${label} module entry point.`,
548
+ );
549
+ }
550
+ if (modulePath === undefined) return callback ?? null;
551
+ if (typeof modulePath !== 'string' || modulePath.trim().length === 0) {
552
+ throw new TypeError(`${exportName}ModulePath must be a non-empty path.`);
553
+ }
554
+ let providerModule;
555
+ try {
556
+ providerModule = await import(
557
+ pathToFileURL(resolve(modulePath.trim())).href
558
+ );
559
+ } catch (cause) {
560
+ throw new Error(
561
+ `Unable to load provider-neutral ${label} module at ${modulePath}.`,
562
+ { cause },
563
+ );
564
+ }
565
+ if (typeof providerModule[exportName] !== 'function') {
566
+ throw new TypeError(
567
+ `Provider-neutral ${label} module must export a ${exportName} function.`,
568
+ );
569
+ }
570
+ return providerModule[exportName];
571
+ }
572
+
573
+ const PROVIDER_IDENTITY = Symbol('oat-explainer-provider-identity');
574
+
575
+ function markProviderIdentity(wrapper, callback) {
576
+ Object.defineProperty(wrapper, PROVIDER_IDENTITY, { value: callback });
577
+ return wrapper;
578
+ }
579
+
580
+ function providerIdentity(callback) {
581
+ return callback?.[PROVIDER_IDENTITY] ?? callback;
582
+ }
583
+
584
+ function assertDistinctProviderRoles(callbacks) {
585
+ const entries = Object.entries(callbacks).filter(([, callback]) => callback);
586
+ for (let left = 0; left < entries.length; left += 1) {
587
+ for (let right = left + 1; right < entries.length; right += 1) {
588
+ if (
589
+ providerIdentity(entries[left][1]) ===
590
+ providerIdentity(entries[right][1])
591
+ ) {
592
+ throw new Error(
593
+ `Provider roles ${entries[left][0]} and ${entries[right][0]} must use distinct callback identities.`,
594
+ );
595
+ }
596
+ }
597
+ }
276
598
  }
277
599
 
278
600
  async function readManifest(result, request) {
@@ -233,7 +233,7 @@ remains immutable baseline evidence for the original p01-t01 verification.
233
233
  | `oat-project-design/references/selective-review-pass.md` | `d4956192b82e -> DES-06`; `7d6e1f926ecb -> DES-06`; `04f918a5fcac -> DES-07` |
234
234
  | `oat-project-plan/SKILL.md` | `5eb3949f32e1 -> NG`; `64a08153bb9e -> NG`; `655d61df0a8f -> NG`; `56b37486f09d -> PLAN-01`; `cf317c17c586 -> PLAN-02`; `781643b0f2c3 -> NG`; `01fd7cca8253 -> PLAN-04`; `7bc7fa3f2cbb -> NG`; `da28ce0a5f2e -> NG`; `e334f94c4d35 -> NG`; `1fa55762c038 -> NG`; `c0935b5484a2 -> NG`; `6008163054f8 -> PLAN-05`; `571271f4d71b -> PLAN-06`; `746b760289e4 -> PLAN-06`; `de195590ff83 -> NG`; `49640510829a -> PLAN-07`; `4bef7afa7a71 -> PLAN-08`; `e5886632533e -> PLAN-08`; `4cfe1df14372 -> NG`; `d116c97a500c -> PLAN-10`; `aa62facff547 -> PLAN-10`; `bee4c4aa34c6 -> NG`; `3f0b53056edd -> PLAN-11`; `1734b2c85c5d -> NG`; `b4af2220eb91 -> PLAN-11` |
235
235
  | `oat-project-import-plan/SKILL.md` | `f7ca8635452f -> NG`; `c2e5fa410069 -> NG`; `655d61df0a8f -> NG`; `dceff5cc04b5 -> NG`; `1af4957a1af2 -> IMPORT-01`; `45b699c1c0b5 -> IMPORT-01`; `ba6d120791c1 -> IMPORT-01`; `070ebc5259af -> IMPORT-03`; `c11552696e2e -> IMPORT-03`; `cfe661966baf -> IMPORT-04`; `baa91c0a0bf8 -> NG`; `e364e84b2702 -> NG`; `39031985a945 -> IMPORT-06`; `f106aa29a217 -> IMPORT-07`; `65038450aee3 -> IMPORT-07`; `bee4c4aa34c6 -> NG`; `3f0b53056edd -> IMPORT-09` |
236
- | `oat-project-implement/SKILL.md` | `18980f6bc1a6 -> NG`; `ffb3af0ba8ef -> NG`; `e0355c7a05e9 -> IMPLEMENT-11+IMPLEMENT-13+IMPLEMENT-16`; `6296f41ae11c -> NG`; `a167d03559fa -> NG`; `cf317c17c586 -> IMPLEMENT-01`; `8ce8a09feca4 -> NG`; `bd0cb4988188 -> NG`; `28af4ee0055d -> NG` |
236
+ | `oat-project-implement/SKILL.md` | `18980f6bc1a6 -> NG`; `e0355c7a05e9 -> IMPLEMENT-11+IMPLEMENT-13+IMPLEMENT-16`; `6296f41ae11c -> NG`; `a167d03559fa -> NG`; `cf317c17c586 -> IMPLEMENT-01`; `8ce8a09feca4 -> NG`; `bd0cb4988188 -> NG`; `28af4ee0055d -> NG` |
237
237
  | `oat-project-implement/references/completion-and-closeout.md` | `f7dab9c1f96c -> IMPLEMENT-12`; `c69c17a069a8 -> IMPLEMENT-14`; `a97fa5634a68 -> IMPLEMENT-14`; `3af58881811c -> IMPLEMENT-14`; `4203e1f49d0f -> IMPLEMENT-14`; `c3bd2458a3d3 -> IMPLEMENT-13`; `95b5eafc070d -> IMPLEMENT-13`; `25ecbe9c998b -> IMPLEMENT-13+IMPLEMENT-14+IMPLEMENT-15+IMPLEMENT-16`; `f6f24fd71da4 -> IMPLEMENT-13+IMPLEMENT-14+IMPLEMENT-15+IMPLEMENT-16`; `f18283bc1cf9 -> IMPLEMENT-13+IMPLEMENT-14+IMPLEMENT-15+IMPLEMENT-16`; `2c1ffc4a82dd -> IMPLEMENT-13+IMPLEMENT-14+IMPLEMENT-15+IMPLEMENT-16`; `3454a07aa843 -> IMPLEMENT-16`; `0d86e2098cfb -> IMPLEMENT-13+IMPLEMENT-14+IMPLEMENT-15+IMPLEMENT-16`; `d5fe597d266f -> IMPLEMENT-13+IMPLEMENT-14+IMPLEMENT-15+IMPLEMENT-16`; `55a152e944c1 -> IMPLEMENT-16`; `effac7cbd573 -> IMPLEMENT-13+IMPLEMENT-14+IMPLEMENT-15+IMPLEMENT-16`; `9d2a34d8b148 -> IMPLEMENT-13+IMPLEMENT-14+IMPLEMENT-15+IMPLEMENT-16`; `d27462aaed26 -> IMPLEMENT-13+IMPLEMENT-14+IMPLEMENT-15+IMPLEMENT-16`; `9d52ecb17268 -> IMPLEMENT-13+IMPLEMENT-14+IMPLEMENT-15+IMPLEMENT-16`; `5b91aabe3757 -> IMPLEMENT-13+IMPLEMENT-14+IMPLEMENT-15+IMPLEMENT-16`; `fd0ad919f702 -> IMPLEMENT-13+IMPLEMENT-14+IMPLEMENT-15+IMPLEMENT-16`; `63bf28df1474 -> IMPLEMENT-13+IMPLEMENT-14+IMPLEMENT-15+IMPLEMENT-16`; `a4ed471dbc78 -> IMPLEMENT-16`; `6b7a64cec6e5 -> IMPLEMENT-16`; `0a4fdba0ebc0 -> IMPLEMENT-13+IMPLEMENT-14+IMPLEMENT-15+IMPLEMENT-16`; `a5033c2aada5 -> IMPLEMENT-13+IMPLEMENT-14+IMPLEMENT-15+IMPLEMENT-16`; `e77609eddba0 -> IMPLEMENT-13+IMPLEMENT-14+IMPLEMENT-15+IMPLEMENT-16`; `351156e8dde4 -> IMPLEMENT-13+IMPLEMENT-14+IMPLEMENT-15+IMPLEMENT-16`; `51d45bd2bbd1 -> IMPLEMENT-16`; `f7796ffcc804 -> IMPLEMENT-16`; `990d730cb494 -> IMPLEMENT-16`; `6ed28bb7d384 -> IMPLEMENT-16`; `8b7d4b5bcf1b -> IMPLEMENT-16`; `88aad500e6e9 -> IMPLEMENT-16`; `877e3e3f9eda -> IMPLEMENT-16`; `fc03c97f834e -> IMPLEMENT-16`; `12939a3da5e0 -> IMPLEMENT-16`; `bdb418335a88 -> IMPLEMENT-16`; `fba97e596ebd -> IMPLEMENT-16`; `3d0b5e2f14f0 -> IMPLEMENT-17`; `87f1424a8692 -> NG`; `6b1ec05182f0 -> IMPLEMENT-11`; `e6d696a27c91 -> NG`; `c77f8ccb52ad -> NG`; `48de2614c0ba -> IMPLEMENT-11`; `32d53f5212e5 -> IMPLEMENT-11`; `7cdb4a9c57b7 -> IMPLEMENT-11`; `16ffc0aa099b -> IMPLEMENT-11`; `d6868ea10b3f -> IMPLEMENT-11`; `4f05ff5567be -> IMPLEMENT-11`; `c70b47ae7a6d -> IMPLEMENT-11`; `5fafd093b58e -> NG`; `567d43ab0c2e -> NG`; `21ceaf7e658a -> NG`; `249427a9f475 -> NG`; `8a7ec13a9b7c -> NG`; `9aeb7fce2012 -> IMPLEMENT-18`; `f11a7cdda220 -> IMPLEMENT-18`; `4523ac029152 -> NG`; `6e87b08c4046 -> NG`; `baa6052c7f0a -> IMPLEMENT-18`; `27d3fad116b1 -> IMPLEMENT-18`; `2cfbeb4388a5 -> IMPLEMENT-18`; `c56ea56a56db -> NG`; `43e2e3c1380d -> IMPLEMENT-17`; `b49690277fb5 -> NG`; `df12304d6a36 -> NG`; `52eacac11fef -> IMPLEMENT-17`; `60092df6b17b -> IMPLEMENT-17`; `361872c6b00e -> IMPLEMENT-17`; `d2bc711a75fb -> IMPLEMENT-17` |
238
238
  | `oat-project-implement/references/dispatch-and-dry-run.md` | `21b85f5e4daa -> IMPLEMENT-08`; `74c92b32bb2a -> IMPLEMENT-08`; `8efd2d0517ab -> IMPLEMENT-09`; `461ed9b3e495 -> IMPLEMENT-09`; `b5ad64fd744d -> NG`; `14ce436cfffa -> NG`; `043ca36da3e2 -> NG`; `a23e45c1dc8d -> NG`; `498143bb41a7 -> NG`; `4fe3eb179023 -> NG`; `7f75485e5a33 -> NG`; `8ec3a96df029 -> NG`; `16c3f96e758d -> NG`; `5915c41fe058 -> NG`; `f51e43eeac56 -> NG`; `fd41c25623cb -> NG`; `58a932ed6453 -> NG`; `4718bd3ce12d -> NG`; `58c444a2126b -> NG`; `2df3adae4120 -> NG`; `e75df892b55c -> NG`; `8ba5dbd2a0d8 -> NG` |
239
239
  | `oat-project-implement/references/docs/autonomy-contract.md` | `* -> NG` |
@@ -233,7 +233,7 @@ remains immutable baseline evidence for the original p01-t01 verification.
233
233
  | `oat-project-design/references/selective-review-pass.md` | `d4956192b82e -> DES-06`; `7d6e1f926ecb -> DES-06`; `04f918a5fcac -> DES-07` |
234
234
  | `oat-project-plan/SKILL.md` | `5eb3949f32e1 -> NG`; `64a08153bb9e -> NG`; `655d61df0a8f -> NG`; `56b37486f09d -> PLAN-01`; `cf317c17c586 -> PLAN-02`; `781643b0f2c3 -> NG`; `01fd7cca8253 -> PLAN-04`; `7bc7fa3f2cbb -> NG`; `da28ce0a5f2e -> NG`; `e334f94c4d35 -> NG`; `1fa55762c038 -> NG`; `c0935b5484a2 -> NG`; `6008163054f8 -> PLAN-05`; `571271f4d71b -> PLAN-06`; `746b760289e4 -> PLAN-06`; `de195590ff83 -> NG`; `49640510829a -> PLAN-07`; `4bef7afa7a71 -> PLAN-08`; `e5886632533e -> PLAN-08`; `4cfe1df14372 -> NG`; `d116c97a500c -> PLAN-10`; `aa62facff547 -> PLAN-10`; `bee4c4aa34c6 -> NG`; `3f0b53056edd -> PLAN-11`; `1734b2c85c5d -> NG`; `b4af2220eb91 -> PLAN-11` |
235
235
  | `oat-project-import-plan/SKILL.md` | `f7ca8635452f -> NG`; `c2e5fa410069 -> NG`; `655d61df0a8f -> NG`; `dceff5cc04b5 -> NG`; `1af4957a1af2 -> IMPORT-01`; `45b699c1c0b5 -> IMPORT-01`; `ba6d120791c1 -> IMPORT-01`; `070ebc5259af -> IMPORT-03`; `c11552696e2e -> IMPORT-03`; `cfe661966baf -> IMPORT-04`; `baa91c0a0bf8 -> NG`; `e364e84b2702 -> NG`; `39031985a945 -> IMPORT-06`; `f106aa29a217 -> IMPORT-07`; `65038450aee3 -> IMPORT-07`; `bee4c4aa34c6 -> NG`; `3f0b53056edd -> IMPORT-09` |
236
- | `oat-project-implement/SKILL.md` | `18980f6bc1a6 -> NG`; `ffb3af0ba8ef -> NG`; `e0355c7a05e9 -> IMPLEMENT-11+IMPLEMENT-13+IMPLEMENT-16`; `6296f41ae11c -> NG`; `a167d03559fa -> NG`; `cf317c17c586 -> IMPLEMENT-01`; `8ce8a09feca4 -> NG`; `bd0cb4988188 -> NG`; `28af4ee0055d -> NG` |
236
+ | `oat-project-implement/SKILL.md` | `18980f6bc1a6 -> NG`; `e0355c7a05e9 -> IMPLEMENT-11+IMPLEMENT-13+IMPLEMENT-16`; `6296f41ae11c -> NG`; `a167d03559fa -> NG`; `cf317c17c586 -> IMPLEMENT-01`; `8ce8a09feca4 -> NG`; `bd0cb4988188 -> NG`; `28af4ee0055d -> NG` |
237
237
  | `oat-project-implement/references/completion-and-closeout.md` | `f7dab9c1f96c -> IMPLEMENT-12`; `c69c17a069a8 -> IMPLEMENT-14`; `a97fa5634a68 -> IMPLEMENT-14`; `3af58881811c -> IMPLEMENT-14`; `4203e1f49d0f -> IMPLEMENT-14`; `c3bd2458a3d3 -> IMPLEMENT-13`; `95b5eafc070d -> IMPLEMENT-13`; `25ecbe9c998b -> IMPLEMENT-13+IMPLEMENT-14+IMPLEMENT-15+IMPLEMENT-16`; `f6f24fd71da4 -> IMPLEMENT-13+IMPLEMENT-14+IMPLEMENT-15+IMPLEMENT-16`; `f18283bc1cf9 -> IMPLEMENT-13+IMPLEMENT-14+IMPLEMENT-15+IMPLEMENT-16`; `2c1ffc4a82dd -> IMPLEMENT-13+IMPLEMENT-14+IMPLEMENT-15+IMPLEMENT-16`; `3454a07aa843 -> IMPLEMENT-16`; `0d86e2098cfb -> IMPLEMENT-13+IMPLEMENT-14+IMPLEMENT-15+IMPLEMENT-16`; `d5fe597d266f -> IMPLEMENT-13+IMPLEMENT-14+IMPLEMENT-15+IMPLEMENT-16`; `55a152e944c1 -> IMPLEMENT-16`; `effac7cbd573 -> IMPLEMENT-13+IMPLEMENT-14+IMPLEMENT-15+IMPLEMENT-16`; `9d2a34d8b148 -> IMPLEMENT-13+IMPLEMENT-14+IMPLEMENT-15+IMPLEMENT-16`; `d27462aaed26 -> IMPLEMENT-13+IMPLEMENT-14+IMPLEMENT-15+IMPLEMENT-16`; `9d52ecb17268 -> IMPLEMENT-13+IMPLEMENT-14+IMPLEMENT-15+IMPLEMENT-16`; `5b91aabe3757 -> IMPLEMENT-13+IMPLEMENT-14+IMPLEMENT-15+IMPLEMENT-16`; `fd0ad919f702 -> IMPLEMENT-13+IMPLEMENT-14+IMPLEMENT-15+IMPLEMENT-16`; `63bf28df1474 -> IMPLEMENT-13+IMPLEMENT-14+IMPLEMENT-15+IMPLEMENT-16`; `a4ed471dbc78 -> IMPLEMENT-16`; `6b7a64cec6e5 -> IMPLEMENT-16`; `0a4fdba0ebc0 -> IMPLEMENT-13+IMPLEMENT-14+IMPLEMENT-15+IMPLEMENT-16`; `a5033c2aada5 -> IMPLEMENT-13+IMPLEMENT-14+IMPLEMENT-15+IMPLEMENT-16`; `e77609eddba0 -> IMPLEMENT-13+IMPLEMENT-14+IMPLEMENT-15+IMPLEMENT-16`; `351156e8dde4 -> IMPLEMENT-13+IMPLEMENT-14+IMPLEMENT-15+IMPLEMENT-16`; `51d45bd2bbd1 -> IMPLEMENT-16`; `f7796ffcc804 -> IMPLEMENT-16`; `990d730cb494 -> IMPLEMENT-16`; `6ed28bb7d384 -> IMPLEMENT-16`; `8b7d4b5bcf1b -> IMPLEMENT-16`; `88aad500e6e9 -> IMPLEMENT-16`; `877e3e3f9eda -> IMPLEMENT-16`; `fc03c97f834e -> IMPLEMENT-16`; `12939a3da5e0 -> IMPLEMENT-16`; `bdb418335a88 -> IMPLEMENT-16`; `fba97e596ebd -> IMPLEMENT-16`; `3d0b5e2f14f0 -> IMPLEMENT-17`; `87f1424a8692 -> NG`; `6b1ec05182f0 -> IMPLEMENT-11`; `e6d696a27c91 -> NG`; `c77f8ccb52ad -> NG`; `48de2614c0ba -> IMPLEMENT-11`; `32d53f5212e5 -> IMPLEMENT-11`; `7cdb4a9c57b7 -> IMPLEMENT-11`; `16ffc0aa099b -> IMPLEMENT-11`; `d6868ea10b3f -> IMPLEMENT-11`; `4f05ff5567be -> IMPLEMENT-11`; `c70b47ae7a6d -> IMPLEMENT-11`; `5fafd093b58e -> NG`; `567d43ab0c2e -> NG`; `21ceaf7e658a -> NG`; `249427a9f475 -> NG`; `8a7ec13a9b7c -> NG`; `9aeb7fce2012 -> IMPLEMENT-18`; `f11a7cdda220 -> IMPLEMENT-18`; `4523ac029152 -> NG`; `6e87b08c4046 -> NG`; `baa6052c7f0a -> IMPLEMENT-18`; `27d3fad116b1 -> IMPLEMENT-18`; `2cfbeb4388a5 -> IMPLEMENT-18`; `c56ea56a56db -> NG`; `43e2e3c1380d -> IMPLEMENT-17`; `b49690277fb5 -> NG`; `df12304d6a36 -> NG`; `52eacac11fef -> IMPLEMENT-17`; `60092df6b17b -> IMPLEMENT-17`; `361872c6b00e -> IMPLEMENT-17`; `d2bc711a75fb -> IMPLEMENT-17` |
238
238
  | `oat-project-implement/references/dispatch-and-dry-run.md` | `21b85f5e4daa -> IMPLEMENT-08`; `74c92b32bb2a -> IMPLEMENT-08`; `8efd2d0517ab -> IMPLEMENT-09`; `461ed9b3e495 -> IMPLEMENT-09`; `b5ad64fd744d -> NG`; `14ce436cfffa -> NG`; `043ca36da3e2 -> NG`; `a23e45c1dc8d -> NG`; `498143bb41a7 -> NG`; `4fe3eb179023 -> NG`; `7f75485e5a33 -> NG`; `8ec3a96df029 -> NG`; `16c3f96e758d -> NG`; `5915c41fe058 -> NG`; `f51e43eeac56 -> NG`; `fd41c25623cb -> NG`; `58a932ed6453 -> NG`; `4718bd3ce12d -> NG`; `58c444a2126b -> NG`; `2df3adae4120 -> NG`; `e75df892b55c -> NG`; `8ba5dbd2a0d8 -> NG` |
239
239
  | `oat-project-implement/references/docs/autonomy-contract.md` | `* -> NG` |
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: oat-project-implement
3
- version: 2.2.2
3
+ version: 2.2.3
4
4
  description: Use when plan.md is ready for execution. Dispatches one phase implementer per phase, owns independent phase review and bounded fix routing, and supports plan-declared worktree-isolated parallel phases.
5
5
  oat_gateable: true
6
6
  argument-hint: '[--retry-limit <N>] [--dry-run]'
@@ -19,16 +19,14 @@ Execute the implementation plan task-by-task with full state tracking.
19
19
 
20
20
  ## Shared Subagent Dispatch Contract
21
21
 
22
- Before resolving or launching any phase implementer, optional nested worker,
23
- fix continuation, or reviewer, read and follow
24
- `.agents/skills/oat-project-dispatch-subagents/SKILL.md`. The project adapter
25
- resolves lifecycle scope and then requires
26
- `.agents/skills/oat-dispatch-subagents/SKILL.md` for provider-neutral
27
- selection, recovery, and evidence. This explicit two-skill load is mandatory;
28
- do not rely on ambient skill discovery. This implementation skill retains
29
- lifecycle sequencing, verification, integration, and approval-aware final
30
- closeout.
31
- Correctness must not require a provider restart or hot reload.
22
+ Before resolving or launching a phase implementer, optional child, fix, or
23
+ reviewer, read `.agents/skills/oat-project-dispatch-subagents/SKILL.md`, then
24
+ `.agents/skills/oat-dispatch-subagents/SKILL.md`. The former resolves lifecycle
25
+ scope; the latter owns provider-neutral selection, recovery, and evidence.
26
+ Display structured resolver notices before every implementation, fix, or
27
+ reviewer launch. Runtime disclosure uses the effective resolved target, never
28
+ the bundled recommendation version. This explicit load is mandatory, and
29
+ correctness must not require a provider restart or hot reload.
32
30
 
33
31
  Read
34
32
  `.agents/skills/subagent-orchestration/references/model-selection-principles.md`.
@@ -157,7 +157,7 @@ Use the CLI resolver as the source of truth. The command name remains
157
157
  policy:
158
158
 
159
159
  ```bash
160
- oat project dispatch-ceiling resolve --provider <active-provider> --preflight --report-scope implementation-preflight --report-action implementation --json
160
+ oat project dispatch-ceiling resolve --provider <active-provider> --preflight --task-class <task-class> [--task-effort <codex-preferred-effort>] --report-scope implementation-preflight --report-action implementation --json
161
161
  ```
162
162
 
163
163
  If `oat` is not in PATH, run the same command through
@@ -317,9 +317,11 @@ report context:
317
317
  - review: `--report-scope <phase-or-review-scope> --report-action review`
318
318
 
319
319
  Require `dispatchReport.schemaVersion: 1` in the completed resolver JSON before
320
- dispatch. Consume the report as the human/audit source: render the versioned
321
- block with `formatDispatchReport(dispatchReport)` semantics, and derive the
322
- formal compatibility line only through
320
+ dispatch. Surface every structured entry in `dispatchReport.notices`, then
321
+ render the versioned block with `formatDispatchReport(dispatchReport)`
322
+ semantics, before the implementation, fix, or reviewer launch. Consume the
323
+ report as the human/audit source, and derive the formal compatibility line only
324
+ through
323
325
  `formatDispatchStamp(dispatchReport)` / `toDispatchStampRecord(dispatchReport)`.
324
326
  Never hand-assemble a second `Dispatch:` schema from policy labels, role names,
325
327
  candidate strings, or target names.
@@ -329,6 +331,10 @@ The exact provider invocation remains authoritative in
329
331
  the report does not replace or weaken target-pinned dispatch. Add independently
330
332
  observed runtime identity to `dispatchReport.runtimeIdentity` only when such an
331
333
  observation exists. Requested/configured controls are not runtime observation.
334
+ Runtime disclosure must use the effective resolved target in that completed
335
+ response. Never infer runtime controls or eligibility from
336
+ `recommendationVersion`, which identifies only the bundled recommendation that
337
+ was adopted.
332
338
  For gate-originated review, keep `dispatchReport.gateInvocation`, existing
333
339
  work-producer `diversity`, and reviewer `runtimeIdentity` as three distinct
334
340
  facts; producer stamps or self-report never overwrite configured invocation.
@@ -369,8 +375,9 @@ requested; never silently downgrade to it.
369
375
  6. For managed capped phase-implementer/fix dispatch, choose an exact
370
376
  configured candidate and use the exact-candidate branch, not the
371
377
  preferred-selection branch. For implementation, call
372
- `oat project dispatch-ceiling resolve --provider codex --role implementer --ceiling-tier <project-or-phase-tier> --candidate-model <model> --candidate-effort <effort> --escalation-level <route-level> --report-scope <phase-id> --report-action implementation --json`.
378
+ `oat project dispatch-ceiling resolve --provider codex --role implementer --ceiling-tier <project-or-phase-tier> --candidate-model <model> --candidate-effort <effort> --task-class <task-class> --task-effort <preferred-effort> --escalation-level <route-level> --report-scope <phase-id> --report-action implementation --json`.
373
379
  For a bounded fix, use the same phase target with
380
+ the same `--task-class` and `--task-effort` classification provenance and
374
381
  `--report-scope <phase-or-fix-scope> --report-action fix`. Read
375
382
  `providers.codex.dispatchArgs.variant` and
376
383
  `providers.codex.selection.target`; never reuse a cap-only variant.
@@ -406,8 +413,9 @@ Claude rules:
406
413
  - Capped managed policy: target the configured policy cap directly.
407
414
  - Managed `Uncapped` or inherit/default: no reviewer target exists; omit `model` and log inherited/default model behavior.
408
415
  - For managed capped phase-implementer/fix dispatch, call
409
- `oat project dispatch-ceiling resolve --provider claude --role implementer --ceiling-tier <project-or-phase-tier> --candidate-model <model> --orchestrator-tier <current-orchestrator-tier> --escalation-level <route-level> --report-scope <phase-id> --report-action implementation --json`.
410
- For bounded fixes, reuse the exact phase target with a bounded fix scope.
416
+ `oat project dispatch-ceiling resolve --provider claude --role implementer --ceiling-tier <project-or-phase-tier> --candidate-model <model> --task-class <task-class> --orchestrator-tier <current-orchestrator-tier> --escalation-level <route-level> --report-scope <phase-id> --report-action implementation --json`.
417
+ For bounded fixes, reuse the exact phase target and task classification with a
418
+ bounded fix scope.
411
419
  For review dispatch, call the resolver with
412
420
  `--role reviewer --report-scope <phase-or-review-scope> --report-action review --json`
413
421
  and no candidate flags. Read `providers.claude.dispatchArgs.model` and pass it
@@ -443,8 +451,9 @@ Cursor rules:
443
451
  task-class resolution independently arrives there; reaching it because no
444
452
  candidate was selected is a defect.
445
453
  - For managed capped phase-implementer/fix dispatch, call
446
- `oat project dispatch-ceiling resolve --provider cursor --role implementer --ceiling-tier <project-or-phase-tier> --candidate-model <opaque-model> --report-scope <phase-id> --report-action implementation --json`.
447
- For bounded fixes, reuse the exact phase target with a bounded fix scope.
454
+ `oat project dispatch-ceiling resolve --provider cursor --role implementer --ceiling-tier <project-or-phase-tier> --candidate-model <opaque-model> --task-class <task-class> --report-scope <phase-id> --report-action implementation --json`.
455
+ For bounded fixes, reuse the exact phase target and task classification with a
456
+ bounded fix scope.
448
457
  - Require `providers.cursor.dispatchArgs.variant` and launch that exact
449
458
  resolver-selected native agent type first. Native acceptance plus the
450
459
  complete launcher payload is configured invocation evidence; it does not