Schedule the outbound link liveness job, and decide which repo hosts it #1231

Open
opened 2026-08-25 07:27:49 +00:00 by coilyco-ops · 0 comments
Owner

Deferred out of coilyco-flight-deck/agentic-os#1228, which landed hook 1 (outbound-link-hygiene) in #1229. This carries the one piece of that issue's spec that did not land, plus the placement question that stopped it.

What exists already

check-link-liveness is authored and tested in agentic_os/link_liveness.py, exposed as a console script, and deliberately absent from .pre-commit-hooks.yaml alongside the other authored-but-not-hooked validators. It already meets every requirement the spec named:

  • reports non-2xx and non-3xx only, so a redirect is a pass
  • treats 401, 403, 405, 429 and any transport failure as tolerated, so rate limiting does not fail a run
  • reports, never edits
  • reuses the offline extractor, so both halves see the same link set

So the checker is done. What is missing is the thing that runs it.

What is missing, and why it stopped

The spec says the job belongs as a scheduled Forgejo Actions job on the shape of agentic-os-kai's .forgejo/workflows/sync-repo-digests.yml: daily, alerts on failure, no-ops cleanly without its token. That shape is clear. Which repo hosts it is not, and guessing would have been the wrong kind of decision to make inside a validator PR.

The surfaces whose links actually rot are not this repo. The two defects that motivated the whole family live in coilysiren/coilysiren, the public profile. A job here that scans only this repo's own tree is close to worthless: this repo's links are already clean, and nobody reads it as a web surface.

Three options, none obviously right:

  1. One job per surface repo. Highest fidelity, most duplication, and every new repo needs the workflow copied. Cuts against the authoring-vs-rollout split unless ansible fans it.
  2. One fleet job in infrastructure. Matches where fleet-wide convergence already lives, and matches "nobody clones it but Kai". Needs a checkout of every surface, which is a real cost per run.
  3. One job here scanning a declared surface list. Keeps the tool and its schedule together, but puts a list of other repos in this repo, which the config-placement rule reads as fetching downward.

Option 2 looks right to me on the layer gradient, but this is a portfolio-level placement call rather than a build call, so it wants the TPM seat rather than platform's.

Done means

  • Placement decided and recorded, with the reasoning, not just the outcome
  • Scheduled workflow lands in whichever repo wins, daily, alerting on failure, no-opping without its token
  • A run is observed finding at least one real dead link, or confirmed clean against a link known to be dead
  • docs/pre-commit-hygiene.md loses "its scheduled job is not built yet"

Also still deferred, deliberately

Hook 2, web content shape, stays deferred exactly as coilyco-flight-deck/agentic-os#1228 recommended. The format has one draft instance, in coilysiren/inbox#417. A validator ossifies a pattern, and ossifying a schema nobody has stress-tested across four pages is how a linter becomes something people add excludes for. Revisit once all four pages exist. That deferral is now noted in docs/pre-commit-hygiene.md with the pointer, so it is not carried by this issue alone.

Deferred out of coilyco-flight-deck/agentic-os#1228, which landed hook 1 (`outbound-link-hygiene`) in #1229. This carries the one piece of that issue's spec that did not land, plus the placement question that stopped it. ## What exists already `check-link-liveness` is authored and tested in `agentic_os/link_liveness.py`, exposed as a console script, and deliberately absent from `.pre-commit-hooks.yaml` alongside the other authored-but-not-hooked validators. It already meets every requirement the spec named: - reports non-2xx and non-3xx only, so a redirect is a pass - treats 401, 403, 405, 429 and any transport failure as tolerated, so rate limiting does not fail a run - reports, never edits - reuses the offline extractor, so both halves see the same link set So the checker is done. What is missing is the thing that runs it. ## What is missing, and why it stopped The spec says the job belongs as a scheduled Forgejo Actions job on the shape of `agentic-os-kai`'s `.forgejo/workflows/sync-repo-digests.yml`: daily, alerts on failure, no-ops cleanly without its token. That shape is clear. Which repo hosts it is not, and guessing would have been the wrong kind of decision to make inside a validator PR. The surfaces whose links actually rot are not this repo. The two defects that motivated the whole family live in `coilysiren/coilysiren`, the public profile. A job here that scans only this repo's own tree is close to worthless: this repo's links are already clean, and nobody reads it as a web surface. Three options, none obviously right: 1. **One job per surface repo.** Highest fidelity, most duplication, and every new repo needs the workflow copied. Cuts against the authoring-vs-rollout split unless ansible fans it. 2. **One fleet job in `infrastructure`.** Matches where fleet-wide convergence already lives, and matches "nobody clones it but Kai". Needs a checkout of every surface, which is a real cost per run. 3. **One job here scanning a declared surface list.** Keeps the tool and its schedule together, but puts a list of other repos in this repo, which the config-placement rule reads as fetching downward. Option 2 looks right to me on the layer gradient, but this is a portfolio-level placement call rather than a build call, so it wants the TPM seat rather than platform's. ## Done means - [ ] Placement decided and recorded, with the reasoning, not just the outcome - [ ] Scheduled workflow lands in whichever repo wins, daily, alerting on failure, no-opping without its token - [ ] A run is observed finding at least one real dead link, or confirmed clean against a link known to be dead - [ ] `docs/pre-commit-hygiene.md` loses "its scheduled job is not built yet" ## Also still deferred, deliberately Hook 2, web content shape, stays deferred exactly as coilyco-flight-deck/agentic-os#1228 recommended. The format has one draft instance, in coilysiren/inbox#417. A validator ossifies a pattern, and ossifying a schema nobody has stress-tested across four pages is how a linter becomes something people add excludes for. Revisit once all four pages exist. That deferral is now noted in `docs/pre-commit-hygiene.md` with the pointer, so it is not carried by this issue alone.
Sign in to join this conversation.
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#1231
No description provided.