instar 1.3.32 → 1.3.33

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 (36) hide show
  1. package/dist/commands/server.d.ts.map +1 -1
  2. package/dist/commands/server.js +47 -1
  3. package/dist/commands/server.js.map +1 -1
  4. package/dist/core/types.d.ts +16 -0
  5. package/dist/core/types.d.ts.map +1 -1
  6. package/dist/core/types.js.map +1 -1
  7. package/dist/feedback-factory/dryrun/dryRunCompare.d.ts +82 -0
  8. package/dist/feedback-factory/dryrun/dryRunCompare.d.ts.map +1 -0
  9. package/dist/feedback-factory/dryrun/dryRunCompare.js +88 -0
  10. package/dist/feedback-factory/dryrun/dryRunCompare.js.map +1 -0
  11. package/dist/feedback-factory/processor/parity.d.ts +111 -0
  12. package/dist/feedback-factory/processor/parity.d.ts.map +1 -0
  13. package/dist/feedback-factory/processor/parity.js +118 -0
  14. package/dist/feedback-factory/processor/parity.js.map +1 -0
  15. package/dist/feedback-factory/store/ReadOnlyShadowStore.d.ts +59 -0
  16. package/dist/feedback-factory/store/ReadOnlyShadowStore.d.ts.map +1 -0
  17. package/dist/feedback-factory/store/ReadOnlyShadowStore.js +88 -0
  18. package/dist/feedback-factory/store/ReadOnlyShadowStore.js.map +1 -0
  19. package/dist/monitoring/StopNotifier.d.ts +88 -0
  20. package/dist/monitoring/StopNotifier.d.ts.map +1 -0
  21. package/dist/monitoring/StopNotifier.js +105 -0
  22. package/dist/monitoring/StopNotifier.js.map +1 -0
  23. package/dist/server/AgentServer.d.ts +2 -0
  24. package/dist/server/AgentServer.d.ts.map +1 -1
  25. package/dist/server/AgentServer.js +1 -0
  26. package/dist/server/AgentServer.js.map +1 -1
  27. package/dist/server/routes.d.ts +4 -0
  28. package/dist/server/routes.d.ts.map +1 -1
  29. package/dist/server/routes.js +13 -0
  30. package/dist/server/routes.js.map +1 -1
  31. package/package.json +1 -1
  32. package/src/data/builtin-manifest.json +47 -47
  33. package/upgrades/1.3.31.md +9 -10
  34. package/upgrades/1.3.33.md +36 -0
  35. package/upgrades/side-effects/feedback-factory-dryrun.md +93 -0
  36. package/upgrades/side-effects/notify-on-stop-layer-b.md +34 -0
