forge-openclaw-plugin 0.3.13 → 0.3.15

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 (144) hide show
  1. package/README.md +2 -2
  2. package/dist/assets/{action-bar-BFjWjRIM.js → action-bar-B9MYlps2.js} +1 -1
  3. package/dist/assets/{activity-page-D-6yBWuZ.js → activity-page-DbzbChcE.js} +1 -1
  4. package/dist/assets/{ai-surface-workspace-BEfo9bRO.js → ai-surface-workspace-CF0257Hs.js} +1 -1
  5. package/dist/assets/{atlas-panel-BfMyJXxQ.js → atlas-panel-CO3RYAKn.js} +1 -1
  6. package/dist/assets/{calendar-page-D4tQNJ2V.js → calendar-page-BuuHKEHC.js} +1 -1
  7. package/dist/assets/{calendar-rules-C-6O_uGU.js → calendar-rules-DKftgNx5.js} +1 -1
  8. package/dist/assets/{calendar-week-toolbar-_NzeKsYx.js → calendar-week-toolbar-ChIpkT-G.js} +1 -1
  9. package/dist/assets/{companion-sync-lab-page-D1Oqsf6M.js → companion-sync-lab-page-BZRX4Btw.js} +1 -1
  10. package/dist/assets/{daily-metrics-dashboard-DtE3pVOl.js → daily-metrics-dashboard-CXDsaAQd.js} +1 -1
  11. package/dist/assets/{define-workbench-box-D-32C8nM.js → define-workbench-box-CpG0Zb1L.js} +1 -1
  12. package/dist/assets/{entity-link-multiselect-DcCvkesQ.js → entity-link-multiselect-Dl4rZqdg.js} +1 -1
  13. package/dist/assets/{entity-note-count-link-Cjsk5oT2.js → entity-note-count-link-Bs1aKYyD.js} +1 -1
  14. package/dist/assets/{entity-notes-surface-DQQPLjxd.js → entity-notes-surface-B56XSw7M.js} +1 -1
  15. package/dist/assets/{execution-board-agWQbN-y.js → execution-board-D66C_ikW.js} +1 -1
  16. package/dist/assets/{faceted-token-search-DldM3-ru.js → faceted-token-search-Dg2rjknH.js} +1 -1
  17. package/dist/assets/{flagship-signal-deck-BlLYW9Kz.js → flagship-signal-deck-C6KVPhmM.js} +1 -1
  18. package/dist/assets/{floating-action-menu-D9-psbha.js → floating-action-menu-DAFAEBcA.js} +1 -1
  19. package/dist/assets/{generic-node-view-CcepUVhP.js → generic-node-view-C6DK5hJ6.js} +1 -1
  20. package/dist/assets/{goal-detail-page-DP1n5-Hk.js → goal-detail-page-CC4VXud6.js} +1 -1
  21. package/dist/assets/{goal-dialog-Oxx8WqbZ.js → goal-dialog-15hD8EBp.js} +1 -1
  22. package/dist/assets/{goals-page-CUt1a4Y2.js → goals-page-CQ2lJMzI.js} +1 -1
  23. package/dist/assets/{habits-page-5REbWAlo.js → habits-page-a7KVPaQp.js} +1 -1
  24. package/dist/assets/{health-boxes-sHNML3tm.js → health-boxes-DqgvIYoL.js} +1 -1
  25. package/dist/assets/index-ClJbJhca.css +1 -0
  26. package/dist/assets/index-FpGANF9S.js +2 -0
  27. package/dist/assets/{inline-note-fields-Bql_KfR9.js → inline-note-fields-COgzxr_7.js} +1 -1
  28. package/dist/assets/{insight-flow-dialog-CN-CMSB7.js → insight-flow-dialog-Dmb6NSGp.js} +1 -1
  29. package/dist/assets/{insights-page-B1u6ONtQ.js → insights-page-OnqR4cYI.js} +1 -1
  30. package/dist/assets/{kanban-boxes-DB1kuUlY.js → kanban-boxes-BWUzntCV.js} +1 -1
  31. package/dist/assets/{kanban-page-BBW9_vMu.js → kanban-page-BI16Gzp_.js} +1 -1
  32. package/dist/assets/{knowledge-graph-page-CoJaydZb.js → knowledge-graph-page-DxEBaEke.js} +1 -1
  33. package/dist/assets/{life-force-page-DBYbA1GF.js → life-force-page-CDEXEQai.js} +1 -1
  34. package/dist/assets/{life-force-workspace-BiD9xOEt.js → life-force-workspace-C7UOnJEf.js} +1 -1
  35. package/dist/assets/{metric-tile-CuP9DOYm.js → metric-tile-boeHB1R1.js} +1 -1
  36. package/dist/assets/{movement-boxes-DZg_qPPg.js → movement-boxes-BUSqaTL2.js} +1 -1
  37. package/dist/assets/{movement-page-CmwsQGR_.js → movement-page-DcbO0497.js} +1 -1
  38. package/dist/assets/note-markdown-DXXI3W3V.js +3 -0
  39. package/dist/assets/{note-tags-input-C_x5WdK5.js → note-tags-input-CYh3TVW2.js} +1 -1
  40. package/dist/assets/{notes-boxes-BEFlp9yd.js → notes-boxes-CMJXX2K0.js} +1 -1
  41. package/dist/assets/{notes-page-B6Vl-GPf.js → notes-page-DvHMcQey.js} +1 -1
  42. package/dist/assets/{open-in-graph-button-C-bJekoH.js → open-in-graph-button-4UYrp1XP.js} +1 -1
  43. package/dist/assets/{orbit-map-DHeTM15g.js → orbit-map-BwK7sDaC.js} +1 -1
  44. package/dist/assets/{overview-page-BRWje1F9.js → overview-page-Z5vaUTm3.js} +1 -1
  45. package/dist/assets/{page-hero-8bITsx_x.js → page-hero-DvrM83_C.js} +1 -1
  46. package/dist/assets/{pill-cluster-XQjm-wPc.js → pill-cluster-DYI3Ibj8.js} +1 -1
  47. package/dist/assets/{preference-entity-handoff-button-DwYF_5i3.js → preference-entity-handoff-button-C2ATjvws.js} +1 -1
  48. package/dist/assets/{preferences-page-C7DBPpNb.js → preferences-page-BAexXHye.js} +1 -1
  49. package/dist/assets/{project-collections-mtxanSMf.js → project-collections-B9nr-Ts-.js} +1 -1
  50. package/dist/assets/{project-detail-page-BT87Goqc.js → project-detail-page-B9PqyPu9.js} +1 -1
  51. package/dist/assets/{project-dialog-DnZe757y.js → project-dialog-CBA-D65n.js} +1 -1
  52. package/dist/assets/{project-management-hierarchy-page-B3R2lNFI.js → project-management-hierarchy-page-DXK14jn0.js} +1 -1
  53. package/dist/assets/{project-management-section-nav-DyBWxHbe.js → project-management-section-nav-DJ3QKCtr.js} +1 -1
  54. package/dist/assets/{projects-boxes-CxZj3P29.js → projects-boxes-iBu_PRqe.js} +1 -1
  55. package/dist/assets/{projects-page-Bec11c0x.js → projects-page-CdAk-ByT.js} +1 -1
  56. package/dist/assets/{psyche-behaviors-page-DWRpYvl1.js → psyche-behaviors-page-CbhhTfU2.js} +1 -1
  57. package/dist/assets/{psyche-flashcards-page-CX4rcsXZ.js → psyche-flashcards-page-DQaw_vUQ.js} +1 -1
  58. package/dist/assets/{psyche-goal-map-page-Y6b3lCvV.js → psyche-goal-map-page-C-ZTVOEP.js} +1 -1
  59. package/dist/assets/{psyche-graph-CQuCWKIp.js → psyche-graph-DYzeClxn.js} +1 -1
  60. package/dist/assets/{psyche-metrics-page-DadDJOnm.js → psyche-metrics-page-C9hKn10A.js} +1 -1
  61. package/dist/assets/{psyche-mode-guide-page-B1nz0uCg.js → psyche-mode-guide-page-CR8e984W.js} +1 -1
  62. package/dist/assets/{psyche-modes-page-i3uSuhKA.js → psyche-modes-page-lQdpAcY3.js} +1 -1
  63. package/dist/assets/{psyche-page-Y_s-BE2m.js → psyche-page-CTdIDkw9.js} +1 -1
  64. package/dist/assets/{psyche-patterns-page-DaaOLIlN.js → psyche-patterns-page-Drgm-f7I.js} +1 -1
  65. package/dist/assets/{psyche-questionnaire-builder-page-CuF7rXOv.js → psyche-questionnaire-builder-page-gRwdGXde.js} +1 -1
  66. package/dist/assets/{psyche-questionnaire-detail-page-BfFEMkRY.js → psyche-questionnaire-detail-page-CIP9b2UI.js} +1 -1
  67. package/dist/assets/{psyche-questionnaire-run-detail-page-BoQTvd7Q.js → psyche-questionnaire-run-detail-page-SYndwtF3.js} +1 -1
  68. package/dist/assets/{psyche-questionnaire-run-page-C0qKiNZN.js → psyche-questionnaire-run-page-CXiJyd5i.js} +1 -1
  69. package/dist/assets/{psyche-questionnaires-page-B6hfD448.js → psyche-questionnaires-page-CFPKwA3O.js} +1 -1
  70. package/dist/assets/{psyche-report-detail-page-BlFL8moM.js → psyche-report-detail-page-dU30a2WE.js} +1 -1
  71. package/dist/assets/{psyche-reports-page-DAAcYENp.js → psyche-reports-page-Cn0EBndy.js} +1 -1
  72. package/dist/assets/{psyche-schemas-beliefs-page-CsxKSrKM.js → psyche-schemas-beliefs-page-Bab4xSWv.js} +1 -1
  73. package/dist/assets/{psyche-screen-time-page-n4b0e58x.js → psyche-screen-time-page-lIe6GQxJ.js} +1 -1
  74. package/dist/assets/{psyche-self-observation-page-BaxEQ2-3.js → psyche-self-observation-page-BTE3KfIl.js} +1 -1
  75. package/dist/assets/{psyche-values-page-DTv5NMSU.js → psyche-values-page-DclBZ9xw.js} +1 -1
  76. package/dist/assets/question-flow-dialog-Ded2E85L.js +2 -0
  77. package/dist/assets/{report-chain-fields-D132-EMh.js → report-chain-fields-DY640iqL.js} +1 -1
  78. package/dist/assets/{rewards-page-C533lVP-.js → rewards-page-FxUXB76B.js} +1 -1
  79. package/dist/assets/{scheduling-rules-editor-CDpontGp.js → scheduling-rules-editor-jakFfxqF.js} +1 -1
  80. package/dist/assets/{schema-badge-B3DiMnjB.js → schema-badge-30B5syHA.js} +1 -1
  81. package/dist/assets/{schemas-CH1_ngUX.js → schemas-Db29G8NU.js} +1 -1
  82. package/dist/assets/{select-menu-BOF-k4Ln.js → select-menu-BF2zI3RW.js} +1 -1
  83. package/dist/assets/{settings-agents-page-B5OQtlZX.js → settings-agents-page-Bh-Bv6FQ.js} +1 -1
  84. package/dist/assets/{settings-bin-page-D_bk3Kcu.js → settings-bin-page-DT8JJero.js} +1 -1
  85. package/dist/assets/{settings-calendar-page-PuSj9_kM.js → settings-calendar-page-BA4_Qqiu.js} +3 -3
  86. package/dist/assets/{settings-data-page-EwFMaeq6.js → settings-data-page-K4kpmQJY.js} +1 -1
  87. package/dist/assets/{settings-logs-page-BKkse0DX.js → settings-logs-page-DkuNPAZo.js} +1 -1
  88. package/dist/assets/{settings-mobile-page-BrIVmdeB.js → settings-mobile-page-4pCNwD91.js} +1 -1
  89. package/dist/assets/{settings-models-page-Mg84D_0K.js → settings-models-page-CZHG3t7W.js} +1 -1
  90. package/dist/assets/{settings-page-D-kul92f.js → settings-page-B_Be0vOY.js} +1 -1
  91. package/dist/assets/{settings-rewards-page-waNyCcX_.js → settings-rewards-page-C6nFTWJu.js} +1 -1
  92. package/dist/assets/{settings-section-nav-BmJWnrYk.js → settings-section-nav-Lo-VKCfZ.js} +1 -1
  93. package/dist/assets/{settings-users-page-DBgC6y56.js → settings-users-page-CVzNp4-m.js} +1 -1
  94. package/dist/assets/{settings-wiki-page-CM0te9dI.js → settings-wiki-page-DXM--7BB.js} +1 -1
  95. package/dist/assets/sleep-page-DvPdZMKx.js +1 -0
  96. package/dist/assets/{sports-page-eg5Rfc_E.js → sports-page-DjuZlOur.js} +1 -1
  97. package/dist/assets/{strategies-page-D4AqvFNW.js → strategies-page-PE1IlatS.js} +1 -1
  98. package/dist/assets/{strategy-detail-page-BlYVkXaW.js → strategy-detail-page-C4KiEGCI.js} +1 -1
  99. package/dist/assets/{strategy-dialog-FO9Oa0dB.js → strategy-dialog-Cwf7Y3P5.js} +1 -1
  100. package/dist/assets/surface-ubuOfukq.js +1 -0
  101. package/dist/assets/{task-detail-page-Dy-aRyY6.js → task-detail-page-B3SMFZQ3.js} +1 -1
  102. package/dist/assets/{task-dialog-DrA9pba7.js → task-dialog-CI_Fy_FW.js} +1 -1
  103. package/dist/assets/{timebox-planning-dialog-C_gnfxFx.js → timebox-planning-dialog-BtFuVoA1.js} +1 -1
  104. package/dist/assets/{today-boxes-BFOws_iC.js → today-boxes-CYuxSkZf.js} +1 -1
  105. package/dist/assets/{today-page-BoPj6a6q.js → today-page-CHGpLEZ3.js} +1 -1
  106. package/dist/assets/{training-load-page-DGU40Zfl.js → training-load-page-GZJF-Yy5.js} +1 -1
  107. package/dist/assets/{user-badge-CZWtYeMw.js → user-badge-ByhC6bMU.js} +1 -1
  108. package/dist/assets/{utility-widgets-B3wWGxQc.js → utility-widgets-ilORjDmg.js} +1 -1
  109. package/dist/assets/{vitals-page-BXRZEP_8.js → vitals-page-mdEqIm_9.js} +1 -1
  110. package/dist/assets/{weekly-review-page-D5cebA5x.js → weekly-review-page-C8W-yg5r.js} +1 -1
  111. package/dist/assets/weight-loss-page-BApTknCn.js +5 -0
  112. package/dist/assets/{wiki-article-markdown-CvaCjg_t.js → wiki-article-markdown-DBccllQg.js} +1 -1
  113. package/dist/assets/{wiki-editor-page-Dco79SLY.js → wiki-editor-page-BfRfH1O3.js} +2 -2
  114. package/dist/assets/{wiki-ingest-history-page-uvKRkRDF.js → wiki-ingest-history-page-C-6H3MU6.js} +1 -1
  115. package/dist/assets/{wiki-ingest-modal-BW6AJPea.js → wiki-ingest-modal-DnlhByD_.js} +1 -1
  116. package/dist/assets/{wiki-page-BIL5zMqv.js → wiki-page-DPZ55e3x.js} +1 -1
  117. package/dist/assets/{workbench-flow-page-Dx_nq8R_.js → workbench-flow-page-_-NKIx5R.js} +1 -1
  118. package/dist/assets/{workbench-page-BJnt_Zzf.js → workbench-page-NIAzggwX.js} +1 -1
  119. package/dist/assets/{workout-detail-page-CKgqyB-y.js → workout-detail-page-3fxr6HL4.js} +1 -1
  120. package/dist/index.html +6 -6
  121. package/dist/openclaw/index.d.ts +2 -7
  122. package/dist/server/server/src/app.js +16 -7
  123. package/dist/server/server/src/health-weight-loss.js +321 -14
  124. package/dist/server/server/src/managers/platform/openai-responses-provider.js +2 -2
  125. package/dist/server/server/src/openapi.js +30 -3
  126. package/dist/server/server/src/repositories/ai-connectors.js +1 -1
  127. package/openclaw.plugin.json +1 -1
  128. package/package.json +6 -4
  129. package/server/index.js +6 -1
  130. package/skills/forge-openclaw/SKILL.md +76 -8
  131. package/skills/forge-openclaw/entity_conversation_playbooks.md +167 -5
  132. package/skills/forge-openclaw/psyche_entity_playbooks.md +84 -0
  133. package/dist/assets/favicon-B6oXI6k4.ico +0 -0
  134. package/dist/assets/favicon-Bai4rhyS.png +0 -0
  135. package/dist/assets/favicon-ERg17ZCd.svg +0 -3
  136. package/dist/assets/index-CQ5r7ZUz.js +0 -2
  137. package/dist/assets/index-FxgNSuZX.css +0 -1
  138. package/dist/assets/note-markdown-B82ncnFt.js +0 -3
  139. package/dist/assets/question-flow-dialog-CskCt5NZ.js +0 -2
  140. package/dist/assets/sleep-page-C_krRE59.js +0 -1
  141. package/dist/assets/surface-MVeeZGKB.js +0 -1
  142. package/dist/assets/weight-loss-page-BuUdFh9z.js +0 -5
  143. package/skills/forge-openclaw/SKILL.md.bak-20260415 +0 -552
  144. package/skills/forge-openclaw/entity_conversation_playbooks.md.bak-20260415 +0 -1303
