dreamcontext 0.10.6 → 0.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (154) hide show
  1. package/README.md +80 -0
  2. package/agents/curator-auditor.md +1 -1
  3. package/agents/curator-verifier.md +3 -3
  4. package/agents/curator-worker.md +1 -1
  5. package/agents/sleep-federation.md +1 -1
  6. package/agents/sleep-migration.md +1 -1
  7. package/agents/sleep-product.md +10 -9
  8. package/agents/sleep-state.md +1 -1
  9. package/agents/sleep-tasks.md +9 -5
  10. package/dist/agents/curator-auditor.md +1 -1
  11. package/dist/agents/curator-verifier.md +3 -3
  12. package/dist/agents/curator-worker.md +1 -1
  13. package/dist/agents/sleep-federation.md +1 -1
  14. package/dist/agents/sleep-migration.md +1 -1
  15. package/dist/agents/sleep-product.md +10 -9
  16. package/dist/agents/sleep-state.md +1 -1
  17. package/dist/agents/sleep-tasks.md +9 -5
  18. package/dist/dashboard/assets/{BrainCanvas3D-8hG96aAi.js → BrainCanvas3D-mZCAQwGS.js} +1 -1
  19. package/dist/dashboard/assets/{_baseUniq-b4AibH2-.js → _baseUniq-BUxsWVsL.js} +1 -1
  20. package/dist/dashboard/assets/{ar-SA-G6X2FPQ2-DpGPIe5Z.js → ar-SA-G6X2FPQ2-CccKfvbE.js} +1 -1
  21. package/dist/dashboard/assets/{arc-BHNPUsz3.js → arc-DKUqFYZl.js} +1 -1
  22. package/dist/dashboard/assets/{architectureDiagram-Q4EWVU46-IzEd_B2U.js → architectureDiagram-Q4EWVU46-4WGtSdey.js} +1 -1
  23. package/dist/dashboard/assets/{az-AZ-76LH7QW2-Ccf6e1ON.js → az-AZ-76LH7QW2-C-NroZco.js} +1 -1
  24. package/dist/dashboard/assets/{bg-BG-XCXSNQG7-XnDUjubv.js → bg-BG-XCXSNQG7-rQaoynHO.js} +1 -1
  25. package/dist/dashboard/assets/{blockDiagram-DXYQGD6D-CEINLAFi.js → blockDiagram-DXYQGD6D-DFuSTaR5.js} +1 -1
  26. package/dist/dashboard/assets/{bn-BD-2XOGV67Q-E9FzPBnu.js → bn-BD-2XOGV67Q-D7R-v0tl.js} +1 -1
  27. package/dist/dashboard/assets/{c4Diagram-AHTNJAMY-VrHpmy8U.js → c4Diagram-AHTNJAMY-BJ_6YYYT.js} +1 -1
  28. package/dist/dashboard/assets/{ca-ES-6MX7JW3Y-Cnp7YBQb.js → ca-ES-6MX7JW3Y-dsbdYGPx.js} +1 -1
  29. package/dist/dashboard/assets/channel-CIIBmX-d.js +1 -0
  30. package/dist/dashboard/assets/{chunk-4BX2VUAB-CuueCQHq.js → chunk-4BX2VUAB-HJLHjOrd.js} +1 -1
  31. package/dist/dashboard/assets/{chunk-4TB4RGXK-BhlZWQoi.js → chunk-4TB4RGXK-DjvoLiQ0.js} +1 -1
  32. package/dist/dashboard/assets/{chunk-55IACEB6-ClixcVTq.js → chunk-55IACEB6-D-m72jvC.js} +1 -1
  33. package/dist/dashboard/assets/{chunk-EDXVE4YY-DUj1uWsJ.js → chunk-EDXVE4YY-BCjmEpM7.js} +1 -1
  34. package/dist/dashboard/assets/{chunk-FMBD7UC4-BZClSbG6.js → chunk-FMBD7UC4-DDlvS1yz.js} +1 -1
  35. package/dist/dashboard/assets/{chunk-OYMX7WX6-CMMXG2K9.js → chunk-OYMX7WX6-DYJRxE9t.js} +1 -1
  36. package/dist/dashboard/assets/{chunk-QZHKN3VN-CI5x9wkp.js → chunk-QZHKN3VN-B76yDzg6.js} +1 -1
  37. package/dist/dashboard/assets/{chunk-YZCP3GAM-DnpOMFO-.js → chunk-YZCP3GAM-CZjAdM3g.js} +1 -1
  38. package/dist/dashboard/assets/classDiagram-6PBFFD2Q-BmFrdEQk.js +1 -0
  39. package/dist/dashboard/assets/classDiagram-v2-HSJHXN6E-BmFrdEQk.js +1 -0
  40. package/dist/dashboard/assets/clone-CNozcEzk.js +1 -0
  41. package/dist/dashboard/assets/{cose-bilkent-S5V4N54A-C9xnvFgj.js → cose-bilkent-S5V4N54A-CbVNpzeg.js} +1 -1
  42. package/dist/dashboard/assets/{cs-CZ-2BRQDIVT-BHebgNbB.js → cs-CZ-2BRQDIVT-J9uouZQt.js} +1 -1
  43. package/dist/dashboard/assets/{da-DK-5WZEPLOC-DYuNSWM8.js → da-DK-5WZEPLOC-CEwRNThM.js} +1 -1
  44. package/dist/dashboard/assets/{dagre-KV5264BT-Ck8mmM53.js → dagre-KV5264BT-bTITGm1T.js} +1 -1
  45. package/dist/dashboard/assets/{de-DE-XR44H4JA-CMw5lMuT.js → de-DE-XR44H4JA-__KY_QPB.js} +1 -1
  46. package/dist/dashboard/assets/{diagram-5BDNPKRD-L4erno22.js → diagram-5BDNPKRD-CMb_WZII.js} +1 -1
  47. package/dist/dashboard/assets/{diagram-G4DWMVQ6-Dkmwa2-B.js → diagram-G4DWMVQ6-ebqTPDMj.js} +1 -1
  48. package/dist/dashboard/assets/{diagram-MMDJMWI5-v2PnfbZO.js → diagram-MMDJMWI5-dtIkfYIv.js} +1 -1
  49. package/dist/dashboard/assets/{diagram-TYMM5635-1ZO4tNjc.js → diagram-TYMM5635-BhtWl36c.js} +1 -1
  50. package/dist/dashboard/assets/{el-GR-BZB4AONW-PXD8ArOs.js → el-GR-BZB4AONW-CYkyOlmf.js} +1 -1
  51. package/dist/dashboard/assets/{erDiagram-SMLLAGMA-B8gV0kGN.js → erDiagram-SMLLAGMA-DcDH5wz0.js} +1 -1
  52. package/dist/dashboard/assets/{es-ES-U4NZUMDT-CbfskKe2.js → es-ES-U4NZUMDT-Bu5LUk6U.js} +1 -1
  53. package/dist/dashboard/assets/{eu-ES-A7QVB2H4-iqrfeyOI.js → eu-ES-A7QVB2H4-IlNi4UGh.js} +1 -1
  54. package/dist/dashboard/assets/{fa-IR-HGAKTJCU-PzU2OiC1.js → fa-IR-HGAKTJCU-Jyt7rkFV.js} +1 -1
  55. package/dist/dashboard/assets/{fi-FI-Z5N7JZ37-CbFLdQ9f.js → fi-FI-Z5N7JZ37-Cqcoli78.js} +1 -1
  56. package/dist/dashboard/assets/{flowDiagram-DWJPFMVM-CKx3j3bI.js → flowDiagram-DWJPFMVM-B3iy-L85.js} +1 -1
  57. package/dist/dashboard/assets/{fr-FR-RHASNOE6-BuF2MviY.js → fr-FR-RHASNOE6-IKVJ17C4.js} +1 -1
  58. package/dist/dashboard/assets/{ganttDiagram-T4ZO3ILL-CAbTd_KO.js → ganttDiagram-T4ZO3ILL-UKhI0SVC.js} +1 -1
  59. package/dist/dashboard/assets/{gitGraphDiagram-UUTBAWPF-Di7htCsA.js → gitGraphDiagram-UUTBAWPF-D-GWZW87.js} +1 -1
  60. package/dist/dashboard/assets/{gl-ES-HMX3MZ6V-BqePaODm.js → gl-ES-HMX3MZ6V-C3efiprZ.js} +1 -1
  61. package/dist/dashboard/assets/{graph-CC7SYwBm.js → graph-BFYZl1aj.js} +1 -1
  62. package/dist/dashboard/assets/{he-IL-6SHJWFNN-w9d4AvyL.js → he-IL-6SHJWFNN-BsFohTT8.js} +1 -1
  63. package/dist/dashboard/assets/{hi-IN-IWLTKZ5I-BwHo17vR.js → hi-IN-IWLTKZ5I-Cdag_2yp.js} +1 -1
  64. package/dist/dashboard/assets/{hu-HU-A5ZG7DT2-Dm80xRge.js → hu-HU-A5ZG7DT2-CybG-BTD.js} +1 -1
  65. package/dist/dashboard/assets/{id-ID-SAP4L64H-RpPM18i0.js → id-ID-SAP4L64H-sH8BmLkx.js} +1 -1
  66. package/dist/dashboard/assets/index-C2R7Is0-.js +516 -0
  67. package/dist/dashboard/assets/{index-sA_NxF_Y.js → index-D724s9RT.js} +1 -1
  68. package/dist/dashboard/assets/index-NsrznfmA.js +1 -0
  69. package/dist/dashboard/assets/index-d0njwauj.css +32 -0
  70. package/dist/dashboard/assets/{infoDiagram-42DDH7IO-z-1I4Qyj.js → infoDiagram-42DDH7IO-D4tIVELa.js} +1 -1
  71. package/dist/dashboard/assets/{ishikawaDiagram-UXIWVN3A-DWGoVsQO.js → ishikawaDiagram-UXIWVN3A-C3kfQJPs.js} +1 -1
  72. package/dist/dashboard/assets/{it-IT-JPQ66NNP-DhOvhKWm.js → it-IT-JPQ66NNP-BUL9bA1N.js} +1 -1
  73. package/dist/dashboard/assets/{ja-JP-DBVTYXUO-CEZ1K0xn.js → ja-JP-DBVTYXUO-D5RAsuhQ.js} +1 -1
  74. package/dist/dashboard/assets/{journeyDiagram-VCZTEJTY-Dqh8uQwc.js → journeyDiagram-VCZTEJTY-DhXdAiRb.js} +1 -1
  75. package/dist/dashboard/assets/{kaa-6HZHGXH3-DuFoQ8nX.js → kaa-6HZHGXH3-BFnf-Ufc.js} +1 -1
  76. package/dist/dashboard/assets/{kab-KAB-ZGHBKWFO-BkQCP_3o.js → kab-KAB-ZGHBKWFO-DiGK_ZTh.js} +1 -1
  77. package/dist/dashboard/assets/{kanban-definition-6JOO6SKY-DCs65HUc.js → kanban-definition-6JOO6SKY-Cx5laNH2.js} +1 -1
  78. package/dist/dashboard/assets/{kk-KZ-P5N5QNE5-Dh9BXA8_.js → kk-KZ-P5N5QNE5-DxsR0KaB.js} +1 -1
  79. package/dist/dashboard/assets/{km-KH-HSX4SM5Z-D1S2EcQ_.js → km-KH-HSX4SM5Z-CvoPabo9.js} +1 -1
  80. package/dist/dashboard/assets/{ko-KR-MTYHY66A-DsI3vrEx.js → ko-KR-MTYHY66A-B9c5NmSl.js} +1 -1
  81. package/dist/dashboard/assets/{ku-TR-6OUDTVRD-CyjK_3XH.js → ku-TR-6OUDTVRD-DG055kJy.js} +1 -1
  82. package/dist/dashboard/assets/{layout-B_y9BOh6.js → layout-DwwzFzt3.js} +1 -1
  83. package/dist/dashboard/assets/{linear-BdGSdQOc.js → linear-CCkgZ20z.js} +1 -1
  84. package/dist/dashboard/assets/{lt-LT-XHIRWOB4-C6tJka1D.js → lt-LT-XHIRWOB4-CToLILNS.js} +1 -1
  85. package/dist/dashboard/assets/{lv-LV-5QDEKY6T-C_xyL_ee.js → lv-LV-5QDEKY6T-RFiS8ekQ.js} +1 -1
  86. package/dist/dashboard/assets/{min-U_KGhNEt.js → min-Dc2FnahZ.js} +1 -1
  87. package/dist/dashboard/assets/{mindmap-definition-QFDTVHPH-sXmpEpKw.js → mindmap-definition-QFDTVHPH-LUttOfMV.js} +1 -1
  88. package/dist/dashboard/assets/{mr-IN-CRQNXWMA-C0TwGtAU.js → mr-IN-CRQNXWMA-CnEWhejt.js} +1 -1
  89. package/dist/dashboard/assets/{my-MM-5M5IBNSE-RlAQCiXW.js → my-MM-5M5IBNSE-Bf6P8QZs.js} +1 -1
  90. package/dist/dashboard/assets/{nb-NO-T6EIAALU-C1JHqr1t.js → nb-NO-T6EIAALU-Cr7PzKgs.js} +1 -1
  91. package/dist/dashboard/assets/{nl-NL-IS3SIHDZ-B0BVD_2p.js → nl-NL-IS3SIHDZ-D9Gjqrcc.js} +1 -1
  92. package/dist/dashboard/assets/{nn-NO-6E72VCQL-zQTko94P.js → nn-NO-6E72VCQL-SGn5Xm7M.js} +1 -1
  93. package/dist/dashboard/assets/{oc-FR-POXYY2M6-CBZRg6ku.js → oc-FR-POXYY2M6-BJrKiOwj.js} +1 -1
  94. package/dist/dashboard/assets/{pa-IN-N4M65BXN-7s6qpn6h.js → pa-IN-N4M65BXN-CAMb13rV.js} +1 -1
  95. package/dist/dashboard/assets/{percentages-BXMCSKIN-DckRvLSG.js → percentages-BXMCSKIN-DYtyPGCn.js} +7 -7
  96. package/dist/dashboard/assets/{pica-ByOjSUxE.js → pica-CsfxH0Em.js} +1 -1
  97. package/dist/dashboard/assets/{pieDiagram-DEJITSTG-BJJsFOH9.js → pieDiagram-DEJITSTG-C3G7iSyy.js} +1 -1
  98. package/dist/dashboard/assets/{pl-PL-T2D74RX3-QTzNyi10.js → pl-PL-T2D74RX3-D6RD-xuv.js} +1 -1
  99. package/dist/dashboard/assets/{pt-BR-5N22H2LF-tntUlote.js → pt-BR-5N22H2LF-BubaEA_3.js} +1 -1
  100. package/dist/dashboard/assets/{pt-PT-UZXXM6DQ-B9M5aHl1.js → pt-PT-UZXXM6DQ-CdM_0BZc.js} +1 -1
  101. package/dist/dashboard/assets/{quadrantDiagram-34T5L4WZ-BearsU1w.js → quadrantDiagram-34T5L4WZ-CVEg1LD9.js} +1 -1
  102. package/dist/dashboard/assets/{requirementDiagram-MS252O5E-BixosHER.js → requirementDiagram-MS252O5E-DnXTKVKA.js} +1 -1
  103. package/dist/dashboard/assets/{ro-RO-JPDTUUEW-qbgXrb57.js → ro-RO-JPDTUUEW-5i2wmUHd.js} +1 -1
  104. package/dist/dashboard/assets/{ru-RU-B4JR7IUQ-CgX4A1Ib.js → ru-RU-B4JR7IUQ-HtCIg5-6.js} +1 -1
  105. package/dist/dashboard/assets/{sankeyDiagram-XADWPNL6-DMSd55sU.js → sankeyDiagram-XADWPNL6-D-Q3LUMx.js} +1 -1
  106. package/dist/dashboard/assets/{sequenceDiagram-FGHM5R23-D2-Uwrtb.js → sequenceDiagram-FGHM5R23-D8wOCFBc.js} +1 -1
  107. package/dist/dashboard/assets/{si-LK-N5RQ5JYF-CWEkBvJB.js → si-LK-N5RQ5JYF-gdNFoVlI.js} +1 -1
  108. package/dist/dashboard/assets/{sk-SK-C5VTKIMK-CG8moyh9.js → sk-SK-C5VTKIMK-Eag9tQA5.js} +1 -1
  109. package/dist/dashboard/assets/{sl-SI-NN7IZMDC-CsBFEfKt.js → sl-SI-NN7IZMDC-BFlQuwpN.js} +1 -1
  110. package/dist/dashboard/assets/{stateDiagram-FHFEXIEX-vG3jGBpo.js → stateDiagram-FHFEXIEX-Do9qEX6W.js} +1 -1
  111. package/dist/dashboard/assets/stateDiagram-v2-QKLJ7IA2-D7FDMEq6.js +1 -0
  112. package/dist/dashboard/assets/{subset-shared.chunk-Bin8VoC6.js → subset-shared.chunk-Cm4V9KkI.js} +1 -1
  113. package/dist/dashboard/assets/{subset-worker.chunk-mRsEjVpS.js → subset-worker.chunk-DbIuMVFm.js} +1 -1
  114. package/dist/dashboard/assets/{sv-SE-XGPEYMSR-BMD7GbQV.js → sv-SE-XGPEYMSR-ZEKrtqFc.js} +1 -1
  115. package/dist/dashboard/assets/{ta-IN-2NMHFXQM-CjZ7GPuA.js → ta-IN-2NMHFXQM-gchwtW9r.js} +1 -1
  116. package/dist/dashboard/assets/{th-TH-HPSO5L25-BTE57yWh.js → th-TH-HPSO5L25-DohfXasj.js} +1 -1
  117. package/dist/dashboard/assets/{timeline-definition-GMOUNBTQ-Bz7MuXCz.js → timeline-definition-GMOUNBTQ-Czx9VG5g.js} +1 -1
  118. package/dist/dashboard/assets/{tr-TR-DEFEU3FU-CKY-uY5_.js → tr-TR-DEFEU3FU-DYV95LVI.js} +1 -1
  119. package/dist/dashboard/assets/{uk-UA-QMV73CPH-BuopbANh.js → uk-UA-QMV73CPH-Bpxsn2xS.js} +1 -1
  120. package/dist/dashboard/assets/{vennDiagram-DHZGUBPP-TsesBmH7.js → vennDiagram-DHZGUBPP-Ce_Sxxfx.js} +1 -1
  121. package/dist/dashboard/assets/{vi-VN-M7AON7JQ-CLrvMDM6.js → vi-VN-M7AON7JQ-BK8ew4LX.js} +1 -1
  122. package/dist/dashboard/assets/{wardley-RL74JXVD-DlttwW9K.js → wardley-RL74JXVD-DPv1FABO.js} +1 -1
  123. package/dist/dashboard/assets/{wardleyDiagram-NUSXRM2D-BfZXChhy.js → wardleyDiagram-NUSXRM2D-CCn43KWG.js} +1 -1
  124. package/dist/dashboard/assets/{xychartDiagram-5P7HB3ND-jjeDn8EJ.js → xychartDiagram-5P7HB3ND-D8jqISXa.js} +1 -1
  125. package/dist/dashboard/assets/{zh-CN-LNUGB5OW-C1MYPzyx.js → zh-CN-LNUGB5OW-MHsVZfMi.js} +1 -1
  126. package/dist/dashboard/assets/{zh-HK-E62DVLB3-BriaHjNV.js → zh-HK-E62DVLB3-vWPe0Xiq.js} +1 -1
  127. package/dist/dashboard/assets/{zh-TW-RAJ6MFWO-BUDimtjA.js → zh-TW-RAJ6MFWO-D1qdXP-0.js} +1 -1
  128. package/dist/dashboard/index.html +2 -2
  129. package/dist/git-sync/askpass.cjs +31 -0
  130. package/dist/index.js +6299 -1662
  131. package/dist/templates/AGENTS.md +1 -1
  132. package/dist/templates/CLAUDE.md +1 -1
  133. package/dist/templates/feature.md +5 -0
  134. package/dist/templates/obsidian/graph.json +1 -1
  135. package/package.json +2 -1
  136. package/skill/SKILL.md +6 -4
  137. package/skill/references/cli-reference.md +20 -1
  138. package/skill/references/integrations.md +45 -1
  139. package/skill/references/knowledge-and-recall.md +1 -1
  140. package/skill/references/sleep.md +2 -2
  141. package/skill/references/tasks-and-features.md +27 -6
  142. package/skill-curator/SKILL.md +3 -2
  143. package/skill-deep-research/SKILL.md +2 -2
  144. package/skill-initializer/SKILL.md +2 -2
  145. package/skill-sync/SKILL.md +94 -0
  146. package/skill-sync/references/merge-rules.md +201 -0
  147. package/dist/dashboard/assets/channel-DwaG7WPN.js +0 -1
  148. package/dist/dashboard/assets/classDiagram-6PBFFD2Q-COGCH4LQ.js +0 -1
  149. package/dist/dashboard/assets/classDiagram-v2-HSJHXN6E-COGCH4LQ.js +0 -1
  150. package/dist/dashboard/assets/clone-DwBiydth.js +0 -1
  151. package/dist/dashboard/assets/index-BK87l45R.js +0 -1
  152. package/dist/dashboard/assets/index-CkxvR2LH.css +0 -32
  153. package/dist/dashboard/assets/index-DalMBSek.js +0 -511
  154. package/dist/dashboard/assets/stateDiagram-v2-QKLJ7IA2-V8xCsZlI.js +0 -1
