The single = byte binding one argument name to its value (#264 B5).
Never a comparison =, and the separation is fill order rather than a
byte scan: the arg fill offers only the = its own located token names,
so a comparison inside a ( ) group falls through to operator, and one
inside a [ … ] substitution stays unclassified where the operator fill
abstains (src/explain/operator-tokens.ts).
One valid string-internal escape sequence — the `` and the bytes it escapes (#264).
The one split B5's rule admits that naming the = did not make. A valid
escape is recoverable from no other published surface: only INVALID
escapes appear elsewhere, as bad-string-escape diagnostics. Both come
from the same walk (walkStringEscapes), so a token and a diagnostic
cannot disagree about which bytes are an escape, and past the first
invalid escape the walk stops claiming rather than guess.
A token in the total, gapless byte partition (B1).
Every byte of the analyzed input belongs to exactly one token — a contiguous, non-overlapping partition of
[0, input.bytes)— sorted bystart, with no gaps andtokens.map(t => slice).join("") === input. Byte-exact, inheriting the #215/#252 offset discipline. Offsets are on the analyzed text;input.positionMapapplies when normalized.classis the vocabulary #264 B5 settled (see below); it is not an LSP/SCIP legend and does not try to be one. Every byte no analyzer claims becomesunclassified, which is a first-class answer, not a placeholder to be avoided.B2 so far:
dir/cmd(resolved path and verb bytes, including valid path slashes),operator(26 spellings + 2 aliases,syntax-metais a residual merge, never a source, #255),arg/arg-sep(argument names and the=that binds each one to its value, both located byargs.ts), andvalue(argument value bytes and leaf array-literal members fromdata.values.occurrences, quotes included, #295).B5 settled which merges get their own name (
commands/explain/README.md-> The vocabulary, and what earns a class, where the figures live beside the generated blocks that keep them honest): a class is split only where a consumer holding the whole envelope could not recover the distinction by joiningtokens[]to another published surface on byte offsets.arg-sepis the one split that test forced, because a large minority of the=runs the arg fill paints belong to a statement whose strictargumentsreading refused, so there is noExplainArgumentToken.valueSpanto subtract one from. The per-spellingoperator, per-shapevalue, and scope-versus-arraybracemerges all stay merged — the bytes,data.values.occurrences[], andstructure.blocks[]already carry those distinctions.