be put path to add a brand-new submodule gitlink (PARTLY LANDED)
LOW — PARTLY LANDED 50724d9a (2026-06-06). A design pass found two unresolved forks blocking true git submodule add parity, so the ticket's sanctioned fallback shipped and the full add escalated to SUBS-013:
.be
anchor is file:/…/.be//?/<title>#<sha> (a local shard pointer, not the portable upstream .gitmodules needs); auto-writing it would break a fresh clone elsewhere.
be put <sub>#<sha> is the move-form, so a pin slotis a CLI fork.
Landed: sniff/PUT.c PUTStage now detects a sub-add candidate (a dir that is not a mount and is either declared in .gitmodules via SNIFFSubsParseFind or holds a child .be) and refuses with an actionable message naming the sniff sub-mount ./<sub>#<pin> step, instead of the misleading "does not exist — skipped" / PUTNONE. A trailing-slash arg still falls through to dir-form; a plain untracked dir still gets the original message (see SUBS-014). Repro test/put/11-sub-add-refusal added. The existing declare-.gitmodules + sniff sub-mount + be put-gitlink flow already records both the 160000 gitlink and the .gitmodules section end-to-end (post/15).
Remaining (→ SUBS-013): the full auto-add — choose a URL source and a pin grammar, then stage gitlink + synth .gitmodules from a single be put.
LOW (feature gap). A freshly-mounted submodule that is not yet a 160000 gitlink in the parent baseline cannot be added through be put. be put vendor/sub2 on such a path returns put: vendor/sub2 does not exist — skipped / no eligible paths (PUTNONE/206); the parent sees the dir as unknown and skips it. There is no git submodule add parity.
be get <parent>?master.vendor/sub2 (no .gitmodules entry, no 160000entry in the parent tree).
be put vendor/sub2 → PUTNONE; nothing staged.
A defined flow to introduce a new submodule: stage a new 160000 gitlink for the added sub plus the .gitmodules section (git submodule add parity), so a subsequent POST records the new sub. Or an explicit, documented refusal naming the missing piece — not a bare PUTNONE.
No way to add a new submodule via PUT; the path is silently skipped as an unknown dir.
Detect a mounted-but-untracked sub dir (a child .be anchor with no parent gitlink) under an explicit be put <path> and stage a new gitlink + a .gitmodules section (synth via SUBSu8bSynth). Decide the URL source (the sub's row-0 anchor / its remote) for the .gitmodules url =.
test/put/10-sub-gitlink-bump covers the existing-gitlink bump (passing); sub-add stays a documented gap until the flow is designed.