dog/tok/LINK.rl has seg = [A-Za-z_] [A-Za-z0-9_]* — underscores fuse, dashes never do: feed-icon.png, claude-code/main.js:20, any kebab-case name stays prose even with a known extension or an anchor past a slash. Under DOG-036's evidence rule the ban buys nothing: a dashed name still needs ext/anchor evidence to fuse, so it is hardly mistakable for hyphenated prose.
gritzko's ruling 2026-08-15: tickets are in fact PATHS — ABC-123 is ABC-123.mkd with the ext dropped — so a code being a valid seg is the natural order, not a conflict; the tie is a non-issue. keyvoid keeps voiding GPL-2.0/ISO-8859-1 shaped tails; the ticket rule listed first keeps winning its tie by scanner order.
seg feeds dirs, relknown, relanch, rooted and extany, so a dash must work in dir segs and basenames alike; the KNOWN ext gate (TOKPathRefKnown) is a dictionary and is not touched.MKDT.c.rl, MDT.c.rl, FREE.c.rl) include LINK.rl, so one define change moves them together; twins must be regenerated.GPL-2, GPL-2.0, ISO-8859-1, C-1, BUG-1, AB12-34CD, KEY-12abc stay non-tickets; example.com:443, 12:30, bare src/weird.xyz stay prose; UTC-12:30, AB12-3456 stay accepted noise.Kebab-case names carrying DOG-036 evidence fuse exactly like underscore names do; everything without evidence stays prose, and ticket codes keep winning their tie.
feed-icon.png, my-lib/mod.c, claude-code/main.js:20, a-b/c-d:7, x/foo-bar.xyz:12.foo-bar and well-known prose, --flag (no leading dash), foo-bar/baz (no evidence), DOG-036 / DOG-036:18 / DOG-036/README.mkd:18 still lex as ticket/keyed, not as path segs.foo-.c, double dash a--b.c) get a Design-decisions ruling and a fixture either way.quickjab/dog — explicit permission for this ticket only; dog/tok + fixtures (dog/test/TOK01.c) only; jab/ and beagle/ untouched; NO VC ops of any kind.ragel -C <X>.c.rl -o <X>.rl.c -L; ctest green; lite test/refline + test/perma identical to baseline.One character added to one define — seg = [A-Za-z_] [A-Za-z0-9_\-]* — and nothing else in the grammar moves. seg feeds dirs, relknown, relanch, rooted, extany and keyvoid, so the dash reaches dir segs and basenames together, in all five machines that include LINK.rl.
foo-.c -> F, a--b.c -> F). The only guard is that a dash never STARTS a seg, which is what keeps --flag and -v out; past that a dash is an ordinary name byte, because both shapes are legal filenames and it is the EVIDENCE gate — known ext, or anchor past a slash — that keeps hyphenated prose from fusing, not the dash's position. A foo-bar or well-known with no evidence stays prose exactly as before, so a shape guard would buy nothing and cost a rule.LINK.rl header beside the spec table: a code is a valid seg by design, and where both could match the rule listed FIRST wins by scanner order — ticket before the path rules. No tie guard was built and none was needed: DOG-036, DOG-036:18, DOG-036/README.mkd:18, DOG-036/repro all lex exactly as DOG-036 pinned them, and keyvoid goes on voiding GPL-2.0 / ISO-8859-1 / AB12-34CD.feed-icon.png CANNOT fuse and is pinned as crumbs instead: png is not in the KNOWN dictionary (TOK_TABLE is the lexer table, and this ticket does not touch it), so the name carries no evidence — same answer src/weird.xyz gets. The dash was never its obstacle. feed-icon.js is pinned in its place as the kebab + known-ext positive; add png to the dictionary and feed-icon.png fuses with no further grammar work.TOKPathRefKnown gate. Five includers, not three: DOG-037 wired RSTT.c.rl and TXTT.c.rl to the same include, so their twins are regenerated too and their existing DOG-036/037 case lists re-verify every pin under the new seg.seg admits interior - in LINK.rl; codes-are-paths ruling documented in the headerctest greenDone in the MAIN TREE quickjab/dog (edited, nothing staged, no VC op run). Kebab-case names now fuse on DOG-036 evidence just as underscore ones do.
dog/tok/LINK.rl: seg = [A-Za-z_] [A-Za-z0-9_\-]*, one define, plus two header bullets — the dash ruling (no leading dash, trailing/double admitted) and the codes-are-paths ruling beside the spec table. The spec table's seg line carries the change. No other define, no includer rule list, no action, no gate touched.ragel -C <X>.c.rl -o <X>.rl.c -L for all FIVE includers — MKDT, MDT, FREE and, since DOG-037, RSTT and TXTT.DOG039_CASES in dog/test/TOK01.c, ONE 20-case list run through FREEKebabTest + MKDTKebabTest + MDTKebabTest (60 assertions). 10 cases per machine — 30 of the 60 — were RED against the pre-fix lexer, all green after; the other 30 were already-correct pins carried along. Reds: feed-icon.js, my-lib/mod.c, claude-code/main.js:20, a-b/c-d:7, x/foo-bar.xyz:12, my-lib/README:10 (all SPF/crumbs -> F), feed-icon.png and x/foo-bar.xyz (split crumbs -> whole-name crumbs), foo-.c and a--b.c (-> F).FREE/MKDT/MDT/RSTT and every DOG-037 case through TXTT — GPL-2, GPL-2.0, ISO-8859-1, C-1, BUG-1, AB12-34CD, KEY-12abc, example.com:443, 12:30, src/weird.xyz, UTC-12:30, AB12-3456, the whole ticket/keyed set. NOT ONE fixture had to move.ctest -j16 in quickjab/build: 121/122, the one failure JABCbass a pre-existing 10s timeout present on the untouched tree before any edit (it is not a dog/tok test). TOK01test green. Rerun after a ninja -t clean FULL rebuild (449 targets, everything downstream of LINK.rl recompiled and relinked): same 121/122, same one pre-existing timeout.test/refline 38 checks 0 bad and test/perma 51 checks 0 bad under the rebuilt quickjab/build/bin/quickjab — identical to the baseline ~/tmp/l25/qjb/bin/quickjab. Both run.sh plant their own jsrc symlink in their mktemp fixture, so the main tree needed none and none was added.Suggested commit: DOG-039: LINK seg takes a dash, kebab paths fuse