The beagle tree grew too big; today it splits into subprojects. abc/ already lives as the libabc submodule; dog/ is next. dog/CMakeLists.txt already declares project(libdog C), and the dog target links only abc-core + ZLIB, so the layer is submodule-shaped as-is. Every consumer (bro, spot, sniff, keeper, graf, beagle, woof, mark, js) links dog abc-core and includes "dog/..." via the beagle-root include path, so mounting the new submodule at the same dog path means ZERO consumer churn. Sibling ticket: JAB-005 (jabc split) depends on this one. Method: Issues.
abc -> https://github.com/gritzko/libabc.git; abc/CMakeLists.txt doubles as a standalone root (own project(libabc), options, DOG_BIN_DIR, dep discovery) and as an add_subdirectory child of beagle.dog/ is already self-contained on disk: own test/, fuzz/, tok/ (~60 ragel tokenizers + gen_tok.sh), vendored git/ + sha1dc/, version.cmake, INDEX.md, README.md.dog/CMakeLists.txt has include_directories(.. . tok git): the .. resolves "abc/..." headers against the beagle root today; standalone it must resolve against the libdog root, which therefore carries its OWN abc submodule.DOG_BIN_DIR, DOG_TEST_TMP_BASE/DOG_TEST_TMP_ROOT, TEST_CXX_FLAGS, WITH_FUZZ/WITH_ASAN, find_package(ZLIB); abc/CMakeLists shows the re-default pattern for a dual-mode child.dog/version.cmake already falls back from git describe to the beagle tip hashlet when the tree is a .be store, so it survives the split in both homes.ctest (dog/test + dog/fuzz) runs green STANDALONE from its own repo root, with libabc as its submodule.dog as a submodule: same mount path dog, same target names dog/dogtok, same include spellings.if(NOT TARGET abc-core) add_subdirectory(abc), so in-beagle it uses beagle's abc/ checkout.sha1dc/ and git/ license notices.abc/ pin wins in-tree (the NOT-TARGET guard); libdog's own abc pin exists for standalone dev and is kept in lockstep manually.dog (like abc), URL follows the libabc pattern: https://github.com/gritzko/libdog.git — confirm name with the user before T2.-fno-strict-aliasing, DOG_BIN_DIR, a selfinclude/dog symlink for the 86 "dog/..." self-includes) + guarded add_subdirectory(abc).git subtree split off exported main e5071f32 (303 commits) + abc submodule (server-sync 83d20aa) + LICENSE; standalone ctest 65/66 (only RONtest-red).46f87bcd: dog/+js/ gitlinks, abc pin healed e8d7c59d→83d20aa; full build 558 targets, ctest 386/389 (RONtest + 2 pre-existing: flaky be-blob-projector, stale WILL_FAIL be-bin-status-parity = TEST-002).INDEX.md travels with the repo; consumer include paths unchanged, so beagle-side docs stay valid.main IS pushed (origin/main == 79612854, github.com/gritzko/libdog); BUT its abc submodule pin sits detached, 11 commits AHEAD of libabc origin/main (only remote branch), so a fresh libdog clone cannot init abc — push the abc line first. Beagle publish target ambiguous: only a localhost gitea remote (main ahead 945/behind 1).e8d7c59d was DANGLING (a server-only commit); the scp'd journal/beagle/abc tree re-committed as libabc branch server-sync (3ae5feb sync on 5f84502 + ebcf094 alignof + 83d20aa thread_local — the two C-keyword fixes unblock C++ TUs on gcc 15).main 0ff3eb7 standalone-green; beagle main 46f87bcd builds+tests on submodules; abc server-sync 83d20aa.3d7e1901..79612854) and pushed to github; beagle advanced through 91fd5f14 "use libdog as a submodule" + b0fb0ce4 "bump libdog ver".