Skip to content

Pin cross-site unprovisioned-anchor content invariant (wording convergence blocked by drift) - #8513

Merged
qq9340100 merged 1 commit into
mainfrom
claude/issue-8405-converge-anchor-cause
Aug 13, 2026
Merged

Pin cross-site unprovisioned-anchor content invariant (wording convergence blocked by drift)#8513
qq9340100 merged 1 commit into
mainfrom
claude/issue-8405-converge-anchor-cause

Conversation

@qq9340100

Copy link
Copy Markdown
Collaborator

Part of #8405#8405 is NOT fixed by this PR; it remains open pending a maintainer decision (see below).

What this is

#8405 asked to converge warnUnprovisionedAnchors (validate-expressions.ts) and
unprovisionedPointer (validate-semantic-roles.ts) onto the shared
unprovisionedAnchorCause/unprovisionedAnchorHint builders in system-fields.ts
(added by #8340), with byte-identical output as the acceptance bar — this is a
de-dup, not a rewording.

Diffing the emitted text programmatically (not by eye) against real sample args shows
both sites already drifted from the shared builders, and from each other, before
this PR touched anything:

  • validate-expressions.ts's cause clause: 'FIELD', an injected system column…
    (comma) vs. the shared unprovisionedAnchorCause()'s 'FIELD' is an injected system column… (space + "is"). The rest of the cause sentence is byte-identical.
  • validate-expressions.ts's hint clause: carries this column, declare 'FIELD' in the object's own fields… vs. the shared unprovisionedAnchorHint()'s carries 'FIELD', declare it in OBJECT_NAME's own fields… — the shared builder
    interpolates the real object name; the site hard-codes the generic "the object's".
  • validate-semantic-roles.ts's cause clause is a materially different sentence:
    double quotes instead of single, "no storage" instead of "NO storage", a
    differently-ordered reason clause ("…but the remote schema owns the table and no column backs it. Every consumer renders it empty on every record."), none of which
    matches the shared builder's text.
  • validate-semantic-roles.ts's hint clause ends "…otherwise point ${slot} at a real remote column" instead of the shared builder's ownership/systemFields opt-out
    language.

So the issue's own premise — "Not a defect today — the three copies currently
agree" — does not hold at the byte level this card's ruling requires. Wiring
either site to call the shared builders as written would change its emitted
diagnostic text for existing consumers, which is exactly what the ruling says to stop
and report instead of shipping under a de-dup card. See the #8405 dev report
(issue comment) for the full character-level diff evidence.

What this PR actually does

No production code changes. It adds the one thing that survives regardless of how
the wording question gets resolved: a cross-site content-invariant test
(validate-expressions.test.ts, describe('cross-site unprovisioned-anchor convergence (#8405)', …)) pinning that both sites report the same object, same
column, and the same ADR-0015 reason
even though their exact phrasing differs today.
A future edit to either site can drift in wording freely but can no longer silently
drop the object name, the field name, or the ADR-0015 citation that makes the finding
actionable.

Decision needed (see dev report open_questions)

Real convergence of the exact wording needs a deliberate decision, not a silent pick
under this card:

  • Recommended: a dedicated wording-alignment PR (with a changeset, since it
    changes shipped lint diagnostic text) that adopts the shared system-fields.ts
    builders as canonical everywhere and updates both originals' literal text to match.
  • Alternative: widen the shared builders to parametrize the differences so each site
    keeps its current exact text — not recommended, since it institutionalizes what
    looks like accidental drift as permanent, three-way design.
  • Alternative: do nothing further and rely only on the content-invariant pin added
    here — cheapest, but leaves the "three wordings of one verdict" trust gap finding: #8116's two unprovisioned-anchor diagnostics still hand-copy the cause sentence #8340 centralized into system-fields.ts #8405
    itself called worse than cosmetic.

skip-changeset: no production code changed, test-only addition, releases nothing.

Generated by Claude Code


Generated by Claude Code

)
#8405 asked to converge warnUnprovisionedAnchors (validate-expressions.ts)
and unprovisionedPointer (validate-semantic-roles.ts) onto the shared
unprovisionedAnchorCause/unprovisionedAnchorHint builders in
system-fields.ts, with byte-identical output as the acceptance bar.
Diffing the emitted text programmatically (not by eye) shows both sites
already drifted from the shared builders and from each other before this
change: this file uses '<field>', an injected... (comma) where the shared
cause() uses '<field>' is an injected... (space+is), and
validate-semantic-roles.ts uses a differently-worded/ordered reason clause
and a different hint ending entirely. The issue's "the three copies
currently agree" premise does not hold at the byte level this card's own
ruling requires, so wiring either site to call the shared builders as-is
would change its emitted diagnostic text -- exactly what the ruling says to
stop and report instead of shipping under a de-dup card.
No production code changes here. This adds the one thing that survives
regardless of how that wording question gets resolved: a content-invariant
pin proving both sites still report the same object, column and ADR-0015
reason, so future edits can drift in wording but not silently drop what
makes the finding actionable.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Jqe56GnYFddggeAyfkZFVz
@vercel

vercelBot commented Aug 13, 2026

Copy link
Copy Markdown

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

1 Skipped Deployment
ProjectDeploymentActionsUpdated (UTC)
objectstackIgnoredIgnoredAug 13, 2026 4:46pm

Request Review

@github-actions

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

No hand-written docs reference the 0 changed package(s). ✅

@qq9340100qq9340100 added skip-changeset PR has no user-facing published change; bypasses the changeset gate and removed size/s labels Aug 13, 2026 — with Claude
@qq9340100
qq9340100 marked this pull request as ready for review August 13, 2026 17:24
@qq9340100
qq9340100 added this pull request to the merge queueAug 13, 2026
Merged via the queue into main with commit 5818703Aug 13, 2026
32 checks passed
@qq9340100
qq9340100 deleted the claude/issue-8405-converge-anchor-cause branch August 13, 2026 17:38
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

skip-changesetPR has no user-facing published change; bypasses the changeset gatetests

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@qq9340100@claude