A be post that reaches a DETACHED submodule worktree refuses POSTDET ("re-attach to a branch first") and aborts the whole commit with BEDOGEXIT — seen live: be post! from beagle → post abc → POSTDET; be post --nosub from be → POSTDET. Per the corrected Submodules §"Committing detached subs" two clauses must hold: (1) a detached sub still COMMITS, leaving its wt detached at the new commit ?newhash; (2) a parent commit puts the sub onto its synthetic dot-branch ?/<sub>/.<parent>/<pbranch> by bumping the 160000 gitlink. POSTDET-refuse is correct ONLY for a top-level wt (DIS-009 / GET-024); a submodule is the exception. Blocks landing DIS-052, DIS-042, COMMIT-003 (all sit on detached subs). Live 2026-06-26. Method /meta/work.
be post! from ~/journal/beagle → post abc / `sniff: post: refusing on
detached wt — re-attach to a branch first / POSTDET / BEDOGEXIT. Same from ~/journal/be (be post --nosub → POSTDET`).
beagle, abc, be) read detached ?<sha> because the journal postrecursion recorded detached cur-tips and never attached them to the dot-branch.
post_is_detached_wt (sniff/POST.c:945, DIS-009) flags empty-fragment +40-hex-query as detached → POST refuses; GET-024 confirms the refusal is CORRECT for a top-level wt. The submodule case is the unhandled exception.
be get ?<branch> resets the wt (losing uncommitted work);re-attach-by-NAME is SUBS-023 (closed WON'T-FIX: re-attach is by PIN, i.e. clause (2) here, not a named get) — so there is NO recovery route today.
be post on a detached SUB (parent-driven OR standalone) COMMITS, leaving
the wt detached at the new commit ?newhash — never POSTDET.
be post that bumps the sub's 160000 gitlink (re)attaches the
sub onto ?/<sub>/.<parent>/<pbranch> at the new tip (create if absent, FF if present) — the post-order R4→R2→R1 drive (Submodules §four-records).
POSTDET refusal stays intact (DIS-009/GET-024);ONLY the submodule context changes.
SUBSDirty / SNIFFSubReadTip / the SUBS-027b R2 emit;ragel/REFS only, no branch-string hand-rolling. Repro-first (CLAUDE §17).
gitlink), SUBS-027b (R2), or the top-level POSTDET tests (test/get/33).
the freshly-built binary may drive that land step (an exception to the prebuilt-binary rule, since the prebuilt be carries the POSTDET bug).
(sniff/GET.c, sniff/test/*) and DIS-042 (test/post/40, test/post/53, test/post/INDEX.md). Keep SUBS-035's files DISJOINT (sniff/POST.c, beagle/SUBS.c, beagle/BE.cli.c, sniff/PUT.c + a FRESH test dir); do not touch those files, and append to a shared INDEX without disturbing their lines.
<wt>/.be as a FILE; a top-level wt has it as a DIRECTORY. New post_wt_is_secondary() mirrors PATCH.c's wt_is_secondary (POST-004) — one consistent discriminator across PATCH and POST. The detached-wt POSTDET refusal now gates !detached_sub; top-level keeps refusing (DIS-009/GET-024).
detached ?<newhash> shape (sha in query, empty fragment — same writer GET uses) and advances NO branch REFS (no phantom trunk, DIS-053); the commit is ref-less until the next parent post re-attaches it.
bepost_recurse_cb → bepost_synth_child_uri → child POST-onto-synth + bepost_bump_sub + SUBS-027b R2 emit already creates/FFs ?/<sub>/.<parent>/<pbranch> and bumps the gitlink. Repro confirmed R1/R2/R4 all land; the only gap was clause 1's standalone-detached refusal.
be post COMMITS,
no POSTDET, wt reads ?newhash (still detached). test/post/54.
be post bumps the sub gitlink AND the sub lands on
?/<sub>/.<parent>/<pbranch> at the new tip (ref exists, points to the bump).
sniff/POST.c post_wt_is_secondary + detached_sub (refuse/REFS/cur-tip arms).
new code needed.
get/33); SUBS-006/019/027b green;ctest 467/467 (WITH_SSH) + 376/376 (build-debug), 0 fail.
via the parent bump (clause (2)); this ticket implements exactly that, so the named-get route the error message suggests is not needed.
POSTCommit
(sniff/POST.c:2572) refused POSTDET for ANY bare detached wt with no target branch. A submodule mount is detached at the pin BY DESIGN, so a standalone be post inside it (and be post --nosub from a sub) hit the refusal — there was no top-level-vs-sub discriminator (PATCH already had one, POST-004; POST never got it). Clause 2 was already correct.
sniff/POST.c): (a) new post_wt_is_secondary() at ~963
(mirror of PATCH.c wt_is_secondary); (b) bare_detached/detached_sub at POSTCommit entry ~2578 — refuse only !detached_sub; (c) skip the trunk REFS advance for detached_sub (~3180); (d) record the cur-tip in the detached ?<newhash> shape for detached_sub (~3247); (e) skip the ff pre-flight for detached_sub (~2669). Clause 2 unchanged (existing bepost_recurse_cb).
test/post/54-sub-detached-standalone-commit (SSH-gated, registered in
test/CMakeLists.txt) — RED on revert (POSTDET), GREEN with fix. Asserts: clean detached sub no-ops (no POSTDET), dirty commits + stays detached ?<40hex> + ref-less, parent post re-attaches ?/sub/.parent + bumps gitlink.
top-level POSTDET (get/33) + SUBS-006/019/027b (post/29/39/49/50/51/52) green.
sniff/GET.c, sniff/test/*; DIS-042 test/post/40,
test/post/53, test/post/INDEX.md) NOT touched. STOPPED before committing.
build-debug/bin/be is the
bootstrap that can now drive the commit of the detached beagle/abc/be subs (incl. DIS-052/DIS-042/COMMIT-003) — the prebuilt build/bin/be still carries the POSTDET bug.