# Changelog

All notable changes to `mgf-standard` are documented here.

Format: [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
Versioning: [SemVer](https://semver.org/) — 0.x MINOR may break; see
[`docs/standards/`](docs/standards/) AP-03.

---

## [Unreleased]

## [0.1.80] - 2026-08-07

**Why this release exists:** `release-currency` said so. The unpin finale
(#309) regenerated `MGF_LIBRARIES.json` — shipped wheel data — without a
release, so the published 0.1.79 carried a registry that main had already
outgrown; the 2026-08-07 waiver-triage prep dry-run surfaced the finding and
the founder ruled the release rather than a waiver. This release also records
the registry walking to **mgf-fed 0.25.2** (the `_default_ref`/freshness-probe
class fix, mgf-fed #166 — the soothrede waiver's named remedy) and
**mgf-standard 0.1.80** itself (bump first, regenerate the registry last —
the 0.1.77 discipline, rendered this time from origin-default mirrors so the
committed registry matches what the audit grades).

### Changed
- **The fleet catch-up wave closed, so the auditor is unpinned: `mgf-fed==0.24.0`
  → `mgf-fed>=0.25.1,<0.26`.** The pin added on 2026-08-06 was a temporary measure
  with a named exit, and **both of its conditions are now met**, ~13 days inside
  the 2026-08-19 deadline the artifact's own freshness limit imposed:

  1. `>=0.25.1` — 0.25.0's `registry-consistency` parsed its own divergence
     banner's stdout as findings (8 false of 9); mgf-fed #162 moved the banner to
     stderr and resolved members at `origin/<default>`.
  2. The `AUDIT.json` regen had to **follow** the wave. PAPER-148 moved the
     canonical `check_commit_trailers.py` bytes (`6278a215…` → `37c6597e…`), so
     until every member re-ran `catch-up --apply`, `ci-workspace-truth` truthfully
     reported 53 repos as divergent. Regenerating first would have forced ~53
     waivers for a state that fixes itself.

  **The wave is complete and verified rather than asserted:** a byte-comparison of
  every registry member's `origin/<default>` copy against canon gives **53/53
  identical** to `37c6597e…` — zero differing, zero missing. (53 counts
  mgf-standard itself; the sweep's 52 excludes it. Same complete wave.)

  The replacement is a **floor and ceiling**, not a peg. The incident was a MINOR
  adding checks, which `<0.26` would have held while `>=0.25.1` still let patch
  fixes through. Pegging exactly trades one failure mode for another — patches
  locked out, and a fleet-wide re-scaffold owed on every mgf-fed release. **The
  durable rule is the pairing: raising the ceiling is a change that also
  regenerates the artifact.** This is the shape FEEDBACK **PAPER-158** argues for
  fleet-wide, where 40 of 62 members with a pipeline still install a federation
  tool unpinned.

- **`AUDIT.json` regenerated under mgf-fed 0.25.1**, so the artifact and the
  auditor finally ask and answer the same questions — 14 checks, none skipped.

- **`AUDIT_ACCEPTED.toml`: −10 entries, +5.** **The orphan deletions are the
  wave's receipt.** Every `ci-workspace-truth` waiver — `figrecovery`, `hrb-app`
  (×2), `inthewords`, `magogi-proof`, `mgf-media` (×2), `mgf-standard`,
  `vm-vmanager-app` — covered a repo whose checker was missing, stale, or
  fail-open, and the wave vendored the canonical copy into all of them.
  `conformance-ledgers/TelePlasma` went the same way when its ledger completed. A
  waiver that matches nothing **fails** this gate by design, so the list could not
  rot quietly: it told us the debt was paid. The five that remain are
  `registry-consistency` × {the self-clearing registry row, `vm-vmanager-app`'s
  un-walked pin, `inthewords`' F-47 migration} and `ci-workspace-truth` ×
  {TelePlasma's digest, soothrede's bench remote}.

- **The registry re-rendered from default branches** (three rows): `mgf-fed`
  0.25.0 → **0.25.1**, and TelePlasma's two pins → `mgf-fed[cli]>=0.25.1,<0.26`
  and `mgf-standard>=0.1.79,<0.2` (their #86 walk). That **kills the
  TelePlasma-pin consistency finding at the source instead of waiving it** —
  consistency goes 3 → 2. Two consecutive renders byte-identical.

### Fixed
- **A dead-webhook signature on `mgf-vm-firecracker`, caused by the wave and
  fixed rather than waived.** `ci-freshness` reported *"main is 2 commit(s) PAST
  the newest build … a dead webhook looks exactly like this."* It was right: the
  wave's own scaffold merge (`6af20e6`, their #47) produced **no push pipeline**,
  while the newest push build still sat on `73b0423`. Repaired via the check's own
  remedy (`POST /repos/3/repair`, HTTP 204) and the missing build triggered on
  `main`. Repair fixes the hook going forward but does **not** backfill, which is
  worth knowing. Isolated — 43 repos examined, this was the only one. **Recorded
  as a watchlist precedent:** if other members' webhooks die the same way, this is
  the signature and this is the remedy.

## [0.1.79] - 2026-08-06

Patch release that DELIVERS the PAPER-148 scaffold seam. The trailer gate's unit
test is **shipped wheel data** (`mgf/standard/_scaffold/`), so the third
`_SCAFFOLD_FILES` entry merged in #304 reaches **no consumer** until this
publishes — `mgf-fed catch-up` resolves scaffold text from the *installed*
`mgf.standard` package, not from a checkout. The same shape as 0.1.76 and
0.1.78: a shipped-data change that does not exist until it is released.

**Release ordering — `mgf-fed` 0.25.0 published first, and has.** The seam is a
two-map lockstep and new-standard-against-old-fed is the failing direction. That
constraint is now **satisfied**: `mgf-fed` 0.25.0 is tagged and live on devpi
(`v0.25.0`, `origin/main` `41f44ad`), carrying `_SCAFFOLD_DEST`'s third entry and
the tolerance guard. The registry below records it.

Bump first, **regenerate the registry LAST** so it records **0.1.79 itself** —
the discipline 0.1.77's release commit set down after 0.1.76 needed a second PR
for having rendered before bumping.

**Three substantive registry facts move** (REL-13). The cohort released *around*
this branch while it was being cut, and the registry records the state that
resulted — not the state at the moment the branch opened:

| Row | Was | Now | Why |
|---|---|---|---|
| `mgf-standard` version | 0.1.78 | **0.1.79** | this release |
| `mgf-fed` version | 0.24.0 | **0.25.0** | released mid-branch — tag `v0.25.0`, live on devpi, `origin/main` `41f44ad`. This is the half of PAPER-148's two-map lockstep that MUST precede this release, so recording it here is the point, not an accident. |
| `mgf-common` (cornerstone) | 0.51.0 | **0.51.1** | also released mid-branch — tag `v0.51.1`, `origin/main` `b32e14b` (the cryptography-CVE release). Moves `cornerstone_version` and the compatibility matrix's cornerstone line. |

The first render of this branch recorded `mgf-fed` at 0.24.0 and `mgf-common` at
0.51.0, which was true when it was taken and false forty minutes later. It was
re-rendered rather than shipped, because a registry that names a version nobody
can install is the failure REL-13 exists to prevent — and fixing it on the branch
avoids the second-PR pattern 0.1.76 needed.

**The consistency gate stays RED, and now names three findings** — up from one,
and the increase is a true consequence of the two releases above, not a
regression this release introduced:

```
- TelePlasma pins `mgf-fed [cli]>=0.24.0,<0.25` but mgf-fed is at 0.25.0
- inthewords pins `mgf-common >=0.44,<0.47`   but mgf-common is at 0.51.1
- vm-vmanager-app pins `mgf-fed [cli]>=0.24.0,<0.25` but mgf-fed is at 0.25.0
```

The two `mgf-fed` findings are **known in-flight walks**: TelePlasma and
vm-vmanager-app both pin `<0.25`, and the cohort walk to the 0.25 floor is the
next item in the release train — the pins are stale by design for exactly as long
as it takes the train to reach them. `inthewords` is the standing un-walked pin
carried since before 0.1.78. None is this release's doing or its to fix; the
**currency** half of REL-13, which is this release's responsibility, is GREEN.

**One known lag, stated rather than papered over.** `mgf-fed` **0.25.1** releases
around the same time as this one, so the `mgf-fed` row above (0.25.0) is one patch
behind on arrival. It was **not** re-rendered a fourth time, and the reason is that
the delta is provably inert rather than merely small: diffing every field the
registry renders — `version`, `requires-python`, `dependencies`, and all five extras
with their pins — 0.25.0 and 0.25.1 are **identical except the version string**. It
moves no dependency edge, no `used_by` set, no release wave, and **no consistency
finding**: TelePlasma and vm-vmanager-app pin `>=0.24.0,<0.25`, which excludes both
alike. Contrast the 0.24.0 → 0.25.0 move recorded above, which flipped three findings
and was worth a re-render. REL-13 measures currency **at render time** and re-checks
it at the next release; this row catches up there. The same is not true of a lag that
changes a dependency or a pin — that is a re-render, not a note.

**The regen was taken from each member's default branch, not from whatever branch
its checkout was parked on** — the discipline 0.1.78 set down, because publishing
a working-tree render into shipped wheel data is the 0.1.75 class this repo has
already paid for once (*"it named a member no regeneration could produce, because
it had been generated while an unmerged enrollment branch happened to be checked
out"*). **61 of 67 checkouts are parked** — 30-odd on `ci/git-in-test-steps`, the
rest on `fix/ag03-*`, `fix/sc23-*`, `chore/walk-*-pin` and court branches, with
only four level with their origin default. Every member's manifest was therefore
extracted from `origin/<default-branch>` after a fleet-wide fetch (64 of 67
refreshed; `mgf-secrets-store`'s remote is HTTPS and prompts for a password, so it
rendered from its last-fetched `origin/main`). `mgf-standard` alone rendered from
this release worktree, because its bump is the thing being released. Two
consecutive renders are byte-identical.

**And this time it demonstrably mattered — but it did not at first, which is the
whole argument for doing it unconditionally.** The registry was rendered a second
way, from every member's *working tree*, as a control. On the first pass the two
outputs were **byte-identical**: no member's `pyproject.toml` differed between
checkout and default branch, because those 61 parked branches were CI-configuration
work that touches no manifest. The check looked like ceremony.

Forty minutes later `mgf-fed` 0.25.0 and `mgf-common` 0.51.1 both released, and the
same control now **differs**:

| | default-branch render (shipped) | naive working-tree render |
|---|---|---|
| `mgf-fed` | **0.25.0** | 0.24.0 |
| `mgf-common` / `cornerstone_version` | **0.51.1** | 0.51.0 |
| consistency findings | **3** | 1 |

The parked checkouts of `mgf-fed` (`fix/ci-workspace-truth-invocation`) and
`mgf-common` (`ci/git-in-test-steps`) predate their own releases, so a
working-tree render would have published two superseded versions into shipped
wheel data **and hidden both in-flight pin walks** by never noticing `mgf-fed`
had moved past what TelePlasma and vm-vmanager-app pin. That is the 0.1.75 class
again, arriving inside a single afternoon. The lesson is not "the bench is
dangerous" — it is that whether a shortcut is safe is not knowable in advance,
which is exactly why the procedure does not ask.

### Added
- **The AG-03 trailer gate's unit test now travels with the gate.**
  `_SCAFFOLD_FILES` gains a third artifact —
  `test_check_commit_trailers.py` → `tests/unit/test_check_commit_trailers.py` —
  so `mgf-fed catch-up --apply` writes the proof beside the implementation and
  every consumer *inherits* the seven assertions instead of forking them.
  Resolves **FEEDBACK PAPER-148** (a), filed by TelePlasma's TS-29 close-out
  sweep; ACCEPTED under the founder-delegated triage of 2026-08-06.

  The paper's diagnosis was that two federation obligations were in live
  tension: `mgf-fed audit --check ci-workspace-truth` grades the checker's
  **byte-identity** across the fleet, while TS-29 wants each copy to carry its
  own negative fixture. Satisfying both locally means N divergent proofs of one
  byte-identical implementation — the SHP-09 silent-disagreement failure applied
  to tests. The only place both hold at once is the source, so the test ships
  from the source.

  **The test needed no edit to travel.** It already resolves the script it
  exercises as `Path(__file__).resolve().parents[2] / "scripts" /
  "check_commit_trailers.py"` — the repo root from `tests/unit/` in any repo —
  and loads it through `importlib` because `scripts/` is not a package. Verified
  against a fake consumer (different name, own `pyproject.toml`, **no
  `mgf.standard` installed**): the two files written through `read_scaffold()`
  are byte-identical to the canonical, the consumer's own pytest collects
  10 passing cases, and planting a case-fold defect in the consumer's *own*
  checker reds 5 of them. That last run is the TS-29 negative control TelePlasma
  could not write without forking; it now arrives with the file.

- **`list_scaffold()` returns three names**, up from two — a public-surface
  widening (**AP-\***). `PUBLIC_API.json` is byte-unchanged (it pins exported
  *names*, and no name was added); `PUBLIC_API.md`'s `list_scaffold` row and the
  `test_scaffold` pin carry the movement, and the row now states the set **grows**
  so no caller pins its length.

- **A local pin for the third byte-identical copy.** `templates/policy.toml`
  `[exact]` routes `mgf-fed drift-check` at `templates/check_commit_trailers.py`,
  but that comparator lives in another repo and cannot run in this repo's gates
  (`CONTRIBUTING.md` `## CI delta`) — so nothing here noticed if the template copy
  drifted from `scripts/`. `test_scaffold.py::TestTemplatesCopyIsPinned` closes
  that, and pins that `policy.toml` still points at the file it compares.

### Changed
- **`scripts/check_commit_trailers.py`'s module docstring says where the proof
  lives** — *"unit-tested in `tests/unit/test_check_commit_trailers.py`, shipped
  alongside this file by the mgf-standard scaffold seam"*. PAPER-148 (b): a
  scaffold file's docstring is read in every repo the scaffold reaches, and
  "is unit-tested", unqualified, was false at every destination but this one.
  Propagated to both byte-identical copies (`templates/`, the cookiecutter) in
  the same commit.

  **This changes the canonical bytes** (sha256 `6278a215…` → `37c6597e…`), so
  every consumer's copy now differs from the installed scaffold until it re-runs
  `mgf-fed catch-up --apply`. That is the designed propagation path, not a
  regression: `mgf-fed audit --check ci-workspace-truth` grades identity against
  the **installed** `mgf.standard`, so the finding appears only after a consumer
  bumps its pin, and clears when it applies catch-up.

### Fixed
- **The `cross-layer-audit` gate installed its auditor unpinned, so a sibling's
  release could turn this repo's board red mid-queue — and on 2026-08-06 one did.**
  `mgf-fed` 0.25.0 published to devpi while mgf-standard's pipelines sat in the
  queue; it registers two checks (`lessons-mechanized`, `registry-consistency`)
  that the committed `AUDIT.json` predates, so `--check-artifact` correctly
  reported the artifact INCOMPLETE. Every board went red — **this release's own PR
  among them**, along with an unrelated PR that touched only `FEEDBACK.md` — with
  no line of this repo changed. The pipeline that passed at 15:07 and the one that
  failed at 15:59 ran the **same commit's gate against different tools**. (Landed
  as PR #307, immediately before this release, which is why 0.1.79 carries it.)

  Pinned to `mgf-fed==0.24.0`: the **newest** version whose check set (12) matches
  the artifact's `ran` list exactly, so it carries every other fix while asking the
  artifact only questions it answered (verified — 0.23.0 and 0.24.0 register the
  same 12, 0.25.0 registers 14). A gate's **tools** belong to its definition just
  as its `image:` tag does; this pipeline pins `python:3.12-slim` rather than
  `python:latest` for exactly the reason an unpinned `pip install` re-opened by
  the back door.

  **Unpin trigger, named:** move to `>=0.25.1` **and** regenerate `AUDIT.json` in
  the same change, during the fleet catch-up wave that inherits 0.1.79's scaffold
  bytes. Both halves are load-bearing — 0.25.1 (mgf-fed #162) is the floor because
  0.25.0's `registry-consistency` parsed its own banner's stdout as findings (8
  false of 9), and the regen must follow the wave because PAPER-148 moved the
  canonical checker's bytes, so until each member runs `catch-up --apply`,
  `ci-workspace-truth` truthfully reports 53 repos as divergent. Regenerating first
  would force ~53 waivers for a state that clears itself. The step comment and
  `CONTRIBUTING.md`'s CI-delta row carry the detail; the artifact's own 14-day
  freshness limit (stamped 2026-08-05) makes **2026-08-19** the hard deadline.

### Release ordering
- **`mgf-fed` 0.25.0 MUST publish before mgf-standard 0.1.79.** The scaffold seam
  is a **two-map lockstep**: `_SCAFFOLD_FILES` here (name → source) and
  `_SCAFFOLD_DEST` in `mgf-fed`'s `cli/_catch_up.py` (name → destination). A new
  standard against an old fed is the failing direction — the writer has no
  destination for the third name. The mgf-fed half ships **with a tolerance
  guard** (an unknown scaffold name warns and skips instead of raising), which
  makes the order safe both ways from 0.25.0 on; the guard is the fix for the
  lockstep's failure *mode*, and it is why this ordering note is the last time it
  will need to be a rule rather than a preference. Consumers inherit the test on
  their next `catch-up --apply` **after both releases**.

## [0.1.78] - 2026-08-06

Patch release that DELIVERS the app tier. `MGF_LIBRARIES.json` is shipped wheel data, so
the `kind` key merged in #302 reaches **no consumer** until this publishes — `mgf-fed
drift-check` resolves the roster from the installed `mgf.standard` package, not from a
checkout, and every consumer would keep grading TelePlasma as a library. REL-13's
"update on every release" duty, landing BEFORE the publish rather than after.

Corpus **v3.9.0 unchanged** — 306 MUSTs / 25 families; the one `docs/standards/` touch is a
new **§10.4 propagation-matrix row**, which adds no rule (CLARIFY per [`LOCK.md`](LOCK.md)
§2 — corpus PATCH, `rules.json` byte-unchanged). The registry grows an **optional** key and
`templates/policy.toml` gains **one** exempt entry.

**Requires `mgf-fed` >= 0.24.0 to grade correctly.** An older `mgf-fed` selects the
`[exempt].woodpecker` step-name fallback on **language alone** and would hold the new
app-tier entry to the library step-list — 12 findings where the un-exempt member had 1
(mgf-fed **PAPER-151**). This is a merge-ordering constraint, not a runtime one.

### Added
- **The registry carries a member's TIER: `kind` (`"library"` default, `"app"`).** Language
  answers *what is it written in*; tier answers *what is it FOR*. A **library** publishes a
  package the fleet installs; an **app** is a consumer product that publishes nothing to
  devpi, builds no wheel and cuts no tag to verify. `mgf-fed drift-check` now selects the
  `[exempt].woodpecker` step-name fallback on the tier instead of the language, which is
  what lets an exempt Python **app** be graded against the universal governance subset
  (`commit-trailers` + `secret-scan`) rather than a library step-list containing
  `build` / `sbom` / `publish` / `verify-devpi` / `test-3.11` that it can never satisfy.
  Enacts TelePlasma court round **L9 §H3 option A** (founder-ratified 2026-08-06) on the
  mechanism mgf-fed shipped for **PAPER-151**.

  Two properties are deliberate. The **declaration is central** —
  `gen_mgf_libraries.py::_APP_TIER_REPOS`, repo → recorded reason, the `_NON_MEMBER_REPOS`
  shape — and is never read from the member's own manifest: tier decides which CI contract a
  member is graded against, so a repo must not be able to shrink its own required step-list
  by editing its own `pyproject.toml`. And the **key is emitted only when it is not the
  default** (the `slug` rule): the absent key IS the library answer, every consumer reads it
  as `entry.get("kind", "library")`, so a registry declaring it for nobody grades
  byte-identically to one that never heard of the key. 52 of 53 rows are untouched.

  Not to be confused with `fed-resources/source/project.toml`'s `[project].kind` — that is
  mgf-fedres's own free-text doc-projector vocabulary, and it grades the **opposite** way:
  `mgf-cloud`, `mgf-hrb`, `mgf-cloud-web`, `mgf-fed-web` and `mgf-test-web` all declare
  `kind = "app"` there while being published libraries the fleet installs, and every member
  that really is app-tier carries no `fed-resources/` at all. A test pins that the generator
  never reads it.

- **`TelePlasma` in `templates/policy.toml` `[exempt].woodpecker`** — the first app-tier
  entry, and the enactment the ruling directs. The canonical template structurally cannot
  render its pipeline: it needs `services:` for the Postgres/Redis/MinIO containers its
  integration tier runs against (`templates/woodpecker/` carries no `services:` anywhere), a
  three-way cross-step serialization chain so the DB-backed steps never share a database
  concurrently (`pytest-integration` → `alembic-roundtrip` → `backup-restore-drill`), and a
  `path:`-gated frontend tier. Held instead to the universal governance subset **plus the
  full `required_commands` gate floor** — which keys on language, so exemption from the
  library STEP-LIST is not exemption from the GATES. Both halves were verified green on the
  real tree before the entry was written. **Rejoin trigger**, recorded in the comment
  mirroring this repo's own self-exempt: it rejoins generation-currency when the renderer
  grows service-container + path-gated-tier knobs (mgf-fed **PAPER-150**).

  Measured with the merged mgf-fed (`e81246f`) against TelePlasma's real tree: **7 drift
  findings → 6** — the un-clearable `ci-generated` one is gone and **no `ci-step` finding
  replaces it**. The six that remain are pre-existing library-shape findings this change
  does not address (`PUBLIC_API.json`, `SCOPE.md`, the ruff pin, …). Two controls were run
  on the same tree: with `kind` forced back to `"library"` the exempt member reproduces
  PAPER-151's twelve missing steps exactly, and without the exempt entry it reproduces
  today's `ci-generated`. Those are the two outcomes this entry is written to sit between.

- **Pins for the new coupling** (DOC-18 §10.4 row + AG-14): `TestAppTierCoherence` in
  `tests/unit/test_libraries.py` checks the registry ⇄ policy pair in **both** directions
  (every app-tier member is exempt; every exempt Python member is app-tier or a genuine
  library), with a vacuity pin on the discovered set. `tests/unit/test_gen_mgf_libraries.py`
  pins that `kind` **survives regeneration** — the failure that matters, since `mgf-fed
  registry --check` shells this generator and byte-compares, so a key hand-edited into the
  artifact but not produced here reports the committed registry stale forever and is deleted
  by the next regeneration. TS-29 seeded self-tests included: stripping the key reds the
  currency gate; emptying `_APP_TIER_REPOS` reds the artifact pin.

### Changed
- `PUBLIC_API.md` + `mgf.standard.libraries()`'s docstring document `kind` (and, at last,
  `slug`) as the registry's two **optional** keys, with the `entry.get("kind", "library")`
  read they require. No `__all__` change, so `PUBLIC_API.json` is untouched.
- The `[exempt].woodpecker` header comment now states the selector correctly — language
  **and tier** — instead of language alone. PAPER-151 quoted the old wording as *"accurate,
  and exactly the problem."*

- **The registry is regenerated LAST**, after the version bump, so it records **0.1.78
  itself** — the discipline 0.1.77's release commit set down after 0.1.76 needed a second PR
  for having rendered before bumping. Five substantive facts move (REL-13):

  | Row | Was | Now | Why |
  |---|---|---|---|
  | `mgf-fed` version | 0.23.0 | **0.24.0** | released today — tag `v0.24.0`, live on devpi. The release this one waited on. |
  | `mgf-standard` version | 0.1.77 | **0.1.78** | this release |
  | TelePlasma → `mgf-fed` | `[cli]>=0.18.2,<0.19` | `[cli]>=0.23.0,<0.24` | TelePlasma walked the pin; merged on its `main`, registry had lagged |
  | TelePlasma → `mgf-standard` | `>=0.1,<0.2` | `>=0.1.77,<0.2` | same walk, same lag |
  | Consistency verdict | 5 findings | 5 findings, **two now true of 0.24.0** | TelePlasma's and vm-vmanager-app's `mgf-fed` pins now exclude the *current* mgf-fed |

  The consistency gate stays **RED**, as it was at 0.1.77 and as `main`'s committed registry
  already records. It is not this release's doing and not this release's to fix: the
  remaining findings are other repos' un-walked pins (`inthewords` → mgf-common,
  vm-vmanager-app / vm-vmanager-agent → mgf-common, and now the two → mgf-fed 0.24.0). What
  changed is that they are now **actionable and true** rather than artifacts of a stale
  render — the TelePlasma line stopped saying "walk 0.18.2 → 0.23.0" (already done) and
  started saying "walk 0.23.0 → 0.24.0" (genuinely outstanding).

- **The regen was taken from each member's default branch, not from whatever branch its
  checkout was parked on.** Nearly the whole estate is currently sitting on feature branches,
  and a naive render on this bench was wrong in *both* directions: it under-recorded
  `mgf-fed` (0.23.0 — its checkout is 9 commits behind the 0.24.0 release) and over-recorded
  `vm-vmanager-app` / `vm-vmanager-agent` (their `chore/walk-*-pin` branches are unmerged, so
  their walked pins exist on nobody's `main`). Publishing either into shipped wheel data is
  the 0.1.75 class this repo has already paid for once — *"it named a member no regeneration
  could produce, because it had been generated while an unmerged enrollment branch happened
  to be checked out."* Two consecutive renders are byte-identical.

## [0.1.77] - 2026-08-05

Patch release. 0.1.76 shipped a registry containing a **Sooth-family repo**,
because the court-round remediation that fixes it was committed and never merged.
`MGF_LIBRARIES.json` is shipped wheel data, so the defect reached every consumer
that resolves `mgf.standard.libraries()`.

### Fixed
- **Family membership is READ from `sooth-standard/SOOTH_LIBRARIES.json`, never
  guessed from a name.** The filter was `name.startswith("sooth")`, which admitted
  `first-light` — Ring 3 of the Sooth family, listed in that registry and carrying
  `SOOTH_STANDARD.md` — because its name does not begin with "sooth". A name
  pattern inside the fix for a name pattern, breaking the terminology guard in the
  same commit that widened the roster. Fail-closed: if a sibling looks
  Sooth-family and the registry is unreadable, the generator raises rather than
  guessing. **Registry 54 → 53.**
- **The published package name reaches the artifact as `slug`**, emitted only
  where it differs from the repo (`TelePlasma` → `teleplasma`, `vm-vmanager-app` →
  `vm-vmanager-cli`). The roster commit claimed it was "kept as its own field";
  the JSON emitter had dropped it, so the claim was false of the artifact every
  consumer reads.
- The registry is **reproducible** — two consecutive renders are byte-identical.
  0.1.75's was not: it named a member no regeneration could produce, because it
  had been generated while an unmerged enrollment branch happened to be checked
  out.

### Added
- Four tests over the roster, each pinning a defect a fresh-context court chair
  found (CRT-01). The roster change originally shipped with none.


## [0.1.76] - 2026-08-05

Patch release that DELIVERS the widened registry. `main` had drifted 14 commits
past 0.1.75 while still declaring it, and `MGF_LIBRARIES.json` is shipped wheel
data (`mgf/standard/_libraries.json`) — so devpi's 0.1.75 served a 44-member
registry while main's 0.1.75 held 53. Same version, different code: exactly the
class `verify_release_currency.py` was written for, caught by the audit's own
`release-currency` check. REL-14 — a drifted main is cleared by RELEASING.

### Changed
- **The registry roster is every repo, not every repo NAMED `mgf-*` (F-39).**
  `gen_mgf_libraries.py:discover()` globbed `mgf-*`, so the estate's declared
  answer to *"what repos exist"* was structurally incapable of holding a repo
  named anything else — ten were invisible to it. Registry: **44 → 53 members**.
- **Family membership is READ from `sooth-standard/SOOTH_LIBRARIES.json`**, never
  guessed from a name prefix. The prefix filter had admitted `first-light` (Ring 3
  of the Sooth family) into the MGF registry — a name pattern inside the fix for a
  name pattern.
- **Keyed by repo DIRECTORY, with the published package name kept as `slug`.**
  Keying by slug would have enrolled `vm-vmanager-app` as `vm-vmanager-cli`,
  matching no forge repo, so `mgf-secrets sync` would never have provisioned its
  deploy key — a fix that looks applied and silently does not work.
- **The `fetch-default-branch` template step carries its SC-23 guards** (P3-F2).

### Fixed
- `AUDIT_ACCEPTED.toml` reconciled: 13 dead waivers removed (an entry matching no
  finding FAILS the gate by design), 10 added under D-12's existing decision and
  date for repos the roster could not previously name.
- `FLEET.md` spells every consumer repo in full — the shorthand
  `vm-vmanager-app/-agent/-docs` was invisible to a substring-matching gate.


## [0.1.75] - 2026-08-02

Cut to clear a drifted `main` per **REL-14**: `main` declared `0.1.74` with **no
`v0.1.74` tag in existence** and devpi serving `0.1.69`, so five declared
versions had never been released and the AG-03 fix below could reach no consumer
at all. REL-14 is explicit that this is cleared by **releasing**, never by
re-tagging. Found by `mgf-fed audit --check release-currency`, not by memory.

### Fixed
- **AG-03: the commit-trailer gate was green over an empty set in 39 of 40
  repos — it had never verified a single commit.** Every run printed
  `AG-03: all 0 commit(s) on this branch carry both trailers.` and exited 0.
  Three compounding causes: the step's `git fetch origin … || true` **always**
  failed (the clone plugin's SSH deploy key does not survive into the step
  container and `python:slim` has no ssh client), `|| true` hid it; with no
  `origin/<target>` the checker fell back to the **bare branch name**, which on
  a `pull_request` is the PR head checked out under the default branch's name;
  so `main..HEAD` was empty by construction and an empty range read as success.

  The fix promotes `figrecovery`'s hardened checker and adds **base resolution
  by provenance** — in CI only a *fetched* `origin/*` ref counts, because a local
  name is not evidence of what is on the default branch. Promoting the hardened
  checker alone would have fixed nothing, which a negative control caught: with a
  counterfeit local `main` present it resolved, the range was empty, and the gate
  still passed over nothing. Live proof on PR #289's own pipeline —
  **`AG-03: all 1 commit(s)`** where every previous run said `all 0`.

  All three canonical copies updated byte-identically (`scripts/`, `templates/`,
  the cookiecutter), because the two delivery paths differ: `mgf-fed scaffold`
  reads `templates/` **from disk**, while `mgf-common catch-up` resolves
  `scripts/check_commit_trailers.py` **from the installed wheel**. This release
  serves the second path; the first needs a fleet re-scaffold, which neither
  substitutes for the other. CLARIFY per [`LOCK.md`](LOCK.md) §2 — gate
  strengthening, no MUST changed.

- **Session-hook state is ignored fleet-wide (CLARIFY-class, SHP-08/SHP-10).**
  The canonical `.gitignore` in
  [`docs/recipes/standardized-git-config.md`](docs/recipes/standardized-git-config.md)
  §1 and the cookiecutter's `.gitignore` (`templates/**`, template currency →
  CLARIFY per [`LOCK.md`](LOCK.md) §2) both gain `.claude/state/` and
  `.claude/mgf-hooks-disabled`. No MUST changed.

  These are **not** conditional on having run `hooks install`, which is the
  assumption SHP-08's conformance note rests on: the kit installs at **user**
  level, so `.claude/state/agent-events.jsonl` lands in whatever repo a session
  is launched from. Found untracked and unignored in `mgf-secrets` and this
  repo — where it had already blocked a `release-remote` clean-tree pre-req.
  This repo's own `.gitignore` is fixed in the same change.

  The distribution half is mgf-fed #127: `catch-up`'s ignore-block check tested
  only `my_stuff/`, so its fix was unreachable on every repo already carrying
  that line and the block could not in fact gain new lines.

### Changed
- **This repo adopts the root `CLAUDE.md` pointer it defines for everyone else**
  (`abb3b3c`), closing the standards repo's own gap in ONE-ESTATE Phase 2.5.

## [0.1.74] - 2026-07-31

Corpus **v3.8.0 → v3.9.0** (EXTEND per [`LOCK.md`](LOCK.md) §2 — one rule added to an
**existing** family, no existing MUST weakened): **305 → 306 MUSTs, 25 families
unchanged.** Wave **S5** of the Sooth→mgf adoption initiative
([`docs/inprogress/SOOTH_ADOPTION.md`](docs/inprogress/SOOTH_ADOPTION.md)) — **the final
wave**, and the one that closes the initiative. Merged **fifth**, so it carries that
tracker's §2.1 merge-order reconciliation again.

**The second intra-family EXTEND, and the first to be caught by the checker S4 built.**
`FEDERATION.md` §4's `TS-01..TS-28` range cell went stale the moment TS-29 was anchored;
`check_headline_coherence.py`'s per-family range-cell check — added by wave S4 on its
court's S4-F3 ruling, thirty-five minutes after landing, same night — caught by the gate the previous wave built — reported it
by name before a human noticed. §2.1.1 predicted this mirror would be the trap for the
next intra-family EXTEND. It was, and the mechanism held. *That is what a wave inheriting
another wave's gate looks like.*

### Added
- **[`docs/standards/TESTING.md`](docs/standards/TESTING.md) — `TS-29`.** *Every
  mechanical gate MUST ship a seeded self-test proving it can fail — a gate that
  cannot fail is decoration.*
  - **The claim a gate makes is unfalsifiable from a green run.** "If this defect
    appears, I will say so" produces the same green light whether the gate is watching
    or has stopped looking. So the negative fixture MUST **stand in the suite**, next to
    the gate. Two things are explicitly *not* a discharge: **(a)** a one-time seeded
    red/green recorded in a fold report — that discharges [CRT-08](docs/standards/REVIEW.md#CRT-08)
    for *that fold* and nothing after it, because a proof that cannot be re-run stops
    being true at the next refactor; **(b)** a green run over the live tree — that proves
    the *tree* is clean, never that the *gate looks*.
  - **The vacuity clause.** A gate iterating a **discovered** set (a glob, a generated
    manifest, a walked object tree) MUST additionally pin that set non-empty. An empty
    input makes every assertion above it trivially true, and that is the quiet death
    every sweep in this federation is one refactor away from.
  - **The blindness control** (SHOULD): where a gate was built to close a known blind
    spot, run the same sabotaged tree against the check that stayed green — the gap
    demonstrated, not asserted.
  - **Retroactivity is staged, deliberately.** The rule binds unconditionally when a gate
    is *added or changed*; a gate that *predates* it is conformant while its repo's
    close-out sweep is named and pending. Without that clause, enacting TS-29 would
    declare 44 repos non-conformant on merge day for gates that already work. §21 is the
    family's new *Adoption posture* section and states it.
  - **Five instances, traced at their pins** (§20.2), per the S1-F2 discipline:
    `mgf-fed`'s vocabulary gate with its explicit *"guard the guard"* vacuity pin and its
    self-expiring `_ENACTING` table (`origin/main` `6404303`); S4's range-cell checker
    with the blindness control (`daa45ae`); `hrb-app`'s PR-03 evasion suite and its
    inverse — *"a check that fails on legal code gets weakened by the next contributor
    in a hurry"* — and the G9 colour pin whose checker was extracted **precisely so it
    could be fed seeded strings** (`debec0c`, which also cites `PRIV-07` by id in three
    places). `hrb-app`'s `RELEASE_MASTERPLAN.md` **W4.9** is the wave-level precedent:
    a close-out step that audited every checker-style gate in the repo.
  - **And the instructive failure is this corpus's own.** Wave S2's doc↔schema gate
    (`tests/unit/test_findings_schema.py`) *was* sabotage-proved three ways — and the
    proof lived in commit `2cc0622`'s **body and nowhere else**, with all seven tests
    positive assertions over the live tree. Failure mode (a), produced by the initiative
    that wrote the rule against it. Closed below.
- **[`docs/recipes/adoption-posture.md`](docs/recipes/adoption-posture.md) + `scripts/check_adoption_posture.py`** —
  the *"Adoption posture (why nothing here fails today)"* section convention, landed as
  an **authoring recipe with a mechanical gate** rather than a DOC MUST. The reasoning is
  §5 of the recipe and is recorded rather than assumed: the bindable population is
  **one repo** (only `mgf-standard` authors standards families), so a DOC MUST would make
  43 members carry an `N/A` row under CFM-03's completeness gate; a section heading is on
  the *layout* side of the [CRT-12](docs/standards/REVIEW.md#CRT-12) / recipes-README line
  ratified as DB-S1-2 one day earlier; and the source corpus does not rule it either
  (verified at `sooth-standard` `af95611` — the phrase is a heading in three docs and in
  **no rule anywhere**). The citability gap that justified `SEAT`/`CRT`/`SHP` is closed
  here by the gate instead: **a gate is a citation.** Promotion trigger written down — the
  day a *second* repo authors a standards family.
  - **Derived, never restated (DP-14).** The gate reads the `⏳` rows out of this repo's
    DOC-15 ledger (which already owns "what is not in force here", CFM-03), maps each to
    its owning doc through the generated `rules.json`, and requires the section there. So
    the requirement **self-expires per family** the day a family's last `⏳` flips to
    `✅` — the shape `mgf-fed`'s `_PENDING_CORPUS` uses for staged doc aliases. It rides
    `gen_rules_index.py --check`, the channel `check_headline_coherence.py` and
    `check_testing_doc.py` already use (WF-13: the pipeline is generated, so a corpus
    gate reaches CI through pytest, never a hand-edited step). **No CI delta changes.**
  - **It earned its keep on its first run**, the way the S2 gate did: `REVIEW.md` carried
    a staged rule (`CRT-05`, `⏳` in the ledger) and explained nothing. `REVIEW.md` **§9**
    is the section it demanded; the old §9/§10 shift to §10/§11.
- **`docs/standards/DOCUMENTATION.md` §10.4** — two new change-propagation matrix rows,
  as DOC-18 requires of any change that introduces a coupling: *a mechanical gate ↔ its
  seeded self-test* (TS-29) and *a staged obligation ↔ its Adoption posture section*.

### Fixed
- **Three gates in this repo now prove they bite — the wave dogfoods its own rule.**
  - `tests/unit/test_findings_schema.py`: the decision extracted to
    `check(review, schema) -> list[str]`, and **wave S2's three fold-time sabotages now
    stand as fixtures** (drop a required field / weaken the `CONFIRMED` coupling / delete
    a CRT anchor), plus the defect the gate found on its first run in S2 (`evidence` in
    the §3 table, absent from the binding row) and a vacuity pin for a renamed §3.
  - `scripts/gen_rules_index.py`: the index-drift half extracted to
    `index_errors(std, allowlist)` — the **oldest gate in this repo had two tests and
    both were live-tree green runs.** All four PAPER-100 drift classes (unindexed rule,
    phantom index row, stale allowlist entry, rule in both) are now planted on a
    synthetic `docs/standards/` and caught by name, with a vacuity pin for an anchor
    format change that would make every set-comparison trivially true.
  - `scripts/check_adoption_posture.py` ships its self-test by construction (13 tests).
- **CRT-08 seeded-sabotage proofs, all runs at the pin.** *(1)* Delete **TS-29's own
  Index-of-MUSTs row** — `gen_rules_index.py --check` → **RED**, exit 1, *"Rules-box
  rule(s) neither in the Index of MUSTs nor in SHOULD_ALLOWLIST … ['TS-29']"*; restore →
  **GREEN**, exit 0. The rule that requires gates to prove they can fail has its own
  index entry proved by the gate that indexes it, which is a recursion worth enjoying.
  *(2)* Revert the `TS` range cell to `TS-01..TS-28` → **RED**, *"§4 'TS' range cell tops
  out at TS-28 but rules.json anchors up to TS-29"*; restore → **GREEN**. *(3)* Strip
  `REVIEW.md` §9 → the new posture gate **RED** naming the doc and `CRT-05`; restore →
  **GREEN**. Plus the **blindness control**: on that same sabotaged tree the three
  pre-S5 gates (`check_headline_coherence`, `check_testing_doc`, the index-drift half)
  all return **GREEN** — only the new check fires.
- Suite **216 → 240**.

### Changed
- **Fifth-wave §2.1 reconciliation, one commit:** all four count mirrors to **306 MUSTs /
  25 families** (regenerated `rules.json`, the README *Index of MUSTs* footer, `SCOPE.md`'s
  literal, `FEDERATION.md` §4's `TS-01..TS-29` range cell), the `test_rules_index` canary
  (305 → 306) with its history sentence extended, and the package version (0.1.73 →
  0.1.74, four files). **No step-4 clause retired** — nothing S5 lands falsifies a claim
  an earlier wave wrote; §2.2's deferred `SEAT-02`/`SEAT-08` edit was tested and is
  **still not due**, because its trigger is *a first repo running `hooks install`*, which
  has not happened.
- `docs/inprogress/MGF_STANDARDS_CONFORMANCE.md`: the TS-29 row, headline re-baselined to
  **152 ✅ · 140 N/A · 13 ⏳ · 1 🚫**, 306/306. The row is **`⏳`, not `✅`**, and
  enumerates the remainder: nine of sixteen gates meeting §20.1's *discovered input* test
  carry a standing negative fixture, seven do not (`fleet_conformance_audit.py --check`,
  `audit_pr_conformance.py`, `fleet_ownership_audit.py`, and the sweeps
  `test_woodpecker_guards.py`, `test_public_api_doc.py`, `test_no_control_bytes.py`,
  `test_acknowledgements_seed.py`).
  Shipping a rule with its own conformance honestly incomplete is a better first day than
  a green claim nobody checked.
- `docs/inprogress/SOOTH_ADOPTION.md`: **sealed.** All five waves ✅ with SHAs, the §2.1
  per-wave record closed, and a new **§6 CLOSING** — what the initiative shipped, what it
  did not, and the four boxes that remain founder-gated (DB-S1-1, DB-S1-3, DB-S3-1, and
  the two `mgf-fed` supervisor edits S4 opened).

---

## [0.1.73] - 2026-07-31

Corpus **v3.7.0 → v3.8.0** (EXTEND per [`LOCK.md`](LOCK.md) §2 — two rules added to an
**existing** family, no existing MUST weakened): **303 → 305 MUSTs, 25 families
unchanged.** Wave **S4** of the Sooth→mgf adoption initiative
([`docs/inprogress/SOOTH_ADOPTION.md`](docs/inprogress/SOOTH_ADOPTION.md)) — resumability
and the one validation entrypoint. Merged **fourth**, so it carries that tracker's §2.1
merge-order reconciliation again.

**The first wave of this initiative that GROWS a family instead of founding one**, and the
difference is not cosmetic. `check_headline_coherence.py` gated `FEDERATION.md` §4's family
**row count** against `rules.json`'s family count — an intra-family EXTEND moves neither, so
that gate stayed green while the row's `AG-01..AG-NN` **range cell** silently rotted. **This
release closes that mechanically** (see *Added → the range-cell check*), updates the cell
(`AG-01..AG-20` → `AG-01..AG-23`), and *also* writes the fact into `AGENTS.md`'s Propagation
header — belt-and-braces, with the gate as the defence and the prose as the reminder.

### Added
- **[`docs/standards/AGENTS.md`](docs/standards/AGENTS.md) — `AG-21`, `AG-22` (MUSTs) and
  `AG-23` (a SHOULD).** The AG family is otherwise mgf-native; these three are the port.
  - **AG-21 — one canonical validation entrypoint, and a declared delta list.** Every repo
    names one entrypoint whose steps mirror CI, and its passing is what *"validated"* means;
    anything less is reported as **partial** and never satisfies a completion gate.
    **The entrypoint half was already law-adjacent here** — WF-02's four gates, WF-13's
    generated pipeline, `mgf-fed local-ci` (the real pipeline) and `mgf-fed gates` (the fast
    static subset, never canonical alone), CRT-04's unpiped-gate clause. **The declared
    delta list is the novelty**: every step CI runs that the entrypoint does not, and every
    step the entrypoint runs that CI does not, is a reasoned row — and **the undeclared
    divergence is the defect**, because it is what lets "it passed locally" and a red
    pipeline both be honest. Home: `CONTRIBUTING.md` under a fixed `## CI delta` heading,
    **not** the `.woodpecker.yml` header — under WF-13 that file is generated and a
    hand-written header comment is discarded by the next `mgf-fed scaffold`, so a delta list
    living there would be deleted by routine regeneration and its absence would read as
    "no deltas."
  - **AG-22 — durable journals, resumable from disk by a different model.** Two artifacts,
    written as the work proceeds: a **committed worktree** (SEAT-05's cadence, cited and not
    restated per DP-14) **plus** a **written contract in the tree**. Neither alone suffices,
    and the federation's own record is the reason. Gate-opening work additionally records
    its **resume points**. Explicitly not memory (AG-08 bars session logs; AG-19's store is
    machine-local) and not the task list (AG-07's is in-conversation state that dies with
    the session).
  - **AG-23 — the cross-model resume drill, as a SHOULD with a written promotion trigger.**
    Allowlisted in `SHOULD_ALLOWLIST` rather than indexed — the **SEAT-09 precedent**.
    Rationale, stated in the rule rather than implied: mgf has **no drill mechanism** — no
    cadence owner, no scheduler, no artifact a session could point at — and a MUST no
    session can discharge is the exitless obligation **SHP-06** forbids of the hook layer,
    which moving to the conduct layer does not repair. Promotion is a normal EXTEND the day
    a drill gets a home and a recorded result.
- **`AGENTS.md` §12 and §13** — the prose for both rules, including §12.2's honest floor
  (see below), §12.3's why-not-the-pipeline-header argument, §12.4's worked shape, and §13's
  two worked instances.
- **`AGENTS.md` § Provenance (AG-21 · AG-22 · AG-23)** — the family had none, because
  AG-01..AG-20 are mgf-native. Adapted with attribution from the Sooth family's
  `AGENT_GAPS.md` **GAP-01** and **GAP-07**; a copy, never a dependency (their XF-03). Four
  divergences named rather than left silent: the ids deliberately **do not map** (the
  `CRT-*` renumber precedent, not the `SHP-*` one — nothing in this federation cites `GAP-*`
  numerically across a repo boundary, so nothing is falsified); GAP-07 is **split** into a
  MUST property plus a SHOULD cadence; the delta list gains a **named home**; and the
  commit-cadence citation is re-pointed from their `SIG-05`/`SIG-07` to **SEAT-05**. The
  source's honest floor is carried verbatim in substance: the taxonomy closes consistency
  and process gaps between models, **not raw capability gaps**.
- **`CONTRIBUTING.md` § `CI delta`** — this repo's own instance, dogfooded in the same
  commit that defines the rule. 13 reasoned rows plus the entrypoint's own two deltas
  against remote CI.
- **`DOCUMENTATION.md` §10.4** — a Change-Propagation Matrix row for the new coupling
  (a CI step ↔ the `## CI delta` list), which **AG-14** requires of any change that
  introduces one.
- **`scripts/check_headline_coherence.py` — the §4 range-cell check (a new B1 sub-gate).**
  Every `FEDERATION.md` §4 row's Rules cell is compared against `rules.json`'s **per-family
  max**, closing the intra-family-EXTEND blind spot this very wave walked into. Compared by
  **max token**, never by literal range text, so all three shapes in the table work:
  `XX-01..XX-NN`, a bare single id (`FB-05`), and a compound cell with deliberately-vacant
  numbers (`SHP-01, SHP-05..SHP-13`). Rides the existing `gen_rules_index.py --check`
  channel, so CI gains it with no pipeline edit (WF-13 is untouched). Eight negative
  fixtures in `tests/unit/test_check_headline_coherence.py` — including the regression proof
  that on a stale tree **exactly one** error fires while the row-count, footer, and SCOPE
  checks all stay green, which is the blindness itself under test — plus a live-repo pin
  that the AG cell tops out at the anchored max. **CRT-08 seeded-sabotage proof, both runs
  recorded in the fold commit:** reverting the AG cell to `AG-01..AG-20` reds the gate with
  the exact diagnostic; restoring it greens; and the *pre-S4* checker returns GREEN on the
  same sabotaged tree. Suite 208 → **216**. *(Ruled in by the S4 court, S4-F3 — the wave's
  own words were the argument: a streak is not a mechanism, and neither is prose.)*

### Fixed
- **A live CI-vs-local drift in `CONTRIBUTING.md`, found by writing AG-21's own delta list.**
  The TL;DR said *"Four gates must be green"* over a list of **five** commands while §Dev
  setup said *"the five gates"* — the file disagreeing with itself about how many gates
  exist. Ten further CI steps (`commit-trailers`, coverage `--fail-under=80`, `vuln-scan`,
  `secret-scan`, `app-doctor --standards`, `conformance-tracker`, `cross-layer-audit`,
  `fedres-check`, `build`, `sbom`) went unmentioned by the local list. None of it was a bug
  in either surface; what was missing was the sentence saying so. The rule found its first
  defect in the repo that defines it.
- **The `.woodpecker.yml` ↔ `CONTRIBUTING.md` gate-count disagreement is now one-directional
  by construction** — the delta table enumerates every pipeline step, so a step added without
  a row is visible at review.

### Corrected in court (S4-F1, S4-F2 — folded before merge)
- **A manufactured delta, retracted.** The first draft of the delta list claimed the local
  `mypy --strict src/` was *stricter* than CI's `mypy src`. It is not: `[tool.mypy]
  strict = true` in `pyproject.toml` makes the two **equivalent** — flag versus config.
  Proven by probe rather than argued: one seeded untyped def reds both invocations with the
  identical `[no-untyped-def]` diagnostic at the same `file:line` and the same exit code;
  restored, both exit `0`. The row now says *equivalent, not a delta*, and **`AGENTS.md`
  §12.2 carries the lesson in the rule's own text** — *a delta list written from surfaces
  rather than from behaviour manufactures deltas as readily as it hides them.* A false row
  costs more than a missing one: nothing ever contradicts it.
- **The entrypoint's largest delta was missing, and it is the entrypoint's own.**
  `DEVPI_URL` is a Woodpecker **server-level** variable and `mgf-fed local-ci` shells
  `woodpecker-cli exec` with no `--env`, so it reaches no container even when exported —
  `app-doctor`, `cross-layer-audit`, and `fedres-check` therefore **red deterministically on
  every workstation**, and **a full-green local `exec` is not achievable on this repo
  today**. Declared as delta 3 with a by-hand workaround; the three table rows corrected from
  ✅ to ❌; `run-ci.md` §2 and AG-21's own *"its own deltas are…"* clause re-scoped to say a
  mirror that runs the real pipeline **still is not CI and still owes a delta list**. The fix
  (`local-ci --env DEVPI_URL`) is **cross-repo and supervisor-owned per AG-13** — recorded in
  the tracker, not applied from here.

### Changed
- **Count mirrors reconciled to 305 MUSTs / 25 families** in one commit — regenerated
  `docs/standards/rules.json` (315 anchored rules: 305 MUST / 10 SHOULD), the README
  *Index of MUSTs* footer's maintenance-history sentence, `SCOPE.md`'s literal, and
  `FEDERATION.md` §4 — where, for an intra-family EXTEND, what moves is the **`AG` row's
  range cell**, not the row count. `scripts/gen_rules_index.py --check` green at the new
  counts.
- `docs/standards/README.md` — two *Index of MUSTs* rows (AG-21, AG-22) + the dated
  maintenance-history entry. AG-23 gets no Index row **by design**.
- `scripts/gen_rules_index.py` — `SHOULD_ALLOWLIST` gains `AG-23` (10 allowlisted SHOULDs).
- `tests/unit/test_rules_index.py` — count canary 303 → **305**, its history sentence
  extended with this wave (a deliberate same-commit snapshot, not a change-detector).
- `docs/standards/AGENTS.md` Propagation header — now names `rules.json`, `SCOPE.md`, and
  **`FEDERATION.md` §4's range cell**, with the note that the coherence gate does not cover
  the last one when a family grows.
- `docs/inprogress/MGF_STANDARDS_CONFORMANCE.md` (DOC-15) — rows for AG-21 and AG-22, both
  **✅** rather than ⏳: unlike the SHP block, these rules bind things this repo can do with
  no unmerged mechanism, and the amendment ships its own conformance. Headline re-baselined
  to **152 ✅ · 140 N/A · 12 ⏳ · 1 🚫**, 305/305 rows. The AG per-family summary row grows by
  a dated appended clause, following the SC-19..23 pattern (history is not rewritten).
- `docs/inprogress/SOOTH_ADOPTION.md` — the S4 wave record, §2.1's per-wave reconciliation
  row, the new **§2.1.1** (which mirrors move when a family grows vs is added), §1's
  resumability baseline retired, the §5 ledger entry plus the S4 court-return entry, and the
  three cross-repo items owed to the supervisor. **S3a flipped ▶ → ✅**: `mgf-fed` PR #120
  (`6404303`) merged 2026-07-31 while this wave sat in court — verified with
  `git merge-base --is-ancestor`, not inherited — so the ruled S3b-then-S3a order is
  discharged and that clause is closed.
- `docs/recipes/run-ci.md` §2 — the `$DEVPI_URL`-not-forwarded caveat, with the
  expected-red signature spelled out so a local red on those three steps is not
  re-diagnosed as a regression.
- `LESSON_LEARNED.md` (DOC-19) — two entries: the row-count-vs-cells gate lesson, and
  *"Two different command strings are not a delta; two different behaviours are"* (a false
  delta row costs more than a missing one — nothing ever contradicts it).

### Honest floor
**One thing here is mechanically checked, and it is not the new rules.** The §4 range-cell
gate above is real and running. But `mgf-fed drift-check` pins only the *pipeline* to its
generated source, and **no checker anywhere in the federation reads a `## CI delta`
section** — the `app-doctor` check that would is staged, cross-repo, supervisor-applied per
**AG-13**. AG-22 is review-enforced by construction — CI sees the tree, never the session
that produced it — and AG-23 has no mechanism *by design*, which is exactly why it is a
SHOULD. So AG-21 and AG-22 ship as obligations with review as their only enforcement,
exactly as AG-04 / AG-05 / AG-15 / AG-20 do.

**Three cross-repo items are owed to the `mgf-common` supervisor**, named in the tracker
rather than applied here (AG-13): **(1)** `mgf-fed local-ci` must forward `$DEVPI_URL` —
without it no repo carrying the guarded steps can reach a full-green local `exec`;
**(2)** the `app-doctor` delta-list check, AG-21's staged mechanism; **(3)** the
`AGENTS_BRIEFING` constant — **waived for this wave with rationale** (S4-F5), since it is a
*curated* brief the supervisor owns and AG-21/AG-22 falsify nothing it currently says.

Fleet-wide §Z conformance-ledger re-baseline (303 → 305) is a **follow-up wave**, tracked
separately.

---

## [0.1.72] - 2026-07-30

Corpus **v3.6.0 → v3.7.0** (EXTEND per [`LOCK.md`](LOCK.md) §2 — a new family for a
new domain, no existing MUST weakened): **293 → 303 MUSTs, 24 → 25 families.** Wave
**S3** of the Sooth→mgf adoption initiative
([`docs/inprogress/SOOTH_ADOPTION.md`](docs/inprogress/SOOTH_ADOPTION.md)) — the
**obligation half**. Merged **third** of the initiative's waves, so it carries that
tracker's §2.1 merge-order reconciliation again: all four count mirrors, the canary,
and the package version.

**This amendment ships no mechanism.** The kit it governs — `mgf-fed hooks` — lives on
`mgf-fed`'s `feat/session-hooks` branch (wave **S3a**), is **unmerged and in court** at
the time of writing, and ships its enforcing half switched off behind two independent
keys. Every rule below is in force as an obligation on enactment and **running
nowhere**, which is SHP-11 working as designed. Saying so plainly is the point.

### Added
- **[`docs/standards/SESSION_HOOKS.md`](docs/standards/SESSION_HOOKS.md) — the
  session-hook family, `SHP-01` + `SHP-05..SHP-13`.** Ten MUSTs binding the harness
  layer, nine of them by what a hook may **not** do:
  - **SHP-01** — a session hook re-teaches the standing obligations at every session
    start, mechanically, from one source, under a **stated line budget**, printing an
    instruction and never a body. It **mechanises the re-teach that
    [SEAT-02](docs/standards/SEATS.md#SEAT-02) requires, through the channel class
    [SEAT-08](docs/standards/SEATS.md#SEAT-08)'s dispatch block already uses** — it does
    not replace that block and does not become SEAT-02's sole mechanism. The one rule
    here that grants rather than restricts.
  - **SHP-05** — *attribution before blame.* A structured file-tool path is definitive;
    a shell command is quoted evidence, **never proof**; the owning repo is derived by
    walking to a git root, never guessed from a glob. Blaming an innocent concurrent
    session and ordering it to document work it never did is how a discipline gets
    ripped out.
  - **SHP-06** — **nothing blocks without a one-command discharge named in its own
    refusal.** The gate blocks *silence*, never *judgment*; a finding whose exit this
    corpus has not ruled stays advisory in **every** mode; and a block self-releases on
    retry, because a gate that can trap a session is a gate that gets ripped out.
  - **SHP-07** — the protocol is audible where nobody is watching: a stop-time hook's
    output is discarded when it does not block, so verdicts are **persisted and replayed
    at the next session start — once, not forever**, with a resolved finding leaving
    nothing stale behind.
  - **SHP-08** — the kill-switch at three scopes (session / fleet / repo), honoured
    **before any other logic**, announced when engaged, never raising, and with its
    sentinels **git-ignored**: a sweeping `git add` that commits a kill-switch silences
    every clone permanently and invisibly.
  - **SHP-09** — one implementation, thin shims; the installer **merges, never
    clobbers**, and **refuses an unparseable config writing nothing**.
  - **SHP-10** — one structured record per invocation over a **closed** vocabulary (the
    refusal path is as much a feature as the append path); a torn write never breaks the
    reader; a persistence failure never changes behaviour; and **no CI job may read,
    validate, or fail on session-hook state** — the session layer is not the truth layer.
  - **SHP-11** — enablement lands in `observe` and reaches `enforce` only by a founder
    act, staged **structurally** behind two independent keys, with *no step may create a
    state that is only safe if a later step also happens*. The obligation is on the
    **blocking outcome**: no unrecognised value for either key may yield a state that can
    block, and an unrecognised **mode** reads as `observe`.
  - **SHP-12** — determinism and honest failure; the decision is a **pure function**
    testable without a harness, because a verdict observable only by running a hook
    cannot be regression-pinned. Refusals on an **operator-invoked** surface exit
    non-zero.
  - **SHP-13** (**mgf-native**) — **fail-open totality**, on the **harness-invoked** path.
    A session hook may not stop a session by malfunction: every path returns success,
    including the ones that exist only because something broke, and the single sanctioned
    non-zero exit is a ruled, dischargeable finding under an armed, enforcing gate.
    SHP-12 and SHP-13 give opposite answers about exit codes and are not in tension —
    **the caller decides which applies**, and a new surface must be classified before its
    exit code means anything.

  The governing principle is carried verbatim from the port: **CI enforces truth.
  Documents communicate intent. Hooks guarantee the communication happens.**

### Not adopted — recorded, not omitted
- **SHP-03** (a session that changed a sibling must record a handoff there) and
  **SHP-04** (handoff well-formedness, sidecar schema, evidence floor) are **not
  adopted**: mgf has ruled **no cross-repo handoff channel**, so the obligation would be
  unmeetable and any gate on it exitless the moment it fired — the exact failure SHP-06
  forbids. **SHP-02** (derive the sibling set from a registry, never a parent glob) is
  **dissolved by the port** rather than declined: owning-repo resolution makes the glob
  failure structurally impossible, and the residue lives in SHP-05's
  derived-not-guessed clause.
- **The numbers 02 / 03 / 04 are left vacant and are not free for reuse.** The
  reactivation trigger is one ruling — a named cross-repo handoff artifact with a
  schema, a receiver-side home, and an acknowledgement record — which would restore
  SHP-03 and SHP-04 at their own numbers *and* flip the kit's `cross_repo_write` finding
  from advisory to blocking. Recorded in `SESSION_HOOKS.md` §3.
- **Rule IDs map 1:1 to the source here, unlike `CRT-*`** — deliberately, for a
  mechanical reason: the S3a implementation was written before this family existed and
  already cites the source numbers (`_gate.py` emits a finding whose `rule` field is the
  literal string `SHP-05`; SHP-06/07/08/09/11 appear in its docstrings). Renumbering
  would have falsified all of them across a repo boundary this corpus may not edit
  ([AG-13](docs/standards/AGENTS.md#AG-13)).

### Changed
- **Count mirrors reconciled to 303 MUSTs / 25 families** in one commit — regenerated
  [`docs/standards/rules.json`](docs/standards/rules.json), the README *Index of MUSTs*
  footer sentence, [`SCOPE.md`](SCOPE.md)'s literal, and
  [`FEDERATION.md`](FEDERATION.md) §4's family-table row (`SHP — Session hooks`).
  `scripts/gen_rules_index.py --check` (which folds in `check_headline_coherence.py`) is
  the gate that proves all four agree.
- `tests/unit/test_rules_index.py` — count canary 293 → **303**, its history sentence
  extended with the wave and with the reason the family is ten rules and not twelve.
- [`docs/standards/README.md`](docs/standards/README.md) — doc-tree entry, a
  *"Building or changing a session hook"* navigation row, the maintenance-history
  sentence, and ten *Index of MUSTs* rows.
- [`docs/inprogress/MGF_STANDARDS_CONFORMANCE.md`](docs/inprogress/MGF_STANDARDS_CONFORMANCE.md)
  — **DOC-15 self-accounting**: one row per new SHP MUST (2 ✅ / 8 ⏳), headline
  re-baselined to **150 ✅ · 140 N/A · 12 ⏳ · 1 🚫** across 25 families, 303/303 rows.
  The eight `⏳` are honest: this repo has no session hook wired and the kit is unmerged.
- [`docs/inprogress/SOOTH_ADOPTION.md`](docs/inprogress/SOOTH_ADOPTION.md) — S3 split
  into S3a (the `mgf-fed` mechanism) and S3b (this obligation layer), §2.1 extended to
  the third wave, and a ledger entry.

### Provenance
- Adapted with attribution from the Sooth family's **SHP family**
  (`sooth-standard/docs/standards/HANDOFF.md`, SHP-01..12; authority `shp/SHP.md` v0.1,
  founder-decided 2026-07-09, plus its attribution round 2026-07-13 and operability
  round 2026-07-15). **A copy, not a dependency** (the Sooth family's XF-03): no import
  edge, no package dependency, no cross-family resolution path. mgf's text is
  authoritative here.
- The mgf mechanism these rules govern is the **S3a port** — `mgf-fed`'s
  `mgf.fed.sessionhooks` package, its `mgf-fed hooks` CLI, and
  `docs/howto/session-hooks.md`. Three of that port's divergences from the source shaped
  rules above: one configuration line instead of four copied shell scripts (SHP-09),
  owning-repo resolution instead of a registry glob (which dissolved SHP-02),
  `session_start` added / `preflight` dropped (SHP-10's closed vocabulary, read from
  both sides), and — the fourth, which changes an *obligation* rather than a mechanism —
  the **command tier demoted from fail-closed to evidence-only**: the source refuses a
  session that a command merely implicates, but with no handoff gate to discharge, a
  fail-closed command tier would block on a finding with no exit (SHP-06). SHP-05 says
  *quoted evidence, never proof* where the source says *refused*; the tier reactivates
  with SHP-03/04 on the same single ruling. On any conflict about **mechanism**, that
  howto wins; on any conflict about **obligation**, these rules do.
- **Baseline scoping.** The "no hooks in mgf repos" baseline is scoped to the **44-member
  federation registry**, which is what this family binds. The **`mgf` program repo is not
  a registry member** and does carry a `SessionStart` hook today (it injects its own
  `.claude/memory/` digest); it is recorded in `SESSION_HOOKS.md` §2 as the adjacent
  instance, because it shares SHP-01's channel and therefore its line budget — the
  ceiling is measured against the session-start window, not one writer's share of it.
- **Staged links are marked as staged.** The Propagation header's `mgf-fed` howto URL and
  the README navigation row both say so: the file lives on `feat/session-hooks` and the
  link resolves **on the S3a merge**, which lands next in the ruled order (this family
  first, the kit second). The `session-hooks` / `hooks` / `shp` CLI aliases and their
  `_PENDING_CORPUS` entry are staged **in the S3a fold, not duplicated here** — that fold
  stages the `REVIEW` aliases in the same change (its court's F10), so both are one
  cross-repo edit.

## [0.1.71] - 2026-07-30

Corpus **v3.5.0 → v3.6.0** (EXTEND per [`LOCK.md`](LOCK.md) §2 — a new family for a
new domain, no existing MUST weakened): **281 → 293 MUSTs, 23 → 24 families.** Wave
**S2** of the Sooth→mgf adoption initiative
([`docs/inprogress/SOOTH_ADOPTION.md`](docs/inprogress/SOOTH_ADOPTION.md)). Merged
**second** of the two waves in flight, so it carries that tracker's §2.1 merge-order
reconciliation for both — every count mirror, the canary, and `SEATS.md` §1's
court-lane row (whose *"until it lands"* clause this release retires).

### Added
- **[`docs/standards/REVIEW.md`](docs/standards/REVIEW.md) — the court family,
  `CRT-01..CRT-12`.** The adversarial review round as a schema'd artifact: a
  fresh-context chair that never edits its target (CRT-01); committed-pin-only review
  (CRT-02); the thirteen-field findings grammar — `finding_id` / `rule` / `severity` /
  `claim` / `failure_scenario` / `verdict` / `lane` / `status` / `required_action` /
  `done_when` / `evidence` / `evidence_level` / `confidence`, with
  `CONFIRMED ⇒ VERIFIED_BY_EXECUTION` (CRT-03); the evidence ranking
  hashes > executions > readings > inferences, including the unpiped-gate clause
  (CRT-04); `could_not_verify` as a **rewarded** mandatory block (CRT-05); `lane`
  **fails closed** to `founder` (CRT-06); answer-every-finding-by-ID (CRT-07);
  seeded-sabotage proof for every fold that claims a pin (CRT-08); one holistic
  verdict, with *"reviewed; sound"* first-class **given** its kill-attempt list
  (CRT-09); exactly one durable home per finding (CRT-10); chair **allocation** for the
  classes [SEAT-07](docs/standards/SEATS.md#SEAT-07) enumerates — SEAT-07 owns the
  grading norm and the trigger list, CRT-11 cites rather than restates it (DP-14); and
  the preserved carve-out that review methodology never compiles into binding rules
  (CRT-12).
- **[`templates/findings-schema.json`](templates/findings-schema.json)** — the machine
  form of CRT-03 (JSON Schema 2020-12), carrying the required-field set, the enums, the
  `CONFIRMED ⇒ VERIFIED_BY_EXECUTION` coupling, and the round-level CRT-05/CRT-09
  guarantees as conditional subschemas.
- **`tests/unit/test_findings_schema.py`** — the doc↔schema anti-drift gate. The
  grammar exists in three places (the binding CRT-03 row, the §3 field table, the
  schema); this pins them equal, the same class of gate as
  `check_headline_coherence.py` and `check_testing_doc.py`. It caught a real omission
  on its first run — `evidence` was in the field table and missing from the binding
  rule row.
- **[`docs/recipes/court-round.md`](docs/recipes/court-round.md)** — the operational
  recipe: when to spend a scarce chair, the four-part convening prompt, the
  **standing-prompt pattern** (each attack line names a claim the surface makes that
  its consumer cannot check — generalized from `hrb-app`'s production
  `GUI_ACCEPTANCE.md`, with translations for libraries / web / CLI / test suites), the
  fold loop, and three worked case studies from the `hrb-app` v0.2.0 arc.

### Changed
- [`docs/recipes/README.md`](docs/recipes/README.md) §"Review methodologies vs binding
  rules" — reconciled with CRT-01..12. The clause previously forbade compiling *any*
  review-recipe stance or per-finding schema into a `docs/standards/` rule; the line
  now falls where CRT-12 puts it: the **protocol** binds, a given round's id scheme /
  report layout / attack list does not. "Never edit the target" is no longer
  recipe-local — it is CRT-01.

### Fixed
- **CRT-04 now defines execution for a prose target** (§4.1): when the reviewed
  artifact is a document corpus, `VERIFIED_BY_EXECUTION` means the corpus's own gates
  were run **or** the pinned text was byte-compared against the cited primary source —
  a primary-source read *at the pin* is an execution. Without it every finding against
  a doc target collapsed to `PLAUSIBLE`, and the verdict axis stopped discriminating
  for exactly the reviews this corpus performs most. **Found by the court round that
  reviewed the court family — against the court family**, using the grammar on itself;
  a grammar that could not grade a review of itself was not ready to bind anyone.
- Round-count and PR-range citations retraced to the ledger: **14 merged PRs #10–#23**
  (PR #24 carried the ledger row, merged 2026-07-30) and **ten court rounds enumerable
  by name**, aligned with the SEAT wave's re-count rather than the arc's summary line.
- The C-2 attribution re-anchored to the **2026-07-29 W2 pass-1** court (it had been
  reachable as "the same round" after an intervening paragraph about a later one).
- `severity` keeps its four values; the recipe's exemplar is restated **within** the
  enum, annotated that the round predates CRT-03 and its recorded "MEDIUM-HIGH" is
  nonconforming — the grammar was codified cleaner than the practice that proved it.
- `lane=court` is now defined in both the doc and the schema, identically.
- `REVIEW.md` Provenance records that Sooth's `CRT-*` ids do **not** map 1:1 onto this
  family's (twelve rules against sixteen), with the worked equivalences.

### Provenance
Ported **copy-with-attribution** from
[`sooth-standard`](https://codeberg.org/magogi-admin/sooth-standard)'s CRT family +
`PRV-02`; **MGF holds no dependency edge on Sooth**. Adapted, not transcribed — twelve
rules rather than sixteen, dropping the Sooth-specific handoff/round-artifact
machinery and adding what this federation's own evidence demanded (`severity` /
`claim` / `failure_scenario`, the `CONFIRMED`/`PLAUSIBLE` axis, seeded sabotage,
kill-attempt lists, chair-by-cost-of-wrong-CONCUR, the unpiped-gate clause). Field-proven
before codification across the `hrb-app` v0.2.0 release arc (2026-07-29/30, PRs
**#10–#23**, 14 merged; PR #24 carried the ledger row and merged 2026-07-30 after
the branches were cut): **ten court rounds enumerable by name** in that project's
`docs/inprogress/RELEASE_MASTERPLAN.md` §5 ledger.
## [0.1.70] - 2026-07-30

Corpus **v3.4.0 → v3.5.0** — an **EXTEND** under [`LOCK.md`](LOCK.md) §2 (corpus
MINOR): a **new rule family**, `SEAT`. Index of MUSTs **273 → 281 across 23
families**. No existing MUST weakened; no gate loosened. Wave **S1** of the
Sooth→mgf adoption initiative, tracked in
[`docs/inprogress/SOOTH_ADOPTION.md`](docs/inprogress/SOOTH_ADOPTION.md).

### Added

- **[`docs/standards/SEATS.md`](docs/standards/SEATS.md) — the `SEAT` family, the
  dual-model operating protocol.** Which capability tier does which work, and who
  enacts. Eight MUSTs plus one SHOULD:
  - **SEAT-01** three seats, one enactor — the scarce **designer** produces
    contracts, the abundant **executor** implements against them, the **founder**
    alone decides; agents never self-enact (consistent with AG-06 / AG-13 / the
    empowerment charter).
  - **SEAT-02** declare the seat before acting — a session that does not know its
    seat defaults to the most expensive one, invisibly.
  - **SEAT-03** altitude only — playbook-shaped work discovered mid-session is
    written down as an executor handoff, not done.
  - **SEAT-04** spawns never inherit — every `Agent` / workflow spawn pins an
    explicit cheaper model. Measured leak: one audit spent ~75% of its scarce
    budget on two sweep subagents that inherited the parent model.
  - **SEAT-05** durable output only — committed **as each artifact finishes**,
    never batched to session close.
  - **SEAT-06** the executor implements and proposes, never re-rules —
    observations go to the tracker or a FEEDBACK paper; spec, tracker, and code
    move in the same recorded change (AG-14 / DOC-18).
  - **SEAT-07** the adversarial chair is graded by the cost of a wrong CONCUR —
    gate-opening rounds, golden re-blesses, corpus amendments, and releases get
    the scarce tier.
  - **SEAT-08** one dispatch source — the block lives once in
    `templates/SEAT_DISPATCH.md`. The managed auto-block `mgf-fed catch-up`
    maintains (the machinery that already keeps AG-01's `AGENTS.md` and AG-02's
    project-lookup block fleet-current) is the channel `catch-up` **will** emit
    into once DB-S1-1 lands; until then the block sits in the repo-owned region
    **below** the `END` marker, because `catch-up` regenerates the managed span
    wholesale (`_splice_auto_block`) and deletes any second block it finds
    (`_strip_orphan_auto_blocks`). **Per-repo propagation is staged**, so no repo
    is non-conformant today.
  - **SEAT-09** (SHOULD, allowlisted not indexed) plan spend from **measured**
    burn, never extrapolation.
- **[`templates/SEAT_DISPATCH.md`](templates/SEAT_DISPATCH.md)** — the canonical,
  verbatim-copy dispatch block (SEAT-08's single source). Only the bracketed
  tracker path may be edited; re-wording it is how two repos come to believe
  different things about one protocol.
- **[`docs/recipes/dual-model-economics.md`](docs/recipes/dual-model-economics.md)**
  — the full pattern and the worked instantiation: the CX-1..6 complexity
  taxonomy, spend rules R1–R7, the decision-packet anatomy, the burn loop, the
  harness wiring, and the failure-mode table. `SEATS.md` is what you cite in a
  review; the recipe **wins on any conflict about detail**.
- **[`docs/inprogress/SOOTH_ADOPTION.md`](docs/inprogress/SOOTH_ADOPTION.md)** —
  the initiative tracker in decision-packet form: honest floor, measured
  baseline, waves S1–S5, four open decision boxes, and an append-only ledger.

### Notes

- **Why it lands as law rather than an experiment.** The enabling condition the
  family states — *build the gates first; the economics follow* — was already
  satisfied here: WF-02's four green gates, `mgf-fed app-doctor --standards`,
  the TS-22..28 supervisor tiers, OB-10's byte-identical wire golden, and the
  corpus/registry currency gates. The protocol then ran end-to-end in the
  **hrb-app release arc** (2026-07-29/30) before being codified. Every figure
  traced to its recorded source: 5 waves; **14 merged PRs, #10–#23**; **at least
  10 court rounds**, counted by name from the §5 ledger (that ledger's summary
  line asserts 11; ten are individually enumerable, so ten is what is claimed);
  suite **215 → 501** (the 503 in the same summary line is a post-release
  docs-only figure, not a gate output); branch coverage **92.77%**, the measured
  branch-aware number recorded six times; **4** dated entries in
  `LESSON_LEARNED.md`. The arc closed by tagging **hrb-app v0.2.0** — the
  consumer app's version, not a library's and not a corpus version.
- **The relay-finish, stated precisely.** Twice the **executor** died mid-wave on
  server-side API errors (four consecutive failures across the W3 depth pass),
  and each time ~1000 lines of implementation **survived in the dead executor's
  worktree** because they had been committed as they were produced. Recovery was
  **twice-shaped**: once a **fresh executor** resumed from that worktree plus the
  written contract; once, with the executor path fully down, the **designer
  finished at the bench**. The supported claim is that committed-as-you-go work
  outlives the session that produced it and transfers between seats — **not**
  that a program can be rebuilt from the ledger alone (the worktree carried the
  code, the ledger the contract; both were needed). That is the evidence for
  SEAT-05's *as each artifact finishes*.
- **Provenance.** Adapted with attribution from the Sooth family's `SEATS.md`,
  dispatch template, and economics recipe. **A copy, never a dependency** (the
  Sooth family's **XF-03**) — mgf takes on no import edge and no resolution path
  to the Sooth corpus; rule IDs
  are kept aligned so findings can be cited across both families, the text is
  mgf's, and mgf's is authoritative here.
- **DOC-18 ripple, same commit:** README *Index of MUSTs* rows + navigation tree
  + reading-order rows + machine-gated footer (273 → 281 / 22 → 23);
  `SHOULD_ALLOWLIST` entry for SEAT-09; regenerated `docs/standards/rules.json`
  (290 anchored / 281 MUST / 9 SHOULD); `SCOPE.md` literal; `FEDERATION.md` §4
  family row; the `test_rules_index` count canary; the recipes + inprogress
  indexes. `gen_rules_index.py --check` GREEN.
- **Follow-up (NOT here):** the fleet-wide §Z conformance-ledger re-baseline
  (273 → 281) is a separate wave, as it was for the REL-14/DP-14/WF-14 and
  SC-19..23 EXTENDs. This release touches only `mgf-standard`.

## [0.1.69] - 2026-07-31

### Changed
- Registry regenerated after the release wave (`mgf-common` 0.51.0 cornerstone,
  `mgf-secrets` 0.6.0, `mgf-fed` 0.18.1, `mgf-cloud-provision` 0.1.3, and first
  releases of `mgf-cloud-web` and `mgf-uitest-desktop`). The registry ships in the
  wheel as `mgf/standard/_libraries.json`, so a registry change owes a release.

### Added
- [`docs/AGENT_PRACTICES.md`](docs/AGENT_PRACTICES.md) — the Foundation's operating
  practices, written to be lifted by other teams and agents.
- CI step `cross-layer-audit` — gates the committed `AUDIT.json` on stamped /
  fresh / complete / clean.

## [0.1.68] - 2026-07-30

**Ships 0.1.67 too.** The 0.1.67 section below was written on 2026-07-22 and the
version was bumped in `pyproject.toml`, but the release was never cut — the newest
wheel on devpi is 0.1.66 and the newest tag is `v0.1.66`. So the SC-19..23 credential
plane (corpus **v3.4.0**, 268 → 273 MUSTs) has been law in the repo and absent from
every consumer for eight days. This release delivers it, plus the 2026-07-29/30
tooling round below.

Corpus is **unchanged at v3.4.0 / 273 MUSTs** — this release adds no rules. Registry
membership is a registry event under [`LOCK.md`](LOCK.md) §2, not a corpus amendment
(precedent: the `mgf-media` enrolment did not bump the corpus either).

### Added
- **`scripts/fleet_conformance_audit.py --check`** — gates the committed tracker on
  three questions it can answer about itself: is it stamped, is it younger than 14
  days, and **was its input clean** (or computed over stale checkouts)? Wired into
  `.woodpecker.yml`. It exists because the committed tracker was found still asserting
  *"39 repos, 39 clean, 0 real gaps"* from **2026-07-04** — 25 days of a stale artifact
  reading as current, because nothing was ever going to look.
- **The audit now reports what it measured.** It reads *working trees*, so a stale
  checkout makes it describe a fleet that is not the one shipping; it now records
  commits-behind-`origin/main` (`None` = **unknown**, never *current*), adds a Behind
  column, and states the input's condition before any row. The sibling family had
  already solved this — sooth-standard's `verify_family_conformance.py` reads remote
  default branches and labels working-tree mode *"lies more"*. Each check's **detail**
  is recorded too: 43× `[warn] AGENTS.md` was previously undiagnosable without
  re-running the whole fleet.
- **Non-member directories are named, not silently dropped.** A local `mgf-*` directory
  with no `origin` remote is a scaffold, not a fleet member; it is skipped **by name**
  in the tracker. *A silent skip is how "clean" quietly starts meaning "narrower than
  you think."*

### Changed
- **Registry: 43 → 44 members** — `mgf-uitest-desktop` enrolled (REL-13 regen, gate
  GREEN), with fed-resources regenerated for the new member.
- **Conformance tracker: 90 real gaps → 8**, 39 of 44 repos clean, on a clean input.
  `AGENTS.md` went from 43 warns to zero after the fleet re-render.

### Fixed
- **`SECRETS.toml`: five held-path credentials were declared `active`.** The
  mgf-website contact-form deploy path is deliberately held; five of its six
  credentials carried the hold only in prose while `state = "active"` said otherwise,
  so the doctor paged **ten HIGH findings for an intentional condition**. Corrected to
  `held`: 19 findings / 11 pageable became 14 / 1, and the one real page stopped being
  eleventh in a list of eleven. **Prose does not page.**
- **`rotation.last` for `agent_codeberg_write`** now records the 2026-07-30 rotation
  (F-39 closed: leaked value rotated, old PAT revoked).
- **`uv.lock`** had `mgf-standard` pinned at 0.1.62 against a 0.1.67 package.

### Documentation
- **Three lessons** in `LESSON_LEARNED.md`: a check's success line must state its own
  scope; the lesson may already exist in the *other* family; a breaking refactor's
  ripple hides in managed files, and prose is not a state.


## [0.1.67] - 2026-07-22

### Added
- **Five MUSTs enshrining the operational credential plane — one EXTEND (corpus
  v3.4.0), Foundation Secrets Phase 5 (SC-19..SC-23).** The `mgf-secrets` plane
  (registry → store → doctor → sync → rotation) becomes corpus law, so the fleet's
  own forcing functions keep it true. EXTEND per [`LOCK.md`](LOCK.md) §2 (new rules
  for the operational credential domain, **no existing MUST weakened, no new family**
  — SC pre-existing): corpus MINOR, **v3.3.0 → v3.4.0**; Index of MUSTs
  **268 → 273 across 22 families**.
  - **SC-19 (SECURITY_STANDARD)** — every operational credential MUST be declared in
    the `SECRETS.toml` registry (one entry per credential; values zero, AG-18).
    *Verifier:* the `mgf-secrets` doctor's unregistered-actual check (C3).
  - **SC-20** — operational secret values at rest MUST be age-encrypted in
    `mgf-secrets-store` (founder + operator recipients); plaintext only in the
    git-ignored materialized cache. *Verifier:* the store no-plaintext guard +
    `gitleaks` + doctor hygiene.
  - **SC-21** — the materialized cache MUST be bare-value files at `0600`/`0700`,
    no doc-form token files (the cat-a-doc leak class). *Verifier:* doctor C6.
  - **SC-22** — a Woodpecker secret add/rotate/re-scope MUST run the secret-change
    playbook (scope audit + one pipeline per event class + sooth canary for a
    cross-family surface). *Verifier:* `mgf-secrets sync`'s playbook + the
    cross-family CI contract (surface #6).
  - **SC-23** — every generated secret-consuming CI step MUST carry the fail-fast
    guard line (empty injection turns loud). *Verifier:* WF-13 render + doctor
    consumed-check (C2/C9).
  - **Numbering deviation (recorded):** SPEC-P5 drafted these as SC-13..17, but
    SC-13..18 were already taken by the 0.1.66 app-security wave (which the P5 spec
    predated). Renumbered to **SC-19..23**; content + verifiers unchanged.
- **Ripple (DOC-18 §10.4 "a standards rule" row), same commit:** SECURITY_STANDARD
  Rules box (5 rows) + §15 mechanical-enforcement matrix (5 rows); README *Index of
  MUSTs* (5 rows + the machine-gated footer count 268 → 273 + reading-order SC range);
  `docs/standards/rules.json` regenerated (281 anchored / 273 MUST / 8 SHOULD);
  `SCOPE.md` MUST-count literal (268 → 273); `FEDERATION.md` §4 SC family range
  (SC-01..SC-18 → SC-01..SC-23); `tests/unit/test_rules_index.py` count canary
  (268 → 273). `gen_rules_index.py --check` GREEN (273 / 22; headline + version
  coherence GREEN).
- **Cross-family CI contract — surface #6 added.** `mgf-secrets` itself is now a
  canary-gated cross-family surface: a library release or a `sync` affecting shared
  surfaces runs the sooth canary like any surface-1 change. The steward-precedent
  policy (any actor adding shared-infra creds MUST register them; doctor C3 enforces)
  is written into the contract. `docs/recipes/cross-family-ci-contract.md`.
- **MGF_INFRA.md** — §2 now points at the `SECRETS.toml` registry as the source of
  truth for "where a credential lives + how to obtain it" (retiring the per-credential
  prose + the codberge-line tribal knowledge); the §5 heartbeat table gains
  `secret-doctor` (the P4 agent2 cron).
- **SECRETS.toml registry cleanup** — removed the orphaned `woodpecker_token_local_dup`
  entry (a retired expired duplicate); resolved the codberge doc-form / manager-login
  entries by pointing them at the store + bare-value cache; reconciled the stale
  tea-token reference.
- **Follow-up flagged, NOT landed here:** adding MUSTs re-baselines every fleet
  member's §Z conformance ledger (268 → 273) — a separate wave. `doctor --standards`
  reads the Index dynamically, so no fleet break lands until this `mgf-standard`
  0.1.67 is published + members refresh their pin.

## [0.1.66] - 2026-07-18

### Added
- **Three MUSTs from the 2026-07-17 CI-support review — one EXTEND (corpus
  v3.3.0), enacted together (DP-3 / DP-4 / DP-5).** Founder-enacted governance
  change; the intent lives in the mgf workspace's
  `court/reviews/2026-07-17-ci-support-review/decision-packages.md`. EXTEND per
  [`LOCK.md`](LOCK.md) §2 (new rules for a new domain, **no existing MUST
  weakened, no new family** — REL / DP / WF all pre-existing): corpus MINOR,
  **v3.2.0 → v3.3.0**; Index of MUSTs **265 → 268 across 22 families**.
  - **REL-14 (RELEASING; CIR-17 / PAPER-130)** — release-currency: a
    distribution's `main` MUST NOT carry shipped-source changes past the tag
    matching its declared version (docs / CHANGELOG / CI-only exempt; anything a
    consumer installs — `src/`, packaged data, runtime `pyproject` metadata, and
    the **licence** — is not). The licence in the latest published wheel MUST
    equal the licence on `main`. Cleared by **releasing, never re-tagging** (a
    re-tag is a content swap forbidden by REL-02 / REL-05). Enforced by the fleet
    `verify_release_currency.py` currency check (the cron half ships separately).
    RELEASING §2.4 + Rules box + §8 checklist.
  - **DP-14 (DESIGN_PRINCIPLES; CIR-21 / PAPER-131)** — "derive, never restate":
    where a rule names a canonical set or mapping, tooling MUST derive from it at
    run time and MUST NOT restate it; hard-coded counts of a canonical set are
    forbidden in code and tests. DESIGN_PRINCIPLES §15 + Rules box + §14 matrix +
    §10 checklist. **Family choice (DP over DOC), justified:** the rule binds
    *run-time code / tooling behaviour* — how code relates to a canonical truth —
    the same shape as DP-10 (no silent fallbacks) and DP-03 (typed identity, not a
    re-stringified copy), and its origin (PAPER-131) is a *code* defect fixed by a
    *code* change (deriving from `MARKER_TIER`). DOCUMENTATION's DOC-09 (detect
    doc↔code drift) and DOC-18 (propagate a change to its copies) are its
    documentation-side cousins; DP-14 is the stronger move they point toward —
    eliminate the copy so there is nothing to propagate. Placing it in the code
    design-principles family is where an engineer/agent asks "should I hard-code
    this set or derive it?"
  - **WF-14 (WORKFLOWS; CIR-04 / PAPER-125)** — every CI `uv` verb that must not
    re-resolve MUST carry `--frozen`; audit-shaped exports additionally carry
    `--no-emit-project`; private `mgf-*` deps are stripped before a
    public-advisory audit. Precondition: `uv.lock` committed (WF-11 / §7.1).
    WORKFLOWS §7.4 + Rules box + §9 matrix + §11 checklist. Rule text only here;
    the `mgf-fed drift-check` ci-command ENFORCEMENT is a separate task.
- **Ripple (DOC-18 §10.4 "a standards rule" row), same commit:** each doc's Rules
  box + prose + self-review checklist; README *Index of MUSTs* (3 rows + the
  machine-gated footer count 265 → 268); `docs/standards/rules.json` regenerated
  (276 anchored / 268 MUST / 8 SHOULD); `SCOPE.md` MUST-count literal (265 → 268);
  `FEDERATION.md` §4 family-table ranges (DP/REL/WF → -14); the
  `mgf-standards-conformance-md-template.md` DP range; `tests/unit/test_rules_index.py`
  count canary (265 → 268, kept as a *loud* same-commit change-detector — DP-14
  targets silent drift, not a screaming snapshot). `gen_rules_index.py --check`
  GREEN (268 / 22; headline + version coherence GREEN).
- **Follow-up flagged, NOT landed here (touch only mgf-standard):** adding MUSTs
  re-baselines **every fleet member's §Z conformance ledger**
  (`MGF_STANDARDS_CONFORMANCE.md` gains three rows, 265 → 268) — a federation
  event of the PAPER-100 shape, run as a separate wave, not 40 repos edited in
  this release. `doctor --standards` reads the Index dynamically via
  `mgf.standard.read_standard`, so no fleet break lands until this
  `mgf-standard` 0.1.66 is published + members refresh their pin (the same
  forward-compatible rollout PAPER-100 used). The mgf-common agent-briefing
  surfaces (`AGENTS_BRIEFING`, `mgf-fed standards` / `agents`) render rule-counts
  live from the corpus, so they pick up 268 on the pin refresh — no hand-edit.
- **The cross-family CI safety net (CIR-22 / CIR-02) — contract + two enforcement
  scripts.** The Sooth family runs on MGF-owned CI with five *operational*
  dependencies and nothing tested them from Sooth's side when MGF changed them
  (the class bit twice: the 2026-07 secret re-scope killed sooth-brand + mgf-cost-watch;
  the `$DEVPI_URL` rename needed by-hand coordination). This lands:
  - **`docs/recipes/cross-family-ci-contract.md`** — the written contract naming
    the five surfaces (Woodpecker server + org secrets; devpi + `$DEVPI_URL`;
    `mgf-fedres`; template patterns; `mgf-cloud`/`mgf-cost-watch`) and the rule that
    a change to any is not "done" until the sooth canary runs green. Indexed in
    `docs/recipes/README.md`; named from `MGF_INFRA.md` §2.
  - **`scripts/ping_sooth_ci.py`** — the sooth canary (pattern: `ping_sibling_ci.py`):
    triggers the designated set (soothfast + sooth-standard + soothsmith) on the
    Woodpecker API and **polls Woodpecker green** (never Codeberg), non-zero on any
    red/unreachable. `--dry-run` lists the set. Same token handling as
    `ping_sibling_ci.py` (env → `my_stuff/`; value never printed).
  - **`scripts/audit_secret_scopes.py`** — the CIR-02 durable fix: pages every
    activated repo (`GET /api/repos?all=true`), parses each committed
    `.woodpecker.yml` (stdlib only — no YAML dep), and cross-checks every referenced
    secret's `when:` events against the secret's allowed event-scopes (read live from
    the v3.8.0 API, which **does** expose `events` on org + repo secrets; repo
    shadows org). Flags every mismatch, non-zero on any. First live run: 54/55 repos
    clean (mgf-cost-watch clean); it caught a real instance of the class —
    mgf-website's deploy chain, moved to the `deployment` event on 07-14, still
    references SSH secrets scoped only for `push`.
  - Tests in `tests/unit/` for both scripts (injected HTTP, no network), including
    the historical mgf-cost-watch mismatch shape as the audit's acceptance fixture.

### Changed
- **`templates/woodpecker/base.yml`: the ruff FORMAT gate now covers `scripts/`**
  (`ruff format --check src tests scripts`). PAPER-115 closed the silent-format-drift
  hole for `src`/`tests`; `scripts/` was the remaining gap, and the fleet's own
  generators live there (found via `gen_mgf_libraries.py` drifting unseen). Every
  conformant repo carries `scripts/check_commit_trailers.py` (a `present`/`[exact]`
  file), so the path always exists. `ruff check` is **not** widened to `scripts/`: the
  byte-exact scaffold runs `git` via subprocess, which trips flake8-bandit S603/S607
  under any repo that selects "S" — a false positive for a controlled tool; linting
  `scripts/` fleet-wide needs a per-repo S-carve-out (a separate call). Generated
  members pick this up on their next re-render (the pending WF-13 wave); the two
  bespoke gated repos that had real drift (`mgf-common`, `mgf-hrb`) took it directly.

## [0.1.65] - 2026-07-17

### Added
- **The registry enrolls non-package members (`lang = "web"` / `"assets"`).**
  `scripts/gen_mgf_libraries.py` grew two parsers: `_parse_node` (`package.json` →
  a Node/web member, e.g. the **mgf-website** Astro site) and `_parse_declared`
  (`MGF_MEMBER.toml` + a CHANGELOG → a member with no standard build manifest, e.g.
  the **mgf-brand** asset repo). `MEMBER_MANIFESTS` gains `package.json` +
  `MGF_MEMBER.toml`. Founder-directed: both repos were tracked only by their own
  bespoke CI and reported "unknown repo" by `mgf-fed`; they are now first-class
  registry members. The roster is **40**. Neither carries a Python baseline — their
  pipelines are bespoke (`[exempt].woodpecker`) and drift-check holds them to the
  universal governance steps only (needs `mgf-fed` >= 0.14.2).

### Changed
- `[exempt].woodpecker` adds `mgf-brand` + `mgf-website` (bespoke non-Python
  pipelines — an asset-lint suite and a gated Astro/Cloudflare deploy).
- `MGF_LIBRARIES.json` / `.md` + `fed-resources/` regenerated at 40 members. Adding
  two leaves that nothing depends on re-stales **zero** other members (the 0.3.0
  project-scoped architecture holds).

## [0.1.64] - 2026-07-17

### Added
- **`templates/woodpecker/frag-ui-gate.yml` + an `# <<INSERT:ui-gate>>` marker** — the
  WUI-07 browser gate. Spliced only into repos that depend on `mgf-uitest-web` (gated
  on the harness dependency, exactly as `lint-imports` is gated on a contract
  existing); requires `mgf-fed` >=0.14.0 to render. Installs the pinned Chromium, then
  runs `pytest tests/e2e -m e2e`.

  **It is a dedicated step for a load-bearing reason:** a console's pytest `addopts`
  deselect the tier-3 markers by default (TS-18), so browser specs left inside a
  normal `pytest -q` job are **silently deselected** — a gate that looks present and
  never runs. The step selects the tier explicitly, and pytest's exit-5 on an empty
  selection means a gate that ran nothing reds rather than greens.
- **`docs/standards/WEB_UI.md` §4.1** — WUI-07(c) named a screenshot-regression harness
  that did not exist; it does now. Names `mgf-uitest-web` as the implementation, and
  records why the tier exists at all: on its first run against the live consoles it
  found two real defects every `TestClient` suite had passed straight through (a mobile
  layout break at 390px, a WCAG-AA contrast failure), because both were only visible
  once a browser composed the page. Also records the scar: **pin the browser** — an
  unpinned run invented a `/global-tokens.css` 404 that did not reproduce, and a false
  finding costs more than a missing one.
- **`docs/standards/TESTING.md` §6.5** — the browser tier beside the Qt GUI stack
  (§6.1-6.4): what it is for, where the specs live (canonical `tests/e2e/`, TS-20),
  how a console turns it on, and why the gate is a separate step.

  Both are prose only: **no rule ids were added or removed**, the README *Index of
  MUSTs* stays at **265**, and every conformance ledger in the fleet is unaffected.

### Fixed
- **`frag-fedres-check.yml`: the generator now checks itself with its OWN code**
  (`{{FEDRES_INSTALL}}` renders `-e .` for mgf-fedres, `mgf-fedres` for everyone else).
  Installing the PUBLISHED fedres to verify the fedres repo **deadlocks it**: any change
  to a projector's output reds its own gate — the committed tree no longer matches what
  the OLD release regenerates — and the fix cannot publish until that gate is green.
  Hit for real by mgf-fedres 0.3.0. Same shape as the cornerstone's circular-dep
  carve-out.

### Changed
- **`MGF_LIBRARIES.json` / `.md` + `fed-resources/` regenerated.** The registry records
  today's releases; `[projectors.architecture].scope = "federation"` is now explicit —
  this repo OWNS the roster, so the whole-federation graph is its actual subject, and it
  projects from its own repo-local `MGF_LIBRARIES.json` (no external input to drift
  against). Every other member defaults to `scope = "project"` under mgf-fedres 0.3.0.

## [0.1.63] - 2026-07-16

### Removed
- **`verify_codeberg.py` (script + template + policy entries) — dead since the
  PAPER-112 devpi cutover** (the inline `verify-devpi` pipeline step is the
  living replacement). `templates/policy.toml` drops it from `present` and
  `[exact]`; SCOPE.md's template enumeration updated (CLARIFY); fleet copies
  are deleted in the WF-13 re-render wave. Founder-delegated call, 2026-07-10.

### Changed
- **`MGF_LIBRARIES.json` / `MGF_LIBRARIES.md` regenerated — the roster is 38.**
  `mgf-uitest-web` joins as a full federation member (browser-level UI testing
  for the web consoles: drives each FastAPI+Jinja console in a real pinned
  Chromium and asserts layout integrity, functionality, accessibility and
  runtime health that in-process `TestClient` cannot see). Regenerated via
  `scripts/gen_mgf_libraries.py` — the registry is GENERATED, never
  hand-edited; `discover()` picks the repo up from `.git` + `pyproject.toml`.
  The regeneration also reconciles version drift the roster had accumulated
  since 2026-07-10 (cornerstone `mgf-common` 0.50.0 → 0.50.1,
  `mgf-brand-web` 0.5.0 → 0.5.2, and six other members), restoring
  `REGISTRY CURRENCY: CURRENT` and a GREEN federation consistency gate.
- **PAPER-112's three host-ops confirmations decided (founder-delegated Court
  calls, 2026-07-10), recorded inline:** the single `magogi` devpi identity
  stands (accepted risk; revisit at the public flip) — PACKAGE_DISTRIBUTION §4;
  PKG-06 does NOT mandate per-package stage-pinning (single-trusted-index +
  private prefix is the posture) — §6; `magogi/prod` is strictly append-only,
  recovery = version bump, `devpi remove` is emergency-only behind a founder
  decision package — §8 + MGF_INFRA §2. Exact-ruff-pin decision: keep the
  `<0.16` window (the new CI format gate closes the ambush class) — FEEDBACK
  PAPER-115 tail.

### Added
- **`templates/woodpecker/frag-playwright-install.yml` + three
  `# <<INSERT:playwright-install>>` markers in `base.yml`** (one per test job) —
  splices `playwright install --with-deps chromium` ahead of the suite for
  members that declare `[tool.mgf-fed] browser = true`. `python:*-slim` ships
  neither the browser binary nor its system libraries, so a suite whose product
  IS driving a real browser cannot run in CI at all, let alone reach the TS-06
  ≥80% floor. Opt-in, mirroring how `lint-imports` is gated on a contract
  existing: the marker is inert for the other 40 members (mgf-fed's renderer
  drops a marker whose gate is False), so nobody else pays the download. The
  browser is pinned by the repo's own `playwright` pin — never a system browser
  (a different build resolves CSS/`@import` differently and invents findings
  that don't reproduce). First consumer: `mgf-uitest-web`. Requires the
  companion `browser` carve-out in `mgf-fed` ≥0.13.0 for the markers to fire.
- **PAPER-115 (gate strengthening; enacts at the founder's merge + WF-13
  re-render wave):** the canonical CI lint step now runs
  `ruff format --check src tests` right after `ruff check` — format drift can
  no longer ride green in CI and ambush `mgf-fed release-local`'s `_drift`
  check at release time (mgf-fed #69). The re-render wave will surface latent
  drift per-repo (the paper's cohort rollout); the exact-ruff-pin question is
  left as a founder policy call (`policy.toml`'s `<0.16` ceiling already
  freezes the 0.15.x format baseline).

### Fixed
- `templates/woodpecker/base-zig.yml`: the netrc write respects an agent-provided read-only `/root/.netrc` mount (MGF_INFRA §2) — write the `CODEBERG_CLONE_TOKEN` fallback only where no netrc exists. Fixes the deterministic `cannot create /root/.netrc: Read-only file system` red on zig mains since the v3.2.0 render (found by the zig fedres-closure slice).
- **PAPER-117 (CLARIFY-class):** the AG-03 `prepare-commit-msg` hook wiring is
  mutually exclusive with the pre-commit framework (`pre-commit install`
  refuses when `core.hooksPath` is set — verified on pre-commit 4.6.0).
  `docs/recipes/standardized-git-config.md` §4 now splits into §4a
  (`core.hooksPath`, no-framework repos) and §4b (pre-commit repos: the same
  committed script as a `stages: [prepare-commit-msg]` local hook +
  `pre-commit install --hook-type prepare-commit-msg` — verified end-to-end);
  `.githooks/prepare-commit-msg` falls back to `PRE_COMMIT_COMMIT_MSG_SOURCE`
  so merge/squash skip holds under both wirings; AG-18(c) + its enforcement
  row + CONTRIBUTING.md name both wirings (the MUST's substance is unchanged).
  The stale "CI gate tracked in mgf-common PAPER-102" recipe note now points at
  the shipped `frag-commit-trailers.yml`. Companion advisory for a doctor
  hook-*active* probe drafted in `pending-feedback/mgf-fed.md`.

## [0.1.62] - 2026-07-04

### Added
- **`MGF_INFRA.md` §5 — Backups & paging** (Wave-2 P0, CLARIFY-class): the three
  nightly backup crons (devpi-export / pg-dump / oo-snapshot: hosts, schedules,
  retentions), the heartbeat dead-man's-switch pattern (success-only POST to the OO
  `backup_heartbeats` stream; endpoint/token as root-600 file paths, values never
  committed), the watcher (Codeberg-issue pager on agent2 — Court-deployed, ⏳ pending
  live confirmation), **RPO 24 h / RTO 4 h**, and the restore-runbook pointer to
  `mgf-cloud-provision` (`backups/`, `ops/`, `docs/backup-restore-runbook.md`). §2's
  PAPER-111 wedge-signal gap now records its fix as delivered by the watcher
  (deployed-by-watcher, ⏳ until the Court confirms); §1's cost line documents the
  `mgf-cost-watch` red-cron threshold (`COST_ALERT_MONTHLY_CHF`, default 100 — gate P1).
  §1–§4 numbering untouched (external references pin them).

### Changed
- **M2 Wave-2 Phase 1 — THE HONEST GATE (staged for enactment at the founder's
  merge; the founder's Wave-2 GO covers the tier sitting: integration = tier-2 ·
  `slow` removed · `functional` struck).** Four moves, clearly classed:
  1. **TESTING.md — the tier sitting applied (doc follows code; enacts the
     founder-gated P2 sitting).** `integration` is **tier-2 everywhere** — §13.1's
     budget note (was "< 5 s"), §13.11's table (was tier-1 "sub-second"), and the
     inline `MARKER_TIER` block (which previously omitted it) now all give the
     code's one answer (≤ 2.00 s/test). The **thirteen become twelve + the
     explicit `tier(N)` override**: the phantom `functional` row (documented, but
     registered by NO code or consumer, ever — verified by pickaxe over
     mgf-common's history) is struck; the `slow` deprecation alias completed its
     removal (TS-18 rewritten to "slow tests are budgeted by TIER", with the
     migration note; TS-19's "canonical four" corrected; §8.4/§13/§16 swept).
     The inline MARKER_TIER block is regenerated to mirror
     `mgf.common.testing.MARKER_TIER` EXACTLY (key set, values, order). §19.3's
     record example is `schema_version 1.1.0` + the nullable `perf` field;
     §19.4's bundle sections match `SECTION_ORDER` exactly (bare headers —
     `STDOUT`, not `STDOUT (last 4 KB)`); §19.5 documents the Wave-2 quarantine
     honesty (WARN records + `--quarantine-report`); TS-24's DoctorFinding
     pointer names the real parent (`mgf.hrb.diagnostics` — the cited
     `mgf.common.observability.DoctorFinding` never existed).
  2. **Doc↔code lint (EXTEND — new gate, no MUST weakened):**
     `scripts/check_testing_doc.py`, invoked by `gen_rules_index.py --check`
     (the pytest-ridden channel), parses the §13.11 MARKER_TIER block + taxonomy
     table and fails on drift — doc-internal always; doc↔code
     (`mgf.common.testing`) when importable. mgf-standard is a pure leaf, so in
     this repo's CI the doc-internal layer runs; the code-compare half is
     enforced from mgf-common's side (its new
     `test_testing_doc_alignment.py` reads the installed corpus). Seeded
     negatives cover every Wave-1 drift class (integration three-answers, zombie
     `slow`, phantom `functional`, missing block, table↔block split-brain).
  3. **Templates (EXTEND):** base.yml's 3.12 coverage step becomes the
     supervisor — `coverage run --source=src/mgf -m mgf.test_supervisor
     --tier 0-2` + `coverage combine` (subprocess coverage via the consumer's
     `[tool.coverage.run] patch = ["subprocess"]`, coverage ≥ 7.10; verified
     end-to-end on mgf-common: 1657 tests through the supervisor, 93% combined,
     floor 80 green). `--require-nonempty` is implicit (supervisor default for
     explicit `--tier` runs). 3.11/3.13 stay plain-pytest version-compat. The
     separate `supervisor-tier-0` token step folds away (frag-supervisor keeps
     `--self-check` only); the fragment's `[supervisor]`-extra ghost comment is
     fixed to name the real `mgf-test-supervisor` dev dependency. §19.8's
     canonical consumer block drops the `-m "not …"` addopts exclusion — ONE
     filter model (`--tier`); adds the PAPER-23 `pytest_plugins` conftest line +
     the coverage `patch` key. **mgf-standard itself joins
     `policy.toml [exempt].woodpecker`** (its recorded CFM-04 supervisor decline
     is incompatible with the new base gate; its pipeline is hand-held on the
     plain-pytest shape until the renderer grows a per-member coverage-gate
     knob — mgf-fed follow-up), and its `.woodpecker.yml` header says so.
  4. **Stale-string sweep (CLARIFY):** the supervisor install text is the devpi
     pin (`uv add --dev "mgf-test-supervisor>=0.1,<0.2"`) in §19.6/§19.8, the
     README quick-nav, and the adoption recipe — the `git+ssh://` direct
     reference is retired; README Index rows TS-18/TS-19 mirror the rewritten
     rules; DESIGN_PRINCIPLES' addopts example drops `not slow`.
  Consumer-facing follow-ups are listed in the Wave-2 fleet re-render item
  (consumer pyprojects: drop the `slow` marker row + the `-m` exclusion, add the
  coverage `patch` key; re-render pipelines).
- **Woodpecker templates — zig renders keep their fedres gate + `mgf-website-template`
  exempt (EXTEND per LOCK §2, template-surface, staged for enactment — corpus
  v3.1.0 → v3.2.0 at the founder's enacting merge; no rule text changes, 265/22
  unchanged).** Two findings from the 2026-07-04 fleet re-render wave:
  (1) *Zig `fedres-check` preserved as a fragment (WF-13 / D-GEN):* `base-zig.yml` now
  carries the `# <<INSERT:fedres-check>>` marker — the same opt-in idiom as `base.yml`,
  gated on the member's `fed-resources/source/project.toml` (which `mgf-fed` already
  derives) — so a zig re-render *preserves* the fedres freshness gate in the v3.1.0
  `$DEVPI_URL`+guard form instead of silently dropping the hand-spliced step all six
  zig repos carry today (non-canonical residue of their fed-resources rollout commits;
  the fragment splicer never applied to zig renders). **Named companion (not in this
  repo's write scope):** `mgf.fed._woodpecker.render_woodpecker` still short-circuits
  zig members past the marker path — until that routes zig through
  `_substitute`/`_apply_markers`, a zig re-render emits the literal marker (a harmless
  YAML comment) and still omits the step, so the zig repos re-render **only after**
  that mgf-fed change ships. The template is forward-compatible either way.
  (2) *`mgf-website-template` joins `policy.toml [exempt].woodpecker`:* its pipeline is
  hand-authored (the repo root is a cookiecutter, not a Python package), and a
  `mgf-fed scaffold` would have clobbered it with a generic-Python render; exempt,
  scaffold leaves it untouched and `drift-check` holds it to the step-name fallback.
  `docs/recipes/run-ci.md` examples updated in the same wave (DOC-18).

## [0.1.61] - 2026-07-04

### Added
- **LOCK v1 (2026-07-04)** — the standards corpus is **LOCKED at v3.0.0** and the
  federation contract at **v2.0**: `LOCK.md` lands at root (locked surfaces, the
  CLARIFY/EXTEND/BREAKING amendment classes, preconditions, the open-at-lock register,
  the shared-philosophy clause with sooth-standard, the pressure-point register);
  PR-01..07 marked GATED-at-lock; annotated tag `standards-lock-v1`. Founder-enacted;
  execution delegated to the Court/CTO seat. Zero rule changes (265/22 unchanged).
- **Headline/version-coherence gate** (`scripts/check_headline_coherence.py`,
  invoked by `gen_rules_index.py --check`; pinned by
  `tests/unit/test_check_headline_coherence.py`). Every drift the 2026-07-03
  Court review confirmed was a hand-maintained headline shadowing a machine
  source, so the headline surfaces are now gated against `rules.json`: the
  README Index-of-MUSTs footer count (reconciled 264 → **265** — the AP-16
  addition had missed the footer, F-M4), `SCOPE.md`'s MUST-count literal, and
  `FEDERATION.md`'s §4 family-table row count. Version coherence: the
  contract must carry **no literal corpus version** ("at time of writing" is
  banned; pointer form required; rule-amendment citations like "DOC-01
  v2.11" stay legal as history), and the contract Status line must match the
  script's single `CONTRACT_VERSION` constant. Rides CI through the same
  channel as the rules-index gate (the pytest steps) — `.woodpecker.yml` is
  a WF-13 generated artifact, so no hand-edited pipeline step.

### Changed
- **Woodpecker templates — the sooth family's field-proven CI fixes folded back
  (PAPER-108/113/114; EXTEND per LOCK §2, staged for enactment — corpus v3.1.0 at
  the founder's merge; no rule text changes, 265/22 unchanged).**
  (1) *PR/push double-run (PAPER-114/-108):* the `push` event is now
  branch-filtered to `main` in `base.yml` + `base-zig.yml`, so a feature-branch PR
  no longer races a redundant push pipeline on the same commit (the sooth-proven
  exit-126 workspace contention); tag/cron/manual triggers untouched.
  (2) *Zig determinism (PAPER-114/-108):* `base-zig.yml` gains an inline
  ziglang-pin↔`toolchain.lock` coherence gate (sooth `verify_ci` check-#10
  semantics — mismatch reds, no committed lock is noted) plus a commented opt-in
  `validate-bundle` lane; `verify_ci.py` tool adoption deferred (reasons in the
  paper resolutions).
  (3) *Endpoint indirection (PAPER-113):* every devpi index literal in
  `templates/woodpecker/` (base ×3 + four fragments) is replaced by the Woodpecker
  **server-level** `$DEVPI_URL` variable (live since 2026-07-04; name shared with
  sooth-standard) with a per-step fail-fast guard; `MGF_INFRA.md §2` documents the
  variable + host-move procedure. mgf-fed's generator constant + the cookiecutter
  remain as named companions. This repo's own `.woodpecker.yml` regenerated
  (WF-13); the fleet-wide re-render wave follows the enacting merge.
- **DOC-18 / AG-14 — cross-repo change-wave carve-out (standards v2.26.1;
  staged for enactment).** The literal "IN THE SAME COMMIT" propagation demand
  is now scoped to same-repo dependents; for cross-repo dependents (e.g. the
  `mgf-fed` CLI surfaces in `mgf-common`) propagation happens **in the same
  change-wave** — one commit per repo, cross-referenced in both commit
  messages, and the wave is not "done" until every repo's commit has landed.
  The old wording was unsatisfiable in git across repo boundaries (Court
  review 2026-07-03, F-M7): a central anti-drift rule that cannot be satisfied
  as written pressures agents into false "done" or silent skips. §10.4's prose
  already described the change-wave model; the Rules boxes now agree with it.
  Wording-only → PATCH per the versioning policy (v2.26 → v2.26.1); rule IDs
  and counts unchanged; README Index-of-MUSTs rows + §10.4 matrix header
  updated same-commit; `rules.json` regenerated (index gate GREEN).
- **Standards retargeted to the self-hosted devpi index (PAPER-112).** The
  publish/distribution corpus — `PACKAGE_DISTRIBUTION.md` (canonical, PKG-01..12),
  `WORKFLOWS.md` (WF-03/04/06/08), `RELEASING.md` (REL-04/05/06),
  `WORKFLOWS_PATTERNS.md` §4, `AGENTS.md` (AG-09), `NAMING.md`,
  `COMMON_COMPONENTS.md`, the README *Index of MUSTs*, and the recipes + ledger —
  now describes the running system: `mgf-*` publish + resolve via the devpi index
  `magogi/prod` (`devpi_password`, **anonymous** read, `verify-devpi`, non-volatile
  immutability, single index inheriting `root/pypi`), superseding the
  Codeberg-registry model. The package registry moved to devpi; **Codeberg remains
  the git forge**. Rule IDs unchanged (DOC-18 text-only). Three host-ops decisions
  flagged inline for confirmation (identity split, recovery procedure, explicit
  stage-pinning).

## [0.1.60] - 2026-06-29

### Changed
- **Registry refresh (REL-13).** `MGF_LIBRARIES.json` — shipped as `mgf.standard`
  package data (`mgf/standard/_libraries.json`) — now lists all **36** federation
  libraries: adds `mgf-fedres`, `mgf-fed-web`, `mgf-test-web`; renames
  `mgf-cloud-app` → `mgf-cloud-web`; currency bumps across the fleet. This lets the
  `mgf-fedres` Class-P projectors read a **current** registry hermetically from the
  installed package — so any fleet repo can project its federation graph in a
  single-repo CI checkout, with no sibling `mgf-standard` on disk.

## [0.1.59] - 2026-06-29

### Added
- **AG-20 — owned-infrastructure discipline + the `MGF_INFRA` registry (standards
  v2.26).** Before declaring an action blocked / human-gated / impossible, an agent
  MUST consult the new fleet **`MGF_INFRA.md`** registry (the inventory of what the
  Foundation runs + owns — Woodpecker CI, devpi, OpenObserve, Codeberg, Infomaniak —
  with each one's access + recovery path) and attempt the self-owned recovery path:
  an auth/access failure on Magogi-owned infra is a solvable sub-problem, not a
  terminal wall. Reason from capabilities, not stated state; state the blocking
  assumption out loud; recorded "blocked"/"gated" notes carry an unblock-path +
  as-of date. Origin: a session that treated our own (expired-token) Woodpecker as
  a human-gated wall when it was a one-command server-side token mint.
  - Propagated (DOC-18): `docs/standards/AGENTS.md` (AG-20 Rules box + glance row),
    README *Index of MUSTs* (→ **264 MUSTs across 22 families**) + version history, a
    regenerated `docs/standards/rules.json` (rules-index gate GREEN), the
    `test_rules_index` count, this repo's conformance ledger, and the new root
    `MGF_INFRA.md` fleet registry.
- **AG-19 — the runtime auto-memory store MUST be version-controlled + backed
  off-machine (standards v2.25).** The machine-local harness memory
  (`~/.claude/projects/<slug>/memory/` — the private store of AG-05/AG-08, distinct
  from AG-17's in-repo `docs/memory/`) MUST be a git repo pushed to a **private**
  Codeberg remote `<project>-memory`, so the agent's own memory survives disk loss
  and stays auditable across machines. **Safety is the crux:** git is scoped to the
  `memory/` directory only — never its parent, which holds the session `*.jsonl`
  transcripts that can contain secrets — enforced by an allowlist `.gitignore`
  (`*`, `!*.md`, `!.gitignore`). New `scripts/init_memory_vcs.py` bootstraps/refreshes
  it idempotently (init → private remote via `tea` → AG-03-trailered commit → push;
  `--check`/`--no-remote` modes). Server-side CI can't gate a machine-local store, so
  enforcement is the script + self-check, not a `.woodpecker` step.
  - Propagated (DOC-18): `docs/standards/AGENTS.md` (AG-19 Rules box + §9 enforcement
    table), README *Index of MUSTs* (→ **263 MUSTs across 22 families**) + the
    maintenance-note version history, a regenerated `docs/standards/rules.json`
    (rules-index gate GREEN), and the new bootstrap script.
- **`mgf-fed start` framed as the single onboarding front-door.** The four
  onboarding prompts (`federation-{sync,new-project,adopt,onboard}-prompt`) now
  carry a *Front door* note pointing at `mgf-fed start` (auto-detects a member →
  sync; otherwise prints a scenario menu; `--mode {new|onboard|sync|adopt}`
  forces, `--list` lists). `docs/recipes/README.md` gains an *Onboarding* intro
  + intent→mode table. The prompt bodies are unchanged in substance; `start`
  dispatches to them (the dispatcher itself ships in `mgf-fed` 0.6.0).

### Fixed
- **Corpus-wide CLI rename `mgf-common <verb>` → `mgf-fed <verb>`** (Wave-3 reorg:
  the CLI moved to `mgf-fed`; the `mgf-common` console script no longer exists).
  Swept every live doc — standards, recipes, FEDERATION/README/AGENTS/DEPS, the
  cookiecutter templates, design + memory notes (~210 invocations across 54
  files). Two verbs were **renamed** in the move, not just reprefixed:
  `mgf-common doctor` → **`mgf-fed app-doctor`** (mgf-fed `doctor` is the
  *federation* self-check) and `mgf-common feedback` → **`mgf-fed feedback-howto`**
  (mgf-fed `feedback` is the FB-05 relay). Only real CLI invocations (inline-code
  spans + fenced code) were touched — bare prose ("the mgf-common feedback file",
  "mgf-common federation refs", "which mgf-common version") and the
  `mgf-common[standards]` *package* extra are unchanged. History is preserved:
  `CHANGELOG.md`, `LESSON_LEARNED.md`, `FEEDBACK.md`, and `docs/archive/` keep the
  spellings that were accurate when written.

### Changed
- **Standards README slimmed 1601 → 603 lines (federation reorg, Wave 2).** The
  embedded per-version *"What's new in v2.x"* changelog (~1000 lines) duplicated
  this file and is removed — `CHANGELOG.md` is now the single home for standards
  history. The **DOC-18** propagation rule, the §10.4 Change-Propagation Matrix,
  and every per-file *Propagation header* drop the now-removed *README "What's
  new"* dependent, so a standards change updates ONE history, not two. No rule
  changes — the Index of MUSTs and all 270 rules are unchanged.

---

## [0.1.58] - 2026-06-16

### Changed
- **AG-18 tightened — AG-03 commit trailers are now CI-enforced (PAPER-102 ship,
  standards v2.24).** AG-18's existing MUST gains clause (c): every repo MUST commit
  the `.githooks/prepare-commit-msg` hook (wired via `core.hooksPath`) **and** run
  `scripts/check_commit_trailers.py` as the generated `.woodpecker.yml`'s
  authoritative `commit-trailers` CI gate (fails any branch whose non-merge commits
  lack either trailer, independent of local config). `mgf-common doctor`'s
  `prepare-commit-msg` check — inert by design until now (it self-gates on the
  corpus text referencing `prepare-commit-msg`) — flips to **enforcing** with this
  release. No new rule ID; the Index stays at 262 MUSTs / 22 families.
  - Propagated (DOC-18): `docs/standards/AGENTS.md` (AG-18 Rules box + §11 + the
    enforcement table), README *Index of MUSTs* + *What's new in v2.24*, and a
    regenerated `docs/standards/rules.json` (rules-index gate GREEN).
  - **Lands GREEN, not retro-failing:** the whole fleet's `.woodpecker.yml`s already
    carry the `commit-trailers` gate (the PAPER-102 wave distributed the mechanism
    first) — the DOC-19-style staging: ship the mechanism, *then* tighten the rule.

## [0.1.57] - 2026-06-15

### Added
- **`read_scaffold()` / `list_scaffold()` — canonical scaffold artifacts as wheel data.**
  The AG-03 `prepare-commit-msg` hook + the `check_commit_trailers.py` CI checker are now
  force-included as `mgf/standard/_scaffold/` and resolved through the new public accessors,
  so a consumer (`mgf-common catch-up`) writes the *canonical* text into a repo instead of a
  drift-prone parallel copy (single source of truth = mgf-standard's own `.githooks/` +
  `scripts/`). Part of mgf-common FEEDBACK **PAPER-102** (the AG-03 trailer enforcement).
  `PUBLIC_API.{md,json}` + `__all__` updated (the AP-10 sync test pins them).

## [0.1.56] - 2026-06-14

### Security
- **SC-15 — directory-traversal guard on the corpus readers.** `read_standard` /
  `read_recipe` / `read_design` resolve `<corpus-dir>/<name>.md` from a caller-supplied
  stem; before this fix a crafted `name` could escape the corpus directory
  (`read_standard("../../README")` returned the repo-root `README.md`). They now reject any
  non-bare stem (a path separator, `..`, or an absolute path) with the same `FileNotFoundError`
  raised for an unknown topic — a reader can only ever reach a file *inside* its corpus dir.
  Low real-world severity (the accessors are consumed by trusted federation code; `.md`-only;
  no privilege boundary), but a genuine SC-15 miss on a shipped public API. New
  `tests/unit/test_path_traversal.py`. Surfaced by the SECURITY depth-audit pass
  (`docs/inprogress/MGF_STANDARDS_CONFORMANCE.md` → Findings log).

## [0.1.55] - 2026-06-14

### Added
- **WF-13 (the CI pipeline is a generated artifact)** — one new WORKFLOWS MUST (Index 261→**262**/22 families).
  Each repo's `.woodpecker.yml` is rendered from the canonical template (`templates/woodpecker/`) by
  `mgf-fed scaffold` — never hand-edited; `mgf-fed drift-check` enforces generation-currency (on-disk ==
  fresh render). Legitimately-bespoke pipelines are listed in `templates/policy.toml [exempt].woodpecker`
  (now `mgf-hrb` + `mgf-test-supervisor`) and held to the step-name fallback instead. New recipe
  `docs/recipes/run-ci.md` (run CI locally via `mgf-fed local-ci`, the generated-pipeline rule, the two-mode
  release). WORKFLOWS.md §8.4 + Rules box + enforcement matrix + checklist; `rules.json` regenerated (gate GREEN).
  (Activating remote Woodpecker so the pipeline actually RUNS remains WF-11.)

## [0.1.54] - 2026-06-13

### Added
- **AG-17 (in-repo agent memory) + AG-18 (standardized git config)** — two new AGENTS MUSTs (Index 259→**261**/22 families).
  AG-17: every repo keeps committed `docs/memory/` (a `MEMORY.md` index + one-fact-per-file topic notes) so durable agent
  context travels with the repo. AG-18: the canonical `.gitignore` now includes `my_stuff/` (never-committed local secrets,
  PKG-03) + `.gitmessage`/`commit.template` wiring. New recipes `in-repo-memory.md` + `standardized-git-config.md`; the
  cookiecutter seeds `docs/memory/` and ignores `my_stuff/`. AGENTS.md §5.1 + §11; `rules.json` regenerated (gate GREEN).

## [0.1.50] - 2026-06-12

### Added
- **PAPER-100 — Index of MUSTs completed (218 → 258 MUSTs across 21 families).** Refilled the five
  omitted binding families (TM/PF/OB/NM/GUI) + REL-10..13 that `doctor --standards` (CFM-03) had been
  gating ledgers against an incomplete denominator. Added `scripts/gen_rules_index.py --check` anti-drift
  gate (CI lint + `tests/unit/test_rules_index.py`) + `docs/standards/rules.json`. All 21 federation §Z
  ledgers re-baselined to 258 (forward-compatible). Runbook: `docs/archive/2026/PAPER-100-rollout.md`.
- **PAPER-107 — shared-code / duplication discipline** (`docs/recipes/shared-code.md`) + **NM-05**
  (junk-drawer-module-name SHOULD), folded back from the Plasma project's Commons standard.

### Fixed
- **Plasma feedback cohort (PAPER-100..106):** NUL byte in TESTING.md (P-G) + control-byte CI gate; README
  nav ranges OB-01..11 / REL-01..13 (P-B); cookiecutter level 0,1,2→1,2,3 (P-C); REL-09 REJECTED→WONTFIX
  + sweep (P-D); architecture-review evidence_level →VERIFIED_BY_EXECUTION (P-E); bundle version stamp (P-F).

---

## [0.1.49] - 2026-06-11

- docs(recipes): add **local-release** + **remote-release** runbooks (the two-mode release model — `mgf-fed release-local` / `release-remote`).
- docs(standards): RELEASING.md gains a "Release modes — local-first, then remote promotion" section (no new MUSTs; names the model the tooling enforces via REL-01/02/05/06/08/13 + PKG-04/05).

---

## [0.1.48] - 2026-06-10

- chore(registry): regen — add **mgf-fed** (federation orchestrator); 29 libraries, REL-13 GREEN+CURRENT.
- feat(templates): add the canonical scaffolding **policy.toml** + byte-exact verify_codeberg.py (drives ).
- docs: add the federation automation & two-mode release plan (docs/inprogress/).

---

## [0.1.47] - 2026-06-09

- chore(registry): regenerate — cornerstone mgf-common 0.46.7 (which now resolves mgf-standard). REL-13 GREEN + CURRENT.

## [0.1.46] - 2026-06-09

### Changed
- **RENAME: `mgf-doc-standard` → `mgf-standard`** (distribution + Python module `mgf.doc_standard` → `mgf.standard`). Hard cut-over: `mgf-common`'s [standards] extra + agents/standards/catch-up CLI now resolve `mgf-standard`/`import mgf.standard`. Wheel data (standards corpus, recipes, registry, FEDERATION) re-homed under `mgf/standard/`. The registry generator now derives each slug from the pyproject `name` (robust to the repo-dir rename). Old name retired (no alias).


---

## [0.1.45] - 2026-06-09

- chore(registry): regenerate for mgf-tele-core 0.1.6 + mgf-tele-teltonika 0.1.6 + the mgf-hrb/[standards] catch-up. **Milestone: the entire Python federation (~22 libraries) is now evidence-audited + governed.** REL-13 GREEN + CURRENT.

---

## [0.1.44] - 2026-06-09

- chore(registry): regenerate — picks up the [standards] extra added to mgf-vm-libvirt during its close (the VM family is now fully audited+governed). REL-13 GREEN + CURRENT.

---

## [0.1.43] - 2026-06-09

- chore(registry): regenerate for mgf-vm-interchange 0.2.2 (AP-13 __version__ + full CI + audit close to 73%) + its [standards] extra. REL-13 GREEN + CURRENT.

---

## [0.1.42] - 2026-06-09

- chore(registry): regenerate for mgf-vm-forensics 0.1.6 (SC-15 hardening + full CI + audit close to 81%) + its [standards] extra. REL-13 GREEN + CURRENT.

---

## [0.1.41] - 2026-06-09

- chore(registry): regenerate — picks up the [standards] extra added to mgf-vm-firecracker during its hygiene close. REL-13 GREEN + CURRENT.

---

## [0.1.40] - 2026-06-09

- chore(registry): regenerate — picks up the [standards] extra added to mgf-vm-core (AG-16) during its close-out. REL-13 GREEN + CURRENT.

---

## [0.1.39] - 2026-06-09

- chore(registry): regenerate — picks up the [standards] extras added to mgf-vm-sdk (AG-16) during depth-audit close-out, + records mgf-vm-core/mgf-vm-sdk audit progress. REL-13 GREEN + CURRENT.

---

## [0.1.38] - 2026-06-08

- chore(registry): regenerate — **mgf-apiprobe 0.5.6->0.5.7** (depth-audit close: CI pipeline + SCOPE/docs + PR-01 UI-contract + AP-13 version-drift fix + public-API; ledger 137 OK / 30 open, 82%% of applicable; OP/LG/DP-09 feature tail documented). REL-13 GREEN + CURRENT.

---

## [0.1.37] - 2026-06-08

- chore(registry): regenerate — **mgf-logship 0.1.3->0.1.4** (depth-audit close: import-linter + CI pipeline + missing federation docs + SCOPE + tests + public-API; ledger 105 OK / 16 open / 1 declined, 86%% of applicable). REL-13 GREEN + CURRENT.

---

## [0.1.36] - 2026-06-08

- chore(registry): regenerate — **mgf-django 0.4.6->0.4.7** (depth-audit close: import-linter + CI pipeline + scope/docs/tests + typed errors [EH-01/08/09] + public-API; ledger 136 OK / 7 open / 1 declined, 95%% of applicable). REL-13 GREEN + CURRENT.

---

## [0.1.35] - 2026-06-08

- chore(registry): regenerate — **mgf-livepush 0.1.5->0.1.6** (depth-audit close: CI pipeline + scope/docs/tests + public-API + LG event fields; ledger 122 OK / 5 open / 1 declined, 95%% of applicable). REL-13 GREEN + CURRENT.

---

## [0.1.34] - 2026-06-08

- chore(registry): regenerate — **mgf-auth 0.1.5->0.1.6** (depth-audit close: DP-01 _svix extraction + CI pipeline + scope/docs/tests + public-API + EH-08/LG; ledger 124 OK / 7 open / 2 declined, 93%% of applicable). REL-13 GREEN + CURRENT.

---

## [0.1.33] - 2026-06-08

- chore(registry): regenerate — **mgf-alembic 0.4.7->0.4.8** (depth-audit close: CI pipeline + scope/docs + public-API + EH-01/SC-17/LG-11; ledger 129 OK / 1 open / 3 declined, 97%% of applicable). REL-13 GREEN + CURRENT.

---

## [0.1.32] - 2026-06-07

- chore(registry): regenerate — **mgf-http 0.4.7->0.4.9** (depth-audit close: CI pipeline + scope/docs + public-API + tests + EH; ledger 134 OK / 5 open / 1 declined, 96%% of applicable). REL-13 GREEN + CURRENT.

---

## [0.1.31] - 2026-06-07

- chore(registry): regenerate — **mgf-http 0.4.7->0.4.8** (depth-audit AP cluster: __version__ + PUBLIC_API surface + verb docstrings; ledger 115 OK / 24 open / 1 declined). REL-13 GREEN + CURRENT.

---

## [0.1.30] - 2026-06-07

- chore(registry): regenerate — **mgf-sqlalchemy 0.5.6->0.5.7** (depth-audit tail: EH-07 + REL-01 + AP-14 decline; ledger 115 OK / 2 open / 1 declined, 97%% of applicable). REL-13 GREEN + CURRENT.

---

## [0.1.29] - 2026-06-07

- chore(registry): regenerate — **mgf-sqlalchemy 0.5.5->0.5.6** (depth-audit AP cluster: __version__ + PUBLIC_API surface; ledger 113 OK / 5 open, 96%% of applicable). REL-13 GREEN + CURRENT.

---

## [0.1.28] - 2026-06-07

- chore(registry): regenerate — **mgf-test-supervisor 0.1.12->0.1.13** (OP-01 rich --version; close-out batch). REL-13 GREEN + CURRENT.

---

## [0.1.27] - 2026-06-07

- chore(registry): regenerate — **mgf-test-supervisor 0.1.11->0.1.12** (depth-audit AP cluster: __all__ + PUBLIC_API surface; ledger 98 OK / 14 open, 88%% of applicable). REL-13 GREEN + CURRENT.

---

## [0.1.26] - 2026-06-07

- chore(registry): regenerate — **mgf-fastapi 0.6.9->0.6.10** (depth-audit batch E logging hardening; ledger 143 OK / 7 open, 95%% of applicable). REL-13 GREEN + CURRENT.
- note: **0.1.25 skipped** — a Forgejo PR rate-limit stranded that cut + left a stray v0.1.25 tag at the 0.1.24 commit (no 0.1.25 wheel published); re-cut here.

---

## [0.1.24] - 2026-06-07

- chore(registry): regenerate — **mgf-fastapi 0.6.8→0.6.9** (depth-audit batch D: EH-08/EH-10/DP-11/SC-07; ledger 138 ✅ / 13 ⏳). REL-13 GREEN + CURRENT.

---

## [0.1.23] - 2026-06-07

- chore(registry): regenerate — **mgf-fastapi 0.6.7→0.6.8** (depth-audit gap closing batch A+B: CI publish pipeline + import-linter + public-API/version/corpus-pin; 86→108 ✅). REL-13 GREEN (28 libraries) + CURRENT.

---

## [0.1.22] - 2026-06-07

- chore(registry): regenerate — cornerstone **mgf-common 0.46.6** (depth-audit gap-closing: CF-02 behavior fix + 10 conformance fixes; 11/14 gaps closed) + self-version record. REL-13 GREEN (28 libraries) + CURRENT.

---

## [0.1.21] - 2026-06-07

- chore(registry): regenerate — cornerstone **mgf-common 0.46.5** (REL-13 after
  the `doctor --standards` LESSON_LEARNED.md presence gate, mgf-common
  PAPER-99 / Phase C of the DOC-19 promotion wave) + self-version record.
  REL-13 GREEN (28 libraries) + CURRENT. Closes the DOC-19 promotion wave
  (`docs/archive/2026/doc19-promotion-wave.md`): DOC-19 is a MUST (v2.21), seeded
  federation-wide, and presence-gated end-to-end.

---

## [0.1.20] - 2026-06-07

- **Standards v2.21 — DOC-19 (`LESSON_LEARNED.md`) promoted SHOULD → MUST.**
  Shipped v2.20 as a deliberately-staged SHOULD; now that the file is **seeded
  federation-wide** (the DOC-19 adoption wave — present on every repo's default
  branch), it is a MUST: added to the README **Index of MUSTs** (so the
  `doctor --standards` CFM-03 ledger-completeness gate requires a `DOC-19` row)
  and presence-gated (mgf-common PAPER-99). Presence is the bar — a seeded file
  with no lessons yet is conformant. Safe because conformance resolves from the
  pinned corpus (the flip is inert until a repo bumps) **and** the wave added a
  `DOC-19 ✅` row to every currently-complete ledger first, so the flip breaks
  no one. DOC-18 ripple: DOCUMENTATION.md rule + §2.0.1 matrix (SHOULD→✅) +
  README Index of MUSTs + What's-new v2.21 + FEDERATION.md baseline + the
  lesson-learned-md-template recipe. Promotes this repo's FEEDBACK PAPER-03 to
  shipped; unblocks mgf-common PAPER-99 (the presence gate, Phase C).
- chore(registry): regenerate at 0.1.20 — self-version record. REL-13 GREEN
  (28 libraries) + CURRENT.

---

## [0.1.19] - 2026-06-07

- **Standards v2.20 — new `DOC-19` (SHOULD): `LESSON_LEARNED.md`.** Every project
  SHOULD keep a root, append-only, dated lessons log (corrected assumptions,
  gotchas, reusable techniques, dead ends) so the federation stops re-learning
  the same thing; generalising lessons ALSO route to a `pending-feedback/<target>.md`
  paper (the federation-sync prompt's FEEDBACK-OUT step). Added to DOCUMENTATION.md
  + the §2.0.1 applicability matrix + README *What's new v2.20* + FEDERATION.md
  recommended-docs + the `lesson-learned-md-template` recipe. **Deliberately a
  SHOULD, staged — kept OUT of the Index of MUSTs** so it does NOT trip the
  `doctor --standards` ledger-completeness gate (CFM-03); promotion to a MUST
  (Index of MUSTs + a presence gate, mgf-common PAPER-99) is a future
  federation-sync wave once broadly adopted. Closes this repo's FEEDBACK PAPER-03.
- chore(registry): regenerate at 0.1.19 — picks up **cornerstone mgf-common
  0.46.4** (catch-up snapshot-provenance advisory, PAPER-98) + self-version
  record. REL-13 GREEN (28 libraries) + CURRENT.

---

## [0.1.18] - 2026-06-06

- **Federation-sync prompt hardening** (`docs/recipes/federation-sync-prompt.md`,
  resolved by `mgf-common sync-prompt` / `/sync`). Closes five gaps a red-team of
  the sync mechanism surfaced across three dimensions — resource access, value
  capture, resumable planning:
  - **STEP 0 ASSERT-LATEST** — verify installed corpus == latest *published* (the
    Codeberg registry, not just whatever the pin resolves to); flag a required
    pin-walk instead of silently syncing to a stale ceiling. Auth-correct: the
    private registry's unauth'd read returns a misleading 404/401 that means
    *authenticate*, not *absent*.
  - **STEP 0 sibling-read** — concrete authenticated raw/API/clone paths to read
    any sibling's current files (no guessing); split from API introspection.
  - **PHASE A** — `A4 PLAN` (`docs/inprogress/<sync>-plan.md`, separate from the
    conformance ledger) + a multi-session RESUME protocol; SCOPE CHECK → the
    `release_waves()` walk order for multi-project syncs.
  - **PHASE B** — an ASK gate (verify on ambiguous/irreversible calls), a durable
    `pending-feedback/<target>.md` FEEDBACK-OUT outbox (reconciles
    read-only-on-the-federation with never-lose-value; challenging the standard
    is first-class), and a LESSON-OUT step appending to `LESSON_LEARNED.md`.
- **New recipe** `docs/recipes/lesson-learned-md-template.md` (indexed in
  `docs/recipes/README.md`) — the append-only per-repo lessons log.
- **FEEDBACK.md** PAPER-03..07 record these evolutions (recipe surface shipped;
  the binding-rule / `mgf-common` CLI parts remain OPEN, staged in
  `pending-feedback/mgf-common.md`).
- chore(registry): regenerate at 0.1.18 — REL-13 GREEN (28 libraries) + CURRENT
  (self-version record).

---

## [0.1.17] - 2026-06-06

- **New recipe: `docs/recipes/federation-update-strategy.md`** — the umbrella
  procedure for updating more than one `mgf-*` project at once: the scope rings
  (R1 one-lib / R2 all-libraries / R3 +consumer-apps), the dependency-ordered
  walk order, how the two existing engines compose (cohort-release-wave +
  federation-sync-prompt), the three-checkpoint close-out proof, and the
  end-to-end runbook. Indexed in `docs/recipes/README.md`; ships as wheel data
  (resolvable via `read_recipe("federation-update-strategy")`).
- **Generated release waves.** `scripts/fed_waves.py` computes the
  dependency-ordered release waves (roots→leaves) from the live roster, dropping
  the two non-build-order edges (`mgf-test-supervisor` dev/test,
  `mgf-standard` `[standards]` extra) and failing loudly on any genuine
  runtime cycle. `scripts/gen_mgf_libraries.py` now embeds the waves as a
  **Release order (waves)** section in `MGF_LIBRARIES.md` and a `release_waves`
  field in `MGF_LIBRARIES.json`, so an agent reading the shipped registry gets
  the walk order, not just the roster. (PR #22.)
- chore(registry): regenerate at 0.1.17 — REL-13 GREEN (28 libraries) + CURRENT
  (self-version record).

---

## [0.1.16] - 2026-06-06

- **Rename: PlasmaMapper → TelePlasma** across the corpus (DOC-14/DOC-15 reference
  shapes, FEDERATION.md, templates, reference-consumers; the consumer profile
  file renamed). The historical extraction tracker keeps the old name as history.
- chore(registry): regenerate for mgf-common 0.46.3 (doctor flat/multi-package +
  deep-namespace layout support). REL-13 GREEN (28 libraries) + CURRENT.

---


---

## [0.1.15] - 2026-06-06

chore(registry): regenerate for mgf-common 0.46.2 (doctor deep-namespace fix). REL-13 GREEN (28 libraries) + CURRENT.

---


---

## [0.1.14] - 2026-06-06

chore(registry): regenerate after the mgf-common 0.46.1 PATCH (doctor --standards shape-detection fix). REL-13 GREEN (28 libraries) + CURRENT.

---


---

## [0.1.13] - 2026-06-06

Standards v2.19 — federation-sync hardening made **binding** (WU7):

- **AG-16 (new MUST):** every project MUST keep the standards corpus resolvable
  to its agents — depend on `mgf-common[standards]` (the Codeberg-only optional
  extra). A plain `mgf-common` install does not carry it and the federation CLI
  degrades loudly. Added to `docs/standards/AGENTS.md` + the README Index of
  MUSTs (216→217) + What's new v2.19.
- **CFM-03 amended:** the conformance ledger MUST account for **every current
  MUST** (✅/🚫/⏳/N/A; out-of-shape = N/A) — mechanically enforced by
  `mgf-common doctor --standards`. A partial ledger is a partial sync.
- **`FEDERATION.md`:** §2 adds the corpus-resolvable commitment (AG-16); the
  header + §2 enforcement note the `[standards]` install and
  `mgf-common doctor --standards`.

---

## [0.1.12] - 2026-06-06

Changed — the federation sync prompt is now an **enforced three-phase**
procedure (federation-sync hardening WU2), so an agent understands the whole
federation before acting and cannot ship a partial sync:

- `docs/recipes/federation-sync-prompt.md` rewritten to **STEP 0 install
  `mgf-common[standards]` + resolve** (with a loud-degrade GUARD — never proceed
  on a degraded CLI) → **PHASE A Comprehend** (no edits; enumerate every
  standard + the contract via `federation()` + the design paper via
  `read_design()` + the registry; emit a coverage map + read-receipt) →
  **PHASE B Conform** (per-rule, every MUST recorded ✅/🚫/⏳/N/A in
  `MGF_STANDARDS_CONFORMANCE.md` — no silent skips) → **PHASE C Verify**
  (`catch-up` + gates + a ledger accounting for every MUST).
- Routes through the new `federation()` / `read_design()` seams (0.1.11) so the
  contract + design are resolvable, and notes the `/sync` command-body lockstep.

---

## [0.1.11] - 2026-06-06

Added — the federation **contract** and **design** papers are now resolvable
through the package (federation-sync hardening WU1, closes discoverability
"Gap A"):

- `mgf.standard.federation()` — the full text of `FEDERATION.md` (the
  DOC-17 contract), shipped as wheel data so an agent resolves the canonical
  duties offline from the pinned version (no checkout / Codeberg URL needed).
- `mgf.standard.design_dir()` / `list_design()` / `read_design()` — the
  foundation design papers (`docs/design/`, the federation-pattern paper),
  shipped as wheel data. The whole picture (rules + contract + design) is now
  package-resolvable, not only the standards corpus.

Fixed:

- `__version__` was frozen at `0.1.6` while the packaged version had advanced
  to `0.1.10` — reconciled to track the packaged version (WF-05 coherence).

---

## [0.1.10] - 2026-06-04

Documentation: PKG-12 is now mechanically enforced (a clarification / PATCH).

### Changed

- **PKG-12 flipped from "(proposed; not yet wired)" to "Enforced."** The
  `no-pypi-publish-surface` grep gate is live: mgf-common ships
  `scripts/check_no_pypi_surface.py` + a `no-pypi-surface` CI step (after
  `lint`) that fails CI if any `mgf-*` publish / token / index / verify surface
  targets pypi.org (allowlisting third-party `--extra-index-url`, comments, and
  historical notes). Siblings copy the cornerstone. The "Mechanical
  enforcement" section drops its "(proposed)" qualifier.

---

## [0.1.9] - 2026-06-04

Registry regen (REL-13) after the mgf-common 0.45 Codeberg cutover + the
federation cohort walk. The shipped `MGF_LIBRARIES.json` / `MGF_LIBRARIES.md`
(the `libraries()` data) now record **mgf-common 0.45.1** and the walked cohort,
so `mgf-common catch-up` / `agents` reflect the current roster instead of the
pre-cutover 0.44.5.

### Changed

- **Registry regenerated** — mgf-common 0.45.1 + the cohort walk: test-supervisor
  0.1.10, http 0.4.6, sqlalchemy 0.5.4, django 0.4.5, apiprobe 0.5.5, hrb 0.1.1,
  alembic 0.4.6, auth 0.1.4, livepush 0.1.4, logship 0.1.2, tele-core 0.1.4,
  tele-teltonika 0.1.4, fastapi 0.6.6, and the vm-core 0.1.3 / firecracker 0.1.1
  / libvirt 0.1.2 / sdk 0.1.2 adapters.

### Known consistency gap (tracked, not a data error)

- The REL-13 gate flags **mgf-vm-forensics** + **mgf-vm-interchange**: they still
  pin `mgf-common<0.45` and cannot be walked yet because they runtime-depend on
  the retiring **mgf-vm** monolith (0.2.2), which exact-pins a broken
  `mgf-vm-core==0.1.0` (`mgf-common<0.44`, unsatisfiable on Codeberg) and is
  being deleted. They unblock once drained off `mgf-vm` (the vm-vmanager-app
  retirement work). (Also pruned the broken `mgf-vm-core 0.1.0` from the Codeberg
  registry — PKG-07/08.)

---

## [0.1.8] - 2026-06-04

Documentation: codify the consumer pattern surfaced by the `mgf-common` 0.45
cutover — no rule-semantic change (a clarification / PATCH).

### Changed

- **`PACKAGE_DISTRIBUTION.md` §6 gains "two rules" for consumers.** (1)
  `mgf-common`'s `mgf-standard` dependency is now OPTIONAL (the
  `mgf-common[standards]` extra, since mgf-common 0.45.1) — core consumers pull
  nothing from Codeberg transitively. (2) uv does NOT apply `[tool.uv.sources]`
  index-pinning to *transitive* dependencies, so a `mgf-*` reached only
  transitively falls back to public PyPI and the resolve breaks; map every
  `mgf-*` you need from Codeberg AND declare it as a **direct** dependency. A
  project running the federation CLI must depend on `mgf-standard` directly
  (dev extra) — not via `mgf-common[standards]`. This is the trap that made
  `mgf-common 0.45.0` unresolvable until 0.45.1.
- **Cookiecutter** `[tool.uv.sources]` comment teaches the same rule.

---

## [0.1.7] - 2026-06-04

Documentation polish on `docs/standards/PACKAGE_DISTRIBUTION.md` — no
rule-semantic change (a wording / PATCH release).

### Changed

- **`PACKAGE_DISTRIBUTION.md` de-chronicled + a PKG-12 consistency fix.**
  The header's "§11 wiring … *lands* in the same DOC-18 wave" → "*landed*"
  (it has — with the retargeted surfaces named). §13's "Still requires live
  confirmation" block → "**Confirmed live (2026-06-03 cutover …)**" now that
  the registry, token scopes, uv per-index env-var names, and quota are
  verified end-to-end. **PKG-12** no longer overclaims enforcement:
  "Enforced by a grep gate" → "To be enforced by a `no-pypi-publish-surface`
  grep gate (§ Mechanical enforcement — proposed; not yet wired into CI)",
  matching the "(proposed)" enforcement section. The grep gate itself
  remains unimplemented (a tracked follow-up).

---

## [0.1.6] - 2026-06-03

The **Codeberg package-distribution release** — the federation moves all `mgf-*`
package distribution off `pypi.org` and onto Codeberg's PyPI-compatible registry
(the `magogi-admin` account). Adds the new L1 standard
[`docs/standards/PACKAGE_DISTRIBUTION.md`](docs/standards/PACKAGE_DISTRIBUTION.md)
(rules **PKG-01..PKG-12**) and wires every coupled surface to it. Third-party
dependencies still resolve from public PyPI — only `mgf-*` publishing/resolution
moves (a channel switch, not a severance). Verified end-to-end against the live
registry: this package + 14 siblings published, REST-verified, clean-venv
installed from the Codeberg index.

### Added

- **`docs/standards/PACKAGE_DISTRIBUTION.md`** — the Codeberg PyPI registry
  standard: endpoints, `write:package` / `read:package` token auth, the ordered
  publish flow, the dependency-confusion-safe consumer config (uv named index +
  `[tool.uv.sources]`), REST verify-after-publish, immutability + retention, and
  a Woodpecker publish/verify sketch. Rules **PKG-01..PKG-12**.

### Changed

- **Dropped `pypi.org` as the `mgf-*` publish/distribution channel (hard
  cutover).** Retargeted the release corpus to Codeberg: RELEASING (REL-04/05/06),
  WORKFLOWS (WF-03/04/06/08), WORKFLOWS_PATTERNS §4.2/4.3, `.woodpecker.yml`
  (publish + verify-codeberg), AGENTS **AG-09**, NAMING **NM-01** package URL, the
  cohort-release / sibling-rename / federation-sync recipes, DEPLOYMENT **DEP-03**,
  SECURITY (delete/yank model), and the `mgf-*` links in COMMON_COMPONENTS /
  API_DESIGN / DOCUMENTATION. Removed all OIDC / PyPI Trusted-Publisher references
  (Forgejo has none). Third-party PyPI links kept.
- **Cookiecutter template** now scaffolds the Codeberg index + `[tool.uv.sources]`
  for new projects.
- README *Index of MUSTs* gains the **PKG-*** rows + a *What's new in v2.18* entry.

---

## [0.1.5] - 2026-06-03

The **standards meta-review completion release** — ships the v2.16
over-restriction pass (Tier 3) and the v2.17 single-source-of-truth pass
(Tier 4) as resolvable wheel data, so `mgf-common standards` / `agents` now
surface every mechanism-lock relaxation (TS-23 / PF-05 / DEP-06 + the four
single-mechanism bans), the per-rule applies-to scoping, the three
review-methodology recipes, and the full SSOT/dedup pass. With this release
the entire 24-update (U-01..U-24) standards meta-review is live in the
resolvable corpus. No `mgf.standard` Python API change — docs/data only.

### Changed

- **Standards v2.17 — the single-source-of-truth pass (Tier 4, final tier of
  the standards meta-review).** Backward-compat waived; zero new MUSTs; no rule
  weakened — removes drift surface, not obligations. **Evidence/confidence
  grammar (U-20)** given one canonical home (the Agent Empowerment Charter),
  referenced from AG-11 / `audit-outcomes` / the conformance template instead of
  restated. **Duplicated normative content collapsed (U-21):** the
  serialised-time / UI-render / pydantic-validator tables moved to **TIME.md
  §3.1** (DESIGN_PRINCIPLES §12 + DP-12 point there); the reserved-log-key set
  sourced from the `_RESERVED` frozenset in **LOGGING.md** (§5.4 imports it,
  §12.1 points at it); WORKFLOWS_PATTERNS §4.2 verify-PyPI block points at its §8
  copy. **Two CHANGELOG references corrected (U-22)** (API_DESIGN AP-12 + §13
  item); the proposed multi-encoding collapse was **declined as load-bearing**
  (each surface carries distinct weight) — the licensed "no change needed, with
  rationale." **Frozen chronicles → durable lessons (U-23):** the NAMING §4
  ~480-URL ledger, PRESENTATION_LAYER §8.1/§8.2 commit SHAs + dated snapshot,
  TESTING §13.10/§17/§19.6 counts + coverage-% + rollout history, and the
  DOCUMENTATION DOC-01 v2.8-amendment narrative now state the lesson and mark
  live numbers illustrative / non-binding. **Two implicit seams made explicit
  (U-24):** DOCUMENTATION §10.4 states propagation crosses repo boundaries (the
  `mgf-common` AGENTS-briefing / `standards` CLI surface, supervisor-applied per
  AG-13) + the `MGF_ADOPTION.md` coupling; COMMON_COMPONENTS §2 + CONFIGURATION
  §0b name the implicit `BaseAppSettings` footprint a partial adopter inherits
  (CF-02/03/06/08 discharged for free; `extra="forbid"` + `version` defaults).
- **Standards v2.16 — the over-restriction pass.** Applies the v2.14 §14.1
  "bind the outcome, name the mechanism" discipline to mechanism-locked rules
  (Tier 3 of the standards meta-review; backward-compat waived; zero new MUSTs;
  no outcome weakened, no mechanism guidance deleted). **TS-23** rebound to the
  four crash/hang/signal-capture outcomes (the stdlib-only subprocess supervisor
  stays the canonical reference; an equivalent that meets the outcomes is
  conformant — the case `mgf-standard`'s own cycle-avoidance decline needs).
  **PF-05** rebound to the result shape + corrected the stale "not-yet-shipped"
  status (`mgf-common bench` + its `tests/perf/` conftest ship today).
  **DEP-06** rebound to a documented/drill-measured/bounded rollback time
  (≤5 min as the SHOULD-target for instant-cutover; a justified higher bound for
  snapshot-restore). **Four single-mechanism bans relaxed (U-15):** the
  structlog/loguru ban → the LG-* output contract; `.ui`-only → a dynamic-form
  escape hatch; EH-13 breaker-on-any-call → the bounded-amplification outcome;
  PR-06 import-linter → a stdlib-allowlist AST meta-test (import-linter demoted
  to defense-in-depth). **DOC-09** gains behavioral-claim verification (SHOULD)
  + §10.3 generated-docs-fixed-at-source + an origin tag. **TESTING** states
  coverage-% is a floor and behavioral adequacy is the bar (new §9.5 +
  design-for-testability finding). Verified against live mgf-common/mgf-test-
  supervisor so the named mechanisms match what ships (the v2.15 HostError
  lesson). **Per-rule applies-to scoping (U-16):** new DESIGN_PRINCIPLES
  §14.2 makes a shape-specific rule declare its scope (via the existing
  `(service)` / level column, the `applies_to` per-kind matrix, or the audit
  `N/A` flag) instead of over-claiming a universal MUST; the Agent
  Empowerment Charter §3 adds the scope-over-universality license (propose a
  carve-out / new category at decision time rather than contort); and
  ERROR_HANDLING §2.2 names its seven categories the CLI/desktop/SDK baseline
  with the "add a domain set + propose upstream" path (the web HTTP set as
  the worked example).

---

## [0.1.4] - 2026-06-02

The **standards corpus correctness + empowerment release** — ships the
v2.14 empowerment layer and the v2.15 foundation correctness pass as
resolvable wheel data (so `mgf-common standards` / `agents` surface the
Agent Empowerment Charter, AG-15, the project-MODE axis, and every
v2.15 fix). No `mgf.standard` Python API change — docs/data only.

### Changed

- **Standards v2.15 — the foundation correctness pass.** Resolves verified
  self-contradictions so the cornerstone is internally consistent (Tier 2
  of the standards meta-review; backward compatibility waived; zero new
  MUSTs — each change resolves a contradiction, corrects a factual error,
  or rebinds a rule to its OUTCOME per §14.1). Highlights: one canonical Qt
  worker contract (GUI-02 rebound to the off-thread / one-terminal-signal /
  cancellation-is-not-failure invariant; COMMON_COMPONENTS §8 +
  DESIGN_PRINCIPLES §2.1 + ERROR_HANDLING §5 realigned to it; the disjoint
  `progress`/`finished_with_result`/`error` vocabulary removed); DOC-01
  doc-count reconciled to the uniform ten-doc baseline across every live
  surface + the stale lint description; TS-14 deferred to PF-01/PF-02 for
  perf-budget shape; OBSERVABILITY named owner of the canonical `LogRecord`
  wire (LOGGING §5.3 = its Python reference emitter); factual fixes (SC-05
  Fernet=CBC+HMAC not GCM-SIV; SC-15 `resolve()` vs `strict=True`;
  undefined `L0`→L1; SCOPE §5 closed-box definition; OB redaction cite;
  `mgf-common doctor --standards` spelling); and clarity/safety fixes
  (LOGGING/CONFIGURATION §16 renumber; error category
  `EnvironmentError`→`HostEnvironmentError` (matches the shipped mgf-common
  class, API-01; stops shadowing the OSError builtin); single `<100 ms`
  smoke budget; `SECURITY_STANDARD.md` link/marker fixes; SC-14
  "rotate"→checkable backoff/lockout contract). The error-category name now
  matches the already-shipped mgf-common `HostEnvironmentError` (alias
  removed in v0.33.0) — no mgf-common code change needed. Release-coupled
  (AG-13): the AG-15 briefing line + the standards-CLI corpus reflecting
  v2.14/v2.15 land at the next mgf-standard release + pin bump.
- **Standards v2.14 — the empowerment layer.** Makes the AI-agent
  empowerment posture explicit and agent-facing, fused with the corpus's
  existing consistency guarantee (adds license, removes no rule). New
  `docs/standards/principles/agent-empowerment-charter.md` — the agent's
  explicit license to push back / propose / refine scope / ask /
  decline-with-rationale / conclude "no change needed" — plus the binding
  hook `AGENTS.md` **AG-15**. The standards README gains the project-MODE
  axis (greenfield / unconstrained-brownfield / production-constrained,
  orthogonal to L1/L2/L3) and backfills the AG-01..AG-15 family into the
  Index of MUSTs. `DESIGN_PRINCIPLES.md` §14.1 adds the two-way
  concrete-cost / outcome-over-mechanism authoring discipline.
  `principles/audit-outcomes.md` and the shipped
  `docs/recipes/mgf-standards-conformance-md-template.md` gain the
  holistic "reviewed; no change needed" / could-not-verify /
  considered-and-rejected verdicts. Tier 1 (U-01..U-06) of the standards
  meta-review.

---

## [0.1.3] - 2026-06-02

The **recipes corpus becomes resolvable data** — the same *resolve, don't
copy* move applied to the federation-operations recipes, so the `mgf-common`
CLI can surface a governance recipe (notably the `/sync` federation sync
prompt) from the version a consumer pins instead of a hand-copied,
drift-prone command body.

### Added

- **`mgf.standard.recipes_dir()` / `list_recipes()` / `read_recipe(name)`**
  — a public seam over `docs/recipes/`, mirroring the standards trio. Shipped
  as wheel data (`mgf/standard/_recipes/`, force-included from
  `docs/recipes/`), with the editable-install fallback to the repo path.
  Enables a future `mgf-common sync-prompt` / `mgf-common recipes <name>`
  that prints `read_recipe("federation-sync-prompt")` — one source of truth
  for the `/sync` command body.

### Changed

- The federation **sync prompt** (`docs/recipes/federation-sync-prompt.md`)
  now leads with the CLI-resolve path (`mgf-common agents` / `standards` /
  `catch-up`) and classifies a project as NEW / IN-SYNC / OUT-OF-SYNC, so one
  prompt serves all three onboarding states.
- Internal: `standards_dir()` and `recipes_dir()` now share a
  `_docs_data_dir()` resolver (behaviour-preserving for `standards_dir`).

---

## [0.1.2] - 2026-06-01

The federation **registry becomes resolvable data** — the drift-proof way for
an AI agent to learn the *other* federation projects (the roster + dependency
graph), from the version it pins rather than a hand-copied list.

### Added

- **`mgf.standard.libraries()`** — a public seam returning the federation
  library registry: every `mgf-*` member with its version, `deps`, reverse-deps
  (`used_by`), `extras`, third-party footprint, and purpose.
- **`MGF_LIBRARIES.json`** — `scripts/gen_mgf_libraries.py` now also emits a
  deterministic machine-readable registry, force-included into the wheel
  (`mgf/standard/_libraries.json`). The REL-13 currency gate (`--check`)
  guards it alongside `MGF_LIBRARIES.md`. `mgf-common` 0.44.2 surfaces it as a
  live "Federation map / you are here" block under `mgf-common agents`.

---

## [0.1.1] - 2026-06-01

Second extraction wave — the remaining **federation-level artifacts**
(templates, reference evidence, conformance tooling, process recipes) join the
corpus, and the shipped standards corpus' cross-repo links are repaired.

### Added

- **Reference-consumer evidence profiles** (`docs/reference-consumers/`) — the
  per-consumer adoption profiles the standards cite as real-world evidence.
- **Federation new-project scaffold** (`templates/cookiecutter-mgf-project/`) —
  the cookiecutter that stamps a standards-conformant `mgf-*` repo.
- **PR-conformance auditor** (`scripts/audit_pr_conformance.py`) — cross-checks
  a project's PRESENTATION_LAYER (PR-*) conformance tracker against live
  `import-linter` output; a federation guard any sibling can wire into CI.
- **Five more process recipes/templates** (`docs/recipes/`):
  `deps-md-template.md`, `feedback-md-template.md`,
  `pr-standard-test-plan-template.md`, `library-app-separation.md`,
  `test-supervisor-adoption.md`.

### Fixed

- **Corpus cross-repo links (DOC-09)** — links in the shipped `docs/standards/`
  corpus that targeted content which stayed in `mgf-common` (tests, `docs/`
  subtrees, README, recipes, CHANGELOG) now resolve to the `mgf-common`
  Codeberg URL; links to content that moved here resolve locally. The wheel
  data is corrected accordingly.

### Changed

- The agent briefing's feedback-routing (mirrored in `mgf-common`'s test-pinned
  constant + `STARTHERE.md`) now routes standards / contract / registry
  feedback to **this** repo's `FEEDBACK.md`.

---

## [0.1.0] - 2026-06-01

### Added

- **Engineering-standards corpus** (`docs/standards/`) extracted from
  `mgf-common` — the AP / CF / EH / LG / SC / TS / DP / DOC / NM / OB /
  PF / AG / TM / … rule families, master index, and per-topic Rules boxes.
  `mgf-standard` is now the federation's single source of truth for
  every rule; `mgf-common` and every sibling reference this copy.
- **Federation contract** (`FEDERATION.md`) — the canonical contract every
  `mgf-*` repo ships a pointer stub (DOC-17) to. Previously lived in
  `mgf-common`; now has a stable home independent of the implementation.
- **Library registry** (`MGF_LIBRARIES.md`) + its generator
  (`scripts/gen_mgf_libraries.py`) + the companion test — extracted from
  `mgf-common`. The REL-13 consistency gate (`--check`) runs against this
  repo; every release of `mgf-common` or any sibling must pass it.
- **Federation-pattern design paper** (`docs/design/federation.md`) —
  the architecture paper explaining why `mgf-common` is a leaf with
  siblings rather than a monolith. The canonical reference for the ASPIRE-06
  closures and the dependency-graph invariants.
- **Federation-operations recipes and templates** (`docs/recipes/`) —
  `sibling_rename.md`, `cohort-release-wave.md`, `federation-sync-prompt.md`,
  `federation-pointer-stub-template.md`, `mgf-adoption-md-template.md`, and
  `mgf-standards-conformance-md-template.md`. These are governance and
  operations documents for the federation; library-usage how-tos remain in
  `mgf-common/docs/recipes/`.
- **Zero-dependency resolver package** `mgf.standard`
  (`src/mgf/standard/`) — ships the corpus as wheel data and exposes
  three typed helpers: `standards_dir()`, `list_standards()`,
  `read_standard(topic)`. `mgf-common`'s `standards`/`agents` CLI commands
  resolve the corpus through this package. Runtime dependencies: none.
  `mgf-standard` is the federation leaf-of-leaves; it sits *below*
  `mgf-common` in the dependency graph.

[Unreleased]: https://codeberg.org/magogi-admin/mgf-standard/compare/v0.1.6...HEAD
[0.1.6]: https://codeberg.org/magogi-admin/mgf-standard/compare/v0.1.5...v0.1.6
[0.1.5]: https://codeberg.org/magogi-admin/mgf-standard/compare/v0.1.4...v0.1.5
[0.1.0]: https://codeberg.org/magogi-admin/mgf-standard/releases/tag/v0.1.0
