instar 1.3.68 → 1.3.70
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/dist/core/SessionRefresh.d.ts +6 -2
- package/dist/core/SessionRefresh.d.ts.map +1 -1
- package/dist/core/SessionRefresh.js +23 -7
- package/dist/core/SessionRefresh.js.map +1 -1
- package/dist/messaging/TelegramAdapter.d.ts +19 -0
- package/dist/messaging/TelegramAdapter.d.ts.map +1 -1
- package/dist/messaging/TelegramAdapter.js +36 -0
- package/dist/messaging/TelegramAdapter.js.map +1 -1
- package/dist/monitoring/CollaborationRedriveEngine.d.ts +36 -1
- package/dist/monitoring/CollaborationRedriveEngine.d.ts.map +1 -1
- package/dist/monitoring/CollaborationRedriveEngine.js +85 -8
- package/dist/monitoring/CollaborationRedriveEngine.js.map +1 -1
- package/package.json +1 -1
- package/src/data/builtin-manifest.json +2 -2
- package/upgrades/1.3.69.md +65 -0
- package/upgrades/1.3.70.md +30 -0
- package/upgrades/side-effects/collab-redrive-fp-as-relatedAgent-and-flood-fix.md +26 -0
- package/upgrades/side-effects/context-wedge-null-topic-recovery.md +100 -0
|
@@ -41,6 +41,17 @@ export interface CollaborationRedriveConfig {
|
|
|
41
41
|
maxRedrivesPerTick: number;
|
|
42
42
|
trustFloor: string;
|
|
43
43
|
dedupeJaccard: number;
|
|
44
|
+
/**
|
|
45
|
+
* Dogfood fix (2026-05-28): an unresolvable peer name is a STABLE condition
|
|
46
|
+
* (the name is missing from known-agents.json — it doesn't fix itself on
|
|
47
|
+
* the next sweep). Without a cooldown, the engine escalated to the
|
|
48
|
+
* Attention queue every few sweeps for every such peer → notification
|
|
49
|
+
* flood on Echo, observed live. After this many ms since the last
|
|
50
|
+
* unreachable-peer escalation for a given peer, the engine may escalate
|
|
51
|
+
* again. Default 24h. Cooldown is durable (persisted to disk), so it
|
|
52
|
+
* survives restart.
|
|
53
|
+
*/
|
|
54
|
+
unreachableEscalationCooldownMs: number;
|
|
44
55
|
}
|
|
45
56
|
export declare const DEFAULT_REDRIVE_CONFIG: CollaborationRedriveConfig;
|
|
46
57
|
export interface CollaborationRedriveDeps {
|
|
@@ -55,6 +66,11 @@ export interface CollaborationRedriveDeps {
|
|
|
55
66
|
source?: string;
|
|
56
67
|
}) => Promise<unknown>;
|
|
57
68
|
knownAgentsPath: string;
|
|
69
|
+
/**
|
|
70
|
+
* Where to persist the per-peer "last unreachable escalation" timestamp
|
|
71
|
+
* log (dogfood fix). Defaults next to `knownAgentsPath` if not set.
|
|
72
|
+
*/
|
|
73
|
+
escalationLogPath?: string;
|
|
58
74
|
now?: () => number;
|
|
59
75
|
log?: {
|
|
60
76
|
log: (m: string) => void;
|
|
@@ -73,8 +89,20 @@ export declare class CollaborationRedriveEngine {
|
|
|
73
89
|
private readonly now;
|
|
74
90
|
private readonly log;
|
|
75
91
|
private sweepTimer;
|
|
76
|
-
|
|
92
|
+
/** Resolved path to the durable per-peer unreachable-escalation log. */
|
|
93
|
+
private readonly escalationLogPath;
|
|
94
|
+
/** In-memory cache of the on-disk escalation log; lazy-loaded. */
|
|
95
|
+
private escalationLogCache;
|
|
77
96
|
constructor(deps: CollaborationRedriveDeps, cfg?: Partial<CollaborationRedriveConfig>);
|
|
97
|
+
/**
|
|
98
|
+
* Has it been at least `unreachableEscalationCooldownMs` since we last
|
|
99
|
+
* escalated "can't reach <peer>" for this peer? Reads from the durable
|
|
100
|
+
* log; if the cooldown has elapsed (or there's no record), the engine
|
|
101
|
+
* may escalate again. Persistent across restart by design.
|
|
102
|
+
*/
|
|
103
|
+
private shouldEscalateUnreachable;
|
|
104
|
+
private recordUnreachableEscalation;
|
|
105
|
+
private loadEscalationLog;
|
|
78
106
|
start(): void;
|
|
79
107
|
stop(): void;
|
|
80
108
|
tick(): Promise<TickResult>;
|
|
@@ -86,6 +114,13 @@ export declare class CollaborationRedriveEngine {
|
|
|
86
114
|
};
|
|
87
115
|
private checkCompletion;
|
|
88
116
|
private resolveFingerprint;
|
|
117
|
+
/**
|
|
118
|
+
* `relatedAgent` looks like a Threadline fingerprint if it is exactly 32
|
|
119
|
+
* hex characters (the format `computeFingerprint` produces — first 16
|
|
120
|
+
* bytes of the Ed25519 public key, hex-encoded). Matched
|
|
121
|
+
* case-insensitively; the resolver normalises to lowercase before use.
|
|
122
|
+
*/
|
|
123
|
+
static looksLikeFingerprint(s: string): boolean;
|
|
89
124
|
private buildNudge;
|
|
90
125
|
private escalateCapHit;
|
|
91
126
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CollaborationRedriveEngine.d.ts","sourceRoot":"","sources":["../../src/monitoring/CollaborationRedriveEngine.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;
|
|
1
|
+
{"version":3,"file":"CollaborationRedriveEngine.d.ts","sourceRoot":"","sources":["../../src/monitoring/CollaborationRedriveEngine.ts"],"names":[],"mappings":"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"}
|
|
@@ -28,6 +28,7 @@
|
|
|
28
28
|
* Ships OFF by default (`monitoring.collaborationRedrive.enabled: false`).
|
|
29
29
|
*/
|
|
30
30
|
import fs from 'node:fs';
|
|
31
|
+
import path from 'node:path';
|
|
31
32
|
export const DEFAULT_REDRIVE_CONFIG = {
|
|
32
33
|
enabled: false,
|
|
33
34
|
sweepIntervalMs: 5 * 60 * 1000,
|
|
@@ -38,6 +39,7 @@ export const DEFAULT_REDRIVE_CONFIG = {
|
|
|
38
39
|
maxRedrivesPerTick: 1,
|
|
39
40
|
trustFloor: 'verified',
|
|
40
41
|
dedupeJaccard: 0.7,
|
|
42
|
+
unreachableEscalationCooldownMs: 24 * 60 * 60 * 1000,
|
|
41
43
|
};
|
|
42
44
|
// ── Implementation ────────────────────────────────────────────
|
|
43
45
|
const TERMINAL_STATUSES = new Set(['delivered', 'expired', 'withdrawn']);
|
|
@@ -48,7 +50,10 @@ export class CollaborationRedriveEngine {
|
|
|
48
50
|
now;
|
|
49
51
|
log;
|
|
50
52
|
sweepTimer = null;
|
|
51
|
-
|
|
53
|
+
/** Resolved path to the durable per-peer unreachable-escalation log. */
|
|
54
|
+
escalationLogPath;
|
|
55
|
+
/** In-memory cache of the on-disk escalation log; lazy-loaded. */
|
|
56
|
+
escalationLogCache = null;
|
|
52
57
|
constructor(deps, cfg = {}) {
|
|
53
58
|
this.cfg = { ...DEFAULT_REDRIVE_CONFIG, ...cfg };
|
|
54
59
|
this.deps = deps;
|
|
@@ -57,6 +62,52 @@ export class CollaborationRedriveEngine {
|
|
|
57
62
|
log: (m) => console.log(`[CollabRedrive] ${m}`),
|
|
58
63
|
warn: (m) => console.warn(`[CollabRedrive] ${m}`),
|
|
59
64
|
};
|
|
65
|
+
// Default the escalation log next to known-agents.json (already a
|
|
66
|
+
// per-agent path under .instar/threadline) unless the caller overrides.
|
|
67
|
+
this.escalationLogPath = deps.escalationLogPath
|
|
68
|
+
?? path.join(path.dirname(deps.knownAgentsPath), 'collab-redrive-escalation-log.json');
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Has it been at least `unreachableEscalationCooldownMs` since we last
|
|
72
|
+
* escalated "can't reach <peer>" for this peer? Reads from the durable
|
|
73
|
+
* log; if the cooldown has elapsed (or there's no record), the engine
|
|
74
|
+
* may escalate again. Persistent across restart by design.
|
|
75
|
+
*/
|
|
76
|
+
shouldEscalateUnreachable(peer, nowMs) {
|
|
77
|
+
const log = this.loadEscalationLog();
|
|
78
|
+
const lastIso = log[peer];
|
|
79
|
+
if (!lastIso)
|
|
80
|
+
return true;
|
|
81
|
+
const lastMs = Date.parse(lastIso);
|
|
82
|
+
if (!Number.isFinite(lastMs))
|
|
83
|
+
return true;
|
|
84
|
+
return (nowMs - lastMs) >= this.cfg.unreachableEscalationCooldownMs;
|
|
85
|
+
}
|
|
86
|
+
recordUnreachableEscalation(peer, nowMs) {
|
|
87
|
+
const log = this.loadEscalationLog();
|
|
88
|
+
log[peer] = new Date(nowMs).toISOString();
|
|
89
|
+
try {
|
|
90
|
+
fs.mkdirSync(path.dirname(this.escalationLogPath), { recursive: true });
|
|
91
|
+
fs.writeFileSync(this.escalationLogPath, JSON.stringify(log, null, 2));
|
|
92
|
+
}
|
|
93
|
+
catch (err) {
|
|
94
|
+
this.log.warn(`failed to persist escalation log: ${err instanceof Error ? err.message : String(err)}`);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
loadEscalationLog() {
|
|
98
|
+
if (this.escalationLogCache !== null)
|
|
99
|
+
return this.escalationLogCache;
|
|
100
|
+
try {
|
|
101
|
+
const raw = fs.readFileSync(this.escalationLogPath, 'utf-8');
|
|
102
|
+
const parsed = JSON.parse(raw);
|
|
103
|
+
this.escalationLogCache = (parsed && typeof parsed === 'object' && !Array.isArray(parsed))
|
|
104
|
+
? parsed
|
|
105
|
+
: {};
|
|
106
|
+
}
|
|
107
|
+
catch {
|
|
108
|
+
this.escalationLogCache = {};
|
|
109
|
+
}
|
|
110
|
+
return this.escalationLogCache;
|
|
60
111
|
}
|
|
61
112
|
start() {
|
|
62
113
|
if (this.sweepTimer)
|
|
@@ -141,18 +192,24 @@ export class CollaborationRedriveEngine {
|
|
|
141
192
|
}
|
|
142
193
|
const fingerprint = this.resolveFingerprint(peer);
|
|
143
194
|
if (!fingerprint) {
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
195
|
+
// Dogfood fix (2026-05-28): unresolvable peer names are STABLE
|
|
196
|
+
// conditions (the name is missing from known-agents.json — it won't
|
|
197
|
+
// resolve itself on the next sweep). The original strike-counter
|
|
198
|
+
// escalated every few sweeps and reset, producing a notification
|
|
199
|
+
// flood. The cooldown is durable per-peer: at most one
|
|
200
|
+
// "can't reach <peer> — unknown routing" item per peer per
|
|
201
|
+
// `unreachableEscalationCooldownMs` (default 24h), persisted to
|
|
202
|
+
// disk so it survives restart.
|
|
203
|
+
result.skipped[c.id] = 'unresolved-name';
|
|
204
|
+
if (this.shouldEscalateUnreachable(peer, nowMs) && this.deps.raiseAttention) {
|
|
148
205
|
try {
|
|
149
206
|
await this.deps.raiseAttention({
|
|
150
207
|
title: `can't reach ${peer} — unknown routing`,
|
|
151
|
-
body: `Tried to nudge ${peer} on commitment ${c.id} ("${c.userRequest.slice(0, 120)}") but no fingerprint resolved from known-agents.json
|
|
208
|
+
body: `Tried to nudge ${peer} on commitment ${c.id} ("${c.userRequest.slice(0, 120)}") but no fingerprint resolved from known-agents.json. Add ${peer} to known-agents.json or close the commitment. (I will not raise this again for this peer for ${Math.round(this.cfg.unreachableEscalationCooldownMs / 3600000)}h.)`,
|
|
152
209
|
priority: 'medium',
|
|
153
210
|
source: 'collaboration-redrive',
|
|
154
211
|
});
|
|
155
|
-
this.
|
|
212
|
+
this.recordUnreachableEscalation(peer, nowMs);
|
|
156
213
|
}
|
|
157
214
|
catch {
|
|
158
215
|
// non-fatal
|
|
@@ -160,7 +217,6 @@ export class CollaborationRedriveEngine {
|
|
|
160
217
|
}
|
|
161
218
|
continue;
|
|
162
219
|
}
|
|
163
|
-
this.unresolvedNameStrikes.delete(peer);
|
|
164
220
|
const currentCount = (c.redriveCount ?? 0) + 1;
|
|
165
221
|
const nudgeText = this.buildNudge(c, currentCount);
|
|
166
222
|
const lastNudge = c.lastRedriveText;
|
|
@@ -257,6 +313,18 @@ export class CollaborationRedriveEngine {
|
|
|
257
313
|
}
|
|
258
314
|
}
|
|
259
315
|
resolveFingerprint(peerName) {
|
|
316
|
+
// Dogfood gap (2026-05-28): `relatedAgent` on a real threadline-reply
|
|
317
|
+
// commitment is sometimes ALREADY a 32-char hex fingerprint, not a
|
|
318
|
+
// display name (e.g. when the commitment was opened from an inbound
|
|
319
|
+
// whose sender we only knew by fingerprint). The original v3 resolver
|
|
320
|
+
// assumed display-name-only, so the lookup missed and every such
|
|
321
|
+
// commitment skipped with `unresolved-name`. Verified live: ~10/15
|
|
322
|
+
// open threadline-reply commitments on Echo used the fingerprint as
|
|
323
|
+
// the peer field. Detect the fingerprint case structurally and use
|
|
324
|
+
// it directly; otherwise fall back to the name lookup.
|
|
325
|
+
if (CollaborationRedriveEngine.looksLikeFingerprint(peerName)) {
|
|
326
|
+
return peerName.toLowerCase();
|
|
327
|
+
}
|
|
260
328
|
try {
|
|
261
329
|
const raw = fs.readFileSync(this.deps.knownAgentsPath, 'utf-8');
|
|
262
330
|
const data = JSON.parse(raw);
|
|
@@ -272,6 +340,15 @@ export class CollaborationRedriveEngine {
|
|
|
272
340
|
return null;
|
|
273
341
|
}
|
|
274
342
|
}
|
|
343
|
+
/**
|
|
344
|
+
* `relatedAgent` looks like a Threadline fingerprint if it is exactly 32
|
|
345
|
+
* hex characters (the format `computeFingerprint` produces — first 16
|
|
346
|
+
* bytes of the Ed25519 public key, hex-encoded). Matched
|
|
347
|
+
* case-insensitively; the resolver normalises to lowercase before use.
|
|
348
|
+
*/
|
|
349
|
+
static looksLikeFingerprint(s) {
|
|
350
|
+
return typeof s === 'string' && /^[0-9a-f]{32}$/i.test(s);
|
|
351
|
+
}
|
|
275
352
|
buildNudge(c, attemptNumber) {
|
|
276
353
|
const peer = c.relatedAgent ?? 'there';
|
|
277
354
|
const ask = c.userRequest.length > 240 ? `${c.userRequest.slice(0, 240)}…` : c.userRequest;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CollaborationRedriveEngine.js","sourceRoot":"","sources":["../../src/monitoring/CollaborationRedriveEngine.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"CollaborationRedriveEngine.js","sourceRoot":"","sources":["../../src/monitoring/CollaborationRedriveEngine.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "./builtin-manifest.schema.json",
|
|
3
3
|
"schemaVersion": 1,
|
|
4
|
-
"generatedAt": "2026-05-
|
|
5
|
-
"instarVersion": "1.3.
|
|
4
|
+
"generatedAt": "2026-05-28T22:59:01.360Z",
|
|
5
|
+
"instarVersion": "1.3.70",
|
|
6
6
|
"entryCount": 193,
|
|
7
7
|
"entries": {
|
|
8
8
|
"hook:session-start": {
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
# Upgrade Guide — vNEXT
|
|
2
|
+
|
|
3
|
+
<!-- bump: patch -->
|
|
4
|
+
|
|
5
|
+
## What Changed
|
|
6
|
+
|
|
7
|
+
**ContextWedgeSentinel recovery now resolves a session's topic from disk when
|
|
8
|
+
the in-memory registry misses** (spec `docs/specs/context-wedge-sentinel.md`,
|
|
9
|
+
Follow-up section). This closes a real gap that left a wedged long-lived dev
|
|
10
|
+
session un-recovered.
|
|
11
|
+
|
|
12
|
+
The thinking-block-400 wedge sentinel (shipped v1.3.62, PR #485) recovers a
|
|
13
|
+
dead session via a fresh respawn through `SessionRefresh`, which needs the
|
|
14
|
+
session's Telegram topic to route the respawn. It resolved that topic from an
|
|
15
|
+
**in-memory** map. On a `--no-telegram` server that map is only a boot-time
|
|
16
|
+
snapshot, while the lifeline keeps writing new topic↔session bindings to the
|
|
17
|
+
registry file on disk. So a session bound AFTER the server booted resolved to
|
|
18
|
+
`null`, recovery bailed with `not_telegram_bound`, and the dead session stayed
|
|
19
|
+
dead — exactly what happened to the Codey collaboration session (topic 13435).
|
|
20
|
+
|
|
21
|
+
What landed:
|
|
22
|
+
|
|
23
|
+
- **`TelegramAdapter.resolveTopicForSessionFromDisk(sessionName)`** — a fresh,
|
|
24
|
+
read-only lookup of the persisted `topic-session-registry.json`. Returns the
|
|
25
|
+
bound topic or null; never mutates in-memory state; never throws (missing or
|
|
26
|
+
corrupt file → null).
|
|
27
|
+
- **`SessionRefresh` topic resolution is now in-memory-then-disk.** It tries the
|
|
28
|
+
in-memory lookup first and, only on a miss, falls back to the disk read before
|
|
29
|
+
giving up. An in-memory hit short-circuits, so the hot path is unchanged.
|
|
30
|
+
Genuinely unbound sessions still return `not_telegram_bound`.
|
|
31
|
+
- **Bonus fix** — a pre-existing flake in the wedge e2e test whose `cleanup()`
|
|
32
|
+
rm-rf'd `os.tmpdir()` itself (a `path.dirname` mistake), intermittently
|
|
33
|
+
breaking the next test's `mkdtemp`. Now scoped to the per-test dir.
|
|
34
|
+
|
|
35
|
+
## What to Tell Your User
|
|
36
|
+
|
|
37
|
+
- The session self-heal for the "stuck thinking-block" failure (the one that
|
|
38
|
+
made sessions silently fast-fail) now also recovers long-lived dev sessions
|
|
39
|
+
that were started before the server last restarted. Previously those one class
|
|
40
|
+
of sessions could be detected but not auto-restarted; now they are.
|
|
41
|
+
|
|
42
|
+
## Summary of New Capabilities
|
|
43
|
+
|
|
44
|
+
| Capability | How to Use |
|
|
45
|
+
|-----------|-----------|
|
|
46
|
+
| Wedge auto-recovery for sessions bound after server boot | Automatic — no config. Rides the existing `monitoring.contextWedgeSentinel.autoRecovery` flag (unchanged from PR #485). |
|
|
47
|
+
|
|
48
|
+
## Migration Notes
|
|
49
|
+
|
|
50
|
+
No migration required. This is pure `src/` logic (TelegramAdapter + SessionRefresh)
|
|
51
|
+
with no agent-installed files changed — no `.claude/settings.json` hooks, no
|
|
52
|
+
`.instar/config.json` defaults, no CLAUDE.md template, no hook scripts, no skills.
|
|
53
|
+
Every agent receives it through the normal dist update; the `autoRecovery` config
|
|
54
|
+
shape already exists from PR #485, so there is nothing for `PostUpdateMigrator` to
|
|
55
|
+
patch.
|
|
56
|
+
|
|
57
|
+
## Evidence
|
|
58
|
+
|
|
59
|
+
- Unit: `tests/unit/SessionRefresh.test.ts` (20 pass, +3 disk-fallback cases),
|
|
60
|
+
`tests/unit/telegram-registry-log.test.ts` (20 pass, +4 disk-read cases).
|
|
61
|
+
- Integration: `tests/integration/session-refresh-disk-topic-fallback.test.ts`
|
|
62
|
+
(2 pass) — REAL `SessionRefresh` × REAL `TelegramAdapter`, disk-only binding
|
|
63
|
+
recovers end-to-end (the exact Codey shape); truly-unbound still bails.
|
|
64
|
+
- E2E: `tests/e2e/context-wedge-sentinel-lifecycle.test.ts` (7 pass, flake fixed).
|
|
65
|
+
- Full related set: 114 pass across 8 files.
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
# Upgrade Guide — vNEXT
|
|
2
|
+
|
|
3
|
+
<!-- bump: patch -->
|
|
4
|
+
|
|
5
|
+
## What Changed
|
|
6
|
+
|
|
7
|
+
Two dogfood-surfaced fixes for `CollaborationRedriveEngine` (shipped in v1.3.66 via #490, dogfood-enabled on Echo today):
|
|
8
|
+
|
|
9
|
+
1. **Fingerprint-as-relatedAgent.** Many real `threadline-reply` commitments store the peer's 32-character hex fingerprint directly in `relatedAgent` (not a display name). The resolver now detects that case (`/^[0-9a-f]{32}$/i`) and uses the value directly as the routing address, normalising to lowercase. Falls through to the name lookup only for non-fingerprint strings. Without this fix, ~10 of 15 active commitments on Echo would skip with `unresolved-name` instead of nudging.
|
|
10
|
+
|
|
11
|
+
2. **Escalation flood.** The original `unresolved-name` path raised an Attention-queue item after 3 in-memory strikes per peer and reset the counter — producing a fresh "can't reach <peer>" item every few sweeps for every unresolvable peer (35+ items in <30 min observed on Echo). Replaced with a **durable per-peer 24h cooldown** persisted to `<knownAgentsDir>/collab-redrive-escalation-log.json`. At most one escalation per peer per `unreachableEscalationCooldownMs` (new config knob, default 24h). The log survives restart, so a server bounce does not re-flood.
|
|
12
|
+
|
|
13
|
+
## What to Tell Your User
|
|
14
|
+
|
|
15
|
+
- If you turned on collaboration-redrive and saw a flood of "can't reach X" attention items, that's fixed: at most one per peer per day, and a log file remembers across restarts so it doesn't reset.
|
|
16
|
+
- If I had open "I'm waiting on agent X" commitments where X was a raw fingerprint instead of a name, those will now resolve and nudge instead of skipping silently.
|
|
17
|
+
|
|
18
|
+
## Summary of New Capabilities
|
|
19
|
+
|
|
20
|
+
| Capability | How to Use |
|
|
21
|
+
|-----------|-----------|
|
|
22
|
+
| Fingerprint-hex as routing address | Automatic — no config required. Any `relatedAgent` matching `/^[0-9a-f]{32}$/i` is treated as a fingerprint. |
|
|
23
|
+
| Unreachable-escalation cooldown | Optional override: `monitoring.collaborationRedrive.unreachableEscalationCooldownMs` (default 86400000 ms = 24h) |
|
|
24
|
+
|
|
25
|
+
## Evidence
|
|
26
|
+
|
|
27
|
+
- Three new unit tests for the fingerprint case (`looksLikeFingerprint` accepts/rejects boundary cases; engine sends directly with empty `known-agents.json`).
|
|
28
|
+
- Three new unit tests for the cooldown (single escalation per peer; multiple same-peer commitments in one tick collapse to one; restart-survival via on-disk log).
|
|
29
|
+
- Combined Tier-1 test count: 19 → 27, all passing.
|
|
30
|
+
- Side-effects review: `upgrades/side-effects/collab-redrive-fp-as-relatedAgent-and-flood-fix.md`.
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# Side-Effects Review — CollaborationRedrive: fingerprint-as-relatedAgent + escalation-flood fix
|
|
2
|
+
|
|
3
|
+
**Context:** Dogfood-armed PR #490 on Echo's live node, 2026-05-28. Within minutes of the engine going `armed`, Justin caught a notification flood on his Telegram Attention queue (35+ items in <30 min, screenshot). Two distinct bugs.
|
|
4
|
+
|
|
5
|
+
## Bug 1 — fingerprint-as-relatedAgent
|
|
6
|
+
**Symptom.** ~10 of 15 active `threadline-reply` commitments on Echo store the peer's 32-character hex fingerprint directly in `relatedAgent` (when the commitment was opened from an inbound whose sender we only knew by fingerprint). The original `resolveFingerprint` always ran a name lookup against `known-agents.json` — a hex string is not a name → lookup misses → engine skips with `unresolved-name` → in the original code, escalates as "can't reach <fingerprint>".
|
|
7
|
+
|
|
8
|
+
**Fix.** Detect the fingerprint case structurally (`/^[0-9a-f]{32}$/i`) and use the value directly as the routing address; normalise to lowercase. Fall through to the name lookup only for non-fingerprint strings.
|
|
9
|
+
|
|
10
|
+
**Tests added.** `looksLikeFingerprint` accepts lowercase/uppercase 32-hex, rejects non-hex and wrong-length strings; a commitment with a fingerprint `relatedAgent` resolves directly with an empty `known-agents.json` and the engine sends.
|
|
11
|
+
|
|
12
|
+
## Bug 2 — escalation flood
|
|
13
|
+
**Symptom.** The original `unresolved-name` path used an in-memory strike counter that escalated to the Attention queue after 3 strikes per peer AND reset the counter to 0 — so the next sweep started accumulating strikes again, and the queue received a new `can't reach <peer>` item every few sweeps for every unresolvable peer. Verified live: 35 stacked items in ~30 min covering `dawn`, `ai-guy`, `codey`, `instar-codey`, `8c7928aa…`.
|
|
14
|
+
|
|
15
|
+
**Fix.** Replace the strike counter with a **durable per-peer cooldown**: a peer's `lastEscalatedAt` ISO is persisted to `<knownAgentsDir>/collab-redrive-escalation-log.json`; the engine escalates only if `(now - lastEscalatedAt) >= unreachableEscalationCooldownMs` (default 24h). New config knob `unreachableEscalationCooldownMs`. Within a single tick, multiple commitments to the same unresolvable peer collapse to exactly one escalation. The log survives restart so a server bounce does not re-flood.
|
|
16
|
+
|
|
17
|
+
**Tests added.** First sweep escalates once; sweeps within 12h produce zero new escalations; sweep past 24h produces one renewed escalation. Five commitments to the same peer in one tick → exactly one escalation. A fresh engine instance reading the same log respects the cooldown (restart-survival).
|
|
18
|
+
|
|
19
|
+
## 1-7 Side-effects review
|
|
20
|
+
1. **Over/under-block** — Strictly less escalation than before. The cooldown can be lowered if rare repeats are wanted; the cap is a knob, not a hard rule.
|
|
21
|
+
2. **Level-of-abstraction** — Reuses the existing `raiseAttention` injected dep + a tiny on-disk JSON sibling to `known-agents.json`. No new transport.
|
|
22
|
+
3. **Signal vs Authority** — The cooldown is purely a *delivery throttle* on a signal; the underlying engine behaviour (skip-don't-increment on unresolved) is unchanged. The operator still receives the signal — just once per peer per day.
|
|
23
|
+
4. **Interactions** — Touches only the resolveFingerprint code path and the per-peer escalation path in `tick()`. No effect on the durable redrive cap, the per-peer 24h send cap, the engine-wide daily fuse, the per-tick fuse, or the completion gate.
|
|
24
|
+
5. **Rollback** — Both fixes are confined to `CollaborationRedriveEngine.ts`. Reverting restores the original behaviour with no data implications. The escalation log file is a stateless cache (deleting it just allows one more escalation per peer).
|
|
25
|
+
6. **Data integrity** — No commitment-record mutations beyond what shipped in #490. The new on-disk log is a write-only-rotate map of `{peerKey: iso}` — corrupt JSON parses to empty (fail-open into a renewed escalation, not a stuck silent state).
|
|
26
|
+
7. **Failure modes** — (a) Log file write fails → warn + continue without persisting (engine state degrades to in-memory, not to flood). (b) Clock skew makes `lastEscalatedAt` parse to NaN → cooldown treats as elapsed → re-escalates once (then records a sane timestamp). (c) Multi-machine scenario where two engines escalate the same peer near-simultaneously → at most one extra item due to write race; acceptable, the file is per-agent-home.
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
# Side-Effects Review — ContextWedge recovery: disk-backed topic resolution
|
|
2
|
+
|
|
3
|
+
**Version / slug:** `context-wedge-null-topic-recovery`
|
|
4
|
+
**Date:** `2026-05-28`
|
|
5
|
+
**Author:** `echo`
|
|
6
|
+
**Spec:** `docs/specs/context-wedge-sentinel.md` (Follow-up section)
|
|
7
|
+
**Second-pass reviewer:** `not required` (see §"Phase 5 trigger check")
|
|
8
|
+
|
|
9
|
+
## Summary of the change
|
|
10
|
+
|
|
11
|
+
The ContextWedgeSentinel (shipped v1.3.62, PR #485) auto-recovers a thinking-block-400
|
|
12
|
+
session wedge via a fresh respawn through `SessionRefresh`. In production it
|
|
13
|
+
DETECTED a wedge on the long-lived Codey collaboration session (Telegram topic
|
|
14
|
+
13435) but failed to recover it — escalating "respawn attempt did not clear it."
|
|
15
|
+
|
|
16
|
+
Root cause: `SessionRefresh` resolves a session's topic via
|
|
17
|
+
`TelegramAdapter.getTopicForSession`, which reads the **in-memory** `sessionToTopic`
|
|
18
|
+
map. Echo's server runs `--no-telegram`, so that map is only a boot-time snapshot
|
|
19
|
+
of the registry, while the lifeline keeps writing new topic↔session bindings to
|
|
20
|
+
`topic-session-registry.json` on disk. A session bound AFTER the server booted
|
|
21
|
+
resolves to `null` in-memory → `refreshSession` returned `not_telegram_bound` →
|
|
22
|
+
the dead session stayed dead.
|
|
23
|
+
|
|
24
|
+
This change adds a disk-backed fallback to the topic resolution used by recovery:
|
|
25
|
+
|
|
26
|
+
- `TelegramAdapter.resolveTopicForSessionFromDisk(sessionName)` — a fresh read of
|
|
27
|
+
the persisted registry returning the bound topic, or null. **Pure read** — does
|
|
28
|
+
not mutate the in-memory maps.
|
|
29
|
+
- `SessionRefresh.refreshSession` — tries `getTopicForSession` (in-memory) first;
|
|
30
|
+
on a `null`, falls back to `resolveTopicForSessionFromDisk` before bailing. An
|
|
31
|
+
in-memory hit short-circuits, so the disk read is a fallback, never a default.
|
|
32
|
+
Genuinely unbound sessions (no binding on disk either) still return
|
|
33
|
+
`not_telegram_bound` exactly as before.
|
|
34
|
+
|
|
35
|
+
**Files touched:**
|
|
36
|
+
- `src/messaging/TelegramAdapter.ts` (+38 lines: `resolveTopicForSessionFromDisk` + doc).
|
|
37
|
+
- `src/core/SessionRefresh.ts` (in-memory→disk resolution; updated header + failure message).
|
|
38
|
+
- `tests/unit/SessionRefresh.test.ts` (+3 cases + a `diskTopicId` mock override).
|
|
39
|
+
- `tests/unit/telegram-registry-log.test.ts` (+4 cases for the disk-read method).
|
|
40
|
+
- `tests/integration/session-refresh-disk-topic-fallback.test.ts` (new — REAL SessionRefresh × REAL TelegramAdapter).
|
|
41
|
+
- `tests/e2e/context-wedge-sentinel-lifecycle.test.ts` (fixed a pre-existing cleanup bug — see below).
|
|
42
|
+
- `docs/specs/context-wedge-sentinel.md` (Follow-up section).
|
|
43
|
+
|
|
44
|
+
## Decision-point inventory
|
|
45
|
+
|
|
46
|
+
- **Topic resolution (in-memory vs disk)** — *modify*. Was in-memory-only; is now
|
|
47
|
+
in-memory-then-disk-fallback. The selection is a pure presence check
|
|
48
|
+
(`inMemory ?? diskFallback ?? bail`), no judgment. Both branches are exercised
|
|
49
|
+
by tests; the in-memory branch is unchanged for the common case.
|
|
50
|
+
- **Disk read of the registry** — *read-only, additive*. Reads the existing
|
|
51
|
+
`topic-session-registry.json` that `TelegramAdapter.saveRegistry` already writes.
|
|
52
|
+
No new file, no new format, no write. Wrapped in try/catch → returns null on a
|
|
53
|
+
missing/corrupt file (test-covered) so it can never throw into recovery.
|
|
54
|
+
- **Respawn (kill + fresh spawn)** — *unchanged*. Already gated by `SessionRefresh`'s
|
|
55
|
+
rate guard + in-flight guard + the sentinel's confirm window + the `autoRecovery`
|
|
56
|
+
opt-in flag. This change only makes the topic *resolvable*; it does not loosen any
|
|
57
|
+
guard or change when a respawn fires.
|
|
58
|
+
|
|
59
|
+
## Blast radius
|
|
60
|
+
|
|
61
|
+
- **No new authority, no new gate, no new detector.** A topic-resolution fallback
|
|
62
|
+
behind an existing, already-guarded recovery primitive.
|
|
63
|
+
- **Hot paths unchanged.** `getTopicForSession` is untouched; its many callers
|
|
64
|
+
(live-tail, SessionReaper topic-binding) behave identically. Only `SessionRefresh`
|
|
65
|
+
consults the disk fallback, and only on an in-memory miss.
|
|
66
|
+
- **No agent-installed files changed** — no `.claude/settings.json` hooks, no
|
|
67
|
+
`.instar/config.json` defaults, no CLAUDE.md template, no hook scripts, no skills.
|
|
68
|
+
So **no PostUpdateMigrator entry is required**: the fix is pure `src/` logic that
|
|
69
|
+
reaches every agent through the normal dist update. (`autoRecovery` config already
|
|
70
|
+
exists from PR #485.)
|
|
71
|
+
- **Idempotent / side-effect-free fallback.** Pure read; safe to call repeatedly.
|
|
72
|
+
|
|
73
|
+
## Pre-existing-bug fix (bundled)
|
|
74
|
+
|
|
75
|
+
While running the e2e (`context-wedge-sentinel-lifecycle.test.ts`) the "live"
|
|
76
|
+
case failed at setup with `mkdtemp ENOENT`. The test's `cleanup()` did
|
|
77
|
+
`fs.rmSync(path.dirname(logsDir), …)` where `logsDir = path.join(stateDir, '..', 'logs')`
|
|
78
|
+
— so `path.dirname(logsDir)` resolved to `os.tmpdir()` ITSELF, and cleanup rm-rf'd
|
|
79
|
+
the shared tmpdir base, intermittently breaking the next test's `mkdtemp`. It only
|
|
80
|
+
"passed" before when the OS base happened to survive (permissions / timing). Fixed
|
|
81
|
+
by nesting logs INSIDE the per-test `stateDir` and cleaning up exactly `stateDir`.
|
|
82
|
+
Fixed here (not deferred) per the Zero-Failure Standard since it sits in the same
|
|
83
|
+
feature I'm shipping.
|
|
84
|
+
|
|
85
|
+
## Phase 5 trigger check (second-pass reviewer)
|
|
86
|
+
|
|
87
|
+
Second pass **not required**: no new authority, no destructive operation introduced
|
|
88
|
+
(the only rm-rf change *removes* an over-broad delete), no external surface, no
|
|
89
|
+
migration. The change is an additive, read-only fallback behind an existing
|
|
90
|
+
rate-guarded recovery primitive, with full three-tier test coverage (114 tests
|
|
91
|
+
green across the related files).
|
|
92
|
+
|
|
93
|
+
## Verification
|
|
94
|
+
|
|
95
|
+
- `tests/unit/SessionRefresh.test.ts` — 20 pass (incl. 3 new disk-fallback cases).
|
|
96
|
+
- `tests/unit/telegram-registry-log.test.ts` — 20 pass (incl. 4 new disk-read cases).
|
|
97
|
+
- `tests/integration/session-refresh-disk-topic-fallback.test.ts` — 2 pass
|
|
98
|
+
(disk-only binding recovers; truly-unbound still bails).
|
|
99
|
+
- `tests/e2e/context-wedge-sentinel-lifecycle.test.ts` — 7 pass (flake fixed).
|
|
100
|
+
- Full related set: 114 pass across 8 files.
|