forge-openclaw-plugin 0.2.60 → 0.2.65

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 (59) hide show
  1. package/README.md +121 -51
  2. package/dist/assets/{board-B1V3M__K.js → board-DUwMfZvN.js} +1 -1
  3. package/dist/assets/index-B9VOpR7r.css +1 -0
  4. package/dist/assets/index-DoHjjze2.js +90 -0
  5. package/dist/assets/{motion-CltSTItx.js → motion-Crg3QyXD.js} +1 -1
  6. package/dist/assets/{table-B-VrSFx8.js → table-CTlDeYRs.js} +1 -1
  7. package/dist/assets/{ui-DUqM4jkt.js → ui-CJPaElbj.js} +1 -1
  8. package/dist/assets/{vendor-C0otBhgu.js → vendor-BdrT2htV.js} +217 -207
  9. package/dist/companion-iroh/darwin-arm64/forge-companion-iroh +0 -0
  10. package/dist/companion-iroh/darwin-x64/forge-companion-iroh +0 -0
  11. package/dist/companion-iroh/linux-x64/forge-companion-iroh +0 -0
  12. package/dist/companion-iroh-src/Cargo.lock +4559 -0
  13. package/dist/companion-iroh-src/Cargo.toml +37 -0
  14. package/dist/companion-iroh-src/src/lib.rs +279 -0
  15. package/dist/companion-iroh-src/src/main.rs +478 -0
  16. package/dist/companion-iroh-src/src/protocol.rs +129 -0
  17. package/dist/gamification-previews/dark-fantasy-item-trophy-tasks-anvil-marathon.webp +0 -0
  18. package/dist/gamification-previews/dark-fantasy-item-trophy-xp-levels-the-first-heat.webp +0 -0
  19. package/dist/gamification-previews/dark-fantasy-item-unlock-streaks-molten-crown-fire.webp +0 -0
  20. package/dist/gamification-previews/dark-fantasy-mascot.webp +0 -0
  21. package/dist/gamification-previews/dramatic-smithie-item-trophy-tasks-anvil-marathon.webp +0 -0
  22. package/dist/gamification-previews/dramatic-smithie-item-trophy-xp-levels-the-first-heat.webp +0 -0
  23. package/dist/gamification-previews/dramatic-smithie-item-unlock-streaks-molten-crown-fire.webp +0 -0
  24. package/dist/gamification-previews/dramatic-smithie-mascot.webp +0 -0
  25. package/dist/gamification-previews/mind-locksmith-item-trophy-tasks-anvil-marathon.webp +0 -0
  26. package/dist/gamification-previews/mind-locksmith-item-trophy-xp-levels-the-first-heat.webp +0 -0
  27. package/dist/gamification-previews/mind-locksmith-item-unlock-streaks-molten-crown-fire.webp +0 -0
  28. package/dist/gamification-previews/mind-locksmith-mascot.webp +0 -0
  29. package/dist/index.html +7 -7
  30. package/dist/openclaw/parity.js +27 -0
  31. package/dist/openclaw/plugin-entry-shared.js +2 -2
  32. package/dist/openclaw/plugin-sdk-types.d.ts +2 -1
  33. package/dist/openclaw/routes.d.ts +4 -0
  34. package/dist/openclaw/routes.js +112 -3
  35. package/dist/openclaw/tools.js +32 -4
  36. package/dist/server/server/migrations/059_data_backup_retention.sql +2 -0
  37. package/dist/server/server/src/app.js +288 -61
  38. package/dist/server/server/src/data-management-types.js +2 -0
  39. package/dist/server/server/src/discovery-advertiser.js +13 -0
  40. package/dist/server/server/src/health.js +58 -3
  41. package/dist/server/server/src/movement.js +16 -1
  42. package/dist/server/server/src/openapi.js +410 -9
  43. package/dist/server/server/src/repositories/rewards.js +60 -0
  44. package/dist/server/server/src/services/companion-iroh.js +425 -0
  45. package/dist/server/server/src/services/data-management.js +32 -2
  46. package/dist/server/server/src/services/doctor.js +762 -0
  47. package/dist/server/server/src/services/gamification.js +75 -3
  48. package/dist/server/server/src/services/life-force.js +166 -25
  49. package/dist/server/server/src/web.js +88 -12
  50. package/dist/server/src/lib/api.js +9 -0
  51. package/dist/server/src/lib/gamification-catalog.js +1 -1
  52. package/openclaw.plugin.json +85 -3
  53. package/package.json +10 -6
  54. package/server/migrations/059_data_backup_retention.sql +2 -0
  55. package/skills/forge-openclaw/SKILL.md +80 -19
  56. package/skills/forge-openclaw/entity_conversation_playbooks.md +283 -25
  57. package/skills/forge-openclaw/psyche_entity_playbooks.md +82 -0
  58. package/dist/assets/index-BwKAPo98.css +0 -1
  59. package/dist/assets/index-Dy7c-dRY.js +0 -90
