Repository navigation
#6 Node.js 24 LTS from NodeSource apt, versioned in deploy/ - #7
Merged
Merged
Conversation
…ngerprint Red until deploy/ and DEPLOYMENT.md land (5 of 5 failing at this commit). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
install refuses a key whose fingerprint isn't NodeSource's (exercised); check compares the host against deploy/apt/, the keyring, the nodejs candidate's source and the major line, and resolves node through merged-/usr rather than comparing paths as text. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…e by site=, major bumps, removal Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…1), fetch and apt failures say so (2) Previously a non-key download exited 2 with no message (set -e on the command substitution, gpg's stderr discarded) and a 404 exited 22. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…so the lane takes only Node site=deb.nodesource.com selects the whole site (nodejs and nsolid today). Verified: apt-cache policy gives nodejs 600, nsolid 100; with nodejs stepped back to 24.20.0 the site= dry-run still selects nodejs, not nsolid. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…' run.md applies Latent here (this session is at 0), but a -1000 session would otherwise make dpkg unkillable beside the production service. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ure yet, not that it is scheduled Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ists; a bare apt-get install is a no-op here apt-daily.timer is masked and APT::Periodic::Enable is 0 on this image, so package lists are only as fresh as the last manual apt-get update. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…paths; the bump procedure names them A bump that follows the old procedure (sources + EXPECTED_MAJOR only) now fails test_docs_follow_the_major_line_and_the_installed_paths until DEPLOYMENT.md and AGENTS.md follow (mutation-checked). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Verified: with nodejs stepped back to 24.20.0, check exits 0 and prints 'pending: nodejs 24.20.0-1nodesource1 -> 24.21.0-1nodesource1'; restored, the line is gone. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ackage Verified: the host passes; a copy expecting another owner reports drift (3). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…est holds the bare invocation Mutation-checked: an added header line broke the old line-number usage() and failed the new test; the pattern version prints the same help either way. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This was referenced Sep 30, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Closes #6.
What
Node 24 LTS from NodeSource's apt repo on co-processor, for agent tooling only (
using-mayfly-chat, SocratiCode'snpx). The service never runs it. It is versioned here so the host can be checked against the repo and rebuilt from it.deploy/apt/nodesource.sources(deb822):node_24.x, withSigned-By:naming a dedicated keyring.deploy/apt/nodesource.pref:nodejspinned todeb.nodesource.comat 600, which beats universe'snodejs18 without allowing a downgrade.deploy/nodesource.sh:install(root) fetches the key and refuses it unless the fingerprint is6F71…E0B4(watcher#296). It then installs the keyring and both files, and runsapt-get install nodejswithNEEDRESTART_MODE=l.check(no root) compares the host againstdeploy/apt/, the keyring's fingerprint, the source of thenodejscandidate, and the major line. It exits 3 and names each drift.tests/test_nodesource.py: the files and the script agree, the fingerprint matches DEPLOYMENT.md's, andbash -npasses.EXPECTED_MAJORmakes a major bump a deliberate, test-failing edit, like the co-core pin.Verified on co-processor, 2026-09-30
Before the install,
checkexited 3 and named all six gaps.A copy of the script with a wrong expected fingerprint refused (exit 1) and installed nothing.
installgavenodev24.21.0 with npm and npx 11.19.0 bundled, no Ubuntunpmpackage, and needrestart restarted nothing.checkexits 0, with the normal PATH and with a minimal systemd-style one.mayfly.sh --helpexits 0 (it was exit 4).Maintenance lane: I stepped
nodejsback to 24.20.0 and ranunattended-upgrade --dry-runthree ways:nodejswas not selected.site=deb.nodesource.com, it was.origin=. nodistro, it was too.Then I restored 24.21.0 with a targeted install. There were no apt holds and
dpkg --auditwas clean. Only dry-runs usedunattended-upgrade; applying would also have taken the 5 pending security updates outside the owner's window.Gate: ruff, ruff format, and 157 tests passed with 30 integration tests deselected.
Rough edges found
Origin: . nodistro. That's aptly's default, generic and containing a space. Pin and select by host instead (Pin: origin deb.nodesource.com, andsite=deb.nodesource.comin the lane's Origins-Pattern). Thepatching-hostsknob'sorigin <origin> followis split on whitespace and can't hold that value, so this repo commits no knob line yet. This is going upstream as apatching-hostsissue once this PR has been reviewed.command -v nodefinds/bin/node, not/usr/bin/node. This user's PATH lists/binbefore/usr/bin. On merged-/usrUbuntu that's the same file, socheckcompares resolved paths.apt-cache policyshows the pin's 600 on the version and 500 on the source line. That's the expected display; the pin works, as the candidate shows.Code review, round 1 (
CR --fix)There were four findings, all fixed, with one commit each (
23e24d5..5a5ca50). Nothing was held back.installbroke its own exit-code contract. A download that isn't a key exited 2 with no message, and a 404 exited 22. Now a non-key is REFUSED ("got ", exit 1), and fetch or apt failures print a message and exit 2. I re-ran both probes against a copy of the script23e24d5nodejs, while the lane'ssite=deb.nodesource.comselects everything the site serves (nodejsandnsolidtoday). Everything else from that host is now pinned at 100:apt-cache policyshowsnodejs600 andnsolid100. Withnodejsstepped back again, thesite=dry-run still selectsnodejsand notnsolid4c2e9f4,5a5ca50choom -n 0 --, aspatching-hosts' run.md applies updates. This was latent: this session is at adj 070f9f51automatic, report-onlyb222b6eAfter the last fix, the gate passed with 157 tests and 30 integration tests deselected.
uv lock --lockedis clean, the re-install was idempotent, andcheckexits 0 on the host.Code review, round 2 (
CR --fix)There were three findings, numbered on from round 1, all fixed with one commit each (
a859fcc..c3dc9e6).apt-get install nodejs, did nothing on this host.apt-daily.timeris masked andAPT::Periodic::Enableis 0, so the package lists are only as fresh as the last manualapt-get update. The out-of-cycle fix is nowsudo bash deploy/nodesource.sh install, which refreshes the lists firsta859fccEXPECTED_MAJORand the script's three paths, and the bump procedure names every file to edit. A bump done by the old procedure now fails the test (mutation-checked)f69d233checksaidokwhen an oldernodejswas installed, so a pending release was invisible under thescheduledposture. It now printspending: nodejs <installed> -> <candidate>, which is a note, not drift. I verified it withnodejsstepped back to 24.20.0, then restoredc3dc9e6After the last fix, the gate passed with 158 tests and 30 integration tests deselected.
uv lock --lockedis clean,checkexits 0 on the host, and the branch merges cleanly with #4 (git merge-tree).Code review, round 3 (
CR --fix)There were two minor findings, both fixed with one commit each (
c5e79e0,c4c4d67). There were no bugs and nothing I'd call must-fix. NodeSource's signing key never expires (created 2016-05-23), so an expired key can't silently freeze updates.checkresolvednodeto/usr/bin/nodebut didn't check which package owns the file, so a stray binary there would have passed. It now reports drift unlessdpkg -Snamesnodejs. A copy of the script expecting a different owner exits 3c5e79e0usage()printed header lines 5–7 by number, so any edit to the header would shift the help text. It now finds the Usage block by pattern, and a test checks that a bare invocation exits 2 and names both subcommands. Adding a header line broke the old version and passes the new onec4c4d67After the last fix, the gate passed with 159 tests and 30 integration tests deselected.
uv lock --lockedis clean,checkexits 0 on the host, and the branch merges cleanly with #4.Not in this PR
patching-hostsupstream issue (rough edge 1): after review.docs/SKILLS.md's note that co-processor lacks Node lives in #3 Vendor the cohort's agent skills #4, and is updated there.🤖 Generated with Claude Code