NEC-147: Local soak fails identity.test.ts's three compatibility-sensitive tests; CI passes them #206

Merged
nectenda-agent merged 2 commits from worktree-nec-147-local-soak-fails-identitytesttss-three-c into main 2026-09-29 00:30:44 +01:00
Collaborator

Task: NEC-147 — https://projectron.nerchure.com/tasks/155

Soak iterations after the first failed three identity.test.ts tests every time, because the test read NECTENDA_E2E_PLUGIN_DIR as 'this is the last published release' while soak.mjs sets it to the current mirror build to avoid re-staging. The compatibility pass is now declared with its own flag, NECTENDA_E2E_PREVIOUS_RELEASE=1, set by ci.yml's previous-release step; the flag without a plugin dir is refused. Reproduced first (3 fail with the dir set), fixed (14 pass), mutation-checked (flag set against the current build: the same 3 fail), and a 3-iteration soak of the file passed. Ride-along NEC-149: vitest.globalsetup.ts skipped the mirror lock whenever the plugin dir was set, so soak iterations 2+ ran out of .mirror unlocked; a dir inside .mirror now takes and releases the lock. Checked by hand against a live fake holder (refused; old code ran regardless). Known remaining gap: soak.mjs holds no lock between iterations, so a --check landing in that gap can still remove the plugin before the next iteration; it fails loudly ('No plugin found'), not silently.

Spec: docs/changes/NEC-147-soak-previous-flag/spec.md

Also fixes NEC-149: Soak iterations after the first run out of .mirror without the mirror lock

Changelog

NONE

Task: NEC-147 — https://projectron.nerchure.com/tasks/155 Soak iterations after the first failed three identity.test.ts tests every time, because the test read NECTENDA_E2E_PLUGIN_DIR as 'this is the last published release' while soak.mjs sets it to the current mirror build to avoid re-staging. The compatibility pass is now declared with its own flag, NECTENDA_E2E_PREVIOUS_RELEASE=1, set by ci.yml's previous-release step; the flag without a plugin dir is refused. Reproduced first (3 fail with the dir set), fixed (14 pass), mutation-checked (flag set against the current build: the same 3 fail), and a 3-iteration soak of the file passed. Ride-along NEC-149: vitest.globalsetup.ts skipped the mirror lock whenever the plugin dir was set, so soak iterations 2+ ran out of .mirror unlocked; a dir inside .mirror now takes and releases the lock. Checked by hand against a live fake holder (refused; old code ran regardless). Known remaining gap: soak.mjs holds no lock between iterations, so a --check landing in that gap can still remove the plugin before the next iteration; it fails loudly ('No plugin found'), not silently. Spec: `docs/changes/NEC-147-soak-previous-flag/spec.md` Also fixes NEC-149: Soak iterations after the first run out of .mirror without the mirror lock ## Changelog NONE
identity.test.ts read NECTENDA_E2E_PLUGIN_DIR as "this is the last published
release", but soak.mjs sets that variable to the current mirror build from its
second iteration on. Every soak iteration after the first then expected the
old interface and failed the same three tests. CI's compatibility step now
says so with NECTENDA_E2E_PREVIOUS_RELEASE=1, and the flag without a plugin
dir is refused.

Task: NEC-147

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WfgFt6RFucH5J8A2WT6Fzz
Hold the mirror lock when a reused plugin dir is the mirror
All checks were successful
Release note / release-note (pull_request) Successful in 15s
CI / build (pull_request) Successful in 4m48s
CI / e2e (pull_request) Successful in 5m22s
CI / promote (pull_request) Has been skipped
7f674c1422
vitest.globalsetup.ts returned before taking the lock whenever
NECTENDA_E2E_PLUGIN_DIR was set. soak.mjs sets it to .mirror/packages/plugin
from its second iteration on, so those runs loaded Obsidian out of .mirror
unlocked, and a build-mirror --check alongside could pull the plugin out from
under them. A dir inside .mirror now takes and releases the lock as a staging
run does; CI's previous release, elsewhere, still does not.

Task: NEC-147
Also-fixes: NEC-149

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WfgFt6RFucH5J8A2WT6Fzz
cruelacid force-pushed worktree-nec-147-local-soak-fails-identitytesttss-three-c from 7f674c1422
All checks were successful
Release note / release-note (pull_request) Successful in 15s
CI / build (pull_request) Successful in 4m48s
CI / e2e (pull_request) Successful in 5m22s
CI / promote (pull_request) Has been skipped
to 9990d3ed66
All checks were successful
Release note / release-note (pull_request) Successful in 14s
CI / build (pull_request) Successful in 4m50s
CI / e2e (pull_request) Successful in 5m24s
CI / promote (pull_request) Has been skipped
CI / e2e (push) Successful in 5m37s
CI / build (push) Successful in 5m52s
CI / promote (push) Successful in 33s
2026-09-29 00:24:44 +01:00
Compare
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
2 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
Nectenda/nectenda!206
No description provided.