@@ -2,10 +2,92 @@
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.2.60",
5
+ "version": "0.2.65",
6
+ "activation": {
7
+ "onStartup": true,
8
+ "onCapabilities": [
9
+ "tool"
10
+ ],
11
+ "onCommands": [
12
+ "forge"
13
+ ]
14
+ },
6
15
  "skills": [
7
16
  "./skills"
8
17
  ],
18
+ "commandAliases": [
19
+ {
20
+ "name": "forge"
21
+ }
22
+ ],
23
+ "contracts": {
24
+ "tools": [
25
+ "forge_adjust_work_minutes",
26
+ "forge_apply_doctor_fix",
27
+ "forge_call_life_force_route",
28
+ "forge_call_movement_route",
29
+ "forge_call_workbench_route",
30
+ "forge_clone_questionnaire",
31
+ "forge_complete_questionnaire_run",
32
+ "forge_complete_task_run",
33
+ "forge_connect_calendar_provider",
34
+ "forge_create_entities",
35
+ "forge_create_task_timebox",
36
+ "forge_create_work_block_template",
37
+ "forge_delete_entities",
38
+ "forge_enqueue_preferences_item_from_entity",
39
+ "forge_ensure_questionnaire_draft",
40
+ "forge_focus_task_run",
41
+ "forge_get_agent_onboarding",
42
+ "forge_get_calendar_overview",
43
+ "forge_get_current_work",
44
+ "forge_get_doctor",
45
+ "forge_get_operator_context",
46
+ "forge_get_operator_overview",
47
+ "forge_get_preferences_workspace",
48
+ "forge_get_psyche_overview",
49
+ "forge_get_questionnaire",
50
+ "forge_get_questionnaire_run",
51
+ "forge_get_self_observation_calendar",
52
+ "forge_get_sleep_overview",
53
+ "forge_get_sports_overview",
54
+ "forge_get_ui_entrypoint",
55
+ "forge_get_user_directory",
56
+ "forge_get_weekly_review",
57
+ "forge_get_wiki_health",
58
+ "forge_get_wiki_page",
59
+ "forge_get_wiki_settings",
60
+ "forge_get_xp_metrics",
61
+ "forge_grant_reward_bonus",
62
+ "forge_heartbeat_task_run",
63
+ "forge_ingest_wiki_source",
64
+ "forge_list_questionnaires",
65
+ "forge_list_wiki_pages",
66
+ "forge_log_work",
67
+ "forge_merge_preferences_contexts",
68
+ "forge_post_insight",
69
+ "forge_publish_questionnaire_draft",
70
+ "forge_recommend_task_timeboxes",
71
+ "forge_reindex_wiki_embeddings",
72
+ "forge_release_task_run",
73
+ "forge_restore_entities",
74
+ "forge_search_entities",
75
+ "forge_search_wiki",
76
+ "forge_start_preferences_game",
77
+ "forge_start_questionnaire_run",
78
+ "forge_start_task_run",
79
+ "forge_submit_preferences_judgment",
80
+ "forge_submit_preferences_signal",
81
+ "forge_sync_calendar_connection",
82
+ "forge_sync_wiki_vault",
83
+ "forge_update_entities",
84
+ "forge_update_preferences_score",
85
+ "forge_update_questionnaire_run",
86
+ "forge_update_sleep_session",
87
+ "forge_update_workout_session",
88
+ "forge_upsert_wiki_page"
89
+ ]
90
+ },
9
91
  "uiHints": {
10
92
  "origin": {
11
93
  "label": "Forge Origin",
@@ -19,7 +101,7 @@
19
101
  },
20
102
  "dataRoot": {
21
103
  "label": "Forge Data Root",
22
- "help": "Absolute folder path for the shared Forge home. Local installs default to ~/.forge so OpenClaw, Hermes, and Codex automatically meet in one runtime.",
104
+ "help": "Optional absolute folder path for Forge data. Defaults to ~/.forge. When set, Forge stores forge.sqlite directly in this folder; use the same value across adapters that should share one database.",
23
105
  "placeholder": "~/.forge",
24
106
  "advanced": true
25
107
  },
@@ -63,7 +145,7 @@
63
145
  "dataRoot": {
64
146
  "type": "string",
65
147
  "default": "~/.forge",
66
- "description": "Absolute path for the shared Forge data root. Defaults to ~/.forge so local OpenClaw, Hermes, and Codex installs converge on one runtime."
148
+ "description": "Absolute path for the shared Forge data root. Defaults to ~/.forge. Explicit values override that default; use the same value across local adapters that should share one database."
67
149
  },
68
150
  "apiToken": {
69
151
  "type": "string",
package/package.json CHANGED
@@ -1,9 +1,9 @@
1
1
  {
2
2
  "name": "forge-openclaw-plugin",
3
- "version": "0.2.60",
3
+ "version": "0.2.65",
4
4
  "description": "Curated OpenClaw adapter for the Forge collaboration API, UI entrypoint, and localhost auto-start runtime.",
5
5
  "type": "module",
6
- "license": "MIT",
6
+ "license": "Apache-2.0",
7
7
  "private": false,
8
8
  "repository": {
9
9
  "type": "git",
@@ -38,10 +38,13 @@
38
38
  "openclaw": {
39
39
  "extensions": [
40
40
  "./dist/openclaw/index.js"
41
- ]
41
+ ],
42
+ "install": {
43
+ "minHostVersion": ">=2026.5.4"
44
+ }
42
45
  },
43
46
  "peerDependencies": {
44
- "openclaw": "2026.4.15"
47
+ "openclaw": "2026.5.4"
45
48
  },
46
49
  "dependencies": {
47
50
  "@dnd-kit/core": "^6.3.1",
@@ -97,10 +100,11 @@
97
100
  "overrides": {
98
101
  "@aws-sdk/xml-builder": "^3.972.19",
99
102
  "basic-ftp": "^5.3.0",
100
- "axios": "^1.15.0",
103
+ "axios": "^1.16.0",
101
104
  "fast-xml-parser": "^5.7.1",
102
105
  "follow-redirects": "^1.16.0",
103
- "hono": "4.12.14",
106
+ "hono": "^4.12.18",
107
+ "ip-address": "^10.2.0",
104
108
  "uuid": "^14.0.0"
105
109
  },
106
110
  "scripts": {
@@ -0,0 +1,2 @@
1
+ ALTER TABLE data_management_settings
2
+ ADD COLUMN backup_retention_days INTEGER DEFAULT 30;
@@ -87,6 +87,53 @@ guessing.
87
87
  `forge_call_life_force_route`, or `forge_call_workbench_route`, use those
88
88
  route-key tools after the conversation has selected the lane; otherwise use the
89
89
  exact `/api/v1/*` route or OpenClaw `/forge/v1/*` mirror published in onboarding.
90
+ Life Force may be keyed as `lifeForce` and as the entity-style alias `life_force`;
91
+ both point to the same `/api/v1/life-force/*` route family.
92
+ - The live onboarding `methodRoutes` map and the specialized route-key tool schemas
93
+ include the exact route-key to method/path map. Use `methodRoutes` as the
94
+ route-key-to-`METHOD /api/v1/...` source of truth when checking specialized
95
+ methods, especially POST aggregate reads such as Movement `selection` and DELETE
96
+ repair paths. When a route key's exact path contains placeholders such as `:id`,
97
+ `:weekday`, `:runId`, or `:nodeId`, pass those values in `pathParams` using the
98
+ placeholder names exactly. Do not place IDs inside `routeKey`, invent a raw route
99
+ string, or ask the user to choose an endpoint when the lane already selects one. If
100
+ that schema and live onboarding disagree, trust the live onboarding for the current
101
+ call and treat the disagreement as a Forge contract bug to fix, not as a reason to
102
+ guess a nearby route.
103
+
104
+ Concrete route-key examples for internal use:
105
+
106
+ - Movement all-time read:
107
+ `{"routeKey":"allTime","query":{"userIds":["user_operator"]}}`
108
+ - Movement timeline read:
109
+ `{"routeKey":"timeline","query":{"from":"2026-05-01T00:00:00.000Z","to":"2026-05-06T23:59:59.999Z","userIds":["user_operator"]}}`
110
+ - Movement selection aggregate:
111
+ `{"routeKey":"selection","query":{"from":"2026-05-01T00:00:00.000Z","to":"2026-05-14T23:59:59.999Z","placeIds":["place_home"],"userIds":["user_operator"]}}`
112
+ - Movement trip detail:
113
+ `{"routeKey":"tripDetail","pathParams":{"id":"trip_123"}}`
114
+ - Movement missing-stay correction:
115
+ first `{"routeKey":"userBoxPreflight","body":{"kind":"stay","startedAt":"2026-05-06T13:00:00.000Z","endedAt":"2026-05-06T15:00:00.000Z","placeLabel":"Home","userId":"user_operator"}}`,
116
+ then `{"routeKey":"userBoxCreate","body":{"kind":"stay","startedAt":"2026-05-06T13:00:00.000Z","endedAt":"2026-05-06T15:00:00.000Z","placeLabel":"Home","userId":"user_operator","note":"Manual correction after reviewing the timeline."}}`
117
+ - Life Force overview:
118
+ `{"routeKey":"overview"}`
119
+ - Life Force profile edit:
120
+ `{"routeKey":"profile","body":{"baselineDailyAp":24,"recoveryNotes":"Clinic-admin days need a lower expected afternoon load."}}`
121
+ - Life Force weekday template edit:
122
+ `{"routeKey":"weekdayTemplate","pathParams":{"weekday":"monday"},"body":{"points":[{"hour":13,"freeAp":-4}]}}`
123
+ - Life Force fatigue signal:
124
+ `{"routeKey":"fatigueSignal","body":{"signal":"tired","intensity":7,"note":"Sharp post-lunch dip after clinic admin."}}`
125
+ - Workbench flow catalog:
126
+ `{"routeKey":"listFlows","query":{"includeArchived":false}}`
127
+ - Workbench box catalog:
128
+ `{"routeKey":"boxCatalog"}`
129
+ - Workbench run detail:
130
+ `{"routeKey":"runDetail","pathParams":{"id":"flow_research_digest","runId":"run_123"}}`
131
+ - Workbench published output:
132
+ `{"routeKey":"publishedOutput","pathParams":{"id":"flow_research_digest"}}`
133
+ - Workbench latest node output:
134
+ `{"routeKey":"latestNodeOutput","pathParams":{"id":"flow_research_digest","nodeId":"node_summary"}}`
135
+ - Workbench run execution:
136
+ `{"routeKey":"runFlow","pathParams":{"id":"flow_research_digest"},"body":{"input":{"topic":"question flow quality"}}}`
90
137
 
91
138
  Preferences rule:
92
139
 
@@ -126,6 +173,11 @@ Health rule:
126
173
 
127
174
  - Sleep and sports records are first-class health surfaces, not generic notes or tasks.
128
175
  - Use `forge_get_sleep_overview` and `forge_get_sports_overview` for review and trend reading.
176
+ - In `forge_get_agent_onboarding.entityRouteModel.readModelOnlySurfaces`, the health
177
+ overview routes are published under both the plain names `sleepOverview` and
178
+ `sportsOverview` and the entity-style aliases `sleep_overview` and
179
+ `sports_overview`. Treat those as read-only overview surfaces, not batch CRUD
180
+ entities.
129
181
  - Use the shared batch entity tools for ordinary `sleep_session` and `workout_session` create, update, delete, and search work. Do not force agents into a large one-route-per-entity mental model when the batch routes already cover the record cleanly.
130
182
  - Use `forge_update_sleep_session` and `forge_update_workout_session` only when the job is reflective enrichment on one existing health record after review, such as attaching notes, tags, mood, meaning, or Forge links.
131
183
  - Habit-generated workouts and imported HealthKit workouts belong to the same workout record model, so do not invent a separate storage path for sport sessions.
@@ -156,11 +208,15 @@ Entity conversation rule:
156
208
 
157
209
  Forge data location rule:
158
210
 
159
- - by default, current Forge plugins converge on the shared local Forge home at `~/.forge/forge.sqlite`
160
- - the exact storage root is the active runtime `dataRoot`; when `dataRoot` is set in plugin config, Forge stores `forge.sqlite` directly inside that folder
161
- - on repo-local development installs, keep using the configured shared `dataRoot` unless the user explicitly asks to move data
162
- - if the user wants the data somewhere else for persistence, backup, or manual control, tell them to set `plugins.entries["forge-openclaw-plugin"].config.dataRoot` and restart the OpenClaw gateway
163
- - if the user asks where the data is stored or how to move it, explain the current default plainly and show the exact config field
211
+ - never answer from a generic default. First check the actual configured `dataRoot` and, when possible, the live runtime file handle.
212
+ - the default local Forge data root is `~/.forge`, so the default database is `~/.forge/forge.sqlite`.
213
+ - the user can override that default. Determine the effective storage root from the active adapter config or runtime environment first: OpenClaw `plugins.entries["forge-openclaw-plugin"].config.dataRoot`, Hermes `~/.hermes/forge/config.json.dataRoot`, `FORGE_DATA_ROOT`, or the runtime's reported storage path.
214
+ - when `dataRoot` is set, Forge stores `forge.sqlite` directly inside that folder. That explicit setting overrides generic defaults.
215
+ - when a Forge server is running locally, verify the actual open database with a process/file-handle check such as `lsof -p <forge-pid> | rg 'forge.sqlite|forge.json'`.
216
+ - treat plugin extension folders, package-local `data/`, or adapter-local data folders as only possible candidates until config or live process evidence proves they are active.
217
+ - if the user wants to choose the data folder or configure backups from the UI, point them to Forge `Settings -> Data`. That page shows the live data folder, can move current data or adopt an existing Forge data folder, creates manual backups, enables recurring automatic backups, and lets the user choose how many days of automatic backups to keep.
218
+ - before changing data roots, restoring, or merging data, create backups of every candidate Forge database plus OpenClaw/Hermes config files. Do not merge side databases unless an ID/content-level audit proves relevant user data is missing from the selected active database.
219
+ - if the user asks where Forge data is stored, state both the configured path and the live verified database path, or say that the live path has not yet been verified.
164
220
 
165
221
  Psyche interview rule:
166
222
 
@@ -251,13 +307,16 @@ Use these exact entity meanings when deciding what the user is describing.
251
307
 
252
308
  `emotion_definition` is a reusable emotion entry, such as fear, shame, anger, grief, relief, or disgust.
253
309
 
254
- Use this intake map when the user agrees to save or update something.
310
+ Minimum-field checkpoint, not a question script: use this only after the
311
+ conversation has enough shape to save or update something. Do not ask every listed
312
+ item. Choose the single missing lane that affects the write, and stop when the
313
+ record is clear enough to persist.
255
314
 
256
315
  `goal`
257
316
  Use for a meaningful direction over time.
258
317
  Minimum field: `title`
259
318
  Usually useful: `description`, `horizon`, `status`
260
- Ask:
319
+ Only ask if missing or unclear:
261
320
 
262
321
  1. What should this goal be called?
263
322
  2. Why does it matter to you?
@@ -267,7 +326,7 @@ Ask:
267
326
  Use for a bounded workstream under a goal.
268
327
  Minimum field: `title`
269
328
  Usually useful: `goalId`, `description`, `status`
270
- Ask:
329
+ Only ask if missing or unclear:
271
330
 
272
331
  1. What should this project be called?
273
332
  2. Which goal does it support?
@@ -277,7 +336,7 @@ Ask:
277
336
  Use for one concrete action or deliverable.
278
337
  Minimum field: `title`
279
338
  Usually useful: `projectId`, `goalId`, `priority`, `dueDate`, `status`, `owner`
280
- Ask:
339
+ Only ask if missing or unclear:
281
340
 
282
341
  1. What is the task in one concrete sentence?
283
342
  2. Should it live under an existing goal or project?
@@ -294,7 +353,7 @@ CRITICAL NEGATIVE-HABIT CHECK-IN RULE:
294
353
  - Do not treat `missed` on a `negative` habit as failure. In this case, `missed` is the successful outcome.
295
354
  - In OpenClaw, official habit outcome logging should go through `forge_update_entities` on `entityType: "habit"` with `patch: { checkIn: { status, dateKey?, note?, description? } }`.
296
355
  - Do not bypass the shared tool model with raw habit routes when the batch entity update already covers the write cleanly.
297
- Ask:
356
+ Only ask if missing or unclear:
298
357
 
299
358
  1. What is the recurring behavior in one concrete sentence?
300
359
  2. Is doing it good (`positive`) or a slip (`negative`)?
@@ -309,7 +368,7 @@ Ask only what is needed to start the run, such as the task, the actor, and wheth
309
368
  Use for a value or committed direction.
310
369
  Minimum field: `title`
311
370
  Usually useful: `description`, `valuedDirection`, `whyItMatters`, links to goals, projects, or tasks
312
- Ask:
371
+ Only ask if missing or unclear:
313
372
 
314
373
  1. What feels deeply important here, and what would you call that value or direction?
315
374
  2. If you were living it a little more this week, what would someone actually see?
@@ -319,7 +378,7 @@ Ask:
319
378
  Use for a recurring loop across situations.
320
379
  Minimum field: `title`
321
380
  Usually useful: `description`, `targetBehavior`, `cueContexts`, `shortTermPayoff`, `longTermCost`, `preferredResponse`
322
- Ask:
381
+ Only ask if missing or unclear:
323
382
 
324
383
  1. Can we slow this down using one recent example first?
325
384
  2. What usually sets the loop off, and what tends to happen in thoughts, feelings, body, and actions next?
@@ -329,7 +388,7 @@ Ask:
329
388
  Use for one recurring move or action tendency.
330
389
  Minimum fields: `kind`, `title`
331
390
  Usually useful: `commonCues`, `urgeStory`, `shortTermPayoff`, `longTermCost`, `replacementMove`, `repairPlan`
332
- Ask:
391
+ Only ask if missing or unclear:
333
392
 
334
393
  1. What does this behavior actually look like in plain language?
335
394
  2. What cues or urges usually pull you toward it, and what does it do for you in the moment?
@@ -339,7 +398,7 @@ Ask:
339
398
  Use for one explicit belief sentence.
340
399
  Minimum fields: `statement`, `beliefType`
341
400
  Usually useful: `confidence`, `evidenceFor`, `evidenceAgainst`, `flexibleAlternative`, `originNote`
342
- Ask:
401
+ Only ask if missing or unclear:
343
402
 
344
403
  1. If we turn that reaction into one sentence, what does the belief sound like in your own words?
345
404
  2. Is it `absolute` or `conditional`, and how true does it feel from 0 to 100?
@@ -349,7 +408,7 @@ Ask:
349
408
  Use for a recurring part-state or inner role.
350
409
  Minimum fields: `family`, `title`
351
410
  Usually useful: `fear`, `burden`, `protectiveJob`, `originContext`, links to patterns, behaviors, and values
352
- Ask:
411
+ Only ask if missing or unclear:
353
412
 
354
413
  1. When this part shows up, what is it like from the inside and what should it be called?
355
414
  2. What kind of mode is this: `coping`, `child`, `critic_parent`, `healthy_adult`, or `happy_child`?
@@ -358,7 +417,7 @@ Ask:
358
417
  `mode_guide_session`
359
418
  Use for guided exploration before or alongside a durable mode profile.
360
419
  Minimum fields: `summary`, `answers`
361
- Ask:
420
+ Only ask if missing or unclear:
362
421
 
363
422
  1. What just happened that brought this part online right now?
364
423
  2. If it had a voice, what would it say, fear, or need?
@@ -368,7 +427,7 @@ Ask:
368
427
  Use for one specific emotionally important episode.
369
428
  Minimum field: `title`
370
429
  Usually useful: `eventSituation`, `occurredAt`, `emotions`, `thoughts`, `behaviors`, `consequences`, `nextMoves`, links to values, beliefs, patterns, modes, goals, projects, or tasks
371
- Ask:
430
+ Only ask if missing or unclear:
372
431
 
373
432
  1. What happened, as concretely as you can say it?
374
433
  2. What emotions were present, how intense were they, and what thoughts or meanings showed up?
@@ -378,7 +437,7 @@ Ask:
378
437
  Use for a reusable trigger category.
379
438
  Minimum field: `label`
380
439
  Usually useful: `description`
381
- Ask:
440
+ Only ask if missing or unclear:
382
441
 
383
442
  1. What kind of repeated moment or incident do you want future reports to name the same way?
384
443
  2. What would count as inside this category, and what should stay outside it?
@@ -388,7 +447,7 @@ Ask:
388
447
  Use for a reusable emotion vocabulary entry.
389
448
  Minimum field: `label`
390
449
  Usually useful: `description`, `category`
391
- Ask:
450
+ Only ask if missing or unclear:
392
451
 
393
452
  1. When this feeling is present, what tells you it is this feeling and not a nearby one?
394
453
  2. What would you want a later trigger report to mean when it uses this label?
@@ -628,6 +687,8 @@ When the user asks which Forge tools are available, list exactly these tools:
628
687
  `forge_get_operator_overview`
629
688
  `forge_get_operator_context`
630
689
  `forge_get_agent_onboarding`
690
+ `forge_get_doctor`
691
+ `forge_apply_doctor_fix`
631
692
  `forge_call_movement_route`
632
693
  `forge_call_life_force_route`
633
694
  `forge_call_workbench_route`