Observation recorded while implementing #8340. Not a defect today — the three copies currently agree.
#8340 added shared builders next to the marker they report on, in packages/lint/src/system-fields.ts:
unprovisionedAnchorCause(objectName, field) — the evidentiary sentence (which column, which object, why the platform registered an anchor it did not provision);unprovisionedAnchorHint(objectName, field) — the two ways out.
Its four rules (validate-widget-bindings, validate-react-page-props, validate-page-field-bindings, validate-flow-template-paths) compose those with their own position prefix and consequence clause. #8116's two originals still carry their own hand-written copies of the same sentence:
warnUnprovisionedAnchors in packages/lint/src/validate-expressions.ts;unprovisionedPointer in packages/lint/src/validate-semantic-roles.ts.
They were left alone deliberately: #8340's declared file surface stopped at the filter/binding rules, and rewriting a shipped diagnostic's wording is not free. But this is the shape #4330 removed from the system-field lists one layer down — five hand-copied lists that had already drifted — and the drift here is worse than cosmetic: the sentence is what an author checks against their remote schema, and three wordings of one verdict read as three different findings. system-fields.ts already names these two as the convergence target when either is next touched.
Suggested disposition: fold in opportunistically, on the next change to either file, rather than as a standalone churn PR. The behavioural pin that would catch a real divergence (all sites report the same object/column/reason) does not exist either way.
Pointers: #4330, #7865, #8116, #8340.
Observation recorded while implementing #8340. Not a defect today — the three copies currently agree.
#8340 added shared builders next to the marker they report on, in
packages/lint/src/system-fields.ts:unprovisionedAnchorCause(objectName, field)— the evidentiary sentence (which column, which object, why the platform registered an anchor it did not provision);unprovisionedAnchorHint(objectName, field)— the two ways out.Its four rules (
validate-widget-bindings,validate-react-page-props,validate-page-field-bindings,validate-flow-template-paths) compose those with their own position prefix and consequence clause. #8116's two originals still carry their own hand-written copies of the same sentence:warnUnprovisionedAnchorsinpackages/lint/src/validate-expressions.ts;unprovisionedPointerinpackages/lint/src/validate-semantic-roles.ts.They were left alone deliberately: #8340's declared file surface stopped at the filter/binding rules, and rewriting a shipped diagnostic's wording is not free. But this is the shape #4330 removed from the system-field lists one layer down — five hand-copied lists that had already drifted — and the drift here is worse than cosmetic: the sentence is what an author checks against their remote schema, and three wordings of one verdict read as three different findings.
system-fields.tsalready names these two as the convergence target when either is next touched.Suggested disposition: fold in opportunistically, on the next change to either file, rather than as a standalone churn PR. The behavioural pin that would catch a real divergence (all sites report the same object/column/reason) does not exist either way.
Pointers: #4330, #7865, #8116, #8340.