instar 1.3.1114 → 1.3.1116

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 (41) hide show
  1. package/dist/commands/server.d.ts.map +1 -1
  2. package/dist/commands/server.js +157 -124
  3. package/dist/commands/server.js.map +1 -1
  4. package/dist/core/CartographerNavigator.d.ts.map +1 -1
  5. package/dist/core/CartographerNavigator.js +8 -3
  6. package/dist/core/CartographerNavigator.js.map +1 -1
  7. package/dist/core/CartographerRootRegistry.d.ts +100 -0
  8. package/dist/core/CartographerRootRegistry.d.ts.map +1 -0
  9. package/dist/core/CartographerRootRegistry.js +306 -0
  10. package/dist/core/CartographerRootRegistry.js.map +1 -0
  11. package/dist/core/CartographerSweepEngine.d.ts +12 -0
  12. package/dist/core/CartographerSweepEngine.d.ts.map +1 -1
  13. package/dist/core/CartographerSweepEngine.js +81 -1
  14. package/dist/core/CartographerSweepEngine.js.map +1 -1
  15. package/dist/core/ScopeVerifier.d.ts +2 -0
  16. package/dist/core/ScopeVerifier.d.ts.map +1 -1
  17. package/dist/core/ScopeVerifier.js +8 -1
  18. package/dist/core/ScopeVerifier.js.map +1 -1
  19. package/dist/core/cartographerDetect.d.ts.map +1 -1
  20. package/dist/core/cartographerDetect.js +3 -1
  21. package/dist/core/cartographerDetect.js.map +1 -1
  22. package/dist/data/standards-guard-index.json +1 -1
  23. package/dist/data/standards-guard-index.meta.json +2 -2
  24. package/dist/data/standards-registry.meta.json +1 -1
  25. package/dist/server/AgentServer.d.ts +2 -0
  26. package/dist/server/AgentServer.d.ts.map +1 -1
  27. package/dist/server/AgentServer.js +1 -0
  28. package/dist/server/AgentServer.js.map +1 -1
  29. package/dist/server/routes.d.ts +4 -0
  30. package/dist/server/routes.d.ts.map +1 -1
  31. package/dist/server/routes.js +133 -87
  32. package/dist/server/routes.js.map +1 -1
  33. package/package.json +1 -1
  34. package/src/data/builtin-manifest.json +47 -47
  35. package/src/data/standards-guard-index.json +1 -1
  36. package/src/data/standards-guard-index.meta.json +2 -2
  37. package/src/data/standards-registry.meta.json +1 -1
  38. package/upgrades/1.3.1115.md +62 -0
  39. package/upgrades/1.3.1116.md +53 -0
  40. package/upgrades/side-effects/cartographer-project-aware-navigation.md +189 -0
  41. package/upgrades/side-effects/cartographer-source-tree-read.md +97 -0
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/commands/server.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AA8EH,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAU3D,OAAO,EAAE,eAAe,EAAiC,MAAM,iCAAiC,CAAC;AA0BjG,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAGvD,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAgI7D,OAAO,KAAK,EAAW,oBAAoB,EAAe,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACjG,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAgFtD;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,yBAAyB,CACvC,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EACf,gBAAgB,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAC1C,OAAO,CAUT;AAuID,UAAU,YAAY;IACpB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb;2DACuD;IACvD,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AA+rDD;;;;;;;;GAQG;AACH,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,YAAY,EACpB,YAAY,EAAE,oBAAoB,GAAG,IAAI,GACxC;IACD,YAAY,EAAE,oBAAoB,GAAG,IAAI,CAAC;IAC1C,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,OAAO,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS,CAAC;IAC3C,QAAQ,EAAE,MAAM,CAAC;CAClB,CAqBA;AAED,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,eAAe,EACzB,cAAc,EAAE,cAAc,EAC9B,YAAY,CAAC,EAAE,YAAY,EAC3B,WAAW,CAAC,EAAE,WAAW,EACzB,WAAW,CAAC,EAAE,WAAW,EACzB,iBAAiB,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,EAGvE,UAAU,CAAC,EAAE,MAAM,OAAO,8BAA8B,EAAE,WAAW,GAAG,IAAI,EAK5E,qBAAqB,CAAC,EAAE,MAAM,OAAO,gCAAgC,EAAE,kBAAkB,GAAG,IAAI,EAKhG,mBAAmB,CAAC,EAAE,MAAM,MAAM,GAAG,IAAI,GAAG,SAAS,EAQrD,oBAAoB,CAAC,EAAE,MAAM;IAC3B,YAAY,EAAE,OAAO,kBAAkB,EAAE,oBAAoB,GAAG,IAAI,CAAC;IACrE,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,OAAO,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS,CAAC;IAC3C,QAAQ,EAAE,MAAM,CAAC;CAClB,GAAG,IAAI,GACP,IAAI,CAwtBN;AAgmBD,wBAAsB,WAAW,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAk0qBtE;AAED,wBAAsB,UAAU,CAAC,OAAO,EAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAsDzE;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,aAAa,CAAC,OAAO,EAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAuD5E"}
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/commands/server.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AA8EH,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAU3D,OAAO,EAAE,eAAe,EAAiC,MAAM,iCAAiC,CAAC;AA0BjG,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAGvD,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AA+H7D,OAAO,KAAK,EAAW,oBAAoB,EAAe,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACjG,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAgFtD;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,yBAAyB,CACvC,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EACf,gBAAgB,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAC1C,OAAO,CAUT;AAuID,UAAU,YAAY;IACpB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb;2DACuD;IACvD,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AA+rDD;;;;;;;;GAQG;AACH,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,YAAY,EACpB,YAAY,EAAE,oBAAoB,GAAG,IAAI,GACxC;IACD,YAAY,EAAE,oBAAoB,GAAG,IAAI,CAAC;IAC1C,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,OAAO,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS,CAAC;IAC3C,QAAQ,EAAE,MAAM,CAAC;CAClB,CAqBA;AAED,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,eAAe,EACzB,cAAc,EAAE,cAAc,EAC9B,YAAY,CAAC,EAAE,YAAY,EAC3B,WAAW,CAAC,EAAE,WAAW,EACzB,WAAW,CAAC,EAAE,WAAW,EACzB,iBAAiB,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,EAGvE,UAAU,CAAC,EAAE,MAAM,OAAO,8BAA8B,EAAE,WAAW,GAAG,IAAI,EAK5E,qBAAqB,CAAC,EAAE,MAAM,OAAO,gCAAgC,EAAE,kBAAkB,GAAG,IAAI,EAKhG,mBAAmB,CAAC,EAAE,MAAM,MAAM,GAAG,IAAI,GAAG,SAAS,EAQrD,oBAAoB,CAAC,EAAE,MAAM;IAC3B,YAAY,EAAE,OAAO,kBAAkB,EAAE,oBAAoB,GAAG,IAAI,CAAC;IACrE,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,OAAO,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS,CAAC;IAC3C,QAAQ,EAAE,MAAM,CAAC;CAClB,GAAG,IAAI,GACP,IAAI,CAwtBN;AAgmBD,wBAAsB,WAAW,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAq2qBtE;AAED,wBAAsB,UAAU,CAAC,OAAO,EAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAsDzE;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,aAAa,CAAC,OAAO,EAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAuD5E"}
@@ -169,8 +169,7 @@ import { decryptFromSync, encryptForSync } from '../core/SecretStore.js';
169
169
  import { createPrivateKey, createPublicKey, createHash, randomBytes, randomInt } from 'node:crypto';
