@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.
- package/.claude/skills/compose/SKILL.md +42 -88
- package/.compose-deps.json +1 -13
- package/README.md +72 -5
- package/bin/compose.js +754 -347
- package/bin/git-hooks/pre-push.template +29 -0
- package/bin/judgment-import.js +7 -0
- package/bin/judgment-migrate.js +387 -0
- package/contracts/comp-obs-contract.schema.json +9 -3
- package/contracts/feature-json.schema.json +5 -0
- package/contracts/fluid-record.schema.json +209 -0
- package/contracts/judgment-record.schema.json +425 -4
- package/contracts/lifecycle-backfill.schema.json +322 -0
- package/dist/assets/App-Z4MU-H_F.js +916 -0
- package/dist/assets/_baseUniq-ClWoCPFl.js +1 -0
- package/dist/assets/arc-DY26UIVo.js +1 -0
- package/dist/assets/architectureDiagram-Q4EWVU46-6Ggq4DqJ.js +36 -0
- package/dist/assets/blockDiagram-DXYQGD6D-CH3Ked0l.js +132 -0
- package/dist/assets/{browser-BSM23If2.js → browser-BWkrenen.js} +6 -6
- package/dist/assets/{c4Diagram-LMCZKHZV-DZf45Fbz.js → c4Diagram-AHTNJAMY-Bk8dYilu.js} +1 -1
- package/dist/assets/channel-SnZzzh7k.js +1 -0
- package/dist/assets/{chunk-JWPE2WC7-_7ujgd_Q.js → chunk-4BX2VUAB-BMR0XaAQ.js} +1 -1
- package/dist/assets/chunk-4TB4RGXK-JytR14a9.js +206 -0
- package/dist/assets/{chunk-XXDRQBXY-DfdVhbmA.js → chunk-55IACEB6-B4Q97BCP.js} +1 -1
- package/dist/assets/{chunk-VR4S4FIN-Dt9NZ67m.js → chunk-EDXVE4YY-R_qarkSf.js} +1 -1
- package/dist/assets/{chunk-5VM5RSS4-BY4_PV5H.js → chunk-FMBD7UC4-C9s7KR9m.js} +1 -1
- package/dist/assets/chunk-OYMX7WX6-BySQzVxc.js +231 -0
- package/dist/assets/{chunk-2Q5K7J3B-Dn1spZYu.js → chunk-QZHKN3VN-DdpSYZsW.js} +1 -1
- package/dist/assets/{chunk-32BRIVSS-pURGrJDk.js → chunk-YZCP3GAM-iE_tzriw.js} +1 -1
- package/dist/assets/classDiagram-6PBFFD2Q-CBu92dSH.js +1 -0
- package/dist/assets/classDiagram-v2-HSJHXN6E-CBu92dSH.js +1 -0
- package/dist/assets/clone-DgklGjHm.js +1 -0
- package/dist/assets/{cose-bilkent-JH36ORCC-BieYif4o.js → cose-bilkent-S5V4N54A-BdlU6ZX_.js} +1 -1
- package/dist/assets/dagre-KV5264BT-Cp3F5KTn.js +4 -0
- package/dist/assets/diagram-5BDNPKRD-DiR6_2q_.js +10 -0
- package/dist/assets/diagram-G4DWMVQ6-w0i-p5HX.js +24 -0
- package/dist/assets/diagram-MMDJMWI5-tIHhwUv3.js +43 -0
- package/dist/assets/diagram-TYMM5635-BAeY3B19.js +24 -0
- package/dist/assets/erDiagram-SMLLAGMA-Ckx_Knko.js +85 -0
- package/dist/assets/flowDiagram-DWJPFMVM-DeoNka6J.js +162 -0
- package/dist/assets/ganttDiagram-T4ZO3ILL-BmGnFbEg.js +292 -0
- package/dist/assets/gitGraphDiagram-UUTBAWPF-Dk48IHsx.js +106 -0
- package/dist/assets/graph-BNzKGvoy.js +1 -0
- package/dist/assets/graph-CI_1htl0.js +331 -0
- package/dist/assets/index-BEfrNBp8.js +123 -0
- package/dist/assets/index-yyrA5OZd.css +1 -0
- package/dist/assets/infoDiagram-42DDH7IO-BRf827i0.js +2 -0
- package/dist/assets/{ishikawaDiagram-FXEZZL3T-CzEB9fQS.js → ishikawaDiagram-UXIWVN3A-0kCZaeCM.js} +5 -5
- package/dist/assets/{journeyDiagram-5HDEW3XC-Bz8TCdz2.js → journeyDiagram-VCZTEJTY-rvU7ayRt.js} +1 -1
- package/dist/assets/{kanban-definition-HUTT4EX6-tozrMoV_.js → kanban-definition-6JOO6SKY-DpQwX1C5.js} +7 -7
- package/dist/assets/katex-DkKDou_j.js +257 -0
- package/dist/assets/layout-BI8cXFPI.js +1 -0
- package/dist/assets/{linear-Ck7gpa5N.js → linear-a0glcDiw.js} +1 -1
- package/dist/assets/min-vPHfnXcC.js +1 -0
- package/dist/assets/{mindmap-definition-LN4V7U3C-DTcHO0DJ.js → mindmap-definition-QFDTVHPH-D14eF-7C.js} +7 -7
- package/dist/assets/mobile-B7m9EO9D.js +17 -0
- package/dist/assets/pieDiagram-DEJITSTG-Cno-gETh.js +30 -0
- package/dist/assets/quadrantDiagram-34T5L4WZ-BUQM1Hfm.js +7 -0
- package/dist/assets/{requirementDiagram-TGXJPOKE-bnI2zJeT.js → requirementDiagram-MS252O5E-pOXlN2-q.js} +3 -3
- package/dist/assets/sankeyDiagram-XADWPNL6-Crynd3_b.js +10 -0
- package/dist/assets/sequenceDiagram-FGHM5R23-D9fZdCM8.js +157 -0
- package/dist/assets/stateDiagram-FHFEXIEX-CW9qVec8.js +1 -0
- package/dist/assets/stateDiagram-v2-QKLJ7IA2-DkVLzHbY.js +1 -0
- package/dist/assets/{timeline-definition-FHXFAJF6-D267GQFF.js → timeline-definition-GMOUNBTQ-BcHzhm_8.js} +3 -3
- package/dist/assets/vennDiagram-DHZGUBPP-BfytJcWk.js +34 -0
- package/dist/assets/wardley-RL74JXVD-DLj-IjyB.js +162 -0
- package/dist/assets/wardleyDiagram-NUSXRM2D-Ds0Ue68c.js +20 -0
- package/dist/assets/xychartDiagram-5P7HB3ND-vjWDXFL6.js +7 -0
- package/dist/index.html +3 -3
- package/lib/agent-string.js +7 -5
- package/lib/append-integrity.js +81 -0
- package/lib/backfill-evidence.js +109 -0
- package/lib/bug-escalation.js +39 -4
- package/lib/build-stream-schema.js +3 -1
- package/lib/build-stream-writer.js +25 -0
- package/lib/build.js +1624 -195
- package/lib/canon-guard.js +245 -0
- package/lib/canon-override.js +196 -0
- package/lib/canon-registry.js +291 -0
- package/lib/cli-commands.js +144 -0
- package/lib/codex-preflight.js +50 -15
- package/lib/colleague/context.js +215 -0
- package/lib/colleague/writeback.js +95 -0
- package/lib/completion-gate.js +1421 -0
- package/lib/completion-writer.js +47 -47
- package/lib/consumer-fanout.js +105 -11
- package/lib/coverage-gate.js +200 -0
- package/lib/dir-lock.js +170 -0
- package/lib/dispatch-ledger.js +301 -0
- package/lib/dispatch-metrics.js +236 -0
- package/lib/experiment-judge.js +6 -1
- package/lib/feature-json.js +1 -1
- package/lib/feature-reconciler.js +8 -0
- package/lib/feature-validator.js +64 -1
- package/lib/feature-writer.js +66 -2
- package/lib/fluid/factory.js +167 -0
- package/lib/fluid/ideabox-dates.js +73 -0
- package/lib/fluid/ideabox-migrate.js +154 -0
- package/lib/fluid/ideabox-ops.js +585 -0
- package/lib/fluid/ideabox-view.js +146 -0
- package/lib/fluid/import-ideabox.js +186 -0
- package/lib/fluid/local-provider.js +606 -0
- package/lib/fluid/provider.js +684 -0
- package/lib/fluid/record-shape.js +214 -0
- package/lib/fluid/record-store.js +328 -0
- package/lib/fluid/render-ideabox.js +261 -0
- package/lib/fluid/schema.js +40 -0
- package/lib/fluid/smartmemory-provider.js +1695 -0
- package/lib/gsd.js +63 -14
- package/lib/guard-cli.js +175 -0
- package/lib/guard-custody.js +141 -0
- package/lib/guard-descriptors.js +530 -0
- package/lib/guard-enrol.js +254 -0
- package/lib/health-score.js +1 -1
- package/lib/hooks-status.js +32 -3
- package/lib/ideabox-cli.js +315 -0
- package/lib/ideabox.js +121 -21
- package/lib/judgment/store/index.js +166 -0
- package/lib/judgment/store/records.js +184 -25
- package/lib/judgment/trace.js +380 -0
- package/lib/judgment-attest.js +259 -0
- package/lib/judgment-decision-write.js +277 -0
- package/lib/judgment-decisions.js +466 -0
- package/lib/judgment-gen.js +375 -22
- package/lib/judgment-verify.js +153 -0
- package/lib/judgment-writer.js +2842 -262
- package/lib/lane-gate.js +2 -0
- package/lib/lifecycle-modes.js +4 -4
- package/lib/lineage.js +400 -0
- package/lib/local-claude-connector.js +250 -54
- package/lib/maya-client.js +302 -0
- package/lib/maya-config.js +53 -0
- package/lib/maya-identity.js +283 -0
- package/lib/mcp-enforcement.js +21 -35
- package/lib/migrate-anon.js +5 -0
- package/lib/migrate-roadmap.js +15 -0
- package/lib/new.js +13 -1
- package/lib/pipeline-compat.js +104 -0
- package/lib/policy-catalog.js +295 -0
- package/lib/policy-check.js +0 -0
- package/lib/process-termination.js +98 -0
- package/lib/resolve-workspace.js +5 -1
- package/lib/result-normalizer.js +428 -153
- package/lib/review-normalize.js +4 -0
- package/lib/roadmap-errors.js +65 -0
- package/lib/roadmap-preservers.js +24 -4
- package/lib/roadmap-residue.js +299 -0
- package/lib/smartmemory-client.js +614 -78
- package/lib/smartmemory-config.js +54 -0
- package/lib/smartmemory-ingest.js +19 -2
- package/lib/step-prompt.js +7 -6
- package/lib/stratum-engine.js +53 -4
- package/lib/stratum-mcp-client.js +391 -31
- package/lib/test-bootstrap.js +31 -0
- package/lib/tool-inventory.js +122 -0
- package/lib/version-check.js +91 -19
- package/lib/vision-writer.js +88 -1
- package/package.json +7 -6
- package/pipelines/bug-fix.stratum.yaml +205 -211
- package/pipelines/build-quick.profiles.json +12 -0
- package/pipelines/build-quick.stratum.yaml +263 -350
- package/pipelines/content.stratum.yaml +81 -77
- package/pipelines/coverage-sweep.stratum.yaml +49 -30
- package/pipelines/plan.stratum.yaml +76 -86
- package/pipelines/refactor.stratum.yaml +125 -125
- package/pipelines/research.stratum.yaml +56 -58
- package/pipelines/review-fix.profiles.json +6 -0
- package/pipelines/review-fix.stratum.yaml +110 -83
- package/presets/team-feature.profiles.json +6 -0
- package/presets/team-feature.stratum.yaml +93 -66
- package/presets/team-research.profiles.json +6 -0
- package/presets/team-research.stratum.yaml +89 -80
- package/presets/team-review.profiles.json +8 -0
- package/presets/team-review.stratum.yaml +98 -80
- package/scripts/cost-census.mjs +70 -0
- package/scripts/guard-sign/compose-guard-sign.sh +62 -0
- package/server/agent-health.js +22 -0
- package/server/agent-hooks.js +14 -1
- package/server/agent-server.js +5 -248
- package/server/agent-spawn.js +3 -4
- package/server/agent-workspace.js +294 -0
- package/server/build-routes.js +6 -5
- package/server/build-stream-bridge.js +53 -0
- package/server/cc-session-watcher.js +4 -1
- package/server/coalescing-buffer.js +7 -1
- package/server/completion-projection.js +228 -0
- package/server/compose-mcp-tools.js +124 -24
- package/server/compose-mcp.js +91 -790
- package/server/decision-event-emit.js +41 -2
- package/server/decision-event-id.js +17 -0
- package/server/decision-events-snapshot.js +3 -0
- package/server/design-routes.js +14 -8
- package/server/feature-scan.js +76 -2
- package/server/file-watcher.js +170 -21
- package/server/ideabox-routes.js +166 -224
- package/server/index.js +70 -100
- package/server/lifecycle-guard.js +240 -10
- package/server/lifecycle-phase-history.js +276 -0
- package/server/maya-routes.js +507 -0
- package/server/mcp-tool-defs.js +940 -0
- package/server/mcp-tool-policy.js +35 -3
- package/server/model-tiers.js +22 -5
- package/server/pipeline-routes.js +21 -11
- package/server/project-root.js +58 -19
- package/server/remote-utils.js +3 -1
- package/server/schema-validator.js +7 -1
- package/server/session-manager.js +5 -6
- package/server/session-routes.js +3 -1
- package/server/stratum-client.js +57 -10
- package/server/stratum-sync.js +6 -3
- package/server/summarizer.js +3 -4
- package/server/supervisor.js +0 -1
- package/server/vision-routes.js +208 -98
- package/server/vision-server.js +86 -23
- package/server/vision-store.js +60 -6
- package/server/vision-utils.js +3 -4
- package/server/workspace-activity.js +18 -0
- package/server/workspace-middleware.js +2 -2
- package/server/workspace-runtime.js +243 -0
- package/server/worktree-gc.js +1 -0
- package/dist/assets/App-BG3ngu8H.js +0 -896
- package/dist/assets/abnfDiagram-VRR7QNED-CjB_sD3D.js +0 -1
- package/dist/assets/arc-_v4hR_uD.js +0 -1
- package/dist/assets/architectureDiagram-ZJ3FMSHR-DreJmzXQ.js +0 -36
- package/dist/assets/blockDiagram-677ZJIJ3-BG9-c0O1.js +0 -132
- package/dist/assets/channel-B3U5wFAT.js +0 -1
- package/dist/assets/chunk-EX3LRPZG-DdELs1qP.js +0 -231
- package/dist/assets/chunk-MOJQB5TN-D-ky35G-.js +0 -88
- package/dist/assets/chunk-RYQCIY6F-Dag_kVlO.js +0 -1
- package/dist/assets/chunk-V7JOEXUC-BtewURat.js +0 -206
- package/dist/assets/classDiagram-OUVF2IWQ-B6fCN-ht.js +0 -1
- package/dist/assets/classDiagram-v2-EOCWNBFH-B6fCN-ht.js +0 -1
- package/dist/assets/cynefin-VYW2F7L2-CT2BA6KE.js +0 -178
- package/dist/assets/cynefinDiagram-TSTJHNR4-Bh6exbyg.js +0 -62
- package/dist/assets/dagre-VKFMJZFB-aXMLSmQL.js +0 -4
- package/dist/assets/diagram-FQU43EPY-Dr7JAOuQ.js +0 -3
- package/dist/assets/diagram-G47NLZAW-DUvA3FQK.js +0 -24
- package/dist/assets/diagram-NH7WQ7WH-BQUARqcu.js +0 -24
- package/dist/assets/diagram-OA4YK3LP-dDUc1zHi.js +0 -30
- package/dist/assets/diagram-WEI45ONY-B2h5Qlb1.js +0 -41
- package/dist/assets/ebnfDiagram-CCIWWBDH-DThRGupB.js +0 -1
- package/dist/assets/erDiagram-Q63AITRT-BUCsprO2.js +0 -85
- package/dist/assets/flowDiagram-23GEKE2U-DXtNNi6r.js +0 -156
- package/dist/assets/ganttDiagram-NO4QXBWP-D4zbBHh_.js +0 -292
- package/dist/assets/gitGraphDiagram-IHSO6WYX-DpoQws0W.js +0 -106
- package/dist/assets/graph-BXPQrYYB.js +0 -331
- package/dist/assets/graph-C9eacEi8.js +0 -1
- package/dist/assets/index-3ZH5eMcZ.js +0 -119
- package/dist/assets/index-LIwREYgH.css +0 -1
- package/dist/assets/infoDiagram-FWYZ7A6U-Bbas2GAo.js +0 -2
- package/dist/assets/katex-C5jXJg4s.js +0 -257
- package/dist/assets/layout-DEXfKzaS.js +0 -1
- package/dist/assets/map-Czzmt4hB.js +0 -1
- package/dist/assets/mobile-CaoXUwAr.js +0 -17
- package/dist/assets/pegDiagram-2B236MQR-CHiINrNy.js +0 -1
- package/dist/assets/pieDiagram-ENE6RG2P-CfS4YFlR.js +0 -39
- package/dist/assets/quadrantDiagram-ABIIQ3AL-CadesS9w.js +0 -7
- package/dist/assets/railroadDiagram-RFXS5EU6-CgWEspBN.js +0 -1
- package/dist/assets/sankeyDiagram-HTMAVEWB-YWKFgOGw.js +0 -40
- package/dist/assets/sequenceDiagram-DBY2YBRQ-BvkNOyF9.js +0 -162
- package/dist/assets/sizeCapture-X5ZJPWSS-DlFPA2yO.js +0 -1
- package/dist/assets/stateDiagram-2N3HPSRC-h8NIx0kQ.js +0 -1
- package/dist/assets/stateDiagram-v2-6OUMAXLB-DjPgZtJ9.js +0 -1
- package/dist/assets/swimlanes-5IMT3BWC-CT5n22kG.js +0 -2
- package/dist/assets/swimlanesDiagram-G3AALYLV-Dn318Bhq.js +0 -8
- package/dist/assets/vennDiagram-L72KCM5P-Dj-wWLYG.js +0 -34
- package/dist/assets/wardleyDiagram-EHGQE667-BxCeYxkG.js +0 -78
- package/dist/assets/xychartDiagram-FW5EYKEG-DMFqWn7z.js +0 -7
- package/lib/staleness.js +0 -87
- package/server/ideabox-cache.js +0 -77
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
3
|
+
"$id": "https://compose.smartmemory.dev/contracts/fluid-record.schema.json",
|
|
4
|
+
"title": "fluid-record",
|
|
5
|
+
"version": "0.2.0",
|
|
6
|
+
"description": "The canonical record shape carried across the fluid-store provider seam (PROVIDER-SEAM, what-to-build 8k, owner-locked 2026-07-21). The seam is drawn at records + lifecycle events + capability discovery ONLY. Semantic machinery (recall, challenge, conviction, calibration, contradiction) is NEVER modelled here — those are provider capabilities that light up when the configured provider declares them, and a provider that lacks one lacks it visibly. Kind-generic from day one: COMP-PLAN-IDEA-UNIFY implements `idea` as the seam's pilot workload, and positions/joints/decisions adopt this same shape next without a contract change.",
|
|
7
|
+
"_source": "docs/features/COMP-PLAN-IDEA-UNIFY/design.md",
|
|
8
|
+
"_roadmap": "COMP-PLAN-IDEA-UNIFY",
|
|
9
|
+
"type": "object",
|
|
10
|
+
|
|
11
|
+
"definitions": {
|
|
12
|
+
|
|
13
|
+
"kind": {
|
|
14
|
+
"type": "string",
|
|
15
|
+
"description": "The fluid record's type. A provider declares which kinds it implements via supportedKinds(); an unsupported kind is refused loudly, never silently coerced. `cluster` is a record rather than a string label because an umbrella carries a hand-authored multi-sentence Theme paragraph: that is cluster-scoped content with nowhere to live on a member idea except duplicated onto every one of them, which is a drift generator. Members reference their cluster by handle via the record's `cluster` field.",
|
|
16
|
+
"enum": ["idea", "position", "joint", "decision", "thread", "question", "cluster"]
|
|
17
|
+
},
|
|
18
|
+
|
|
19
|
+
"handle": {
|
|
20
|
+
"type": "string",
|
|
21
|
+
"description": "Stable, human-facing external identifier (IDEA-7, JOINT-3). Distinct from `id` ON PURPOSE: `id` is provider-assigned and changes when the record is imported into a different provider, whereas the handle is quoted in docs, commits, and conversation (e.g. IDEA-20 is cited in the substrate ruling) and MUST survive a provider swap unchanged. Allocated monotonically per kind; a retired handle is never reused. The suffix is bounded to 9 digits: allocation reads it as a Number, and a value past the exact-integer range makes `max + 1` equal `max`, which would hand the same handle out twice.",
|
|
22
|
+
"pattern": "^[A-Z][A-Z0-9]*-[1-9][0-9]{0,8}$"
|
|
23
|
+
},
|
|
24
|
+
|
|
25
|
+
"status": {
|
|
26
|
+
"type": "string",
|
|
27
|
+
"description": "Canonical fluid lifecycle state. This is the source of truth for the record's state; any provider-native status field is a projection of it, never the reverse.",
|
|
28
|
+
"enum": ["new", "discussing", "promoted", "killed"]
|
|
29
|
+
},
|
|
30
|
+
|
|
31
|
+
"priority": {
|
|
32
|
+
"type": ["string", "null"],
|
|
33
|
+
"description": "Triage rank. null means untriaged (the ideabox renders this as an em dash).",
|
|
34
|
+
"enum": ["P0", "P1", "P2", null]
|
|
35
|
+
},
|
|
36
|
+
|
|
37
|
+
"effort": {
|
|
38
|
+
"type": ["string", "null"],
|
|
39
|
+
"description": "T-shirt size of the work, the X axis of the cockpit's 2x2 prioritization matrix. Null means unassigned, which is the matrix's `Unassigned` tray rather than a default size. Separate from `priority` on purpose: priority is a decision about sequencing, effort is an estimate of cost, and collapsing them loses the pair that makes a Quick Win distinguishable from a Big Bet.",
|
|
40
|
+
"enum": ["S", "M", "L", null]
|
|
41
|
+
},
|
|
42
|
+
|
|
43
|
+
"impact": {
|
|
44
|
+
"type": ["string", "null"],
|
|
45
|
+
"description": "Expected value of the work, the Y axis of the cockpit's 2x2 prioritization matrix. Null means unassigned. Lower-case by contract because that is what the markdown surface has always written and what `lib/ideabox.js` validates against; a casing change here would silently invalidate every existing assignment on upgrade.",
|
|
46
|
+
"enum": ["low", "medium", "high", null]
|
|
47
|
+
},
|
|
48
|
+
|
|
49
|
+
"link": {
|
|
50
|
+
"type": "object",
|
|
51
|
+
"description": "A typed edge to another record or to committed (git) canon. Promotion writes an edge of type `promoted_to` rather than mutating the record into a feature, so the idea to feature transition is provenance in the graph rather than a lost jump.",
|
|
52
|
+
"required": ["type", "target"],
|
|
53
|
+
"additionalProperties": false,
|
|
54
|
+
"properties": {
|
|
55
|
+
"type": {
|
|
56
|
+
"type": "string",
|
|
57
|
+
"enum": ["promoted_to", "maps_to", "informs", "blocks", "supports", "contradicts", "supersedes", "duplicate_of"]
|
|
58
|
+
},
|
|
59
|
+
"target": {
|
|
60
|
+
"type": "string",
|
|
61
|
+
"description": "Handle of another fluid record, or a committed feature code (COMP-FOO-1) when the edge crosses the crystallization boundary into git canon."
|
|
62
|
+
},
|
|
63
|
+
"note": { "type": "string" }
|
|
64
|
+
}
|
|
65
|
+
},
|
|
66
|
+
|
|
67
|
+
"provenance": {
|
|
68
|
+
"type": "object",
|
|
69
|
+
"description": "Stamped by the writing tool, never settable by a caller. Captured at write time, never retrofitted (what-to-build 12: provenance is never retrofitted successfully).",
|
|
70
|
+
"required": ["origin", "recorded_at"],
|
|
71
|
+
"additionalProperties": false,
|
|
72
|
+
"properties": {
|
|
73
|
+
"origin": {
|
|
74
|
+
"type": "string",
|
|
75
|
+
"description": "Which door the record came through. `import:ideabox` marks a record created by the one-time markdown import, distinguishing migrated rows from natively captured ones for the lifetime of the record.",
|
|
76
|
+
"enum": ["cli:ideabox", "ui:ideabox", "mcp:compose", "import:ideabox", "pipeline:plan"]
|
|
77
|
+
},
|
|
78
|
+
"recorded_at": { "type": "string", "format": "date-time" },
|
|
79
|
+
"author": { "type": ["string", "null"] }
|
|
80
|
+
}
|
|
81
|
+
},
|
|
82
|
+
|
|
83
|
+
"record": {
|
|
84
|
+
"type": "object",
|
|
85
|
+
"description": "One fluid record as it crosses the seam.",
|
|
86
|
+
"required": ["id", "handle", "kind", "title", "status", "provenance", "created_at", "updated_at"],
|
|
87
|
+
"additionalProperties": false,
|
|
88
|
+
"properties": {
|
|
89
|
+
"id": {
|
|
90
|
+
"type": "string",
|
|
91
|
+
"description": "Provider-assigned opaque identifier. Callers MUST NOT parse it or persist it as a cross-document reference — use `handle` for that."
|
|
92
|
+
},
|
|
93
|
+
"handle": { "$ref": "#/definitions/handle" },
|
|
94
|
+
"kind": { "$ref": "#/definitions/kind" },
|
|
95
|
+
"title": { "type": "string", "minLength": 1 },
|
|
96
|
+
"body": {
|
|
97
|
+
"type": "string",
|
|
98
|
+
"description": "Free prose. The ideabox's `Idea:` paragraph lands here."
|
|
99
|
+
},
|
|
100
|
+
"status": { "$ref": "#/definitions/status" },
|
|
101
|
+
"status_label": {
|
|
102
|
+
"type": ["string", "null"],
|
|
103
|
+
"description": "The human-facing status token when it carries more than the canonical enum can (`RE-AIMED (2026-07-21)`, `PROMOTED (-> FEAT-1)`). Canonical `status` drives all behavior; this only preserves what the author wrote so a closed enum does not quietly flatten it away. Null when the author's token was already canonical."
|
|
104
|
+
},
|
|
105
|
+
"priority": { "$ref": "#/definitions/priority" },
|
|
106
|
+
"effort": { "$ref": "#/definitions/effort" },
|
|
107
|
+
"impact": { "$ref": "#/definitions/impact" },
|
|
108
|
+
"cluster": {
|
|
109
|
+
"type": ["string", "null"],
|
|
110
|
+
"description": "HANDLE of the `cluster` record this record belongs to (e.g. CLUS-1), or null when ungrouped. Carries the editorial grouping the ideabox renders as `### Umbrella A - Resilience: fail loud, recover fast`. This is RECORD DATA, not presentation: the headings and their theme prose are hand-authored information, and a projection that cannot reproduce them from the store would clobber them on first regeneration - the failure mode `roadmap generate` already has. A handle rather than the display name so renaming an umbrella does not orphan its members."
|
|
111
|
+
},
|
|
112
|
+
"cluster_order": {
|
|
113
|
+
"type": ["integer", "null"],
|
|
114
|
+
"description": "Position of this record's cluster in the rendered projection, preserving hand-authored cluster ORDERING (Umbrella A before B) across a regenerate. Null when ungrouped."
|
|
115
|
+
},
|
|
116
|
+
"tags": {
|
|
117
|
+
"type": "array",
|
|
118
|
+
"items": { "type": "string" },
|
|
119
|
+
"description": "Bare tag tokens without the leading hash (ux, core, distribution)."
|
|
120
|
+
},
|
|
121
|
+
"source": {
|
|
122
|
+
"type": ["string", "null"],
|
|
123
|
+
"description": "Where the idea came from, as free text."
|
|
124
|
+
},
|
|
125
|
+
"links": {
|
|
126
|
+
"type": "array",
|
|
127
|
+
"items": { "$ref": "#/definitions/link" }
|
|
128
|
+
},
|
|
129
|
+
"killed": {
|
|
130
|
+
"type": ["object", "null"],
|
|
131
|
+
"description": "Set when status is `killed`. A kill is a dated event with a reason (what-to-build 11), so the reason is structured rather than appended to prose.",
|
|
132
|
+
"required": ["at", "reason"],
|
|
133
|
+
"additionalProperties": false,
|
|
134
|
+
"properties": {
|
|
135
|
+
"at": { "type": "string", "format": "date-time" },
|
|
136
|
+
"reason": { "type": "string" }
|
|
137
|
+
}
|
|
138
|
+
},
|
|
139
|
+
"discussion": {
|
|
140
|
+
"type": "array",
|
|
141
|
+
"description": "Append-only comment trail (`compose ideabox discuss`). Append-only because a deliberation trail that can be rewritten is not evidence.",
|
|
142
|
+
"items": {
|
|
143
|
+
"type": "object",
|
|
144
|
+
"required": ["at", "text"],
|
|
145
|
+
"additionalProperties": false,
|
|
146
|
+
"properties": {
|
|
147
|
+
"at": { "type": "string", "format": "date-time" },
|
|
148
|
+
"text": { "type": "string" },
|
|
149
|
+
"author": {
|
|
150
|
+
"type": ["string", "null"],
|
|
151
|
+
"description": "Who wrote the entry, or null when unattributed. Spaces ARE allowed — `Jane Doe` is the common case, and the markdown parser used to require `\\w+`, which silently dropped the whole entry (COMP-FLUID-SEAM-GUARANTEES F7-1). A colon and line breaks are forbidden: the projection's grammar is `- [date] author: text` and takes everything up to the FIRST colon as the author, so an author containing one could not be represented and would parse back as something else. Constrained here rather than escaped in the renderer, because a value the surface cannot express is a value the store should refuse to hold.",
|
|
152
|
+
"pattern": "^[^:\\n\\r]*$"
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
},
|
|
157
|
+
"provenance": { "$ref": "#/definitions/provenance" },
|
|
158
|
+
"created_at": { "type": "string", "format": "date-time" },
|
|
159
|
+
"updated_at": { "type": "string", "format": "date-time" }
|
|
160
|
+
}
|
|
161
|
+
},
|
|
162
|
+
|
|
163
|
+
"lifecycle_event": {
|
|
164
|
+
"type": "object",
|
|
165
|
+
"description": "An append-only fact about a record's life. Events are part of the seam because they are portable across providers; the SEMANTIC readings of them (conviction, calibration) are not, and are never derived here.",
|
|
166
|
+
"required": ["handle", "type", "at"],
|
|
167
|
+
"additionalProperties": false,
|
|
168
|
+
"properties": {
|
|
169
|
+
"handle": { "$ref": "#/definitions/handle" },
|
|
170
|
+
"type": {
|
|
171
|
+
"type": "string",
|
|
172
|
+
"enum": ["created", "updated", "triaged", "discussed", "promoted", "killed", "linked", "imported", "deleted"]
|
|
173
|
+
},
|
|
174
|
+
"at": { "type": "string", "format": "date-time" },
|
|
175
|
+
"detail": {
|
|
176
|
+
"type": "object",
|
|
177
|
+
"description": "Type-specific payload. Deliberately unconstrained: constraining it here would drag provider-specific semantics into the seam."
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
},
|
|
181
|
+
|
|
182
|
+
"capability": {
|
|
183
|
+
"type": "string",
|
|
184
|
+
"description": "STORAGE capabilities are the seam's own contract and every provider must implement them. SEMANTIC capabilities are the reason the seam exists: they are declared, never abstracted. Asking a provider for one it has not declared is an error (FluidCapabilityUnavailable), never an empty result - an empty result is indistinguishable from a real answer and would fake the capability.",
|
|
185
|
+
"enum": [
|
|
186
|
+
"RECORDS",
|
|
187
|
+
"EVENTS",
|
|
188
|
+
"LINKS",
|
|
189
|
+
"RECALL",
|
|
190
|
+
"CHALLENGE",
|
|
191
|
+
"CONVICTION",
|
|
192
|
+
"CALIBRATION",
|
|
193
|
+
"CONTRADICTION"
|
|
194
|
+
]
|
|
195
|
+
}
|
|
196
|
+
},
|
|
197
|
+
|
|
198
|
+
"additionalProperties": false,
|
|
199
|
+
"properties": {
|
|
200
|
+
"record": { "$ref": "#/definitions/record" },
|
|
201
|
+
"lifecycle_event": { "$ref": "#/definitions/lifecycle_event" }
|
|
202
|
+
},
|
|
203
|
+
"oneOf": [
|
|
204
|
+
{ "required": ["record"] },
|
|
205
|
+
{ "required": ["lifecycle_event"] }
|
|
206
|
+
],
|
|
207
|
+
|
|
208
|
+
"_validation": "Callers validate against a NAMED DEFINITION (#/definitions/record, #/definitions/lifecycle_event) — see lib/fluid/schema.js — following contracts/judgment-record.schema.json's per-definition pattern. The root is an envelope, and `oneOf` + `additionalProperties: false` exist so that an empty or unrelated payload is REJECTED by the machine rather than merely discouraged by this prose. A prose instruction with no machine effect is not a constraint."
|
|
209
|
+
}
|