diff --git a/.gitea/workflows/mirror.yml b/.gitea/workflows/mirror.yml index affa9fd..bdb286c 100644 --- a/.gitea/workflows/mirror.yml +++ b/.gitea/workflows/mirror.yml @@ -12,7 +12,10 @@ jobs: - uses: actions/checkout@v7.0.1 with: fetch-depth: 0 + fetch-tags: true # load-bearing for --prune below: no local tags would delete every remote one + # --prune so a tag deleted here doesn't live on at GitHub forever. It only removes refs a + # refspec DESTINATION matches — so tags; main is a non-glob dst, other branches match nothing. - run: | - git push --force \ + git push --force --prune \ "https://x-access-token:${{ secrets.MIRROR_GITHUB_TOKEN }}@github.com/larvit/plainpages.git" \ refs/remotes/origin/main:refs/heads/main 'refs/tags/*:refs/tags/*' diff --git a/.gitea/workflows/renovate.yml b/.gitea/workflows/renovate.yml index f2e7fe3..bd8b303 100644 --- a/.gitea/workflows/renovate.yml +++ b/.gitea/workflows/renovate.yml @@ -30,9 +30,12 @@ jobs: # authorship on the tip, so the author checks are reliable. Level = highest `Release-Bump:` trailer; # pre-1.0 shifts down (auto-release/next-version.ts). Tag-only — release.yml promotes the # already-built image; pushed with renovate-bot's PAT so release.yml fires (the built-in token won't). + # Off until the Actions variable AUTO_RELEASE is set to 'true': Plainpages is pre-announcement and + # deliberately carries no tags, so an automated bump would only invent a version nobody consumes. auto-release: runs-on: docker-host needs: renovate + if: vars.AUTO_RELEASE == 'true' steps: - uses: actions/checkout@v7.0.1 with: diff --git a/AGENTS.md b/AGENTS.md index f433445..c833aa8 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -168,6 +168,26 @@ them. Revisit only if the stated reason stops holding. workspace dir, so ci.sh's web-image build races another run's container creation on the `-web` tag. Accepted for a single-maintainer cadence; serialize with a workflow `concurrency` group if it ever bites. +- **The docs-only CI skip is `*.md` anywhere in the tree, not just the root.** No test, build step or + workflow reads a markdown file (`README-dockerhub.md` is pasted into Docker Hub by hand), so a + nested `examples/plugins/admin/README.md` edit is as safe to skip as `README.md`, and narrowing it + would spend the full gate on one. Both git channels in `ci.sh`'s `docs_only()` pass `--no-renames`: + rename detection names only the destination, so `git mv src/app.ts notes.md` otherwise read as docs + and skipped the gate over a source file that was gone. `src/ci-gate.test.ts` locks the flags as a + *text* guard — the test image (`node:24.19.0-alpine3.24`) ships neither `git` nor `bash`, so it + cannot exercise the function; behaviour was verified against a scratch repo across ten scenarios. + Revisit if a `.md` ever becomes load-bearing. Decided 2026-08-05. +- **Plainpages is pre-announcement: no tags, no releases.** The repo carried tags up to `v0.2.2` from + the `auto-release` job; all of them — and the semver container tags — were deleted 2026-08-05, and + the job is gated behind the `AUTO_RELEASE` Actions variable (unset ⇒ skipped, the fail-safe + direction on every unknown-`vars` path). A version only communicates to consumers, and there are + none; same reasoning that freezes `HOST_API_VERSION` at 1.0.0. Note the coupling: + `registry-cleanup` keeps a hash image only while its commit is a branch head *or* release-tagged, + so with zero tags only branch heads survive the nightly prune — a hand-cut tag must sit on `main`'s + tip. `mirror.yml` pushes tags with `--prune` so the deletions actually reach the public GitHub + mirror; that makes the runner's tag view load-bearing (hence `fetch-tags: true`) and means a tag + or Release created on GitHub is swept away, so releases are cut on Gitea only. Valid until the + maintainer says Plainpages is ready to show people. - **A dropdown is a `