forked from heavy-duty/ceremony
ci: docs-sync-exercise job + CONSUMERS.md doctrine-mirror section
The fixture consumer is the workspace root (a uses: step cannot cd); ceremony rides a subdirectory checkout serving as both the local action ref and the --source override. CONSUMERS.md gains the wiring, bootstrap, and pin-bump procedure (#12's section, amended in the same cycle). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
parent
40fa216e8b
commit
77f195a6ae
2 changed files with 85 additions and 0 deletions
40
.github/workflows/ci.yml
vendored
40
.github/workflows/ci.yml
vendored
|
|
@ -96,3 +96,43 @@ jobs:
|
|||
with:
|
||||
changelog: CHANGELOG.monotonic.scratch.md
|
||||
base-ref: monotonic-fixture-base
|
||||
|
||||
# Exercises actions/docs-sync the way a consumer does (issue #19's
|
||||
# acceptance criterion). Its own job, unlike the exercises above: the
|
||||
# composite reads the CONSUMER's tree at the workspace root, and a
|
||||
# `uses:` step cannot change directory — so the fixture consumer must BE
|
||||
# the workspace root, with ceremony itself checked out to a subdirectory
|
||||
# (that path also serves as the action reference and the --source
|
||||
# override; no ref carrying docs/VENDORED.txt exists to fetch until this
|
||||
# lands, and the exercised bytes should be THIS PR's anyway).
|
||||
docs-sync-exercise:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
path: ceremony-src
|
||||
- name: Construct a fixture consumer at the workspace root
|
||||
# The pin ref is scratch — --source overrides the fetch, but the
|
||||
# pin line itself is still parsed and required (one pin governs
|
||||
# machinery and doctrine; a consumer without one has nothing for
|
||||
# the mirror to be verified against).
|
||||
run: |
|
||||
mkdir -p .github/workflows
|
||||
printf '%s\n' \
|
||||
'name: release' \
|
||||
'on:' \
|
||||
' push:' \
|
||||
' branches: [main]' \
|
||||
'jobs:' \
|
||||
' release:' \
|
||||
' uses: heavy-duty/ceremony/.github/workflows/release.yml@0.0.0-fixture' \
|
||||
> .github/workflows/release.yml
|
||||
- name: Bootstrap the mirror (--fix)
|
||||
uses: ./ceremony-src/actions/docs-sync
|
||||
with:
|
||||
mode: fix
|
||||
source: ceremony-src
|
||||
- name: Verify the mirror (--check, the mode consumers run)
|
||||
uses: ./ceremony-src/actions/docs-sync
|
||||
with:
|
||||
source: ceremony-src
|
||||
|
|
|
|||
|
|
@ -113,3 +113,48 @@ rows remain consumer-owned because paths and surfaces differ by repository.
|
|||
After adding the caller and configuration, run `workflow_dispatch` once to
|
||||
bootstrap labels on a fresh repository. Scheduled and PR-triggered runs only
|
||||
reconcile; they do not repeatedly upsert the taxonomy.
|
||||
|
||||
## Doctrine mirror
|
||||
|
||||
Machinery is consumed by reference — GitHub fetches the workflows and
|
||||
actions above from the pin at run time — but documents have no runtime: an
|
||||
agent reads the working tree it stands in. So the agent-facing doc set
|
||||
(ceremony's `docs/VENDORED.txt`: AGENTS.md, TRIAGE.md, BUILDER.md,
|
||||
REVIEWER.md, LABELS.md) is vendored into each consumer at **`.ceremony/`**,
|
||||
byte-identical to ceremony at the pin, plus a generated `.ceremony/README.md`
|
||||
marking the directory machine-managed. `actions/docs-sync` owns the copy:
|
||||
`--fix` writes it (and deletes what the manifest dropped — mirror means
|
||||
mirror), `--check` re-diffs it in CI on every PR, so a hand edit or a stale
|
||||
pin goes red instead of quietly governing.
|
||||
|
||||
The consumer's ci.yml gains the guard alongside the others:
|
||||
|
||||
```yaml
|
||||
- uses: actions/checkout@v4
|
||||
- uses: heavy-duty/ceremony/actions/docs-sync@<pinned-tag>
|
||||
```
|
||||
|
||||
`mode` defaults to `check`. There is no ref input: the action reads the pin
|
||||
from the consumer's own `.github/workflows/release.yml` — the same single
|
||||
`uses: …/release.yml@<ref>` line that pins the machinery, so one pin governs
|
||||
machinery and doctrine alike, and a second pin cannot fall out of sync.
|
||||
|
||||
**Bootstrap on adoption**: add the release and labels callers first (the pin
|
||||
must exist — the mirror is verified against it), then run `--fix` once from
|
||||
the repo root and commit `.ceremony/` together with the callers:
|
||||
|
||||
```sh
|
||||
curl -fsSL "https://raw.githubusercontent.com/heavy-duty/ceremony/<pinned-tag>/actions/docs-sync/docs-sync.sh" \
|
||||
| bash -s -- --fix
|
||||
```
|
||||
|
||||
If the repo has no root `AGENTS.md`, `--fix` also scaffolds the thin stub
|
||||
that routes agents to `.ceremony/AGENTS.md` — created once, never
|
||||
overwritten; it is per-repo content the moment you edit it, so `--check`
|
||||
asserts only that it exists.
|
||||
|
||||
**The pin-bump procedure**: bumping the pin is one PR — the pin line change
|
||||
plus the re-synced mirror (run `--fix` locally, or let the red `--check` on
|
||||
the bump PR say what is stale). The guard makes a half-done bump — pin
|
||||
without mirror, mirror without pin — unmergeable, which is how a process
|
||||
change rolls out: deliberately, per repo, reviewed.
|
||||
|
|
|
|||
Loading…
Reference in a new issue