@open-agent-toolkit/cli 0.2.5 → 0.2.7

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 (104) hide show
  1. package/assets/docs/cli-utilities/configuration.md +40 -0
  2. package/assets/docs/cli-utilities/tool-packs.md +31 -0
  3. package/assets/docs/workflows/projects/artifacts.md +27 -0
  4. package/assets/docs/workflows/skills/explainer-kit.md +125 -0
  5. package/assets/docs/workflows/skills/index.md +4 -0
  6. package/assets/migration/pjm-restructure.md +12 -0
  7. package/assets/public-package-versions.json +4 -4
  8. package/assets/skills/explainer-kit/SKILL.md +95 -0
  9. package/assets/skills/explainer-kit/examples/project-explainer/content.md +31 -0
  10. package/assets/skills/explainer-kit/examples/project-explainer/fact-base.md +22 -0
  11. package/assets/skills/explainer-kit/examples/project-recap/content.md +34 -0
  12. package/assets/skills/explainer-kit/examples/project-recap/fact-base.md +22 -0
  13. package/assets/skills/explainer-kit/examples/theme-bundle.json +87 -0
  14. package/assets/skills/explainer-kit/palettes/ember.json +37 -0
  15. package/assets/skills/explainer-kit/palettes/forest.json +37 -0
  16. package/assets/skills/explainer-kit/palettes/neutral.json +37 -0
  17. package/assets/skills/explainer-kit/palettes/ocean.json +37 -0
  18. package/assets/skills/explainer-kit/palettes/violet.json +37 -0
  19. package/assets/skills/explainer-kit/profiles/clean.json +42 -0
  20. package/assets/skills/explainer-kit/profiles/editorial.json +42 -0
  21. package/assets/skills/explainer-kit/profiles/technical.json +39 -0
  22. package/assets/skills/explainer-kit/recipes/engineer-tour.json +33 -0
  23. package/assets/skills/explainer-kit/recipes/project-explainer.json +33 -0
  24. package/assets/skills/explainer-kit/recipes/project-recap.json +34 -0
  25. package/assets/skills/explainer-kit/references/contracts.md +101 -0
  26. package/assets/skills/explainer-kit/references/destination-contract.md +94 -0
  27. package/assets/skills/explainer-kit/references/extension-contract.md +71 -0
  28. package/assets/skills/explainer-kit/references/fact-base-contract.md +119 -0
  29. package/assets/skills/explainer-kit/schemas/build-record.schema.json +92 -0
  30. package/assets/skills/explainer-kit/schemas/durability-evidence.schema.json +53 -0
  31. package/assets/skills/explainer-kit/schemas/fact-base.schema.json +129 -0
  32. package/assets/skills/explainer-kit/schemas/manifest.schema.json +193 -0
  33. package/assets/skills/explainer-kit/schemas/publish-receipt.schema.json +97 -0
  34. package/assets/skills/explainer-kit/schemas/publish-request.schema.json +32 -0
  35. package/assets/skills/explainer-kit/schemas/run-request.schema.json +132 -0
  36. package/assets/skills/explainer-kit/schemas/theme.schema.json +217 -0
  37. package/assets/skills/explainer-kit/scripts/lib/content-approval.mjs +180 -0
  38. package/assets/skills/explainer-kit/scripts/lib/contracts.mjs +680 -0
  39. package/assets/skills/explainer-kit/scripts/lib/durability.mjs +538 -0
  40. package/assets/skills/explainer-kit/scripts/lib/fact-base.mjs +494 -0
  41. package/assets/skills/explainer-kit/scripts/lib/fs-safe.mjs +218 -0
  42. package/assets/skills/explainer-kit/scripts/lib/qa.mjs +512 -0
  43. package/assets/skills/explainer-kit/scripts/lib/recipes.mjs +289 -0
  44. package/assets/skills/explainer-kit/scripts/lib/records.mjs +231 -0
  45. package/assets/skills/explainer-kit/scripts/lib/render.mjs +485 -0
  46. package/assets/skills/explainer-kit/scripts/lib/s3-static.mjs +587 -0
  47. package/assets/skills/explainer-kit/scripts/lib/safe-paths.mjs +96 -0
  48. package/assets/skills/explainer-kit/scripts/lib/theme.mjs +332 -0
  49. package/assets/skills/explainer-kit/scripts/publish.mjs +76 -0
  50. package/assets/skills/explainer-kit/scripts/record-durability.mjs +64 -0
  51. package/assets/skills/explainer-kit/scripts/render-qa.mjs +273 -0
  52. package/assets/skills/explainer-kit/scripts/run.mjs +778 -0
  53. package/assets/skills/explainer-kit/scripts/validate.mjs +59 -0
  54. package/assets/skills/explainer-kit/templates/deck-shell.html +233 -0
  55. package/assets/skills/explainer-kit/templates/diagram-shell.html +219 -0
  56. package/assets/skills/explainer-kit/templates/engineer-tour.html +273 -0
  57. package/assets/skills/explainer-kit/templates/house-style.html +218 -0
  58. package/assets/skills/oat-explainer-kit/SKILL.md +92 -0
  59. package/assets/skills/oat-explainer-kit/references/config-contract.md +67 -0
  60. package/assets/skills/oat-explainer-kit/references/lifecycle-contract.md +143 -0
  61. package/assets/skills/oat-explainer-kit/references/migration.md +143 -0
  62. package/assets/skills/oat-explainer-kit/scripts/bind-project-sources.mjs +103 -0
  63. package/assets/skills/oat-explainer-kit/scripts/check-core.mjs +127 -0
  64. package/assets/skills/oat-explainer-kit/scripts/finalize-tracked-run.mjs +392 -0
  65. package/assets/skills/oat-explainer-kit/scripts/persist-intent.mjs +130 -0
  66. package/assets/skills/oat-explainer-kit/scripts/resolve-config.mjs +293 -0
  67. package/assets/skills/oat-explainer-kit/scripts/resolve-intent.mjs +209 -0
  68. package/assets/skills/oat-explainer-kit/scripts/resolve-paths.mjs +166 -0
  69. package/assets/skills/oat-explainer-kit/scripts/run.mjs +284 -0
  70. package/assets/skills/oat-project-autonomous/SKILL.md +22 -1
  71. package/assets/skills/oat-project-autonomous/references/gate-inventory.md +5 -1
  72. package/assets/skills/oat-project-complete/SKILL.md +166 -28
  73. package/assets/skills/oat-project-document/references/docs/autonomy-contract.md +5 -1
  74. package/assets/skills/oat-project-implement/SKILL.md +1 -1
  75. package/assets/skills/oat-project-implement/references/completion-and-closeout.md +17 -0
  76. package/assets/skills/oat-project-implement/references/docs/autonomy-contract.md +5 -1
  77. package/assets/skills/oat-project-plan/SKILL.md +30 -1
  78. package/assets/skills/oat-project-pr-final/references/docs/autonomy-contract.md +5 -1
  79. package/assets/skills/oat-project-quick-start/references/docs/autonomy-contract.md +5 -1
  80. package/assets/skills/oat-project-summary/SKILL.md +20 -1
  81. package/assets/skills/oat-wave-execute/SKILL.md +1 -1
  82. package/dist/commands/config/index.d.ts.map +1 -1
  83. package/dist/commands/config/index.js +232 -1
  84. package/dist/commands/init/tools/shared/skill-manifest.d.ts +2 -2
  85. package/dist/commands/init/tools/shared/skill-manifest.d.ts.map +1 -1
  86. package/dist/commands/init/tools/shared/skill-manifest.js +2 -0
  87. package/dist/commands/project/archive/archive-utils.d.ts +12 -0
  88. package/dist/commands/project/archive/archive-utils.d.ts.map +1 -1
  89. package/dist/commands/project/archive/archive-utils.js +320 -8
  90. package/dist/commands/project/archive/index.d.ts.map +1 -1
  91. package/dist/commands/project/archive/index.js +1 -0
  92. package/dist/commands/project/archive/push-runner.d.ts +1 -0
  93. package/dist/commands/project/archive/push-runner.d.ts.map +1 -1
  94. package/dist/commands/project/archive/push-runner.js +9 -2
  95. package/dist/config/oat-config.d.ts +26 -0
  96. package/dist/config/oat-config.d.ts.map +1 -1
  97. package/dist/config/oat-config.js +88 -0
  98. package/dist/config/resolve.d.ts.map +1 -1
  99. package/dist/config/resolve.js +18 -0
  100. package/dist/validation/project-state.d.ts +3 -0
  101. package/dist/validation/project-state.d.ts.map +1 -1
  102. package/dist/validation/project-state.js +91 -0
  103. package/package.json +2 -2
  104. /package/assets/skills/{oat-wave-execute/assets/program-recap.recipe.json → explainer-kit/recipes/program-recap.json} +0 -0
