I3141 — majordomus session close writes its record through the typed domain's closer, and the shell closer is deleted
ADR 0047 cutover step 1: route the shell's session close to session::store close, keeping the shell's arguments, human output and exit codes, and delete the shell writer and its lock path.
BLOKOVÁNO vlna 1 · p1 · profil implementation · bezpečné paralelně
Blocked. This issue cannot start until I3320 is done. The status is derived from that, not declared.
Cíl
ADR 0047 cutover step 1: route the shell's session close to session::store close, keeping the shell's arguments, human output and exit codes, and delete the shell writer and its lock path.
Proč
ADR 0047 recorded the closer twice: lib/session.sh writes under mj_lock_take (case 220 holds it), and apps/majordomus-cli/src/session/store.rs has a close() reachable only from the library. Two implementations of one verdict drift: the 2026-10-12 shell reading of the model reported 318 drift findings where the Rust executable reported 26 (.github/workflows/github.yml). Split on 2026-10-18 (verification): the executable contract every lifecycle command relies on is I3320, so this issue is the closer cutover alone. Proposed in ADR 0184 (Every command name is implemented by exactly one executable, and the other only delegates) (proposed; it carries no authority until the owner accepts it). Sources: chatgpt-majordomus:c109#3.
Aktuální stav
lib/session.sh owns close; session/store.rs close() has no caller; case 220_exactly_once_close drives three concurrent SessionEnd shims.
Cílový stav
One closer, in Rust; case 220 unchanged and green; the shell function is argument parsing and rendering.
Rozsah
- lib/session.sh
- apps/majordomus-cli/src/session
- apps/majordomus-cli/src/cli.rs
- share/commands.yaml
- .ai/repo/automation/inventory.jsonl
- test/cases/220_exactly_once_close.sh
- apps/majordomus-cli/src/commands/mod.rs
- apps/majordomus-cli/src/capability/builtin/session_domain.rs
- apps/majordomus-cli/tests/session_domain.rs
- docs/generated/cli.yaml
Mimo rozsah
- session start, checkpoint and handover (I3142, I3144)
- The executable-resolution contract itself (I3320)
Závislosti
Co na tom čeká
Kritéria přijetí
- case 220 passes unchanged against the new closer
- Exit codes and machine output of session close are unchanged
- No close logic remains in lib/session.sh
- bin/majordomus hands session close to the executable by reading the generated docs/generated/cli.yaml at run time, as every delegated path is (rule project.commands-are-projections, bin/majordomus:100-103); no delegation line is generated into or hand-written in bin/majordomus
Validace
- bash test/run.sh --no-skips 54_session_lifecycle_hooks 60_session_lifecycle 61_session_envelope 62_session_divergence 63_session_records 111_session_per_provider 130_lifecycle_survives_a_stale_task 135_session_store_recovery 220_exactly_once_close
- cargo test --manifest-path apps/majordomus-cli/Cargo.toml --test session_domain
- cargo test --manifest-path apps/majordomus-cli/Cargo.toml --lib session::
Požadované důkazy
- case_close_asks_the_domain
Důkazy
Nic nezaznamenáno. Za každým tokenem výše musí stát příkaz nebo artefakt, než lze tento úkol dokončit; vyprávění se odmítá.
Časová osa
- zahájeno
- —
- ověřeno
- —
- dokončeno
- —
Tato tři pole, důkazy výše a stav závislostí jsou vše, z čeho se stav skládá. Neexistuje žádné pole stavu, které by s nimi mohlo být v rozporu.
Canonical record: .ai/repo/project/issues/I3141.yaml. Read it back with majordomus plan show I3141.