dreamcontext 0.8.5 → 0.8.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (133) hide show
  1. package/README.md +16 -13
  2. package/agents/dreamcontext-explore.md +7 -2
  3. package/agents/sleep-federation.md +28 -2
  4. package/dist/agents/dreamcontext-explore.md +7 -2
  5. package/dist/agents/sleep-federation.md +28 -2
  6. package/dist/dashboard/assets/Assistant-Bold-gm-uSS1B.woff2 +0 -0
  7. package/dist/dashboard/assets/Assistant-Medium-DrcxCXg3.woff2 +0 -0
  8. package/dist/dashboard/assets/Assistant-Regular-DVxZuzxb.woff2 +0 -0
  9. package/dist/dashboard/assets/Assistant-SemiBold-SCI4bEL9.woff2 +0 -0
  10. package/dist/dashboard/assets/{BrainCanvas3D-D8PjCqhM.js → BrainCanvas3D-CyuMh6vC.js} +1 -1
  11. package/dist/dashboard/assets/{_baseUniq-Bh1FtvZ1.js → _baseUniq-TeXEp9Tn.js} +1 -1
  12. package/dist/dashboard/assets/{ar-SA-G6X2FPQ2-B2U2zDyG.js → ar-SA-G6X2FPQ2-Da5wNUeW.js} +1 -1
  13. package/dist/dashboard/assets/{arc-CjP2r6kV.js → arc-NQuoeYrp.js} +1 -1
  14. package/dist/dashboard/assets/{architectureDiagram-Q4EWVU46-NKSTolLw.js → architectureDiagram-Q4EWVU46-B108azq_.js} +1 -1
  15. package/dist/dashboard/assets/{az-AZ-76LH7QW2-DVg6avJ2.js → az-AZ-76LH7QW2-cJYSsraO.js} +1 -1
  16. package/dist/dashboard/assets/{bg-BG-XCXSNQG7-DGe9j5k-.js → bg-BG-XCXSNQG7-Dt4_IvAk.js} +1 -1
  17. package/dist/dashboard/assets/{blockDiagram-DXYQGD6D-9TIN16so.js → blockDiagram-DXYQGD6D-HAo6Tqxd.js} +1 -1
  18. package/dist/dashboard/assets/{bn-BD-2XOGV67Q-gu4ZPvYK.js → bn-BD-2XOGV67Q-DE20hZpG.js} +1 -1
  19. package/dist/dashboard/assets/{c4Diagram-AHTNJAMY-CnCRm_Qw.js → c4Diagram-AHTNJAMY-SHRA5Nk_.js} +1 -1
  20. package/dist/dashboard/assets/{ca-ES-6MX7JW3Y-DkBWO2rb.js → ca-ES-6MX7JW3Y-9ZUzuDs-.js} +1 -1
  21. package/dist/dashboard/assets/channel-CIQg6WkP.js +1 -0
  22. package/dist/dashboard/assets/{chunk-4BX2VUAB-DWsjDEg5.js → chunk-4BX2VUAB-BlLy4y9z.js} +1 -1
  23. package/dist/dashboard/assets/{chunk-4TB4RGXK-BsxBp2-h.js → chunk-4TB4RGXK-cDLog-pk.js} +1 -1
  24. package/dist/dashboard/assets/{chunk-55IACEB6-DSTYhHTs.js → chunk-55IACEB6-BfLlL9Jv.js} +1 -1
  25. package/dist/dashboard/assets/{chunk-EDXVE4YY-9RDG5so7.js → chunk-EDXVE4YY-BjKTlHye.js} +1 -1
  26. package/dist/dashboard/assets/{chunk-FMBD7UC4-BQQGv7tV.js → chunk-FMBD7UC4-CoMoOB69.js} +1 -1
  27. package/dist/dashboard/assets/{chunk-OYMX7WX6-B62jTGjc.js → chunk-OYMX7WX6-DSYZ4BzO.js} +1 -1
  28. package/dist/dashboard/assets/{chunk-QZHKN3VN-CgTBTZrW.js → chunk-QZHKN3VN-hsCUyt37.js} +1 -1
  29. package/dist/dashboard/assets/{chunk-YZCP3GAM-3Dg1saYb.js → chunk-YZCP3GAM-CMBEUThQ.js} +1 -1
  30. package/dist/dashboard/assets/classDiagram-6PBFFD2Q-kJkUaIqm.js +1 -0
  31. package/dist/dashboard/assets/classDiagram-v2-HSJHXN6E-kJkUaIqm.js +1 -0
  32. package/dist/dashboard/assets/clone-COSoK5_M.js +1 -0
  33. package/dist/dashboard/assets/{cose-bilkent-S5V4N54A-B3idOsw5.js → cose-bilkent-S5V4N54A-Ds3A4r-y.js} +1 -1
  34. package/dist/dashboard/assets/{cs-CZ-2BRQDIVT-xyFkB9a5.js → cs-CZ-2BRQDIVT-WgNPbRaT.js} +1 -1
  35. package/dist/dashboard/assets/{da-DK-5WZEPLOC-B3hFYjJY.js → da-DK-5WZEPLOC-BQPVoqBy.js} +1 -1
  36. package/dist/dashboard/assets/{dagre-KV5264BT-BoSSN-hv.js → dagre-KV5264BT-D3AamC0s.js} +1 -1
  37. package/dist/dashboard/assets/{de-DE-XR44H4JA-Bkx00nEq.js → de-DE-XR44H4JA-FOMlLeg-.js} +1 -1
  38. package/dist/dashboard/assets/{diagram-5BDNPKRD-Buj8iksu.js → diagram-5BDNPKRD-DeAuY_LW.js} +1 -1
  39. package/dist/dashboard/assets/{diagram-G4DWMVQ6-DRBYjDWl.js → diagram-G4DWMVQ6-CsPuBl6m.js} +1 -1
  40. package/dist/dashboard/assets/{diagram-MMDJMWI5-DdlofmeO.js → diagram-MMDJMWI5-Celrp7iZ.js} +1 -1
  41. package/dist/dashboard/assets/{diagram-TYMM5635-C8y8IvnA.js → diagram-TYMM5635-D-Y8kdqj.js} +1 -1
  42. package/dist/dashboard/assets/{el-GR-BZB4AONW-SsFgxQNu.js → el-GR-BZB4AONW-DdhrZvUu.js} +1 -1
  43. package/dist/dashboard/assets/{erDiagram-SMLLAGMA-OZ3J3PG9.js → erDiagram-SMLLAGMA-CyPB81Ul.js} +1 -1
  44. package/dist/dashboard/assets/{es-ES-U4NZUMDT-BInO41Bx.js → es-ES-U4NZUMDT-B-Hbpc6c.js} +1 -1
  45. package/dist/dashboard/assets/{eu-ES-A7QVB2H4-DjjnJ8cU.js → eu-ES-A7QVB2H4-CIeXN6PD.js} +1 -1
  46. package/dist/dashboard/assets/{fa-IR-HGAKTJCU-BjCsO05-.js → fa-IR-HGAKTJCU-BojqXzkR.js} +1 -1
  47. package/dist/dashboard/assets/{fi-FI-Z5N7JZ37-kAJ6_O9R.js → fi-FI-Z5N7JZ37-Dix2X0V9.js} +1 -1
  48. package/dist/dashboard/assets/{flowDiagram-DWJPFMVM-BvvULyyH.js → flowDiagram-DWJPFMVM-D7IX0DxI.js} +1 -1
  49. package/dist/dashboard/assets/{fr-FR-RHASNOE6-CrZukXCy.js → fr-FR-RHASNOE6-B-jqOA6L.js} +1 -1
  50. package/dist/dashboard/assets/{ganttDiagram-T4ZO3ILL-Sv7sneaT.js → ganttDiagram-T4ZO3ILL-CbK6p7_G.js} +1 -1
  51. package/dist/dashboard/assets/{gitGraphDiagram-UUTBAWPF-BWplv5am.js → gitGraphDiagram-UUTBAWPF-DWDwNpLK.js} +1 -1
  52. package/dist/dashboard/assets/{gl-ES-HMX3MZ6V-CY3NLwyQ.js → gl-ES-HMX3MZ6V-B6zmZpsw.js} +1 -1
  53. package/dist/dashboard/assets/{graph-DU5PqGxo.js → graph-CrDZc6w0.js} +1 -1
  54. package/dist/dashboard/assets/{he-IL-6SHJWFNN-DcuQngSU.js → he-IL-6SHJWFNN-CaSPpOxb.js} +1 -1
  55. package/dist/dashboard/assets/{hi-IN-IWLTKZ5I-DKr_uuss.js → hi-IN-IWLTKZ5I-n86mXoF4.js} +1 -1
  56. package/dist/dashboard/assets/{hu-HU-A5ZG7DT2-CgZklxQN.js → hu-HU-A5ZG7DT2-MqIG43UE.js} +1 -1
  57. package/dist/dashboard/assets/{id-ID-SAP4L64H-BFYAclqc.js → id-ID-SAP4L64H-DbrGiOFJ.js} +1 -1
  58. package/dist/dashboard/assets/index-D1nedbBU.css +1 -0
  59. package/dist/dashboard/assets/index-DjaqCcd7.js +482 -0
  60. package/dist/dashboard/assets/{index-DhbH7HLB.js → index-zJ2-S49k.js} +1 -1
  61. package/dist/dashboard/assets/{infoDiagram-42DDH7IO-DcL21hYD.js → infoDiagram-42DDH7IO-CpAQyAyt.js} +1 -1
  62. package/dist/dashboard/assets/{ishikawaDiagram-UXIWVN3A-CP4-Ha6a.js → ishikawaDiagram-UXIWVN3A-DXIwINgb.js} +1 -1
  63. package/dist/dashboard/assets/{it-IT-JPQ66NNP-DgbO8z_0.js → it-IT-JPQ66NNP-IX1Td9Wl.js} +1 -1
  64. package/dist/dashboard/assets/{ja-JP-DBVTYXUO-2nM4bVbo.js → ja-JP-DBVTYXUO-Bd8nX8VR.js} +1 -1
  65. package/dist/dashboard/assets/{journeyDiagram-VCZTEJTY-CZV9JSbl.js → journeyDiagram-VCZTEJTY-DZlgujgy.js} +1 -1
  66. package/dist/dashboard/assets/{kaa-6HZHGXH3-DyVkacqp.js → kaa-6HZHGXH3-D5xD9fsf.js} +1 -1
  67. package/dist/dashboard/assets/{kab-KAB-ZGHBKWFO-CqnQNV46.js → kab-KAB-ZGHBKWFO-xBaAbT-9.js} +1 -1
  68. package/dist/dashboard/assets/{kanban-definition-6JOO6SKY-CMFYpVon.js → kanban-definition-6JOO6SKY-0klC865z.js} +1 -1
  69. package/dist/dashboard/assets/{kk-KZ-P5N5QNE5-CKaF_obh.js → kk-KZ-P5N5QNE5-CboXRRre.js} +1 -1
  70. package/dist/dashboard/assets/{km-KH-HSX4SM5Z-DX5TUZuC.js → km-KH-HSX4SM5Z-Clsilmtp.js} +1 -1
  71. package/dist/dashboard/assets/{ko-KR-MTYHY66A-DX2Igsee.js → ko-KR-MTYHY66A-CIjzZcRO.js} +1 -1
  72. package/dist/dashboard/assets/{ku-TR-6OUDTVRD-B0tZGs6G.js → ku-TR-6OUDTVRD-Bs1RU4e9.js} +1 -1
  73. package/dist/dashboard/assets/{layout-3g_7BoW1.js → layout-fipBctpD.js} +1 -1
  74. package/dist/dashboard/assets/{linear-CXZ_mpWm.js → linear-DVXXJr0u.js} +1 -1
  75. package/dist/dashboard/assets/{lt-LT-XHIRWOB4-BzCZwLwu.js → lt-LT-XHIRWOB4-CQ-xLU_o.js} +1 -1
  76. package/dist/dashboard/assets/{lv-LV-5QDEKY6T-Dn-Fj6_V.js → lv-LV-5QDEKY6T-C0inT4d9.js} +1 -1
  77. package/dist/dashboard/assets/{min-bJtV9AiD.js → min-B_cNy5kS.js} +1 -1
  78. package/dist/dashboard/assets/{mindmap-definition-QFDTVHPH-Dz61NELW.js → mindmap-definition-QFDTVHPH-Cioz1NOY.js} +1 -1
  79. package/dist/dashboard/assets/{mr-IN-CRQNXWMA-D8KTtR8X.js → mr-IN-CRQNXWMA-DhEHYUYK.js} +1 -1
  80. package/dist/dashboard/assets/{my-MM-5M5IBNSE-BbCYwFaj.js → my-MM-5M5IBNSE-Dj4Iwdrf.js} +1 -1
  81. package/dist/dashboard/assets/{nb-NO-T6EIAALU-DEJxZlzk.js → nb-NO-T6EIAALU-CvAPy7iN.js} +1 -1
  82. package/dist/dashboard/assets/{nl-NL-IS3SIHDZ-DTQekKhh.js → nl-NL-IS3SIHDZ-DgQc3gPO.js} +1 -1
  83. package/dist/dashboard/assets/{nn-NO-6E72VCQL-Otz1_Q7Y.js → nn-NO-6E72VCQL-DORPUv8K.js} +1 -1
  84. package/dist/dashboard/assets/{oc-FR-POXYY2M6-BO1pOtcy.js → oc-FR-POXYY2M6-Cym9O8Me.js} +1 -1
  85. package/dist/dashboard/assets/{pa-IN-N4M65BXN-o_zcafD8.js → pa-IN-N4M65BXN-BiE5SCOy.js} +1 -1
  86. package/dist/dashboard/assets/percentages-BXMCSKIN-B-_e8Y6s.js +215 -0
  87. package/dist/dashboard/assets/percentages-BXMCSKIN-DnMnD4LF.css +1 -0
  88. package/dist/dashboard/assets/{pica-B0_4dS6Q.js → pica-C5ISA_oR.js} +1 -1
  89. package/dist/dashboard/assets/{pieDiagram-DEJITSTG-CMwhT31D.js → pieDiagram-DEJITSTG-CD7iu1Mo.js} +1 -1
  90. package/dist/dashboard/assets/{pl-PL-T2D74RX3-CvJKdZLx.js → pl-PL-T2D74RX3-C-29ZIfD.js} +1 -1
  91. package/dist/dashboard/assets/{pt-BR-5N22H2LF-DH69aomh.js → pt-BR-5N22H2LF-CIQq615m.js} +1 -1
  92. package/dist/dashboard/assets/{pt-PT-UZXXM6DQ-Bt_HMT7S.js → pt-PT-UZXXM6DQ-CN7xbXrH.js} +1 -1
  93. package/dist/dashboard/assets/{quadrantDiagram-34T5L4WZ-BdXgbSGH.js → quadrantDiagram-34T5L4WZ-DEPkZ_lv.js} +1 -1
  94. package/dist/dashboard/assets/{requirementDiagram-MS252O5E-Bq0YQege.js → requirementDiagram-MS252O5E-BpAjr03x.js} +1 -1
  95. package/dist/dashboard/assets/{ro-RO-JPDTUUEW-DetQ1m4p.js → ro-RO-JPDTUUEW-DBtenXzw.js} +1 -1
  96. package/dist/dashboard/assets/{ru-RU-B4JR7IUQ-B744z7Cd.js → ru-RU-B4JR7IUQ-CA_iHOeh.js} +1 -1
  97. package/dist/dashboard/assets/{sankeyDiagram-XADWPNL6-CTYt5Kku.js → sankeyDiagram-XADWPNL6-B1zLPVle.js} +1 -1
  98. package/dist/dashboard/assets/{sequenceDiagram-FGHM5R23-BbPhy9K6.js → sequenceDiagram-FGHM5R23-pEX8i9B5.js} +1 -1
  99. package/dist/dashboard/assets/{si-LK-N5RQ5JYF-DueeMRG5.js → si-LK-N5RQ5JYF-BTsFn4Rn.js} +1 -1
  100. package/dist/dashboard/assets/{sk-SK-C5VTKIMK-BivWC8UI.js → sk-SK-C5VTKIMK-DGoN-I5B.js} +1 -1
  101. package/dist/dashboard/assets/{sl-SI-NN7IZMDC-CHxsSSJQ.js → sl-SI-NN7IZMDC-CwiRr92B.js} +1 -1
  102. package/dist/dashboard/assets/{stateDiagram-FHFEXIEX-DAPXkQkR.js → stateDiagram-FHFEXIEX-W_EdYNVF.js} +1 -1
  103. package/dist/dashboard/assets/stateDiagram-v2-QKLJ7IA2-BsdphuJ6.js +1 -0
  104. package/dist/dashboard/assets/{subset-shared.chunk-CxWeBga7.js → subset-shared.chunk-CAlKIepB.js} +1 -1
  105. package/dist/dashboard/assets/{subset-worker.chunk-V3gpxiYs.js → subset-worker.chunk-YIXEPnjQ.js} +1 -1
  106. package/dist/dashboard/assets/{sv-SE-XGPEYMSR-C-EJgqb-.js → sv-SE-XGPEYMSR-7SNur8Fe.js} +1 -1
  107. package/dist/dashboard/assets/{ta-IN-2NMHFXQM-DAjiKKkH.js → ta-IN-2NMHFXQM-DqQBCB2J.js} +1 -1
  108. package/dist/dashboard/assets/{th-TH-HPSO5L25-Bq7BADtY.js → th-TH-HPSO5L25-ClwEsAak.js} +1 -1
  109. package/dist/dashboard/assets/{timeline-definition-GMOUNBTQ-BJhY_iVV.js → timeline-definition-GMOUNBTQ-uPtwwnY7.js} +1 -1
  110. package/dist/dashboard/assets/{tr-TR-DEFEU3FU--adx_Tct.js → tr-TR-DEFEU3FU-DmCg5qbG.js} +1 -1
  111. package/dist/dashboard/assets/{uk-UA-QMV73CPH-DfnkGhht.js → uk-UA-QMV73CPH-DixKG8eB.js} +1 -1
  112. package/dist/dashboard/assets/{vennDiagram-DHZGUBPP-BpuWdXIB.js → vennDiagram-DHZGUBPP-CAggDlIj.js} +1 -1
  113. package/dist/dashboard/assets/{vi-VN-M7AON7JQ-RQSwYL0s.js → vi-VN-M7AON7JQ-C15Za2rn.js} +1 -1
  114. package/dist/dashboard/assets/{wardley-RL74JXVD-BuB77QmE.js → wardley-RL74JXVD-D5C_gWsf.js} +1 -1
  115. package/dist/dashboard/assets/{wardleyDiagram-NUSXRM2D-BomUXaGE.js → wardleyDiagram-NUSXRM2D-tqYHOmfO.js} +1 -1
  116. package/dist/dashboard/assets/{xychartDiagram-5P7HB3ND-BueWOzBo.js → xychartDiagram-5P7HB3ND-CsxZKm-V.js} +1 -1
  117. package/dist/dashboard/assets/{zh-CN-LNUGB5OW-Bq_CyCdn.js → zh-CN-LNUGB5OW-BhlF39b5.js} +1 -1
  118. package/dist/dashboard/assets/{zh-HK-E62DVLB3-dhMk2wl1.js → zh-HK-E62DVLB3-P2FWmB4w.js} +1 -1
  119. package/dist/dashboard/assets/{zh-TW-RAJ6MFWO-BTBKc5WB.js → zh-TW-RAJ6MFWO-B0yB1dNp.js} +1 -1
  120. package/dist/dashboard/index.html +2 -2
  121. package/dist/index.js +12112 -5241
  122. package/dist/skill-packs/excalidraw/SKILL.md +19 -4
  123. package/package.json +1 -1
  124. package/skill/SKILL.md +34 -16
  125. package/skill-packs/excalidraw/SKILL.md +19 -4
  126. package/dist/dashboard/assets/channel-CvynutAQ.js +0 -1
  127. package/dist/dashboard/assets/classDiagram-6PBFFD2Q-DWhdz8wj.js +0 -1
  128. package/dist/dashboard/assets/classDiagram-v2-HSJHXN6E-DWhdz8wj.js +0 -1
  129. package/dist/dashboard/assets/clone-DJK7V3ll.js +0 -1
  130. package/dist/dashboard/assets/index-CPZ-rEGO.js +0 -480
  131. package/dist/dashboard/assets/index-DrwAz5zg.css +0 -1
  132. package/dist/dashboard/assets/percentages-BXMCSKIN-C9aZbplb.js +0 -215
  133. package/dist/dashboard/assets/stateDiagram-v2-QKLJ7IA2-ZA5uLv7f.js +0 -1
