harness-everything 0.40.0 → 0.41.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 (160) hide show
  1. package/.agents/harness-everything/project-docs.json +9 -0
  2. package/.claude-plugin/marketplace.json +1 -1
  3. package/.claude-plugin/plugin.json +1 -1
  4. package/CHANGELOG.md +43 -0
  5. package/benchmarks/results/f1-doc-path-baseline/1-source-clean.stderr.txt +0 -0
  6. package/benchmarks/results/f1-doc-path-baseline/1-source-clean.stdout.json +20 -0
  7. package/benchmarks/results/f1-doc-path-baseline/2-injected-architecture.md +229 -0
  8. package/benchmarks/results/f1-doc-path-baseline/2-source-injected.stderr.txt +0 -0
  9. package/benchmarks/results/f1-doc-path-baseline/2-source-injected.stdout.json +33 -0
  10. package/benchmarks/results/f1-doc-path-baseline/3-source-reverted.stderr.txt +0 -0
  11. package/benchmarks/results/f1-doc-path-baseline/3-source-reverted.stdout.json +20 -0
  12. package/benchmarks/results/f1-doc-path-baseline/4a-packaged-clean.stderr.txt +0 -0
  13. package/benchmarks/results/f1-doc-path-baseline/4a-packaged-clean.stdout.json +20 -0
  14. package/benchmarks/results/f1-doc-path-baseline/4b-packaged-injected.stderr.txt +0 -0
  15. package/benchmarks/results/f1-doc-path-baseline/4b-packaged-injected.stdout.json +33 -0
  16. package/benchmarks/results/f1-doc-path-baseline/5-source-missing-config.stderr.txt +0 -0
  17. package/benchmarks/results/f1-doc-path-baseline/5-source-missing-config.stdout.json +15 -0
  18. package/benchmarks/results/f1-doc-path-baseline/5b-packaged-missing-config.stderr.txt +0 -0
  19. package/benchmarks/results/f1-doc-path-baseline/5b-packaged-missing-config.stdout.json +15 -0
  20. package/benchmarks/results/f1-doc-path-baseline/README.md +54 -0
  21. package/benchmarks/results/f1-doc-path-baseline/before-fix/1-source-clean.stderr.txt +0 -0
  22. package/benchmarks/results/f1-doc-path-baseline/before-fix/1-source-clean.stdout.json +115 -0
  23. package/benchmarks/results/f1-doc-path-baseline/before-fix/2-injected-document.md +328 -0
  24. package/benchmarks/results/f1-doc-path-baseline/before-fix/2-source-injected.stderr.txt +0 -0
  25. package/benchmarks/results/f1-doc-path-baseline/before-fix/2-source-injected.stdout.json +127 -0
  26. package/benchmarks/results/f1-doc-path-baseline/before-fix/3-source-reverted.stderr.txt +0 -0
  27. package/benchmarks/results/f1-doc-path-baseline/before-fix/3-source-reverted.stdout.json +115 -0
  28. package/benchmarks/results/f1-doc-path-baseline/before-fix/4a-packaged-clean.stderr.txt +0 -0
  29. package/benchmarks/results/f1-doc-path-baseline/before-fix/4a-packaged-clean.stdout.json +115 -0
  30. package/benchmarks/results/f1-doc-path-baseline/before-fix/4b-packaged-injected.stderr.txt +0 -0
  31. package/benchmarks/results/f1-doc-path-baseline/before-fix/4b-packaged-injected.stdout.json +127 -0
  32. package/benchmarks/results/f1-doc-path-baseline/before-fix/5-source-missing-config.stderr.txt +0 -0
  33. package/benchmarks/results/f1-doc-path-baseline/before-fix/5-source-missing-config.stdout.json +15 -0
  34. package/benchmarks/results/f1-doc-path-baseline/before-fix/5b-packaged-missing-config.stderr.txt +0 -0
  35. package/benchmarks/results/f1-doc-path-baseline/before-fix/5b-packaged-missing-config.stdout.json +15 -0
  36. package/benchmarks/results/f1-doc-path-baseline/before-fix/6-supplementary-fixture-ok.input.md +8 -0
  37. package/benchmarks/results/f1-doc-path-baseline/before-fix/6-supplementary-fixture-ok.stdout.json +16 -0
  38. package/benchmarks/results/f1-doc-path-baseline/before-fix/README.md +34 -0
  39. package/benchmarks/results/f1-doc-path-baseline/probe-31-docs/after.json +248 -0
  40. package/benchmarks/results/f1-doc-path-baseline/probe-31-docs/before.json +254 -0
  41. package/benchmarks/results/f1-doc-path-baseline/probe-31-docs/probe.js +26 -0
  42. package/benchmarks/results/f2-doc-craft-baseline/README.md +32 -0
  43. package/benchmarks/results/f2-doc-craft-baseline/arm-f1-report.md +84 -0
  44. package/benchmarks/results/f2-doc-craft-baseline/arm-f1-task.md +21 -0
  45. package/benchmarks/results/f2-doc-craft-baseline/arm-f1.diff +19 -0
  46. package/benchmarks/results/f2-doc-craft-baseline/arm-f2-report.md +110 -0
  47. package/benchmarks/results/f2-doc-craft-baseline/arm-f2-task.md +21 -0
  48. package/benchmarks/results/f2-doc-craft-baseline/arm-f2.diff +19 -0
  49. package/benchmarks/results/f3-derived-views-baseline/README.md +34 -0
  50. package/benchmarks/results/f3-derived-views-baseline/arm-f2-report.md +43 -0
  51. package/benchmarks/results/f3-derived-views-baseline/arm-f2-task.md +21 -0
  52. package/benchmarks/results/f3-derived-views-baseline/arm-f2.diff +21 -0
  53. package/benchmarks/results/f3-derived-views-baseline/arm-f3-report.md +57 -0
  54. package/benchmarks/results/f3-derived-views-baseline/arm-f3-task.md +21 -0
  55. package/benchmarks/results/f3-derived-views-baseline/arm-f3.diff +21 -0
  56. package/benchmarks/results/live-host/claude-325-3b-s2b/README.md +99 -0
  57. package/benchmarks/results/live-host/claude-325-3b-s2b/capture.sanitized.jsonl +26 -0
  58. package/ci/archive/325-prep/README.md +71 -0
  59. package/ci/{prep → archive/325-prep}/doc-reconciliation-red.js +9 -7
  60. package/ci/archive/325-prep/f4-expected-red.json +34 -0
  61. package/ci/archive/325-prep/historical-qualification.test.js +143 -0
  62. package/ci/fixtures/doc-obligations/reconciliation-prep/cases.json +17 -4
  63. package/ci/fixtures/doc-obligations/reconciliation-prep/pending-red.json +8 -56
  64. package/ci/fixtures/doc-obligations/reconciliation-prep/trust-contract.json +2 -2
  65. package/ci/fixtures/doc-obligations/reconciliation-s1/cases.json +17 -5
  66. package/ci/fixtures/doc-obligations/reconciliation-s2b/capture/harness.js +415 -0
  67. package/ci/fixtures/doc-obligations/reconciliation-s2b/capture/off-handoff-golden.json +16 -0
  68. package/ci/fixtures/doc-obligations/reconciliation-s2b/capture/payload-post-tool-use-failure.json +11 -0
  69. package/ci/fixtures/doc-obligations/reconciliation-s2b/capture/payload-post-tool-use-success-minimal.json +9 -0
  70. package/ci/fixtures/doc-obligations/reconciliation-s2b/capture/payload-post-tool-use-success.json +13 -0
  71. package/ci/fixtures/doc-obligations/reconciliation-s2b/capture/payload-subagent-start.json +7 -0
  72. package/ci/fixtures/doc-obligations/reconciliation-s2b/capture/payload-subagent-stop-freetext-reject.json +11 -0
  73. package/ci/fixtures/doc-obligations/reconciliation-s2b/capture/payload-subagent-stop-reject.json +11 -0
  74. package/ci/fixtures/doc-obligations/reconciliation-s2b/capture/payload-subagent-stop.json +11 -0
  75. package/ci/fixtures/doc-obligations/reconciliation-s2b/capture/payload-task-result.json +19 -0
  76. package/ci/fixtures/doc-obligations/reconciliation-s2b/corpus/off-capture-only.json +99 -0
  77. package/ci/fixtures/doc-obligations/reconciliation-s2b/corpus/off-legacy.json +67 -0
  78. package/ci/fixtures/doc-obligations/reconciliation-s2b/corpus/on-concurrent-writers.json +62 -0
  79. package/ci/fixtures/doc-obligations/reconciliation-s2b/corpus/on-lookalikes-runtime-mutations.json +67 -0
  80. package/ci/fixtures/doc-obligations/reconciliation-s2b/corpus/on-malformed.json +85 -0
  81. package/ci/fixtures/doc-obligations/reconciliation-s2b/corpus/on-normal-session.json +74 -0
  82. package/ci/fixtures/doc-obligations/reconciliation-s2b/corpus/on-runtime-drift-later-npm-test.json +58 -0
  83. package/ci/fixtures/doc-obligations/reconciliation-s2b/corpus/on-valid-direct-quoted-review.json +85 -0
  84. package/ci/fixtures/doc-obligations/reconciliation-s2b/f4/cases.json +2267 -0
  85. package/ci/fixtures/doc-obligations/reconciliation-s2b/wiring/cases.json +1110 -0
  86. package/ci/fixtures/doc-obligations/reconciliation-s2b/wiring/legacy-off-golden.json +674 -0
  87. package/ci/lib/doc-reconciliation-file-spy.js +23 -0
  88. package/ci/lib/doc-reconciliation-prep-fixtures.js +136 -10
  89. package/ci/lib/doc-reconciliation-qualification-preload.js +37 -0
  90. package/ci/lib/doc-reconciliation-replay.js +104 -0
  91. package/ci/lib/doc-reconciliation-staged-tree.js +102 -0
  92. package/ci/mechanism-2p-opencode-v2-entrypoint.test.js +179 -0
  93. package/ci/mechanism-325-3b-preparation.test.js +27 -101
  94. package/ci/mechanism-325-3b-s2b-capture.test.js +561 -0
  95. package/ci/mechanism-325-3b-s2b-wiring.test.js +668 -0
  96. package/ci/mechanism-325-f1-doc-check.test.js +674 -0
  97. package/ci/mechanism-325-f2-doc-craft.test.js +597 -0
  98. package/ci/mechanism-325-f3-derived-views.test.js +798 -0
  99. package/ci/mechanism-325-f4-invariants.test.js +606 -0
  100. package/ci/mechanism-325-f4-projections.test.js +382 -0
  101. package/ci/mechanism-325-f4-qualification.test.js +228 -0
  102. package/ci/mechanism-325-f4-trust-boundary.test.js +880 -0
  103. package/ci/mutation-check.js +26 -3
  104. package/docs/architecture.md +5 -0
  105. package/docs/doc-workflow-reconciliation.md +331 -4
  106. package/docs/document-lifecycle.md +11 -0
  107. package/docs/governed-index.md +20 -0
  108. package/docs/platform-capabilities.md +22 -2
  109. package/grill-with-docs/SKILL.md +1 -1
  110. package/grill-with-docs/references/session-playbook.md +4 -0
  111. package/harness-everything/SKILL.md +1 -1
  112. package/harness-everything/references/doc-check.md +186 -0
  113. package/harness-everything/references/documentation/_shared/maintenance.md +41 -0
  114. package/harness-everything/references/documentation/_shared/writing-craft.md +59 -0
  115. package/harness-everything/references/triage-and-tiers.md +4 -0
  116. package/harness-everything/scripts/doc-check.js +442 -0
  117. package/harness-everything/scripts/doc-lifecycle.js +3 -0
  118. package/hooks/hooks.json +46 -0
  119. package/hooks/scripts/lib/doc-reconciliation-capture.sanitized.jsonl +26 -0
  120. package/hooks/scripts/lib/doc-reconciliation-pilot.js +171 -2
  121. package/hooks/scripts/lib/doc-reconciliation-provider.js +1059 -0
  122. package/hooks/scripts/lib/doc-reconciliation-qualification.json +34 -0
  123. package/hooks/scripts/lib/workflow-obligations.js +7 -0
  124. package/hooks/scripts/state-persist.js +78 -2
  125. package/hooks/scripts/workflow-stop-gate.js +7 -2
  126. package/opencode-plugin/README.md +15 -0
  127. package/opencode-plugin/index.mjs +77 -0
  128. package/opencode-plugin/plugin.json +1 -1
  129. package/package.json +1 -1
  130. package/plugins/harness-everything/.codex-plugin/plugin.json +1 -1
  131. package/plugins/harness-everything/hooks/scripts/lib/doc-reconciliation-capture.sanitized.jsonl +26 -0
  132. package/plugins/harness-everything/hooks/scripts/lib/doc-reconciliation-pilot.js +171 -2
  133. package/plugins/harness-everything/hooks/scripts/lib/doc-reconciliation-provider.js +1059 -0
  134. package/plugins/harness-everything/hooks/scripts/lib/doc-reconciliation-qualification.json +34 -0
  135. package/plugins/harness-everything/hooks/scripts/lib/workflow-obligations.js +7 -0
  136. package/plugins/harness-everything/hooks/scripts/state-persist.js +78 -2
  137. package/plugins/harness-everything/hooks/scripts/workflow-stop-gate.js +7 -2
  138. package/plugins/harness-everything/plugin.json +1 -1
  139. package/plugins/harness-everything/skills/grill-with-docs/SKILL.md +1 -1
  140. package/plugins/harness-everything/skills/grill-with-docs/references/session-playbook.md +4 -0
  141. package/plugins/harness-everything/skills/harness-everything/SKILL.md +1 -1
  142. package/plugins/harness-everything/skills/harness-everything/references/doc-check.md +186 -0
  143. package/plugins/harness-everything/skills/harness-everything/references/documentation/_shared/maintenance.md +41 -0
  144. package/plugins/harness-everything/skills/harness-everything/references/documentation/_shared/writing-craft.md +59 -0
  145. package/plugins/harness-everything/skills/harness-everything/references/triage-and-tiers.md +4 -0
  146. package/plugins/harness-everything/skills/harness-everything/scripts/doc-check.js +442 -0
  147. package/plugins/harness-everything/skills/harness-everything/scripts/doc-lifecycle.js +3 -0
  148. package/plugins/harness-everything/skills/repo-docs/SKILL.md +1 -1
  149. package/plugins/harness-everything/skills/repo-docs/references/process-guide.md +4 -0
  150. package/plugins/harness-everything/skills/to-spec/SKILL.md +1 -1
  151. package/plugins/harness-everything/skills/to-spec/references/process.md +4 -0
  152. package/plugins/harness-everything/skills/to-tickets/SKILL.md +1 -1
  153. package/plugins/harness-everything/skills/to-tickets/references/publishing-and-templates.md +4 -0
  154. package/repo-docs/SKILL.md +1 -1
  155. package/repo-docs/references/process-guide.md +4 -0
  156. package/sbom.cdx.json +7 -7
  157. package/to-spec/SKILL.md +1 -1
  158. package/to-spec/references/process.md +4 -0
  159. package/to-tickets/SKILL.md +1 -1
  160. package/to-tickets/references/publishing-and-templates.md +4 -0
