# sub-reviewer-1 — LENS 1 / FLOOR (i) reinject-by-ABSENCE

**Run:** 2026-07-13-presence-not-age-adopt · **Lane:** 1 of 5 · **Lens:** reinject-by-absence
**Broadcast:** ab6c387e (presence-not-age, type=update) · **Reviewer:** adversarial, presence-vs-age lens

---

## VERDICT: COMPLIANT (already presence-based) — necessity = SHOULD (doc-stamp only, no mechanism change)

SE's reinject selector (floor-rot → CG-1) already decides by **PRESENCE / coverage-gap** (dropped-from-L1), not by AGE. The `age-band` in `mfe-eval.ps1` is a **FLAG that feeds no reinject decision** — it does not rank or cut by age. Floor (i) is MET. The only actionable is an add-only re-verify stamp + surfacing the already-disclosed build-gap (mechanized per-item presence-detection is PARTIAL).

---

## Evidence (file:line + short quote)

### 1. The reinject TRIGGER is defined by PRESENCE, explicitly

- `.claude/governance/reinject-ledger.md:3` — "một **mục-sàn floor-rot** (đã-từng-ở-hot-mem nay **RỚT**)". Trigger = *was in hot-mem, now dropped* = a coverage-gap, not an age.
- `.claude/governance/reinject-ledger.md:12` — "item **ĐÃ-từng-tồn-tại ∩ CÒN-giá-trị ∩ RỚT-khỏi-L1**" (already-existed ∩ still-has-value ∩ dropped-from-L1). This is **verbatim** the broadcast floor (i) "should be present but is missing".
- Same line disambiguates the two non-reinject cases exactly as the broadcast demands: "Item chưa-từng-dựng = **build-gap** (KHÔNG reinject). Item hết-giá-trị = để **cold-archive** (rớt đúng-đắn)." → old-but-valueless drops correctly; only present-needed-but-missing reinjects. Age is nowhere in the predicate.

Broadcast floor (i) check — "Old-but-present = no reinject; new-but-dropped = reinject; age plays no part": SE ledger satisfies all three (old-but-present stays PRESENT so never qualifies; a newly-dropped high-value item qualifies regardless of its age; the predicate has no date term). **MET.**

### 2. The `age-band` does NOT rank or cut by age — it is an advisory FLAG

- `scripts/mfe-eval.ps1:184-185` — `$oldN=0; foreach ($d in $markDates) { if (($Today-$d).TotalDays -gt 30) { $oldN++ } }`. This **counts** marks >30d old. There is **no `Sort-Object`**, no ordering, no threshold-cut.
- `scripts/mfe-eval.ps1:186-188` — the ONLY consumer of `$oldN` is a `Write-Host`: ">30d old but still Active=$oldN -> **KEPT (status-driven, age-blind)**" and "drop on status-change, **never by age**". `$oldN` feeds no branch, no filter, no reinject/cool-down decision (verified by full-file read + grep: `$oldN` appears only at :184 and :187).
- Header comment `scripts/mfe-eval.ps1:183` — "age-band : FLAG old-but-still-required, **NEVER cut**". The design intent is explicit and matches the broadcast.

### 3. No date-sort anywhere in the reinject path (grep-confirmed)

