בס״ד

Cadence Pulse — design spec

docs/superpowers/specs/2026-05-26-cadence-pulse-design.md · last changed (pre-VM history) · rendered from GitHub master

Cadence Pulse — design spec

Status: Phase 0c + Phase 1 BUILT (pushed to the command-inbox Apps Script project 2026-05-26 ~3:31 PM), awaiting Sam-side go-live + 48h observe watch. Tested: not yet (manual pulseNow() is Sam's first run).
Owner: Sam Treitel · built by Claude Code session 2026-05-26
Source files: command-inbox/start-here.gs (all changes), bound to the Personal Command Inbox sheet (1U0-Ll_…).
Approved: Sam, 2026-05-26 ("go phase zero, phase one, A and B … without putting my life at risk of guessing anything").

The problem

Sam wants a self-firing full-circle loop: after a batch of back-and-forth with the bot (or after a time gap), the system re-reads everything (open queue + the new conversation + all his calendars + flagged mail), catches any loop he closed in conversation that the queue still shows open, sends back ONE updated plan, then resets and repeats. It must ask when unsure, act on his answer, and never jump ahead on a misread. Today the bot acts live per message (telegramBrainReply_) and assembles raw captures (autoAssembleInbox_), but nothing periodically reflects across the conversation to close loops + reshape the day.

What's true about the existing system (verified)

Architecture (Approach 1 of the 1→hybrid roadmap)

Runs in the cloud on the bot so it works while Sam is offline. New code, all additive:

Autonomy boundary (Sam's locked decision)

Dynamic ask→answer→act→close. Confident + safe → close it. Unsure or money/legal/HOA/insurance/FAMILY/children → ask a one-line yes/no and wait. Never guess. Enforced three ways: (1) ACTIONS_PROTOCOL_'s existing sensitive-card rule; (2) the pulse prompt extends it to FAMILY + anything about the kids = ask-never-act, never surfaced to Mildred; (3) FAMILY added to SH_CFG.sensitiveLanes so family cards are auto-flagged sensitive + undelegatable to Mildred.

Safety / validation (Rules 9 + 10 + the children's-info flag)

Go-live sequence (Sam, in the Apps Script editor, in order)

  1. auditTriggers_() — confirm no duplicate/unexpected triggers (the gate).
  2. pulseNow() — forces one observe-mode pulse to Telegram; confirm it reads right.
  3. setupPulse() — installs the single 30-min trigger (observe, baselined).
  4. Watch ~48h. Then setPulseMode("act") to let it start closing safe loops.
  5. Phase 0b (Gmail, Sam-side): forward ztreitel@ → sam@ so the cloud pulse sees personal mail (Claude can fetch the confirm code from sam@). Until then, personal calendar is covered (added above) but personal mail is not.

Decisions locked

Out of scope (later phases — do not build until Phase 1 validates)

Source trail · docs/superpowers/specs/2026-05-26-cadence-pulse-design.md @ master · rendered 2026-07-02 7:23 PM EDT by scripts/build-docs.py · the .md in the repo is the truth; this page is the phone-readable view