docs(adr),chore(devx): reconstruct ADR-0079 + make every cited ADR number resolve - #6732
Merged
Merged
Conversation
…resolve (#6634) ADR-0079 was cited by 77 tracked files in this repo (14 occurrences inside packages/spec source alone) while docs/adr/ held no 0079 record. Nothing the citing sites SAID was wrong — the display-name contract they describe is the one the code implements — but the pointer was dead and the number was squatted. - docs/adr/0079-record-display-name.md — the record, reconstructed from the citations and labelled as a retroactive reconstruction (2026-08-08) rather than a contemporaneous record. Provenance is explicit: PR #2434's description places the contemporaneous original in objectstack-ai/cloud at docs/adr/0079-record-display-name.md, which is why docs/adr/0079-* never existed here — a cross-repo split, not a loss. The reconstruction reuses that slug and could not be diffed against the original (repo unreachable). Every clause carries a file:line citation; four questions the citations leave open are listed as open, not answered. - scripts/check-adr-anchors.mjs — third audit: every ADR-NNNN in a tracked file must name a record under docs/adr/. A sibling repo's registry is exempted structurally by a qualifier ("ObjectUI ADR-0001"), not by allowlist; two withdrawn/deleted numbers (0001, 0107) sit on a shrink-only allowlist audited in both directions. Red path exercised in --self-test over the real function (39 assertions) plus a live-tree ablation. Deletion-history chase: re-run on the FULL history (the local clone was shallow at 106 commits; unshallowed to 8810). docs/adr/0079-* has never existed here — the only path ever containing "0079" is .changeset/adr-0079-record-title-gate.md. Fixes #6634 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01F8q5J1MQyocgtNspb15fSn
|
The latest updates on your projects. Learn more about Vercel for GitHub. 1 Skipped Deployment
|
os-project-manager
marked this pull request as ready for review
August 8, 2026 13:47
os-project-manager
enabled auto-merge
August 8, 2026 13:47
os-project-manager
marked this pull request as draft
August 8, 2026 14:04
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Fixes #6634
The measurement, first — the card and the triage disagreed
The card said "~30 files, 14 in
packages/spec". The triage comment said "77 files". 77 reproduces exactly; ~30 does not.Method:
git grep -lI 'ADR-0079'over tracked files, no path filter, no excludes. Run at bothHEAD(2c2a212a3) and the card's own audit commit (1f65bfc39) — 77 both times, so the gap is not drift.Control probes (the scanner is reading the tree):
ADR-0080= 48 files,ADR-0078= 237 files.Where the card's numbers came from:
packages/spec" is an occurrence count, not a file count.packages/spechas 9 citing files; the non-test source among them holds exactly 14 occurrences (display-name.ts4 +object.zod.ts7 +index.ts1 +search-fields.ts1 +solution-blueprint.zod.ts1). So the card mixes units between its two numbers.ADR 0079,adr/0079,0079-,ADR-79all return 0 files). The closest structural reading is 77 minus the 41 one-linenameField:boilerplate citations inplatform-objects/plugins/services= 36. Reported as unreproduced rather than explained away.Independent confirmation arrived later, from the new gate itself: deleting the new record makes it report 78 citing files — the 77, plus the gate script that now cites ADR-0079 in its own comment.
The premise held, but the triage's explanation of it did not
docs/adr/0079-*is absent onorigin/mainwhile 0076-0078 and 0080-0082 are present. That part is confirmed.The deletion-history chase was re-run, and the first run was worthless. The local clone was shallow at 106 commits, so
git log --diff-filter=D -- docs/adr/returned empty for a reason that had nothing to do with ADR-0079. Unshallowed to 8810 commits (root reachable) and re-run:docs/adr/: only ADR-0107 (withdrawn, docs: withdraw ADR-0107, drop the structuredwritesproposal (#3700) #3735) and 0001/0002/README (2026-02-11).0079: exactly one —.changeset/adr-0079-record-title-gate.md.So "never existed here" is right. "Never existed" is wrong. PR #2434 — the ADR-0079 foundation PR, merged 2026-06-28 — ends its own description with:
The decision record was authored in the sibling⚠️
cloudrepo while every consumer of the decision was built here. This is a cross-repo split, not a loss, and it is the actual reason the pointer dangles.objectstack-ai/cloudis not reachable from this session, so the reconstruction could not be diffed against that original — the new record says so in its own Provenance section, and reuses the original's slug (record-display-name) so the two are recognisably one record.What landed
1.
docs/adr/0079-record-display-name.mdReconstructed from the citations, and labelled as a reconstruction in the Status line and a dedicated Provenance section: written 2026-08-08, six weeks after the decision, by reading the code that cites it. It does not pretend to be contemporaneous.
Ten decisions (D1-D10), each traceable to a citing site, quoted or cited by
file:line— the strongest beingpackages/spec/src/data/display-name.ts(the invariant and the eligibility allowlist),object.zod.ts:2082-2095(the alias normalization),objectql/src/engine.ts:5212andmetadata-protocol/src/protocol.ts:4793(the same precedence asserted at both search seams so they cannot drift), andlint/src/data-model-rules.ts:404-409(the maintainer's #6326 ruling that a second title pointer is not a tolerable alias).Four things the citations do not settle are recorded as open, not filled in — this is the part most worth your veto:
object.zod.ts:1684still says "for now"; nothing says what would make it fire.displayNameFieldalias — while its own copycat, ADR-0085'scompactLayout, ran "one deprecation window" and was retired.live.titleFormatis called retired by lint/skills/docs, isstatus: "live"inliveness/object.json, still parses, and is still interpolated by objectui. The citations agree on the behaviour and disagree on the word.codeis name-like to lint and not to spec.data-model-rules.ts:36includes it inNAME_LIKE_FIELDS; spec'sNAME_ISH_EXACTdoes not.2.
scripts/check-adr-anchors.mjs— direction 3The gate had checked only the ~30 ids registered in
adr-anchors.json. It now audits everyADR-NNNNin the tracked tree againstdocs/adr/.Repo-wide, three numbers dangled, not one — the card's "only dangling one" was true within its
packages/specscope:Two exemption mechanisms, deliberately different in kind:
ObjectUI ADR-0001,cloud ADR-0079,objectstack-ai/cloud ADR-0079. Available to every future citation, honest to a human reader, and it cannot hide a bare id that was meant to be ours. (A noise word likeseedoes not exempt anything — there is an assertion for exactly that hole.)UNRESOLVED_ADR_CITATIONS, shrink-only and audited in both directions: an entry whose number gains a record fails as stale (that is the squatting half of [finding] ADR-0079 is cited ~30 times repo-wide (14× in packages/spec) but no docs/adr/ file exists — dangling pointer, neighbours 0076–0078 and 0080–0082 all present #6634), and so does one nothing cites any more.Red path proven three ways, direction predicted before each run:
ADR-0079 is cited by 78 file(s) but names no record, listing them, offering0123as the next free numberObjectUI ADR-...Plus 39 self-test assertions over the real
auditCitedNumbers()(not an imitation), and a live-tree ablation that drops the allowlist and requires 0001 and 0107 to surface. One assertion islive-citation-scan-reads-the-tree— a scan that reads nothing would make every citation resolve vacuously, which is a phantom gate that fails silently.'ADR-' + '0202'), never written literally, because this file is itself in the tree the real scan reads.Verification
node scripts/check-adr-anchors.mjs --self-test— 39/39.node scripts/check-adr-anchors.mjs— OK; 19348 citations across 3164 files resolve..github/workflows/lint.ymlgate list, run one by one aftergit commit: 34 PASS. Three (check:app-nav-i18n,check:i18n,check:i18n-coverage) refused to run on an unbuilt workspace and each printed "Nothing was measured" — they read built CLI/Setup output, and this diff contains no package source.pnpm lint— exit 0.node scripts/check-nul-bytes.mjs— OK; plus a wider self-scan of both changed files for0x00-0x08 / 0x0b / 0x0c / 0x0e-0x1f / 0x7f, clean.No changeset —
skip-changesetA decision record and a repo gate script publish nothing: no package under
packages/is touched, so no version moves and there is nothing for a release note to say. Label applied by hand and read back.Generated by Claude Code