@smartmemory/compose 0.3.6-beta → 0.3.8

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 (269) hide show
  1. package/.claude/skills/compose/SKILL.md +42 -88
  2. package/.compose-deps.json +1 -13
  3. package/README.md +72 -5
  4. package/bin/compose.js +754 -347
  5. package/bin/git-hooks/pre-push.template +29 -0
  6. package/bin/judgment-import.js +7 -0
  7. package/bin/judgment-migrate.js +387 -0
  8. package/contracts/comp-obs-contract.schema.json +9 -3
  9. package/contracts/feature-json.schema.json +5 -0
  10. package/contracts/fluid-record.schema.json +209 -0
  11. package/contracts/judgment-record.schema.json +425 -4
  12. package/contracts/lifecycle-backfill.schema.json +322 -0
  13. package/dist/assets/App-Z4MU-H_F.js +916 -0
  14. package/dist/assets/_baseUniq-ClWoCPFl.js +1 -0
  15. package/dist/assets/arc-DY26UIVo.js +1 -0
  16. package/dist/assets/architectureDiagram-Q4EWVU46-6Ggq4DqJ.js +36 -0
  17. package/dist/assets/blockDiagram-DXYQGD6D-CH3Ked0l.js +132 -0
  18. package/dist/assets/{browser-BSM23If2.js → browser-BWkrenen.js} +6 -6
  19. package/dist/assets/{c4Diagram-LMCZKHZV-DZf45Fbz.js → c4Diagram-AHTNJAMY-Bk8dYilu.js} +1 -1
  20. package/dist/assets/channel-SnZzzh7k.js +1 -0
  21. package/dist/assets/{chunk-JWPE2WC7-_7ujgd_Q.js → chunk-4BX2VUAB-BMR0XaAQ.js} +1 -1
  22. package/dist/assets/chunk-4TB4RGXK-JytR14a9.js +206 -0
  23. package/dist/assets/{chunk-XXDRQBXY-DfdVhbmA.js → chunk-55IACEB6-B4Q97BCP.js} +1 -1
  24. package/dist/assets/{chunk-VR4S4FIN-Dt9NZ67m.js → chunk-EDXVE4YY-R_qarkSf.js} +1 -1
  25. package/dist/assets/{chunk-5VM5RSS4-BY4_PV5H.js → chunk-FMBD7UC4-C9s7KR9m.js} +1 -1
  26. package/dist/assets/chunk-OYMX7WX6-BySQzVxc.js +231 -0
  27. package/dist/assets/{chunk-2Q5K7J3B-Dn1spZYu.js → chunk-QZHKN3VN-DdpSYZsW.js} +1 -1
  28. package/dist/assets/{chunk-32BRIVSS-pURGrJDk.js → chunk-YZCP3GAM-iE_tzriw.js} +1 -1
  29. package/dist/assets/classDiagram-6PBFFD2Q-CBu92dSH.js +1 -0
  30. package/dist/assets/classDiagram-v2-HSJHXN6E-CBu92dSH.js +1 -0
  31. package/dist/assets/clone-DgklGjHm.js +1 -0
  32. package/dist/assets/{cose-bilkent-JH36ORCC-BieYif4o.js → cose-bilkent-S5V4N54A-BdlU6ZX_.js} +1 -1
  33. package/dist/assets/dagre-KV5264BT-Cp3F5KTn.js +4 -0
  34. package/dist/assets/diagram-5BDNPKRD-DiR6_2q_.js +10 -0
  35. package/dist/assets/diagram-G4DWMVQ6-w0i-p5HX.js +24 -0
  36. package/dist/assets/diagram-MMDJMWI5-tIHhwUv3.js +43 -0
  37. package/dist/assets/diagram-TYMM5635-BAeY3B19.js +24 -0
  38. package/dist/assets/erDiagram-SMLLAGMA-Ckx_Knko.js +85 -0
  39. package/dist/assets/flowDiagram-DWJPFMVM-DeoNka6J.js +162 -0
  40. package/dist/assets/ganttDiagram-T4ZO3ILL-BmGnFbEg.js +292 -0
  41. package/dist/assets/gitGraphDiagram-UUTBAWPF-Dk48IHsx.js +106 -0
  42. package/dist/assets/graph-BNzKGvoy.js +1 -0
  43. package/dist/assets/graph-CI_1htl0.js +331 -0
  44. package/dist/assets/index-BEfrNBp8.js +123 -0
  45. package/dist/assets/index-yyrA5OZd.css +1 -0
  46. package/dist/assets/infoDiagram-42DDH7IO-BRf827i0.js +2 -0
  47. package/dist/assets/{ishikawaDiagram-FXEZZL3T-CzEB9fQS.js → ishikawaDiagram-UXIWVN3A-0kCZaeCM.js} +5 -5
  48. package/dist/assets/{journeyDiagram-5HDEW3XC-Bz8TCdz2.js → journeyDiagram-VCZTEJTY-rvU7ayRt.js} +1 -1
  49. package/dist/assets/{kanban-definition-HUTT4EX6-tozrMoV_.js → kanban-definition-6JOO6SKY-DpQwX1C5.js} +7 -7
  50. package/dist/assets/katex-DkKDou_j.js +257 -0
  51. package/dist/assets/layout-BI8cXFPI.js +1 -0
  52. package/dist/assets/{linear-Ck7gpa5N.js → linear-a0glcDiw.js} +1 -1
  53. package/dist/assets/min-vPHfnXcC.js +1 -0
  54. package/dist/assets/{mindmap-definition-LN4V7U3C-DTcHO0DJ.js → mindmap-definition-QFDTVHPH-D14eF-7C.js} +7 -7
  55. package/dist/assets/mobile-B7m9EO9D.js +17 -0
  56. package/dist/assets/pieDiagram-DEJITSTG-Cno-gETh.js +30 -0
  57. package/dist/assets/quadrantDiagram-34T5L4WZ-BUQM1Hfm.js +7 -0
  58. package/dist/assets/{requirementDiagram-TGXJPOKE-bnI2zJeT.js → requirementDiagram-MS252O5E-pOXlN2-q.js} +3 -3
  59. package/dist/assets/sankeyDiagram-XADWPNL6-Crynd3_b.js +10 -0
  60. package/dist/assets/sequenceDiagram-FGHM5R23-D9fZdCM8.js +157 -0
  61. package/dist/assets/stateDiagram-FHFEXIEX-CW9qVec8.js +1 -0
  62. package/dist/assets/stateDiagram-v2-QKLJ7IA2-DkVLzHbY.js +1 -0
  63. package/dist/assets/{timeline-definition-FHXFAJF6-D267GQFF.js → timeline-definition-GMOUNBTQ-BcHzhm_8.js} +3 -3
  64. package/dist/assets/vennDiagram-DHZGUBPP-BfytJcWk.js +34 -0
  65. package/dist/assets/wardley-RL74JXVD-DLj-IjyB.js +162 -0
  66. package/dist/assets/wardleyDiagram-NUSXRM2D-Ds0Ue68c.js +20 -0
  67. package/dist/assets/xychartDiagram-5P7HB3ND-vjWDXFL6.js +7 -0
  68. package/dist/index.html +3 -3
  69. package/lib/agent-string.js +7 -5
  70. package/lib/append-integrity.js +81 -0
  71. package/lib/backfill-evidence.js +109 -0
  72. package/lib/bug-escalation.js +39 -4
  73. package/lib/build-stream-schema.js +3 -1
  74. package/lib/build-stream-writer.js +25 -0
  75. package/lib/build.js +1624 -195
  76. package/lib/canon-guard.js +245 -0
  77. package/lib/canon-override.js +196 -0
  78. package/lib/canon-registry.js +291 -0
  79. package/lib/cli-commands.js +144 -0
  80. package/lib/codex-preflight.js +50 -15
  81. package/lib/colleague/context.js +215 -0
  82. package/lib/colleague/writeback.js +95 -0
  83. package/lib/completion-gate.js +1421 -0
  84. package/lib/completion-writer.js +47 -47
  85. package/lib/consumer-fanout.js +105 -11
  86. package/lib/coverage-gate.js +200 -0
  87. package/lib/dir-lock.js +170 -0
  88. package/lib/dispatch-ledger.js +301 -0
  89. package/lib/dispatch-metrics.js +236 -0
  90. package/lib/experiment-judge.js +6 -1
  91. package/lib/feature-json.js +1 -1
  92. package/lib/feature-reconciler.js +8 -0
  93. package/lib/feature-validator.js +64 -1
  94. package/lib/feature-writer.js +66 -2
  95. package/lib/fluid/factory.js +167 -0
  96. package/lib/fluid/ideabox-dates.js +73 -0
  97. package/lib/fluid/ideabox-migrate.js +154 -0
  98. package/lib/fluid/ideabox-ops.js +585 -0
  99. package/lib/fluid/ideabox-view.js +146 -0
  100. package/lib/fluid/import-ideabox.js +186 -0
  101. package/lib/fluid/local-provider.js +606 -0
  102. package/lib/fluid/provider.js +684 -0
  103. package/lib/fluid/record-shape.js +214 -0
  104. package/lib/fluid/record-store.js +328 -0
  105. package/lib/fluid/render-ideabox.js +261 -0
  106. package/lib/fluid/schema.js +40 -0
  107. package/lib/fluid/smartmemory-provider.js +1695 -0
  108. package/lib/gsd.js +63 -14
  109. package/lib/guard-cli.js +175 -0
  110. package/lib/guard-custody.js +141 -0
  111. package/lib/guard-descriptors.js +530 -0
  112. package/lib/guard-enrol.js +254 -0
  113. package/lib/health-score.js +1 -1
  114. package/lib/hooks-status.js +32 -3
  115. package/lib/ideabox-cli.js +315 -0
  116. package/lib/ideabox.js +121 -21
  117. package/lib/judgment/store/index.js +166 -0
  118. package/lib/judgment/store/records.js +184 -25
  119. package/lib/judgment/trace.js +380 -0
  120. package/lib/judgment-attest.js +259 -0
  121. package/lib/judgment-decision-write.js +277 -0
  122. package/lib/judgment-decisions.js +466 -0
  123. package/lib/judgment-gen.js +375 -22
  124. package/lib/judgment-verify.js +153 -0
  125. package/lib/judgment-writer.js +2842 -262
  126. package/lib/lane-gate.js +2 -0
  127. package/lib/lifecycle-modes.js +4 -4
  128. package/lib/lineage.js +400 -0
  129. package/lib/local-claude-connector.js +250 -54
  130. package/lib/maya-client.js +302 -0
  131. package/lib/maya-config.js +53 -0
  132. package/lib/maya-identity.js +283 -0
  133. package/lib/mcp-enforcement.js +21 -35
  134. package/lib/migrate-anon.js +5 -0
  135. package/lib/migrate-roadmap.js +15 -0
  136. package/lib/new.js +13 -1
  137. package/lib/pipeline-compat.js +104 -0
  138. package/lib/policy-catalog.js +295 -0
  139. package/lib/policy-check.js +0 -0
  140. package/lib/process-termination.js +98 -0
  141. package/lib/resolve-workspace.js +5 -1
  142. package/lib/result-normalizer.js +428 -153
  143. package/lib/review-normalize.js +4 -0
  144. package/lib/roadmap-errors.js +65 -0
  145. package/lib/roadmap-preservers.js +24 -4
  146. package/lib/roadmap-residue.js +299 -0
  147. package/lib/smartmemory-client.js +614 -78
  148. package/lib/smartmemory-config.js +54 -0
  149. package/lib/smartmemory-ingest.js +19 -2
  150. package/lib/step-prompt.js +7 -6
  151. package/lib/stratum-engine.js +53 -4
  152. package/lib/stratum-mcp-client.js +391 -31
  153. package/lib/test-bootstrap.js +31 -0
  154. package/lib/tool-inventory.js +122 -0
  155. package/lib/version-check.js +91 -19
  156. package/lib/vision-writer.js +88 -1
  157. package/package.json +7 -6
  158. package/pipelines/bug-fix.stratum.yaml +205 -211
  159. package/pipelines/build-quick.profiles.json +12 -0
  160. package/pipelines/build-quick.stratum.yaml +263 -350
  161. package/pipelines/content.stratum.yaml +81 -77
  162. package/pipelines/coverage-sweep.stratum.yaml +49 -30
  163. package/pipelines/plan.stratum.yaml +76 -86
  164. package/pipelines/refactor.stratum.yaml +125 -125
  165. package/pipelines/research.stratum.yaml +56 -58
  166. package/pipelines/review-fix.profiles.json +6 -0
  167. package/pipelines/review-fix.stratum.yaml +110 -83
  168. package/presets/team-feature.profiles.json +6 -0
  169. package/presets/team-feature.stratum.yaml +93 -66
  170. package/presets/team-research.profiles.json +6 -0
  171. package/presets/team-research.stratum.yaml +89 -80
  172. package/presets/team-review.profiles.json +8 -0
  173. package/presets/team-review.stratum.yaml +98 -80
  174. package/scripts/cost-census.mjs +70 -0
  175. package/scripts/guard-sign/compose-guard-sign.sh +62 -0
  176. package/server/agent-health.js +22 -0
  177. package/server/agent-hooks.js +14 -1
  178. package/server/agent-server.js +5 -248
  179. package/server/agent-spawn.js +3 -4
  180. package/server/agent-workspace.js +294 -0
  181. package/server/build-routes.js +6 -5
  182. package/server/build-stream-bridge.js +53 -0
  183. package/server/cc-session-watcher.js +4 -1
  184. package/server/coalescing-buffer.js +7 -1
  185. package/server/completion-projection.js +228 -0
  186. package/server/compose-mcp-tools.js +124 -24
  187. package/server/compose-mcp.js +91 -790
  188. package/server/decision-event-emit.js +41 -2
  189. package/server/decision-event-id.js +17 -0
  190. package/server/decision-events-snapshot.js +3 -0
  191. package/server/design-routes.js +14 -8
  192. package/server/feature-scan.js +76 -2
  193. package/server/file-watcher.js +170 -21
  194. package/server/ideabox-routes.js +166 -224
  195. package/server/index.js +70 -100
  196. package/server/lifecycle-guard.js +240 -10
  197. package/server/lifecycle-phase-history.js +276 -0
  198. package/server/maya-routes.js +507 -0
  199. package/server/mcp-tool-defs.js +940 -0
  200. package/server/mcp-tool-policy.js +35 -3
  201. package/server/model-tiers.js +22 -5
  202. package/server/pipeline-routes.js +21 -11
  203. package/server/project-root.js +58 -19
  204. package/server/remote-utils.js +3 -1
  205. package/server/schema-validator.js +7 -1
  206. package/server/session-manager.js +5 -6
  207. package/server/session-routes.js +3 -1
  208. package/server/stratum-client.js +57 -10
  209. package/server/stratum-sync.js +6 -3
  210. package/server/summarizer.js +3 -4
  211. package/server/supervisor.js +0 -1
  212. package/server/vision-routes.js +208 -98
  213. package/server/vision-server.js +86 -23
  214. package/server/vision-store.js +60 -6
  215. package/server/vision-utils.js +3 -4
  216. package/server/workspace-activity.js +18 -0
  217. package/server/workspace-middleware.js +2 -2
  218. package/server/workspace-runtime.js +243 -0
  219. package/server/worktree-gc.js +1 -0
  220. package/dist/assets/App-BG3ngu8H.js +0 -896
  221. package/dist/assets/abnfDiagram-VRR7QNED-CjB_sD3D.js +0 -1
  222. package/dist/assets/arc-_v4hR_uD.js +0 -1
  223. package/dist/assets/architectureDiagram-ZJ3FMSHR-DreJmzXQ.js +0 -36
  224. package/dist/assets/blockDiagram-677ZJIJ3-BG9-c0O1.js +0 -132
  225. package/dist/assets/channel-B3U5wFAT.js +0 -1
  226. package/dist/assets/chunk-EX3LRPZG-DdELs1qP.js +0 -231
  227. package/dist/assets/chunk-MOJQB5TN-D-ky35G-.js +0 -88
  228. package/dist/assets/chunk-RYQCIY6F-Dag_kVlO.js +0 -1
  229. package/dist/assets/chunk-V7JOEXUC-BtewURat.js +0 -206
  230. package/dist/assets/classDiagram-OUVF2IWQ-B6fCN-ht.js +0 -1
  231. package/dist/assets/classDiagram-v2-EOCWNBFH-B6fCN-ht.js +0 -1
  232. package/dist/assets/cynefin-VYW2F7L2-CT2BA6KE.js +0 -178
  233. package/dist/assets/cynefinDiagram-TSTJHNR4-Bh6exbyg.js +0 -62
  234. package/dist/assets/dagre-VKFMJZFB-aXMLSmQL.js +0 -4
  235. package/dist/assets/diagram-FQU43EPY-Dr7JAOuQ.js +0 -3
  236. package/dist/assets/diagram-G47NLZAW-DUvA3FQK.js +0 -24
  237. package/dist/assets/diagram-NH7WQ7WH-BQUARqcu.js +0 -24
  238. package/dist/assets/diagram-OA4YK3LP-dDUc1zHi.js +0 -30
  239. package/dist/assets/diagram-WEI45ONY-B2h5Qlb1.js +0 -41
  240. package/dist/assets/ebnfDiagram-CCIWWBDH-DThRGupB.js +0 -1
  241. package/dist/assets/erDiagram-Q63AITRT-BUCsprO2.js +0 -85
  242. package/dist/assets/flowDiagram-23GEKE2U-DXtNNi6r.js +0 -156
  243. package/dist/assets/ganttDiagram-NO4QXBWP-D4zbBHh_.js +0 -292
  244. package/dist/assets/gitGraphDiagram-IHSO6WYX-DpoQws0W.js +0 -106
  245. package/dist/assets/graph-BXPQrYYB.js +0 -331
  246. package/dist/assets/graph-C9eacEi8.js +0 -1
  247. package/dist/assets/index-3ZH5eMcZ.js +0 -119
  248. package/dist/assets/index-LIwREYgH.css +0 -1
  249. package/dist/assets/infoDiagram-FWYZ7A6U-Bbas2GAo.js +0 -2
  250. package/dist/assets/katex-C5jXJg4s.js +0 -257
  251. package/dist/assets/layout-DEXfKzaS.js +0 -1
  252. package/dist/assets/map-Czzmt4hB.js +0 -1
  253. package/dist/assets/mobile-CaoXUwAr.js +0 -17
  254. package/dist/assets/pegDiagram-2B236MQR-CHiINrNy.js +0 -1
  255. package/dist/assets/pieDiagram-ENE6RG2P-CfS4YFlR.js +0 -39
  256. package/dist/assets/quadrantDiagram-ABIIQ3AL-CadesS9w.js +0 -7
  257. package/dist/assets/railroadDiagram-RFXS5EU6-CgWEspBN.js +0 -1
  258. package/dist/assets/sankeyDiagram-HTMAVEWB-YWKFgOGw.js +0 -40
  259. package/dist/assets/sequenceDiagram-DBY2YBRQ-BvkNOyF9.js +0 -162
  260. package/dist/assets/sizeCapture-X5ZJPWSS-DlFPA2yO.js +0 -1
  261. package/dist/assets/stateDiagram-2N3HPSRC-h8NIx0kQ.js +0 -1
  262. package/dist/assets/stateDiagram-v2-6OUMAXLB-DjPgZtJ9.js +0 -1
  263. package/dist/assets/swimlanes-5IMT3BWC-CT5n22kG.js +0 -2
  264. package/dist/assets/swimlanesDiagram-G3AALYLV-Dn318Bhq.js +0 -8
  265. package/dist/assets/vennDiagram-L72KCM5P-Dj-wWLYG.js +0 -34
  266. package/dist/assets/wardleyDiagram-EHGQE667-BxCeYxkG.js +0 -78
  267. package/dist/assets/xychartDiagram-FW5EYKEG-DMFqWn7z.js +0 -7
  268. package/lib/staleness.js +0 -87
  269. package/server/ideabox-cache.js +0 -77
