# Changelog All notable changes to `event4u/agent-config` are documented here. Format loosely follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/); versioning policy is documented in [CONTRIBUTING.md](CONTRIBUTING.md#versioning-policy). Entry-shape contract: [`docs/contracts/CHANGELOG-conventions.md`](docs/contracts/CHANGELOG-conventions.md). > Entries before 1.3.3 were reconstructed from git history after the fact. > Early releases did not maintain release notes. > > History is split into **eras**. The current era keeps full entries > inline; prior eras collapse into a single pointer to an archive file > under [`docs/archive/`](docs/archive/). A drift test > (`tests/lib/changelog_eras.test.ts`) forces an era split before the > current era grows past 250 lines. > **Retro-curation disposition, 2026-09-01** — roadmap > `road-to-publication-integrity-hard-fail`, blocker `b-retro-curation-scope`, > option (c). The `### Release highlights` heads of 14.9.0 through 14.13.0 were > written by the release generator and published without the editorial pass they > ask for. Two things were repaired: the generator's own authoring instruction, > which was never release content, is deleted from this file, and the writer no > longer emits it. The generator-derived head lines below are **preserved as > published** and deliberately not paraphrased — rewriting a derived claim is > editorial judgement two prior councils reserved, and a paraphrase of the > generator's own reason would be truthfully documented uselessness. > [`docs/archive/`](docs/archive/) is left untouched as historical record. The > annotated tag messages and the published GitHub Release bodies for 14.9.0 > through 14.13.0 are **immutable** and cannot be repaired at all. ## [Unreleased] _Nothing staged._ Twenty entries that had accumulated here were drained to [`docs/archive/CHANGELOG-unreleased-drain-2026-10.md`](docs/archive/CHANGELOG-unreleased-drain-2026-10.md) on 2026-10-13; every one of them had already shipped, the oldest in 9.7.0. An entry belongs under a dated release section, not here — see [`docs/contracts/CHANGELOG-conventions.md`](docs/contracts/CHANGELOG-conventions.md). # Era: pre-4.5.0 — archived > All entries before `4.5.0` live in > [`docs/archive/CHANGELOG-pre-4.5.0.md`](docs/archive/CHANGELOG-pre-4.5.0.md). > The archive is read-only; git tags remain the canonical > source for what shipped. Splitting them out of the main file > keeps the active era under the 250-line drift cap enforced by > `tests/lib/changelog_eras.test.ts`. # Era: pre-5.4.0 — archived > All entries before `5.4.0` live in > [`docs/archive/CHANGELOG-pre-5.4.0.md`](docs/archive/CHANGELOG-pre-5.4.0.md). > The archive is read-only; git tags remain the canonical > source for what shipped. Splitting them out of the main file > keeps the active era under the 250-line drift cap enforced by > `tests/lib/changelog_eras.test.ts`. # Era: pre-5.9.0 — archived > All entries before `5.9.0` live in > [`docs/archive/CHANGELOG-pre-5.9.0.md`](docs/archive/CHANGELOG-pre-5.9.0.md). > The archive is read-only; git tags remain the canonical > source for what shipped. Splitting them out of the main file > keeps the active era under the 250-line drift cap enforced by > `tests/lib/changelog_eras.test.ts`. # Era: pre-6.0.0 — archived > All entries before `6.0.0` live in > [`docs/archive/CHANGELOG-pre-6.0.0.md`](docs/archive/CHANGELOG-pre-6.0.0.md). > The archive is read-only; git tags remain the canonical > source for what shipped. Splitting them out of the main file > keeps the active era under the 250-line drift cap enforced by > `tests/lib/changelog_eras.test.ts`. # Era: pre-7.0.0 — archived > All entries before `7.0.0` live in > [`docs/archive/CHANGELOG-pre-7.0.0.md`](docs/archive/CHANGELOG-pre-7.0.0.md). > The archive is read-only; git tags remain the canonical > source for what shipped. Splitting them out of the main file > keeps the active era under the 250-line drift cap enforced by > `tests/lib/changelog_eras.test.ts`. # Era: pre-8.0.0 — archived > All entries before `8.0.0` live in > [`docs/archive/CHANGELOG-pre-8.0.0.md`](docs/archive/CHANGELOG-pre-8.0.0.md). > The archive is read-only; git tags remain the canonical > source for what shipped. Splitting them out of the main file > keeps the active era under the 250-line drift cap enforced by > `tests/lib/changelog_eras.test.ts`. # Era: pre-8.1.0 — archived > All entries before `8.1.0` live in > [`docs/archive/CHANGELOG-pre-8.1.0.md`](docs/archive/CHANGELOG-pre-8.1.0.md). > The archive is read-only; git tags remain the canonical > source for what shipped. Splitting them out of the main file > keeps the active era under the 250-line drift cap enforced by > `tests/lib/changelog_eras.test.ts`. # Era: pre-8.9.0 — archived > All entries before `8.9.0` live in > [`docs/archive/CHANGELOG-pre-8.9.0.md`](docs/archive/CHANGELOG-pre-8.9.0.md). > The archive is read-only; git tags remain the canonical > source for what shipped. Splitting them out of the main file > keeps the active era under the 250-line drift cap enforced by > `tests/lib/changelog_eras.test.ts`. # Era: pre-8.12.0 — archived > All entries before `8.12.0` live in > [`docs/archive/CHANGELOG-pre-8.12.0.md`](docs/archive/CHANGELOG-pre-8.12.0.md). > The archive is read-only; git tags remain the canonical > source for what shipped. Splitting them out of the main file > keeps the active era under the 250-line drift cap enforced by > `tests/lib/changelog_eras.test.ts`. # Era: pre-9.2.0 — archived > All entries before `9.2.0` live in > [`docs/archive/CHANGELOG-pre-9.2.0.md`](docs/archive/CHANGELOG-pre-9.2.0.md). > The archive is read-only; git tags remain the canonical > source for what shipped. Splitting them out of the main file > keeps the active era under the 250-line drift cap enforced by > `tests/lib/changelog_eras.test.ts`. # Era: pre-9.9.0 — archived > All entries before `9.9.0` live in > [`docs/archive/CHANGELOG-pre-9.9.0.md`](docs/archive/CHANGELOG-pre-9.9.0.md). > The archive is read-only; git tags remain the canonical > source for what shipped. Splitting them out of the main file > keeps the active era under the 250-line drift cap enforced by > `tests/test_changelog_eras.py`. # Era: pre-9.10.0 — archived > All entries before `9.10.0` live in > [`docs/archive/CHANGELOG-pre-9.10.0.md`](docs/archive/CHANGELOG-pre-9.10.0.md). > The archive is read-only; git tags remain the canonical > source for what shipped. Splitting them out of the main file > keeps the active era under the 250-line drift cap enforced by > `tests/test_changelog_eras.py`. # Era: pre-9.13.0 — archived > All entries before `9.13.0` live in > [`docs/archive/CHANGELOG-pre-9.13.0.md`](docs/archive/CHANGELOG-pre-9.13.0.md). > The archive is read-only; git tags remain the canonical > source for what shipped. Splitting them out of the main file > keeps the active era under the 250-line drift cap enforced by > `tests/test_changelog_eras.py`. # Era: pre-9.15.0 — archived > All entries before `9.15.0` live in > [`docs/archive/CHANGELOG-pre-9.15.0.md`](docs/archive/CHANGELOG-pre-9.15.0.md). > The archive is read-only; git tags remain the canonical > source for what shipped. Splitting them out of the main file > keeps the active era under the 250-line drift cap enforced by > `tests/test_changelog_eras.py`. # Era: pre-9.18.0 — archived > All entries before `9.18.0` live in > [`docs/archive/CHANGELOG-pre-9.18.0.md`](docs/archive/CHANGELOG-pre-9.18.0.md). > The archive is read-only; git tags remain the canonical > source for what shipped. Splitting them out of the main file > keeps the active era under the 250-line drift cap enforced by > `tests/test_changelog_eras.py`. # Era: pre-9.23.0 — archived > All entries before `9.23.0` live in > [`docs/archive/CHANGELOG-pre-9.23.0.md`](docs/archive/CHANGELOG-pre-9.23.0.md). > The archive is read-only; git tags remain the canonical > source for what shipped. Splitting them out of the main file > keeps the active era under the 250-line drift cap enforced by > `tests/test_changelog_eras.py`. # Era: pre-9.27.0 — archived > All entries before `9.27.0` live in > [`docs/archive/CHANGELOG-pre-9.27.0.md`](docs/archive/CHANGELOG-pre-9.27.0.md). > The archive is read-only; git tags remain the canonical > source for what shipped. Splitting them out of the main file > keeps the active era under the 250-line drift cap enforced by > `tests/test_changelog_eras.py`. # Era: pre-9.31.0 — archived > All entries before `9.31.0` live in > [`docs/archive/CHANGELOG-pre-9.31.0.md`](docs/archive/CHANGELOG-pre-9.31.0.md). > The archive is read-only; git tags remain the canonical > source for what shipped. Splitting them out of the main file > keeps the active era under the 250-line drift cap enforced by > `tests/test_changelog_eras.py`. # Era: pre-9.34.0 — archived > All entries before `9.34.0` live in > [`docs/archive/CHANGELOG-pre-9.34.0.md`](docs/archive/CHANGELOG-pre-9.34.0.md). > The archive is read-only; git tags remain the canonical > source for what shipped. Splitting them out of the main file > keeps the active era under the 250-line drift cap enforced by > `tests/test_changelog_eras.py`. # Era: pre-9.36.0 — archived > All entries before `9.36.0` live in > [`docs/archive/CHANGELOG-pre-9.36.0.md`](docs/archive/CHANGELOG-pre-9.36.0.md). > The archive is read-only; git tags remain the canonical > source for what shipped. Splitting them out of the main file > keeps the active era under the 250-line drift cap enforced by > `tests/test_changelog_eras.py`. # Era: pre-10.3.0 — archived > All entries before `10.3.0` live in > [`docs/archive/CHANGELOG-pre-10.3.0.md`](docs/archive/CHANGELOG-pre-10.3.0.md). > The archive is read-only; git tags remain the canonical > source for what shipped. Splitting them out of the main file > keeps the active era under the 250-line drift cap enforced by > `tests/test_changelog_eras.py`. # Era: pre-12.0.0 — archived > All entries before `12.0.0` live in > [`docs/archive/CHANGELOG-pre-12.0.0.md`](docs/archive/CHANGELOG-pre-12.0.0.md). > The archive is read-only; git tags remain the canonical > source for what shipped. Splitting them out of the main file > keeps the active era under the 250-line drift cap enforced by > `tests/test_changelog_eras.py`. # Era: pre-14.0.0 — archived > All entries before `14.0.0` live in > [`docs/archive/CHANGELOG-pre-14.0.0.md`](docs/archive/CHANGELOG-pre-14.0.0.md). > The archive is read-only; git tags remain the canonical > source for what shipped. Splitting them out of the main file > keeps the active era under the 250-line drift cap enforced by > `tests/test_changelog_eras.py`. # Era: pre-14.3.0 — archived > All entries before `14.3.0` live in > [`docs/archive/CHANGELOG-pre-14.3.0.md`](docs/archive/CHANGELOG-pre-14.3.0.md). > The archive is read-only; git tags remain the canonical > source for what shipped. Splitting them out of the main file > keeps the active era under the 250-line drift cap enforced by > `tests/test_changelog_eras.py`. # Era: pre-14.5.0 — archived > All entries before `14.5.0` live in > [`docs/archive/CHANGELOG-pre-14.5.0.md`](docs/archive/CHANGELOG-pre-14.5.0.md). > The archive is read-only; git tags remain the canonical > source for what shipped. Splitting them out of the main file > keeps the active era under the 250-line drift cap enforced by > `tests/test_changelog_eras.py`. # Era: pre-14.8.0 — archived > All entries before `14.8.0` live in > [`docs/archive/CHANGELOG-pre-14.8.0.md`](docs/archive/CHANGELOG-pre-14.8.0.md). > The archive is read-only; git tags remain the canonical > source for what shipped. Splitting them out of the main file > keeps the active era under the 250-line drift cap enforced by > `tests/test_changelog_eras.py`. # Era: pre-14.9.0 — archived > All entries before `14.9.0` live in > [`docs/archive/CHANGELOG-pre-14.9.0.md`](docs/archive/CHANGELOG-pre-14.9.0.md). > The archive is read-only; git tags remain the canonical > source for what shipped. Splitting them out of the main file > keeps the active era under the 250-line drift cap enforced by > `tests/test_changelog_eras.py`. # Era: pre-14.12.0 — archived > All entries before `14.12.0` live in > [`docs/archive/CHANGELOG-pre-14.12.0.md`](docs/archive/CHANGELOG-pre-14.12.0.md). > The archive is read-only; git tags remain the canonical > source for what shipped. Splitting them out of the main file > keeps the active era under the 250-line drift cap enforced by > `tests/test_changelog_eras.py`. # Era: pre-14.14.0 — archived > All entries before `14.14.0` live in > [`docs/archive/CHANGELOG-pre-14.14.0.md`](docs/archive/CHANGELOG-pre-14.14.0.md). > The archive is read-only; git tags remain the canonical > source for what shipped. Splitting them out of the main file > keeps the active era under the 250-line drift cap enforced by > `tests/test_changelog_eras.py`. # Era: pre-14.17.0 — archived > All entries before `14.17.0` live in > [`docs/archive/CHANGELOG-pre-14.17.0.md`](docs/archive/CHANGELOG-pre-14.17.0.md). > The archive is read-only; git tags remain the canonical > source for what shipped. Splitting them out of the main file > keeps the active era under the 250-line drift cap enforced by > `tests/test_changelog_eras.py`. # Era: pre-14.18.0 — archived > All entries before `14.18.0` live in > [`docs/archive/CHANGELOG-pre-14.18.0.md`](docs/archive/CHANGELOG-pre-14.18.0.md). > The archive is read-only; git tags remain the canonical > source for what shipped. Splitting them out of the main file > keeps the active era under the 250-line drift cap enforced by > `tests/test_changelog_eras.py`. # Era: pre-14.19.0 — archived > All entries before `14.19.0` live in > [`docs/archive/CHANGELOG-pre-14.19.0.md`](docs/archive/CHANGELOG-pre-14.19.0.md). > The archive is read-only; git tags remain the canonical > source for what shipped. Splitting them out of the main file > keeps the active era under the 250-line drift cap enforced by > `tests/test_changelog_eras.py`. # Era: pre-14.20.0 — archived > All entries before `14.20.0` live in > [`docs/archive/CHANGELOG-pre-14.20.0.md`](docs/archive/CHANGELOG-pre-14.20.0.md). > The archive is read-only; git tags remain the canonical > source for what shipped. Splitting them out of the main file > keeps the active era under the 250-line drift cap enforced by > `tests/test_changelog_eras.py`. # Era: pre-14.23.0 — archived > All entries before `14.23.0` live in > [`docs/archive/CHANGELOG-pre-14.23.0.md`](docs/archive/CHANGELOG-pre-14.23.0.md). > The archive is read-only; git tags remain the canonical > source for what shipped. Splitting them out of the main file > keeps the active era under the 250-line drift cap enforced by > `tests/test_changelog_eras.py`. # Era: pre-16.0.0 — archived > All entries before `16.0.0` live in > [`docs/archive/CHANGELOG-pre-16.0.0.md`](docs/archive/CHANGELOG-pre-16.0.0.md). > The archive is read-only; git tags remain the canonical > source for what shipped. Splitting them out of the main file > keeps the active era under the 250-line drift cap enforced by > `tests/test_changelog_eras.py`. # Era: pre-16.1.0 — archived > All entries before `16.1.0` live in > [`docs/archive/CHANGELOG-pre-16.1.0.md`](docs/archive/CHANGELOG-pre-16.1.0.md). > The archive is read-only; git tags remain the canonical > source for what shipped. Splitting them out of the main file > keeps the active era under the 250-line drift cap enforced by > `tests/test_changelog_eras.py`. # Era: pre-16.2.0 — archived > All entries before `16.2.0` live in > [`docs/archive/CHANGELOG-pre-16.2.0.md`](docs/archive/CHANGELOG-pre-16.2.0.md). > The archive is read-only; git tags remain the canonical > source for what shipped. Splitting them out of the main file > keeps the active era under the 250-line drift cap enforced by > `tests/test_changelog_eras.py`. # Era: pre-16.3.0 — archived > All entries before `16.3.0` live in > [`docs/archive/CHANGELOG-pre-16.3.0.md`](docs/archive/CHANGELOG-pre-16.3.0.md). > The archive is read-only; git tags remain the canonical > source for what shipped. Splitting them out of the main file > keeps the active era under the 250-line drift cap enforced by > `tests/test_changelog_eras.py`. # Era: pre-16.5.0 — archived > All entries before `16.5.0` live in > [`docs/archive/CHANGELOG-pre-16.5.0.md`](docs/archive/CHANGELOG-pre-16.5.0.md). > The archive is read-only; git tags remain the canonical > source for what shipped. Splitting them out of the main file > keeps the active era under the 250-line drift cap enforced by > `tests/test_changelog_eras.py`. # Era: pre-17.1.0 — archived > All entries before `17.1.0` live in > [`docs/archive/CHANGELOG-pre-17.1.0.md`](docs/archive/CHANGELOG-pre-17.1.0.md). > The archive is read-only; git tags remain the canonical > source for what shipped. Splitting them out of the main file > keeps the active era under the 250-line drift cap enforced by > `tests/test_changelog_eras.py`. # Era: pre-17.4.0 — archived > All entries before `17.4.0` live in > [`docs/archive/CHANGELOG-pre-17.4.0.md`](docs/archive/CHANGELOG-pre-17.4.0.md). > The archive is read-only; git tags remain the canonical > source for what shipped. Splitting them out of the main file > keeps the active era under the 250-line drift cap enforced by > `tests/test_changelog_eras.py`. # Era: 17.4.x — current > Started at `17.4.0`. Full entries live inline below. > The drift test caps this era at 250 lines of entry body; growth past > that forces a new era split (`# Era: 17.5.x`, etc.) — see > [`docs/contracts/CHANGELOG-conventions.md § Era splits`](docs/contracts/CHANGELOG-conventions.md). ## [17.4.0](https://github.com/event4u-app/agent-config/compare/17.3.0...17.4.0) (2026-10-24) ### Release highlights - **Behaviour changes:** schema for a source-free mechanism decision ledger (a50af39). - **Default changes + migration:** a local estate index of packages and exports, off by default (be0676a). Breaking, pending in `BREAKING_CHANGES.md` and shipped by this release: **Three `fail_closed` hook guards run where they were silent.** The installed claude hook command now reaches a dispatcher staged under `~/.event4u/agent-config/runtime/` after a project-local install and before `PATH` ([`3f8c98e`](https://github.com/event4u-app/agent-config/commit/3f8c98e74), #2455). On machines installed through `npx`, or hosts launched with a bare `PATH`, every hook command used to end in a silent `exit 0`; there `block-no-verify` (refuses `git … --no-verify` and `core.hooksPath` overrides), `block-kernel-rule-writes` and `block-plumbing-writes` (refuse agent writes to this package's kernel rules and hook plumbing) now run and may refuse a tool call for the first time. Classed breaking by the AI council, 2026-10-19 (`agents/evidence/council/hook-carrier-release-note-class-20261019.md`). **`uninstall --global --purge` stops being a recursive delete of the host anchor.** Old scope: `fs.rmSync(anchor, { recursive: true })` on whole host configuration roots — `~/.claude/`, `~/.codex/`, `~/.config/zed/` — so everything under them went, whoever wrote it. New scope: only the anchor-relative paths this package's own deploy inventory recorded writing; the anchor itself is never removed, directories are pruned only when left empty, a recorded symlink is unlinked rather than followed, and a purge with no readable inventory for that anchor exits 1 having deleted nothing. A second change in the same area: a plain `uninstall --global` now keeps the lockfile while recorded content is still on disk, where it used to delete it. - **Security and correctness:** install the pinned version globally before writing the pin (aadcb27); treat collector limits as capacities and validate health (3993d80); the mutation suite copies egress_normalize.ts with the engine it now imports (f1c732a); treat the someone-else fixture slug as a placeholder (a94fbee); key registry entries per checkout so clones keep their own (eaa4055); keep a worktree build from overwriting the main checkout's entry (cbd8c23); +28 more. - **Honest nulls:** _none_ - **Known limitations:** the Rails provider (src/scripts/code_graph/providers/catalog.ts declares a residual) (e93491f); Spring controllers render the view they name (src/scripts/code_graph/providers/catalog.ts declares a residual) (d94f2fb); prefix Django routes with the include() that reaches them (src/scripts/code_graph/providers/catalog.ts declares a residual) (c39b45e). > **Governance mix:** governance-only 49 vs consumer-only 2 (mixed 70, maintenance 21; taxonomy 1.1.0; range b31d12006f93..65ac68606432). ### Features * **doctor:** the version axis compares the pin with the global install ([a9eb77c](https://github.com/event4u-app/agent-config/commit/a9eb77c296ed61a84a55b4568f4b2686e7544e8d)) * **gates:** a degraded report-only run exits 2 and never reads as complete ([8fb06e3](https://github.com/event4u-app/agent-config/commit/8fb06e3d5ed7699b5b4e42f0ac0a0fd58da24eee)) * **gates:** an experimental per-aspect collector with a stop-point byte boundary ([29e04b0](https://github.com/event4u-app/agent-config/commit/29e04b0357977f8bfd741c6905572920d6c36678)) * **update:** verify releases against pinned sigstore roots before installing ([19237ec](https://github.com/event4u-app/agent-config/commit/19237ecf41252f639e20482920610b18e652e380)) * **egress:** the senders detect through invisible characters and lookalike letters ([2cbee58](https://github.com/event4u-app/agent-config/commit/2cbee5877aea35a99fc889a6239dcc3a1bbc8c01)) * **code-graph:** a storage budget for user-global graph homes ([d526b33](https://github.com/event4u-app/agent-config/commit/d526b33d3de26fdd02ac23906a9dd05e338a5d4e)) * **code-graph:** map --estate draws the registered projects on one page ([e42d335](https://github.com/event4u-app/agent-config/commit/e42d33524d654f8fab7d9f72cb4c72ed4af747d2)) * **code-graph:** estate queries across registered projects ([3b67f49](https://github.com/event4u-app/agent-config/commit/3b67f4900d3bcc7088089267ea1d746a2d12cd03)) * **mcp:** a root without a graph names the registered projects that have one ([524929a](https://github.com/event4u-app/agent-config/commit/524929a0f167aa3d5612ed38a389bdc7521ff76d)) * **code-graph:** a project parameter on the graph tools and the CLI ([d2d2444](https://github.com/event4u-app/agent-config/commit/d2d244425a3c6dc3119fe365f17d17e567af43e5)) * **code-graph:** a local estate index of packages and exports, off by default ([be0676a](https://github.com/event4u-app/agent-config/commit/be0676a02211d72a1103ab4eb0f3433d006f874b)) * **code-graph:** a local upstream delta watch that writes stubs, not code ([517533b](https://github.com/event4u-app/agent-config/commit/517533b614f90ad8c177e014b816e4b053a9c721)) * **code-graph:** lineage backfill proposes drafts from existing tokens ([404af3e](https://github.com/event4u-app/agent-config/commit/404af3e163b6500a792c70d93925cddaf880c462)) * **code-graph:** register projects by use and manage them by hand ([3698dbe](https://github.com/event4u-app/agent-config/commit/3698dbe7fa367f071f4ede351e5cab31ff9d41d0)) * **code-graph:** a tracked lineage view and a local source view ([af7149a](https://github.com/event4u-app/agent-config/commit/af7149a2a7fb3e0fe08849354a9b8813d6baa7d9)) * **registry:** one user-global project registry keyed by repo id ([74b7372](https://github.com/event4u-app/agent-config/commit/74b7372d1d35bbfe41ce9844d62713de335a5f66)) * **code-graph:** lineage of resolves realised_in through the graph too ([24f1ae1](https://github.com/event4u-app/agent-config/commit/24f1ae1ca5ea226d38e149b1651bc2061bbf8dce)) * **code-graph:** lineage of, gaps, rejected and from ([433b3bb](https://github.com/event4u-app/agent-config/commit/433b3bb9d08d838eb7009ef9c2475b13edfc8777)) * **provenance:** seed both lineage ledgers from the existing stores ([f96491e](https://github.com/event4u-app/agent-config/commit/f96491e313dd40cf4d49c519c775c4474d1821f6)) * **code-graph:** a local lineage ledger and lineage check ([6e5b5cc](https://github.com/event4u-app/agent-config/commit/6e5b5cceb4450efc6f7e3e6ec385fb59f70318b2)) * **provenance:** lint the mechanism decision ledger ([d03ae2d](https://github.com/event4u-app/agent-config/commit/d03ae2daed7e49c4b8cfe3420d53cb952d8750a9)) * **code-graph:** one graphHome resolver for state, map and lock paths ([6a81a01](https://github.com/event4u-app/agent-config/commit/6a81a01e077e7afb6ad552ee80bca27803c609dd)) * **code-graph:** a machine-keyed repo identity ([ced9d19](https://github.com/event4u-app/agent-config/commit/ced9d192322617ec6b9fefe76bc36af94b46857f)) * **provenance:** schema for a source-free mechanism decision ledger ([a50af39](https://github.com/event4u-app/agent-config/commit/a50af395139e44215cdf237c0f6928708faa09ba)) * **network-sources:** codebooks emit stable source ids given a key ([9343ab9](https://github.com/event4u-app/agent-config/commit/9343ab99ae9bce9d5cad339ffd9654c164b0ec97)) * **link-crypto:** mint keyed, stable source ids ([15a5fd3](https://github.com/event4u-app/agent-config/commit/15a5fd3bf5b36f8361875bc32fac75e7091b75fd)) * **git:** export the work-tree walk-up as enclosingWorkTree ([721dd70](https://github.com/event4u-app/agent-config/commit/721dd707b198aa3e51c58f8e326760341a23cddc)) * **code-graph:** the Rails provider ([e93491f](https://github.com/event4u-app/agent-config/commit/e93491f33dd7c33ee4068f88edcf6af382c588bf)) * **code-graph:** Ruby is a parsed language ([d3013ae](https://github.com/event4u-app/agent-config/commit/d3013ae784edf7dad9906f58e49d8616a64ed089)) * **hooks:** count a notice as shown only on the dispatcher's receipt ([90ca393](https://github.com/event4u-app/agent-config/commit/90ca393a6c6961a718185526b3956e94ccfdc64e)) * **update:** register update-notice on claude session_start ([695349b](https://github.com/event4u-app/agent-config/commit/695349b740b058d09eedf8ced21da6726100433d)) * **hooks:** a user channel that never reaches the model ([03d20d6](https://github.com/event4u-app/agent-config/commit/03d20d6707b717d091ea0a848d459b6a0da337fc)) * **code-graph:** Spring controllers render the view they name ([d94f2fb](https://github.com/event4u-app/agent-config/commit/d94f2fb5465ab774c6ee6f64d4bfade38fbccaec)) * **code-graph:** request paths follow the handler three calls deep ([77a7651](https://github.com/event4u-app/agent-config/commit/77a765170d6cc2beb38a2e81c1b4aedb910a455d)) ### Bug Fixes * **update:** install the pinned version globally before writing the pin ([aadcb27](https://github.com/event4u-app/agent-config/commit/aadcb27b4a616532ea09377682e6d6d67b500605)) * **gates:** treat collector limits as capacities and validate health ([3993d80](https://github.com/event4u-app/agent-config/commit/3993d80baf942128f5555133982d33e28ce82141)) * **gates:** the mutation suite copies egress_normalize.ts with the engine it now imports ([f1c732a](https://github.com/event4u-app/agent-config/commit/f1c732aebb130f0b7abad74114a18f36edcf778d)) * **skills:** fit the graph_estate row into code-intelligence and regenerate the MCP inventory ([f9e0e55](https://github.com/event4u-app/agent-config/commit/f9e0e55848827c36b6d5f2cbcb27a6bb19fc7b0e)) * **gates:** treat the someone-else fixture slug as a placeholder ([a94fbee](https://github.com/event4u-app/agent-config/commit/a94fbee7948ffd210b9ebb67b992d1c5f556272c)) * **code-graph:** key registry entries per checkout so clones keep their own ([eaa4055](https://github.com/event4u-app/agent-config/commit/eaa4055a5085389205a9f7cd2509576d3f78ea44)) * **code-graph:** keep a worktree build from overwriting the main checkout's entry ([cbd8c23](https://github.com/event4u-app/agent-config/commit/cbd8c2371f61a399706a9ce8f908527e6c007210)) * **egress:** a key block's extent is read where its disguised markers were found ([462aa35](https://github.com/event4u-app/agent-config/commit/462aa3560f2c5d091d15048676238027c580cb97)) * **code-graph:** never evict a graph home a build is writing into ([b4baa0d](https://github.com/event4u-app/agent-config/commit/b4baa0d08ae32f0aad485f937e86c27053e48475)) * **lineage:** match a short-SHA or tag pin in the upstream watch ([3f002e4](https://github.com/event4u-app/agent-config/commit/3f002e4b1e673f5a68987053d5f3532baa953aa9)) * **lineage:** record a changed pin or locator on re-import ([158d9a0](https://github.com/event4u-app/agent-config/commit/158d9a04762ec3c093554a1e1b6d73430811584d)) * **mcp:** stop the no-graph answer from listing other repositories' paths ([92ab26d](https://github.com/event4u-app/agent-config/commit/92ab26db84f73048000a420b62f68e33a0cb658b)) * **code-graph:** resolve a relative remote against the repository root ([8442bc1](https://github.com/event4u-app/agent-config/commit/8442bc120b28290779d979faf2df124284420f8b)) * **code-graph:** give every clone its own user-global graph home ([65ec05a](https://github.com/event4u-app/agent-config/commit/65ec05ad836038478a4a98977c04385b3b803422)) * **code-graph:** version the estate index path and drop a section banner ([939ffd8](https://github.com/event4u-app/agent-config/commit/939ffd82fd1bd4f747e23a0c933b6276ad00ce2e)) * **lineage:** an error report carries a note even when the message is empty ([f6f2f99](https://github.com/event4u-app/agent-config/commit/f6f2f99b6b811c05d7fb3e412c360c65a5b08298)) * **update:** use the narrowed pending record when confirming a notice ([a04ab47](https://github.com/event4u-app/agent-config/commit/a04ab47427ee7bfa48332a9b3a5c32bd77a690ba)) * **hooks:** write the receipt after the notice, never before ([04cd50a](https://github.com/event4u-app/agent-config/commit/04cd50a64cdaab836c96a6a579d12b7598e79692)) * **update:** bind each receipt to the notice it confirms ([91c3bf7](https://github.com/event4u-app/agent-config/commit/91c3bf77a5945a5c92106561bebb4f608adf1eb1)) * **hooks:** a receipt only for a notice that survived into the output ([5394e2c](https://github.com/event4u-app/agent-config/commit/5394e2c3dfe5e3af3e1f1b5ac7a906e594737f71)) * **code-graph:** the SQLite twin stops carrying a second copy of the graph ([d4c19b7](https://github.com/event4u-app/agent-config/commit/d4c19b7b88f5c28556542487fe60a19056b22174)) * **code-graph:** a refresh promotes its SQLite twin and sweeps the ones a killed refresh left ([be0ecd6](https://github.com/event4u-app/agent-config/commit/be0ecd61d630c73122140d0b95e2a7e9bc041ec5)) * **update:** no session id, no pending report ([1d91d15](https://github.com/event4u-app/agent-config/commit/1d91d15fde3e4556c07c11335eb189f1dd34a8ee)) * **update:** another session's receipt never throttles a pending notice ([d292436](https://github.com/event4u-app/agent-config/commit/d292436e738a9c6153141000829001df68fd62fb)) * **distribution:** give the Copilot pointer copy its triggers stub ([6fce40f](https://github.com/event4u-app/agent-config/commit/6fce40f2b183cbed19127ef8241a61239532940f)) * **hooks:** a field of the wrong type keeps the old output ([96b2305](https://github.com/event4u-app/agent-config/commit/96b2305ffc2115a3f08abdc92bdfe7e3492e3dc4)) * **distribution:** guard both pointer copies, re-test every submitted release ([48ec18b](https://github.com/event4u-app/agent-config/commit/48ec18b57584067a58be979bd297c48db617c1b1)) * **hooks:** merge the user notice as structures, never as text ([2b41cd6](https://github.com/event4u-app/agent-config/commit/2b41cd60f3382969231489a3caf7c9e59b21b55e)) * **distribution:** make the Copilot plugin directory self-contained ([692c90c](https://github.com/event4u-app/agent-config/commit/692c90c1410561a9981d1fc93f468f0302570d44)) * **code-graph:** a path in a comment or a log message is not a read ([2be7657](https://github.com/event4u-app/agent-config/commit/2be765708d2f9e95a24ec3acbcd0546f55c22878)) * **map-viewer:** an orb that spreads, and an area list that reads ([34825dd](https://github.com/event4u-app/agent-config/commit/34825dd5b3c4bb0afdbec0d8cf1c3f721547ccf8)) * **code-graph:** map areas no longer centre on a partial or a routes file ([816d695](https://github.com/event4u-app/agent-config/commit/816d69598f8553480d41306a67696435b6df393f)) * **code-graph:** bind a static call through the class the file states ([cf3d0e5](https://github.com/event4u-app/agent-config/commit/cf3d0e5f49dea37524035776ba2361e6bcfbdbe0)) * **code-graph:** resolve C# types by namespace scope ([348b68f](https://github.com/event4u-app/agent-config/commit/348b68fb11f0d1af315076479afee7e685dd728f)) * **code-graph:** prefix Django routes with the include() that reaches them ([c39b45e](https://github.com/event4u-app/agent-config/commit/c39b45e07fcc99b01bff22abb2ed5350f8642653)) * **bench:** lift the paid-CLI daily cap in the shadow council example ([ede80d0](https://github.com/event4u-app/agent-config/commit/ede80d0598c00ee39f46e1d3a9306b894dfcc95b)) ### Performance * **code-graph:** the estate index stops re-walking the tree on refresh ([65ce5ab](https://github.com/event4u-app/agent-config/commit/65ce5abaf07eb2dc4d8a4e8583be56deaef3e14e)) ### Documentation * **roadmaps:** drop the landed one-detector depends row from placeholders-on-the-wire ([7e19959](https://github.com/event4u-app/agent-config/commit/7e199591209d9bcd5da9f18bab4ad19e7cb230c8)) * **memory:** record the update pin split-state incident ([e1327f6](https://github.com/event4u-app/agent-config/commit/e1327f6b847d339f2ba8391a8307960389554913)) * **evidence:** the 16-check contract-and-classification ledger, provisional ([abe8e1a](https://github.com/event4u-app/agent-config/commit/abe8e1aa8d7ed134fdd5ab8a767115c97df3dcb2)) * **roadmaps:** close and archive road-to-one-detector-and-the-senders-we-own ([af2400e](https://github.com/event4u-app/agent-config/commit/af2400efc70097fe017b54aa86b1b502ebcdc412)) * **evidence:** the slice round keeps the owed item open and names the ledger (D30) ([774f577](https://github.com/event4u-app/agent-config/commit/774f5777fe30e566add131a80069fcc356f660da)) * **evidence:** put the collector slice to the council ([8b800f8](https://github.com/event4u-app/agent-config/commit/8b800f8f133cae9992b6ec6b280d35d300f18540)) * **evidence:** the degraded split converges fail-closed (D29); record the slice under 7.1 ([7a24eb7](https://github.com/event4u-app/agent-config/commit/7a24eb79d506c38decc4dd68f404e64a24fc0549)) * **readme:** use the new info banner as README hero ([49c5ea7](https://github.com/event4u-app/agent-config/commit/49c5ea72744b9ae56e755d39ed733342a5110a69)) * **roadmap:** step 2.5 under the complexity word cap, evidence in the commits and the ratification ([18dd411](https://github.com/event4u-app/agent-config/commit/18dd411796c0d833a8b9240accb828bd4e09e02b)) * **evidence:** mark the outcome-table prompt line the reference checker misreads ([fafec53](https://github.com/event4u-app/agent-config/commit/fafec539c872011cc19130ee12ea62d5a5f42783)) * **evidence:** the outcome-table round permits an experimental slice, owes the collector state machine (D28) ([1b1f853](https://github.com/event4u-app/agent-config/commit/1b1f853ca9d866ccbb9566b1c80dcc2bd8f61a9a)) * **evidence:** draft the outcome table and accepted-byte boundary D27 owes ([100ff77](https://github.com/event4u-app/agent-config/commit/100ff7762d0647e0c2d66a0192a4d49984c07cfa)) * **evidence:** an escaped descendant rewrites a file channel, not a stopped pipe ([e42607a](https://github.com/event4u-app/agent-config/commit/e42607af58b7b20061dc59acef67b75d2a0139de)) * **ratification:** the normalised senders, ratified 2/2 by the council ([3ef0ca8](https://github.com/event4u-app/agent-config/commit/3ef0ca838f8e42619e0062b8bd2d9990639e6992)) * **evidence:** the envelope round permits exploratory fixtures, owes the outcome table (D27) ([1e48f2a](https://github.com/event4u-app/agent-config/commit/1e48f2add3d78b188a830aa0951808a7f9dced40)) * **evidence:** the round-2 ratification prompt for the normalised senders ([9255f16](https://github.com/event4u-app/agent-config/commit/9255f165feead8ec3c4f0e34038899e3376c464c)) * **evidence:** draft the invocation envelope D26 owes ([8fec35f](https://github.com/event4u-app/agent-config/commit/8fec35f7def3ce88bf6625a1b9f949e7c763ac28)) * **evidence:** the protocol round permits disposable fixtures, owes the envelope (D26) ([83981d8](https://github.com/event4u-app/agent-config/commit/83981d898f54ad66a71c771f8c333535d79fc48e)) * **evidence:** draft the producer protocol D25 owes before fixtures ([dd12e80](https://github.com/event4u-app/agent-config/commit/dd12e8060b724be29ffb4ccd82384bb0c731627d)) * **evidence:** the truth-table round answered, fixtures and schema withheld (D25) ([9dc8eb8](https://github.com/event4u-app/agent-config/commit/9dc8eb8146739667cc28d0bd09c22a3fc0c9e66a)) * **evidence:** inline the src delta into the ratification prompt ([eb7f5d6](https://github.com/event4u-app/agent-config/commit/eb7f5d613d077362b5e96826c529b38afe2fe188)) * unattended upgrades verify against pinned sigstore roots ([0258ff1](https://github.com/event4u-app/agent-config/commit/0258ff1728a859a2fb181a9e364d062a6b748a4c)) * **evidence:** the ratification prompt for wiring detectNormalized into the senders ([aa08c3b](https://github.com/event4u-app/agent-config/commit/aa08c3bfbb7453a39147d73656c7102dc09580f0)) * **bench:** PREREG (f) read on the CI runner class, and AC-6 records it ([9010d6b](https://github.com/event4u-app/agent-config/commit/9010d6ba9094886973edf2ff3326511dcfc7cfa5)) * **roadmap:** a graph that follows you is complete and archived ([4305416](https://github.com/event4u-app/agent-config/commit/43054161e90197059ba09929435e1d60cab7ca59)) * **code-graph:** the usage line and CLI synopsis name the lineage and estate verbs ([8de5197](https://github.com/event4u-app/agent-config/commit/8de51974ce5444a94e7e87fec760593e702b875c)) * **roadmap:** one-detector 2.5 records where detectNormalized is wired ([31a2a48](https://github.com/event4u-app/agent-config/commit/31a2a48ca0831e53aa5e66908911f6f45c1d11b3)) * **roadmap:** phases 2-6 of a graph that follows you are done ([bfc0631](https://github.com/event4u-app/agent-config/commit/bfc06315389531d9d8231d39981e00a8bb10fc03)) * **evidence:** measure the graph home, the estate index and a foreign repo ([2459b03](https://github.com/event4u-app/agent-config/commit/2459b03949e4f1d27a1fadd9c529d8c97d8c6a60)) * **roadmaps:** regenerate the owned digest for the parked review roadmap ([7922fa0](https://github.com/event4u-app/agent-config/commit/7922fa098755d49a3ff8646163ef71b6e53ee8a0)) * **roadmaps:** park road-to-a-review-that-ends until the 20th post-cap review ([86e3342](https://github.com/event4u-app/agent-config/commit/86e3342b40e71acc28dac1ab5950c80ef5b5c154)) * **evidence:** ratification of the user channel, round 10 ([239d9ee](https://github.com/event4u-app/agent-config/commit/239d9ee3a072fbe3c983f6e1ca438823d50691fb)) * **contracts:** a notice receipt evidences the hand-over to stdout, not transmission ([c1363dd](https://github.com/event4u-app/agent-config/commit/c1363dd22f5fb81d167f0490502ce30822473d85)) * **provenance:** describe the lineage verbs and where their output lives ([17816d1](https://github.com/event4u-app/agent-config/commit/17816d1dd98b03a8a76c70de51868da9f0dbc108)) * **roadmap:** phase 7 of a graph that follows you is done ([c6064ab](https://github.com/event4u-app/agent-config/commit/c6064ab4b8220b2a5e7525d80470686891ea9ce7)) * **adr:** record the graph home beside the project graph as ADR-299 ([a2d0e29](https://github.com/event4u-app/agent-config/commit/a2d0e2996f8edfca7a98c8d89bb00793203191a9)) * **roadmaps:** drop the archived carried roadmap from the owned digest ([9451541](https://github.com/event4u-app/agent-config/commit/9451541e982d075ad6c2c8866461b9675b2ff93b)) * **roadmap:** the ADR-index verify clause parses its exit expectation ([21d6ecb](https://github.com/event4u-app/agent-config/commit/21d6ecb84898e0450c700035ca7075ee1dafa5c3)) * **roadmap:** verify clauses name what their command must produce ([81ccf44](https://github.com/event4u-app/agent-config/commit/81ccf443bc84aec2c59009155a10555f3ecc04b8)) * **roadmap:** phase 1 of a graph that follows you is done ([ba5deb3](https://github.com/event4u-app/agent-config/commit/ba5deb37c423da6ed27e701ce8e69c90e0b7452f)) * **roadmaps:** archive road-to-graph-providers-for-every-stack-carried ([1344bdc](https://github.com/event4u-app/agent-config/commit/1344bdccac0ec22df68624f5f3930b9b5d0a00db)) * **roadmap:** point the fabricated-provenance risk at the renamed ledger phase ([f474169](https://github.com/event4u-app/agent-config/commit/f4741699321ca8d631402743e3b686f3d1604dc4)) * **roadmap:** a graph that follows you, and a lineage that stays local ([325dfef](https://github.com/event4u-app/agent-config/commit/325dfefce42088bc3c92e5ea3cee51e80e54ffc8)) * **roadmaps:** claim the concern_count growth of the update-notice registration ([82708bd](https://github.com/event4u-app/agent-config/commit/82708bda308564aaa4b4a813537defd33794e97e)) * **evidence:** ratify the user channel and the update-notice registration ([7d10cb2](https://github.com/event4u-app/agent-config/commit/7d10cb2089c4d47e16940405a2463a60dbd3ae5c)) * **evidence:** re-bind the Copilot-repair review after the triggers stub ([9d86f0a](https://github.com/event4u-app/agent-config/commit/9d86f0a15191188d2a50592ff2e12eba8cd7226b)) * **evidence:** close the Copilot-repair review findings and re-bind the round ([ea5073e](https://github.com/event4u-app/agent-config/commit/ea5073e490366a248b111895a85a2adcf4d9d9a6)) * **evidence:** completion review of the Copilot plugin repair ([1646541](https://github.com/event4u-app/agent-config/commit/16465418aa278bb2ac8b91600336f718c16e601f)) * **distribution:** record the Copilot install test and its repair ([821d768](https://github.com/event4u-app/agent-config/commit/821d768e37e70f07c37752a4abe8fc90628d0674)) * **roadmaps:** close 3.1 and resolve dsse-trust-root in the council ([f4055a2](https://github.com/event4u-app/agent-config/commit/f4055a2d83f2524fa7e0e74ad7051c1cd1771543)) * **evidence:** skip declaration for the docs-only registry record ([a7b0e4d](https://github.com/event4u-app/agent-config/commit/a7b0e4d78d29d7130f469a020db5729ff1c017cf)) * **distribution:** the official MCP Registry lists the package ([aebef31](https://github.com/event4u-app/agent-config/commit/aebef314abf5650e566f55960e7a818419aab083)) * **evidence:** skip declaration for the docs-only ledger record ([d98be0c](https://github.com/event4u-app/agent-config/commit/d98be0c128fe3288e07c0428b8fdde13e0804c50)) * **distribution:** record the Docker MCP Catalog submission ([155688c](https://github.com/event4u-app/agent-config/commit/155688ce79cc9c0f9554d33a7607c68d7169a36e)) * **free-hands:** file the shadow window evidence and close the roadmap ([3239925](https://github.com/event4u-app/agent-config/commit/3239925071fffd14eba1e3c40a9ee79bc08c421e)) ### Refactoring * **advisories:** keep the project list in the shared registry ([26d67cd](https://github.com/event4u-app/agent-config/commit/26d67cdcfcc4b13f71e9db40082a13ba6e4bf359)) * **code-graph:** route every graph path through graphHome ([89c2dbf](https://github.com/event4u-app/agent-config/commit/89c2dbf50c4b548c02e728f75eece8977358aa84)) * **hooks:** move the notice plumbing out of the over-cap dispatcher ([bf4a567](https://github.com/event4u-app/agent-config/commit/bf4a567be457dde7ad34f6467915a9f3ec663e99)) ### Tests * **update:** independent verdict on the removed signature test; baseline the new deps ([e907746](https://github.com/event4u-app/agent-config/commit/e9077465fcfdabea82024047da777dbe56dfe950)) * **egress:** offsets around hidden and astral characters, and multilingual prose stays clean ([271c3fd](https://github.com/event4u-app/agent-config/commit/271c3fd0eb91c54411b125123afc1d6148f3f891)) * **code-graph:** call canonicalOrigin through a lambda in the forms test ([c3e4bf2](https://github.com/event4u-app/agent-config/commit/c3e4bf264996c9edda8003ed3f4d9f3468a36421)) * **update:** type the bundle fields the forging cases rewrite ([aa8f466](https://github.com/event4u-app/agent-config/commit/aa8f4667682a2c0d8349656371b903648d8a61bf)) * **code-graph:** no sender reaches the registry, the index or the lineage ledger ([73fa25d](https://github.com/event4u-app/agent-config/commit/73fa25dc4edeb930858d70c76426bbd6466312f1)) * **code-graph:** a stale root is flagged by list and removed only by prune ([678ec07](https://github.com/event4u-app/agent-config/commit/678ec0732640794f1e794c2543636d80a69c50b8)) * **code-graph:** a foreign repository stays untouched by build and map ([04ffc64](https://github.com/event4u-app/agent-config/commit/04ffc641433a0cc6408acd857574fe605e04bb5e)) * **hooks:** pin that update-notice's slot can never withhold its notice ([0c06f11](https://github.com/event4u-app/agent-config/commit/0c06f11784afb849f80b0309825609b7c610cceb)) * **egress:** move the free-tier prefix tests whole into tests/contracts ([e4a187c](https://github.com/event4u-app/agent-config/commit/e4a187c7863098850dcabcb07809eb2c3370d5b3)) * **egress:** move the credential coverage join to tests/contracts ([7593eb2](https://github.com/event4u-app/agent-config/commit/7593eb2f644b317951acd3d88e9794c00e09135e)) ### Chores * **roadmap:** re-review the one-detector risk register after 2.5 was wired ([d331ca2](https://github.com/event4u-app/agent-config/commit/d331ca299d6344e4e38476b9b9f7f9cbdac0e384)) * **deps:** pin the sigstore verification modules exactly ([c24617e](https://github.com/event4u-app/agent-config/commit/c24617e8b2b3fd8a47edf214a6bcd3f0542fe47a)) * **roadmaps:** regenerate the owned digest after the archival ([366ee00](https://github.com/event4u-app/agent-config/commit/366ee00ee29ddc84830cee423c4ce9e2b5ae152e)) Tests: 32955 (+304 since 17.3.0) # Era: pre-4.0.0 — archived > All entries from `3.2.0` and `3.3.0` live in > [`docs/archive/CHANGELOG-pre-4.0.0.md`](docs/archive/CHANGELOG-pre-4.0.0.md). > The archive is read-only; git tags `3.2.0` and `3.3.0` remain the > canonical source for what shipped. Splitting them out of the main > file keeps the active era under the 250-line drift cap enforced by > `tests/lib/changelog_eras.test.ts`. # Era: pre-3.2.0 — archived > All entries from `3.1.0` and `3.1.1` live in > [`docs/archive/CHANGELOG-pre-3.2.0.md`](docs/archive/CHANGELOG-pre-3.2.0.md). > The archive is read-only; git tags `3.1.0` and `3.1.1` remain the > canonical source for what shipped. Splitting them out of the main > file keeps the active era under the 250-line drift cap enforced by > `tests/lib/changelog_eras.test.ts`. # Era: pre-3.1.0 — archived > All entries from `3.0.0` live in > [`docs/archive/CHANGELOG-pre-3.1.0.md`](docs/archive/CHANGELOG-pre-3.1.0.md). > The archive is read-only; git tag `3.0.0` remains the canonical > source for what shipped. Splitting it out of the main file keeps > the active era under the 250-line drift cap enforced by > `tests/lib/changelog_eras.test.ts`. # Era: pre-3.0.0 — archived > All entries from `2.26.0` and `2.25.0` live in > [`docs/archive/CHANGELOG-pre-3.0.0.md`](docs/archive/CHANGELOG-pre-3.0.0.md). > The archive is read-only; git tags `2.26.0` and prior remain the > canonical source for what shipped. Splitting these out of the main > file keeps the active era under the 200-line drift cap enforced by > `tests/lib/changelog_eras.test.ts`. # Era: pre-2.25.0 — archived > All entries from `2.24.0` through `2.20.0` live in > [`docs/archive/CHANGELOG-pre-2.25.0.md`](docs/archive/CHANGELOG-pre-2.25.0.md). > The archive is read-only; git tags `2.24.0` and prior remain the > canonical source for what shipped. Splitting these out of the main > file keeps the active era under the 200-line drift cap enforced by > `tests/lib/changelog_eras.test.ts`. # Era: pre-2.20.0 — archived > All entries from `2.19.0` through `2.17.0` live in > [`docs/archive/CHANGELOG-pre-2.20.0.md`](docs/archive/CHANGELOG-pre-2.20.0.md). > The archive is read-only; git tags `2.19.0` and prior remain the > canonical source for what shipped. Splitting these out of the main > file keeps the active era under the 200-line drift cap enforced by > `tests/lib/changelog_eras.test.ts`. # Era: pre-2.17.0 — archived > All `2.16.0` entries live in > [`docs/archive/CHANGELOG-pre-2.17.0.md`](docs/archive/CHANGELOG-pre-2.17.0.md). > The archive is read-only; git tag `2.16.0` remains the canonical > source for what shipped. Splitting these out of the main file keeps > the active era under the 200-line drift cap enforced by > `tests/lib/changelog_eras.test.ts`. # Era: pre-2.16.0 — archived > All `2.15.0` entries live in > [`docs/archive/CHANGELOG-pre-2.16.0.md`](docs/archive/CHANGELOG-pre-2.16.0.md). > The archive is read-only; git tag `2.15.0` remains the canonical > source for what shipped. Splitting these out of the main file keeps > the active era under the 200-line drift cap enforced by > `tests/lib/changelog_eras.test.ts`. # Era: pre-2.15.0 — archived > All entries from `2.14.0` through `2.11.0` live in > [`docs/archive/CHANGELOG-pre-2.15.0.md`](docs/archive/CHANGELOG-pre-2.15.0.md). > The archive is read-only; git tags `2.14.0` and prior remain the > canonical source for what shipped. Splitting these out of the main > file keeps the active era under the 200-line drift cap enforced by > `tests/lib/changelog_eras.test.ts`. # Era: pre-2.11.0 — archived > All entries from `2.10.0` through `2.7.0` live in > [`docs/archive/CHANGELOG-pre-2.11.0.md`](docs/archive/CHANGELOG-pre-2.11.0.md). > The archive is read-only; git tags `2.10.0` and prior remain the > canonical source for what shipped. Splitting these out of the main > file keeps the active era under the 200-line drift cap enforced by > `tests/lib/changelog_eras.test.ts`. # Era: pre-2.7.0 — archived > All entries from `2.6.1` through `2.2.0` live in > [`docs/archive/CHANGELOG-pre-2.7.0.md`](docs/archive/CHANGELOG-pre-2.7.0.md). > The archive is read-only; git tags `2.6.1` and prior remain the > canonical source for what shipped. Splitting these out of the main > file keeps the active era under the 200-line drift cap enforced by > `tests/lib/changelog_eras.test.ts`. # Era: pre-2.2.0 — archived > All entries from `2.1.0` and earlier live in > [`docs/archive/CHANGELOG-pre-2.2.0.md`](docs/archive/CHANGELOG-pre-2.2.0.md). > The archive is read-only; git tags `2.1.0` and prior remain the > canonical source for what shipped. Splitting these out of the main > file keeps the active era under the 200-line drift cap enforced by > `tests/lib/changelog_eras.test.ts`.