/repo/verb/arg, no verb-less path formbee http serves two URL shapes under one prefix: /<repo>/<verb>/<arg> and the verb-less /<repo>/<path> (BEE-003 ruling 2, the form references resolve to). They share a namespace, so a path whose first segment spells a verb name is shadowed by the verb — todo/ since BEE-025, log/, tree/, list/, blob/ in principle. Seen 2026-08-19: a ticket page linking todo/BE/BE-038.mkd got the href /bee-journal/todo/BE/BE-038.mkd, which ran as todo BE/BE-038.mkd and refused. Ruling (gritzko 2026-08-19): remove the ambiguity by grammar — every emitted URL spells its verb, verb names always win on the way in.
http.js routeOf — the first segment after the repo is a verb when ROUTE knows it, else the rest is a path (verb: "path", then cat for a file, list for a dir); refResolve emits the verb-less form for references; argUrl emits /<repo>/<verb>/… for nav spells.refResolve writes the verb out when the path's first segment is a ROUTE key, and /todo/<file> is served as the file by a fs stat — a heuristic (/todo/done, a fat ticket's dir still run as the verb).test/http/run.sh ("a reference resolves to the verb-less /repo/<path>"), test/todo/run.sh leg 1h, test/click, test/refline, test/land, test/perma.bee http emits is /<repo>/<verb>/<arg>: a file reference → /cat/<rel>#b…, a dir reference → /list/<rel>/, images keep /bytes/, nav spells keep argUrl.routeOf: after the repo, a segment that names a verb IS that verb, always; /bee-journal/todo/BE/BE-038.mkd is todo BE/BE-038.mkd and refuses with a hint naming the path form (try /bee-journal/cat/todo/BE/BE-038.mkd)./bee-journal/README.mkd, bookmarks, typed URLs) stays a convenience: a 301 to its cat/list form, so the address bar shows the canonical spelling.todo verb never reads the fs to decide what it is./todo/<file> under a repo with a todo/ dir refuses with the hint; a check that the verb-less form redirects.choose and bytes are untouched./:todo, /~/) — the fix is "spell the verb", nothing else; ROUTE remains the one table.http.js and the suites move./repo/verb/arg in all cases; verb names win; verb-less non-verb first segment = redirect, not a 404.todo's "not a ticket code…" message stays as is and the router appends the path form.http.js refResolve: always /cat/ or /list/; the stopgap's ROUTE-key test droppedhttp.js handle: verb-less non-verb → 301 to /cat/ or /list/ when the path exists (one stat, for the redirect only), else cat says so; the todo/<file> stat of the stopgap droppedrender/html.js errorPage takes a hint link)test/http (run.sh, url.js, repo.sh), test/rst, test/choose, test/todo; new checks: /todo/<file> 404s with the link, a verb-less file/dir URL 301shttp section: the URL grammarcat hunk carries its ambient pos, so a reference on a ticket page (BE-038) follows from the page's dir — the view path was the cat … spell, _viewDir read it as a dir, every follow said "cannot open"todo/ fans out over every board instead of refusing (/bee/todo over http has no other way); BEE-025:50 amended, README and suites followbee-BEE-028, uncommitted: http.js, render/html.js, view/cat.js, view/todo.js, README.mkd, the suites; ctest 158/158. The main tree's same-day stopgap (http.js, test/todo/run.sh, uncommitted) is superseded and can be dropped.