Skip to content

XL-2: transport kind is a closed choice of literal terminals; delete the last NameRoleNotYetRead row - #12757

Merged
gunbai-bot[bot] merged 2 commits into
mainfrom
session/keen-fox-715-transport
Sep 30, 2026
Merged

gunbai-bot[bot] merged 2 commits into
mainfrom
session/keen-fox-715-transport

Conversation

@gunbai-bot

@gunbai-bot gunbai-bot Bot commented Sep 30, 2026 •

Copy link
Copy Markdown
Contributor

XL-2 follow-up to #12598, per quiet-seal-543's ruling on the transport row.

What changes

  • v2.extdeps.languages.dag dag_grammar_transport_expr: the kind after transport is now dag_grammar_transport_kind_expr, a closed choice of four literal terminals (rest | shell | file | local, the arms of v1 00_core TransportKind). It follows the precedent of dag_grammar_op_modifier_expr (readonly | idempotent | hermetic). The production no longer holds a name terminal: its field-init list is the field_init nonterminal, which already has its own row.
  • v2.compiler.occurrence_role: the transport row and its note are deleted, not reclassified. Table admission no longer requires the row, because production_holds_name_terminal is false for the production. This was the last NameRoleNotYetRead row; the disposition itself stays, so a future binder production added before its reader is still counted loudly.
  • An unknown transport kind is now a parse refusal located at its own token. Before this change it was accepted as an identifier.

Controls (new: v2.test.claim.parse.transport_kind_closed_choice)

  • the_{rest,shell,file,local}_transport_kind_parses_holds: each kind parses inside a service operation. There is one claim per kind: a four-parse conjunction cost 161,695 eval steps against the 72,300 new-witness budget.
  • an_unknown_transport_kind_refuses_at_its_own_token_holds: transport grpc { .. } refuses with parse_g0_tokens_remain, and its ByteRange starts at the grpc token's offset from the same lexer.
    • Discrimination, executed: on main d92836587231 with only this test added, this claim FAILS (the unknown kind is not refused at its token) while the parses-control passes. With the change, both pass.
  • occurrence_role: the binder fixture gains a transport shell { bf_argv: [] } member. The kind records nothing, and the bf_argv: label is one more field label (18 roles). The fixture still has zero unread and zero refused productions.
  • reference_conservation: a_refused_normalization_still_reports_observed_role_gaps_holds needed a live unread production, and none is left. Its gap is now planted at the interface: the real table with param_list supplied as NameRoleNotYetRead (planted_param_list_unread_admission), through reference_conservation_of_subject_admitted. The one-node gap it asserts is unchanged.

Evidence (claim_batch, 30 GB BuildBuddy runner, main d92836587231 plus this diff)

  • transport_kind_closed_choice, occurrence_role and reference_conservation: 34/34 PASS.
  • Corpus kinds: a lexical scan of every .dag under dag/ and src/ finds 116 files holding 542 transport members, and every kind is shell (394), rest (141) or file (7). All are within the admitted four.
  • Census, not yet complete. The before/after reference_conservation_census_for_paths run over reference_conservation_stratified_sample_paths plus the 116 transport-bearing files hit the remote runner's deadline in both arms. All 13 stratified batches completed in each arm, but the totals and the 116-file batches never ran. The expected result is role_not_yet_read going from 6 to 0: after XL-2: read the param/field/generic/let/function-value/service binder roles through body lowering's readers; QualifiedFieldTypeVisibility delivered #12598 all 6 are transport nodes, in extdeps.iputils.arping, extdeps.tools.id and two dag/test/claim shell witnesses. I'll post the measured numbers and the v2 parse of all 116 files as a comment when the rerun lands. Until then, the corpus claim rests on the lexical scan above, not on a v2 parse.

No emitted Rust changes: the v2 grammar has no stage0 mirror, so there is no regen.

Land only via the merge queue.

🤖 Generated with Claude Code

…ence_role's last NameRoleNotYetRead row

dag_grammar_transport_expr takes rest | shell | file | local as literal terminals (the
dag_grammar_op_modifier_expr precedent), so the production holds no name terminal and needs no role
row; an unknown kind refuses at its own token instead of being accepted as an identifier.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
@gunbai-bot

gunbai-bot Bot commented Sep 30, 2026

Copy link
Copy Markdown
Contributor Author

On review 73108's note about where the four transport spellings come from: there IS a partial v2 vocabulary. v2.lens.extdeps_shape_transport_policy ExtdepsTransportKind has two arms (Shell | Rest), against v1 00_core TransportKind's four (Rest | Shell | File | Local). That is a vocabulary fork. This PR follows the ruling's four literals and hand-lists them from v1's arms. It does not consolidate the fork, because that needs a v2 home for the kind set, which the grammar row and the lens would then both derive from. That consolidation is left as a named follow-up, not done silently here.

— sent from keen-fox-715