package/README.md CHANGED
@@ -28,7 +28,9 @@
28
28
  <a href="#desktop-app">Desktop App</a> &nbsp;&middot;&nbsp;
29
29
  <a href="#council">Council</a> &nbsp;&middot;&nbsp;
30
30
  <a href="#memory-recall">Memory Recall</a> &nbsp;&middot;&nbsp;
31
+ <a href="#lab-insights">Lab</a> &nbsp;&middot;&nbsp;
31
32
  <a href="#federation">Federation</a> &nbsp;&middot;&nbsp;
33
+ <a href="#brain-cloud-sync">Brain Sync</a> &nbsp;&middot;&nbsp;
32
34
  <a href="#commands">Commands</a> &nbsp;&middot;&nbsp;
33
35
  <a href="DEEP-DIVE.md">Deep Dive</a>
34
36
  </p>
@@ -488,6 +490,29 @@ Hook injection is **ON by default**: top hits are auto-surfaced to the agent on
488
490
 
489
491
  **Recent CHANGELOG in the snapshot is tiered**: top 3 entries detailed (summary + ~300 char body), next 10 titles-only under an "Older" subheading. Everything older still lives in `CHANGELOG.json` and is reachable through `memory recall --types changelog`.
490
492
 
493
+ ## Lab (Insights)
494
+
495
+ The numbers that tell you whether the project is working — weekly active users, conversion, revenue, error rate — live in external systems: a product-analytics API, Stripe, a database, a Google Sheet. Getting them into your brain used to mean pasting a figure into a task note, where it went stale the moment you typed it. **Lab** closes that loop. You (or an agent) define a named **insight** — a *curated* metric, never a raw data dump — backed by any HTTP JSON API or a local script, and dreamcontext fetches it, rolls it up, caches the result **in the brain**, and surfaces it to every session.
496
+
497
+ An insight declares what to fetch (a generic **HTTP** adapter or a custom **script**), how to render it (`number` / `line` / `pie` / `raw`), a refresh **TTL**, and optional **tweaks** such as a time range. One command refreshes the cached snapshots:
498
+
499
+ ```bash
500
+ dreamcontext lab create weekly-active-users --title "Weekly Active Users" \
501
+ --render line --adapter http --group growth
502
+ dreamcontext lab credentials set analytics_token # gitignored, 0600, never printed
503
+ dreamcontext lab sync --all # refresh every insight (skips fresh unless --force)
504
+ dreamcontext lab show weekly-active-users --json # cached series only — never re-fetches
505
+ ```
506
+
507
+ - **Insights, not raw dumps.** A hard cap of **62 points per series** is structural — a year of daily data rolls up to monthly buckets, a month may stay daily. Lab delivers curated metrics to agents and dashboards; it is not a BI tool.
508
+ - **Every session sees the latest value.** Cached snapshots live in the brain, so an insight's latest value and staleness ride the SessionStart snapshot and are recallable by meaning — `dreamcontext memory recall "weekly active users" --types insight` — without knowing the slug.
509
+ - **Measured roadmap progress.** Bind an insight to a roadmap objective's Key Result and `lab sync` writes `metric.current` for you, so the [forecast cascade](#roadmap-objectives--the-okr-board) reflects *measured* progress instead of PO-asserted numbers.
510
+ - **Credentials are gitignore-first.** API keys and tokens are written only through `lab credentials set`, stored gitignored at mode `0600`, and structurally redacted — never logged, never returned by a route, and never printed by `credentials list` (names only).
511
+ - **Custom scripts run locally, with a tripwire.** A `.mjs` script insight executes on your machine with your credentials — the same trust level as the repo itself — so if the script changes, Lab prints a loud change notice *before* it runs again.
512
+ - **No silent half-sync.** When a fetch fails the prior cached series is kept intact, the error is surfaced loudly, and the sync exits non-zero. **Sleep does not run lab sync** (credential exposure, latency, non-determinism) — a bound insight feeds a Key Result through its own `lab sync` instead.
513
+
514
+ The dashboard turns this into a **Lab page**: insights grouped by category, a **number / line / pie / raw** render per insight (hand-rolled SVG, no chart library), per-insight and **sync-all** refresh with live success/error feedback, and inline **tweak editing** to change an insight's range and watch it re-fetch and coarsen granularity. An insight bound to an objective shows a "feeds &lt;objective&gt;" provenance chip.
515
+
491
516
  ## Federation