@@ -21,16 +21,149 @@
21
21
  "pattern": "^[a-z0-9][a-z0-9-]*#r[1-9][0-9]*$"
22
22
  },
23
23
 
24
+ "entry_id": {
25
+ "type": "string",
26
+ "description": "Writer-allocated stable sub-entry id.",
27
+ "pattern": "^(?:f|e|of|o|l|c|gj|gl)[1-9][0-9]*$"
28
+ },
29
+
30
+ "fact_id": {
31
+ "type": "string",
32
+ "pattern": "^f[1-9][0-9]*$"
33
+ },
34
+
35
+ "edge_id": {
36
+ "type": "string",
37
+ "pattern": "^e[1-9][0-9]*$"
38
+ },
39
+
40
+ "open_field_id": {
41
+ "type": "string",
42
+ "pattern": "^of[1-9][0-9]*$"
43
+ },
44
+
45
+ "owed_id": {
46
+ "type": "string",
47
+ "pattern": "^o[1-9][0-9]*$"
48
+ },
49
+
50
+ "load_link_id": {
51
+ "type": "string",
52
+ "pattern": "^l[1-9][0-9]*$"
53
+ },
54
+
55
+ "clause_id": {
56
+ "type": "string",
57
+ "pattern": "^c[1-9][0-9]*$"
58
+ },
59
+
60
+ "goal_joint_id": {
61
+ "type": "string",
62
+ "pattern": "^gj[1-9][0-9]*$"
63
+ },
64
+
65
+ "goal_load_link_id": {
66
+ "type": "string",
67
+ "pattern": "^gl[1-9][0-9]*$"
68
+ },
69
+
70
+ "goal_clause_ref": {
71
+ "type": "string",
72
+ "description": "Strict address of a clause in a goal version.",
73
+ "pattern": "^goal:v[1-9][0-9]*#c[1-9][0-9]*$"
74
+ },
75
+
24
76
  "provenance": {
25
77
  "type": "object",
26
- "description": "Writer-stamped, never caller-set. actor is a v1 constant (oq1-agent-only-v1); session is best-effort diagnostic garnish and nothing may depend on it; via: 'import' marks historical transcription.",
78
+ "description": "Writer-stamped, never caller-set. actor is a v1 constant (oq1-agent-only-v1); session is best-effort diagnostic garnish and nothing may depend on it; via marks sanctioned historical transcription or migration.",
27
79
  "required": ["actor", "written_at"],
28
80
  "additionalProperties": false,
29
81
  "properties": {
30
82
  "actor": { "const": "agent" },
31
83
  "session": { "type": ["string", "null"] },
32
84
  "written_at": { "type": "string", "format": "date-time" },
33
- "via": { "enum": ["import"] }
85
+ "via": { "enum": ["import", "migration"] },
86
+ "intent_id": { "type": "string", "minLength": 1 }
87
+ }
88
+ },
89
+
90
+ "fact_text": {
91
+ "type": "string",
92
+ "minLength": 1
93
+ },
94
+
95
+ "fact_channel": {
96
+ "enum": ["said", "observed", "secondhand", "inferred"]
97
+ },
98
+
99
+ "fact_at": {
100
+ "type": "string",
101
+ "format": "date"
102
+ },
103
+
104
+ "fact_via": {
105
+ "type": "string",
106
+ "minLength": 1
107
+ },
108
+
109
+ "person_section": {
110
+ "enum": ["role", "life", "stated", "revealed"]
111
+ },
112
+
113
+ "correction_trace_list": {
114
+ "type": "array",
115
+ "items": { "$ref": "#/definitions/correction_trace" }
116
+ },
117
+
118
+ "correction_trace": {
119
+ "type": "object",
120
+ "description": "Writer-produced prior values for one correction, fill, give, or reopen transition.",
121
+ "required": ["prior", "corrected_at", "provenance"],
122
+ "additionalProperties": false,
123
+ "properties": {
124
+ "prior": {
125
+ "type": "object",
126
+ "minProperties": 1,
127
+ "additionalProperties": { "type": ["string", "number", "boolean", "null"] }
128
+ },
129
+ "corrected_at": { "type": "string", "format": "date-time" },
130
+ "provenance": { "$ref": "#/definitions/provenance" }
131
+ }
132
+ },
133
+
134
+ "removed_block": {
135
+ "type": "object",
136
+ "description": "Writer-stamped retirement marker; the containing stable entry remains in place.",
137
+ "required": ["at", "reason", "provenance"],
138
+ "additionalProperties": false,
139
+ "properties": {
140
+ "at": { "type": "string", "format": "date-time" },
141
+ "reason": { "type": "string", "minLength": 1 },
142
+ "provenance": { "$ref": "#/definitions/provenance" }
143
+ }
144
+ },
145
+
146
+ "ratification": {
147
+ "type": "object",
148
+ "description": "Owner attestation citation: the elicitation triplet plus the owner's quoted answer.",
149
+ "required": ["asked", "answered_at", "answer_ref", "quote"],
150
+ "additionalProperties": false,
151
+ "properties": {
152
+ "asked": { "type": "string", "minLength": 1 },
153
+ "answered_at": { "type": "string", "format": "date-time" },
154
+ "answer_ref": { "type": "string", "minLength": 1 },
155
+ "quote": { "type": "string", "minLength": 1 }
156
+ }
157
+ },
158
+
159
+ "provocation": {
160
+ "type": "object",
161
+ "description": "Owner words that provoked a goal cut and when they were recorded.",
162
+ "required": ["quote", "at"],
163
+ "additionalProperties": false,
164
+ "properties": {
165
+ "quote": { "type": "string", "minLength": 1 },
166
+ "at": { "type": "string", "format": "date-time" }
34
167
  }
35
168
  },