- `Sort-Object` in `scripts/` (grep): only 3 hits — `memory-selfimprove-audit.ps1:292` (Sort `LastWriteTime` to pick the **latest** run for the HCV eval-arm = date-used-for-PRESENCE/last-seen = the broadcast's explicit **OK** case, and out of scope for reinject), `measure-agent-memory.ps1:10` (Sort by **Name**), `memory-archive-gate.ps1:106` (Sort by **Name**). **Zero** date-rank in mfe-eval.ps1 or in any reinject decision.

### 4. The audit script does NOT own the reinject decision

- `scripts/memory-selfimprove-audit.ps1:327` — "It does NOT verify ... **B2 CG-1 termination decisions** ... (those are separate arms: mfe-eval.ps1 + the reinject-ledger + em-main judgement)." So reinject is decided by the ledger's presence-test + em-main, not by any age-based checker.

### Broadcast self-check (iii) applied to the age-band (drop-the-date-column test)

Drop `$markDates` (the date column) from the age-band input → `$oldN` becomes 0/uncomputable → the **printed count changes**, BUT no reinject or cool-down **behavior** changes, because `$oldN` drives nothing. Per the broadcast rubric this is NOT the "date used for age-RANK → fix" case; the age-band is not even a selector (it selects nothing). **Not a red flag.**

---

## Self-refutation (strongest case AGAINST my COMPLIANT verdict)

**The attack:** `reinject-ledger.md:38` itself names the age-band as the floor-rot **detection signal feed** ("Tín-hiệu floor-rot feed = mechanized (`mfe-eval.ps1` age-band ...)"). If the only mechanized signal a human reads before reinjecting is the age-band — which thresholds at **>30d** — then in PRACTICE reinject could be smuggled-in as age-ranked (human-in-the-loop age bias). That would make "presence-based" true on paper but age-driven in operation.

**Why it still fails (rebuttal):** The age-band counts marks that are **still Active / still present** in `ACTIVE-MARKS.md` (it iterates `$markDates` built only from marks that passed the Active-status filter at :95-98). Still-present items are **by definition not floor-rot** (floor-rot requires DROPPED). So the age-band literally cannot surface a dropped-item reinject candidate — it counts the *opposite* set and labels it "KEPT". The genuine per-item-L1-presence detector (the thing that would actually detect a drop) is **admittedly PARTIAL** — `reinject-ledger.md:38`: "Detection per-item-L1-presence hiện **partial** ... chưa có pass so-từng-item-trong-L1". That is a **BUILD-GAP** (a missing presence-detector), **not** an age-rank being used to decide. A missing detector under-fires reinject; it does not convert the criterion to age. The broadcast pre-classifies exactly this situation: "already-presence-based → **quick re-verify only**" and "floor = FUNCTION not FORM". So COMPLIANT holds; the residual is a coverage/build-gap to note, not a presence-vs-age violation.

---

## Concrete change (necessity = SHOULD — add-only doc-stamp; mechanism unchanged)

No code change to `mfe-eval.ps1` (already FLAG-only) and no change to the reinject predicate (already presence-based). Propose appending a short re-verify stamp to `reinject-ledger.md` after the existing honest-nấc (current last line :38), recording the presence-not-age adoption + the self-check (iii) outcome + the still-open build-gap. Suggested text (lead may reword — FORM is self-determined per broadcast note #3):

```markdown
## Presence-not-age re-verify (adap broadcast ab6c387e, 2026-07-13)
- Floor (i) MET: reinject trigger decides by ABSENCE (đã-từng-ở-L1 ∩ CÒN-giá-trị ∩ RỚT-khỏi-L1, §CG-1 line 12), never by age. Old-but-present → cold-archive; new-but-dropped → reinject. Age has no term in the predicate.
- Self-check (iii) PASS: `mfe-eval.ps1` age-band computes `$oldN` (count >30d) and ONLY prints it ("KEPT, status-driven, age-blind"); it feeds no reinject/cool-down branch. Drop the date column → printed count changes, reinject behavior does NOT. No `Sort-Object`-by-date in the reinject path.
- HONEST (basis = ONE proactive occurrence, SPECIFIC-APPLICATION not new rule): mechanized per-item-L1-presence detection is STILL PARTIAL (age-band counts present marks, not drops) → BUILD-GAP, not an age-rank. Escalate to build a presence-diff pass when AS/guard/gotcha in-L1 detection matures (tracked here, §I honest nấc + CAVEAT C4).
```

**Scope guard:** add-only, ~6 lines, no existing line edited/deleted (ledger is append-only single-writer em-main, `reinject-ledger.md:5`). Do NOT touch mfe-eval.ps1. Do NOT introduce any new filename/structure mirroring the hub (broadcast note #3: floor = FUNCTION not FORM).

---

## Measurable acceptance criteria

1. `reinject-ledger.md` contains a presence-not-age re-verify block that states floor (i) decides by absence and age has no term in the predicate. (Verify: grep `presence` / `age has no term` in the file.)
2. The block records the self-check (iii) result for the age-band (FLAG-only, `$oldN` feeds no decision, no date-sort in reinject path). (Verify: block references `$oldN` / `age-band` / "no Sort-Object-by-date".)
3. The block carries all 3 broadcast honest-notes for this floor: basis=ONE-occurrence, SPECIFIC-APPLICATION-not-new-rule, FUNCTION-not-FORM (or the lead-synthesized equivalent placed once across lanes). (Verify: presence of the three phrases or a single cross-lane honest-note section.)
4. `mfe-eval.ps1` is byte-unchanged (no over-engineering; already compliant). (Verify: `git diff --stat` shows no change to `scripts/mfe-eval.ps1`.)
5. No new date/timestamp `Sort-Object` introduced in any reinject-decision path. (Verify: grep `Sort-Object` in scripts unchanged from baseline: audit:292 LastWriteTime [presence/last-seen, OK], measure:10 Name, archive-gate:106 Name.)

---

## One-line finding

SE reinject floor-rot already triggers by PRESENCE (dropped-from-L1, ledger:12), the age-band is a print-only FLAG that decides nothing (mfe-eval.ps1:184-188) — COMPLIANT; only add-only doc-stamp + surface the already-disclosed partial presence-detector build-gap.
