Repository navigation
Merged
Conversation
… with the lease count, then installing (#836)
…s, then launches the updater (#836)
…ld lease renews and releases (#836)
…ts with DAEMON_UPDATING (#836)
…fused or answers upToDate (#836)
…ames, and a query starts nothing (#836)
…ing calls start one (#836)
…ion and refused for an agent (#836)
…l version, and the updater probe reads through query (#836)
…te-failed, and a result file is reported at start (#836)
…nds it, releases the hold and is reported (#836)
…version, the update and the last failure (#836)
…simlock status shows the version, the update and the last failure (#836)
…en it followed one or nothing was needed (#836)
…00 when it followed one or nothing was needed (#836)
… local npm registry and refuses a missing version (#836)
…ons the daemon's update now answers (#836)
…two unused exports (#836)
V3RON
added this pull request to stack #881
October 22, 2026 11:09
…dable result file, gateway refusal, error table, launcher pipe, CLI usage and give-up bound (#836) Also drops the CLI's from/to match on a failure (the daemon clears the last failure when an update begins) and an unneeded default on the daemon.update frame payload.
…, and the result file is read before health is running (#836)
… the one provisioning (#836)
… can receive it (#836)
… whatever its state
Contributor
Author
Review ledgerRound 1: bb9fa36 The second fix-check was the extra round the maintainer allowed. R13 was accepted as is (nonblocking). {
"findings": [
{
"id": "R1",
"role": "code",
"class": "state read before startup report",
"outcome": "fixed",
"path": "src/daemon/server.ts",
"round": "1",
"fix": "3e8e0d2b13b60a529ded4a92550edd1def82b3f0"
},
{
"id": "R2",
"role": "code",
"class": "ADR 0042 3; false manual claim",
"outcome": "fixed",
"path": "src/leasing/lease-acquisition-coordinator.ts",
"round": "1",
"fix": "3e8e0d2b13b60a529ded4a92550edd1def82b3f0"
},
{
"id": "R3",
"role": "code",
"class": "testing 3",
"outcome": "fixed",
"path": "src/daemon/update-coordinator.ts",
"round": "1",
"fix": "3e8e0d2b13b60a529ded4a92550edd1def82b3f0"
},
{
"id": "R4",
"role": "code",
"class": "testing 3",
"outcome": "fixed",
"path": "src/contract/operations.ts",
"round": "1",
"fix": "3e8e0d2b13b60a529ded4a92550edd1def82b3f0"
},
{
"id": "R5",
"role": "code",
"class": "ADR 0042 1 vs 8: query parks",
"outcome": "fixed",
"path": "src/updater/probe.ts",
"round": "1",
"fix": "3e8e0d2b13b60a529ded4a92550edd1def82b3f0"
},
{
"id": "R6",
"role": "spec",
"class": "architecture 13 false claim (broken anchor)",
"outcome": "fixed",
"path": "website/src/content/docs/docs/worker/running-the-daemon.mdx",
"round": "1",
"fix": "3e8e0d2b13b60a529ded4a92550edd1def82b3f0"
},
{
"id": "R7",
"role": "claims",
"class": "architecture 13 false claim",
"outcome": "fixed",
"path": "website/src/content/docs/docs/reference/events.mdx",
"round": "1",
"fix": "3e8e0d2b13b60a529ded4a92550edd1def82b3f0"
},
{
"id": "R8",
"role": "code",
"class": "client leaked per reconnect loop pass",
"outcome": "fixed",
"path": "src/cli/commands/update.ts",
"round": "2",
"fix": "3e8e0d2b..d0479f1e"
},
{
"id": "R9",
"role": "code",
"class": "event emitted before subscribers released",
"outcome": "fixed",
"path": "src/daemon/server.ts",
"round": "2",
"fix": "3e8e0d2b..d0479f1e"
},
{
"id": "R10",
"role": "code",
"class": "ADR 0042 3 update hold skips new waiters",
"outcome": "fixed",
"path": "src/leasing/lease-acquisition-coordinator.ts",
"round": "2",
"fix": "7b478f9f (as R12)"
},
{
"id": "R11",
"role": "claims",
"class": "architecture 13 comment cites ADR contrary to code",
"outcome": "fixed",
"path": "src/daemon/dispatch.ts",
"round": "2",
"fix": "3e8e0d2b..d0479f1e"
},
{
"id": "R12",
"role": "code",
"class": "ADR 0042 3 update hold: retry of once-queued waiter granted",
"outcome": "fixed",
"path": "src/leasing/lease-acquisition-coordinator.ts",
"round": "fix-check",
"fix": "7b478f9f"
},
{
"id": "R13",
"role": "code",
"class": "testing 3 hold refusal of retry untested",
"outcome": "nonblocking",
"path": "src/leasing/lease-acquisition-coordinator.ts",
"round": "fix-check",
"reason": "maintainer 2026-10-22: accepted as is; R12 behaviour verified by the reviewer probe"
},
{
"id": "R14",
"role": "claims",
"class": "manual says readiness runs for daemon.update query",
"outcome": "fixed",
"path": "src/contract/AGENTS.md",
"round": "fix-check",
"fix": "7b478f9f"
},
{
"id": "R15",
"role": "claims",
"class": "manual step 5 omits daemon.update query exception",
"outcome": "fixed",
"path": "src/daemon/AGENTS.md",
"round": "fix-check",
"fix": "7b478f9f"
},
{
"id": "R16",
"role": "claims",
"class": "leasing manual hold omits new waiters",
"outcome": "nonblocking",
"path": "src/leasing/AGENTS.md",
"round": "fix-check"
}
]
}Written by an agent. |
Contributor
Author
Review notesThese do not block, and nobody has verified them. Each is one reviewer's claim.
Written by an agent. |
V3RON
marked this pull request as ready for review
October 22, 2026 13:08
10 of 11 tasks
V3RON
added a commit
that referenced
this pull request
Oct 22, 2026
Closes #839 ### Status Implement: done Review: passed, round 2 Hardware: n/a Gate: the stack gate (`merge-pr.sh 896`) Next: final stack sync, then the gate ### Done when - [x] `pnpm exec vitest run --project unit` on the changed `ui/src` test files passes with the lines above. - [x] `pnpm test:console --project=chromium e2e/console/update.spec.ts` passes. - [ ] CI's `pnpm check` is green, the dependency rules included. - [x] `console.mdx` documents the notice, the Update and Update now items, the `updating` state, the failure banner, the Inbox item and the footer notice. ### Completion conditions (#825) - [x] `simlock update` with no leases installs the latest and `simlock status` prints it: `e2e/update/update.e2e.test.ts` (real npm via verdaccio, #885). - [x] With a lease held the update waits, a new lease gets `DAEMON_UPDATING`, releasing it lets the update go on: `src/daemon/server.test.ts` `daemon.update` table (#885). - [x] A failed install leaves the old daemon serving and `simlock status` prints `Last update failed (installing)`: server.test.ts failed-line case and `src/cli/index.test.ts` (#885). - [x] A new version that does not start is rolled back and the failure shows with stage `restarting`: `src/updater/index.test.ts` (#878) and the server.test.ts result-file case (#885). - [x] `simlock worker update` updates a connected and an incompatible worker, routes around it, and keeps a drain: `src/gateway/service.test.ts`, `src/daemon/gateway-fleet.e2e.test.ts` (#888). - [x] `simlock status` and `simlock worker list` show the latest after the check, and nothing with `update.check: false`: `src/daemon/main.test.ts` version-check cases, CLI tables (#887, #888). - [x] The console shows `<latest> available`, Update…, `updating` with its stage, the failure banner and Inbox item, and the sidebar notice: `ui/src` model and screen tests and `e2e/console/update.spec.ts` (this PR). ## Assumptions - Assumption: Update now answers `upToDate` with `<name> already runs <version>` (the spec lists the toast for the answer; the force action had a fixed success title). - Assumption: the footer notice is a `UpdateNotice` in `shell.tsx` and `watchMode` takes a `clock`, so its 10-minute timer is testable with fake time. - Assumption: the row's stage line shows only while State reads `updating` — a red finding (disconnected, failed) hides it, as it hides the amber word. - Assumption: Update… and Update now sit after Drain/Undrain in the menu (the picked prototype's order), so the page's primary button stays Drain. - Assumption: the Inbox fact When reads `<duration> ago`, as the disconnected item's Last seen does. - Assumption: `isNewerVersion` is imported by `version-order.ts`'s own path (the spec's value import); the `past-index` rule allows that one file, because the index carries zod's `eval`, which breaks the console's CSP (maintainer-authorized 2026-10-22, #825 Decisions). ## Review Spec review: 1 blocking, 1 fixed, 0 notes. Code review: 1 blocking, 1 fixed, 1 notes. Claims review: 1 blocking, 1 fixed, 0 notes. Rounds: 2. Tokens: 45.0M. Runs: 11. Cost USD: 6.9344. Agent seconds: 3898. Assessment: complete *Written by an agent.*
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 #836
Status
Implement: done Review: passed (R13 accepted by the maintainer) Hardware: n/a Gate: waiting for the stack
Next: joins the #825 stack
pnpm test:changedpasses (it runs the unit tests under src/daemon src/leasing src/contract src/cli src/http src/simlock-client src/gateway), and so doespnpm test:e2e e2e/update/update.e2e.test.ts. Delivered by: the tests insrc/daemon/server.test.ts(describe("daemon.update")),src/contract/version-order.test.ts,src/contract/operations.test.ts,src/cli/index.test.ts(simlock update and simlock status),src/http/app.test.ts(POST /v1/update),e2e/update/update.e2e.test.ts.PROTOCOL_VERSION_RANGE54 → 55 insrc/contract/protocol.ts;version-order.tsis in the bump check'sNOT_SHAPES.website/src/content/docs/docs/reference/cli.mdxdocumentssimlock update(section "simlock update" and thesimlock statuslines),reference/errors.mdxthe codes (DAEMON_UPDATING, and "Updating Simlock":UPDATE_RESOLVE_FAILED,UPDATE_UNSUPPORTED_INSTALL,UPDATE_SHARED_INSTALL),reference/events.mdxanddocs/internal/EVENTS.mdthe events (daemon.update-started,daemon.update-failed, andupdatingamonglease.rejected's reasons),using-devices/programmatic-client.mdxthe client method ("Update the daemon"); the route is declared (updateRouteinsrc/http/admin-declarations.ts, both 202 and 200), so the OpenAPI reference lists it (website/scripts/check-openapi.mjspasses).Assumptions
NpmCli.viewfirst (UPDATE_RESOLVE_FAILED), then "same version" and "running newer than latest, noversionnamed" answerupToDatewithout askingcheckInstall, thencheckInstall, then the other role's socket — cheapest first, and each refusal changes nothing.simlock update --version Xwhen X is the running version printssimlock X is already running(not "latest", which would be false when X is not the newest).--jsonprints no progress and one line at the end: the daemon's finaldaemon.updateanswer (the first answer when nothing was needed); the exit code is the same as without it.Stopped following. The update goes on; run simlock status to see it.and exits 0; it sends nothing to the daemon.installingby default), with the messagethe updater exited with code N.DAEMON_UPDATING(maintainer decision, Simlock updates itself, and a gateway updates a chosen worker #825).simlock updatestarts one first like any other command, then updates it.NodeUpdaterLauncherkept the daemon alive through the updater's stdout pipe, so the updater waited ten minutes for a daemon that could not exit; the pipe is now unref'd (src/ports/updater-launcher.ts).Review
Spec review: 1 blocking, 1 fixed, 0 notes. Code review: 11 blocking, 10 fixed, 0 notes. Claims review: 4 blocking, 4 fixed, 1 notes.
Rounds: 2. Tokens: 27.7M.
Runs: 20. Cost USD: 26.8065. Agent seconds: 13732.
Assessment: complete
Rejected:
Written by an agent.