@@ -0,0 +1,674 @@
1
+ {
2
+ "source": {
3
+ "workflow": {
4
+ "schemaVersion": 2,
5
+ "workflowId": "<volatile>",
6
+ "createdAt": "<volatile>",
7
+ "createdAtMs": "<volatile>",
8
+ "sessionId": "w-off-legacy-session",
9
+ "promptHash": "5a42f0158e73dbc406b9c4db",
10
+ "tier": "tier3",
11
+ "strategy": "iterative-single",
12
+ "strategySelection": "selected",
13
+ "requiredInvariants": [
14
+ "scope-lock",
15
+ "environment-alignment",
16
+ "verify-before-claim",
17
+ "replan-after-repeated-failure",
18
+ "visible-status-updates",
19
+ "loop-awareness",
20
+ "objective-verification",
21
+ "isolated-worktree-before-mutation"
22
+ ],
23
+ "suggestedSkills": [],
24
+ "verification": {
25
+ "mode": "objective",
26
+ "independent": false
27
+ },
28
+ "mutationIsolation": {
29
+ "required": true,
30
+ "mechanism": "git-worktree",
31
+ "transition": "before-first-mutation",
32
+ "onUnavailable": "degraded"
33
+ },
34
+ "workflowPlan": {
35
+ "schemaVersion": 1,
36
+ "routingStatus": "ok",
37
+ "tier": "tier3",
38
+ "strategy": "iterative-single",
39
+ "strategySelection": "selected",
40
+ "patterns": [
41
+ "router",
42
+ "react"
43
+ ],
44
+ "requiredInvariants": [
45
+ "scope-lock",
46
+ "environment-alignment",
47
+ "verify-before-claim",
48
+ "replan-after-repeated-failure",
49
+ "visible-status-updates",
50
+ "loop-awareness",
51
+ "objective-verification",
52
+ "isolated-worktree-before-mutation"
53
+ ],
54
+ "suggestedSkills": [],
55
+ "knowledgeSignals": [
56
+ "spec",
57
+ "verify"
58
+ ],
59
+ "actionGate": {
60
+ "required": false,
61
+ "reasonCodes": [],
62
+ "approver": null,
63
+ "disposition": null
64
+ },
65
+ "limits": {
66
+ "maxIterations": 8,
67
+ "maxRevisionRounds": 2,
68
+ "maxReplans": 2,
69
+ "maxWorkers": 4
70
+ },
71
+ "parallelism": {
72
+ "allowed": false,
73
+ "requires": [
74
+ "declared-dependsOn",
75
+ "disjoint-writeSet"
76
+ ],
77
+ "reasonCodes": [
78
+ "single-agent-loop"
79
+ ]
80
+ },
81
+ "workspace": {
82
+ "required": false,
83
+ "reasonCodes": [
84
+ "single-agent-loop"
85
+ ]
86
+ },
87
+ "memory": {
88
+ "read": "none",
89
+ "scope": "task-relevant-only",
90
+ "write": "none"
91
+ },
92
+ "verification": {
93
+ "mode": "objective",
94
+ "independent": false
95
+ },
96
+ "ensemble": null,
97
+ "profileSelection": {
98
+ "requested": null,
99
+ "alias": null,
100
+ "policy": "behavior-profile-with-advisory-runtime-floor"
101
+ },
102
+ "fallback": {
103
+ "onMissingSubagents": "visible-inline-or-stop",
104
+ "disposition": "none",
105
+ "mode": "none",
106
+ "reasonCodes": []
107
+ },
108
+ "reasonCodes": [
109
+ "post-decomposition-workflow-selection",
110
+ "explicit-strategy-request"
111
+ ],
112
+ "mutationIsolation": {
113
+ "required": true,
114
+ "mechanism": "git-worktree",
115
+ "transition": "before-first-mutation",
116
+ "onUnavailable": "degraded"
117
+ }
118
+ },
119
+ "taskShape": {
120
+ "schemaVersion": 1,
121
+ "scopeSize": "multi-file",
122
+ "estimatedStages": 2,
123
+ "dependencyGraph": "sequential",
124
+ "writeSetOverlap": "unknown",
125
+ "domainDiversity": "unknown",
126
+ "expectedDuration": "multi-turn",
127
+ "reversibility": "unknown",
128
+ "uncertainty": "unknown",
129
+ "verificationRequirement": "independent",
130
+ "hostCapabilities": {
131
+ "subagents": "unknown",
132
+ "parallelCalls": "unknown",
133
+ "hooks": "unknown",
134
+ "state": "unknown",
135
+ "modelAvailability": "unknown"
136
+ },
137
+ "constraints": {
138
+ "cost": "unspecified",
139
+ "latency": "unspecified",
140
+ "tokens": "unspecified",
141
+ "concurrency": "unspecified"
142
+ },
143
+ "explicitRequest": {
144
+ "fableProfile": null,
145
+ "fableAlias": null,
146
+ "strategy": null,
147
+ "prohibitions": []
148
+ },
149
+ "observedSignals": {
150
+ "macroScope": false,
151
+ "trivialDocsEdit": false,
152
+ "tier3Keyword": true,
153
+ "tier2Keyword": true,
154
+ "multipleTasks": true,
155
+ "multipleSentences": false,
156
+ "specificFile": false,
157
+ "question": false,
158
+ "independentWorkstreams": false,
159
+ "readOnly": false,
160
+ "disjointWrites": false,
161
+ "sharedWrite": false,
162
+ "dependentStages": false,
163
+ "multiSession": false,
164
+ "reusableSpecialists": false,
165
+ "crossDomain": false,
166
+ "highUncertainty": false,
167
+ "irreversibleAction": false,
168
+ "externalSideEffect": false,
169
+ "memoryPersistenceRequested": false
170
+ },
171
+ "reasonCodes": [
172
+ "tier3-keyword"
173
+ ]
174
+ },
175
+ "state": "satisfied",
176
+ "planningWarnings": [],
177
+ "runId": null,
178
+ "revision": "<volatile>",
179
+ "escapes": [],
180
+ "guidance": {
181
+ "mode": "semantic-contract",
182
+ "reasoningPolicy": "model-controls-how",
183
+ "hardBoundaries": [
184
+ "rule-of-3-reflection",
185
+ "user-host-permission"
186
+ ]
187
+ },
188
+ "obligationContract": {
189
+ "schemaVersion": 1,
190
+ "file": "workflow-obligations.json",
191
+ "revision": "<volatile>"
192
+ },
193
+ "resolvedAt": "<volatile>",
194
+ "unresolved": []
195
+ },
196
+ "obligations": {
197
+ "schemaVersion": 1,
198
+ "workflowId": "<volatile>",
199
+ "sessionId": "w-off-legacy-session",
200
+ "tier": "tier3",
201
+ "candidateStrategy": "fable-staged",
202
+ "revision": "<volatile>",
203
+ "phase": "execution",
204
+ "createdAt": "<volatile>",
205
+ "requirements": [
206
+ {
207
+ "id": "req-docs",
208
+ "order": 1,
209
+ "summary": "Update the PRD REQ text",
210
+ "acceptance": "normative PRD text is reviewed",
211
+ "suggestedSkills": [],
212
+ "stepType": "doc-change",
213
+ "status": "pass",
214
+ "evidence": "PRD REQ text updated",
215
+ "reasonCode": null,
216
+ "updatedAt": "<volatile>",
217
+ "requiredBindings": [],
218
+ "optionalBindings": []
219
+ },
220
+ {
221
+ "id": "req-review",
222
+ "order": 2,
223
+ "summary": "Review the PRD change",
224
+ "acceptance": "reviewed scope and findings are recorded",
225
+ "suggestedSkills": [],
226
+ "stepType": "review",
227
+ "status": "pass",
228
+ "evidence": "review scope recorded",
229
+ "reasonCode": null,
230
+ "updatedAt": "<volatile>",
231
+ "requiredBindings": [],
232
+ "optionalBindings": []
233
+ },
234
+ {
235
+ "id": "req-verify",
236
+ "order": 3,
237
+ "summary": "Verify the PRD change",
238
+ "acceptance": "objective doc checks are recorded",
239
+ "suggestedSkills": [],
240
+ "stepType": "verification",
241
+ "status": "pass",
242
+ "evidence": "objective doc checks recorded",
243
+ "reasonCode": null,
244
+ "updatedAt": "<volatile>",
245
+ "requiredBindings": [
246
+ {
247
+ "id": "verification-loop",
248
+ "required": true,
249
+ "status": "loaded",
250
+ "path": "verification-loop/SKILL.md",
251
+ "availability": "available",
252
+ "resolvedPath": "<skill:verification-loop>",
253
+ "evidence": "verification loop skill located",
254
+ "reasonCode": null,
255
+ "updatedAt": "<volatile>"
256
+ }
257
+ ],
258
+ "optionalBindings": []
259
+ }
260
+ ],
261
+ "workflowSelection": {
262
+ "candidateStrategy": "fable-staged",
263
+ "requestedStrategy": "iterative-single",
264
+ "confirmedStrategy": "iterative-single",
265
+ "evidence": "three dependent requirements fit a bounded documentation loop",
266
+ "confirmedAt": "<iso>",
267
+ "disposition": "confirmed",
268
+ "fallback": {
269
+ "onMissingSubagents": "visible-inline-or-stop",
270
+ "disposition": "none",
271
+ "mode": "none",
272
+ "reasonCodes": []
273
+ }
274
+ },
275
+ "obligations": [
276
+ {
277
+ "id": "decompose",
278
+ "kind": "planning",
279
+ "requirement": "Decompose the user intent into explicit requirement fragments with acceptance evidence.",
280
+ "required": true,
281
+ "escapable": false,
282
+ "suggestedSkills": [],
283
+ "status": "pass",
284
+ "evidence": "requirements:req-docs,req-review,req-verify",
285
+ "reasonCode": null,
286
+ "scope": null,
287
+ "updatedAt": "<volatile>"
288
+ },
289
+ {
290
+ "id": "compose",
291
+ "kind": "planning",
292
+ "requirement": "Evaluate the requirement fragments and confirm the smallest sufficient workflow before execution.",
293
+ "required": true,
294
+ "escapable": false,
295
+ "suggestedSkills": [],
296
+ "status": "pass",
297
+ "evidence": "three dependent requirements fit a bounded documentation loop",
298
+ "reasonCode": null,
299
+ "scope": null,
300
+ "updatedAt": "<volatile>"
301
+ },
302
+ {
303
+ "id": "execute",
304
+ "kind": "execution",
305
+ "requirement": "Resolve the planned requirement fragments using adaptive Skill/direct-action bindings.",
306
+ "required": true,
307
+ "escapable": true,
308
+ "suggestedSkills": [],
309
+ "status": "pass",
310
+ "evidence": "typed-execution-steps:req-docs,req-review",
311
+ "reasonCode": null,
312
+ "scope": null,
313
+ "updatedAt": "<volatile>"
314
+ },
315
+ {
316
+ "id": "verify",
317
+ "kind": "verification",
318
+ "requirement": "Produce objective verification evidence appropriate to the completed requirements before claiming completion.",
319
+ "required": true,
320
+ "escapable": false,
321
+ "suggestedSkills": [],
322
+ "status": "pass",
323
+ "evidence": "typed-verification-steps:req-verify",
324
+ "reasonCode": null,
325
+ "scope": null,
326
+ "updatedAt": "<volatile>"
327
+ }
328
+ ],
329
+ "stepBindingsEnabled": true,
330
+ "activeStepId": null,
331
+ "activeStrategy": "iterative-single"
332
+ },
333
+ "stopGeneric": {
334
+ "state": "satisfied",
335
+ "exitCode": 0
336
+ }
337
+ },
338
+ "packaged": {
339
+ "workflow": {
340
+ "schemaVersion": 2,
341
+ "workflowId": "<volatile>",
342
+ "createdAt": "<volatile>",
343
+ "createdAtMs": "<volatile>",
344
+ "sessionId": "w-off-legacy-session",
345
+ "promptHash": "5a42f0158e73dbc406b9c4db",
346
+ "tier": "tier3",
347
+ "strategy": "iterative-single",
348
+ "strategySelection": "selected",
349
+ "requiredInvariants": [
350
+ "scope-lock",
351
+ "environment-alignment",
352
+ "verify-before-claim",
353
+ "replan-after-repeated-failure",
354
+ "visible-status-updates",
355
+ "loop-awareness",
356
+ "objective-verification",
357
+ "isolated-worktree-before-mutation"
358
+ ],
359
+ "suggestedSkills": [],
360
+ "verification": {
361
+ "mode": "objective",
362
+ "independent": false
363
+ },
364
+ "mutationIsolation": {
365
+ "required": true,
366
+ "mechanism": "git-worktree",
367
+ "transition": "before-first-mutation",
368
+ "onUnavailable": "degraded"
369
+ },
370
+ "workflowPlan": {
371
+ "schemaVersion": 1,
372
+ "routingStatus": "ok",
373
+ "tier": "tier3",
374
+ "strategy": "iterative-single",
375
+ "strategySelection": "selected",
376
+ "patterns": [
377
+ "router",
378
+ "react"
379
+ ],
380
+ "requiredInvariants": [
381
+ "scope-lock",
382
+ "environment-alignment",
383
+ "verify-before-claim",
384
+ "replan-after-repeated-failure",
385
+ "visible-status-updates",
386
+ "loop-awareness",
387
+ "objective-verification",
388
+ "isolated-worktree-before-mutation"
389
+ ],
390
+ "suggestedSkills": [],
391
+ "knowledgeSignals": [
392
+ "spec",
393
+ "verify"
394
+ ],
395
+ "actionGate": {
396
+ "required": false,
397
+ "reasonCodes": [],
398
+ "approver": null,
399
+ "disposition": null
400
+ },
401
+ "limits": {
402
+ "maxIterations": 8,
403
+ "maxRevisionRounds": 2,
404
+ "maxReplans": 2,
405
+ "maxWorkers": 4
406
+ },
407
+ "parallelism": {
408
+ "allowed": false,
409
+ "requires": [
410
+ "declared-dependsOn",
411
+ "disjoint-writeSet"
412
+ ],
413
+ "reasonCodes": [
414
+ "single-agent-loop"
415
+ ]
416
+ },
417
+ "workspace": {
418
+ "required": false,
419
+ "reasonCodes": [
420
+ "single-agent-loop"
421
+ ]
422
+ },
423
+ "memory": {
424
+ "read": "none",
425
+ "scope": "task-relevant-only",
426
+ "write": "none"
427
+ },
428
+ "verification": {
429
+ "mode": "objective",
430
+ "independent": false
431
+ },
432
+ "ensemble": null,
433
+ "profileSelection": {
434
+ "requested": null,
435
+ "alias": null,
436
+ "policy": "behavior-profile-with-advisory-runtime-floor"
437
+ },
438
+ "fallback": {
439
+ "onMissingSubagents": "visible-inline-or-stop",
440
+ "disposition": "none",
441
+ "mode": "none",
442
+ "reasonCodes": []
443
+ },
444
+ "reasonCodes": [
445
+ "post-decomposition-workflow-selection",
446
+ "explicit-strategy-request"
447
+ ],
448
+ "mutationIsolation": {
449
+ "required": true,
450
+ "mechanism": "git-worktree",
451
+ "transition": "before-first-mutation",
452
+ "onUnavailable": "degraded"
453
+ }
454
+ },
455
+ "taskShape": {
456
+ "schemaVersion": 1,
457
+ "scopeSize": "multi-file",
458
+ "estimatedStages": 2,
459
+ "dependencyGraph": "sequential",
460
+ "writeSetOverlap": "unknown",
461
+ "domainDiversity": "unknown",
462
+ "expectedDuration": "multi-turn",
463
+ "reversibility": "unknown",
464
+ "uncertainty": "unknown",
465
+ "verificationRequirement": "independent",
466
+ "hostCapabilities": {
467
+ "subagents": "unknown",
468
+ "parallelCalls": "unknown",
469
+ "hooks": "unknown",
470
+ "state": "unknown",
471
+ "modelAvailability": "unknown"
472
+ },
473
+ "constraints": {
474
+ "cost": "unspecified",
475
+ "latency": "unspecified",
476
+ "tokens": "unspecified",
477
+ "concurrency": "unspecified"
478
+ },
479
+ "explicitRequest": {
480
+ "fableProfile": null,
481
+ "fableAlias": null,
482
+ "strategy": null,
483
+ "prohibitions": []
484
+ },
485
+ "observedSignals": {
486
+ "macroScope": false,
487
+ "trivialDocsEdit": false,
488
+ "tier3Keyword": true,
489
+ "tier2Keyword": true,
490
+ "multipleTasks": true,
491
+ "multipleSentences": false,
492
+ "specificFile": false,
493
+ "question": false,
494
+ "independentWorkstreams": false,
495
+ "readOnly": false,
496
+ "disjointWrites": false,
497
+ "sharedWrite": false,
498
+ "dependentStages": false,
499
+ "multiSession": false,
500
+ "reusableSpecialists": false,
501
+ "crossDomain": false,
502
+ "highUncertainty": false,
503
+ "irreversibleAction": false,
504
+ "externalSideEffect": false,
505
+ "memoryPersistenceRequested": false
506
+ },
507
+ "reasonCodes": [
508
+ "tier3-keyword"
509
+ ]
510
+ },
511
+ "state": "satisfied",
512
+ "planningWarnings": [],
513
+ "runId": null,
514
+ "revision": "<volatile>",
515
+ "escapes": [],
516
+ "guidance": {
517
+ "mode": "semantic-contract",
518
+ "reasoningPolicy": "model-controls-how",
519
+ "hardBoundaries": [
520
+ "rule-of-3-reflection",
521
+ "user-host-permission"
522
+ ]
523
+ },
524
+ "obligationContract": {
525
+ "schemaVersion": 1,
526
+ "file": "workflow-obligations.json",
527
+ "revision": "<volatile>"
528
+ },
529
+ "resolvedAt": "<volatile>",
530
+ "unresolved": []
531
+ },
532
+ "obligations": {
533
+ "schemaVersion": 1,
534
+ "workflowId": "<volatile>",
535
+ "sessionId": "w-off-legacy-session",
536
+ "tier": "tier3",
537
+ "candidateStrategy": "fable-staged",
538
+ "revision": "<volatile>",
539
+ "phase": "execution",
540
+ "createdAt": "<volatile>",
541
+ "requirements": [
542
+ {
543
+ "id": "req-docs",
544
+ "order": 1,
545
+ "summary": "Update the PRD REQ text",
546
+ "acceptance": "normative PRD text is reviewed",
547
+ "suggestedSkills": [],
548
+ "stepType": "doc-change",
549
+ "status": "pass",
550
+ "evidence": "PRD REQ text updated",
551
+ "reasonCode": null,
552
+ "updatedAt": "<volatile>",
553
+ "requiredBindings": [],
554
+ "optionalBindings": []
555
+ },
556
+ {
557
+ "id": "req-review",
558
+ "order": 2,
559
+ "summary": "Review the PRD change",
560
+ "acceptance": "reviewed scope and findings are recorded",
561
+ "suggestedSkills": [],
562
+ "stepType": "review",
563
+ "status": "pass",
564
+ "evidence": "review scope recorded",
565
+ "reasonCode": null,
566
+ "updatedAt": "<volatile>",
567
+ "requiredBindings": [],
568
+ "optionalBindings": []
569
+ },
570
+ {
571
+ "id": "req-verify",
572
+ "order": 3,
573
+ "summary": "Verify the PRD change",
574
+ "acceptance": "objective doc checks are recorded",
575
+ "suggestedSkills": [],
576
+ "stepType": "verification",
577
+ "status": "pass",
578
+ "evidence": "objective doc checks recorded",
579
+ "reasonCode": null,
580
+ "updatedAt": "<volatile>",
581
+ "requiredBindings": [
582
+ {
583
+ "id": "verification-loop",
584
+ "required": true,
585
+ "status": "loaded",
586
+ "path": "verification-loop/SKILL.md",
587
+ "availability": "available",
588
+ "resolvedPath": "<skill:verification-loop>",
589
+ "evidence": "verification loop skill located",
590
+ "reasonCode": null,
591
+ "updatedAt": "<volatile>"
592
+ }
593
+ ],
594
+ "optionalBindings": []
595
+ }
596
+ ],
597
+ "workflowSelection": {
598
+ "candidateStrategy": "fable-staged",
599
+ "requestedStrategy": "iterative-single",
600
+ "confirmedStrategy": "iterative-single",
601
+ "evidence": "three dependent requirements fit a bounded documentation loop",
602
+ "confirmedAt": "<iso>",
603
+ "disposition": "confirmed",
604
+ "fallback": {
605
+ "onMissingSubagents": "visible-inline-or-stop",
606
+ "disposition": "none",
607
+ "mode": "none",
608
+ "reasonCodes": []
609
+ }
610
+ },
611
+ "obligations": [
612
+ {
613
+ "id": "decompose",
614
+ "kind": "planning",
615
+ "requirement": "Decompose the user intent into explicit requirement fragments with acceptance evidence.",
616
+ "required": true,
617
+ "escapable": false,
618
+ "suggestedSkills": [],
619
+ "status": "pass",
620
+ "evidence": "requirements:req-docs,req-review,req-verify",
621
+ "reasonCode": null,
622
+ "scope": null,
623
+ "updatedAt": "<volatile>"
624
+ },
625
+ {
626
+ "id": "compose",
627
+ "kind": "planning",
628
+ "requirement": "Evaluate the requirement fragments and confirm the smallest sufficient workflow before execution.",
629
+ "required": true,
630
+ "escapable": false,
631
+ "suggestedSkills": [],
632
+ "status": "pass",
633
+ "evidence": "three dependent requirements fit a bounded documentation loop",
634
+ "reasonCode": null,
635
+ "scope": null,
636
+ "updatedAt": "<volatile>"
637
+ },
638
+ {
639
+ "id": "execute",
640
+ "kind": "execution",
641
+ "requirement": "Resolve the planned requirement fragments using adaptive Skill/direct-action bindings.",
642
+ "required": true,
643
+ "escapable": true,
644
+ "suggestedSkills": [],
645
+ "status": "pass",
646
+ "evidence": "typed-execution-steps:req-docs,req-review",
647
+ "reasonCode": null,
648
+ "scope": null,
649
+ "updatedAt": "<volatile>"
650
+ },
651
+ {
652
+ "id": "verify",
653
+ "kind": "verification",
654
+ "requirement": "Produce objective verification evidence appropriate to the completed requirements before claiming completion.",
655
+ "required": true,
656
+ "escapable": false,
657
+ "suggestedSkills": [],
658
+ "status": "pass",
659
+ "evidence": "typed-verification-steps:req-verify",
660
+ "reasonCode": null,
661
+ "scope": null,
662
+ "updatedAt": "<volatile>"
663
+ }
664
+ ],
665
+ "stepBindingsEnabled": true,
666
+ "activeStepId": null,
667
+ "activeStrategy": "iterative-single"
668
+ },
669
+ "stopGeneric": {
670
+ "state": "satisfied",
671
+ "exitCode": 0
672
+ }
673
+ }
674
+ }
@@ -0,0 +1,23 @@
1
+ 'use strict';
2
+
3
+ // #325 F4-T2 test-only file-access spy. Loaded with `node --require` before the CI preloader. It appends each access to
4
+ // the qualification export to the file named by F4_SPY_LOG, and it changes no result. Production never loads it, and
5
+ // no environment or argv switch in the runtime reads it.
6
+
7
+ const fs = require('fs');
8
+
9
+ const EXPORT_PATH = /doc-reconciliation-qualification\.json$/;
10
+ const logFile = process.env.F4_SPY_LOG;
11
+ const appendLog = fs.appendFileSync;
12
+
13
+ function note(operation, target) {
14
+ if (logFile && EXPORT_PATH.test(String(target))) appendLog(logFile, `${operation} ${target}\n`);
15
+ }
16
+
17
+ for (const operation of ['readFileSync', 'openSync', 'existsSync', 'statSync', 'lstatSync']) {
18
+ const real = fs[operation];
19
+ fs[operation] = function spied(target, ...rest) {
20
+ note(operation, target);
21
+ return real.call(this, target, ...rest);
22
+ };
23
+ }