Skip to content

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

Part of the-session-domain-is-written-once — The session lifecycle is written by the typed domain, and the shell only parses and renders.

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

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.

Searches the titles and descriptions of every page this site publishes.