Skip to content

fix(ci): isolate verify-global-install into a per-run npm prefix#162

Merged
theagenticguy merged 1 commit into
mainfrom
fix/verify-global-install-hermetic-prefix
May 29, 2026
Merged

fix(ci): isolate verify-global-install into a per-run npm prefix#162
theagenticguy merged 1 commit into
mainfrom
fix/verify-global-install-hermetic-prefix

Conversation

@theagenticguy
Copy link
Copy Markdown
Owner

Summary

Fixes the intermittent Volta macOS leg failure in Verify Global Install — gate 2 (GHCR/postinstall fetch) + gate 4 (install > 60s budget) — that persisted on main even after node-pty was removed from the dependency graph.

Root cause (pinned, not guessed)

No OpenCodeHub package depends on node-pty anymore — the dep was removed in the graphty-Leiden vendoring (#157). Verified:

  • grep across all packages/*/package.json → 0 references
  • main's pnpm-lock.yaml → 0 occurrences
  • packed opencodehub-ingestion-0.4.3.tgz → graphty ABSENT, ships vendored graphty-leiden.js, no node-pty in deps

Yet Volta's npm install -g still fetched node-pty-prebuilt-multiarch from GitHub releases. The tell: arm64-nvm passed gate 2 on the SAME run while Volta failed it. The script installed into whatever global prefix the node manager provided, and Volta persists its global package dir across runs on the hosted runner. A node-pty left behind by a pre-removal run re-ran its prebuild-install GHCR fetch on the next npm install -g — and bloated install time to 75-95s (vs 25-50s on the clean legs). It's cached cross-run runner state, not the dependency graph.

Fix

Install into a fresh mktemp -d prefix per cell (npm_config_prefix + PATH prepend), removed on the existing EXIT trap. Each cell is now hermetic — the gates see only what this run's tarballs actually pull, immune to whatever a prior run left in a manager-managed global dir.

Verification

Ran the harness locally end-to-end (bash scripts/verify-global-install.sh local — packs all 17 workspace tarballs, global-installs into the isolated prefix, runs all gates):

isolated npm global prefix: /var/folders/.../verify-global-install-prefix.XXX
install exit=0 duration=12s
[PASS] gate 1  [PASS] gate 2 (zero GHCR fetches)  [PASS] gate 3  [PASS] gate 4 (12s)  [PASS] gate 5
[PASS] smoke: analyze  [PASS] smoke: query  [PASS] smoke: --version  [PASS] smoke: --help
passed=9 failed=0

Context

Third of a small flake-elimination set, all from the same Verify-Global-Install investigation:

Together these make the macOS legs deterministic. (Verify Global Install is not yet a required check; this is the work to make it green enough to opt in.)

Test plan

  • harness 9/9 locally, gate 2 clean, isolated prefix created + removed
  • bash syntax OK; EXIT-trap cleanup guarded for early-exit

The Volta macOS leg failed gate 2 (GHCR/postinstall fetch) + gate 4 (install
> 60s) intermittently, even though NO OpenCodeHub package depends on node-pty
anymore (dep removed in the graphty-Leiden vendoring; lockfile + every packed
tarball are clean — verified). Root cause: `npm install -g` installed into
whatever global prefix the node manager provides, and Volta persists its
global package dir across runs on the hosted runner. A node-pty left behind by
a pre-removal run re-ran its `prebuild-install` GHCR fetch on the next install
(and bloated install time to 75-95s vs 25-50s elsewhere). arm64-nvm on the
SAME run passed gate 2 — proof it's cached runner state, not the dep graph.

Install into a fresh `mktemp -d` prefix per cell (npm_config_prefix + PATH),
removed on the EXIT trap. Each cell is now hermetic: the gates see only what
THIS run's tarballs actually pull, immune to cross-run global pollution.

Validated locally end-to-end (`bash scripts/verify-global-install.sh local`):
9/9 gates+smokes pass, gate 2 clean, install 12s.
@theagenticguy theagenticguy merged commit 3b59373 into main May 29, 2026
41 of 43 checks passed
@theagenticguy theagenticguy deleted the fix/verify-global-install-hermetic-prefix branch May 29, 2026 13:13
@github-actions github-actions Bot mentioned this pull request May 29, 2026
theagenticguy pushed a commit that referenced this pull request May 29, 2026
🤖 Automated release via release-please
---


<details><summary>analysis: 0.3.2</summary>

##
[0.3.2](analysis-v0.3.1...analysis-v0.3.2)
(2026-05-29)


### Bug Fixes

* **deps:** downgrade write-file-atomic 8.0.0→7.0.1 to match supported
node range
([#155](#155))
([a723e53](a723e53))


### Dependencies

* The following workspace dependencies were updated
  * dependencies
    * @opencodehub/storage bumped to 0.2.2
    * @opencodehub/wiki bumped to 0.2.2
</details>

<details><summary>cli: 0.5.4</summary>

##
[0.5.4](cli-v0.5.3...cli-v0.5.4)
(2026-05-29)


### Features

* **cli:** doctor checks vendored wasm grammars + scip indexers
(--strict)
([#159](#159))
([36a241e](36a241e))


### Bug Fixes

* **deps:** downgrade write-file-atomic 8.0.0→7.0.1 to match supported
node range
([#155](#155))
([a723e53](a723e53))
* **scanners:** correct scanner exit-code handling and stop duplicate
skip logs
([#156](#156))
([5d30eb4](5d30eb4))


### Dependencies

* The following workspace dependencies were updated
  * dependencies
    * @opencodehub/analysis bumped to 0.3.2
    * @opencodehub/ingestion bumped to 0.4.4
    * @opencodehub/mcp bumped to 0.4.3
    * @opencodehub/pack bumped to 0.2.3
    * @opencodehub/scanners bumped to 0.2.1
    * @opencodehub/search bumped to 0.2.2
    * @opencodehub/storage bumped to 0.2.2
    * @opencodehub/wiki bumped to 0.2.2
</details>

<details><summary>cobol-proleap: 0.1.8</summary>

##
[0.1.8](cobol-proleap-v0.1.7...cobol-proleap-v0.1.8)
(2026-05-29)


### Dependencies

* The following workspace dependencies were updated
  * dependencies
    * @opencodehub/ingestion bumped to 0.4.4
</details>

<details><summary>ingestion: 0.4.4</summary>

##
[0.4.4](ingestion-v0.4.3...ingestion-v0.4.4)
(2026-05-29)


### Bug Fixes

* **deps:** downgrade write-file-atomic 8.0.0→7.0.1 to match supported
node range
([#155](#155))
([a723e53](a723e53))
* **ingestion:** vendor graphty Leiden to drop node-pty install fetch
([#157](#157))
([790ca4e](790ca4e))


### Dependencies

* The following workspace dependencies were updated
  * dependencies
    * @opencodehub/analysis bumped to 0.3.2
    * @opencodehub/scip-ingest bumped to 0.2.4
    * @opencodehub/storage bumped to 0.2.2
</details>

<details><summary>mcp: 0.4.3</summary>

##
[0.4.3](mcp-v0.4.2...mcp-v0.4.3)
(2026-05-29)


### Dependencies

* The following workspace dependencies were updated
  * dependencies
    * @opencodehub/analysis bumped to 0.3.2
    * @opencodehub/pack bumped to 0.2.3
    * @opencodehub/scanners bumped to 0.2.1
    * @opencodehub/search bumped to 0.2.2
    * @opencodehub/storage bumped to 0.2.2
</details>

<details><summary>pack: 0.2.3</summary>

##
[0.2.3](pack-v0.2.2...pack-v0.2.3)
(2026-05-29)


### Dependencies

* The following workspace dependencies were updated
  * dependencies
    * @opencodehub/analysis bumped to 0.3.2
    * @opencodehub/ingestion bumped to 0.4.4
    * @opencodehub/storage bumped to 0.2.2
</details>

<details><summary>scanners: 0.2.1</summary>

##
[0.2.1](scanners-v0.2.0...scanners-v0.2.1)
(2026-05-29)


### Bug Fixes

* **scanners:** correct scanner exit-code handling and stop duplicate
skip logs
([#156](#156))
([5d30eb4](5d30eb4))
</details>

<details><summary>scip-ingest: 0.2.4</summary>

##
[0.2.4](scip-ingest-v0.2.3...scip-ingest-v0.2.4)
(2026-05-29)


### Bug Fixes

* **scanners:** correct scanner exit-code handling and stop duplicate
skip logs
([#156](#156))
([5d30eb4](5d30eb4))
* **scip-ingest:** prepend ~/.codehub/bin to indexer spawn PATH
([#160](#160))
([4418db9](4418db9))


### Dependencies

* The following workspace dependencies were updated
  * dependencies
    * @opencodehub/analysis bumped to 0.3.2
</details>

<details><summary>search: 0.2.2</summary>

##
[0.2.2](search-v0.2.1...search-v0.2.2)
(2026-05-29)


### Dependencies

* The following workspace dependencies were updated
  * dependencies
    * @opencodehub/storage bumped to 0.2.2
</details>

<details><summary>storage: 0.2.2</summary>

##
[0.2.2](storage-v0.2.1...storage-v0.2.2)
(2026-05-29)


### Bug Fixes

* **storage:** retry transient lbug WAL→checkpoint race in bulkLoad
([#161](#161))
([450714c](450714c))
</details>

<details><summary>wiki: 0.2.2</summary>

##
[0.2.2](wiki-v0.2.1...wiki-v0.2.2)
(2026-05-29)


### Bug Fixes

* **deps:** downgrade write-file-atomic 8.0.0→7.0.1 to match supported
node range
([#155](#155))
([a723e53](a723e53))


### Dependencies

* The following workspace dependencies were updated
  * dependencies
    * @opencodehub/storage bumped to 0.2.2
</details>

<details><summary>root: 0.6.5</summary>

##
[0.6.5](root-v0.6.4...root-v0.6.5)
(2026-05-29)


### Features

* **cli:** doctor checks vendored wasm grammars + scip indexers
(--strict)
([#159](#159))
([36a241e](36a241e))


### Bug Fixes

* **ci:** isolate verify-global-install into a per-run npm prefix
([#162](#162))
([3b59373](3b59373))
* **deps:** bump qs 6.15.1→6.15.2 and tmp 0.2.4→0.2.6 to clear osv
findings
([#151](#151))
([2f798ec](2f798ec))
* **deps:** downgrade write-file-atomic 8.0.0→7.0.1 to match supported
node range
([#155](#155))
([a723e53](a723e53))
* **ingestion:** vendor graphty Leiden to drop node-pty install fetch
([#157](#157))
([790ca4e](790ca4e))
* **scanners:** correct scanner exit-code handling and stop duplicate
skip logs
([#156](#156))
([5d30eb4](5d30eb4))
* **scip-ingest:** prepend ~/.codehub/bin to indexer spawn PATH
([#160](#160))
([4418db9](4418db9))
* **storage:** retry transient lbug WAL→checkpoint race in bulkLoad
([#161](#161))
([450714c](450714c))
</details>

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Sign up for free to 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