@telora/daemon 0.17.59 → 0.17.64

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 (103) hide show
  1. package/build-info.json +15 -3
  2. package/dist/cascade-restatement.d.ts +10 -0
  3. package/dist/cascade-restatement.d.ts.map +1 -1
  4. package/dist/cascade-restatement.js +107 -37
  5. package/dist/cascade-restatement.js.map +1 -1
  6. package/dist/ci-escalation.d.ts.map +1 -1
  7. package/dist/ci-escalation.js +5 -3
  8. package/dist/ci-escalation.js.map +1 -1
  9. package/dist/cli/backfill-frt-prose.d.ts +101 -0
  10. package/dist/cli/backfill-frt-prose.d.ts.map +1 -0
  11. package/dist/cli/backfill-frt-prose.js +195 -0
  12. package/dist/cli/backfill-frt-prose.js.map +1 -0
  13. package/dist/completion/event-escalations.d.ts +4 -11
  14. package/dist/completion/event-escalations.d.ts.map +1 -1
  15. package/dist/completion/event-escalations.js +21 -5
  16. package/dist/completion/event-escalations.js.map +1 -1
  17. package/dist/completion/event.d.ts +4 -11
  18. package/dist/completion/event.d.ts.map +1 -1
  19. package/dist/completion/event.js.map +1 -1
  20. package/dist/completion/review-exit-phase.d.ts.map +1 -1
  21. package/dist/completion/review-exit-phase.js +6 -2
  22. package/dist/completion/review-exit-phase.js.map +1 -1
  23. package/dist/crash-recovery-cleanup.d.ts.map +1 -1
  24. package/dist/crash-recovery-cleanup.js +7 -1
  25. package/dist/crash-recovery-cleanup.js.map +1 -1
  26. package/dist/crash-recovery-types.d.ts +4 -9
  27. package/dist/crash-recovery-types.d.ts.map +1 -1
  28. package/dist/crash-recovery-types.js.map +1 -1
  29. package/dist/crash-recovery.d.ts +4 -9
  30. package/dist/crash-recovery.d.ts.map +1 -1
  31. package/dist/crash-recovery.js +5 -1
  32. package/dist/crash-recovery.js.map +1 -1
  33. package/dist/delivery-advance-block.d.ts +8 -6
  34. package/dist/delivery-advance-block.d.ts.map +1 -1
  35. package/dist/delivery-advance-block.js +14 -12
  36. package/dist/delivery-advance-block.js.map +1 -1
  37. package/dist/delivery-guards.d.ts.map +1 -1
  38. package/dist/delivery-guards.js +4 -1
  39. package/dist/delivery-guards.js.map +1 -1
  40. package/dist/delivery-lifecycle.d.ts.map +1 -1
  41. package/dist/delivery-lifecycle.js +7 -1
  42. package/dist/delivery-lifecycle.js.map +1 -1
  43. package/dist/delivery-merge.d.ts.map +1 -1
  44. package/dist/delivery-merge.js +5 -1
  45. package/dist/delivery-merge.js.map +1 -1
  46. package/dist/directive/directive-dispatch.d.ts.map +1 -1
  47. package/dist/directive/directive-dispatch.js +4 -1
  48. package/dist/directive/directive-dispatch.js.map +1 -1
  49. package/dist/escalation-provenance.d.ts +60 -0
  50. package/dist/escalation-provenance.d.ts.map +1 -0
  51. package/dist/escalation-provenance.js +153 -0
  52. package/dist/escalation-provenance.js.map +1 -0
  53. package/dist/escalations.d.ts +33 -3
  54. package/dist/escalations.d.ts.map +1 -1
  55. package/dist/escalations.js +58 -12
  56. package/dist/escalations.js.map +1 -1
  57. package/dist/focus-executor.js +1 -1
  58. package/dist/focus-executor.js.map +1 -1
  59. package/dist/focus-merge.d.ts.map +1 -1
  60. package/dist/focus-merge.js +3 -1
  61. package/dist/focus-merge.js.map +1 -1
  62. package/dist/focus-stage-lifecycle.d.ts.map +1 -1
  63. package/dist/focus-stage-lifecycle.js +5 -2
  64. package/dist/focus-stage-lifecycle.js.map +1 -1
  65. package/dist/index.js +16 -0
  66. package/dist/index.js.map +1 -1
  67. package/dist/listener-auto-advance.d.ts.map +1 -1
  68. package/dist/listener-auto-advance.js +8 -3
  69. package/dist/listener-auto-advance.js.map +1 -1
  70. package/dist/listener.d.ts.map +1 -1
  71. package/dist/listener.js +6 -0
  72. package/dist/listener.js.map +1 -1
  73. package/dist/merge-back-loop.d.ts.map +1 -1
  74. package/dist/merge-back-loop.js +7 -2
  75. package/dist/merge-back-loop.js.map +1 -1
  76. package/dist/nexus-escalation-bridge.d.ts +92 -0
  77. package/dist/nexus-escalation-bridge.d.ts.map +1 -0
  78. package/dist/nexus-escalation-bridge.js +109 -0
  79. package/dist/nexus-escalation-bridge.js.map +1 -0
  80. package/dist/nexus-incoming.d.ts +47 -0
  81. package/dist/nexus-incoming.d.ts.map +1 -0
  82. package/dist/nexus-incoming.js +93 -0
  83. package/dist/nexus-incoming.js.map +1 -0
  84. package/dist/nexus-return.d.ts +79 -0
  85. package/dist/nexus-return.d.ts.map +1 -0
  86. package/dist/nexus-return.js +193 -0
  87. package/dist/nexus-return.js.map +1 -0
  88. package/dist/queries/deliveries.d.ts +12 -0
  89. package/dist/queries/deliveries.d.ts.map +1 -1
  90. package/dist/queries/deliveries.js +17 -0
  91. package/dist/queries/deliveries.js.map +1 -1
  92. package/dist/queries/issues.d.ts +62 -12
  93. package/dist/queries/issues.d.ts.map +1 -1
  94. package/dist/queries/issues.js +46 -13
  95. package/dist/queries/issues.js.map +1 -1
  96. package/dist/resolvers/escalation-answers.d.ts +22 -0
  97. package/dist/resolvers/escalation-answers.d.ts.map +1 -0
  98. package/dist/resolvers/escalation-answers.js +98 -0
  99. package/dist/resolvers/escalation-answers.js.map +1 -0
  100. package/dist/resolvers/index.d.ts.map +1 -1
  101. package/dist/resolvers/index.js +2 -0
  102. package/dist/resolvers/index.js.map +1 -1
  103. package/package.json +3 -3
