docs(decisions): ratify the offered VPS specification as ADR-0018 - #268
Conversation
Records the sizing decision the deployment already made in practice: the cohort relay runs on the offered 1 vCPU / 1.9 Gi / 496 MB swap / 49.5 G host, accepted as-is. Reframes #18 and #39 from gating measurements to post-hoc validation, and names the unresolved ceilings question (cluster-sized connection, buffer and pool defaults with no compose memory limits) as a follow-up ADR rather than folding it into this one. Closes #21 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Signed-off-by: tucktuck101 <jeffreytaylorrobertson@gmail.com>
|
Automated review (requested by @serina, via her review-code/review-docs/review-adjudicate pipeline — independent reviewer + adjudicator, each re-verified claims against the actual repo rather than trusting the diff or each other) Blocker
Finding raised then refutedA reviewer initially flagged that |
serina-mcfall
left a comment
There was a problem hiding this comment.
Requesting changes — one Blocker from the automated review posted above:
launchpad/decisions/ADR-0018-cohort-relay-vps-specification.md:30 — the ADR states BUZZ_IMAGE "already defaults to a prebuilt image." That's not accurate: deploy/compose/compose.yml:5 uses ${BUZZ_IMAGE:?...} — Compose fails on unset/empty, no fallback — and deploy/compose/README.md:41 says plainly "BUZZ_IMAGE has no default. Compose fails when it is missing."
The underlying conclusion still holds (no source builds are happening on this host) — only the mechanism is misstated. Please reword to something like: "already requires an explicit prebuilt image (BUZZ_IMAGE has no default and Compose fails without it)."
Note: a second concern raised in review (that decided_in points to still-open issue #21) was checked and refuted on adjudication — #21 follows the same "Closes #21 on merge" pattern as its closed sibling ADRs, it's just not merged yet. No action needed there.
Review on #268 caught an inaccurate claim: the ADR said BUZZ_IMAGE "already defaults to a prebuilt image". It has no default — deploy/compose/compose.yml uses ${BUZZ_IMAGE:?...} so Compose fails closed when it is unset, and deploy/compose/README.md says so explicitly. The conclusion is unchanged (no source build happens on this host); only the mechanism was misstated. Wording taken from the reviewer's suggestion. The claim was inherited from #21's body and repeated without verification. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Signed-off-by: tucktuck101 <jeffreytaylorrobertson@gmail.com>
|
Fixed in b4455b1 — thanks, that was a real error. Verified before changing it:
Root cause worth recording: the claim was inherited from #21's own body, which says Agreed on the Comment by an AI agent (Claude Opus 5) on behalf of @tucktuck101. |
serina-mcfall
left a comment
There was a problem hiding this comment.
Independent review — no blockers. The existing change-request is already satisfied.
Reviewed in a fresh context. I am an agent and do not approve — posting as a comment so @serina-mcfall can.
The CHANGES_REQUESTED on this PR is addressed, not stale. The review was submitted 2026-08-21T03:45:38Z against 2efb796e7, raising one blocker: the ADR said BUZZ_IMAGE "already defaults to a prebuilt image" when deploy/compose/compose.yml:5 is ${BUZZ_IMAGE:?...}, which fails closed with no default. The fix landed in b4455b1fa at 2026-08-21T10:35:45Z — the current head — and I read it directly: "already requires an explicit prebuilt image: BUZZ_IMAGE has no default and Compose fails without it." Exactly the correction asked for. GitHub's label just hasn't been refreshed by a re-review.
Verified independently:
- The VPS spec matches issue #21's offer — 1 vCPU, 1.9 Gi RAM, 496 MB swap, 49.5 G disk, identical numbers.
BUZZ_MAX_CONNECTIONS10000,BUZZ_SEND_BUFFER1000,BUZZ_MAX_CONCURRENT_HANDLERS1024 — exact match incrates/buzz-relay/src/config.rs.compose.ymldeclares no memory limits — zero matches formem_limit/resources.- DB writer and reader pools default to 50+50 against Postgres
max_connections=100. - The relay answers on its public host —
200, re-run rather than taken from the PR body. decided_inpointing at an open issue matches the sibling pattern (ADR-0017 on #193 reads the same way), so not a defect.- ADR-0018 collides with nothing merged or in flight (#281 takes 0019, #291 takes 0020, #308 takes 0021/0022).
- Front matter and section order match the sibling records; no private-tooling paths.
Two things to know before merging, neither a code defect:
- The red CI is an infrastructure flake, not your change.
Desktop Corefailed in thesetup-moldaction —HTTP request sent, awaiting response... Read error (Connection timed out)thentar: Error is not recoverable: exiting now, exit 2. That's a network timeout fetching the linker, on a PR that changes one markdown file. Re-running the job should clear it. - Non-blocker, PR body only: Escalations §2 says issue #22 is "open while its outcome is in production". #22 closed at
2026-08-21T03:48:44Z. Body staleness, not a defect in the record — not worth an issue, just noting it's moot now.
Ready for approval once the flaky job is re-run.
Dismissing as addressed. This review's blocker -- the ADR claiming BUZZ_IMAGE 'already defaults to a prebuilt image' when deploy/compose/compose.yml:5 is ${BUZZ_IMAGE:?...} and fails closed -- was fixed in b4455b1 (2026-08-21T10:35:45Z), which is the current head. Verified directly: the record now reads 'already requires an explicit prebuilt image: BUZZ_IMAGE has no default and Compose fails without it.' Review was against 2efb796.
serina-mcfall
left a comment
There was a problem hiding this comment.
Approved. Independent review found no blockers; non-blocking findings are filed as follow-up issues.
) (#430) Reviewing a batch of PRs has two halves. One is judgement -- is this claim true, does the conclusion depend on this defect. The other is bookkeeping applied identically to every PR. This extracts the second half, which is the line ADR-0019 draws and the same extraction pr_body_check.py and adr_boundary_check.py already did for their own rules. Six classifiers, each one a rule applied by hand across three review batches on 2026-08-21/22, and each one applied WRONGLY at least once: - STALE/MISFILED reviews. Four PRs carried change-requests already satisfied. #262's blockers were fixed at 03:21 and the review restating them arrived at 03:57. #271's change-request was #275's review MISFILED -- textually identical including a "same as #271's" self-reference. No change to #271 could have addressed it. - CI triage. #268's red CI was setup-mold timing out on a one-markdown-file PR. #288's log printed four inherited warnings above the real blocker. - Independence. #265 carried a commit written in the reviewing session. - Leak scan. #281 quoted a private hook's header in a public file. - Placement, per AGENTS.md section 3. - Drift calibration. #374's "796 files" was reported REFUTED by a reviewer who measured at the live tip and got 912. The script emits the pinned SHA so a count that does not reproduce reads as drift, not error. It emits no severity. Five proposed blockers were demoted and one upheld across those batches, each turning on whether a conclusion depended on the defect; a script guessing that is the model-gating ADR-0019 forbids wearing automation's clothes. test_the_briefing_states_no_severity_anywhere asserts the absence. It also posts nothing, so it can run read-only. Three defects found by running it against live PRs rather than by reading it, each now a regression test: 1. FALSE MISFILED on #374. The only path token in a genuine review was `launchpad/ARCHITECTURE.md`, cited as corroborating evidence rather than as a defect site. Reviews cite files outside the diff constantly -- that is what checking a claim looks like. MISFILED now needs two or more cited paths, none in the diff, and no mention of any changed file. 2. Selecting log lines BY POSITION. The first draft took the last 80 lines; GitHub appends checkout teardown, so on #288 the size-guard line had scrolled past and a REAL failure classified as UNKNOWN. Selection is by content now. 3. The path regex required `:\d+` with no space, so it saw compiler output (`lib.rs:276:15`) but not the file-size guard (`lib.rs: 1000 -> 1001`). Verified against live PRs after the fixes: #288 classifies Desktop Core REAL on desktop/src-tauri/src/lib.rs and Desktop Smoke E2E PRE_EXISTING, matching the hand analysis; #374's calibration returns 796 files at the 67-commit point with tip 9891e64, matching the figure reconstructed by hand. 41 tests in test_pr_review_batch, 256 across launchpad/scripts. Registered in test_no_model.py's ALLOWLIST rather than NOT_OURS, deliberately: a script that prepares review material must be provably unable to call a model. DEVIATION from the issue's own done-when: it asked for registration in INTERFACE.md. Not done -- INTERFACE.md is #116's pre-flight record contract, not a script index, and an unrelated entry there would degrade a contract document. The script's module docstring is its interface. Refs #426 Signed-off-by: Serina Mcfall <serina.mcfall@gmail.com>
Summary
Records the sizing decision the deployment already made in practice: the cohort relay runs on the offered 1 vCPU / 1.9 Gi / 496 MB swap / 49.5 G host, accepted as-is. #21 was filed to settle this before deployment, but the measurements it named never completed and the deployment proceeded anyway, so this ratifies the live state rather than pretending the question is still open. The unresolved ceilings question is named as a follow-up ADR rather than folded into this one.
Related issue
Closes #21
Issue type
ADR
Agent provenance
Objective
Add
launchpad/decisions/ADR-0018-cohort-relay-vps-specification.mdaccepting the offered VPS specification unchanged.Impacted components
launchpad/decisions/ADR-0018-cohort-relay-vps-specification.md
Approach and rejected alternatives
Ratify the specification already in production. The alternative seriously considered was holding #21 open until #39 (load capacity) reports, which is what the issue's own comment thread recommended when it was filed. That was right at the time and is wrong now: the relay has been serving on this specification for days, so holding would leave the record saying "undecided" about an internet-facing host — exactly the silent, unrecorded trade #21 was written to prevent. A third option, ratifying and setting the connection and memory ceilings in the same record, was rejected as scope creep; the ceilings need their own evidence and their own ADR.
Verification
Command run:
Raw output:
The relay answers on 443, the three cluster-sized defaults cited in the ADR are real, and
deploy/compose/compose.ymldeclares zero memory limits. Separately in the same session, a desktop client authenticated towss://launchpad-buzz.devacademy.nzover NIP-42 and loaded 6 channels, which is what establishes that the host is genuinely serving rather than merely answering HTTP.Not verified
No resource figure on the live host was measured — not peak memory, not CPU, not disk. That is the central gap and it is stated plainly in the ADR's own Consequences section rather than papered over. Specifically not checked: whether the running relay actually inherits the default
BUZZ_MAX_CONNECTIONS=10000(inferred from the fact that the only place the cohort ever templated it is underlaunchpad/deploy/archived/, not observed on the host); whether the deployed container matches the compose file in this repo; and the disk sizing, which the local VM could never settle. I have no credentialed access to the VPS from this session.Security implications
No change to exposure — this PR adds one markdown file. What it records is security-relevant: the sizing-versus-hardening trade #21 feared did not happen (#20 and #5 both closed), but the relay very likely accepts up to 10,000 connections with a 1,000-message-per-connection buffer on a 1.9 Gi host with 496 MB of swap, and the Postgres writer and reader pools default to 50 each against Postgres's own default
max_connections=100. That is an availability exposure on an internet-facing host, documented here and escalated below rather than fixed in this PR.Escalations