I3145 — Continuity is resolved and judged fresh by one function, and the shell's copies are deleted
ADR 0047 steps 5 and 6: continuity.state, lifecycle.*, episodes.* and the Cockpit read the domain's aggregates; mj_resolve_latest and mj_freshness are deleted and their callers ask the executable, so nothing in lib/ holds domain state.
BLOCKED wave 4 · p2 · implementation profile · parallel safe
Blocked. This issue cannot start until I3143, I3144 are done. The status is derived from that, not declared.
Objective
ADR 0047 steps 5 and 6: continuity.state, lifecycle.*, episodes.* and the Cockpit read the domain's aggregates; mj_resolve_latest and mj_freshness are deleted and their callers ask the executable, so nothing in lib/ holds domain state.
Why
Freshness is implemented twice (lib/common.sh mj_freshness and Freshness in capability/builtin/continuity.rs), both reading session.freshness in .ai/repo/policy.yaml; ADR 0047 names the duplicated resolution for deletion. Sources: chatgpt-majordomus:c116#7.
Current state
Two resolvers and two freshness functions agree today by construction of the same policy keys.
Desired state
One resolver and one freshness function, in Rust; a structural case proves the session libraries carry no lifecycle semantics.
Scope
- lib/common.sh
- lib/handover.sh
- lib/context.sh
- apps/majordomus-cli/src/continuity
- apps/majordomus-cli/src/capability/builtin/continuity.rs
- apps/majordomus-cli/src/capability/builtin/lifecycle.rs
- apps/majordomus-cli/src/capability/builtin/episodes.rs
- .ai/repo/automation/inventory.jsonl
Out of scope
- Changing the freshness thresholds
Dependencies
- I3143BLOCKED Each provider lifecycle event leaves a typed receipt written by the domain before any guard can return early
- I3144BLOCKED Checkpoints and handovers are recorded against the episode, and the shell only parses and renders them
Acceptance criteria
- No freshness threshold or resolution order remains in shell
- cases 127, 131_freshness_has_an_age and 368 pass unchanged
- The inventory records of lib/session.sh, lib/checkpoint.sh and lib/handover.sh leave disposition A with a reason, as a consequence of the structural case, not as its proof
Validation
- bash test/run.sh --no-skips 127_briefing_freshness 131_freshness_has_an_age 368_mesh_handover_resolves
- bin/majordomus-cli shell check
Evidence required
- case_one_resolver
Evidence
None recorded. Every token above needs a command or an artifact behind it before this issue can be completed; narrative is refused.
Timeline
- started
- —
- verified
- —
- completed
- —
Those three fields, the evidence above and the state of the dependencies are all the status is made of. There is no status field to disagree with them.
Canonical record: .ai/repo/project/issues/I3145.yaml. Read it back with majordomus plan show I3145.