The file C:\Users\decid\Documents\projects\spt-core\docs\KNOWN-HAZARDS.md has been updated successfully. (file state is current in your context — no need to Read it back)

- **spt-core mapping:** `spt_net::net::registry::SubnetRegistry::merge_instance` (the lease) + `spt_store::epoch::EpochSource` (the counter). Cross-node replication of the merge wires at D4; the merge seam is identical for local and wire-delivered updates. Chaos/two-host verification = D9.

---

## 5. Platform-specific

- **spt-core mapping:** `spt_net::net::registry::SubnetRegistry::merge_instance` (the lease) + `spt_store::epoch::EpochSource` (the counter). Cross-node replication of the merge wires at D4; the merge seam is identical for local and wire-delivered updates. Chaos/two-host verification = D9.

### 4.9 SQLite stores must create their parent dir — SQLite won't
<!-- [doc->REQ-HAZARD-REGISTRY-DIR-CREATE] -->
- **Failure:** `Connection::open` creates the database FILE but never its parent DIRECTORY. On a fresh home (first boot, fresh CI `_work` dir) a registry op that runs before any perch-creating op (`create_dir_all` side effects) fails `SQLITE_CANTOPEN` — "unable to open database file …owlery\.registry". Timing-dependent: whichever code path touches the home first decides the outcome, so it surfaces as a parallel-test flake (bind-first tests losing the dir-creation race to perch-first tests). Bit the hfenduleam CI leg twice (2026-06-03/04, four spt-msg unit tests at once on the second strike) before being run to ground; a slow runner filesystem (AV scanning fresh dirs) widens the window but is not the cause.
- **Invariant:** every SQLite store's open path `create_dir_all`s its parent dir itself, best-effort, before `Connection::open` — never relying on another subsystem having materialized the home first. (Mirrors the spool, which always did this; the registry didn't.)
- **spt-core mapping:** `spt_store::registry::open_registry` (`create_dir_all(owlery)` before open). `spt_store::spool::open_spool_at` already creates its perch dir. Any future SQLite store must do the same — pair this with the 4.7 pragma ordering on every new store.

---

## 5. Platform-specific

- **Invariant:** the merge precedence key is a **per-node monotonic epoch counter** (`spt_store::epoch::EpochSource`, persisted, strictly increasing, NEVER wall-clock), compared version-vector style per `(endpoint_id, node)`: an incoming update wins **iff its epoch is strictly greater** than the stored one for that node; equal or lower is dropped as stale. So a newer `Offline` (higher epoch) can never be clobbered by a lagging `Active` (lower epoch), and an idempotent equal-epoch replay is a no-op. Wall-clock is at most a human tiebreaker hint inside a flagged conflict, never the ordering authority. The same epoch source unifies with the D6 sync-precedence concurrent-write detection (#7).

+### 4.9 SQLite stores must create their parent dir — SQLite won't

+- **Failure:** `Connection::open` creates the database FILE but never its parent DIRECTORY. On a fresh home (first boot, fresh CI `_work` dir) a registry op that runs before any perch-creating op (`create_dir_all` side effects) fails `SQLITE_CANTOPEN` — "unable to open database file …owlery\.registry". Timing-dependent: whichever code path touches the home first decides the outcome, so it surfaces as a parallel-test flake (bind-first tests losing the dir-creation race to perch-first tests). Bit the hfenduleam CI leg twice (2026-06-03/04, four spt-msg unit tests at once on the second strike) before being run to ground; a slow runner filesystem (AV scanning fresh dirs) widens the window but is not the cause.

+- **Invariant:** every SQLite store's open path `create_dir_all`s its parent dir itself, best-effort, before `Connection::open` — never relying on another subsystem having materialized the home first. (Mirrors the spool, which always did this; the registry didn't.)

+- **spt-core mapping:** `spt_store::registry::open_registry` (`create_dir_all(owlery)` before open). `spt_store::spool::open_spool_at` already creates its perch dir. Any future SQLite store must do the same — pair this with the 4.7 pragma ordering on every new store.


Register the requirement (rule 3), active immediately since delivered in same change:


Edit

[[requirements]]
id = "REQ-HAZARD-REGISTRY-EPOCH-LEASE"

