instar 1.3.604 → 1.3.606

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 (65) hide show
  1. package/dist/commands/server.d.ts.map +1 -1
  2. package/dist/commands/server.js +104 -0
  3. package/dist/commands/server.js.map +1 -1
  4. package/dist/config/ConfigDefaults.d.ts.map +1 -1
  5. package/dist/config/ConfigDefaults.js +28 -0
  6. package/dist/config/ConfigDefaults.js.map +1 -1
  7. package/dist/core/AutonomousSessions.d.ts +24 -0
  8. package/dist/core/AutonomousSessions.d.ts.map +1 -1
  9. package/dist/core/AutonomousSessions.js +22 -0
  10. package/dist/core/AutonomousSessions.js.map +1 -1
  11. package/dist/core/PostUpdateMigrator.d.ts +13 -0
  12. package/dist/core/PostUpdateMigrator.d.ts.map +1 -1
  13. package/dist/core/PostUpdateMigrator.js +101 -0
  14. package/dist/core/PostUpdateMigrator.js.map +1 -1
  15. package/dist/core/devGatedFeatures.d.ts.map +1 -1
  16. package/dist/core/devGatedFeatures.js +6 -0
  17. package/dist/core/devGatedFeatures.js.map +1 -1
  18. package/dist/core/types.d.ts +49 -0
  19. package/dist/core/types.d.ts.map +1 -1
  20. package/dist/core/types.js.map +1 -1
  21. package/dist/feedback-factory/processing/FeedbackProcessingService.d.ts +70 -0
  22. package/dist/feedback-factory/processing/FeedbackProcessingService.d.ts.map +1 -0
  23. package/dist/feedback-factory/processing/FeedbackProcessingService.js +74 -0
  24. package/dist/feedback-factory/processing/FeedbackProcessingService.js.map +1 -0
  25. package/dist/feedback-factory/store/JsonlFeedbackStore.d.ts +34 -0
  26. package/dist/feedback-factory/store/JsonlFeedbackStore.d.ts.map +1 -1
  27. package/dist/feedback-factory/store/JsonlFeedbackStore.js +59 -0
  28. package/dist/feedback-factory/store/JsonlFeedbackStore.js.map +1 -1
  29. package/dist/monitoring/AutonomousProgressHeartbeat.d.ts +169 -0
  30. package/dist/monitoring/AutonomousProgressHeartbeat.d.ts.map +1 -0
  31. package/dist/monitoring/AutonomousProgressHeartbeat.js +296 -0
  32. package/dist/monitoring/AutonomousProgressHeartbeat.js.map +1 -0
  33. package/dist/monitoring/ProxyCoordinator.d.ts +1 -1
  34. package/dist/monitoring/ProxyCoordinator.d.ts.map +1 -1
  35. package/dist/monitoring/autonomousHeartbeatScrub.d.ts +44 -0
  36. package/dist/monitoring/autonomousHeartbeatScrub.d.ts.map +1 -0
  37. package/dist/monitoring/autonomousHeartbeatScrub.js +81 -0
  38. package/dist/monitoring/autonomousHeartbeatScrub.js.map +1 -0
  39. package/dist/monitoring/sentinelWiring.d.ts +14 -0
  40. package/dist/monitoring/sentinelWiring.d.ts.map +1 -1
  41. package/dist/monitoring/sentinelWiring.js +19 -0
  42. package/dist/monitoring/sentinelWiring.js.map +1 -1
  43. package/dist/scaffold/templates.d.ts.map +1 -1
  44. package/dist/scaffold/templates.js +12 -0
  45. package/dist/scaffold/templates.js.map +1 -1
  46. package/dist/server/AgentServer.d.ts +5 -0
  47. package/dist/server/AgentServer.d.ts.map +1 -1
  48. package/dist/server/AgentServer.js +34 -0
  49. package/dist/server/AgentServer.js.map +1 -1
  50. package/dist/server/CapabilityIndex.d.ts.map +1 -1
  51. package/dist/server/CapabilityIndex.js +21 -0
  52. package/dist/server/CapabilityIndex.js.map +1 -1
  53. package/dist/server/routes.d.ts +4 -0
  54. package/dist/server/routes.d.ts.map +1 -1
  55. package/dist/server/routes.js +45 -0
  56. package/dist/server/routes.js.map +1 -1
  57. package/package.json +1 -1
  58. package/src/data/builtin-manifest.json +64 -64
  59. package/src/scaffold/templates/jobs/instar/feedback-factory-process.md +35 -0
  60. package/src/scaffold/templates.ts +12 -0
  61. package/upgrades/1.3.605.md +29 -0
  62. package/upgrades/1.3.606.md +28 -0
  63. package/upgrades/side-effects/autonomous-progress-heartbeat-ratchet-fix.md +36 -0
  64. package/upgrades/side-effects/autonomous-progress-heartbeat.md +40 -0
  65. package/upgrades/side-effects/feedback-processor-job.md +60 -0
