diff --git a/CHANGELOG.md b/CHANGELOG.md index 9189ba0435..9589a75d2b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,16 @@ All notable changes to this project are documented here. The format follows [Semantic Versioning](https://semver.org/). Entries record what actually happened, not what was planned; superseded entries are kept. +## [Unreleased] + +### Release infrastructure + +- The release's Open VSX check reads the universal package at its own + address. Once a version has packages for each platform, Open VSX's + plain version address can name any one of them, and 0.19.0's check + compared the universal package with another platform's (every package + was published and matched when checked by its own address). + ## [0.19.0] - 2026-10-21 ### Highlights diff --git a/PLAN.md b/PLAN.md index 0f5a42fd94..9500d07d68 100644 --- a/PLAN.md +++ b/PLAN.md @@ -34521,50 +34521,11 @@ remain with the lead under the shared lane rules. Follow-up receipts are in - **Archived.** The record that stood here is in [docs/plan-archive/gates.md](docs/plan-archive/gates.md). -**M121A rounds 3–4 gate ownership (2026-10-09, kubuntu).** The rig brief and -shared lane rules forbid aggregate quality in this worktree; the lead owns -that gate before integration. This lane runs the owning usage/money/schedule -files at repository timeouts, typecheck, changed-file lint/format, localization -and the remaining scoped static checks. Full production build retains the -inherited What's New content-budget refusal; measure current production -options/plugins in memory without editing the build or raising a cap. Byte -counts and exact failure receipts are in `docs/certification/m121.md`. -The unchanged zero-clone duplication gate also retains one six-line clone in -`test/unit/windowsTrustedPath.test.ts`; that file matches `1494fbf87` byte for -byte and is outside this lane's money scope. The touched migration test's -duplicate setup is consolidated without dropping assertions. The lead owns -the remaining Windows-test repair and the full artifact size/split replay: -the refused build removes stale browser chunks before stopping, so those -artifact checks cannot certify a complete current build. No gate is weakened. -Round 4 replays the owning usage/money files, one unit-project typecheck and -the scoped static checks and production measurements at the unchanged caps. +- **Archived.** The record that stood here is in [docs/plan-archive/gates.md](docs/plan-archive/gates.md). - **Archived.** The record that stood here is in [docs/plan-archive/gates.md](docs/plan-archive/gates.md). -**CIFIXV hosted visual repair (2026-10-09, linuxlt).** Own only the three -visual failures at `f5e0760c3`: reconstruct schedules under the served source -root, review any intended pixel changes before regenerating goldens, and -refresh current-source classification hashes without changing coverage. -Keep all thresholds and repository deadlines. Full quality remains the lead's -gate under the shared lane rules; no merge, push or live/paid calls. - -- [x] Prove historical schedule loading fails before the repair and passes after. -- [x] Resolve visual comparisons and identify the aggregate's actual failure. -- [x] Refresh source receipts and pass the owning audit suite. -- [x] Pass full visual, six-theme accessibility and default-timeout stability gates. -- [x] Record evidence and local hooks-on commits in `docs/certification/cifixv.md`. - -Reviewed full baseline: `CIFIXV-integrated-accessibility-review-2026-10-09`, -9,792 images / 447,310,229 bytes; all 884 distinct changed images reviewed, -27 named scenes. Full pixel gate passed; six-theme scoped axe passed on -1,632 pages with zero violations, retaining all 315 incomplete findings. -All 43 owning tests passed at repository defaults; production build passed. -The artifact action's `digest-mismatch: error` is an input; -the aggregate requires successful schedule shards and complete receipts. -Bounded external gate deferral: full `jscpd` still reports the inherited -51-token clone in `test/unit/modelApiLoopGuarantees.test.ts:741` and `:890`. -That suite is another lane's scope; leave code and duplication limits intact -for the lead's integration gate. Receipt: `docs/certification/cifixv.md`. +- **Archived.** The record that stood here is in [docs/plan-archive/gates.md](docs/plan-archive/gates.md). - **Archived.** The record that stood here is in [docs/plan-archive/gates.md](docs/plan-archive/gates.md). @@ -39926,6 +39887,30 @@ Unresolved items remain delivery/security gaps, not accepted legal conclusions: ## 10. Definition of done and release records +**0.19.0 released (2026-10-21, tag `v0.19.0` on main's release merge `4e09cab6ea`, PR #257, release run 39720213044).** +PR #257 (`release/0.19.2`, head `915f409fe4`) merged after first-attempt +green CI (39716712837) and Hosts (39716712802) runs; the merge commit's Hosts +run (39719522423) was green and `rule2-gate.mjs release --sha 4e09cab6ea` +read three green first runs; the annotated tag was pushed at 9:04 PM PT. The +release run reused the CI run's verified packages (its lookup found +39716712837 for the tag tree `f77cd9d93f`). Tag checks, reuse, the GitHub +Release (46 assets: seven VSIX packages, the agent tarball, both +inventories, `SHA256SUMS` and the Linux helper assets), Marketplace and npm +succeeded. Open VSX failed at its own check, not at publishing: once a +version has targeted packages, Open VSX's untargeted `/` answer +names whichever package it picks (`win32-arm64` to the script), so the +universal package was compared with another target's bytes. Every package +was uploaded; Open VSX activated the last ones by 04:15 UTC. Checked after +the run, each of the seven packages on the Marketplace and on Open VSX +(through each target's own address) is byte-identical to the release asset, +npm's `muse-spark-code-acp@0.19.0` integrity equals the release tarball's, +and every downloaded asset passes `SHA256SUMS`. The summary job is red for +the Open VSX job; the badge refresh it skipped was run locally (exit 0). The +check now reads `/universal/` (`scripts/publish-registry.mjs`; +`docs/certification/cifinal0190.md` §21). Real use before the tag: +`docs/real-life/release-0.19.0-limits-W.md` (Windows, 5 model calls, every +one `muse-spark-1.3-contributor`, $0.00). + **0.19.0 preparation (2026-10-17; tagged again 2026-10-21).** `release/0.19.0` cut from `main-now` at `81dacaf5a7`, merging in order PR #185 (`fix/sandbox-say`: the Linux sandbox cannot-start notice), PR #189 (`ms/msm112`: the production build runs through diff --git a/ROADMAP.md b/ROADMAP.md index 6a6ff1ccf4..4266f809e0 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -2,7 +2,7 @@ - + What Muse Spark Code has shipped, what is in the next release, what is being built and what is planned. Plans change: an item can move, shrink or be dropped, and no date is promised. Versions stay below 1.0; there is no 1.0 promise or date. diff --git a/docs/certification/cifinal0190.md b/docs/certification/cifinal0190.md index 97e99d2617..b1e039bc81 100644 --- a/docs/certification/cifinal0190.md +++ b/docs/certification/cifinal0190.md @@ -765,3 +765,56 @@ function (title) { context.test(title); }`), and `.timeout(0)` was refused by this PC's account), and no vault path reaches the process helpers whose deadlines changed. The toast check printed no log; it now prints the panel's log with the toasts, so a repeat names its cause. + +## 21. The 0.19.0 release run: Open VSX's check read another package + +Release run 39720213044 (`v0.19.0` on `4e09cab6ea`): tag checks, reuse of +CI run 39716712837, GitHub Release, Marketplace and npm succeeded; the Open +VSX job ended "openvsx: the published artifact does not match the release". + +- Cause: `verifyPublished` read `/api/RandyNorthrup/muse-spark-code/0.19.0` + for the untargeted package. With targeted packages present, that answer + named `win32-arm64` (three of three reads from Node; curl got + `universal`), so the universal VSIX was compared with the win32-arm64 + bytes. `/api/RandyNorthrup/muse-spark-code/universal/0.19.0` names the + universal package for 0.19.0 and for 0.18.2 (universal only). +- Open VSX state: all seven packages uploaded. `darwin-arm64`, + `linux-arm64` and `linux-x64` answered "Extension not found" for a few + minutes after the job (activated by 04:15 UTC), the other four at once. +- After the run, with the fixed check, each of the seven VSIX packages on + the Marketplace and on Open VSX matches the release asset (14 of 14), npm's + integrity for `muse-spark-code-acp@0.19.0` equals the release tarball's + sha512, and the downloaded assets pass `SHA256SUMS` (8 of 8). +- Drill, against the real Open VSX: the tag's `verifyPublished` on the + universal VSIX failed three of three ("openvsx published SHA-256 differs + from the release VSIX"), exit 1; the fixed one matched three of three, + exit 0, and still matches the win32-x64 package three of three. + +## 22. PR #258's first run: the macOS vault panel flow never unlocked + +PR #258 head `c7bdd3e943` (CI run 39722505089, capacity run 39722575285): +macOS shard 15 only, `posixVaultPanelFlow`: after Unlock the panel still +read `locked` when the step's 60 s wait ended, with no toast and no log. The +product code is PR #257's final head's, green on every macOS shard there, +and no path the macOS unlock takes reaches the process helpers whose +deadlines changed (`runTreeSync` serves the playbook only; the identity +probe passes its own timeout). With PR #257's third run (Windows, first +open, two failure toasts) it is the second hosted-runner vault flow failure +with an empty log. The step message now also names how many frames the +panel published and its last states, so the next one shows whether the +step ever ran; the defect is a recovery lane's to find and fix. + +PR #258's second run, head `d0a39a70ed` (CI run 39724540034, capacity run +39724610207): macOS shard 8 ended "The runner has received a shutdown +signal. This can happen when the runner service is stopped, or a manually +started runner is canceled." and "The operation was canceled." No test +failed; every other job passed. A rerun on the same commit is refused +(AGENTS.md rule 2), so this record is the new commit. + +PR #258's third run, head `a6f4767c97` (CI run 39725758843, capacity run +39725813062): Windows shard 9 only, `windowsBrokerClient.test.ts`: "Hook +timed out in 30000ms" in the `beforeAll` that builds the native helpers with +the person's own C# compiler, another time limit of ours on a slow hosted +Windows runner. The seven vault suites whose setup builds or stages native +helpers or starts a broker now run that setup with no time limit (owner +2026-10-16); here the five Windows ones pass (14 tests, 59.7 s). diff --git a/docs/certification/plan-archive.md b/docs/certification/plan-archive.md index 51a6bc3ec6..654ee8d8fd 100644 --- a/docs/certification/plan-archive.md +++ b/docs/certification/plan-archive.md @@ -784,3 +784,30 @@ docs/plan-archive/milestones.md`: clean. `sharingArtifacts` + `estimatorPlanSnapshot` (79 passed), `estimatorPlanSnapshotRealPlan` + `estimatorPlanSnapshotSource` + `estimatorSnapshotStrict` (73 passed), `planDocument` (19 passed). + +## 2026-10-21: room for the 0.19.0 release record + +The 0.19.0 release record put `PLAN.md` at 3,566,310 bytes, 1,152 over the +`check:plan` gate (85% of the 4 MiB bound, 3,565,158). Two §7 gate records +of closed lanes moved to `docs/plan-archive/gates.md` with a pointer each; +no test, script or open branch cites or touches them (PR #252 changes §3 and +§6 only), and both milestones shipped: + +| Block | Lines (at `4e09cab6e`) | Bytes | SHA-256 | +| -------------------------------------------- | ---------------------- | ----- | ----------- | +| CIFIXV hosted visual repair (2026-10-09) | 34544–34567 | 1,646 | `3b0e0461…` | +| M121A rounds 3–4 gate ownership (2026-10-09) | 34524–34540 | 1,287 | `66f4036a…` | + +After: 3,563,591 bytes, 1,567 bytes under the gate. + +### Proofs + +- Reassembly: the command rebuilt the old `PLAN.md` before each write, + SHA-256 `8bc0b6ef…` and `6719195b…`. +- Parsed facts: identical; format drift after: 0. +- `npx prettier --check PLAN.md docs/plan-archive/gates.md`: clean. +- `npm run check:plan`: `plan-format-v1; 222 milestones; 0 drift`. +- `npm run roadmap:generate`: `ROADMAP.md` unchanged. +- `npm run check:reference`: exit 0. +- `planReader` + `planCitation` + `autoCompact` + `paidMoneyStructure`: 135 + passed. diff --git a/docs/plan-archive/gates.md b/docs/plan-archive/gates.md index 7ba2361d22..a1ac13cf24 100644 --- a/docs/plan-archive/gates.md +++ b/docs/plan-archive/gates.md @@ -5355,3 +5355,58 @@ quality is not claimed green; the rig brief delegates it to the lead. risk; see `docs/certification/m95-s.md`. + +## CIFIXV hosted visual repair (2026-10-09) + + + +**CIFIXV hosted visual repair (2026-10-09, linuxlt).** Own only the three +visual failures at `f5e0760c3`: reconstruct schedules under the served source +root, review any intended pixel changes before regenerating goldens, and +refresh current-source classification hashes without changing coverage. +Keep all thresholds and repository deadlines. Full quality remains the lead's +gate under the shared lane rules; no merge, push or live/paid calls. + +- [x] Prove historical schedule loading fails before the repair and passes after. +- [x] Resolve visual comparisons and identify the aggregate's actual failure. +- [x] Refresh source receipts and pass the owning audit suite. +- [x] Pass full visual, six-theme accessibility and default-timeout stability gates. +- [x] Record evidence and local hooks-on commits in `docs/certification/cifixv.md`. + +Reviewed full baseline: `CIFIXV-integrated-accessibility-review-2026-10-09`, +9,792 images / 447,310,229 bytes; all 884 distinct changed images reviewed, +27 named scenes. Full pixel gate passed; six-theme scoped axe passed on +1,632 pages with zero violations, retaining all 315 incomplete findings. +All 43 owning tests passed at repository defaults; production build passed. +The artifact action's `digest-mismatch: error` is an input; +the aggregate requires successful schedule shards and complete receipts. +Bounded external gate deferral: full `jscpd` still reports the inherited +51-token clone in `test/unit/modelApiLoopGuarantees.test.ts:741` and `:890`. +That suite is another lane's scope; leave code and duplication limits intact +for the lead's integration gate. Receipt: `docs/certification/cifixv.md`. + + + +## M121A rounds 3–4 gate ownership (2026-10-09) + + + +**M121A rounds 3–4 gate ownership (2026-10-09, kubuntu).** The rig brief and +shared lane rules forbid aggregate quality in this worktree; the lead owns +that gate before integration. This lane runs the owning usage/money/schedule +files at repository timeouts, typecheck, changed-file lint/format, localization +and the remaining scoped static checks. Full production build retains the +inherited What's New content-budget refusal; measure current production +options/plugins in memory without editing the build or raising a cap. Byte +counts and exact failure receipts are in `docs/certification/m121.md`. +The unchanged zero-clone duplication gate also retains one six-line clone in +`test/unit/windowsTrustedPath.test.ts`; that file matches `1494fbf87` byte for +byte and is outside this lane's money scope. The touched migration test's +duplicate setup is consolidated without dropping assertions. The lead owns +the remaining Windows-test repair and the full artifact size/split replay: +the refused build removes stale browser chunks before stopping, so those +artifact checks cannot certify a complete current build. No gate is weakened. +Round 4 replays the owning usage/money files, one unit-project typecheck and +the scoped static checks and production measurements at the unchanged caps. + + diff --git a/docs/real-life/release-0.19.0-limits-W.md b/docs/real-life/release-0.19.0-limits-W.md new file mode 100644 index 0000000000..1862392820 --- /dev/null +++ b/docs/real-life/release-0.19.0-limits-W.md @@ -0,0 +1,69 @@ +# Real use: 0.19.0 after the time limits came out, Windows (the lead, this PC) + +Version: **0.19.0**, the agent package CI built from PR #257's final head +`915f409fe4` (CI run 39716712837, artifact `muse-spark-code-acp`, +`muse-spark-code-acp-0.19.0.tgz`, 3,485,063 bytes), installed with npm into +its own folder outside any workspace; `--version` → `0.19.0`. The release +reuses this run's packages. Platform: Windows 11 Pro 10.0.26200, x64. +Backend: Muse Code 1.4.11 (the person's own install), contributor mode on in +the person's own settings; the product started +`muse-bin-1.4.11-R6667.1.exe serve --disable-sandbox --contributor-mode on +--trust-workspace`. No API key was read or stored. + +What changed and is used here: no deadline of ours on report source reads +(5 s before), on Windows PowerShell, `taskkill` and process-table reads, or +on the stops after a turn's cancel (20 s before). + +Expected before the run: **5 model calls**, cap 40 calls and **$2.00**, every +request on **`muse-spark-1.3-contributor`** by name, in an empty workspace. + +## Reports read the network with no deadline of ours — PASS + +`muse-spark-code-acp report project --network --format json --out ` +against this repository: exit 0 in 12 s, no model call. Against the +published 0.18.2 agent on the same repository at the same time: + +- `stores` reads `partial` (channels-unavailable: 0.19.0 is not yet on the + stores) where 0.18.2 read `unavailable`; `usage` reads `partial` (it names + the journal entries it excludes) where 0.18.2 read `unavailable`. +- Every other source reads the same, except `planRevision`: `ok` on 0.18.2, + `unavailable` now. Not from this change: it compares PLAN.md with PLAN.md + at the latest release tag (`v0.18.2`), and today's PLAN reader finds six + format drifts in that older file (duplicate question ids such as + `Q-M95INT2`), so it refuses the comparison and says so. Recorded for the + recovery work, with `github` (`pulls-page-1: pull-response-invalid`, + `default-branch-page-1: http-422`) and `git` ("The source exceeds the + report read limit"), which read the same on 0.18.2. + +## A command runs through Windows PowerShell — PASS + +ACP session `01a161bf`, put on `muse-spark-1.3-contributor` by +`session/set_config_option` before any prompt. "Run this exact PowerShell +command once … `(Get-Process -Id $PID).ProcessName`" → the client was asked +"PowerShell: (Get-Process -Id $PID).ProcessName", allowed once; the answer +was `powershell`; `end_turn` in 20.5 s. + +## Stop ends a long command and everything it started — PASS + +"Run this exact PowerShell command once … `Start-Sleep -Seconds 300; +'slept'`", allowed; the client sent `session/cancel` 5 s after the tool call +started, as an editor's Stop does. The turn ended `cancelled` 90 ms after +the cancel (8.6 s in all). Afterwards no process on this PC had +`Start-Sleep -Seconds 300` in its command line. + +## Notes + +- The first attempt (session `01a161bd`) sent no prompt: the driver was + started without `--allow-contributor-models`, so the agent offered no + contributor model and refused the switch ("Invalid params"), and the + driver stops before any prompt when the session is not on the + contributor model. Muse Code's records show no call for it. +- `session/delete` answered "Muse Code 1.4.11 cannot delete conversations.", + as the product documents. + +## Model calls + +Counted from `model_completed` events in Muse Code's own session records +(`~/.local/share/muse/sessions/…//session.jsonl`, main sessions and +subagents) for sessions `01a161bd` and `01a161bf`: **5 calls**, every one +**`muse-spark-1.3-contributor`**, **$0.00** of the $2.00 cap. diff --git a/scripts/publish-registry.mjs b/scripts/publish-registry.mjs index 09ec04e571..cdf5021f9d 100644 --- a/scripts/publish-registry.mjs +++ b/scripts/publish-registry.mjs @@ -109,16 +109,19 @@ export async function verifyPublished(channel, artifact, manifest, deps = {}) { // One package per platform (PLAN.md D209): the registries serve each // target under its own download, so a targeted artifact is verified // against its own target's bytes. The target travels in vsce's artifact - // name; an untargeted artifact verifies the universal download as before. + // name; an untargeted artifact verifies the universal download. const target = targetOfVsix(artifact) let url if (channel === 'marketplace') { url = `https://marketplace.visualstudio.com/_apis/public/gallery/publishers/${encodeURIComponent(publisher)}/vsextensions/${encodeURIComponent(name)}/${encodeURIComponent(version)}/vspackage` if (target !== undefined) url += `?targetPlatform=${encodeURIComponent(target)}` } else if (channel === 'openvsx') { - const segments = [publisher, name] - if (target !== undefined) segments.push(target) - segments.push(version) + // Always the explicit target: once a version has targeted packages, + // Open VSX's untargeted `/` answer names whichever package it + // picks (0.19.0: `win32-arm64` to this script, `universal` to curl), so + // the untargeted artifact is checked at `/universal/`, which + // also answers for a version published only universal (0.18.2). + const segments = [publisher, name, target ?? 'universal', version] const metadata = await response( `https://open-vsx.org/api/${segments.map((segment) => encodeURIComponent(segment)).join('/')}`, fetcher, diff --git a/test/unit/helpers/vault/panelFlowDriver.ts b/test/unit/helpers/vault/panelFlowDriver.ts index 59cc934c2c..349baca079 100644 --- a/test/unit/helpers/vault/panelFlowDriver.ts +++ b/test/unit/helpers/vault/panelFlowDriver.ts @@ -99,7 +99,12 @@ export async function drivePanelFlow( () => { const frame = frames.at(-1) // A step that never settles says what the panel showed instead. - const shown = `${label}: reason ${String(frame?.status.reason)}, toasts ${JSON.stringify(toasts)}, log ${JSON.stringify(logged)}` + // The states the panel went through (newest last) tell a step that + // never ran from one that ran and fell back. + const states = frames + .slice(-12) + .map((one) => `${one.status.state}${one.retrying ? '(retrying)' : ''}`) + const shown = `${label}: reason ${String(frame?.status.reason)}, toasts ${JSON.stringify(toasts)}, log ${JSON.stringify(logged)}, ${String(frames.length)} frames, last states ${states.join(' > ')}` expect(frame?.retrying ?? false, shown).toBe(false) expect(frame?.status.state, shown).toBe(state) }, diff --git a/test/unit/vault/posixVaultPanelFlow.test.ts b/test/unit/vault/posixVaultPanelFlow.test.ts index b7efaefba8..977ebff0f6 100644 --- a/test/unit/vault/posixVaultPanelFlow.test.ts +++ b/test/unit/vault/posixVaultPanelFlow.test.ts @@ -52,6 +52,9 @@ function hasSessionBus(): boolean { describe.skipIf( process.platform === 'win32' || !hasBrokerSocketFit() || !hasProcessListing() || !hasSessionBus(), )('POSIX vault through the panel', () => { + // The native helper builds and broker starts take as long as the machine + // needs (a slow hosted Windows runner passed the 30 s hook budget, PR #258): + // no time limit of ours on this setup (owner 2026-10-16). beforeAll(async () => { fixture.current = await startPosixPanelFixture('vs-ppanel-') // One-time OS costs belong in hooks, never in a case: the first exec @@ -71,7 +74,7 @@ describe.skipIf( ['proc-identity', String(process.pid)], { stdio: 'ignore' }, ) - }) + }, 0) afterAll(async () => { await fixture.current?.dispose() }) diff --git a/test/unit/vault/vaultPanelBuild.test.ts b/test/unit/vault/vaultPanelBuild.test.ts index 41ba24afbf..f729962435 100644 --- a/test/unit/vault/vaultPanelBuild.test.ts +++ b/test/unit/vault/vaultPanelBuild.test.ts @@ -17,6 +17,9 @@ const built: { actions?: Metafile migration?: Metafile } = {} +// The native helper builds and broker starts take as long as the machine +// needs (a slow hosted Windows runner passed the 30 s hook budget, PR #258): +// no time limit of ours on this setup (owner 2026-10-16). beforeAll(async () => { await mkdir(path.join(process.cwd(), 'temp'), { recursive: true }) built.dir = await mkdtemp(path.join(process.cwd(), 'temp', 'vault-build-')) @@ -32,7 +35,7 @@ beforeAll(async () => { built.host = result.host built.actions = result.actions built.migration = result.migration -}) +}, 0) afterAll(async () => { if (built.dir !== undefined) await rm(built.dir, { recursive: true, force: true }) }) diff --git a/test/unit/vault/windowsBrokerClient.test.ts b/test/unit/vault/windowsBrokerClient.test.ts index 7e2d55bc63..f5c680317e 100644 --- a/test/unit/vault/windowsBrokerClient.test.ts +++ b/test/unit/vault/windowsBrokerClient.test.ts @@ -13,11 +13,14 @@ import { // helper and the broker. Skipped elsewhere with this reason. const fixture = { current: undefined as WindowsBrokerFixture | undefined } describe.skipIf(process.platform !== 'win32')('Windows vault broker end to end', () => { + // The native helper builds and broker starts take as long as the machine + // needs (a slow hosted Windows runner passed the 30 s hook budget, PR #258): + // no time limit of ours on this setup (owner 2026-10-16). beforeAll(async () => { // Helper builds (the person's own C# compiler) happen here, inside the // hook budget; the test below stays a fast launch plus round trip. fixture.current = await startWindowsBrokerFixture('vs-wbroker-') - }) + }, 0) afterAll(async () => { await fixture.current?.dispose() }) diff --git a/test/unit/vault/windowsPipeHelperStart.test.ts b/test/unit/vault/windowsPipeHelperStart.test.ts index 04149d6059..e0e990efa5 100644 --- a/test/unit/vault/windowsPipeHelperStart.test.ts +++ b/test/unit/vault/windowsPipeHelperStart.test.ts @@ -22,6 +22,9 @@ const fixture: { root: string; helper?: WindowsVaultExecutable; dispose?: () => root: '', } describe.runIf(process.platform === 'win32')('Windows pipe helper start', () => { + // The native helper builds and broker starts take as long as the machine + // needs (a slow hosted Windows runner passed the 30 s hook budget, PR #258): + // no time limit of ours on this setup (owner 2026-10-16). beforeAll(async () => { fixture.root = await mkdtemp(path.join(await realpath(os.tmpdir()), 'vs-pipestart-')) // Not made here: the build makes its storage folder on first use, and @@ -44,7 +47,7 @@ describe.runIf(process.platform === 'win32')('Windows pipe helper start', () => readSlotSource: () => readFile(path.resolve('native/windows/MuseSparkVault.cs'), 'utf8'), readPipeSource: () => readFile(path.resolve('native/windows/MuseSparkVaultPipe.cs'), 'utf8'), }) - }) + }, 0) afterAll(async () => { fixture.dispose?.() await rm(fixture.root, { recursive: true, force: true }) diff --git a/test/unit/vault/windowsPipeRelay.test.ts b/test/unit/vault/windowsPipeRelay.test.ts index 8c0d9c1a1d..0a7689c8cd 100644 --- a/test/unit/vault/windowsPipeRelay.test.ts +++ b/test/unit/vault/windowsPipeRelay.test.ts @@ -91,6 +91,9 @@ const resultsSchema = z.strictObject({ const fixture = { root: '', ownerSid: '' } const children = new Set() describe.skipIf(process.platform !== 'win32')('Windows pipe relay against the real helper', () => { + // The native helper builds and broker starts take as long as the machine + // needs (a slow hosted Windows runner passed the 30 s hook budget, PR #258): + // no time limit of ours on this setup (owner 2026-10-16). beforeAll(async () => { fixture.root = await mkdtemp(path.join(tmpdir(), 'vs-piperelay-')) const bundle = path.join(fixture.root, 'pipeRelayChild.cjs') @@ -126,7 +129,7 @@ describe.skipIf(process.platform !== 'win32')('Windows pipe relay against the re throw new Error(`relay fixture exited while building: ${built.diagnostics}`) const report = builtSchema.parse(built.message[0]) fixture.ownerSid = report.ownerSid - }) + }, 0) afterAll(() => sweepFixtureChildren(children, fixture.root)) it('relays a connection, echoes bytes and answers file and identity queries', async () => { diff --git a/test/unit/vault/windowsVaultPanelFlow.test.ts b/test/unit/vault/windowsVaultPanelFlow.test.ts index e54874a5f8..cc1721b33f 100644 --- a/test/unit/vault/windowsVaultPanelFlow.test.ts +++ b/test/unit/vault/windowsVaultPanelFlow.test.ts @@ -15,9 +15,12 @@ import { drivePanelFlow } from '../helpers/vault/panelFlowDriver' const fixture = { current: undefined as WindowsBrokerFixture | undefined } describe.skipIf(process.platform !== 'win32')('Windows vault through the panel', () => { + // The native helper builds and broker starts take as long as the machine + // needs (a slow hosted Windows runner passed the 30 s hook budget, PR #258): + // no time limit of ours on this setup (owner 2026-10-16). beforeAll(async () => { fixture.current = await startWindowsBrokerFixture('vs-wpanel-') - }) + }, 0) afterAll(async () => { await fixture.current?.dispose() }) diff --git a/test/unit/vault/writerCrashPosix.test.ts b/test/unit/vault/writerCrashPosix.test.ts index d34358face..f9595b06e8 100644 --- a/test/unit/vault/writerCrashPosix.test.ts +++ b/test/unit/vault/writerCrashPosix.test.ts @@ -106,6 +106,9 @@ async function complete(root: string, action: string, key: Buffer) { // The shared cross-process writer lease (owner-death-only takeover) recovers // SIGKILL at every reset/restore stage and never takes over a live writer. describe('POSIX production writer crash recovery (CM109JOINA)', () => { + // The native helper builds and broker starts take as long as the machine + // needs (a slow hosted Windows runner passed the 30 s hook budget, PR #258): + // no time limit of ours on this setup (owner 2026-10-16). beforeAll(async () => { // macOS spells its temporary root through /var (a symlink to // /private/var), and the vault refuses roots under a symlinked @@ -120,7 +123,7 @@ describe('POSIX production writer crash recovery (CM109JOINA)', () => { format: 'cjs', }) await prebuildWindowsPipeHelper() - }) + }, 0) afterAll(async () => { await rm(fixture.directory, { recursive: true, force: true }) })