test(server): isolate the keychain in the connections-route suite - #91

Merged
jack-champagne merged 1 commit into
local/amicodefrom
jack/test-keychain-isolation
Jul 28, 2026
Merged

test(server): isolate the keychain in the connections-route suite#91
jack-champagne merged 1 commit into
local/amicodefrom
jack/test-keychain-isolation

Conversation

@jack-champagne

Copy link
Copy Markdown
Member

Makes unit (linux) interpretable again. It has been dying with exit code 137 and reporting nothing.

Not an OOM

Turbo labels any signal-killed child "likely due to running out of memory." That label is boilerplate and it is wrong here. Bun's own report:

Elapsed: 1498ms | RSS: 0.15GB | Peak: 0.37GB | Faults: 0 | Machine: 32.38GB
panic(main thread): Segmentation fault at address 0x0

0.37 GB peak on a 32 GB machine, zero faults, dead in 1.5 s. A larger runner would not have helped (and is unavailable — the org is plan=free; GET /orgs/harmoniqs/actions/hosted-runners returns 404).

What it actually was

One test — amicode-connections-routes.test.ts:335, "full lifecycle: submit(valid) → …" — segfaults at connections.ts:1005:

pasqalSecretStore().write(PASQAL_SECRET_ACCOUNT,{ username, password })

which reaches @napi-rs/keyring's native Entry.setPassword(). Traced with instrumentation: [T3] before keychain prints, [T4] after keychain write never does.

That write sits only on the valid && token !== null branch, which explains the pass/fail pattern exactly:

testbranchkeychain writeresult
full lifecycle (valid + token)valid + tokenyescrash
null token → session-onlyvalid, null tokennopass
failure classes (exit 2/4/1)config / invalidnopass

