Skip to content

docs(adr),chore(devx): reconstruct ADR-0079 + make every cited ADR number resolve - #6732

Merged
os-project-manager merged 1 commit into
mainfrom
claude/issue-6634-adr-0079-stub
Aug 8, 2026
Merged

docs(adr),chore(devx): reconstruct ADR-0079 + make every cited ADR number resolve#6732
os-project-manager merged 1 commit into
mainfrom
claude/issue-6634-adr-0079-stub

Conversation

@os-project-manager

Copy link
Copy Markdown
Collaborator

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 both HEAD (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:

  • "14 in packages/spec" is an occurrence count, not a file count. packages/spec has 9 citing files; the non-test source among them holds exactly 14 occurrences (display-name.ts 4 + object.zod.ts 7 + index.ts 1 + search-fields.ts 1 + solution-blueprint.zod.ts 1). So the card mixes units between its two numbers.
  • "~30 files" I could not reproduce under any pattern (ADR 0079, adr/0079, 0079-, ADR-79 all return 0 files). The closest structural reading is 77 minus the 41 one-line nameField: boilerplate citations in platform-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 on origin/main while 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:

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:

ADR: objectstack-ai/cloud docs/adr/0079-record-display-name.md.

The decision record was authored in the sibling cloud repo 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/cloud is 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.md

Reconstructed 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 being packages/spec/src/data/display-name.ts (the invariant and the eligibility allowlist), object.zod.ts:2082-2095 (the alias normalization), objectql/src/engine.ts:5212 and metadata-protocol/src/protocol.ts:4793 (the same precedence asserted at both search seams so they cannot drift), and lint/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:

  1. No trigger for the staged required-refine. object.zod.ts:1684 still says "for now"; nothing says what would make it fire.
  2. No retirement window for the displayNameField alias — while its own copycat, ADR-0085's compactLayout, ran "one deprecation window" and was retired.
  3. "Retired" is used for a key that the ledger calls live. titleFormat is called retired by lint/skills/docs, is status: "live" in liveness/object.json, still parses, and is still interpolated by objectui. The citations agree on the behaviour and disagree on the word.
  4. code is name-like to lint and not to spec. data-model-rules.ts:36 includes it in NAME_LIKE_FIELDS; spec's NAME_ISH_EXACT does not.

2. scripts/check-adr-anchors.mjs — direction 3

The gate had checked only the ~30 ids registered in adr-anchors.json. It now audits every ADR-NNNN in the tracked tree against docs/adr/.

Repo-wide, three numbers dangled, not one — the card's "only dangling one" was true within its packages/spec scope:

number citing files disposition
0079 77 fixed by this PR
0001 2 (after the cross-repo rule) deleted 2026-02-11 — allowlisted
0107 3 withdrawn #3735 — allowlisted

Two exemption mechanisms, deliberately different in kind:

Red path proven three ways, direction predicted before each run:

ablation predicted observed
delete the new ADR-0079 record RED RED — ADR-0079 is cited by 78 file(s) but names no record, listing them, offering 0123 as the next free number
new file citing a nonexistent number RED RED — names the number, the file, the fix order
same id, written ObjectUI ADR-... GREEN GREEN

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 is live-citation-scan-reads-the-tree — a scan that reads nothing would make every citation resolve vacuously, which is a phantom gate that fails silently.

⚠️ One trap worth knowing if you edit the self-test: fixture ids are built ('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.
  • The .github/workflows/lint.yml gate list, run one by one after git 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 for 0x00-0x08 / 0x0b / 0x0c / 0x0e-0x1f / 0x7f, clean.

No changeset — skip-changeset

A 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

…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
@vercel

vercel Bot commented Aug 8, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

1 Skipped Deployment
Project Deployment Actions Updated (UTC)
objectstack Ignored Ignored Aug 8, 2026 1:47pm

Request Review

@github-actions github-actions Bot added the size/l label Aug 8, 2026
@os-project-manager os-project-manager added skip-changeset PR has no user-facing published change; bypasses the changeset gate and removed size/l labels Aug 8, 2026 — with Claude
@github-actions github-actions Bot added the documentation Improvements or additions to documentation label Aug 8, 2026
@os-project-manager
os-project-manager marked this pull request as ready for review August 8, 2026 13:47
@os-project-manager
os-project-manager added this pull request to the merge queue Aug 8, 2026
@os-project-manager
os-project-manager marked this pull request as draft August 8, 2026 14:04
Merged via the queue into main with commit 07eefb0 Aug 8, 2026
26 checks passed
@os-project-manager
os-project-manager deleted the claude/issue-6634-adr-0079-stub branch August 8, 2026 14:38
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation skip-changeset PR has no user-facing published change; bypasses the changeset gate

Projects

None yet

1 participant