@@ -231,13 +231,28 @@ _dream_context/knowledge/diagrams/
231
231
  │ ├── my-board.excalidraw.md ← generated board (do NOT hand-edit scene JSON)
232
232
  │ ├── my-board.board.cjs ← generator (dark sibling — excluded from index/recall)
233
233
  │ └── my-board.json ← spec / source of truth (dark sibling — excluded)
234
+ ├── competitors/ ← optional category subfolder (groups many boards)
235
+ │ └── acme/
236
+ │ └── acme.excalidraw.md
234
237
  └── legacy-flat.excalidraw.md ← flat layout still works; no forced migration
235
238
  ```
236
239
 
237
- **Dark siblings**: any file inside a `diagrams/<title>/` folder that is NOT the board itself
238
- is automatically excluded from the index, recall corpus, snapshot, and dashboard list.
239
- This includes generator scripts (`.board.cjs`), spec JSON, and any helper `.md` notes.
240
- They are tooling they do not pollute memory.
240
+ **Category subfolders** are optional and free-form: `diagrams/<category>/<title>/<title>.excalidraw.md`.
241
+ The dashboard Knowledge view renders the whole `diagrams/` subtree as a nested, collapsible folder
242
+ tree (each board shows a sketch icon), so a large diagram set stays navigable instead of collapsing
243
+ into one flat list. A board's own `<title>/` folder is always its innermost folder. Note: a
244
+ `.board.cjs` that `require()`s shared helpers by relative path must use a depth that matches its
245
+ actual location.
246
+
247
+ **Dark siblings**: tooling files inside a `diagrams/<title>/` folder are automatically excluded
248
+ from the index, recall corpus, snapshot, and dashboard list — generator scripts (`.board.cjs`),
249
+ spec JSON, and frontmatter-less helper `.md` notes. They are tooling — they do not pollute memory.
250
+
251
+ **Companion knowledge is the exception**: a `.md` beside a board that carries `name:` frontmatter
252
+ is indexed as first-class knowledge (not a dark sibling). This lets you co-locate a board with its
253
+ detailed write-up — e.g. `acme/acme.excalidraw.md` next to `acme/acme.teardown.md` — and have the
254
+ teardown recall normally. Only frontmatter-less notes stay dark, so good organization no longer
255
+ costs you recall.
241
256
 
242
257
  **Flat layout** (`diagrams/<title>.excalidraw.md`) works without any migration. Use the
243
258
  per-title folder when you want to keep the board + generator + spec together cleanly.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dreamcontext",
3
- "version": "0.8.5",
3
+ "version": "0.8.7",
4
4
  "description": "dreamcontext — the persistent brain for your AI agents. Remembers what you built, knows how your project works.",
5
5
  "type": "module",
6
6
  "bin": {
package/skill/SKILL.md CHANGED
@@ -319,7 +319,7 @@ Sleep debt reminders are injected on every user message (via UserPromptSubmit ho
319
319
  - user hint mentions knowledge or a feature
320
320
  - When unsure, **over-fire** `sleep-product` — it no-ops cheaply.
321
321
  - **Conditional fire**: `sleep-migration` when `dreamcontext migrations pending` produces output (pending agent migration tasks exist). Contract: no-content changes only (structure/paths/frontmatter/fences); writes ledger via `dreamcontext migrations record` on completion.
322
- - **Conditional fire**: `sleep-federation` when `state/.connections.json` has active (non-stale) links OR the federation inbox has pending entries (check `dreamcontext federation status`). Contract: **drain THEN distribute** `dreamcontext federation drain` (ingest peer digests into first-class `knowledge/*--from-*.md` with `federated:true` provenance, surface conflict-notes as bookmarks, never auto-resolve) then `dreamcontext federation sync` (consent-gated, recall-filtered push into connected peers' inboxes, watermark advances). Owns ONLY `.connections.json` + `.federation-inbox/` + `knowledge/*--from-*.md`. Idempotent over-fire cheaply.
322
+ - **Do NOT fire `sleep-federation`.** Federation is read-only (live reference); the copy-based drain/distribute path is disabled and parked on the roadmap. Sleep copies NOTHING across vault boundaries peers are read live at recall time, not synced at sleep. (The `sleep-federation` specialist + `federation sync`/`drain` are retained but inert.)
323
323
  - Pass each specialist a small text brief in its prompt: epoch, session IDs, active task slugs, planning version, signals relevant to that specialist, optional user hint. Do **not** include transcript content — specialists call `dreamcontext transcript distill <id>` themselves.
324
324
  - **Consolidation discipline (remind both specialists in the brief):** prefer *updating/extending* an existing entity over creating a new one. `sleep-tasks` folds a smaller slice into the task that already covers it (broaden its title + insert sub-items) rather than forking a duplicate or a needless sub-task; `sleep-product` keeps similar verticals/brands/topics in the fewest knowledge files, splitting only on a sharp topical boundary that sharpens tags. Duplicate tasks and fragmented near-duplicate knowledge are the top consolidation failure modes — but genuinely separate concerns/topics still get their own task/file.
325
325
  5. Wait for all specialist reports. Each returns a short structured report.
@@ -443,11 +443,13 @@ Excalidraw boards (`.excalidraw.md`) are first-class knowledge files. Two layout
443
443
 
444
444
  **Per-title folder** (preferred convention): `knowledge/diagrams/<title>/<title>.excalidraw.md`
445
445
 
446
+ **Optional category subfolder** (for many diagrams): group boards under a category, e.g. `knowledge/diagrams/<category>/<title>/<title>.excalidraw.md` (`diagrams/competitors/acme/acme.excalidraw.md`, `diagrams/system/recall/recall.excalidraw.md`). The dashboard Knowledge view renders these as a nested, collapsible folder tree, so categories stay navigable instead of collapsing into one flat Diagrams list. Nesting is free-form and any depth; the board still lives in its own `<title>/` folder. Generators that `require()` shared helpers via a relative path must account for the extra depth.
447
+
446
448
  Rules:
447
449
  - **REQUIRED frontmatter**: every board MUST have `name:` and `description:` fields. Boards with no `## Text Elements` section fall back to description-only recall — make it descriptive.
448
450
  - **Do NOT hand-edit scene JSON.** The `.excalidraw.md` file is generated output. Build a spec and run the generator (`.board.cjs`). Edit the spec, not the board.
449
451
  - **Spec is the source of truth.** If the spec and the board ever disagree, the spec wins. Commit both.
450
- - **Dark siblings**: all files inside a `knowledge/diagrams/<title>/` folder that are NOT the board itself (generator scripts `.board.cjs`, spec `.json`, helper `.md`) are excluded from the index, recall corpus, snapshot, and dashboard. They are tooling artifacts they do NOT surface in memory.
452
+ - **Dark siblings**: tooling files inside a `knowledge/diagrams/<title>/` folder generator scripts (`.board.cjs`), spec `.json`, and frontmatter-less helper `.md` are excluded from the index, recall corpus, snapshot, and dashboard. **Exception:** a companion `.md` that carries `name:` frontmatter is indexed as first-class knowledge, so you can co-locate a board with its detailed teardown (`acme/acme.excalidraw.md` + `acme/acme.teardown.md`) and have it recall normally. Only frontmatter-less notes stay dark.
451
453
  - **Memory indexes only frontmatter + ## Text Elements**: scene JSON, base64, and element ids are stripped before indexing. A 2 MB board with rich Text Elements is as searchable as a tiny board. The dashboard renderer still receives the raw body (with full scene JSON) via the detail API route.
452
454
  - **Migration is opt-in**: flat boards stay flat unless you explicitly ask for reorganization. Use `dreamcontext migrations pending` to see pending migration tasks; use `dreamcontext migrations apply-diagrams` to opt-in to organizing flat boards into per-title folders.
453
455
 
@@ -491,29 +493,45 @@ dreamcontext memory status
491
493
 
492
494
  ## Cross-Project Federation (issue #25)
493
495
 
494
- Every `_dream_context/` is normally an island. Federation lets you reach across projects — recall what you worked out in *another* vault — using nothing but the local filesystem (no network, ever). Phase 1 is **read-only**: discovery + cross-vault recall + peer snapshots.
496
+ Every `_dream_context/` is normally an island. Federation lets you reach across projects — recall what you worked out in *another* vault — using nothing but the local filesystem (no network, ever).
497
+
498
+ **Ambient awareness — you start informed.** The session snapshot includes a `## Connected projects` section listing each readable peer with a one-line description and last activity. At session start you already know which sibling projects exist and roughly what's in them. For an up-to-date summary on demand:
495
499
 
496
500
  ```bash
497
- dreamcontext vaults discover [root] [--register] # find every _dream_context/ under a tree (node_modules ignored, depth-bounded)
498
- dreamcontext memory recall <query...> --vault <name> # also search a peer vault (repeatable)
499
- dreamcontext memory recall <query...> --all-vaults # search current + every SHAREABLE registered vault
500
- dreamcontext memory recall <query...> --connected # search current + out/both connections (degenerate=local until Phase 2)
501
- dreamcontext snapshot --vault <name> # print a peer vault's context snapshot
502
- dreamcontext config shareable on|off # opt this project IN/OUT of peer recall (default: off)
501
+ dreamcontext federation peers # compact summary: what each peer is, last activity, active task, top tags
502
+ ```
503
+
504
+ **PULL — recall already spans peers.** Plain `memory recall` automatically searches readable peer vaults alongside the current one. No flag needed. You get up to 10 hits, vault-tagged `<vault>::<type>/<slug>` so provenance is always visible:
505
+
506
+ ```bash
507
+ dreamcontext memory recall "<query>" # current vault + all eligible readable peers (default)
508
+ dreamcontext memory recall "<query>" --vault <name> # current + one named peer (repeatable)
509
+ dreamcontext memory recall "<query>" --connected # current + out/both connections
510
+ dreamcontext memory recall "<query>" --all-vaults # current + every shareable vault
503
511
  ```
504
512
 
505
- **Trust model shareable gates READS, private by default.** A vault is invisible to peer recall until its owner runs `config shareable on`. New and migrated projects default to `shareable: false`. `shareable` is asymmetric: it controls whether OTHERS may pull *your* corpus — it never blocks *you* from reading a shareable peer, and the current vault is always searched regardless of its own flag. Non-shareable peers are silently excluded from `--all-vaults` (never an error). Cross-vault hits are namespaced `<vault>::<type>/<slug>` so the same slug in two vaults never collides.
513
+ Eligible = direction `out`/`both`, status not stale, AND the peer is `shareable: true`. If no eligible connections exist, recall is local-only (unchanged). A peer vault being `shareable` controls whether *others* may read it — it never blocks you from reading a shareable peer, and the current vault is always searched. Non-shareable peers are silently excluded (never an error). Cross-vault hits are namespaced `<vault>::<type>/<slug>` so the same slug in two vaults never collides.
506
514
 
507
- **When to reach across.** Use `--vault`/`--all-vaults` for "how did I solve this in project X?" / "did we already build Y somewhere?" before re-deriving knowledge that already exists in a sibling project.
515
+ Use `--vault <name>` when you know where the answer likely lives; the default span is the cheapest path when you don't.
508
516
 
509
- **Per-link connections (Phase 2).** `dreamcontext connect <vault> --direction out|in|both [--topics a,b]` builds an outgoing mesh in `state/.connections.json`; `connections list` / `disconnect <vault>` manage it. Direction is asymmetric: `out` = your digest may flow TO the peer, `in` = you accept the peer's digest, `both` = bidirectional. The dashboard Settings Cross-Project Federation card edits all of this plus the shareable switch.
517
+ **Read-only nothing is ever copied.** Federation is a *live reference*: a connected, shareable peer's CANONICAL docs are surfaced at recall time (PULL, above) and never written into your vault. Each vault stays the single source of truth for its own knowledge. There is no per-situation "when to read" rule a connection is a standing "may read" agreement, resolved live by recall whenever it's relevant.
510
518
 
511
- **Sleep-driven digest inbox (Phase 3).** Federated knowledge crosses a boundary as a *directory of one-file-per-entry JSON digests* under `state/.federation-inbox/` (consumed entries archive to `consumed/`). The `sleep-federation` specialist runs two idempotent steps, ALWAYS in this order:
519
+ ```bash
520
+ dreamcontext vaults discover [root] [--register] # find every _dream_context/ under a tree
521
+ dreamcontext connect <vault> --direction out [--topics a,b] # create a read edge (out = read)
522
+ dreamcontext connections list / disconnect <vault> # manage links
523
+ dreamcontext snapshot --vault <name> # print a peer vault's context snapshot
524
+ dreamcontext config shareable on|off # opt this project IN/OUT of peer recall (default: off)
525
+ ```
512
526
 
513
- 1. **Drain** (`dreamcontext federation drain`) ingest each pending inbox entry as **first-class** local `knowledge/<slug>.md` carrying `federated: true` + `origin{vault,entryId,sourceTimestamp}` provenance. A slug collision lands at `knowledge/<slug>--from-<vault>.md` (the local doc is never clobbered). A `conflict-note` entry is ingested AND surfaced as a bookmark for the user never auto-resolved. Version-incompatible entries are quarantined in place.
514
- 2. **Distribute** (`dreamcontext federation sync`) — for each `out`/`both` connection, the sender reads the RECEIVER's `.connections.json` and writes ONLY if the receiver declares `in`/`both` back (the **consent rule**); it computes a recall-filtered digest since `last_synced_at`, writes one file per entry into the peer's inbox, and advances the watermark. Draining first means freshly-ingested peer knowledge is in the corpus when the outbound digest is computed — and is then EXCLUDED from it, because `federated: true` docs are dropped from BOTH digest computation AND cross-vault recall serving (the transitive-leak guard: a third vault never sees what merely passed through this one). Filename dedup + watermark + that exclusion make an A↔B cycle echo-free.
527
+ **Copy-based sync is parked on the roadmap.** Earlier builds pushed a lossy, truncated *digest* of each vault into its peers at sleep (`federation sync`) and ingested it as `federated: true` copies (`federation drain`). That broke single-source-of-truth: copies were write-once, went stale the moment the source changed, and an edit produced duplicates + false conflict-notes. It is now **disabled** `federation sync` / `federation drain` are inert no-ops, and the `sleep-federation` specialist is no longer dispatched. Re-introducing a copy/offline-mirror mode needs a proper design first (it's the one thing live read can't do: survive a peer going offline).
515
528
 
516
- The SessionStart snapshot stays on the hot path: it only ever does a single local `pendingInboxCount` readdir to nudge "N pending peer digests — drain them"; it NEVER resolves a peer or builds a peer corpus. Dashboard previews via `POST /api/federation/sync` are **dry-run by construction** (no write function reachable from any server route).
529
+ **Cleaning up old copies.** If a vault still holds `federated: true` knowledge files from the old sync path, remove them deliberately:
530
+ ```bash
531
+ dreamcontext federation status # shows connections + any leftover federated copies
532
+ dreamcontext federation purge --all # remove every federated:true copy in this vault
533
+ dreamcontext federation purge --vault <name> # remove only copies that came from one peer
534
+ ```
517
535
 
518
536
  ---
519
537
 
@@ -231,13 +231,28 @@ _dream_context/knowledge/diagrams/
231
231
  │ ├── my-board.excalidraw.md ← generated board (do NOT hand-edit scene JSON)
232
232
  │ ├── my-board.board.cjs ← generator (dark sibling — excluded from index/recall)
233
233
  │ └── my-board.json ← spec / source of truth (dark sibling — excluded)
234
+ ├── competitors/ ← optional category subfolder (groups many boards)
235
+ │ └── acme/
236
+ │ └── acme.excalidraw.md
234
237
  └── legacy-flat.excalidraw.md ← flat layout still works; no forced migration
235
238
  ```
236
239
 
237
- **Dark siblings**: any file inside a `diagrams/<title>/` folder that is NOT the board itself
238
- is automatically excluded from the index, recall corpus, snapshot, and dashboard list.
239
- This includes generator scripts (`.board.cjs`), spec JSON, and any helper `.md` notes.
240
- They are tooling they do not pollute memory.
240
+ **Category subfolders** are optional and free-form: `diagrams/<category>/<title>/<title>.excalidraw.md`.
241
+ The dashboard Knowledge view renders the whole `diagrams/` subtree as a nested, collapsible folder
242
+ tree (each board shows a sketch icon), so a large diagram set stays navigable instead of collapsing
243
+ into one flat list. A board's own `<title>/` folder is always its innermost folder. Note: a
244
+ `.board.cjs` that `require()`s shared helpers by relative path must use a depth that matches its
245
+ actual location.
246
+
247
+ **Dark siblings**: tooling files inside a `diagrams/<title>/` folder are automatically excluded
248
+ from the index, recall corpus, snapshot, and dashboard list — generator scripts (`.board.cjs`),
249
+ spec JSON, and frontmatter-less helper `.md` notes. They are tooling — they do not pollute memory.
250
+
251
+ **Companion knowledge is the exception**: a `.md` beside a board that carries `name:` frontmatter
252
+ is indexed as first-class knowledge (not a dark sibling). This lets you co-locate a board with its
253
+ detailed write-up — e.g. `acme/acme.excalidraw.md` next to `acme/acme.teardown.md` — and have the
254
+ teardown recall normally. Only frontmatter-less notes stay dark, so good organization no longer
255
+ costs you recall.
241
256
 
242
257
  **Flat layout** (`diagrams/<title>.excalidraw.md`) works without any migration. Use the
243
258
  per-title folder when you want to keep the board + generator + spec together cleanly.
@@ -1 +0,0 @@
1
- import{aq as o,ar as n}from"./index-CPZ-rEGO.js";const t=(r,a)=>o.lang.round(n.parse(r)[a]);export{t as c};
@@ -1 +0,0 @@
1
- import{s as a,c as s,a as e,C as t}from"./chunk-4TB4RGXK-BsxBp2-h.js";import{_ as i}from"./index-CPZ-rEGO.js";import"./chunk-FMBD7UC4-BQQGv7tV.js";import"./chunk-YZCP3GAM-3Dg1saYb.js";import"./chunk-55IACEB6-DSTYhHTs.js";import"./chunk-EDXVE4YY-9RDG5so7.js";var u={parser:e,get db(){return new t},renderer:s,styles:a,init:i(r=>{r.class||(r.class={}),r.class.arrowMarkerAbsolute=r.arrowMarkerAbsolute},"init")};export{u as diagram};
@@ -1 +0,0 @@
1
- import{s as a,c as s,a as e,C as t}from"./chunk-4TB4RGXK-BsxBp2-h.js";import{_ as i}from"./index-CPZ-rEGO.js";import"./chunk-FMBD7UC4-BQQGv7tV.js";import"./chunk-YZCP3GAM-3Dg1saYb.js";import"./chunk-55IACEB6-DSTYhHTs.js";import"./chunk-EDXVE4YY-9RDG5so7.js";var u={parser:e,get db(){return new t},renderer:s,styles:a,init:i(r=>{r.class||(r.class={}),r.class.arrowMarkerAbsolute=r.arrowMarkerAbsolute},"init")};export{u as diagram};
@@ -1 +0,0 @@
1
- import{b as r}from"./graph-DU5PqGxo.js";var e=4;function a(o){return r(o,e)}export{a as c};