docs(adr): repair stale full-path citations across the ADR corpus, and date ADR-0113's pre-P0 Context - #15160
Conversation
…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
…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
…r-path-rot-repair
|
Note from the PM seat 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
|
merge-conflict-resolved
The conflict, and why the resolution is mechanicalOne line, edited independently by each side since the merge base Main side — a single commit touched this record in that range: It narrowed the generator's stated output to one artifact and appended a dated retirement note. Branch side — 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: The strongest reading available, and it is the one that settles it: Verification — all at
|
维护者速读(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 跳过; 席位意见:建议入队。 你要做的:点「入队」。 Generated by Claude Code |
Fixes #14279
Fixes #14193
Docs-only citation hygiene over
docs/adr/**, folding both cards into one pass per triage.Draft on purpose —
docs/adr/**is a governed surface, so a human merges this; auto-merge isnever armed. ⛔ No decision text is changed in any record: every edit is a path, a dated note, or an
anchor spelling.
skip-changesetapplied: 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 reproducesexactly once its definition is stated:
docs/adr/**(all spellings)checkBarePathsfigure inscripts/check-adr-symbol-anchors.mjs's own header.changeset/…)So the delta against 61 is definitional, not drift. 61 counted distinct paths and skipped the
three
.changeset/*.mdmentions; the repair surface is mentions, and there are 96 of them.Measured at three trees — the census commit
83be46012, the dispatch pin8f68e5083andebb082204— the full-path count moved only 94→96, so the corpus is not drifting quickly.scripts/symbol-anchors.mjs, withcheckBarePathsturned on), so a token this measurement sees is a token the shipped gate sees. TheFULL-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.git logon the session's checkout began at 2026-05-30, so every file deleted before that datereported "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 21of 64 paths. The clone was deepened (
git fetch --unshallow, 7,255 → 12,516 commits, back to the2026-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/studioreturned nothing). Every verdict below uses--full-history.git log --diff-filter=DR -- <path>reports aclean
Dwhere the whole-commit diff reportsR099. Verdicts therefore locate the commit bygit log, then read the rename offgit show --name-status --find-renameswith no pathspec.Under the pathspec reading,
packages/objectql/src/protocol.tslooked deleted; it had moved.What was done — the moved / deleted split
MOVED — file survives at a new path — rewritten to the current path
git log --full-history, whole-commit rename detection)packages/objectql/src/protocol.ts13dbcf2d0R099packages/metadata-protocol/src/protocol.tspackages/objectql/src/sys-metadata-repository.ts13dbcf2d0R100packages/metadata-protocol/src/sys-metadata-repository.tspackages/platform-objects/src/metadata/sys-metadata.object.ts764c74752R100packages/metadata-core/src/objects/sys-metadata.object.tspackages/platform-objects/src/metadata/sys-view-definition.object.ts764c74752R100packages/metadata-core/src/objects/sys-view-definition.object.tspackages/cli/src/utils/lint-flow-patterns.ts4b945fc5eR100packages/lint/src/lint-flow-patterns.tsexamples/app-showcase/src/datasources/external-fixture.tse03d2fc79R100examples/app-showcase/src/system/datasources/external-fixture.tsscripts/adr-anchors.json123b6c6bf(sharded one file per anchor)scripts/adr-anchors/packages/spec/api-surface.jsone3ef52b5a(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
git log --full-history, whole-commit rename detection)packages/verify/read-coercion.ts3fd3576aapackages/verify/src/read-coercion.tsscripts/build-react-blocks-contract.tsc1e3a6547packages/spec/scripts/build-react-blocks-contract.tsscripts/check-react-blocks-declaration-parity.ts9c934650epackages/spec/scripts/check-react-blocks-declaration-parity.tsscripts/i18n-extract.config.ts6bacbced2, 2026-05-22); no root file ever existedpackages/platform-objects/scripts/i18n-extract.config.tsCROSS-REPO — alive in the sibling
objectui, never in this repo — re-spelled as the corpus'sobjectui:cross-repo anchorgit log --full-history, whole-commit rename detection)packages/app-shell/.../LayeredDiff.tsxobjectui:packages/app-shell/src/views/metadata-admin/LayeredDiff.tsxpackages/data-objectstack/src/index.tsobjectui:packages/data-objectstack/src/index.tspackages/app-shell/src/views/ObjectView.tsxobjectui:packages/app-shell/src/views/ObjectView.tsxpackages/plugin-report/src/DatasetReportRenderer.tsxobjectui:packages/plugin-report/src/DatasetReportRenderer.tsxpackages/app-shell/src/views/metadata-admin/inspectors/ReportDefaultInspector.tsxobjectui:packages/app-shell/…/ReportDefaultInspector.tsxpackages/core/src/styling/scoped-styles.tsobjectui:packages/core/src/styling/scoped-styles.tsRENAMED — the concept was renamed; identity changed — path kept, dated note names the successor
git log --full-history, whole-commit rename detection)packages/platform-objects/src/identity/sys-department.object.tse16f2a830R081→ sys-business-unit.object.tspackages/plugins/plugin-sharing/src/department-graph.tse16f2a830R067→ business-unit-graph.tspackages/plugins/plugin-security/src/objects/sys-role.object.ts6d83431cfR093→ sys-position.object.tspackages/plugins/plugin-sharing/src/role-graph.ts6d83431cfR→ position-graph.tspackages/spec/src/cloud/project-artifact.zod.ts944f18758R→ environment-artifact.zod.tsDELETED — removed, no successor in this repo — path kept, dated note carries the deletion commit
git log --full-history, whole-commit rename detection)packages/metadata/src/projection/metadata-projector.ts516f48ca9D — the very commit that implemented ADR-0005packages/runtime/src/kernel-manager.tsruntime/src/cloud/(60fc50186), tree removed by #1600packages/runtime/src/project-kernel-factory.ts7dcde27c1then removed withruntime/src/cloud/packages/runtime/src/cloud/marketplace-install-local-plugin.ts15fcd360dD (ADR-0006 Phase 4)packages/runtime/src/cloud/marketplace-proxy-plugin.ts15fcd360dDpackages/services/service-ai/src/tools/action-tools.ts21d4f8901D (service-ai removed, ADR-0025 S2)packages/services/service-ai/src/tools/query-data.tool.ts21d4f8901Dpackages/services/service-ai/src/schema-retriever.ts21d4f8901Dpackages/services/service-tenant/src/objects/sys-environment.object.ts473fce590D (control-plane split to objectstack-ai/cloud)packages/services/service-tenant/src/environment-provisioning.ts473fce590Dpackages/services/service-tenant/migrations/v4-to-v5-env-migration.ts473fce590Dpackages/services/service-tenant/src/objects/sys-package-installation.object.ts473fce590Dpackages/services/service-tenant/src/objects/sys-environment-credential.object.ts473fce590Dpackages/services/service-tenant/src/objects/sys-project.object.ts0ee839c53, then473fce590Dpackages/spec/src/cloud/project.zod.tsd4eed33abD — as this ADR's own Phase A prescribespackages/spec/src/automation/sync.zod.ts891d345a7D (L1 Simple Sync retired)packages/spec/src/data/external-lookup.zod.ts29488ccaeD (ADR-0049 enforce-or-remove)packages/spec/src/kernel/metadata-customization.zod.ts9e0ba21a1D (#13186)apps/cloud/objectstack.config.ts2a1fc869aD — split to objectstack-ai/cloud (#1257)apps/cloud/server/index.ts2a1fc869aD (#1257)apps/objectos/server/bootstrap.ts617016428D — split to objectstack-ai/cloud (#1259)apps/studio/src/routes/projects.index.tsx6bacbced2/06ad57f63docs/adr/0001-metadata-service-architecture.md9da8e3e72Ddocs/adr/0002-database-driven-metadata-storage.md9da8e3e72Ddocs/adr/README.md9da8e3e72Ddocs/adr/0107-hook-body-write-set-accepted-static-gap.md3bb382b67Dexamples/app-crm/src/flows/high-value-deal.flow.ts751cf0161Dexamples/app-crm/src/flows/stale-opportunity.flow.ts751cf0161D.changeset/adr-0079-record-title-gate.md1c114739e— consumed by the release, by design.changeset/overlay-index-single-producer.md24c1b91e4— consumed by the release.changeset/withdraw-adr-0107-drop-writes-proposal.md24c1b91e4— consumed by the releaseNEVER SHIPPED — a path the record PROPOSED; no file ever existed there — path kept, dated note says so explicitly
git log --full-history, whole-commit rename detection)packages/messaging-utils/src/safe-equal.tspackages/messaging-utils/in historypackages/messaging-utils/src/chunk-text.tspackages/messaging-utils/in historypackages/messaging-utils/src/lazy-module.tspackages/messaging-utils/in historypackages/spec/src/shared/error-map.tserror-map.tsanywhere in historycontent/docs/ai-copilot/live-schema.mdxcontent/docs/ai-copilot/in historypackages/service-cloud/src/routes/environment-crud.tspackages/service-cloud/src/routes/environment-lifecycle.tsscripts/check-source-token-ratchet.mjs62 distinct paths classified.
ALREADY ANNOTATED at
origin/main— no edit madeapps/console/src/__tests__/public-block-binding-reach.test.tsx(objectui)packages/app-shell/src/hooks/useConsoleActionRuntime.tsx`../objectui`Plus 26 further mentions across ADR-0001-withdrawn, ADR-0004 (its 2026-08 Path notes), ADR-0005 (its
#13185Correction 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 noteout specifically; it is real, and itcovers §2 and §5 but not the
Code:line in## References, which is why ADR-0004 still appearsin 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)alreadysaid the row was stale and deliberately deferred the repair to #14193 — this is that repair.
:19at the pin)packages/drivers/driver-sql/src/sql-driver.ts—if (field.required) col.notNullable()…/sql-driver.ts#createColumn, and followed by Superseded by this ADR's P0: the constraint keys off the explicitstorage.notNullat that same site:59at the pin; the card said:47— the file had moved)(packages/drivers/driver-sql/src/sql-driver.ts)— a bare, un-backticked pathpackages/drivers/driver-sql/src/sql-driver.ts#createColumnplus an italic at decision time; superseded by this ADR's P0 clauseThe
#13556anchor note gains a Resolved (2026-09, #14193) paragraph so the record does not goon claiming the repair is still outstanding.
#createColumnis the enclosing symbol of the livestorage.notNullsite, 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
--repoassertion holds; no STALE-TREE warning after mergingorigin/main) — 18/18 exit 0,each exit code captured by redirect before any pipe:
Run in addition (a derived family is not a complete account of CI):
The two ADR-anchor gates print their own verdicts:
@objectstack/formula/@objectstack/lint). That is NOT MEASURED, never a pass and never afinding; both were re-run to a real 0 after
pnpm installand a lock-wrappedturbo run build(scripts/pm/os-verify-lock.sh, VERDICTcommand-exit 0).⭐ The symbol-anchor gate caught a defect I introduced — my own resolution note cited a bare
sql-driver.ts#createColumnwith no directory. Fixed before commit; that is the gate doing its job.Reverse-verification, with both controls still discriminating
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.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):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