Repository navigation
chore(dev): add reproducible Node development bootstrap - #1337
Conversation
Add the .mise/config.toml + .mise/mise.lock development-bootstrap contract (Courier #414): Node pinned with locked checksums, idempotent bootstrap (npm ci + Prisma client generation), and check/test tasks delegating to the authoritative npm scripts. No DATABASE_URL, migrations, git hooks, global config mutation, tests, or formatting during bootstrap.
…ding Add [settings] locked = true so mise fails closed on platforms absent from the lockfile (musl has no upstream checksums for the pinned Node) and never implicitly rewrites .mise/mise.lock, keeping the committed lock byte-stable against the bootstrap contract's approval check. Point the README at mise.lock for the exact pin.
joryirving
left a comment
There was a problem hiding this comment.
Secondary review on exact head 6b62a212454d135365ca0e7b1453170d2102bb7d: REQUEST CHANGES for the legitimate primary-review documentation finding. README says the non-mise commands are the equivalent manual steps, but then uses npm install; that can resolve/update dependencies and rewrite the lockfile, unlike the shipped bootstrap contract's lockfile-backed npm ci --include=dev. Please change the manual path to npm ci --include=dev (and keep Prisma generation as documented) so the fallback actually preserves the reproducible contract. I found no independent hard blocker. All exact-head CI is green.
The no-mise fallback claimed to be equivalent to the bootstrap but used 'npm install', which can rewrite package-lock.json. Use the same lockfile-backed install the bootstrap runs (addresses PR #1337 review).
|
Addressed the review finding on head This head also merges current Local validation on
CI on the new head is pending; re-review left to the operator/reviewers. |
There was a problem hiding this comment.
AI Automated Review
Full PR review.
Analysis engine: MiniMax-M3.1-Flash (anthropic) — primary route · pr-reviewer-action v3.7.0
Recommendation: Approve—the current head addresses the outstanding review and implements issue PR 1291 without an identified blocker or major issue.
Linked Issue Fit
- The configuration provides noninteractive
bootstrap,check, andtesttasks; uses lockfile-backednpm ci --include=dev; generates the Prisma client locally; and avoidsDATABASE_URL, migrations, Git hooks, formatting, and implicit tests as required by issue PR 1291. - The README and AGENTS.md document setup and targeted verification while leaving the exact Node version in
.mise/mise.lock.
PR Claims
- Claim 1: Unverified—12/12 cited locations are consistent with the local bootstrap commands, but the claimed exact equivalence with
.github/actions/setup-node/action.ymlcannot be independently checked because that file's contents are absent from the corpus. - Claim 2: Unverified—8/8 cited locations describe the intended regular-file contract, but Courier's external execution and environment-capture behavior is outside the supplied evidence.
- Claim 3: Unverified—6/6 local task-definition locations match the claim, but whether Courier never runs
checkortestcannot be proven from this repository corpus. - Claim 4: Held: 5/5—both tasks delegate directly to the authoritative
npm run lint,npm run typecheck, andnpm run testcommands. - Claim 5: Unverified—7/7 local references avoid an explicit database operation, but the unset-
DATABASE_URLruntime claim lacks independently reproducible tool evidence; no contradictory defect was found.
Outstanding Human Review
- Review
5601289523is addressed:README.md:406now usesnpm ci --include=devin the equivalent manual path, preserving the lockfile-backed contract.
Requirement Ledger
req-e589bfe1ad7cis satisfied by successful Lint and Typecheck CI checks on head9c1a102.
Tool Harness Findings
- No native tool calls were made; this review relies on the supplied PR corpus.
Unknowns or Needs Verification
- The skipped external sources and absent setup-action/Courier source prevent independent confirmation of the external equivalence and non-execution claims; these do not show a defect in this PR.
Outstanding Human Change Requests
- @joryirving's change request (6b62a21, head moved since) judged addressed at this head:
README.md:406 now specifies `npm ci --include=dev` instead of `npm install`, matching `.mise/config.toml:14` and preventing the documented fallback from rewriting `package-lock.json`.
|
Courier: already addressed (run courier-d0c108861b87dcf59c1bbf6ac2515001) PR #1337 (misospace/dispatch) is already complete on the run branch courier/misospace/dispatch/issue-1291 at head 9c1a102, which matches local HEAD, origin remote, and the PR head exactly. (1) All existing review feedback is addressed on this head: joryirving's CHANGES_REQUESTED (review 5601289523, on 6b62a21) and the AI-review minor nit both asked for README's 'equivalent manual steps' to use |
Reason: PR review: CHANGES_REQUESTED Outcome: invalid_wait Worker executions: 2 Enqueue rows: 24 Enqueues by lane:
Final failure: Fail-closed park: external wait without a verifiable dependency (externalWait must be an object); operator requeue required (#1250). no changes pushed; queued feedback resolution is not verified Last attempt: Secondary review on exact head Latest note: no changes pushed; queued feedback resolution is not verified Posted automatically by Dispatch on 2026-10-21T20:07:49.675Z |
joryirving
left a comment
There was a problem hiding this comment.
Secondary re-review on exact head 9c1a102b93b73b9877a0d7b59463f442b9728329: APPROVE. The one legitimate prior finding is fixed: README's manual equivalent now uses npm ci --include=dev, matching the locked bootstrap contract rather than permitting lockfile mutation. The mise tasks themselves remain noninteractive and narrowly scoped; no independent hard blocker found. Exact-head CI, image build, smoke, and security checks are green.
What
Implements the repository-side development bootstrap per the shared Courier #414 contract (now merged via courier#446), which unblocked this issue per the 2026-10-20 grooming refresh.
.mise/config.toml—min_version = "2026.10.13",[settings] locked = true,[tools] node = "24", and the shared task names:bootstrap—npm ci --include=dev+npx prisma generate(mirrors.github/actions/setup-node/action.ymlexactly).check—npm run lint+npm run typecheck(mirrors the CI lint/typecheck jobs).test—npm run test(vitest)..mise/mise.lock— committed lockfile pinning node 24.22.1 with sha256 + URL for 5 platforms (linux-arm64, linux-x64, macos-arm64, macos-x64, windows-x64). Generated with digest-verified mise 2026.10.13.Contract fit (Courier #414 shipped behavior, read from misospace/courier main)
.mise/config.toml+.mise/mise.lockas regular files; Courier executes onlymise run bootstrapin the materialized approved base revision and captures the environment viamise x -- env -0. Verified here:mise x -- env -0exposes the mise-managed node (.../installs/node/24.22.1/bin/node, v24.22.1, npm 11.19.1), so the PATH delta reaches later tasks.check/testare human/CI-facing; Courier never runs them. Both delegate to the authoritativenpm runcommands, preserving "existing repo validation commands remain authoritative."Invariants kept, and how each related path enforces the same rule
DATABASE_URLand connects to no database — kept: tasks invoke onlynpm ciandprisma generate;prisma.config.tsalready tolerates an unset URL (verified by inspection, and bootstrap ran withDATABASE_URLunset in this lane). No migration/db push/groomer invocation anywhere in the new config..git/hooks;package.jsonpostinstall is unchanged and only runsprisma generate.npm cirefuses lockfile changes (unlikenpm install), and[settings] locked = truestops mise from implicitly rewriting.mise/mise.lock; after three bootstrap runsgit statusshowed zero tracked-source or lockfile mutation.mise lock(no upstream SHASUMS exist for v24.22.1 unofficial builds) were removed, and withlocked = truean unlisted platform fails closed instead of downloading unpinned. The repo's own image is glibc (node:24-bookworm-slim), unaffected.bootstrapruns no tests and no formatter; three consecutive runs exited 0.check= the CIlint+typecheckjob commands;test= the CItestjob command;.github/actions/setup-node/action.ymlunchanged and still authoritative in CI.Local validation receipts (lane: linux-x64, mise 2026.10.13, node 24.22.1)
SHASUMS256.txt(b775d3fe…).mise lockgenerated the lockfile;mise lock --dry-runre-validates all 5 platform entries cleanly and does not re-add musl.mise run bootstrap×3 → exit 0 (run 1 installed node from the locked URL+checksum; postinstall + explicitprisma generateboth succeeded withDATABASE_URLunset).mise run check(final head) → exit 0 (lint + typecheck).mise run test(final head) → exit 0 — 202 files / 5085 tests passed, 24 skipped.git statusafter all runs: only the intended files; no tracked-source mutation.Limitations: not re-run on macOS/Windows/arm64 (lock entries were generated, not exercised); musl behavior (fail-closed) is by configuration, not empirically exercised. CI, Docker image build, and human/AI review remain pending — left to the operator.
Closes #1291