@@ -4137,6 +4137,8 @@ export function buildOpenApiDocument() {
4137
4137
  "saveSuggestionPlacement",
4138
4138
  "saveSuggestionTone",
4139
4139
  "maxQuestionsPerTurn",
4140
+ "depthCalibrationRule",
4141
+ "operationLaneRule",
4140
4142
  "psycheExplorationRule",
4141
4143
  "specializedSurfaceRule",
4142
4144
  "reviewShortcutRule",
@@ -4158,6 +4160,8 @@ export function buildOpenApiDocument() {
4158
4160
  saveSuggestionPlacement: { type: "string" },
4159
4161
  saveSuggestionTone: { type: "string" },
4160
4162
  maxQuestionsPerTurn: { type: "integer" },
4163
+ depthCalibrationRule: { type: "string" },
4164
+ operationLaneRule: { type: "string" },
4161
4165
  psycheExplorationRule: { type: "string" },
4162
4166
  specializedSurfaceRule: { type: "string" },
4163
4167
  reviewShortcutRule: { type: "string" },
@@ -6152,9 +6156,10 @@ export function buildOpenApiDocument() {
6152
6156
  additionalProperties: false,
6153
6157
  properties: {
6154
6158
  text: { type: "string" },
6155
- imageDescription: { type: "string" },
6156
- loggedAt: { type: "string", format: "date-time" },
6157
- mealLabel: { type: "string" }
6159
+ mealTime: { type: "string", format: "date-time" },
6160
+ imageRefs: arrayOf({ type: "string" }),
6161
+ connectionId: { type: "string" },
6162
+ commitCandidate: { type: "boolean" }
6158
6163
  }
6159
6164
  }
6160
6165
  }
@@ -6166,6 +6171,7 @@ export function buildOpenApiDocument() {
6166
6171
  required: [
6167
6172
  "candidate",
6168
6173
  "log",
6174
+ "parseSummary",
6169
6175
  "clarificationQuestions",
6170
6176
  "uncertaintyReasons"
6171
6177
  ],
@@ -6176,6 +6182,27 @@ export function buildOpenApiDocument() {
6176
6182
  log: nullable({
6177
6183
  $ref: "#/components/schemas/NutritionFoodLog"
6178
6184
  }),
6185
+ parseSummary: {
6186
+ type: "object",
6187
+ required: [
6188
+ "itemCount",
6189
+ "completeNutritionItemCount",
6190
+ "catalogResolvedItemCount",
6191
+ "chatGptEstimatedItemCount",
6192
+ "chatGptValidatedItemCount",
6193
+ "elapsedMs",
6194
+ "llmCallCount"
6195
+ ],
6196
+ properties: {
6197
+ itemCount: { type: "number" },
6198
+ completeNutritionItemCount: { type: "number" },
6199
+ catalogResolvedItemCount: { type: "number" },
6200
+ chatGptEstimatedItemCount: { type: "number" },
6201
+ chatGptValidatedItemCount: { type: "number" },
6202
+ elapsedMs: { type: "number" },
6203
+ llmCallCount: { type: "number" }
6204
+ }
6205
+ },
6179
6206
  clarificationQuestions: arrayOf({ type: "string" }),
6180
6207
  uncertaintyReasons: arrayOf({ type: "string" })
6181
6208
  }
@@ -778,7 +778,7 @@ async function runOpenAiConversationPrompt(input) {
778
778
  text: typeof input.profile.metadata.verbosity === "string"
779
779
  ? { verbosity: input.profile.metadata.verbosity }
780
780
  : undefined,
781
- max_output_tokens: 1200
781
+ ...(isCodexProfile(input.profile) ? {} : { max_output_tokens: 1200 })
782
782
  })
783
783
  });