@@ -0,0 +1,284 @@
1
+ #!/usr/bin/env node
2
+
3
+ import { readFile } from 'node:fs/promises';
4
+ import { dirname, join, resolve } from 'node:path';
5
+ import { fileURLToPath, pathToFileURL } from 'node:url';
6
+
7
+ import { bindProjectSources } from './bind-project-sources.mjs';
8
+ import { checkCoreCompatibility } from './check-core.mjs';
9
+ import {
10
+ resolveExplainerConfig,
11
+ toExplainerRunRequest,
12
+ } from './resolve-config.mjs';
13
+ import { resolveExplainerOutputRoot } from './resolve-paths.mjs';
14
+
15
+ const MINIMUM_CORE_VERSION = '1.0.0';
16
+ const ADAPTER_ROOT = resolve(dirname(fileURLToPath(import.meta.url)), '..');
17
+
18
+ export async function runOatExplainer({
19
+ adapterRoot = ADAPTER_ROOT,
20
+ userSkillsRoot,
21
+ repoRoot,
22
+ invocation,
23
+ activeProject,
24
+ recipe,
25
+ slug,
26
+ suppliedFactBasePath,
27
+ runtimeOverrides = {},
28
+ getConfig,
29
+ mode = 'unattended',
30
+ durabilityStrategy = 'none',
31
+ artDirection,
32
+ defaultMode,
33
+ renderStrategy,
34
+ retainRawArtDirection = false,
35
+ critic,
36
+ criticModulePath,
37
+ coreOptions = {},
38
+ }) {
39
+ const compatibility = await checkCoreCompatibility({
40
+ adapterRoot,
41
+ ...(userSkillsRoot && { userSkillsRoot }),
42
+ minimumVersion: MINIMUM_CORE_VERSION,
43
+ });
44
+ if (!compatibility.ok) {
45
+ const error = new Error(
46
+ `${compatibility.message} Run \`${compatibility.guidance}\`.`,
47
+ );
48
+ error.code =
49
+ compatibility.code === 'missing'
50
+ ? 'E_CORE_MISSING'
51
+ : 'E_CORE_INCOMPATIBLE';
52
+ error.compatibility = compatibility;
53
+ throw error;
54
+ }
55
+
56
+ const resolvedConfig = await resolveExplainerConfig({
57
+ repoRoot,
58
+ runtimeOverrides,
59
+ ...(getConfig && { getConfig }),
60
+ });
61
+ const outputRoot = await resolveExplainerOutputRoot({
62
+ repoRoot,
63
+ invocation,
64
+ activeProject,
65
+ });
66
+ if (invocation !== 'project' || !activeProject) {
67
+ throw new Error(
68
+ 'Project artifact binding requires a project invocation and activeProject.',
69
+ );
70
+ }
71
+ const projectRoot = resolve(repoRoot, activeProject);
72
+ const bound = await bindProjectSources({
73
+ projectRoot,
74
+ recipe,
75
+ suppliedFactBasePath,
76
+ });
77
+ const request = toExplainerRunRequest({
78
+ resolvedConfig,
79
+ recipe,
80
+ slug,
81
+ outputRoot,
82
+ factBase: bound.factBase,
83
+ mode,
84
+ durabilityStrategy,
85
+ artDirection,
86
+ defaultMode,
87
+ renderStrategy,
88
+ retainRawArtDirection,
89
+ });
90
+
91
+ const coreModulePath = join(compatibility.coreRoot, 'scripts', 'run.mjs');
92
+ let core;
93
+ try {
94
+ core = await import(pathToFileURL(coreModulePath).href);
95
+ } catch (cause) {
96
+ const error = new Error(
97
+ `Compatible explainer-kit is missing its run entry point. Run \`${compatibility.guidance ?? 'oat tools update --pack utility --scope user'}\`.`,
98
+ { cause },
99
+ );
100
+ error.code = 'E_CORE_INCOMPATIBLE';
101
+ throw error;
102
+ }
103
+ if (typeof core.runExplainer !== 'function') {
104
+ const error = new Error(
105
+ 'Compatible explainer-kit does not export runExplainer(request, options).',
106
+ );
107
+ error.code = 'E_CORE_INCOMPATIBLE';
108
+ throw error;
109
+ }
110
+
111
+ const lifecycleCritic = await resolveLifecycleCritic({
112
+ critic,
113
+ criticModulePath,
114
+ coreOptions,
115
+ });
116
+ const result = await core.runExplainer(request, {
117
+ ...coreOptions,
118
+ ...(lifecycleCritic && { critic: lifecycleCritic }),
119
+ ...(bound.sourceLoader && { sourceLoader: bound.sourceLoader }),
120
+ reviewedSource: bound.reviewedSource,
121
+ });
122
+ const criticContractError = result?.errors?.find(
123
+ ({ message }) =>
124
+ typeof message === 'string' && message.includes('critic result contract'),
125
+ );
126
+ if (criticContractError) {
127
+ throw new Error(criticContractError.message);
128
+ }
129
+ const manifest = await readManifest(result, request);
130
+ return {
131
+ compatibility,
132
+ request,
133
+ manifest,
134
+ result,
135
+ outputRoot,
136
+ };
137
+ }
138
+
139
+ async function resolveLifecycleCritic({
140
+ critic,
141
+ criticModulePath,
142
+ coreOptions,
143
+ }) {
144
+ const candidates = [
145
+ typeof critic === 'function' ? critic : null,
146
+ typeof coreOptions?.critic === 'function' ? coreOptions.critic : null,
147
+ criticModulePath ? criticModulePath : null,
148
+ ].filter(Boolean);
149
+ if (candidates.length > 1) {
150
+ throw new Error(
151
+ 'Supply only one provider-neutral critic callback or critic module entry point.',
152
+ );
153
+ }
154
+ if (critic !== undefined && typeof critic !== 'function') {
155
+ throw new TypeError('critic must be a function when supplied.');
156
+ }
157
+ if (
158
+ coreOptions?.critic !== undefined &&
159
+ typeof coreOptions.critic !== 'function'
160
+ ) {
161
+ throw new TypeError('coreOptions.critic must be a function when supplied.');
162
+ }
163
+
164
+ let callback = critic ?? coreOptions?.critic;
165
+ if (criticModulePath !== undefined) {
166
+ if (
167
+ typeof criticModulePath !== 'string' ||
168
+ criticModulePath.trim().length === 0
169
+ ) {
170
+ throw new TypeError('criticModulePath must be a non-empty path.');
171
+ }
172
+ let criticModule;
173
+ try {
174
+ criticModule = await import(
175
+ pathToFileURL(resolve(criticModulePath)).href
176
+ );
177
+ } catch (cause) {
178
+ throw new Error(
179
+ `Unable to load provider-neutral critic module at ${criticModulePath}.`,
180
+ { cause },
181
+ );
182
+ }
183
+ if (typeof criticModule.critic !== 'function') {
184
+ throw new TypeError(
185
+ 'Provider-neutral critic module must export a critic function.',
186
+ );
187
+ }
188
+ callback = criticModule.critic;
189
+ }
190
+
191
+ if (!callback) {
192
+ return null;
193
+ }
194
+ return async (request) => {
195
+ const result = await callback(request);
196
+ if (
197
+ !result ||
198
+ typeof result !== 'object' ||
199
+ typeof result.criticId !== 'string' ||
200
+ !/^[a-z0-9][a-z0-9._-]*$/.test(result.criticId) ||
201
+ !Array.isArray(result.findings) ||
202
+ (result.executedAt !== undefined &&
203
+ (typeof result.executedAt !== 'string' ||
204
+ Number.isNaN(Date.parse(result.executedAt))))
205
+ ) {
206
+ throw new Error(
207
+ 'Provider-neutral critic result does not match the critic result contract.',
208
+ );
209
+ }
210
+ return result;
211
+ };
212
+ }
213
+
214
+ async function readManifest(result, request) {
215
+ if (
216
+ !result ||
217
+ typeof result !== 'object' ||
218
+ typeof result.manifestPath !== 'string'
219
+ ) {
220
+ throw new Error('explainer-kit returned no manifestPath.');
221
+ }
222
+ let manifest;
223
+ try {
224
+ manifest = JSON.parse(await readFile(result.manifestPath, 'utf8'));
225
+ } catch (error) {
226
+ if (
227
+ error?.code === 'ENOENT' &&
228
+ (result.outcome === 'failed' || result.outcome === 'incomplete')
229
+ ) {
230
+ return null;
231
+ }
232
+ throw error;
233
+ }
234
+ if (manifest.schemaVersion !== 'explainer-kit.manifest/v1') {
235
+ throw new Error(
236
+ `Unsupported core manifest version: ${manifest.schemaVersion ?? 'missing'}.`,
237
+ );
238
+ }
239
+ if (
240
+ manifest.recipe?.id !== request.recipe.id ||
241
+ manifest.recipe?.version !== request.recipe.version
242
+ ) {
243
+ throw new Error(
244
+ 'Core manifest recipe does not match the normalized request.',
245
+ );
246
+ }
247
+ return manifest;
248
+ }
249
+
250
+ async function runCli(argv = process.argv.slice(2), io = console) {
251
+ try {
252
+ if (argv.length !== 2 || argv[0] !== '--context') {
253
+ throw new Error('Usage: run.mjs --context <adapter-context.json>');
254
+ }
255
+ const context = JSON.parse(await readFile(argv[1], 'utf8'));
256
+ const result = await runOatExplainer(context);
257
+ io.log(JSON.stringify(result, null, 2));
258
+ return result.result.outcome === 'failed' ? 1 : 0;
259
+ } catch (error) {
260
+ io.error(
261
+ JSON.stringify(
262
+ {
263
+ outcome: 'failed',
264
+ errors: [
265
+ {
266
+ code: error.code ?? 'E_ADAPTER',
267
+ message: error instanceof Error ? error.message : String(error),
268
+ },
269
+ ],
270
+ },
271
+ null,
272
+ 2,
273
+ ),
274
+ );
275
+ return 1;
276
+ }
277
+ }
278
+
279
+ if (
280
+ process.argv[1] &&
281
+ pathToFileURL(process.argv[1]).href === import.meta.url
282
+ ) {
283
+ process.exitCode = await runCli();
284
+ }
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: oat-project-autonomous
3
- version: 1.0.4
3
+ version: 1.0.5
4
4
  description: Use when a user explicitly asks to run an OAT project autonomously end-to-end. Activates session-only autonomy, resumes the correct lifecycle phase, and drives the existing OAT skills through final PR or a reported boundary.