package/build-info.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
- "commitSha": "5d4ce305",
3
- "builtAt": "2026-06-13T23:15:54.066Z",
2
+ "commitSha": "f1b85349",
3
+ "builtAt": "2026-06-14T17:15:34.802Z",
4
4
  "expectedMigrations": [
5
5
  "20250829113330_create_org_nodes_table.sql",
6
6
  "20250829113402_fix_function_security_search_path.sql",
@@ -614,6 +614,18 @@
614
614
  "20260610211939_add_get_product_issue_counts_rpc.sql",
615
615
  "20260610212314_pipeline_config_default_review_enabled.sql",
616
616
  "20260612164848_products_default_active.sql",
617
- "20260613134256_drop_widget_llm_rate_limit_and_audit.sql"
617
+ "20260613134256_drop_widget_llm_rate_limit_and_audit.sql",
618
+ "20260614093000_create_product_requests.sql",
619
+ "20260614093955_add_products_nexus_accept_policy.sql",
620
+ "20260614095312_add_agent_escalations_target_product.sql",
621
+ "20260614122502_reseed_gated_builtin_workflows.sql",
622
+ "20260614125700_agent_escalations_provenance_columns.sql",
623
+ "20260614125701_agent_escalations_disposition.sql",
624
+ "20260614130903_agent_escalations_kind_advance_blocked.sql",
625
+ "20260614132000_add_product_requests_clarification.sql",
626
+ "20260614145313_agent_escalations_kind_nexus_request_resolved.sql",
627
+ "20260614145314_agent_escalations_kind_nexus_clarification_requested.sql",
628
+ "20260614162500_agent_escalations_answer.sql",
629
+ "20260614164700_agent_escalations_answer_consumed.sql"
618
630
  ]
619
631
  }
@@ -81,12 +81,22 @@ export interface RunCascadeProseTickDeps {
81
81
  /** Author cascade prose for one tree. Defaults to authorCascadeRestatements. */
82
82
  authorCascadeRestatements?: typeof authorCascadeRestatements;
83
83
  }
