Skip to content

docs: correctness + cloud-accuracy sweep, version normalisation, GHCR container publishing (v1.0.3)#10

Merged
postgresql007 merged 7 commits into
mainfrom
docs/claim-audit
Jun 24, 2026
Merged

docs: correctness + cloud-accuracy sweep, version normalisation, GHCR container publishing (v1.0.3)#10
postgresql007 merged 7 commits into
mainfrom
docs/claim-audit

Conversation

@postgresql007

Copy link
Copy Markdown
Contributor

Audit-driven documentation correctness pass plus the wiring to publish container images, prepared as v1.0.3.

Why

A prospective user spotted the docs claiming pg_hardstorage "works against managed PG (RDS, Cloud SQL, Azure DB)" while the site's /how-it-works page said the opposite. The site is correct: the data plane is physical replication (BASE_BACKUP + physical slot), which fully-managed DBaaS don't expose. That triggered a full claim audit against the codebase.

What's in here

  • Managed-DBaaS accuracy: every "works on managed PG" claim removed; standardised on "self-managed PostgreSQL; managed DBaaS out of scope". Web-verified against each vendor's replication docs (RDS, Aurora, Cloud SQL, Azure Database, Neon, Supabase). FAQ now states the per-provider basis and an explicit "what we have not verified" note.
  • Broad correctness sweep: feature counts (six storage backends, one LLM provider, 216 CLI pages), PG support (15–18; 15/16/17 CI-required, 18 allow-failure), nonexistent CLI flags in tutorials/ops guides, AES-256-GCM-SIV→GCM, cosign→Ed25519, SLSA pipeline reality. CNPG-I / Rekor anchoring / skill signing / FIPS image marked roadmap.
  • Version hygiene: stale 0.9.2 / 0.1.1 / 0.9.x references → current; download/verify examples now use a VERSION variable so they don't go stale.
  • File-existence audit: fixed 5 broken in-repo path claims (pkcs11 plugin path, SPEC.md, operator-guide link, the absent scripts/firecracker-rootfs.sh, cmd/pg_hardstorage_fips).
  • Container publishing (gated): setup-qemu+setup-buildx, docker_signs (keyless cosign image signatures), and --skip=docker gated on a PUBLISH_CONTAINERS repo variable (default safe — ships binaries/.deb/.rpm/brew; publishes signed images once GHCR is enabled). Added a goreleaser check CI step.
  • CHANGELOG: new [1.0.3] section.

Validated locally

YAML parse (goreleaser + workflows), go build ./internal/cli, file-existence audit, cloud web-verification.

Needs CI / pre-tag

