Beagle SCM
Active ticket board
Index of Beagle's open work: one topic per dir of numbered Plan-shaped tickets, cleared by the parallel Issues fix-and-land loop. Each topic lists its OPEN tickets as one-liners; per-topic detail lives in todo/<TOPIC>/README.mkd, landed history in be log. A fully-landed ticket drops from its topic; a closed topic drops from here.
Active topics
- BE — the be/ JS project (dispatcher + kernel + verbs + views); 2026-07-07 review → BE-010..025 (digest
BE/REVIEW.mkd); 2026-07-09 hive/context audit → BE-031..035.
- E-031 HIGH — the hive: S1..S3 DONE 2026-07-09 uncommitted (srcRoot→
<meta>/work, get seeds cells, live-smoked); open: S4 tests/prose, S5 self-hosting ruling, drop the SRC_ROOT shell export
- E-032 HIGH — CLI drops the cwd sub-path: verbs resolve args at the wt ROOT (
cd MAIN/src && be cat main.c silently empty); verified still open post-a763a86a; pager/CLI disagree
- E-033 MED — RULED+implemented 2026-07-09 uncommitted: cached-remote dropped, scheme-less
//X = worktree or NAVNONE; cached tests dropped/flipped, suite = baseline; pending land only
- E-034 MED —
be get //name FFs the NAMED wt to its branch tip; spec: checkout the rev that wt is ON, into the context wt (compounds BE-030)
- E-035 LOW — ls/status silently drop a
?rev context; _snapBe omits authority/verb, leaks spell scope past pager reentry
- E-037 HIGH — FIXED 2026-07-09 uncommitted:
./ canonicalized (diff/cat/why), // = topWt everywhere (memoized launchTop), NAVNONE on any miss; repro cases added, suite = baseline; pending land
- E-030 HIGH — context-confined path resolution: get anchors write/clone on raw io.cwd() (
:get in a //parent context with cwd in a submod writes the sub's wtlog); resolve() //authority-in-rel escapes the tree → unify resolve(context,base,rel) under $SRC_ROOT/<name> (continues BE-011)
- E-010 CRIT — JS PATCH weaves the COMMIT tree as ours → clobbers dirty wt edits (native PATCH-002/JGET-004 twin)
- E-011 HIGH — wtdir SRC_ROOT confinement is lexical;
//../name escapes the root (DOG-009 twin)
- E-012 HIGH — emitPack 256B deflate slack overflows on >4MB incompressible blobs → push aborts
- E-013 HIGH — wire.js child/fd lifecycle: push() finally leaks stdin → reap HANGS; curl leaks
- E-014 HIGH — DELETE ignores the Host slot →
be delete //origin?feat tombstones the LOCAL branch
- E-015 HIGH — POST
#/#!/#msg! message forms unimplemented (reuse missing, forget-! dropped)
- E-016 HIGH — pager emits file-content control bytes to the tty (ANSI/OSC injection)
- E-017 HIGH — io.mmap-and-never-unmap leak class, 4 sites (ignore/diff/gitmodules/why); gated on JAB-006
- E-018 MED — hunk-body tok32 end wraps at 16 MiB (log/why) → large-file views corrupt
- E-019 MED — thin-pack buffer sizing: silent object drop + >1GB balloon on corrupt input
- E-020 MED — verb URI-slot gaps: HEAD drops Path, pathless PUT force-pushes, host decoded 3 ways
- E-021 MED — classify: exec bit ignored, dir/merge baseline mismatch, nested
.be DIR floods unk
- E-022 MED — be/ helper duplication sweep (~9 sites)
- E-023 MED — view semantics: grep/spot drop args, theme bold sticks, pager escape-split leak
- E-024 MED — robustness/doctrine: unguarded parse aborts walk, non-crash-safe _book, wrong-target rollback +4
- E-025 LOW — perf/style: repeated full-wtlog scans, double hunk retention, redundant re-encode, whitespace
- E-029 — verb discovery must be-climb from CWD (nested
be/ shards): html/be publication verbs found while core inherits up-tree; wt done, pending land (prereq for MARK mark)
- E-003 — uniform error line: name+verb+URI+code; needs a ruling
- E-008 — bare
be put sub-recursion still sprays PUTNONE/NONE + banner hunk (post-arm gitlink bump landed quiet)
- E-036 LOW — pager word spells expand shell-style globs (
put *.c, delete src/*); reuse Tab-completion's confined FS walk, pager multiplies raw words, verbs still resolve
- E-038 MED —
todo view verb: :todo open-ticket board, :todo TOPIC topic list, :todo TOPIC-123 one ticket; titles, ticket ids and wiki links clickable
- E-040 MED —
done verb LANDED 9dad5857; residual: [done] buttons in :todo rows staged in wt work/BE-040, pending land
- E-041 MED —
[put] buttons on pager status rows (unk/mod/new), plain byte-unchanged; DONE in wt work/BE-041, pending land
- E-042 OPEN — formal context model: context(cwd) total — tree root
//+first segment (wiki/ → //wiki), hive wt //N, sub = parent+mount; two //X rulings await gritzko
- E-039 HIGH — pager put/delete crossing a sub mount: authorityRepo anchors the run on arg0's FULL path → repo = the SUB, raw rest args resolve in the wrong tree (delete can mis-target); repro in the ticket dir
- BRO — the interactive pager + hunk renderer; 2026-07-07 nav audit → BRO-015..023 (context-URI navigation, input/mouse layer).
- RO-015 HIGH — back/
R re-execute MUTATION verbs (post ?ref bare-advance replay) + drop rest args (grep pattern lost on refresh)
- RO-016 HIGH — follow/click resolver stale post-URI-014: relative follows drop //authority+slots; unify onto the one composer
- RO-017 HIGH — initial view loses its address (loop.js
verb:-only banner) → empty context, bare-verb re-fire on R
- RO-018 MED — mergeUri slot edits: FILE ctx joined as DIR, RESET eats ?ref,
verb!/scheme: tokens mis-peel
- RO-019 MED — address bar: arrows erase it, Alt-q quits, typed UTF-8 dropped/pasted mojibake, multi-line paste joins
- RO-020 MED — mouse mapping: status-row/past-EOF/bar-open clicks navigate; wide-char + diff-side column miscount
- RO-021 LOW — G clamp strands one row; W throws w/o be.wrap; junk wrap"" key; UTF-16 truncation
- RO-022 MED — Tab completion ignores the view's authority/dir context (launch-tree readdir, bad ./ inserts)
- RO-023 LOW — wiki drift rulings: Nav.mkd todo_root machinery unbuilt; Bro.mkd keymap = C bro, not the JS pager
- RO-025 OPEN — three-part O-link spells (context · verb · args), wire form = the invite line; :work update hit the landed mount instead of the row's tree
- DIS — cross-cutting spec/impl discrepancies (001/002/003/008/031/042/052/053/054/055/056/057/060 landed, 024 stale; 6 open).
- IS-058 — be/ JS submodule umbrella: core+D10/D17/D18 landed; open: D8 per-sub push (now unblocked), D11 head no-descend, D14 Edited axis inert, D15/D16 spec updates
- MEM — memory-safety audit (digest
MEM/MEM.mkd).
- GIT — pack-log format & sync.
- IT-011 — ZINFInflate wraps full-slice output vs NOROOM (corruption)
- IT-012 — JS smart-fetch transports: core landed 4370d67e; residue: git:// still misroutes to ssh (split or refuse)
- IT-015 — jab post ref-target resolution: fixes landed 234b0f54; residue: an end-to-end POSTNOREF repro test
- IT-020 JS — JS keeper serve side: upload-pack landed 261680bf; open: jab receive-pack serve, get/be+cached test flips, ssh-remote form
- IT-017 — remote-tracking refs must record remote host + FULL ABSOLUTE branch (?/project/branch); saveRemoteRef/clone/add strip query to ? → branches collapse onto trunk key (split from GIT-016 T3)
- PACK — the OFS-only pack-log format (index-emit, writer, deltas).
- ACK-001 —
PIDXScan from_off: C core landed 8df1e213; open: jab binding fromOff arg (pack.hpp hardcodes 0) + a JS tail-scan test
- ACK-002 — JS pack writer emits OFS_DELTA (offset-only); jab post feeds RAW today → non-native/bloated packs (follow-up to PACK-001)
- SUBS — submodule recursion.
- UBS-013 —
git submodule add parity
- UBS-025 — sub GET leaks raw fetch progress to stderr, not hunks
- UBS-027b — R1 emission, Edited + coord-mismatch axes, loud force/diverged refusal, get reapply, test matrix (be head axis landed b9c6b647)
- UBS-032 MED — nested abc sub resolves to WRONG source: be head → no-refs HOMENOPROJ; be patch fetches official github, not the local shard
- UBS-038 LOW — sub re-get with changed .gitmodules url basename fetches the wrong shard → child object-not-found (latent)
- UBS-039 — submodule-path delegation: PUT arm landed 1c4a97c8; open: DELETE arm (delStage has no sub-crossing split) + shared splitter
- UBS-040 HIGH — submodule branch tracking: I1-I3 fixed live (untagged); open: dot-branch-advance repro assert + native I4/I5
- UBS-041 — sub nesting depth cap landed 6388c34e (MAX_SUBMODULE_DEPTH=8); open: a bounded-chain repro test
- UBS-045 MED — descended read views: core landed 36b1aec0; open: blob:/size: still sub-blind + status/diff/ls nav-target audit
- POST — commit-path gaps (POST-023 landed
100cd237).
- OST-006 — POSTCFLCT false-fires on marker strings → DIS-040
- GET — checkout / fetch / sync.
- ET-044 HIGH — wire.fetch pack-in-RAM (linux clone died: RangeError at EOF concat); streaming fix DONE on wt branch GET-044 (6.45GB GitHub gate at 46.7MB RSS), pending inspect/merge; checkout walled by JAB-007/GIT-021
- ET-009 — be:// sync umbrella (reachability-based serving)
- ET-017 — --nosub won't advance a store-backed switch-worktree
- ET-018 — make be get's wt update atomic on mid-write failure
- ET-022 —
be get <path>?<rev> drops the path (no per-file checkout)
- ET-032 — be get offline sub mount: ok yet no files written
- ET-034 — graf/GET.c id maps sized 4096 « GET_MAX_VERS=200000 → silent id drop
- ET-036 — be/ self-locator mis-creation: checkout+mount-classify arms landed b24446c0/f0269b27; open: repro tests, runtime basename-link recheck, jab local-script resolution
- ET-037 — be self-gitlink crash class fixed dbb828e6/064c15f5; open: legacy-160000 repro test; e2e beagle-ext clone still fails (GET-041)
- ET-038 — wt-source store-anchor redirect in-tree (resolveLocalStore) but NO ticket-coded commit; close pending hashlet + GET-041 ruling
- ET-039 — symlinks-as-blobs core landed 3026a5fb/d31b52ea (isSelfLocator gone); open: formal close under the GET-041 ruling
- URI — URI grammar, slots & remote-intake shapes (URI-009 c436efa; URI-011..014 landed 2ff62ff6/c43324f4/0f8bc010/3edf5cb4).
- RI-015 MED — scp-form remote intake: JS landed 082b172c; remainder: file the C twin (keeper/WIRECLI.c wcli_spawn has no scp handling)
- JGET — JS
jab get divergences from native (differential-probe batch).
- GET-001 UMBRELLA 13 jab-get defects vs native (severity table + evidence)
- GET-002 CRIT no FF/ancestry gate → silently clobbers committed local commits (27/28/58)
- GET-003 CRIT
be get ? trunk-switch records WRONG branch → next post rewrites that branch's history
- GET-005 HIGH
?<branch> fetches TRUNK for non-main/master — pickWant refs/ vs refs/heads/ (case 24)
- GET-006 HIGH pre-existing empty
.be/ dir crashes jab get (hermetic-shield shape; masks many cases)
- GET-007 HIGH sub fetch by exact pin: LOCAL sources fixed d80bdb5c (SUBS-046); WIRE sources still exact-pin-only, no branch-fetch fallback
- GET-010 MED bareword path-vs-branch misroute: no branch-switch / bare-sha detach /
?.. (DIS-017)
- GET-011 MED parseRemote misderives store root for bare file:<store> (case 29; the .be-FILE-mount half landed as GET-038)
- GET-012 MED relative submodule url
../sub not resolved against parent source (case 50, SUBS-020)
- GET-013 MED
--force leaves a tracked orphan on disk (no orphan sweep; case 49, GET-016)
- GET-014 LOW same-line weave: jab cnf/rc=1 vs native mrg/rc=0, ours/theirs swapped (case 66)
- BLAME — blame perf + output.
- LAME-001 — core plan subsumed by BLAME-002 1a5acce8; residue: unindexed-commit fallback still byte-dedups + close-as-subsumed ruling
- LAME-003 — parallelize residual blob inflates; needs a ruling (premise stale: UNPK.c fork workers now exist as a pattern)
- PTR — pointer-discipline / slice-safety audit.
- TR-001 — abc/ BSDDiff, URIMergePath, TLV casts (GATED; the "done, awaits review" diff is LOST — redo against trunk)
- TR-007 — woof/ + bro/ raw pool ptr + manual parse (woof gates)
- TR-008 — mark/+js/+beagle/ ptr discipline: MKDT prefix fix landed 9bfb0157; rest discarded, needs fresh rework if pursued
- DIFF — the
diff: view.
- IFF-007 —
diff:<largefile> silently empty (outtoks overflow)
- IFF-009 — tree diff silently drops unreadable files (exit 0); to-set guard landed untagged; open: CI verify, deletion-loop soft-skip, signature B
- DOG — shared dog-layer reworks + libdog code-quality review (2026-07-06).
- OG-007 — libdog split done; open: publish (libdog abc pin 11 ahead of libabc origin → fresh clone can't init; beagle push target ambiguous)
- OG-008 CRIT — WEAVE codec trusts wire inserter/remover indices + token offsets → OOB write/read; validate + one decoder
- OG-009 HIGH — HOME adopts untrusted .be anchors (CVE-2022-24765 class): store-root redirect, .. escape, symlink-follow, TOML injection
- OG-010 HIGH — ULOG row injection via unescaped URI bytes + one-bad-line permanent rebuild DoS
- OG-011 HIGH — HUNK BASS use-after-rewind in relay; unified-diff 4096-cap drops lines / inconsistent @@ headers
- OG-012 HIGH — BRAM fallback double-counts region (silent wrong diff); unseeded-hash equality; align/recursion hardening
- OG-013 MED — dog/ reuse: dup WEAVE decoders, hand-rolled u64map vs HASHx, dup ULOG walks + HUNK render blocks
- OG-014 MED — git/PACKResolveOfs ping-pong sizing invariant (half<=baselen) undocumented → latent heap overflow
- OG-015 MED — git/IGNOGlob catastrophic backtracking ReDoS from an untrusted .gitignore
- OG-016 LOW — correctness/API grab-bag: signed-overflow ts, sha1 aliasing, unchecked FILE_WANT_BUFSfd, NEILShift bound
- OG-017 MED — WEAVEMerge global qsort ≈ half the merge → anchor bucketing + probe-free DFS (retroactive; implemented, awaiting landing)
- KEEP — keeper object pool, refs & wire-pack paths.
- EEP-003 HIGH — keeper post self-deadlocks on the per-shard .lock (its receive-pack child)
- ABC — core library primitives (2026-07-07 full review → ABC-005..018; ABC-004 landed 7dafb8d7).
- BC-010 MED — overlong UTF-8 accepted, JSON surrogate pairs → CESU-8, decimal drains wrap u64 silently
- BC-011 HIGH — HTTP serializer emits zero headers (same-pointer slice); empty reason-phrase rejected
- BC-012 HIGH — NETInfo returns OK w/o copying result, aNETAddress stack OOB, bind walk aborts, CURL OK-on-OOM
- BC-013 HIGH — FILEFlushThreshold loses data on short write, FILE_BOOK uninit sentinel, FSW watches unremovable
- BC-014 HIGH — PACK crafted-trailer wild pointer, PACKClose leak, SLOG 64-vs-127 skip mismatch, NESTFeed self-corrupt
- BC-015 MED — templates: SSTx.h bit-rot (ruling), HASHx stale-hash converge, MSET wrong-comparator seek, X-clobber traps
- BC-016 MED — bedrock: popc64 32-bit builtin, sha256empty unaligned reads, MAIN exit truncation, SAN.h gaps, OK.h statics
- BC-017 MED — build/CI: no -Wall, WITH_INET+fuzz never in CI, LEX generator drift (fbreak vs goto) blocks regens
- BC-018 GATED — style sweep: DNS/NFA manual parsers, slice-from-arith cluster, naming/error-code drift
- BC-021 HIGH — SORTu64 emits garbage: Yx tie-loop swapped args + eqs0-only y + ping-pong extents; smoke-fuzz red
- RON — the ron60 timestamp codec (abc/RON.c).
- ON-001 — clamp landed ffc0624b (dog/abc/RON.c); open: generators must not emit ms≥1000 (keeper keep_next_pup_key, jab _ulog_now)
- STATUS — the
be status view.
- TATUS-004 — classifier reports
del for an untracked-path delete (status 1 del vs post POSTNONE); classify.js must gate del on baseline presence
- LOG — the
log: view.
- OG-004 — TTY
jab log EMFILEs on a ~130-pack store; probable fd/mmap leak in be/ JS store reads (piped log + status fine)
- JAB — the
jab JS runtime (src/jab bindings).
- AB-007 HIGH — Buf
| 0 int32 cursors cap every io.mmap view at 2^31-1: >2GB file → silently WRONG subarray, git.pack.mmap aborts; blocks GET-044's linux-scale index/checkout
- AB-006 MED — buf.cpp breaks API.md: Buf.feedStr silently truncates on full IDLE; io.book/close/trim documented but unimplemented (blocks BE-017) — from the 2026-07-07 be/ review
- JS — JABC (JavaScriptCore) bindings (JS-046..051/055/056/061/065/069/071/073/075/082/093/094/095/098/100 landed).
- S-026 — richer extension exit codes (no process.exit; jab main.cpp maps return→0/throw→1 only)
- S-037 — pack feed base offset|hash, REF_DELTA (JS-036 gate cleared 742c06ff)
- S-096 port 10 beagle/test/get store-internals cases to jab get (be/test/get)
- S-097 MED jab get aborts the whole checkout on a committed .be/.git tree entry (should skip silently, like native POST-015)
- S-099 HIGH pack-run naming collides same-tick (ingest.js ron.now) → unindexed/clobbered runs; per-site buildIndex pairing verified done
- ab runtime code-review batch (JS-101..115, 2026-07-07, proposed) — see JS README; HIGHs:
- S-102 HIGH ulog handle = raw pointer in a JS number — double free / UAF / forgeable
- e/ code-review batch (JS-065..090, 2026-06-25) — see JS README; by severity:
- S-066 HIGH .gitignore glob ReDoS (REGRESSED: the 06-25 fix never reached be/)
- S-072 HIGH patchscope.lca stale merge base + unbounded
- S-085 HIGH log.js test-only _packs() + dup resolveHexAny
- S-067 MED wire.js ssh host argv injection + unquoted PATH
- S-070 MED untrusted regex per-line ReDoS
- S-074 MED registry.build masks module load errors
- S-076 MED wire.fetch leaks child stdin fd
- S-077 MED orphan keeper pack on lost CAS
- S-080 MED put rewrites wtlog per arg O(N^2) (proposed ulog.appendInPlace API died with job.js — needs a new streaming helper)
- S-081 MED bro fd-1 monkey-patch re-entry (JAB-029)
- S-086 MED store.js god module split + reader.shard
- S-087 MED core/shared depend upward on view/ (shQuote)
- S-088 MED require-path resolution dup 5x
- S-089 MED loop→bro→loop require cycle
- S-083 MED checkout.apply empty file on missing obj (elevated: submount.js now calls apply — path is LIVE)
- S-084 LOW confirmed-minor cleanup batch
- S-090 LOW modularity cleanup batch
- S-091 LOW rev-anchored path descent #<sha>./path broken in size/blob/type (← JS-082)
- CODE — code-redundancy cleanup (CODE-001..019 landed/abandoned; C sweep).
- ODE-020 — be/ JS duplication: wtblob+wire groups landed 57ff502a/69e56b20; open: resolveHashlet/isMeta reconcile + uriarg/hunkbuild/fs/tok32 extracts
- ODE-021 — be/ JS dedup net ≥1000 LoC reduction target + accounting (quantifies CODE-020); adds verb-entry factory + beCtx shim + spot/bro/store/argline twins
- MARK — the StrictMark renderer (beagle/mark: C + ragel; 2026-07-07 diagnostic review → MARK-002..010).
- ARK-001 MED — same-depth list continuation rendered as nested <p>; FIXED in-tree (uncommitted), pending land + re-render + ~/bin/mark redeploy
- ARK-002 HIGH — output cap len*8+16384 under-sizes dense-todo pages → wholesale BNOROOM, fails whole dir builds
- ARK-003 HIGH — unknown CLI flags silently ignored; a --strict typo disarms the CI gate (needs MARKARG)
- ARK-004 MED — EOF inside an open fence misnests </li></ul> into <pre><code>
- ARK-005 MED — quote-marker continuations render per-line: wrapped reflinks break, quotes skip budgets
- ARK-006 MED — .md handled inconsistently (walk/dropext/refdef vs implicit links) → dead links; needs a ruling
- ARK-007 MED — >512 refdefs silently dropped → links misresolve to implicit targets, no warning
- ARK-008 LOW — CRLF input leaks r into HTML + budget counts
- ARK-009 LOW — mark_refdef hand-rolled byte scanner (ragel doctrine), scanned twice per line
- ARK-010 LOW — raw stack arrays/indexing vs a_pad/carve/u8csAt idioms (with MARK-007)