Reading taken 2026-09-18T16:53Z on origin/main@221dabb72 via git show origin/main:packages/objectql/src/engine.ts.
Defect
buildSummaryIndex resolves a roll-up's foreign-key field by comparing the child field's carrier to the parent's name:
:9033 if ((cd?.type === 'master_detail' || cd?.type === 'lookup') && cd?.reference === parent.name) {
:9034 fkField = cfName;
:9035 break;
:9036 }
…
:9039 if (!fkField) continue; // can't resolve the relationship — skip
An unreadable carrier (a non-string where FieldSchema.reference declares an optional string) compares false against every name, fkField stays unset, and :9039 takes the continue. ⇒ a declared summary field silently never recomputes, with no diagnostic anywhere. The comment on :9039 says 「can't resolve the relationship」, which is accurate about the code and silent about the consequence.
⭐ This exact symptom has already happened once, through a different read
#9154 (closed completed): 「the roll-up summary index's registry read swallows into an empty index — and CACHES the invented emptiness, so every parent roll-up silently stops recomputing」. Same index, same outcome, different input: that card's read was the registry read; this one is the carrier equality read on the same function. ⇒ the index has two ways to conclude 「nothing to recompute」 from a failure, and only one of them has been closed.
That is the argument for this card existing: a fixed sibling makes the symptom's cost known rather than hypothetical.
What this card is asking for, stated honestly
This site is already classified. PR #18503 recorded it in its C2 list (as engine.ts:8989, the same code before the file moved) and drew that boundary deliberately, and the #18550 round — whose ten routed sites are the C3 class — left it alone for exactly that reason rather than widening its declared surface.
⇒ this is a request to reopen a deliberately-drawn boundary, ⛔ not a new discovery, and it should be graded as such. If the answer is 「the boundary stands」, that is a legitimate outcome and worth recording on this card so the next reader of :9039 finds the decision instead of re-filing it.
Measurement
| reading |
value |
instrument |
| the equality read and the skip branch |
present as quoted, :9033 and :9039 |
git show origin/main:packages/objectql/src/engine.ts |
lit control: production paths in packages/objectql routed through the arbiter referenceCarrierOf |
0 (the only hit in this package family is a test in packages/cli) |
git grep -c referenceCarrierOf origin/main -- packages/objectql |
⇒ the engine's cascade paths were routed by PR #19080; this one was not, and the zero above is a reading rather than a dead grep (the token resolves elsewhere in the corpus).
Evidence limit
Static reading on one ref, plus a relayed reproduction this seat did ⛔ not re-run. What is NOT established: whether an unreadable carrier can reach a stored object definition today. #19080's probe established that the engine's own write path refuses this shape (insert → assertReferencesResolve → the same arbiter), so the row in that probe had to be written straight through the driver — which bears directly on how urgent this is, and on whether the honest fix is a refusal here or a narrowing further upstream. ⛔ Do not grade as a live outage without a reachability reading.
Provenance
Out-of-scope finding from the os-dev report on #18550 (PR #19080), re-measured by the domain:spec#3 execution seat against origin/main before filing; the #9154 adjacency is the seat's, found by dedup. Filed bare per the finding contract — grading, type and routing are the triage seat's production.
Dedup words
buildSummaryIndex reference equality, summary field never recomputes, C2 equality carrier read, engine 8989 summary index, can't resolve the relationship skip
Generated by Claude Code
Reading taken 2026-09-18T16:53Z on
origin/main@221dabb72viagit show origin/main:packages/objectql/src/engine.ts.Defect
buildSummaryIndexresolves a roll-up's foreign-key field by comparing the child field's carrier to the parent's name:An unreadable carrier (a non-string where
FieldSchema.referencedeclares an optional string) comparesfalseagainst every name,fkFieldstays unset, and:9039takes thecontinue. ⇒ a declaredsummaryfield silently never recomputes, with no diagnostic anywhere. The comment on:9039says 「can't resolve the relationship」, which is accurate about the code and silent about the consequence.⭐ This exact symptom has already happened once, through a different read
#9154 (closed
completed): 「the roll-up summary index's registry read swallows into an empty index — and CACHES the invented emptiness, so every parent roll-up silently stops recomputing」. Same index, same outcome, different input: that card's read was the registry read; this one is the carrier equality read on the same function. ⇒ the index has two ways to conclude 「nothing to recompute」 from a failure, and only one of them has been closed.That is the argument for this card existing: a fixed sibling makes the symptom's cost known rather than hypothetical.
What this card is asking for, stated honestly
This site is already classified. PR #18503 recorded it in its C2 list (as
engine.ts:8989, the same code before the file moved) and drew that boundary deliberately, and the #18550 round — whose ten routed sites are the C3 class — left it alone for exactly that reason rather than widening its declared surface.⇒ this is a request to reopen a deliberately-drawn boundary, ⛔ not a new discovery, and it should be graded as such. If the answer is 「the boundary stands」, that is a legitimate outcome and worth recording on this card so the next reader of
:9039finds the decision instead of re-filing it.Measurement
:9033and:9039git show origin/main:packages/objectql/src/engine.tspackages/objectqlrouted through the arbiterreferenceCarrierOfpackages/cli)git grep -c referenceCarrierOf origin/main -- packages/objectql⇒ the engine's cascade paths were routed by PR #19080; this one was not, and the zero above is a reading rather than a dead grep (the token resolves elsewhere in the corpus).
Evidence limit
Static reading on one ref, plus a relayed reproduction this seat did ⛔ not re-run. What is NOT established: whether an unreadable carrier can reach a stored object definition today. #19080's probe established that the engine's own write path refuses this shape (
insert→assertReferencesResolve→ the same arbiter), so the row in that probe had to be written straight through the driver — which bears directly on how urgent this is, and on whether the honest fix is a refusal here or a narrowing further upstream. ⛔ Do not grade as a live outage without a reachability reading.Provenance
Out-of-scope finding from the
os-devreport on #18550 (PR #19080), re-measured by thedomain:spec#3execution seat againstorigin/mainbefore filing; the #9154 adjacency is the seat's, found by dedup. Filed bare per the finding contract — grading,typeand routing are the triage seat's production.Dedup words
buildSummaryIndex reference equality,summary field never recomputes,C2 equality carrier read,engine 8989 summary index,can't resolve the relationship skipGenerated by Claude Code