# S115 (2026-07-13) — Adopt AI_INFRA presence-not-age selector guardrail + rec-3 hmw.js STOP-HARD

> **Type:** governance/tooling adoption (0 product code — no `src/`, no `fe-*`, no `tests/`). **Lead:** Opus 4.8 (1M) Max (Fable outage). **HMW-mode:** ON. **Commit:** `81b59f0` (pushed) + closeout. **CI:** Run #385 PASS 5m23s, bundle FROZEN.

## What & why

AI_INFRA published two items dated 2026-07-13: a directed approval (`6c32df89` — approves SE's H-22 + H-21/MTv3 reports at VERIFIED; SE = **first-in-fleet** full H-22) with rec-3, and a broadcast (`ab6c387e`, type=**update**) "presence-not-age selector guardrail" asking each project to re-verify **only the selector** of its memory refine-step against a 3-point function-floor. Owner directed the full rigorous pipeline.

## Pipeline (H21 engine-đắt, owner-directed)

`/check-email AI_INFRA` (2 new pulled + hash-verified `6c32df89b60a`) → `/fable-clone reviewer` **5-lane ensemble** (`wf_b621aac4-f0b`) → lead verify+synthesize → **spec** (`runs/2026-07-13-presence-not-age-adopt/spec-…-13-07-2026.md`, H21 3-heading) → `/fable-real reviewer` **single deep-pass** (`spec-review-fable-real.md`) → **PASS-WITH-FIXES (0C/2M/5m)** → owner scope-decision **ALL-3** (AskUserQuestion) → HMW execute (**em-main solo**, governance single-writer D9) → adap-report + email → commit + push → CI verify.

**🎯 fable-real earned its keep:** the 5-lane ensemble converged confidently, but all 5 missed **M2** — a real *contiguity-inversion bug* in em-main's D3 pseudocode (a naive "skip protected entry" on the archive-gate's contiguous top-prefix byte-cut would leave the entry ABOVE the cut → still archived while the code believed it excluded = silent inversion). The independent deep-pass caught it. Breadth (N lanes) vs depth (1 adversarial pass) — the deep-pass catches consensus-shared blind-spots. Also M1 (D2 acceptance grep too narrow).

## Deliverables (all verified)

- **D2 (MUST) — `hmw.js` fail-soft → up-front STOP-HARD.** Unknown non-empty role (typo/rename-drift) → `throw` in an up-front validation pass BEFORE `parallel()` (a per-lane throw could be swallowed to `null` by `results.filter(Boolean)` = STOP-SILENT, worse). Preserves the legit `null`/`''`/omitted role-less inherit-lead path (H6.2). **Acceptance:** `node --check` exit 0 + stub 7/7 (typo→throw naming `#i`; null/''/omitted→no-throw; all-12-valid→no-throw). Doc-sync 5 live lines (`ultra-on:21/26`, `README:208`, `harness-11-engine:348`, `runbook:520`); `session-start` correctly untouched; 3 adap-reports + S56 parenthetical + the 🧊 saga note = frozen history.
- **D3 (SHOULD) — `memory-archive-gate.ps1` value_protect advisory-flag → pre-selection HARD-SKIP.** Value-marked LOGICAL entries (heading-only spans, `---`-robust) partitioned OUT of the movable pool BEFORE the size-drain; **non-contiguous per-entry byte accumulation** (the M2 fix); value-floor WARN. **Acceptance (fault-injection):** protected-big-at-top NOT drained (`afterEst 986>850` vs old ~169); permutation-invariant (`1029==1029`); value-floor fires; DRY-RUN preserved; A7 untouched. Real regression: 12 subs render, A7 242/242, exit 0.
- **D1 (MUST) — `reinject-ledger.md` re-verify stamp** + 3 honest-notes + BUILD-GAP disclosure. `governance-detectors` 0 new HIGH.

## Verdict (the broadcast's re-verify)

- **(i) reinject-by-absence = COMPLIANT** (floor-rot = coverage-gap, not age; CG-1 = rate-limiter not age-rank).
- **(iii) MFE age-band = COMPLIANT** (print-only flag, no consumer, STATUS-gated denominator).
- **(ii)+(iii) archive-gate = RED-FLAG → HARDENED** (D3).
- **Honest:** D3 = defense-in-depth codify, **NOT leak-closure** (9-token grep unchanged → spine/paraphrase leak remains; em-main value-scan stays the guarantee). Reinject per-item-L1-presence detection stays PARTIAL (BUILD-GAP).

## Other

- **Owner-directed:** `crystallized_backfill.target` 0 → **210K** (budget.json); planner confirms `expected_backfill 210K` fits headroom 253.7K. Honest caveat recorded (file-floor headroom = upper bound; ~44K left for task-context worst-case).
- **RAG-down at bootstrap** (§2.3): `list_projects` 0-chunks across all collections = gotcha #14 down-artifact (Qdrant off after reboot, corpus intact). **AI_INFRA restored it** (their domain, §I1); SE flags + defers. Recorded in `feedback_aiinfra_charter_v2` (don't run `rag-infra.ps1` — positional syntax note).
- **#53 return-garble ×2** (fable-clone lane-4 Part B → recovered from `sub-reviewer-4.md`; cicd #385 → recovered em-main-solo curl + diary). 0 work lost. Cumulative ~×19.
- **AS-10 residual:** `reviewer/MEMORY.md` self-written by the fable-real Agent-spawn → git-diff backstop caught → em-main verified faithful → KEPT (convention-not-mechanism).
- **H22 dogfood:** the Stop-hook auto-committed run-trace + agent-memory as `wal:` flushes between turns; §5.0 `reset --soft` squashed this-session's trail into one `[CLAUDE]` commit (no pushed-history rewrite).

## State (unchanged — governance-only)

**Mig 65 · 89 tables · 486 tests · gotcha 81 · menu 54 · bundle admin `D51OYyGV` / user `BVdssm5S` · prod 37 NCC / 17 user.** No new User-Mark (codify-only, applies existing `RC-…10-29-11`).
