Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/merge-bot-pull-request.yml
Original file line numberDiff line numberDiff line change
Expand Up@@ -17,7 +17,7 @@ on:

# Concurrency keys on the pull request number rather than github.ref.
# Under pull_request_target github.ref is the base branch, which would serialize every bot pull request.
# cancel-in-progress is false so a follow-up synchronize cannot cancel an in-flight opened run.
# Setting cancel-in-progress to false means a follow-up synchronize cannot cancel an in-flight opened run.
concurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number }}
cancel-in-progress: false
Expand Down
2 changes: 1 addition & 1 deletion HISTORY.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -5,7 +5,7 @@ Pieter Viljoen's blog, and the tooling that builds, verifies, and deploys it.
## Release History

- Version 1.0:
- First public release. The blog's content, media, URL contract, and deploy tooling are published as a repository for the first time, having previously lived inside a hosted blogging platform.
- The blog's content, media, URL contract, and deploy tooling live in one repository, under version control and gated by CI.
- 108 posts and 2 pages as Hugo content, in a tree that mirrors the URLs it serves, with 778 media files carried at their original bytes.
- The URL contract as committed ground truth: 328 addresses that must render, 917 that must redirect, and 778 legacy image URLs that must resolve, each verified with a live request rather than predicted.
- CI gates that contract on every pull request, alongside the doc, shell, and workflow linters, with the Hugo version pinned by checksum so a build is reproducible.
Expand Down
2 changes: 1 addition & 1 deletion OPERATIONS.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -139,7 +139,7 @@ A restart is needed whenever **any** Caddy config changes, not only this file. T

## Redirects

The site answers 917 addresses it does not render, satisfied by 13 `redir` directives reading 5 map files, all inside the bundle. [`deploy/README.md`](./deploy/README.md) carries the per-class breakdown and the counts; this section covers the operational shape only, so the two do not restate each other.
The site answers 917 addresses it does not render, satisfied by 13 `redir` directives reading 5 map files, all inside the bundle. [`deploy/README.md`](./deploy/README.md) carries the per-class breakdown and the counts. This section covers the operational shape only, so the two do not restate each other.

Ordering is load-bearing, so every redirect lives in a single `route` block. Outside one, Caddy sorts directives by its own precedence rather than by file order, and the broad attachment rule claims the per-post comment feeds that the narrower rule must match first.

Expand Down
2 changes: 1 addition & 1 deletion TODO.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -13,6 +13,7 @@ The site is built and gated in CI. It is on GitHub, and it is not yet serving it
| Deploy shape | done and proven against a running Caddy, on a local mirror |
| CI workflows | green. Validation runs on every pull request and feeds the required check |
| GitHub repo | public, both rulesets active, `configure.sh check` exits 0 |
| Release pipeline | proven end to end. Release `1.0.11` carries the tag, source archive, README, and LICENSE |
| VPS | untouched |

## Blocked on the maintainer
Expand All@@ -22,7 +23,6 @@ The site is built and gated in CI. It is on GitHub, and it is not yet serving it

## Next, in dependency order

- Dispatch `publish-release.yml` once to prove the release path, which exists but has never run.
- Provision the VPS: an unprivileged `blogdeploy` user, the deploy root, and `unattended-upgrades` with automatic reboot.
- Restrict the deploy key with `restrict,command=...`, no pty and no forwarding, so it can do nothing but rsync into `releases/` and swap the symlink. Generate per-environment keys so staging cannot reach production.
- Choose the staging FQDN, add its DNS record, and expose it through Pangolin as a public resource with **no auth**, since CI's live-URL check has to reach it. Authentication defaults to on for a public resource and has to be turned off deliberately.
Expand Down
16 changes: 8 additions & 8 deletions reports/Blog/audit.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -10,7 +10,7 @@ Self-audit of this repository against its own committed ground truth, per [AUDIT

**Operational.** Every applicable check passes against the live repository.

The publish and release surface is **deferred**, not failed. That deferral is declared rather than hidden, and is tracked in [ProjectTemplate#456][hub-issue], which [`STANDUP.md` section 5][standup] permits.
The release surface passes. The **deploy** to the VPS is **deferred**, not failed, and that deferral is declared rather than hidden, tracked in [ProjectTemplate#456][hub-issue], which [`STANDUP.md` section 5][standup] permits.

| Dimension | Result |
| --- | --- |
Expand All@@ -19,7 +19,8 @@ The publish and release surface is **deferred**, not failed. That deferral is de
| 3. The URL contract | **Pass.** Enforced by CI, not only locally |
| Baseline file presence | **Pass.** 23 of 23 |
| Verbatim fidelity | **Pass.** 4 of 4 |
| Publish and release | **Deferred**, deliberately |
| Release | **Pass.** Dispatch-only, proven by release `1.0.11` |
| Deploy to the VPS | **Deferred**, deliberately |

## 1. Settings and Rulesets

Expand DownExpand Up@@ -102,13 +103,13 @@ That is a local mirror, not CI and not production. CI cannot run it, because the

Eight carried files arrived CRLF and were normalized to LF to satisfy this repository's declared `lineEndings`. That is governed drift rather than a fidelity deviation, and it is reported upstream as an onboarding trap, since nothing in the standup text says to normalize after carrying.

## Publish and Release: Deferred
## Release Proven, Deploy Deferred

`publish` is empty and `releaseTrigger` is `none`, deliberately.
The two are separate and only one of them is outstanding.

This repository will deploy a built site to a VPS over SSH, which is a release surface the fleet spec has no type for. The measured shape will be reported to [ProjectTemplate#456][hub-issue] once CI has run a deploy, rather than predicted now. The VPS does not exist, so there is nothing to measure.
**The release is proven.** `publish-release.yml` is dispatch-only, and release `1.0.11` on 2026-08-01 carries the tag, the source archive, the README, and the LICENSE. The hub registry declares it accordingly: `publish` names the GitHub release and `releaseTrigger` is `dispatch-only`.

`publish-release.yml` exists and is dispatch-only, but has never been dispatched. The release path is therefore untested.
**The deploy is deferred.** This repository will deploy a built site to a VPS over SSH, which is a release surface the fleet spec has no type for. The measured shape will be reported to [ProjectTemplate#456][hub-issue] once CI has run a deploy, rather than predicted now. The VPS does not exist, so there is nothing to measure.

## Deliberate Deviations

Expand All@@ -122,8 +123,7 @@ Both are recorded in [AUDIT.md](../../AUDIT.md) and reported upstream, so neithe
Carried forward rather than closed:

- The redirect half of the contract is proven only against the local mirror, by hand, before a pull request. CI has no server to point at, so nothing enforces it automatically until staging exists.
- `publish-release.yml` has never been dispatched, so the release path is untested.
- No deploy exists, so the publish surface stays deferred and the registry entry stays `publish: []`.
- No deploy exists, so the VPS deploy surface stays deferred. The GitHub release is the only channel that currently ships, which is what the hub registry declares, and the VPS target is revisited when a deploy has actually run.
- `checks/README.md` carries a small prose backlog of `dash` and `semicolon` findings, left for the next edit of that file per the correct-as-you-next-edit rule.

<!-- Repo -->
Expand Down