docs: move what lived only in agent memory into the repo
CI / Typecheck, test, feed (push) Successful in 13s
CI / Build site (push) Successful in 7s
CI / Container image (push) Successful in 15s

Four lessons were known to one agent's private notes and to nobody else.
They now live where every agent reads: how Gitea Actions differs from
GitHub Actions, the owner's decision to refresh unreachable sources by
hand rather than relax the robots gate, how to look at the built app in
a headless browser and its traps, and one command per shell call.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Lucas WintherandClaude Opus 5.5 committed 2026-10-13 14:38:28 +02:00
1 parent 2da7f20905
commit 08bbba65ff
2 files changed
+53

No files matched your search

+21
View File
@@ -228,6 +228,27 @@ gates and publish it, while `.github/workflows/ci.yml` builds and deploys to Git
only needs to build and serve, not refresh data sources; the scheduled refresh and container image
publishing run exclusively on Gitea Actions.
**Gitea Actions is GitHub-Actions-compatible, not GitHub Actions.** That compatibility makes
GitHub-shaped answers look right and then fail in specific places, so ask what *Gitea* does before
changing CI, the registry or secrets. The directory name `.github/` is not evidence of which forge
runs a workflow: Gitea reads `.gitea/workflows/` natively, and `test/refresh.test.ts` asserts on the
workflow files by path. The divergences found so far, each one paid for once:
- **The registry does not take the Actions token.** A Gitea package belongs to a user or org, not a
repository, so `secrets.GITHUB_TOKEN` carries no authority over it and `permissions: packages:
write` authorises nothing. The image push logs in with an access token with the *package* scope,
stored as `REGISTRY_TOKEN` — the comments in `.gitea/workflows/ci.yml` carry the detail.
- **`uses:` takes full URLs** (`https://github.com/actions/checkout@v4`); a bare reference resolves
against the instance's `DEFAULT_ACTIONS_URL`.
- **No `gh` CLI on the runner.** `refresh.yml` dispatches `ci.yml` through Gitea's REST API
(`${{ github.server_url }}/api/v1`) with `curl`.
- **A push made with the Actions token *does* trigger workflows**, unlike on GitHub, which suppresses
them. `refresh.yml` dispatches `ci.yml` anyway, and the per-ref concurrency group absorbs the
duplicate.
- **No Pages.** Gitea's deploy artefact is the container image, built without `BASE_PATH`; Pages is
the GitHub mirror's job alone.
- **Gitea push-mirrors to GitHub** — see `AGENTS.md` § Conventions on pushing.
### Hosting under a subpath
Assets resolve against a `<base href>` substituted at build time, the feed URL resolves against