Repository navigation
Closed
Labels
app/pm-stackpm-stack (Pad/Grist) in developing-today/codepm-stack (Pad/Grist) in developing-today/codeeffort/sSmall: expected under 2 hours of workSmall: expected under 2 hours of workkind/bugSomething isn't working (prefixed form of the classic bug label)Something isn't working (prefixed form of the classic bug label)meta/enrichedIntake review done: acceptance criteria, links, and normalized labels addedIntake review done: acceptance criteria, links, and normalized labels addedpriority/normalOrdinary priority (the default)Ordinary priority (the default)queue/parkedQueue task is parked (waiting on CI, time, or an event)Queue task is parked (waiting on CI, time, or an event)status:donetask/small-fixQueue packet kind: bounded fix with reproduction and targeted testsQueue packet kind: bounded fix with reproduction and targeted testswork/assignedQueue worker lifecycle stateQueue worker lifecycle state
Description
Finding
Found during the #1046 deploy (2026-10-26, flagged on that issue, never separately filed): install.sh's systemctl --user enable --now does not restart an already-running pm-aggregator - the first post-install check 404'd on new routes while the new code was on disk. A deploy that looks successful but serves old code is a coherence hazard for every future slice.
Proposal
install.sh restarts pm-aggregator when the deployed tree changes (hash or mtime comparison), then self-verifies: poll /api/health plus one route per newly shipped page (or a version marker the server exposes - e.g. build commit in /api/health) and fail loudly on mismatch.
Acceptance
- Re-running install.sh on unchanged code is a no-op; on changed code the service restarts and the version marker in /api/health matches the deployed commit.
Acceptance criteria
- Re-running
install.shon unchanged code is a no-op (no restart). - Re-running
install.shafter the deployed tree changes restarts pm-aggregator, and the version marker exposed by/api/healthmatches the deployed commit. install.shself-verifies after a deploy (polls/api/healthplus one route per newly shipped page, or the version marker) and fails loudly on a mismatch instead of reporting success while old code serves.
Metadata
Metadata
Assignees
Labels
app/pm-stackpm-stack (Pad/Grist) in developing-today/codepm-stack (Pad/Grist) in developing-today/codeeffort/sSmall: expected under 2 hours of workSmall: expected under 2 hours of workkind/bugSomething isn't working (prefixed form of the classic bug label)Something isn't working (prefixed form of the classic bug label)meta/enrichedIntake review done: acceptance criteria, links, and normalized labels addedIntake review done: acceptance criteria, links, and normalized labels addedpriority/normalOrdinary priority (the default)Ordinary priority (the default)queue/parkedQueue task is parked (waiting on CI, time, or an event)Queue task is parked (waiting on CI, time, or an event)status:donetask/small-fixQueue packet kind: bounded fix with reproduction and targeted testsQueue packet kind: bounded fix with reproduction and targeted testswork/assignedQueue worker lifecycle stateQueue worker lifecycle state
Activity
developing-today commentedon Oct 27, 2026
CODE-286
dezren39 commentedon Oct 28, 2026
Intake review
Fleet monitor intake pass, 2026-10-28. Verified still live this run: the issue is open, and no merged PR references it.
Related: Found during the #1046 deploy (2026-10-26) and flagged there; no merged PR references this issue (checked this run), and the issue is still open with no comments — still live.
Notes / risks: A deploy that reports success while serving old code undermines every later verification: checks run against the new tree on disk while users hit the old process. The version-marker half matters as much as the restart half — without it the next silent no-op is undetectable.
Suggested approach: Compare a hash of the deployed tree (or the deployed commit) in install.sh; restart only on change; expose the build commit in /api/health if not already present and assert it post-restart with a short poll loop that fails the install on mismatch.
Labels normalized this pass and an
## Acceptance criteriasection appended to the body (original text preserved verbatim above it), formalizing the acceptance prose already in the issue. Markedmeta/enriched.12 remaining items
fix(pm-stack): serialize build version in /api/health and parse it as…
dezren39 commentedon Oct 29, 2026
🤖 Agent note · parked
fix(pm-stack): include deployment inputs in the install no-op check (#…
dezren39 commentedon Oct 29, 2026
🤖 Agent note · Codex P2 fixed and pushed; parked on CI/Codex re-review and the merge-queue freeze (#2403)
Agent: queue worker
repo-worker-code, OpenChamber scheduled lane. Task 3042 (resume of the parked task).PR fix(pm-stack): aggregator install.sh restarts on change and self-verifies deployed version (#1150) #2432 —
queue/3042-1150-install-restart-verify, headd16655c2.basic: proxy port fallbacksSUCCESS, CodeRabbit neutral,mergeStateStatus: CLEAN.What this shift added (the one review finding still open on the PR, a P2): the install no-op check hashed only the copied package files, so rerunning the installer with a different
TAILNET_IP, a rotated credential in the SOPS file, or an edited service unit skipped.envrendering and the unit copy while still reporting a successful verification.deploy_inputs_hashnow hashes those three inputs (TAILNET_IP, the SOPS file, the unit file), stores them in$DST/.deploy-inputs-hash, and a no-op requires both the tree hash and the inputs hash to match — otherwise the run re-renders.env, re-copies the unit and restarts. The SOPS file is hashed as ciphertext, so no value is decrypted or printed during change detection, and a missing file hashes asabsentso the first run that gains one counts as a change.Verification:
bash -npasses; a harness on the extracted functions shows the inputs hash is stable across identical runs and changes on each of a tailnet-address edit, a SOPS content change and a unit edit. Replied on the Codex thread (PRRT_kwDOJWP4786xw4PT). The TypeScript tests are unaffected (install.sh is not exercised by them).Blocked from merging by ci: merge queue ejects every PR — no merge since #2233 (10:57Z), entries dropped 2-6 min into AWAITING_CHECKS #2403 (repo-wide merge-queue freeze) as well as by CI/Codex confirmation on the new head. Task 3042 is parked 30 min; on resume: confirm CI green and Codex clean on
d16655c2, then re-enqueue fix(pm-stack): aggregator install.sh restarts on change and self-verifies deployed version (#1150) #2432, merge, and close this issue.Links: PR fix(pm-stack): aggregator install.sh restarts on change and self-verifies deployed version (#1150) #2432 · ci: merge queue ejects every PR — no merge since #2233 (10:57Z), entries dropped 2-6 min into AWAITING_CHECKS #2403 · task 3042
dezren39 commentedon Oct 29, 2026
🤖 Agent note · parked (Lane C shift, re-claimed 22:47Z)
basic: proxy port fallbacksSUCCESS, no failing/pending checks. Codex gate (§5): all findings dispositioned — P1 health-marker serialization and P1 version parsing fixed in f85e929, P2 deployment-inputs no-op hash fixed in d16655c, each replied on its thread; latest Codex review at d16655c completed with no findings.dezren39 commentedon Oct 29, 2026
Agent note — parked (queue task 3042, PR #2432)
PR #2432 (
fix(pm-stack): aggregator install.sh restarts on change and self-verifies deployed version) is ready: headd16655c2,MERGEABLE/CLEAN, required checkbasic: proxy port fallbackspass, Codex review on that headhas_any_findings:false/has_unresolved_findings:false(the earlier P1s were fixed inf85e9291and replied on-thread). No code work remains for #1150.5a34fa70(10:57Z). Same gate as feat(aggregator): staleness watchdog tier items (#1148) #2431, id: rustfmt meta_client.rs + drop expect() in tags parser — unbreak main fmt/clippy (#2151) #2335 and id(encryption): surface stalled delivery — Session::stalled_delivery() (#187) #2221.AWAITING_CHECKS; re-enqueueing before the settings fix only produces noise on ci: merge queue ejects every PR — no merge since #2233 (10:57Z), entries dropped 2-6 min into AWAITING_CHECKS #2403. Task 3495 is blockedescalated-to-useron that decision.d16655c2, verify merge, complete 3042 and close fix(pm-stack): aggregator install.sh does not restart a running service - deploys silently no-op #1150.dezren39 commentedon Oct 30, 2026
Agent note — picked up (resume, awaiting_ci) and re-parked: CI + Codex now complete, gate unchanged