5
5
  argument-hint: '<goal | project-slug | ticket-ref>'
6
6
  disable-model-invocation: true
@@ -234,6 +234,27 @@ a product-judgment boundary.
234
234
  Invoke `oat-project-new` for spec-driven mode or `oat-project-quick-start` for
235
235
  quick mode. Existing projects retain their persisted workflow mode.
236
236
 
237
+ ### Step 2.5: Persist Autonomous Explainer Intent
238
+
239
+ As soon as the selected creation skill has created a new project, or after an
240
+ existing project is resolved, use the `oat-explainer-kit` lifecycle intent
241
+ resolver and persistence helper against that project's `state.md`.
242
+
243
+ Resolve and persist `projectRecap` as `generate` with source `autonomous_policy` after project creation or resolution.
244
+ Reassert this forced recap intent on resume; a stale lower-precedence skip is overridden, warned, and recorded.
245
+ The autonomous mode policy has precedence over project state and workflow
246
+ preference, so `never` does not suppress the recap.
247
+
248
+ Resolve and persist `projectExplainer` as `generate` with source `kickoff_prompt` only when the kickoff request explicitly asks for a project explainer.
249
+ A general autonomous goal, project creation, or normal planning does not count as an explainer request.
250
+ When no explicit kickoff explainer request exists, do not persist a project-explainer intent record.
251
+ Do not infer this request from the presence of a plan, from the selected
252
+ workflow mode, or from a generic request to run through PR.
253
+
254
+ Use the state content hash expected by the adapter persistence contract. On a
255
+ stale-write conflict, re-read `state.md`, rerun autonomous resolution, and
256
+ persist only the newly returned record; never retry a stale record blindly.
257
+
237
258
  ### Step 3: Perform External-Integration Research
238
259
 
239
260
  Before planning, extensively research every integrated system, service,
@@ -142,6 +142,7 @@ remains.
142
142
  | PLAN-09 | `oat-project-plan` | Plan artifact-review findings | Accept offered Medium/Minor fixes | Apply unambiguous artifact-local fixes and re-review; unresolved Critical or material ambiguity stops | `auto-resolve` / `boundary:unresolved-critical-findings` | Plan review row and residuals |
143
143
  | PLAN-10 | `oat-project-plan` | Parallel-group proposal | Confirm a candidate group | Accept only when write-set and dependency evidence proves independence; otherwise keep sequential and record why | `auto-resolve` | Plan Parallelism section |
144
144
  | PLAN-11 | `oat-project-plan` | Configured exit gate | `block`, `prompt`, or `warn` after failure | Apply configured failure semantics; `prompt` becomes a reported boundary | `auto-resolve` / `boundary:repository-policy-approval` | Structured gate result and disposition |
145
+ | PLAN-12 | `oat-project-plan` | Project-explainer intent | Generate or skip the project explainer | Preserve explicit or persisted intent; in autonomy generate only when kickoff explicitly requested it and never prompt | `auto-resolve` | Persisted project-explainer intent |
145
146
  | IMPORT-01 | `oat-project-import-plan` | Inherited dirty tree | Commit, proceed, or abort | Proceed without staging unrelated files; destructive cleanup stops | `auto-resolve` / `boundary:destructive-change-risk` | Import preflight note |
