Re-scope: static site on a rented host, without the framework #43
No reviewers
Labels
No labels
blocked
bug
decision
duplicate
enhancement
help wanted
invalid
landed?
question
ready-to-merge
stale
wontfix
bug
duplicate
enhancement
help wanted
invalid
question
wontfix
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
allod/strategy!43
Loading…
Reference in a new issue
No description provided.
Delete branch "agent/static-site-vps-rescope"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Re-scopes the static-site-on-a-rented-host work after the
servicearchetype was abandoned. This is a plan, not code: nothing in any machine changes until it is agreed. It exists because the previous attempt shipped four PRs of framework machinery for a deliverable that needs none, and the useful output of that attempt was the evidence for why.What it settles
One decision, and it is the one that unblocks everything else: publish content in the system closure, and do not build the CI-push path yet. That choice determines what the content checks are for. They validate a store path; under CI push the store path stops being what Caddy serves, and every one of them inspects the wrong artifact. Content-in-closure is also fewer moving parts — no runner, no deploy key, no rsync target — and keeps the symlink-escape guarantee where it is already implemented and tested. The trigger to revisit is publishing cadence, not preference, and the reversal costs one vhost body plus moving the symlink check into the pipeline.
Where a rented host lives. In
deploy'snixosConfigurations, composed from modules that already exist and are already checked. Inside the management path — one lock, onefollowsdiscipline, uniformnixos-rebuild --flake. Outside the data-model path — noinventoryentry, no builder dispatch, novmFacts, no identity join.Shape
Five slices, each landable alone with its own witness. Slice 3 is the deliverable and its witness is
curl -sSI https://<domain>returning 200 with a real certificate — everything before it is evaluation. Slices 0 and 1 are deliberately first and cheap: rewrite two issues that presume the abandoned model, and delete a content rule that cannot fire in production, so nothing is built on known-wrong material.Risk is per slice, R0 through R3. Slice 3 is R3 rather than R4 because the host carries no state: the worst credible failure is a misconfigured box that is destroyed and reinstalled, with nothing authoritative on it. It is not R2 because an open port or an accepted key on a public host is a real exposure and the install path cannot be exercised in fixtures.
Interface contracts: none new
That is the point. The plan consumes
publicHost,staticSite,rentedKvmGuestandbuildZolaSiteunchanged, and says plainly that adding an interface here is a signal the shape is wrong again.Gates
Renting the host, DNS, and the first
nixos-anywhereinstall are human-only and block slice 3 outright. Operator SSH keys are a human decision:adminAuthorizedKeyshas no default on purpose, after review found the old default handed root on a rented internet-facing box to the nexus host identity — a recipient of every ciphertext in the fleet.What it does not do
No new archetype, builder, or inventory entry; that question is settled by
allod/archetypes#60's closure and reopening it needs new evidence rather than another attempt. No stateful-service layer and no forge host. Revertinginventory'sservicerules is left out as separate and unurgent, with the note that any revert must keep the shape diagnostics that merge also added — they closed a real hole where a machine with noplatformreached consumers unvalidated.Slice 4 is a written record rather than work: what the forge host will need, so this plan does not foreclose it. It names the axis (
inventoryis wrong for both a static host and a forge;secretsis right for the forge only), keeps the half ofallod/archetypes#55that survives, and states the restore story including the bootstrap circularity — the backup contains the repositories, so what must live outside it is the age key, the backup credentials, and registrar access.Review
Plan review passes are budgeted by risk. The highest slice here is R3, so at most two passes before landing and measuring. Slice 3's behaviour is settled by installing the host, not by a third reading.
Closing unmerged. This plan scopes work that already exists.
static-site-partsis a complete standalone flake servinghashpool.dev—nixosConfigurations.pages, its own static-site module, its own checks, a site builder, and a last commit reading "Serve the real website instead of a placeholder". It is one line from installable: the operator public key, deliberately left empty for a human to commit.That repository is also already the shape this plan spent five slices arriving at: a standalone flake composing modules, no
inventoryentry, no archetype, nosecretsidentity.The failure was mine and it was cheap to avoid.
work-difflistedstatic-site-partsin this workspace at the start of the session and I never opened it. A plan is the wrong artifact when the deliverable is sitting in the working tree; the right first move was to read what exists.What survives from the plan is recorded where it belongs rather than here: the deploy-model decision on
allod/archetypes#57, the structural finding onallod/archetypes#60, and the layering conclusion onallod/archetypes#55. The forge-host notes were the only genuinely new material, and they belong on a forge issue written against a real machine.Pull request closed