---
status: awaiting_human_verify
trigger: "A timed pulse was scheduled via $LIVE timed-pulse +23m but never fired"
created: 2026-04-12T08:30:00-07:00
updated: 2026-04-12T08:30:00-07:00
---

## Current Focus

hypothesis: timed_pulse.rs::run() persists pulse to JSON but never spawns timed-pulse-wait subprocess
test: Read source code for timed_pulse.rs::run() and confirm no spawn call
expecting: No Command::new spawn of timed-pulse-wait in the run() function
next_action: Implement fix -- spawn timed-pulse-wait subprocess in timed_pulse.rs::run()

## Symptoms

expected: The timed pulse should deliver a TIMED PULSE message to the deployah Psyche at approximately 8:05AM PDT (epoch 1776006346)
actual: The pulse never fired. No TIMED PULSE message was received.
errors: None visible at scheduling time.
reproduction: Scheduled via `$LIVE timed-pulse +23m -- "message"`
started: First use of timed-pulse scheduling

## Eliminated

(none needed -- root cause found on first hypothesis)

## Evidence

- timestamp: 2026-04-12T08:30:00
  checked: deployah.log wrapper log
  found: Poll iteration 3 started at 08:04:26, next PULSE_TRIGGER would be ~08:23. Psyche acknowledged SCHEDULE_PULSE and said "re-scheduled for 08:07" but has no mechanism to wake itself.
  implication: Psyche relies on PULSE_TRIGGER interval (20min) and cannot self-wake at arbitrary times.

- timestamp: 2026-04-12T08:31:00
  checked: timed_pulse.rs::run() source code
  found: Function does 3 things: (1) deliver SCHEDULE_PULSE to Psyche, (2) persist_pulse to JSON, (3) print status. It does NOT spawn a timed-pulse-wait subprocess.
  implication: No process exists to deliver the pulse after the delay expires.

- timestamp: 2026-04-12T08:31:30
  checked: lifecycle.rs::reload_timed_pulses()
  found: This is the ONLY place timed-pulse-wait is spawned, and it only runs on wrapper startup.
  implication: timed-pulse-wait is only spawned on wrapper restart recovery, never on initial scheduling.

- timestamp: 2026-04-12T08:32:00
  checked: ~/.claude/spacetime/pulses/deployah.json
  found: Pulse entry still present with epoch 1776006346, never consumed.
  implication: Confirms pulse was persisted but never delivered.

## Resolution

root_cause: timed_pulse.rs::run() persists the scheduled pulse to JSON for restart recovery but never spawns the timed-pulse-wait subprocess that actually sleeps and delivers the pulse. The subprocess spawn only exists in reload_timed_pulses() which runs on wrapper restart. On initial scheduling, nothing triggers the actual delivery.
fix: Add timed-pulse-wait subprocess spawn in timed_pulse.rs::run() after persisting the pulse.
verification: cargo build --release succeeds, all 110 tests pass. Needs human verification with a real timed pulse scheduling.
files_changed: [src/live/timed_pulse.rs]