[[requirements]]
id = "REQ-HAZARD-REGISTRY-DIR-CREATE"
title = "SQLite store opens create their parent dir themselves — a fresh-home registry op must not SQLITE_CANTOPEN (4.9)"
required_stages = ["doc", "impl", "unit"]  # registered+activated 2026-06-03 (CI-bitten twice on hfenduleam): spt_store::registry::open_registry create_dir_all(owlery) before Connection::open; doc = KNOWN-HAZARDS 4.9; unit = register_on_nonexistent_owlery_creates_dir_and_succeeds
[[requirements]]
id = "REQ-HAZARD-REGISTRY-EPOCH-LEASE"


The file C:\Users\decid\Documents\projects\spt-core\traceable-reqs.toml has been updated successfully. (file state is current in your context — no need to Read it back)

[[requirements]]
id = "REQ-HAZARD-REGISTRY-DIR-CREATE"
title = "SQLite store opens create their parent dir themselves — a fresh-home registry op must not SQLITE_CANTOPEN (4.9)"
required_stages = ["doc", "impl", "unit"]  # registered+activated 2026-06-03 (CI-bitten twice on hfenduleam): spt_store::registry::open_registry create_dir_all(owlery) before Connection::open; doc = KNOWN-HAZARDS 4.9; unit = register_on_nonexistent_owlery_creates_dir_and_succeeds
[[requirements]]
id = "REQ-HAZARD-REGISTRY-EPOCH-LEASE"

title = "Concurrent SQLite openers (registry/spool) must not fail with 'database is locked' (4.7)"

required_stages = ["impl", "unit"]  # activated 2026-06-02: busy_timeout-before-WAL ordering (M1 store)

+title = "SQLite store opens create their parent dir themselves — a fresh-home registry op must not SQLITE_CANTOPEN (4.9)"

+required_stages = ["doc", "impl", "unit"]  # registered+activated 2026-06-03 (CI-bitten twice on hfenduleam): spt_store::registry::open_registry create_dir_all(owlery) before Connection::open; doc = KNOWN-HAZARDS 4.9; unit = register_on_nonexistent_owlery_creates_dir_and_succeeds

title = "Registry merge ordered by per-node monotonic epoch, never wall-clock — a stale Active can't clobber a newer Offline (4.8, red-team #8)"

required_stages = ["impl", "unit"]  # activated M4-D3b: spt-store::epoch::EpochSource (persisted strictly-increasing per-node counter, never wall-clock) + spt-net::net::registry::merge_instance version-vector lease keyed on (endpoint,node): strictly-greater-epoch wins, equal/lower dropped Stale. unit = stale_active_cannot_clobber_newer_offline + equal_epoch_replay_noop + epoch monotonic/persist/corrupt-safe. Cross-node replication of the merge = D4; chaos/two-host = D9.


PowerShell

cargo test -p spt-store registry 2>&1 | Select-Object -Last 6; cargo test -p spt-msg 2>&1 | Select-String -Pattern "test result" | Select-Object -First 4

Run spt-store registry + spt-msg tests


test registry::tests::clean_removes_dead_keeps_live ... ok
test registry::tests::resolve_cleans_before_lookup ... ok
test registry::tests::concurrent_registration_never_locks ... ok

test result: ok. 9 passed; 0 failed; 0 ignored; 0 measured; 69 filtered out; finished in 0.31s

test result: ok. 22 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 2.23s
test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.23s
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s


traceable-reqs check 2>&1 | Select-String -Pattern "REQ-HAZARD-REGISTRY-DIR-CREATE|FAIL"; "EXIT: $LASTEXITCODE"; cargo clippy -p spt-store --all-targets -- -D warnings 2>&1 | Select-Object -Last 2

Traceability + clippy for fix


       Concurrent SQLite openers (registry/spool) must not fail with 'database is locked' (4.7)
  [OK] REQ-HAZARD-REGISTRY-DIR-CREATE  required: [doc, impl, unit]  stages: +doc +impl +unit -int
       Stale registry entries degrade to fallback, never hard-fail (4.3)
EXIT: 0
    Checking spt-store v0.0.0 (C:\Users\decid\Documents\projects\spt-core\crates\spt-store)
    Finished `dev` profile [unoptimized + debuginfo] target(s) in 1.08s


git add -A; git commit -m @'
fix(store): registry open creates the owlery dir — KNOWN-HAZARDS 4.9

