@cassiomc1/forgeloop 1.0.0 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (95) hide show
  1. package/.cursor/rules/project-loop.mdc +3 -2
  2. package/.github/copilot-instructions.md +1 -0
  3. package/AGENTS.md +2 -1
  4. package/CLAUDE.md +1 -0
  5. package/DOCS_INDEX.md +36 -0
  6. package/ENG/design-code-eng.md +31 -0
  7. package/ENG/documentation-quality-eng.md +400 -0
  8. package/EXECUTION_STATE.md +23 -13
  9. package/GUIDE_ROUTER.md +23 -8
  10. package/LOOP_ENGINEERING.md +77 -12
  11. package/PROTOCOL_INTEGRATION.md +9 -6
  12. package/README.md +82 -39
  13. package/docs/ARTIFACT_REFERENCE.md +442 -0
  14. package/docs/CLI_REFERENCE.md +892 -0
  15. package/docs/CROSS_HARNESS_CONTINUITY.md +198 -0
  16. package/docs/DOCUMENTATION_GUIDE.md +161 -0
  17. package/docs/GETTING_STARTED.md +348 -0
  18. package/docs/RECIPES.md +250 -0
  19. package/docs/TROUBLESHOOTING.md +345 -0
  20. package/docs/assets/forgeloop-flow.svg +1 -1
  21. package/docs/forgeloop-flow.mmd +1 -1
  22. package/package.json +13 -2
  23. package/schemas/task-descriptor.schema.json +56 -0
  24. package/schemas/work-state.schema.json +18 -1
  25. package/scripts/CI_VALIDATORS.md +7 -0
  26. package/src/cli.js +280 -388
  27. package/src/commands/advance.js +5 -2
  28. package/src/commands/audit.js +11 -1
  29. package/src/commands/clear-continuity.js +5 -2
  30. package/src/commands/clear-state.js +5 -2
  31. package/src/commands/complete.js +9 -1
  32. package/src/commands/continuity.js +5 -2
  33. package/src/commands/inspect.js +10 -2
  34. package/src/commands/next.js +5 -2
  35. package/src/commands/preflight.js +9 -1
  36. package/src/commands/prepare-completion.js +5 -2
  37. package/src/commands/reconcile-continuity.js +5 -2
  38. package/src/commands/record-check.js +7 -1
  39. package/src/commands/record-continuity.js +21 -14
  40. package/src/commands/record-terminal-result.js +7 -1
  41. package/src/commands/route.js +22 -18
  42. package/src/commands/run-check.js +52 -44
  43. package/src/commands/status.js +18 -12
  44. package/src/commands/task-create.js +94 -0
  45. package/src/commands/task-list.js +48 -0
  46. package/src/commands/task-migrate.js +34 -0
  47. package/src/commands/task-scope.js +75 -0
  48. package/src/commands/task-show.js +81 -0
  49. package/src/commands/task-unlock.js +35 -0
  50. package/src/commands/validate-protocol.js +37 -20
  51. package/src/commands/validate-state.js +24 -18
  52. package/src/config/guides.json +42 -0
  53. package/src/core/activation.js +8 -4
  54. package/src/core/artifact-registry.js +166 -0
  55. package/src/core/audit.js +65 -12
  56. package/src/core/bundles.js +76 -50
  57. package/src/core/cli-command-definitions.js +611 -0
  58. package/src/core/cli-metadata.js +23 -0
  59. package/src/core/completion-artifacts.js +161 -74
  60. package/src/core/completion.js +134 -76
  61. package/src/core/continuity.js +20 -13
  62. package/src/core/contract.js +6 -3
  63. package/src/core/error-codes.js +197 -0
  64. package/src/core/events.js +19 -14
  65. package/src/core/execution.js +38 -6
  66. package/src/core/gate-artifact.js +12 -9
  67. package/src/core/gates.js +4 -2
  68. package/src/core/guide-metadata.js +7 -11
  69. package/src/core/guide-registry.js +29 -0
  70. package/src/core/inspect.js +7 -4
  71. package/src/core/native-adapters.js +6 -0
  72. package/src/core/phase.js +85 -33
  73. package/src/core/preflight-consistency.js +24 -14
  74. package/src/core/preflight-loaders.js +16 -11
  75. package/src/core/preflight.js +44 -25
  76. package/src/core/protocol.js +2 -11
  77. package/src/core/receipt.js +1 -1
  78. package/src/core/report.js +2 -2
  79. package/src/core/repository.js +46 -12
  80. package/src/core/resumability.js +6 -4
  81. package/src/core/route-artifact.js +9 -5
  82. package/src/core/router.js +11 -7
  83. package/src/core/schema-validation.js +1 -0
  84. package/src/core/task-command.js +41 -0
  85. package/src/core/task-context.js +126 -0
  86. package/src/core/task-descriptor.js +81 -0
  87. package/src/core/task-discovery.js +116 -0
  88. package/src/core/task-identity.js +76 -0
  89. package/src/core/task-lock.js +209 -0
  90. package/src/core/task-migration-validation.js +140 -0
  91. package/src/core/task-migration.js +361 -0
  92. package/src/core/task-paths.js +96 -0
  93. package/src/core/task-scope.js +179 -0
  94. package/src/core/templates.js +3 -9
  95. package/src/core/work-state.js +24 -13
@@ -0,0 +1,442 @@
1
+ # ForgeLoop Artifact Reference
2
+
3
+ This reference documents the canonical artifacts persisted in the `.forgeloop/` directory.
4
+
5
+ All artifact schemas are defined in `schemas/*.schema.json`. Persisted artifact shapes are strictly bound to these schemas and validated during protocol transitions.
6
+
7
+ ---
8
+
9
+ ## 1. Artifact Registry Summary
10
+
11
+ <!-- BEGIN FORGELOOP GENERATED: artifact-registry -->
12
+
13
+ | Artifact File | Schema | Ownership | Mutability | Trust Role |
14
+ | --- | --- | --- | --- | --- |
15
+ | `task-state/<task-key>/task.json` | `task-descriptor` | Protocol Managed | Mutable Before Execution | Task Descriptor |
16
+ | `task-state/<task-key>/contract.json` | `current-contract` | Agent Authored | Mutable Before Execution | Operational Specification |
17
+ | `task-state/<task-key>/routing-result.json` | `routing-result` | Protocol Generated | Mutable On Reroute | Guide Routing Specification |
18
+ | `task-state/<task-key>/preflight.json` | `preflight` | Protocol Generated | Overwritten On Preflight | Readiness Attestation |
19
+ | `sources.json` | `source-registry` | Operator Or Agent | Mutable On Discovery | Source Attestation |
20
+ | `task-state/<task-key>/events.ndjson` | `event` | Protocol Appended | Append Only | Audit Ledger |
21
+ | `sessions/<session-id>.json` | `activation` | Protocol Generated | Overwritten On Activate | Session Marker |
22
+ | `config.json` | `config` | Operator Or Agent | Mutable Configuration | Project Configuration |
23
+ | `task-state/<task-key>/gates/<gate>.json` | `gate` | Agent Authored Or Reviewer | Overwritten On Gate Satisfaction | Gate Approval Attestation |
24
+ | `task-state/<task-key>/work-state.json` | `work-state` | Protocol Managed | Atomic State Transitions | Canonical Lifecycle State |
25
+ | `task-state/<task-key>/continuity.json` | `continuity` | Agent Or Harness | Mutable Handoff Notes | Non Evidence Handoff |
26
+ | `task-state/<task-key>/execution-receipt.json` | `execution-receipt` | Protocol Compiled | Atomic Compilation | Evidence Compilation |
27
+ | `task-state/<task-key>/executions/exec-<id>.json` | `execution` | Protocol Executed | Immutable Once Written | Execution Provenance |
28
+
29
+ <!-- END FORGELOOP GENERATED: artifact-registry -->
30
+
31
+ ---
32
+
33
+ ## 2. Canonical Artifact Specifications
34
+
35
+ ### 2.1 `task-state/<taskKey>/contract.json`
36
+
37
+ <!-- forgeloop-doc: schema=current-contract artifact=.forgeloop/task-state/<task-key>/contract.json -->
38
+
39
+ The operational task specification authored before execution begins.
40
+
41
+ #### Canonical Fields
42
+
43
+ <!-- BEGIN FORGELOOP GENERATED: schema:current-contract -->
44
+
45
+ - `schemaVersion` *(number, required, const: 1)*
46
+ - `protocolVersion` *(number, required, const: 1)*
47
+ - `taskId` *(string, required, minLength: 1)*
48
+ - `objective` *(string, required, minLength: 1)*
49
+ - `assumptions` *(array<object>, optional)*
50
+ - `value` *(string, required, minLength: 1)*
51
+ - `reason` *(string, required, minLength: 1)*
52
+ - `scope` *(string, required, minLength: 1)*
53
+ - `reversible` *(boolean, required, const: true)*
54
+ - `source` *(string, required, const: `agent-default`)*
55
+ - `deliverables` *(array<string>, required)*
56
+ - `constraints` *(array<string>, required)*
57
+ - `risks` *(array<string>, required)*
58
+ - `verification` *(array<string or requirement>, required)*
59
+ *requirement items:*
60
+ - `id` *(string, optional, minLength: 1)*
61
+ - `text` *(string, required, minLength: 1)*
62
+ - `type` *(string, optional, enum: `PRODUCT`, `VERIFICATION`, `LIFECYCLE`, `PUBLICATION`, `PRODUCTION_READINESS`)*
63
+ - `operator` *(string, optional, enum: `SINGLE`, `ALL`)*
64
+ - `requiredEvidenceKind` *(string, optional, enum: `OBSERVED`, `INFERRED`, `NOT_VERIFIED`, `BLOCKED`, `HYPOTHESIS`)*
65
+ - `lifecycleOwned` *(boolean, optional)*
66
+ - `terminalOwned` *(boolean, optional)*
67
+ - `mixedTerminal` *(boolean, optional)*
68
+ - `requiredPublicationStatus` *(string, optional, enum: `committed`, `pushed`, `published`, `deployed`)*
69
+ - `requirements` *(array<string or requirement>, optional)*
70
+ - `successCriteria` *(array<string or requirement>, required)*
71
+ *requirement items:*
72
+ - `id` *(string, optional, minLength: 1)*
73
+ - `text` *(string, required, minLength: 1)*
74
+ - `type` *(string, optional, enum: `PRODUCT`, `VERIFICATION`, `LIFECYCLE`, `PUBLICATION`, `PRODUCTION_READINESS`)*
75
+ - `operator` *(string, optional, enum: `SINGLE`, `ALL`)*
76
+ - `requiredEvidenceKind` *(string, optional, enum: `OBSERVED`, `INFERRED`, `NOT_VERIFIED`, `BLOCKED`, `HYPOTHESIS`)*
77
+ - `lifecycleOwned` *(boolean, optional)*
78
+ - `terminalOwned` *(boolean, optional)*
79
+ - `mixedTerminal` *(boolean, optional)*
80
+ - `requiredPublicationStatus` *(string, optional, enum: `committed`, `pushed`, `published`, `deployed`)*
81
+ - `requirements` *(array<string or requirement>, optional)*
82
+ - `stopConditions` *(array<string>, required)*
83
+ - `unresolvedDecisions` *(array<string>, required)*
84
+ - `sourceRefs` *(array<string>, required)*
85
+
86
+ <!-- END FORGELOOP GENERATED: schema:current-contract -->
87
+
88
+ ---
89
+
90
+ ### 2.2 `task-state/<taskKey>/routing-result.json`
91
+
92
+ <!-- forgeloop-doc: schema=routing-result artifact=.forgeloop/task-state/<task-key>/routing-result.json -->
93
+
94
+ The deterministic result of routing task signals against the engineering guide router.
95
+
96
+ #### Canonical Fields
97
+
98
+ <!-- BEGIN FORGELOOP GENERATED: schema:routing-result -->
99
+
100
+ - `schemaVersion` *(number, required, const: 1)*
101
+ - `protocolVersion` *(number, required, const: 1)*
102
+ - `contractFingerprint` *(string, optional, pattern: `^[a-f0-9]{64}$`)*
103
+ - `input` *(object, required)*
104
+ - `primary` *(string or null, required)*
105
+ - `guides` *(array<string>, required)*
106
+ - `reasons` *(object, required)*
107
+ - `excluded` *(object, required)*
108
+
109
+ <!-- END FORGELOOP GENERATED: schema:routing-result -->
110
+
111
+ ---
112
+
113
+ ### 2.3 `task-state/<taskKey>/preflight.json`
114
+
115
+ <!-- forgeloop-doc: schema=preflight artifact=.forgeloop/task-state/<task-key>/preflight.json -->
116
+
117
+ Readiness attestation evaluated prior to implementation.
118
+
119
+ #### Canonical Fields
120
+
121
+ <!-- BEGIN FORGELOOP GENERATED: schema:preflight -->
122
+
123
+ - `schemaVersion` *(number, required, const: 1)*
124
+ - `protocolVersion` *(number, required, const: 1)*
125
+ - `taskId` *(string, required, minLength: 1)*
126
+ - `status` *(string, required, enum: `READY`, `BLOCKED`)*
127
+ - `profile` *(object, required)*
128
+ - `contract` *(object, required)*
129
+ - `routing` *(object, required)*
130
+ - `requiredGates` *(array<string>, required)*
131
+ - `satisfiedGates` *(array<string>, required)*
132
+ - `errors` *(array<object>, required)*
133
+ - `fingerprints` *(object, optional)*
134
+ - `sources` *(object, optional)*
135
+ - `policy` *(object, optional)*
136
+
137
+ <!-- END FORGELOOP GENERATED: schema:preflight -->
138
+
139
+ ---
140
+
141
+ ### 2.4 `sources.json`
142
+
143
+ <!-- forgeloop-doc: schema=source-registry artifact=.forgeloop/sources.json -->
144
+
145
+ Discovered repository facts, platforms, runtimes, and dependencies.
146
+
147
+ #### Canonical Fields
148
+
149
+ <!-- BEGIN FORGELOOP GENERATED: schema:source-registry -->
150
+
151
+ - `schemaVersion` *(number, required, const: 1)*
152
+ - `protocolVersion` *(number, required, const: 1)*
153
+ - `sources` *(object, required)*
154
+
155
+ <!-- END FORGELOOP GENERATED: schema:source-registry -->
156
+
157
+ ---
158
+
159
+ ### 2.5 `task-state/<taskKey>/events.ndjson`
160
+
161
+ <!-- forgeloop-doc: schema=event artifact=.forgeloop/task-state/<task-key>/events.ndjson -->
162
+
163
+ The append-only cryptographic event ledger. Each line is a single JSON event object.
164
+
165
+ #### Canonical Line Fields
166
+
167
+ <!-- BEGIN FORGELOOP GENERATED: schema:event -->
168
+
169
+ - `seq` *(integer, required, minimum: 1)*
170
+ - `schemaVersion` *(number, required, const: 1)*
171
+ - `protocolVersion` *(number, required, const: 1)*
172
+ - `taskId` *(string, required, minLength: 1)*
173
+ - `event` *(string, required, minLength: 1)*
174
+ - `at` *(string, required, minLength: 1)*
175
+ - `fingerprint` *(string, optional, pattern: `^[a-f0-9]{64}$`)*
176
+ - `previousHash` *(string or null, required)*
177
+ - `hash` *(string, optional, pattern: `^[a-f0-9]{64}$`)*
178
+ - `details` *(object, optional)*
179
+
180
+ <!-- END FORGELOOP GENERATED: schema:event -->
181
+
182
+ ---
183
+
184
+ ### 2.6 `sessions/<sessionId>.json`
185
+
186
+ <!-- forgeloop-doc: schema=activation artifact=.forgeloop/sessions/<session-id>.json -->
187
+
188
+ The active harness session marker created by `forgeloop activate`.
189
+
190
+ #### Canonical Fields
191
+
192
+ <!-- BEGIN FORGELOOP GENERATED: schema:activation -->
193
+
194
+ - `schemaVersion` *(number, required, const: 1)*
195
+ - `protocolVersion` *(number, required, const: 1)*
196
+ - `sessionId` *(string, required, minLength: 1)*
197
+ - `activationMarker` *(string, required, minLength: 1)*
198
+ - `createdAt` *(string, required, minLength: 1)*
199
+
200
+ <!-- END FORGELOOP GENERATED: schema:activation -->
201
+
202
+ ---
203
+
204
+ ### 2.7 `config.json`
205
+
206
+ <!-- forgeloop-doc: schema=config artifact=.forgeloop/config.json -->
207
+
208
+ Local ForgeLoop configuration settings and policy bindings.
209
+
210
+ #### Canonical Fields
211
+
212
+ <!-- BEGIN FORGELOOP GENERATED: schema:config -->
213
+
214
+ - `schemaVersion` *(number, required, const: 1)*
215
+ - `protocolVersion` *(number, required, const: 1)*
216
+ - `complianceMode` *(string, required, enum: `advisory`, `standard`, `strict`)*
217
+ - `policy` *(string, optional, minLength: 1)*
218
+ - `requiredGates` *(array<string>, optional)*
219
+ - `requiredEvidence` *(array<string>, optional)*
220
+
221
+ <!-- END FORGELOOP GENERATED: schema:config -->
222
+
223
+ ---
224
+
225
+ ### 2.8 `task-state/<taskKey>/gates/<gate>.json`
226
+
227
+ <!-- forgeloop-doc: schema=gate artifact=.forgeloop/task-state/<task-key>/gates/<gate>.json -->
228
+
229
+ Pre-implementation gate approval artifact recording decisions, bound artifact hashes, and evidence.
230
+
231
+ #### Canonical Fields
232
+
233
+ <!-- BEGIN FORGELOOP GENERATED: schema:gate -->
234
+
235
+ - `schemaVersion` *(number, required, const: 1)*
236
+ - `protocolVersion` *(number, required, const: 1)*
237
+ - `taskId` *(string, required, minLength: 1)*
238
+ - `gate` *(string, required, minLength: 1)*
239
+ - `status` *(string, required, enum: `satisfied`, `unverified`, `blocked`)*
240
+ - `requiredBy` *(array<string>, required)*
241
+ - `artifacts` *(array<object>, required)*
242
+ - `path` *(string, required, minLength: 1)*
243
+ - `sha256` *(string, required, pattern: `^[a-f0-9]{64}$`)*
244
+ - `decisions` *(array<string>, required)*
245
+ - `unknowns` *(array<string>, required)*
246
+ - `approvedAssumptions` *(array<string>, required)*
247
+ - `evidence` *(array<object>, required)*
248
+
249
+ <!-- END FORGELOOP GENERATED: schema:gate -->
250
+
251
+ ---
252
+
253
+ ### 2.9 `task-state/<taskKey>/work-state.json`
254
+
255
+ <!-- forgeloop-doc: schema=work-state artifact=.forgeloop/task-state/<task-key>/work-state.json -->
256
+
257
+ The canonical, authoritative lifecycle work state.
258
+
259
+ #### Canonical Fields
260
+
261
+ <!-- BEGIN FORGELOOP GENERATED: schema:work-state -->
262
+
263
+ - `schemaVersion` *(number, required, const: 1)*
264
+ - `protocolVersion` *(number, required, const: 1)*
265
+ - `taskId` *(string, required, minLength: 1)*
266
+ - `contractFingerprint` *(string, required, pattern: `^[a-f0-9]{64}$`)*
267
+ - `routeFingerprint` *(string, optional, pattern: `^[a-f0-9]{64}$`)*
268
+ - `repositoryFingerprint` *(object, required)*
269
+ - `branch` *(string or null, required)*
270
+ - `head` *(string or null, required)*
271
+ - `phase` *(string, required, enum: `RECEIVED`, `DISCOVERING`, `CONTRACT_READY`, `ROUTED`, `DESIGNING`, `PLANNED`, `EXECUTING`, `VERIFYING`, `DIAGNOSING`, `CORRECTING`, `REVIEWING`, `COMPLETE`, `BLOCKED`)*
272
+ - `selectedGuides` *(array<string>, required)*
273
+ - `requiredGates` *(array<string>, optional)*
274
+ - `satisfiedGates` *(array<string>, optional)*
275
+ - `complianceMode` *(string, optional, enum: `advisory`, `standard`, `strict`)*
276
+ - `completedSteps` *(array<string>, required)*
277
+ - `pendingSteps` *(array<string>, required)*
278
+ - `requiredArtifacts` *(array<object>, optional)*
279
+ - `path` *(string, required, minLength: 1)*
280
+ - `sha256` *(string, required, pattern: `^[a-f0-9]{64}$`)*
281
+ - `checks` *(array<object>, required)*
282
+ - `failures` *(array<object>, required)*
283
+ - `blockers` *(array<object>, required)*
284
+ - `lastUpdated` *(string, required, minLength: 1)*
285
+ - `previousPhase` *(string, optional)*
286
+ - `diagnosedHypothesis` *(string, optional, minLength: 1)*
287
+ - `verificationEvidence` *(array<object>, optional)*
288
+ - `evidenceCoverage` *(array<object>, optional)*
289
+ - `publicationStatus` *(string, optional, enum: `not-published`, `local-only`, `committed`, `pushed`, `published`, `deployed`)*
290
+ - `verificationCycle` *(integer, optional, minimum: 1)*
291
+ - `lastCompletionAttempt` *(object, optional)*
292
+ - `status` *(string, required, const: `REJECTED`)*
293
+ - `reasonCodes` *(array<string>, required)*
294
+ - `missingRequirementIds` *(array<string>, required)*
295
+ - `verificationCycle` *(integer, required, minimum: 1)*
296
+ - `stateFingerprint` *(string, optional, pattern: `^[a-f0-9]{64}$`)*
297
+ - `receiptFingerprint` *(string or null, optional)*
298
+ - `timestamp` *(string, required, minLength: 1)*
299
+
300
+ <!-- END FORGELOOP GENERATED: schema:work-state -->
301
+
302
+ ---
303
+
304
+ ### 2.10 `task-state/<taskKey>/continuity.json`
305
+
306
+ <!-- forgeloop-doc: schema=continuity artifact=.forgeloop/task-state/<task-key>/continuity.json -->
307
+
308
+ Cross-harness non-evidence handoff notes.
309
+
310
+ #### Canonical Fields
311
+
312
+ <!-- BEGIN FORGELOOP GENERATED: schema:continuity -->
313
+
314
+ - `schemaVersion` *(number, required, const: 1)*
315
+ - `protocolVersion` *(number, required, const: 1)*
316
+ - `taskId` *(string, required, minLength: 1, maxLength: 128)*
317
+ - `workStateFingerprint` *(string, required, pattern: `^[a-f0-9]{64}$`)*
318
+ - `contractFingerprint` *(string, required, pattern: `^[a-f0-9]{64}$`)*
319
+ - `phase` *(string, required, minLength: 1)*
320
+ - `verificationCycle` *(integer, optional, minimum: 1)*
321
+ - `repositoryFingerprint` *(object, required)*
322
+ - `branch` *(string or null, required)*
323
+ - `head` *(string or null, required)*
324
+ - `updatedAt` *(string, required, minLength: 1)*
325
+ - `currentFocus` *(workItem, optional)*
326
+ - `id` *(string, required, minLength: 1, maxLength: 128)*
327
+ - `summary` *(string, required, minLength: 1, maxLength: 1000)*
328
+ - `remainingWork` *(array<workItem>, required, maxItems: 40)*
329
+ - `id` *(string, required, minLength: 1, maxLength: 128)*
330
+ - `summary` *(string, required, minLength: 1, maxLength: 1000)*
331
+ - `knownIssues` *(array<workItem>, required, maxItems: 40)*
332
+ - `id` *(string, required, minLength: 1, maxLength: 128)*
333
+ - `summary` *(string, required, minLength: 1, maxLength: 1000)*
334
+ - `changedAreas` *(array<string>, required, maxItems: 80)*
335
+ - `inspectFirst` *(array<string>, required, maxItems: 40)*
336
+ - `resumeNote` *(string, optional, minLength: 1, maxLength: 2000)*
337
+
338
+ <!-- END FORGELOOP GENERATED: schema:continuity -->
339
+
340
+ ---
341
+
342
+ ### 2.11 `task-state/<taskKey>/execution-receipt.json`
343
+
344
+ <!-- forgeloop-doc: schema=execution-receipt artifact=.forgeloop/task-state/<task-key>/execution-receipt.json -->
345
+
346
+ The cryptographically compiled verification receipt required for task completion.
347
+
348
+ #### Canonical Fields
349
+
350
+ <!-- BEGIN FORGELOOP GENERATED: schema:execution-receipt -->
351
+
352
+ - `schemaVersion` *(number, required, const: 1)*
353
+ - `protocolVersion` *(number, required, const: 1)*
354
+ - `taskId` *(string, required, minLength: 1)*
355
+ - `contractFingerprint` *(string, required, pattern: `^[a-f0-9]{64}$`)*
356
+ - `routeFingerprint` *(string, optional, pattern: `^[a-f0-9]{64}$`)*
357
+ - `stateFingerprint` *(string, optional, pattern: `^[a-f0-9]{64}$`)*
358
+ - `verificationCycle` *(integer, optional, minimum: 1)*
359
+ - `status` *(string, optional, enum: `in-progress`, `complete`, `blocked`, `complete-with-concerns`)*
360
+ - `taskStatus` *(string, optional, enum: `in-progress`, `complete`, `blocked`, `incomplete`)*
361
+ - `verificationStatus` *(string, optional, enum: `valid`, `invalid`, `not-verified`, `blocked`)*
362
+ - `publicationStatus` *(string, optional, enum: `not-published`, `local-only`, `committed`, `pushed`, `published`, `deployed`)*
363
+ - `productionReadiness` *(string, optional, enum: `ready`, `not-verified`, `blocked`)*
364
+ - `selectedGuides` *(array<string>, required)*
365
+ - `changedPaths` *(array<string>, required)*
366
+ - `checks` *(array<object>, required)*
367
+ - `evidence` *(array<object>, optional)*
368
+ - `schemaVersion` *(number, optional, const: 1)*
369
+ - `kind` *(string, required, enum: `OBSERVED`, `INFERRED`, `NOT_VERIFIED`, `BLOCKED`)*
370
+ - `source` *(string, required, minLength: 1)*
371
+ - `result` *(string, required, minLength: 1)*
372
+ - `verificationCycle` *(integer, optional, minimum: 1)*
373
+ - `details` *(object, optional)*
374
+ - `evidenceCoverage` *(array<object>, optional)*
375
+ - `review` *(object, required)*
376
+ - `limitations` *(array<string>, required)*
377
+ - `publication` *(object, required)*
378
+ - `committed` *(boolean, required)*
379
+ - `pushed` *(boolean, required)*
380
+ - `pullRequest` *(string or null, required)*
381
+ - `deployed` *(boolean, required)*
382
+
383
+ <!-- END FORGELOOP GENERATED: schema:execution-receipt -->
384
+
385
+ ---
386
+
387
+ ### 2.12 `task-state/<taskKey>/executions/exec-<id>.json`
388
+
389
+ <!-- forgeloop-doc: schema=execution artifact=.forgeloop/task-state/<task-key>/executions/exec-<id>.json -->
390
+
391
+ Attested command execution provenance artifact generated by `forgeloop run-check`.
392
+
393
+ #### Canonical Fields
394
+
395
+ <!-- BEGIN FORGELOOP GENERATED: schema:execution -->
396
+
397
+ - `schemaVersion` *(number, required, const: 1)*
398
+ - `protocolVersion` *(number, required, const: 1)*
399
+ - `executionId` *(string, required, minLength: 1)*
400
+ - `taskId` *(string, required, minLength: 1)*
401
+ - `checkId` *(string, required, minLength: 1)*
402
+ - `requirement` *(string, required, minLength: 1)*
403
+ - `verificationCycle` *(integer, required, minimum: 1)*
404
+ - `kind` *(string, required, const: `COMMAND_EXECUTION`)*
405
+ - `argv` *(array<string>, required, minItems: 1)*
406
+ - `cwd` *(string, required, minLength: 1)*
407
+ - `resolution` *(object, required)*
408
+ - `resolutionMode` *(string, required, minLength: 1)*
409
+ - `mayInstall` *(boolean, required)*
410
+ - `installer` *(string or null, required)*
411
+ - `tool` *(string or null, required)*
412
+ - `dispatch` *(object, optional)*
413
+ - `kind` *(string, optional, minLength: 1)*
414
+ - `scriptName` *(string, optional, minLength: 1)*
415
+ - `startedAt` *(string, required, minLength: 1)*
416
+ - `finishedAt` *(string, required, minLength: 1)*
417
+ - `status` *(string, required, enum: `passed`, `failed`)*
418
+ - `exitCode` *(integer or null, required)*
419
+
420
+ <!-- END FORGELOOP GENERATED: schema:execution -->
421
+
422
+ ---
423
+
424
+ ### 2.13 `task-state/<taskKey>/task.json`
425
+
426
+ <!-- forgeloop-doc: schema=task-descriptor artifact=.forgeloop/task-state/<task-key>/task.json -->
427
+
428
+ Canonical task descriptor declaring task identity, key, timestamps, and write claims.
429
+
430
+ #### Canonical Fields
431
+
432
+ <!-- BEGIN FORGELOOP GENERATED: schema:task-descriptor -->
433
+
434
+ - `schemaVersion` *(integer, required, const: 1)*
435
+ - `protocolVersion` *(integer, required, const: 1)*
436
+ - `taskId` *(string, required, minLength: 1)*
437
+ - `taskKey` *(string, required, pattern: `^[a-f0-9]{64}$`)*
438
+ - `createdAt` *(string, required)*
439
+ - `updatedAt` *(string, required)*
440
+ - `writeClaims` *(array<string>, required)*
441
+
442
+ <!-- END FORGELOOP GENERATED: schema:task-descriptor -->