492
517
 
493
518
  Most people end up with more than one dreamcontext project. **Federation** lets those projects discover each other and recall across each other **live** — each vault stays the single source of truth for its own knowledge, and sees its peers' canonical knowledge by reference at query time. All opt-in, all local, no server in the middle, and **nothing is ever copied between vaults**.
@@ -526,6 +551,26 @@ A peer is readable when your connection to it is `out`/`both`, it isn't stale, *
526
551
 
527
552
  > **Note — copy-based sync is parked on the roadmap.** Earlier builds pushed a lossy, truncated *digest* into peers at sleep (`federation sync`) and ingested it as `federated: true` copies (`federation drain`). That broke single-source-of-truth: copies went stale the moment the source changed and re-edits bred duplicates. Those verbs are now **inert no-ops** and the `sleep-federation` specialist is no longer dispatched. If a vault still holds old copies, clear them with `federation purge`. A redesigned opt-in offline-mirror mode may return later — its one genuine advantage is surviving a peer going offline, which live read can't.
528
553
 
554
+ ## Brain Cloud Sync
555
+
556
+ Federation lets separate projects read each other. **Brain Cloud Sync** is the other half of team collaboration: it lets a whole team work on the *same* brain. Your `_dream_context/` can become **its own git repository** — separate from the code repo — so tasks, knowledge, and features are pushed, pulled, merged, and reviewed the way you already collaborate on code. It stays local-first the entire time: the brain is still plain markdown and JSON on disk, and git is only the sync transport, not a new database.
557
+
558
+ ```bash
559
+ dreamcontext brain init # Turn _dream_context/ into its own synced repo (separate or in-tree)
560
+ dreamcontext brain status # Mode, remote, and current sync state
561
+ dreamcontext brain sync # Manual fetch → merge → commit → push, outside a sleep cycle
562
+ dreamcontext brain enable # Turn cloud sync on for this vault
563
+ dreamcontext brain disable # Turn it off (the brain stays local)
564
+ ```
565
+
566
+ - **Sync rides sleep.** Every `dreamcontext sleep done` automatically runs fetch → merge → commit → push against the brain repo, so your teammates' consolidated context reaches you and yours reaches them with no extra step. A sync failure never fails the sleep.
567
+ - **Deterministic files merge themselves; prose defers to an agent.** JSON (changelog, releases, config) and task status/changelog merge automatically (task changelogs union, the furthest status wins). When two people edit the same *prose* section of a knowledge or feature file, the conflict is handed to a semantic **merge agent** — the `/dream-sync` skill — which reads base/ours/theirs and writes the real merge, then hands back to commit and push.
568
+ - **Two modes.** `separate` is a dedicated brain repo with full auto-sync; **`in-tree`** nests the brain inside the code repo, commits on sleep but **never auto-pushes**, and is the safe default. The scrub gate applies to both.
569
+ - **Nothing secret or machine-local is ever pushed.** A **scrub gate** runs before every commit and push and blocks secrets and absolute local paths. The auth token is never written into the remote URL — git network calls use `GIT_ASKPASS` with a `0600` temp file, so the token never lands in `.git/config`, the environment, or a process argument. Per-machine indexes, caches, and embeddings are gitignored and rebuilt locally, so derived state never causes merge noise.
570
+ - **Private by default, attach is a trust decision.** New brain repos are created **private**. Because a shared brain is a prompt-injection channel, attaching to one prints a loud trust warning and an incoming-diff preview and refuses without an explicit confirmation. Personal attribution rides the existing multi-people awareness (`person:<slug>` tags, changelog authors) rather than per-person file forks.
571
+
572
+ From the desktop **Launcher** the whole flow is terminal-free: **GitHub device-flow login** (with a personal-access-token fallback), **brain-repo discovery** (repos tagged with the `dreamcontext-brain` topic), **one-click create** of a scrubbed private brain repo, the trust-gated **attach** flow for a second machine, a **team-updates badge** that tells you when teammates have pushed, and a Settings **"Cloud sync"** toggle.
573
+
529
574
  ## Commands
530
575
 
531
576
  ### Core
@@ -657,6 +702,25 @@ dreamcontext tasks sync-hooks install # best-effort post-commit/pr
657
702
  - **Docs**: illustrated user guide → [docs/clickup.md](docs/clickup.md);
658
703
  technical reference → [docs/remote-task-setup.md](docs/remote-task-setup.md).
659
704
 