170
170
  import { sign as signEd25519, verify as verifyEd25519 } from '../core/MachineIdentity.js';
171
171
  import { ProjectMapper } from '../core/ProjectMapper.js';
172
- import { CartographerTree } from '../core/CartographerTree.js';
173
- import { populateCartographer } from '../core/cartographerPopulation.js';
172
+ import { CartographerRootRegistry } from '../core/CartographerRootRegistry.js';
174
173
  import { CapabilityMapper } from '../core/CapabilityMapper.js';
175
174
  import { ScopeVerifier } from '../core/ScopeVerifier.js';
176
175
  import { ContextHierarchy, checkDeclaredIdentityDirectory } from '../core/ContextHierarchy.js';
@@ -14296,6 +14295,14 @@ export async function startServer(options) {
14296
14295
  }
14297
14296
  sleepWakeDetector.start();
14298
14297
  // Project Map + Coherence Gate — spatial awareness and pre-action verification
14298
+ // ScopeVerifier is constructed before Cartographer because its persisted topic
14299
+ // bindings are now the typed provenance source for every live root selection.
14300
+ const scopeVerifier = new ScopeVerifier({
14301
+ projectDir: config.projectDir,
14302
+ stateDir: config.stateDir,
14303
+ projectName: config.projectName,
14304
+ });
14305
+ scopeVerifier.loadTopicBindings();
14299
14306
  const projectMapper = new ProjectMapper({ projectDir: config.projectDir, stateDir: config.stateDir });
