dog/ULOG.c emits log rows with plain URIutf8Feed (ULOG.c:40) — nothing rejects or escapes \n, \t, SP, or # in URI components, even though abc ships URIutf8FeedSafe (abc/URI.h:62-71) for exactly this trust boundary and worktree FILENAMES flow into rec->uri.path. A file named x\n0\tdel\t?refs/heads/main forges a complete extra attribution row. Worse, any malformed/non-monotonic line bricks the log: ulog_scan_log (ULOG.c:233-235) aborts on the FIRST ULOGBADFMT/ULOGCLOCK, so once the sidecar goes stale (clone, sidecar deleted, RO anon fallback, crash) EVERY subsequent ULOGOpen fails permanently — one crafted filename is a durable DoS on the wtlog. Method: Issues.
ULOGu8sFeed (ULOG.c:28-43) uses URIutf8Feed, not URIutf8FeedSafe; callers ULOGAppendAt (:657-682), ulog_wt_cb (:1156).ulog_scan_log (:233-235) refuses the whole log on the first bad row instead of skip-and-continue.RONutf8sDrain (ULOG.c:89,104) has no 10-char cap; an 11+ char token silently aliases to an arbitrary ron60 that can still pass monotonicity. ULOG.md:23 promises ≤10 chars but nothing gates.ulog_idx_is_fresh :420-433); intermediate 40-bit offsets are used by ULOGRow (:700-708) / ulog_row_key_bytes (:767-790) to form slices up to 2^40 past a 1 GiB booking — safe only incidentally.ULOGu8sFeed: route URI through URIutf8FeedSafe and reject ts/verb/URI bytes outside the row alphabet (tab/newline/#/SP).ulog_scan_log skips-and-continues on ULOGBADFMT (log a warning) rather than refusing the entire log.ULOGu8sDrain (fail ULOGBADFMT past 10).off < u8bDataLen(data) before forming a row slice in ULOGRow and ulog_row_key_bytes.dog/ libdog, ABC style; error codes RON60, ULOG-prefixed, ≤10 chars.\n/\t through ULOGu8sFeed→scan; assert no forged row and no permanent-fail rebuild. (dog/fuzz has no ULOGu8sDrain target today — TOK/WEAVE/NEIL only.)ulog_scan_log.ULOGRow/ulog_row_key_bytes.ULOG.h:170-172, ULOG.md:46-48): monotonicity guarantee is now conditional (fresh sidecar / idx==NULL skip the scan).79612854 — plain URIutf8Feed still at ULOG.c:40, ulog_scan_log still fail-hard on the first bad row (:233-234 return o / fail(ULOGCLOCK)). ULOG-003 be89684d touched only booked-index capacity (ulog_idx_push FILEBookEnsure), none of this ticket. WIP fix UNLANDED in worktree ~/src/DOG-010 (ULOG.c modified).