|
2050 | 2050 | "status": "private", |
2051 | 2051 | "url": "https://marco-nissen.com/sparrot/", |
2052 | 2052 | "intent": "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.", |
2053 | | - "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.", |
| 2053 | + "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.", |
2054 | 2054 | "primary_use_cases": [ |
2055 | 2055 | "single-user continuous cognitive agent that runs on its own cadence", |
2056 | 2056 | "file-native memory and identity persisted across restarts as Markdown", |
|
2446 | 2446 | "evidence": [], |
2447 | 2447 | "evidence_status": "none" |
2448 | 2448 | }, |
| 2449 | + { |
| 2450 | + "pattern": "inter-agent-communication", |
| 2451 | + "role": "first-class", |
| 2452 | + "note": "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 writes to and a replies folder it reads from, with one Markdown message per exchange carrying timestamp, urgency and response state in frontmatter; every outbound send is also recorded as a spawn so a peer that never replies can be detected by orphan recovery.", |
| 2453 | + "evidence": [], |
| 2454 | + "evidence_status": "none" |
| 2455 | + }, |
| 2456 | + { |
| 2457 | + "pattern": "agent-persona-profile", |
| 2458 | + "role": "first-class", |
| 2459 | + "note": "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 from its own file, so a session with the psychologist, philosophical, creativity or communication coach runs under that coach's identity and a narrowed tool surface without editing the core loop.", |
| 2460 | + "evidence": [], |
| 2461 | + "evidence_status": "none" |
| 2462 | + }, |
| 2463 | + { |
| 2464 | + "pattern": "role-assignment", |
| 2465 | + "role": "supported", |
| 2466 | + "note": "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 as that role rather than as a generic copy of the parent loop.", |
| 2467 | + "evidence": [], |
| 2468 | + "evidence_status": "none" |
| 2469 | + }, |
| 2470 | + { |
| 2471 | + "pattern": "unbounded-subagent-spawn", |
| 2472 | + "role": "anti-pattern", |
| 2473 | + "note": "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 REFUSED entry to the ledger at the cap — so per-agent step and cost budgets cannot be bypassed through recursive fan-out.", |
| 2474 | + "evidence": [], |
| 2475 | + "evidence_status": "none" |
| 2476 | + }, |
2449 | 2477 | { |
2450 | 2478 | "pattern": "knowledge-graph-memory", |
2451 | 2479 | "role": "first-class", |
|
2564 | 2592 | "note": "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 (improved nudges up, regressed nudges down harder, neutral attempts decay a small amount); sampling exposes named modes (greedy / diverse / historical / aged) as caller verbs rather than as a fixed selection policy. Registration is agent-discretionary, not driven by a generation loop.", |
2565 | 2593 | "evidence": [], |
2566 | 2594 | "evidence_status": "none" |
| 2595 | + }, |
| 2596 | + { |
| 2597 | + "pattern": "hybrid-search", |
| 2598 | + "role": "first-class", |
| 2599 | + "note": "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 per-mode provenance.", |
| 2600 | + "evidence": [], |
| 2601 | + "evidence_status": "none" |
| 2602 | + }, |
| 2603 | + { |
| 2604 | + "pattern": "disambiguation", |
| 2605 | + "role": "supported", |
| 2606 | + "note": "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.", |
| 2607 | + "evidence": [], |
| 2608 | + "evidence_status": "none" |
| 2609 | + }, |
| 2610 | + { |
| 2611 | + "pattern": "socratic-questioning-agent", |
| 2612 | + "role": "supported", |
| 2613 | + "note": "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.", |
| 2614 | + "evidence": [], |
| 2615 | + "evidence_status": "none" |
| 2616 | + }, |
| 2617 | + { |
| 2618 | + "pattern": "meditation-mode", |
| 2619 | + "role": "first-class", |
| 2620 | + "note": "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.", |
| 2621 | + "evidence": [], |
| 2622 | + "evidence_status": "none" |
| 2623 | + }, |
| 2624 | + { |
| 2625 | + "pattern": "self-corpus-vocabulary", |
| 2626 | + "role": "first-class", |
| 2627 | + "note": "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.", |
| 2628 | + "evidence": [], |
| 2629 | + "evidence_status": "none" |
| 2630 | + }, |
| 2631 | + { |
| 2632 | + "pattern": "multi-axis-promotion-scoring", |
| 2633 | + "role": "first-class", |
| 2634 | + "note": "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 counts for more than raw repetition.", |
| 2635 | + "evidence": [], |
| 2636 | + "evidence_status": "none" |
| 2637 | + }, |
| 2638 | + { |
| 2639 | + "pattern": "cluster-capped-insight-store", |
| 2640 | + "role": "supported", |
| 2641 | + "note": "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 near-duplicates.", |
| 2642 | + "evidence": [], |
| 2643 | + "evidence_status": "none" |
| 2644 | + }, |
| 2645 | + { |
| 2646 | + "pattern": "append-only-thought-stream", |
| 2647 | + "role": "first-class", |
| 2648 | + "note": "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.", |
| 2649 | + "evidence": [], |
| 2650 | + "evidence_status": "none" |
| 2651 | + }, |
| 2652 | + { |
| 2653 | + "pattern": "mode-adaptive-cadence", |
| 2654 | + "role": "first-class", |
| 2655 | + "note": "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 while idle.", |
| 2656 | + "evidence": [], |
| 2657 | + "evidence_status": "none" |
| 2658 | + }, |
| 2659 | + { |
| 2660 | + "pattern": "reflexive-metacognitive-agent", |
| 2661 | + "role": "first-class", |
| 2662 | + "note": "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.", |
| 2663 | + "evidence": [], |
| 2664 | + "evidence_status": "none" |
| 2665 | + }, |
| 2666 | + { |
| 2667 | + "pattern": "partial-output-salvage", |
| 2668 | + "role": "supported", |
| 2669 | + "note": "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 model can see.", |
| 2670 | + "evidence": [], |
| 2671 | + "evidence_status": "none" |
| 2672 | + }, |
| 2673 | + { |
| 2674 | + "pattern": "commitment-tracking", |
| 2675 | + "role": "first-class", |
| 2676 | + "note": "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 between promise and follow-through.", |
| 2677 | + "evidence": [], |
| 2678 | + "evidence_status": "none" |
| 2679 | + }, |
| 2680 | + { |
| 2681 | + "pattern": "hypothesis-tracking", |
| 2682 | + "role": "first-class", |
| 2683 | + "note": "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 instead of dissolving when the prompt ends.", |
| 2684 | + "evidence": [], |
| 2685 | + "evidence_status": "none" |
| 2686 | + }, |
| 2687 | + { |
| 2688 | + "pattern": "ambient-presence-sensing", |
| 2689 | + "role": "first-class", |
| 2690 | + "note": "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 signals back.", |
| 2691 | + "evidence": [], |
| 2692 | + "evidence_status": "none" |
| 2693 | + }, |
| 2694 | + { |
| 2695 | + "pattern": "self-edit-critic-gate", |
| 2696 | + "role": "first-class", |
| 2697 | + "note": "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) that must approve before the edit lands, with every verdict ledgered, so a single confident-but-wrong self-edit cannot brick the running agent.", |
| 2698 | + "evidence": [], |
| 2699 | + "evidence_status": "none" |
2567 | 2700 | } |
2568 | 2701 | ], |
2569 | 2702 | "alternatives": [ |
|
2586 | 2719 | "accessed": "2026-05-21" |
2587 | 2720 | } |
2588 | 2721 | ], |
2589 | | - "last_analyzed": "2026-05-22", |
| 2722 | + "last_analyzed": "2026-06-03", |
2590 | 2723 | "verification_status": "partial", |
2591 | | - "last_updated": "2026-05-24", |
| 2724 | + "last_updated": "2026-06-03", |
2592 | 2725 | "date_added": "2026-05-01", |
2593 | 2726 | "status_in_practice": "experimental", |
2594 | 2727 | "tags": [ |
|
2598 | 2731 | "self-pacing", |
2599 | 2732 | "file-native", |
2600 | 2733 | "cognitive-agent", |
2601 | | - "single-user" |
| 2734 | + "single-user", |
| 2735 | + "multi-agent" |
2602 | 2736 | ] |
2603 | 2737 | } |
2604 | 2738 | ] |
|
0 commit comments