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. The implementation is private; this entry documents only the publicly described shape.
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.
- ★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…
- ★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.
Neighbourhood
Click any neighbour to follow the lineage. Scroll to zoom, drag to pan.