146
147
  | IMPORT-02 | `oat-project-import-plan` | Missing project | Ask for project identity | Use explicit invocation context; otherwise stop rather than guess | `boundary:product-judgment` | Resolved project path |
147
148
  | IMPORT-03 | `oat-project-import-plan` | Source plan selection or extension exception | Choose a candidate/path or confirm nonstandard Markdown | Use an explicit unique source; ambiguity or nonstandard content stops | `auto-resolve` / `boundary:product-judgment` | Import reference metadata |
@@ -169,6 +170,7 @@ remains.
169
170
  | IMPLEMENT-16 | `oat-project-implement` | Final HiLL approval | Approve, decline, or defer between pre/post steps | After passing auto-review and successful pre-approval steps, record approval and continue post-approval steps; otherwise stop | `auto-resolve` / `boundary:unresolved-critical-findings` | Sequence snapshot, review artifact, dispatch record |
170
171
  | IMPLEMENT-17 | `oat-project-implement` | Next-step prompt | Choose lifecycle tail actions | Unreachable when the autonomous sequence snapshot exists; never present the prompt | `auto-resolve` | Completed sequence snapshot |
171
172
  | IMPLEMENT-18 | `oat-project-implement` | Configured exit gate | `block`, `prompt`, or `warn` after validated findings | Apply configured failure semantics only to a validated, receive-eligible `blocked` envelope after durable receive; all operational, validation, correlation, malformed/contradictory-envelope, launch, and receive failures stop regardless of `onFailure`, including `warn` | `auto-resolve` / `boundary:repository-policy-approval` | Validated structured gate result, completed receive, and disposition |
