instar 1.3.710 → 1.3.712

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 (72) hide show
  1. package/dist/commands/server.d.ts.map +1 -1
  2. package/dist/commands/server.js +228 -1
  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 +25 -0
  6. package/dist/config/ConfigDefaults.js.map +1 -1
  7. package/dist/core/HttpLeaseTransport.d.ts +9 -0
  8. package/dist/core/HttpLeaseTransport.d.ts.map +1 -1
  9. package/dist/core/HttpLeaseTransport.js +28 -2
  10. package/dist/core/HttpLeaseTransport.js.map +1 -1
  11. package/dist/core/MessagingToneGate.d.ts.map +1 -1
  12. package/dist/core/MessagingToneGate.js +3 -2
  13. package/dist/core/MessagingToneGate.js.map +1 -1
  14. package/dist/core/MultiMachineCoordinator.d.ts +44 -0
  15. package/dist/core/MultiMachineCoordinator.d.ts.map +1 -1
  16. package/dist/core/MultiMachineCoordinator.js +52 -0
  17. package/dist/core/MultiMachineCoordinator.js.map +1 -1
  18. package/dist/core/PeerEndpointResolver.d.ts +0 -0
  19. package/dist/core/PeerEndpointResolver.d.ts.map +1 -1
  20. package/dist/core/PeerEndpointResolver.js +0 -0
  21. package/dist/core/PeerEndpointResolver.js.map +1 -1
  22. package/dist/core/PostUpdateMigrator.d.ts.map +1 -1
  23. package/dist/core/PostUpdateMigrator.js +19 -0
  24. package/dist/core/PostUpdateMigrator.js.map +1 -1
  25. package/dist/core/RopeRecoveryProber.d.ts +126 -0
  26. package/dist/core/RopeRecoveryProber.d.ts.map +1 -0
  27. package/dist/core/RopeRecoveryProber.js +266 -0
  28. package/dist/core/RopeRecoveryProber.js.map +1 -0
  29. package/dist/core/devGatedFeatures.d.ts.map +1 -1
  30. package/dist/core/devGatedFeatures.js +12 -0
  31. package/dist/core/devGatedFeatures.js.map +1 -1
  32. package/dist/core/ropeProbeContract.d.ts +56 -0
  33. package/dist/core/ropeProbeContract.d.ts.map +1 -0
  34. package/dist/core/ropeProbeContract.js +92 -0
  35. package/dist/core/ropeProbeContract.js.map +1 -0
  36. package/dist/core/tailscaleStatusParser.d.ts +46 -0
  37. package/dist/core/tailscaleStatusParser.d.ts.map +1 -0
  38. package/dist/core/tailscaleStatusParser.js +80 -0
  39. package/dist/core/tailscaleStatusParser.js.map +1 -0
  40. package/dist/core/types.d.ts +56 -0
  41. package/dist/core/types.d.ts.map +1 -1
  42. package/dist/core/types.js.map +1 -1
  43. package/dist/monitoring/RopeHealthMonitor.d.ts +243 -0
  44. package/dist/monitoring/RopeHealthMonitor.d.ts.map +1 -0
  45. package/dist/monitoring/RopeHealthMonitor.js +659 -0
  46. package/dist/monitoring/RopeHealthMonitor.js.map +1 -0
  47. package/dist/monitoring/guardManifest.d.ts.map +1 -1
  48. package/dist/monitoring/guardManifest.js +45 -0
  49. package/dist/monitoring/guardManifest.js.map +1 -1
  50. package/dist/scaffold/templates.d.ts.map +1 -1
  51. package/dist/scaffold/templates.js +9 -0
  52. package/dist/scaffold/templates.js.map +1 -1
  53. package/dist/server/AgentServer.d.ts +2 -0
  54. package/dist/server/AgentServer.d.ts.map +1 -1
  55. package/dist/server/AgentServer.js +1 -0
  56. package/dist/server/AgentServer.js.map +1 -1
  57. package/dist/server/CapabilityIndex.js +1 -1
  58. package/dist/server/CapabilityIndex.js.map +1 -1
  59. package/dist/server/routes.d.ts +3 -0
  60. package/dist/server/routes.d.ts.map +1 -1
  61. package/dist/server/routes.js +19 -0
  62. package/dist/server/routes.js.map +1 -1
  63. package/package.json +1 -1
  64. package/scripts/lint-scrape-fixture-realness.js +20 -0
  65. package/src/data/builtin-manifest.json +65 -65
  66. package/src/data/state-coherence-registry.json +17 -0
  67. package/src/scaffold/templates/jobs/instar/rope-health-digest.md +42 -0
  68. package/src/scaffold/templates.ts +9 -0
  69. package/upgrades/1.3.711.md +79 -0
  70. package/upgrades/1.3.712.md +41 -0
  71. package/upgrades/side-effects/tone-gate-rule-id-contract.md +78 -0
  72. package/upgrades/side-effects/u4-rope-probe-alerts.md +140 -0
