Help us improve
Share bugs, ideas, or general feedback.
From second-claude-code
Synthesizes persistent user identity profiles from behavioral observations across sessions. Useful for tracking communication styles, decision patterns, and self-reflection with evidence-backed claims.
npx claudepluginhub unclejobs-ai/second-claude-code --plugin second-claude-codeHow this skill is triggered — by the user, by Claude, or both
Slash command
/second-claude-code:soulThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
> **Observation is not judgment. Record patterns only.**
Generates developer personality portraits from Claude Code and Codex conversation histories. Supports subcommands: generate/update portrait, install/list/remove/activate GitHub personas.
Runs context-aware retrospectives auto-gathering git metrics, learnings, away-logs, and handoffs into pre-populated tables for interactive or agent-summary review.
Analyzes git commit history for engineering retrospectives, tracking work patterns, code quality metrics, trends, per-person breakdowns, shipping streaks, and actionable improvements. Use for 'retro', weekly reviews, or 'what did we ship'.
Share bugs, ideas, or general feedback.
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