173
+ | IMPLEMENT-19 | `oat-project-implement` | Implementation-tail project recap | Generate or skip the final project recap | In autonomy attempt one recap when no fresh recap exists; preserve resolved interactive intent otherwise, and never block completion on recap outcome | `auto-resolve` | Recap manifest and outcome record |
172
174
  | DOCUMENT-01 | `oat-project-document` | Missing project path | Ask for a path | Use explicit/active project only; otherwise stop | `boundary:product-judgment` | Resolved project path |
173
175
  | DOCUMENT-02 | `oat-project-document` | Documentation delta approval | Apply all, individual, or skip | Invoke the existing `--auto` path and apply all non-destructive recommendations | `auto-resolve` | Documentation delta and state update |
174
176
  | DOCUMENT-03 | `oat-project-document` | Delete or restructure docs | Require explicit approval | Stop before destructive or broad restructuring not already authorized by the plan | `boundary:destructive-change-risk` | Documentation blocker |
@@ -256,7 +258,9 @@ remains immutable baseline evidence for the original p01-t01 verification.
256
258
  | `oat-dispatch-subagents/references/provider-cursor.md` | `ca11e28923eb -> NG`; `be0a84c48fc0 -> NG` |
257
259
  | `oat-dispatch-subagents/references/record-schema.md` | `78f8069274a8 -> NG` |
258
260
  | `oat-project-dispatch-subagents/SKILL.md` | `eca03ad1ca12 -> PDISPATCH-01`; `59fbcdc79cea -> PDISPATCH-01` |
259
- | `oat-project-complete/SKILL.md` | `b4934a85feee -> NG` |
261
+ | `oat-project-plan/SKILL.md` | `f99e44b39932 -> PLAN-12`; `7e6a9854504b -> NG` |
262
+ | `oat-project-implement/references/completion-and-closeout.md` | `6909a5a5a1fa -> IMPLEMENT-19`; `a7c02ef670fd -> IMPLEMENT-19` |
263
+ | `oat-project-complete/SKILL.md` | `ffad9f909dba -> COMPLETE-01`; `ffe636f736e8 -> COMPLETE-01`; `ea2dced337be -> COMPLETE-01`; `93d3e4ee3355 -> COMPLETE-01`; `2407ebed0921 -> NG`; `0177956707aa -> NG`; `8305b5bb65ef -> NG` |
260
264
 
261
265
  ## Prompt-scan comparison
262
266