forge-openclaw-plugin 0.3.9 → 0.3.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -561,7 +561,7 @@ If you explicitly want the old laptop-driven publish path, run the same script w
561
561
  `FORGE_RELEASE_MODE=prepare` and it will still publish directly after pushing.
562
562
 
563
563
  For the exact prerequisites, tags, and GitHub secret names, use
564
- `docs/release-cheat-sheet.md`.
564
+ `docs/release/release-cheat-sheet.md`.
565
565
 
566
566
  ClawHub note:
567
567
 
@@ -5455,7 +5455,9 @@ function buildAgentOnboardingPayload(request) {
5455
5455
  saveSuggestionTone: "gentle_optional",
5456
5456
  maxQuestionsPerTurn: 1,
5457
5457
  psycheExplorationRule: "When a Psyche entity needs understanding first, begin with one exploratory question before any working formulation, replacement belief, suggested title, or save pitch. Keep the opening reflection to one or two short sentences, stay in plain prose instead of bullets or numbered lists, keep that first reply short, do not mention Forge search or save structure yet, avoid colons or list-shaped phrasing, prefer what/when/how over why until the experience is grounded, wait for the user's answer before offering a fuller formulation, ask permission before moving from charged exploration into naming or challenge when needed, make the next question help the user feel more able to name the experience rather than more examined, do not widen into adjacent entities until the current one has a working sentence the user recognizes, and once the lived experience is coherent stop deepening and help the user name it cleanly. After one concrete example is clear and a hypothesis lands or is corrected, translate it into a saveable record shape such as a belief sentence, functional loop, behavior, mode, trigger report, value, event type, or emotion definition; ask one accuracy question instead of reopening broad exploration, then use the shared batch entity routes after the user accepts the wording or explicitly asks to save. When the user is updating a Psyche record because of one fresh episode, anchor in that episode before renaming the durable formulation, begin with the smallest part of the old wording that no longer fits, and do not reopen the full origin story unless the new understanding is truly structural. If the user accepts the wording, move toward the save instead of reopening deeper exploration.",
5458
- specializedSurfaceRule: "For Movement, Life Force, and Workbench, clarify the job first, then choose the dedicated route family internally and do not guess at a generic CRUD path. Use specializedDomainSurfaces.routeSelectionQuestions when they are present so the next follow-up selects the right route instead of asking generic questions. When available, use forge_call_movement_route, forge_call_life_force_route, or forge_call_workbench_route after the lane is clear. In user-facing language, talk about timeline, overlay, weekday template, published output, run detail, or node result rather than surfaces, payloads, read paths, mutation paths, or CRUD. If the truth of the current state is still uncertain, read the relevant dedicated view before you mutate it. When the user already named a precise correction or review target, confirm only the route-selecting detail that is still missing. After a concrete Movement, Life Force, or Workbench correction, read the relevant view back when the user is trying to understand the result rather than just store it. The canonical runtime routes stay under /api/v1/*, and the OpenClaw HTTP mirror exposes the same families under /forge/v1/movement, /forge/v1/life-force, and /forge/v1/workbench.",
5458
+ progressiveDisclosureRule: "Treat partial answers as progress, not as failed intake. Before asking another question, identify what is already usable: operation, entity or surface, target record or time span, working wording, owner or placement, route lane, and consent. Say the usable part back briefly, then ask only for the first missing detail that changes the action: duplicate disambiguation, hierarchy parent, time window, weekday, flow, run, node, correction, link, or save consent. For normal batch entities, do not ask for optional tags, priority, status, dates, color, links, or assignees when the accepted wording and meaningful body are already enough unless that metadata changes accountability, retrieval, or execution. For Movement, Life Force, and Workbench, if the user's wording already implies the dedicated lane, skip the broad route-family question and ask only for the target span, place, weekday, profile field, flow, run, node, output, correction, or consent that is still missing. For direct Psyche saves or updates, treat an offered belief sentence, functional loop, part voice, trigger episode, value phrase, event kind, emotion signature, or flashcard message as real data; ask one accuracy or consent question instead of reopening origin, evidence, or repair.",
5459
+ writeConfirmationRule: "After create, update, delete, restore, run, read, or repair actions, confirm the user-facing record, action, and result in the user's language instead of reopening intake. For batch creates and updates, confirm the working title or accepted wording, container, and owner or placement only when those changed retrieval, accountability, or execution; if optional tags, priority, status, color, links, dates, or assignees were left provisional, say that plainly once instead of asking for all of them. For action workflows, confirm the real product action such as task run started or completed, work adjustment applied, preference judgment or signal submitted, questionnaire run updated or completed, calendar connection synced, or self-observation note written. For Psyche saves, confirm the accepted wording and whether it was saved as a first version, update, link, archive, or distinct version; do not reopen origin, evidence, repair, or adjacent entity mapping after the save unless that next object is already visible and materially useful. Ask a follow-up only if it changes the next action: correction, link, schedule, run, publish, enrichment, preservation choice, or UI handoff.",
5460
+ specializedSurfaceRule: "For Movement, Life Force, and Workbench, clarify the job first, then choose the dedicated route family internally and do not guess at a generic CRUD path. Use specializedDomainSurfaces.routeSelectionQuestions when they are present so the next follow-up selects the right route instead of asking generic questions. When available, use forge_call_movement_route, forge_call_life_force_route, or forge_call_workbench_route after the lane is clear. In user-facing language, talk about timeline, overlay, weekday template, published output, run detail, or node result rather than surfaces, payloads, read paths, mutation paths, or CRUD. If the truth of the current state is still uncertain, read the relevant dedicated view before you mutate it. When the user already named a precise correction or review target, confirm only the route-selecting detail that is still missing. After a concrete Movement, Life Force, or Workbench correction, mutation, or result-producing run, read the relevant view back when the user is trying to understand the result rather than just 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. The canonical runtime routes stay under /api/v1/*, and the OpenClaw HTTP mirror exposes the same families under /forge/v1/movement, /forge/v1/life-force, and /forge/v1/workbench.",
5459
5461
  reviewShortcutRule: "When the user is reviewing or correcting an existing record, ask what practical question they want the read or correction to answer, then narrow the saved object, timeframe, or route family first. Use the correct read posture before asking write-shaped questions: shared batch search or read hints for normal entities, wiki/calendar dedicated reads for specialized CRUD, read-model routes for overviews, and Movement, Life Force, or Workbench dedicated reads for those domain surfaces. After the read, answer the practical question before asking for any save, correction, link, run, enrichment, or publish detail. Do not reopen the whole intake unless the user is actually redefining the record.",
5460
5462
  readModelWriteRule: "Self-observation is note-backed and should be written through observed notes with frontmatter.observedAt only when a lightweight episode observation is the right container. Do not use it as the default bucket for Psyche material: prefer trigger_report for one emotionally meaningful episode, behavior_pattern for functional analysis of a recurring loop, behavior for one repeated move, belief_entry for a core sentence, mode_guide_session or mode_profile for a central part-state, and wiki_page for durable memory such as books, articles, concepts, sources, or personal manuals. Sleep and workout sessions stay on batch CRUD by default; use the reflective review helpers only when enriching one already-known record after review.",
5461
5463
  psycheOpeningQuestionRule: "Prefer a concrete opening question tied to the entity: ask when the value mattered, what happened the last time the pattern appeared, what cue or body signal came first before the behavior, what the belief starts saying about self or outcome, what feels most at risk inside the mode, what the part is trying to get the user to do or stop doing, or where the shift began in the incident. Reflect briefly before the question, choose one follow-up lane at a time, say what is becoming clearer before the next deeper question, and if several Psyche entities are visible hold the adjacent ones lightly until the main container is clear.",
@@ -8440,9 +8442,14 @@ export async function buildServer(options = {}) {
8440
8442
  });