705
+ ### Lab (insights)
706
+
707
+ ```bash
708
+ dreamcontext lab list [--json] # List insights with latest value + staleness
709
+ dreamcontext lab show <slug> [--json] # Show one insight's cached series (never re-fetches)
710
+ dreamcontext lab sync [slug] [--all] [--force] # Refresh cached snapshots (skips fresh unless --force)
711
+ dreamcontext lab create <slug> --title "..." --render number|line|pie|raw --adapter http|script [--group <g>] [--ttl <min>]
712
+ dreamcontext lab tweak <slug> <key> <value> # Adjust a declared tweak (e.g. a time range)
713
+ dreamcontext lab credentials set <key> # Store a source credential (hidden prompt or --value)
714
+ dreamcontext lab credentials list # List credential names only — values are never printed
715
+ ```
716
+
717
+ - Insights are **curated metrics, not raw data** — a structural cap of 62 points per series rolls a year of daily data up to monthly buckets. Granularity derives from the resolved range: over 180 days is monthly, 45–180 days weekly, 45 or fewer daily.
718
+ - A source is either the generic **HTTP** adapter (any JSON API — endpoint, method, headers, and body may reference `{{tweak:…}}` and `{{cred:…}}` placeholders, with a JSON-path `extract`) or a **custom `.mjs` script** under `lab/scripts/`. Ready-made PostHog / Sheets adapters are not shipped; the generic HTTP adapter and scripts cover the same ground.
719
+ - `lab sync` caches to the brain, writes a bound objective's `metric.current` when the insight declares a binding, keeps the prior series on failure, and exits non-zero if any insight failed. **Sleep never runs lab sync.**
720
+ - Credentials live in a gitignored `lab/credentials.json` (mode `0600`) written only through `lab credentials set`; `doctor` warns when a manifest names a credential you haven't set and fails if the file exists but isn't gitignored.
721
+
722
+ See the [Lab (Insights)](#lab-insights) section above for the full workflow.
723
+
660
724
  ### Features
661
725
 
662
726
  ```bash
@@ -794,6 +858,22 @@ dreamcontext federation purge --all # Remove leftover federated:true copies
794
858
 
795
859
  See the [Federation](#federation) section above for the full workflow.
796
860
 
861
+ ### Brain (cloud sync)
862
+
863
+ ```bash
864
+ dreamcontext brain init # Make _dream_context/ its own synced git repo
865
+ dreamcontext brain status # Show mode (separate | in-tree), remote, and sync state
866
+ dreamcontext brain sync # Manual fetch → merge → commit → push outside a sleep cycle
867
+ dreamcontext brain enable # Turn cloud sync on for this vault
868
+ dreamcontext brain disable # Turn cloud sync off (the brain stays local)
869
+ ```
870
+
871
+ - `separate` mode is a dedicated brain repo with full post-`sleep done` auto-sync; **`in-tree`** (the safe default) nests the brain in the code repo, commits on sleep, and never auto-pushes.
872
+ - Every `sleep done` runs fetch → merge → commit → push; a scrub gate blocks secrets and absolute paths before every push, and the token is supplied via `GIT_ASKPASS` (never in the remote URL). Prose conflicts defer to the `/dream-sync` merge agent; JSON and task status merge automatically.
873
+ - Device-flow GitHub login, brain-repo discovery, one-click create, the trust-gated attach flow, and a Settings "Cloud sync" toggle are all available from the desktop Launcher.
874
+
875
+ See the [Brain Cloud Sync](#brain-cloud-sync) section above for the full workflow.
876
+
797
877
  ### Desktop App (macOS)
798
878
 
799
879
  ```bash
@@ -2,7 +2,7 @@
2
2
  name: curator-auditor
3
3
  description: >
4
4
  Read-only audit specialist for the curator skill. Scans ONE domain of an existing
5
- dreamcontext brain (knowledge / single-source-of-truth / features / tasks / versions)
5
+ dreamcontext brain (knowledge / single-source-of-truth / features / tasks / versions / objectives)
6
6
  against the conventions that are CURRENT AT RUN TIME — read from the live `dreamcontext`
7
7
  skill, `taxonomy vocab`, and the soul — and returns a structured REORG FINDINGS list:
8
8
  every drifted artifact mapped to `source → action → target` (MOVE / MERGE / SPLIT /
@@ -52,9 +52,9 @@ Run the **real checks** and return a verdict with evidence. Do not reason about
52
52
  description + tags; no orphaned/empty entries; moved files round-trip (no dangling slugs).
53
53
  3. **Zero duplicate-topic knowledge.** No two knowledge files cover the same subject. Spot-check
54
54
  by clustering titles/tags and reading the suspected pairs — a survived near-duplicate is a FAIL.
55
- 4. **Zero topic-as-both.** No topic exists as BOTH a `core/features/<x>.md` and a
56
- `knowledge/**/<x>.md`. Cross-list feature names against knowledge slugs/titles; any collision
57
- that isn't a deliberate feature→knowledge *reference* is a FAIL.
55
+ 4. **Zero topic-as-both.** No topic exists as BOTH a `knowledge/features/<x>.md` (typed knowledge,
56
+ `type: feature`) and a non-feature `knowledge/**/<x>.md`. Cross-list feature names against other
57
+ knowledge slugs/titles; any collision that isn't a deliberate feature→knowledge *reference* is a FAIL.
58
58
  5. **Statuses reflect reality.** No task in `todo`/`in_progress` that is demonstrably finished
59
59
  (cross-check the changelog / releases / code). Feature + version/release statuses are internally
60
60
  consistent. Cite the evidence for any status you assert is wrong.
@@ -35,7 +35,7 @@ skills:
35
35
 
36
36
  - **dreamcontext** — the CLI surface that keeps the brain coherent: `knowledge move`,
37
37
  `knowledge merge`, `knowledge create`, `features create`/`features set`, `tasks status`,
38
- `tasks create`, `taxonomy add`, `core releases`. Structural ops go through the CLI so
38
+ `tasks create`, `taxonomy add`, `core releases`, `roadmap objective edit`/`depend`/`undepend` (objectives are PO-authored — only status/dependency/link hygiene, never rewrite their prose). Structural ops go through the CLI so
39
39
  frontmatter, LIFO ordering, the knowledge index, and `[[wikilinks]]` are all kept consistent.
40
40
  The feature-vs-knowledge boundary and folder conventions come from here too.
41
41
 
@@ -8,7 +8,7 @@ description: >
8
8
  entries. Owns ONLY federation state — never touches native local knowledge,
9
9
  tasks, or product files. Order is ALWAYS drain-then-distribute.
10
10
  tools: Read, Write, Edit, Bash, Glob, Grep
11
- model: sonnet
11
+ model: claude-sonnet-4-5-20250929
12
12
  skills:
13
13
  - dreamcontext
14
14
  ---
@@ -7,7 +7,7 @@ description: >
7
7
  alters body prose. Writes the ledger on completion via
8
8
  `dreamcontext migrations record`.
9
9
  tools: Read, Write, Edit, Bash, Glob, Grep
10
- model: sonnet
10
+ model: claude-sonnet-4-5-20250929
11
11
  skills:
12
12
  - dreamcontext
13
13
  ---
@@ -5,9 +5,10 @@ description: >
5
5
  files and feature PRDs. Dispatched (optionally) by the main agent during sleep when
6
6
  research, novel patterns, named decisions, feature progress, new buildable concepts, or
7
7
  staleness flags from sleep-state are present. Creates and reconciles knowledge/*.md and
8
- core/features/*.md, processes staleness flags, and maintains the knowledge index.
8
+ knowledge/features/*.md (typed knowledge, type: feature), processes staleness flags, and
9
+ maintains the knowledge index.
9
10
  tools: Read, Write, Edit, Bash, Glob, Grep
10
- model: sonnet
11
+ model: claude-sonnet-4-5-20250929
11
12
  skills:
12
13
  - dreamcontext
13
14
  ---
@@ -16,14 +17,14 @@ skills:
16
17
 
17
18
  ## Skills always loaded
18
19
 
19
- - **dreamcontext** — knowledge files use `dreamcontext knowledge create` with the standard tag set (`dreamcontext knowledge tags`); without the skill you'd freelance tags and fragment discovery, and miss the pinned-knowledge auto-load semantics. Feature PRDs use `dreamcontext features create` and structured-inserted via `dreamcontext features insert <name> <section>`. The skill defines the PRD schema (Why / User Stories / Acceptance Criteria / Constraints & Decisions / Technical Details) and the `related_tasks` cross-link to task files.
20
+ - **dreamcontext** — knowledge files use `dreamcontext knowledge create` with the standard tag set (`dreamcontext knowledge tags`); without the skill you'd freelance tags and fragment discovery, and miss the pinned-knowledge auto-load semantics. Feature PRDs use `dreamcontext features create` (deprecated compat alias — writes typed knowledge under `knowledge/features/`) and structured-inserted via `dreamcontext features insert <name> <section>`. The skill defines the PRD schema (Why / User Stories / Acceptance Criteria / Constraints & Decisions / Technical Details) and the `related_tasks` cross-link to task files.
20
21
 
21
22
  You own two retrospective stores:
22
23
 
23
24
  | Domain | Files |
24
25
  |---|---|
25
26
  | **Knowledge** | `_dream_context/knowledge/*.md` — research worth keeping, decisions worth tracing back to, archived overflow from core |
26
- | **Features** | `_dream_context/core/features/*.md` — PRDs that tie user-visible capabilities to User Stories, Acceptance Criteria, and the tasks that ship them |
27
+ | **Features** | `_dream_context/knowledge/features/*.md` — typed knowledge (`type: feature`) PRDs that tie user-visible capabilities to User Stories, Acceptance Criteria, and the tasks that ship them |
27
28
 
28
29
  Both are documentation of *what was built and why*, not in-progress work.
29
30
 
@@ -40,7 +41,7 @@ You're optional. The main agent dispatches you when **at least one** of these si
40
41
 
41
42
  **Feature signals:**
42
43
  - A task slug matches an existing feature PRD filename.
43
- - `git status` shows changes under `_dream_context/core/features/`.
44
+ - `git status` shows changes under `_dream_context/knowledge/features/`.
44
45
  - A session advanced a feature substantially (≥1 acceptance criterion newly met, new milestone).
45
46
  - A new buildable concept emerged with **≥2 acceptance criteria** named anywhere in the session.
46
47
  - The user explicitly called something "a feature" or said "we should add X".
@@ -55,7 +56,7 @@ If none apply when you start, no-op cheaply: read the brief, scan for actual sig
55
56
  |---|---|
56
57
  | `_dream_context/knowledge/*.md` (create + edit) | core 0-6 files (sleep-state owns) |
57
58
  | `_dream_context/knowledge/data-structures/<product>.md` (schemas, models, API contracts) | task files (sleep-tasks owns) |
58
- | `_dream_context/core/features/*.md` (create + edit) | changelog, releases (sleep-state owns) |
59
+ | `_dream_context/knowledge/features/*.md` (create + edit, typed knowledge) | changelog, releases (sleep-state owns) |
59
60
  | | `core/objectives/*.md` (PO-authored roadmap objectives — never edit) |
60
61
  | | `knowledge/roadmap/board.md` (AUTO-GENERATED by `dreamcontext roadmap` — never hand-edit; the orchestrator regenerates it each sleep) |
61
62
  | `dreamcontext knowledge create --tags "..."` | |
@@ -97,7 +98,7 @@ Ground the PRD in current truth before editing or creating:
97
98
  cat _dream_context/state/<related-task>.md
98
99
 
99
100
  # Read existing PRD if updating
100
- cat _dream_context/core/features/<name>.md
101
+ cat _dream_context/knowledge/features/<name>.md
101
102
 
102
103
  # Inspect the actual code that ships the feature
103
104
  git log --oneline --since="$(jq -r '.sleep_started_at // .last_sleep' _dream_context/state/.sleep.json)" -- src/
@@ -135,7 +136,7 @@ dreamcontext features insert <name> constraints "<decision>"
135
136
  Create a new PRD when **ANY** of:
136
137
  - (a) the session introduced a feature concept with **≥2 acceptance criteria** written down anywhere (task body, conversation summary, sleep notes); OR
137
138
  - (b) the user explicitly named something as "a feature" or "we should add X" (or equivalent intent); OR
138
- - (c) a task `.md` has `feature: <slug>` frontmatter pointing to a non-existent file in `core/features/`.
139
+ - (c) a task `.md` has `feature: <slug>` frontmatter pointing to a non-existent file in `knowledge/features/`.
139
140
 
140
141
  This trigger is intentionally broad. Better to create a thin PRD that gets enriched next cycle than to leave a buildable concept undocumented.
141
142
 
@@ -159,7 +160,7 @@ Then Edit the resulting file. Required sections (look at existing PRDs for shape
159
160
  #### A5. Multi-product awareness
160
161
 
161
162
  If the relevant task has `product: X` in frontmatter, the PRD MAY be product-scoped:
162
- - Write the PRD to `core/features/<slug>.md` (single flat directory) but include `product: X` in frontmatter so dashboard/CLI filters can route it.
163
+ - Write the PRD to `knowledge/features/<slug>.md` (single flat directory, typed knowledge) but include `product: X` in frontmatter so dashboard/CLI filters can route it.
163
164
  - Any knowledge updates that emerge from this feature go to `_dream_context/knowledge/products/X.md` (create if missing) **in addition to or instead of** the global knowledge files. Per-product knowledge wins when the content is product-specific; global knowledge wins for cross-cutting topics.
164
165
 
165
166
  ### Pass B — Knowledge
@@ -8,7 +8,7 @@ description: >
8
8
  change since the sleep epoch; surfaces release readiness; enforces anti-bloat ceilings;
9
9
  flags stale knowledge files for sleep-product to handle.
10
10
  tools: Read, Write, Edit, Bash, Glob, Grep
11
- model: sonnet
11
+ model: claude-sonnet-4-5-20250929
12
12
  skills:
13
13
  - dreamcontext
14
14
  ---
@@ -6,7 +6,7 @@ description: >
6
6
  bumps statuses, creates new tasks for untracked work, attaches everything to the active
7
7
  planning version.
8
8
  tools: Read, Write, Edit, Bash, Glob, Grep
9
- model: sonnet
9
+ model: claude-sonnet-4-5-20250929
10
10
  skills:
11
11
  - dreamcontext
12
12
  ---
@@ -26,8 +26,8 @@ You own `_dream_context/state/*.md` and the task lifecycle. The orchestrator gav
26
26
  | `_dream_context/state/<slug>.md` (task files) | `core/CHANGELOG.json`, `core/RELEASES.json` |
27
27
  | `dreamcontext tasks {create,status,log,insert,objectives}` | `core/0-6.*` files |
28
28
  | Workflow Mermaid node classes inside task bodies | `knowledge/*.md` |
29
- | Task `objectives:` links (propose-only — see grooming (d)) | `core/features/*.md` |
30
- | | `core/objectives/*.md` (PO-authored — never edit) |
29
+ | Task `objectives:` links (propose-only — see grooming (d)) | `knowledge/features/*.md` |
30
+ | | `core/objectives/*.md` (PO-authored — never hand-edit; the ONE exception is refreshing a Key Result's `current` via `dreamcontext roadmap objective metric <slug> --current <n>`) |
31
31
 
32
32
  If a session's work belongs in a different domain (e.g., an architectural decision worth keeping in `2.memory.md`), **mention it in your report** so the orchestrator can confirm the right specialist handled it. Do not edit it yourself.
33
33
 
@@ -154,6 +154,8 @@ A fresh session opening this task file should see the *current plan*.
154
154
 
155
155
  ### 4. Status — review only when genuinely needed
156
156
 
157
+ **Think hard before you set each task's status here.** The `completed` vs `in_review` call is the one genuinely judgment-heavy decision in this cycle — reason through the specific task's risk, reviewability, and whether any criterion is mechanically unproven before you bump it, rather than pattern-matching on surface cues.
158
+
157
159
  Pick the status that matches reality. **Do NOT reflexively bump everything to `in_review`** — that buries the few tasks that actually need the user's eyes under a pile that didn't, and leaves finished work rotting half-closed.
158
160
 
159
161
  | The task this cycle is… | Status |
@@ -211,7 +213,9 @@ dreamcontext tasks list # every non-completed task, with updated dates
211
213
 
212
214
  **(c) Tagging.** Tags drive recall — sharpen them every cycle. Normalize every task's frontmatter `tags` to the taxonomy vocab (`dreamcontext taxonomy vocab`), and *add* missing facets (area / type / feature) where a task is under-tagged. A well-tagged backlog is found; a poorly-tagged one is re-derived blind.
213
215
 
214
- **(d) Objective linking (only when `core/objectives/` is non-empty).** Objectives are the PO's OKR roadmap items; tasks link to them many-to-many via the `objectives:` frontmatter list. For each task you touched (or created) whose `objectives:` is **absent or empty**, judge which objective(s) the work genuinely serves — check `dreamcontext roadmap objective list` for the live set — and set them: `dreamcontext tasks objectives <slug> <a,b>` (multiple slugs when one task lifts several outcomes, e.g. revenue AND retention — that's expected, not double-counting). **HARD RULE: a non-empty `objectives:` list is a PO decision — NEVER change or extend it.** If no objective fits, leave the field empty; do not force a link. You only edit the task-side field; `core/objectives/*.md` files are PO-authored and off-limits. Rollups/forecasts recompute when the orchestrator runs `dreamcontext roadmap` after your report.
216
+ **(d) Objective linking (only when `core/objectives/` is non-empty).** Objectives are the PO's OKR roadmap items; tasks link to them many-to-many via the `objectives:` frontmatter list. For each task you touched (or created) whose `objectives:` is **absent or empty**, judge which objective(s) the work genuinely serves — check `dreamcontext roadmap objective list` for the live set — and set them: `dreamcontext tasks objectives <slug> <a,b>` (multiple slugs when one task lifts several outcomes, e.g. revenue AND retention — that's expected, not double-counting). **HARD RULE: a non-empty `objectives:` list is a PO decision — NEVER change or extend it.** If no objective fits, leave the field empty; do not force a link. You only edit the task-side field; `core/objectives/*.md` prose/title/dates/structure stay PO-authored and off-limits. Rollups/forecasts recompute when the orchestrator runs `dreamcontext roadmap` after your report.
217
+
218
+ **Key Result current — you MAY update it.** When this cycle surfaced a new real observed value for an objective's Key Result metric (e.g. MRR moved to $1,250, active users hit 400) — from the transcript, a file, or a connected system — refresh it: `dreamcontext roadmap objective metric <slug> --current <n>`. This is the ONE write you may make to a `core/objectives/*.md` file, and only through this CLI verb (never hand-edit the frontmatter). Use a value you actually observed — do not invent or estimate a number. The roadmap board regen at the end of sleep will reflect the new progress.
215
219
 
216
220
  Never silently delete a task, and never `completed` a task that was never actually done — for superseded/abandoned/obsoleted work, `in_review` with an explicit reason hands the close decision to the user. List every grooming action in your report.
217
221
 
@@ -243,4 +247,4 @@ Dropped-but-load-bearing self-check: <none | list any digest/auto-bookmark/task
243
247
  6. **CLI first** for status/log/insert; **Edit** for surgical body reconciliation (including broadening `description:` / `## Why` when scope grows).
244
248
  7. **Person attribution is multi-person only.** Read `.config.json` `people` first. If 0 or 1 entry, step 2.5 is a complete NO-OP — never inject `person:` tags on solo projects. Derived multi-person status comes from `people.length > 1`; there is no `multiPerson` key to check.
245
249
  8. **Normalize tags via taxonomy vocab.** When writing or updating task frontmatter tags, check `dreamcontext taxonomy vocab` and use canonical forms (faceted or bare standard tags); non-canonical tags degrade recall.
246
- 9. **Objectives: propose for empty, never overwrite non-empty.** An existing `objectives:` value is a PO decision that sticks. You fill blanks with judgment; you never revise the PO's linking. Objective files themselves (`core/objectives/`) are outside your domain entirely.
250
+ 9. **Objectives: propose for empty, never overwrite non-empty.** An existing `objectives:` value is a PO decision that sticks. You fill blanks with judgment; you never revise the PO's linking. Objective files themselves (`core/objectives/`) are PO-authored never hand-edit their prose, title, dates, or structure — with the single exception that you may refresh a Key Result's `current` via `dreamcontext roadmap objective metric <slug> --current` when you observed a new real value (see grooming (d)).
@@ -2,7 +2,7 @@
2
2
  name: curator-auditor
3
3
  description: >
4
4
  Read-only audit specialist for the curator skill. Scans ONE domain of an existing
5
- dreamcontext brain (knowledge / single-source-of-truth / features / tasks / versions)
5
+ dreamcontext brain (knowledge / single-source-of-truth / features / tasks / versions / objectives)
6
6
  against the conventions that are CURRENT AT RUN TIME — read from the live `dreamcontext`
7
7
  skill, `taxonomy vocab`, and the soul — and returns a structured REORG FINDINGS list:
8
8
  every drifted artifact mapped to `source → action → target` (MOVE / MERGE / SPLIT /
@@ -52,9 +52,9 @@ Run the **real checks** and return a verdict with evidence. Do not reason about
52
52
  description + tags; no orphaned/empty entries; moved files round-trip (no dangling slugs).
53
53
  3. **Zero duplicate-topic knowledge.** No two knowledge files cover the same subject. Spot-check
54
54
  by clustering titles/tags and reading the suspected pairs — a survived near-duplicate is a FAIL.
55
- 4. **Zero topic-as-both.** No topic exists as BOTH a `core/features/<x>.md` and a
56
- `knowledge/**/<x>.md`. Cross-list feature names against knowledge slugs/titles; any collision
57
- that isn't a deliberate feature→knowledge *reference* is a FAIL.
55
+ 4. **Zero topic-as-both.** No topic exists as BOTH a `knowledge/features/<x>.md` (typed knowledge,
56
+ `type: feature`) and a non-feature `knowledge/**/<x>.md`. Cross-list feature names against other
57
+ knowledge slugs/titles; any collision that isn't a deliberate feature→knowledge *reference* is a FAIL.
58
58
  5. **Statuses reflect reality.** No task in `todo`/`in_progress` that is demonstrably finished
59
59
  (cross-check the changelog / releases / code). Feature + version/release statuses are internally
60
60
  consistent. Cite the evidence for any status you assert is wrong.
@@ -35,7 +35,7 @@ skills:
35
35
 
36
36
  - **dreamcontext** — the CLI surface that keeps the brain coherent: `knowledge move`,
37
37
  `knowledge merge`, `knowledge create`, `features create`/`features set`, `tasks status`,
38
- `tasks create`, `taxonomy add`, `core releases`. Structural ops go through the CLI so
38
+ `tasks create`, `taxonomy add`, `core releases`, `roadmap objective edit`/`depend`/`undepend` (objectives are PO-authored — only status/dependency/link hygiene, never rewrite their prose). Structural ops go through the CLI so
39
39
  frontmatter, LIFO ordering, the knowledge index, and `[[wikilinks]]` are all kept consistent.
40
40
  The feature-vs-knowledge boundary and folder conventions come from here too.
41
41
 
@@ -8,7 +8,7 @@ description: >
8
8
  entries. Owns ONLY federation state — never touches native local knowledge,
9
9
  tasks, or product files. Order is ALWAYS drain-then-distribute.
10
10
  tools: Read, Write, Edit, Bash, Glob, Grep
11
- model: sonnet
11
+ model: claude-sonnet-4-5-20250929
12
12
  skills:
13
13
  - dreamcontext
14
14
  ---
@@ -7,7 +7,7 @@ description: >
7
7
  alters body prose. Writes the ledger on completion via
8
8
  `dreamcontext migrations record`.
9
9
  tools: Read, Write, Edit, Bash, Glob, Grep
10
- model: sonnet
10
+ model: claude-sonnet-4-5-20250929
11
11
  skills:
12
12
  - dreamcontext
13
13
  ---
@@ -5,9 +5,10 @@ description: >
5
5
  files and feature PRDs. Dispatched (optionally) by the main agent during sleep when
6
6
  research, novel patterns, named decisions, feature progress, new buildable concepts, or
7
7
  staleness flags from sleep-state are present. Creates and reconciles knowledge/*.md and
8
- core/features/*.md, processes staleness flags, and maintains the knowledge index.
8
+ knowledge/features/*.md (typed knowledge, type: feature), processes staleness flags, and
9
+ maintains the knowledge index.
9
10
  tools: Read, Write, Edit, Bash, Glob, Grep
10
- model: sonnet
11
+ model: claude-sonnet-4-5-20250929
11
12
  skills:
12
13
  - dreamcontext
13
14
  ---
@@ -16,14 +17,14 @@ skills:
16
17
 
17
18
  ## Skills always loaded
18
19
 
19
- - **dreamcontext** — knowledge files use `dreamcontext knowledge create` with the standard tag set (`dreamcontext knowledge tags`); without the skill you'd freelance tags and fragment discovery, and miss the pinned-knowledge auto-load semantics. Feature PRDs use `dreamcontext features create` and structured-inserted via `dreamcontext features insert <name> <section>`. The skill defines the PRD schema (Why / User Stories / Acceptance Criteria / Constraints & Decisions / Technical Details) and the `related_tasks` cross-link to task files.
20
+ - **dreamcontext** — knowledge files use `dreamcontext knowledge create` with the standard tag set (`dreamcontext knowledge tags`); without the skill you'd freelance tags and fragment discovery, and miss the pinned-knowledge auto-load semantics. Feature PRDs use `dreamcontext features create` (deprecated compat alias — writes typed knowledge under `knowledge/features/`) and structured-inserted via `dreamcontext features insert <name> <section>`. The skill defines the PRD schema (Why / User Stories / Acceptance Criteria / Constraints & Decisions / Technical Details) and the `related_tasks` cross-link to task files.
20
21
 
21
22
  You own two retrospective stores:
22
23
 
23
24
  | Domain | Files |
24
25
  |---|---|
25
26
  | **Knowledge** | `_dream_context/knowledge/*.md` — research worth keeping, decisions worth tracing back to, archived overflow from core |
26
- | **Features** | `_dream_context/core/features/*.md` — PRDs that tie user-visible capabilities to User Stories, Acceptance Criteria, and the tasks that ship them |
27
+ | **Features** | `_dream_context/knowledge/features/*.md` — typed knowledge (`type: feature`) PRDs that tie user-visible capabilities to User Stories, Acceptance Criteria, and the tasks that ship them |
27
28
 
28
29
  Both are documentation of *what was built and why*, not in-progress work.
29
30
 
@@ -40,7 +41,7 @@ You're optional. The main agent dispatches you when **at least one** of these si
40
41
 
41
42
  **Feature signals:**
42
43
  - A task slug matches an existing feature PRD filename.
43
- - `git status` shows changes under `_dream_context/core/features/`.
44
+ - `git status` shows changes under `_dream_context/knowledge/features/`.
44
45
  - A session advanced a feature substantially (≥1 acceptance criterion newly met, new milestone).
45
46
  - A new buildable concept emerged with **≥2 acceptance criteria** named anywhere in the session.
46
47
  - The user explicitly called something "a feature" or said "we should add X".
@@ -55,7 +56,7 @@ If none apply when you start, no-op cheaply: read the brief, scan for actual sig
55
56
  |---|---|
56
57
  | `_dream_context/knowledge/*.md` (create + edit) | core 0-6 files (sleep-state owns) |
57
58
  | `_dream_context/knowledge/data-structures/<product>.md` (schemas, models, API contracts) | task files (sleep-tasks owns) |
58
- | `_dream_context/core/features/*.md` (create + edit) | changelog, releases (sleep-state owns) |
59
+ | `_dream_context/knowledge/features/*.md` (create + edit, typed knowledge) | changelog, releases (sleep-state owns) |
59
60
  | | `core/objectives/*.md` (PO-authored roadmap objectives — never edit) |
60
61
  | | `knowledge/roadmap/board.md` (AUTO-GENERATED by `dreamcontext roadmap` — never hand-edit; the orchestrator regenerates it each sleep) |
61
62
  | `dreamcontext knowledge create --tags "..."` | |
@@ -97,7 +98,7 @@ Ground the PRD in current truth before editing or creating:
97
98
  cat _dream_context/state/<related-task>.md
98
99
 
99
100
  # Read existing PRD if updating
100
- cat _dream_context/core/features/<name>.md
101
+ cat _dream_context/knowledge/features/<name>.md
101
102
 
102
103
  # Inspect the actual code that ships the feature
103
104
  git log --oneline --since="$(jq -r '.sleep_started_at // .last_sleep' _dream_context/state/.sleep.json)" -- src/
@@ -135,7 +136,7 @@ dreamcontext features insert <name> constraints "<decision>"
135
136
  Create a new PRD when **ANY** of:
136
137
  - (a) the session introduced a feature concept with **≥2 acceptance criteria** written down anywhere (task body, conversation summary, sleep notes); OR
137
138
  - (b) the user explicitly named something as "a feature" or "we should add X" (or equivalent intent); OR
138
- - (c) a task `.md` has `feature: <slug>` frontmatter pointing to a non-existent file in `core/features/`.
139
+ - (c) a task `.md` has `feature: <slug>` frontmatter pointing to a non-existent file in `knowledge/features/`.
139
140
 
140
141
  This trigger is intentionally broad. Better to create a thin PRD that gets enriched next cycle than to leave a buildable concept undocumented.
141
142
 
@@ -159,7 +160,7 @@ Then Edit the resulting file. Required sections (look at existing PRDs for shape
159
160
  #### A5. Multi-product awareness
160
161
 
161
162
  If the relevant task has `product: X` in frontmatter, the PRD MAY be product-scoped:
162
- - Write the PRD to `core/features/<slug>.md` (single flat directory) but include `product: X` in frontmatter so dashboard/CLI filters can route it.
163
+ - Write the PRD to `knowledge/features/<slug>.md` (single flat directory, typed knowledge) but include `product: X` in frontmatter so dashboard/CLI filters can route it.
163
164
  - Any knowledge updates that emerge from this feature go to `_dream_context/knowledge/products/X.md` (create if missing) **in addition to or instead of** the global knowledge files. Per-product knowledge wins when the content is product-specific; global knowledge wins for cross-cutting topics.
164
165
 
165
166
  ### Pass B — Knowledge
@@ -8,7 +8,7 @@ description: >
8
8
  change since the sleep epoch; surfaces release readiness; enforces anti-bloat ceilings;
9
9
  flags stale knowledge files for sleep-product to handle.
10
10
  tools: Read, Write, Edit, Bash, Glob, Grep
11
- model: sonnet
11
+ model: claude-sonnet-4-5-20250929
12
12
  skills:
13
13
  - dreamcontext
14
14
  ---
@@ -6,7 +6,7 @@ description: >
6
6
  bumps statuses, creates new tasks for untracked work, attaches everything to the active
7
7
  planning version.
8
8
  tools: Read, Write, Edit, Bash, Glob, Grep
9
- model: sonnet
9
+ model: claude-sonnet-4-5-20250929
10
10
  skills:
11
11
  - dreamcontext
12
12
  ---
@@ -26,8 +26,8 @@ You own `_dream_context/state/*.md` and the task lifecycle. The orchestrator gav
26
26
  | `_dream_context/state/<slug>.md` (task files) | `core/CHANGELOG.json`, `core/RELEASES.json` |
27
27
  | `dreamcontext tasks {create,status,log,insert,objectives}` | `core/0-6.*` files |
28
28
  | Workflow Mermaid node classes inside task bodies | `knowledge/*.md` |
29
- | Task `objectives:` links (propose-only — see grooming (d)) | `core/features/*.md` |
30
- | | `core/objectives/*.md` (PO-authored — never edit) |
29
+ | Task `objectives:` links (propose-only — see grooming (d)) | `knowledge/features/*.md` |
30
+ | | `core/objectives/*.md` (PO-authored — never hand-edit; the ONE exception is refreshing a Key Result's `current` via `dreamcontext roadmap objective metric <slug> --current <n>`) |
31
31
 
32
32
  If a session's work belongs in a different domain (e.g., an architectural decision worth keeping in `2.memory.md`), **mention it in your report** so the orchestrator can confirm the right specialist handled it. Do not edit it yourself.
33
33
 
@@ -154,6 +154,8 @@ A fresh session opening this task file should see the *current plan*.
154
154
 
155
155
  ### 4. Status — review only when genuinely needed
156
156
 
157
+ **Think hard before you set each task's status here.** The `completed` vs `in_review` call is the one genuinely judgment-heavy decision in this cycle — reason through the specific task's risk, reviewability, and whether any criterion is mechanically unproven before you bump it, rather than pattern-matching on surface cues.
158
+
157
159
  Pick the status that matches reality. **Do NOT reflexively bump everything to `in_review`** — that buries the few tasks that actually need the user's eyes under a pile that didn't, and leaves finished work rotting half-closed.
158
160
 
159
161
  | The task this cycle is… | Status |
@@ -211,7 +213,9 @@ dreamcontext tasks list # every non-completed task, with updated dates
211
213
 
212
214
  **(c) Tagging.** Tags drive recall — sharpen them every cycle. Normalize every task's frontmatter `tags` to the taxonomy vocab (`dreamcontext taxonomy vocab`), and *add* missing facets (area / type / feature) where a task is under-tagged. A well-tagged backlog is found; a poorly-tagged one is re-derived blind.
213
215
 
214
- **(d) Objective linking (only when `core/objectives/` is non-empty).** Objectives are the PO's OKR roadmap items; tasks link to them many-to-many via the `objectives:` frontmatter list. For each task you touched (or created) whose `objectives:` is **absent or empty**, judge which objective(s) the work genuinely serves — check `dreamcontext roadmap objective list` for the live set — and set them: `dreamcontext tasks objectives <slug> <a,b>` (multiple slugs when one task lifts several outcomes, e.g. revenue AND retention — that's expected, not double-counting). **HARD RULE: a non-empty `objectives:` list is a PO decision — NEVER change or extend it.** If no objective fits, leave the field empty; do not force a link. You only edit the task-side field; `core/objectives/*.md` files are PO-authored and off-limits. Rollups/forecasts recompute when the orchestrator runs `dreamcontext roadmap` after your report.
216
+ **(d) Objective linking (only when `core/objectives/` is non-empty).** Objectives are the PO's OKR roadmap items; tasks link to them many-to-many via the `objectives:` frontmatter list. For each task you touched (or created) whose `objectives:` is **absent or empty**, judge which objective(s) the work genuinely serves — check `dreamcontext roadmap objective list` for the live set — and set them: `dreamcontext tasks objectives <slug> <a,b>` (multiple slugs when one task lifts several outcomes, e.g. revenue AND retention — that's expected, not double-counting). **HARD RULE: a non-empty `objectives:` list is a PO decision — NEVER change or extend it.** If no objective fits, leave the field empty; do not force a link. You only edit the task-side field; `core/objectives/*.md` prose/title/dates/structure stay PO-authored and off-limits. Rollups/forecasts recompute when the orchestrator runs `dreamcontext roadmap` after your report.
217
+
218
+ **Key Result current — you MAY update it.** When this cycle surfaced a new real observed value for an objective's Key Result metric (e.g. MRR moved to $1,250, active users hit 400) — from the transcript, a file, or a connected system — refresh it: `dreamcontext roadmap objective metric <slug> --current <n>`. This is the ONE write you may make to a `core/objectives/*.md` file, and only through this CLI verb (never hand-edit the frontmatter). Use a value you actually observed — do not invent or estimate a number. The roadmap board regen at the end of sleep will reflect the new progress.
215
219
 
216
220
  Never silently delete a task, and never `completed` a task that was never actually done — for superseded/abandoned/obsoleted work, `in_review` with an explicit reason hands the close decision to the user. List every grooming action in your report.
217
221
 
@@ -243,4 +247,4 @@ Dropped-but-load-bearing self-check: <none | list any digest/auto-bookmark/task
243
247
  6. **CLI first** for status/log/insert; **Edit** for surgical body reconciliation (including broadening `description:` / `## Why` when scope grows).
244
248
  7. **Person attribution is multi-person only.** Read `.config.json` `people` first. If 0 or 1 entry, step 2.5 is a complete NO-OP — never inject `person:` tags on solo projects. Derived multi-person status comes from `people.length > 1`; there is no `multiPerson` key to check.
245
249
  8. **Normalize tags via taxonomy vocab.** When writing or updating task frontmatter tags, check `dreamcontext taxonomy vocab` and use canonical forms (faceted or bare standard tags); non-canonical tags degrade recall.
246
- 9. **Objectives: propose for empty, never overwrite non-empty.** An existing `objectives:` value is a PO decision that sticks. You fill blanks with judgment; you never revise the PO's linking. Objective files themselves (`core/objectives/`) are outside your domain entirely.
250
+ 9. **Objectives: propose for empty, never overwrite non-empty.** An existing `objectives:` value is a PO decision that sticks. You fill blanks with judgment; you never revise the PO's linking. Objective files themselves (`core/objectives/`) are PO-authored never hand-edit their prose, title, dates, or structure — with the single exception that you may refresh a Key Result's `current` via `dreamcontext roadmap objective metric <slug> --current` when you observed a new real value (see grooming (d)).
@@ -1,4 +1,4 @@
1
- import{bt as jc,bu as I0,aH as pS,bv as xt,bw as Ip,bx as mS,by as gS,bz as _S,bA as xS,bB as yS,bq as vS,br as bS,bC as B0,aC as SS,bD as TS,bE as MS,bF as ES,bG as xg,bH as yg,bI as AS,bJ as k,bK as $s,bL as wS,bM as RS,bN as CS,bO as NS}from"./index-DalMBSek.js";import{_ as Bi}from"./extends-CF3RwP-h.js";function PS(r){var e=jc(.1),t,n,i;typeof r!="function"&&(r=jc(r==null?0:+r));function s(a){for(var l=0,c=t.length,u;l<c;++l)u=t[l],u.vz+=(i[l]-u.z)*n[l]*a}function o(){if(t){var a,l=t.length;for(n=new Array(l),i=new Array(l),a=0;a<l;++a)n[a]=isNaN(i[a]=+r(t[a],a,t))?0:+e(t[a],a,t)}}return s.initialize=function(a){t=a,o()},s.strength=function(a){return arguments.length?(e=typeof a=="function"?a:jc(+a),o(),s):e},s.z=function(a){return arguments.length?(r=typeof a=="function"?a:jc(+a),o(),s):r},s}/**
1
+ import{bt as jc,bu as I0,aH as pS,bv as xt,bw as Ip,bx as mS,by as gS,bz as _S,bA as xS,bB as yS,bq as vS,br as bS,bC as B0,aC as SS,bD as TS,bE as MS,bF as ES,bG as xg,bH as yg,bI as AS,bJ as k,bK as $s,bL as wS,bM as RS,bN as CS,bO as NS}from"./index-C2R7Is0-.js";import{_ as Bi}from"./extends-CF3RwP-h.js";function PS(r){var e=jc(.1),t,n,i;typeof r!="function"&&(r=jc(r==null?0:+r));function s(a){for(var l=0,c=t.length,u;l<c;++l)u=t[l],u.vz+=(i[l]-u.z)*n[l]*a}function o(){if(t){var a,l=t.length;for(n=new Array(l),i=new Array(l),a=0;a<l;++a)n[a]=isNaN(i[a]=+r(t[a],a,t))?0:+e(t[a],a,t)}}return s.initialize=function(a){t=a,o()},s.strength=function(a){return arguments.length?(e=typeof a=="function"?a:jc(+a),o(),s):e},s.z=function(a){return arguments.length?(r=typeof a=="function"?a:jc(+a),o(),s):r},s}/**
2
2
  * @license
3
3
  * Copyright 2010-2026 Three.js Authors
4
4
  * SPDX-License-Identifier: MIT
@@ -1 +1 @@
1
- import{aK as A,aL as S,a_ as P,aJ as W,bY as ln,bZ as gn,b_ as dn,b$ as z,c0 as hn,bT as pn,c1 as G,b1 as N,b6 as m,b9 as R,c2 as An,b0 as U,b4 as _n,c3 as wn,bW as on,aM as V,bU as On,c4 as I}from"./index-DalMBSek.js";function vn(n,r){for(var e=-1,i=n==null?0:n.length,f=Array(i);++e<i;)f[e]=r(n[e],e,n);return f}var K=P?P.prototype:void 0,B=K?K.toString:void 0;function k(n){if(typeof n=="string")return n;if(A(n))return vn(n,k)+"";if(S(n))return B?B.call(n):"";var r=n+"";return r=="0"&&1/n==-1/0?"-0":r}function Pn(){}function cn(n,r){for(var e=-1,i=n==null?0:n.length;++e<i&&r(n[e],e,n)!==!1;);return n}function En(n,r,e,i){for(var f=n.length,t=e+-1;++t<f;)if(r(n[t],t,n))return t;return-1}function yn(n){return n!==n}function Tn(n,r,e){for(var i=e-1,f=n.length;++i<f;)if(n[i]===r)return i;return-1}function Rn(n,r,e){return r===r?Tn(n,r,e):En(n,yn,e)}function bn(n,r){var e=n==null?0:n.length;return!!e&&Rn(n,r,0)>-1}function x(n){return W(n)?ln(n):gn(n)}var In=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,Ln=/^\w*$/;function M(n,r){if(A(n))return!1;var e=typeof n;return e=="number"||e=="symbol"||e=="boolean"||n==null||S(n)?!0:Ln.test(n)||!In.test(n)||r!=null&&n in Object(r)}var Sn=500;function xn(n){var r=dn(n,function(i){return e.size===Sn&&e.clear(),i}),e=r.cache;return r}var Mn=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,$n=/\\(\\)?/g,Cn=xn(function(n){var r=[];return n.charCodeAt(0)===46&&r.push(""),n.replace(Mn,function(e,i,f,t){r.push(f?t.replace($n,"$1"):i||e)}),r});function Dn(n){return n==null?"":k(n)}function j(n,r){return A(n)?n:M(n,r)?[n]:Cn(Dn(n))}function b(n){if(typeof n=="string"||S(n))return n;var r=n+"";return r=="0"&&1/n==-1/0?"-0":r}function nn(n,r){r=j(r,n);for(var e=0,i=r.length;n!=null&&e<i;)n=n[b(r[e++])];return e&&e==i?n:void 0}function Fn(n,r,e){var i=n==null?void 0:nn(n,r);return i===void 0?e:i}function rn(n,r){for(var e=-1,i=r.length,f=n.length;++e<i;)n[f+e]=r[e];return n}var H=P?P.isConcatSpreadable:void 0;function Gn(n){return A(n)||z(n)||!!(H&&n&&n[H])}function Kr(n,r,e,i,f){var t=-1,u=n.length;for(e||(e=Gn),f||(f=[]);++t<u;){var s=n[t];e(s)?rn(f,s):i||(f[f.length]=s)}return f}function Nn(n,r,e,i){var f=-1,t=n==null?0:n.length;for(i&&t&&(e=n[++f]);++f<t;)e=r(e,n[f],f,n);return e}function en(n,r){for(var e=-1,i=n==null?0:n.length,f=0,t=[];++e<i;){var u=n[e];r(u,e,n)&&(t[f++]=u)}return t}function mn(){return[]}var Un=Object.prototype,Kn=Un.propertyIsEnumerable,Z=Object.getOwnPropertySymbols,Bn=Z?function(n){return n==null?[]:(n=Object(n),en(Z(n),function(r){return Kn.call(n,r)}))}:mn;function Hn(n,r,e){var i=r(n);return A(n)?i:rn(i,e(n))}function q(n){return Hn(n,x,Bn)}var Zn="__lodash_hash_undefined__";function qn(n){return this.__data__.set(n,Zn),this}function Yn(n){return this.__data__.has(n)}function c(n){var r=-1,e=n==null?0:n.length;for(this.__data__=new hn;++r<e;)this.add(n[r])}c.prototype.add=c.prototype.push=qn;c.prototype.has=Yn;function Jn(n,r){for(var e=-1,i=n==null?0:n.length;++e<i;)if(r(n[e],e,n))return!0;return!1}function tn(n,r){return n.has(r)}var Xn=1,Qn=2;function fn(n,r,e,i,f,t){var u=e&Xn,s=n.length,a=r.length;if(s!=a&&!(u&&a>s))return!1;var h=t.get(n),g=t.get(r);if(h&&g)return h==r&&g==n;var l=-1,d=!0,w=e&Qn?new c:void 0;for(t.set(n,r),t.set(r,n);++l<s;){var p=n[l],_=r[l];if(i)var o=u?i(_,p,l,r,n,t):i(p,_,l,n,r,t);if(o!==void 0){if(o)continue;d=!1;break}if(w){if(!Jn(r,function(O,v){if(!tn(w,v)&&(p===O||f(p,O,e,i,t)))return w.push(v)})){d=!1;break}}else if(!(p===_||f(p,_,e,i,t))){d=!1;break}}return t.delete(n),t.delete(r),d}function Wn(n){var r=-1,e=Array(n.size);return n.forEach(function(i,f){e[++r]=[f,i]}),e}function $(n){var r=-1,e=Array(n.size);return n.forEach(function(i){e[++r]=i}),e}var zn=1,Vn=2,kn="[object Boolean]",jn="[object Date]",nr="[object Error]",rr="[object Map]",er="[object Number]",ir="[object RegExp]",tr="[object Set]",fr="[object String]",ur="[object Symbol]",sr="[object ArrayBuffer]",ar="[object DataView]",Y=P?P.prototype:void 0,L=Y?Y.valueOf:void 0;function lr(n,r,e,i,f,t,u){switch(e){case ar:if(n.byteLength!=r.byteLength||n.byteOffset!=r.byteOffset)return!1;n=n.buffer,r=r.buffer;case sr:return!(n.byteLength!=r.byteLength||!t(new G(n),new G(r)));case kn:case jn:case er:return pn(+n,+r);case nr:return n.name==r.name&&n.message==r.message;case ir:case fr:return n==r+"";case rr:var s=Wn;case tr:var a=i&zn;if(s||(s=$),n.size!=r.size&&!a)return!1;var h=u.get(n);if(h)return h==r;i|=Vn,u.set(n,r);var g=fn(s(n),s(r),i,f,t,u);return u.delete(n),g;case ur:if(L)return L.call(n)==L.call(r)}return!1}var gr=1,dr=Object.prototype,hr=dr.hasOwnProperty;function pr(n,r,e,i,f,t){var u=e&gr,s=q(n),a=s.length,h=q(r),g=h.length;if(a!=g&&!u)return!1;for(var l=a;l--;){var d=s[l];if(!(u?d in r:hr.call(r,d)))return!1}var w=t.get(n),p=t.get(r);if(w&&p)return w==r&&p==n;var _=!0;t.set(n,r),t.set(r,n);for(var o=u;++l<a;){d=s[l];var O=n[d],v=r[d];if(i)var F=u?i(v,O,d,r,n,t):i(O,v,d,n,r,t);if(!(F===void 0?O===v||f(O,v,e,i,t):F)){_=!1;break}o||(o=d=="constructor")}if(_&&!o){var E=n.constructor,y=r.constructor;E!=y&&"constructor"in n&&"constructor"in r&&!(typeof E=="function"&&E instanceof E&&typeof y=="function"&&y instanceof y)&&(_=!1)}return t.delete(n),t.delete(r),_}var Ar=1,J="[object Arguments]",X="[object Array]",T="[object Object]",_r=Object.prototype,Q=_r.hasOwnProperty;function wr(n,r,e,i,f,t){var u=A(n),s=A(r),a=u?X:N(n),h=s?X:N(r);a=a==J?T:a,h=h==J?T:h;var g=a==T,l=h==T,d=a==h;if(d&&m(n)){if(!m(r))return!1;u=!0,g=!1}if(d&&!g)return t||(t=new R),u||An(n)?fn(n,r,e,i,f,t):lr(n,r,a,e,i,f,t);if(!(e&Ar)){var w=g&&Q.call(n,"__wrapped__"),p=l&&Q.call(r,"__wrapped__");if(w||p){var _=w?n.value():n,o=p?r.value():r;return t||(t=new R),f(_,o,e,i,t)}}return d?(t||(t=new R),pr(n,r,e,i,f,t)):!1}function C(n,r,e,i,f){return n===r?!0:n==null||r==null||!U(n)&&!U(r)?n!==n&&r!==r:wr(n,r,e,i,C,f)}var or=1,Or=2;function vr(n,r,e,i){var f=e.length,t=f;if(n==null)return!t;for(n=Object(n);f--;){var u=e[f];if(u[2]?u[1]!==n[u[0]]:!(u[0]in n))return!1}for(;++f<t;){u=e[f];var s=u[0],a=n[s],h=u[1];if(u[2]){if(a===void 0&&!(s in n))return!1}else{var g=new R,l;if(!(l===void 0?C(h,a,or|Or,i,g):l))return!1}}return!0}function un(n){return n===n&&!_n(n)}function Pr(n){for(var r=x(n),e=r.length;e--;){var i=r[e],f=n[i];r[e]=[i,f,un(f)]}return r}function sn(n,r){return function(e){return e==null?!1:e[n]===r&&(r!==void 0||n in Object(e))}}function cr(n){var r=Pr(n);return r.length==1&&r[0][2]?sn(r[0][0],r[0][1]):function(e){return e===n||vr(e,n,r)}}function Er(n,r){return n!=null&&r in Object(n)}function yr(n,r,e){r=j(r,n);for(var i=-1,f=r.length,t=!1;++i<f;){var u=b(r[i]);if(!(t=n!=null&&e(n,u)))break;n=n[u]}return t||++i!=f?t:(f=n==null?0:n.length,!!f&&wn(f)&&on(u,f)&&(A(n)||z(n)))}function Tr(n,r){return n!=null&&yr(n,r,Er)}var Rr=1,br=2;function Ir(n,r){return M(n)&&un(r)?sn(b(n),r):function(e){var i=Fn(e,n);return i===void 0&&i===r?Tr(e,n):C(r,i,Rr|br)}}function Lr(n){return function(r){return r==null?void 0:r[n]}}function Sr(n){return function(r){return nn(r,n)}}function xr(n){return M(n)?Lr(b(n)):Sr(n)}function an(n){return typeof n=="function"?n:n==null?V:typeof n=="object"?A(n)?Ir(n[0],n[1]):cr(n):xr(n)}function Mr(n,r){return n&&On(n,r,x)}function $r(n,r){return function(e,i){if(e==null)return e;if(!W(e))return n(e,i);for(var f=e.length,t=-1,u=Object(e);++t<f&&i(u[t],t,u)!==!1;);return e}}var D=$r(Mr);function Cr(n){return typeof n=="function"?n:V}function Br(n,r){var e=A(n)?cn:D;return e(n,Cr(r))}function Dr(n,r){var e=[];return D(n,function(i,f,t){r(i,f,t)&&e.push(i)}),e}function Hr(n,r){var e=A(n)?en:Dr;return e(n,an(r))}function Fr(n,r,e,i,f){return f(n,function(t,u,s){e=i?(i=!1,t):r(e,t,u,s)}),e}function Zr(n,r,e){var i=A(n)?Nn:Fr,f=arguments.length<3;return i(n,an(r),e,f,D)}var Gr=1/0,Nr=I&&1/$(new I([,-0]))[1]==Gr?function(n){return new I(n)}:Pn,mr=200;function qr(n,r,e){var i=-1,f=bn,t=n.length,u=!0,s=[],a=s;if(t>=mr){var h=r?null:Nr(n);if(h)return $(h);u=!1,f=tn,a=new c}else a=r?[]:s;n:for(;++i<t;){var g=n[i],l=r?r(g):g;if(g=g!==0?g:0,u&&l===l){for(var d=a.length;d--;)if(a[d]===l)continue n;r&&a.push(l),s.push(g)}else f(a,l,e)||(a!==s&&a.push(l),s.push(g))}return s}export{D as a,Kr as b,an as c,vn as d,rn as e,Hn as f,Bn as g,cn as h,q as i,qr as j,x as k,Hr as l,Br as m,En as n,Cr as o,Mr as p,yr as q,Zr as r,mn as s,j as t,b as u,nn as v,Tr as w,Dn as x};
1
+ import{aK as A,aL as S,a_ as P,aJ as W,bY as ln,bZ as gn,b_ as dn,b$ as z,c0 as hn,bT as pn,c1 as G,b1 as N,b6 as m,b9 as R,c2 as An,b0 as U,b4 as _n,c3 as wn,bW as on,aM as V,bU as On,c4 as I}from"./index-C2R7Is0-.js";function vn(n,r){for(var e=-1,i=n==null?0:n.length,f=Array(i);++e<i;)f[e]=r(n[e],e,n);return f}var K=P?P.prototype:void 0,B=K?K.toString:void 0;function k(n){if(typeof n=="string")return n;if(A(n))return vn(n,k)+"";if(S(n))return B?B.call(n):"";var r=n+"";return r=="0"&&1/n==-1/0?"-0":r}function Pn(){}function cn(n,r){for(var e=-1,i=n==null?0:n.length;++e<i&&r(n[e],e,n)!==!1;);return n}function En(n,r,e,i){for(var f=n.length,t=e+-1;++t<f;)if(r(n[t],t,n))return t;return-1}function yn(n){return n!==n}function Tn(n,r,e){for(var i=e-1,f=n.length;++i<f;)if(n[i]===r)return i;return-1}function Rn(n,r,e){return r===r?Tn(n,r,e):En(n,yn,e)}function bn(n,r){var e=n==null?0:n.length;return!!e&&Rn(n,r,0)>-1}function x(n){return W(n)?ln(n):gn(n)}var In=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,Ln=/^\w*$/;function M(n,r){if(A(n))return!1;var e=typeof n;return e=="number"||e=="symbol"||e=="boolean"||n==null||S(n)?!0:Ln.test(n)||!In.test(n)||r!=null&&n in Object(r)}var Sn=500;function xn(n){var r=dn(n,function(i){return e.size===Sn&&e.clear(),i}),e=r.cache;return r}var Mn=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,$n=/\\(\\)?/g,Cn=xn(function(n){var r=[];return n.charCodeAt(0)===46&&r.push(""),n.replace(Mn,function(e,i,f,t){r.push(f?t.replace($n,"$1"):i||e)}),r});function Dn(n){return n==null?"":k(n)}function j(n,r){return A(n)?n:M(n,r)?[n]:Cn(Dn(n))}function b(n){if(typeof n=="string"||S(n))return n;var r=n+"";return r=="0"&&1/n==-1/0?"-0":r}function nn(n,r){r=j(r,n);for(var e=0,i=r.length;n!=null&&e<i;)n=n[b(r[e++])];return e&&e==i?n:void 0}function Fn(n,r,e){var i=n==null?void 0:nn(n,r);return i===void 0?e:i}function rn(n,r){for(var e=-1,i=r.length,f=n.length;++e<i;)n[f+e]=r[e];return n}var H=P?P.isConcatSpreadable:void 0;function Gn(n){return A(n)||z(n)||!!(H&&n&&n[H])}function Kr(n,r,e,i,f){var t=-1,u=n.length;for(e||(e=Gn),f||(f=[]);++t<u;){var s=n[t];e(s)?rn(f,s):i||(f[f.length]=s)}return f}function Nn(n,r,e,i){var f=-1,t=n==null?0:n.length;for(i&&t&&(e=n[++f]);++f<t;)e=r(e,n[f],f,n);return e}function en(n,r){for(var e=-1,i=n==null?0:n.length,f=0,t=[];++e<i;){var u=n[e];r(u,e,n)&&(t[f++]=u)}return t}function mn(){return[]}var Un=Object.prototype,Kn=Un.propertyIsEnumerable,Z=Object.getOwnPropertySymbols,Bn=Z?function(n){return n==null?[]:(n=Object(n),en(Z(n),function(r){return Kn.call(n,r)}))}:mn;function Hn(n,r,e){var i=r(n);return A(n)?i:rn(i,e(n))}function q(n){return Hn(n,x,Bn)}var Zn="__lodash_hash_undefined__";function qn(n){return this.__data__.set(n,Zn),this}function Yn(n){return this.__data__.has(n)}function c(n){var r=-1,e=n==null?0:n.length;for(this.__data__=new hn;++r<e;)this.add(n[r])}c.prototype.add=c.prototype.push=qn;c.prototype.has=Yn;function Jn(n,r){for(var e=-1,i=n==null?0:n.length;++e<i;)if(r(n[e],e,n))return!0;return!1}function tn(n,r){return n.has(r)}var Xn=1,Qn=2;function fn(n,r,e,i,f,t){var u=e&Xn,s=n.length,a=r.length;if(s!=a&&!(u&&a>s))return!1;var h=t.get(n),g=t.get(r);if(h&&g)return h==r&&g==n;var l=-1,d=!0,w=e&Qn?new c:void 0;for(t.set(n,r),t.set(r,n);++l<s;){var p=n[l],_=r[l];if(i)var o=u?i(_,p,l,r,n,t):i(p,_,l,n,r,t);if(o!==void 0){if(o)continue;d=!1;break}if(w){if(!Jn(r,function(O,v){if(!tn(w,v)&&(p===O||f(p,O,e,i,t)))return w.push(v)})){d=!1;break}}else if(!(p===_||f(p,_,e,i,t))){d=!1;break}}return t.delete(n),t.delete(r),d}function Wn(n){var r=-1,e=Array(n.size);return n.forEach(function(i,f){e[++r]=[f,i]}),e}function $(n){var r=-1,e=Array(n.size);return n.forEach(function(i){e[++r]=i}),e}var zn=1,Vn=2,kn="[object Boolean]",jn="[object Date]",nr="[object Error]",rr="[object Map]",er="[object Number]",ir="[object RegExp]",tr="[object Set]",fr="[object String]",ur="[object Symbol]",sr="[object ArrayBuffer]",ar="[object DataView]",Y=P?P.prototype:void 0,L=Y?Y.valueOf:void 0;function lr(n,r,e,i,f,t,u){switch(e){case ar:if(n.byteLength!=r.byteLength||n.byteOffset!=r.byteOffset)return!1;n=n.buffer,r=r.buffer;case sr:return!(n.byteLength!=r.byteLength||!t(new G(n),new G(r)));case kn:case jn:case er:return pn(+n,+r);case nr:return n.name==r.name&&n.message==r.message;case ir:case fr:return n==r+"";case rr:var s=Wn;case tr:var a=i&zn;if(s||(s=$),n.size!=r.size&&!a)return!1;var h=u.get(n);if(h)return h==r;i|=Vn,u.set(n,r);var g=fn(s(n),s(r),i,f,t,u);return u.delete(n),g;case ur:if(L)return L.call(n)==L.call(r)}return!1}var gr=1,dr=Object.prototype,hr=dr.hasOwnProperty;function pr(n,r,e,i,f,t){var u=e&gr,s=q(n),a=s.length,h=q(r),g=h.length;if(a!=g&&!u)return!1;for(var l=a;l--;){var d=s[l];if(!(u?d in r:hr.call(r,d)))return!1}var w=t.get(n),p=t.get(r);if(w&&p)return w==r&&p==n;var _=!0;t.set(n,r),t.set(r,n);for(var o=u;++l<a;){d=s[l];var O=n[d],v=r[d];if(i)var F=u?i(v,O,d,r,n,t):i(O,v,d,n,r,t);if(!(F===void 0?O===v||f(O,v,e,i,t):F)){_=!1;break}o||(o=d=="constructor")}if(_&&!o){var E=n.constructor,y=r.constructor;E!=y&&"constructor"in n&&"constructor"in r&&!(typeof E=="function"&&E instanceof E&&typeof y=="function"&&y instanceof y)&&(_=!1)}return t.delete(n),t.delete(r),_}var Ar=1,J="[object Arguments]",X="[object Array]",T="[object Object]",_r=Object.prototype,Q=_r.hasOwnProperty;function wr(n,r,e,i,f,t){var u=A(n),s=A(r),a=u?X:N(n),h=s?X:N(r);a=a==J?T:a,h=h==J?T:h;var g=a==T,l=h==T,d=a==h;if(d&&m(n)){if(!m(r))return!1;u=!0,g=!1}if(d&&!g)return t||(t=new R),u||An(n)?fn(n,r,e,i,f,t):lr(n,r,a,e,i,f,t);if(!(e&Ar)){var w=g&&Q.call(n,"__wrapped__"),p=l&&Q.call(r,"__wrapped__");if(w||p){var _=w?n.value():n,o=p?r.value():r;return t||(t=new R),f(_,o,e,i,t)}}return d?(t||(t=new R),pr(n,r,e,i,f,t)):!1}function C(n,r,e,i,f){return n===r?!0:n==null||r==null||!U(n)&&!U(r)?n!==n&&r!==r:wr(n,r,e,i,C,f)}var or=1,Or=2;function vr(n,r,e,i){var f=e.length,t=f;if(n==null)return!t;for(n=Object(n);f--;){var u=e[f];if(u[2]?u[1]!==n[u[0]]:!(u[0]in n))return!1}for(;++f<t;){u=e[f];var s=u[0],a=n[s],h=u[1];if(u[2]){if(a===void 0&&!(s in n))return!1}else{var g=new R,l;if(!(l===void 0?C(h,a,or|Or,i,g):l))return!1}}return!0}function un(n){return n===n&&!_n(n)}function Pr(n){for(var r=x(n),e=r.length;e--;){var i=r[e],f=n[i];r[e]=[i,f,un(f)]}return r}function sn(n,r){return function(e){return e==null?!1:e[n]===r&&(r!==void 0||n in Object(e))}}function cr(n){var r=Pr(n);return r.length==1&&r[0][2]?sn(r[0][0],r[0][1]):function(e){return e===n||vr(e,n,r)}}function Er(n,r){return n!=null&&r in Object(n)}function yr(n,r,e){r=j(r,n);for(var i=-1,f=r.length,t=!1;++i<f;){var u=b(r[i]);if(!(t=n!=null&&e(n,u)))break;n=n[u]}return t||++i!=f?t:(f=n==null?0:n.length,!!f&&wn(f)&&on(u,f)&&(A(n)||z(n)))}function Tr(n,r){return n!=null&&yr(n,r,Er)}var Rr=1,br=2;function Ir(n,r){return M(n)&&un(r)?sn(b(n),r):function(e){var i=Fn(e,n);return i===void 0&&i===r?Tr(e,n):C(r,i,Rr|br)}}function Lr(n){return function(r){return r==null?void 0:r[n]}}function Sr(n){return function(r){return nn(r,n)}}function xr(n){return M(n)?Lr(b(n)):Sr(n)}function an(n){return typeof n=="function"?n:n==null?V:typeof n=="object"?A(n)?Ir(n[0],n[1]):cr(n):xr(n)}function Mr(n,r){return n&&On(n,r,x)}function $r(n,r){return function(e,i){if(e==null)return e;if(!W(e))return n(e,i);for(var f=e.length,t=-1,u=Object(e);++t<f&&i(u[t],t,u)!==!1;);return e}}var D=$r(Mr);function Cr(n){return typeof n=="function"?n:V}function Br(n,r){var e=A(n)?cn:D;return e(n,Cr(r))}function Dr(n,r){var e=[];return D(n,function(i,f,t){r(i,f,t)&&e.push(i)}),e}function Hr(n,r){var e=A(n)?en:Dr;return e(n,an(r))}function Fr(n,r,e,i,f){return f(n,function(t,u,s){e=i?(i=!1,t):r(e,t,u,s)}),e}function Zr(n,r,e){var i=A(n)?Nn:Fr,f=arguments.length<3;return i(n,an(r),e,f,D)}var Gr=1/0,Nr=I&&1/$(new I([,-0]))[1]==Gr?function(n){return new I(n)}:Pn,mr=200;function qr(n,r,e){var i=-1,f=bn,t=n.length,u=!0,s=[],a=s;if(t>=mr){var h=r?null:Nr(n);if(h)return $(h);u=!1,f=tn,a=new c}else a=r?[]:s;n:for(;++i<t;){var g=n[i],l=r?r(g):g;if(g=g!==0?g:0,u&&l===l){for(var d=a.length;d--;)if(a[d]===l)continue n;r&&a.push(l),s.push(g)}else f(a,l,e)||(a!==s&&a.push(l),s.push(g))}return s}export{D as a,Kr as b,an as c,vn as d,rn as e,Hn as f,Bn as g,cn as h,q as i,qr as j,x as k,Hr as l,Br as m,En as n,Cr as o,Mr as p,yr as q,Zr as r,mn as s,j as t,b as u,nn as v,Tr as w,Dn as x};