instar 1.3.489 → 1.3.490
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 +979 -28
- package/dist/commands/server.js.map +1 -1
- package/dist/config/ConfigDefaults.d.ts.map +1 -1
- package/dist/config/ConfigDefaults.js +23 -0
- package/dist/config/ConfigDefaults.js.map +1 -1
- package/dist/core/CodexResumeMap.d.ts +95 -0
- package/dist/core/CodexResumeMap.d.ts.map +1 -0
- package/dist/core/CodexResumeMap.js +283 -0
- package/dist/core/CodexResumeMap.js.map +1 -0
- package/dist/core/MeshRpc.d.ts +3 -0
- package/dist/core/MeshRpc.d.ts.map +1 -1
- package/dist/core/MeshRpc.js +5 -0
- package/dist/core/MeshRpc.js.map +1 -1
- package/dist/core/ModelSwapService.d.ts +26 -11
- package/dist/core/ModelSwapService.d.ts.map +1 -1
- package/dist/core/ModelSwapService.js +59 -21
- package/dist/core/ModelSwapService.js.map +1 -1
- package/dist/core/PostUpdateMigrator.d.ts +16 -0
- package/dist/core/PostUpdateMigrator.d.ts.map +1 -1
- package/dist/core/PostUpdateMigrator.js +62 -2
- package/dist/core/PostUpdateMigrator.js.map +1 -1
- package/dist/core/SessionManager.d.ts +4 -0
- package/dist/core/SessionManager.d.ts.map +1 -1
- package/dist/core/SessionManager.js +3 -0
- package/dist/core/SessionManager.js.map +1 -1
- package/dist/core/SessionRefresh.d.ts +36 -7
- package/dist/core/SessionRefresh.d.ts.map +1 -1
- package/dist/core/SessionRefresh.js +90 -29
- package/dist/core/SessionRefresh.js.map +1 -1
- package/dist/core/TopicProfileOrchestrator.d.ts +480 -0
- package/dist/core/TopicProfileOrchestrator.d.ts.map +1 -0
- package/dist/core/TopicProfileOrchestrator.js +1404 -0
- package/dist/core/TopicProfileOrchestrator.js.map +1 -0
- package/dist/core/TopicProfileResolver.d.ts +104 -0
- package/dist/core/TopicProfileResolver.d.ts.map +1 -0
- package/dist/core/TopicProfileResolver.js +231 -0
- package/dist/core/TopicProfileResolver.js.map +1 -0
- package/dist/core/TopicProfileStore.d.ts +308 -0
- package/dist/core/TopicProfileStore.d.ts.map +1 -0
- package/dist/core/TopicProfileStore.js +781 -0
- package/dist/core/TopicProfileStore.js.map +1 -0
- package/dist/core/TopicProfileTransferCarrier.d.ts +227 -0
- package/dist/core/TopicProfileTransferCarrier.d.ts.map +1 -0
- package/dist/core/TopicProfileTransferCarrier.js +533 -0
- package/dist/core/TopicProfileTransferCarrier.js.map +1 -0
- package/dist/core/TopicResumeMap.d.ts +67 -1
- package/dist/core/TopicResumeMap.d.ts.map +1 -1
- package/dist/core/TopicResumeMap.js +114 -1
- package/dist/core/TopicResumeMap.js.map +1 -1
- package/dist/core/classifyProfileChange.d.ts +83 -0
- package/dist/core/classifyProfileChange.d.ts.map +1 -0
- package/dist/core/classifyProfileChange.js +274 -0
- package/dist/core/classifyProfileChange.js.map +1 -0
- 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/frameworkSessionLaunch.d.ts +26 -0
- package/dist/core/frameworkSessionLaunch.d.ts.map +1 -1
- package/dist/core/frameworkSessionLaunch.js +58 -0
- package/dist/core/frameworkSessionLaunch.js.map +1 -1
- package/dist/core/slackRefreshBinding.d.ts +83 -0
- package/dist/core/slackRefreshBinding.d.ts.map +1 -0
- package/dist/core/slackRefreshBinding.js +54 -0
- package/dist/core/slackRefreshBinding.js.map +1 -0
- package/dist/core/topicProfileIngress.d.ts +128 -0
- package/dist/core/topicProfileIngress.d.ts.map +1 -0
- package/dist/core/topicProfileIngress.js +249 -0
- package/dist/core/topicProfileIngress.js.map +1 -0
- package/dist/core/topicProfileValidation.d.ts +109 -0
- package/dist/core/topicProfileValidation.d.ts.map +1 -0
- package/dist/core/topicProfileValidation.js +247 -0
- package/dist/core/topicProfileValidation.js.map +1 -0
- package/dist/core/topicProfileWriteSurface.d.ts +222 -0
- package/dist/core/topicProfileWriteSurface.d.ts.map +1 -0
- package/dist/core/topicProfileWriteSurface.js +631 -0
- package/dist/core/topicProfileWriteSurface.js.map +1 -0
- package/dist/core/types.d.ts +37 -0
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/types.js.map +1 -1
- package/dist/lifeline/TelegramLifeline.d.ts.map +1 -1
- package/dist/lifeline/TelegramLifeline.js +6 -0
- package/dist/lifeline/TelegramLifeline.js.map +1 -1
- package/dist/messaging/TelegramAdapter.d.ts +10 -1
- package/dist/messaging/TelegramAdapter.d.ts.map +1 -1
- package/dist/messaging/TelegramAdapter.js +41 -1
- package/dist/messaging/TelegramAdapter.js.map +1 -1
- package/dist/scaffold/templates.d.ts.map +1 -1
- package/dist/scaffold/templates.js +9 -0
- package/dist/scaffold/templates.js.map +1 -1
- package/dist/server/AgentServer.d.ts +32 -0
- package/dist/server/AgentServer.d.ts.map +1 -1
- package/dist/server/AgentServer.js +52 -3
- package/dist/server/AgentServer.js.map +1 -1
- package/dist/server/CapabilityIndex.d.ts.map +1 -1
- package/dist/server/CapabilityIndex.js +1 -0
- package/dist/server/CapabilityIndex.js.map +1 -1
- package/dist/server/routes.d.ts +17 -0
- package/dist/server/routes.d.ts.map +1 -1
- package/dist/server/routes.js +271 -1
- package/dist/server/routes.js.map +1 -1
- package/package.json +1 -1
- package/src/data/builtin-manifest.json +66 -66
- package/src/scaffold/templates.ts +9 -0
- package/upgrades/1.3.490.md +34 -0
- package/upgrades/side-effects/topic-profile.md +142 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TopicResumeMap.d.ts","sourceRoot":"","sources":["../../src/core/TopicResumeMap.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;
|
|
1
|
+
{"version":3,"file":"TopicResumeMap.d.ts","sourceRoot":"","sources":["../../src/core/TopicResumeMap.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAUH,gFAAgF;AAChF,MAAM,MAAM,gBAAgB,GAAG,MAAM,GAAG,gBAAgB,CAAC;AAEzD,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,2EAA2E;IAC3E,UAAU,CAAC,EAAE,gBAAgB,CAAC;IAC9B;;;;OAIG;IACH,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACxB;AAMD;;;;;;;;;;GAUG;AACH,MAAM,MAAM,eAAe,GAAG,CAAC,OAAO,EAAE,MAAM,KAAK;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAKzF,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,SAAS,CAAgC;gBAErC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM;IAMnE;;;;OAIG;IACH,OAAO,CAAC,oBAAoB;IAI5B;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAI7B;;;;;OAKG;IACH,qBAAqB,IAAI,MAAM,GAAG,IAAI;IAqCtC;;;;;;;OAOG;IACH,kBAAkB,CAAC,WAAW,EAAE,MAAM,EAAE,eAAe,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAUhF;;;;;OAKG;IACH,YAAY,CAAC,IAAI,EAAE,eAAe,GAAG,IAAI,GAAG,IAAI;IAIhD,OAAO,CAAC,UAAU;IAWlB;;;;;OAKG;IACH,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,GAAE,gBAAyB,GAAG,IAAI;IA4BrG;;;OAGG;IACH,GAAG,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAqBnC;;;;OAIG;IACH,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAQ1E;;;;OAIG;IACH,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,gBAAgB,GAAG,IAAI;IAMvD,qEAAqE;IACrE,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI;IAIhD,mFAAmF;IACnF,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IAmB3C,kFAAkF;IAClF,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAiBhC;;OAEG;IACH,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAU7B;;;;;;;;;OASG;IACH,qBAAqB,CAAC,aAAa,EAAE,GAAG,CAAC,MAAM,EAAE;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,eAAe,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,GAAG,IAAI;IA8E1G,OAAO,CAAC,IAAI;IAWZ;;;OAGG;IACH,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAIxC;;OAEG;IACH,OAAO,CAAC,WAAW;CA6BpB"}
|
|
@@ -15,12 +15,14 @@ import os from 'node:os';
|
|
|
15
15
|
import { spawnSync } from 'node:child_process';
|
|
16
16
|
import { findRolloutFileSync } from '../providers/adapters/openai-codex/observability/sessionPaths.js';
|
|
17
17
|
import { findGeminiSessionFileSync } from '../providers/adapters/gemini-cli/observability/sessionPaths.js';
|
|
18
|
+
import { DegradationReporter } from '../monitoring/DegradationReporter.js';
|
|
18
19
|
/** Entries older than 24 hours are pruned */
|
|
19
20
|
const MAX_AGE_MS = 24 * 60 * 60 * 1000;
|
|
20
21
|
export class TopicResumeMap {
|
|
21
22
|
filePath;
|
|
22
23
|
projectDir;
|
|
23
24
|
tmuxPath;
|
|
25
|
+
writeGate = null;
|
|
24
26
|
constructor(stateDir, projectDir, tmuxPath) {
|
|
25
27
|
this.filePath = path.join(stateDir, 'topic-resume-map.json');
|
|
26
28
|
this.projectDir = projectDir;
|
|
@@ -97,15 +99,43 @@ export class TopicResumeMap {
|
|
|
97
99
|
// to thread history than resume the wrong conversation.
|
|
98
100
|
return null;
|
|
99
101
|
}
|
|
102
|
+
/**
|
|
103
|
+
* Install the §8 profile write-gate (TOPIC-PROFILE-SPEC). All writers are
|
|
104
|
+
* gated at this single chokepoint — the heartbeat, the kill listener, the
|
|
105
|
+
* post-spawn save and the shutdown saves all land in save()/
|
|
106
|
+
* refreshResumeMappings. No gate installed ⇒ today's behavior (ungated).
|
|
107
|
+
*/
|
|
108
|
+
setWriteGate(gate) {
|
|
109
|
+
this.writeGate = gate;
|
|
110
|
+
}
|
|
111
|
+
gateAllows(topicId) {
|
|
112
|
+
if (!this.writeGate)
|
|
113
|
+
return true;
|
|
114
|
+
try {
|
|
115
|
+
return this.writeGate(topicId).allowed;
|
|
116
|
+
}
|
|
117
|
+
catch {
|
|
118
|
+
// A broken gate must not silence resume capture (the safe direction
|
|
119
|
+
// for an ungateable read is today's behavior).
|
|
120
|
+
return true;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
100
123
|
/**
|
|
101
124
|
* Persist a resume mapping before killing an idle session.
|
|
125
|
+
* Entries are framework-tagged ('claude-code' — this map only ever holds
|
|
126
|
+
* Claude JSONL UUIDs) and provenance-tagged (§8). A refused (gated) write
|
|
127
|
+
* is a silent no-op — the gate's caller owns disclosure.
|
|
102
128
|
*/
|
|
103
|
-
save(topicId, uuid, sessionName) {
|
|
129
|
+
save(topicId, uuid, sessionName, provenance = 'hook') {
|
|
130
|
+
if (!this.gateAllows(topicId))
|
|
131
|
+
return;
|
|
104
132
|
const map = this.load();
|
|
105
133
|
map[String(topicId)] = {
|
|
106
134
|
uuid,
|
|
107
135
|
savedAt: new Date().toISOString(),
|
|
108
136
|
sessionName,
|
|
137
|
+
framework: 'claude-code',
|
|
138
|
+
provenance,
|
|
109
139
|
};
|
|
110
140
|
// Prune old entries
|
|
111
141
|
const now = Date.now();
|
|
@@ -131,6 +161,9 @@ export class TopicResumeMap {
|
|
|
131
161
|
const entry = map[String(topicId)];
|
|
132
162
|
if (!entry)
|
|
133
163
|
return null;
|
|
164
|
+
// §8 — parked entries are ignored by resolution (recoverable via unpark).
|
|
165
|
+
if (entry.parked)
|
|
166
|
+
return null;
|
|
134
167
|
// Check age
|
|
135
168
|
if (Date.now() - new Date(entry.savedAt).getTime() > MAX_AGE_MS) {
|
|
136
169
|
return null;
|
|
@@ -141,6 +174,75 @@ export class TopicResumeMap {
|
|
|
141
174
|
}
|
|
142
175
|
return entry.uuid;
|
|
143
176
|
}
|
|
177
|
+
/**
|
|
178
|
+
* §8 last-line guard: the spawn path REFUSES a resume id whose framework
|
|
179
|
+
* tag mismatches the resolved framework, falling to CONTINUATION with
|
|
180
|
+
* disclosure. Untagged legacy entries grandfather as 'claude-code'.
|
|
181
|
+
*/
|
|
182
|
+
getForFramework(topicId, resolvedFramework) {
|
|
183
|
+
const entry = this.load()[String(topicId)];
|
|
184
|
+
if (!entry)
|
|
185
|
+
return null;
|
|
186
|
+
const tag = entry.framework ?? 'claude-code';
|
|
187
|
+
if (tag !== resolvedFramework)
|
|
188
|
+
return null;
|
|
189
|
+
return this.get(topicId);
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* §8 provenance read — the none-loss rows require HOOK provenance; an
|
|
193
|
+
* mtime-fallback-only entry classifies as CONTINUATION-class loss.
|
|
194
|
+
* Untagged legacy entries grandfather as 'hook' (provably safe).
|
|
195
|
+
*/
|
|
196
|
+
getProvenance(topicId) {
|
|
197
|
+
const entry = this.load()[String(topicId)];
|
|
198
|
+
if (!entry || entry.parked)
|
|
199
|
+
return null;
|
|
200
|
+
return entry.provenance ?? 'hook';
|
|
201
|
+
}
|
|
202
|
+
/** Raw entry (parked included) for the §8 park/un-park machinery. */
|
|
203
|
+
getEntryRaw(topicId) {
|
|
204
|
+
return this.load()[String(topicId)] ?? null;
|
|
205
|
+
}
|
|
206
|
+
/** §8 — "remove" means PARK, not delete (deletion destroys the cheap recovery). */
|
|
207
|
+
park(topicId, reason) {
|
|
208
|
+
const map = this.load();
|
|
209
|
+
const entry = map[String(topicId)];
|
|
210
|
+
if (!entry || entry.parked)
|
|
211
|
+
return;
|
|
212
|
+
entry.parked = reason;
|
|
213
|
+
try {
|
|
214
|
+
fs.writeFileSync(this.filePath, JSON.stringify(map, null, 2));
|
|
215
|
+
}
|
|
216
|
+
catch (err) {
|
|
217
|
+
console.error(`[TopicResumeMap] Failed to park: ${err}`);
|
|
218
|
+
DegradationReporter.getInstance().report({
|
|
219
|
+
feature: 'TopicResumeMap.park',
|
|
220
|
+
primary: "Park a topic's resume entry so resolution ignores it (§8 mid-framework-switch suppression)",
|
|
221
|
+
fallback: 'The entry stays live on disk — resolution keeps returning the old resume UUID',
|
|
222
|
+
reason: `Park write failed: ${err instanceof Error ? err.message : String(err)}`,
|
|
223
|
+
impact: 'A framework switch may resume the previous framework\'s transcript on the next spawn (the exact poisoning the park exists to prevent)',
|
|
224
|
+
});
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
/** §10.4 revert / §10.3 undo — un-park the entry. Returns true when un-parked. */
|
|
228
|
+
unpark(topicId) {
|
|
229
|
+
const map = this.load();
|
|
230
|
+
const entry = map[String(topicId)];
|
|
231
|
+
if (!entry?.parked)
|
|
232
|
+
return false;
|
|
233
|
+
entry.parked = null;
|
|
234
|
+
try {
|
|
235
|
+
fs.writeFileSync(this.filePath, JSON.stringify(map, null, 2));
|
|
236
|
+
}
|
|
237
|
+
catch (err) {
|
|
238
|
+
// @silent-fallback-ok: not silent — the write failure is logged and
|
|
239
|
+
// SURFACED to the caller via the boolean return; the §10.4 revert /
|
|
240
|
+
// §10.3 undo paths own disclosure of an undo that did not land.
|
|
241
|
+
console.error(`[TopicResumeMap] Failed to unpark: ${err}`);
|
|
242
|
+
return false;
|
|
243
|
+
}
|
|
244
|
+
return true;
|
|
245
|
+
}
|
|
144
246
|
/**
|
|
145
247
|
* Remove an entry after successful resume (prevents stale reuse).
|
|
146
248
|
*/
|
|
@@ -182,7 +284,15 @@ export class TopicResumeMap {
|
|
|
182
284
|
if (activeSessions.length === 0)
|
|
183
285
|
return;
|
|
184
286
|
for (const { topicId, sessionName, claudeSessionId } of activeSessions) {
|
|
287
|
+
// §8 writer gate — the heartbeat MUST NOT write a Claude JSONL UUID
|
|
288
|
+
// for a topic whose resolved profile framework is not claude-code,
|
|
289
|
+
// or that is mid-framework-switch (TOPIC-PROFILE-SPEC §8: this is
|
|
290
|
+
// the writer that would otherwise re-poison the map within a minute
|
|
291
|
+
// of a switch).
|
|
292
|
+
if (!this.gateAllows(topicId))
|
|
293
|
+
continue;
|
|
185
294
|
let uuid = null;
|
|
295
|
+
let provenance = 'hook';
|
|
186
296
|
if (claudeSessionId && this.jsonlExists(claudeSessionId)) {
|
|
187
297
|
// Authoritative: Claude Code reported its own session ID via hooks
|
|
188
298
|
uuid = claudeSessionId;
|
|
@@ -190,6 +300,7 @@ export class TopicResumeMap {
|
|
|
190
300
|
else if (activeSessions.length === 1) {
|
|
191
301
|
// Single session fallback: mtime-based is safe when there's no ambiguity
|
|
192
302
|
uuid = this.findClaudeSessionUuid();
|
|
303
|
+
provenance = 'mtime-fallback';
|
|
193
304
|
}
|
|
194
305
|
// With multiple sessions and no authoritative UUID, skip — don't guess
|
|
195
306
|
if (!uuid)
|
|
@@ -203,6 +314,8 @@ export class TopicResumeMap {
|
|
|
203
314
|
uuid,
|
|
204
315
|
savedAt: new Date().toISOString(),
|
|
205
316
|
sessionName,
|
|
317
|
+
framework: 'claude-code',
|
|
318
|
+
provenance,
|
|
206
319
|
};
|
|
207
320
|
updated++;
|
|
208
321
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TopicResumeMap.js","sourceRoot":"","sources":["../../src/core/TopicResumeMap.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,mBAAmB,EAAE,MAAM,kEAAkE,CAAC;AACvG,OAAO,EAAE,yBAAyB,EAAE,MAAM,gEAAgE,CAAC;
|
|
1
|
+
{"version":3,"file":"TopicResumeMap.js","sourceRoot":"","sources":["../../src/core/TopicResumeMap.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* classifyProfileChange — the §7 respawn classifier & swap-quality matrix
|
|
3
|
+
* (TOPIC-PROFILE-SPEC). Pure in-memory comparison, NO I/O.
|
|
4
|
+
*
|
|
5
|
+
* Picks the gentlest swap method for a profile change and states the honest
|
|
6
|
+
* expected context loss — including the contingencies (FABLE canary, Claude
|
|
7
|
+
* resume-UUID capture, Codex rollout-id capture, unverified thinking-toggle
|
|
8
|
+
* resume, unverified cross-model resume). The none-loss rows require HOOK
|
|
9
|
+
* provenance / fence-validated capture; anything weaker classifies to the
|
|
10
|
+
* disclosed-loss row — a wrong-conversation resume is worse than disclosed
|
|
11
|
+
* loss (§8).
|
|
12
|
+
*
|
|
13
|
+
* Classification chooses the METHOD only. Idle is a precondition RE-CHECKED
|
|
14
|
+
* at kill time inside the per-topic lock (§8 TOCTOU rule) — an unconfirmed
|
|
15
|
+
* idle read here fails toward kill+--resume (the safe, lossless direction,
|
|
16
|
+
* never an in-flight injection); at kill time unconfirmed is treated as busy.
|
|
17
|
+
*/
|
|
18
|
+
import type { TopicProfile } from './TopicProfileStore.js';
|
|
19
|
+
export type SwapMethod = 'in-flight' | 'resume' | 'continuation' | 'none';
|
|
20
|
+
export type ExpectedLoss = 'none' | 'recent-only';
|
|
21
|
+
export type IdleReading = 'confirmed-idle' | 'busy' | 'unconfirmed';
|
|
22
|
+
export interface ProfileSessionState {
|
|
23
|
+
/** False for a dormant topic (no live session) — change applies at next spawn. */
|
|
24
|
+
exists: boolean;
|
|
25
|
+
/** FABLE capture-pane idle confirmation (three-valued, §8). */
|
|
26
|
+
idle: IdleReading;
|
|
27
|
+
/** Pane-idle is not task-done: an active autonomous/time-boxed run is busy (§8). */
|
|
28
|
+
autonomousActive: boolean;
|
|
29
|
+
/** Protected sessions are never profile-killed (§8). */
|
|
30
|
+
isProtected: boolean;
|
|
31
|
+
/**
|
|
32
|
+
* §8 pre-kill predicate: the live session has a hook-reported
|
|
33
|
+
* claudeSessionId (or an existing HOOK-provenance resume entry) — not
|
|
34
|
+
* merely "an entry exists" (mtime-fallback entries classify as
|
|
35
|
+
* CONTINUATION-class loss).
|
|
36
|
+
*/
|
|
37
|
+
claudeResumeReady: boolean;
|
|
38
|
+
/** A fence-validated codex rollout-id is captured for this topic (§7). */
|
|
39
|
+
codexRolloutCaptured: boolean;
|
|
40
|
+
/**
|
|
41
|
+
* §14 runtime canary: a durable recent-confirmation marker (TTL) shows the
|
|
42
|
+
* FABLE in-flight swap actually confirming. No recent confirmation ⇒ the
|
|
43
|
+
* in-flight row is unavailable.
|
|
44
|
+
*/
|
|
45
|
+
inFlightSwapConfirmedRecently: boolean;
|
|
46
|
+
/** §6 — thinking off↔on toggle verified benign across --resume on the live CLI. */
|
|
47
|
+
thinkingOffOnResumeVerified: boolean;
|
|
48
|
+
/** §6 — thinking budget LEVEL change verified across --resume (round-4: same contingent cell). */
|
|
49
|
+
thinkingLevelResumeVerified: boolean;
|
|
50
|
+
/** §6 — MODEL change across --resume verified (round-4: wedge-class risk). */
|
|
51
|
+
crossModelResumeVerified: boolean;
|
|
52
|
+
/** §6 contingency — a launch-time thinking control exists for claude-code at all. */
|
|
53
|
+
claudeThinkingControlAvailable: boolean;
|
|
54
|
+
}
|
|
55
|
+
export interface ProfileChangeClassification {
|
|
56
|
+
requiresRespawn: boolean;
|
|
57
|
+
swapMethod: SwapMethod;
|
|
58
|
+
expectedLoss: ExpectedLoss;
|
|
59
|
+
reason: string;
|
|
60
|
+
/**
|
|
61
|
+
* True when the method is kill-bearing and the session is not
|
|
62
|
+
* confirmed-idle (busy/unconfirmed/autonomous) — §8 defers until idle.
|
|
63
|
+
*/
|
|
64
|
+
deferUntilIdle: boolean;
|
|
65
|
+
/**
|
|
66
|
+
* §7 busy framework switch: refuse-or-confirm, never a silent mid-work
|
|
67
|
+
* kill. (deferUntilIdle is also true; this adds the explicit-confirm arm.)
|
|
68
|
+
*/
|
|
69
|
+
refuseOrConfirm: boolean;
|
|
70
|
+
/** Protected sessions defer regardless of idle; 'switch now' never overrides (§8). */
|
|
71
|
+
protectedDeferral: boolean;
|
|
72
|
+
/**
|
|
73
|
+
* True when the respawn is a FRESH spawn (framework switch / unverified
|
|
74
|
+
* resume path) — the §8 kill path must PARK both resume stores' entries
|
|
75
|
+
* before the kill and suppress the save-on-kill listeners.
|
|
76
|
+
*/
|
|
77
|
+
freshRespawn: boolean;
|
|
78
|
+
/** Which profile axes changed (for disclosure text). */
|
|
79
|
+
changedFields: string[];
|
|
80
|
+
}
|
|
81
|
+
/** Classify a profile change against the live-session state. Pure, no I/O. */
|
|
82
|
+
export declare function classifyProfileChange(oldProfile: TopicProfile | null, newProfile: TopicProfile | null, session: ProfileSessionState): ProfileChangeClassification;
|
|
83
|
+
//# sourceMappingURL=classifyProfileChange.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"classifyProfileChange.d.ts","sourceRoot":"","sources":["../../src/core/classifyProfileChange.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAE3D,MAAM,MAAM,UAAU,GAAG,WAAW,GAAG,QAAQ,GAAG,cAAc,GAAG,MAAM,CAAC;AAC1E,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,aAAa,CAAC;AAClD,MAAM,MAAM,WAAW,GAAG,gBAAgB,GAAG,MAAM,GAAG,aAAa,CAAC;AAEpE,MAAM,WAAW,mBAAmB;IAClC,kFAAkF;IAClF,MAAM,EAAE,OAAO,CAAC;IAChB,+DAA+D;IAC/D,IAAI,EAAE,WAAW,CAAC;IAClB,oFAAoF;IACpF,gBAAgB,EAAE,OAAO,CAAC;IAC1B,wDAAwD;IACxD,WAAW,EAAE,OAAO,CAAC;IACrB;;;;;OAKG;IACH,iBAAiB,EAAE,OAAO,CAAC;IAC3B,0EAA0E;IAC1E,oBAAoB,EAAE,OAAO,CAAC;IAC9B;;;;OAIG;IACH,6BAA6B,EAAE,OAAO,CAAC;IACvC,mFAAmF;IACnF,2BAA2B,EAAE,OAAO,CAAC;IACrC,kGAAkG;IAClG,2BAA2B,EAAE,OAAO,CAAC;IACrC,8EAA8E;IAC9E,wBAAwB,EAAE,OAAO,CAAC;IAClC,qFAAqF;IACrF,8BAA8B,EAAE,OAAO,CAAC;CACzC;AAED,MAAM,WAAW,2BAA2B;IAC1C,eAAe,EAAE,OAAO,CAAC;IACzB,UAAU,EAAE,UAAU,CAAC;IACvB,YAAY,EAAE,YAAY,CAAC;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf;;;OAGG;IACH,cAAc,EAAE,OAAO,CAAC;IACxB;;;OAGG;IACH,eAAe,EAAE,OAAO,CAAC;IACzB,sFAAsF;IACtF,iBAAiB,EAAE,OAAO,CAAC;IAC3B;;;;OAIG;IACH,YAAY,EAAE,OAAO,CAAC;IACtB,wDAAwD;IACxD,aAAa,EAAE,MAAM,EAAE,CAAC;CACzB;AAWD,8EAA8E;AAC9E,wBAAgB,qBAAqB,CACnC,UAAU,EAAE,YAAY,GAAG,IAAI,EAC/B,UAAU,EAAE,YAAY,GAAG,IAAI,EAC/B,OAAO,EAAE,mBAAmB,GAC3B,2BAA2B,CA2Q7B"}
|
|
@@ -0,0 +1,274 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* classifyProfileChange — the §7 respawn classifier & swap-quality matrix
|
|
3
|
+
* (TOPIC-PROFILE-SPEC). Pure in-memory comparison, NO I/O.
|
|
4
|
+
*
|
|
5
|
+
* Picks the gentlest swap method for a profile change and states the honest
|
|
6
|
+
* expected context loss — including the contingencies (FABLE canary, Claude
|
|
7
|
+
* resume-UUID capture, Codex rollout-id capture, unverified thinking-toggle
|
|
8
|
+
* resume, unverified cross-model resume). The none-loss rows require HOOK
|
|
9
|
+
* provenance / fence-validated capture; anything weaker classifies to the
|
|
10
|
+
* disclosed-loss row — a wrong-conversation resume is worse than disclosed
|
|
11
|
+
* loss (§8).
|
|
12
|
+
*
|
|
13
|
+
* Classification chooses the METHOD only. Idle is a precondition RE-CHECKED
|
|
14
|
+
* at kill time inside the per-topic lock (§8 TOCTOU rule) — an unconfirmed
|
|
15
|
+
* idle read here fails toward kill+--resume (the safe, lossless direction,
|
|
16
|
+
* never an in-flight injection); at kill time unconfirmed is treated as busy.
|
|
17
|
+
*/
|
|
18
|
+
const AXES = ['framework', 'model', 'modelTier', 'thinkingMode', 'escalationOverride'];
|
|
19
|
+
function isOffOnToggle(a, b) {
|
|
20
|
+
const oldMode = a?.thinkingMode ?? null;
|
|
21
|
+
const newMode = b?.thinkingMode ?? null;
|
|
22
|
+
if (oldMode === newMode)
|
|
23
|
+
return false;
|
|
24
|
+
return oldMode === 'off' || newMode === 'off' || oldMode === null || newMode === null;
|
|
25
|
+
}
|
|
26
|
+
/** Classify a profile change against the live-session state. Pure, no I/O. */
|
|
27
|
+
export function classifyProfileChange(oldProfile, newProfile, session) {
|
|
28
|
+
const changedFields = AXES.filter((f) => (oldProfile?.[f] ?? null) !== (newProfile?.[f] ?? null));
|
|
29
|
+
const base = {
|
|
30
|
+
deferUntilIdle: false,
|
|
31
|
+
refuseOrConfirm: false,
|
|
32
|
+
protectedDeferral: false,
|
|
33
|
+
freshRespawn: false,
|
|
34
|
+
changedFields,
|
|
35
|
+
};
|
|
36
|
+
// §8 net-unchanged / no-effective-delta → zero respawns.
|
|
37
|
+
if (changedFields.length === 0) {
|
|
38
|
+
return {
|
|
39
|
+
...base,
|
|
40
|
+
requiresRespawn: false,
|
|
41
|
+
swapMethod: 'none',
|
|
42
|
+
expectedLoss: 'none',
|
|
43
|
+
reason: 'no effective profile change',
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
// escalationOverride alone never moves a live session — it is consulted by
|
|
47
|
+
// the escalation authority at its own decision points (§9).
|
|
48
|
+
const onlyEscalationOverride = changedFields.length === 1 && changedFields[0] === 'escalationOverride';
|
|
49
|
+
if (onlyEscalationOverride) {
|
|
50
|
+
return {
|
|
51
|
+
...base,
|
|
52
|
+
requiresRespawn: false,
|
|
53
|
+
swapMethod: 'none',
|
|
54
|
+
expectedLoss: 'none',
|
|
55
|
+
reason: 'escalation-override change — applies at the next escalation decision, no respawn',
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
// Dormant topic: the pin applies at the next natural spawn.
|
|
59
|
+
if (!session.exists) {
|
|
60
|
+
return {
|
|
61
|
+
...base,
|
|
62
|
+
requiresRespawn: false,
|
|
63
|
+
swapMethod: 'none',
|
|
64
|
+
expectedLoss: 'none',
|
|
65
|
+
reason: 'no live session — profile applies at the next session start',
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
const oldFramework = oldProfile?.framework ?? 'claude-code';
|
|
69
|
+
const newFramework = newProfile?.framework ?? oldFramework;
|
|
70
|
+
const frameworkSwitch = changedFields.includes('framework') && oldFramework !== newFramework;
|
|
71
|
+
const confirmedIdle = session.idle === 'confirmed-idle' && !session.autonomousActive;
|
|
72
|
+
const busyish = !confirmedIdle;
|
|
73
|
+
const killGuards = (cls) => ({
|
|
74
|
+
...cls,
|
|
75
|
+
deferUntilIdle: busyish,
|
|
76
|
+
protectedDeferral: session.isProtected,
|
|
77
|
+
});
|
|
78
|
+
// ── framework switch (the cold-rebuild path) ──────────────────────────
|
|
79
|
+
if (frameworkSwitch) {
|
|
80
|
+
if (busyish) {
|
|
81
|
+
// §7 busy row: refuse-or-confirm — never a silent mid-work kill.
|
|
82
|
+
return {
|
|
83
|
+
...base,
|
|
84
|
+
requiresRespawn: true,
|
|
85
|
+
swapMethod: 'continuation',
|
|
86
|
+
expectedLoss: 'recent-only',
|
|
87
|
+
reason: 'framework switch while the session is mid-task — refused until idle (or an explicit "switch now")',
|
|
88
|
+
deferUntilIdle: true,
|
|
89
|
+
refuseOrConfirm: true,
|
|
90
|
+
protectedDeferral: session.isProtected,
|
|
91
|
+
freshRespawn: true,
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
return killGuards({
|
|
95
|
+
...base,
|
|
96
|
+
requiresRespawn: true,
|
|
97
|
+
swapMethod: 'continuation',
|
|
98
|
+
expectedLoss: 'recent-only',
|
|
99
|
+
reason: 'framework switch — the full transcript cannot follow across frameworks; CONTINUATION carries recent history + memory',
|
|
100
|
+
refuseOrConfirm: false,
|
|
101
|
+
freshRespawn: true,
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
// ── same-framework changes ────────────────────────────────────────────
|
|
105
|
+
const modelChanged = changedFields.includes('model');
|
|
106
|
+
const tierChanged = changedFields.includes('modelTier');
|
|
107
|
+
const thinkingChanged = changedFields.includes('thinkingMode');
|
|
108
|
+
if (newFramework === 'codex-cli') {
|
|
109
|
+
// §7 Codex rows: none-loss IFF the fence-validated rollout-id is
|
|
110
|
+
// captured on THIS machine; else CONTINUATION, recent-only, disclosed.
|
|
111
|
+
if (session.codexRolloutCaptured) {
|
|
112
|
+
return killGuards({
|
|
113
|
+
...base,
|
|
114
|
+
requiresRespawn: true,
|
|
115
|
+
swapMethod: 'resume',
|
|
116
|
+
expectedLoss: 'none',
|
|
117
|
+
reason: 'codex change with a fence-validated rollout-id — kill + codex resume <rollout-id>',
|
|
118
|
+
refuseOrConfirm: false,
|
|
119
|
+
freshRespawn: false,
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
return killGuards({
|
|
123
|
+
...base,
|
|
124
|
+
requiresRespawn: true,
|
|
125
|
+
swapMethod: 'continuation',
|
|
126
|
+
expectedLoss: 'recent-only',
|
|
127
|
+
reason: 'codex change with NO captured rollout-id — fresh spawn, recent history only (disclosed)',
|
|
128
|
+
refuseOrConfirm: false,
|
|
129
|
+
freshRespawn: true,
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
if (newFramework !== 'claude-code') {
|
|
133
|
+
// gemini/pi: no resume verification surface wired — honest CONTINUATION.
|
|
134
|
+
return killGuards({
|
|
135
|
+
...base,
|
|
136
|
+
requiresRespawn: true,
|
|
137
|
+
swapMethod: 'continuation',
|
|
138
|
+
expectedLoss: 'recent-only',
|
|
139
|
+
reason: `${newFramework} profile change — no verified resume path; fresh spawn, recent history only`,
|
|
140
|
+
refuseOrConfirm: false,
|
|
141
|
+
freshRespawn: true,
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
// claude-code rows.
|
|
145
|
+
// thinkingMode with NO usable launch-time control: disclosed no-op (§6).
|
|
146
|
+
if (thinkingChanged && !modelChanged && !tierChanged && !session.claudeThinkingControlAvailable) {
|
|
147
|
+
return {
|
|
148
|
+
...base,
|
|
149
|
+
requiresRespawn: false,
|
|
150
|
+
swapMethod: 'none',
|
|
151
|
+
expectedLoss: 'none',
|
|
152
|
+
reason: 'claude thinking-mode control is not verifiable on the installed CLI — recorded, but a disclosed no-op until it is',
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
// modelTier pin (in-flight eligible row).
|
|
156
|
+
if (tierChanged && !modelChanged && !thinkingChanged) {
|
|
157
|
+
if (session.idle === 'confirmed-idle' && !session.autonomousActive && session.inFlightSwapConfirmedRecently) {
|
|
158
|
+
return killGuards({
|
|
159
|
+
...base,
|
|
160
|
+
requiresRespawn: false,
|
|
161
|
+
swapMethod: 'in-flight',
|
|
162
|
+
expectedLoss: 'none',
|
|
163
|
+
reason: 'tier pin on a confirmed-idle claude session with a recently-confirmed swap canary — in-flight /model swap',
|
|
164
|
+
refuseOrConfirm: false,
|
|
165
|
+
freshRespawn: false,
|
|
166
|
+
});
|
|
167
|
+
}
|
|
168
|
+
// Canary not recently confirmed, or idle unconfirmed/busy: fail toward
|
|
169
|
+
// kill+--resume (still none-loss, brief respawn). Cross-model resume
|
|
170
|
+
// applies — a tier change IS a model change at the transcript level.
|
|
171
|
+
if (!session.crossModelResumeVerified) {
|
|
172
|
+
return killGuards({
|
|
173
|
+
...base,
|
|
174
|
+
requiresRespawn: true,
|
|
175
|
+
swapMethod: 'continuation',
|
|
176
|
+
expectedLoss: 'recent-only',
|
|
177
|
+
reason: 'tier change without verified cross-model resume — fresh spawn (resuming across models risks the thinking-block wedge)',
|
|
178
|
+
refuseOrConfirm: false,
|
|
179
|
+
freshRespawn: true,
|
|
180
|
+
});
|
|
181
|
+
}
|
|
182
|
+
if (!session.claudeResumeReady) {
|
|
183
|
+
return killGuards({
|
|
184
|
+
...base,
|
|
185
|
+
requiresRespawn: true,
|
|
186
|
+
swapMethod: 'continuation',
|
|
187
|
+
expectedLoss: 'recent-only',
|
|
188
|
+
reason: 'tier change with no hook-captured resume UUID — fresh spawn, recent history only (disclosed)',
|
|
189
|
+
refuseOrConfirm: false,
|
|
190
|
+
freshRespawn: true,
|
|
191
|
+
});
|
|
192
|
+
}
|
|
193
|
+
return killGuards({
|
|
194
|
+
...base,
|
|
195
|
+
requiresRespawn: true,
|
|
196
|
+
swapMethod: 'resume',
|
|
197
|
+
expectedLoss: 'none',
|
|
198
|
+
reason: 'tier change — kill + claude --resume (in-flight row unavailable)',
|
|
199
|
+
refuseOrConfirm: false,
|
|
200
|
+
freshRespawn: false,
|
|
201
|
+
});
|
|
202
|
+
}
|
|
203
|
+
// Explicit model change (round-4: cross-model resume is wedge-class until verified).
|
|
204
|
+
if (modelChanged || tierChanged) {
|
|
205
|
+
if (!session.crossModelResumeVerified) {
|
|
206
|
+
return killGuards({
|
|
207
|
+
...base,
|
|
208
|
+
requiresRespawn: true,
|
|
209
|
+
swapMethod: 'continuation',
|
|
210
|
+
expectedLoss: 'recent-only',
|
|
211
|
+
reason: 'model change without verified cross-model resume — fresh spawn (resuming an old-model transcript risks the thinking-block wedge)',
|
|
212
|
+
refuseOrConfirm: false,
|
|
213
|
+
freshRespawn: true,
|
|
214
|
+
});
|
|
215
|
+
}
|
|
216
|
+
if (!session.claudeResumeReady) {
|
|
217
|
+
return killGuards({
|
|
218
|
+
...base,
|
|
219
|
+
requiresRespawn: true,
|
|
220
|
+
swapMethod: 'continuation',
|
|
221
|
+
expectedLoss: 'recent-only',
|
|
222
|
+
reason: 'model change with no hook-captured resume UUID — fresh spawn, recent history only (disclosed)',
|
|
223
|
+
refuseOrConfirm: false,
|
|
224
|
+
freshRespawn: true,
|
|
225
|
+
});
|
|
226
|
+
}
|
|
227
|
+
return killGuards({
|
|
228
|
+
...base,
|
|
229
|
+
requiresRespawn: true,
|
|
230
|
+
swapMethod: 'resume',
|
|
231
|
+
expectedLoss: 'none',
|
|
232
|
+
reason: 'model change — kill + claude --resume (full transcript)',
|
|
233
|
+
refuseOrConfirm: false,
|
|
234
|
+
freshRespawn: false,
|
|
235
|
+
});
|
|
236
|
+
}
|
|
237
|
+
// thinkingMode change (claude, control available).
|
|
238
|
+
const offOn = isOffOnToggle(oldProfile, newProfile);
|
|
239
|
+
const toggleVerified = offOn ? session.thinkingOffOnResumeVerified : session.thinkingLevelResumeVerified;
|
|
240
|
+
if (!toggleVerified) {
|
|
241
|
+
return killGuards({
|
|
242
|
+
...base,
|
|
243
|
+
requiresRespawn: true,
|
|
244
|
+
swapMethod: 'continuation',
|
|
245
|
+
expectedLoss: 'recent-only',
|
|
246
|
+
reason: offOn
|
|
247
|
+
? 'thinking off↔on toggle unverified across --resume — fresh spawn (the toggle is the documented wedge class)'
|
|
248
|
+
: 'thinking level change unverified across --resume — fresh spawn (disclosed)',
|
|
249
|
+
refuseOrConfirm: false,
|
|
250
|
+
freshRespawn: true,
|
|
251
|
+
});
|
|
252
|
+
}
|
|
253
|
+
if (!session.claudeResumeReady) {
|
|
254
|
+
return killGuards({
|
|
255
|
+
...base,
|
|
256
|
+
requiresRespawn: true,
|
|
257
|
+
swapMethod: 'continuation',
|
|
258
|
+
expectedLoss: 'recent-only',
|
|
259
|
+
reason: 'thinking change with no hook-captured resume UUID — fresh spawn, recent history only (disclosed)',
|
|
260
|
+
refuseOrConfirm: false,
|
|
261
|
+
freshRespawn: true,
|
|
262
|
+
});
|
|
263
|
+
}
|
|
264
|
+
return killGuards({
|
|
265
|
+
...base,
|
|
266
|
+
requiresRespawn: true,
|
|
267
|
+
swapMethod: 'resume',
|
|
268
|
+
expectedLoss: 'none',
|
|
269
|
+
reason: 'thinking change — kill + claude --resume (verified benign on the live CLI)',
|
|
270
|
+
refuseOrConfirm: false,
|
|
271
|
+
freshRespawn: false,
|
|
272
|
+
});
|
|
273
|
+
}
|
|
274
|
+
//# sourceMappingURL=classifyProfileChange.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"classifyProfileChange.js","sourceRoot":"","sources":["../../src/core/classifyProfileChange.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"devGatedFeatures.d.ts","sourceRoot":"","sources":["../../src/core/devGatedFeatures.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,oEAAoE;AACpE,MAAM,WAAW,eAAe;IAC9B,mEAAmE;IACnE,IAAI,EAAE,MAAM,CAAC;IACb,uEAAuE;IACvE,UAAU,EAAE,MAAM,CAAC;IACnB,6DAA6D;IAC7D,WAAW,EAAE,MAAM,CAAC;IACpB;;;;;;OAMG;IACH,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,eAAO,MAAM,kBAAkB,EAAE,eAAe,
|
|
1
|
+
{"version":3,"file":"devGatedFeatures.d.ts","sourceRoot":"","sources":["../../src/core/devGatedFeatures.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,oEAAoE;AACpE,MAAM,WAAW,eAAe;IAC9B,mEAAmE;IACnE,IAAI,EAAE,MAAM,CAAC;IACb,uEAAuE;IACvE,UAAU,EAAE,MAAM,CAAC;IACnB,6DAA6D;IAC7D,WAAW,EAAE,MAAM,CAAC;IACpB;;;;;;OAMG;IACH,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,eAAO,MAAM,kBAAkB,EAAE,eAAe,EAmE/C,CAAC;AAEF;;;;;;;;;;;;GAYG;AACH,MAAM,MAAM,gBAAgB,GACxB,aAAa,GACb,sBAAsB,GACtB,cAAc,GACd,iBAAiB,GACjB,0BAA0B,CAAC;AAE/B,MAAM,WAAW,iBAAiB;IAChC,uEAAuE;IACvE,UAAU,EAAE,MAAM,CAAC;IACnB,6CAA6C;IAC7C,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,mFAAmF;IACnF,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,eAAO,MAAM,oBAAoB,EAAE,iBAAiB,EAqGnD,CAAC;AAEF;;;GAGG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAO5E"}
|
|
@@ -84,6 +84,12 @@ export const DEV_GATED_FEATURES = [
|
|
|
84
84
|
description: 'Blocker Ledger — resolution pipeline + memory for Principle 1 (/blockers/*).',
|
|
85
85
|
justification: 'Signal-only local recorder (never blocks a message); file-JSON state, no egress, no destructive action; the only LLM use is one bounded (<=200-token) fail-closed B17 settle check on the rare true-blocker settle.',
|
|
86
86
|
},
|
|
87
|
+
{
|
|
88
|
+
name: 'topicProfiles',
|
|
89
|
+
configPath: 'topicProfiles.enabled',
|
|
90
|
+
description: 'Topic Profile — per-topic model/thinking/framework pins (TOPIC-PROFILE-SPEC).',
|
|
91
|
+
justification: 'Gate covers the WRITE path only (reads are always-on O(1) resolution) and ships dryRun:true (§14 shadow-field — logs intended respawns, performs none); no spend, no destructive action while the dry-run canary holds.',
|
|
92
|
+
},
|
|
87
93
|
];
|
|
88
94
|
export const DARK_GATE_EXCLUSIONS = [
|
|
89
95
|
// ── destructive — kills/deletes on a heuristic; off + dry-run for EVERYONE ──
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"devGatedFeatures.js","sourceRoot":"","sources":["../../src/core/devGatedFeatures.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"devGatedFeatures.js","sourceRoot":"","sources":["../../src/core/devGatedFeatures.ts"],"names":[],"mappings":"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"}
|