@@ -0,0 +1,118 @@
1
+ /**
2
+ * parity.ts — the Phase-3 live-mirror invariant comparator.
3
+ *
4
+ * docs/specs/feedback-factory-migration.md §2.3/§2.5: the live dual-forward gate
5
+ * compares ONLY order-independent invariants between Portal's processor and the
6
+ * ported Instar processor — because clustering is order-dependent (a report merges
7
+ * into whichever similar cluster already exists) and the two instances will NOT see
8
+ * reports in identical order/timing, a raw cluster-membership diff would fail on
9
+ * benign ordering noise and pressure us to weaken the gate. The spec pins three
10
+ * invariants:
11
+ *
12
+ * 1. FINGERPRINT (per cluster) — `computeFingerprint(cluster.type, cluster.title)`,
13
+ * exactly as the reference's cmd_backfill_fingerprints
14
+ * (:256) derives it. Recomputing it over Portal's
15
+ * LIVE clusters and diffing against the stored
16
+ * fingerprint is a pure cross-implementation
17
+ * equivalence check — fully order-independent and
18
+ * needs no replay. It is the highest-signal gate:
19
+ * it catches the byte-level Python↔JS divergence
20
+ * (Unicode regex classes, SHA encoding, tokenizer/
21
+ * case-fold) on REAL production titles the
22
+ * recorded adversarial corpus may not cover.
23
+ * 2. terminal STATUS per group — keyed by fingerprint (the stable cluster key),
24
+ * NOT raw clusterId (slug IDs differ across
25
+ * instances). Requires Instar's recomputed outcomes.
26
+ * 3. RECURRENCE/cycling count — keyed by fingerprint; chronic-regression
27
+ * accounting that should converge on the same set.
28
+ *
29
+ * This module is PURE. Invariant 1 needs only Portal's stored clusters (read-only).
30
+ * Invariants 2 & 3 compare two pre-computed outcome lists; the runner
31
+ * (dryrun/dryRunCompare.ts) supplies Instar's side from a throwaway replay — never
32
+ * against Portal's DB (see ReadOnlyShadowStore). `divergent === true` is the
33
+ * structural signal that BLOCKS Phase 4 cutover (spec §2.5 Phase 4/5).
34
+ */
35
+ import { computeFingerprint } from './fingerprint.js';
36
+ /** The canonical fingerprint for a cluster: exactly the reference's per-cluster derivation. */
37
+ export function clusterFingerprint(cluster) {
38
+ return computeFingerprint(cluster.type, cluster.title);
39
+ }
40
+ /**
41
+ * Invariant 1 (fingerprint) — pure, fully order-independent, no replay. Recomputes
42
+ * each Portal cluster's fingerprint via the ported `computeFingerprint` and diffs
43
+ * against the fingerprint Portal stored. Any mismatch is a REAL divergence (the
44
+ * ported fingerprint logic differs from the Python reference on a real title) —
45
+ * never benign ordering noise. This is the live extension of the recorded-corpus
46
+ * fingerprint-parity harness.
47
+ *
48
+ * Clusters with no stored fingerprint (e.g. created before a backfill) are skipped
49
+ * — there is nothing to compare against, and flagging them would be a false positive.
50
+ */
51
+ export function compareClusterFingerprints(portalClusters) {
52
+ const out = [];
53
+ for (const c of portalClusters) {
54
+ if (!c.fingerprint)
55
+ continue;
56
+ const instar = clusterFingerprint(c);
57
+ if (instar !== c.fingerprint) {
58
+ out.push({ clusterId: c.clusterId, instar, portal: c.fingerprint });
59
+ }
60
+ }
61
+ return out;
62
+ }
63
+ /**
64
+ * Invariants 2 & 3 (terminal status + recurrence) — keyed by fingerprint, NOT raw
65
+ * clusterId. Compares Instar's recomputed cluster outcomes against Portal's actuals.
66
+ * A fingerprint present on one side but not the other is itself a divergence (the
67
+ * two instances grouped reports differently in a way that matters).
68
+ */
69
+ export function compareClusterOutcomes(instar, portal) {
70
+ const out = [];
71
+ const instarByFp = new Map(instar.map((c) => [c.fingerprint, c]));
72
+ const portalByFp = new Map(portal.map((c) => [c.fingerprint, c]));
73
+ for (const [fp, p] of portalByFp) {
74
+ const i = instarByFp.get(fp);
75
+ if (!i) {
76
+ out.push({ fingerprint: fp, kind: 'missing-instar', portal: p.status });
77
+ continue;
78
+ }
79
+ if (i.status !== p.status) {
80
+ out.push({ fingerprint: fp, kind: 'status', instar: i.status, portal: p.status });
81
+ }
82
+ if (i.recurrenceCount !== p.recurrenceCount) {
83
+ out.push({
84
+ fingerprint: fp,
85
+ kind: 'recurrence',
86
+ instar: i.recurrenceCount,
87
+ portal: p.recurrenceCount,
88
+ });
89
+ }
90
+ }
91
+ for (const [fp, i] of instarByFp) {
92
+ if (!portalByFp.has(fp)) {
93
+ out.push({ fingerprint: fp, kind: 'missing-portal', instar: i.status });
94
+ }
95
+ }
96
+ return out;
97
+ }
98
+ /**
99
+ * Full comparison over all three invariants → the cutover-gating verdict.
100
+ * `instarOutcomes`/`portalOutcomes` are optional: the fingerprint invariant (1) is
101
+ * always run over Portal's clusters; the outcome invariants (2 & 3) run only when
102
+ * both outcome lists are supplied (they require Instar's throwaway replay, which
103
+ * is order-dependent — see dryRunCompare).
104
+ */
105
+ export function compareInvariants(args) {
106
+ const fingerprintDivergences = compareClusterFingerprints(args.portalClusters);
107
+ const outcomeDivergences = args.instarOutcomes && args.portalOutcomes
108
+ ? compareClusterOutcomes(args.instarOutcomes, args.portalOutcomes)
109
+ : [];
110
+ return {
111
+ clustersCompared: args.portalClusters.length,
112
+ outcomesCompared: args.portalOutcomes?.length ?? 0,
113
+ fingerprintDivergences,
114
+ outcomeDivergences,
115
+ divergent: fingerprintDivergences.length > 0 || outcomeDivergences.length > 0,
116
+ };
117
+ }
118
+ //# sourceMappingURL=parity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parity.js","sourceRoot":"","sources":["../../../src/feedback-factory/processor/parity.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,59 @@
1
+ /**
2
+ * ReadOnlyShadowStore.ts — the dry-run write-guard for the feedback factory.
3
+ *
4
+ * Phase 1/3 of the migration (docs/specs/feedback-factory-migration.md §2.5) runs
5
+ * the ported Instar processor against Portal's LIVE canonical DB to compare its
6
+ * decisions against Portal's — but **Portal must remain the sole writer** (the
7
+ * one-shared-DB precondition prevents split-brain; two writers would corrupt the
8
+ * curated bug history). This wrapper enforces that structurally rather than by
9
+ * convention: every READ delegates to the wrapped store (Portal's read-only
10
+ * Postgres adapter in production, an InMemoryFeedbackStore in tests); every WRITE
11
+ * throws {@link ShadowStoreWriteError}.
12
+ *
13
+ * Why a guard and not just "don't call the writers": defense in depth. If any code
14
+ * path (e.g. an accidental `processUnprocessed(shadowStore, ...)` — which writes)
15
+ * runs against this store, the FIRST write attempt throws loudly at the seam
16
+ * instead of silently mutating Portal's data. The dry-run runner (dryRunCompare)
17
+ * never writes — it uses the pure comparator — but the guard means a future
18
+ * mis-wire can't quietly fork history. This is the "writes throw as a guard"
19
+ * contract confirmed with Dawn (the domain owner) on 2026-05-27.
20
+ *
21
+ * Structure > Willpower: the read-only guarantee lives in the type, not a comment.
22
+ */
23
+ import type { FeedbackStore, FeedbackMetrics } from './FeedbackStore.js';
24
+ import type { FeedbackItem, Cluster } from '../processor/types.js';
25
+ import type { ReopenDecision } from '../processor/reopen.js';
26
+ import type { DispatchRecord } from '../dispatch/dispatch.js';
27
+ /** Thrown when any mutating FeedbackStore method is called on a ReadOnlyShadowStore. */
28
+ export declare class ShadowStoreWriteError extends Error {
29
+ /** The mutating method that was (illegally) attempted. */
30
+ readonly method: string;
31
+ constructor(method: string);
32
+ }
33
+ /**
34
+ * Wraps a {@link FeedbackStore} so it is read-only: reads delegate, writes throw.
35
+ * The delegate supplies the reads — in production that's the Prisma read-only
36
+ * adapter over Portal's Postgres (credentials-gated, see dryRunCompare.ts); in
37
+ * tests it's an InMemoryFeedbackStore seeded with a corpus.
38
+ */
39
+ export declare class ReadOnlyShadowStore implements FeedbackStore {
40
+ private readonly read;
41
+ constructor(read: FeedbackStore);
42
+ getUnprocessedFeedback(): FeedbackItem[];
43
+ getActiveClusters(): Cluster[];
44
+ getCluster(clusterId: string): Cluster | undefined;
45
+ hasFeedback(feedbackId: string): boolean;
46
+ listDispatches(filter?: {
47
+ since?: string;
48
+ type?: string;
49
+ }): DispatchRecord[];
50
+ findDispatchByTitle(title: string): DispatchRecord | undefined;
51
+ metrics(): FeedbackMetrics;
52
+ upsertClusterFromItem(_clusterId: string, _item: FeedbackItem): void;
53
+ mergeIntoCluster(_clusterId: string, _item: FeedbackItem): void;
54
+ applyReopen(_clusterId: string, _decision: ReopenDecision): void;
55
+ markProcessed(_feedbackId: string, _clusterId: string): void;
56
+ addFeedback(_item: FeedbackItem): void;
57
+ createDispatch(_record: DispatchRecord): void;
58
+ }
59
+ //# sourceMappingURL=ReadOnlyShadowStore.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ReadOnlyShadowStore.d.ts","sourceRoot":"","sources":["../../../src/feedback-factory/store/ReadOnlyShadowStore.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACzE,OAAO,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AACnE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAE9D,wFAAwF;AACxF,qBAAa,qBAAsB,SAAQ,KAAK;IAC9C,0DAA0D;IAC1D,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;gBACZ,MAAM,EAAE,MAAM;CAS3B;AAED;;;;;GAKG;AACH,qBAAa,mBAAoB,YAAW,aAAa;IAC3C,OAAO,CAAC,QAAQ,CAAC,IAAI;gBAAJ,IAAI,EAAE,aAAa;IAGhD,sBAAsB,IAAI,YAAY,EAAE;IAGxC,iBAAiB,IAAI,OAAO,EAAE;IAG9B,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS;IAGlD,WAAW,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO;IAGxC,cAAc,CAAC,MAAM,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,cAAc,EAAE;IAG5E,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS;IAG9D,OAAO,IAAI,eAAe;IAK1B,qBAAqB,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,GAAG,IAAI;IAGpE,gBAAgB,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,GAAG,IAAI;IAG/D,WAAW,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,cAAc,GAAG,IAAI;IAGhE,aAAa,CAAC,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI;IAG5D,WAAW,CAAC,KAAK,EAAE,YAAY,GAAG,IAAI;IAGtC,cAAc,CAAC,OAAO,EAAE,cAAc,GAAG,IAAI;CAG9C"}
@@ -0,0 +1,88 @@
1
+ /**
2
+ * ReadOnlyShadowStore.ts — the dry-run write-guard for the feedback factory.
3
+ *
4
+ * Phase 1/3 of the migration (docs/specs/feedback-factory-migration.md §2.5) runs
5
+ * the ported Instar processor against Portal's LIVE canonical DB to compare its
6
+ * decisions against Portal's — but **Portal must remain the sole writer** (the
7
+ * one-shared-DB precondition prevents split-brain; two writers would corrupt the
8
+ * curated bug history). This wrapper enforces that structurally rather than by
9
+ * convention: every READ delegates to the wrapped store (Portal's read-only
10
+ * Postgres adapter in production, an InMemoryFeedbackStore in tests); every WRITE
11
+ * throws {@link ShadowStoreWriteError}.
12
+ *
13
+ * Why a guard and not just "don't call the writers": defense in depth. If any code
14
+ * path (e.g. an accidental `processUnprocessed(shadowStore, ...)` — which writes)
15
+ * runs against this store, the FIRST write attempt throws loudly at the seam
16
+ * instead of silently mutating Portal's data. The dry-run runner (dryRunCompare)
17
+ * never writes — it uses the pure comparator — but the guard means a future
18
+ * mis-wire can't quietly fork history. This is the "writes throw as a guard"
19
+ * contract confirmed with Dawn (the domain owner) on 2026-05-27.
20
+ *
21
+ * Structure > Willpower: the read-only guarantee lives in the type, not a comment.
22
+ */
23
+ /** Thrown when any mutating FeedbackStore method is called on a ReadOnlyShadowStore. */
24
+ export class ShadowStoreWriteError extends Error {
25
+ /** The mutating method that was (illegally) attempted. */
26
+ method;
27
+ constructor(method) {
28
+ super(`ReadOnlyShadowStore: write method '${method}' is forbidden — the dry-run ` +
29
+ `processor must never mutate the canonical feedback DB (Portal is sole ` +
30
+ `writer through cutover; see feedback-factory-migration.md §2.5).`);
31
+ this.name = 'ShadowStoreWriteError';
32
+ this.method = method;
33
+ }
34
+ }
35
+ /**
36
+ * Wraps a {@link FeedbackStore} so it is read-only: reads delegate, writes throw.
37
+ * The delegate supplies the reads — in production that's the Prisma read-only
38
+ * adapter over Portal's Postgres (credentials-gated, see dryRunCompare.ts); in
39
+ * tests it's an InMemoryFeedbackStore seeded with a corpus.
40
+ */
41
+ export class ReadOnlyShadowStore {
42
+ read;
43
+ constructor(read) {
44
+ this.read = read;
45
+ }
46
+ // --- reads: delegate verbatim ---
47
+ getUnprocessedFeedback() {
48
+ return this.read.getUnprocessedFeedback();
49
+ }
50
+ getActiveClusters() {
51
+ return this.read.getActiveClusters();
52
+ }
53
+ getCluster(clusterId) {
54
+ return this.read.getCluster(clusterId);
55
+ }
56
+ hasFeedback(feedbackId) {
57
+ return this.read.hasFeedback(feedbackId);
58
+ }
59
+ listDispatches(filter) {
60
+ return this.read.listDispatches(filter);
61
+ }
62
+ findDispatchByTitle(title) {
63
+ return this.read.findDispatchByTitle(title);
64
+ }
65
+ metrics() {
66
+ return this.read.metrics();
67
+ }
68
+ // --- writes: forbidden ---
69
+ upsertClusterFromItem(_clusterId, _item) {
70
+ throw new ShadowStoreWriteError('upsertClusterFromItem');
71
+ }
72
+ mergeIntoCluster(_clusterId, _item) {
73
+ throw new ShadowStoreWriteError('mergeIntoCluster');
74
+ }
75
+ applyReopen(_clusterId, _decision) {
76
+ throw new ShadowStoreWriteError('applyReopen');
77
+ }
78
+ markProcessed(_feedbackId, _clusterId) {
79
+ throw new ShadowStoreWriteError('markProcessed');
80
+ }
81
+ addFeedback(_item) {
82
+ throw new ShadowStoreWriteError('addFeedback');
83
+ }
84
+ createDispatch(_record) {
85
+ throw new ShadowStoreWriteError('createDispatch');
86
+ }
87
+ }
88
+ //# sourceMappingURL=ReadOnlyShadowStore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ReadOnlyShadowStore.js","sourceRoot":"","sources":["../../../src/feedback-factory/store/ReadOnlyShadowStore.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAOH,wFAAwF;AACxF,MAAM,OAAO,qBAAsB,SAAQ,KAAK;IAC9C,0DAA0D;IACjD,MAAM,CAAS;IACxB,YAAY,MAAc;QACxB,KAAK,CACH,sCAAsC,MAAM,+BAA+B;YACzE,wEAAwE;YACxE,kEAAkE,CACrE,CAAC;QACF,IAAI,CAAC,IAAI,GAAG,uBAAuB,CAAC;QACpC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;CACF;AAED;;;;;GAKG;AACH,MAAM,OAAO,mBAAmB;IACD;IAA7B,YAA6B,IAAmB;QAAnB,SAAI,GAAJ,IAAI,CAAe;IAAG,CAAC;IAEpD,mCAAmC;IACnC,sBAAsB;QACpB,OAAO,IAAI,CAAC,IAAI,CAAC,sBAAsB,EAAE,CAAC;IAC5C,CAAC;IACD,iBAAiB;QACf,OAAO,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,CAAC;IACvC,CAAC;IACD,UAAU,CAAC,SAAiB;QAC1B,OAAO,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;IACzC,CAAC;IACD,WAAW,CAAC,UAAkB;QAC5B,OAAO,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;IAC3C,CAAC;IACD,cAAc,CAAC,MAA0C;QACvD,OAAO,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;IAC1C,CAAC;IACD,mBAAmB,CAAC,KAAa;QAC/B,OAAO,IAAI,CAAC,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC;IAC9C,CAAC;IACD,OAAO;QACL,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;IAC7B,CAAC;IAED,4BAA4B;IAC5B,qBAAqB,CAAC,UAAkB,EAAE,KAAmB;QAC3D,MAAM,IAAI,qBAAqB,CAAC,uBAAuB,CAAC,CAAC;IAC3D,CAAC;IACD,gBAAgB,CAAC,UAAkB,EAAE,KAAmB;QACtD,MAAM,IAAI,qBAAqB,CAAC,kBAAkB,CAAC,CAAC;IACtD,CAAC;IACD,WAAW,CAAC,UAAkB,EAAE,SAAyB;QACvD,MAAM,IAAI,qBAAqB,CAAC,aAAa,CAAC,CAAC;IACjD,CAAC;IACD,aAAa,CAAC,WAAmB,EAAE,UAAkB;QACnD,MAAM,IAAI,qBAAqB,CAAC,eAAe,CAAC,CAAC;IACnD,CAAC;IACD,WAAW,CAAC,KAAmB;QAC7B,MAAM,IAAI,qBAAqB,CAAC,aAAa,CAAC,CAAC;IACjD,CAAC;IACD,cAAc,CAAC,OAAuB;QACpC,MAAM,IAAI,qBAAqB,CAAC,gBAAgB,CAAC,CAAC;IACpD,CAAC;CACF"}
@@ -0,0 +1,88 @@
1
+ /**
2
+ * StopNotifier — Layer B of notify-on-stop (docs/specs/NOTIFY-ON-STOP-SPEC.md,
3
+ * Task 2 of the 2026-05-27 silent-stalls postmortem).
4
+ *
5
+ * The UnjustifiedStopGate evaluate route classifies every Stop. In `shadow`
6
+ * mode the gate can judge a stop unjustified (decision `continue`) but CANNOT
7
+ * block it — so the session goes silent anyway. And an `escalate` decision means
8
+ * the gate couldn't even tell. Either way, an UNATTENDED session can stall
9
+ * mid-task and the user never hears about it. StopNotifier turns those specific
10
+ * classifications into ONE plain-English heads-up.
11
+ *
12
+ * It is a thin DECISION layer; delivery discipline (coalescing into one message,
13
+ * the single system/lifeline topic, log-always) is reused from SentinelNotifier
14
+ * via the injected `escalate` sink — StopNotifier never invents a second
15
+ * notification path (post-2026-05-22 topic-spam fix).
16
+ *
17
+ * Signal-vs-authority: the Stop-hook router is a dumb thin client; the decision
18
+ * about whether to ALARM the user lives here on the server, where the gate
19
+ * decision, the session's attended-state, and the dedup ledger all exist.
20
+ *
21
+ * Spam controls (all enforced here):
22
+ * 1. notify-worthy decision set ONLY (shadow+continue, or escalate).
23
+ * 2. attended-gate — by default, only UNATTENDED (autonomous) sessions; an
24
+ * interactive session with the user present doesn't need a ping.
25
+ * 3. per-session dedup — at most one notice per session per cooldown window.
26
+ * 4. master enable flag (default ON — Justin explicitly asked to be told when
27
+ * a session stops; the gates above keep it near-silent in practice).
28
+ */
29
+ export type StopGateMode = 'off' | 'shadow' | 'enforce';
30
+ export type StopGateDecision = 'continue' | 'allow' | 'escalate' | 'force_allow' | null;
31
+ export type StopNotifyOutcome = 'sent' | 'disabled' | 'not-worthy' | 'skipped-attended' | 'skipped-dedup';
32
+ export interface StopNotifierConfig {
33
+ /** Master gate. Default true (Justin's explicit "tell me why it stopped"). */
34
+ enabled?: boolean;
35
+ /** Only notify for unattended (autonomous) sessions. Default true. */
36
+ unattendedOnly?: boolean;
37
+ /** Per-session dedup window in ms. Default 30 min. */
38
+ cooldownMs?: number;
39
+ }
40
+ export interface StopNotifierDeps {
41
+ /**
42
+ * Delegated delivery — coalesced, single system topic, log-always. Wired in
43
+ * server.ts to a SentinelNotifier.escalate bound to the stop-notify channel.
44
+ * Synchronous fire-and-forget (SentinelNotifier batches + sends async).
45
+ */
46
+ escalate: (sessionName: string, text: string) => void;
47
+ now?: () => number;
48
+ }
49
+ export interface MaybeNotifyInput {
50
+ sessionId: string;
51
+ mode: StopGateMode;
52
+ decision: StopGateDecision;
53
+ /** Whether the stopping session is an autonomous (unattended) run. */
54
+ autonomousActive: boolean;
55
+ /** Optional short, already-sanitized context for the message (no raw logs). */
56
+ detail?: string;
57
+ }
58
+ /**
59
+ * True for the stop classifications that mean "an unjustified/ambiguous stop the
60
+ * user should hear about". Deliberately narrow:
61
+ * - shadow + `continue`: gate believes the stop was unjustified but can't block
62
+ * it (shadow) → the silent stall. THE core incident case.
63
+ * - `escalate`: gate couldn't determine justification → surface it.
64
+ * Everything else stays silent: `allow` (routine/legit completion or awaiting
65
+ * user), `continue` in ENFORCE (the session is blocked & continues — not
66
+ * stopping), `force_allow` (continue-ceiling; operator already has the stuck
67
+ * flag), and the fail-open/null cases (transient; DegradationReporter covers).
68
+ */
69
+ export declare function isNotifyWorthyStop(mode: StopGateMode, decision: StopGateDecision): boolean;
70
+ export declare class StopNotifier {
71
+ private readonly deps;
72
+ private readonly cfg;
73
+ private readonly lastNotified;
74
+ constructor(deps: StopNotifierDeps, cfg?: StopNotifierConfig);
75
+ get enabled(): boolean;
76
+ /**
77
+ * Evaluate a stop-gate decision and, if it is a notify-worthy unattended
78
+ * stall not seen recently, hand a fixed-template heads-up to the delegated
79
+ * sink. Pure-ish: returns the outcome for tests; the only side effect is the
80
+ * (coalesced, log-always) escalate call. Never throws.
81
+ */
82
+ maybeNotify(input: MaybeNotifyInput): StopNotifyOutcome;
83
+ private sessionName;
84
+ private composeMessage;
85
+ /** Test seam. */
86
+ _resetForTests(): void;
87
+ }
88
+ //# sourceMappingURL=StopNotifier.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StopNotifier.d.ts","sourceRoot":"","sources":["../../src/monitoring/StopNotifier.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAEH,MAAM,MAAM,YAAY,GAAG,KAAK,GAAG,QAAQ,GAAG,SAAS,CAAC;AACxD,MAAM,MAAM,gBAAgB,GAAG,UAAU,GAAG,OAAO,GAAG,UAAU,GAAG,aAAa,GAAG,IAAI,CAAC;AAExF,MAAM,MAAM,iBAAiB,GACzB,MAAM,GACN,UAAU,GACV,YAAY,GACZ,kBAAkB,GAClB,eAAe,CAAC;AAEpB,MAAM,WAAW,kBAAkB;IACjC,8EAA8E;IAC9E,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,sEAAsE;IACtE,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,sDAAsD;IACtD,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,gBAAgB;IAC/B;;;;OAIG;IACH,QAAQ,EAAE,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACtD,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,YAAY,CAAC;IACnB,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,sEAAsE;IACtE,gBAAgB,EAAE,OAAO,CAAC;IAC1B,+EAA+E;IAC/E,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAQD;;;;;;;;;;GAUG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,YAAY,EAAE,QAAQ,EAAE,gBAAgB,GAAG,OAAO,CAI1F;AAED,qBAAa,YAAY;IAKrB,OAAO,CAAC,QAAQ,CAAC,IAAI;IAJvB,OAAO,CAAC,QAAQ,CAAC,GAAG,CAA+B;IACnD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAA6B;gBAGvC,IAAI,EAAE,gBAAgB,EACvC,GAAG,GAAE,kBAAuB;IAK9B,IAAI,OAAO,IAAI,OAAO,CAErB;IAED;;;;;OAKG;IACH,WAAW,CAAC,KAAK,EAAE,gBAAgB,GAAG,iBAAiB;IAkBvD,OAAO,CAAC,WAAW;IAKnB,OAAO,CAAC,cAAc;IAStB,iBAAiB;IACjB,cAAc,IAAI,IAAI;CAGvB"}
@@ -0,0 +1,105 @@
1
+ /**
2
+ * StopNotifier — Layer B of notify-on-stop (docs/specs/NOTIFY-ON-STOP-SPEC.md,
3
+ * Task 2 of the 2026-05-27 silent-stalls postmortem).
4
+ *
5
+ * The UnjustifiedStopGate evaluate route classifies every Stop. In `shadow`
6
+ * mode the gate can judge a stop unjustified (decision `continue`) but CANNOT
7
+ * block it — so the session goes silent anyway. And an `escalate` decision means
8
+ * the gate couldn't even tell. Either way, an UNATTENDED session can stall
9
+ * mid-task and the user never hears about it. StopNotifier turns those specific
10
+ * classifications into ONE plain-English heads-up.
11
+ *
12
+ * It is a thin DECISION layer; delivery discipline (coalescing into one message,
13
+ * the single system/lifeline topic, log-always) is reused from SentinelNotifier
14
+ * via the injected `escalate` sink — StopNotifier never invents a second
15
+ * notification path (post-2026-05-22 topic-spam fix).
16
+ *
17
+ * Signal-vs-authority: the Stop-hook router is a dumb thin client; the decision
18
+ * about whether to ALARM the user lives here on the server, where the gate
19
+ * decision, the session's attended-state, and the dedup ledger all exist.
20
+ *
21
+ * Spam controls (all enforced here):
22
+ * 1. notify-worthy decision set ONLY (shadow+continue, or escalate).
23
+ * 2. attended-gate — by default, only UNATTENDED (autonomous) sessions; an
24
+ * interactive session with the user present doesn't need a ping.
25
+ * 3. per-session dedup — at most one notice per session per cooldown window.
26
+ * 4. master enable flag (default ON — Justin explicitly asked to be told when
27
+ * a session stops; the gates above keep it near-silent in practice).
28
+ */
29
+ const DEFAULTS = {
30
+ enabled: true,
31
+ unattendedOnly: true,
32
+ cooldownMs: 30 * 60_000,
33
+ };
34
+ /**
35
+ * True for the stop classifications that mean "an unjustified/ambiguous stop the
36
+ * user should hear about". Deliberately narrow:
37
+ * - shadow + `continue`: gate believes the stop was unjustified but can't block
38
+ * it (shadow) → the silent stall. THE core incident case.
39
+ * - `escalate`: gate couldn't determine justification → surface it.
40
+ * Everything else stays silent: `allow` (routine/legit completion or awaiting
41
+ * user), `continue` in ENFORCE (the session is blocked & continues — not
42
+ * stopping), `force_allow` (continue-ceiling; operator already has the stuck
43
+ * flag), and the fail-open/null cases (transient; DegradationReporter covers).
44
+ */
45
+ export function isNotifyWorthyStop(mode, decision) {
46
+ if (decision === 'escalate')
47
+ return true;
48
+ if (decision === 'continue' && mode === 'shadow')
49
+ return true;
50
+ return false;
51
+ }
52
+ export class StopNotifier {
53
+ deps;
54
+ cfg;
55
+ lastNotified = new Map();
56
+ constructor(deps, cfg = {}) {
57
+ this.deps = deps;
58
+ this.cfg = { ...DEFAULTS, ...cfg };
59
+ }
60
+ get enabled() {
61
+ return this.cfg.enabled === true;
62
+ }
63
+ /**
64
+ * Evaluate a stop-gate decision and, if it is a notify-worthy unattended
65
+ * stall not seen recently, hand a fixed-template heads-up to the delegated
66
+ * sink. Pure-ish: returns the outcome for tests; the only side effect is the
67
+ * (coalesced, log-always) escalate call. Never throws.
68
+ */
69
+ maybeNotify(input) {
70
+ if (!this.enabled)
71
+ return 'disabled';
72
+ if (!isNotifyWorthyStop(input.mode, input.decision))
73
+ return 'not-worthy';
74
+ if (this.cfg.unattendedOnly && !input.autonomousActive)
75
+ return 'skipped-attended';
76
+ const now = (this.deps.now ?? Date.now)();
77
+ const last = this.lastNotified.get(input.sessionId);
78
+ if (last !== undefined && now - last < this.cfg.cooldownMs)
79
+ return 'skipped-dedup';
80
+ this.lastNotified.set(input.sessionId, now);
81
+ try {
82
+ this.deps.escalate(this.sessionName(input.sessionId), this.composeMessage(input));
83
+ }
84
+ catch {
85
+ // Delivery is best-effort; a sink failure must never disturb the route.
86
+ }
87
+ return 'sent';
88
+ }
89
+ sessionName(sessionId) {
90
+ // SentinelNotifier.friendly() trims platform prefixes; pass the id through.
91
+ return sessionId || 'a background session';
92
+ }
93
+ composeMessage(input) {
94
+ const why = input.decision === 'escalate'
95
+ ? "stopped mid-task and I couldn't confirm it was a justified place to stop"
96
+ : 'stopped mid-task when it looked like there was still work to do';
97
+ const detail = input.detail ? `\n\n${input.detail}` : '';
98
+ return `A background run ${why}. Want me to pick it back up?${detail}`;
99
+ }
100
+ /** Test seam. */
101
+ _resetForTests() {
102
+ this.lastNotified.clear();
103
+ }
104
+ }
105
+ //# sourceMappingURL=StopNotifier.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StopNotifier.js","sourceRoot":"","sources":["../../src/monitoring/StopNotifier.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAyCH,MAAM,QAAQ,GAAiC;IAC7C,OAAO,EAAE,IAAI;IACb,cAAc,EAAE,IAAI;IACpB,UAAU,EAAE,EAAE,GAAG,MAAM;CACxB,CAAC;AAEF;;;;;;;;;;GAUG;AACH,MAAM,UAAU,kBAAkB,CAAC,IAAkB,EAAE,QAA0B;IAC/E,IAAI,QAAQ,KAAK,UAAU;QAAE,OAAO,IAAI,CAAC;IACzC,IAAI,QAAQ,KAAK,UAAU,IAAI,IAAI,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IAC9D,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,OAAO,YAAY;IAKJ;IAJF,GAAG,CAA+B;IAClC,YAAY,GAAG,IAAI,GAAG,EAAkB,CAAC;IAE1D,YACmB,IAAsB,EACvC,MAA0B,EAAE;QADX,SAAI,GAAJ,IAAI,CAAkB;QAGvC,IAAI,CAAC,GAAG,GAAG,EAAE,GAAG,QAAQ,EAAE,GAAG,GAAG,EAAE,CAAC;IACrC,CAAC;IAED,IAAI,OAAO;QACT,OAAO,IAAI,CAAC,GAAG,CAAC,OAAO,KAAK,IAAI,CAAC;IACnC,CAAC;IAED;;;;;OAKG;IACH,WAAW,CAAC,KAAuB;QACjC,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,OAAO,UAAU,CAAC;QACrC,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,QAAQ,CAAC;YAAE,OAAO,YAAY,CAAC;QACzE,IAAI,IAAI,CAAC,GAAG,CAAC,cAAc,IAAI,CAAC,KAAK,CAAC,gBAAgB;YAAE,OAAO,kBAAkB,CAAC;QAElF,MAAM,GAAG,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QAC1C,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QACpD,IAAI,IAAI,KAAK,SAAS,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU;YAAE,OAAO,eAAe,CAAC;QACnF,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;QAE5C,IAAI,CAAC;YACH,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC;QACpF,CAAC;QAAC,MAAM,CAAC;YACP,wEAAwE;QAC1E,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAEO,WAAW,CAAC,SAAiB;QACnC,4EAA4E;QAC5E,OAAO,SAAS,IAAI,sBAAsB,CAAC;IAC7C,CAAC;IAEO,cAAc,CAAC,KAAuB;QAC5C,MAAM,GAAG,GACP,KAAK,CAAC,QAAQ,KAAK,UAAU;YAC3B,CAAC,CAAC,0EAA0E;YAC5E,CAAC,CAAC,iEAAiE,CAAC;QACxE,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACzD,OAAO,oBAAoB,GAAG,gCAAgC,MAAM,EAAE,CAAC;IACzE,CAAC;IAED,iBAAiB;IACjB,cAAc;QACZ,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,CAAC;IAC5B,CAAC;CACF"}
@@ -182,6 +182,8 @@ export declare class AgentServer {
182
182
  unjustifiedStopGate?: import('../core/UnjustifiedStopGate.js').UnjustifiedStopGate;
183
183
  /** Stop-gate SQLite persistence (PR3). */
184
184
  stopGateDb?: import('../core/StopGateDb.js').StopGateDb;
185
+ /** notify-on-stop Layer B — surfaces genuinely-stuck unattended stops. */
186
+ stopNotifier?: import('../monitoring/StopNotifier.js').StopNotifier | null;
185
187
  /** Initiative tracker — persisted record of multi-phase long-running work. */
186
188
  initiativeTracker?: import('../core/InitiativeTracker.js').InitiativeTracker;
187
189
  /** Project-scope round runner (Phase 1b PR 3). */
@@ -1 +1 @@
1
- {"version":3,"file":"AgentServer.d.ts","sourceRoot":"","sources":["../../src/server/AgentServer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"AgentServer.d.ts","sourceRoot":"","sources":["../../src/server/AgentServer.ts"],"names":[],"mappings":"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"}
@@ -417,6 +417,7 @@ export class AgentServer {
417
417
  ledgerSessionRegistry: options.ledgerSessionRegistry ?? null,
418
418
  unjustifiedStopGate: options.unjustifiedStopGate ?? null,
419
419
  stopGateDb: options.stopGateDb ?? null,
420
+ stopNotifier: options.stopNotifier ?? null,
420
421
  initiativeTracker: options.initiativeTracker ?? null,
421
422
  projectRoundRunner: options.projectRoundRunner ?? null,
422
423
  projectDriftChecker: options.projectDriftChecker ?? null,