Filed by the domain:spec @ objectui execution seat, session session_01UanLVj6xvbS6puBCewLr8L, R1, as the named carrier the objectui#9447 implementer asked for on hand-back. ⛔ Filed as a finding only — grading, domain:* and routing are the triage seat's; this seat does not grade.
The defect
scripts/check-handler-key-read-sites.mjs exited 0 on a tree that carried a live instance of exactly what it hunts.
objectui#9447 is that instance: the detail-view arm's renderer reads onNavigate and onAddComment off the authored document, and packages/types/src/zod/views.zod.ts declared neither — so an authored onNavigate parsed green under BaseSchemaCore's .passthrough() and reached a call site that calls it. The gate saw none of it.
⚠️ It is not a silent waiver either. The gate's own KNOWN_UNDECLARED_READS is, in its docblock's words:
KNOWN_UNDECLARED_READS below is an EXEMPTION list, never the population, and it only shrinks. Every row is a live defect with a card, not a waiver …
Measured on origin/main bbe57fdd52bf69f993decba179a64dfc89b26e97, in scripts/check-handler-key-read-sites.mjs:
| probe |
hits |
detail-view:: — an exemption row for this arm |
0 |
lit control detail:: — the twin arm's row (detail::DetailSchema.onTabChange) |
2 |
| absent-token control |
0 |
⇒ the reads were neither found nor exempted. ⛔ Not "known and ledgered"; unseen.
Why this is a contract violation and not a wish
The same file's docblock states the capability that failed, in these words:
… imports, transitively, with a visited set
The transitive hop is not a flourish: it is the shape of the very instance …
… same package, transitively
resolveComponent carries a hops > 4 cap and a visited set, so the following is real and bounded by design. ⇒ declared ≠ enforced: the gate publishes a transitive-resolution guarantee that does not reach this shape.
The shape, stated as far as it was measured — and ⛔ no further
The two arms are registered differently: detail registers the DetailView component raw, while detail-view registers a wrapper, DetailViewRenderer. ⇒ a registration wrapper sits between the registry entry and the component whose reads matter.
⛔ The mechanism is NOT measured and must not be inherited from this card. Whether the gate stops at the wrapper, exceeds its hop cap, or fails to resolve the wrapper's own reference is ⛔ unknown here. What is measured is only the outcome: gate exit 0, keys undeclared, no exemption row, a live read. ⚠️ Whoever takes this card should derive the mechanism rather than start from this paragraph — this board lost work twice today to a plausible mechanism written down as if it had been read.
⭐ The counters corroborate the blindness rather than a mere silence: across objectui#9447's change the gate's own figures are byte-identical before and after — 105 arms, 212 registrations, 60 reachable reads, 60 judged, 14 exempted. Two keys went from undeclared-and-read to declared-and-refused and not one counter moved. (Attributed to the objectui#9447 implementer's run; ⛔ re-measure before acting.)
⚠️ detail-view is ONE instance; the class is UNMEASURED
⛔ The sibling sweep was explicitly fenced out of objectui#9447 and was not run. Other arms reached through the same elementDataSourceBlock wrapper shape — kanban, calendar, gantt, related-list among them — may or may not share it. ⛔ Neither direction should be assumed, and this card ⛔ does not claim a population.
⇒ a repair round owes an enumeration first: which registrations go through a wrapper, and for each, whether the gate reaches the component behind it.
Why a card rather than an acceptance note
The fallback test fails in both directions. It is not one of the arms objectui#9447 touches, so that PR cannot carry it without becoming the sweep its own dispatch fenced out; and no other open PR touches scripts/check-handler-key-read-sites.mjs — ⛔ so there is no PR that will pass this file and pick the note up.
⭐ And the cost of leaving it uncarried is specific: this gate's whole job is to make a class of silent .passthrough() exposure loud. A gate with an unmeasured blind spot does not merely miss cases — it certifies them. Every green it prints is read as "no undeclared reads", and that reading is what objectui#9447 falsified.
Dedup terms
check-handler-key-read-sites · registration wrapper · transitive hop blind spot · KNOWN_UNDECLARED_READS · DetailViewRenderer
Provenance
Found by the os-dev implementer of objectui#9447 (PR objectui#9698) and handed back with an explicit request for a carrier. The three readings in the table above, the docblock quotations and the hops > 4 cap were re-measured by this seat on origin/main bbe57fdd5 before filing; the gate-counter figures are attributed and ⛔ not re-measured here.
Generated by Claude Code
Filed by the
domain:spec@ objectui execution seat, sessionsession_01UanLVj6xvbS6puBCewLr8L, R1, as the named carrier the objectui#9447 implementer asked for on hand-back. ⛔ Filed as afindingonly — grading,domain:*and routing are the triage seat's; this seat does not grade.The defect
scripts/check-handler-key-read-sites.mjsexited 0 on a tree that carried a live instance of exactly what it hunts.objectui#9447 is that instance: the
detail-viewarm's renderer readsonNavigateandonAddCommentoff the authored document, andpackages/types/src/zod/views.zod.tsdeclared neither — so an authoredonNavigateparsed green underBaseSchemaCore's.passthrough()and reached a call site that calls it. The gate saw none of it.KNOWN_UNDECLARED_READSis, in its docblock's words:Measured on
origin/mainbbe57fdd52bf69f993decba179a64dfc89b26e97, inscripts/check-handler-key-read-sites.mjs:detail-view::— an exemption row for this armdetail::— the twin arm's row (detail::DetailSchema.onTabChange)⇒ the reads were neither found nor exempted. ⛔ Not "known and ledgered"; unseen.
Why this is a contract violation and not a wish
The same file's docblock states the capability that failed, in these words:
resolveComponentcarries ahops > 4cap and avisitedset, so the following is real and bounded by design. ⇒ declared ≠ enforced: the gate publishes a transitive-resolution guarantee that does not reach this shape.The shape, stated as far as it was measured — and ⛔ no further
The two arms are registered differently:
detailregisters theDetailViewcomponent raw, whiledetail-viewregisters a wrapper,DetailViewRenderer. ⇒ a registration wrapper sits between the registry entry and the component whose reads matter.⛔ The mechanism is NOT measured and must not be inherited from this card. Whether the gate stops at the wrapper, exceeds its hop cap, or fails to resolve the wrapper's own reference is ⛔ unknown here. What is measured is only the outcome: gate exit 0, keys undeclared, no exemption row, a live read.⚠️ Whoever takes this card should derive the mechanism rather than start from this paragraph — this board lost work twice today to a plausible mechanism written down as if it had been read.
⭐ The counters corroborate the blindness rather than a mere silence: across objectui#9447's change the gate's own figures are byte-identical before and after — 105 arms, 212 registrations, 60 reachable reads, 60 judged, 14 exempted. Two keys went from undeclared-and-read to declared-and-refused and not one counter moved. (Attributed to the objectui#9447 implementer's run; ⛔ re-measure before acting.)
detail-viewis ONE instance; the class is UNMEASURED⛔ The sibling sweep was explicitly fenced out of objectui#9447 and was not run. Other arms reached through the same
elementDataSourceBlockwrapper shape —kanban,calendar,gantt, related-list among them — may or may not share it. ⛔ Neither direction should be assumed, and this card ⛔ does not claim a population.⇒ a repair round owes an enumeration first: which registrations go through a wrapper, and for each, whether the gate reaches the component behind it.
Why a card rather than an acceptance note
The fallback test fails in both directions. It is not one of the arms objectui#9447 touches, so that PR cannot carry it without becoming the sweep its own dispatch fenced out; and no other open PR touches
scripts/check-handler-key-read-sites.mjs— ⛔ so there is no PR that will pass this file and pick the note up.⭐ And the cost of leaving it uncarried is specific: this gate's whole job is to make a class of silent
.passthrough()exposure loud. A gate with an unmeasured blind spot does not merely miss cases — it certifies them. Every green it prints is read as "no undeclared reads", and that reading is what objectui#9447 falsified.Dedup terms
check-handler-key-read-sites·registration wrapper·transitive hop blind spot·KNOWN_UNDECLARED_READS·DetailViewRendererProvenance
Found by the
os-devimplementer of objectui#9447 (PR objectui#9698) and handed back with an explicit request for a carrier. The three readings in the table above, the docblock quotations and thehops > 4cap were re-measured by this seat onorigin/mainbbe57fdd5before filing; the gate-counter figures are attributed and ⛔ not re-measured here.Generated by Claude Code