---
quick_task: 260602-2ar-communes-and-signoffs-delete-the-more-do
type: execute
status: complete
completed: 2026-06-02
commit: 0559386
files_changed:
  - src/live/wrapper/echo_fire.rs
  - src/live/wrapper/mod.rs
---

# Quick Task 260602-2ar: Communes & Signoffs Clear the .more-done Sentinel — Summary

A consumed commune/signoff FILE-DROP now clears the `.more-done` cadence
sentinel (both nested + flat migration-window copies) in the SAME consume
step, via one shared `remove_both_more_done` helper that the echo-fire
fire-path now also routes through — suppressing the redundant echo commune
that a stale sentinel would otherwise trigger on the next poll.

## What changed

### Task 1 — `src/live/wrapper/echo_fire.rs`
- Added pure free fn `remove_both_more_done(nested: &Path, flat: &Path)` —
  best-effort deletes BOTH sentinel copies given explicit paths; unit-testable
  without touching the process-global SPT_HOME (mirrors `pick_fresher_more_done`).
- Added `WrapperState::delete_more_done_sentinel(&self)` — derives both paths
  via `owlery::nested_perch_dir` + `owlery::perch_dir` (SAME derivation as the
  echo-fire reader) and delegates to `remove_both_more_done`. This is the entry
  point the mod.rs consume-site calls (it has no pre-derived locals).
- Rewired `fire_echo_commune_if_due`: the two inlined
  `remove_file(&nested); remove_file(&flat)` calls (old lines 190-191) are
  replaced by a single `remove_both_more_done(&nested, &flat)` using the locals
  it already holds — zero re-derivation, both sites bottom out in one helper.
- Added two unit tests: `remove_both_more_done_deletes_both_copies` and
  `remove_both_more_done_is_best_effort_when_absent`. Added `remove_both_more_done`
  to the `mod tests` `use super::{...}` import.

### Task 2 — `src/live/wrapper/mod.rs::process_file_drop`
- Empty-body signoff skip branch (~line 1886): added `self.delete_more_done_sentinel();`
  after the drop-file delete, before `return FileDropOutcome::Continue;`.
- Shared exit-0 delete block (~line 2029): added `self.delete_more_done_sentinel();`
  inside the `if exit_code == 0 { ... }` arm, after the drop-file delete match.
  Covers all three live branches (commune + init-stale signoff + normal-flow
  signoff). NOT added to the `else`/retained arm — a failed consume keeps the
  cadence sentinel so the cadence path can still fire later.
- No other `process_file_drop` logic touched (discriminator, envelope,
  routing, teardown predicate intact).

## KNOWN-HAZARD honored
Sentinel paths are NEVER re-derived ad-hoc at the consume-site. Both the
fire-path and the FILE-DROP consume-site reach the SAME owlery derivation and
the SAME both-copies deleter (`remove_both_more_done`), so the reader/writer
path-asymmetry hazard (.planning/debug/resolved/more-done-sentinel-not-written.md)
cannot re-emerge. The consume-site delete is gated on `exit_code == 0`.

## Verification

**Build:** `cargo build --release` — succeeds (only pre-existing dead-code
warnings, including `should_fire` which was already flagged before this change).

**Targeted tests:** `cargo test --release --lib -- echo_fire` — **22 passed, 0 failed**,
including both new `remove_both_more_done_*` tests.

**Grep sanity:**
- `delete_more_done_sentinel` in mod.rs → exactly **2** call sites (lines 1886, 2029). ✓
- `remove_both_more_done` / `delete_more_done_sentinel` in echo_fire.rs → free fn def,
  method wrapper, fire-path call, test calls all present. ✓
- `remove_file(&nested)` / `remove_file(&flat)` in echo_fire.rs → **ZERO hits**
  (inlined pair fully replaced). ✓

**Full lib suite — pre-existing-failure analysis:**
The repo's lib tests share global SPT_HOME / filesystem state and collide under
parallel execution, producing flaky failure counts (multi-threaded: baseline 52
failed, this branch 66 failed — pure parallelism collision, e.g. file_drop tests
gave 6 then 5 across runs). Run **single-threaded** (`--test-threads=1`) the signal
is clean and honest:

| Run (single-threaded)      | passed | failed |
| -------------------------- | ------ | ------ |
| Baseline (no changes)      | 961    | 1      |
| This branch (committed)    | 963    | 1      |

- **+2 passing** = the two new `remove_both_more_done` tests.
- The **1 remaining failure is pre-existing and unrelated**:
  `owl::version_changelog::tests::current_version_honors_override_in_debug_builds`
  (a release-build-vs-env-override version assertion: expects `1.99.99`, sees
  `1.11.22` — touches no sentinel/file-drop code). It fails identically on the
  untouched baseline.
- **Zero new failures introduced by this change.**
- Golden tests (`tests/golden_owl.rs`, `tests/golden_live.rs`) excluded on Windows
  per CLAUDE.md.

## Deviations from Plan
None of substance. Plan executed as written. Minor stylistic choice: the two new
unit tests call `remove_both_more_done(...)` unqualified (imported via the
`use super::{...}` line the plan instructed me to extend) rather than the plan's
illustrative `super::remove_both_more_done(...)` — matches the surrounding test
style (sibling `pick_fresher_more_done` tests call unqualified).

## Self-Check: PASSED
- `src/live/wrapper/echo_fire.rs` — present, modified (+69/-4). ✓
- `src/live/wrapper/mod.rs` — present, modified (+13). ✓
- Commit `0559386` — exists, 2 files changed, no deletions, no docs artifacts. ✓
