---
name: m9-wave1-progress
description: M9 COMPLETE — all four gates closed (G1/G2/Gateway-WAN/G3). PR #10 (Wave 3) held, merge=operator-only
metadata:
  node_type: memory
  type: project
  originSessionId: cac905c4-0186-45cc-8462-8b34fe78904b
---

M9 "Adapter customization & session surfaces". Executor todlando, reviewer doyle. CONTEXT = NORMATIVE (deviation = STOP-and-ping, never code-around). Stacking branches; **merge-to-main ONLY for a public release** (operator policy 2026-06-13) — PRs are CI/gate vehicles. No tag rides M9.

**M9 COMPLETE — ALL FOUR GATES CLOSED (2026-06-12 → 06-13).** G4=G3 stamped PASS by doyle 2026-06-13 (PR #10, branch `m9-digest-logs`, 5 commits + title-fix 1fc6236). doyle independently verified: CC E2E `harness_hosted_digest_projects_and_pushes_deltas` 1-pass, workspace 0-fail (56 bins), clippy -D, --no-default-features, xtask OK, traceable EXIT=0, PTY-parse grep-clean. **DO NOT MERGE PR #10** — merge-to-main = operator/release-gated only; no tag rides M9; PRs are gate vehicles. Next move = operator's.**

**FOUR GATES CLOSED (2026-06-12 → 06-13):**
- **G1 — Wave 1 `m9-adapter-custom` (PR #7):** adapter profiles + strings + hints. Doc-pin b189513 (skip-seen hint tiebreak ratified). CI green both runners. doyle re-ran + reviewed survey/engine/seams.
- **G2 — Wave 2 `m9-user-surfaces` (PR #8):** user-msg identity gate + Gateway acceptance + live-role.md. Blocker (reconcile must STRUCTURALLY exclude live-role.md, not by-rarity) fixed 77e0fb1 + verified (RoleExcluded before reconcile_file; artifact preserved; failer-runtime test). Win RED was hfenduleam disk-full not code — see [[hfenduleam-target-bloat-ci-red]]. CI green.
- **Gateway-WAN — `m9-gateway-wan` (PR #9, REQ-MSG-6):** cross-node Gateway user-msg. `Instance.endpoint_type` advert (additive/N-1) + `receive_wan` resolves via instances_of(from) filtered to QUIC-proven origin_node, is_gateway only. **Trust posture (operator-ratified 2026-06-13): subnet membership = trust boundary; no anti-forge defense; user-surface-set VETOED.** Matrix + wanmsg + xtask green. doyle authored the doc/spec (CONTEXT §Gateway + ROADMAP + JIT plan, commit 30fea7f) → directed todlando → gated PASS.

**Tracked condition — LOGGED (58f034f on PR #9):** T5 twohost HONORED-path int marked REQUIRED-BEFORE-LECTURN on REQ-MSG-6 + ROADMAP ("activate int when adding it"). Negative/security path already E2E (wanmsg funnel); positive honored path has no exerciser until a real cross-node Gateway. Don't re-flag — it's logged.

**LAST M9 PIECE = Wave 3 / G3 — LAUNCHED 2026-06-13 (branch `m9-digest-logs` off main, lands as one PR):** digest log-projection engine + `api digest-entry` → RETIRE the PTY-parse half + REQ-TERM-4 retitle/re-point in the SAME commit (never momentarily un-evidenced). Plan = `M9-WAVE3-JIT.md` (doyle GREENLIT, §2 RULED). Watch: history-grain fallback pre-authorized but MUST be flagged at G3 if taken. Zero PTY-parse remnants; CC-fixture digest E2E; docs sweep. Don't re-plan G1/G2/Gateway-WAN — closed.

**§2 RULING (doyle, the one design decision — Approach A):** digest projects a SMALL spt-core-PUBLISHED record contract (`role`∈{input,agent,tool} / `text` / optional `tool{name,arg}`; consecutive `role:"tool"` collapsed; malformed→skip). NOT "adapters already emit it" — it's a published surface adapters target. CRITICAL: native history stays adapter-OPAQUE (echo/resume carry `raw` verbatim, REQ-SEAM-HISTORY) → digest contract is an OVERLAY, NOT the universal native shape. ONE schema, no `r`→`role` mapping layer; the stray native test fixture (history.rs:249 `{"r":"u"}`) MIGRATES to the digest shape. Contract published in CONTEXT.md 334-343 + MANIFEST (REPLACES `[pty_digest]`, not just deletes). §3 retire is SURGICAL: keep Digest/Turn/DigestEntry/ToolUse + delta machinery + digesthub; kill only parser/PtyDigest/byte-feed. Carry-forwards: Path-A-coarse→B-first fallback flagged-not-silent; E2E filename flagged at G3.

**owl send gotcha:** owl `send` HANGS if body is passed as a positional FROM arg — pipe body via stdin heredoc (`$OWL send <target> <<'EOF'…EOF`). todlando hit this; messages stalled silently.
