Repository navigation
v2 grammar: a response status class (5xx) parses — 28 service modules stop refusing whole - #12778
Conversation
… xx, as v1 reads it Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
briansrls
left a comment
There was a problem hiding this comment.
APPROVE-MERGE at exact head e959875. No findings.
The grammar change is correctly bounded: the status-class arm is seq(int_literal, literal xx) and precedes the existing bare-int arm, matching v1's two-token reading without turning the suffix into a name. Exact numeric statuses and named statuses retain their existing arms, and the 5yy located-refusal control proves the new arm admits exactly xx rather than widening arbitrary suffixes.
This does not create an occurrence-role obligation: the xx token is a literal terminal, while dag_production_status_pattern remains NamesAreReferences for its lexeme-stamped named arm. The 116-file affected-population measurement is appropriate: parse moves 82→111 and refusal 34→5, with the newly reached service modules still refusing later at the tracked service-interface carrier wall rather than being overclaimed as normalized.
All five exact-head checks are green, including floor, generated, emit-build, rust-unit-tests, and witnesses. Authorize merge-queue landing only: require the actual merge_group candidate to pass against then-current main; no direct merge or check bypass.
XL-2, per quiet-seal-543's ruling: fix the v2 parse refusals across service/transport files, one class per PR. This is the first class, and the largest.
The defect
v2.extdeps.languages.dagdag_grammar_status_pattern_expradmitted an int literal or an identifier. The HTTP status class5xxlexes as the int5followed by the identifierxx, so every response block that writes a status class refused its whole module asparse_g0_tokens_remain, located atxx. v1 reads the pair as one class (v102_parseparse_status_pattern: an int followed by the identxxbecomes"{n}xx"), which is why v1 accepted these files.The change
The status pattern's first alternative is now
seq(int_literal, literal_terminal("xx")), tried before the bare int. It follows thedag_grammar_op_modifier_exprliteral-terminal precedent. It adds no name terminal, sov2.compiler.occurrence_role's table is unaffected:status_patternstaysNamesAreReferencesfor its named arm.Controls (
v2.test.claim.parse.status_class_pattern, one parse per claim)a_status_class_parses_holds(5xx). Red on main, executed: on maindf9cda7220fwith only this test added it FAILS, and the three controls beside it pass.an_exact_status_code_parses_holds(404) anda_named_status_parses_holds(nonzero): the other two arms still parse.a_malformed_status_class_refuses_at_its_suffix_holds:5yystill refuses, located atyy. The new arm admits exactlyxxand nothing wider.Parse count before and after
Instrument: a v2 parse (
conservation_subject_of_text.parsed) of the 116.dagfiles that hold a transport member, which is the population #12757's census covered.5xxrefusals are all gone.ebay/browse.dagandgithub/app.dagparse too. I had listed them as separate singletons, but their refusals were downstream of a status class.google/sheets.dagstill refuses, now at a later point (line 771,data: data,: the keyworddataused as a field label). The status class had been masking it.from "key"/= defaulttails:gcp.dag,iam.dag,browser.dag;sheets.dag;]:shell/exec.dag:48.All claims executed with claim_batch on a 30 GB BuildBuddy runner. No emitted Rust changes: the v2 grammar has no stage0 mirror.
Land only via the merge queue.
🤖 Generated with Claude Code