Implementation plan — charter module entry-point seams (#6188)

Architecture

Two independent module entry-point seams, kept split (ADR 2026-10-06-2 §1), so each layer's internals are swappable/extractable behind a stable import surface:

external consumers (specify_cli, runtime, glossary, mission_runtime)
        │                                   │
        ▼ offering seam                     ▼ activation seam
  charter.offering.api            charter.activation.api      (NEW)
  + charter.* offering facades            │
        │                                 │
        ▼                                 ▼
  charter.offering.*  (internals)   charter.activation.*  (internals)

Each seam is a pure identity re-export surface (explicit X as X, __all__) so consumers bind the real object and the internals behind the seam can be rewritten/extracted without touching a consumer. Each seam is guarded by:

offering symbol — the split invariant), and

shrink-only where a brownfield baseline exists.

  • an identity gate (the re-export is the same object; the activation seam never fronts an
  • a boundary gate (no external consumer imports past the seam into the layer internals),

Approach (why these choices)

widens its enforcement reach: the boundary gate scanned only specify_cli + runtime, so glossary reached charter.offering.drg.models unguarded. Fix: repoint glossary onto the charter.drg facade (identity-preserved) and add glossary + mission_runtime to the scan.

directly", which is exactly what blocks extraction. Introduce charter.activation.api as the single seam; because 236 pre-existing internal (file, module) reaches exist, enforce with a shrink-only baseline ratchet (new reaches FAIL, stale rows FAIL) governed through _baselines.yaml, and drain tranche by tranche (owner #6099). First tranche: the mission-type-key access cluster.

api widening (DISPOSITION manifest; scope-c-public-contract-delta.md). The seam pattern is identity re-export through a dedicated entry module, not a swollen public manifest.

  • Offering seam already exists (charter.offering.api + facades, C-001). This mission only
  • Activation seam is new. Activation was built "no eager re-exports — import submodules
  • Do NOT widen charter.offering.api — the charter-blessed design prefers facade doors over

Rebase cadence

Branch off latest main; rebase after spec/plan/tasks (pre-implement) and only on a staleness notice thereafter. Collision watch: sibling run #6164 (hosted/sync removal) deletes some cli/commands/* — none overlap the files this PR touches (charter/glossary, not hosted).

Risk controls

the seam + repointed consumers.

so gate and baseline match by construction; growth fails and a stale row fails, so over-inclusion is caught.

  • mypy-strict Any-leak (#4188): seam uses explicit X as X re-exports; mypy verified clean on
  • Gate baseline correctness: the activation baseline is generated from the gate's own predicate,