@@ -0,0 +1,296 @@
1
+ /**
2
+ * AutonomousProgressHeartbeat — a hedged, change-gated, sparse liveness BACKSTOP
3
+ * for an autonomous run that has gone silent on the user for a long stretch
4
+ * while its terminal output is STILL changing.
5
+ *
6
+ * Spec: docs/specs/autonomous-progress-heartbeat.md (ELI16: .eli16.md).
7
+ *
8
+ * The incident this closes (2026-06-16, topic 12476): during a 24h autonomous
9
+ * run the agent finished a milestone, said "PR is armed", then went heads-down
10
+ * for ~an hour fixing CI — real work the whole time, but emitted ZERO
11
+ * user-facing message. An hour of silence is indistinguishable from a stall.
12
+ *
13
+ * This is NOT the suppressed PromiseBeacon §B1 "still on it, no new output"
14
+ * filler (HONEST-PROGRESS-MESSAGING removed that). It is a structurally higher
15
+ * bar: it fires ONLY on a LONG user-silence gate (≥25m) AND a corroborated
16
+ * recent output change (read from ActiveWorkSilenceSentinel's already-computed
17
+ * `lastOutputAt` snapshot — predicate #8 captures NOTHING of its own), with
18
+ * purely-observational wording, a per-topic cooldown, a widening per-run backoff
19
+ * + hard cap, and the shared one-voice ProxyCoordinator lease.
20
+ *
21
+ * Signal-only: it emits a liveness message and never gates, blocks, delays, or
22
+ * rewrites anything. Every predicate fails CLOSED (no emit) on any uncertainty.
23
+ */
24
+ import { EventEmitter } from 'node:events';
25
+ import { scrubFocus } from './autonomousHeartbeatScrub.js';
26
+ const DEFAULTS = {
27
+ silenceThresholdMinutes: 25,
28
+ silenceThresholdFloorMinutes: 5,
29
+ tickIntervalMs: 60_000,
30
+ tickIntervalFloorMs: 30_000,
31
+ maxHeartbeatsPerRun: 6,
32
+ recentOutputChangeWindowMs: 5 * 60_000,
33
+ };
34
+ /** Widening per-run backoff (minutes). Floor = silenceThresholdMinutes; the
35
+ * ladder widens 25→40→60→90 (then holds at the last value, capped by the
36
+ * per-run budget). */
37
+ const BACKOFF_LADDER_MINUTES = [25, 40, 60, 90];
38
+ export class AutonomousProgressHeartbeat extends EventEmitter {
39
+ deps;
40
+ cfg;
41
+ runState = new Map();
42
+ lastEmits = [];
43
+ static LAST_EMITS_CAP = 50;
44
+ tickHandle = null;
45
+ ticking = false;
46
+ lastTickAt = 0;
47
+ topicsConsidered = 0;
48
+ constructor(deps, raw = {}) {
49
+ super();
50
+ this.deps = deps;
51
+ const silenceMin = Math.max(DEFAULTS.silenceThresholdFloorMinutes, raw.silenceThresholdMinutes ?? DEFAULTS.silenceThresholdMinutes);
52
+ const tickMs = Math.max(DEFAULTS.tickIntervalFloorMs, raw.tickIntervalMs ?? DEFAULTS.tickIntervalMs);
53
+ this.cfg = {
54
+ enabled: raw.enabled === true,
55
+ // default true: dryRun unless explicitly false (the graduated-rollout ladder).
56
+ dryRun: raw.dryRun !== false,
57
+ silenceThresholdMs: silenceMin * 60_000,
58
+ tickIntervalMs: tickMs,
59
+ maxHeartbeatsPerRun: raw.maxHeartbeatsPerRun ?? DEFAULTS.maxHeartbeatsPerRun,
60
+ recentOutputChangeWindowMs: raw.recentOutputChangeWindowMs ?? DEFAULTS.recentOutputChangeWindowMs,
61
+ };
62
+ }
63
+ start() {
64
+ if (!this.cfg.enabled || this.tickHandle)
65
+ return;
66
+ this.tickHandle = setInterval(() => {
67
+ this.tick().catch((err) => {
68
+ // Observability never endangers the observed; never throw out of the tick.
69
+ this.emit('tick-error', err);
70
+ });
71
+ }, this.cfg.tickIntervalMs);
72
+ if (typeof this.tickHandle.unref === 'function')
73
+ this.tickHandle.unref();
74
+ }
75
+ stop() {
76
+ if (this.tickHandle) {
77
+ clearInterval(this.tickHandle);
78
+ this.tickHandle = null;
79
+ }
80
+ this.runState.clear();
81
+ }
82
+ /** Read-only status for GET /autonomous-heartbeat. */
83
+ status() {
84
+ return {
85
+ enabled: this.cfg.enabled,
86
+ dryRun: this.cfg.dryRun,
87
+ silenceThresholdMinutes: Math.round(this.cfg.silenceThresholdMs / 60_000),
88
+ lastTickAt: this.lastTickAt,
89
+ topicsConsidered: this.topicsConsidered,
90
+ lastEmits: [...this.lastEmits],
91
+ };
92
+ }
93
+ /** Guard-posture surface (GET /guards). Cheap property read — no I/O. */
94
+ guardStatus() {
95
+ return { enabled: this.cfg.enabled, lastTickAt: this.lastTickAt };
96
+ }
97
+ /**
98
+ * One tick. Re-entrancy-guarded (the emit step is awaited and a send can
99
+ * block). Evaluates the per-topic predicate cheap-first; the ProxyCoordinator
100
+ * lease is acquired/released in a try/finally within THIS tick.
101
+ *
102
+ * Public for tests.
103
+ */
104
+ async tick() {
105
+ if (this.ticking)
106
+ return;
107
+ this.ticking = true;
108
+ this.lastTickAt = (this.deps.now ?? Date.now)();
109
+ try {
110
+ const now = (this.deps.now ?? Date.now)();
111
+ const runs = this.deps.listActiveAutonomousRuns();
112
+ this.topicsConsidered = runs.length;
113
+ // Prune run-state for topics no longer active so the map can't leak.
114
+ const activeTopicIds = new Set(runs.map((r) => r.topicId));
115
+ for (const t of [...this.runState.keys()]) {
116
+ if (!activeTopicIds.has(t))
117
+ this.runState.delete(t);
118
+ }
119
+ for (const run of runs) {
120
+ await this.evaluateTopic(run, now);
121
+ }
122
+ }
123
+ finally {
124
+ this.ticking = false;
125
+ }
126
+ }
127
+ /**
128
+ * The per-topic predicate, evaluated strictly cheapest-first, short-circuiting
129
+ * on the first failure. Predicate #1 (run active) is implied by `run` being in
130
+ * the active set. Every predicate is an in-memory read.
131
+ */
132
+ async evaluateTopic(run, now) {
133
+ const topicId = run.topicId;
134
+ // #2 Not mid-handoff + #3 destination warmup elapsed (markers fail closed).
135
+ const markers = this.deps.getRunMarkers(topicId);
136
+ if (!markers) {
137
+ this.recordSuppressed(topicId, now, 'run-markers-unreadable');
138
+ return;
139
+ }
140
+ if (markers.movedTo || markers.moveSuspended) {
141
+ this.recordSuppressed(topicId, now, 'mid-move-marker');
142
+ return;
143
+ }
144
+ // #3 warmup: the run must have been active on THIS machine ≥ one full window.
145
+ if (markers.startedAtMs == null || now - markers.startedAtMs < this.cfg.silenceThresholdMs) {
146
+ this.recordSuppressed(topicId, now, 'warmup-not-elapsed');
147
+ return;
148
+ }
149
+ // #4 Session alive.
150
+ if (!run.sessionName || !this.deps.isSessionAlive(run.sessionName)) {
151
+ this.recordSuppressed(topicId, now, 'session-not-alive');
152
+ return;
153
+ }
154
+ // #5 Silent-to-user ≥ threshold (minutes since most-recent fromUser===false).
155
+ const lastOutboundAt = this.mostRecentOutboundAt(topicId);
156
+ if (lastOutboundAt != null && now - lastOutboundAt < this.cfg.silenceThresholdMs) {
157
+ this.recordSuppressed(topicId, now, 'spoke-recently');
158
+ return;
159
+ }
160
+ const silenceAnchor = lastOutboundAt ?? markers.startedAtMs;
161
+ const minutesSilent = Math.max(1, Math.round((now - silenceAnchor) / 60_000));
162
+ // #6 Per-topic emit-cooldown elapsed (LOCAL map). A new run resets state.
163
+ const state = this.ensureRunState(topicId, markers.startedAtMs);
164
+ const cooldownMs = this.currentBackoffMs(state.count);
165
+ if (state.lastHeartbeatAt > 0 && now - state.lastHeartbeatAt < cooldownMs) {
166
+ this.recordSuppressed(topicId, now, 'cooldown-not-elapsed');
167
+ return;
168
+ }
169
+ // #7 Per-run heartbeat budget not exhausted.
170
+ if (state.count >= this.cfg.maxHeartbeatsPerRun) {
171
+ this.recordSuppressed(topicId, now, 'budget-exhausted');
172
+ return;
173
+ }
174
+ // #8 Recent output change — from the SHARED snapshot (no own capture).
175
+ const lastOutputAt = this.deps.getSharedLastOutputAt(run.sessionName);
176
+ if (lastOutputAt == null || lastOutputAt <= 0) {
177
+ // Snapshot unavailable / lastOutputAt absent → fail CLOSED, never capture.
178
+ this.recordSuppressed(topicId, now, 'shared-snapshot-unavailable');
179
+ return;
180
+ }
181
+ if (now - lastOutputAt > this.cfg.recentOutputChangeWindowMs) {
182
+ // Output has NOT advanced recently (e.g. frozen spinner) → suppress.
183
+ this.recordSuppressed(topicId, now, 'no-recent-output-change');
184
+ return;
185
+ }
186
+ // #9 One-voice free: acquire the shared lease; release UNCONDITIONALLY here.
187
+ if (!this.deps.proxyCoordinator.tryAcquire(topicId, 'autonomous-heartbeat')) {
188
+ this.recordSuppressed(topicId, now, 'lease-held');
189
+ return;
190
+ }
191
+ try {
192
+ const rawFocus = this.deps.getFocusForTopic(topicId);
193
+ const scrub = scrubFocus(rawFocus);
194
+ const text = this.buildMessage(scrub.focus);
195
+ if (this.cfg.dryRun) {
196
+ // dryRun gates on the SAME cooldown/budget as live (it only swaps the
197
+ // final send for a log). Advance state so the next tick doesn't re-log.
198
+ state.lastHeartbeatAt = now;
199
+ state.count += 1;
200
+ this.recordEmit({ topicId, at: now, minutesSilent, focus: scrub.focus, dryRun: true });
201
+ this.emit('would-emit', { topicId, minutesSilent, focus: scrub.focus });
202
+ return;
203
+ }
204
+ try {
205
+ await this.deps.sendMessage(topicId, text, {
206
+ source: 'autonomous-heartbeat',
207
+ isProxy: true,
208
+ tier: 1,
209
+ });
210
+ state.lastHeartbeatAt = now;
211
+ state.count += 1;
212
+ this.recordEmit({ topicId, at: now, minutesSilent, focus: scrub.focus, dryRun: false });
213
+ this.emit('emitted', { topicId, minutesSilent, focus: scrub.focus });
214
+ }
215
+ catch (err) {
216
+ // @silent-fallback-ok: NOT silent — a failed heartbeat send is surfaced via
217
+ // recordSuppressed('send-failed') + the 'send-error' event. We deliberately do
218
+ // NOT advance cooldown/count (a missed heartbeat is the safe status quo; the
219
+ // next tick retries). The lease still releases in finally.
220
+ this.recordSuppressed(topicId, now, 'send-failed');
221
+ this.emit('send-error', { topicId, err });
222
+ }
223
+ }
224
+ finally {
225
+ this.deps.proxyCoordinator.release(topicId, 'autonomous-heartbeat');
226
+ }
227
+ }
228
+ /**
229
+ * The purely-observational, untrusted-framed line. NEVER an assertive "still
230
+ * working"/"still going" claim. `focus` is already scrubbed + HTML-escaped;
231
+ * null → the generic fallback.
232
+ */
233
+ buildMessage(focus) {
234
+ if (focus) {
235
+ return `I haven't posted here in a while — last observed activity was «${focus}». Message me if you need me.`;
236
+ }
237
+ return `I haven't posted here in a while on this autonomous run. Message me if you need me.`;
238
+ }
239
+ // ─── Internals ──────────────────────────────────────────────────────────────
240
+ /** Most-recent outbound (fromUser===false) entry time, or null when none. */
241
+ mostRecentOutboundAt(topicId) {
242
+ let history;
243
+ try {
244
+ history = this.deps.getTopicHistory(topicId) ?? [];
245
+ }
246
+ catch {
247
+ // @silent-fallback-ok: this is fail-CLOSED, not a degraded fallback — when history
248
+ // can't be read we treat the topic as "spoke just now" (MAX_SAFE_INTEGER sentinel)
249
+ // so the silence gate CANNOT fire on missing evidence. Suppressing a heartbeat on
250
+ // an unreadable read is the safe direction; reporting degradation here would be
251
+ // noise on the common transient-read case.
252
+ return Number.MAX_SAFE_INTEGER;
253
+ }
254
+ let latest = null;
255
+ for (const e of history) {
256
+ if (e.fromUser === false && typeof e.at === 'number') {
257
+ if (latest === null || e.at > latest)
258
+ latest = e.at;
259
+ }
260
+ }
261
+ return latest;
262
+ }
263
+ ensureRunState(topicId, runStartedAtMs) {
264
+ const existing = this.runState.get(topicId);
265
+ if (existing && existing.runStartedAtMs === runStartedAtMs)
266
+ return existing;
267
+ // New run (or first sighting) → fresh throttle state.
268
+ const fresh = { runStartedAtMs, lastHeartbeatAt: 0, count: 0 };
269
+ this.runState.set(topicId, fresh);
270
+ return fresh;
271
+ }
272
+ /**
273
+ * The cooldown (ms) that must elapse before the NEXT heartbeat, given how many
274
+ * have already fired on this run (`count`). The gap WIDENS with each heartbeat:
275
+ * the 1st→2nd gap is ladder[0] (25m), the 2nd→3rd gap is ladder[1] (40m), …
276
+ * (then holds at the last ladder value). So the index is `count-1` (the number
277
+ * of gaps already opened). Floored at silenceThresholdMinutes — the ladder
278
+ * never goes below the user-silence gate.
279
+ */
280
+ currentBackoffMs(count) {
281
+ const gapIdx = Math.min(Math.max(count - 1, 0), BACKOFF_LADDER_MINUTES.length - 1);
282
+ const ladderMin = BACKOFF_LADDER_MINUTES[gapIdx];
283
+ const floorMin = this.cfg.silenceThresholdMs / 60_000;
284
+ return Math.max(ladderMin, floorMin) * 60_000;
285
+ }
286
+ recordEmit(e) {
287
+ this.lastEmits.push(e);
288
+ if (this.lastEmits.length > AutonomousProgressHeartbeat.LAST_EMITS_CAP) {
289
+ this.lastEmits.splice(0, this.lastEmits.length - AutonomousProgressHeartbeat.LAST_EMITS_CAP);
290
+ }
291
+ }
292
+ recordSuppressed(topicId, at, reason) {
293
+ this.emit('suppressed', { topicId, reason });
294
+ }
295
+ }
296
+ //# sourceMappingURL=AutonomousProgressHeartbeat.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AutonomousProgressHeartbeat.js","sourceRoot":"","sources":["../../src/monitoring/AutonomousProgressHeartbeat.ts"],"names":[],"mappings":"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"}
@@ -11,7 +11,7 @@
11
11
  * In-memory only (spec §"ProxyCoordinator liveness" — P16). Dies with the
