From c7bdd3e94318416a82bb0df53dabd7310071cf14 Mon Sep 17 00:00:00 2001 From: Randy Northrup Date: Wed, 21 Oct 2026 21:27:17 -0700 Subject: [PATCH 1/4] docs(release): 0.19.0 released; Open VSX's check reads the universal package at its own address PLAN section 10 records the 0.19.0 release (tag v0.19.0 on 4e09cab6ea, release run 39720213044): the GitHub Release, Marketplace and npm published; the Open VSX job failed at its own check, because once a version has targeted packages Open VSX's untargeted / answer names whichever package it picks (win32-arm64 to the script), so the universal VSIX was compared with another target's bytes. Every package was uploaded; checked by each target's own address after the run, all seven on the Marketplace and on Open VSX match the release assets, npm's integrity equals the release tarball and the assets pass SHA256SUMS. The check now reads /universal/ (scripts/publish-registry.mjs). Drill against the real Open VSX: the tag's check fails 3 of 3 on the universal VSIX, the fixed one matches 3 of 3 and still matches win32-x64 (docs/certification/cifinal0190.md section 21). Also: the Windows real-use record for the release (docs/real-life/release-0.19.0-limits-W.md: 5 calls, every one muse-spark-1.3-contributor, $0.00), the roadmap regenerated for the release, and two closed section 7 gate records archived to make room for the record (docs/certification/plan-archive.md). Co-Authored-By: Claude Opus 5.5 --- CHANGELOG.md | 10 ++++ PLAN.md | 67 +++++++++------------- ROADMAP.md | 2 +- docs/certification/cifinal0190.md | 24 ++++++++ docs/certification/plan-archive.md | 27 +++++++++ docs/plan-archive/gates.md | 55 ++++++++++++++++++ docs/real-life/release-0.19.0-limits-W.md | 69 +++++++++++++++++++++++ scripts/publish-registry.mjs | 11 ++-- 8 files changed, 219 insertions(+), 46 deletions(-) create mode 100644 docs/real-life/release-0.19.0-limits-W.md 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..e4aa93d0c9 100644 --- a/docs/certification/cifinal0190.md +++ b/docs/certification/cifinal0190.md @@ -765,3 +765,27 @@ 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. 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, From d0a39a70ed310b4bb1a7dff91cdf225ab4f7780b Mon Sep 17 00:00:00 2001 From: Randy Northrup Date: Wed, 21 Oct 2026 21:49:24 -0700 Subject: [PATCH 2/4] test(vault): the panel flow's step message names the states the panel went through PR #258's first run failed in posixVaultPanelFlow on hosted macOS: after Unlock the panel still read "locked" when the step's wait ended, with no toast and no log, in product code that was green on every macOS shard of PR #257. The message now adds how many frames the panel published and its last states, so a repeat shows whether the step ever ran (docs/certification/cifinal0190.md section 22). Co-Authored-By: Claude Opus 5.5 --- docs/certification/cifinal0190.md | 14 ++++++++++++++ test/unit/helpers/vault/panelFlowDriver.ts | 7 ++++++- 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/docs/certification/cifinal0190.md b/docs/certification/cifinal0190.md index e4aa93d0c9..10115c45e5 100644 --- a/docs/certification/cifinal0190.md +++ b/docs/certification/cifinal0190.md @@ -789,3 +789,17 @@ VSX job ended "openvsx: the published artifact does not match the release". 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. 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) }, From a6f4767c975ccb89db9ddf40d6f34aa61c062fbd Mon Sep 17 00:00:00 2001 From: Randy Northrup Date: Wed, 21 Oct 2026 22:02:27 -0700 Subject: [PATCH 3/4] docs(certification): PR #258's second run lost a macOS runner to a shutdown signal Co-Authored-By: Claude Opus 5.5 --- docs/certification/cifinal0190.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/docs/certification/cifinal0190.md b/docs/certification/cifinal0190.md index 10115c45e5..cf5c5b505e 100644 --- a/docs/certification/cifinal0190.md +++ b/docs/certification/cifinal0190.md @@ -803,3 +803,10 @@ 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. From ed9947b996269b199ffa3155585cf5286d0e9625 Mon Sep 17 00:00:00 2001 From: Randy Northrup Date: Wed, 21 Oct 2026 22:22:37 -0700 Subject: [PATCH 4/4] test(vault): no time limit on the setup that builds the native helpers PR #258's third run failed on hosted Windows only: windowsBrokerClient's beforeAll, which builds the helpers with the person's own C# compiler, ran past the 30 s hook budget. Owner's rule (2026-10-16): no limit of ours that is not about a model. The seven vault suites whose setup builds or stages native helpers or starts a broker run it with no time limit; the five Windows suites pass here (14 tests). Co-Authored-By: Claude Opus 5.5 --- docs/certification/cifinal0190.md | 8 ++++++++ test/unit/vault/posixVaultPanelFlow.test.ts | 5 ++++- test/unit/vault/vaultPanelBuild.test.ts | 5 ++++- test/unit/vault/windowsBrokerClient.test.ts | 5 ++++- test/unit/vault/windowsPipeHelperStart.test.ts | 5 ++++- test/unit/vault/windowsPipeRelay.test.ts | 5 ++++- test/unit/vault/windowsVaultPanelFlow.test.ts | 5 ++++- test/unit/vault/writerCrashPosix.test.ts | 5 ++++- 8 files changed, 36 insertions(+), 7 deletions(-) diff --git a/docs/certification/cifinal0190.md b/docs/certification/cifinal0190.md index cf5c5b505e..b1e039bc81 100644 --- a/docs/certification/cifinal0190.md +++ b/docs/certification/cifinal0190.md @@ -810,3 +810,11 @@ 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/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 }) })