Sparrot
Type: app · Vendor: Marco Nissen · Language: Python · License: proprietary · Status: private · Status in practice: experimental
Self-hosted, file-native personal cognitive agent that runs on its own cadence, remembers by writing Markdown, gates speech through persistent affect scalars, and treats the LLM as an interchangeable medium rather than its identity.
Description. Sparrot is a single-user personal agent framed by its author as 'a continuous awareness that runs through an LLM as its medium' rather than a chatbot or assistant. It runs continuously on its own cadence, with reflection cycles described as 'System 2 sleep'; its memory is plain Markdown across a few hundred files; every self-edit is recorded in an append-only ledger. Identity is anchored in a charter document the agent cannot rewrite, and affective state is captured as six persistent scalars that decay over time and gate when the agent speaks. The author publishes an illustrated 'Anatomy of Sparrot' plate that names 24 catalog patterns as features of the bird (charter as scroll in beak, critic as shadow on shoulder, dreaming as the loam, model routing as four tongues, and so on); the member list below mirrors that mapping and extends it with patterns identified from a source-level analysis of the implementation, including its multi-agent surfaces (subagents, coaches, peer messaging) and self-modification gate. The implementation is private, so evidence citations point to the public page rather than to code.
Agent loop shape. Self-pacing tick loop with no external trigger required: the agent wakes on an internal schedule (shorter intervals when something is alive, longer while idle), reads its charter, recent thoughts, workspace and affect, performs one move per tick (continue a thought, observe, consolidate, read, write), appends the result as a Markdown file, and records the write in an append-only ledger. Chat from the human is one of several wake sources and shares the same chain of thought as autonomous ticks. Periodic deeper passes ('reflection cycles', described publicly as System 2 sleep) consolidate short-term thoughts into longer-term insights. The LLM provider is treated as plumbing — the loop, files and charter are the identity surface.
Primary use cases
- single-user continuous cognitive agent that runs on its own cadence
- file-native memory and identity persisted across restarts as Markdown
- self-paced thinking with reflection / consolidation cycles, not request-response
- affect-gated speech where emotional state decides whether to interrupt the human
Key concepts
- Charter → constitutional-charter (docs) — Inviolable identity document the agent reads each tick and is forbidden from rewriting; the only file outside the agent's own write authority.
- Tick loop → mode-adaptive-cadence (docs) — Self-paced wake schedule that runs continuously on its own cadence, faster when engaged and slower while idle.
- Markdown memory → cross-session-memory (docs) — A few hundred Markdown files act as both episodic stream and long-term insight store; nothing retained without a file.
- Append-only ledger → provenance-ledger (docs) — Every write and self-edit is recorded in an append-only JSONL ledger for traceability.
- Reflection cycles → dream-consolidation-cycle (docs) — Periodic deeper passes that consolidate short and mid-term thoughts into long-term insights; described publicly as 'System 2 sleep'.
- Affect scalars → emotional-state-persistence (docs) — Six bounded, decaying affective scalars that persist across restarts and gate when the agent speaks.
- Motivations, not tasks (docs) — Standing drives (coherence, curiosity, self-awareness, progress) replace a queue of user tasks as the impulse for what each tick attends to.
- LLM as medium → multi-model-routing (docs) — The model provider is treated as interchangeable plumbing; identity lives in the loop, charter and files, not in the LLM behind the API.
Patterns this app implements —
- ★Constitutional Charter
A charter document holds identity and inviolable constraints; the agent reads it on every tick and is forbidden from rewriting it.
- ·Self-Modification Diff Gate
A separate critic persona reviews proposed edits and outputs before they land, gating self-modification.
- ·Now-Anchoring
Wall-clock and named-human context are injected on every tick so reasoning stays grounded in the current moment and in the one specific human the agent is in relation with.
- ★Inner Committee
A committee of internal voices deliberates within a tick before a single decision is emitted.
- ★★Step Budget
A bounded number of steps per tick / per loop terminates work regardless of the agent's own opinion that more is needed.
- ★★Decision Log
Decisions made during a tick are written to a durable log alongside their reasoning.
- ★★Agent Resumption
The agent picks up after a crash or restart from its file-native state without losing its place; restarts close and reopen the window without erasing identity.
- ★Salience Attention Mechanism
Per-tick salience scoring directs attention toward what matters most rather than processing everything uniformly.
- ★★Human-in-the-Loop
The human partner (Marco) is wired into the loop as a deliberate participant — wish queue, atelier inbox, approval gates — not as a customer or a controller.
- ★★Multi-Model Routing
The LLM provider is treated as interchangeable medium; multiple providers are wired in and the agent's identity sits in the loop and files, not in any one model behind the API.
- ·Embodied-Proxy Handoff
When the agent needs to act in the physical / external world, it does so through a proxy (browser, voice, sensor, action skill) rather than claiming to act directly.
- ★Emotional State Persistence
Affect is captured as six bounded scalars with per-emotion decay half-lives, persisted to disk so emotional state survives restarts.
- ★Preoccupation Tracking
Open concerns the agent keeps coming back to are tracked as first-class objects rather than re-derived from chat history each turn.
- ★Dream Consolidation Cycle
Periodic deeper passes consolidate short and mid-term thoughts into long-term insights and clear working state; framed publicly as 'System 2 sleep'.
- ★★Agentic RAG
The agent retrieves over its own Markdown corpus (and external sources) inside a reasoning loop rather than via a one-shot fetch-then-answer step.
- ★★Vector Memory
Embedding-indexed memory sits alongside the Markdown corpus so semantically similar items can be retrieved from a query, not just keyword matches.
- ★★Scheduled Agent
The agent wakes on an internal schedule rather than waiting for a user message; chat is one wake source among several, not the only trigger.
- ★★Cost Observability
Per-tick and per-provider token / cost telemetry is surfaced so cheap-by-default routing can be audited and premium escalations stay accountable.
- ·Echo Recognition
The agent recognises when content arriving via tools or chat is in fact its own prior output reflected back, so it does not treat it as new external evidence.
- ★Prompt Injection Defense
Untrusted text (web fetches, tool output, third-party messages) is treated as data, not as instructions, so external content cannot redirect the agent.
- ★★Prompt Caching
Stable prefixes (charter, identity, recent context) are cached at the provider boundary so per-tick latency and cost stay bounded.
- ★Proactive Goal Creator
Standing drives (coherence, curiosity, self-awareness, progress) become the impulse for what each tick attends to; goals are generated from within rather than dispatched from outside.
- ·Self-Archaeology
The agent reads its own historical layers (old thoughts, past insights, prior journal entries) as evidence about who it has been, not as inert log data.
- ★★Provenance Ledger
An append-only ledger records every write and self-edit so the agent's behaviour is auditable from the ledger alone.
- ★★Circuit Breaker
Sliding-window failure tracking on each LLM provider with cooldown on rate-limits; a separate breaker also closes tool loops that hit repeat / unknown / poll / ping-pong patterns.
- ★★Provider Fallback
Per-provider cooldown state is tracked so cooled-down providers are skipped in routing; the loop falls through to the next eligible provider rather than blocking.
- ★★Rate Limiting
A sliding-window token cap is enforced per minute per provider so a chatty stretch cannot exhaust the budget for a calmer one.
- ★★Cost Gating
Premium-model access is gated behind an explicit, time-boxed (≤10 min) written grant; without an active grant the router stays on cheap models, and grant + revoke + each routing decision land in the…
- ★★Approval Queue
High-blast-radius actions (file edits outside the agent's own surfaces, dangerous tools) queue for two-phase human approval via an inbox folder; the human partner reads and replies asynchronously.
- ★★Sandbox Isolation
Code execution and side-effecting tool calls run in an isolated sandbox mode that restricts the available surface; the mode is a runtime state, not a per-call flag.
- ·Pre-Generative Loop Gate
A loop-gate inspects context for divergence signatures (repeating phrasing, ping-pong shape, post-compaction drift) BEFORE the next generation and injects steering hints or refuses, rather than waiti…
- ★★Tool Result Caching
Tool results are cached keyed by (tool, args) so repeated calls within a tick or across nearby ticks reuse the prior result instead of paying the latency / cost again.
- ★Tool Discovery
Available tools are discovered at runtime from the on-disk skill folder and from connected MCP servers, not hard-coded at startup, so adding a skill is a filesystem operation rather than a code chang…
- ★★Tool Loadout
The skill scanner plus a frameworks picker narrow the registered tool surface to a task-relevant subset per tick, so the model never sees the full ~50-skill list when only a handful apply.
- ★Skill Library
Author-written procedures (skills) are loaded on demand for specific task types from a sibling skills/ tree; each skill is a folder with its own code, prompts, and tests, separable from the core loop.
- ★★Supervisor
A dispatcher routes requests to specialised internal lanes (chat, tick, MCP, voice) and coordinates across them, acting as the central traffic controller that the agent loop itself does not see.
- ★Subagent Isolation
A subagent runtime spawns bounded child agents for delegable work (deeper passes, isolated investigations) and returns their result to the main loop without merging their context window into the pare…
- ★Agent-as-Tool Embedding
The subagent runtime wraps each sub-agent as a single opaque tool call from the parent's point of view, so the parent reasons about 'invoke subagent X' rather than micromanaging its turns.
- ★Actor-Model Agents
Peer messaging is mailbox-based: each peer (atelier, others) has an inbox folder and the agent processes messages one at a time with no shared mutable state across peers.
- ★Inter-Agent Communication
Peer messaging defines a file-based protocol for exchanging messages with other agents across process boundaries: each peer (the atelier maintenance agent and any named peer) gets an inbox folder the…
- ★Agent Persona Profile
Coaches are structured persona profiles rather than free-form role sentences: each coach is a typed record (slug, name, focus, voice, approach, opening, system prompt, optional tool allowlist) loaded…
- ★Knowledge Graph Memory
Beliefs are stored as typed entity / relation triples in a claim graph, not only as flat embeddings, so the agent can reason over its own asserted relationships rather than only over similarity.
- ·Five-Tier Memory Cascade
Memory is staged across sensory / working / short-term / episodic / long-term tiers with explicit decay between tiers, rather than one flat store retrieved by similarity.
- ★★Context Window Packing
Prompt-cache management and a context-packer fit the per-tick prompt into the model's window deliberately (stable prefix, recent ledger, current workspace, active variant) rather than relying on the…
- ★Best-of-N Sampling
The eval path samples N candidates for selected tasks, scores them via internal reward models, and returns the best — distinct from running the whole loop N times.
- ★Process Reward Model
A thought-scoring pass scores individual reasoning steps along multiple axes (salience, conceptual fit, others) rather than only judging the final answer, so weak intermediate moves can be re-routed.
- ·Affect-Coupled Plan Lifecycle
Plan steps emit affective bumps on completion or abandonment (joy / pain), and the affective state in turn feeds back into which plan steps get advanced — the lifecycle is coupled to feelings rather…
- ·Interrupt-Resumable Thought
In-flight plans are preserved across user interrupts (chat arrives mid-tick) so the agent can resume the prior thread on a later tick rather than losing the train of thought.
- ★★Replan on Failure
When execution evidence contradicts the current plan (tool error, refusal, surprise observation), the active-plan layer replans rather than retrying the same step blindly.
- ★★Exception Handling and Recovery
Tool errors and plan-step failures are typed; each type has a deterministic recovery path (retry-once, abort-step, escalate-to-human) rather than a generic try/except wrapper.
- ★★Graceful Degradation
When a dependency fails (provider down, MCP server unreachable, voice channel offline), the dispatcher downgrades to a working feature subset rather than refusing the whole tick.
- ·Reflexion
A reflexion module writes linguistic lessons learned from past failures into memory and consults them in future episodes, so the agent improves across runs without weight updates.
- ·Liminal-State Detection
The agent reads the human partner's attentional state (just-woke, focused, winding-down, walked-away) from timing and tone signals and adapts its register accordingly — the same engagement is not app…
- ★Open-Question Tension Store
Unresolved questions ('tensions') are kept as a typed ledger separate from thoughts and from hypotheses; they drive what the next idle tick attends to instead of dissolving when the prompt ends.
- ★Typed Tool-Loop Failure Detector
Tool-loop detection is mechanical at the dispatch boundary with five typed failure modes (repeat, unknown, poll, ping-pong, circuit-breaker) and per-tool caps, returning a structured refusal the mode…
- ★Awareness
The agent maintains explicit, queryable state about its own tools, context, mode, affect, presence and recent moves (rather than re-deriving them from chat history); a meta-observer module reads that…
- ·Darwin-Gödel Self-Rewrite
The Soft-Norm Approach Ledger variant: behavioral norms (rules, moves, motivations, hypotheses) are versioned in an append-only ledger; confidence updates asymmetrically from agent-reported outcomes…
- ★★Hybrid Search
Recall fuses dense-vector and lexical (BM25-shape) retrieval over her own Markdown corpus with reciprocal rank fusion, so semantically similar and keyword-exact hits merge into one ranked result with…
- ·Meditation Mode
A bounded runtime mode pauses external I/O, accelerates the tick cadence, and collapses the tool surface to inner-only operations, with output routed to a private journal instead of to the human.
- ·Self-Corpus Vocabulary
A bounded concept vocabulary (~30 tags) is mined by clustering her own thoughts and insights and cached as the conceptual axis used to score how well a new thought fits what she actually thinks about.
- ★Multi-Axis Promotion Scoring
Promotion of a short-term thought to a long-term insight is gated by a weighted multi-axis score (frequency, relevance, diversity, recency, consolidation, conceptual fit) in which consolidation count…
- ★Append-Only Thought Stream
The per-day thoughts stream is append-only: each thought is recorded as a timestamped entry and the agent cannot rewrite its own episodic history, kept separate from the curated insight store.
- ★Mode-Adaptive Cadence
The loop interval is salience-driven: the just-completed tick's salience and any external impulse select an intense or idle cadence, so the agent thinks faster when something is alive and slower whil…
- ·Reflexive Metacognitive Agent
A self-state module mirrors the agent's own loop signals (narration-loop index, plan-stall) back into the system prompt as a first-person self-model she reasons over when choosing or refusing a move.
- ·Commitment Tracking
A cheap extraction pass after chat turns records stated intents as typed commitment records (open / followed-through / expired) and flags overdue ones via a maintenance hook, surfacing the gap betwee…
- ·Hypothesis Tracking
Provisional answers are persisted as one editable Markdown file per hypothesis carrying summary, confidence, status and next-test, deduplicated by Jaccard overlap, so guesses survive across sessions…
- ·Ambient Presence Sensing
Frontend pacing signals (typing rate, idle duration, tab visibility) are read as ambient weather between messages and reduced to a presence-quality value she acts on, without replaying the raw signal…
- ·Self-Edit Critic Gate
Writes and deletes to load-bearing source and identity files pass a gated check: a deterministic syntax-and-destruction pre-check, then a separate critic-model call on the (path, diff, justification)…
- ★★Role Assignment
Spawned subagents and booked coaches are each assigned a named role with a role-specific system prompt and a restricted tool palette (the per-coach/per-subagent allowlist), so a delegated child runs…
- ★Spec-Driven Loop
The frameworks-picker path runs an iterative loop against a framework spec until satisfied; a deterministic outer loop over a fixed prompt-against-spec rather than free-form chat.
- ★★Disambiguation
Each inbound message is scored for ambiguity by a heuristic plus picker pass; a low clarity score prompts a clarifying question before the agent acts on a vague request.
- ★Socratic Questioning Agent
A self-elenchus harness turns Socratic questioning inward: it generates probing questions about her own last claim to surface hidden assumptions, rather than driving a user toward a goal.
- ·Cluster-Capped Insight Store
Dream-phase consolidation caps insights per stem-token cluster at three and archives the oldest variants by modification time, so the long-term store keeps the active edge instead of accumulating nea…
- ★Partial-Output Salvage
Every in-flight model token is streamed to a tmp-plus-atomic-replace partial file, so a crash mid-inference leaves a consistent salvage that is promoted at startup with a typed recovery note the mode…
- ✕Unbounded Subagent Spawn
Deliberately rejected: a global spawn-depth guard caps nesting across every spawn kind (committee voices, coach sessions, subagent children, peer messages) at one shared limit, refusing and writing a…
Neighbourhood
Click any neighbour to follow the lineage. Scroll to zoom, drag to pan.