instar 1.3.819 → 1.3.821

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 (85) hide show
  1. package/dist/commands/server.d.ts.map +1 -1
  2. package/dist/commands/server.js +498 -3
  3. package/dist/commands/server.js.map +1 -1
  4. package/dist/config/ConfigDefaults.d.ts.map +1 -1
  5. package/dist/config/ConfigDefaults.js +69 -0
  6. package/dist/config/ConfigDefaults.js.map +1 -1
  7. package/dist/core/BackupManager.d.ts +10 -0
  8. package/dist/core/BackupManager.d.ts.map +1 -1
  9. package/dist/core/BackupManager.js +16 -0
  10. package/dist/core/BackupManager.js.map +1 -1
  11. package/dist/core/BoundedJsonlAudit.d.ts +37 -0
  12. package/dist/core/BoundedJsonlAudit.d.ts.map +1 -0
  13. package/dist/core/BoundedJsonlAudit.js +87 -0
  14. package/dist/core/BoundedJsonlAudit.js.map +1 -0
  15. package/dist/core/JudgmentProvenanceLog.d.ts +144 -0
  16. package/dist/core/JudgmentProvenanceLog.d.ts.map +1 -0
  17. package/dist/core/JudgmentProvenanceLog.js +301 -0
  18. package/dist/core/JudgmentProvenanceLog.js.map +1 -0
  19. package/dist/core/MachineIdentity.d.ts.map +1 -1
  20. package/dist/core/MachineIdentity.js +2 -0
  21. package/dist/core/MachineIdentity.js.map +1 -1
  22. package/dist/core/OwnerDarkLadder.d.ts +108 -0
  23. package/dist/core/OwnerDarkLadder.d.ts.map +1 -0
  24. package/dist/core/OwnerDarkLadder.js +229 -0
  25. package/dist/core/OwnerDarkLadder.js.map +1 -0
  26. package/dist/core/PostUpdateMigrator.d.ts +10 -0
  27. package/dist/core/PostUpdateMigrator.d.ts.map +1 -1
  28. package/dist/core/PostUpdateMigrator.js +106 -0
  29. package/dist/core/PostUpdateMigrator.js.map +1 -1
  30. package/dist/core/SpawnAdmission.d.ts +218 -0
  31. package/dist/core/SpawnAdmission.d.ts.map +1 -0
  32. package/dist/core/SpawnAdmission.js +440 -0
  33. package/dist/core/SpawnAdmission.js.map +1 -0
  34. package/dist/core/devGatedFeatures.d.ts.map +1 -1
  35. package/dist/core/devGatedFeatures.js +24 -0
  36. package/dist/core/devGatedFeatures.js.map +1 -1
  37. package/dist/core/machineCoherenceManifest.d.ts.map +1 -1
  38. package/dist/core/machineCoherenceManifest.js +30 -0
  39. package/dist/core/machineCoherenceManifest.js.map +1 -1
  40. package/dist/core/types.d.ts +87 -0
  41. package/dist/core/types.d.ts.map +1 -1
  42. package/dist/core/types.js.map +1 -1
  43. package/dist/monitoring/DuplicateSessionReconciler.d.ts +225 -0
  44. package/dist/monitoring/DuplicateSessionReconciler.d.ts.map +1 -0
  45. package/dist/monitoring/DuplicateSessionReconciler.js +544 -0
  46. package/dist/monitoring/DuplicateSessionReconciler.js.map +1 -0
  47. package/dist/monitoring/FailureAnalyzer.d.ts.map +1 -1
  48. package/dist/monitoring/FailureAnalyzer.js +40 -1
  49. package/dist/monitoring/FailureAnalyzer.js.map +1 -1
  50. package/dist/monitoring/FailureLedger.d.ts +9 -0
  51. package/dist/monitoring/FailureLedger.d.ts.map +1 -1
  52. package/dist/monitoring/FailureLedger.js +21 -4
  53. package/dist/monitoring/FailureLedger.js.map +1 -1
  54. package/dist/scaffold/templates.d.ts.map +1 -1
  55. package/dist/scaffold/templates.js +2 -1
  56. package/dist/scaffold/templates.js.map +1 -1
  57. package/dist/server/AgentServer.d.ts +5 -0
  58. package/dist/server/AgentServer.d.ts.map +1 -1
  59. package/dist/server/AgentServer.js +4 -0
  60. package/dist/server/AgentServer.js.map +1 -1
  61. package/dist/server/CapabilityIndex.d.ts.map +1 -1
  62. package/dist/server/CapabilityIndex.js +9 -0
  63. package/dist/server/CapabilityIndex.js.map +1 -1
  64. package/dist/server/fileRoutes.d.ts +16 -0
  65. package/dist/server/fileRoutes.d.ts.map +1 -1
  66. package/dist/server/fileRoutes.js +46 -0
  67. package/dist/server/fileRoutes.js.map +1 -1
  68. package/dist/server/routes.d.ts +7 -0
  69. package/dist/server/routes.d.ts.map +1 -1
  70. package/dist/server/routes.js +99 -0
  71. package/dist/server/routes.js.map +1 -1
  72. package/dist/testing/selfActionRegistry.d.ts.map +1 -1
  73. package/dist/testing/selfActionRegistry.js +89 -0
  74. package/dist/testing/selfActionRegistry.js.map +1 -1
  75. package/package.json +1 -1
  76. package/scripts/lib/self-action-detect.mjs +2 -0
  77. package/skills/instar-dev/templates/side-effects-artifact.md +8 -0
  78. package/skills/spec-converge/SKILL.md +1 -0
  79. package/skills/spec-converge/scripts/write-convergence-tag.mjs +71 -0
  80. package/src/data/builtin-manifest.json +65 -65
  81. package/src/scaffold/templates.ts +2 -1
  82. package/upgrades/1.3.820.md +25 -0
  83. package/upgrades/1.3.821.md +22 -0
  84. package/upgrades/side-effects/ownership-gated-spawn-increment-1.md +166 -0
  85. package/upgrades/side-effects/two-node-harness-increment2-entry-gate.md +64 -0
