instar 1.3.592 → 1.3.593

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 (37) hide show
  1. package/dist/commands/server.d.ts.map +1 -1
  2. package/dist/commands/server.js +5 -0
  3. package/dist/commands/server.js.map +1 -1
  4. package/dist/core/PostUpdateMigrator.d.ts +10 -0
  5. package/dist/core/PostUpdateMigrator.d.ts.map +1 -1
  6. package/dist/core/PostUpdateMigrator.js +83 -12
  7. package/dist/core/PostUpdateMigrator.js.map +1 -1
  8. package/dist/core/types.d.ts +15 -0
  9. package/dist/core/types.d.ts.map +1 -1
  10. package/dist/core/types.js.map +1 -1
  11. package/dist/monitoring/GreenPrAutoMerger.d.ts +90 -5
  12. package/dist/monitoring/GreenPrAutoMerger.d.ts.map +1 -1
  13. package/dist/monitoring/GreenPrAutoMerger.js +269 -6
  14. package/dist/monitoring/GreenPrAutoMerger.js.map +1 -1
  15. package/dist/monitoring/MergeRunner.d.ts +21 -0
  16. package/dist/monitoring/MergeRunner.d.ts.map +1 -1
  17. package/dist/monitoring/MergeRunner.js +33 -5
  18. package/dist/monitoring/MergeRunner.js.map +1 -1
  19. package/dist/monitoring/greenPrAutomergeWiring.d.ts +7 -0
  20. package/dist/monitoring/greenPrAutomergeWiring.d.ts.map +1 -1
  21. package/dist/monitoring/greenPrAutomergeWiring.js +44 -2
  22. package/dist/monitoring/greenPrAutomergeWiring.js.map +1 -1
  23. package/dist/monitoring/greenPrLogic.d.ts +39 -1
  24. package/dist/monitoring/greenPrLogic.d.ts.map +1 -1
  25. package/dist/monitoring/greenPrLogic.js +33 -1
  26. package/dist/monitoring/greenPrLogic.js.map +1 -1
  27. package/dist/server/CapabilityIndex.js +1 -1
  28. package/dist/server/CapabilityIndex.js.map +1 -1
  29. package/dist/server/routes.d.ts.map +1 -1
  30. package/dist/server/routes.js +29 -4
  31. package/dist/server/routes.js.map +1 -1
  32. package/package.json +1 -1
  33. package/scripts/safe-merge.mjs +27 -1
  34. package/src/data/builtin-manifest.json +63 -63
  35. package/upgrades/1.3.593.md +28 -0
  36. package/upgrades/side-effects/mergerunner-auto-arm-handoff-parity-track.md +60 -0
  37. package/upgrades/side-effects/mergerunner-auto-arm-handoff.md +48 -0
@@ -7056,12 +7056,19 @@ export function createRoutes(ctx) {
7056
7056
  }
7057
7057
  const state = ctx.greenPrAutoMerger.snapshot();
7058
7058
  const latch = ctx.guardLatchStore?.snapshot() ?? null;
