Use when observing user patterns and synthesizing a persistent identity profile
From second-claude-codenpx claudepluginhub unclejobs-ai/second-claude-code --plugin second-claude-codeThis skill uses the workspace's default tool permissions.
references/observation-signals.mdreferences/retro-metrics.mdreferences/synthesis-algorithm.mdreferences/templates/default.mdreferences/templates/developer.mdreferences/templates/researcher.mdreferences/templates/writer.mdDesigns and optimizes AI agent action spaces, tool definitions, observation formats, error recovery, and context for higher task completion rates.
Enables AI agents to execute x402 payments with per-task budgets, spending controls, and non-custodial wallets via MCP tools. Use when agents pay for APIs, services, or other agents.
Compares coding agents like Claude Code and Aider on custom YAML-defined codebase tasks using git worktrees, measuring pass rate, cost, time, and consistency.
Observation is not judgment. Record patterns only.
Build and maintain a persistent user identity profile from behavioral signals observed across sessions. Every claim in SOUL.md must be evidence-backed. Contradictions become conditional rules, not averages.
| Subcommand | Description |
|---|---|
init | Bootstrap a fresh observation log and SOUL.md stub from a template |
learn | Record new observations from the current session into the observation log |
show | Display current SOUL.md with evidence citations |
propose | Run full synthesis and output a proposed SOUL.md diff — does not write yet |
apply | Write the proposed SOUL.md to .data/soul/SOUL.md after user review |
diff | Compare current SOUL.md against a proposed version, highlighting changes |
reset | Archive current SOUL.md and start a fresh observation log |
retro | Show shipping metrics from git history across projects |
| Flag | Values | Default | Effect |
|---|---|---|---|
--mode | manual|learning|hybrid | hybrid | manual = only user-triggered; learning = auto-observe every session; hybrid = auto-observe + user-triggered synthesis |
--template | default|developer|writer|researcher | default | Starter template for init |
--import | file path | none | Import observations from an external file into the log |
--period | week|month|quarter | week | Time range for retro metrics |
--projects | comma-separated paths | auto-detect | Project directories for retro git scanning |
soul learn. No automatic logging.soul propose.init.data/soul/ already exists — if so, warn user and require explicit --force flagreferences/templates/{template}.md.data/soul/SOUL.md (stub from template, all fields empty/TBD).data/soul/observations.jsonl (empty log).data/soul/meta.jsonlearnreferences/observation-signals.md catalog{ signal_type, context, raw_text, inferred_pattern, session_id, timestamp }signal_type or raw_text.data/soul/observations.jsonlshow.data/soul/SOUL.mdobservations.jsonl by citation IDproposeobservations.jsonl must contain ≥10 sessions OR ≥30 observations. If below threshold, output gap report and stop.observations.jsonl contains shipping signal entries, include the most recent 4 as quantitative evidence for the "Work Patterns" and "Shipping Cadence" dimensionsreferences/synthesis-algorithm.mddiff automatically and surface any dimension with >30% shiftapplypropose has been run in this session (check for proposed output in conversation).data/soul/SOUL.md. [yes/no]".data/soul/SOUL.md, append apply event to meta.jsondiff.data/soul/SOUL.mdreferences/synthesis-algorithm.md for drift detection)retro--projects provided, use those paths.git/--period range:
references/retro-metrics.md specification:
.data/soul/SOUL.md exists, compare current cadence against the "Shipping Cadence" section — note acceleration, deceleration, or project focus shiftsshipping observation to observations.jsonl with aggregated metrics as evidence (signal_type: shipping, one entry per retro invocation)reset.data/soul/SOUL.md to .data/soul/archive/SOUL-{timestamp}.md, clear observations.jsonl, reset meta.jsonData directory:
.data/soul/relative to the plugin root. Create withmkdir -pbefore writing.
| File | Description |
|---|---|
.data/soul/SOUL.md | The synthesized soul document |
.data/soul/observations.jsonl | Append-only observation log (one JSON object per line) |
.data/soul/meta.json | Init timestamp, template, last synthesis date, observation count |
.data/soul/archive/ | Archived soul versions from reset calls |
{
"id": "obs-{timestamp}-{n}",
"session_id": "session-{YYYY-MM-DD}-{topic-slug}",
"signal_type": "correction|style|expertise|decision|emotional|shipping",
"context": "brief description of what was happening",
"raw_text": "exact quote or paraphrase of the signal",
"inferred_pattern": "what this reveals about the user",
"timestamp": "ISO-8601",
"weight": 1
}
shipping entries use the same schema with structured raw_text:
{
"id": "obs-{timestamp}-retro",
"session_id": "retro-{YYYY-MM-DD}",
"signal_type": "shipping",
"context": "retro --period week",
"raw_text": "{\"period\":\"2026-03-18..2026-03-25\",\"total_commits\":47,\"streak_days\":12,\"projects\":{\"christmas-ai-studio\":28,\"second-claude\":11,\"fronmpt-academy\":8},\"net_lines\":2340,\"peak_hours\":[14,15,22]}",
"inferred_pattern": "ships daily across 3 projects, heaviest in christmas-ai-studio, afternoon + late night peaks",
"timestamp": "ISO-8601",
"weight": 1
}
soul-keeper: { model: opus, agent: pikachu, constraint: "every dimension needs 2+ evidence citations, contradictions become conditional rules, generic descriptions are rejected" }
analyst: { model: sonnet, agent: alakazam, constraint: "extract signals matching observation catalog, return structured JSON, no inferences beyond what the signal supports" }
The most common failure: producing dimensions that could describe any knowledge worker. soul-keeper must run the anti-generic filter on every dimension before output. If a dimension reads like a LinkedIn bio, it is rejected.
Observation logs can grow large. When calling soul-keeper, summarize observations older than 30 days to a single paragraph per session. Only the last 5 sessions are passed verbatim. Total input to soul-keeper must not exceed 500 tokens of observation data per session in the summary window.
A user who is "direct in chat but verbose in reports" is NOT contradictory — those are conditional behaviors. Do not force a single characterization. The conditional rule format preserves predictive power; averaging destroys it.
SOUL.md must never contain medical data, financial details, relationship status, or political/religious beliefs unless the user explicitly provides them as work-relevant context. If a sensitive signal is observed, note "sensitive signal omitted" in the observation log without recording the content.
A >30% shift in any dimension is not automatically applied. It requires explicit user acknowledgment. Surface it visibly in propose output with the phrase "SIGNIFICANT DRIFT DETECTED" before applying.
.data/soul/SOUL.mdreferences/templates/references/observation-signals.mdreferences/synthesis-algorithm.mdreferences/retro-metrics.md