@@ -13484,6 +13484,105 @@ document.getElementById('mcpForm').addEventListener('submit', async function (e)
13484
13484
  }
13485
13485
  res.json(ctx.staleOwnerEngine.status());
13486
13486
  });
13487
+ // GET /pool/duplicate-reconciler — ownership-gated-spawn §3.8: the ONE status
13488
+ // surface for all three watchers (duplicate reconciler, owner-dark ladder,
13489
+ // SpawnAdmission error arm) — substrate readiness, per-tick counters, breaker
13490
+ // states, open episodes, and each watcher's ≤300s observability line (the
13491
+ // audit rows in logs/duplicate-reconciler.jsonl + logs/owner-dark-ladder.jsonl
13492
+ // surfaced as status, NEVER a push send). 503 when the layer is absent
13493
+ // (single-machine / pool dark).
13494
+ router.get('/pool/duplicate-reconciler', (_req, res) => {
13495
+ if (!ctx.duplicateReconciler && !ctx.spawnAdmission) {
13496
+ res.status(503).json({ error: 'ownership-gated spawn layer not constructed (single-machine / pool dark)' });
13497
+ return;
13498
+ }
13499
+ res.json({
13500
+ reconciler: ctx.duplicateReconciler?.status() ?? null,
13501
+ ownerDarkLadder: ctx.ownerDarkLadder?.status() ?? null,
13502
+ spawnAdmission: ctx.spawnAdmission?.status() ?? null,
13503
+ auditLocations: ['logs/duplicate-reconciler.jsonl', 'logs/owner-dark-ladder.jsonl'],
13504
+ });
13505
+ });
13506
+ // GET /pool/ownership-view?key=<sessionKey> — THIS machine's OWN ownership
13507
+ // registry read (deliberately proxy-free, unlike /pool/placement): the
13508
+ // reconciler's peer-echo confirmation (§3.2.3) asks each non-owner machine
13509
+ // whether ITS view now names the converged owner. Bearer-authed like every
13510
+ // route; returns record fields only, never payloads.
13511
+ router.get('/pool/ownership-view', (req, res) => {
13512
+ const key = typeof req.query.key === 'string' ? req.query.key.trim() : '';
13513
+ if (!key) {
13514
+ res.status(400).json({ error: 'key (query param) is required' });
13515
+ return;
13516
+ }
13517
+ if (!ctx.sessionOwnershipRegistry) {
13518
+ res.status(503).json({ error: 'session pool not available (dark / single-machine install)' });
13519
+ return;
13520
+ }
13521
+ try {
13522
+ const rec = ctx.sessionOwnershipRegistry.read(key);
13523
+ res.json({
13524
+ key,
13525
+ owner: rec ? ctx.sessionOwnershipRegistry.ownerOf(key) : null,
13526
+ epoch: rec?.ownershipEpoch ?? 0,
13527
+ status: rec?.status ?? null,
13528
+ });
13529
+ }
13530
+ catch (err) {
13531
+ res.status(500).json({ error: `ownership read failed: ${err instanceof Error ? err.message : String(err)}` });
13532
+ }
13533
+ });
13534
+ // GET /judgment-provenance — ownership-gated-spawn §3.5: REDACTED judgment
13535
+ // provenance rows only (the machine-local full context NEVER crosses this
13536
+ // surface — redaction is an invariant, enforced at write + by field omission
13537
+ // on read). ?limit= (default 100, max 1000), ?sinceHours=. ?scope=pool merges
13538
+ // peers' redacted rows as type/length-clamped untrusted data.
13539
+ router.get('/judgment-provenance', async (req, res) => {
13540
+ if (!ctx.judgmentProvenance) {
13541
+ res.status(503).json({ error: 'judgment-provenance log not constructed (single-machine / pool dark)' });
13542
+ return;
13543
+ }
13544
+ try {
13545
+ const limit = Math.min(Math.max(parseInt(String(req.query.limit ?? '100'), 10) || 100, 1), 1000);
13546
+ const sinceHours = parseFloat(String(req.query.sinceHours ?? '')) || 0;
13547
+ const sinceMs = sinceHours > 0 ? Date.now() - sinceHours * 3_600_000 : undefined;
13548
+ const rows = await ctx.judgmentProvenance.readRedacted({ limit, sinceMs });
13549
+ if (req.query.scope !== 'pool') {
13550
+ res.json({ rows, status: ctx.judgmentProvenance.status() });
13551
+ return;
13552
+ }
13553
+ // Pool scope: merge peers' REDACTED rows (each peer redacts on its own
13554
+ // serving machine) as clamped untrusted data — bounded per row + total.
13555
+ const peers = ctx.resolvePeerUrls?.() ?? [];
13556
+ const failed = [];
13557
+ const remote = [];
13558
+ await Promise.all(peers.map(async (p) => {
13559
+ try {
13560
+ const r = await fetch(`${p.url}/judgment-provenance?limit=${limit}${sinceHours ? `&sinceHours=${sinceHours}` : ''}`, {
13561
+ headers: { Authorization: `Bearer ${ctx.config.authToken}` },
13562
+ signal: AbortSignal.timeout(5000),
13563
+ });
13564
+ if (!r.ok) {
13565
+ failed.push({ machineId: p.machineId, error: `HTTP ${r.status}` });
13566
+ return;
13567
+ }
13568
+ const j = (await r.json());
13569
+ for (const row of (j.rows ?? []).slice(0, limit)) {
13570
+ const serialized = JSON.stringify(row);
13571
+ if (serialized.length > 8_192)
13572
+ continue; // clamp: oversized peer rows dropped
13573
+ remote.push({ ...row, machineId: p.machineId, remote: true });
13574
+ }
13575
+ }
13576
+ catch (err) {
13577
+ failed.push({ machineId: p.machineId, error: err instanceof Error ? err.name : 'unreachable' });
13578
+ }
13579
+ }));
13580
+ res.json({ rows: [...rows, ...remote].slice(0, limit * (peers.length + 1)), pool: { peersQueried: peers.length, failed }, status: ctx.judgmentProvenance.status() });
13581
+ }
13582
+ catch (err) {
13583
+ res.status(500).json({ error: `provenance read failed: ${err instanceof Error ? err.message : String(err)}` });
13584
+ }
13585
+ });
13487
13586
  // GET /pool/lease-handback — U4.4 (docs/specs/u4-4-lease-handback.md §4): the
13488
13587
  // hand-back reconciler's status (state machine position, hysteresis window,
13489
13588
  // latch visibility — "hand-back suppressed until <t> — operator flip", last