7059
+ // mergerunner-auto-arm-handoff: armed/armed-overdue is first-class observable
7060
+ // (Observable Intelligence — an in-flight autonomous merge must never be
7061
+ // invisible). NON-OPTIONAL — a NUMBER (0) / EMPTY ARRAY when nothing is armed.
7062
+ const armedEpisodes = Object.values(state.episodes ?? {}).filter((e) => e.armedAt != null);
7063
+ const armed = armedEpisodes.map((e) => ({ pr: e.pr, armedAt: e.armedAt ?? null, armedHead: e.armedHead ?? null, overdue: e.overdue === true }));
7059
7064
  res.json({
7060
7065
  lastTickAt: state.lastTickAt ?? null,
7061
7066
  lastSuccessfulListAt: state.lastSuccessfulListAt ?? null,
7062
7067
  consecutiveWarmupOnlyTenures: state.consecutiveWarmupOnlyTenures,
7063
7068
  breaker: state.breaker,
7064
7069
  episodes: Object.values(state.episodes ?? {}),
7070
+ armedCount: armed.length,
7071
+ armed,
7065
7072
  snapshot: state.snapshot,
7066
7073
  gate: latch,
7067
7074
  invariantOk: ctx.greenPrAutoMerger.invariantOk,
@@ -7077,14 +7084,25 @@ export function createRoutes(ctx) {
7077
7084
  });
7078
7085
  // Rollback is Bearer-gated and LOUD: anyone may STOP. The latch is absorbing
7079
7086
  // and pool-replicated, so a STOP survives a lease move (R9).
7080
- router.post('/green-pr-automerge/rollback', (req, res) => {
7087
+ router.post('/green-pr-automerge/rollback', async (req, res) => {
7081
7088
  if (!ctx.guardLatchStore) {
7082
7089
  res.status(503).json({ error: 'green-pr auto-merge not configured' });
7083
7090
  return;
7084
7091
  }
7085
7092
  const reason = typeof req.body?.reason === 'string' ? req.body.reason : 'operator-rollback';
7086
7093
  const latchId = ctx.guardLatchStore.set('rollback', reason);
7087
- res.json({ ok: true, rolledBack: true, latchId });
7094
+ // The latch set (stop NEW arming) and the in-line disarm (un-arm what is
7095
+ // already armed) are the two halves of one kill switch (mergerunner-auto-arm-
7096
+ // handoff Blocker 3a). The disarm must be IN-LINE here, not in the tick — the
7097
+ // latch the operator just set is the very thing that stops the tick reaching
7098
+ // the disarm code. Null-safe no-op when the watcher is absent (the
7099
+ // GuardLatchStore can exist when greenPrAutoMerger is null).
7100
+ let disarm;
7101
+ try {
7102
+ disarm = await ctx.greenPrAutoMerger?.disarmAllArmed(reason);
7103
+ }
7104
+ catch { /* disarm failure is surfaced via the watcher's own attention line; the latch still landed */ }
7105
+ res.json({ ok: true, rolledBack: true, latchId, disarmed: disarm?.disarmed ?? [], disarmFailed: disarm?.failed ?? [] });
7088
7106
  });
7089
7107
  // Re-arming merge authority is the operator's: dashboard-PIN-gated (the Mandates
7090
7108
  // precedent). Clears only the named latch id(s), or all active rollback ids.
@@ -7116,7 +7134,7 @@ export function createRoutes(ctx) {
7116
7134
  res.status(result.ok ? 200 : (result.status ?? 502)).json(result);
7117
7135
  });
7118
7136
  // Pool-disarm marker (R7): PIN-gated, superseding entry → grades back to healthy.
7119
- router.post('/green-pr-automerge/pool-disarm', (req, res) => {
7137
+ router.post('/green-pr-automerge/pool-disarm', async (req, res) => {
7120
7138
  if (!ctx.guardLatchStore) {
7121
7139
  res.status(503).json({ error: 'green-pr auto-merge not configured' });
7122
7140
  return;
@@ -7124,7 +7142,14 @@ export function createRoutes(ctx) {
7124
7142
  if (!checkMandatePin(req, res))
7125
7143
  return;
7126
7144
  ctx.guardLatchStore.markPoolDisarmed();
7127
- res.json({ ok: true, poolDisarmed: true });
7145
+ // Same kill-switch two-halves contract as rollback (Blocker 3a): also disarm
7146
+ // every already-armed PR in-line. Null-safe no-op when the watcher is absent.
7147
+ let disarm;
7148
+ try {
7149
+ disarm = await ctx.greenPrAutoMerger?.disarmAllArmed('pool-disarm');
7150
+ }
7151
+ catch { /* disarm failure is surfaced via the watcher's own attention line; the pool-disarm marker still landed */ }
7152
+ res.json({ ok: true, poolDisarmed: true, disarmed: disarm?.disarmed ?? [], disarmFailed: disarm?.failed ?? [] });
7128
7153
  });
7129
7154
  // ── Human-as-Detector heat map ───────────────────────────────────────
7130
7155
  // "Where the human is doing the system's job": coherence breaks a human had