84
+ /**
85
+ * Test-only seam: reset the prior-active-focus set so unrelated tests do not
86
+ * leak departed-focus state into one another. Not part of the public API.
87
+ */
88
+ export declare function __resetProseTickState(): void;
84
89
  /**
85
90
  * Eager reconciliation tick. For every product -> active focus -> active
86
91
  * reality tree that carries at least one applied injection, runs
87
92
  * authorCascadeRestatements so flipped cascade nodes get future-state prose
88
93
  * without waiting for verify.
89
94
  *
95
+ * Additionally diffs the current active-focus set against the prior tick's set
96
+ * and re-scans any focus that JUST departed (completed or cancelled), so a
97
+ * focus that leaves the active scan still gets its resolved cascade authored on
98
+ * the next tick. Idempotency means the re-scan is a no-op once authored.
99
+ *
90
100
  * Trees with no applied (derivedNodeType==='injection') injection are skipped
91
101
  * cheaply -- there is nothing flipped to restate. Idempotency in
92
102
  * authorCascadeRestatements prevents churn on already-authored trees.
@@ -1 +1 @@
1
- {"version":3,"file":"cascade-restatement.d.ts","sourceRoot":"","sources":["../src/cascade-restatement.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cascade-restatement.d.ts","sourceRoot":"","sources":["../src/cascade-restatement.ts"],"names":[],"mappings":"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"}
@@ -89,12 +89,95 @@ export async function authorCascadeRestatements(treeId, deps = {}) {
89
89
  }
90
90
  return { authored, skipped };
91
91
  }
92
+ /**
93
+ * Scan one focus's active reality trees and author cascade prose for any tree
94
+ * carrying at least one applied injection.
95
+ *
96
+ * Trees with no applied (derivedNodeType==='injection') injection are skipped
97
+ * cheaply via the derive-FRT pre-check -- there is nothing flipped to restate,
98
+ * so they do NOT increment treesScanned. Idempotency in
99
+ * authorCascadeRestatements prevents churn on already-authored trees.
100
+ *
101
+ * Shared by both the active-focus pass and the departed-focus catch-up pass so
102
+ * behavior is identical regardless of how the focus entered the scan.
103
+ */
104
+ async function scanFocusTreesForProse(focusId, deps) {
105
+ let treesScanned = 0;
106
+ let authored = 0;
107
+ let trees;
108
+ try {
109
+ const resp = await deps.callApi('reality_tree_list', {
110
+ focusId,
111
+ });
112
+ trees = (resp.items ?? []).filter((t) => t.status === 'active');
113
+ }
114
+ catch (err) {
115
+ console.warn(`[frt-prose] reality_tree_list failed for focus ${focusId}:`, err.message);
116
+ return { treesScanned, authored };
117
+ }
118
+ for (const tree of trees) {
119
+ // Cheap pre-check: derive the FRT once, skip trees with no applied
120
+ // injection (nothing flipped to restate).
121
+ let derived;
122
+ try {
123
+ derived = await deps.callApi('reality_tree_derive_frt', {
124
+ treeId: tree.id,
125
+ });
126
+ }
127
+ catch (err) {
128
+ console.warn(`[frt-prose] derive_frt failed for tree ${tree.id}:`, err.message);
129
+ continue;
130
+ }
131
+ const hasInjection = (derived.nodes ?? []).some((n) => n.derivedNodeType === 'injection' && n.statement && n.statement.trim() !== '');
132
+ if (!hasInjection)
133
+ continue;
134
+ treesScanned += 1;
135
+ try {
136
+ const res = await deps.authorCascadeRestatements(tree.id, {
137
+ callApi: deps.callApi,
138
+ authorRestatement: deps.authorRestatement,
139
+ });
140
+ authored += res.authored.length;
141
+ }
142
+ catch (err) {
143
+ console.warn(`[frt-prose] authorCascadeRestatements failed for tree ${tree.id}:`, err.message);
144
+ }
145
+ }
146
+ return { treesScanned, authored };
147
+ }
148
+ /**
149
+ * Focus IDs that were active on the PRIOR tick. focus.status is
150
+ * human-controlled and the daemon never observes a "focus completed" event, so
151
+ * a focus that completes (or is cancelled) simply drops out of
152
+ * getActiveFocuses. We diff against this set each tick to catch focuses that
153
+ * JUST left the active scan and author their resolved cascade once more -- the
154
+ * go-forward half of "every focus is authored before it completes". A focus
155
+ * that completed faster than a tick, before the loop existed, or with the loop
156
+ * opted out is the back-fill (historical) half, handled separately.
157
+ *
158
+ * Module-level so it persists across ticks within one daemon process. Restart
159
+ * resets it to empty: a fresh process simply observes the now-departed focus as
160
+ * never-seen and the historical back-fill covers it, so no authoring is lost.
161
+ */
162
+ let priorActiveFocusIds = new Set();
163
+ /**
164
+ * Test-only seam: reset the prior-active-focus set so unrelated tests do not
165
+ * leak departed-focus state into one another. Not part of the public API.
166
+ */
167
+ export function __resetProseTickState() {
168
+ priorActiveFocusIds = new Set();
169
+ }
92
170
  /**
93
171
  * Eager reconciliation tick. For every product -> active focus -> active
94
172
  * reality tree that carries at least one applied injection, runs
95
173
  * authorCascadeRestatements so flipped cascade nodes get future-state prose
96
174
  * without waiting for verify.
97
175
  *
176
+ * Additionally diffs the current active-focus set against the prior tick's set
177
+ * and re-scans any focus that JUST departed (completed or cancelled), so a
178
+ * focus that leaves the active scan still gets its resolved cascade authored on
179
+ * the next tick. Idempotency means the re-scan is a no-op once authored.
180
+ *
98
181
  * Trees with no applied (derivedNodeType==='injection') injection are skipped
99
182
  * cheaply -- there is nothing flipped to restate. Idempotency in
100
183
  * authorCascadeRestatements prevents churn on already-authored trees.
@@ -103,8 +186,16 @@ export async function runCascadeProseTick(config, deps = {}) {
103
186
  const callApi = deps.callApi ?? defaultCallApi;
104
187
  const listFocuses = deps.getActiveFocuses ?? getActiveFocuses;
105
188
  const authorCascade = deps.authorCascadeRestatements ?? authorCascadeRestatements;
189
+ const scanDeps = {
190
+ callApi,
191
+ authorRestatement: deps.authorRestatement,
192
+ authorCascadeRestatements: authorCascade,
193
+ };
106
194
  let treesScanned = 0;
107
195
  let authored = 0;
196
+ // The current tick's active-focus IDs, accumulated across all products so the
197
+ // departed-focus diff is computed against the whole scan, not per product.
198
+ const currentActiveFocusIds = new Set();
108
199
  for (const product of config.products) {
109
200
  const pc = configForProduct(config, product);
110
201
  let focuses;
@@ -116,45 +207,24 @@ export async function runCascadeProseTick(config, deps = {}) {
116
207
  continue;
117
208
  }
118
209
  for (const focus of focuses) {
119
- let trees;
120
- try {
121
- const resp = await callApi('reality_tree_list', {
122
- focusId: focus.focus_id,
123
- });
124
- trees = (resp.items ?? []).filter((t) => t.status === 'active');
125
- }
126
- catch (err) {
127
- console.warn(`[frt-prose] reality_tree_list failed for focus ${focus.focus_id}:`, err.message);
128
- continue;
129
- }
130
- for (const tree of trees) {
131
- // Cheap pre-check: derive the FRT once, skip trees with no applied
132
- // injection (nothing flipped to restate).
133
- let derived;
134
- try {
135
- derived = await callApi('reality_tree_derive_frt', { treeId: tree.id });
136
- }
137
- catch (err) {
138
- console.warn(`[frt-prose] derive_frt failed for tree ${tree.id}:`, err.message);
139
- continue;
140
- }
141
- const hasInjection = (derived.nodes ?? []).some((n) => n.derivedNodeType === 'injection' && n.statement && n.statement.trim() !== '');
142
- if (!hasInjection)
143
- continue;
144
- treesScanned += 1;
145
- try {
146
- const res = await authorCascade(tree.id, {
147
- callApi,
148
- authorRestatement: deps.authorRestatement,
149
- });
150
- authored += res.authored.length;
151
- }
152
- catch (err) {
153
- console.warn(`[frt-prose] authorCascadeRestatements failed for tree ${tree.id}:`, err.message);
154
- }
155
- }
210
+ currentActiveFocusIds.add(focus.focus_id);
211
+ const res = await scanFocusTreesForProse(focus.focus_id, scanDeps);
212
+ treesScanned += res.treesScanned;
213
+ authored += res.authored;
156
214
  }
157
215
  }
216
+ // Departed focuses: seen active on the prior tick, absent now. Each just left
217
+ // the active scan (completed or cancelled); author its resolved cascade one
218
+ // more time so it never leaves unauthored. Idempotent on already-authored
219
+ // trees and a no-op for departed focuses with no applied injection.
220
+ for (const focusId of priorActiveFocusIds) {
221
+ if (currentActiveFocusIds.has(focusId))
222
+ continue;
223
+ const res = await scanFocusTreesForProse(focusId, scanDeps);
224
+ treesScanned += res.treesScanned;
225
+ authored += res.authored;
226
+ }
227
+ priorActiveFocusIds = currentActiveFocusIds;
158
228
  return { treesScanned, authored };
159
229
  }
160
230
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"cascade-restatement.js","sourceRoot":"","sources":["../src/cascade-restatement.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAChE,OAAO,EACL,iBAAiB,IAAI,wBAAwB,EAC7C,gBAAgB,GAGjB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,mCAAmC,IAAI,8BAA8B,GAGtE,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAkC3D;;;;;;;;;;;;;;;GAeG;AACH,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAC7C,MAAc,EACd,OAAsC,EAAE;IAExC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,cAAc,CAAC;IAC/C,MAAM,MAAM,GAAG,IAAI,CAAC,iBAAiB,IAAI,wBAAwB,CAAC;IAElE,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,MAAM,OAAO,GAAa,EAAE,CAAC;IAE7B,MAAM,OAAO,GAAG,MAAM,OAAO,CAAoB,yBAAyB,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;IACxF,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,EAAE,CAAC;IAElC,wEAAwE;IACxE,gEAAgE;IAChE,MAAM,mBAAmB,GAAG,KAAK;SAC9B,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,eAAe,KAAK,WAAW,IAAI,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,SAAS,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC;SAC5F,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IAE3B,2EAA2E;IAC3E,yDAAyD;IACzD,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,cAAc,IAAI,EAAE,CAAC,CAAC;IACzD,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,QAAQ,KAAK,IAAI,CAAC,CAAC;IAEjF,KAAK,MAAM,IAAI,IAAI,OAAO,EAAE,CAAC;QAC3B,+DAA+D;QAC/D,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC;YACzC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACtB,SAAS;QACX,CAAC;QACD,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC;gBACxB,YAAY,EAAE,IAAI,CAAC,SAAS;gBAC5B,mBAAmB,EAAE,mBAAmB,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,SAAS;aACtF,CAAC,CAAC;YACH,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;gBAChC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBACtB,SAAS;YACX,CAAC;YACD,MAAM,OAAO,CAAC,0BAA0B,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE,YAAY,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YAC1F,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACzB,CAAC;QAAC,MAAM,CAAC;YACP,2CAA2C;YAC3C,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACxB,CAAC;IACH,CAAC;IAED,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;AAC/B,CAAC;AAWD;;;;;;;;;GASG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,MAAoB,EACpB,OAAgC,EAAE;IAElC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,cAAc,CAAC;IAC/C,MAAM,WAAW,GAAG,IAAI,CAAC,gBAAgB,IAAI,gBAAgB,CAAC;IAC9D,MAAM,aAAa,GAAG,IAAI,CAAC,yBAAyB,IAAI,yBAAyB,CAAC;IAElF,IAAI,YAAY,GAAG,CAAC,CAAC;IACrB,IAAI,QAAQ,GAAG,CAAC,CAAC;IAEjB,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;QACtC,MAAM,EAAE,GAAG,gBAAgB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAC7C,IAAI,OAAO,CAAC;QACZ,IAAI,CAAC;YACH,OAAO,GAAG,MAAM,WAAW,CAAC,EAAE,CAAC,cAAc,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC;QAC7D,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,IAAI,CACV,mDAAmD,OAAO,CAAC,EAAE,GAAG,EAC/D,GAAa,CAAC,OAAO,CACvB,CAAC;YACF,SAAS;QACX,CAAC;QAED,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,IAAI,KAAK,CAAC;YACV,IAAI,CAAC;gBACH,MAAM,IAAI,GAAG,MAAM,OAAO,CAA0B,mBAAmB,EAAE;oBACvE,OAAO,EAAE,KAAK,CAAC,QAAQ;iBACxB,CAAC,CAAC;gBACH,KAAK,GAAG,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC;YAClE,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,OAAO,CAAC,IAAI,CACV,kDAAkD,KAAK,CAAC,QAAQ,GAAG,EAClE,GAAa,CAAC,OAAO,CACvB,CAAC;gBACF,SAAS;YACX,CAAC;YAED,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,mEAAmE;gBACnE,0CAA0C;gBAC1C,IAAI,OAA0B,CAAC;gBAC/B,IAAI,CAAC;oBACH,OAAO,GAAG,MAAM,OAAO,CAAoB,yBAAyB,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;gBAC7F,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,OAAO,CAAC,IAAI,CACV,0CAA0C,IAAI,CAAC,EAAE,GAAG,EACnD,GAAa,CAAC,OAAO,CACvB,CAAC;oBACF,SAAS;gBACX,CAAC;gBACD,MAAM,YAAY,GAAG,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,IAAI,CAC7C,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,eAAe,KAAK,WAAW,IAAI,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,SAAS,CAAC,IAAI,EAAE,KAAK,EAAE,CACrF,CAAC;gBACF,IAAI,CAAC,YAAY;oBAAE,SAAS;gBAE5B,YAAY,IAAI,CAAC,CAAC;gBAClB,IAAI,CAAC;oBACH,MAAM,GAAG,GAAG,MAAM,aAAa,CAAC,IAAI,CAAC,EAAE,EAAE;wBACvC,OAAO;wBACP,iBAAiB,EAAE,IAAI,CAAC,iBAAiB;qBAC1C,CAAC,CAAC;oBACH,QAAQ,IAAI,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC;gBAClC,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,OAAO,CAAC,IAAI,CACV,yDAAyD,IAAI,CAAC,EAAE,GAAG,EAClE,GAAa,CAAC,OAAO,CACvB,CAAC;gBACJ,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,CAAC;AACpC,CAAC;AAuBD;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,MAAoB,EACpB,OAAkC,EAAE;IAEpC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,cAAc,CAAC;IAC/C,MAAM,WAAW,GAAG,IAAI,CAAC,gBAAgB,IAAI,gBAAgB,CAAC;IAC9D,MAAM,SAAS,GAAG,IAAI,CAAC,uBAAuB,IAAI,8BAA8B,CAAC;IAEjF,IAAI,YAAY,GAAG,CAAC,CAAC;IACrB,IAAI,QAAQ,GAAG,CAAC,CAAC;IAEjB,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;QACtC,MAAM,EAAE,GAAG,gBAAgB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAC7C,IAAI,OAAO,CAAC;QACZ,IAAI,CAAC;YACH,OAAO,GAAG,MAAM,WAAW,CAAC,EAAE,CAAC,cAAc,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC;QAC7D,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,IAAI,CACV,yDAAyD,OAAO,CAAC,EAAE,GAAG,EACrE,GAAa,CAAC,OAAO,CACvB,CAAC;YACF,SAAS;QACX,CAAC;QAED,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,IAAI,KAAK,CAAC;YACV,IAAI,CAAC;gBACH,MAAM,IAAI,GAAG,MAAM,OAAO,CAA0B,mBAAmB,EAAE;oBACvE,OAAO,EAAE,KAAK,CAAC,QAAQ;iBACxB,CAAC,CAAC;gBACH,KAAK,GAAG,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC;YAClE,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,OAAO,CAAC,IAAI,CACV,wDAAwD,KAAK,CAAC,QAAQ,GAAG,EACxE,GAAa,CAAC,OAAO,CACvB,CAAC;gBACF,SAAS;YACX,CAAC;YAED,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,IAAI,OAA0B,CAAC;gBAC/B,IAAI,CAAC;oBACH,OAAO,GAAG,MAAM,OAAO,CAAoB,yBAAyB,EAAE;wBACpE,MAAM,EAAE,IAAI,CAAC,EAAE;qBAChB,CAAC,CAAC;gBACL,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,OAAO,CAAC,IAAI,CACV,gDAAgD,IAAI,CAAC,EAAE,GAAG,EACzD,GAAa,CAAC,OAAO,CACvB,CAAC;oBACF,SAAS;gBACX,CAAC;gBAED,mEAAmE;gBACnE,MAAM,iBAAiB,GAAG,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,MAAM,CACpD,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,eAAe,KAAK,WAAW,IAAI,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,SAAS,CAAC,IAAI,EAAE,KAAK,EAAE,CACrF,CAAC;gBACF,IAAI,iBAAiB,CAAC,MAAM,KAAK,CAAC;oBAAE,SAAS;gBAE7C,YAAY,IAAI,CAAC,CAAC;gBAElB,8DAA8D;gBAC9D,IAAI,iBAAiB,GAAoB,EAAE,CAAC;gBAC5C,IAAI,CAAC;oBACH,MAAM,EAAE,GAAG,MAAM,OAAO,CAA8B,yBAAyB,EAAE;wBAC/E,aAAa,EAAE,IAAI,CAAC,EAAE;qBACvB,CAAC,CAAC;oBACH,iBAAiB,GAAG,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC;gBACrC,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,OAAO,CAAC,IAAI,CACV,mDAAmD,IAAI,CAAC,EAAE,GAAG,EAC5D,GAAa,CAAC,OAAO,CACvB,CAAC;oBACF,SAAS;gBACX,CAAC;gBAED,6EAA6E;gBAC7E,MAAM,eAAe,GAAG,IAAI,GAAG,EAAU,CAAC;gBAC1C,KAAK,MAAM,CAAC,IAAI,iBAAiB,EAAE,CAAC;oBAClC,IAAI,CAAC,CAAC,MAAM,KAAK,WAAW;wBAAE,SAAS;oBACvC,MAAM,IAAI,GAAG,CAAC,CAAC,gBAAgB,IAAI,EAAE,CAAC;oBACtC,IACE,IAAI,CAAC,gBAAgB,KAAK,IAAI;wBAC9B,OAAO,IAAI,CAAC,iBAAiB,KAAK,QAAQ;wBAC1C,IAAI,CAAC,iBAAiB,KAAK,EAAE,EAC7B,CAAC;wBACD,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;oBAC9C,CAAC;gBACH,CAAC;gBAED,6EAA6E;gBAC7E,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,cAAc,IAAI,EAAE,CAAC,CAAC;gBACzD,MAAM,mBAAmB,GAAG,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE,CAAC;qBAC9C,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,eAAe,KAAK,kBAAkB,IAAI,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;qBAC/E,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;gBAE3B,KAAK,MAAM,GAAG,IAAI,iBAAiB,EAAE,CAAC;oBACpC,IAAI,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;wBAAE,SAAS;oBAC1C,IAAI,CAAC;wBACH,MAAM,GAAG,GAAG,MAAM,SAAS,CACzB;4BACE,eAAe,EAAE,GAAG,CAAC,EAAE;4BACvB,kBAAkB,EAAE,GAAG,CAAC,SAAS;4BACjC,aAAa,EAAE,IAAI,CAAC,EAAE;4BACtB,OAAO,EAAE,KAAK,CAAC,QAAQ;4BACvB,mBAAmB;yBACpB,EACD,EAAE,OAAO,EAAE,CACZ,CAAC;wBACF,QAAQ,IAAI,GAAG,CAAC,WAAW,CAAC,MAAM,CAAC;wBACnC,IAAI,GAAG,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;4BAC1B,OAAO,CAAC,IAAI,CACV,kDAAkD,GAAG,CAAC,EAAE,GAAG,EAC3D,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CACtB,CAAC;wBACJ,CAAC;oBACH,CAAC;oBAAC,OAAO,GAAG,EAAE,CAAC;wBACb,OAAO,CAAC,IAAI,CACV,kEAAkE,GAAG,CAAC,EAAE,GAAG,EAC1E,GAAa,CAAC,OAAO,CACvB,CAAC;oBACJ,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,CAAC;AACpC,CAAC"}
1
+ {"version":3,"file":"cascade-restatement.js","sourceRoot":"","sources":["../src/cascade-restatement.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"ci-escalation.d.ts","sourceRoot":"","sources":["../src/ci-escalation.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH,eAAO,MAAM,mBAAmB,mBAAmB,CAAC;AAEpD;;;;;;;;;;;GAWG;AACH,wBAAgB,0BAA0B,CACxC,YAAY,EAAE,OAAO,EACrB,MAAM,EAAE;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GAC3C,OAAO,CAET;AAED,MAAM,WAAW,sBAAsB;IACrC,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;GAGG;AACH,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,sBAAsB,GAC7B,OAAO,CAAC,IAAI,CAAC,CAkCf"}
1
+ {"version":3,"file":"ci-escalation.d.ts","sourceRoot":"","sources":["../src/ci-escalation.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH,eAAO,MAAM,mBAAmB,mBAAmB,CAAC;AAEpD;;;;;;;;;;;GAWG;AACH,wBAAgB,0BAA0B,CACxC,YAAY,EAAE,OAAO,EACrB,MAAM,EAAE;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GAC3C,OAAO,CAET;AAED,MAAM,WAAW,sBAAsB;IACrC,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;GAGG;AACH,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,sBAAsB,GAC7B,OAAO,CAAC,IAAI,CAAC,CAoCf"}
@@ -6,7 +6,7 @@
6
6
  * non-fast-forward, network — the failure must surface as a visible
7
7
  * escalation rather than disappearing into the log.
8
8
  */
9
- import { ESCALATION_REASONS } from '@telora/daemon-core';
9
+ import { ESCALATION_REASONS, ESCALATION_DISPOSITIONS } from '@telora/daemon-core';
10
10
  import { createEscalation } from './queries/issues.js';
11
11
  export const CD_PUSH_FAILED_KIND = 'cd_push_failed';
12
12
  /**
@@ -36,6 +36,9 @@ export async function fileCdPushEscalation(params) {
36
36
  sessionId,
37
37
  issueId: null,
38
38
  reasonType: ESCALATION_REASONS.ERROR_ENCOUNTERED,
39
+ // Operator triage: auth / branch protection / network at the remote.
40
+ disposition: ESCALATION_DISPOSITIONS.NEEDS_OPERATOR,
41
+ anchor: { focusId, branch: integrationBranch },
39
42
  description: `CD push to remote failed after merging ${integrationBranch} into main.\n\n` +
40
43
  `**Focus:** ${focusName}\n` +
41
44
  `**Focus ID:** ${focusId}\n` +
@@ -46,9 +49,8 @@ export async function fileCdPushEscalation(params) {
46
49
  helpNeeded: `Inspect the push failure cause (auth / branch protection / network), ` +
47
50
  `resolve it, and retry by re-triggering CI on this focus.`,
48
51
  escalationKind: CD_PUSH_FAILED_KIND,
52
+ // Evidence/payload only -- focus provenance lives in the columns (anchor).
49
53
  metadata: {
50
- focus_id: focusId,
51
- focus_name: focusName,
52
54
  integration_branch: integrationBranch,
53
55
  push_error: pushError,
54
56
  },
@@ -1 +1 @@
1
- {"version":3,"file":"ci-escalation.js","sourceRoot":"","sources":["../src/ci-escalation.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAEvD,MAAM,CAAC,MAAM,mBAAmB,GAAG,gBAAgB,CAAC;AAEpD;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,0BAA0B,CACxC,YAAqB,EACrB,MAA4C;IAE5C,OAAO,YAAY,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,CAAC,CAAC,MAAM,CAAC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AACzF,CAAC;AAWD;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,MAA8B;IAE9B,MAAM,EAAE,cAAc,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,iBAAiB,EAAE,SAAS,EAAE,GAAG,MAAM,CAAC;IAC/F,IAAI,CAAC;QACH,MAAM,gBAAgB,CAAC;YACrB,cAAc;YACd,SAAS;YACT,OAAO,EAAE,IAAI;YACb,UAAU,EAAE,kBAAkB,CAAC,iBAAiB;YAChD,WAAW,EACT,0CAA0C,iBAAiB,iBAAiB;gBAC5E,cAAc,SAAS,IAAI;gBAC3B,iBAAiB,OAAO,IAAI;gBAC5B,cAAc,SAAS,MAAM;gBAC7B,oFAAoF;gBACpF,6DAA6D;YAC/D,YAAY,EAAE,+CAA+C;YAC7D,UAAU,EACR,uEAAuE;gBACvE,0DAA0D;YAC5D,cAAc,EAAE,mBAAmB;YACnC,QAAQ,EAAE;gBACR,QAAQ,EAAE,OAAO;gBACjB,UAAU,EAAE,SAAS;gBACrB,kBAAkB,EAAE,iBAAiB;gBACrC,UAAU,EAAE,SAAS;aACtB;SACF,CAAC,CAAC;QACH,OAAO,CAAC,GAAG,CAAC,kDAAkD,OAAO,MAAM,SAAS,IAAI,CAAC,CAAC;IAC5F,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,IAAI,CACV,2DAA2D,OAAO,GAAG,EACpE,GAAa,CAAC,OAAO,CACvB,CAAC;IACJ,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"ci-escalation.js","sourceRoot":"","sources":["../src/ci-escalation.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,kBAAkB,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;AAClF,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAEvD,MAAM,CAAC,MAAM,mBAAmB,GAAG,gBAAgB,CAAC;AAEpD;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,0BAA0B,CACxC,YAAqB,EACrB,MAA4C;IAE5C,OAAO,YAAY,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,CAAC,CAAC,MAAM,CAAC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AACzF,CAAC;AAWD;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,MAA8B;IAE9B,MAAM,EAAE,cAAc,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,iBAAiB,EAAE,SAAS,EAAE,GAAG,MAAM,CAAC;IAC/F,IAAI,CAAC;QACH,MAAM,gBAAgB,CAAC;YACrB,cAAc;YACd,SAAS;YACT,OAAO,EAAE,IAAI;YACb,UAAU,EAAE,kBAAkB,CAAC,iBAAiB;YAChD,qEAAqE;YACrE,WAAW,EAAE,uBAAuB,CAAC,cAAc;YACnD,MAAM,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,iBAAiB,EAAE;YAC9C,WAAW,EACT,0CAA0C,iBAAiB,iBAAiB;gBAC5E,cAAc,SAAS,IAAI;gBAC3B,iBAAiB,OAAO,IAAI;gBAC5B,cAAc,SAAS,MAAM;gBAC7B,oFAAoF;gBACpF,6DAA6D;YAC/D,YAAY,EAAE,+CAA+C;YAC7D,UAAU,EACR,uEAAuE;gBACvE,0DAA0D;YAC5D,cAAc,EAAE,mBAAmB;YACnC,2EAA2E;YAC3E,QAAQ,EAAE;gBACR,kBAAkB,EAAE,iBAAiB;gBACrC,UAAU,EAAE,SAAS;aACtB;SACF,CAAC,CAAC;QACH,OAAO,CAAC,GAAG,CAAC,kDAAkD,OAAO,MAAM,SAAS,IAAI,CAAC,CAAC;IAC5F,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,IAAI,CACV,2DAA2D,OAAO,GAAG,EACpE,GAAa,CAAC,OAAO,CACvB,CAAC;IACJ,CAAC;AACH,CAAC"}
@@ -0,0 +1,101 @@
1
+ /**
2
+ * `telora-daemon backfill-frt-prose` subcommand.
3
+ *
4
+ * One-off, idempotent repair of FRT desired-effect prose (`frt_statement`)
5
+ * across the resolved cascade of reality trees belonging to COMPLETED focuses.
6
+ *
7
+ * Why this exists: the eager cascade-prose loop (`runCascadeProseTick`) only
8
+ * scans ACTIVE focuses. A focus whose FRT prose was never authored before it
9
+ * completed therefore never gets authored and never gets backfilled -- the loop
10
+ * has stopped scanning it. The Ship Log then falls back to present-tense UDE
11
+ * text for those already-shipped entries. This command repairs that historical
12
+ * tail. The sibling go-forward fix (completion-time authoring) owns ACTIVE
13
+ * focuses; this command deliberately touches COMPLETED focuses ONLY.
14
+ *
15
+ * Idempotent: it reuses `authorCascadeRestatements`, which skips any cascade
16
+ * node that already carries positive prose (`needsRestatement` is false). Re-runs
17
+ * are safe and converge to a no-op.
18
+ *
19
+ * ---------------------------------------------------------------------------
20
+ * OPERATOR RUNBOOK
21
+ * ---------------------------------------------------------------------------
22
+ * This repair only matters against PROD. The local DB has no real completed
23
+ * focuses with applied injections, so a local run is a near-instant no-op.
24
+ *
25
+ * Point the daemon CLI at the prod config (the `~/.telora/daemon.json` that
26
+ * carries the prod `teloraUrl` = https://api.syntelyos.com + the prod tracker)
27
+ * and ALWAYS dry-run first:
28
+ *
29
+ * # 1. Preview -- no model calls, no writes. Lists every focus/tree/node
30
+ * # that WOULD be authored.
31
+ * telora-daemon backfill-frt-prose --dry-run
32
+ *
33
+ * # (optional) scope to a single product while validating:
34
+ * telora-daemon backfill-frt-prose --dry-run --product <product-uuid>
35
+ *
36
+ * # 2. Once the preview looks right, run for real. Authors prose via the
37
+ * # `claude` CLI per candidate node and writes frt_statement.
38
+ * telora-daemon backfill-frt-prose
39
+ *
40
+ * Post-run Ship Log sanity check: open the Ship Log for one of the completed
41
+ * focuses the run reported as authored and confirm its flipped UDE entries now
42
+ * read as future-state desired-effect prose rather than the present-tense
43
+ * problem text (`buildShipLog.ts` falls back to UDE text only when
44
+ * `frt_statement` is null/blank). If an entry still reads present-tense, check
45
+ * that its node was in the resolved cascade (flipped or `resolved===true`) for
46
+ * that tree -- surviving UDEs are intentionally left untouched.
47
+ *
48
+ * @module cli/backfill-frt-prose
49
+ */
50
+ import { loadConfig } from '../config.js';
51
+ import { initSupabase } from '../queries/shared.js';
52
+ import { authorCascadeRestatements as defaultAuthorCascadeRestatements, type CallApiFn } from '../cascade-restatement.js';
53
+ export interface RunBackfillFrtProseOptions {
54
+ /** Restrict to a single product UUID. When omitted, all products in config are scanned. */
55
+ productId?: string;
56
+ /** When true, only list candidates -- no model calls and no writes. */
57
+ dryRun?: boolean;
58
+ }
59
+ export interface RunBackfillFrtProseDeps {
60
+ /** API caller. Defaults to the real `callApi`. Injected for tests. */
61
+ callApi?: CallApiFn;
62
+ /** Cascade-prose authoring for one tree. Defaults to the real implementation. */
63
+ authorCascadeRestatements?: typeof defaultAuthorCascadeRestatements;
64
+ /** Load daemon config. Defaults to the real `loadConfig`. Injected for tests. */
65
+ loadConfig?: typeof loadConfig;
66
+ /** Bind the API client to a product-scoped config. Defaults to the real `initSupabase`. */
67
+ initSupabase?: typeof initSupabase;
68
+ /** Sink for human-readable output. Defaults to stdout. */
69
+ out?: (msg: string) => void;
70
+ }
71
+ export interface BackfillFrtProseSummary {
72
+ productsScanned: number;
73
+ focusesScanned: number;
74
+ treesScanned: number;
75
+ treesWithInjection: number;
76
+ authored: number;
77
+ skipped: number;
78
+ /** Candidate nodes detected in dry-run (empty in write mode). */
79
+ dryRunCandidates: Array<{
80
+ focusId: string;
81
+ treeId: string;
82
+ nodeId: string;
83
+ statement: string;
84
+ }>;
85
+ }
86
+ /**
87
+ * Core, unit-testable backfill routine.
88
+ *
89
+ * Per product -> completed focus -> active reality tree:
90
+ * - derive the FRT (`reality_tree_derive_frt`);
91
+ * - skip trees with no applied injection (nothing flipped to restate);
92
+ * - DRY-RUN: report cascade nodes (flipped union resolved) whose prose still
93
+ * needs authoring (`needsRestatement`), making NO model calls and NO writes;
94
+ * - WRITE: delegate to `authorCascadeRestatements` (idempotent, best-effort
95
+ * per node).
96
+ *
97
+ * Per-focus and per-tree failures are best-effort: logged and skipped so one
98
+ * bad row never aborts the run, mirroring `runCascadeProseTick`.
99
+ */
100
+ export declare function runBackfillFrtProse(opts: RunBackfillFrtProseOptions, deps?: RunBackfillFrtProseDeps): Promise<BackfillFrtProseSummary>;
101
+ //# sourceMappingURL=backfill-frt-prose.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backfill-frt-prose.d.ts","sourceRoot":"","sources":["../../src/cli/backfill-frt-prose.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgDG;AAEH,OAAO,EAAE,UAAU,EAAoB,MAAM,cAAc,CAAC;AAC5D,OAAO,EAAE,YAAY,EAA6B,MAAM,sBAAsB,CAAC;AAC/E,OAAO,EACL,yBAAyB,IAAI,gCAAgC,EAC7D,KAAK,SAAS,EAEf,MAAM,2BAA2B,CAAC;AAiBnC,MAAM,WAAW,0BAA0B;IACzC,2FAA2F;IAC3F,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,uEAAuE;IACvE,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,uBAAuB;IACtC,sEAAsE;IACtE,OAAO,CAAC,EAAE,SAAS,CAAC;IACpB,iFAAiF;IACjF,yBAAyB,CAAC,EAAE,OAAO,gCAAgC,CAAC;IACpE,iFAAiF;IACjF,UAAU,CAAC,EAAE,OAAO,UAAU,CAAC;IAC/B,2FAA2F;IAC3F,YAAY,CAAC,EAAE,OAAO,YAAY,CAAC;IACnC,0DAA0D;IAC1D,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;CAC7B;AAED,MAAM,WAAW,uBAAuB;IACtC,eAAe,EAAE,MAAM,CAAC;IACxB,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,iEAAiE;IACjE,gBAAgB,EAAE,KAAK,CAAC;QACtB,OAAO,EAAE,MAAM,CAAC;QAChB,MAAM,EAAE,MAAM,CAAC;QACf,MAAM,EAAE,MAAM,CAAC;QACf,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC,CAAC;CACJ;AAqBD;;;;;;;;;;;;;GAaG;AACH,wBAAsB,mBAAmB,CACvC,IAAI,EAAE,0BAA0B,EAChC,IAAI,GAAE,uBAA4B,GACjC,OAAO,CAAC,uBAAuB,CAAC,CA2IlC"}
@@ -0,0 +1,195 @@
1
+ /**
2
+ * `telora-daemon backfill-frt-prose` subcommand.
3
+ *
4
+ * One-off, idempotent repair of FRT desired-effect prose (`frt_statement`)
5
+ * across the resolved cascade of reality trees belonging to COMPLETED focuses.
6
+ *
7
+ * Why this exists: the eager cascade-prose loop (`runCascadeProseTick`) only
8
+ * scans ACTIVE focuses. A focus whose FRT prose was never authored before it
9
+ * completed therefore never gets authored and never gets backfilled -- the loop
10
+ * has stopped scanning it. The Ship Log then falls back to present-tense UDE
11
+ * text for those already-shipped entries. This command repairs that historical
12
+ * tail. The sibling go-forward fix (completion-time authoring) owns ACTIVE
13
+ * focuses; this command deliberately touches COMPLETED focuses ONLY.
14
+ *
15
+ * Idempotent: it reuses `authorCascadeRestatements`, which skips any cascade
16
+ * node that already carries positive prose (`needsRestatement` is false). Re-runs
17
+ * are safe and converge to a no-op.
18
+ *
19
+ * ---------------------------------------------------------------------------
20
+ * OPERATOR RUNBOOK
21
+ * ---------------------------------------------------------------------------
22
+ * This repair only matters against PROD. The local DB has no real completed
23
+ * focuses with applied injections, so a local run is a near-instant no-op.
24
+ *
25
+ * Point the daemon CLI at the prod config (the `~/.telora/daemon.json` that
26
+ * carries the prod `teloraUrl` = https://api.syntelyos.com + the prod tracker)
27
+ * and ALWAYS dry-run first:
28
+ *
29
+ * # 1. Preview -- no model calls, no writes. Lists every focus/tree/node
30
+ * # that WOULD be authored.
31
+ * telora-daemon backfill-frt-prose --dry-run
32
+ *
33
+ * # (optional) scope to a single product while validating:
34
+ * telora-daemon backfill-frt-prose --dry-run --product <product-uuid>
35
+ *
36
+ * # 2. Once the preview looks right, run for real. Authors prose via the
37
+ * # `claude` CLI per candidate node and writes frt_statement.
38
+ * telora-daemon backfill-frt-prose
39
+ *
40
+ * Post-run Ship Log sanity check: open the Ship Log for one of the completed
41
+ * focuses the run reported as authored and confirm its flipped UDE entries now
42
+ * read as future-state desired-effect prose rather than the present-tense
43
+ * problem text (`buildShipLog.ts` falls back to UDE text only when
44
+ * `frt_statement` is null/blank). If an entry still reads present-tense, check
45
+ * that its node was in the resolved cascade (flipped or `resolved===true`) for
46
+ * that tree -- surviving UDEs are intentionally left untouched.
47
+ *
48
+ * @module cli/backfill-frt-prose
49
+ */
50
+ import { loadConfig, configForProduct } from '../config.js';
51
+ import { initSupabase, callApi as defaultCallApi } from '../queries/shared.js';
52
+ import { authorCascadeRestatements as defaultAuthorCascadeRestatements, } from '../cascade-restatement.js';
53
+ import { needsRestatement } from '../de-restatement.js';
54
+ /**
55
+ * Resolve the set of products to scan: the single `--product` when given (must
56
+ * exist in config), otherwise every product in `config.products`.
57
+ */
58
+ function resolveProducts(config, productId) {
59
+ if (productId) {
60
+ const match = config.products.find((p) => p.id === productId);
61
+ if (!match) {
62
+ throw new Error(`--product ${productId} is not in the daemon config (known: ${config.products
63
+ .map((p) => p.id)
64
+ .join(', ') || 'none'})`);
65
+ }
66
+ return [match];
67
+ }
68
+ return config.products;
69
+ }
70
+ /**
71
+ * Core, unit-testable backfill routine.
72
+ *
73
+ * Per product -> completed focus -> active reality tree:
74
+ * - derive the FRT (`reality_tree_derive_frt`);
75
+ * - skip trees with no applied injection (nothing flipped to restate);
76
+ * - DRY-RUN: report cascade nodes (flipped union resolved) whose prose still
77
+ * needs authoring (`needsRestatement`), making NO model calls and NO writes;
78
+ * - WRITE: delegate to `authorCascadeRestatements` (idempotent, best-effort
79
+ * per node).
80
+ *
81
+ * Per-focus and per-tree failures are best-effort: logged and skipped so one
82
+ * bad row never aborts the run, mirroring `runCascadeProseTick`.
83
+ */
84
+ export async function runBackfillFrtProse(opts, deps = {}) {
85
+ const load = deps.loadConfig ?? loadConfig;
86
+ const initApi = deps.initSupabase ?? initSupabase;
87
+ const callApi = deps.callApi ?? defaultCallApi;
88
+ const authorCascade = deps.authorCascadeRestatements ?? defaultAuthorCascadeRestatements;
89
+ const out = deps.out ?? ((msg) => process.stdout.write(msg));
90
+ const dryRun = opts.dryRun === true;
91
+ const config = load();
92
+ const products = resolveProducts(config, opts.productId);
93
+ const summary = {
94
+ productsScanned: 0,
95
+ focusesScanned: 0,
96
+ treesScanned: 0,
97
+ treesWithInjection: 0,
98
+ authored: 0,
99
+ skipped: 0,
100
+ dryRunCandidates: [],
101
+ };
102
+ out(`backfill-frt-prose: ${dryRun ? 'DRY-RUN (no writes)' : 'WRITE mode'} over ${products.length} product(s)\n`);
103
+ for (const product of products) {
104
+ summary.productsScanned += 1;
105
+ // Bind the API client to this product's scoped config (productId/repoPath).
106
+ // The default callApi reads the module-level config set here; an injected
107
+ // test callApi ignores it.
108
+ const pc = configForProduct(config, product);
109
+ initApi(pc);
110
+ let focuses;
111
+ try {
112
+ const resp = await callApi('focus_list', {
113
+ productId: product.id,
114
+ status: 'complete',
115
+ });
116
+ focuses = resp.focuses ?? [];
117
+ }
118
+ catch (err) {
119
+ out(` [skip] focus_list failed for product ${product.id}: ${err.message}\n`);
120
+ continue;
121
+ }
122
+ out(` product ${product.id}: ${focuses.length} completed focus(es)\n`);
123
+ for (const focus of focuses) {
124
+ summary.focusesScanned += 1;
125
+ let trees;
126
+ try {
127
+ const resp = await callApi('reality_tree_list', {
128
+ focusId: focus.id,
129
+ });
130
+ trees = (resp.items ?? []).filter((t) => t.status === 'active');
131
+ }
132
+ catch (err) {
133
+ out(` [skip] reality_tree_list failed for focus ${focus.id}: ${err.message}\n`);
134
+ continue;
135
+ }
136
+ for (const tree of trees) {
137
+ let derived;
138
+ try {
139
+ derived = await callApi('reality_tree_derive_frt', {
140
+ treeId: tree.id,
141
+ });
142
+ }
143
+ catch (err) {
144
+ out(` [skip] derive_frt failed for tree ${tree.id}: ${err.message}\n`);
145
+ continue;
146
+ }
147
+ const nodes = derived.nodes ?? [];
148
+ const hasInjection = nodes.some((n) => n.derivedNodeType === 'injection' && n.statement && n.statement.trim() !== '');
149
+ if (!hasInjection)
150
+ continue;
151
+ summary.treesScanned += 1;
152
+ summary.treesWithInjection += 1;
153
+ if (dryRun) {
154
+ // Compute the resolved cascade (flipped union resolved===true) and
155
+ // report only nodes whose prose still needs authoring. No writes.
156
+ const flippedIds = new Set(derived.flippedNodeIds ?? []);
157
+ const cascade = nodes.filter((n) => flippedIds.has(n.id) || n.resolved === true);
158
+ const candidates = cascade.filter((n) => needsRestatement(n.frtStatement));
159
+ for (const c of candidates) {
160
+ summary.dryRunCandidates.push({
161
+ focusId: focus.id,
162
+ treeId: tree.id,
163
+ nodeId: c.id,
164
+ statement: c.statement,
165
+ });
166
+ out(` [would author] focus=${focus.id} tree=${tree.id} node=${c.id} :: ${c.statement}\n`);
167
+ }
168
+ if (candidates.length === 0) {
169
+ out(` [up-to-date] tree=${tree.id} (no cascade nodes need prose)\n`);
170
+ }
171
+ continue;
172
+ }
173
+ // WRITE: idempotent, best-effort per node inside authorCascadeRestatements.
174
+ try {
175
+ const res = await authorCascade(tree.id, { callApi });
176
+ summary.authored += res.authored.length;
177
+ summary.skipped += res.skipped.length;
178
+ out(` [authored] focus=${focus.id} tree=${tree.id} authored=${res.authored.length} skipped=${res.skipped.length}\n`);
179
+ }
180
+ catch (err) {
181
+ out(` [skip] authorCascadeRestatements failed for tree ${tree.id}: ${err.message}\n`);
182
+ }
183
+ }
184
+ }
185
+ }
186
+ // Summary line.
187
+ if (dryRun) {
188
+ out(`backfill-frt-prose: DRY-RUN done -- products=${summary.productsScanned} focuses=${summary.focusesScanned} treesWithInjection=${summary.treesWithInjection} wouldAuthor=${summary.dryRunCandidates.length}\n`);
189
+ }
190
+ else {
191
+ out(`backfill-frt-prose: done -- products=${summary.productsScanned} focuses=${summary.focusesScanned} treesWithInjection=${summary.treesWithInjection} authored=${summary.authored} skipped=${summary.skipped}\n`);
192
+ }
193
+ return summary;
194
+ }
195
+ //# sourceMappingURL=backfill-frt-prose.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backfill-frt-prose.js","sourceRoot":"","sources":["../../src/cli/backfill-frt-prose.ts"],"names":[],"mappings":"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"}