784
784
  if (!response.ok) {
@@ -2,7 +2,7 @@
2
2
  "id": "forge-openclaw-plugin",
3
3
  "name": "Forge",
4
4
  "description": "Curated OpenClaw adapter for the Forge collaboration API, UI entrypoint, and localhost auto-start runtime.",
5
- "version": "0.3.13",
5
+ "version": "0.3.15",
6
6
  "activation": {
7
7
  "onStartup": true,
8
8
  "onCapabilities": [
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "forge-openclaw-plugin",
3
- "version": "0.3.13",
3
+ "version": "0.3.15",
4
4
  "description": "Curated OpenClaw adapter for the Forge collaboration API, UI entrypoint, and localhost auto-start runtime.",
5
5
  "type": "module",
6
6
  "license": "Apache-2.0",
@@ -40,11 +40,11 @@
40
40
  "./dist/openclaw/index.js"
41
41
  ],
42
42
  "install": {
43
- "minHostVersion": ">=2026.5.4"
43
+ "minHostVersion": ">=2026.6.9"
44
44
  }
45
45
  },
46
46
  "peerDependencies": {
47
- "openclaw": "2026.5.4"
47
+ "openclaw": "2026.6.9"
48
48
  },
49
49
  "dependencies": {
50
50
  "@azure/msal-node": "^5.1.2",
@@ -57,6 +57,7 @@
57
57
  "@fontsource-variable/sora": "^5.2.8",
58
58
  "@fontsource/space-grotesk": "^5.2.10",
59
59
  "@hookform/resolvers": "^5.1.1",
60
+ "@mariozechner/pi-agent-core": "^0.73.1",
60
61
  "@mariozechner/pi-ai": "^0.66.1",
61
62
  "@radix-ui/react-dialog": "^1.1.14",
62
63
  "@reduxjs/toolkit": "^2.11.2",
@@ -80,7 +81,7 @@
80
81
  "graphology-layout": "^0.6.1",
81
82
  "graphology-layout-forceatlas2": "^0.10.1",
82
83
  "lucide-react": "^0.525.0",
83
- "node-ical": "^0.20.1",
84
+ "node-ical": "^0.26.1",
84
85
  "qrcode": "^1.5.4",
85
86
  "react": "^19.1.0",
86
87
  "react-arborist": "^3.4.3",
@@ -105,6 +106,7 @@
105
106
  "follow-redirects": "^1.16.0",
106
107
  "hono": "^4.12.18",
107
108
  "ip-address": "^10.2.0",
109
+ "markdown-it": "^14.2.0",
108
110
  "ws": "^8.20.1",
109
111
  "uuid": "^14.0.0"
110
112
  },
package/server/index.js CHANGED
@@ -7,7 +7,12 @@ const packageRoot = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "
7
7
  const repoRoot = path.resolve(packageRoot, "..");
8
8
  const builtRuntimeEntry = path.join(packageRoot, "dist", "server", "server", "src", "index.js");
9
9
  const devRuntimeEntry = path.join(repoRoot, "server", "src", "index.ts");
10
- const devDataRootWrapper = path.join(repoRoot, "scripts", "with-openclaw-plugin-data-root.mjs");
10
+ const devDataRootWrapper = path.join(
11
+ repoRoot,
12
+ "scripts",
13
+ "dev",
14
+ "with-openclaw-plugin-data-root.mjs"
15
+ );
11
16
  const tsxCliEntry = path.join(repoRoot, "node_modules", "tsx", "dist", "cli.mjs");
12
17
  const devModeFlag = (process.env.FORGE_OPENCLAW_DEV ?? "").trim().toLowerCase();
13
18
  const useDevRuntime = devModeFlag === "1" || devModeFlag === "true" || devModeFlag === "yes";
@@ -103,12 +103,25 @@ any route-key or endpoint detail.
103
103
  route-key-to-`METHOD /api/v1/...` source of truth when checking specialized
104
104
  methods, especially POST aggregate reads such as Movement `selection` and DELETE
105
105
  repair paths. When a route key's exact path contains placeholders such as `:id`,
106
- `:weekday`, `:runId`, or `:nodeId`, pass those values in `pathParams` using the
107
- placeholder names exactly. Do not place IDs inside `routeKey`, invent a raw route
108
- string, or ask the user to choose an endpoint when the lane already selects one. If
109
- that schema and live onboarding disagree, trust the live onboarding for the current
110
- call and treat the disagreement as a Forge contract bug to fix, not as a reason to
111
- guess a nearby route.
106
+ `:weekday`, `:slug`, `:runId`, `:nodeId`, or `:pointId`, pass those values in
107
+ `pathParams` using the placeholder names exactly. Do not place IDs inside
108
+ `routeKey`, `query`, or `body`, invent a raw route string, or ask the user to
109
+ choose an endpoint when the lane already selects one. If that schema and live
110
+ onboarding disagree, trust the live onboarding for the current call and treat the
111
+ disagreement as a Forge contract bug to fix, not as a reason to guess a nearby
112
+ route.
113
+ - If a specialized route-key tool is unavailable, stale, or missing the needed route
114
+ key, do not fall back to generic batch CRUD and do not invent a nearby raw path. Read
115
+ live onboarding, use the exact `methodRoutes` entry for the selected Movement, Life
116
+ Force, or Workbench lane, and cross-check OpenAPI only to confirm the same method
117
+ and path.
118
+ - Before every Movement, Life Force, or Workbench call, run a route-contract
119
+ handshake internally: select the product lane in plain language, verify the matching
120
+ `routeKey` against live onboarding `routeKeys` and `methodRoutes`, fill any
121
+ placeholders through `pathParams`, and ask the user only for the missing product
122
+ noun that fills the placeholder. If the contract is missing a lane the product
123
+ clearly supports, report a contract bug instead of silently using generic batch
124
+ CRUD or a nearby route.
112
125
 
113
126
  Concrete route-key examples for internal use:
114
127
 
@@ -193,6 +206,15 @@ Wiki rule:
193
206
  - Use the wiki tools when the user wants SQLite-backed reference pages, backlink-aware recall, ingest from a URL or local file, or wiki maintenance work such as unresolved-link cleanup.
194
207
  - `forge_ingest_wiki_source` now queues the ingest as background work; use the Forge UI handoff when the user wants to review or keep only selected wiki/entity candidates after the ingest finishes.
195
208
  - Keep evidence notes and wiki pages conceptually distinct: evidence notes are linked operating records, while wiki pages are curated long-form memory.
209
+ - Ingestion policy for OpenClaw, Hermes, Codex, and Claude Code adapters:
210
+ - Before ingesting, call `forge_get_wiki_settings` so the agent knows the available spaces, LLM profiles, and embedding profiles. Prefer the shared wiki space for durable shared knowledge unless the current settings or user request clearly require another space.
211
+ - Use `forge_ingest_wiki_source` for raw text, local files, and URLs. Do not build an ad hoc importer or write raw source pages manually unless the Forge ingest tool is broken; if it is broken, fix the ingest path and tests before proceeding.
212
+ - Preserve source/evidence artifacts for audit, but do not make the wiki a transcript dump, movement log, release log, or repetitive check-in archive. Evidence supports knowledge; canonical wiki pages should be curated, readable, structured articles.
213
+ - Detect and propose durable pages for important people, organizations, projects, places, events, concepts, recurring relationship patterns, decisions, preferences, commitments, and timelines. A detected person or important concept should become or update a real wiki page, not disappear into one source note.
214
+ - Merge duplicates deliberately into one canonical page per real concept/person/project. Do not merely rename a page, hide a duplicate, or keep competing partial pages. Combine the durable information, preserve aliases and backlinks, and link the original evidence/source pages from the canonical page.
215
+ - Keep normal personal context when it is useful knowledge. Redact or omit actual secrets and security/payment credentials such as passwords, API keys, tokens, private auth links, card numbers, and similar material; do not over-redact ordinary names, relationships, work context, events, or preferences just because they are personal.
216
+ - After ingest or merge work, run `forge_sync_wiki_vault`, then use `forge_get_wiki_health`, search/list checks, and spot reads to verify created and updated pages, duplicate candidates, unresolved links, missing summaries, evidence links, and whether source material is reachable from canonical pages.
217
+ - Report what was created, updated, merged, left unresolved, and how evidence is preserved. If the user asked for reviewable candidates, hand off to the Forge UI ingest review instead of pretending the adapter can approve candidates inline.
196
218
 
197
219
  Wiki navigation and search rule:
198
220
 
@@ -249,12 +271,24 @@ Write to Forge only with clear user consent. If the user is just thinking aloud,
249
271
  Entity conversation rule:
250
272
 
251
273
  - For all entity creation or update flows, first use [`entity_conversation_playbooks.md`](./entity_conversation_playbooks.md) to decide the next best question.
274
+ - Calibrate depth before deepening: choose quick capture, guided formulation,
275
+ review-first, or action-first. For quick capture, use the user's supplied wording,
276
+ ask only the one structural, accuracy, or consent detail that changes the write, and
277
+ do not force full exploration. For guided formulation, use active listening and
278
+ Psyche hypotheses when the user is trying to understand or name charged material.
279
+ For review-first, read before write-shaped questions. For action-first, act or ask
280
+ only for the missing target, span, weekday, flow, run, node, correction, or consent.
252
281
  - Ask only for what is missing or unclear. Do not walk through every schema field.
253
282
  - Before asking another question, run the playbook's minimum save-readiness
254
283
  checkpoint: if accepted wording, meaningful body, route lane, target object or
255
284
  time scope, and any ownership/placement that changes later use are already clear,
256
285
  summarize once and write, read, run, or update instead of collecting optional
257
286
  fields.
287
+ - Run the no-question gate before every follow-up: ask only if the answer can change
288
+ record type, accepted wording, hierarchy placement, owner/accountability, timing,
289
+ route lane, target object, correction, link, verification read, run/publish/preserve
290
+ action, or consent. If the question would only add warmth, completeness, optional
291
+ metadata, or form polish, skip it, summarize what is clear, and act or close.
258
292
  - Treat partial answers as progress. Before another follow-up, identify what is
259
293
  already usable: operation, entity or surface, target record or time span, working
260
294
  wording, owner or placement, route lane, and consent. Ask only for the first missing
@@ -263,8 +297,18 @@ Entity conversation rule:
263
297
  - Do not ask for optional tags, priority, status, dates, color, links, or assignees
264
298
  when accepted wording and meaningful body are enough unless that metadata changes
265
299
  accountability, retrieval, or execution.
300
+ - After a read returns data and several next actions are plausible, choose the one
301
+ most directly supported by what was learned and ask only for the missing detail
302
+ that would permit that action. Do not hand the user a broad menu after the read has
303
+ already narrowed the work.
304
+ - Make the read's decision value explicit before any follow-up: what the read rules
305
+ in, what it rules out, and what one uncertainty remains. If no answer-changing
306
+ uncertainty remains, close cleanly instead of asking another question.
266
307
  - Let each question have one job. Know what you are trying to clarify before you ask it.
267
- - Before you ask, decide the exact missing thing you need and how that answer will help you name, place, or save the record.
308
+ - Before you ask, decide the exact missing thing you need and how that answer will
309
+ help you save, update, review, link, schedule, correct, run, publish, preserve,
310
+ enrich, open the UI, or stop. If you cannot name what the user's answer would
311
+ change, summarize and act instead of asking.
268
312
  - Prefer a progression of:
269
313
  concrete example or intent -> working name -> purpose or meaning -> placement in Forge -> operational details -> linked context.
270
314
  - Use those same playbooks for action-heavy non-Psyche flows such as `work_adjustment`, `preference_judgment`, `preference_signal`, and specialized `movement`, `life_force`, or `workbench` requests so the conversation starts from what the user is trying to understand, change, add, update, link, or run before you choose the route.
@@ -279,6 +323,14 @@ Entity conversation rule:
279
323
  - When the operation is not already explicit, identify the job first:
280
324
  add, update, review, compare, navigate, link, or run. Skip that meta question
281
325
  when the action is already obvious from the user's wording.
326
+ - Keep the operation lane explicit across every entity family. Normal stored entities
327
+ can be added, updated, reviewed/navigated, linked, or placed; action workflows use
328
+ verbs such as start, continue, complete, adjust, judge, signal, publish, sync, or
329
+ observe; specialized CRUD uses lifecycle verbs; read models need a practical read
330
+ question and scope; Movement, Life Force, and Workbench use review, correct,
331
+ repair, run, inspect, publish, or preserve lanes through their dedicated route keys;
332
+ and Psyche entities need formulation before storage when the user wants
333
+ understanding rather than direct save.
282
334
  - For emotionally meaningful non-Psyche records such as goals, habits, and notes, reflect the meaning before you ask for structure.
283
335
  - When the user is vague, ask for one small concrete example, stake, or desired outcome before you ask them to name the record.
284
336
  - When the user is clear, say what the record seems to be becoming and ask only for the last missing detail.
@@ -334,7 +386,14 @@ Psyche interview rule:
334
386
  - Do not minimize functional analysis, trigger chains, behavior patterns, modes, beliefs, or schema themes. Once at least one concrete example is clear, offer one careful interpretive hypothesis when it would help the user understand the function, protection, cost, belief, mode, or schema theme.
335
387
  - Phrase interpretive hypotheses as collaborative and testable, not as verdicts. A good hypothesis says what the reaction may be protecting, predicting, relieving, or costing, then asks whether that lands or needs correction.
336
388
  - For Psyche hypotheses, reduce the formulation burden. After one concrete example, offer one tentative function, danger, protection, payoff, or cost hypothesis and ask one fit-or-correction question. Do not make the user prove the experience, list evidence, or design repair before the wording feels held.
389
+ - Use the Psyche hypothesis examples when one concrete episode, belief sentence,
390
+ behavior, or mode voice is visible and another broad question would make the user do
391
+ all the interpretation alone. Offer one testable formulation, ask one correction
392
+ question, and then bridge to the saveable record if it lands.
337
393
  - Do not keep asking broad exploratory Psyche questions after the cue, meaning, protection, payoff, or cost is already visible. For `behavior_pattern`, `belief_entry`, `mode_profile`, `mode_guide_session`, and `trigger_report`, the next helpful move is usually one active formulation plus one correction question, not another passive reflection.
394
+ - Do not leave the user with interpretation alone. Once the hypothesis lands or is
395
+ corrected, name the primary Forge record it becomes and ask one accuracy or consent
396
+ question that moves toward saving the corrected formulation.
338
397
  - Use the hypothesis timing checkpoint before asking a second or third deepening question: offer a hypothesis when one concrete episode, body cue, belief sentence, behavior, or mode voice is visible and the hypothesis would change the record shape, wording, links, or next action. Do not hypothesize yet when no concrete moment is visible, the user only wants a direct mechanical save, the user is flooded or unsafe, or the only available interpretation would be diagnosis-like, an origin story, or a certainty claim.
339
398
  - If several Psyche containers are plausible, do not ask the user to choose from a taxonomy menu first. Reflect the lived difference, offer one careful hypothesis when a concrete example is visible, then distinguish the options in plain language: one episode as a `trigger_report`, a recurring loop as a `behavior_pattern`, one repeated move as `behavior`, one sentence as `belief_entry`, a part-state as `mode_profile` or `mode_guide_session`, or reusable future-labeling as `event_type` or `emotion_definition`.
340
399
  - For Psyche updates, start with what feels newly true, newly visible, or newly inaccurate, then ask what should stay true before changing the formulation.
@@ -358,6 +417,9 @@ Psyche interview rule:
358
417
  trigger episode, value phrase, event kind, emotion signature, or flashcard message,
359
418
  treat it as real data and ask one accuracy or consent question instead of reopening
360
419
  origin, evidence, or repair.
420
+ - For direct Psyche saves, do not reopen origin, evidence, or repair when the user
421
+ already supplied usable wording and asked to save it. Reflect the wording, ask one
422
+ accuracy or consent question, and save when accepted.
361
423
  - When the conversation reveals an adjacent entity such as a linked belief, mode, value, pattern, or note, name that gently and ask whether the user wants to map it too.
362
424
  - If nuance matters, preserve it in a linked Markdown `note` instead of forcing every detail into normalized fields.
363
425
  - If the user shows imminent risk of self-harm, suicide, violence, inability to stay safe, or severe disorientation, stop normal intake and prioritize urgent human support or emergency help instead.
@@ -422,7 +484,7 @@ Use these exact entity meanings when deciding what the user is describing.
422
484
 
423
485
  `flashcard` is a small therapeutic reminder card. Use it when the user wants a sentence or short message that can be shown back during an urge, trigger, mode activation, belief activation, or values-based pivot. The message is the main content; title is optional and compact. Tags, trigger sentence, trigger situation, and Psyche links matter most for retrieval. Styling fields such as colors, typography, layout, visual tone, and image make the card easier to recognize but should come after the therapeutic sentence is clear.
424
486
 
425
- When a user says something like "I feel the urge to drink" or "help me not do this", search existing `flashcard` records first with `forge_search_entities` using `entityTypes: ["flashcard"]` and the user's urge, trigger words, tags, and situation language. If a matching card exists, show the flashcard message first, then add brief psychotherapy-informed support around it: grounding, urge surfing, cognitive defusion, schema/mode-aware reflection, or a values pivot. Do not create a new card until you have checked whether an existing one already fits.
487
+ When a user says something like "I feel the urge to drink" or "help me not do this", search existing `flashcard` records first with `forge_search_entities` using `entityTypes: ["flashcard"]` and the user's urge, trigger words, tags, and situation language. If a matching card exists, show the flashcard message first, then add brief psychotherapy-informed support around it: grounding, urge surfing, cognitive defusion, schema/mode-aware reflection, or a values pivot. If no card fits and the user wants one, create only after the cue or urge sentence and the short message are clear; postpone visual style, colors, tags, and optional links until the intervention sentence works.
426
488
 
427
489
  `trigger_report` is one specific emotionally meaningful episode described as what happened, what was felt, what was thought, what was done, what happened next, and what would help next time.
428
490
 
@@ -660,6 +722,12 @@ through `forge_create_entities` or `forge_update_entities`.
660
722
  - If you are unsure which specialized route family applies, check `forge_get_agent_onboarding` and use its `entityRouteModel.specializedDomainSurfaces` section before guessing.
661
723
  - If the truth of the current Movement, Life Force, or Workbench state is still unclear, prefer the dedicated read before the mutation so the correction stays truthful.
662
724
  - After a concrete Movement, Life Force, or Workbench correction, mutation, or result-producing run, read the relevant specialized view back when the user is trying to understand the result rather than only store it: timeline or place/settings detail for Movement, the Life Force overview for energy-planning impact, and flow detail, run detail, node result, latest node output, published output, or run history for Workbench.
725
+ - After any dedicated Movement, Life Force, or Workbench read, translate the result
726
+ into one next action: no change, Movement overlay/place/settings/link, Life Force
727
+ workload/recovery/timebox/meeting/task-choice change, or Workbench
728
+ rerun/node-inspection/flow-edit/publish/preserve/stop. Ask only for the missing
729
+ span, place, weekday, flow, run, node, output, correction, preservation choice, or
730
+ confirmation that would change that action.
663
731
 
664
732
  Use live work tools for `task_run`:
665
733
  `forge_log_work`, `forge_start_task_run`, `forge_heartbeat_task_run`, `forge_focus_task_run`, `forge_complete_task_run`, `forge_release_task_run`
@@ -110,6 +110,29 @@ Forge correctly, and gather only the structure that still matters.
110
110
  - When the record is already clear enough to save, save it instead of performing a
111
111
  ceremonial extra question.
112
112
 
113
+ ## Depth calibration
114
+
115
+ Use this before choosing how much to ask. The goal is to match the user's actual job,
116
+ not to make every entity feel equally deep.
117
+
118
+ - Quick capture: the user already gave usable wording and says "save this", "remember
119
+ this", "log this", or otherwise makes storage the job. Reflect the working shape
120
+ once, ask only the one structural, accuracy, or consent detail that changes the
121
+ write, and do not force a full exploration.
122
+ - Guided formulation: the user wants to understand, name, map, decide, or work
123
+ through unclear or charged material. Use active listening, one lane at a time, and
124
+ Psyche hypotheses when appropriate before saving.
125
+ - Review-first: the user wants to inspect, compare, navigate, or understand something
126
+ already in Forge. Read the relevant stored entity, overview, or specialized surface
127
+ before asking write-shaped questions.
128
+ - Action-first: the target task run, work adjustment, preference judgment or signal,
129
+ questionnaire run, Movement correction, Life Force signal/template, or Workbench
130
+ run/output is already clear. Act, or ask only for the missing target, span, weekday,
131
+ flow, run, node, correction, or consent.
132
+ - Do not downgrade psychologically meaningful material into quick capture when the
133
+ user is asking to understand it. Do not expand a simple storage request into therapy
134
+ or project planning when a concise save is enough.
135
+
113
136
  ## Plain-language rule
114
137
 
115
138
  Keep API and architecture nouns inside your own reasoning. Do not ask the user about
@@ -160,6 +183,50 @@ choice is an internal classification step, not a user-facing menu.
160
183
  - Once the lane is selected, use the exact route key internally and do not invent a
161
184
  friendlier path.
162
185
 
186
+ ## Dedicated surface route fallback
187
+
188
+ Use this when the adapter tool surface is missing, stale, or narrower than live Forge
189
+ onboarding.
190
+
191
+ - First prefer the route-key tools when they exist:
192
+ `forge_call_movement_route`, `forge_call_life_force_route`, or
193
+ `forge_call_workbench_route`.
194
+ - If a route-key tool is unavailable, stale, or lacks the needed route key, read live
195
+ onboarding and use the exact `methodRoutes` entry for the selected lane. Cross-check
196
+ OpenAPI only to confirm the same method and path.
197
+ - Do not fall back to generic batch CRUD for Movement, Life Force, or Workbench just
198
+ because a route-key tool is missing. They remain specialized domain surfaces.
199
+ - Do not invent a nearby raw path, put IDs into the route key, or ask the user to pick
200
+ an endpoint. Ask only for the missing product identifier or span that fills the
201
+ published path.
202
+ - Before calling a specialized route, check the selected `methodRoutes` entry for
203
+ placeholders such as `:id`, `:weekday`, `:slug`, `:runId`, `:nodeId`, or
204
+ `:pointId`. Every placeholder must be filled through `pathParams` with the same
205
+ name before the call; never hide one inside `query`, `body`, or `routeKey`.
206
+ - If a required placeholder is missing, ask for the product noun that fills it: the
207
+ saved place, movement box, trip, weekday, flow, slug, run, node, or trip point.
208
+ - If tool schema, live onboarding, and OpenAPI disagree, trust live onboarding for the
209
+ immediate call when it names the exact route, then treat the disagreement as a Forge
210
+ contract bug to fix.
211
+
212
+ ## Specialized route-contract handshake
213
+
214
+ Use this before every Movement, Life Force, or Workbench call so the route path is
215
+ truthful without turning the user's turn into implementation talk.
216
+
217
+ - Select the product lane first in plain language: movement span or repair, energy
218
+ assumption or signal, saved flow/run/node/output, or published artifact.
219
+ - Then verify the matching `routeKey` against live onboarding `routeKeys` and
220
+ `methodRoutes`. The route key and method/path must come from that contract, not from
221
+ memory or a guessed URL.
222
+ - If `methodRoutes` contains placeholders, fill every placeholder through
223
+ `pathParams` with the exact placeholder name before the call. Ask the user only for
224
+ the missing product noun that fills the placeholder.
225
+ - Cross-check OpenAPI when you are debugging or when a route-key tool looks stale; do
226
+ not make the user choose between endpoint names.
227
+ - If the contract is missing a lane the product clearly supports, stop and report a
228
+ contract bug instead of silently using generic batch CRUD or a nearby route.
229
+
163
230
  ## Dedicated surface verification loop
164
231
 
165
232
  Use this after a Movement, Life Force, or Workbench mutation or result-producing run.
@@ -222,6 +289,13 @@ worked.
222
289
  - Ask a follow-up only if it changes the next action: save, update, correct, link,
223
290
  schedule, run, publish, enrich, or open the UI. If the read already answers the
224
291
  question, close cleanly instead of asking a ceremonial "what next?"
292
+ - If the read produces several possible actions, choose the one that most directly
293
+ answers the user's practical question and ask only for the missing detail that would
294
+ permit that action. Do not hand the user a broad menu after you just learned enough
295
+ to narrow the next move.
296
+ - Make the read's decision value explicit before any follow-up: what the read rules
297
+ in, what it rules out, and what one uncertainty remains. If there is no
298
+ answer-changing uncertainty, do not ask another question.
225
299
  - For Movement, Life Force, Workbench, calendar, health, and operator overviews,
226
300
  keep the follow-up anchored to the read result: the span that is missing, the
227
301
  weekday curve that needs correction, the failed run or node, the overloaded day, or
@@ -479,6 +553,33 @@ Use this before you choose an API path or ask for more structure.
479
553
  - For Movement, Life Force, and Workbench, use the lane
480
554
  to choose the dedicated route family before you ask for lower-level details.
481
555
 
556
+ ## Operation coverage checkpoint
557
+
558
+ Use this as a live handling and simulation check so every entity family is exercised
559
+ as real work, not only as a create form.
560
+
561
+ - Normal stored entities need four possible lanes in the agent's head: add a new
562
+ record, update an existing record, review or navigate existing records, and link or
563
+ place the record in Forge. Ask the lane only when the user's verb does not already
564
+ choose it.
565
+ - Action workflows need action verbs instead of CRUD verbs: start, continue, complete,
566
+ adjust, judge, signal, publish, sync, or observe. Once the action verb is clear,
567
+ ask only for the missing target, answer, comparison, minutes, or consent.
568
+ - Specialized CRUD surfaces need lifecycle verbs: create, read, update, sync,
569
+ reconnect, delete, or browse. For wiki pages, ask about the durable page or evidence
570
+ source; for calendar connections, ask about the provider workflow and lifecycle
571
+ action.
572
+ - Read-model surfaces need a practical read question plus scope. Do not ask
573
+ write-shaped questions until the read creates a concrete follow-up.
574
+ - Movement, Life Force, and Workbench need their dedicated operation lanes: review,
575
+ correct, repair, run, inspect, publish, or preserve. After the lane is clear, use
576
+ the exact dedicated route key internally and ask only for the span, place, weekday,
577
+ flow, run, node, output, correction, or preservation choice that is still missing.
578
+ - Psyche entities need a formulation lane before the storage lane when the user wants
579
+ understanding. Direct saves can move to one accuracy or consent question; guided
580
+ formulation should stay with one lived example, one hypothesis when useful, and one
581
+ corrected saveable shape.
582
+
482
583
  ## Route posture checkpoint
483
584
 
484
585
  Use this quick split before the conversation gets too detailed.
@@ -662,9 +763,12 @@ of those things, stop asking, summarize the working record, and act with consent
662
763
 
663
764
  Do not drift into vague reflection or internal route language. Replace "that sounds
664
765
  important" with the specific stake you heard, and replace API words such as surface,
665
- CRUD, payload, mutation path, or endpoint with product nouns the user recognizes:
666
- belief, pattern, note, wiki page, timeline, overlay, weekday template, flow, run,
667
- node result, or published output.
766
+ CRUD, payload, mutation path, route key, batch route, or endpoint with product nouns
767
+ the user recognizes: belief, pattern, note, wiki page, timeline, overlay, missing
768
+ stay, weekday template, flow, run, node result, or published output. If you cannot
769
+ name the product noun yet, ask one grounding question about the real span, place,
770
+ weekday, flow, run, node, belief sentence, parent record, or save confirmation
771
+ instead of adding reflective filler.
668
772
 
669
773
  ## Steering moves
670
774
 
@@ -750,8 +854,10 @@ Use this quick internal check before every follow-up question.
750
854
  operational detail?
751
855
  3. Does it affect the API posture: batch CRUD, specialized CRUD, action workflow, or
752
856
  specialized domain route?
753
- 4. What is the smallest question that would answer that unknown?
754
- 5. If the user already gave enough to act, stop asking and move to a short summary or
857
+ 4. What concrete action would a possible answer enable: save, update, review, link,
858
+ schedule, correct, run, publish, preserve, or stop?
859
+ 5. What is the smallest question that would answer that unknown?
860
+ 6. If the user already gave enough to act, stop asking and move to a short summary or
755
861
  the write.
756
862
 
757
863
  Useful calibration heuristics:
@@ -768,6 +874,38 @@ Useful calibration heuristics:
768
874
  skip it.
769
875
  - If the next question would not change the API path, write shape, wording, timing, or
770
876
  useful links, skip it.
877
+ - If you cannot say what the user's answer would change, do not ask the question.
878
+ Summarize what is already clear, take the read/write/run action, or close cleanly.
879
+ - For review-first work, the follow-up must point to one action enabled by the read:
880
+ no change, save, update, correct, link, schedule, run, publish, preserve, enrich, or
881
+ open the UI. Do not ask a generic "what do you want to do with this?" after the read
882
+ already narrowed the practical next move.
883
+ - For Movement, Life Force, and Workbench, the same rule applies through the product
884
+ object: missing span, place boundary, weekday curve, profile assumption, flow, run,
885
+ node, output, or preservation choice.
886
+
887
+ ## No-question gate
888
+
889
+ Use this before every follow-up, especially after partial answers, reads, writes,
890
+ repairs, and Psyche-adjacent material. A polished extra question is still a bad
891
+ question when it cannot change the next action.
892
+
893
+ - Ask only if the answer can change one of these: record type, accepted wording,
894
+ hierarchy placement, owner/accountability, timing, route lane, target object,
895
+ correction, link, verification read, run/publish/preserve action, or consent.
896
+ - Do not ask for optional tags, colors, priority, assignees, dates, aliases, visual
897
+ style, or related links when the user already gave enough to save, read, run,
898
+ correct, or close.
899
+ - If the next question would only make the conversation feel warmer, more complete, or
900
+ more like a form, skip it. Summarize what is clear and act, or close cleanly.
901
+ - For review-first work, answer the practical question first. Ask another question
902
+ only when the read exposes an answer-changing uncertainty or a concrete action the
903
+ user has not yet authorized.
904
+ - For specialized domains, do not ask a reflective "why" after the route lane and
905
+ target are already known; ask only for the span, place, weekday, flow, run, node,
906
+ output, correction, or preservation choice that permits the action.
907
+ - For Psyche-adjacent work, do not keep exploring once the user has accepted a
908
+ formulation. Ask one accuracy or consent question, then save or stop.
771
909
 
772
910
  ## Abstract And Reusable Record Moves
773
911
 
@@ -2005,6 +2143,10 @@ Direct action rules:
2005
2143
  - Treat day, month, all-time, timeline, trip detail, and selection as internal read
2006
2144
  lanes. With the user, ask for the useful time window, place, selected span, stay, or
2007
2145
  trip instead of listing route choices.
2146
+ - For route keys with placeholders, identify the product object before calling:
2147
+ `boxDetail`, `tripDetail`, `placeUpdate`, `userBoxUpdate`, `userBoxDelete`,
2148
+ `automaticBoxInvalidate`, `stayUpdate`, `stayDelete`, `tripUpdate`, `tripDelete`,
2149
+ `tripPointUpdate`, and `tripPointDelete` all need exact saved IDs in `pathParams`.
2008
2150
  - Treat settings as a separate movement lane for passive capture, publish mode, and
2009
2151
  retention behavior. Ask what operating behavior should change instead of routing it
2010
2152
  through a place, stay, or trip edit.
@@ -2023,6 +2165,10 @@ Direct action rules:
2023
2165
  object.
2024
2166
  - If the user is asking where they were during one uncertain window, prefer a timeline
2025
2167
  read before you create a correction. Mutate only after the lived truth is clear.
2168
+ - After a Movement read, translate the returned data into one next action: no change,
2169
+ a manual overlay, a place boundary correction, a settings change, or a linked note.
2170
+ Ask only for the missing span, place, boundary, or confirmation that enables that
2171
+ action.
2026
2172
  - When the user has already given the real answer, for example "I stayed home during
2027
2173
  that missing block", do not ask a broad review question again. Confirm only the
2028
2174
  interval or place if that is still ambiguous, then act.
@@ -2149,6 +2295,8 @@ Direct action rules:
2149
2295
  `GET /api/v1/life-force`. Do not invent `/api/v1/life-force/overview`.
2150
2296
  - If the user is describing a durable baseline such as work capacity, recovery style,
2151
2297
  or action-point assumptions, patch the profile instead of logging a fatigue signal.
2298
+ - For the weekday-template route, fill `pathParams.weekday` from the real weekday name
2299
+ or number before sending the update; do not bury the weekday only in the body.
2152
2300
  - If the user is describing a repeatable weekday rhythm, update that weekday template
2153
2301
  instead of treating it as a one-off right-now feeling.
2154
2302
  - If the user is describing how one weekday should usually feel, update that weekday
@@ -2167,6 +2315,10 @@ Direct action rules:
2167
2315
  - After a fatigue signal, profile patch, or weekday-template edit, verify through the
2168
2316
  Life Force overview when the next planning decision depends on the updated energy
2169
2317
  picture.
2318
+ - After a Life Force overview, translate the read into one planning implication before
2319
+ asking for a write: lighter workload, added recovery, protected timebox, meeting
2320
+ change, task-choice change, or no change. Ask for a profile, template, or signal
2321
+ detail only when that implication requires a mutation.
2170
2322
 
2171
2323
  Ready to act when:
2172
2324
 
@@ -2249,6 +2401,11 @@ Direct action rules:
2249
2401
 
2250
2402
  - If the user needs the stable public contract of a flow, prefer the flow detail or
2251
2403
  published-output routes before a run-history read.
2404
+ - For Workbench route keys with placeholders, identify the saved flow, slug, run, and
2405
+ node explicitly before calling. `flowDetail`, `flowById`, `flowBySlug`,
2406
+ `publishedOutput`, `runHistory`, `runs`, `runDetail`, `runNodes`, `nodeResult`,
2407
+ `latestNodeOutput`, `updateFlow`, `deleteFlow`, `runFlow`, and `chatFlow` all
2408
+ depend on exact `pathParams`.
2252
2409
  - Treat saved-flow catalog, box catalog, run history, run detail, node result, latest
2253
2410
  node output, and published output as internal read lanes. With the user, ask whether
2254
2411
  they need the saved flow, its input contract, one run, one node, or the public
@@ -2273,6 +2430,11 @@ Direct action rules:
2273
2430
  - If the user wants to understand what inputs a flow can accept before editing or
2274
2431
  running it, read the box catalog or flow detail before asking for structured
2275
2432
  input details.
2433
+ - After a Workbench read, translate the returned artifact into one next action:
2434
+ rerun with clearer input, inspect a specific node, edit the saved flow, publish or
2435
+ preserve the output, or stop because the answer is already sufficient. Ask only for
2436
+ the missing input, node, run, preservation choice, or confirmation that would change
2437
+ that action.
2276
2438
  - For new flows, ask what the flow should reliably produce, what input contract it
2277
2439
  should accept, and what first node or box should anchor it. Do not start by asking
2278
2440
  for raw JSON.