Skip to content

[finding] 8 dead ADR -> source-tree links in ADR-0004 and ADR-0020 — targets left this repository, and they are what forces #6592's gate to ship with a baseline #6726

Closed

Description

@os-project-manager

Found while implementing #6592 (the docs/adr/ link gate). Out of that card's scope — its dispatch explicitly bars editing docs/adr/ this round (a sibling agent is in that directory for #6634) — so filed per Prime Directive #10.

Fact

Two decision records carry 8 relative links into the source tree whose targets do not exist. Measured at origin/main 2c2a212a3, and independently reproduced with the pinned lychee 0.24.2 (lycheeverse/lychee-action@v2) over docs/adr/**/*.md:

[docs/adr/0004-cloud-multi-kernel.md]:
[ERROR] .../apps/studio/src/routes/projects.$projectId.index.tsx (at 94:19) | File not found
[ERROR] .../apps/studio/src/routes/projects.index.tsx            (at 93:17) | File not found
[ERROR] .../packages/runtime/src/kernel-manager.ts               (at 67:24) | File not found
[ERROR] .../packages/runtime/src/project-kernel-factory.ts       (at 68:38) | File not found

[docs/adr/0020-state-machine-converge-and-enforce.md]:
[ERROR] .../examples/app-crm/src/flows/high-value-deal.flow.ts             (at 138:240) | File not found
[ERROR] .../examples/app-crm/src/flows/stale-opportunity.flow.ts          (at 138:327) | File not found
[ERROR] .../examples/app-crm/src/workflows/stale-opportunity.workflow.ts  (at  48:108) | File not found
[ERROR] .../packages/spec/src/contracts/workflow-service.ts               (at  43:23)  | File not found

All 8 are prose links, not illustrative examples: each is written as the reader's way to go look at the implementation the record is describing (**KernelManager** ([...](../../packages/runtime/src/kernel-manager.ts)): LRU+TTL cache of ...).

Why each is ambiguous rather than a filename typo

None is a near-miss that a rename would fix, so #6592 did not guess:

  • apps/studio/** — apps/ in this repository now contains only docs/. Studio lives in a sibling repo, so the target is not reachable by any relative path from here.
  • packages/runtime/src/kernel-manager.ts, packages/runtime/src/project-kernel-factory.ts — no file of either name exists anywhere in the tree (find over the whole repo returns nothing).
  • packages/spec/src/contracts/workflow-service.ts — no workflow-service* under packages/spec/src.
  • examples/app-crm/src/workflows/ — the directory does not exist; examples/app-crm/src/ has flows/ but not these two files.

So the fix is a decision per link, not a sweep: repoint at wherever the code went, replace the link with a plain (unlinked) path, or drop the reference because the code left this repo. That is ADR-editing work and wants an author who can say which.

Why it matters now

PR for #6592 lands scripts/check-adr-links.mjs, and these 8 are frozen individually on its KNOWN_DEAD_TARGETS shrink-only baseline so the gate can be green on arrival instead of red on every PR from day one. The baseline is shrink-only and enforced in both directions: fixing a link here makes its baseline entry fail as stale, so whoever fixes the record must delete the entry in the same change — the gate names each one for you.

Note the direction of the pressure: this is the only reason the gate ships with a baseline at all. The ADR-to-ADR surface (the class #6592 was filed for) is completely clean today — 527 relative destinations under docs/adr/ resolve, 0 cross-record breaks, after #6593 fixed ADR-0057's.

Severity

Observation-class as filed: no user path, no runtime behaviour. The cost is agent navigation — PD #13 sends the next author to go read the decision, the decision points at a file, the file is not there. Labelled finding, no pm:queue; severity is the PM's to grade.

Activity

  1. added
    domain:devxDomain lane — seat card indexed by label:pm:seat
    findingRecorded observation — held, not dispatchable until the findings triage round grades it
    on Aug 8, 2026
  2. os-project-manager commented on Aug 9, 2026

    @os-project-manager
    CollaboratorAuthor

    Triage (maintainer-authorized one-off pass, 2026-08-09, registered on #6015): promoted finding → pm:queue (domain:devx kept). The census is done and independently reproduced; repairing/annotating the 8 dead links lets #6592's gate drop its baseline, which is the difference between a gate and a grandfather clause. ⚠️ The PR edits docs/adr/**: maintainer-merged only per standing discipline. Serialize behind whatever ADR-directory work is still in flight (#6634 sibling note in the filing).


    Generated by Claude Code

  3. added
    pm:queueReady for the PM dispatch loop
    and removed
    findingRecorded observation — held, not dispatchable until the findings triage round grades it
    on Aug 9, 2026
  4. self-assigned this
    on Aug 10, 2026
  5. os-help commented on Aug 10, 2026

    @os-help
    Collaborator

    Claim: PM loop round 1 (devx seat, new term)
    Session: session_01YS2qzDAn3CpWdY7uBX9bFQ
    Branch: claude/issue-6726-adr-dead-links
    Worktree: objectstack-issue-6726
    Domain: domain:devx
    File surface: docs/adr/0004-cloud-multi-kernel.md, docs/adr/0020-state-machine-converge-and-enforce.md, and the corresponding KNOWN_DEAD_TARGETS baseline entries in scripts/check-adr-links.mjs (shrink-only deletions, per the gate's own stale-entry enforcement)
    Container & model: M card, mode:subagent shared container, model: opus
    Serial constraints cleared: in-flight ADR-directory PRs checked at claim time — #7316 (ADR-0107 tombstone) touches a different record; dev merges origin/main before opening the PR and re-checks overlap on scripts/check-adr-links.mjs. #6634 (the sibling that barred ADR edits during #6592) is no longer in flight per the promotion comment.

    ⛔ Landing discipline: this PR edits docs/adr/** — per #6741 it is maintainer-merged only. The seat will review and leave it visibly awaiting a human merge; no ready-flip into auto-merge, no queueing.


    Generated by Claude Code

  6. os-help commented on Aug 10, 2026

    @os-help
    Collaborator

    ACCEPT (review complete) — PR #7343, awaiting a human merge (devx seat, session session_01YS2qzDAn3CpWdY7uBX9bFQ).

    Review verdict: all 8 targets re-verified dead on origin/main before editing; route (b) applied uniformly with per-link git provenance (moves/deletions named by commit and PR); prose untouched beyond link syntax + path notes; KNOWN_DEAD_TARGETS is now EMPTY with a re-seeding prohibition in its doc comment — #6592's gate is a gate, not a grandfather clause, and a follow-up may now remove the baseline mechanism entirely. Verification ran in both directions: fixed-links-vs-full-baseline went red as 8 STALE entries (proof each repair removed a real dead link), empty-baseline-vs-restored-link went red as a new break (proof the empty baseline absorbs nothing), and the final tree is green with the census dropping 531 → 523. skip-changeset applied (docs-only).

    ⛔ Per #6741, this PR edits docs/adr/** and is maintainer-merged only. It stays a draft, visibly hanging; no auto-merge, no queueing from any AI seat. It will be listed under "awaiting a human merge" in every round report until the maintainer lands or declines it.


    Generated by Claude Code

  7. added a commit that references this issue on Aug 17, 2026
    18ff1da
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

domain:devxDomain lane — seat card indexed by label:pm:seatpm:dispatchedDispatched to a dev agent by /pm-dispatch

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions