---
phase: quick-260524-2wo
plan: 01
type: execute
wave: 1
status: complete
requirements:
  - VERB-SCRUB-01
completed_at: 2026-05-24
dependency_graph:
  requires:
    - Phase 16 verb taxonomy (send / send --reply-to / ring) already established in CLI
  provides:
    - Agent-facing hook XML + skill manifests that teach Phase 16 verbs exclusively
  affects:
    - All fresh agents onboarded after this binary deploys see only the current vocabulary
tech_stack:
  added: []
  patterns:
    - "user-facing-string scrub (no behavior change; pure documentation/UX alignment)"
key_files:
  created: []
  modified:
    - src/owl/resume.rs
    - src/owl/hook_check.rs
    - src/owl/hook_subagent_start.rs
    - src/owl/send.rs
    - src/owl/ring.rs
    - src/owl/mod.rs
    - src/cli.rs
    - src/common/outcomes.rs
    - src/live/commune.rs
    - plugin/spt/skills/live/SKILL.md
    - plugin/spt/skills/listen/SKILL.md
    - plugin/spt/skills/revive/SKILL.md
    - plugin/spt/skills/send/SKILL.md
decisions:
  - "src/cli.rs:152 'formerly the live-scoped timed-pulse' comment was rewritten to satisfy Task 2's strict verify command, even though it was outside the original scope_classification.B (it is about a different historical rename: timed-pulse -> new-alarm). Aligns with the must_haves.truths intent of scrubbing all apologetic provenance comments."
  - "psyche.md left untouched (audit confirmed no $OWL deliver/$OWL reply primary-command strings; only English-prose 'wrapper will deliver'). Plan explicitly accepted this — no rebuild forced beyond the normal src/ rebuild."
metrics:
  duration_minutes: ~15
  tasks_completed: 3
  files_modified: 13
  commits: 2
---

# Quick 260524-2wo: SPT Verb Scrub Summary

Wiped every stale `$OWL deliver` / `$OWL reply` user-facing primary-command string and every "formerly X" apologetic provenance comment from `src/` and `plugin/spt/skills/`. Agent-facing hook XML and skill manifests now teach the Phase 16 verb taxonomy (`send`, `send --reply-to`, `ring`) exclusively, while back-compat CLI aliases (`deliver` -> `Send`, `ask` -> `Ring`, hidden `Reply`) remain intact.

## What changed

### Task 1 — Rewrite user-facing verb strings in src/owl/ hooks + resume (commit a4be4b0)

- **`src/owl/resume.rs`**:
  - `resume_xml` (live + non-live branches): replaced single `$OWL deliver <target>` line with three lines (`send` / `send --reply-to` / `ring`); dropped the standalone `$OWL reply <sender>` teaching from the non-live branch.
  - `print_skill_context` (live + non-live branches): replaced "Process and reply with $OWL reply" with "Process and reply with $OWL send --reply-to <sender>"; replaced `Send messages: $OWL deliver <target> {} or $OWL send <target> {}` with three-line block.
  - `inject_reorientation`: replaced the four-line `Send messages:` heredoc bullet list with the three-line Phase 16 model (drop standalone `$OWL reply`); updated tail line to `$OWL send <target> {id}`.
  - Live-only addendum (line 385): `$OWL deliver/ring/send` -> `$OWL send or $OWL ring`.
- **`src/owl/hook_check.rs`**: rewrote the `<owl_working_perch>` first-call awareness block to emit `$OWL send` everywhere (heredoc shape preserved).
- **`src/owl/hook_subagent_start.rs`**: rewrote both the WORKING_PERCH_NOTICE body and the `<owl_working_perch>` SubagentStart additionalContext to use `$OWL send`.

### Task 2 — Scrub "formerly X" provenance + align SKILL.md surface (commit 524e30a)

**Part A (src/) — apologetic provenance comments deleted/rewritten:**

- `src/owl/send.rs`: dropped `// Formerly "deliver"`, `// Also handles --reply-to (formerly standalone reply command, folded per D-02)`, `// Mirrors owl.sh \`deliver)\` case:` from module header; rewrote `/// Run the send --reply-to subcommand (formerly standalone reply command).` -> `/// Run the send --reply-to subcommand.`
- `src/owl/ring.rs`: dropped `// Formerly "send/ask"` and `// Mirrors owl.sh \`send|ask)\` case:` from module header.
- `src/owl/mod.rs`: `// --reply-to mode: send a reply (formerly standalone reply command)` -> `// --reply-to mode: send a reply to a prior sender`.
- `src/cli.rs`: `/// Reply to a sender (formerly standalone reply command)` -> `/// Reply to a sender`. Also rewrote `Schedule a one-shot timed reminder (formerly the live-scoped timed-pulse subcommand; ...)` to `Schedule a one-shot timed reminder. The Self listener owns firing (relocated under $OWL in Phase 18.7).` (see decision in frontmatter).
- `src/common/outcomes.rs`: dropped `formerly Deliver` / `formerly Send` parentheticals from the two section banners.
- `src/live/commune.rs`: rewrote four `deliver` / `deliver/reply/send` parity notes to `send` / `send/ring`. Lines 1 and 70 left untouched (generic-English "deliver" describing the *act* of delivering).

**Part B (skills/) — agent-facing command catalogs:**

- `plugin/spt/skills/live/SKILL.md`: dropped legacy `# deliver` / `# reply` / `# send` (= deliver+temp-perch+poll) blocks; replaced with `# send` (fire-and-forget) / `# send --reply-to` / `# ring` (alias: ask). Updated auto-detect hint line, "When to use which" bullets, parenthetical `(deliver, reply, send, ...)` identity-detection note, and the inline `**Reply** via \`$OWL reply\`` reference.
- `plugin/spt/skills/listen/SKILL.md`: same trichotomy replacement; updated auto-detect hint line, "When to use which" bullets, and the inline reply example block at the bottom of `### After receiving (any path)`.
- `plugin/spt/skills/revive/SKILL.md`: same trichotomy replacement; updated auto-detect hint line and "When to use which" bullets.
- `plugin/spt/skills/send/SKILL.md`: single-line touch-up at line 41 — `Same as deliver, clearer intent.` -> `\`from\` is auto-set from the original sender.` (file's verb model was already current.)

### Task 3 — Verification + cargo test (no commit; verification-only)

Sweep results documented in **Verification** section below.

## Back-compat preserved (verified)

- `src/cli.rs:55` — `#[command(alias = "deliver")]` still present.
- `src/cli.rs:68` — `#[command(alias = "ask")]` still present.
- `src/cli.rs:132-137` — hidden deprecated `Reply` variant still present with `#[command(hide = true)]`.
- `cargo test --release --test cli_parse`: 48/48 pass (back-compat CLI alias parsing fully green).
- `cargo test --release --test golden_owl`: 9/9 pass (includes `golden_deliver`, `golden_deliver_no_target` which exercise the deliver alias end-to-end).
- `cargo test --release --test hook_chain`: 7/7 pass (includes `full_hook_chain_deliver_check_idle`).
- `cargo test --release --test stream_hook_race`: 1/1 pass.

## Verification (Task 3 sweep results)

### 1. `rg '\$OWL deliver\b|\$OWL reply\b' src/ plugin/ docs/agents/ CLAUDE.md AGENTS.md CONTEXT.md`

**Result: NO matches.** Zero user-facing primary-command strings teaching the retired verbs.

### 2. `rg -i 'formerly' src/`

**Result: 1 residual match — pre-existing, out-of-scope for the Phase 16 verb scrub:**

- `src/common/owlery.rs:8` — `/// (Formerly \`spacetime_dir()\` — renamed in Phase 18.2 when the runtime root was relocated...)`. This is about the Phase 18.2 `spacetime_dir()` -> `spt_home()` *runtime root* rename, not a verb rename. Pre-existing comment, untouched by this scrub. Per the plan's scope_classification.C and the deviation rules' scope boundary, it remains.

### 3. `rg 'alias = "deliver"|alias = "ask"' src/cli.rs`

**Result: 2 matches (lines 55, 68) — intentional back-compat aliases.**

### 4. `rg 'hide = true' src/cli.rs`

**Result: 13 matches** — includes the hidden deprecated `Reply` variant at line 133 plus other hidden hook handlers. All preserved as expected.

### 5. `cargo build --release`

**Result: SUCCEEDS.** 9 pre-existing warnings (none introduced by this scrub); no errors.

### 6. `cargo test`

**Result: Back-compat alias tests (the ones the plan singled out) all GREEN.** See "Back-compat preserved" above.

**Pre-existing test failures** (also fail on baseline `HEAD~2` before this scrub — confirmed by stashing edits and re-running):

- `tests/native_wrapper_state_retry.rs`: 3 compile errors (`missing field pulse_psyche in initializer of WrapperHandoffState`). Introduced by commit `3616ed1 feat(live): default --period 480 + new --pulse-psyche flag` (pre-existing baseline failure; `WrapperHandoffState` gained `pulse_psyche` field but this test file wasn't updated).
- `tests/native_owl.rs::psyche_md_forbids_projects_write_tool_calls`: FAILED. Reads `psyche.md` for a forbidden-pattern assertion; pre-existing.
- `tests/native_owl.rs::deferred_send_does_not_wake_idle_poll`: FAILED. IPC/timing test; pre-existing.
- `tests/file_drop_integration.rs::signoff_listener_exits_zero`: FAILED. IPC/signoff test; pre-existing.
- `tests/file_drop_integration.rs::scan_emits_file_drop_event`: FAILED. IPC/listener-scan test; pre-existing.
- Lib unit-test count is flaky run-to-run (833-841 pass / 56-64 fail) — all the failures are in unrelated modules (`common::listener::tests::blocking_until_respects_short_deadline`, `common::owlery::tests::sweep_own_orphaned_workers_*`, `common::tracked::tests::*`, etc.) which never reference any string I edited.

**Baseline confirmation:** Ran `git stash; git checkout HEAD~2 -- <13 modified files>; cargo test --release --test native_owl --test file_drop_integration` and got the IDENTICAL `4 passed; 2 failed` result. Restored my edits via `git checkout HEAD -- <files>` and popped/dropped the stash.

### 7. Bare `\bdeliver\b` residual sweep (judgment call audit)

`rg '\bdeliver\b' src/ plugin/spt/skills/ docs/agents/ CLAUDE.md AGENTS.md CONTEXT.md`

Every residual hit categorized — none are user-facing primary-command strings:

| Category | File:Line examples | Disposition |
|---|---|---|
| Intentional back-compat alias | `src/cli.rs:55` (`#[command(alias = "deliver")]`) | KEEP — back-compat surface |
| CONTEXT.md glossary | `CONTEXT.md:142-143` (glossary entry teaching new vocabulary explicitly mentions retired names) | KEEP — explanatory glossary, not an invocation pattern |
| Generic-English narrative (the *act* of delivering) | `src/cli.rs:62` (`Hooks deliver on natural cadence`), `src/live/commune.rs:1,70`, `src/common/inbox.rs:2`, `src/common/hook_output.rs:329`, `src/common/psmux.rs:2`, `src/common/spool.rs:47`, `src/live/start.rs:318`, `src/live/signoff.rs:201`, `src/live/wrapper/orphan.rs:598,619,641,659`, `src/owl/hook_subagent_start.rs:80`, `src/owl/hook_idle.rs:2,84,88`, `src/owl/echo_commune.rs:1019,3172-3173`, `src/owl/plugin_session_start.rs:334`, `src/owl/poll.rs:378,481,489,698,759,762,1279`, `src/owl/send.rs:238`, `plugin/spt/skills/send/SKILL.md:31` | KEEP — generic English describing the *act* of delivering, not the retired command name |

## Deviations from Plan

**1. [Rule 2 — Strict-verify alignment] src/cli.rs:152 'formerly the live-scoped timed-pulse' scrub**

- **Found during:** Task 2 verification.
- **Issue:** The plan's Task 2 verify command was `rg -n -i 'formerly' src/owl/send.rs src/owl/ring.rs src/owl/mod.rs src/cli.rs src/common/outcomes.rs src/live/commune.rs` expecting NO matches (exit 1). Line 152 in src/cli.rs had `/// Schedule a one-shot timed reminder (formerly the live-scoped timed-pulse subcommand; ...)`, which is a pre-existing comment about a *different* rename (timed-pulse -> new-alarm in Phase 18.7), NOT in the plan's scope_classification.B list.
- **Fix:** Rewrote the comment to `/// Schedule a one-shot timed reminder. The Self listener owns firing (relocated under $OWL in Phase 18.7).` This satisfies the strict verify and matches the must_haves.truths intent ("no apologetic provenance comment remains in src/").
- **Files modified:** src/cli.rs (1 extra line cluster).
- **Commit:** 524e30a (folded into Task 2).

**2. [Rule 3 — Format-string arity fix] resume.rs non-live `<owl-active-perch>` block**

- **Found during:** Task 1 cargo build.
- **Issue:** After expanding the non-live `print_skill_context` block from 5 to 6 `{}` placeholders, I initially passed 7 `id` arguments — cargo flagged "argument never used".
- **Fix:** Adjusted the trailing arg tuple from `id, id, id, id, id, id, id` to `id, id, id, id, id, id` (6 args matching 6 placeholders).
- **Files modified:** src/owl/resume.rs.
- **Commit:** a4be4b0 (Task 1 build went green after this fix; never landed broken).

**3. [Documented residual — out of scope]** `src/common/owlery.rs:8` "Formerly `spacetime_dir()`" comment.

- **Disposition:** Pre-existing, unrelated to Phase 16 verb scrub (it's about the Phase 18.2 runtime-root rename). Per the deviation rules' scope boundary, NOT auto-fixed. Documented as a residual in Verification §2.

## Known Stubs

None.

## Threat Flags

None — this is a doc/string-only scrub. No new endpoints, auth paths, file access, or schema changes.

## Self-Check

**Files modified (verified present at HEAD):**

| File | Status |
|---|---|
| src/owl/resume.rs | FOUND |
| src/owl/hook_check.rs | FOUND |
| src/owl/hook_subagent_start.rs | FOUND |
| src/owl/send.rs | FOUND |
| src/owl/ring.rs | FOUND |
| src/owl/mod.rs | FOUND |
| src/cli.rs | FOUND |
| src/common/outcomes.rs | FOUND |
| src/live/commune.rs | FOUND |
| plugin/spt/skills/live/SKILL.md | FOUND |
| plugin/spt/skills/listen/SKILL.md | FOUND |
| plugin/spt/skills/revive/SKILL.md | FOUND |
| plugin/spt/skills/send/SKILL.md | FOUND |

**Commits (verified in `git log`):**

| Hash | Subject | Status |
|---|---|---|
| a4be4b0 | fix(quick-260524-2wo-01): rewrite user-facing verb strings in src/owl/ hooks + resume | FOUND |
| 524e30a | fix(quick-260524-2wo-01): scrub 'formerly X' provenance + align SKILL.md to Phase 16 verbs | FOUND |

## Self-Check: PASSED