@@ -0,0 +1,243 @@
1
+ /**
2
+ * RopeHealthMonitor — U4.5 rope-health alerts
3
+ * (docs/specs/u4-5-rope-health-alerts.md).
4
+ *
5
+ * Mesh transport degradation was silent: a Tailscale key expiry dropped a rope
6
+ * with no warning; a persistently-down rope was visible only to someone who
7
+ * went looking; an all-transports-down partition — the precondition for silent
8
+ * message loss — had no prompt alert at all. This monitor is the productized,
9
+ * in-server detector: it runs its OWN bounded 30s evaluation loop (constructed
10
+ * and torn down by the real server boot — R-r2-2), reads the U4.3
11
+ * `PeerEndpointResolver.snapshot()` seam (the HARD data dependency; no interim
12
+ * fallback exists), and classifies each peer deterministically:
13
+ *
14
+ * ok — silence (no digest line, nothing).
15
+ * degraded — a rope down while ≥1 other rope is healthy, or a Tailscale
16
+ * key expiring within `keyExpiryWarnDays`. Digest-only.
17
+ * peer-offline — ALL ropes down AND the peer's git-synced coarse heartbeat
18
+ * has STOPPED advancing (or the registry already marks it
19
+ * offline). Digest-only — a lid-close is NEVER urgent.
20
+ * urgent — ALL ropes down to a peer whose git-synced coarse heartbeat
21
+ * is still ADVANCING — advancement-since-onset semantics
22
+ * (R-r3-1): a beat NEWER than the all-down onset, observed
23
+ * after the onset. Freshness-window semantics are REJECTED
24
+ * (a just-lid-closed peer's last beat looks fresh for up to
25
+ * an hour). ONE HIGH attention item per episode.
26
+ *
27
+ * The urgent tier's honest detection latency is bounded by the heartbeat
28
+ * interval plus up to two git-sync cadences (~30-90 min); `urgentDebounceMs`
29
+ * is only the short-term flap filter on the all-down condition itself.
30
+ *
31
+ * Episode semantics: episodeKey = sorted machine pair + the onset quantized to
32
+ * 15 min — deterministically computable on BOTH sides without coordination;
33
+ * post-heal grouping matches ADJACENT quantization windows (R-r2-5). An episode
34
+ * ends only after `clearSustainMs` of continuous health (a blip cannot
35
+ * clear-then-re-fire). At most ONE item per side per episode; if a split-brain
36
+ * item is already open for the same peer, the monitor does not raise a second.
37
+ *
38
+ * Durable state (`state/rope-health.json`): transition-only writes with a short
39
+ * debounce (R-r2-4) — a steady-state evaluation never touches disk; counters
40
+ * lost to a restart are accepted (the safe direction: a restart re-debounces,
41
+ * never fabricates an episode).
42
+ *
43
+ * Content scrub (hard rule): alert/digest text carries rope KIND + machine
44
+ * NICKNAME + relative times ONLY — never raw IPs, URLs, tunnel hostnames,
45
+ * tailnet names, or account emails (the tailscale JSON's identifying fields
46
+ * never leave `parseTailscaleStatus`).
47
+ */
48
+ import type { RopeHealthSnapshotRow } from '../core/PeerEndpointResolver.js';
49
+ export type RopeHealthCondition = 'ok' | 'degraded' | 'peer-offline' | 'urgent' | 'unknown';
50
+ export interface RopeHealthPeerInfo {
51
+ machineId: string;
52
+ /** User-facing handle — the ONLY peer identity that reaches alert/digest text. */
53
+ nickname: string;
54
+ /** Registry online flag (staleness-derived; WS4.2 offline-since semantics). */
55
+ registryOnline: boolean;
56
+ }
57
+ export type RopeHealthMetricEvent = 'evaluation' | 'transition-ok' | 'transition-degraded' | 'transition-peer-offline' | 'transition-urgent' | 'urgent-episode' | 'suppressed-by-sleep-gate' | 'suppressed-by-split-brain' | 'detected-not-notified-retry' | 'key-expiry-warning' | 'digest-emission';
58
+ export interface RopeHealthMonitorDeps {
59
+ /** U4.3 read seam — the REAL resolver snapshot, never a copy. */
60
+ snapshot: () => RopeHealthSnapshotRow[];
61
+ /** This machine's stable id (episodeKey pair member). */
62
+ selfMachineId: string;
63
+ /** Known peers (excluding self) with nicknames + registry online flags. */
64
+ listPeers: () => RopeHealthPeerInfo[];
65
+ /**
66
+ * The mesh-INDEPENDENT liveness discriminator (R-r2-1): epoch-ms of the
67
+ * peer's last git-synced coarse heartbeat, or null when none/malformed.
68
+ */
69
+ readHeartbeatAtMs: (machineId: string) => number | null;
70
+ /** HIGH attention sink. May return a promise; a rejection = not-notified. */
71
+ raiseAttention: (item: {
72
+ id: string;
73
+ title: string;
74
+ body: string;
75
+ }) => unknown;
76
+ /** Episode-registry check: a split-brain item already open for this peer wins. */
77
+ splitBrainItemOpen?: (peerMachineId: string) => boolean;
78
+ /**
79
+ * Bounded exec seam for `tailscale status --json` (R-r2-3). Resolves to the
80
+ * raw stdout, or null when the CLI is absent/timed out (the expiry tier is
81
+ * then silently absent). Default impl provided; tests inject.
82
+ */
83
+ execTailscaleStatusJson?: () => Promise<string | null>;
84
+ /** Durable state file (state/rope-health.json). */
85
+ stateFilePath: string;
86
+ recordMetric?: (event: RopeHealthMetricEvent) => void;
87
+ now?: () => number;
88
+ logger?: (msg: string) => void;
89
+ }
90
+ export interface RopeHealthMonitorConfig {
91
+ /** The urgent tier master (rides the same dev gate; spec §5). Default true. */
92
+ urgentEnabled: boolean;
93
+ /** Time-pinned short-term flap filter on the all-down condition (R-r2-2). Default 60000. */
94
+ urgentDebounceMs: number;
95
+ /** Continuous health required before an episode ends. Default 600000. */
96
+ clearSustainMs: number;
97
+ /** Tailscale key expiry warning horizon. Default 14. */
98
+ keyExpiryWarnDays: number;
99
+ /** The monitor's OWN evaluation loop cadence. Default 30000. */
100
+ evaluateIntervalMs: number;
101
+ /** Key-expiry exec cadence. Default 3600000 (hourly). */
102
+ keyExpiryCheckIntervalMs: number;
103
+ /**
104
+ * HARD CAP on how long a self-wake grace window may suppress the urgent tier.
105
+ *
106
+ * HAZARD (docs/audits/multi-machine-seamless-ux-audit-2026-07.md finding
107
+ * P1-A7): SleepWakeDetector is known to emit FALSE wake events on this class
108
+ * of machine — event-loop stalls misread as sleeps (26 spurious "wake after
109
+ * ~12-24s sleep" events in one night while caffeinate held a
110
+ * PreventSystemSleep assertion). A false "recently slept" signal must never
111
+ * suppress a genuine partition alert for long, so the grace window is
112
+ * BOUNDED: suppression ends as soon as every (peer, kind) has been
113
+ * re-observed post-wake OR this cap elapses — whichever comes first. It is a
114
+ * short post-wake grace, never an open-ended veto. Default 300000 (5 min).
115
+ */
116
+ wakeGraceMaxMs: number;
117
+ /** Episode-key onset quantization. Default 900000 (15 min). */
118
+ episodeQuantumMs: number;
119
+ /** State-write debounce for transition bursts (R-r2-4). Default 2000. */
120
+ writeDebounceMs: number;
121
+ }
122
+ export declare const ROPE_HEALTH_DEFAULTS: RopeHealthMonitorConfig;
123
+ /**
124
+ * Deterministic shared episode key: both sides compute the same value from the
125
+ * sorted machine pair + the onset's quantization window (spec §2).
126
+ */
127
+ export declare function computeEpisodeKey(machineA: string, machineB: string, onsetMs: number, quantumMs?: number): string;
128
+ /**
129
+ * Post-heal grouping (R-r2-5): two episode keys group when they name the same
130
+ * machine pair and their quantization windows are ADJACENT (±1 quantum) — the
131
+ * two sides detect at different instants, so an onset straddling a boundary
132
+ * yields adjacent window keys. Beyond one quantum the keys honestly show as
133
+ * two groups (declared best-effort display degradation).
134
+ */
135
+ export declare function episodeKeysGroup(a: string, b: string, quantumMs?: number): boolean;
136
+ /** One row of GET /mesh/rope-health (content-scrubbed: kind + nickname only). */
137
+ export interface RopeHealthPeerView {
138
+ machineId: string;
139
+ nickname: string;
140
+ condition: RopeHealthCondition;
141
+ kinds: Array<{
142
+ kind: string;
143
+ dead: boolean;
144
+ consecutiveFailures: number;
145
+ }>;
146
+ allDownSince: number | null;
147
+ episodeKey: string | null;
148
+ urgentRaisedAt: number | null;
149
+ detectedNotNotified: boolean;
150
+ }
151
+ export interface RopeHealthStatus {
152
+ lastEvaluatedAt: number | null;
153
+ evaluations: number;
154
+ peers: RopeHealthPeerView[];
155
+ keyExpiry: {
156
+ /** false ⇒ CLI absent / never checked / unparseable — tier silently absent. */
157
+ available: boolean;
158
+ soonest?: {
159
+ role: 'self' | 'peer';
160
+ expiresAtIso: string;
161
+ inDays: number;
162
+ };
163
+ warn?: boolean;
164
+ lastCheckedAt?: number | null;
165
+ };
166
+ /** ≤3-sentence consolidated digest section, or null when everything is ok. */
167
+ digest: string | null;
168
+ counters: {
169
+ urgentEpisodes: number;
170
+ suppressedBySleepGate: number;
171
+ suppressedBySplitBrain: number;
172
+ notNotifiedRetries: number;
173
+ };
174
+ }
175
+ /** Default bounded exec: 5s hard timeout; absent CLI / any failure ⇒ null. */
176
+ export declare function defaultExecTailscaleStatusJson(): Promise<string | null>;
177
+ export declare class RopeHealthMonitor {
178
+ private readonly d;
179
+ private readonly cfg;
180
+ private readonly peers;
181
+ private timer;
182
+ private lastEvaluatedAt;
183
+ private evaluations;
184
+ private evaluating;
185
+ private ownWakeAt;
186
+ private keyExpiryLastCheckedAt;
187
+ private keyExpiryAvailable;
188
+ private keyExpirySoonest;
189
+ private keyExpiryAbsentLogged;
190
+ private keyExpiryInFlight;
191
+ private urgentEpisodes;
192
+ private suppressedBySleepGate;
193
+ private suppressedBySplitBrain;
194
+ private notNotifiedRetries;
195
+ private writePending;
196
+ private writeTimer;
197
+ constructor(deps: RopeHealthMonitorDeps, cfg?: Partial<RopeHealthMonitorConfig>);
198
+ private now;
199
+ private log;
200
+ private metric;
201
+ /** Start the monitor's OWN bounded evaluation loop (R-r2-2). */
202
+ start(): void;
203
+ /** Torn down at server shutdown (R-r2-2). Flushes any pending state write. */
204
+ stop(): void;
205
+ /** Is the evaluation loop currently armed? (e2e wiring-integrity read.) */
206
+ running(): boolean;
207
+ /**
208
+ * Own-machine wake note (SleepWakeDetector 'wake' — the ONE thing it can
209
+ * tell us). Post-wake, all snapshots are stale; urgent is suppressed until
210
+ * each (peer, kind) is re-observed post-wake — BOUNDED by wakeGraceMaxMs
211
+ * (P1-A7: false wake events must never become an open-ended veto).
212
+ */
213
+ noteOwnWake(atMs?: number): void;
214
+ /** One evaluation pass. Public for tests; the loop calls it on cadence. */
215
+ evaluate(): void;
216
+ private evaluateInner;
217
+ private settleHealthy;
218
+ private sleepGateSuppresses;
219
+ private raiseUrgent;
220
+ private settleNotified;
221
+ private markNotNotified;
222
+ private checkKeyExpiry;
223
+ private keyExpiryWarn;
224
+ /** The GET /mesh/rope-health read surface (content-scrubbed). */
225
+ status(): RopeHealthStatus;
226
+ /**
227
+ * The consolidated daily-digest section (≤3 sentences, clamped,
228
+ * machine-named), or null when everything is ok — the rope-health-digest
229
+ * job's content source. Deterministic; content-scrubbed by construction.
230
+ */
231
+ composeDigest(): string | null;
232
+ /** Record a digest emission (the digest job calls the route with ?digest=1). */
233
+ recordDigestEmission(): void;
234
+ private safeSnapshot;
235
+ private safePeers;
236
+ private safeHeartbeat;
237
+ private safeSplitBrainOpen;
238
+ private recordTransition;
239
+ private scheduleWrite;
240
+ private writeStateNow;
241
+ private loadState;
242
+ }
243
+ //# sourceMappingURL=RopeHealthMonitor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RopeHealthMonitor.d.ts","sourceRoot":"","sources":["../../src/monitoring/RopeHealthMonitor.ts"],"names":[],"mappings":"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"}