@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.
- package/assets/NOTICES.md +156 -0
- package/assets/docs/cli-utilities/configuration.md +42 -11
- package/assets/docs/contributing/explainer-kit-verification.md +125 -0
- package/assets/docs/contributing/index.md +1 -0
- package/assets/docs/reference/troubleshooting.md +47 -0
- package/assets/docs/workflows/projects/artifacts.md +24 -6
- package/assets/docs/workflows/projects/dispatch-ceiling.md +67 -16
- package/assets/docs/workflows/skills/explainer-kit-providers.md +144 -0
- package/assets/docs/workflows/skills/explainer-kit.md +121 -69
- package/assets/docs/workflows/skills/index.md +1 -0
- package/assets/public-package-versions.json +4 -4
- package/assets/skills/explainer-kit/SKILL.md +18 -3
- package/assets/skills/explainer-kit/recipes/project-recap.json +43 -16
- package/assets/skills/explainer-kit/references/contracts.md +167 -20
- package/assets/skills/explainer-kit/references/golden-conformance.md +80 -0
- package/assets/skills/explainer-kit/references/visual-authoring.md +92 -0
- package/assets/skills/explainer-kit/references/visual-review.md +57 -0
- package/assets/skills/explainer-kit/schemas/author-request.v2.schema.json +172 -1
- package/assets/skills/explainer-kit/schemas/build-record.schema.json +7 -1
- package/assets/skills/explainer-kit/schemas/fact-base.schema.json +38 -2
- package/assets/skills/explainer-kit/schemas/manifest.schema.json +25 -1
- package/assets/skills/explainer-kit/schemas/run-request.schema.json +4 -0
- package/assets/skills/explainer-kit/schemas/set-plan.v1.schema.json +149 -0
- package/assets/skills/explainer-kit/schemas/visual-review-request.v1.schema.json +117 -0
- package/assets/skills/explainer-kit/schemas/visual-review-result.v1.schema.json +80 -0
- package/assets/skills/explainer-kit/scripts/lib/browser-runtime.mjs +148 -4
- package/assets/skills/explainer-kit/scripts/lib/catalog.mjs +243 -0
- package/assets/skills/explainer-kit/scripts/lib/contracts.mjs +586 -8
- package/assets/skills/explainer-kit/scripts/lib/diagram.mjs +285 -8
- package/assets/skills/explainer-kit/scripts/lib/durability.mjs +35 -0
- package/assets/skills/explainer-kit/scripts/lib/fact-base.mjs +144 -8
- package/assets/skills/explainer-kit/scripts/lib/package-coverage.mjs +379 -0
- package/assets/skills/explainer-kit/scripts/lib/png.mjs +287 -0
- package/assets/skills/explainer-kit/scripts/lib/qa.mjs +280 -8
- package/assets/skills/explainer-kit/scripts/lib/recipes.mjs +132 -3
- package/assets/skills/explainer-kit/scripts/lib/records.mjs +513 -21
- package/assets/skills/explainer-kit/scripts/lib/render.mjs +67 -3
- package/assets/skills/explainer-kit/scripts/lib/s3-static.mjs +43 -1
- package/assets/skills/explainer-kit/scripts/lib/set-plan.mjs +208 -0
- package/assets/skills/explainer-kit/scripts/lib/source-backlinks.mjs +218 -0
- package/assets/skills/explainer-kit/scripts/lib/visual-review.mjs +380 -0
- package/assets/skills/explainer-kit/scripts/render-qa.mjs +48 -10
- package/assets/skills/explainer-kit/scripts/run.mjs +859 -134
- package/assets/skills/oat-explainer-kit/SKILL.md +40 -12
- package/assets/skills/oat-explainer-kit/references/author-callback.md +12 -10
- package/assets/skills/oat-explainer-kit/references/lifecycle-contract.md +40 -2
- package/assets/skills/oat-explainer-kit/references/visual-review-callback.md +72 -0
- package/assets/skills/oat-explainer-kit/scripts/bind-project-sources.mjs +167 -5
- package/assets/skills/oat-explainer-kit/scripts/finalize-tracked-run.mjs +92 -5
- package/assets/skills/oat-explainer-kit/scripts/run.mjs +324 -2
- package/assets/skills/oat-project-autonomous/references/gate-inventory.md +1 -1
- package/assets/skills/oat-project-document/references/docs/autonomy-contract.md +1 -1
- package/assets/skills/oat-project-implement/SKILL.md +9 -11
- package/assets/skills/oat-project-implement/references/dispatch-and-dry-run.md +18 -9
- package/assets/skills/oat-project-implement/references/docs/autonomy-contract.md +1 -1
- package/assets/skills/oat-project-implement/references/phase-execution.md +13 -4
- package/assets/skills/oat-project-pr-final/references/docs/autonomy-contract.md +1 -1
- package/assets/skills/oat-project-quick-start/references/docs/autonomy-contract.md +1 -1
- package/dist/commands/config/index.d.ts.map +1 -1
- package/dist/commands/config/index.js +27 -3
- package/dist/commands/project/archive/archive-utils.d.ts +1 -0
- package/dist/commands/project/archive/archive-utils.d.ts.map +1 -1
- package/dist/commands/project/archive/archive-utils.js +109 -42
- package/dist/commands/project/archive/explainer-package-coverage.d.ts +14 -0
- package/dist/commands/project/archive/explainer-package-coverage.d.ts.map +1 -0
- package/dist/commands/project/archive/explainer-package-coverage.js +27 -0
- package/dist/commands/project/archive/explainer-source-backlinks.d.ts +18 -0
- package/dist/commands/project/archive/explainer-source-backlinks.d.ts.map +1 -0
- package/dist/commands/project/archive/explainer-source-backlinks.js +27 -0
- package/dist/commands/project/archive/push-runner.d.ts +2 -1
- package/dist/commands/project/archive/push-runner.d.ts.map +1 -1
- package/dist/commands/project/archive/push-runner.js +5 -1
- package/dist/commands/project/dispatch-ceiling/index.d.ts.map +1 -1
- package/dist/commands/project/dispatch-ceiling/index.js +90 -0
- package/dist/config/dispatch-notices.d.ts +8 -0
- package/dist/config/dispatch-notices.d.ts.map +1 -0
- package/dist/config/dispatch-notices.js +79 -0
- package/dist/config/dispatch-policy-options.d.ts +2 -0
- package/dist/config/dispatch-policy-options.d.ts.map +1 -1
- package/dist/config/dispatch-policy-options.js +14 -2
- package/dist/providers/identity/dispatch-report.d.ts +17 -0
- package/dist/providers/identity/dispatch-report.d.ts.map +1 -1
- package/dist/providers/identity/dispatch-report.js +30 -0
- package/dist/release/public-package-contract.d.ts +6 -0
- package/dist/release/public-package-contract.d.ts.map +1 -1
- package/dist/release/public-package-contract.js +75 -0
- 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.
|
|
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
|
-
|
|
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`; `
|
|
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`; `
|
|
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.
|
|
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
|
|
23
|
-
|
|
24
|
-
`.agents/skills/oat-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
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.
|
|
321
|
-
block with `formatDispatchReport(dispatchReport)`
|
|
322
|
-
|
|
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
|
|
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
|
|
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
|