instar 1.3.172 → 1.3.174
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/core/UpdateGate.d.ts.map +1 -1
- package/dist/core/UpdateGate.js +10 -1
- package/dist/core/UpdateGate.js.map +1 -1
- package/package.json +1 -1
- package/scripts/pre-push-gate.js +21 -0
- package/src/data/builtin-manifest.json +2 -2
- package/upgrades/1.3.173.md +47 -0
- package/upgrades/1.3.174.md +36 -0
- package/upgrades/side-effects/pre-push-release-fragment-guard.md +61 -0
- package/upgrades/side-effects/update-gate-health-key-fix.md +69 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"UpdateGate.d.ts","sourceRoot":"","sources":["../../src/core/UpdateGate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,+DAA+D;IAC/D,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,gDAAgD;IAChD,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,sDAAsD;IACtD,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC5B,+DAA+D;IAC/D,oBAAoB,CAAC,EAAE,MAAM,EAAE,CAAC;IAChC,0EAA0E;IAC1E,sBAAsB,CAAC,EAAE,MAAM,EAAE,CAAC;CACnC;AAED,MAAM,WAAW,gBAAgB;IAC/B,uEAAuE;IACvE,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,uEAAuE;IACvE,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,sEAAsE;IACtE,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,yFAAyF;IACzF,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,gBAAgB;IAC/B,oDAAoD;IACpD,SAAS,EAAE,OAAO,CAAC;IACnB,4BAA4B;IAC5B,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,gDAAgD;IAChD,sBAAsB,EAAE,MAAM,CAAC;IAC/B,yCAAyC;IACzC,gBAAgB,EAAE,MAAM,CAAC;IACzB,kCAAkC;IAClC,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,0CAA0C;IAC1C,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,wDAAwD;IACxD,gBAAgB,EAAE,OAAO,CAAC;IAC1B,uDAAuD;IACvD,gBAAgB,EAAE,OAAO,CAAC;CAC3B;AAED,+DAA+D;AAC/D,MAAM,WAAW,kBAAkB;IACjC,mBAAmB,IAAI,WAAW,EAAE,CAAC;IACrC,kBAAkB,CAAC,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC;CACnD;AAED,+DAA+D;AAC/D,MAAM,WAAW,kBAAkB;IACjC,SAAS,IAAI;QACX,aAAa,EAAE,kBAAkB,EAAE,CAAC;KACrC,CAAC;CACH;AAED,qBAAa,UAAU;IACrB,OAAO,CAAC,MAAM,CAA6B;IAC3C,OAAO,CAAC,iBAAiB,CAAuB;IAChD,OAAO,CAAC,cAAc,CAAuB;IAC7C,OAAO,CAAC,gBAAgB,CAAgB;IACxC,OAAO,CAAC,gBAAgB,CAAS;IACjC,OAAO,CAAC,mBAAmB,CAAS;IACpC,OAAO,CAAC,gBAAgB,CAAS;IACjC,OAAO,CAAC,mBAAmB,CAAS;gBAExB,MAAM,CAAC,EAAE,gBAAgB;IASrC;;;;;OAKG;IACH,UAAU,CACR,cAAc,EAAE,kBAAkB,EAClC,cAAc,CAAC,EAAE,kBAAkB,GAAG,IAAI,GACzC,UAAU;IAgEb;;;;;;;;;;OAUG;IACH,mBAAmB,CACjB,cAAc,EAAE,kBAAkB,EAClC,cAAc,CAAC,EAAE,kBAAkB,GAAG,IAAI,GACzC,MAAM,EAAE;IAMX;;;;;;OAMG;IACH,OAAO,CAAC,uBAAuB;
|
|
1
|
+
{"version":3,"file":"UpdateGate.d.ts","sourceRoot":"","sources":["../../src/core/UpdateGate.ts"],"names":[],"mappings":"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"}
|
package/dist/core/UpdateGate.js
CHANGED
|
@@ -119,7 +119,16 @@ export class UpdateGate {
|
|
|
119
119
|
nonBlockingJobSessions.push(session.name);
|
|
120
120
|
continue;
|
|
121
121
|
}
|
|
122
|
-
|
|
122
|
+
// Health is keyed by the tmux session name (the slug SessionMonitor
|
|
123
|
+
// tracks, e.g. "echo-codey-collaboration"), NOT the human-facing display
|
|
124
|
+
// name (e.g. "Codey Collaboration"). Look up by tmuxSession first, then
|
|
125
|
+
// fall back to name. Without the tmuxSession key, every interactive
|
|
126
|
+
// session misses the health map and hits the conservative "treat as
|
|
127
|
+
// active" default below — which silently turned the idle/dead exclusion
|
|
128
|
+
// into dead code and meant restart-when-idle (#41) never fired while ANY
|
|
129
|
+
// session existed (the day-long version-lag root cause).
|
|
130
|
+
const h = (session.tmuxSession ? healthMap.get(session.tmuxSession) : undefined) ??
|
|
131
|
+
healthMap.get(session.name);
|
|
123
132
|
if (!h) {
|
|
124
133
|
// No health data — be conservative, treat as active
|
|
125
134
|
activeSessions.push(session.name);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"UpdateGate.js","sourceRoot":"","sources":["../../src/core/UpdateGate.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"UpdateGate.js","sourceRoot":"","sources":["../../src/core/UpdateGate.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/scripts/pre-push-gate.js
CHANGED
|
@@ -165,6 +165,27 @@ try {
|
|
|
165
165
|
(srcChanges.length > 5 ? `\n • ...and ${srcChanges.length - 5} more` : '')
|
|
166
166
|
);
|
|
167
167
|
}
|
|
168
|
+
|
|
169
|
+
// ── 3b. Release-fragment gate (#23: src change without a release note) ─
|
|
170
|
+
// A shippable src/ change MUST carry a release-note fragment. publish.yml
|
|
171
|
+
// SILENTLY skips the release when there is no upgrades/next/<slug>.md fragment
|
|
172
|
+
// (and no upgrades/NEXT.md) — so the fix merges but never ships, with no
|
|
173
|
+
// signal. Mirror of the src→tests check above. The "chore: release" cut commit
|
|
174
|
+
// touches upgrades/ but not src/, so it never trips this. Bypass genuine WIP
|
|
175
|
+
// with INSTAR_PRE_PUSH_SKIP=1.
|
|
176
|
+
const fragmentChanges = changedFiles.filter(f =>
|
|
177
|
+
f.startsWith('upgrades/next/') || f === 'upgrades/NEXT.md'
|
|
178
|
+
);
|
|
179
|
+
if (srcChanges.length > 0 && fragmentChanges.length === 0) {
|
|
180
|
+
errors.push(
|
|
181
|
+
`${srcChanges.length} source file(s) changed but no release-note fragment was added. ` +
|
|
182
|
+
`Without upgrades/next/<slug>.md (or upgrades/NEXT.md), publish.yml SILENTLY SKIPS the ` +
|
|
183
|
+
`release — your change would merge but never ship. Add a fragment describing the change:\n` +
|
|
184
|
+
srcChanges.slice(0, 5).map(f => ` • ${f}`).join('\n') +
|
|
185
|
+
(srcChanges.length > 5 ? `\n • ...and ${srcChanges.length - 5} more` : '')
|
|
186
|
+
);
|
|
187
|
+
}
|
|
188
|
+
|
|
168
189
|
// ── 4. Adapter contract test gate ─────────────────────────────────────
|
|
169
190
|
// If messaging adapter source files changed, require contract test evidence.
|
|
170
191
|
// This prevents shipping integration code verified only by mocked unit tests.
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "./builtin-manifest.schema.json",
|
|
3
3
|
"schemaVersion": 1,
|
|
4
|
-
"generatedAt": "2026-05-
|
|
5
|
-
"instarVersion": "1.3.
|
|
4
|
+
"generatedAt": "2026-05-31T18:41:05.487Z",
|
|
5
|
+
"instarVersion": "1.3.174",
|
|
6
6
|
"entryCount": 193,
|
|
7
7
|
"entries": {
|
|
8
8
|
"hook:session-start": {
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
# Upgrade Guide — vNEXT
|
|
2
|
+
|
|
3
|
+
<!-- assembled-by: assemble-next-md -->
|
|
4
|
+
<!-- bump: patch -->
|
|
5
|
+
|
|
6
|
+
## What Changed
|
|
7
|
+
|
|
8
|
+
Fixed a bug in the auto-update restart gate that kept agents running a stale
|
|
9
|
+
version far longer than intended. `UpdateGate` decides whether the box is "idle
|
|
10
|
+
enough" to restart onto a freshly-downloaded update by checking each running
|
|
11
|
+
session's health (`healthy` blocks; `idle`/`dead` don't). It looked that health
|
|
12
|
+
up by the session's **display name** while the health map is keyed by the **tmux
|
|
13
|
+
session name** (slug). The lookup always missed, so every interactive session was
|
|
14
|
+
conservatively treated as active — which made the idle/dead exclusion dead code
|
|
15
|
+
and meant the restart-when-idle path never fired while any session existed.
|
|
16
|
+
|
|
17
|
+
The gate now looks up health by `session.tmuxSession` (the key the health map
|
|
18
|
+
actually uses), falling back to the display name. Idle/dead sessions correctly
|
|
19
|
+
stop blocking restarts; genuinely-active (`healthy`) sessions still block, so live
|
|
20
|
+
work is never interrupted.
|
|
21
|
+
|
|
22
|
+
## What to Tell Your User
|
|
23
|
+
|
|
24
|
+
Nothing required — this is invisible robustness. If they noticed their agent
|
|
25
|
+
"staying on an old version most of the day and only catching up overnight," or
|
|
26
|
+
the agent reporting more active sessions than seemed real, this is the fix:
|
|
27
|
+
updates now activate promptly when the box is genuinely idle.
|
|
28
|
+
|
|
29
|
+
## Summary of New Capabilities
|
|
30
|
+
|
|
31
|
+
- Auto-update restarts activate promptly on a genuinely-idle box instead of
|
|
32
|
+
waiting for the overnight restart window (completes the restart-when-idle
|
|
33
|
+
intent).
|
|
34
|
+
- More accurate "active session" accounting in the restart gate (idle sessions
|
|
35
|
+
no longer inflate the blocker count).
|
|
36
|
+
|
|
37
|
+
## Evidence
|
|
38
|
+
|
|
39
|
+
- Root cause proven from live state: `auto-updater.json.restartDeferral.currentBlockers`
|
|
40
|
+
held display names (`"Codey Collaboration"`, …) while `topic-session-registry.json`
|
|
41
|
+
keyed the same sessions by slug (`"echo-codey-collaboration"`, …) — a guaranteed
|
|
42
|
+
lookup miss.
|
|
43
|
+
- `tests/unit/UpdateGate.test.ts`: +5 tests using the production key shape; the
|
|
44
|
+
3 status-discriminating ones were confirmed RED pre-fix, GREEN post-fix.
|
|
45
|
+
- `npx vitest run tests/unit/UpdateGate.test.ts tests/unit/AutoUpdater.test.ts` →
|
|
46
|
+
29 passed. `npm run lint` clean. `tsc --noEmit` clean.
|
|
47
|
+
- Spec: `docs/specs/UPDATE-GATE-HEALTH-KEY-FIX-SPEC.md` (+ ELI16 companion).
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
# Upgrade Guide — vNEXT
|
|
2
|
+
|
|
3
|
+
<!-- assembled-by: assemble-next-md -->
|
|
4
|
+
<!-- bump: patch -->
|
|
5
|
+
|
|
6
|
+
## What Changed
|
|
7
|
+
|
|
8
|
+
Closed a silent-release-skip gap in the dev/release tooling. The post-merge
|
|
9
|
+
publish workflow skips publishing when a change carries no release-note fragment
|
|
10
|
+
— which is correct when nothing needs releasing, but meant a real code change
|
|
11
|
+
could merge with no release note and then never ship, with no signal anywhere.
|
|
12
|
+
The pre-push gate now catches this: if source files changed but no release-note
|
|
13
|
+
fragment is included, the push is rejected with a clear message instead of
|
|
14
|
+
sailing through to a silent no-release. It mirrors the existing "you changed code
|
|
15
|
+
but added no tests" check, never trips on the routine release-cut commit, and
|
|
16
|
+
respects the same work-in-progress bypass.
|
|
17
|
+
|
|
18
|
+
## What to Tell Your User
|
|
19
|
+
|
|
20
|
+
Nothing required — this is invisible developer-tooling robustness. It prevents a
|
|
21
|
+
fix from quietly merging without ever being released.
|
|
22
|
+
|
|
23
|
+
## Summary of New Capabilities
|
|
24
|
+
|
|
25
|
+
- The pre-push gate now blocks a source change that has no accompanying
|
|
26
|
+
release-note fragment, so fixes can no longer merge and then silently fail to
|
|
27
|
+
publish.
|
|
28
|
+
|
|
29
|
+
## Evidence
|
|
30
|
+
|
|
31
|
+
- Root cause: publish.yml sets skip when there is no fragment and no NEXT.md, so a
|
|
32
|
+
source change with neither merges but never releases (the lived #23 failure).
|
|
33
|
+
- New guard in the pre-push gate mirrors the existing source-changed-without-tests
|
|
34
|
+
check; never trips on the release-cut commit (touches upgrades, not source).
|
|
35
|
+
- tests/unit/pre-push-gate.test.ts: +1 test; all 14 pass. Lint + type-check clean.
|
|
36
|
+
- Spec: docs/specs/PRE-PUSH-RELEASE-FRAGMENT-GUARD-SPEC.md (+ ELI16 companion).
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
# Side-Effects Review — Pre-push release-fragment guard (#23)
|
|
2
|
+
|
|
3
|
+
**Version / slug:** `pre-push-release-fragment-guard`
|
|
4
|
+
**Date:** 2026-05-31
|
|
5
|
+
**Author:** echo
|
|
6
|
+
|
|
7
|
+
## Summary of the change
|
|
8
|
+
|
|
9
|
+
`scripts/pre-push-gate.js` gains a check, mirroring the existing src→tests check:
|
|
10
|
+
if `src/**.ts` changed in the branch diff and no `upgrades/next/*.md` fragment
|
|
11
|
+
(or `upgrades/NEXT.md`) is present, it pushes an error → the gate exits non-zero.
|
|
12
|
+
Closes the #23 silent-release-skip class (a shippable src change merging without
|
|
13
|
+
a release note → publish.yml silently skips → fix never ships).
|
|
14
|
+
|
|
15
|
+
**Files changed (source/scripts):**
|
|
16
|
+
- `scripts/pre-push-gate.js` — +1 check (~13 lines) inside the existing git-diff
|
|
17
|
+
`try` block, after the src→tests check.
|
|
18
|
+
|
|
19
|
+
**Files changed (tests):**
|
|
20
|
+
- `tests/unit/pre-push-gate.test.ts` — +1 content-assertion test (matches the
|
|
21
|
+
file's testing approach for the gate's git-dependent checks).
|
|
22
|
+
|
|
23
|
+
## Blast radius
|
|
24
|
+
|
|
25
|
+
`scripts/pre-push-gate.js` runs only on `git push` (husky pre-push). It gates
|
|
26
|
+
LOCAL pushes; CI remains the authority for tests. The new check adds one more
|
|
27
|
+
reason a push can be rejected: a src change with no release fragment.
|
|
28
|
+
|
|
29
|
+
## Behavior delta
|
|
30
|
+
|
|
31
|
+
| Scenario | Before | After |
|
|
32
|
+
|---|---|---|
|
|
33
|
+
| src/ changed + a fragment/NEXT.md present | push proceeds | push proceeds (unchanged) |
|
|
34
|
+
| src/ changed + NO fragment | push proceeds → merges → **silent no-release** | push **rejected** with a clear message |
|
|
35
|
+
| `chore: release` cut commit (touches upgrades/, not src/) | proceeds | proceeds (srcChanges=0, check inert) |
|
|
36
|
+
| docs/test-only PR (no src/**.ts) | proceeds | proceeds (srcChanges=0, check inert) |
|
|
37
|
+
| git unavailable (CI / detached HEAD) | git-diff checks skipped | skipped (same `try/catch`) |
|
|
38
|
+
|
|
39
|
+
## Risks considered
|
|
40
|
+
|
|
41
|
+
- **False-positive blocking a legitimate push?** Only when src/ changed with no
|
|
42
|
+
release note — which is exactly the bug. Genuine WIP bypasses via the existing
|
|
43
|
+
`INSTAR_PRE_PUSH_SKIP=1`. The release-cut commit and docs/test-only PRs don't
|
|
44
|
+
trip it (no src/**.ts).
|
|
45
|
+
- **Severity (error vs warning):** error, because a silent release-skip is a real
|
|
46
|
+
failure (the fix never ships), matching the adapter-contract gate's error
|
|
47
|
+
severity rather than the softer src→tests warning.
|
|
48
|
+
- **No new dependencies, no network, no state.**
|
|
49
|
+
|
|
50
|
+
## Migration parity
|
|
51
|
+
|
|
52
|
+
None required. `scripts/pre-push-gate.js` is a dev/release tooling script run from
|
|
53
|
+
the repo's husky hook — not an agent-installed file (hook/config/CLAUDE.md
|
|
54
|
+
template/skill). It ships in the repo; no `PostUpdateMigrator` entry needed.
|
|
55
|
+
|
|
56
|
+
## Test evidence
|
|
57
|
+
|
|
58
|
+
`npx vitest run tests/unit/pre-push-gate.test.ts` → 14 passed (incl. the new
|
|
59
|
+
content-assertion). `npm run lint` + `tsc --noEmit` clean. Dogfood: this PR
|
|
60
|
+
itself carries `upgrades/next/pre-push-release-fragment-guard.md`, so the new
|
|
61
|
+
guard would pass on this very change.
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
# Side-Effects Review — UpdateGate health lookup keys by tmux session name
|
|
2
|
+
|
|
3
|
+
**Version / slug:** `update-gate-health-key-fix`
|
|
4
|
+
**Date:** 2026-05-31
|
|
5
|
+
**Author:** echo
|
|
6
|
+
|
|
7
|
+
## Summary of the change
|
|
8
|
+
|
|
9
|
+
`UpdateGate.classifyRunningSessions()` looked up per-session health with
|
|
10
|
+
`healthMap.get(session.name)` (display name) against a map keyed by the tmux
|
|
11
|
+
session slug. The lookup always missed → every interactive session hit the
|
|
12
|
+
conservative "treat as active" default → the idle/dead exclusion was dead code →
|
|
13
|
+
restart-when-idle (#41) never fired. Fix: look up by `session.tmuxSession` first,
|
|
14
|
+
fall back to `session.name`.
|
|
15
|
+
|
|
16
|
+
**Files changed (source):**
|
|
17
|
+
- `src/core/UpdateGate.ts` — one lookup expression in `classifyRunningSessions`
|
|
18
|
+
(+ an explanatory comment). No signature, interface, or control-flow change.
|
|
19
|
+
|
|
20
|
+
**Files changed (tests):**
|
|
21
|
+
- `tests/unit/UpdateGate.test.ts` — +1 describe block (5 tests) exercising the
|
|
22
|
+
production key shape (health keyed by slug, `session.name` a display name).
|
|
23
|
+
|
|
24
|
+
## Blast radius
|
|
25
|
+
|
|
26
|
+
`classifyRunningSessions` is the single private classifier behind both
|
|
27
|
+
`canRestart()` (the restart gate) and `getBlockingSessions()` (the pure idle
|
|
28
|
+
probe). Both are consumed only by `AutoUpdater` for restart gating. Nothing else
|
|
29
|
+
calls them. So the change's reach is exactly: "which running sessions are deemed
|
|
30
|
+
active for the purpose of deferring an auto-update restart."
|
|
31
|
+
|
|
32
|
+
## Behavior delta
|
|
33
|
+
|
|
34
|
+
| Scenario | Before | After |
|
|
35
|
+
|---|---|---|
|
|
36
|
+
| Interactive session, health=`idle` (keyed by slug) | counted **active** (lookup miss → conservative) → blocks restart | correctly **idle** → does not block |
|
|
37
|
+
| Interactive session, health=`healthy` (keyed by slug) | counted active (right outcome, wrong reason) | counted active (correct reason) → still blocks |
|
|
38
|
+
| Interactive session, health=`dead`/`unresponsive` (slug) | counted active (miss) | correctly excluded / unresponsive |
|
|
39
|
+
| Session with genuinely no health entry | conservative active | conservative active (unchanged) |
|
|
40
|
+
| Health keyed by display name (legacy/test) | found | still found (fallback) |
|
|
41
|
+
|
|
42
|
+
Net: idle/dead sessions stop blocking restarts; **active (`healthy`) sessions
|
|
43
|
+
still block, so live work is never interrupted.**
|
|
44
|
+
|
|
45
|
+
## Risks considered
|
|
46
|
+
|
|
47
|
+
- **False-idle interruption?** No. Only `idle`/`dead` health statuses become
|
|
48
|
+
non-blocking, and those are set by SessionMonitor's own thresholds (15-min
|
|
49
|
+
no-output for `idle`). A session actively producing output is `healthy` and
|
|
50
|
+
still blocks.
|
|
51
|
+
- **Name collision (a session's display name equals another's slug)?** The
|
|
52
|
+
fallback only fires when the slug lookup misses; display vs slug formats differ
|
|
53
|
+
(spaces/caps vs hyphenated-prefixed), so a cross-match is implausible and would
|
|
54
|
+
at worst reuse an existing same-status entry.
|
|
55
|
+
- **Restarts now happen more often** — that is the intended effect (#41). They
|
|
56
|
+
remain gated by genuinely-active sessions and the operator restart window.
|
|
57
|
+
|
|
58
|
+
## Migration parity
|
|
59
|
+
|
|
60
|
+
None required. `src/core/UpdateGate.ts` is shipped library code, not an
|
|
61
|
+
agent-installed file (hook, config default, CLAUDE.md template, or skill). It
|
|
62
|
+
takes effect for every agent on the normal server restart that activates the new
|
|
63
|
+
version. No `PostUpdateMigrator` entry is needed.
|
|
64
|
+
|
|
65
|
+
## Test evidence
|
|
66
|
+
|
|
67
|
+
`npx vitest run tests/unit/UpdateGate.test.ts tests/unit/AutoUpdater.test.ts` →
|
|
68
|
+
29 passed. The 3 status-discriminating new tests were confirmed RED against the
|
|
69
|
+
pre-fix lookup and GREEN with the fix. `npm run lint` clean.
|