Skip to content

docs(adr): repair stale full-path citations across the ADR corpus, and date ADR-0113's pre-P0 Context - #15160

Merged
os-zhuang merged 6 commits into
mainfrom
claude/issue-14279-adr-path-rot-repair
Sep 5, 2026
Merged

docs(adr): repair stale full-path citations across the ADR corpus, and date ADR-0113's pre-P0 Context#15160
os-zhuang merged 6 commits into
mainfrom
claude/issue-14279-adr-path-rot-repair

Conversation

@claude

@claude claude Bot commented Sep 4, 2026

Copy link
Copy Markdown
Contributor

Fixes #14279
Fixes #14193

Docs-only citation hygiene over docs/adr/**, folding both cards into one pass per triage.
Draft on purposedocs/adr/** is a governed surface, so a human merges this; auto-merge is
never armed. ⛔ No decision text is changed in any record: every edit is a path, a dated note, or an
anchor spelling.

skip-changeset applied: this diff publishes nothing from any released package.

The measurement — re-derived, not inherited

The card's 61 was measured by PR #14277's dev on an older tree. I re-measured at
origin/main, then again after merging main, with my own instrument, and the number reproduces
exactly once its definition is stated:

Cut Count
Unresolved path mentions in docs/adr/** (all spellings) 1,050 mentions / 616-ish distinct — matches the checkBarePaths figure in scripts/check-adr-symbol-anchors.mjs's own header
…restricted to FULL repo paths (≥2 segments, first segment is a real top-level entry) 96 mentions / 64 distinct paths
…distinct paths excluding dot-directories (.changeset/…) 61 ← the card's number, reproduced to the digit

So the delta against 61 is definitional, not drift. 61 counted distinct paths and skipped the
three .changeset/*.md mentions; the repair surface is mentions, and there are 96 of them.
Measured at three trees — the census commit 83be46012, the dispatch pin 8f68e5083 and
ebb082204 — the full-path count moved only 94→96, so the corpus is not drifting quickly.

⚠️ The instrument reuses the ADR corpus's own extractor (scripts/symbol-anchors.mjs, with
checkBarePaths turned on), so a token this measurement sees is a token the shipped gate sees. The
FULL-path filter is the only thing added, and it is what separates the #14279 class from the
abbreviated spellings (objectql/src/protocol.ts) that gate's header already documents as noise.

⚠️ The shared clone was SHALLOW, and that silently falsifies every verdict

git log on the session's checkout began at 2026-05-30, so every file deleted before that date
reported "never existed"
— including paths ADR-0004's own 2026-08 Path note dates to
7dcde27c1 (2026-05-18). A moved-vs-deleted call taken on that tree would have been wrong for 21
of 64 paths. The clone was deepened (git fetch --unshallow, 7,255 → 12,516 commits, back to the
2026-01-18 initial commit) before any verdict was recorded. Two further traps, both corrected:

  • git log -- <path> applies history simplification and misses deletions in merge-heavy history
    (apps/studio returned nothing). Every verdict below uses --full-history.
  • Rename detection is disabled by a pathspec: git log --diff-filter=DR -- <path> reports a
    clean D where the whole-commit diff reports R099. Verdicts therefore locate the commit by
    git log, then read the rename off git show --name-status --find-renames with no pathspec.
    Under the pathspec reading, packages/objectql/src/protocol.ts looked deleted; it had moved.

What was done — the moved / deleted split

MOVED — file survives at a new path — rewritten to the current path

Path as cited Evidence (git log --full-history, whole-commit rename detection) Now
packages/objectql/src/protocol.ts 13dbcf2d0 R099 packages/metadata-protocol/src/protocol.ts
packages/objectql/src/sys-metadata-repository.ts 13dbcf2d0 R100 packages/metadata-protocol/src/sys-metadata-repository.ts
packages/platform-objects/src/metadata/sys-metadata.object.ts 764c74752 R100 packages/metadata-core/src/objects/sys-metadata.object.ts
packages/platform-objects/src/metadata/sys-view-definition.object.ts 764c74752 R100 packages/metadata-core/src/objects/sys-view-definition.object.ts
packages/cli/src/utils/lint-flow-patterns.ts 4b945fc5e R100 packages/lint/src/lint-flow-patterns.ts
examples/app-showcase/src/datasources/external-fixture.ts e03d2fc79 R100 examples/app-showcase/src/system/datasources/external-fixture.ts
scripts/adr-anchors.json 123b6c6bf (sharded one file per anchor) scripts/adr-anchors/
packages/spec/api-surface.json e3ef52b5a (sharded per entry point) packages/spec/api-surface/

MIS-SPELLED — never existed as cited; the named file was born elsewhere — rewritten to the real path

Path as cited Evidence (git log --full-history, whole-commit rename detection) Now
packages/verify/read-coercion.ts born at target, 3fd3576aa packages/verify/src/read-coercion.ts
scripts/build-react-blocks-contract.ts born at target, c1e3a6547 packages/spec/scripts/build-react-blocks-contract.ts
scripts/check-react-blocks-declaration-parity.ts born at target, 9c934650e packages/spec/scripts/check-react-blocks-declaration-parity.ts
scripts/i18n-extract.config.ts target predates the ADR (6bacbced2, 2026-05-22); no root file ever existed packages/platform-objects/scripts/i18n-extract.config.ts

CROSS-REPO — alive in the sibling objectui, never in this repo — re-spelled as the corpus's objectui: cross-repo anchor

Path as cited Evidence (git log --full-history, whole-commit rename detection) Now
packages/app-shell/.../LayeredDiff.tsx present in objectui (elision also expanded) objectui:packages/app-shell/src/views/metadata-admin/LayeredDiff.tsx
packages/data-objectstack/src/index.ts present in objectui objectui:packages/data-objectstack/src/index.ts
packages/app-shell/src/views/ObjectView.tsx present in objectui objectui:packages/app-shell/src/views/ObjectView.tsx
packages/plugin-report/src/DatasetReportRenderer.tsx present in objectui objectui:packages/plugin-report/src/DatasetReportRenderer.tsx
packages/app-shell/src/views/metadata-admin/inspectors/ReportDefaultInspector.tsx present in objectui objectui:packages/app-shell/…/ReportDefaultInspector.tsx
packages/core/src/styling/scoped-styles.ts present in objectui; two neighbours in the same table already use the prefix objectui:packages/core/src/styling/scoped-styles.ts

RENAMED — the concept was renamed; identity changed — path kept, dated note names the successor

Path as cited Evidence (git log --full-history, whole-commit rename detection) Now
packages/platform-objects/src/identity/sys-department.object.ts e16f2a830 R081 → sys-business-unit.object.ts
packages/plugins/plugin-sharing/src/department-graph.ts e16f2a830 R067 → business-unit-graph.ts
packages/plugins/plugin-security/src/objects/sys-role.object.ts 6d83431cf R093 → sys-position.object.ts
packages/plugins/plugin-sharing/src/role-graph.ts 6d83431cf R → position-graph.ts
packages/spec/src/cloud/project-artifact.zod.ts 944f18758 R → environment-artifact.zod.ts

DELETED — removed, no successor in this repo — path kept, dated note carries the deletion commit

Path as cited Evidence (git log --full-history, whole-commit rename detection) Now
packages/metadata/src/projection/metadata-projector.ts 516f48ca9 D — the very commit that implemented ADR-0005 — (annotated in place)
packages/runtime/src/kernel-manager.ts runtime/src/cloud/ (60fc50186), tree removed by #1600 — (annotated in place)
packages/runtime/src/project-kernel-factory.ts 7dcde27c1 then removed with runtime/src/cloud/ — (annotated in place)
packages/runtime/src/cloud/marketplace-install-local-plugin.ts 15fcd360d D (ADR-0006 Phase 4) — (annotated in place)
packages/runtime/src/cloud/marketplace-proxy-plugin.ts 15fcd360d D — (annotated in place)
packages/services/service-ai/src/tools/action-tools.ts 21d4f8901 D (service-ai removed, ADR-0025 S2) — (annotated in place)
packages/services/service-ai/src/tools/query-data.tool.ts 21d4f8901 D — (annotated in place)
packages/services/service-ai/src/schema-retriever.ts 21d4f8901 D — (annotated in place)
packages/services/service-tenant/src/objects/sys-environment.object.ts 473fce590 D (control-plane split to objectstack-ai/cloud) — (annotated in place)
packages/services/service-tenant/src/environment-provisioning.ts 473fce590 D — (annotated in place)
packages/services/service-tenant/migrations/v4-to-v5-env-migration.ts 473fce590 D — (annotated in place)
packages/services/service-tenant/src/objects/sys-package-installation.object.ts 473fce590 D — (annotated in place)
packages/services/service-tenant/src/objects/sys-environment-credential.object.ts 473fce590 D — (annotated in place)
packages/services/service-tenant/src/objects/sys-project.object.ts renamed 0ee839c53, then 473fce590 D — (annotated in place)
packages/spec/src/cloud/project.zod.ts d4eed33ab D — as this ADR's own Phase A prescribes — (annotated in place)
packages/spec/src/automation/sync.zod.ts 891d345a7 D (L1 Simple Sync retired) — (annotated in place)
packages/spec/src/data/external-lookup.zod.ts 29488ccae D (ADR-0049 enforce-or-remove) — (annotated in place)
packages/spec/src/kernel/metadata-customization.zod.ts 9e0ba21a1 D (#13186) — (annotated in place)
apps/cloud/objectstack.config.ts 2a1fc869a D — split to objectstack-ai/cloud (#1257) — (annotated in place)
apps/cloud/server/index.ts 2a1fc869a D (#1257) — (annotated in place)
apps/objectos/server/bootstrap.ts 617016428 D — split to objectstack-ai/cloud (#1259) — (annotated in place)
apps/studio/src/routes/projects.index.tsx 6bacbced2 / 06ad57f63 — (annotated in place)
docs/adr/0001-metadata-service-architecture.md 9da8e3e72 D — (annotated in place)
docs/adr/0002-database-driven-metadata-storage.md 9da8e3e72 D — (annotated in place)
docs/adr/README.md 9da8e3e72 D — (annotated in place)
docs/adr/0107-hook-body-write-set-accepted-static-gap.md 3bb382b67 D — (annotated in place)
examples/app-crm/src/flows/high-value-deal.flow.ts 751cf0161 D — (annotated in place)
examples/app-crm/src/flows/stale-opportunity.flow.ts 751cf0161 D — (annotated in place)
.changeset/adr-0079-record-title-gate.md 1c114739e — consumed by the release, by design — (annotated in place)
.changeset/overlay-index-single-producer.md 24c1b91e4 — consumed by the release — (annotated in place)
.changeset/withdraw-adr-0107-drop-writes-proposal.md 24c1b91e4 — consumed by the release — (annotated in place)

NEVER SHIPPED — a path the record PROPOSED; no file ever existed there — path kept, dated note says so explicitly

Path as cited Evidence (git log --full-history, whole-commit rename detection) Now
packages/messaging-utils/src/safe-equal.ts no packages/messaging-utils/ in history — (annotated in place)
packages/messaging-utils/src/chunk-text.ts no packages/messaging-utils/ in history — (annotated in place)
packages/messaging-utils/src/lazy-module.ts no packages/messaging-utils/ in history — (annotated in place)
packages/spec/src/shared/error-map.ts no error-map.ts anywhere in history — (annotated in place)
content/docs/ai-copilot/live-schema.mdx a HotCRM path; no content/docs/ai-copilot/ in history — (annotated in place)
packages/service-cloud/src/routes/environment-crud.ts never at that spelling; nearest real file went to objectstack-ai/cloud — (annotated in place)
packages/service-cloud/src/routes/environment-lifecycle.ts never at that spelling — (annotated in place)
scripts/check-source-token-ratchet.mjs a downstream app repo's script — (annotated in place)

62 distinct paths classified.

ALREADY ANNOTATED at origin/main — no edit made

Path as cited Where Why it was already safe
apps/console/src/__tests__/public-block-binding-reach.test.tsx ADR-0082 the sentence already says (objectui)
packages/app-shell/src/hooks/useConsoleActionRuntime.tsx ADR-0110 the line already says `../objectui`

Plus 26 further mentions across ADR-0001-withdrawn, ADR-0004 (its 2026-08 Path notes), ADR-0005 (its
#13185 Correction blocks), ADR-0006 v4, ADR-0020, ADR-0059 (its 2026-08-06 preamble amendment),
ADR-0079, ADR-0107-withdrawn and ADR-0130 — 28 of the 96 mentions were already covered, and none
of them was touched. The dispatch called ADR-0004's Path note out specifically; it is real, and it
covers §2 and §5 but not the Code: line in ## References, which is why ADR-0004 still appears
in the diff.

#14193 — ADR-0113's two Context sites

Triage's reading is the one implemented: ADR-0113 is not "inverted", it is a Context whose
present-tense wording outlived the P0 it motivated. The record's own Anchor note (#13556) already
said the row was stale and deliberately deferred the repair to #14193 — this is that repair.

Site Before After
Context table row (:19 at the pin) packages/drivers/driver-sql/src/sql-driver.tsif (field.required) col.notNullable() prefixed At decision time (2026-07-30), re-anchored …/sql-driver.ts#createColumn, and followed by Superseded by this ADR's P0: the constraint keys off the explicit storage.notNull at that same site
Prose sentence (:59 at the pin; the card said :47 — the file had moved) (packages/drivers/driver-sql/src/sql-driver.ts) — a bare, un-backticked path packages/drivers/driver-sql/src/sql-driver.ts#createColumn plus an italic at decision time; superseded by this ADR's P0 clause

The #13556 anchor note gains a Resolved (2026-09, #14193) paragraph so the record does not go
on claiming the repair is still outstanding. #createColumn is the enclosing symbol of the live
storage.notNull site, and the source comment there cites ADR-0113 back.

Verifiable criterion met: a reader of ADR-0113's Context can no longer mistake the pre-decision
row for the shipped mechanism — both sites are dated and both name the mechanism that replaced them.

Verification — all at b4a35292e (final commit)

Derived family, from node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack
(the --repo assertion holds; no STALE-TREE warning after merging origin/main) — 18/18 exit 0,
each exit code captured by redirect before any pipe:

0  node scripts/check-adr-0087-registration.mjs --self-test
0  node scripts/check-adr-links.mjs                        0  node scripts/check-adr-links.mjs --self-test
0  node scripts/check-adr-symbol-anchors.mjs               0  node scripts/check-adr-symbol-anchors.mjs --self-test
0  node scripts/check-ci-filter-parity.mjs                 0  node scripts/check-comment-mask-corpus.mjs
0  node scripts/check-closing-keyword-parity.mjs           0  node scripts/check-closing-keyword-parity.mjs --self-test
0  pnpm --filter @objectstack/lint run check:doc-formula-expressions
0  pnpm check:adr-anchors                                  0  pnpm check:changeset-gate-self-tests
0  pnpm check:cross-package-test-inputs                    0  pnpm check:doc-authoring
0  pnpm check:nul-bytes                                    0  pnpm check:pm-governed-merges
0  pnpm check:refd-timer-probe                             0  pnpm check:watch-hint-literal

Run in addition (a derived family is not a complete account of CI):

0  pnpm check:doc-anchors                                  -> 298 #fragment links across 410 files resolve
0  node scripts/check-system-context-census.mjs (+ --self-test)
0  node scripts/pm/check-governed-queue-guard.mjs --self-test

The two ADR-anchor gates print their own verdicts:

✅ check-adr-symbol-anchors: 1873 anchors across 134 records resolve — 187 symbol
   (169 declaration, 18 literal), 1665 file-level, 21 cross-repo, 6 exempt, 3 continuation.
   0 line anchors survive.
✅ check-adr-symbol-anchors --self-test: every finding class provoked, healthy anchors silent,
   population live, wiring pinned (1873 live anchors)

⚠️ Two of these gates first returned exit 3 = PREREQUISITE NOT MET (deps, then an unbuilt
@objectstack/formula / @objectstack/lint). That is NOT MEASURED, never a pass and never a
finding; both were re-run to a real 0 after pnpm install and a lock-wrapped
turbo run build (scripts/pm/os-verify-lock.sh, VERDICT command-exit 0).

⭐ The symbol-anchor gate caught a defect I introduced — my own resolution note cited a bare
sql-driver.ts#createColumn with no directory. Fixed before commit; that is the gate doing its job.

Reverse-verification, with both controls still discriminating

BASE  (origin/main 5c584231a): 96 stale full-path mentions, 28 already annotated, 68 UNANNOTATED
FINAL (this branch)         : 68 stale full-path mentions, 68 annotated,           0 UNANNOTATED

The remaining 68 are historical citations that are meant to stay unresolved — an ADR is a record
of its time — and every one now carries a dated note. (63 = 96 − 33 rewritten; the other 5 are new
mentions the notes themselves make when they name a path, and those sit inside the notes.)

The checker's coverage rule is declared, not inferred: a marker covers a mention on its own line or
within ±2 lines; a record-level note covers it only if that note actually names the path — by
exact spelling, basename, or a dir/… prefix.

⚠️ The first version of that rule false-greened, and the control is what caught it: any marker
anywhere in a long preamble excused every unresolved path in the record. Tightening it to "the note
must name the path" then surfaced two genuinely uncovered paths in ADR-0025's References that the
record-level note could not reach — both since annotated.

Controls, mutated / measured / restored inside one shell (restoration proven by blob hash against
HEAD, not by an exit code):

mutation on disk: grep=1   blob-changed=YES
CONTROL A  packages/runtime/src/kernel-manager.ts  (ABSENT)  -> FLAGGED     (uncovered 0 -> 1)
CONTROL B  packages/drivers/driver-sql/src/sql-driver.ts (PRESENT, 19 ADR mentions) -> never flagged
restored: blob == HEAD -> YES; git status clean -> YES; post-restore UNCOVERED = 0

33 ADR files touched — 32 for #14279 plus ADR-0113 for #14193 — which matches the table above
exactly.
Control-byte scan of every edited file and every body posted: clean.


Generated by Claude Code


Generated by Claude Code

…nt paths

Citation hygiene only -- no decision text is touched. Each rewritten path was
verified against full git history (the shared clone was shallow; deepened first,
because a shallow clone reports every pre-cutoff deletion as "never existed").

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012zGPuVVX3deAx9LdjK8jCk
@claude claude Bot added the skip-changeset PR has no user-facing published change; bypasses the changeset gate label Sep 4, 2026
@github-actions github-actions Bot added size/s documentation Improvements or additions to documentation labels Sep 4, 2026
…ing repo

Annotates every full-path citation in docs/adr/** that does not resolve and was
not already annotated: deleted / renamed / never-shipped paths keep their
historical spelling and gain a dated Path note carrying the evidence commit;
paths that live in the sibling objectui repo take the corpus's cross-repo
`objectui:` anchor form. No decision text is changed.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012zGPuVVX3deAx9LdjK8jCk
…l note did not reach

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012zGPuVVX3deAx9LdjK8jCk
…anchored by symbol

Both sites now say they describe the state at decision time (2026-07-30) and name
the storage.notNull site that superseded them, and the citation is a symbol anchor
(sql-driver.ts#createColumn) rather than a line number. No decision text changed.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012zGPuVVX3deAx9LdjK8jCk
@claude

claude Bot commented Sep 4, 2026

Copy link
Copy Markdown
Contributor Author

Note from the PM seat domain:devx @ objectstack (#6023), session session_012zGPuVVX3deAx9LdjK8jCk — 19:5xZ read: this PR reads mergeable_state: dirty against main (a conflict landed under it). It is a governed-surface PR (docs/adr/**), so this seat neither arms it nor rebases it; the human merger will need the branch brought up to main (a merge commit, never a rebase of someone else's branch). Recording it here so the conflict is visible before merge time; no other action taken.


Generated by Claude Code

…e docs/adr/0082 with main)

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012zGPuVVX3deAx9LdjK8jCk

Copy link
Copy Markdown
Contributor

merge-conflict-resolved

origin/main merged into claude/issue-14279-adr-path-rot-repair as a plain merge commit. ⛔ No rebase, no amend, no force-push — the push was an ordinary fast-forward b4a35292e..0685220f1. Draft state, labels, assignee, reviewers and auto-merge untouched.

new head 0685220f1 (merge commit; parents b4a35292e + b398ad258)
merged origin/main b398ad258
conflict exactly one file — docs/adr/0082-react-component-contract-governance.md
surface after merge 33 files, +106/−40, all under docs/adr/** — unchanged from before the merge

The conflict, and why the resolution is mechanical

One line, edited independently by each side since the merge base 5c584231a.

Main side — a single commit touched this record in that range:

9a33cdd8c refactor(spec,skills): gen:react-blocks emits one artifact — the markdown is the
          single AI-facing rendering (#15257)

It narrowed the generator's stated output to one artifact and appended a dated retirement note.

Branch sidea1865320e docs(adr): rewrite 27 moved/mis-spelled path citations to their current paths prefixed the generator's path, scripts/… to packages/spec/scripts/…. That is this PR's whole edit on this line: a path citation, no prose.

The two edits touch disjoint spans of one line, so the union is mechanical — no choice between two substantive texts was made, and none was available: main's new prose is carried over verbatim, and the PR's path repair is re-applied on top of it.

Resolved line:

`packages/spec/scripts/build-react-blocks-contract.ts` generates the AI-facing contract (`skills/objectstack-ui/references/react-blocks.md`) by reading the spec schemas (`z.toJSONSchema`, with `OS_EAGER_SCHEMAS=1` to resolve lazy schemas), taking each prop's spec-authored `.describe()`, and merging the React overlay. **Hand-authoring is rejected** — a hand-written contract drifts into fiction; a generated one is zero-drift by construction. *(#14296 item 3 = A, 2026-09-02: this generator also emitted a second, machine-readable rendering of the same table at `contracts/react-blocks.contract.json` — same four blocks, same prop counts, byte-identical `note`. It had zero consumers in either repo and charged the published skill bundle for a second copy of one table, so it is retired: the markdown is the single AI-facing output, and `check:react-blocks` verifies one artifact.)*

The strongest reading available, and it is the one that settles it: diff of the merged ADR-0082 against origin/main's copy of the same file returns exactly the three hunks this PR owns — the two Consumers path respellings, the generator path, and the parity-script path. Not one word of main's new note, and no other byte of main's version, differs. Main's text survives whole; the branch contributes only path spellings.

Verification — all at 0685220f1

Exit codes captured by redirect before any pipe.

Derived familynode scripts/pm/dispatch-gates.mjs --changed --commands --repo objectstack-ai/objectstack (the --repo assertion holds; no STALE-TREE warning, and the change set derives as 33 path(s) three-dot vs merge base): 20/20 exit 0.

0  node scripts/check-adr-0087-registration.mjs --base origin/main
0  node scripts/check-adr-0087-registration.mjs --self-test
0  node scripts/check-adr-links.mjs                    0  node scripts/check-adr-links.mjs --self-test
0  node scripts/check-adr-symbol-anchors.mjs           0  node scripts/check-adr-symbol-anchors.mjs --self-test
0  node scripts/check-ci-filter-parity.mjs             0  node scripts/check-comment-mask-corpus.mjs
0  node scripts/check-closing-keyword-parity.mjs       0  node scripts/check-closing-keyword-parity.mjs --self-test
0  pnpm --filter @objectstack/lint run check:doc-formula-expressions
0  pnpm check:adr-anchors                              0  pnpm check:changeset-gate-self-tests
0  pnpm check:cross-package-test-inputs                0  pnpm check:doc-authoring
0  pnpm check:driver-memory-census                     0  pnpm check:nul-bytes
0  pnpm check:pm-governed-merges                       0  pnpm check:refd-timer-probe
0  pnpm check:watch-hint-literal

The gates print their own verdicts, quoted rather than a bare exit code:

✅ check-adr-symbol-anchors: 1942 anchors across 135 records resolve — 193 symbol
   (174 declaration, 19 literal), 1728 file-level, 21 cross-repo, 6 exempt, 3 continuation.
   0 line anchors survive.
✅ check-adr-symbol-anchors --self-test: every finding class provoked, healthy anchors silent,
   population live, wiring pinned (1942 live anchors)
✅ check-adr-links: 650 relative link destination(s) under docs/adr/ resolve
check-nul-bytes: OK (scanned 7660 text file(s) — 7660 tracked, 0 untracked-not-ignored;
   skipped 7 binary; no raw ASCII control bytes).

⚠️ Six of those first returned exit 3 = PREREQUISITE NOT MET on an uninstalled tree (yaml, then tsx, then an unbuilt @objectstack/formula and @objectstack/lint). Exit 3 is NOT MEASURED — never a pass, never a finding. All six were re-run to a real 0 after pnpm install and two lock-wrapped builds (scripts/pm/os-verify-lock.sh, VERDICT command-exit 0, 166s and 12s held, 1s and 0s waited). Nothing is left unmeasured by name.

Governed-surface predicatenode scripts/pm/check-governed-merges.mjs --test over the PR's 33 changed paths:

governed-surface predicate: 33 of 33 path(s) hit the register (5 surfaces, repo-agnostic).
  ⛔  GOVERNED — a human merge is the review record for this PR (#9495 regime).
      No seat flips it ready, enqueues it, or arms auto-merge.
      docs/adr/** ×33 — architecture decision records

(Its GOVERNED verdict shares the digit 3 with the prerequisite code; here it is the predicate's own answer, printed above, not a refusal.)

Mergeability, through a SOUND probe. This checkout registers merge.os-regen.driver, which would answer for a driver CI does not run, so the probe is a bare shared clone with no merge driver — verified absent: git config --get merge.os-regen.driver exits 1 there, and git config --list --local shows no merge.* line at all. ⛔ Never -c merge.os-regen.driver=.

git -C PROBE.GIT merge-tree --write-tree af29b662b 0685220f1     # PROBE.GIT = the driver-free bare clone
  exit 0 — db6ba22c5931deb4a87723b15610ac61cd8acdff   (a tree oid, no conflict block)

Note af29b662b: a fresh git fetch origin main after the merge shows main has advanced one commit past b398ad258 (af29b662b — itself a merge-tree-probe fix), and the probe is run against that newer tip — so this is clean against main as it stands now, not only against what was merged.

Other readings: no conflict markers anywhere in the committed tree (git grep over docs/adr/*.md exits 1); control-byte scan (grep -naP over the class) of all 33 files, clean, zero bytes of output; working tree clean after the merge; no os-regen-pending marker was written by the merge driver, and the pre-commit hook did not refuse.

The merge changed no ADR content of its own: every one of the 33 files still differs from main only by this PR's citation repairs and dated notes.

This PR remains a DRAFT for a human merge. ⛔ Not armed, not enqueued, not flipped ready by this seat.


Generated by Claude Code

@claude
claude Bot requested review from hotlong and os-zhuang September 5, 2026 13:04
@os-zhuang
os-zhuang marked this pull request as ready for review September 5, 2026 13:21
@os-zhuang
os-zhuang enabled auto-merge September 5, 2026 13:21
@os-zhuang
os-zhuang added this pull request to the merge queue Sep 5, 2026

os-steve commented Sep 5, 2026

Copy link
Copy Markdown
Collaborator

维护者速读(skills 席代读,2026-09-05T13:3xZ;本 PR 属 devx 车道,其席位可更正)

改了什么:33 份 ADR 文档里 96 处过期的完整路径引用,逐处改成现在的路径或加一条「已移动/已删除」的日期注;ADR-0113 的 Context 补上日期。只改路径、注记和锚点拼写,没有一条决定文本被改动

为什么改:引用早已失效的路径,读 ADR 的人(和 agent)会去找不存在的文件;#14279#14193 两张卡合并处理。

风险与代价:纯文档,不碰任何包。唯一风险是把「已移动」误判成「已删除」——dev 发现共享克隆是浅克隆(历史只到 5 月 30 日),先补全历史再逐条判定,并记录了三棵树上的重测数。os-zhuang 已批准;13:02Z 已解过一次与 main 的冲突;CI 23 绿 / 10 跳过;mergeable_state: clean。开了 33 小时,只差入队。可回滚:一次 revert。

席位意见:建议入队。

你要做的:点「入队」。


Generated by Claude Code

Merged via the queue into main with commit 3a534fa Sep 5, 2026
36 checks passed
@os-zhuang
os-zhuang deleted the claude/issue-14279-adr-path-rot-repair branch September 5, 2026 13:46
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 needs-user-decision size/m skip-changeset PR has no user-facing published change; bypasses the changeset gate

Projects

None yet

4 participants