12
12
  * process. No persistence, no distributed lock.
13
13
  */
14
- export type ProxyHolder = 'presence-proxy' | 'promise-beacon';
14
+ export type ProxyHolder = 'presence-proxy' | 'promise-beacon' | 'autonomous-heartbeat';
15
15
  export declare class ProxyCoordinator {
16
16
  private held;
17
17
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"ProxyCoordinator.d.ts","sourceRoot":"","sources":["../../src/monitoring/ProxyCoordinator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,MAAM,MAAM,WAAW,GAAG,gBAAgB,GAAG,gBAAgB,CAAC;AAE9D,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,IAAI,CAAuE;IACnF;;;;;;;;;;OAUG;IACH,OAAO,CAAC,oBAAoB,CAAkC;IAE9D,+CAA+C;IAC/C,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO;IASzD,iDAAiD;IACjD,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,IAAI;IAOnD,mCAAmC;IACnC,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI;IAIlD,mBAAmB;IACnB,OAAO,IAAI,KAAK,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,WAAW,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IASzE;;;;;OAKG;IACH,oBAAoB,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,GAAE,MAAmB,GAAG,IAAI;IAItE;;;;;;;OAOG;IACH,uBAAuB,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,GAAE,MAAmB,GAAG,OAAO;IAMhF;;;OAGG;IACH,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;CAG3C"}
1
+ {"version":3,"file":"ProxyCoordinator.d.ts","sourceRoot":"","sources":["../../src/monitoring/ProxyCoordinator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,MAAM,MAAM,WAAW,GAAG,gBAAgB,GAAG,gBAAgB,GAAG,sBAAsB,CAAC;AAEvF,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,IAAI,CAAuE;IACnF;;;;;;;;;;OAUG;IACH,OAAO,CAAC,oBAAoB,CAAkC;IAE9D,+CAA+C;IAC/C,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO;IASzD,iDAAiD;IACjD,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,IAAI;IAOnD,mCAAmC;IACnC,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI;IAIlD,mBAAmB;IACnB,OAAO,IAAI,KAAK,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,WAAW,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IASzE;;;;;OAKG;IACH,oBAAoB,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,GAAE,MAAmB,GAAG,IAAI;IAItE;;;;;;;OAOG;IACH,uBAAuB,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,GAAE,MAAmB,GAAG,OAAO;IAMhF;;;OAGG;IACH,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;CAG3C"}
@@ -0,0 +1,44 @@
1
+ /**
2
+ * autonomousHeartbeatScrub — the deterministic boundary scrub for the
3
+ * AutonomousProgressHeartbeat's interpolated `focus`.
4
+ *
5
+ * Per docs/specs/autonomous-progress-heartbeat.md §Content, `focus` is
6
+ * LLM-derived from conversation/feedback content and therefore
7
+ * attacker-influenceable. Before it is used in the message AND before it is
8
+ * stored into the status route's `lastEmits`, it MUST pass this deterministic
9
+ * boundary scrub:
10
+ * - run it through the credential/secret/path regex set (reuse of the
11
+ * credential-leak-detector / PolicyEnforcementLayer patterns);
12
+ * - on ANY match, DROP focus entirely (the caller falls back to the generic
13
+ * line) — never emit partially-redacted attacker content;
14
+ * - length-clamp to ≤200 chars;
15
+ * - HTML-escape for the Telegram formatter (the message is sent on the
16
+ * `isProxy` path; focus is interpolated).
17
+ *
18
+ * This is a BOUNDARY SCRUB — a deterministic structural validator, not a new
19
+ * LLM gate — and is therefore signal-vs-authority compliant.
20
+ */
21
+ /** Max length of the (post-clamp, pre-escape) focus string. */
22
+ export declare const FOCUS_MAX_LENGTH = 200;
23
+ /** True if `text` matches any credential/secret/path pattern → focus must drop. */
24
+ export declare function focusHasScrubMatch(text: string): boolean;
25
+ export interface ScrubResult {
26
+ /** The HTML-escaped, length-clamped focus to interpolate — or null to drop. */
27
+ focus: string | null;
28
+ /** Why focus was dropped (for the status route / observability). */
29
+ dropped: boolean;
30
+ /** The reason a drop happened: 'scrub-match' | 'empty'. Absent when kept. */
31
+ reason?: 'scrub-match' | 'empty';
32
+ }
33
+ /**
34
+ * Apply the boundary scrub to a raw focus string.
35
+ * - empty/whitespace → dropped (reason 'empty').
36
+ * - any scrub match → dropped (reason 'scrub-match') — never partially redacted.
37
+ * - otherwise → length-clamped to FOCUS_MAX_LENGTH then HTML-escaped.
38
+ *
39
+ * Length-clamp happens BEFORE escape so the 200-char budget is over the visible
40
+ * text, not the escaped expansion. The scrub runs over the RAW text (before
41
+ * clamp) so a secret split across the clamp boundary still trips a pattern.
42
+ */
43
+ export declare function scrubFocus(raw: string | null | undefined): ScrubResult;
44
+ //# sourceMappingURL=autonomousHeartbeatScrub.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"autonomousHeartbeatScrub.d.ts","sourceRoot":"","sources":["../../src/monitoring/autonomousHeartbeatScrub.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAIH,+DAA+D;AAC/D,eAAO,MAAM,gBAAgB,MAAM,CAAC;AAgCpC,mFAAmF;AACnF,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAGxD;AAED,MAAM,WAAW,WAAW;IAC1B,+EAA+E;IAC/E,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,oEAAoE;IACpE,OAAO,EAAE,OAAO,CAAC;IACjB,6EAA6E;IAC7E,MAAM,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC;CAClC;AAED;;;;;;;;;GASG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,WAAW,CAQtE"}
@@ -0,0 +1,81 @@
1
+ /**
2
+ * autonomousHeartbeatScrub — the deterministic boundary scrub for the
3
+ * AutonomousProgressHeartbeat's interpolated `focus`.
4
+ *
5
+ * Per docs/specs/autonomous-progress-heartbeat.md §Content, `focus` is
6
+ * LLM-derived from conversation/feedback content and therefore
7
+ * attacker-influenceable. Before it is used in the message AND before it is
8
+ * stored into the status route's `lastEmits`, it MUST pass this deterministic
9
+ * boundary scrub:
10
+ * - run it through the credential/secret/path regex set (reuse of the
11
+ * credential-leak-detector / PolicyEnforcementLayer patterns);
12
+ * - on ANY match, DROP focus entirely (the caller falls back to the generic
13
+ * line) — never emit partially-redacted attacker content;
14
+ * - length-clamp to ≤200 chars;
15
+ * - HTML-escape for the Telegram formatter (the message is sent on the
16
+ * `isProxy` path; focus is interpolated).
17
+ *
18
+ * This is a BOUNDARY SCRUB — a deterministic structural validator, not a new
19
+ * LLM gate — and is therefore signal-vs-authority compliant.
20
+ */
21
+ import { escapeHtmlText } from '../messaging/TelegramMarkdownFormatter.js';
22
+ /** Max length of the (post-clamp, pre-escape) focus string. */
23
+ export const FOCUS_MAX_LENGTH = 200;
24
+ /**
25
+ * Credential / secret / path / internal-URL patterns. A reuse of the
26
+ * PolicyEnforcementLayer credential-leak set (kept inline + self-contained so
27
+ * the scrub is a pure, deterministic, unit-testable function with no I/O).
28
+ * On ANY match, focus is dropped.
29
+ */
30
+ const SCRUB_PATTERNS = [
31
+ // ── Credentials / secrets ──
32
+ /\bsk-ant-[A-Za-z0-9_-]{20,}\b/, // Anthropic API key
33
+ /\bsk-[A-Za-z0-9_-]{20,}\b/, // OpenAI API key
34
+ /\bghp_[A-Za-z0-9]{20,}\b/, // GitHub PAT
35
+ /\bgho_[A-Za-z0-9]{20,}\b/, // GitHub OAuth token
36
+ /\bghu_[A-Za-z0-9]{20,}\b/, // GitHub user-to-server token
37
+ /\bghs_[A-Za-z0-9]{20,}\b/, // GitHub server-to-server token
38
+ /\bghr_[A-Za-z0-9]{20,}\b/, // GitHub refresh token
39
+ /\bxox[baprs]-[A-Za-z0-9-]{8,}\b/, // Slack tokens
40
+ /\bAKIA[0-9A-Z]{12,}\b/, // AWS access key
41
+ /\bsk_(?:live|test)_[A-Za-z0-9]{12,}\b/, // Stripe keys
42
+ /Bearer\s+[A-Za-z0-9_\-.]{20,}/i, // bearer token
43
+ /(?:password|passwd|pwd|secret|api[_-]?key|token)\s*[:=]\s*\S{6,}/i, // generic secret assignment
44
+ /-----BEGIN\s+(?:RSA\s+)?PRIVATE\s+KEY-----/, // PEM private key block
45
+ // ── Sensitive / absolute paths ──
46
+ /\/?\.instar\/[^\s)"']*/, // .instar/ paths
47
+ /\/?\.claude\/[^\s)"']*/, // .claude/ paths
48
+ /\/Users\/[^\s)"']+/, // macOS home paths
49
+ /\/home\/[^\s)"']+/, // linux home paths
50
+ // ── Internal URLs ──
51
+ /\bhttps?:\/\/(?:localhost|127\.0\.0\.1|0\.0\.0\.0)(?::\d+)?[^\s)]*/i,
52
+ ];
53
+ /** True if `text` matches any credential/secret/path pattern → focus must drop. */
54
+ export function focusHasScrubMatch(text) {
55
+ if (!text)
56
+ return false;
57
+ return SCRUB_PATTERNS.some((p) => p.test(text));
58
+ }
59
+ /**
60
+ * Apply the boundary scrub to a raw focus string.
61
+ * - empty/whitespace → dropped (reason 'empty').
62
+ * - any scrub match → dropped (reason 'scrub-match') — never partially redacted.
63
+ * - otherwise → length-clamped to FOCUS_MAX_LENGTH then HTML-escaped.
64
+ *
65
+ * Length-clamp happens BEFORE escape so the 200-char budget is over the visible
66
+ * text, not the escaped expansion. The scrub runs over the RAW text (before
67
+ * clamp) so a secret split across the clamp boundary still trips a pattern.
68
+ */
69
+ export function scrubFocus(raw) {
70
+ const text = (raw ?? '').replace(/\s+/g, ' ').trim();
71
+ if (!text)
72
+ return { focus: null, dropped: true, reason: 'empty' };
73
+ if (focusHasScrubMatch(text))
74
+ return { focus: null, dropped: true, reason: 'scrub-match' };
75
+ const clamped = text.length > FOCUS_MAX_LENGTH ? text.slice(0, FOCUS_MAX_LENGTH) : text;
76
+ const escaped = escapeHtmlText(clamped);
77
+ if (!escaped)
78
+ return { focus: null, dropped: true, reason: 'empty' };
79
+ return { focus: escaped, dropped: false };
80
+ }
81
+ //# sourceMappingURL=autonomousHeartbeatScrub.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"autonomousHeartbeatScrub.js","sourceRoot":"","sources":["../../src/monitoring/autonomousHeartbeatScrub.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,2CAA2C,CAAC;AAE3E,+DAA+D;AAC/D,MAAM,CAAC,MAAM,gBAAgB,GAAG,GAAG,CAAC;AAEpC;;;;;GAKG;AACH,MAAM,cAAc,GAAa;IAC/B,8BAA8B;IAC9B,+BAA+B,EAAY,oBAAoB;IAC/D,2BAA2B,EAAgB,iBAAiB;IAC5D,0BAA0B,EAAiB,aAAa;IACxD,0BAA0B,EAAiB,qBAAqB;IAChE,0BAA0B,EAAiB,8BAA8B;IACzE,0BAA0B,EAAiB,gCAAgC;IAC3E,0BAA0B,EAAiB,uBAAuB;IAClE,iCAAiC,EAAU,eAAe;IAC1D,uBAAuB,EAAoB,iBAAiB;IAC5D,uCAAuC,EAAI,cAAc;IACzD,gCAAgC,EAAW,eAAe;IAC1D,mEAAmE,EAAE,4BAA4B;IACjG,4CAA4C,EAAE,wBAAwB;IACtE,mCAAmC;IACnC,wBAAwB,EAAmB,iBAAiB;IAC5D,wBAAwB,EAAmB,iBAAiB;IAC5D,oBAAoB,EAAuB,mBAAmB;IAC9D,mBAAmB,EAAwB,mBAAmB;IAC9D,sBAAsB;IACtB,qEAAqE;CACtE,CAAC;AAEF,mFAAmF;AACnF,MAAM,UAAU,kBAAkB,CAAC,IAAY;IAC7C,IAAI,CAAC,IAAI;QAAE,OAAO,KAAK,CAAC;IACxB,OAAO,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AAClD,CAAC;AAWD;;;;;;;;;GASG;AACH,MAAM,UAAU,UAAU,CAAC,GAA8B;IACvD,MAAM,IAAI,GAAG,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IACrD,IAAI,CAAC,IAAI;QAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;IAClE,IAAI,kBAAkB,CAAC,IAAI,CAAC;QAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC;IAC3F,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,GAAG,gBAAgB,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,gBAAgB,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACxF,MAAM,OAAO,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;IACxC,IAAI,CAAC,OAAO;QAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;IACrE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;AAC5C,CAAC"}
@@ -132,6 +132,20 @@ export declare class OutputActivityTracker {
132
132
  private readonly last;
133
133
  constructor(sessions: SentinelSessionSurface, now?: () => number);
134
134
  snapshot(): SessionRegistryEntry[];
135
+ /**
136
+ * Cached read of the LAST-computed output-change time for a session, WITHOUT
137
+ * capturing (no tmux frame is read). Returns the `lastChangeAt` recorded by
138
+ * the most recent `snapshot()` call, or null when the session has not been
139
+ * observed yet OR its first sighting only recorded the baseline (lastChangeAt
140
+ * is still 0 — i.e. no real output change has been observed).
141
+ *
142
+ * This is the AutonomousProgressHeartbeat's predicate #8 read (spec
143
+ * §Shared-snapshot dependency): the heartbeat shares THIS tracker (the one
144
+ * ActiveWorkSilenceSentinel ticks on its own 60s loop) and reads the value it
145
+ * already computed — it NEVER captures its own frame. Returns null fails-closed
146
+ * for the heartbeat (no emit).
147
+ */
148
+ lastOutputAtFor(sessionName: string): number | null;
135
149
  }
136
150
  export declare function buildActiveWorkSilenceDeps(opts: {
137
151
  tracker: OutputActivityTracker;
@@ -1 +1 @@
1
- {"version":3,"file":"sentinelWiring.d.ts","sourceRoot":"","sources":["../../src/monitoring/sentinelWiring.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sentinelWiring.d.ts","sourceRoot":"","sources":["../../src/monitoring/sentinelWiring.ts"],"names":[],"mappings":"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"}
@@ -207,6 +207,25 @@ export class OutputActivityTracker {
207
207
  }
208
208
  return out;
209
209
  }
210
+ /**
211
+ * Cached read of the LAST-computed output-change time for a session, WITHOUT
212
+ * capturing (no tmux frame is read). Returns the `lastChangeAt` recorded by
213
+ * the most recent `snapshot()` call, or null when the session has not been
214
+ * observed yet OR its first sighting only recorded the baseline (lastChangeAt
215
+ * is still 0 — i.e. no real output change has been observed).
216
+ *
217
+ * This is the AutonomousProgressHeartbeat's predicate #8 read (spec
218
+ * §Shared-snapshot dependency): the heartbeat shares THIS tracker (the one
219
+ * ActiveWorkSilenceSentinel ticks on its own 60s loop) and reads the value it
220
+ * already computed — it NEVER captures its own frame. Returns null fails-closed
221
+ * for the heartbeat (no emit).
222
+ */
223
+ lastOutputAtFor(sessionName) {
224
+ const rec = this.last.get(sessionName);
225
+ if (!rec || rec.lastChangeAt <= 0)
226
+ return null;
227
+ return rec.lastChangeAt;
228
+ }
210
229
  }
211
230
  export function buildActiveWorkSilenceDeps(opts) {
212
231
  return {
@@ -1 +1 @@
1
- {"version":3,"file":"sentinelWiring.js","sourceRoot":"","sources":["../../src/monitoring/sentinelWiring.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sentinelWiring.js","sourceRoot":"","sources":["../../src/monitoring/sentinelWiring.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"templates.d.ts","sourceRoot":"","sources":["../../src/scaffold/templates.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AASH,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,aAAa,GAAG,MAAM,CAgG/D;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CA2E/F;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAiBvD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CA2B1D;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,OAAO,EACpB,WAAW,GAAE,OAAe,EAC5B,WAAW,GAAE,OAAe,GAC3B,MAAM,CAwgDR;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAClC,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,OAAO,EACpB,WAAW,GAAE,OAAe,GAC3B,MAAM,CA2TR"}
1
+ {"version":3,"file":"templates.d.ts","sourceRoot":"","sources":["../../src/scaffold/templates.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AASH,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,aAAa,GAAG,MAAM,CAgG/D;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CA2E/F;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAiBvD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CA2B1D;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,OAAO,EACpB,WAAW,GAAE,OAAe,EAC5B,WAAW,GAAE,OAAe,GAC3B,MAAM,CAohDR;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAClC,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,OAAO,EACpB,WAAW,GAAE,OAAe,GAC3B,MAAM,CA2TR"}
@@ -868,6 +868,11 @@ ${PLAYWRIGHT_PROFILE_REGISTRY_CLAUDEMD_SECTION(port)}
868
868
  - Status (read-only counters): \`curl -H "Authorization: Bearer $AUTH" http://localhost:${port}/feedback-inbox/status\` → \`{ running, drained, duplicates, quarantined, errors, ticks, lastTickAt, lastDrainAt, lastError }\`.
869
869
  - **When to use** (PROACTIVE): "are fleet feedback reports flowing / stuck?" → read this status. A growing \`errors\` + stale \`lastDrainAt\` means the inbox is backing up (reports are SAFE in the inbox — durability is cloud-side); \`quarantined > 0\` means malformed objects were preserved under \`quarantine/\` for inspection, never dropped.
870
870
 
871
+ **Feedback-Factory Processing (operated feedback factory)** — The clustering/triage side of the operated instance. The InboxDrainer fills the canonical store with raw fleet reports; THIS is what groups them. The processor reads unprocessed reports, clusters them into dedup groups (similarity/Jaccard), auto-reopens a cluster on a possible-regression merge, and flips each item unprocessed→processing. It appends LOCAL JSONL only — no external action, and it NEVER force-closes a curated cluster (terminal transitions stay evidence-gated). Dev-gated dark behind \`feedbackFactory.processing\` (LIVE on a development agent, both routes 503 on the fleet). The cadenced \`feedback-factory-process\` built-in job (off by default, tier-1 supervised) drives the trigger so reports are clustered on a schedule, not just on demand.
872
+ - Read-only stats over the canonical store: \`curl -H "Authorization: Bearer $AUTH" http://localhost:${port}/feedback-factory/stats\` → \`{ total, byStatus, clusterCount, dispatchCount, lastWriteAt }\`. \`byStatus.unprocessed\` is the backlog awaiting the next pass.
873
+ - Trigger ONE clustering pass now: \`curl -X POST -H "Authorization: Bearer $AUTH" http://localhost:${port}/feedback-factory/process\` → \`{ processed, metrics: { captured, created, merged, reopened }, stats }\`. Idempotent + forward-only — a re-run is a no-op over already-processed items.
874
+ - **When to use** (PROACTIVE): "are incoming reports getting clustered / how many are unprocessed?" → \`GET /feedback-factory/stats\`. "process the feedback backlog now" → \`POST /feedback-factory/process\` (or let the \`feedback-factory-process\` job handle the cadence). A 503 on either route means this agent isn't running the operated processing side (\`feedbackFactory.processing\` dark) — say so honestly rather than guessing.
875
+
871
876
  **Session Clock** — How long have you been running, and how much time is left? For any active time-boxed (autonomous) session, this returns the computed elapsed + remaining so you never have to guess or compute it yourself. Read-only observability.
872
877
  - Check: \`curl -H "Authorization: Bearer $AUTH" "http://localhost:${port}/session/clock"\` (optional \`?topic=<N>\` to bind to one session)
873
878
  - Returns \`{ now, nowIso, sessions: [{ label, kind, startedAt, endsAt, elapsedSeconds, remainingSeconds, elapsedHuman, remainingHuman, percentElapsed, status }] }\`; \`{ sessions: [] }\` when nothing is time-boxed. Per-machine (the record is local).
@@ -1540,6 +1545,13 @@ Two background notifiers used to post frequent, falsely-confident noise because
1540
1545
  - **Silent-freeze watchdog** (ActiveWorkSilenceSentinel): before claiming a session is stuck, it re-captures the LIVE frame and corroborates — if the frame still shows an active-work indicator (spinner / "esc to interrupt"), a sub-agent is live, or it's a clean idle prompt, it stays SILENT. It speaks only when genuinely wedged, and even then hedges ("…hasn't changed in N min and a nudge didn't wake it — it may be stuck, or on a long task I can't see into. Want me to check?"). Threshold raised 15m→30m; a 90m frozen-indicator backstop still surfaces a real mid-tool hang. Tune/disable: \`monitoring.activeWorkSilenceSentinel.enabled\` (off), \`.silenceThresholdMs\` (default 30m), \`.activeWorkMaxFrozenIndicatorMs\` (default 90m).
1541
1546
  - **Promise beacon** (the ⏳ heartbeats): the zero-information "still on it, no new output" filler is suppressed by default — it speaks only on genuine new progress, deadline pressure, a sparse once-per-60m liveness line, or a one-shot turn-finished close-out. Base cadence relaxed 10m→20m. Tune/disable: \`promiseBeacon.suppressUnchangedHeartbeats: false\` (restore the legacy every-tick heartbeat — the rollback lever), \`promiseBeacon.beaconLivenessIntervalMs\` (default 60m), \`promiseBeacon.turnFinishedCloseoutChecks\` (default 3).
1542
1547
  - **Doc correction:** the trio's escalations are NOT gated by \`monitoring.sentinelTelegramEscalation\` (that gate governs a different path); they route through the tone-gated \`/attention\` surface and are controlled by each sentinel's own \`enabled\` flag (both default true). Effectiveness is measurable in \`logs/sentinel-events.jsonl\` and the per-feature LLM-metrics surface (feature keys \`active-work-silence\`, \`promise-beacon\`). Spec: \`docs/specs/HONEST-PROGRESS-MESSAGING-SPEC.md\`.
1548
+
1549
+ ## Autonomous-run silence backstop (AutonomousProgressHeartbeat)
1550
+
1551
+ A proactive backstop that posts ONE purely-observational liveness line when an autonomous run has gone silent on you for a long stretch while its terminal output is still changing. **This is NOT the commitment-cadence "still on it" heartbeat that the honest-progress work removed** — it fires only on a LONG user-silence gate (≥25m) WITH corroborated recent output change (a liveness signal, NOT a progress claim), and the wording is observational ("I haven't posted here in a while — last observed activity was «…». Message me if you need me."), never an assertive "still working" / "still going" claim. It closes the *busy-but-silent-to-user* gap the other watchers miss: the silent-freeze watchdog stays quiet while output is moving (it's a stuck-detector), PresenceProxy needs an inbound message, and PromiseBeacon needs an open commitment — a long heads-down autonomous run with no commitment and no inbound message falls through all three. The real fix is still you sending your own milestones; this only catches a lapse.
1552
+ - **It can't spam you (three LOCAL brakes, NOT dedup):** a long user-silence gate that ANY outbound (including your own normal reply) resets; a per-topic emit-cooldown; and a widening per-run backoff (25→40→60→90m) with a hard cap (~6 lines per run). A 24h silent-but-working run yields a handful of hedged lines, never dozens. Output advancing proves only LIVENESS, never that work is progressing (a log/retry loop also advances output) — which is exactly why the wording is liveness-only.
1553
+ - **Signal-only:** it only ever ADDS a line — never blocks, delays, or rewrites your real messages. Every predicate fails CLOSED (no emit) on any uncertainty (can't read history, the shared snapshot is unavailable, the run is mid-move to another machine). The interpolated \`focus\` is scrubbed for credentials/secrets/paths (drop-to-generic on any match), length-clamped, and HTML-escaped before it's ever shown.
1554
+ - **Status:** \`curl -H "Authorization: Bearer $AUTH" http://localhost:4042/autonomous-heartbeat\` → \`{ enabled, dryRun, silenceThresholdMinutes, lastTickAt, topicsConsidered, lastEmits }\` (503 when dark). Ships dark on the fleet + \`dryRun: true\` on a dev agent (logs "would emit" on the SAME cooldown/budget as live). Tune/disable: \`monitoring.autonomousHeartbeat\` (\`dryRun\`, \`silenceThresholdMinutes\`, \`tickIntervalMs\`, \`maxHeartbeatsPerRun\`). Spec: \`docs/specs/autonomous-progress-heartbeat.md\`.
1543
1555
  `;
1544
1556
  if (hasTelegram) {
1545
1557
  content += `