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.
- package/dist/commands/server.d.ts.map +1 -1
- package/dist/commands/server.js +5 -0
- package/dist/commands/server.js.map +1 -1
- package/dist/core/PostUpdateMigrator.d.ts +10 -0
- package/dist/core/PostUpdateMigrator.d.ts.map +1 -1
- package/dist/core/PostUpdateMigrator.js +83 -12
- package/dist/core/PostUpdateMigrator.js.map +1 -1
- package/dist/core/types.d.ts +15 -0
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/types.js.map +1 -1
- package/dist/monitoring/GreenPrAutoMerger.d.ts +90 -5
- package/dist/monitoring/GreenPrAutoMerger.d.ts.map +1 -1
- package/dist/monitoring/GreenPrAutoMerger.js +269 -6
- package/dist/monitoring/GreenPrAutoMerger.js.map +1 -1
- package/dist/monitoring/MergeRunner.d.ts +21 -0
- package/dist/monitoring/MergeRunner.d.ts.map +1 -1
- package/dist/monitoring/MergeRunner.js +33 -5
- package/dist/monitoring/MergeRunner.js.map +1 -1
- package/dist/monitoring/greenPrAutomergeWiring.d.ts +7 -0
- package/dist/monitoring/greenPrAutomergeWiring.d.ts.map +1 -1
- package/dist/monitoring/greenPrAutomergeWiring.js +44 -2
- package/dist/monitoring/greenPrAutomergeWiring.js.map +1 -1
- package/dist/monitoring/greenPrLogic.d.ts +39 -1
- package/dist/monitoring/greenPrLogic.d.ts.map +1 -1
- package/dist/monitoring/greenPrLogic.js +33 -1
- package/dist/monitoring/greenPrLogic.js.map +1 -1
- package/dist/server/CapabilityIndex.js +1 -1
- package/dist/server/CapabilityIndex.js.map +1 -1
- package/dist/server/routes.d.ts.map +1 -1
- package/dist/server/routes.js +29 -4
- package/dist/server/routes.js.map +1 -1
- package/package.json +1 -1
- package/scripts/safe-merge.mjs +27 -1
- package/src/data/builtin-manifest.json +63 -63
- package/upgrades/1.3.593.md +28 -0
- package/upgrades/side-effects/mergerunner-auto-arm-handoff-parity-track.md +60 -0
- package/upgrades/side-effects/mergerunner-auto-arm-handoff.md +48 -0
package/dist/server/routes.js
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
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
|