Bisected to 467fb15cf ("two-step Pasqal auth", #194), which introduced that write per the ADR 0001 addendum. The test passed at 3e4b37298, the commit immediately before.

Production is not affected

Verified end-to-end, not assumed. Real Pasqal login, real pasqal_validate.py, real pasqal-cloud SDK, real keychain, against bun run … serve:

POST /amicode/connections/credential
ok=True state=connected devices=[{'name':'FRESNEL'},{'name':'FRESNEL_CAN1'}]
server: ALIVE

And it demonstrably reached the crash site — the keychain slot was written and the token persisted (token_len: 1278).

contextkeychain write runsresult
bun test + Effect routeyessegfault
bun run … serve + Effect routeyessurvives
bun test, keyring aloneyessurvives
bun run, keyring aloneyessurvives

Only the first combination crashes. It is a Bun-test-runner/NAPI interaction, not a product fault, and 467fb15cf is not shipping a crash to users.

The fix

Install the in-memory secret store in beforeEach — exactly what the sibling amicode-connections.test.ts already does, which is why that file passes:

restoreSecretStore=setPasqalSecretStore(inMemorySecretStore())

Also adds AMICO_PASQAL_KEYCHAIN_SERVICE to ENV_KEYS. pasqal-secret.ts documents it as existing so "an isolated sandbox / test run gets its own slot and never shares the real connection's secret"; it was unused here. Belt and braces, so a leak cannot reach the real slot even if the seam is ever removed.

Worth noting independently of the crash: this suite was driving the developer's real OS keyring.

Stub validator: bun → python3

stageStubValidator() set AMICO_PYTHON = process.execPath, i.e. bun standing in as the Python interpreter. In production amicode provisions <opsDir>/venvs/pasqal-connector and passes it as AMICO_PYTHON (harmoniqs/amicode#189, the bundled-Julia pattern), so the interpreter is always a real python. The old stub tested a configuration that never ships.

Now a python3-executed .py with the same record/scenario contract, plus actions/setup-python in the unit job. The stub needs an interpreter, not the SDK — integration against the real pasqal-cloud SDK stays where it belongs, in amicode's assert_provisioned_python.mjs gate.

The env assertion now filters interpreter-owned locale vars, because CPython injects LC_CTYPE into its own environ under PEP 538 C-locale coercion. It still asserts the real thing: that the spawner declared nothing beyond PASQAL_USERNAME/PASSWORD/PROJECT_ID + PATH.

Windows unit lane dropped

opencode.lock.json ships darwin-arm64 and linux-x64 only, so a windows unit lane gates a platform this fork does not distribute — and at ~50 min it is the long pole on every run. It was also red on arrival for a reason unrelated to anything under test: POSIX path separators hardcoded in amicode-vaults.test.ts (#76). e2e still runs both platforms.

Verification

amicode-connections-routes.test.ts 13 pass / 0 fail (was: segfault)
test/server/ (63 files) 554 pass / 2 skip / 0 fail
bun turbo typecheck 23 successful, 23 total

Before this, the full packages/opencode suite could not complete at all. It now runs 3234 tests to completion, leaving a readable list: the stale LLM fixtures (#80) and a umask-dependent permissions assertion in tool.write (0o644 vs 0o664 — passes on CI's umask 0022, fails on a developer umask 0002).

Refs #82, #76

The unit job died with exit 137 and reported nothing. Not an OOM (peak
0.37GB of 32GB, zero faults) — a segfault inside @napi-rs/keyring's
native setPassword(), reached from the pasqal submit success path.
Install the in-memory secret store, as the sibling
amicode-connections.test.ts already does. Production is unaffected: the
same write succeeds under `bun run … serve`, verified end-to-end against
Pasqal with real credentials.
Also swap the stub validator from a bun-executed .mjs to a
python3-executed .py. amicode provisions <opsDir>/venvs/pasqal-connector
and passes it as AMICO_PYTHON (harmoniqs/amicode#189), so the production
interpreter is always a real python; bun-as-interpreter tested a
configuration that never ships.
Drop the windows unit lane: opencode.lock.json ships darwin-arm64 and
linux-x64 only, and it was the ~50min long pole while red for an
unrelated reason (#76).
Refs #82, #76
@jack-champagne
jack-champagneforce-pushed the jack/test-keychain-isolation branch from 4875a0c to 1e83e32CompareJuly 28, 2026 22:06
@jack-champagne
jack-champagne merged commit 6f21665 into local/amicodeJul 28, 2026
1 of 4 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@jack-champagne
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

test(server): isolate the keychain in the connections-route suite - #91

Merged
jack-champagne merged 1 commit into
local/amicodefrom
jack/test-keychain-isolation
Jul 28, 2026
Merged

test(server): isolate the keychain in the connections-route suite#91
jack-champagne merged 1 commit into
local/amicodefrom
jack/test-keychain-isolation

Conversation

@jack-champagne

Copy link
Copy Markdown
Member

Makes unit (linux) interpretable again. It has been dying with exit code 137 and reporting nothing.

Not an OOM

Turbo labels any signal-killed child "likely due to running out of memory." That label is boilerplate and it is wrong here. Bun's own report:

Elapsed: 1498ms | RSS: 0.15GB | Peak: 0.37GB | Faults: 0 | Machine: 32.38GB
panic(main thread): Segmentation fault at address 0x0

0.37 GB peak on a 32 GB machine, zero faults, dead in 1.5 s. A larger runner would not have helped (and is unavailable — the org is plan=free; GET /orgs/harmoniqs/actions/hosted-runners returns 404).

What it actually was

One test — amicode-connections-routes.test.ts:335, "full lifecycle: submit(valid) → …" — segfaults at connections.ts:1005:

pasqalSecretStore().write(PASQAL_SECRET_ACCOUNT,{ username, password })

which reaches @napi-rs/keyring's native Entry.setPassword(). Traced with instrumentation: [T3] before keychain prints, [T4] after keychain write never does.

That write sits only on the valid && token !== null branch, which explains the pass/fail pattern exactly:

testbranchkeychain writeresult
full lifecycle (valid + token)valid + tokenyescrash
null token → session-onlyvalid, null tokennopass
failure classes (exit 2/4/1)config / invalidnopass

Bisected to 467fb15cf ("two-step Pasqal auth", #194), which introduced that write per the ADR 0001 addendum. The test passed at 3e4b37298, the commit immediately before.

Production is not affected

Verified end-to-end, not assumed. Real Pasqal login, real pasqal_validate.py, real pasqal-cloud SDK, real keychain, against bun run … serve:

POST /amicode/connections/credential
ok=True state=connected devices=[{'name':'FRESNEL'},{'name':'FRESNEL_CAN1'}]
server: ALIVE

And it demonstrably reached the crash site — the keychain slot was written and the token persisted (token_len: 1278).

contextkeychain write runsresult
bun test + Effect routeyessegfault
bun run … serve + Effect routeyessurvives
bun test, keyring aloneyessurvives
bun run, keyring aloneyessurvives

Only the first combination crashes. It is a Bun-test-runner/NAPI interaction, not a product fault, and 467fb15cf is not shipping a crash to users.

The fix

Install the in-memory secret store in beforeEach — exactly what the sibling amicode-connections.test.ts already does, which is why that file passes:

restoreSecretStore=setPasqalSecretStore(inMemorySecretStore())

Also adds AMICO_PASQAL_KEYCHAIN_SERVICE to ENV_KEYS. pasqal-secret.ts documents it as existing so "an isolated sandbox / test run gets its own slot and never shares the real connection's secret"; it was unused here. Belt and braces, so a leak cannot reach the real slot even if the seam is ever removed.

Worth noting independently of the crash: this suite was driving the developer's real OS keyring.

Stub validator: bun → python3

stageStubValidator() set AMICO_PYTHON = process.execPath, i.e. bun standing in as the Python interpreter. In production amicode provisions <opsDir>/venvs/pasqal-connector and passes it as AMICO_PYTHON (harmoniqs/amicode#189, the bundled-Julia pattern), so the interpreter is always a real python. The old stub tested a configuration that never ships.

Now a python3-executed .py with the same record/scenario contract, plus actions/setup-python in the unit job. The stub needs an interpreter, not the SDK — integration against the real pasqal-cloud SDK stays where it belongs, in amicode's assert_provisioned_python.mjs gate.

The env assertion now filters interpreter-owned locale vars, because CPython injects LC_CTYPE into its own environ under PEP 538 C-locale coercion. It still asserts the real thing: that the spawner declared nothing beyond PASQAL_USERNAME/PASSWORD/PROJECT_ID + PATH.

Windows unit lane dropped

opencode.lock.json ships darwin-arm64 and linux-x64 only, so a windows unit lane gates a platform this fork does not distribute — and at ~50 min it is the long pole on every run. It was also red on arrival for a reason unrelated to anything under test: POSIX path separators hardcoded in amicode-vaults.test.ts (#76). e2e still runs both platforms.

Verification

amicode-connections-routes.test.ts 13 pass / 0 fail (was: segfault)
test/server/ (63 files) 554 pass / 2 skip / 0 fail
bun turbo typecheck 23 successful, 23 total

Before this, the full packages/opencode suite could not complete at all. It now runs 3234 tests to completion, leaving a readable list: the stale LLM fixtures (#80) and a umask-dependent permissions assertion in tool.write (0o644 vs 0o664 — passes on CI's umask 0022, fails on a developer umask 0002).

Refs #82, #76

The unit job died with exit 137 and reported nothing. Not an OOM (peak
0.37GB of 32GB, zero faults) — a segfault inside @napi-rs/keyring's
native setPassword(), reached from the pasqal submit success path.
Install the in-memory secret store, as the sibling
amicode-connections.test.ts already does. Production is unaffected: the
same write succeeds under `bun run … serve`, verified end-to-end against
Pasqal with real credentials.
Also swap the stub validator from a bun-executed .mjs to a
python3-executed .py. amicode provisions <opsDir>/venvs/pasqal-connector
and passes it as AMICO_PYTHON (harmoniqs/amicode#189), so the production
interpreter is always a real python; bun-as-interpreter tested a
configuration that never ships.
Drop the windows unit lane: opencode.lock.json ships darwin-arm64 and
linux-x64 only, and it was the ~50min long pole while red for an
unrelated reason (#76).
Refs #82, #76
@jack-champagne
jack-champagneforce-pushed the jack/test-keychain-isolation branch from 4875a0c to 1e83e32CompareJuly 28, 2026 22:06
@jack-champagne
jack-champagne merged commit 6f21665 into local/amicodeJul 28, 2026
1 of 4 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@jack-champagne
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

test(server): isolate the keychain in the connections-route suite - #91

Merged
jack-champagne merged 1 commit into
local/amicodefrom
jack/test-keychain-isolation
Jul 28, 2026
Merged

test(server): isolate the keychain in the connections-route suite#91
jack-champagne merged 1 commit into
local/amicodefrom
jack/test-keychain-isolation

Conversation

@jack-champagne

Copy link
Copy Markdown
Member

Makes unit (linux) interpretable again. It has been dying with exit code 137 and reporting nothing.

Not an OOM

Turbo labels any signal-killed child "likely due to running out of memory." That label is boilerplate and it is wrong here. Bun's own report:

Elapsed: 1498ms | RSS: 0.15GB | Peak: 0.37GB | Faults: 0 | Machine: 32.38GB
panic(main thread): Segmentation fault at address 0x0

0.37 GB peak on a 32 GB machine, zero faults, dead in 1.5 s. A larger runner would not have helped (and is unavailable — the org is plan=free; GET /orgs/harmoniqs/actions/hosted-runners returns 404).

What it actually was

One test — amicode-connections-routes.test.ts:335, "full lifecycle: submit(valid) → …" — segfaults at connections.ts:1005:

pasqalSecretStore().write(PASQAL_SECRET_ACCOUNT,{ username, password })

which reaches @napi-rs/keyring's native Entry.setPassword(). Traced with instrumentation: [T3] before keychain prints, [T4] after keychain write never does.

That write sits only on the valid && token !== null branch, which explains the pass/fail pattern exactly:

testbranchkeychain writeresult
full lifecycle (valid + token)valid + tokenyescrash
null token → session-onlyvalid, null tokennopass
failure classes (exit 2/4/1)config / invalidnopass

Bisected to 467fb15cf ("two-step Pasqal auth", #194), which introduced that write per the ADR 0001 addendum. The test passed at 3e4b37298, the commit immediately before.

Production is not affected

Verified end-to-end, not assumed. Real Pasqal login, real pasqal_validate.py, real pasqal-cloud SDK, real keychain, against bun run … serve:

POST /amicode/connections/credential
ok=True state=connected devices=[{'name':'FRESNEL'},{'name':'FRESNEL_CAN1'}]
server: ALIVE

And it demonstrably reached the crash site — the keychain slot was written and the token persisted (token_len: 1278).

contextkeychain write runsresult
bun test + Effect routeyessegfault
bun run … serve + Effect routeyessurvives
bun test, keyring aloneyessurvives
bun run, keyring aloneyessurvives

Only the first combination crashes. It is a Bun-test-runner/NAPI interaction, not a product fault, and 467fb15cf is not shipping a crash to users.

The fix

Install the in-memory secret store in beforeEach — exactly what the sibling amicode-connections.test.ts already does, which is why that file passes:

restoreSecretStore=setPasqalSecretStore(inMemorySecretStore())

Also adds AMICO_PASQAL_KEYCHAIN_SERVICE to ENV_KEYS. pasqal-secret.ts documents it as existing so "an isolated sandbox / test run gets its own slot and never shares the real connection's secret"; it was unused here. Belt and braces, so a leak cannot reach the real slot even if the seam is ever removed.

Worth noting independently of the crash: this suite was driving the developer's real OS keyring.

Stub validator: bun → python3

stageStubValidator() set AMICO_PYTHON = process.execPath, i.e. bun standing in as the Python interpreter. In production amicode provisions <opsDir>/venvs/pasqal-connector and passes it as AMICO_PYTHON (harmoniqs/amicode#189, the bundled-Julia pattern), so the interpreter is always a real python. The old stub tested a configuration that never ships.

Now a python3-executed .py with the same record/scenario contract, plus actions/setup-python in the unit job. The stub needs an interpreter, not the SDK — integration against the real pasqal-cloud SDK stays where it belongs, in amicode's assert_provisioned_python.mjs gate.

The env assertion now filters interpreter-owned locale vars, because CPython injects LC_CTYPE into its own environ under PEP 538 C-locale coercion. It still asserts the real thing: that the spawner declared nothing beyond PASQAL_USERNAME/PASSWORD/PROJECT_ID + PATH.

Windows unit lane dropped

opencode.lock.json ships darwin-arm64 and linux-x64 only, so a windows unit lane gates a platform this fork does not distribute — and at ~50 min it is the long pole on every run. It was also red on arrival for a reason unrelated to anything under test: POSIX path separators hardcoded in amicode-vaults.test.ts (#76). e2e still runs both platforms.

Verification

amicode-connections-routes.test.ts 13 pass / 0 fail (was: segfault)
test/server/ (63 files) 554 pass / 2 skip / 0 fail
bun turbo typecheck 23 successful, 23 total

Before this, the full packages/opencode suite could not complete at all. It now runs 3234 tests to completion, leaving a readable list: the stale LLM fixtures (#80) and a umask-dependent permissions assertion in tool.write (0o644 vs 0o664 — passes on CI's umask 0022, fails on a developer umask 0002).

Refs #82, #76

The unit job died with exit 137 and reported nothing. Not an OOM (peak
0.37GB of 32GB, zero faults) — a segfault inside @napi-rs/keyring's
native setPassword(), reached from the pasqal submit success path.
Install the in-memory secret store, as the sibling
amicode-connections.test.ts already does. Production is unaffected: the
same write succeeds under `bun run … serve`, verified end-to-end against
Pasqal with real credentials.
Also swap the stub validator from a bun-executed .mjs to a
python3-executed .py. amicode provisions <opsDir>/venvs/pasqal-connector
and passes it as AMICO_PYTHON (harmoniqs/amicode#189), so the production
interpreter is always a real python; bun-as-interpreter tested a
configuration that never ships.
Drop the windows unit lane: opencode.lock.json ships darwin-arm64 and
linux-x64 only, and it was the ~50min long pole while red for an
unrelated reason (#76).
Refs #82, #76
@jack-champagne
jack-champagneforce-pushed the jack/test-keychain-isolation branch from 4875a0c to 1e83e32CompareJuly 28, 2026 22:06
@jack-champagne
jack-champagne merged commit 6f21665 into local/amicodeJul 28, 2026
1 of 4 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@jack-champagne
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

test(server): isolate the keychain in the connections-route suite - #91

Merged
jack-champagne merged 1 commit into
local/amicodefrom
jack/test-keychain-isolation
Jul 28, 2026
Merged

test(server): isolate the keychain in the connections-route suite#91
jack-champagne merged 1 commit into
local/amicodefrom
jack/test-keychain-isolation

Conversation

@jack-champagne

Copy link
Copy Markdown
Member

Makes unit (linux) interpretable again. It has been dying with exit code 137 and reporting nothing.

Not an OOM

Turbo labels any signal-killed child "likely due to running out of memory." That label is boilerplate and it is wrong here. Bun's own report:

Elapsed: 1498ms | RSS: 0.15GB | Peak: 0.37GB | Faults: 0 | Machine: 32.38GB
panic(main thread): Segmentation fault at address 0x0

0.37 GB peak on a 32 GB machine, zero faults, dead in 1.5 s. A larger runner would not have helped (and is unavailable — the org is plan=free; GET /orgs/harmoniqs/actions/hosted-runners returns 404).

What it actually was

One test — amicode-connections-routes.test.ts:335, "full lifecycle: submit(valid) → …" — segfaults at connections.ts:1005:

pasqalSecretStore().write(PASQAL_SECRET_ACCOUNT,{ username, password })

which reaches @napi-rs/keyring's native Entry.setPassword(). Traced with instrumentation: [T3] before keychain prints, [T4] after keychain write never does.

That write sits only on the valid && token !== null branch, which explains the pass/fail pattern exactly:

testbranchkeychain writeresult
full lifecycle (valid + token)valid + tokenyescrash
null token → session-onlyvalid, null tokennopass
failure classes (exit 2/4/1)config / invalidnopass

Bisected to 467fb15cf ("two-step Pasqal auth", #194), which introduced that write per the ADR 0001 addendum. The test passed at 3e4b37298, the commit immediately before.

Production is not affected

Verified end-to-end, not assumed. Real Pasqal login, real pasqal_validate.py, real pasqal-cloud SDK, real keychain, against bun run … serve:

POST /amicode/connections/credential
ok=True state=connected devices=[{'name':'FRESNEL'},{'name':'FRESNEL_CAN1'}]
server: ALIVE

And it demonstrably reached the crash site — the keychain slot was written and the token persisted (token_len: 1278).

contextkeychain write runsresult
bun test + Effect routeyessegfault
bun run … serve + Effect routeyessurvives
bun test, keyring aloneyessurvives
bun run, keyring aloneyessurvives

Only the first combination crashes. It is a Bun-test-runner/NAPI interaction, not a product fault, and 467fb15cf is not shipping a crash to users.

The fix

Install the in-memory secret store in beforeEach — exactly what the sibling amicode-connections.test.ts already does, which is why that file passes:

restoreSecretStore=setPasqalSecretStore(inMemorySecretStore())

Also adds AMICO_PASQAL_KEYCHAIN_SERVICE to ENV_KEYS. pasqal-secret.ts documents it as existing so "an isolated sandbox / test run gets its own slot and never shares the real connection's secret"; it was unused here. Belt and braces, so a leak cannot reach the real slot even if the seam is ever removed.

Worth noting independently of the crash: this suite was driving the developer's real OS keyring.

Stub validator: bun → python3

stageStubValidator() set AMICO_PYTHON = process.execPath, i.e. bun standing in as the Python interpreter. In production amicode provisions <opsDir>/venvs/pasqal-connector and passes it as AMICO_PYTHON (harmoniqs/amicode#189, the bundled-Julia pattern), so the interpreter is always a real python. The old stub tested a configuration that never ships.

Now a python3-executed .py with the same record/scenario contract, plus actions/setup-python in the unit job. The stub needs an interpreter, not the SDK — integration against the real pasqal-cloud SDK stays where it belongs, in amicode's assert_provisioned_python.mjs gate.

The env assertion now filters interpreter-owned locale vars, because CPython injects LC_CTYPE into its own environ under PEP 538 C-locale coercion. It still asserts the real thing: that the spawner declared nothing beyond PASQAL_USERNAME/PASSWORD/PROJECT_ID + PATH.

Windows unit lane dropped

opencode.lock.json ships darwin-arm64 and linux-x64 only, so a windows unit lane gates a platform this fork does not distribute — and at ~50 min it is the long pole on every run. It was also red on arrival for a reason unrelated to anything under test: POSIX path separators hardcoded in amicode-vaults.test.ts (#76). e2e still runs both platforms.

Verification

amicode-connections-routes.test.ts 13 pass / 0 fail (was: segfault)
test/server/ (63 files) 554 pass / 2 skip / 0 fail
bun turbo typecheck 23 successful, 23 total

Before this, the full packages/opencode suite could not complete at all. It now runs 3234 tests to completion, leaving a readable list: the stale LLM fixtures (#80) and a umask-dependent permissions assertion in tool.write (0o644 vs 0o664 — passes on CI's umask 0022, fails on a developer umask 0002).

Refs #82, #76

The unit job died with exit 137 and reported nothing. Not an OOM (peak
0.37GB of 32GB, zero faults) — a segfault inside @napi-rs/keyring's
native setPassword(), reached from the pasqal submit success path.
Install the in-memory secret store, as the sibling
amicode-connections.test.ts already does. Production is unaffected: the
same write succeeds under `bun run … serve`, verified end-to-end against
Pasqal with real credentials.
Also swap the stub validator from a bun-executed .mjs to a
python3-executed .py. amicode provisions <opsDir>/venvs/pasqal-connector
and passes it as AMICO_PYTHON (harmoniqs/amicode#189), so the production
interpreter is always a real python; bun-as-interpreter tested a
configuration that never ships.
Drop the windows unit lane: opencode.lock.json ships darwin-arm64 and
linux-x64 only, and it was the ~50min long pole while red for an
unrelated reason (#76).
Refs #82, #76
@jack-champagne
jack-champagneforce-pushed the jack/test-keychain-isolation branch from 4875a0c to 1e83e32CompareJuly 28, 2026 22:06
@jack-champagne
jack-champagne merged commit 6f21665 into local/amicodeJul 28, 2026
1 of 4 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@jack-champagne
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

test(server): isolate the keychain in the connections-route suite - #91

Merged
jack-champagne merged 1 commit into
local/amicodefrom
jack/test-keychain-isolation
Jul 28, 2026
Merged

test(server): isolate the keychain in the connections-route suite#91
jack-champagne merged 1 commit into
local/amicodefrom
jack/test-keychain-isolation

Conversation

@jack-champagne

Copy link
Copy Markdown
Member

Makes unit (linux) interpretable again. It has been dying with exit code 137 and reporting nothing.

Not an OOM

Turbo labels any signal-killed child "likely due to running out of memory." That label is boilerplate and it is wrong here. Bun's own report:

Elapsed: 1498ms | RSS: 0.15GB | Peak: 0.37GB | Faults: 0 | Machine: 32.38GB
panic(main thread): Segmentation fault at address 0x0

0.37 GB peak on a 32 GB machine, zero faults, dead in 1.5 s. A larger runner would not have helped (and is unavailable — the org is plan=free; GET /orgs/harmoniqs/actions/hosted-runners returns 404).

What it actually was

One test — amicode-connections-routes.test.ts:335, "full lifecycle: submit(valid) → …" — segfaults at connections.ts:1005:

pasqalSecretStore().write(PASQAL_SECRET_ACCOUNT,{ username, password })

which reaches @napi-rs/keyring's native Entry.setPassword(). Traced with instrumentation: [T3] before keychain prints, [T4] after keychain write never does.

That write sits only on the valid && token !== null branch, which explains the pass/fail pattern exactly:

testbranchkeychain writeresult
full lifecycle (valid + token)valid + tokenyescrash
null token → session-onlyvalid, null tokennopass
failure classes (exit 2/4/1)config / invalidnopass

Bisected to 467fb15cf ("two-step Pasqal auth", #194), which introduced that write per the ADR 0001 addendum. The test passed at 3e4b37298, the commit immediately before.

Production is not affected

Verified end-to-end, not assumed. Real Pasqal login, real pasqal_validate.py, real pasqal-cloud SDK, real keychain, against bun run … serve:

POST /amicode/connections/credential
ok=True state=connected devices=[{'name':'FRESNEL'},{'name':'FRESNEL_CAN1'}]
server: ALIVE

And it demonstrably reached the crash site — the keychain slot was written and the token persisted (token_len: 1278).

contextkeychain write runsresult
bun test + Effect routeyessegfault
bun run … serve + Effect routeyessurvives
bun test, keyring aloneyessurvives
bun run, keyring aloneyessurvives

Only the first combination crashes. It is a Bun-test-runner/NAPI interaction, not a product fault, and 467fb15cf is not shipping a crash to users.

The fix

Install the in-memory secret store in beforeEach — exactly what the sibling amicode-connections.test.ts already does, which is why that file passes:

restoreSecretStore=setPasqalSecretStore(inMemorySecretStore())

Also adds AMICO_PASQAL_KEYCHAIN_SERVICE to ENV_KEYS. pasqal-secret.ts documents it as existing so "an isolated sandbox / test run gets its own slot and never shares the real connection's secret"; it was unused here. Belt and braces, so a leak cannot reach the real slot even if the seam is ever removed.

Worth noting independently of the crash: this suite was driving the developer's real OS keyring.

Stub validator: bun → python3

stageStubValidator() set AMICO_PYTHON = process.execPath, i.e. bun standing in as the Python interpreter. In production amicode provisions <opsDir>/venvs/pasqal-connector and passes it as AMICO_PYTHON (harmoniqs/amicode#189, the bundled-Julia pattern), so the interpreter is always a real python. The old stub tested a configuration that never ships.

Now a python3-executed .py with the same record/scenario contract, plus actions/setup-python in the unit job. The stub needs an interpreter, not the SDK — integration against the real pasqal-cloud SDK stays where it belongs, in amicode's assert_provisioned_python.mjs gate.

The env assertion now filters interpreter-owned locale vars, because CPython injects LC_CTYPE into its own environ under PEP 538 C-locale coercion. It still asserts the real thing: that the spawner declared nothing beyond PASQAL_USERNAME/PASSWORD/PROJECT_ID + PATH.

Windows unit lane dropped

opencode.lock.json ships darwin-arm64 and linux-x64 only, so a windows unit lane gates a platform this fork does not distribute — and at ~50 min it is the long pole on every run. It was also red on arrival for a reason unrelated to anything under test: POSIX path separators hardcoded in amicode-vaults.test.ts (#76). e2e still runs both platforms.

Verification

amicode-connections-routes.test.ts 13 pass / 0 fail (was: segfault)
test/server/ (63 files) 554 pass / 2 skip / 0 fail
bun turbo typecheck 23 successful, 23 total

Before this, the full packages/opencode suite could not complete at all. It now runs 3234 tests to completion, leaving a readable list: the stale LLM fixtures (#80) and a umask-dependent permissions assertion in tool.write (0o644 vs 0o664 — passes on CI's umask 0022, fails on a developer umask 0002).

Refs #82, #76

The unit job died with exit 137 and reported nothing. Not an OOM (peak
0.37GB of 32GB, zero faults) — a segfault inside @napi-rs/keyring's
native setPassword(), reached from the pasqal submit success path.
Install the in-memory secret store, as the sibling
amicode-connections.test.ts already does. Production is unaffected: the
same write succeeds under `bun run … serve`, verified end-to-end against
Pasqal with real credentials.
Also swap the stub validator from a bun-executed .mjs to a
python3-executed .py. amicode provisions <opsDir>/venvs/pasqal-connector
and passes it as AMICO_PYTHON (harmoniqs/amicode#189), so the production
interpreter is always a real python; bun-as-interpreter tested a
configuration that never ships.
Drop the windows unit lane: opencode.lock.json ships darwin-arm64 and
linux-x64 only, and it was the ~50min long pole while red for an
unrelated reason (#76).
Refs #82, #76
@jack-champagne
jack-champagneforce-pushed the jack/test-keychain-isolation branch from 4875a0c to 1e83e32CompareJuly 28, 2026 22:06
@jack-champagne
jack-champagne merged commit 6f21665 into local/amicodeJul 28, 2026
1 of 4 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@jack-champagne
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

test(server): isolate the keychain in the connections-route suite - #91

Merged
jack-champagne merged 1 commit into
local/amicodefrom
jack/test-keychain-isolation
Jul 28, 2026
Merged

test(server): isolate the keychain in the connections-route suite#91
jack-champagne merged 1 commit into
local/amicodefrom
jack/test-keychain-isolation

Conversation

@jack-champagne

Copy link
Copy Markdown
Member

Makes unit (linux) interpretable again. It has been dying with exit code 137 and reporting nothing.

Not an OOM

Turbo labels any signal-killed child "likely due to running out of memory." That label is boilerplate and it is wrong here. Bun's own report:

Elapsed: 1498ms | RSS: 0.15GB | Peak: 0.37GB | Faults: 0 | Machine: 32.38GB
panic(main thread): Segmentation fault at address 0x0

0.37 GB peak on a 32 GB machine, zero faults, dead in 1.5 s. A larger runner would not have helped (and is unavailable — the org is plan=free; GET /orgs/harmoniqs/actions/hosted-runners returns 404).

What it actually was

One test — amicode-connections-routes.test.ts:335, "full lifecycle: submit(valid) → …" — segfaults at connections.ts:1005:

pasqalSecretStore().write(PASQAL_SECRET_ACCOUNT,{ username, password })

which reaches @napi-rs/keyring's native Entry.setPassword(). Traced with instrumentation: [T3] before keychain prints, [T4] after keychain write never does.

That write sits only on the valid && token !== null branch, which explains the pass/fail pattern exactly:

testbranchkeychain writeresult
full lifecycle (valid + token)valid + tokenyescrash
null token → session-onlyvalid, null tokennopass
failure classes (exit 2/4/1)config / invalidnopass

Bisected to 467fb15cf ("two-step Pasqal auth", #194), which introduced that write per the ADR 0001 addendum. The test passed at 3e4b37298, the commit immediately before.

Production is not affected

Verified end-to-end, not assumed. Real Pasqal login, real pasqal_validate.py, real pasqal-cloud SDK, real keychain, against bun run … serve:

POST /amicode/connections/credential
ok=True state=connected devices=[{'name':'FRESNEL'},{'name':'FRESNEL_CAN1'}]
server: ALIVE

And it demonstrably reached the crash site — the keychain slot was written and the token persisted (token_len: 1278).

contextkeychain write runsresult
bun test + Effect routeyessegfault
bun run … serve + Effect routeyessurvives
bun test, keyring aloneyessurvives
bun run, keyring aloneyessurvives

Only the first combination crashes. It is a Bun-test-runner/NAPI interaction, not a product fault, and 467fb15cf is not shipping a crash to users.

The fix

Install the in-memory secret store in beforeEach — exactly what the sibling amicode-connections.test.ts already does, which is why that file passes:

restoreSecretStore=setPasqalSecretStore(inMemorySecretStore())

Also adds AMICO_PASQAL_KEYCHAIN_SERVICE to ENV_KEYS. pasqal-secret.ts documents it as existing so "an isolated sandbox / test run gets its own slot and never shares the real connection's secret"; it was unused here. Belt and braces, so a leak cannot reach the real slot even if the seam is ever removed.

Worth noting independently of the crash: this suite was driving the developer's real OS keyring.

Stub validator: bun → python3

stageStubValidator() set AMICO_PYTHON = process.execPath, i.e. bun standing in as the Python interpreter. In production amicode provisions <opsDir>/venvs/pasqal-connector and passes it as AMICO_PYTHON (harmoniqs/amicode#189, the bundled-Julia pattern), so the interpreter is always a real python. The old stub tested a configuration that never ships.

Now a python3-executed .py with the same record/scenario contract, plus actions/setup-python in the unit job. The stub needs an interpreter, not the SDK — integration against the real pasqal-cloud SDK stays where it belongs, in amicode's assert_provisioned_python.mjs gate.

The env assertion now filters interpreter-owned locale vars, because CPython injects LC_CTYPE into its own environ under PEP 538 C-locale coercion. It still asserts the real thing: that the spawner declared nothing beyond PASQAL_USERNAME/PASSWORD/PROJECT_ID + PATH.

Windows unit lane dropped

opencode.lock.json ships darwin-arm64 and linux-x64 only, so a windows unit lane gates a platform this fork does not distribute — and at ~50 min it is the long pole on every run. It was also red on arrival for a reason unrelated to anything under test: POSIX path separators hardcoded in amicode-vaults.test.ts (#76). e2e still runs both platforms.

Verification

amicode-connections-routes.test.ts 13 pass / 0 fail (was: segfault)
test/server/ (63 files) 554 pass / 2 skip / 0 fail
bun turbo typecheck 23 successful, 23 total

Before this, the full packages/opencode suite could not complete at all. It now runs 3234 tests to completion, leaving a readable list: the stale LLM fixtures (#80) and a umask-dependent permissions assertion in tool.write (0o644 vs 0o664 — passes on CI's umask 0022, fails on a developer umask 0002).

Refs #82, #76

The unit job died with exit 137 and reported nothing. Not an OOM (peak
0.37GB of 32GB, zero faults) — a segfault inside @napi-rs/keyring's
native setPassword(), reached from the pasqal submit success path.
Install the in-memory secret store, as the sibling
amicode-connections.test.ts already does. Production is unaffected: the
same write succeeds under `bun run … serve`, verified end-to-end against
Pasqal with real credentials.
Also swap the stub validator from a bun-executed .mjs to a
python3-executed .py. amicode provisions <opsDir>/venvs/pasqal-connector
and passes it as AMICO_PYTHON (harmoniqs/amicode#189), so the production
interpreter is always a real python; bun-as-interpreter tested a
configuration that never ships.
Drop the windows unit lane: opencode.lock.json ships darwin-arm64 and
linux-x64 only, and it was the ~50min long pole while red for an
unrelated reason (#76).
Refs #82, #76
@jack-champagne
jack-champagneforce-pushed the jack/test-keychain-isolation branch from 4875a0c to 1e83e32CompareJuly 28, 2026 22:06
@jack-champagne
jack-champagne merged commit 6f21665 into local/amicodeJul 28, 2026
1 of 4 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@jack-champagne
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

test(server): isolate the keychain in the connections-route suite - #91

Merged
jack-champagne merged 1 commit into
local/amicodefrom
jack/test-keychain-isolation
Jul 28, 2026
Merged

test(server): isolate the keychain in the connections-route suite#91
jack-champagne merged 1 commit into
local/amicodefrom
jack/test-keychain-isolation

Conversation

@jack-champagne

Copy link
Copy Markdown
Member

Makes unit (linux) interpretable again. It has been dying with exit code 137 and reporting nothing.

Not an OOM

Turbo labels any signal-killed child "likely due to running out of memory." That label is boilerplate and it is wrong here. Bun's own report:

Elapsed: 1498ms | RSS: 0.15GB | Peak: 0.37GB | Faults: 0 | Machine: 32.38GB
panic(main thread): Segmentation fault at address 0x0

0.37 GB peak on a 32 GB machine, zero faults, dead in 1.5 s. A larger runner would not have helped (and is unavailable — the org is plan=free; GET /orgs/harmoniqs/actions/hosted-runners returns 404).

What it actually was

One test — amicode-connections-routes.test.ts:335, "full lifecycle: submit(valid) → …" — segfaults at connections.ts:1005:

pasqalSecretStore().write(PASQAL_SECRET_ACCOUNT,{ username, password })

which reaches @napi-rs/keyring's native Entry.setPassword(). Traced with instrumentation: [T3] before keychain prints, [T4] after keychain write never does.

That write sits only on the valid && token !== null branch, which explains the pass/fail pattern exactly:

testbranchkeychain writeresult
full lifecycle (valid + token)valid + tokenyescrash
null token → session-onlyvalid, null tokennopass
failure classes (exit 2/4/1)config / invalidnopass

Bisected to 467fb15cf ("two-step Pasqal auth", #194), which introduced that write per the ADR 0001 addendum. The test passed at 3e4b37298, the commit immediately before.

Production is not affected

Verified end-to-end, not assumed. Real Pasqal login, real pasqal_validate.py, real pasqal-cloud SDK, real keychain, against bun run … serve:

POST /amicode/connections/credential
ok=True state=connected devices=[{'name':'FRESNEL'},{'name':'FRESNEL_CAN1'}]
server: ALIVE

And it demonstrably reached the crash site — the keychain slot was written and the token persisted (token_len: 1278).

contextkeychain write runsresult
bun test + Effect routeyessegfault
bun run … serve + Effect routeyessurvives
bun test, keyring aloneyessurvives
bun run, keyring aloneyessurvives

Only the first combination crashes. It is a Bun-test-runner/NAPI interaction, not a product fault, and 467fb15cf is not shipping a crash to users.

The fix

Install the in-memory secret store in beforeEach — exactly what the sibling amicode-connections.test.ts already does, which is why that file passes:

restoreSecretStore=setPasqalSecretStore(inMemorySecretStore())

Also adds AMICO_PASQAL_KEYCHAIN_SERVICE to ENV_KEYS. pasqal-secret.ts documents it as existing so "an isolated sandbox / test run gets its own slot and never shares the real connection's secret"; it was unused here. Belt and braces, so a leak cannot reach the real slot even if the seam is ever removed.

Worth noting independently of the crash: this suite was driving the developer's real OS keyring.

Stub validator: bun → python3

stageStubValidator() set AMICO_PYTHON = process.execPath, i.e. bun standing in as the Python interpreter. In production amicode provisions <opsDir>/venvs/pasqal-connector and passes it as AMICO_PYTHON (harmoniqs/amicode#189, the bundled-Julia pattern), so the interpreter is always a real python. The old stub tested a configuration that never ships.

Now a python3-executed .py with the same record/scenario contract, plus actions/setup-python in the unit job. The stub needs an interpreter, not the SDK — integration against the real pasqal-cloud SDK stays where it belongs, in amicode's assert_provisioned_python.mjs gate.

The env assertion now filters interpreter-owned locale vars, because CPython injects LC_CTYPE into its own environ under PEP 538 C-locale coercion. It still asserts the real thing: that the spawner declared nothing beyond PASQAL_USERNAME/PASSWORD/PROJECT_ID + PATH.

Windows unit lane dropped

opencode.lock.json ships darwin-arm64 and linux-x64 only, so a windows unit lane gates a platform this fork does not distribute — and at ~50 min it is the long pole on every run. It was also red on arrival for a reason unrelated to anything under test: POSIX path separators hardcoded in amicode-vaults.test.ts (#76). e2e still runs both platforms.

Verification

amicode-connections-routes.test.ts 13 pass / 0 fail (was: segfault)
test/server/ (63 files) 554 pass / 2 skip / 0 fail
bun turbo typecheck 23 successful, 23 total

Before this, the full packages/opencode suite could not complete at all. It now runs 3234 tests to completion, leaving a readable list: the stale LLM fixtures (#80) and a umask-dependent permissions assertion in tool.write (0o644 vs 0o664 — passes on CI's umask 0022, fails on a developer umask 0002).

Refs #82, #76

The unit job died with exit 137 and reported nothing. Not an OOM (peak
0.37GB of 32GB, zero faults) — a segfault inside @napi-rs/keyring's
native setPassword(), reached from the pasqal submit success path.
Install the in-memory secret store, as the sibling
amicode-connections.test.ts already does. Production is unaffected: the
same write succeeds under `bun run … serve`, verified end-to-end against
Pasqal with real credentials.
Also swap the stub validator from a bun-executed .mjs to a
python3-executed .py. amicode provisions <opsDir>/venvs/pasqal-connector
and passes it as AMICO_PYTHON (harmoniqs/amicode#189), so the production
interpreter is always a real python; bun-as-interpreter tested a
configuration that never ships.
Drop the windows unit lane: opencode.lock.json ships darwin-arm64 and
linux-x64 only, and it was the ~50min long pole while red for an
unrelated reason (#76).
Refs #82, #76
@jack-champagne
jack-champagneforce-pushed the jack/test-keychain-isolation branch from 4875a0c to 1e83e32CompareJuly 28, 2026 22:06
@jack-champagne
jack-champagne merged commit 6f21665 into local/amicodeJul 28, 2026
1 of 4 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@jack-champagne
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

test(server): isolate the keychain in the connections-route suite - #91

Merged
jack-champagne merged 1 commit into
local/amicodefrom
jack/test-keychain-isolation
Jul 28, 2026
Merged

test(server): isolate the keychain in the connections-route suite#91
jack-champagne merged 1 commit into
local/amicodefrom
jack/test-keychain-isolation

Conversation

@jack-champagne

Copy link
Copy Markdown
Member

Makes unit (linux) interpretable again. It has been dying with exit code 137 and reporting nothing.

Not an OOM

Turbo labels any signal-killed child "likely due to running out of memory." That label is boilerplate and it is wrong here. Bun's own report:

Elapsed: 1498ms | RSS: 0.15GB | Peak: 0.37GB | Faults: 0 | Machine: 32.38GB
panic(main thread): Segmentation fault at address 0x0

0.37 GB peak on a 32 GB machine, zero faults, dead in 1.5 s. A larger runner would not have helped (and is unavailable — the org is plan=free; GET /orgs/harmoniqs/actions/hosted-runners returns 404).

What it actually was

One test — amicode-connections-routes.test.ts:335, "full lifecycle: submit(valid) → …" — segfaults at connections.ts:1005:

pasqalSecretStore().write(PASQAL_SECRET_ACCOUNT,{ username, password })

which reaches @napi-rs/keyring's native Entry.setPassword(). Traced with instrumentation: [T3] before keychain prints, [T4] after keychain write never does.

That write sits only on the valid && token !== null branch, which explains the pass/fail pattern exactly:

testbranchkeychain writeresult
full lifecycle (valid + token)valid + tokenyescrash
null token → session-onlyvalid, null tokennopass
failure classes (exit 2/4/1)config / invalidnopass

Bisected to 467fb15cf ("two-step Pasqal auth", #194), which introduced that write per the ADR 0001 addendum. The test passed at 3e4b37298, the commit immediately before.

Production is not affected

Verified end-to-end, not assumed. Real Pasqal login, real pasqal_validate.py, real pasqal-cloud SDK, real keychain, against bun run … serve:

POST /amicode/connections/credential
ok=True state=connected devices=[{'name':'FRESNEL'},{'name':'FRESNEL_CAN1'}]
server: ALIVE

And it demonstrably reached the crash site — the keychain slot was written and the token persisted (token_len: 1278).

contextkeychain write runsresult
bun test + Effect routeyessegfault
bun run … serve + Effect routeyessurvives
bun test, keyring aloneyessurvives
bun run, keyring aloneyessurvives

Only the first combination crashes. It is a Bun-test-runner/NAPI interaction, not a product fault, and 467fb15cf is not shipping a crash to users.

The fix

Install the in-memory secret store in beforeEach — exactly what the sibling amicode-connections.test.ts already does, which is why that file passes:

restoreSecretStore=setPasqalSecretStore(inMemorySecretStore())

Also adds AMICO_PASQAL_KEYCHAIN_SERVICE to ENV_KEYS. pasqal-secret.ts documents it as existing so "an isolated sandbox / test run gets its own slot and never shares the real connection's secret"; it was unused here. Belt and braces, so a leak cannot reach the real slot even if the seam is ever removed.

Worth noting independently of the crash: this suite was driving the developer's real OS keyring.

Stub validator: bun → python3

stageStubValidator() set AMICO_PYTHON = process.execPath, i.e. bun standing in as the Python interpreter. In production amicode provisions <opsDir>/venvs/pasqal-connector and passes it as AMICO_PYTHON (harmoniqs/amicode#189, the bundled-Julia pattern), so the interpreter is always a real python. The old stub tested a configuration that never ships.

Now a python3-executed .py with the same record/scenario contract, plus actions/setup-python in the unit job. The stub needs an interpreter, not the SDK — integration against the real pasqal-cloud SDK stays where it belongs, in amicode's assert_provisioned_python.mjs gate.

The env assertion now filters interpreter-owned locale vars, because CPython injects LC_CTYPE into its own environ under PEP 538 C-locale coercion. It still asserts the real thing: that the spawner declared nothing beyond PASQAL_USERNAME/PASSWORD/PROJECT_ID + PATH.

Windows unit lane dropped

opencode.lock.json ships darwin-arm64 and linux-x64 only, so a windows unit lane gates a platform this fork does not distribute — and at ~50 min it is the long pole on every run. It was also red on arrival for a reason unrelated to anything under test: POSIX path separators hardcoded in amicode-vaults.test.ts (#76). e2e still runs both platforms.

Verification

amicode-connections-routes.test.ts 13 pass / 0 fail (was: segfault)
test/server/ (63 files) 554 pass / 2 skip / 0 fail
bun turbo typecheck 23 successful, 23 total

Before this, the full packages/opencode suite could not complete at all. It now runs 3234 tests to completion, leaving a readable list: the stale LLM fixtures (#80) and a umask-dependent permissions assertion in tool.write (0o644 vs 0o664 — passes on CI's umask 0022, fails on a developer umask 0002).

Refs #82, #76

The unit job died with exit 137 and reported nothing. Not an OOM (peak
0.37GB of 32GB, zero faults) — a segfault inside @napi-rs/keyring's
native setPassword(), reached from the pasqal submit success path.
Install the in-memory secret store, as the sibling
amicode-connections.test.ts already does. Production is unaffected: the
same write succeeds under `bun run … serve`, verified end-to-end against
Pasqal with real credentials.
Also swap the stub validator from a bun-executed .mjs to a
python3-executed .py. amicode provisions <opsDir>/venvs/pasqal-connector
and passes it as AMICO_PYTHON (harmoniqs/amicode#189), so the production
interpreter is always a real python; bun-as-interpreter tested a
configuration that never ships.
Drop the windows unit lane: opencode.lock.json ships darwin-arm64 and
linux-x64 only, and it was the ~50min long pole while red for an
unrelated reason (#76).
Refs #82, #76
@jack-champagne
jack-champagneforce-pushed the jack/test-keychain-isolation branch from 4875a0c to 1e83e32CompareJuly 28, 2026 22:06
@jack-champagne
jack-champagne merged commit 6f21665 into local/amicodeJul 28, 2026
1 of 4 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@jack-champagne