SQLite creates the database FILE but never its parent DIRECTORY. On a
fresh home (first boot, fresh CI _work dir) a registry op racing ahead
of any perch-creating op failed SQLITE_CANTOPEN ("unable to open
database file ...owlery\.registry"). Bit the hfenduleam CI leg twice:
once as the deliver-test flake (2026-06-03, passed on rerun), then as
four spt-msg unit tests at once (run on 237b1bb) — bind-first tests
losing the dir-creation race to perch-first tests, with the runner''s
slower fresh-dir filesystem widening the window.

Fix: open_registry create_dir_all(owlery) best-effort before
Connection::open (the spool always did this; the registry didn''t).

- KNOWN-HAZARDS 4.9 documents the invariant: every SQLite store''s
  open path creates its own parent dir; pair with the 4.7 pragma
  ordering on every new store.
- REQ-HAZARD-REGISTRY-DIR-CREATE registered + activated [doc,impl,unit].
- Regression: register_on_nonexistent_owlery_creates_dir_and_succeeds.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
'@; git push origin dev-freeform; git log --oneline -4

Commit hazard fix, push all held commits


warning: in the working copy of 'docs/KNOWN-HAZARDS.md', LF will be replaced by CRLF the next time Git touches it
warning: in the working copy of 'traceable-reqs.toml', LF will be replaced by CRLF the next time Git touches it
[dev-freeform 017d103] fix(store): registry open creates the owlery dir — KNOWN-HAZARDS 4.9
 3 files changed, 34 insertions(+)
To https://github.com/SaberMage/spt-core.git
   237b1bb..017d103  dev-freeform -> dev-freeform
017d103 fix(store): registry open creates the owlery dir — KNOWN-HAZARDS 4.9
924e6b4 docs: begin fault-injection acceptance matrix (ADR-0002 SERIOUS #6, M4-D4 piece 5)
237b1bb feat(net): M4-D4d registry replication over the wire
1b89bc2 feat(net): M4-D4c PresenceChannel broker seam (REQ-EP-4)


Start-Sleep -Seconds 12; $run = gh run list --branch dev-freeform --limit 1 --json databaseId,headSha | ConvertFrom-Json; gh run watch $run.databaseId --exit-status --interval 15 2>&1 | Select-Object -Last 4; "FINAL:"; gh run list --branch dev-freeform --limit 1 --json conclusion,headSha | ConvertFrom-Json | Format-List

Watch CI run for 017d103 to completion


Command running in background with ID: be4mh3s70. Output is being written to: C:\Users\decid\AppData\Local\Temp\claude\C--Users-decid-Documents-projects-spt-core\648159b6-16b2-4568-b643-7b0c98c1871d\tasks\be4mh3s70.output. You will be notified when it completes. To check interim output, use Read on that file path.


Pushed `017d103` (fix) + `924e6b4` (fault matrix doc) atop `237b1bb` (D4d). CI watching (`be4mh3s70`).

**Flake mystery solved** — both hfenduleam strikes were the same latent bug, not AV, not KH 4.7 locking:

| Strike | Symptom | Actual cause |
|---|---|---|
| 1 (2026-06-03) | `deliver::online_delivers_via_tcp_without_spooling`, passed on rerun | registry op raced ahead of perch-creating ops on fresh `_work` dir → owlery dir absent → SQLITE_CANTOPEN |
| 2 (run on `237b1bb`) | 4 spt-msg tests at once, same temp dir | same race, wider window |

D4d code itself was innocent — its tests passed on the failing run; Linux leg + traceability green.

Fix: `open_registry` now `create_dir_all(owlery)` before `Connection::open`. Hazard **4.9** documented, `REQ-HAZARD-REGISTRY-DIR-CREATE` registered + activated `[doc,impl,unit]` with regression test. Check exit 0.

When CI lands green: D4 milestone fully complete (a, b, c, d + matrix doc) → commune → D5.


<task-notification>
<task-id>be4mh3s70</task-id>
<tool-use-id>toolu_0178pFWC9YNdLJ5M51VtokCE</tool-use-id>
<output-file>C:\Users\decid\AppData\Local\Temp\claude\C--Users-decid-Documents-projects-spt-core\648159b6-16b2-4568-b643-7b0c98c1871d\tasks\be4mh3s70.output</output-file>
<status>completed</status>
<summary>Background command "Watch CI run for 017d103 to completion" completed (exit code 0)</summary>
</task-notification>


<owl_reachability_notice>
You have an active owl perch. When spawning subagents or doing work, use run_in_background: true so you stay reachable for incoming messages.
</owl_reachability_notice>


CAVEMAN MODE ACTIVE (full). Drop articles/filler/pleasantries/hedging. Fragments OK. Code/commits/security: write normal.


1
2	! Node.js 20 actions are deprecated. The following actions are running on Node.js 20 and may not work as expected: actions/checkout@v4. Actions will be forced to run with Node.js 24 by default starting June 16th, 2026. Node.js 20 will be removed from the runner on September 16th, 2026. Please check if updated versions of these actions are available that support Node.js 24. To opt into Node.js 24 now, set the FORCE_JAVASCRIPT_ACTIONS_TO_NODE24=true environment variable on the runner or in your workflow file. Once Node.js 24 becomes the default, you can temporarily opt out by setting ACTIONS_ALLOW_USE_UNSECURE_NODE_VERSION=true. For more information see: https://github.blog/changelog/2025-09-19-deprecation-of-node-20-on-github-actions-runners/
3	test (self-hosted, Linux, gravity): .github#2
4
5	FINAL:
6
7	conclusion : success
8	headSha    : 017d103f02a7229eee2a27f60c1b2bb6f776c4f3
9
10

! Node.js 20 actions are deprecated. The following actions are running on Node.js 20 and may not work as expected: actions/checkout@v4. Actions will be forced to run with Node.js 24 by default starting June 16th, 2026. Node.js 20 will be removed from the runner on September 16th, 2026. Please check if updated versions of these actions are available that support Node.js 24. To opt into Node.js 24 now, set the FORCE_JAVASCRIPT_ACTIONS_TO_NODE24=true environment variable on the runner or in your workflow file. Once Node.js 24 becomes the default, you can temporarily opt out by setting ACTIONS_ALLOW_USE_UNSECURE_NODE_VERSION=true. For more information see: https://github.blog/changelog/2025-09-19-deprecation-of-node-20-on-github-actions-runners/
test (self-hosted, Linux, gravity): .github#2

FINAL:

conclusion : success
headSha    : 017d103f02a7229eee2a27f60c1b2bb6f776c4f3


Updated task #5 status


Updated task #6 status


Write

# Commune — M4-D4 COMPLETE (all pieces CI-green at 017d103)

## D4 final state (dev-freeform, head 017d103, both legs + traceability green)
- **D4a+b** (prior): broker owns endpoint/conns/streams; gapless exactly-once stream survival.
- **D4c** `1b89bc2`: PresenceChannel broker seam (REQ-EP-4 [impl,unit]). PresenceLog seq'd ring; register_conn appends connected BEFORE spawning closed-watcher (conn.closed() → row removed → disconnected) — conns finally leave the table. net-presence-subscribe/-event frames; brain presence cursor (contiguous/dedup/gap). NetEndpoint::close + NetHost::close (bare drop kills runtime before QUIC CLOSE flushes; peers would idle-timeout). tests/presence.rs ×2.
- **D4d** `237b1bb`: registry replication over the wire. spt-net net/replicate.rs: RegistryUpdate {subnet,endpoint_id,Instance} NDJSON over broker QUIC streams; LineDecoder survives chunk coalescing/splitting, skips corrupt lines (4.3 posture); apply_update routes by subnet → merge_instance, non-member subnets dropped fail-closed (REQ-INST-13 posture); advertise gates run locally BEFORE emission. serde_json now net-gated dep of spt-net (was dev-only). tests/replicate.rs: convergence + lease-over-the-wire + mid-record split. REQ-INST-7 comment records delivery.
- **D4 piece 5** `924e6b4`: docs/FAULT-MATRIX.md begun (ADR-0002 SERIOUS #6 debt) — 9 proven rows w/ test evidence, 7 planned rows (iroh hang, mDNS, relay outage, drain death, manifest hang, feed flood, watcher starvation → mostly D9). Maintenance rule: new subsystem ⇒ new row same change. ADR-0002 bullet links it.

## FLAKE RESOLVED — hazard 4.9 (017d103)
Both hfenduleam strikes were ONE latent bug, NOT AV, NOT 4.7 locking: SQLite creates the DB file but never the parent dir. Fresh CI _work dir + registry op racing ahead of any perch-creating op → SQLITE_CANTOPEN "unable to open database file …owlery\.registry". Strike 1 = deliver test (flake ledger entry); strike 2 = 4 spt-msg bind-first unit tests at once on the 237b1bb run (D4d code innocent — its own tests passed). Fix: open_registry create_dir_all(owlery) before Connection::open. KNOWN-HAZARDS 4.9 written; REQ-HAZARD-REGISTRY-DIR-CREATE registered+activated [doc,impl,unit] w/ regression test. **Flake ledger: clear the deliver-test entry — root-caused and fixed.**

## Chore (before 2026-06-16)
actions/checkout@v4 Node 20 deprecation — bump action or set FORCE_JAVASCRIPT_ACTIONS_TO_NODE24=true on both runners.

## Next: D5 per M4 sequence
D4 plan's NOT-list routes onward: D5 = WAN message delivery / remote-drive / access control (REQ-NET-1 int aspects, REQ-INST-8, REQ-REACH-1, REQ-SEC-1). Read M4-PLAN.md D5 section first — likely needs a JIT plan like M4-D4-PLAN.md before code. Then D6 Psyche sync (consumes D3e synced gate), D7.5 psyche outbound relay, D9 two-host int.

## Workflow constraints (carried)
- NO cargo fmt; tag evidence on real code only; traceable-reqs check from repo root; Linux clippy -D warnings is the real gate; verify FINAL CI conclusion via gh run list; push each slice → watch green before next; commit trailer Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- hfenduleam runner is detached process (NOT service) — dies on reboot; re-launch: Start-Process C:\actions-runner\run.cmd


File created successfully at: C:\Users\decid\Documents\projects\spt-core\.claude\doyle-commune.md (file state is current in your context — no need to Read it back)

# Commune — M4-D4 COMPLETE (all pieces CI-green at 017d103)

## D4 final state (dev-freeform, head 017d103, both legs + traceability green)
- **D4a+b** (prior): broker owns endpoint/conns/streams; gapless exactly-once stream survival.
- **D4c** `1b89bc2`: PresenceChannel broker seam (REQ-EP-4 [impl,unit]). PresenceLog seq'd ring; register_conn appends connected BEFORE spawning closed-watcher (conn.closed() → row removed → disconnected) — conns finally leave the table. net-presence-subscribe/-event frames; brain presence cursor (contiguous/dedup/gap). NetEndpoint::close + NetHost::close (bare drop kills runtime before QUIC CLOSE flushes; peers would idle-timeout). tests/presence.rs ×2.
- **D4d** `237b1bb`: registry replication over the wire. spt-net net/replicate.rs: RegistryUpdate {subnet,endpoint_id,Instance} NDJSON over broker QUIC streams; LineDecoder survives chunk coalescing/splitting, skips corrupt lines (4.3 posture); apply_update routes by subnet → merge_instance, non-member subnets dropped fail-closed (REQ-INST-13 posture); advertise gates run locally BEFORE emission. serde_json now net-gated dep of spt-net (was dev-only). tests/replicate.rs: convergence + lease-over-the-wire + mid-record split. REQ-INST-7 comment records delivery.
- **D4 piece 5** `924e6b4`: docs/FAULT-MATRIX.md begun (ADR-0002 SERIOUS #6 debt) — 9 proven rows w/ test evidence, 7 planned rows (iroh hang, mDNS, relay outage, drain death, manifest hang, feed flood, watcher starvation → mostly D9). Maintenance rule: new subsystem ⇒ new row same change. ADR-0002 bullet links it.

## FLAKE RESOLVED — hazard 4.9 (017d103)
Both hfenduleam strikes were ONE latent bug, NOT AV, NOT 4.7 locking: SQLite creates the DB file but never the parent dir. Fresh CI _work dir + registry op racing ahead of any perch-creating op → SQLITE_CANTOPEN "unable to open database file …owlery\.registry". Strike 1 = deliver test (flake ledger entry); strike 2 = 4 spt-msg bind-first unit tests at once on the 237b1bb run (D4d code innocent — its own tests passed). Fix: open_registry create_dir_all(owlery) before Connection::open. KNOWN-HAZARDS 4.9 written; REQ-HAZARD-REGISTRY-DIR-CREATE registered+activated [doc,impl,unit] w/ regression test. **Flake ledger: clear the deliver-test entry — root-caused and fixed.**

## Chore (before 2026-06-16)
actions/checkout@v4 Node 20 deprecation — bump action or set FORCE_JAVASCRIPT_ACTIONS_TO_NODE24=true on both runners.

## Next: D5 per M4 sequence
D4 plan's NOT-list routes onward: D5 = WAN message delivery / remote-drive / access control (REQ-NET-1 int aspects, REQ-INST-8, REQ-REACH-1, REQ-SEC-1). Read M4-PLAN.md D5 section first — likely needs a JIT plan like M4-D4-PLAN.md before code. Then D6 Psyche sync (consumes D3e synced gate), D7.5 psyche outbound relay, D9 two-host int.

## Workflow constraints (carried)
- NO cargo fmt; tag evidence on real code only; traceable-reqs check from repo root; Linux clippy -D warnings is the real gate; verify FINAL CI conclusion via gh run list; push each slice → watch green before next; commit trailer Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- hfenduleam runner is detached process (NOT service) — dies on reboot; re-launch: Start-Process C:\actions-runner\run.cmd


Skill

M4-D4 complete + CI-green at 017d103 (D4c presence seam, D4d registry replication, fault matrix doc, hazard 4.9 fix). Commune just dropped. Next: read M4-PLAN.md D5 section, JIT-plan D5 (WAN message delivery / remote-drive / access control), then execute. Constraints: no cargo fmt, traceable-reqs check from repo root, push slice → CI green before next.


Launching skill: self-clear


Base directory for this skill: C:\Users\decid\.ccs\instances\bigscreen\skills\self-clear

# /self-clear

Wipes THIS agent's conversation (`/clear`), then ~10s later TYPES a self-note
as a fresh user prompt so the agent wakes on a clean context and proceeds.

## Run it

One script does everything. Just run:

```powershell
& "C:\Users\decid\.claude\skills\self-clear\scripts\self-clear.ps1"
```

Expect: `SELF-CLEAR armed: id=<agent_id> winpid=<n> hwnd=<n> — /clear queued; self-note typed in ~10s`

Then stop — end your turn promptly so the queued `/clear` fires.

## What the script does

1. `owl whoami` → resolves this session's `agent_id` (context-independent, survives the wipe). No perch → it aborts WITHOUT clearing and tells you to `/spt:ready` or `/spt:live` first.
2. Walks the parent chain (`pwsh → claude.exe → … → WindowsTerminal`) to the ancestor that owns the window, foregrounds it.
3. Types `/clear` + Enter — **queued**; only fires when this turn ends.
4. Spawns a **detached** waker: waits 10s (past turn-end + wipe), re-foregrounds the terminal via the arm-time `hwnd`/`winpid`, then **types** `NOTE FROM THE USER: proceed with next steps.` + Enter as a fresh user prompt.

The 10s delay + detachment are deliberate: the prompt must be typed **after**
`/clear` takes effect, so it lands on the clean context and starts a new turn.

Why typed, not `owl send`: after `/clear` the session sits idle awaiting user
input. A spooled owl message can't self-start a turn — it surfaces only during an
already-active turn (PreToolUse hook) or in a live Monitor stream (whose buffer
`/clear` wipes). So a self-addressed owl note never woke the agent. A typed prompt
deterministically starts a turn AND is the re-seed.

## Caveats

- Window focus brings the whole terminal forward; it can't target a specific tab. Clean when the agent's tab is active.
- The note is typed via SendKeys, so the terminal must stay the foreground-able window of `winpid`. Don't close/replace the terminal in the ~10s gap.
- SendKeys reserves `+ ^ % ~ ( ) { } [ ]`; the default note text uses none. If you customize the note, escape those chars.
- If your turn runs longer than ~10s after the script returns, the prompt could be typed before the wipe completes. Stop promptly after running.

ARGUMENTS: M4-D4 complete + CI-green at 017d103 (D4c presence seam, D4d registry replication, fault matrix doc, hazard 4.9 fix). Commune just dropped. Next: read M4-PLAN.md D5 section, JIT-plan D5 (WAN message delivery / remote-drive / access control), then execute. Constraints: no cargo fmt, traceable-reqs check from repo root, push slice → CI green before next.


PowerShell

& "C:\Users\decid\.claude\skills\self-clear\scripts\self-clear.ps1" -Note "NOTE FROM THE USER: M4-D4 complete, CI-green at 017d103. Commune dropped. Next: read M4-PLAN.md D5 section, JIT-plan D5, then execute. No cargo fmt; traceable-reqs check from repo root; push slice then CI green before next."

Arm self-clear with re-seed note


SELF-CLEAR armed: id=doyle winpid=29328 hwnd=133338 — /clear queued; self-note typed in ~10s


Self-clear armed. D4 done, CI-green, commune dropped. Waker types D5 re-seed in ~10s. Ending turn now.