instar 1.3.746 → 1.3.747
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/commands/server.d.ts.map +1 -1
- package/dist/commands/server.js +41 -0
- package/dist/commands/server.js.map +1 -1
- package/dist/config/ConfigDefaults.d.ts.map +1 -1
- package/dist/config/ConfigDefaults.js +18 -0
- package/dist/config/ConfigDefaults.js.map +1 -1
- package/dist/core/devGatedFeatures.d.ts.map +1 -1
- package/dist/core/devGatedFeatures.js +6 -0
- package/dist/core/devGatedFeatures.js.map +1 -1
- package/dist/core/durableSecretScrub.d.ts +129 -0
- package/dist/core/durableSecretScrub.d.ts.map +1 -0
- package/dist/core/durableSecretScrub.js +220 -0
- package/dist/core/durableSecretScrub.js.map +1 -0
- package/dist/core/types.d.ts +18 -0
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/types.js.map +1 -1
- package/dist/data/durableOutputChokepoints.d.ts +84 -0
- package/dist/data/durableOutputChokepoints.d.ts.map +1 -0
- package/dist/data/durableOutputChokepoints.js +145 -0
- package/dist/data/durableOutputChokepoints.js.map +1 -0
- package/dist/messaging/SessionSummarySentinel.d.ts +28 -0
- package/dist/messaging/SessionSummarySentinel.d.ts.map +1 -1
- package/dist/messaging/SessionSummarySentinel.js +25 -1
- package/dist/messaging/SessionSummarySentinel.js.map +1 -1
- package/dist/monitoring/DurableOutputScrubber.d.ts +123 -0
- package/dist/monitoring/DurableOutputScrubber.d.ts.map +1 -0
- package/dist/monitoring/DurableOutputScrubber.js +179 -0
- package/dist/monitoring/DurableOutputScrubber.js.map +1 -0
- package/dist/monitoring/guardManifest.d.ts.map +1 -1
- package/dist/monitoring/guardManifest.js +23 -0
- package/dist/monitoring/guardManifest.js.map +1 -1
- package/package.json +1 -1
- package/src/data/builtin-manifest.json +2 -2
- package/src/data/durableOutputChokepoints.ts +192 -0
- package/upgrades/1.3.747.md +61 -0
- package/upgrades/side-effects/durable-output-hygiene-standard.md +229 -0
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Durable-Output Chokepoint Inventory — the auditable registry of every store
|
|
3
|
+
* that accepts LLM output and, per store, its Layer-B scrub status + its
|
|
4
|
+
* durable-secret bench-axis coverage (Durable-Output Hygiene Standard §3,
|
|
5
|
+
* docs/specs/durable-output-hygiene-standard.md).
|
|
6
|
+
*
|
|
7
|
+
* This is the file the Standards Enforcement Coverage audit reads to grade the
|
|
8
|
+
* "What Persists Must Be Clean" standard `gate` rather than `spec-only`, and the
|
|
9
|
+
* file the durable-output-chokepoint ratchet (tests/unit/
|
|
10
|
+
* durable-output-chokepoint-ratchet.test.ts) pins SHRINK-ONLY: a chokepoint may
|
|
11
|
+
* graduate `pending → wired`, never regress, and a NEW durable-output persistence
|
|
12
|
+
* path cannot silently bypass the class (it must be classified here, exactly like
|
|
13
|
+
* the llmBenchCoverage map forces a bench decision on every LLM component).
|
|
14
|
+
*
|
|
15
|
+
* SCOPE (spec §3): memory-family stores + doc-tree summaries are in scope now;
|
|
16
|
+
* logs/telemetry are covered by the existing telemetry scrubs; caches / vector
|
|
17
|
+
* indexes / eval artifacts and the private-view / published-page write path are
|
|
18
|
+
* enumerated as tracked follow-ups IN this inventory (a semantically-durable leak
|
|
19
|
+
* path cannot park as an undated TODO — each carries an owner).
|
|
20
|
+
*
|
|
21
|
+
* MULTI-MACHINE POSTURE (spec §3, Cross-Machine Coherence): a replicated
|
|
22
|
+
* memory-family store accepts records FROM PEERS, so a peer running with the
|
|
23
|
+
* scrub dark could deliver an unscrubbed secret into a scrub-enabled machine's
|
|
24
|
+
* durable store, bypassing every writer-side chokepoint. Each replicated store
|
|
25
|
+
* therefore lists its RECEIVE path as its own chokepoint (`receivePath`).
|
|
26
|
+
*
|
|
27
|
+
* NOTE (rollout reality): the CODE that wires the scrub at each chokepoint lands
|
|
28
|
+
* incrementally (dark-first). This inventory is the durable contract that names
|
|
29
|
+
* every chokepoint up front so the ratchet + coverage audit measure progress
|
|
30
|
+
* against a fixed denominator rather than agent memory.
|
|
31
|
+
*/
|
|
32
|
+
/**
|
|
33
|
+
* The known set from the routing registry (spec §3) + the replicated-store
|
|
34
|
+
* receive paths + the tracked follow-ups. SessionSummarySentinel is the FIRST
|
|
35
|
+
* wired chokepoint (the demonstrated Layer-B wiring); the rest are pending
|
|
36
|
+
* follow-ups adopting the same one-line scrubber call.
|
|
37
|
+
*/
|
|
38
|
+
export const DURABLE_OUTPUT_CHOKEPOINTS = [
|
|
39
|
+
{
|
|
40
|
+
component: 'SessionSummarySentinel',
|
|
41
|
+
store: 'session routing summaries (state/sessions/<id>/summary.json)',
|
|
42
|
+
path: 'src/messaging/SessionSummarySentinel.ts',
|
|
43
|
+
scrubStatus: 'wired',
|
|
44
|
+
benchAxis: 'covered',
|
|
45
|
+
benchTaskId: 'session-summary-durable-secret',
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
component: 'SessionActivitySentinel',
|
|
49
|
+
store: 'activity-digest entries → SemanticMemory (long-term memory)',
|
|
50
|
+
path: 'src/monitoring/SessionActivitySentinel.ts',
|
|
51
|
+
scrubStatus: 'pending',
|
|
52
|
+
owner: 'durable-output-hygiene rollout step 3 (Layer A digest writer already shipped v1.3.721; migrate its persist path onto the shared scrubber)',
|
|
53
|
+
benchAxis: 'pending',
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
component: 'SelfKnowledgeTree',
|
|
57
|
+
store: 'self-knowledge facts extractor → self-knowledge-tree.json',
|
|
58
|
+
path: 'src/core/SelfKnowledgeTree.ts',
|
|
59
|
+
scrubStatus: 'pending',
|
|
60
|
+
owner: 'durable-output-hygiene rollout (adopt the shared scrubber at the facts-persist write)',
|
|
61
|
+
benchAxis: 'pending',
|
|
62
|
+
},
|
|
63
|
+
{
|
|
64
|
+
component: 'knowledge-base-synthesizer',
|
|
65
|
+
store: 'knowledge-base synthesized records',
|
|
66
|
+
path: 'src/knowledge (KB synthesizer persist path)',
|
|
67
|
+
scrubStatus: 'pending',
|
|
68
|
+
owner: 'durable-output-hygiene rollout (adopt the shared scrubber at the KB record write)',
|
|
69
|
+
benchAxis: 'pending',
|
|
70
|
+
receivePath: {
|
|
71
|
+
store: 'replicated KB catalog (WS2.4 stateSync.knowledge receive)',
|
|
72
|
+
scrubStatus: 'pending',
|
|
73
|
+
owner: 'durable-output-hygiene multi-machine posture (scrub-on-receive with the shared module, or argue a serve-time-redaction exemption)',
|
|
74
|
+
},
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
component: 'correction-learning',
|
|
78
|
+
store: 'correction distiller records (CorrectionCaptureLoop)',
|
|
79
|
+
path: 'src/monitoring/CorrectionCaptureLoop.ts',
|
|
80
|
+
scrubStatus: 'exempt',
|
|
81
|
+
reason: 'CorrectionCaptureLoop already applies the deterministic scrubSecrets() pass on BOTH sides of its LLM hop (pre-distill + post-distill persist) per its own spec §3.3 — an existing serve-time/persist redaction. Migrates to the shared module in rollout step 0; the class is not unguarded here.',
|
|
82
|
+
benchAxis: 'covered',
|
|
83
|
+
benchTaskId: 'correction-distiller',
|
|
84
|
+
},
|
|
85
|
+
{
|
|
86
|
+
component: 'CartographerSweep',
|
|
87
|
+
store: 'cartographer doc-tree node summaries',
|
|
88
|
+
path: 'src/core/cartographerSummary.ts',
|
|
89
|
+
scrubStatus: 'pending',
|
|
90
|
+
owner: 'durable-output-hygiene rollout (adopt the shared scrubber at the node-summary write; the sweep already runs on a light off-Claude model)',
|
|
91
|
+
benchAxis: 'pending',
|
|
92
|
+
},
|
|
93
|
+
{
|
|
94
|
+
component: 'learnings-registry',
|
|
95
|
+
store: 'learnings registry entries',
|
|
96
|
+
path: 'src/core (learning registry persist path)',
|
|
97
|
+
scrubStatus: 'pending',
|
|
98
|
+
owner: 'durable-output-hygiene rollout (adopt the shared scrubber at the learning-persist write)',
|
|
99
|
+
benchAxis: 'pending',
|
|
100
|
+
receivePath: {
|
|
101
|
+
store: 'replicated learnings (WS2.2 stateSync.learnings receive)',
|
|
102
|
+
scrubStatus: 'pending',
|
|
103
|
+
owner: 'durable-output-hygiene multi-machine posture (scrub-on-receive with the shared module, or argue a serve-time-redaction exemption)',
|
|
104
|
+
},
|
|
105
|
+
},
|
|
106
|
+
{
|
|
107
|
+
component: 'RelationshipManager',
|
|
108
|
+
store: 'relationship records (WS2.3 — user-visible PII)',
|
|
109
|
+
path: 'src/core/RelationshipManager.ts',
|
|
110
|
+
scrubStatus: 'pending',
|
|
111
|
+
owner: 'durable-output-hygiene rollout (adopt the shared scrubber at the relationship-record write)',
|
|
112
|
+
benchAxis: 'pending',
|
|
113
|
+
receivePath: {
|
|
114
|
+
store: 'replicated relationships (WS2.3 stateSync.relationships receive)',
|
|
115
|
+
scrubStatus: 'pending',
|
|
116
|
+
owner: 'durable-output-hygiene multi-machine posture (scrub-on-receive with the shared module, or argue a serve-time-redaction exemption)',
|
|
117
|
+
},
|
|
118
|
+
},
|
|
119
|
+
// ── Tracked follow-ups (spec §3 scope boundary + Frontloaded Decision #3) ──
|
|
120
|
+
{
|
|
121
|
+
component: 'private-view-publisher',
|
|
122
|
+
store: 'private views / published Telegraph pages (different write path)',
|
|
123
|
+
path: 'src/server (view + publish routes)',
|
|
124
|
+
scrubStatus: 'exempt',
|
|
125
|
+
reason: 'Out of scope for the first pass (spec Frontloaded Decision #3): a different write path, same pattern. Tracked follow-up owned by the class-closure escalator gap machinery (max-age escalation applies) — a semantically-durable leak path may not park undated.',
|
|
126
|
+
benchAxis: 'exempt',
|
|
127
|
+
},
|
|
128
|
+
{
|
|
129
|
+
component: 'vector-index-eval-artifacts',
|
|
130
|
+
store: 'caches / vector indexes / eval artifacts',
|
|
131
|
+
path: 'src/memory (embedding + eval artifact write paths)',
|
|
132
|
+
scrubStatus: 'exempt',
|
|
133
|
+
reason: 'Enumerated as a tracked follow-up (spec §3 scope boundary) under the class-closure gap machinery so it carries the max-age escalation — a semantically-durable leak path cannot park as an undated TODO. Not silently omitted.',
|
|
134
|
+
benchAxis: 'exempt',
|
|
135
|
+
},
|
|
136
|
+
];
|
|
137
|
+
/** Chokepoints whose writer-side scrub is wired (the class is guarded here). */
|
|
138
|
+
export function wiredChokepoints() {
|
|
139
|
+
return DURABLE_OUTPUT_CHOKEPOINTS.filter((c) => c.scrubStatus === 'wired');
|
|
140
|
+
}
|
|
141
|
+
/** Chokepoints still awaiting the scrub (Close the Loop — each has an owner). */
|
|
142
|
+
export function pendingChokepoints() {
|
|
143
|
+
return DURABLE_OUTPUT_CHOKEPOINTS.filter((c) => c.scrubStatus === 'pending');
|
|
144
|
+
}
|
|
145
|
+
//# sourceMappingURL=durableOutputChokepoints.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"durableOutputChokepoints.js","sourceRoot":"","sources":["../../src/data/durableOutputChokepoints.ts"],"names":[],"mappings":"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"}
|
|
@@ -10,6 +10,7 @@
|
|
|
10
10
|
* - Falls back to keyword matching when LLM is unavailable
|
|
11
11
|
*/
|
|
12
12
|
import type { Session, IntelligenceProvider } from '../core/types.js';
|
|
13
|
+
import type { DurableOutputScrubber } from '../monitoring/DurableOutputScrubber.js';
|
|
13
14
|
export type SessionPhase = 'planning' | 'building' | 'testing' | 'debugging' | 'deploying' | 'engaging' | 'idle';
|
|
14
15
|
export interface SessionSummary {
|
|
15
16
|
sessionId: string;
|
|
@@ -23,6 +24,14 @@ export interface SessionSummary {
|
|
|
23
24
|
updatedAt: string;
|
|
24
25
|
stale: boolean;
|
|
25
26
|
outputHash: string;
|
|
27
|
+
/**
|
|
28
|
+
* Durable-Output Hygiene (spec Frontloaded Decision #2 — mandatory provenance):
|
|
29
|
+
* the one-line human-visible marker set when the Layer-B scrubber redacted a
|
|
30
|
+
* span from this persisted summary. Absent when nothing was redacted. An
|
|
31
|
+
* unmarked alteration is a swallowed finding — so an altered summary always
|
|
32
|
+
* carries this note.
|
|
33
|
+
*/
|
|
34
|
+
redactionNote?: string;
|
|
26
35
|
}
|
|
27
36
|
export interface SentinelConfig {
|
|
28
37
|
stateDir: string;
|
|
@@ -40,6 +49,15 @@ export interface SentinelConfig {
|
|
|
40
49
|
stalenessMinutes?: number;
|
|
41
50
|
/** Misroute threshold before fallback (default: 3 in 10 min) */
|
|
42
51
|
misrouteThreshold?: number;
|
|
52
|
+
/**
|
|
53
|
+
* Durable-Output Hygiene Standard §2 (Layer B) — the config-gated scrubber that
|
|
54
|
+
* redacts credential SPANS from the LLM/output-derived summary fields BEFORE
|
|
55
|
+
* they persist to disk. Optional + dark-first: when absent (or not engaged) the
|
|
56
|
+
* summary is stored byte-for-byte as today. When engaged in dryRun it computes +
|
|
57
|
+
* records would-redact metrics but stores the original text; only a deliberate
|
|
58
|
+
* dryRun:false flip actually alters stored content (operator decision).
|
|
59
|
+
*/
|
|
60
|
+
scrubber?: DurableOutputScrubber;
|
|
43
61
|
}
|
|
44
62
|
export interface RoutingScore {
|
|
45
63
|
sessionId: string;
|
|
@@ -73,6 +91,16 @@ export declare class SessionSummarySentinel {
|
|
|
73
91
|
private parseLlmResponse;
|
|
74
92
|
/** Keyword-based summary extraction (fallback when LLM unavailable) */
|
|
75
93
|
private extractKeywordSummary;
|
|
94
|
+
/**
|
|
95
|
+
* Durable-Output Hygiene Standard §2 (Layer B) — run the config-gated scrubber
|
|
96
|
+
* over the LLM/output-derived string fields (task, blockers) + string arrays
|
|
97
|
+
* (files, topics) BEFORE the summary persists. When the scrubber is absent or
|
|
98
|
+
* not engaged this is a strict no-op (returns the input summary). When engaged
|
|
99
|
+
* in dryRun it records would-redact metrics but returns the original content;
|
|
100
|
+
* only a live (dryRun:false) scrubber alters the stored text — and every altered
|
|
101
|
+
* summary carries the mandatory `redactionNote` provenance marker.
|
|
102
|
+
*/
|
|
103
|
+
private scrubForStore;
|
|
76
104
|
/** Save a summary to disk */
|
|
77
105
|
private saveSummary;
|
|
78
106
|
/** Get a summary for a specific session */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SessionSummarySentinel.d.ts","sourceRoot":"","sources":["../../src/messaging/SessionSummarySentinel.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAKH,OAAO,KAAK,EAAE,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"SessionSummarySentinel.d.ts","sourceRoot":"","sources":["../../src/messaging/SessionSummarySentinel.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAKH,OAAO,KAAK,EAAE,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AACtE,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,wCAAwC,CAAC;AAIpF,MAAM,MAAM,YAAY,GACpB,UAAU,GACV,UAAU,GACV,SAAS,GACT,WAAW,GACX,WAAW,GACX,UAAU,GACV,MAAM,CAAC;AAEX,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,YAAY,CAAC;IACpB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,OAAO,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB;;;;;;OAMG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,uDAAuD;IACvD,YAAY,CAAC,EAAE,oBAAoB,CAAC;IACpC,uCAAuC;IACvC,iBAAiB,EAAE,MAAM,OAAO,EAAE,CAAC;IACnC,2CAA2C;IAC3C,aAAa,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,CAAC;IACtD,8DAA8D;IAC9D,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,qDAAqD;IACrD,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,gEAAgE;IAChE,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,gEAAgE;IAChE,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B;;;;;;;OAOG;IACH,QAAQ,CAAC,EAAE,qBAAqB,CAAC;CAClC;AAED,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AA8BD,qBAAa,sBAAsB;IACjC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAiB;IACxC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,KAAK,CAA+C;IAE5D,2DAA2D;IAC3D,OAAO,CAAC,QAAQ,CAAC,YAAY,CAA6B;IAE1D,qCAAqC;IACrC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAgB;IAC1C,OAAO,CAAC,aAAa,CAAa;gBAEtB,MAAM,EAAE,cAAc;IAMlC,8BAA8B;IAC9B,KAAK,IAAI,IAAI;IAMb,6BAA6B;IAC7B,IAAI,IAAI,IAAI;IAOZ,mDAAmD;IAC7C,IAAI,IAAI,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IA8C3E,uEAAuE;YACzD,eAAe;IAwC7B,8CAA8C;IAC9C,OAAO,CAAC,gBAAgB;IAgCxB,uEAAuE;IACvE,OAAO,CAAC,qBAAqB;IAgE7B;;;;;;;;OAQG;IACH,OAAO,CAAC,aAAa;IAarB,6BAA6B;YACf,WAAW;IAOzB,2CAA2C;IAC3C,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI;IAUpD,gCAAgC;IAChC,eAAe,IAAI,cAAc,EAAE;IAoBnC,mDAAmD;YACrC,eAAe;IAgB7B;;;;;;;;;OASG;IACH,eAAe,CACb,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,MAAM,EACnB,cAAc,CAAC,EAAE,MAAM,GACtB,YAAY,EAAE;IAkFjB,4CAA4C;IAC5C,OAAO,CAAC,eAAe;IAgBvB,mEAAmE;IACnE,cAAc,IAAI,IAAI;IActB,0EAA0E;IAC1E,gBAAgB,IAAI,OAAO;IAI3B,yCAAyC;IACzC,SAAS,IAAI;QACX,YAAY,EAAE,MAAM,CAAC;QACrB,UAAU,EAAE,MAAM,CAAC;QACnB,UAAU,EAAE,OAAO,CAAC;QACpB,eAAe,EAAE,MAAM,CAAC;QACxB,eAAe,EAAE,MAAM,CAAC;KACzB;CAUF"}
|
|
@@ -88,7 +88,12 @@ export class SessionSummarySentinel {
|
|
|
88
88
|
// Generate summary
|
|
89
89
|
const summary = await this.generateSummary(session, output, hash);
|
|
90
90
|
if (summary) {
|
|
91
|
-
|
|
91
|
+
// Durable-Output Hygiene §2: scrub the freshly-generated LLM/output-
|
|
92
|
+
// derived summary at the persistence chokepoint BEFORE the write. The
|
|
93
|
+
// staleness re-save path (updateStaleness → saveSummary) is deliberately
|
|
94
|
+
// NOT re-scrubbed — it re-persists an already-scrubbed summary, so
|
|
95
|
+
// re-scrubbing would recompute an empty provenance and drop redactionNote.
|
|
96
|
+
await this.saveSummary(this.scrubForStore(summary));
|
|
92
97
|
this.outputHashes.set(session.id, hash);
|
|
93
98
|
updated++;
|
|
94
99
|
}
|
|
@@ -218,6 +223,25 @@ export class SessionSummarySentinel {
|
|
|
218
223
|
outputHash: hash,
|
|
219
224
|
};
|
|
220
225
|
}
|
|
226
|
+
/**
|
|
227
|
+
* Durable-Output Hygiene Standard §2 (Layer B) — run the config-gated scrubber
|
|
228
|
+
* over the LLM/output-derived string fields (task, blockers) + string arrays
|
|
229
|
+
* (files, topics) BEFORE the summary persists. When the scrubber is absent or
|
|
230
|
+
* not engaged this is a strict no-op (returns the input summary). When engaged
|
|
231
|
+
* in dryRun it records would-redact metrics but returns the original content;
|
|
232
|
+
* only a live (dryRun:false) scrubber alters the stored text — and every altered
|
|
233
|
+
* summary carries the mandatory `redactionNote` provenance marker.
|
|
234
|
+
*/
|
|
235
|
+
scrubForStore(summary) {
|
|
236
|
+
const scrubber = this.config.scrubber;
|
|
237
|
+
if (!scrubber || !scrubber.isEngaged())
|
|
238
|
+
return summary;
|
|
239
|
+
const outcome = scrubber.scrubRecord(summary, ['task', 'blockers', 'files', 'topics'], { store: 'session-summary', callsite: 'SessionSummarySentinel.saveSummary' });
|
|
240
|
+
const next = outcome.record;
|
|
241
|
+
if (outcome.provenance)
|
|
242
|
+
next.redactionNote = outcome.provenance;
|
|
243
|
+
return next;
|
|
244
|
+
}
|
|
221
245
|
/** Save a summary to disk */
|
|
222
246
|
async saveSummary(summary) {
|
|
223
247
|
const sessionDir = path.join(this.summaryDir, summary.sessionId);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SessionSummarySentinel.js","sourceRoot":"","sources":["../../src/messaging/SessionSummarySentinel.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"SessionSummarySentinel.js","sourceRoot":"","sources":["../../src/messaging/SessionSummarySentinel.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DurableOutputScrubber — the config-gated Layer B service that wraps the shared
|
|
3
|
+
* `scrubForStore` floor at a durable-output persistence chokepoint (Durable-Output
|
|
4
|
+
* Hygiene Standard, "What Persists Must Be Clean" —
|
|
5
|
+
* docs/specs/durable-output-hygiene-standard.md §2).
|
|
6
|
+
*
|
|
7
|
+
* The pure floor (src/core/durableSecretScrub.ts) does the redaction; THIS layer
|
|
8
|
+
* adds everything that is NOT pure:
|
|
9
|
+
* - config gating (enabled / dryRun) — dark-first per Graduated Rollout;
|
|
10
|
+
* - observability (FeatureMetricsLedger under feature key `durable-output-scrub`);
|
|
11
|
+
* - the MANDATORY provenance marker on every altered entry (spec Frontloaded
|
|
12
|
+
* Decision #2 — an unmarked alteration is a swallowed finding);
|
|
13
|
+
* - the per-store poisoning-rate alarm (spec §2 — a burst of credential-shaped
|
|
14
|
+
* plants is an attention event, not a quiet counter).
|
|
15
|
+
*
|
|
16
|
+
* SIGNAL-VS-AUTHORITY (spec §Decision points touched, P2): this is a detector
|
|
17
|
+
* holding MUTATION authority over durable content — sanctioned as a deterministic
|
|
18
|
+
* safety floor (the fork-bomb spawn-cap precedent) that earns that authority by
|
|
19
|
+
* being observable, bounded, and reversible-in-posture:
|
|
20
|
+
* - DARK-FIRST + dryRun soak with a measured false-positive rate;
|
|
21
|
+
* - provenance marker on every alteration (no silent mutation);
|
|
22
|
+
* - typed markers + structured metadata (diagnosable after the fact);
|
|
23
|
+
* - per-store opt-out in the chokepoint inventory;
|
|
24
|
+
* - an operator-gated enforce flip (dryRun:false is Frontloaded Decision #4).
|
|
25
|
+
*
|
|
26
|
+
* dryRun semantics (the canary): while dryRun holds, the scrub is COMPUTED and
|
|
27
|
+
* its would-redact metrics are recorded, but the ORIGINAL text is returned
|
|
28
|
+
* unchanged — no durable content is ever altered until a deliberate dryRun:false.
|
|
29
|
+
* Telemetry never carries the secret (the floor's metadata is kind/offset/length
|
|
30
|
+
* only, and this layer records COUNTS, never bytes).
|
|
31
|
+
*/
|
|
32
|
+
import { type RedactionSpan, type StructuredRedactionSpan, type DurableSecretKind } from '../core/durableSecretScrub.js';
|
|
33
|
+
/** Minimal metrics sink — the real FeatureMetricsLedger satisfies this. */
|
|
34
|
+
export interface DurableScrubMetricsSink {
|
|
35
|
+
recordEvent(feature: string, outcome: 'fired' | 'noop' | 'error' | 'shed', verdictId?: string): void;
|
|
36
|
+
}
|
|
37
|
+
/** Fired when one store's redaction rate crosses the poisoning threshold. Carries
|
|
38
|
+
* COUNTS + kinds only — never bytes (spec §2 telemetry-safety). */
|
|
39
|
+
export interface PoisoningSignal {
|
|
40
|
+
store: string;
|
|
41
|
+
/** Redaction events for this store within the current window. */
|
|
42
|
+
count: number;
|
|
43
|
+
/** Distinct pattern kinds seen in the burst. */
|
|
44
|
+
kinds: DurableSecretKind[];
|
|
45
|
+
windowMs: number;
|
|
46
|
+
}
|
|
47
|
+
export declare const DURABLE_SCRUB_FEATURE_KEY = "durable-output-scrub";
|
|
48
|
+
export interface DurableOutputScrubberConfig {
|
|
49
|
+
/** Resolved via resolveDevAgentGate at the construction boundary (live-on-dev,
|
|
50
|
+
* dark-on-fleet). When false the scrubber is a strict no-op. */
|
|
51
|
+
enabled: boolean;
|
|
52
|
+
/** The canary: while true, compute + record metrics but return original text
|
|
53
|
+
* unchanged (no durable mutation). Defaults to TRUE (fail-safe — a missing
|
|
54
|
+
* dryRun flag must never silently enable real redaction). */
|
|
55
|
+
dryRun?: boolean;
|
|
56
|
+
/** Input size bound handed to the floor (spec §2). */
|
|
57
|
+
maxBytes?: number;
|
|
58
|
+
metrics?: DurableScrubMetricsSink;
|
|
59
|
+
/** Per-store redaction-rate alarm (spec §2 poisoning visibility). Fires ONCE
|
|
60
|
+
* per (store) window when count crosses the threshold. */
|
|
61
|
+
onPoisoningSuspected?: (signal: PoisoningSignal) => void;
|
|
62
|
+
/** Redactions within `poisoningWindowMs` on one store before the alarm fires. */
|
|
63
|
+
poisoningThreshold?: number;
|
|
64
|
+
poisoningWindowMs?: number;
|
|
65
|
+
/** Injectable clock for deterministic tests. */
|
|
66
|
+
now?: () => number;
|
|
67
|
+
}
|
|
68
|
+
export interface ScrubOutcome {
|
|
69
|
+
/** The text to persist. In dryRun (or when disabled) this is the ORIGINAL
|
|
70
|
+
* input; live-with-redactions it is the scrubbed text + provenance marker. */
|
|
71
|
+
text: string;
|
|
72
|
+
/** Structured redaction metadata (kind/offset/length only). Populated even in
|
|
73
|
+
* dryRun (the would-redact record) — never carries matched bytes. */
|
|
74
|
+
redactions: RedactionSpan[];
|
|
75
|
+
/** True only when the returned `text` was actually altered (live, ≥1 redaction). */
|
|
76
|
+
applied: boolean;
|
|
77
|
+
/** The one-line human-visible provenance marker, when any span was redacted. */
|
|
78
|
+
provenance?: string;
|
|
79
|
+
}
|
|
80
|
+
export interface ScrubStructuredOutcome<T> {
|
|
81
|
+
record: T;
|
|
82
|
+
redactions: StructuredRedactionSpan[];
|
|
83
|
+
applied: boolean;
|
|
84
|
+
provenance?: string;
|
|
85
|
+
}
|
|
86
|
+
export declare class DurableOutputScrubber {
|
|
87
|
+
private readonly enabled;
|
|
88
|
+
private readonly dryRun;
|
|
89
|
+
private readonly maxBytes?;
|
|
90
|
+
private readonly metrics?;
|
|
91
|
+
private readonly onPoisoningSuspected?;
|
|
92
|
+
private readonly poisoningThreshold;
|
|
93
|
+
private readonly poisoningWindowMs;
|
|
94
|
+
private readonly now;
|
|
95
|
+
/** Per-store rolling redaction timestamps + kinds for the poisoning alarm. */
|
|
96
|
+
private readonly poisoningState;
|
|
97
|
+
constructor(config: DurableOutputScrubberConfig);
|
|
98
|
+
/** True when the scrubber will actually mutate durable content (enabled AND live). */
|
|
99
|
+
isEnforcing(): boolean;
|
|
100
|
+
/** True when the scrubber is engaged at all (enabled — includes dryRun soak). */
|
|
101
|
+
isEngaged(): boolean;
|
|
102
|
+
private buildProvenance;
|
|
103
|
+
private recordAndAlarm;
|
|
104
|
+
private maybeAlarm;
|
|
105
|
+
/**
|
|
106
|
+
* Scrub a single durable string field. Returns the original text unchanged when
|
|
107
|
+
* disabled or in dryRun; the scrubbed text + provenance marker when enforcing.
|
|
108
|
+
* Metrics + poisoning alarm fire in BOTH dryRun and enforcing modes.
|
|
109
|
+
*/
|
|
110
|
+
scrub(input: string, ctx: {
|
|
111
|
+
store: string;
|
|
112
|
+
callsite?: string;
|
|
113
|
+
}): ScrubOutcome;
|
|
114
|
+
/**
|
|
115
|
+
* Scrub the named string fields of a structured record before serialization
|
|
116
|
+
* (spec §2 — structured stores). Same dryRun/enforcing semantics as `scrub`.
|
|
117
|
+
*/
|
|
118
|
+
scrubRecord<T extends Record<string, unknown>>(record: T, fields: readonly (keyof T)[], ctx: {
|
|
119
|
+
store: string;
|
|
120
|
+
callsite?: string;
|
|
121
|
+
}): ScrubStructuredOutcome<T>;
|
|
122
|
+
}
|
|
123
|
+
//# sourceMappingURL=DurableOutputScrubber.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DurableOutputScrubber.d.ts","sourceRoot":"","sources":["../../src/monitoring/DurableOutputScrubber.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DurableOutputScrubber — the config-gated Layer B service that wraps the shared
|
|
3
|
+
* `scrubForStore` floor at a durable-output persistence chokepoint (Durable-Output
|
|
4
|
+
* Hygiene Standard, "What Persists Must Be Clean" —
|
|
5
|
+
* docs/specs/durable-output-hygiene-standard.md §2).
|
|
6
|
+
*
|
|
7
|
+
* The pure floor (src/core/durableSecretScrub.ts) does the redaction; THIS layer
|
|
8
|
+
* adds everything that is NOT pure:
|
|
9
|
+
* - config gating (enabled / dryRun) — dark-first per Graduated Rollout;
|
|
10
|
+
* - observability (FeatureMetricsLedger under feature key `durable-output-scrub`);
|
|
11
|
+
* - the MANDATORY provenance marker on every altered entry (spec Frontloaded
|
|
12
|
+
* Decision #2 — an unmarked alteration is a swallowed finding);
|
|
13
|
+
* - the per-store poisoning-rate alarm (spec §2 — a burst of credential-shaped
|
|
14
|
+
* plants is an attention event, not a quiet counter).
|
|
15
|
+
*
|
|
16
|
+
* SIGNAL-VS-AUTHORITY (spec §Decision points touched, P2): this is a detector
|
|
17
|
+
* holding MUTATION authority over durable content — sanctioned as a deterministic
|
|
18
|
+
* safety floor (the fork-bomb spawn-cap precedent) that earns that authority by
|
|
19
|
+
* being observable, bounded, and reversible-in-posture:
|
|
20
|
+
* - DARK-FIRST + dryRun soak with a measured false-positive rate;
|
|
21
|
+
* - provenance marker on every alteration (no silent mutation);
|
|
22
|
+
* - typed markers + structured metadata (diagnosable after the fact);
|
|
23
|
+
* - per-store opt-out in the chokepoint inventory;
|
|
24
|
+
* - an operator-gated enforce flip (dryRun:false is Frontloaded Decision #4).
|
|
25
|
+
*
|
|
26
|
+
* dryRun semantics (the canary): while dryRun holds, the scrub is COMPUTED and
|
|
27
|
+
* its would-redact metrics are recorded, but the ORIGINAL text is returned
|
|
28
|
+
* unchanged — no durable content is ever altered until a deliberate dryRun:false.
|
|
29
|
+
* Telemetry never carries the secret (the floor's metadata is kind/offset/length
|
|
30
|
+
* only, and this layer records COUNTS, never bytes).
|
|
31
|
+
*/
|
|
32
|
+
import { scrubForStore, scrubStructured, } from '../core/durableSecretScrub.js';
|
|
33
|
+
export const DURABLE_SCRUB_FEATURE_KEY = 'durable-output-scrub';
|
|
34
|
+
const DEFAULT_POISONING_THRESHOLD = 25;
|
|
35
|
+
const DEFAULT_POISONING_WINDOW_MS = 10 * 60_000;
|
|
36
|
+
export class DurableOutputScrubber {
|
|
37
|
+
enabled;
|
|
38
|
+
dryRun;
|
|
39
|
+
maxBytes;
|
|
40
|
+
metrics;
|
|
41
|
+
onPoisoningSuspected;
|
|
42
|
+
poisoningThreshold;
|
|
43
|
+
poisoningWindowMs;
|
|
44
|
+
now;
|
|
45
|
+
/** Per-store rolling redaction timestamps + kinds for the poisoning alarm. */
|
|
46
|
+
poisoningState = new Map();
|
|
47
|
+
constructor(config) {
|
|
48
|
+
this.enabled = config.enabled === true;
|
|
49
|
+
// Fail-safe: dryRun defaults TRUE. Real redaction requires an explicit false.
|
|
50
|
+
this.dryRun = config.dryRun !== false;
|
|
51
|
+
this.maxBytes = config.maxBytes;
|
|
52
|
+
this.metrics = config.metrics;
|
|
53
|
+
this.onPoisoningSuspected = config.onPoisoningSuspected;
|
|
54
|
+
this.poisoningThreshold = config.poisoningThreshold ?? DEFAULT_POISONING_THRESHOLD;
|
|
55
|
+
this.poisoningWindowMs = config.poisoningWindowMs ?? DEFAULT_POISONING_WINDOW_MS;
|
|
56
|
+
this.now = config.now ?? Date.now;
|
|
57
|
+
}
|
|
58
|
+
/** True when the scrubber will actually mutate durable content (enabled AND live). */
|
|
59
|
+
isEnforcing() {
|
|
60
|
+
return this.enabled && !this.dryRun;
|
|
61
|
+
}
|
|
62
|
+
/** True when the scrubber is engaged at all (enabled — includes dryRun soak). */
|
|
63
|
+
isEngaged() {
|
|
64
|
+
return this.enabled;
|
|
65
|
+
}
|
|
66
|
+
buildProvenance(result) {
|
|
67
|
+
const n = result.redactions.length;
|
|
68
|
+
if (result.error)
|
|
69
|
+
return '⚠ durable-output scrub error — field withheld (see feature metrics: durable-output-scrub)';
|
|
70
|
+
if (result.truncated)
|
|
71
|
+
return '⚠ durable-output oversize — field withheld (see feature metrics: durable-output-scrub)';
|
|
72
|
+
return `${n} span${n === 1 ? '' : 's'} redacted by durable-output scrub (see feature metrics: durable-output-scrub)`;
|
|
73
|
+
}
|
|
74
|
+
recordAndAlarm(store, result, kinds) {
|
|
75
|
+
// Metrics: fired (any redaction), error (fail-safe path), else noop. Counts
|
|
76
|
+
// only — never the matched bytes (telemetry-safety, spec §2).
|
|
77
|
+
if (this.metrics) {
|
|
78
|
+
const outcome = result.error ? 'error' : result.redactions.length > 0 ? 'fired' : 'noop';
|
|
79
|
+
try {
|
|
80
|
+
this.metrics.recordEvent(DURABLE_SCRUB_FEATURE_KEY, outcome);
|
|
81
|
+
}
|
|
82
|
+
catch { // @silent-fallback-ok — observability must never break the persist path; a metrics sink throw is dropped so the store write still completes.
|
|
83
|
+
/* metrics are best-effort — never break a durable write */
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
if (result.redactions.length === 0)
|
|
87
|
+
return;
|
|
88
|
+
this.maybeAlarm(store, kinds);
|
|
89
|
+
}
|
|
90
|
+
maybeAlarm(store, kinds) {
|
|
91
|
+
if (!this.onPoisoningSuspected)
|
|
92
|
+
return;
|
|
93
|
+
const t = this.now();
|
|
94
|
+
let state = this.poisoningState.get(store);
|
|
95
|
+
if (!state) {
|
|
96
|
+
state = { events: [], kinds: new Set(), alarmedAt: 0 };
|
|
97
|
+
this.poisoningState.set(store, state);
|
|
98
|
+
}
|
|
99
|
+
state.events.push(t);
|
|
100
|
+
for (const k of kinds)
|
|
101
|
+
state.kinds.add(k);
|
|
102
|
+
// Drop events outside the window.
|
|
103
|
+
const cutoff = t - this.poisoningWindowMs;
|
|
104
|
+
while (state.events.length > 0 && state.events[0] < cutoff)
|
|
105
|
+
state.events.shift();
|
|
106
|
+
if (state.events.length >= this.poisoningThreshold && state.alarmedAt < cutoff) {
|
|
107
|
+
state.alarmedAt = t;
|
|
108
|
+
const signal = {
|
|
109
|
+
store,
|
|
110
|
+
count: state.events.length,
|
|
111
|
+
kinds: [...state.kinds],
|
|
112
|
+
windowMs: this.poisoningWindowMs,
|
|
113
|
+
};
|
|
114
|
+
try {
|
|
115
|
+
this.onPoisoningSuspected(signal);
|
|
116
|
+
}
|
|
117
|
+
catch { // @silent-fallback-ok — the alarm callback is a signal-only escalation; a throw in the consumer must not break the durable write path.
|
|
118
|
+
/* escalation is best-effort — never break a durable write */
|
|
119
|
+
}
|
|
120
|
+
// Reset the window's kind set after alarming so a fresh burst re-signals.
|
|
121
|
+
state.kinds = new Set();
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Scrub a single durable string field. Returns the original text unchanged when
|
|
126
|
+
* disabled or in dryRun; the scrubbed text + provenance marker when enforcing.
|
|
127
|
+
* Metrics + poisoning alarm fire in BOTH dryRun and enforcing modes.
|
|
128
|
+
*/
|
|
129
|
+
scrub(input, ctx) {
|
|
130
|
+
if (!this.enabled) {
|
|
131
|
+
return { text: input, redactions: [], applied: false };
|
|
132
|
+
}
|
|
133
|
+
const result = scrubForStore(input, this.maxBytes != null ? { maxBytes: this.maxBytes } : {});
|
|
134
|
+
const kinds = result.redactions
|
|
135
|
+
.map((r) => r.kind)
|
|
136
|
+
.filter((k) => k !== 'scrub-error' && k !== 'oversize');
|
|
137
|
+
this.recordAndAlarm(ctx.store, result, kinds);
|
|
138
|
+
const hasRedaction = result.redactions.length > 0;
|
|
139
|
+
if (this.dryRun) {
|
|
140
|
+
// Canary: computed + recorded, but the ORIGINAL text is what persists.
|
|
141
|
+
return {
|
|
142
|
+
text: input,
|
|
143
|
+
redactions: result.redactions,
|
|
144
|
+
applied: false,
|
|
145
|
+
provenance: hasRedaction ? this.buildProvenance(result) : undefined,
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
// Enforcing: the scrubbed text persists, carrying the provenance marker.
|
|
149
|
+
return {
|
|
150
|
+
text: result.text,
|
|
151
|
+
redactions: result.redactions,
|
|
152
|
+
applied: hasRedaction,
|
|
153
|
+
provenance: hasRedaction ? this.buildProvenance(result) : undefined,
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Scrub the named string fields of a structured record before serialization
|
|
158
|
+
* (spec §2 — structured stores). Same dryRun/enforcing semantics as `scrub`.
|
|
159
|
+
*/
|
|
160
|
+
scrubRecord(record, fields, ctx) {
|
|
161
|
+
if (!this.enabled) {
|
|
162
|
+
return { record, redactions: [], applied: false };
|
|
163
|
+
}
|
|
164
|
+
const result = scrubStructured(record, fields, this.maxBytes != null ? { maxBytes: this.maxBytes } : {});
|
|
165
|
+
const kinds = result.redactions
|
|
166
|
+
.map((r) => r.kind)
|
|
167
|
+
.filter((k) => k !== 'scrub-error' && k !== 'oversize');
|
|
168
|
+
this.recordAndAlarm(ctx.store, { redactions: result.redactions, error: result.error }, kinds);
|
|
169
|
+
const hasRedaction = result.redactions.length > 0;
|
|
170
|
+
const provenance = hasRedaction
|
|
171
|
+
? this.buildProvenance({ redactions: result.redactions, truncated: result.truncated, error: result.error })
|
|
172
|
+
: undefined;
|
|
173
|
+
if (this.dryRun) {
|
|
174
|
+
return { record, redactions: result.redactions, applied: false, provenance };
|
|
175
|
+
}
|
|
176
|
+
return { record: result.record, redactions: result.redactions, applied: hasRedaction, provenance };
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
//# sourceMappingURL=DurableOutputScrubber.js.map
|