8441
8443
  app.post("/api/v1/mobile/healthkit/sync-sessions/:id/chunks", { bodyLimit: 40_000_000 }, async (request) => {
8442
8444
  const { id } = request.params;
8445
+ const startedAt = performance.now();
8443
8446
  const rawPayloadJson = JSON.stringify((request.body ?? {}).payload ?? {});
8447
+ const chunk = ingestMobileHealthSyncChunk(id, mobileHealthSyncChunkSchema.parse(request.body ?? {}), rawPayloadJson);
8444
8448
  return {
8445
- chunk: ingestMobileHealthSyncChunk(id, mobileHealthSyncChunkSchema.parse(request.body ?? {}), rawPayloadJson)
8449
+ chunk: {
8450
+ ...chunk,
8451
+ serverProcessingMs: Math.max(0, Math.round(performance.now() - startedAt))
8452
+ }
8446
8453
  };
8447
8454
  });
8448
8455
  app.post("/api/v1/mobile/healthkit/sync-sessions/:id/complete", async (request) => {
@@ -3347,78 +3347,6 @@ function applyWorkoutChunkImmediately(session, family, workouts) {
3347
3347
  }), workouts.length, createdCount, updatedCount, mergedCount, now, now, runId);
3348
3348
  });
3349
3349
  }
