Skip to content

Dissolve the float-atom predicate into the canonical atom-identity accessor - #11618

Merged
gunbai-bot[bot] merged 2 commits into
mainfrom
float-atom-predicate-dissolution
Sep 19, 2026
Merged

gunbai-bot[bot] merged 2 commits into
mainfrom
float-atom-predicate-dissolution

Conversation

@gunbai-bot

@gunbai-bot gunbai-bot Bot commented Sep 18, 2026

Copy link
Copy Markdown
Contributor

Closes the open finding from review 67607 against #11575. The predicate hand-rolled the storage-shape match instead of consuming node_atom_identity_optional:

-  match node.kind {
-    TypeNode { connective: Atom { identity: id } } => id == ^dag_token_float_literal
-    _ => false
+  match node_atom_identity_optional(node: node) {
+    Present { value: id } => id == ^dag_token_float_literal
+    Absent => false

That accessor already owns the read and is consumed at v2.compiler.ingest, v2.compiler.body_lowering_fold and ~a dozen further sites — DESIGN §2 horizontal redundancy, §3 single authority. The three sibling copies beside it are evidence of debt, not precedent: v2.std.compilers.target_model already carries a dissolve-on row about dag_node_is_int_literal_atom being duplicated, and the new row arrived with no disposition tag at all.

Why this was open on main at all

The fix existed — #11615 carried it. I closed that PR as a duplicate of #11575 on its author's instruction, and "verified" by checking that its eight files exist on main.

That is a membership check, and it is blind to a content edit. It's the exact distinction I had written to another lane in the same hour. The files existed; one of them differed; the difference was this repair.

Closing #11615 was still the right outcome, for a reason I hadn't checked either: its compile_cli.dag predates #11561, so merging it would have reverted the workflow-clause correction that landed hours earlier. A right answer reached by a wrong check is a lucky one, not a correct one — and the luck didn't extend to this file.

What is not claimed

No behaviour change. node_atom_identity_optional answers Present with the identity exactly where the hand-rolled match bound id, and Absent everywhere it fell through to false. The executing evidence for this predicate remains #11575's enrolled weather_g0_prefix_parse_probe_test rows — the parse, the typed float_literal_not_lowered refusal, and the int control — which this does not touch.

🤖 Generated with Claude Code

…cessor

Review 67607 raised this against gunbc#11575 and it is still open against main: the predicate
hand-rolled `match node.kind { TypeNode { connective: Atom { identity: id } } => ... }` instead of
consuming `node_atom_identity_optional`, the accessor that already owns that read and is consumed at
`v2.compiler.ingest`, `v2.compiler.body_lowering_fold` and a dozen further sites. That is DESIGN
section 2's horizontal redundancy and section 3's single authority: a fifth private re-spelling of
one storage-shape read. The three sibling copies beside it are evidence of debt rather than
precedent -- `v2.std.compilers.target_model` already carries a dissolve-on row about
`dag_node_is_int_literal_atom` being duplicated -- and the new row arrived with no disposition tag
at all.

HOW THIS CAME TO BE OPEN ON MAIN, recorded because the failure is mine and the next person deserves
the real story rather than a tidy one. The fix existed: gunbc#11615 carried it. I closed that PR as a
duplicate of gunbc#11575 on its author's instruction, and I "verified" the claim by checking that
its eight files EXIST on main. That is a membership check. It is blind to a content edit, which is
precisely the distinction I had put in writing to another lane in the same hour. The files existed;
one of them differed; the difference was this repair.

Closing gunbc#11615 was still the right outcome for a reason I had not checked either: its
`compile_cli.dag` predates gunbc#11561, so merging it would have reverted the workflow-clause
correction that landed hours earlier. A right answer reached by a wrong check is not a correct
decision, it is a lucky one, and the luck did not extend to this file.

WHAT IS NOT CLAIMED: this changes no behaviour. `node_atom_identity_optional` answers Present with
the identity exactly where the hand-rolled match bound `id`, and Absent everywhere it fell to
`false`. The executing evidence for the float predicate is gunbc#11575's enrolled
`weather_g0_prefix_parse_probe_test` rows, which are unchanged by this and continue to discriminate
the parse, the typed refusal and the int control.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@gunbai-bot
gunbai-bot Bot added this pull request to the merge queue Sep 18, 2026
@gunbai-bot
gunbai-bot Bot removed this pull request from the merge queue due to a manual request Sep 18, 2026
Review 67887 is right and this is the repair. The first commit migrated ONE predicate onto
`node_atom_identity_optional` while three byte-identical siblings kept hand-rolling the same
storage-shape read four lines away, so the file carried TWO SPELLINGS OF ONE FACT -- which is worse
than the debt it replaced, because a reader now has to decide which spelling is current. DESIGN
section 3 names exactly this: editing X from its leaves upward preserves its root while every
intermediate state becomes observable and load-bearing, so the migration creates more authority
before it removes any.

MIGRATED, all in `v2.extdeps.languages.dag`, no new import (the accessor was already imported) and
no new concept: `dag_node_is_kw_true_atom`, `dag_node_is_kw_false_atom`,
`dag_node_is_int_literal_atom`, and the float one from the first commit.

AND ONE THE REVIEW DID NOT NAME, which is the sharpest instance of its own finding.
`dag_node_is_eval_literal_atom` CALLS those three predicates and then hand-rolled the same read
INLINE for its fourth case -- both spellings inside a single expression, three lines apart. Scoping
to the three named siblings would have left the function that composes them carrying the defect the
review is about. Migrated.

WHAT IS DELIBERATELY LEFT, so the boundary is stated rather than discovered: two occurrences of that
shape survive in this file and neither is this fact. `dag_inhabitant_atom` CONSTRUCTS an atom node
(a write, not a read), and `dag_binding_branded_atom_identity` returns `Optional<Symbol>` under
branding semantics rather than answering an identity comparison. Tree-wide the pattern appears 761
times per the review's own count; that is pre-existing debt this PR neither introduces nor is
obliged to clear, and the review scoped itself the same way.

NO BEHAVIOUR CHANGE, for the same reason as the first commit: `node_atom_identity_optional` answers
`Present` with the identity exactly where each hand-rolled match bound `id`, and `Absent` everywhere
each fell through to `false`. The executing evidence is unchanged -- gunbc#11575's enrolled
`weather_g0_prefix_parse_probe_test` rows for the float predicate, and the existing parse claims for
the int and keyword ones.

PROCESS NOTE: this PR was already ENQUEUED on a side-chat LAND ruling when the review landed. I
dequeued it rather than let a known half-migration compose. The ruling was scoped to the previous
sha and is void; a fresh one is required before this re-enters the queue.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@gunbai-bot
gunbai-bot Bot added this pull request to the merge queue Sep 18, 2026
Merged via the queue into main with commit 0155bbf Sep 19, 2026
4 checks passed
@gunbai-bot
gunbai-bot Bot deleted the float-atom-predicate-dissolution branch September 19, 2026 01:05
@briansrls
briansrls restored the float-atom-predicate-dissolution branch September 19, 2026 01:05
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant