Repository navigation
RFM receipt: cross_type_comparison_answers_instead_of_refusing gains the prescribed-remedy specimen - #13581
Conversation
…se at runtime Appends RECEIPT THREE to cross_type_comparison_answers_instead_of_refusing. The #13179 refusal text ('==' compares an optional value with a required one) tells authors to compare against Present { value: .. }. A probe (claim_batch --claim-run, BuildBuddy invocation b5ff3a8c, on a tree whose declaring module is byte-identical to main 2ef4b29) shows that prescribed equality form adjudicates Bool(false) on a list whose head IS the compared value, while the match form of the same read passes — the runtime lifts the bare element when matching against a Present pattern and does not lift it for == against a constructed Optional variant. CI run 37728157032 adjudicated two claims Bool(false) under the prescribed spelling before the spelling was corrected to whole-list equality. Bound to immutable shas and run ids; the row's ceiling/trigger are untouched. The diagnostic wording itself goes to the operator.
briansrls
left a comment
There was a problem hiding this comment.
Approved at 6fdc224. The receipt is accurate and belongs on the existing cross_type_comparison_answers_instead_of_refusing authority. The interpreter's List.first realization returns the bare head value (or Null), while Optional Present/Absent patterns have a kernel raw-payload match path; equality has no corresponding lift. Thus the observed List.first() == Present { value: ... } shape reaches equality with different runtime representations and can answer false even though the same source-level Optional fact matches and its payload comparison holds. The #13179 diagnostic does explicitly prescribe either comparison against Present or matching, so the aggravation is real. The cited requirement-kind and host-preference facts are also directly established by the declaration lists, and the CI head/run identities are exact. Keeping the existing ceiling and joint-inhabitance trigger is correct.
Nonblocking cleanup: this row already has an earlier paragraph titled RECEIPT THREE, so rename the new paragraph RECEIPT FOUR. It would also be slightly more precise to say the review tell is the List.first/raw-payload Optional realization rather than suggesting every Optional-producing declaration necessarily uses that runtime representation. Exact-head CI is currently queued.
One receipt appended to the existing row
dag/gunbc/recurring_failure_mode/cross_type_comparison_answers_instead_of_refusing.dag— no new class, no other file.The finding. The #13179 checker refusal for
T? == Tprescribescompare against Present { value: .. }. A direct execution probe shows that prescribed equality form adjudicates Bool(false) at runtime on a list whose head IS the compared value, while the same read spelled as a match onPresentpasses:Instrument:
claim_batch --claim-run, subjecttest.claim.os_install_tiebreak_probe, BuildBuddy invocation b5ff3a8c-1be3-4009-85c1-04f6ed5038c4 (completed 2026-10-08T07:25:52Z), on tree a39504a whosegunbc.os_install_actuator_selection.dagis byte-identical to origin/main 2ef4b29. So the runtime lifts the bare element when matching against a Present pattern and does not lift it for==against a constructed Optional variant.Corroborating CI evidence. Run 37728157032 (PR #13573 head 2ad332d) adjudicated exactly two claims
returned Bool(false) cause=claim_failedunder the prescribed spelling —os_install_actuator_requirements_dispatch_through_kind_rowsandsrv3_actuator_host_selected_because_requirements_and_policy— both of which re-verify as true facts once the spelling stops using the equality form.Harm. The row's inverted-visibility shape with an aggravation: an author who follows the diagnostic's own remedy writes an assertion that can never be true (silent wrongness) or a guard that never fires (fail-open) — the compiler's message is the citation steering them there.
The diagnostic wording itself is being raised with the operator separately; this PR only files the receipt. Row ceiling/trigger untouched. Parses clean at the row entry (13 files emitted, 0 blocking).