36
169
 
@@ -46,6 +179,274 @@
46
179
  }
47
180
  },
48
181
 
182
+ "person_fact": {
183
+ "type": "object",
184
+ "required": ["id", "section", "text", "channel", "at", "provenance", "trace"],
185
+ "additionalProperties": false,
186
+ "properties": {
187
+ "id": { "$ref": "#/definitions/fact_id" },
188
+ "section": { "$ref": "#/definitions/person_section" },
189
+ "text": { "$ref": "#/definitions/fact_text" },
190
+ "channel": { "$ref": "#/definitions/fact_channel" },
191
+ "via": { "$ref": "#/definitions/fact_via" },
192
+ "at": { "$ref": "#/definitions/fact_at" },
193
+ "diverges_with": { "$ref": "#/definitions/fact_id" },
194
+ "provenance": { "$ref": "#/definitions/provenance" },
195
+ "trace": { "$ref": "#/definitions/correction_trace_list" }
196
+ },
197
+ "if": {
198
+ "properties": { "channel": { "const": "secondhand" } },
199
+ "required": ["channel"]
200
+ },
201
+ "then": { "required": ["via"] },
202
+ "else": { "not": { "required": ["via"] } }
203
+ },
204
+
205
+ "situation_fact": {
206
+ "type": "object",
207
+ "required": ["id", "text", "channel", "at", "provenance", "trace"],
208
+ "additionalProperties": false,
209
+ "properties": {
210
+ "id": { "$ref": "#/definitions/fact_id" },
211
+ "text": { "$ref": "#/definitions/fact_text" },
212
+ "channel": { "$ref": "#/definitions/fact_channel" },
213
+ "via": { "$ref": "#/definitions/fact_via" },
214
+ "at": { "$ref": "#/definitions/fact_at" },
215
+ "provenance": { "$ref": "#/definitions/provenance" },
216
+ "trace": { "$ref": "#/definitions/correction_trace_list" }
217
+ },
218
+ "if": {
219
+ "properties": { "channel": { "const": "secondhand" } },
220
+ "required": ["channel"]
221
+ },
222
+ "then": { "required": ["via"] },
223
+ "else": { "not": { "required": ["via"] } }
224
+ },
225
+
226
+ "person_edge": {
227
+ "type": "object",
228
+ "required": ["id", "to", "kind", "provenance", "removed"],
229
+ "additionalProperties": false,
230
+ "properties": {
231
+ "id": { "$ref": "#/definitions/edge_id" },
232
+ "to": { "$ref": "#/definitions/slug" },
233
+ "kind": { "type": "string", "minLength": 1 },
234
+ "provenance": { "$ref": "#/definitions/provenance" },
235
+ "removed": {
236
+ "anyOf": [
237
+ { "type": "null" },
238
+ { "$ref": "#/definitions/removed_block" }
239
+ ]
240
+ }
241
+ }
242
+ },
243
+
244
+ "fact_load_link": {
245
+ "type": "object",
246
+ "required": ["id", "fact", "carries", "provenance", "removed"],
247
+ "additionalProperties": false,
248
+ "properties": {
249
+ "id": { "$ref": "#/definitions/load_link_id" },
250
+ "fact": { "$ref": "#/definitions/fact_id" },
251
+ "carries": { "type": "string", "minLength": 1 },
252
+ "provenance": { "$ref": "#/definitions/provenance" },
253
+ "removed": {
254
+ "anyOf": [
255
+ { "type": "null" },
256
+ { "$ref": "#/definitions/removed_block" }
257
+ ]
258
+ }
259
+ }
260
+ },
261
+
262
+ "open_field": {
263
+ "type": "object",
264
+ "required": ["id", "name", "status", "provenance", "trace"],
265
+ "additionalProperties": false,
266
+ "properties": {
267
+ "id": { "$ref": "#/definitions/open_field_id" },
268
+ "name": { "type": "string", "minLength": 1 },
269
+ "status": { "enum": ["open", "filled"] },
270
+ "filled_by": { "$ref": "#/definitions/fact_id" },
271
+ "provenance": { "$ref": "#/definitions/provenance" },
272
+ "trace": { "$ref": "#/definitions/correction_trace_list" }
273
+ },
274
+ "if": {
275
+ "properties": { "status": { "const": "filled" } },
276
+ "required": ["status"]
277
+ },
278
+ "then": { "required": ["filled_by"] },
279
+ "else": { "not": { "required": ["filled_by"] } }
280
+ },
281
+
282
+ "owed": {
283
+ "type": "object",
284
+ "required": ["id", "name", "why_load_bearing", "status", "provenance", "trace"],
285
+ "additionalProperties": false,
286
+ "properties": {
287
+ "id": { "$ref": "#/definitions/owed_id" },
288
+ "name": { "type": "string", "minLength": 1 },
289
+ "why_load_bearing": { "type": "string", "minLength": 1 },
290
+ "status": { "enum": ["open", "given"] },
291
+ "filled_by": { "$ref": "#/definitions/fact_id" },
292
+ "provenance": { "$ref": "#/definitions/provenance" },
293
+ "trace": { "$ref": "#/definitions/correction_trace_list" }
294
+ },
295
+ "if": {
296
+ "properties": { "status": { "const": "given" } },
297
+ "required": ["status"]
298
+ },
299
+ "then": { "required": ["filled_by"] },
300
+ "else": { "not": { "required": ["filled_by"] } }
301
+ },
302
+
303
+ "goal_clause": {
304
+ "type": "object",
305
+ "required": ["id", "text", "channel", "elicitation", "provenance", "trace"],
306
+ "additionalProperties": false,
307
+ "properties": {
308
+ "id": { "$ref": "#/definitions/clause_id" },
309
+ "text": { "$ref": "#/definitions/fact_text" },
310
+ "channel": { "$ref": "#/definitions/fact_channel" },
311
+ "via": { "$ref": "#/definitions/fact_via" },
312
+ "elicitation": { "$ref": "#/definitions/elicitation" },
313
+ "provenance": { "$ref": "#/definitions/provenance" },
314
+ "trace": { "$ref": "#/definitions/correction_trace_list" }
315
+ },
316
+ "if": {
317
+ "properties": { "channel": { "const": "secondhand" } },
318
+ "required": ["channel"]
319
+ },
320
+ "then": { "required": ["via"] },
321
+ "else": { "not": { "required": ["via"] } }
322
+ },
323
+
324
+ "goal_joint_link": {
325
+ "type": "object",
326
+ "required": ["id", "joint", "provenance", "removed"],
327
+ "additionalProperties": false,
328
+ "properties": {
329
+ "id": { "$ref": "#/definitions/goal_joint_id" },
330
+ "joint": { "$ref": "#/definitions/slug" },
331
+ "provenance": { "$ref": "#/definitions/provenance" },
332
+ "removed": {
333
+ "anyOf": [
334
+ { "type": "null" },
335
+ { "$ref": "#/definitions/removed_block" }
336
+ ]
337
+ }
338
+ }
339
+ },
340
+
341
+ "goal_load_link": {
342
+ "type": "object",
343
+ "required": ["id", "clause", "carries", "provenance", "removed"],
344
+ "additionalProperties": false,
345
+ "properties": {
346
+ "id": { "$ref": "#/definitions/goal_load_link_id" },
347
+ "clause": {
348
+ "type": "string",
349
+ "pattern": "^v[1-9][0-9]*#c[1-9][0-9]*$"
350
+ },
351
+ "carries": { "type": "string", "minLength": 1 },
352
+ "provenance": { "$ref": "#/definitions/provenance" },
353
+ "removed": {
354
+ "anyOf": [
355
+ { "type": "null" },
356
+ { "$ref": "#/definitions/removed_block" }
357
+ ]
358
+ }
359
+ }
360
+ },
361
+
362
+ "person": {
363
+ "type": "object",
364
+ "description": "One aggregate record per person under records/people/<slug>.json.",
365
+ "required": ["slug", "display_name", "facts", "edges", "open_fields", "load_links", "provenance"],
366
+ "additionalProperties": false,
367
+ "properties": {
368
+ "slug": { "$ref": "#/definitions/slug" },
369
+ "display_name": { "type": "string", "minLength": 1 },
370
+ "facts": { "type": "array", "items": { "$ref": "#/definitions/person_fact" } },
371
+ "edges": { "type": "array", "items": { "$ref": "#/definitions/person_edge" } },
372
+ "open_fields": { "type": "array", "items": { "$ref": "#/definitions/open_field" } },
373
+ "load_links": { "type": "array", "items": { "$ref": "#/definitions/fact_load_link" } },
374
+ "provenance": { "$ref": "#/definitions/provenance" }
375
+ }
376
+ },
377
+
378
+ "situation_entity": {
379
+ "type": "object",
380
+ "description": "One aggregate situation record per entity under records/situation/<slug>.json.",
381
+ "required": ["slug", "display_name", "facts", "owed", "load_links", "provenance"],
382
+ "additionalProperties": false,
383
+ "properties": {
384
+ "slug": { "$ref": "#/definitions/slug" },
385
+ "display_name": { "type": "string", "minLength": 1 },
386
+ "facts": { "type": "array", "items": { "$ref": "#/definitions/situation_fact" } },
387
+ "owed": { "type": "array", "items": { "$ref": "#/definitions/owed" } },
388
+ "load_links": { "type": "array", "items": { "$ref": "#/definitions/fact_load_link" } },
389
+ "provenance": { "$ref": "#/definitions/provenance" }
390
+ }
391
+ },
392
+
393
+ "goal_version": {
394
+ "type": "object",
395
+ "description": "One immutable meaning version in records/goal/v<N>.json; wording-only corrections remain visibly traced.",
396
+ "required": ["version", "clauses", "provocation", "diff_note", "provenance"],
397
+ "additionalProperties": false,
398
+ "properties": {
399
+ "version": { "type": "integer", "minimum": 1 },
400
+ "clauses": {
401
+ "type": "array",
402
+ "minItems": 1,
403
+ "items": { "$ref": "#/definitions/goal_clause" }
404
+ },
405
+ "provocation": {
406
+ "anyOf": [
407
+ { "type": "null" },
408
+ { "$ref": "#/definitions/provocation" }
409
+ ]
410
+ },
411
+ "ratification": {
412
+ "anyOf": [
413
+ { "type": "null" },
414
+ { "$ref": "#/definitions/ratification" }
415
+ ]
416
+ },
417
+ "diff_note": { "type": "string", "minLength": 1 },
418
+ "provenance": { "$ref": "#/definitions/provenance" }
419
+ },
420
+ "if": {
421
+ "properties": {
422
+ "provenance": {
423
+ "properties": { "via": { "enum": ["import", "migration"] } },
424
+ "required": ["via"]
425
+ }
426
+ },
427
+ "required": ["provenance"]
428
+ },
429
+ "else": {
430
+ "required": ["ratification"],
431
+ "properties": {
432
+ "provocation": { "$ref": "#/definitions/provocation" },
433
+ "ratification": { "$ref": "#/definitions/ratification" }
434
+ }
435
+ }
436
+ },
437
+
438
+ "goal_state": {
439
+ "type": "object",
440
+ "description": "Mutable traced goal associations stored separately from the immutable meaning chain.",
441
+ "required": ["joints", "load_links", "provenance"],
442
+ "additionalProperties": false,
443
+ "properties": {
444
+ "joints": { "type": "array", "items": { "$ref": "#/definitions/goal_joint_link" } },
445
+ "load_links": { "type": "array", "items": { "$ref": "#/definitions/goal_load_link" } },
446
+ "provenance": { "$ref": "#/definitions/provenance" }
447
+ }
448
+ },
449
+
49
450
  "conviction": {
50
451
  "type": "object",
51
452
  "required": ["level", "source"],
@@ -298,7 +699,7 @@
298
699
  "required": ["kind", "title", "provenance"],
299
700
  "additionalProperties": false,
300
701
  "properties": {
301
- "kind": { "enum": ["decide", "kill", "override", "escalate", "calibrate", "postmortem", "rank", "note", "correct", "open"] },
702
+ "kind": { "enum": ["decide", "kill", "override", "escalate", "calibrate", "postmortem", "rank", "note", "correct", "open", "attest"] },
302
703
  "title": { "type": "string", "minLength": 1 },
303
704
  "body": { "type": "string" },
304
705
  "refs": { "type": "array", "items": { "type": "string" }, "default": [] },
@@ -306,6 +707,7 @@
306
707
  "conviction": { "$ref": "#/definitions/conviction" },
307
708
  "trigger": { "type": "string", "minLength": 1 },
308
709
  "open_joints": { "type": "array", "items": { "type": "string" } },
710
+ "rests_on": { "type": "array", "items": { "$ref": "#/definitions/goal_clause_ref" } },
309
711
  "prediction": { "$ref": "#/definitions/embedded_prediction" },
310
712
  "disposition": { "enum": ["EXT", "INT", "CONSTRUCT", "ASSERT", "STRADDLE"] },
311
713
  "recall_verdict": { "enum": ["NAMED", "NAMED-BUT-MISRANKED", "MISSED", "UNKNOWABLE"] },
@@ -314,6 +716,9 @@
314
716
  "prediction_grade": { "enum": ["right", "right-wrong-reason", "wrong"] },
315
717
  "reason": { "type": "string", "minLength": 1 },
316
718
  "anchor": { "type": "string", "minLength": 1 },
719
+ "intent_id": { "type": "string", "minLength": 1 },
720
+ "tool": { "type": "string", "minLength": 1 },
721
+ "op": { "type": "string", "minLength": 1 },
317
722
  "rank_change": {
318
723
  "type": "object",
319
724
  "required": ["joint", "from", "to"],
@@ -380,6 +785,20 @@
380
785
  {
381
786
  "if": { "required": ["disposition"], "properties": { "disposition": { "const": "CONSTRUCT" } } },
382
787
  "then": { "required": ["prediction"] }
788
+ },
789
+ {
790
+ "if": {
791
+ "properties": { "kind": { "const": "attest" } },
792
+ "required": ["kind"]
793
+ },
794
+ "then": { "required": ["intent_id", "tool", "op"] },
795
+ "else": {
796
+ "allOf": [
797
+ { "not": { "required": ["intent_id"] } },
798
+ { "not": { "required": ["tool"] } },
799
+ { "not": { "required": ["op"] } }
800
+ ]
801
+ }
383
802
  }
384
803
  ]
385
804
  },
@@ -387,10 +806,12 @@
387
806
  "pending_intent": {
388
807
  "type": "object",
389
808
  "description": "Intent-first transition record: the COMPLETE mutation persisted atomically BEFORE the guard call, replayed idempotently by the reconciler — guard state authoritative for the edge, the intent authoritative for the payload.",
390
- "required": ["id", "op", "payload", "created_at"],
809
+ "required": ["id", "kind", "tool", "op", "payload", "created_at"],
391
810
  "additionalProperties": false,
392
811
  "properties": {
393
812
  "id": { "type": "string", "minLength": 1 },
813
+ "kind": { "type": "string", "minLength": 1 },
814
+ "tool": { "type": "string", "minLength": 1 },
394
815
  "op": { "type": "string", "minLength": 1 },
395
816
  "payload": { "type": "object" },
396
817
  "created_at": { "type": "string", "format": "date-time" }