14300
14307
  try {
14301
14308
  projectMapper.generateAndSave();
@@ -14309,44 +14316,63 @@ export async function startServer(options) {
14309
14316
  // (cartographer-doc-tree-schema spec #1). Ships dark behind cartographer.enabled;
14310
14317
  // null → /cartographer/* routes return 503.
14311
14318
  const cartographerEnabled = resolveDevAgentGate(config.cartographer?.enabled, config);
14312
- const cartographer = cartographerEnabled
14313
- ? new CartographerTree({ projectDir: config.projectDir, stateDir: config.stateDir })
14319
+ const fsCfg = config.cartographer?.freshnessSweep;
14320
+ const cartographerNum = (v, d) => (typeof v === 'number' && Number.isFinite(v) ? v : d);
14321
+ const cartographerRoots = cartographerEnabled
14322
+ ? new CartographerRootRegistry({
14323
+ agentType: config.agentType === 'standalone' ? 'standalone' : 'project-bound',
14324
+ agentHome: config.projectDir,
14325
+ agentName: config.projectName,
14326
+ stateDir: config.stateDir,
14327
+ ...(config.agentType === 'standalone'
14328
+ ? {}
14329
+ : {
14330
+ serverProject: {
14331
+ projectDir: config.projectDir,
14332
+ projectName: config.projectName,
14333
+ },
14334
+ }),
14335
+ // ScopeVerifier owns the live map; this accessor avoids synchronous
14336
+ // disk reads while still following route-driven binding updates.
14337
+ topicBindings: () => scopeVerifier.currentTopicBindings(),
14338
+ population: {
14339
+ config: {
14340
+ scaffoldChunkNodes: cartographerNum(fsCfg?.scaffoldChunkNodes, 500),
14341
+ detectTimeoutMs: cartographerNum(fsCfg?.detectTimeoutMs, 120000),
14342
+ detectWorkerHeapMb: cartographerNum(fsCfg?.detectWorkerHeapMb, 1536),
14343
+ maxIndexBytes: cartographerNum(fsCfg?.maxIndexBytes, 200 * 1024 * 1024),
14344
+ snapshotSampleMax: cartographerNum(fsCfg?.snapshotSampleMax, 500),
14345
+ gitMaxBuffer: cartographerNum(fsCfg?.gitMaxBuffer, 64 * 1024 * 1024),
14346
+ graceMs: cartographerNum(fsCfg?.cadenceMs, 600000) * 2,
14347
+ },
14348
+ },
14349
+ log: (message) => console.log(pc.yellow(` ${message}`)),
14350
+ })
14314
14351
  : null;
14315
- if (cartographer)
14316
- console.log(pc.green(' Cartographer doc-tree enabled'));
14352
+ if (cartographerRoots)
14353
+ console.log(pc.green(' Cartographer verified-root registry enabled'));
14317
14354
  // Zero-cost structural population is independent of the optional summary
14318
14355
  // author sweep. Refresh at every boot so newly-added/removed paths join the
14319
14356
  // hierarchy, then run aggregate-only detect in a worker and publish the
14320
14357
  // snapshot that /tree?format=compact + /health serve. No router, LLM, egress,
14321
14358
  // or freshnessSweep.enabled mutation occurs on this path.
14322
- const cartographerPopulationReady = cartographer
14323
- ? (() => {
14324
- const fsCfg = config.cartographer?.freshnessSweep;
14325
- const num = (v, d) => (typeof v === 'number' && Number.isFinite(v) ? v : d);
14326
- return populateCartographer({
14327
- tree: cartographer,
14328
- config: {
14329
- scaffoldChunkNodes: num(fsCfg?.scaffoldChunkNodes, 500),
14330
- detectTimeoutMs: num(fsCfg?.detectTimeoutMs, 120000),
14331
- detectWorkerHeapMb: num(fsCfg?.detectWorkerHeapMb, 1536),
14332
- maxIndexBytes: num(fsCfg?.maxIndexBytes, 200 * 1024 * 1024),
14333
- snapshotSampleMax: num(fsCfg?.snapshotSampleMax, 500),
14334
- gitMaxBuffer: num(fsCfg?.gitMaxBuffer, 64 * 1024 * 1024),
14335
- graceMs: num(fsCfg?.cadenceMs, 600000) * 2,
14336
- },
14337
- }).then((r) => {
14338
- if (r.refused) {
14339
- console.log(pc.yellow(` Cartographer population snapshot refused (${r.detectStatus}); retries next boot`));
14359
+ const cartographerPopulationReady = cartographerRoots
14360
+ ? cartographerRoots.populateOnBoot()
14361
+ .then((results) => {
14362
+ for (const result of results) {
14363
+ if (result.refused) {
14364
+ console.log(pc.yellow(` Cartographer population snapshot refused (${result.detectStatus}); retries next boot`));
14340
14365
  }
14341
14366
  else {
14342
- console.log(pc.gray(` Cartographer hierarchy populated (${r.nodeCount} nodes)`));
14367
+ console.log(pc.gray(` Cartographer hierarchy populated (${result.nodeCount} nodes, ${result.rootAuthority.verificationState})`));
14343
14368
  }
14344
- }).catch((err) => {
14345
- // @silent-fallback-ok — scaffold is atomic and boot remains available;
14346
- // prior snapshot/index stay readable and the next boot retries.
14347
- console.log(pc.yellow(` Cartographer population incomplete (retries next boot): ${err instanceof Error ? err.message : String(err)}`));
14348
- });
14349
- })()
14369
+ }
14370
+ })
14371
+ .catch((err) => {
14372
+ // @silent-fallback-ok scaffold is atomic and boot remains available;
14373
+ // prior snapshot/index stay readable and the next boot retries.
14374
+ console.log(pc.yellow(` Cartographer population incomplete (retries next boot): ${err instanceof Error ? err.message : String(err)}`));
14375
+ })
14350
14376
  : null;
14351
14377
  // Cartographer doc-freshness sweep (spec #2). In-process poller that authors
14352
14378
  // stale/never-authored node summaries on a LIGHT model routed OFF Claude.
@@ -14359,96 +14385,110 @@ export async function startServer(options) {
14359
14385
  // routing is an unrouted provider the sweep refuses to start (it could not enforce
14360
14386
  // off-Claude) — that cost-protecting probe is UNCHANGED.
14361
14387
  let cartographerSweepPoller = null;
14362
- if (cartographer) {
14363
- const fsCfg = config.cartographer?.freshnessSweep;
14388
+ if (cartographerRoots) {
14389
+ const paidFsCfg = config.cartographer?.freshnessSweep;
14364
14390
  const num = (v, d) => (typeof v === 'number' && Number.isFinite(v) ? v : d);
14365
- if (fsCfg?.enabled && sharedLlmQueue) {
14366
- const routerLike = sharedIntelligence &&
14367
- typeof sharedIntelligence.for === 'function' &&
14368
- typeof sharedIntelligence.defaultFramework === 'string'
14369
- ? sharedIntelligence
14370
- : null;
14371
- if (!routerLike) {
14372
- console.log(pc.yellow(' Cartographer sweep: NOT started (off-Claude routing requires the IntelligenceRouter)'));
14391
+ if (paidFsCfg?.enabled && sharedLlmQueue) {
14392
+ const backgroundResolution = cartographerRoots.resolve();
14393
+ if (!backgroundResolution.ok) {
14394
+ console.log(pc.yellow(` Cartographer sweep: NOT started (root authority ${backgroundResolution.reason})`));
14373
14395
  }
14374
14396
  else {
14375
- const { CartographerSweepEngine } = await import('../core/CartographerSweepEngine.js');
14376
- const { CartographerSweepPoller } = await import('../monitoring/CartographerSweepPoller.js');
14377
- const { sampleHostPressure: _sampleHostPressure } = await import('../monitoring/HostPressureSampler.js');
14378
- const rcfg = config.monitoring?.sessionReaper;
14379
- // Slice 3 (fix instar#1069): honor cartographer.freshnessSweep.framework as
14380
- // the sweep's routing so BOTH the routing PROBE and the actual author call
14381
- // resolve consistently (the router reads config.sessions.componentFrameworks
14382
- // live). EXPLICIT-SET-ONLY: a pre-existing overrides.CartographerSweep OR an
14383
- // explicitly-configured categories.job is never overridden (migration safety);
14384
- // otherwise freshnessSweep.framework becomes the sweep's effective override.
14385
- {
14386
- const { resolveSweepFrameworkRouting } = await import('../core/CartographerSweepEngine.js');
14387
- const cf = config.sessions?.componentFrameworks ?? {};
14388
- const sweepFw = typeof fsCfg.framework === 'string' ? fsCfg.framework : undefined;
14389
- const routed = resolveSweepFrameworkRouting(cf, sweepFw);
14390
- if (routed.injectOverride && routed.framework) {
14391
- // Inject so BOTH probeRouting and evaluate resolve consistently (router
14392
- // reads config.sessions.componentFrameworks live). Explicit-set-only.
14393
- const s = (config.sessions ??= {});
14394
- const c = (s.componentFrameworks ??= {});
14395
- (c.overrides ??= {}).CartographerSweep = routed.framework;
14396
- }
14397
- console.log(pc.gray(` Cartographer sweep routing: ${routed.framework ?? '(default)'} (source: ${routed.source})`));
14397
+ const cartographer = backgroundResolution.root.tree;
14398
+ const fsCfg = paidFsCfg;
14399
+ const routerLike = sharedIntelligence &&
14400
+ typeof sharedIntelligence.for === 'function' &&
14401
+ typeof sharedIntelligence.defaultFramework === 'string'
14402
+ ? sharedIntelligence
14403
+ : null;
14404
+ if (!routerLike) {
14405
+ console.log(pc.yellow(' Cartographer sweep: NOT started (off-Claude routing requires the IntelligenceRouter)'));
14398
14406
  }
14399
- const engine = new CartographerSweepEngine({
14400
- tree: cartographer,
14401
- router: routerLike,
14402
- llmQueue: sharedLlmQueue,
14403
- pressure: () => _sampleHostPressure({
14404
- cpuModerateLoadPerCore: rcfg?.cpuModerateLoadPerCore ?? 1.0,
14405
- cpuCriticalLoadPerCore: rcfg?.cpuCriticalLoadPerCore ?? 1.5,
14406
- }),
14407
- // Author ONLY on the lease holder (multi-machine burn fix); single-machine ⇒ always holder.
14408
- holdsLease: () => (leaseCoordinatorRef ? leaseCoordinatorRef.holdsLease() : true),
14409
- config: {
14410
- maxNodesPerPass: num(fsCfg.maxNodesPerPass, 25),
14411
- maxCentsPerPass: num(fsCfg.maxCentsPerPass, 25),
14412
- estCentsPerAuthor: num(fsCfg.estCentsPerAuthor, 1),
14413
- maxLeafBytes: num(fsCfg.maxLeafBytes, 24576),
14414
- minSummaryChars: num(fsCfg.minSummaryChars, 24),
14415
- maxSummaryChars: num(fsCfg.maxSummaryChars, 600),
14416
- allowClaudeFallback: fsCfg.allowClaudeFallback === true,
14417
- nodeFailQuarantineThreshold: num(fsCfg.nodeFailQuarantineThreshold, 3),
14418
- maxDeferredPasses: num(fsCfg.maxDeferredPasses, 5),
14419
- revalidateSamplePerPass: num(fsCfg.revalidateSamplePerPass, 2),
14420
- minNodesUnderPressure: num(fsCfg.minNodesUnderPressure, 3),
14421
- // fix instar#1069: off-event-loop detect knobs (worker by default).
14422
- detectInWorker: fsCfg.detectInWorker !== false,
14423
- detectTimeoutMs: num(fsCfg.detectTimeoutMs, 120000),
14424
- detectWorkerHeapMb: num(fsCfg.detectWorkerHeapMb, 1536),
14425
- maxIndexBytes: num(fsCfg.maxIndexBytes, 200 * 1024 * 1024),
14426
- snapshotSampleMax: num(fsCfg.snapshotSampleMax, 500),
14427
- gitMaxBuffer: num(fsCfg.gitMaxBuffer, 64 * 1024 * 1024),
14428
- detectCandidateHeadroom: num(fsCfg.detectCandidateHeadroom, 4),
14429
- detectGraceMs: num(fsCfg.cadenceMs, 600000) * 2,
14430
- },
14431
- stateDir: config.stateDir,
14432
- log: (m) => console.log(pc.gray(m)),
14433
- });
14434
- cartographerSweepPoller = new CartographerSweepPoller({
14435
- engine,
14436
- cadenceMs: num(fsCfg.cadenceMs, 600000),
14437
- idleCadenceMs: num(fsCfg.idleCadenceMs, 1800000),
14438
- zeroProgressTicksToBreak: num(fsCfg.zeroProgressTicksToBreak, 3),
14439
- breakerReescalateHours: num(fsCfg.breakerReescalateHours, 6),
14440
- log: (m) => console.log(pc.gray(m)),
14441
- reportDegradation: (d) => { try {
14442
- DegradationReporter.getInstance().report(d);
14407
+ else {
14408
+ const { CartographerSweepEngine } = await import('../core/CartographerSweepEngine.js');
14409
+ const { CartographerSweepPoller } = await import('../monitoring/CartographerSweepPoller.js');
14410
+ const { sampleHostPressure: _sampleHostPressure } = await import('../monitoring/HostPressureSampler.js');
14411
+ const rcfg = config.monitoring?.sessionReaper;
14412
+ // Slice 3 (fix instar#1069): honor cartographer.freshnessSweep.framework as
14413
+ // the sweep's routing so BOTH the routing PROBE and the actual author call
14414
+ // resolve consistently (the router reads config.sessions.componentFrameworks
14415
+ // live). EXPLICIT-SET-ONLY: a pre-existing overrides.CartographerSweep OR an
14416
+ // explicitly-configured categories.job is never overridden (migration safety);
14417
+ // otherwise freshnessSweep.framework becomes the sweep's effective override.
14418
+ {
14419
+ const { resolveSweepFrameworkRouting } = await import('../core/CartographerSweepEngine.js');
14420
+ const cf = config.sessions?.componentFrameworks ?? {};
14421
+ const sweepFw = typeof fsCfg.framework === 'string' ? fsCfg.framework : undefined;
14422
+ const routed = resolveSweepFrameworkRouting(cf, sweepFw);
14423
+ if (routed.injectOverride && routed.framework) {
14424
+ // Inject so BOTH probeRouting and evaluate resolve consistently (router
14425
+ // reads config.sessions.componentFrameworks live). Explicit-set-only.
14426
+ const s = (config.sessions ??= {});
14427
+ const c = (s.componentFrameworks ??= {});
14428
+ (c.overrides ??= {}).CartographerSweep = routed.framework;
14429
+ }
14430
+ console.log(pc.gray(` Cartographer sweep routing: ${routed.framework ?? '(default)'} (source: ${routed.source})`));
14443
14431
  }
14444
- catch { /* never break boot on a report */ } },
14445
- });
14446
- // Structural refresh owns the index first; only then may the optional
14447
- // author loop mutate it. This closes the boot scaffold/sweep write race.
14448
- void (cartographerPopulationReady ?? Promise.resolve()).then(() => {
14449
- cartographerSweepPoller?.start();
14450
- console.log(pc.green(' Cartographer doc-freshness sweep enabled (off-Claude, lease-gated)'));
14451
- });
14432
+ const engine = new CartographerSweepEngine({
14433
+ tree: cartographer,
14434
+ router: routerLike,
14435
+ llmQueue: sharedLlmQueue,
14436
+ pressure: () => _sampleHostPressure({
14437
+ cpuModerateLoadPerCore: rcfg?.cpuModerateLoadPerCore ?? 1.0,
14438
+ cpuCriticalLoadPerCore: rcfg?.cpuCriticalLoadPerCore ?? 1.5,
14439
+ }),
14440
+ // Author ONLY on the lease holder (multi-machine N× burn fix); single-machine ⇒ always holder.
14441
+ holdsLease: () => (leaseCoordinatorRef ? leaseCoordinatorRef.holdsLease() : true),
14442
+ authorizePaidAuthoring: () => {
14443
+ const decision = cartographerRoots.authorizePaidAuthoring(backgroundResolution.root);
14444
+ return decision.ok
14445
+ ? { ok: true }
14446
+ : { ok: false, reason: decision.reason };
14447
+ },
14448
+ config: {
14449
+ maxNodesPerPass: num(fsCfg.maxNodesPerPass, 25),
14450
+ maxCentsPerPass: num(fsCfg.maxCentsPerPass, 25),
14451
+ estCentsPerAuthor: num(fsCfg.estCentsPerAuthor, 1),
14452
+ maxLeafBytes: num(fsCfg.maxLeafBytes, 24576),
14453
+ minSummaryChars: num(fsCfg.minSummaryChars, 24),
14454
+ maxSummaryChars: num(fsCfg.maxSummaryChars, 600),
14455
+ allowClaudeFallback: fsCfg.allowClaudeFallback === true,
14456
+ nodeFailQuarantineThreshold: num(fsCfg.nodeFailQuarantineThreshold, 3),
14457
+ maxDeferredPasses: num(fsCfg.maxDeferredPasses, 5),
14458
+ revalidateSamplePerPass: num(fsCfg.revalidateSamplePerPass, 2),
14459
+ minNodesUnderPressure: num(fsCfg.minNodesUnderPressure, 3),
14460
+ // fix instar#1069: off-event-loop detect knobs (worker by default).
14461
+ detectInWorker: fsCfg.detectInWorker !== false,
14462
+ detectTimeoutMs: num(fsCfg.detectTimeoutMs, 120000),
14463
+ detectWorkerHeapMb: num(fsCfg.detectWorkerHeapMb, 1536),
14464
+ maxIndexBytes: num(fsCfg.maxIndexBytes, 200 * 1024 * 1024),
14465
+ snapshotSampleMax: num(fsCfg.snapshotSampleMax, 500),
14466
+ gitMaxBuffer: num(fsCfg.gitMaxBuffer, 64 * 1024 * 1024),
14467
+ detectCandidateHeadroom: num(fsCfg.detectCandidateHeadroom, 4),
14468
+ detectGraceMs: num(fsCfg.cadenceMs, 600000) * 2,
14469
+ },
14470
+ stateDir: config.stateDir,
14471
+ log: (m) => console.log(pc.gray(m)),
14472
+ });
14473
+ cartographerSweepPoller = new CartographerSweepPoller({
14474
+ engine,
14475
+ cadenceMs: num(fsCfg.cadenceMs, 600000),
14476
+ idleCadenceMs: num(fsCfg.idleCadenceMs, 1800000),
14477
+ zeroProgressTicksToBreak: num(fsCfg.zeroProgressTicksToBreak, 3),
14478
+ breakerReescalateHours: num(fsCfg.breakerReescalateHours, 6),
14479
+ log: (m) => console.log(pc.gray(m)),
14480
+ reportDegradation: (d) => { try {
14481
+ DegradationReporter.getInstance().report(d);
14482
+ }
14483
+ catch { /* never break boot on a report */ } },
14484
+ });
14485
+ // Structural refresh owns the index first; only then may the optional
14486
+ // author loop mutate it. This closes the boot scaffold/sweep write race.
14487
+ void (cartographerPopulationReady ?? Promise.resolve()).then(() => {
14488
+ cartographerSweepPoller?.start();
14489
+ console.log(pc.green(' Cartographer doc-freshness sweep enabled (off-Claude, lease-gated)'));
14490
+ });
14491
+ }
14452
14492
  }
14453
14493
  }
14454
14494
  }
@@ -14620,13 +14660,6 @@ export async function startServer(options) {
14620
14660
  // @silent-fallback-ok — capability map non-critical at startup
14621
14661
  console.error(` Capability map generation failed (non-critical): ${err.message}`);
14622
14662
  });
14623
- const scopeVerifier = new ScopeVerifier({
14624
- projectDir: config.projectDir,
14625
- stateDir: config.stateDir,
14626
- projectName: config.projectName,
14627
- });
14628
- // Load any persisted topic-project bindings
14629
- scopeVerifier.loadTopicBindings();
14630
14663
  // Context Hierarchy — tiered context loading for session efficiency
14631
14664
  const contextHierarchy = new ContextHierarchy({
14632
14665
  stateDir: config.stateDir,
@@ -23649,7 +23682,7 @@ export async function startServer(options) {
23649
23682
  userDirected: true, status: 'open', assignee: null, priority: 'medium',
23650
23683
  })),
23651
23684
  });
23652
- const server = new AgentServer({ config, subscriptionEmailBinding: credentialLocationLedger, subscriptionEmailBarrier, subscriptionIdentityOracle: credentialIdentityOracle, sessionManager, llmQueue: sharedLlmQueue, state, scheduler, telegram, relationships, feedback, feedbackAnomalyDetector, dispatches, updateChecker, autoUpdater, autoDispatcher, quotaTracker, quotaManager, publisher, viewer, tunnel, evolution, watchdog, topicMemory, triageNurse, projectMapper, cartographer: cartographer ?? undefined, coherenceGate: scopeVerifier, contextHierarchy, canonicalState, operationGate, sentinel, adaptiveTrust, memoryMonitor, orphanReaper, coherenceMonitor, commitmentTracker, subscriptionPool, accountFollowMePeerViews: async () => { const nickById = new Map((_listPoolMachines?.() ?? []).map((m) => [m.machineId, m.nickname ?? m.machineId])); let peers = (_resolvePeerUrls?.() ?? []).map((p) => ({ machineId: p.machineId, nickname: nickById.get(p.machineId) ?? p.machineId, url: p.url })); if (peers.length === 0) {
23685
+ const server = new AgentServer({ config, subscriptionEmailBinding: credentialLocationLedger, subscriptionEmailBarrier, subscriptionIdentityOracle: credentialIdentityOracle, sessionManager, llmQueue: sharedLlmQueue, state, scheduler, telegram, relationships, feedback, feedbackAnomalyDetector, dispatches, updateChecker, autoUpdater, autoDispatcher, quotaTracker, quotaManager, publisher, viewer, tunnel, evolution, watchdog, topicMemory, triageNurse, projectMapper, cartographerRoots: cartographerRoots ?? undefined, coherenceGate: scopeVerifier, contextHierarchy, canonicalState, operationGate, sentinel, adaptiveTrust, memoryMonitor, orphanReaper, coherenceMonitor, commitmentTracker, subscriptionPool, accountFollowMePeerViews: async () => { const nickById = new Map((_listPoolMachines?.() ?? []).map((m) => [m.machineId, m.nickname ?? m.machineId])); let peers = (_resolvePeerUrls?.() ?? []).map((p) => ({ machineId: p.machineId, nickname: nickById.get(p.machineId) ?? p.machineId, url: p.url })); if (peers.length === 0) {
23653
23686
  peers = (_listPoolMachines?.() ?? []).filter((m) => m.machineId !== _meshSelfId && !!m.lastKnownUrl).map((m) => ({ machineId: m.machineId, nickname: m.nickname ?? m.machineId, url: m.lastKnownUrl }));
23654
23687
  } if (peers.length === 0)
23655
23688
  return []; const { fetchPeerSubscriptionViews } = await import('../core/fetchPeerSubscriptionViews.js'); return fetchPeerSubscriptionViews({ peers: () => peers, fetchImpl: fetch, authToken: config.authToken ?? '' }); }, quotaPoller, quotaAwareScheduler: _quotaAwareScheduler ?? undefined, proactiveSwapMonitor: _proactiveSwapMonitor ?? undefined, inUseAccountResolver, enrollmentWizard, accountFollowMeRevocation, credentialRepointing, semanticMemory, activitySentinel, rateLimitSentinel, releaseReadinessSentinel: releaseReadinessSentinel ?? undefined, greenPrAutoMerger: greenPrAutoMerger ?? undefined, guardLatchStore: guardLatchStore ?? undefined, messageRouter, summarySentinel, spawnManager, systemReviewer, capabilityMapper, selfKnowledgeTree, coverageAuditor, topicResumeMap: _topicResumeMap ?? undefined, topicProfile: _topicProfileCtx ?? undefined, sessionRefresh: _sessionRefresh ?? undefined, autonomyManager, trustElevationTracker, autonomousEvolution, coordinator: coordinator.enabled ? coordinator : undefined, meshBindActive: coordinator.managers.identityManager.hasIdentity() && config.multiMachine?.meshTransport?.enabled !== false, localSigningKeyPem, leaseTransport, peerEndpointRecorder, getSelfMeshEndpoints, onLeasePullRequest: () => leaseCoordinatorRef?.currentLease() ?? null, liveTailReceiver, handoffWireTransport, onHandoffBegin, onHandoffInitiate: handoffInitiate, handoffInProgress: handoffSentinelInProgress, messageLedger, currentInboundByTopic, replyMarkerTransport, onReplyMarker: messageLedger ? (marker) => { const m = marker; messageLedger.applyRemoteReplyMarker(m.dedupeKey, { platform: m.platform, replyIdempotencyKey: m.replyIdempotencyKey, epoch: m.epoch, topic: m.topic ?? null }); } : undefined, whatsapp: whatsappAdapter, slack: slackAdapter, imessage: imessageAdapter, conversationRegistry, conversationBindAuth, conversationFollowThrough, whatsappBusinessBackend, messageBridge, hookEventReceiver, worktreeMonitor, subagentTracker, instructionsVerifier, handshakeManager: threadlineHandshake, threadlineRouter, conversationStore, threadLog, threadMessageRecorder, warrantsReplyGate, collaborationSurfacer, threadResumeMap, topicLinkageHandler: topicLinkageHandler ?? undefined, threadlineRelayClient, getLastRelayEvent: threadlineGetLastRelayEvent, threadlineReplyWaiters, listenerManager: listenerManager ?? undefined, a2aDeliveryTracker: a2aDeliveryTracker ?? undefined, responseReviewGate, reviewCanaryBattery, messagingToneGate, outboundDedupGate, telemetryHeartbeat, pasteManager, featureRegistry, discoveryEvaluator, completionEvaluator, unifiedTrust, liveConfig, sharedStateLedger, ledgerSessionRegistry, worktreeManager, oidcEnrolledRepos: parallelDevConfig?.oidcEnrolledRepos, initiativeTracker, projectRoundRunner, projectDriftChecker, machineHeartbeat, machinePoolRegistry, ropeHealthMonitor, writeAdmission: writeAdmission ?? undefined, getInboundQueue: () => _inboundQueue, getMachineCoherence: () => _machineCoherenceSentinel, getSingleMachineFailoverGap: () => _singleMachineFailoverGap, getMissingLoginSession: () => _missingLoginSession, getSessionPoolFailoverRunner: () => _sessionPoolFailoverRunnerDriver?.status() ?? null, sessionPoolPromotionActivation: _sessionPoolPromotionActivation, meshRpcDispatcher, deliverA2aToMachine: _deliverA2aToMachine ?? undefined, workingSetPullCoordinator, workingSetArtifactManager, orchestratorPoller, commitmentReplicaStore, preferenceReplicaStore, replicatedRecordEmitter, conflictStore, rollbackUnmerge, droppedOriginRegistry, preferencesUnionReader, forwardCommitmentMutate, sessionOwnershipRegistry, sendDrain: _sendDrain ?? undefined, topicPinStore: _topicPinStore ?? undefined, topicPinSkewQuarantine: _topicPinSkewQuarantine ?? undefined, topicPinFoldView: _topicPinFoldView ?? undefined, ownershipReconciler: _ownershipReconciler ?? undefined, staleOwnerEngine: _staleOwnerEngine ?? undefined, duplicateReconciler: _duplicateReconciler ?? undefined, ownerDarkLadder: _ownerDarkLadder ?? undefined, spawnAdmission: _spawnAdmission ?? undefined, judgmentProvenance: _judgmentProvenance ?? undefined, leaseHandback: _leaseHandbackCtx ?? undefined, streamTicketStore: _streamTicketStore ?? undefined, poolStreamAllowRemoteInput: config.dashboard?.poolStream?.allowRemoteInput ?? false, poolStreamConnector: _poolStreamConnector ?? undefined, secretSync: _secretSyncHandle ?? undefined, meshSelfId: _meshSelfId ?? undefined, resolveRouterUrl: _resolveRouterUrl ?? undefined, resolvePeerUrls: _resolvePeerUrls ?? undefined, guardRegistry, listPoolMachines: _listPoolMachines ?? undefined, deliverMandateToMachine: _deliverMandateToMachine ?? undefined, poolLink: _poolLink ?? undefined, poolPollCache: _poolPollCache ?? undefined, sessionPoolE2EResultStore, proxyCoordinator, topicIntentStore, topicIntentArcCheck, usherSignalStore, intelligence: sharedIntelligence ?? undefined, telegramBridgeConfig, telegramBridge: telegramBridge ?? undefined, threadlineObservability, briefDeps, workingMemory, taskFlowRegistry, threadlineFlowBridge, sessionReaper, agentWorktreeReaper, externalHogSentinel, orphanedWorkSentinel, mcpProcessReaper, geminiLoopRunner, sleepController, agentActivityState, reapLog, resumeQueue, resumeDrainer, autonomousLivenessReconciler, enforcedTerminationStatus: () => enforcedTerminationWatchdog?.guardStatus() ?? null, prHandLease: prHandLease ?? undefined, operatorStopRecorder: recordOperatorStop, sleepWakeDetector, unjustifiedStopGate, stopGateDb, stopNotifier, liveTestGate, liveTestGateMode, liveTestRunnerCtx }); // Resolve the late-bound topic-operator getter (increment 2e): routing was