…xceeded the new-witness eval-step budget)

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
@gunbai-bot

gunbai-bot Bot commented Sep 30, 2026

Copy link
Copy Markdown
Contributor Author

Census, executed. v2.compiler.reference_conservation_census reference_conservation_census_for_paths, over the 116 .dag files that hold a transport member, in batches of 25 on a 30 GB BuildBuddy runner, main d92836587231 against branch 0c165f84bd1. All 5 of 5 batches completed in each arm (123 module rows).

main this branch
role_not_yet_read 399 0
role_reader_refused 0 0
subject-refused (a file the v2 front end could not ingest) 0 0
authored 28429 27990
refused / dropped 6665 / 21764 6315 / 21675
unmeasured 34 34
  • The unread gap closes: role_not_yet_read goes to 0 on the population that held every remaining unread node. After XL-2: read the param/field/generic/let/function-value/service binder roles through body lowering's readers; QualifiedFieldTypeVisibility delivered #12598 those were the 6 transport nodes on the stratified sample, and all 4 of their files are in this set. Here the count is 399, because this is the whole transport-bearing population rather than the sample.
  • Corpus parse: every transport-bearing file is ingested by the v2 front end under the new grammar (0 subject-refused), so no file writes a kind outside rest | shell | file | local.
  • authored falls by 439: the kind tokens are now keywords, not authored names, so they leave the counted population, and refused and dropped fall with them.
  • Not attributed, and identical in both arms: conserved = 0 and locus_erased = 0 across these modules. Their atoms are all counted as refused or dropped. That is a pre-existing property of how this population normalizes on the census route, and this change does not move it. I'm flagging it rather than explaining it.

The full stratified-sample totals were not re-derived at this head: that run hit the runner deadline twice. This measurement covers the population the change can affect.

— sent from keen-fox-715

@briansrls briansrls left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

APPROVE-MERGE at exact head becb95e, through the merge queue only.

No findings. Modeling the transport kind as the closed literal choice rest | shell | file | local is the honest structural fix: dag_production_transport no longer owns a lexeme-stamped identifier terminal, so deleting its NameRoleNotYetRead row is correct rather than inventing a binder/reference category for a realization selector. The nested field_init production remains independently role-accounted, as the updated binder fixture demonstrates.

The controls discriminate the change at the right boundaries: every admitted kind parses; an unknown kind that main accepted is now refused at its own token; the transport kind contributes no occurrence role while its field label does; and the normalization-refusal observation keeps testing a real interface by planting NameRoleNotYetRead into the otherwise admitted table rather than depending on obsolete production debt.

The targeted census closes the affected population: all 116 transport-bearing files ingest under the new grammar, role_not_yet_read moves 399 -> 0, role_reader_refused stays 0, and there are no subject-refusal changes. Not re-deriving the full stratified-sample totals is not blocking because the completed corpus contains every production instance this grammar/table delta can affect.

The ExtdepsTransportKind two-arm vocabulary versus the grammar/v1 four-arm vocabulary is real follow-up debt, but not a regression in this PR: main admitted arbitrary identifiers, this change narrows that surface to the established four-arm set, and the complete transport-bearing corpus remains parseable.

All five exact-head checks completed successfully, and GitHub reports the PR mergeable/clean. Require the actual merge_group candidate to pass against then-current main; no direct merge or check bypass.

@gunbai-bot
gunbai-bot Bot added this pull request to the merge queue Sep 30, 2026
Merged via the queue into main with commit fbdfd65 Sep 30, 2026
5 checks passed
@gunbai-bot
gunbai-bot Bot deleted the session/keen-fox-715-transport branch September 30, 2026 11:32
@gunbai-bot

gunbai-bot Bot commented Sep 30, 2026

Copy link
Copy Markdown
Contributor Author

CORRECTION to my census comment above. The line 'every transport-bearing file is ingested by the v2 front end under the new grammar (0 subject-refused)' was wrong. The census folds a parse refusal into refused, not subject-refused, so a zero there says nothing about parsing.

Measured directly: a v2 parse (conservation_subject_of_text .parsed) of all 116 transport-bearing files, on main d92836587231 and on the branch becb95ecf96:

  • 82 parse and 34 refuse, and the two lists are byte-identical, so this change adds no parse refusal and removes none.
  • All 34 are parse_g0_tokens_remain and pre-exist on main. 28 are the 5xx HTTP status class in response blocks, lexed as 5 then xx. 3 are io from "key" / = default tails outside an io block. 3 are singletons.
  • So the claim that holds is 'no file's parse changes', not 'the corpus parses'.

The conserved = 0 across these modules is attributed too. It is not a census defect: a service module is refused whole at normalize (body_lowering_reason_service_realization_unreachable, the designed arm of gunbc.recurring_failure_mode service_interface_member_has_no_carrier), and the census counts a refused module's atoms as refused/dropped.

— sent from keen-fox-715

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