Event-driven triage pipeline
Every channel listener fires events into a passive eavesdropper. Skillsets register watch signals, BatonPass verbs, datasources, and channel feedback hooks against a single contract — the same plugin extends multiple pipeline stages.
Text yourself → agent dispatched → result delivered
Self-note "dentist Thursday" is the canonical end-to-end use case. Eavesdropper flags it; classifier picks intent; ticket-builder structures it; Switchboard surfaces it; approval routes through BatonPass; agent-run executes; result returns through the originating channel.
Tickets, executables, sessions, signals
Tickets are the canonical lifecycle object. Executables are the Switchboard projection. Sessions are bursts of related events grouped within a 15-minute TTL. Signals are pattern matches the eavesdropper extracts before classification.
Burst detection + session lifecycle
Conversation sessions group rapid-fire events so a single classification covers the whole burst. Burst detector tracks idle gaps; session-manager spawns and reaps; session-store persists open and closed transcripts.
Plugin contract: one manifest, five hook points
Skillsets ship as TypeScript modules implementing a single manifest interface. Each can register watch signals (eavesdropper), verbs (BatonPass), datasources, visualizations, and channel feedback — the same career-partner skillset touches four pipeline stages.
Cross-harness agent transport
agent-run is a tier-laddered executor (codex → pi → foundry → qwythos) — it degrades AWAY from any single subscription so a paid cap on one provider doesn’t freeze the fleet. Approval crosses the execution-engine HTTP boundary.
Subsumption-resistance over feature parity
OpenClaw is 374k★ reactive autonomous agents. Hermes is 94k★ self-improving skills. Moneypenny is novel where it matters: passive cross-channel eavesdropping + human-triage Switchboard + skillsets that hook into multiple pipeline stages. Every lab release strengthens the runner contract; nothing competes head-on with the labs.
Component stack
Every module exposes a typed contract through the SDK. Channels and skillsets are swappable; the runtime, router, and engine are the load-bearing core.
Safety & failure modes
Outbound prompts pass through a regex-based PII scrubber before reaching any model vendor. Phone, email, SSN, and CC patterns are redacted; structured logs record match counts without leaking values.
agent-run degrades through codex → pi → foundry → qwythos. A subscription
cap on any one tier surfaces but does not freeze the fleet — paid local generation
(qwythos via LM Studio) is the fallback.
Approved tickets dispatch via the engine; unapproved tickets sit in the pending queue until a human swipes. Auto-dispatch is opt-in per intent, not default.
Rapid-fire events from the same sender collapse into a single conversation session (15-min idle TTL) so one classification covers the whole burst. The pipeline doesn't thrash on chat threads.