chore(catalog): retire catalog-block-present and drop the yaml from the trifecta #1142

Merged
coilysiren merged 1 commit from chore/retire-catalog-block-hook into main 2026-08-19 23:07:28 +00:00
Owner

Phase 2 of the ward retirement (coilysiren/inbox#385). Phase 1 landed in agentic-os-kai; phase 3 is the 29-repo sweep that this unblocks.

Two hooks authored here pin .ward/ward.yaml by path. With ward retired fleet-wide and that file being deleted from every repo, both would fail every consumer the moment the file goes. So they move first.

catalog-block-present is deleted

It existed solely to assert the catalog block was present and dependsOn was a list. The graph that consumed both was deleted in agentic-os-kai this pass, and the tracing behind that is worth recording:

  • the graph's node list never came from those blocks - load_repos() returns AOS's residency projection, so a block contributed only description and dependsOn
  • the two live readers of dependsOn were repo-placement lints answering "which org is this repo in", which Forgejo already knows
  • personal-dashboard, documented as the downstream consumer, does not exist under any owner
  • atlas, documented as owning the public artifact, does not exist either

catalog-trifecta becomes an actual trifecta

It required README, AGENTS, and docs/FEATURES to each carry a link to a fourth, non-markdown member. Now the three markdown files cross-link each other and nothing else, which is what the convention was always about. CATALOG_YAMLS, resolve_catalog_yaml(), and check_catalog_yaml() go with it.

The rollout tool needed the same edit

apply-agentic-os-hooks.py drops catalog-block-present from DEFAULT_HOOK_IDS. Without that, the phase 3 rollout would stamp a hook id that no longer resolves upstream and break every repo it touched.

Its LEGACY_BLOCK_MARKERS and LEGACY_STAMPED_SCRIPTS entries stay. Those strip old per-hook stamps and stale scripts/check-catalog-block.py copies out of consumers, which is still a job that needs doing.

A test that was passing for the wrong reason

test_consumer_still_needs_every_peer_link proved that a missing peer link fails the hook. The link it dropped was the ward.yaml one. Once that stopped being a peer the fixture became valid, the hook returned 0, and the test failed. Rewriting the assertion to match would have quietly destroyed what it tested, so it now drops the docs/FEATURES.md peer instead and proves the same thing.

Blast radius

None until a consumer bumps its pinned rev. Repos stay on their current rev and keep running the old hook set against the file they still have. Phase 3 does the rev bump, the file deletion, and the link removal per repo in one commit.

Validation

pre-commit run --all-files green. pytest tests/ is 532 passed, 1 failed, and the failure is pre-existing and unrelated:

tests/test_ward_specs_bundle.py::test_yaml_configuration_is_accepted_by_ward_doctor shells out to ward doctor. It passes in CI because docker/dev-base/full/Dockerfile still installs ward, and fails on any host where ward is now absent. Flagging it as a landmine: dropping ward from that image, which the retirement wants, breaks this test in CI too. It belongs with the image and tap removal rather than here.

(tests/test_check_yaml_strict.py also fails to import locally for want of ruamel, likewise pre-existing and unrelated.)

Phase 2 of the ward retirement (coilysiren/inbox#385). Phase 1 landed in agentic-os-kai; phase 3 is the 29-repo sweep that this unblocks. Two hooks authored here pin `.ward/ward.yaml` by path. With ward retired fleet-wide and that file being deleted from every repo, both would fail every consumer the moment the file goes. So they move first. ## `catalog-block-present` is deleted It existed solely to assert the catalog block was present and `dependsOn` was a list. The graph that consumed both was deleted in agentic-os-kai this pass, and the tracing behind that is worth recording: * the graph's node list **never came from those blocks** - `load_repos()` returns AOS's residency projection, so a block contributed only `description` and `dependsOn` * the two live readers of `dependsOn` were repo-placement lints answering "which org is this repo in", which Forgejo already knows * `personal-dashboard`, documented as the downstream consumer, does not exist under any owner * `atlas`, documented as owning the public artifact, does not exist either ## `catalog-trifecta` becomes an actual trifecta It required README, AGENTS, and docs/FEATURES to each carry a link to a fourth, non-markdown member. Now the three markdown files cross-link each other and nothing else, which is what the convention was always about. `CATALOG_YAMLS`, `resolve_catalog_yaml()`, and `check_catalog_yaml()` go with it. ## The rollout tool needed the same edit `apply-agentic-os-hooks.py` drops `catalog-block-present` from `DEFAULT_HOOK_IDS`. Without that, the phase 3 rollout would stamp a hook id that no longer resolves upstream and break every repo it touched. Its `LEGACY_BLOCK_MARKERS` and `LEGACY_STAMPED_SCRIPTS` entries **stay**. Those strip old per-hook stamps and stale `scripts/check-catalog-block.py` copies out of consumers, which is still a job that needs doing. ## A test that was passing for the wrong reason `test_consumer_still_needs_every_peer_link` proved that a missing peer link fails the hook. The link it dropped was the ward.yaml one. Once that stopped being a peer the fixture became valid, the hook returned 0, and the test failed. Rewriting the assertion to match would have quietly destroyed what it tested, so it now drops the `docs/FEATURES.md` peer instead and proves the same thing. ## Blast radius None until a consumer bumps its pinned rev. Repos stay on their current rev and keep running the old hook set against the file they still have. Phase 3 does the rev bump, the file deletion, and the link removal per repo in one commit. ## Validation `pre-commit run --all-files` green. `pytest tests/` is **532 passed, 1 failed**, and the failure is pre-existing and unrelated: `tests/test_ward_specs_bundle.py::test_yaml_configuration_is_accepted_by_ward_doctor` shells out to `ward doctor`. It passes in CI because `docker/dev-base/full/Dockerfile` still installs ward, and fails on any host where ward is now absent. **Flagging it as a landmine**: dropping ward from that image, which the retirement wants, breaks this test in CI too. It belongs with the image and tap removal rather than here. (`tests/test_check_yaml_strict.py` also fails to import locally for want of `ruamel`, likewise pre-existing and unrelated.)
chore(catalog): retire catalog-block-present and drop the yaml from the trifecta
All checks were successful
ci / aos-eval-tests (pull_request) Successful in 6s
ci / ward-doctor (pull_request) Successful in 16s
ci / aos-cli-tests (pull_request) Successful in 24s
ci / gate (pull_request) Successful in 59s
66e0307a0b
With ward retired fleet-wide, `.ward/ward.yaml` is being deleted from every
repo (coilysiren/inbox#385). Two hooks authored here pin that exact path and
would fail every repo the moment the file goes, so they move first.

`catalog-block-present` is deleted outright. It existed solely to assert the
catalog block was present and `dependsOn` was a list, and the graph that
consumed both was deleted in agentic-os-kai this pass: the node list never came
from those blocks, the two lints reading `dependsOn` were repo-placement checks
Forgejo can already answer, and the two documented downstream consumers of the
graph do not exist.

`catalog-trifecta` becomes a genuine trifecta. It required README, AGENTS, and
docs/FEATURES to each carry a link to a fourth, non-markdown member. Now the
three markdown files cross-link each other and nothing else, which is what the
convention was always about.

`apply-agentic-os-hooks.py` drops `catalog-block-present` from
DEFAULT_HOOK_IDS, or the rollout would stamp a hook id that no longer resolves.
Its LEGACY_BLOCK_MARKERS and LEGACY_STAMPED_SCRIPTS entries stay: those strip
old per-hook stamps out of consumers and are still doing that job.

The trifecta test that asserted a missing peer link fails was dropping the
ward.yaml link, which is no longer a peer, so the fixture became valid and the
test passed for the wrong reason. It now drops the FEATURES peer instead,
preserving what it was written to prove.

Consumers are unaffected until they bump their pinned rev, which phase 3 does
per repo alongside deleting the file and its links.

KNOWN, PRE-EXISTING, NOT ADDRESSED HERE: tests/test_ward_specs_bundle.py shells
out to `ward doctor`. It passes in CI because the dev-base image still installs
ward, and fails on any host where ward is now absent. Dropping ward from that
image, which the retirement wants, breaks it in CI too. It belongs with the
image and tap removal rather than with this hook change.

Refs coilysiren/inbox#385

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Co-authored-by: Kai Siren <coilysiren@gmail.com>
Co-authored-by: Claude <noreply@anthropic.com>
coilysiren deleted branch chore/retire-catalog-block-hook 2026-08-19 23:07:29 +00:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
coilyco-flight-deck/agentic-os!1142
No description provided.