Repository navigation
Decisions: 0205 and 0204 addenda — one rollout technology for three paths, per-run gateway access, tailnet-only Organizations, freeze and waves - #567
Conversation
…teway-issued access, nightly personal updates, freeze and rings Appends dated 2026-10-17 addenda to rows 0205 and 0204 of the decision register (plan DEV-6671). The 0205 addendum adds points (a)-(k): one technology for the reference Organization, Organizations with a Conglomerate Host and personal Environments; one gateway program placed with the server; per-run access issued by the gateway; GitHub Actions runners; approvals per path, including the nightly personal update; the freeze of manual fleet rollouts; rollout waves; run progress in the Dashboard; tailnet-only server management; and new Environments and Organizations from the same technology. It closes two of the open questions of 0205. The 0204 addendum renames the reference Organization's private Deployment Repo to infra and routes its rollouts through the same pipeline without a persona or a click. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…all Conglomerate Host, real Organizations are tailnet-only, GitHub-hosted runner by default Folds in decisions made after the first draft of the 2026-10-17 addenda (plan DEV-6671): - 0205 (d): every deployment domain defaults to the GitHub-hosted runner; Blacksmith is only a development aid and leaves the open questions. - 0205 (j): every Organization except the reference one is wrapped in its tailnet. Management, SSH, workshops, vault and the gateway's other calls are tailnet-only; the only public management doors are Headscale sign-in and the gateway admission for GitHub-verified runs from the Organization's Deployment Repo merged to main. The relation to the public production apps of 0146 point 2 is recorded as open; 0146 is not changed. - 0204: the reference Organization gets its own small Conglomerate Host with Headscale for managing its servers, its own Lazurio Vaultwarden for testing Vaultwarden changes and the rollout gateway. People and visitors still enter its Environments publicly. Its Deployment Repo becomes the private infra; the public documentation repo becomes infra-example. The addendum names the sentences of points 2, 8 and 9 it changes; the text of 0203 is not edited. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…blic endpoints; 0146 point 2 unchanged Matěj chose option A for the tailnet promise of real Organizations (every Organization except the reference one). Their servers and Environments are reachable only over the tailnet: management and SSH of every Proxmox host and the Conglomerate Host, workshops, the vault and every gateway call after admission. There is no public SSH in normal operation; provider rescue is the break-glass path. Exactly three endpoints are public: tailnet sign-in (Headscale), the rollout gateway's admission for GitHub-OIDC-verified runs from the Organization's Deployment Repo merged to main (granting only a temporary tagged node), and production applications the Organization deliberately publishes behind its fail-closed production gateway with Lazurio account sign-in, so 0146 point 2 stays unchanged. The 0146 item leaves the open questions. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
There was a problem hiding this comment.
Your trial has ended. Reactivate Greptile to resume code reviews.
Codex Review SummaryThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: f33b82eae1
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
agentrozjedemeai
left a comment
There was a problem hiding this comment.
Changes requested on exact head f33b82eae15a876361354b3e345d1d5bba373ade.
Blocking contract gap in decision 0205(e)/(h): the nightly 02:00 update applies to every personal Environment, but the rollout waves place only the operator’s personal Environment in wave 1; waves 2–3 cover Organizations, not the rest of the personal pool. As written, the pool reconciler could move other owners to the new release before the staged acceptance is complete. Please specify when the remaining personal Environments become eligible (a separate wave or an explicit pin to the last release that passed the required gates), and how the nightly job enforces that rule. This is also the unresolved inline finding at discussion_r4303681667.
I verified that the diff only appends to rows 0204/0205, checked the relationships to 0146, 0153/0154, 0192 and 0203, and found no additional public-safety disclosure. The text labels the design “decided, not deployed”, rather than claiming the tailnet/gateway promise is live. CI is 6/6 green, local pr:preflight passed, and git diff --check is clean. No merge performed.
…s accepted in wave 1 Review found that point (e) scheduled every personal Environment for a nightly update without approval, while point (h) put only the operator's personal Environment into a wave, so nothing said when the rest of the personal pool may receive a release. The nightly run now brings only a release that already passed wave 1, including the operator's personal Environment, and browser acceptance. Candidates and not-yet-accepted releases reach only the operator's personal Environment, and the personal-pool gateway refuses any other release. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
agentrozjedemeai
left a comment
There was a problem hiding this comment.
APPROVED on exact head 41ffad3. The previous CHANGES_REQUESTED review on f33b82e is not reused. The new 0205(e) admits nightly personal-pool updates only for a release that has passed wave 1 (including the operator’s personal Environment) and browser acceptance; candidates/unaccepted releases remain operator-only, with a gateway exclusion. 0205(h) explicitly places other personal Environments after wave 1 at the nightly run. This closes the prior e/h gap, preserves the 0204(7) browser gate and operator instruction, and does not conflict with 0205(g) freeze or (i) status-as-mirror. 0204 is unchanged from the prior review. The addenda remain decision-only (“rozhodnuto, nenasazeno”), not a claim of live deployment. Local: focused two-row/prefix/semantic and added-line safety assertions passed; git diff --check and bun run pr:preflight passed. GitHub CI is 6/6 successful on this SHA; 0 unresolved threads and no competing review request. Fresh main 5f2d171 merges cleanly. No merge performed.
Why
Decision 0205 (#560, merged 2026-10-16) made a pull request to an Organization's Deployment Repo the only change path for its Machines and Environments, with apply after merge through a gateway. It did not yet say how the three rollout paths relate, how a run gets access, how personal Environments are approved, or what happens until the gateway exists. Meanwhile rollouts kept running from one laptop: in four days, 41 % of the Permit-consuming applies run from it failed, each followed by manual recovery. On 2026-10-17, after reviewing the live rollout state, Matěj (Organization Admin) decided the next layer of plan DEV-6671, including a follow-up for the reference Organization (0204). This PR records those decisions as dated addenda.
What changes
Only
manual/decision-register.md. Two dated**Dodatek z 2026-10-17**blocks are appended to the ends of rows 0205 and 0204 (Czech, register style). Each row stays one table line; no earlier text of any row is edited.0205 addendum, points (a)–(k):
(a) One technology, three paths. The reference Organization, other Organizations with a Conglomerate Host, and personal Environments share Machines, the workflow, the gateway program and the evidence format. They differ only in their deployment-domain settings (source of truth, gateway placement, path to the servers, approvals). No path gets its own code branch.
(b) Gateway. One program, running on the Conglomerate Host. The reference Organization runs it on its own small Conglomerate Host, and Lazurio operates the personal pool's gateway. A gateway belongs to the server its Environments run on. This closes the 0205 open question about where the reference Organization's gateway sits.
(c) Per-run access. Each run gets a short-lived SSH certificate signed by the gateway's CA (servers trust it after a one-time setup) and custody for that lane only; tailnet lanes also get an ephemeral tagged node. The long-lived key never leaves the gateway and the Operator's personal token is not used. The gateway holds the Machine's lock and queue. After a failure proven to precede the first mutation, it releases the lock and confirms the run ended. Refines points 4 and 9.
(d) Runner. A GitHub Actions workflow. The GitHub-hosted runner is the default for every domain; Blacksmith is only a development aid. The Operator's computer only dispatches reference-Organization runs, optionally with a local build as candidate.
(e) Approvals.
(f) Personal pool. One pool gateway reconciles personal Environments through the pool's server, without the owner's tailnet. The Conglomerate Host whose tailnet the Environment is in decides only the network. Refines point 7.
(g) Versions. Manual fleet rollouts are frozen from 2026-10-17. Exceptions: finishing in-flight recoveries, the one-time gateway bootstrap, and urgent fixes with the Operator's explicit consent. LazurioPlatform 0.1.9 is the first automated rollout; 0.2.0 is the milestone "all three paths without the Operator's computer".
(h) Waves. 0 reference Organization → browser acceptance (0178) → 1 the operator's own Organization, including its personal Environment → 2 Organizations on the same Conglomerate Host → 3 other Organizations once their gateway exists. Failures in what only the reference Organization has do not stop later waves (refines 0204 point 7). Other personal Environments receive a release only through the nightly run after wave 1 (point e).
(i) Progress in the Dashboard. The runner writes run state to the Dashboard database. An Organization Admin sees it in the Organization overview through their Lazurio account, and an owner sees their personal Environment. It is a mirror, not authority (refines point 3).
(j) Security promise of Organizations (every Organization except the reference one).
main, and grants only a temporary tagged node;(k) New Environments and Organizations use the same technology with another trigger.
Open:
The other 0205 open questions remain.
Today: decided, not deployed; the Operator's Mac remains the only runner until the gateway is deployed.
0204 addendum:
The reference Organization gets its own small Conglomerate Host with three parts:
That makes it technologically the same as other Organizations. People and visitors still enter its Environments publicly, without a tailnet.
Its Deployment Repo becomes the private
infra, renamed from the privatemachines. The public documentation repoinfrais renamed toinfra-example.Its rollouts use the same pipeline, without a persona and without a click; the other conditions of point 7 stay.
The addendum names what it changes:
Commits:
aa80efb4(first draft),299dffb5(Matěj's follow-up decisions: GitHub runner by default, the reference Organization's own Conglomerate Host,infra-example),f33b82ea(option A for the security promise; 0146 point 2 unchanged).What does not change
Verification
origin/main. The change is a pure append on lines 140 and 141: each old row is an exact prefix of the new one, each row keeps two cells, and the trailing newline is kept.git diff --name-only origin/main..HEADlists onlymanual/decision-register.md.f33b82ea: all six jobs pass (bun run checkon ubuntu and windows, guide app build, npm package gate on macOS, ubuntu and windows).bun run check:aa80efb4and299dffb5, every suite passes except 13 cases inlaunchpad/src/macos-launcher-installer.test.mjs. They fail withlipo: -verify_arch requires exactly one input file, which is the known host issue macOS Launchpad installer check fails at lipo verify_arch on clean main #398 on cleanmain.f33b82ea, run while two applies were running from the same Mac, the same 13 macOS Launchpad installer check fails at lipo verify_arch on clean main #398 cases fail. In addition, 19 Doctor and update-CLI tests hit the 10 s per-test timeout, and the Launchpad suite took 584 s instead of 308 s.main(5f2d171d), under the same load and with the runner's 10 s timeout,launchpad/src/diagnostics-lib.test.mjsalone hits the same timeouts (4 of 66 at that moment; the count moves with load). No test reads the register, so the timeouts are environmental, not caused by this change.resident:testneeds a clean checkout and passes on the commits;doctor:agent-skillspasses.bun run check:docs: pass onaa80efb4.bun run pr:preflight: ok onf33b82eaagainstorigin/main5f2d171d. One earlier attempt failed: itsgit fetchexceeded the 20 s limit while the link was congested.Risks and open questions
Follow-ups
🤖 Generated with Claude Code