3350
- function mobileSyncWorkoutRowsByExternalUid(userId, externalUids) {
3351
- const uniqueExternalUids = [...new Set(externalUids.filter(Boolean))];
3352
- const rowsByExternalUid = new Map();
3353
- const chunkSize = 500;
3354
- for (let lowerBound = 0; lowerBound < uniqueExternalUids.length; lowerBound += chunkSize) {
3355
- const chunk = uniqueExternalUids.slice(lowerBound, lowerBound + chunkSize);
3356
- if (chunk.length === 0) {
3357
- continue;
3358
- }
3359
- const placeholders = chunk.map(() => "?").join(", ");
3360
- const rows = getDatabase()
3361
- .prepare(`SELECT *
3362
- FROM health_workout_sessions
3363
- WHERE user_id = ?
3364
- AND source = 'apple_health'
3365
- AND external_uid IN (${placeholders})`)
3366
- .all(userId, ...chunk);
3367
- for (const row of rows) {
3368
- rowsByExternalUid.set(row.external_uid, row);
3369
- }
3370
- }
3371
- return rowsByExternalUid;
3372
- }
3373
- function applyWorkoutEvidenceChunkImmediately(session, payload) {
3374
- const timeSeries = payload.workoutTimeSeries ?? [];
3375
- const routes = payload.workoutRoutes ?? [];
3376
- if (timeSeries.length === 0 && routes.length === 0) {
3377
- return;
3378
- }
3379
- const pairing = mobileSyncSessionPairing(session);
3380
- runInTransaction(() => {
3381
- const rowsToRecompute = new Map();
3382
- const rowsByExternalUid = mobileSyncWorkoutRowsByExternalUid(pairing.user_id, [
3383
- ...timeSeries
3384
- .filter((entry) => entry.samples.length > 0)
3385
- .map((entry) => entry.externalUid),
3386
- ...routes
3387
- .filter((entry) => entry.routePoints.length > 0)
3388
- .map((entry) => entry.externalUid)
3389
- ]);
3390
- for (const entry of timeSeries) {
3391
- const row = rowsByExternalUid.get(entry.externalUid);
3392
- if (!row || entry.samples.length === 0) {
3393
- continue;
3394
- }
3395
- upsertWorkoutTimeSeries({
3396
- workoutId: row.id,
3397
- userId: pairing.user_id,
3398
- samples: entry.samples
3399
- });
3400
- rowsToRecompute.set(row.id, row);
3401
- }
3402
- for (const entry of routes) {
3403
- const row = rowsByExternalUid.get(entry.externalUid);
3404
- if (!row || entry.routePoints.length === 0) {
3405
- continue;
3406
- }
3407
- upsertWorkoutRoutePoints({
3408
- workoutId: row.id,
3409
- userId: pairing.user_id,
3410
- points: entry.routePoints
3411
- });
3412
- rowsToRecompute.set(row.id, row);
3413
- }
3414
- for (const row of rowsToRecompute.values()) {
3415
- recomputeAndStoreWorkoutAnalytics(row);
3416
- }
3417
- for (const dateKeyValue of new Set([...rowsToRecompute.values()].map((row) => dayKey(row.started_at)))) {
3418
- summarizeUserHealthDay(pairing.user_id, dateKeyValue);
3419
- }
3420
- });
3421
- }
3422
3350
  function markMobileHealthSyncChunkApplied(input) {
3423
3351
  const now = nowIso();
3424
3352
  getDatabase()
@@ -3474,8 +3402,10 @@ function applyMobileHealthSyncChunkImmediately(session, family, payload) {
3474
3402
  return "workout_progressive_apply";
3475
3403
  case "workout_time_series":
3476
3404
  case "workout_routes":
3477
- applyWorkoutEvidenceChunkImmediately(session, payload);
3478
- return "workout_evidence_progressive_apply";
3405
+ // Evidence chunks can be very large. Applying them here made the phone wait
3406
+ // for route/sample upserts plus analytics recomputation before each chunk
3407
+ // response. Store them quickly and apply once during completion instead.
3408
+ return null;
3479
3409
  case "movement":
3480
3410
  return applyMovementChunkImmediately(session, payload)
3481
3411
  ? "movement_progressive_apply"
@@ -3733,8 +3663,10 @@ function mergeMobileHealthSyncChunks(session, chunks, options = {}) {
3733
3663
  const workoutsByExternalUid = new Map();
3734
3664
  const tombstones = [];
3735
3665
  for (const chunk of chunks.sort((left, right) => left.sequence - right.sequence)) {
3666
+ const keepWorkoutSummaryForDeferredEvidence = chunk.family === "workout_summaries" || chunk.family === "workout_archive";
3736
3667
  const skipRecords = options.skipImmediatelyApplied === true &&
3737
- mobileHealthSyncChunkWasImmediatelyApplied(chunk);
3668
+ mobileHealthSyncChunkWasImmediatelyApplied(chunk) &&
3669
+ keepWorkoutSummaryForDeferredEvidence === false;
3738
3670
  if (skipRecords) {
3739
3671
  continue;
3740
3672
  }
@@ -3967,7 +3899,10 @@ function listMobileSyncCompletionChunks(syncSessionId) {
3967
3899
  .prepare(`SELECT id, payload_json
3968
3900
  FROM health_mobile_sync_chunks
3969
3901
  WHERE sync_session_id = ?
3970
- AND applied_at IS NULL`)
3902
+ AND (
3903
+ applied_at IS NULL
3904
+ OR family IN ('workout_summaries', 'workout_archive')
3905
+ )`)
3971
3906
  .all(syncSessionId);
3972
3907
  if (payloadRows.length === 0) {
3973
3908
  return chunks;
@@ -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.9",
5
+ "version": "0.3.10",
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.9",
3
+ "version": "0.3.10",
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",
@@ -243,6 +243,14 @@ Entity conversation rule:
243
243
  time scope, and any ownership/placement that changes later use are already clear,
244
244
  summarize once and write, read, run, or update instead of collecting optional
245
245
  fields.
246
+ - Treat partial answers as progress. Before another follow-up, identify what is
247
+ already usable: operation, entity or surface, target record or time span, working
248
+ wording, owner or placement, route lane, and consent. Ask only for the first missing
249
+ detail that changes the action: duplicate disambiguation, hierarchy parent, time
250
+ window, weekday, flow, run, node, correction, link, or save consent.
251
+ - Do not ask for optional tags, priority, status, dates, color, links, or assignees
252
+ when accepted wording and meaningful body are enough unless that metadata changes
253
+ accountability, retrieval, or execution.
246
254
  - Let each question have one job. Know what you are trying to clarify before you ask it.
247
255
  - Before you ask, decide the exact missing thing you need and how that answer will help you name, place, or save the record.
248
256
  - Prefer a progression of:
@@ -271,6 +279,19 @@ Entity conversation rule:
271
279
  Movement, Life Force, or Workbench dedicated reads for those domain surfaces. After
272
280
  the read, answer the practical question before asking for any save, correction,
273
281
  link, run, enrichment, or publish detail.
282
+ - After create, update, delete, restore, run, read, or repair actions, confirm the
283
+ user-facing record, action, and result in the user's language instead of reopening
284
+ intake. For batch creates and updates, confirm the working title or accepted wording,
285
+ container, and owner or placement only when those changed retrieval, accountability,
286
+ or execution; if optional tags, priority, status, color, links, dates, or assignees
287
+ were left provisional, say that plainly once. For action workflows, confirm the real
288
+ product action: task run started or completed, work adjustment applied, preference
289
+ judgment or signal submitted, questionnaire run updated or completed, calendar
290
+ connection synced, or self-observation note written. For Psyche saves, confirm the
291
+ accepted wording and whether it was saved as a first version, update, link, archive,
292
+ or distinct version; do not reopen origin, evidence, repair, or adjacent entity
293
+ mapping after the save unless that next object is already visible and materially
294
+ useful.
274
295
  - When updating an entity, start with what is changing, what should stay true, and what prompted the update now.
275
296
  - When enough is clear, briefly summarize what you heard in the user's own language before asking for the last missing structural detail.
276
297
  - Treat `userId` and human/bot assignees as accountability and scope, not as opening form fields. Ask whose human or bot record it is only when ownership changes visibility, review scope, collaboration, automation behavior, or later filtering; for read requests, ask user scope only when the answer would differ across owners.
@@ -320,6 +341,10 @@ Psyche interview rule:
320
341
  - If the user already offers a usable belief sentence, value phrase, or mode name,
321
342
  refine from their wording first instead of replacing it with a cleaner label too
322
343
  early.
344
+ - If the user already offers a usable belief sentence, functional loop, part voice,
345
+ trigger episode, value phrase, event kind, emotion signature, or flashcard message,
346
+ treat it as real data and ask one accuracy or consent question instead of reopening
347
+ origin, evidence, or repair.
323
348
  - 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.
324
349
  - If nuance matters, preserve it in a linked Markdown `note` instead of forcing every detail into normalized fields.
325
350
  - 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.
@@ -621,7 +646,7 @@ through `forge_create_entities` or `forge_update_entities`.
621
646
  into a new run, note, or generic entity update unless the user asks for that.
622
647
  - If you are unsure which specialized route family applies, check `forge_get_agent_onboarding` and use its `entityRouteModel.specializedDomainSurfaces` section before guessing.
623
648
  - 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.
624
- - After a concrete Movement, Life Force, or Workbench correction, read the relevant specialized view back when the user is trying to understand the result rather than only store it.
649
+ - 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.
625
650
 
626
651
  Use live work tools for `task_run`:
627
652
  `forge_log_work`, `forge_start_task_run`, `forge_heartbeat_task_run`, `forge_focus_task_run`, `forge_complete_task_run`, `forge_release_task_run`
@@ -101,6 +101,10 @@ Forge correctly, and gather only the structure that still matters.
101
101
  opener. Move straight to the next missing clarification.
102
102
  - After a substantive answer, briefly say what is becoming clear so the user can
103
103
  correct the direction early.
104
+ - Treat partial answers as progress. Before asking again, mark what the user already
105
+ supplied: the operation, container, target record or span, working wording, route
106
+ lane, placement, and consent. Ask only for the first missing detail that would
107
+ change the save, read, run, correction, or link.
104
108
  - Once the record is clear enough to name, stop exploring broadly and ask only for the
105
109
  last missing structural detail.
106
110
  - When the record is already clear enough to save, save it instead of performing a
@@ -138,6 +142,28 @@ choice is an internal classification step, not a user-facing menu.
138
142
  - Once the lane is selected, use the exact route key internally and do not invent a
139
143
  friendlier path.
140
144
 
145
+ ## Dedicated surface verification loop
146
+
147
+ Use this after a Movement, Life Force, or Workbench mutation or result-producing run.
148
+ The dedicated route family is not finished just because a write returned `ok`.
149
+
150
+ - After Movement overlays, place edits, settings changes, stay/trip repairs, or
151
+ deletion/invalidation work, read back the timeline, place list, settings, box
152
+ detail, or selection view that proves the user's practical question was answered.
153
+ - After Life Force profile edits, weekday-template edits, or fatigue signals, read
154
+ the overview back when the user is making a planning decision or wants to understand
155
+ the practical impact of the change.
156
+ - After Workbench flow creation/edit/deletion, saved-flow execution, one-off
157
+ execution, chat follow-up, or publish-related work, read back the flow detail, run
158
+ detail, node result, latest node output, published output, or run history that
159
+ matches the user's real goal.
160
+ - Do not perform a read-back as ceremony when the user only asked for a narrow save
161
+ and the write response already gives enough confirmation. Use it when it changes
162
+ understanding, verifies a repair, or grounds the next decision.
163
+ - In user-facing language, say what you checked: the corrected span, the weekday
164
+ energy picture, the flow result, the node output, or the published artifact. Keep
165
+ route keys and HTTP paths internal unless the user asks for implementation detail.
166
+
141
167
  ## Mixed-intent sequencing
142
168
 
143
169
  Use this when one user message combines several Forge jobs, such as "review this and
@@ -187,6 +213,30 @@ worked.
187
213
  write at all. Do not widen into a new taxonomy choice unless the read made the
188
214
  container genuinely ambiguous.
189
215
 
216
+ ## Write/read/run confirmation loop
217
+
218
+ Use this after create, update, delete, restore, run, read, or repair actions. The
219
+ agent should close the loop in the user's language instead of reopening intake.
220
+
221
+ - Confirm the user-facing record, action, and result, not the internal route. Mention
222
+ the route family only if the user asked for implementation detail or the agent is
223
+ reporting an API-contract problem.
224
+ - For batch creates and updates, confirm the working title or accepted wording, the
225
+ container, and the owner or placement only when those changed later retrieval,
226
+ accountability, or execution.
227
+ - If optional tags, priority, status, color, links, dates, or assignees were left
228
+ provisional, say that plainly once instead of asking for all of them.
229
+ - For action workflows, confirm the real product action: task run started or
230
+ completed, work adjustment applied, preference judgment or signal submitted,
231
+ questionnaire run updated or completed, calendar connection synced, or
232
+ self-observation note written.
233
+ - For specialized Movement, Life Force, and Workbench actions, pair the confirmation
234
+ with the dedicated verification loop only when the read-back changes understanding,
235
+ proves a repair, or grounds the next decision.
236
+ - Ask a follow-up only if it changes the next action: a correction, link, schedule,
237
+ run, publish, enrichment, preservation choice, or UI handoff. If the action is
238
+ complete and no decision-relevant next step is visible, stop cleanly.
239
+
190
240
  ## Review-before-write checkpoint
191
241
 
192
242
  Use this when the user asks to review, guide, inspect, compare, or understand before
@@ -269,6 +319,35 @@ but not necessarily a full Psyche formulation: `questionnaire_instrument`,
269
319
  uses questionnaire run actions; `self_observation` is note-backed; `wiki_page` uses
270
320
  the wiki routes.
271
321
 
322
+ ## Progressive disclosure after partial answers
323
+
324
+ Use this when the user has already given part of the answer. The next question should
325
+ show that you heard what is already settled.
326
+
327
+ - First identify what is already usable: operation, entity or surface, target record,
328
+ time span, working wording, owner or placement, route lane, and consent.
329
+ - Say the usable part back briefly, then ask only for the first missing detail that
330
+ would change the action: duplicate disambiguation, hierarchy parent, time
331
+ window, weekday, flow, run, node, correction, link, or save consent.
332
+ - For normal batch entities, if the accepted title or distinctive wording and the
333
+ meaningful body are present, do not ask for tags, priority, status, color, links,
334
+ dates, or assignees unless that metadata changes accountability, retrieval, or
335
+ execution.
336
+ - For specialized Movement, Life Force, and Workbench work, if the user's wording
337
+ already implies the lane, skip the route-family question and ask only for the
338
+ target span, place, weekday, profile field, flow, run, node, output, correction, or
339
+ consent that is still missing.
340
+ - For review-first work, once the practical question and scope are clear, read before
341
+ asking about the possible write. Do not ask the user to design a report shape unless
342
+ the answer would change the read.
343
+ - For direct Psyche saves or updates, if the user has already given a usable belief
344
+ sentence, functional loop, part voice, trigger episode, value phrase, event kind,
345
+ emotion signature, or flashcard message, ask one accuracy or consent question
346
+ instead of reopening origin, evidence, or repair.
347
+ - If the remaining unknown is only decorative optional metadata, state the provisional
348
+ choice and act with consent. The flow should feel like progressive clarification,
349
+ not a restarted form.
350
+
272
351
  ## Conversation arc
273
352
 
274
353
  Most good Forge intake flows follow this sequence:
@@ -1934,6 +2013,9 @@ Direct action rules:
1934
2013
  - For known-place creation or cleanup, ask what the place should be called, what
1935
2014
  counts inside its boundary, and how future movement reads should use it. Use the
1936
2015
  dedicated place routes, not a tag or batch entity write.
2016
+ - After a Movement repair, known-place edit, settings change, overlay deletion, or
2017
+ automatic-box invalidation, verify through the relevant dedicated read when the
2018
+ user is trying to understand whether the movement picture is now truthful.
1937
2019
 
1938
2020
  Helpful follow-up lanes:
1939
2021
 
@@ -2064,6 +2146,9 @@ Direct action rules:
2064
2146
  then read the overview back if they want to see the updated picture.
2065
2147
  - After a profile or weekday-template change, read the overview back when the user is
2066
2148
  trying to understand the practical impact of the change, not just store it silently.
2149
+ - After a fatigue signal, profile patch, or weekday-template edit, verify through the
2150
+ Life Force overview when the next planning decision depends on the updated energy
2151
+ picture.
2067
2152
 
2068
2153
  Ready to act when:
2069
2154
 
@@ -2176,6 +2261,10 @@ Direct action rules:
2176
2261
  - For flow chat follow-ups, use the saved flow chat route only when the user wants to
2177
2262
  continue a flow-specific conversation. Do not turn a chat follow-up into a new flow
2178
2263
  run, note, or generic entity update unless that is what the user asks for.
2264
+ - After Workbench execution, flow edits, chat follow-ups, or publish-related work,
2265
+ verify through the matching dedicated read: run detail, node result, latest node
2266
+ output, flow detail, run history, or published output. Do not leave a run or edit
2267
+ as an abstract success message when the user asked to inspect or use the result.
2179
2268
 
2180
2269
  Ready to act when:
2181
2270
 
@@ -276,6 +276,28 @@ of leaving it as warm reflective prose.
276
276
  - Save through shared batch entity routes only after the user accepts the working
277
277
  wording or explicitly asks to save.
278
278
 
279
+ ## Psyche progressive disclosure
280
+
281
+ Use this when the user has already supplied meaningful Psyche material. The next move
282
+ should preserve momentum instead of making them retell the whole story.
283
+
284
+ - Treat an offered belief sentence, value phrase, part voice, urge sentence, trigger
285
+ episode, event kind, emotion signature, or functional loop as real data, not as a
286
+ prompt to restart intake.
287
+ - Say what is already usable in plain language, then ask only for the missing detail
288
+ that changes the record: accuracy, the cue or situation, payoff or cost, protective
289
+ job, linked episode, whether it is a new version or an update, or save consent.
290
+ - If the user's wording is serviceable, keep it and refine at most one phrase. Do not
291
+ replace it with a prettier formulation before the user feels recognized.
292
+ - If the user asks to update a Psyche record and already gives the new wording, ask
293
+ what part of the old formulation it replaces or whether it should stand as a new
294
+ version. Do not reopen origin, evidence, or repair unless the new meaning is still
295
+ unclear.
296
+ - If the working material is already accurate enough, ask one accuracy or consent
297
+ question instead of reopening origin, evidence, or repair.
298
+ - If the remaining unknown is optional therapeutic metadata, save a provisional
299
+ version after one accuracy check and preserve nuance in a linked note when needed.
300
+
279
301
  ## Psyche save-readiness checkpoint
280
302
 
281
303
  Use this before asking another deepening question. Psyche work should feel careful,
@@ -307,6 +329,23 @@ save the record instead of reopening the whole story.
307
329
  - After the minimum is present, ask one accuracy question at most: "Is this true
308
330
  enough to save as a first version?" If yes, save through shared batch CRUD.
309
331
 
332
+ ## Psyche after-save close
333
+
334
+ Use this after a Psyche record is created or updated. The user should feel the
335
+ formulation was held accurately, not that a new worksheet has started.
336
+
337
+ - Confirm the accepted wording, primary container, and whether it was saved as a
338
+ first version, update, link, archive, or distinct version.
339
+ - Do not reopen origin, evidence, repair, or adjacent entity mapping after the save.
340
+ Only offer a flashcard, note, value link, task, or habit when that next object is
341
+ already visible and would materially help retrieval or action.
342
+ - If nuance was preserved in a linked note or left provisional, say that briefly and
343
+ keep the door open for later correction without asking another broad exploration
344
+ question.
345
+ - For belief, pattern, mode, trigger report, value, event type, emotion definition,
346
+ or flashcard saves, the clean close is one accurate sentence plus any concrete next option
347
+ that genuinely follows from the user's request.
348
+
310
349
  ## Psyche Hypothesis Map
311
350
 
312
351
  Use these shapes after at least one concrete example is clear. The hypothesis should