Blocked-by: none
⚠️ This card is a REBUILD of objectui#9318, which became unreachable. Rebuilt on the maintainer's instruction, 2026-09-13: 「我按抢救记录重建 #9318」.
⛔ The original card's body is not recoverable — GET /issues/9318 answers 404 while GET /issues/9318/comments answers 200 with three comments, the signature of content hidden with a suspended author account rather than of a deleted issue. Controls, same session and token: #9362 → 200, #5734 → 200, and a sweep of every visible issue number found 9 gaps ≥ 9000, of which only this one is referenced by an open PR.
⇒ everything below is salvaged from the three surviving comments, each of which was written by a different account than the hidden one. ⛔ Nothing here is reconstructed from memory, and ⛔ no figure is restated that the salvage does not carry.
What the work is
PR objectui#9366 implements this card and is open. Branch claude/issue-9318-rowcanon-verdict-from-lint, pushed c931579b3f.
rowCanonAdvisory in app-shell re-derives a 「is this root bound on this surface?」 verdict that @objectstack/lint already publishes as fieldRuleRootIssue / FIELD_RULE_BOUND_ROOTS. The card asks for the re-derivation to be replaced by the published authority on the slots whose bound-root set is the field-rule set.
The original card's own readings, and how they had drifted by dispatch time
From the domain:ui seat's claim (5651515871), which re-verified both sides of the seam before dispatching:
| reading |
card said |
measured at dispatch |
objectui references to fieldRuleRootIssue / FIELD_RULE_BOUND_ROOTS under packages/ |
0 |
0 |
rowCanonAdvisory |
celAuthoring.ts:184-283 |
celAuthoring.ts:271 |
FIELD_RULE_BOUND_ROOTS export |
validate-expressions.ts:688 |
:680 |
fieldRuleRootIssue export |
validate-expressions.ts:790 |
:782 |
⭐ The lit control fires, which is what makes that zero mean 「not used」 rather than 「not reachable」: packages/app-shell/package.json:85 declares "@objectstack/lint": "^17.0.0" and live objectui code already imports from it. The import path works; nobody had asked it this question.
⚠️ The implementing seat's own re-measurement later disagreed with the dispatch on the objectstack-side line numbers and said so rather than adopting them — :688 / :790 on origin/main 2b6a207 against the dispatch's :680 / :782, which came from a sibling checkout's local HEAD. The exported shape is unchanged either way, and line numbers are informational.
⛔ What this card explicitly does NOT ask for
The original card fenced these itself, and the claim endorsed the fences rather than letting a seat rediscover them:
- ⛔ Not 「start warning on wrong-layer
data.*」 — objectui already does. Anyone reading the parent card alone would wrongly think authors still get a false green.
- ⛔ Not 「promote it to
error」 — objectui's own docblock decided that on evidence: every save gate on this tier counts severity === 'error', so promoting it would refuse predicates already stored in customer metadata.
- ⛔ Not re-enabling the bare-shorthand arm —
row = null is deliberate, with a measured 100% false-positive rate recorded for it on the flattened / RLS tier.
⭐ The card's third instruction — the one the claim called the most important
if fieldRuleRootIssue's slot vocabulary does not cover every surface rowCanonAdvisory guards, say so and keep the local fallback for the uncovered surfaces — ⛔ never silently shrink coverage to match the helper.
It was honoured, and the answer was NO. From the os-dev-report (5651747919): the helper's vocabulary does not cover every guarded surface, and the local fallback is kept for the uncovered ones. Uncovered in opposite directions —
- a formula field's
expression binds FORMULA_ROOTS = ['record'], strictly narrower ⇒ the helper would stop advising previous.* / parent.* there;
- a conditional-formatting
condition binds record / current_user / user / features / os / ctx, strictly wider ⇒ the helper would tell an author to rewrite a predicate that works.
Both keep the local instrument, both are pinned as live controls, and ablation leg B1 performs the exact 「route everything through the helper」 tidy-up and shows both going red.
Grading
Clause-②: no — stated identically in both claims. rowCanonAdvisory is module-private in app-shell; consuming a cross-repo published API is not publishing one. Verified rather than assumed at implementation time: CelSchemaHint, CelPredicateField, celAuthoring, rowCanonAdvisory and FIELD_RULE_VERDICT_SLOTS each appear 0 times in the built packages/app-shell/dist/index.d.ts, against a lit control (MetadataResourceRouter, 1 hit).
domain:ui — evidenced by the claim's own first line (「Claimed by the domain:ui PM seat」).
- ⛔ No priority label is set here. The salvage does not carry the original's, and this seat does not grade. Triage owns the
priority:* and type fields on this card.
Provenance
The three surviving comments on the unreachable original: 5651515871 (claim + fences), 5651747919 (os-dev-report), 5652798679 (carrier repair adding the standalone Branch: line — part of a board-wide seat-template fault that hit 13 cards). They were also salvaged onto PR objectui#9366 at 5654286772 before this rebuild.
⚠️ If objectui#9318 becomes reachable again, this card is the duplicate — close this one, not it, and move the Fixes reference back.
Blocked-by: none
What the work is
PR objectui#9366 implements this card and is open. Branch
claude/issue-9318-rowcanon-verdict-from-lint, pushedc931579b3f.rowCanonAdvisoryinapp-shellre-derives a 「is this root bound on this surface?」 verdict that@objectstack/lintalready publishes asfieldRuleRootIssue/FIELD_RULE_BOUND_ROOTS. The card asks for the re-derivation to be replaced by the published authority on the slots whose bound-root set is the field-rule set.The original card's own readings, and how they had drifted by dispatch time
From the
domain:uiseat's claim (5651515871), which re-verified both sides of the seam before dispatching:fieldRuleRootIssue/FIELD_RULE_BOUND_ROOTSunderpackages/rowCanonAdvisorycelAuthoring.ts:184-283celAuthoring.ts:271FIELD_RULE_BOUND_ROOTSexportvalidate-expressions.ts:688:680fieldRuleRootIssueexportvalidate-expressions.ts:790:782⭐ The lit control fires, which is what makes that zero mean 「not used」 rather than 「not reachable」:
packages/app-shell/package.json:85declares"@objectstack/lint": "^17.0.0"and live objectui code already imports from it. The import path works; nobody had asked it this question.:688/:790onorigin/main 2b6a207against the dispatch's:680/:782, which came from a sibling checkout's local HEAD. The exported shape is unchanged either way, and line numbers are informational.⛔ What this card explicitly does NOT ask for
The original card fenced these itself, and the claim endorsed the fences rather than letting a seat rediscover them:
data.*」 — objectui already does. Anyone reading the parent card alone would wrongly think authors still get a false green.error」 — objectui's own docblock decided that on evidence: every save gate on this tier countsseverity === 'error', so promoting it would refuse predicates already stored in customer metadata.row = nullis deliberate, with a measured 100% false-positive rate recorded for it on theflattened/ RLS tier.⭐ The card's third instruction — the one the claim called the most important
It was honoured, and the answer was NO. From the
os-dev-report(5651747919): the helper's vocabulary does not cover every guarded surface, and the local fallback is kept for the uncovered ones. Uncovered in opposite directions —expressionbindsFORMULA_ROOTS = ['record'], strictly narrower ⇒ the helper would stop advisingprevious.*/parent.*there;conditionbindsrecord/current_user/user/features/os/ctx, strictly wider ⇒ the helper would tell an author to rewrite a predicate that works.Both keep the local instrument, both are pinned as live controls, and ablation leg B1 performs the exact 「route everything through the helper」 tidy-up and shows both going red.
Grading
Clause-②: no— stated identically in both claims.rowCanonAdvisoryis module-private inapp-shell; consuming a cross-repo published API is not publishing one. Verified rather than assumed at implementation time:CelSchemaHint,CelPredicateField,celAuthoring,rowCanonAdvisoryandFIELD_RULE_VERDICT_SLOTSeach appear 0 times in the builtpackages/app-shell/dist/index.d.ts, against a lit control (MetadataResourceRouter, 1 hit).domain:ui— evidenced by the claim's own first line (「Claimed by thedomain:uiPM seat」).priority:*andtypefields on this card.Provenance
The three surviving comments on the unreachable original:
5651515871(claim + fences),5651747919(os-dev-report),5652798679(carrier repair adding the standaloneBranch:line — part of a board-wide seat-template fault that hit 13 cards). They were also salvaged onto PR objectui#9366 at5654286772before this rebuild.Fixesreference back.