goreleaser check (this PR's new step), and make docs-deps && docs-build docs-regen docs-doctest. Image publishing additionally needs the org to enable GHCR Actions package-write + set PUBLISH_CONTAINERS=true. Image-level SLSA provenance remains roadmap.

The docs repeatedly claimed pg_hardstorage "works against managed PG"
(RDS, Aurora, Cloud SQL, Azure Database, Aiven, Supabase, Neon) — the
comparison page even sold it as the #1 reason to choose the tool. That
is false: the data plane is physical replication (a physical slot plus
BASE_BACKUP), and fully-managed DBaaS do not expose BASE_BACKUP /
physical replication to customers, so it cannot take a physical base
backup of them. This contradicted the README and the site's
how-it-works page, and a prospective user flagged it.

Standardise every page on the truth: pg_hardstorage targets PostgreSQL
you run yourself (bare metal, VMs, containers, Patroni, CloudNativePG).
The genuine architectural advantage is no SSH / no OS access / no
archive_command on the host — not managed-DBaaS support. Managed DBaaS
are explicitly out of scope.

Also fixes the CLI long-description source (internal/cli/wal.go) so the
generated reference page does not regress.
Follow-on to the managed-DBaaS fix. Five parallel audits cross-checked
doc claims against the code; corrected every verifiable mismatch:

Counts/versions:
- storage backends "five"->"six" (scp was omitted); LLM providers
  "eight"->one (only the OpenAI-compatible client + a test mock are
  registered); CLI page count 202->216; KMS 4-vs-5 wording reconciled.
- PG support: faq had PG18 "first-class from v0.9" backwards (15/16/17
  are required in CI; 18 is allow-failure); release notes said the
  default sandbox is PG17 (it is PG18).

Nonexistent/renamed CLI in tutorials & ops guides:
- llm propose backup-schedule (->llm ask), restore --confirm (->--force),
  backup --no-compression (removed), doctor --json (->-o json),
  agent status (->status <deployment>), agent --step-down (planned),
  verify --sandbox-backend/--firecracker-* (yaml, not flags),
  audit export-bundle -o (->--out), `pg_hardstorage simple`
  (->pg_hardstorage_simple). Dropped the fictional restore second-prompt.

Overstated readiness:
- "wal push/fetch/list/repair are scaffold for now" — they are fully
  implemented (removed, source + generated page).
- CNPG-I marked as shipped in the comparison + a runnable tutorial —
  it is v0.5 roadmap; added roadmap markers/admonition.
- skill cosign-signing and --allow-unsigned-skill described as present —
  signing is roadmap; reworded.

Crypto/signing:
- AES-256-GCM-SIV claimed as the default/shipping cipher across ~12
  pages — the code ships plain AES-256-GCM (repo's own SPEC_DRIFT and
  release notes confirm). Reframed: GCM ships today, GCM-SIV is the
  planned default. Kept the FIPS "BoringCrypto lacks GCM-SIV" rationale.
- audit/evidence bundles and skill signatures described as cosign —
  they are Ed25519 (agent keyring); cosign is for release artefacts.
- SLSA page aligned to the real pipeline: provenance via
  slsa-github-generator (.intoto.jsonl) not `cosign attest`; container
  images + FIPS image marked not-yet-shipped (release runs --skip=docker).
- transparency-log anchoring framed as self-hosted today, external
  Rekor as roadmap.

Source: removed the stale "scaffold" line from internal/cli/wal.go
(gofmt-clean, builds).
Web-checked (June 2026) each named managed provider against its own
replication documentation; all six withhold customer-reachable
BASE_BACKUP / physical replication:
- RDS, Aurora: external physical replication / pg_basebackup unsupported
- Cloud SQL, Azure Database: only logical replication/decoding to
  external consumers; physical is internal managed-HA
- Neon: custom pageserver storage, no traditional pg_basebackup
- Supabase (hosted): can publish logically, cannot be a physical replica

Added to the FAQ: the per-provider rationale, the general BASE_BACKUP
test, and an explicit "What we have not verified" admonition (list not
exhaustive, vendor behaviour changes, run `wal preflight` to confirm;
self-hosted distributions including self-hosted Supabase are supported).
Cross-checked all version references after a reviewer spotted v0.9.2 in
the docs. Shipped packages are already correct (goreleaser versions
every artifact from the git tag via {{ .Version }}). The stale strings
were all in the docs/examples:

- SLSA + PCI-DSS verification examples: v0.9.2 artifact/image names ->
  1.0.1 (tarball, sbom, ghcr image tags).
- getting-started install: v0.1.1 download URL / .deb / .rpm / docker
  pull / `version` output -> 1.0.1, and the tarball asset name corrected
  to the real versioned form pg_hardstorage_1.0.1_linux_amd64.tar.gz.
- `version`-output examples (build-from-source, fips-variant) and the
  ldflags example: v0.9.x / v0.9.0-dev -> v1.0.x / v1.0.0-dev.
- "ships / installed" capability statements (kms long-desc + generated
  page, source/llm-provider/tier2 plugin contracts, getting-started-
  simple prereq, control-plane example agent version): de-versioned or
  -> v1.0.

Left intentionally: v1.0 release-notes historical narrative ("since
v0.9"), schema-since lineage markers, the miekg/pkcs11@v1.1.1 dependency
pin, and example-plugin/skill versions — none are shipped-package
versions.
So the install / SLSA / SBOM / cosign / docker examples never go stale
again: each command block now sets `VERSION=1.0.1` once (with a pointer
to the latest-release page) and references ${VERSION} in artifact names,
release tags, and image tags. Sample `version`-*output* lines stay
literal (a variable doesn't apply to printed output).

Also fixed an `audit export-bundle -o` -> `--out` in the PCI-DSS
evidence-bundle example (same flag bug already corrected elsewhere; -o
is the output-format selector, not a file path).

Files: tutorials/getting-started.md, compliance/slsa-l3-provenance.md,
compliance/pci-dss.md.
Container publishing (gated, safe-by-default):
- release.yml: add docker/setup-qemu + setup-buildx and gate the
  `--skip=docker` removal on a PUBLISH_CONTAINERS repo variable, so the
  release still ships binaries/.deb/.rpm/Homebrew when GHCR isn't yet
  enabled, and publishes signed multi-arch images once it is.
- .goreleaser.yaml: add `docker_signs` (keyless cosign image signatures).
- ci.yml: add a `goreleaser check` step so the release config is
  validated on every push (the packaging job previously only shellcheck
  + helm lint).

Docs for v1.0.3:
- SLSA page: container-images section reframed from "not yet shipped" to
  "wired, gated on GHCR enablement"; cosign image signatures documented
  as shipping once enabled, image-level SLSA provenance kept as roadmap.
- CHANGELOG: new [1.0.3] — 2026-06-24 section (doc-correctness sweep +
  container publishing).
- Example default VERSION bumped 1.0.1 -> 1.0.3; sample version outputs
  updated.

Broken in-repo path claims fixed (file-existence audit):
- pkcs11-variant.md: internal/plugin/encryption/pkcs11 -> .../kms/pkcs11
- CONTRIBUTING.md: docs/SPEC.md -> SPEC.md (repo root)
- SECURITY.md: docs/operator-guide.md -> docs/operations/operator-guide.md
- firecracker-sandbox.md: dropped the non-existent scripts/
  firecracker-rootfs.sh claim
- reference/plugins/index.md: dropped non-existent cmd/pg_hardstorage_fips
The wal/kms long-description edits changed the source; regenerate the
generated artefacts so the docs-regen drift gate passes (man pages for
kms/wal now reflect the source; wal.md canonical spacing restored).
@postgresql007 postgresql007 merged commit 358d765 into main Jun 24, 2026
33 checks passed
@postgresql007 postgresql007 deleted the docs/claim-audit branch June 24, 2026 11:46
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant