Agent-alchemy deep-analysis
Deep exploration and synthesis workflow using Agent Teams with dynamic planning and hub-and-spoke coordination. Use when asked for "deep analysis", "deep understanding", "analyze codebase", "explore and analyze", or "investigate codebase".
git clone https://github.com/sequenzia/agent-alchemy
T=$(mktemp -d) && git clone --depth=1 https://github.com/sequenzia/agent-alchemy "$T" && mkdir -p ~/.claude/skills && cp -r "$T/claude/core-tools/skills/deep-analysis" ~/.claude/skills/sequenzia-agent-alchemy-deep-analysis && rm -rf "$T"
claude/core-tools/skills/deep-analysis/SKILL.mdDeep Analysis Workflow
Execute a structured exploration + synthesis workflow using Agent Teams with hub-and-spoke coordination. The lead performs rapid reconnaissance to generate dynamic focus areas, composes a team plan for review, workers explore independently, and a synthesizer merges findings with Bash-powered investigation.
This skill can be invoked standalone or loaded by other skills as a reusable building block. Approval behavior is configurable via
.claude/agent-alchemy.local.md.
Settings Check
Goal: Determine whether the team plan requires user approval before execution.
-
Read settings file:
- Check if
exists.claude/agent-alchemy.local.md - If it exists, read it and look for a
section with nested settings:deep-analysis- **deep-analysis**: - **direct-invocation-approval**: true - **invocation-by-skill-approval**: false - If the file does not exist or is malformed, use defaults (see step 4)
- Check if
-
Determine invocation mode:
- Direct invocation: The user invoked
directly, or you are running this skill standalone/deep-analysis - Skill-invoked: Another skill (e.g., codebase-analysis, feature-dev, docs-manager) loaded and is executing this workflow
- Direct invocation: The user invoked
-
Resolve settings:
- If settings were found, use them as-is
- If the file is missing or the
section is absent, use defaults:deep-analysis
:direct-invocation-approvaltrue
:invocation-by-skill-approvalfalse
- If the file exists but is malformed (unparseable), warn the user and use defaults
-
Set
:REQUIRE_APPROVAL- If direct invocation → use
value (default:direct-invocation-approval
)true - If skill-invoked → use
value (default:invocation-by-skill-approval
)false
- If direct invocation → use
-
Parse session settings (also under the
section):deep-analysis- **deep-analysis**: - **cache-ttl-hours**: 24 - **enable-checkpointing**: true - **enable-progress-indicators**: true
: Number of hours before exploration cache expires. Default:cache-ttl-hours
. Set to24
to disable caching entirely.0
: Whether to write session checkpoints at phase boundaries. Default:enable-checkpointing
.true
: Whether to displayenable-progress-indicators
progress messages. Default:[Phase N/6]
.true
-
Set behavioral flags:
= value ofCACHE_TTL
(default:cache-ttl-hours
)24
= value ofENABLE_CHECKPOINTING
(default:enable-checkpointing
)true
= value ofENABLE_PROGRESS
(default:enable-progress-indicators
)true
Phase 0: Session Setup
Goal: Check for cached exploration results, detect interrupted sessions, and initialize the session directory.
Skip this phase entirely if
ANDCACHE_TTL = 0.ENABLE_CHECKPOINTING = false
Step 1: Exploration Cache Check
If
CACHE_TTL > 0:
- Check if
exists.claude/sessions/exploration-cache/manifest.md - If found, read the manifest and verify:
matches the current analysis context (or is a superset)analysis_context
matches the current working directorycodebase_path
is withintimestamp
hours of nowCACHE_TTL- Config files referenced in
haven't been modified since the cache was written (check mod-times ofconfig_checksum
,package.json
,tsconfig.json
, etc.)pyproject.toml
- If cache is valid:
- Skill-invoked mode: Auto-accept the cache. Set
. Read cachedCACHE_HIT = true
andsynthesis.md
. Skip to Phase 6 step 2 (present/return results).recon_summary.md - Direct invocation: Use
to offer:AskUserQuestion- "Use cached results" — Set
, skip to Phase 6 step 2CACHE_HIT = true - "Refresh analysis" — Set
, proceed normallyCACHE_HIT = false
- "Use cached results" — Set
- Skill-invoked mode: Auto-accept the cache. Set
- If cache is invalid or absent: Set
CACHE_HIT = false
Step 2: Interrupted Session Check
If
ENABLE_CHECKPOINTING = true:
- Check if
exists.claude/sessions/__da_live__/checkpoint.md - If found, read the checkpoint to determine
last_completed_phase - Use
to offer:AskUserQuestion- "Resume from Phase [N+1]" — Load checkpoint state, proceed from the interrupted phase (see Session Recovery in Error Handling)
- "Start fresh" — Archive the interrupted session to
and proceed normally.claude/sessions/da-interrupted-{timestamp}/
- If not found: proceed normally
Step 3: Initialize Session Directory
If
ENABLE_CHECKPOINTING = true AND CACHE_HIT = false:
- Create
directory.claude/sessions/__da_live__/ - Write
:checkpoint.md## Deep Analysis Session - **analysis_context**: [context from arguments or caller] - **codebase_path**: [current working directory] - **started**: [ISO timestamp] - **current_phase**: 0 - **status**: initialized - Write
:progress.md## Deep Analysis Progress - **Phase**: 0 of 6 - **Status**: Session initialized ### Phase Log - [timestamp] Phase 0: Session initialized
Phase 1: Reconnaissance & Planning
Goal: Perform codebase reconnaissance, generate dynamic focus areas, and compose a team plan.
If
: Display "[Phase 1/6] Reconnaissance & Planning — Mapping codebase structure..."ENABLE_PROGRESS = true
-
Determine analysis context:
- If
is provided, use it as the analysis context (feature area, question, or general exploration goal)$ARGUMENTS - If no arguments and this skill was loaded by another skill, use the calling skill's context
- If no arguments and standalone invocation, set context to "general codebase understanding"
- Set
PATH = current working directory - Inform the user: "Exploring codebase at:
" with the analysis contextPATH
- If
-
Rapid codebase reconnaissance: Use Glob, Grep, and Read to quickly map the codebase structure. This should take 1-2 minutes, not deep investigation.
- Directory structure: List top-level directories with
(e.g.,Glob
pattern) to understand the project layout*/ - Language and framework detection: Read config files (
,package.json
,tsconfig.json
,pyproject.toml
,Cargo.toml
, etc.) to identify primary language(s) and framework(s)go.mod - File distribution: Use
with patterns likeGlob
,src/**/*.ts
to gauge the size and shape of different areas**/*.py - Key documentation: Read
,README.md
, or similar docs if they exist for project contextCLAUDE.md - For feature-focused analysis: Use
to search for feature-related terms (function names, component names, route paths) to find hotspot directoriesGrep - For general analysis: Identify the 3-5 largest or most architecturally significant directories
Fallback: If reconnaissance fails (empty project, unusual structure, errors), use the static focus area templates from Step 3b.
- Directory structure: List top-level directories with
-
Generate dynamic focus areas:
Based on reconnaissance findings, create focus areas tailored to the actual codebase. Default to 3 focus areas, but adjust based on codebase size and complexity (2 for small projects, up to 4 for large ones).
a) Dynamic focus areas (default):
Each focus area should include:
- Label: Short description (e.g., "API layer in src/api/")
- Directories: Specific directories to explore
- Starting files: 2-3 key files to read first
- Search terms: Grep patterns to find related code
- Complexity estimate: Low/Medium/High based on file count and apparent structure
For feature-focused analysis, focus areas should track the feature's actual footprint:
Example: Focus 1: "API routes and middleware in src/api/ and src/middleware/" (auth-related endpoints, request handling) Focus 2: "React components in src/pages/profile/ and src/components/user/" (UI layer for user profiles) Focus 3: "Data models and services in src/db/ and src/services/" (persistence and business logic)For general analysis, focus areas should map to the codebase's actual structure:
Example: Focus 1: "Next.js app layer in apps/web/src/" (pages, components, app router) Focus 2: "Shared library in packages/core/src/" (utilities, types, shared logic) Focus 3: "CLI and tooling in packages/cli/" (commands, configuration, build)b) Static fallback focus areas (only if recon failed):
For feature-focused analysis:
Focus 1: Explore entry points and user-facing code related to the context Focus 2: Explore data models, schemas, and storage related to the context Focus 3: Explore utilities, helpers, and shared infrastructureFor general codebase understanding:
Focus 1: Explore application structure, entry points, and core logic Focus 2: Explore configuration, infrastructure, and shared utilities Focus 3: Explore shared utilities, patterns, and cross-cutting concerns -
Compose the team plan:
Assemble a structured plan document from the reconnaissance and focus area findings:
## Team Plan: Deep Analysis ### Analysis Context [context from Step 1] ### Reconnaissance Summary - **Project:** [name/type] - **Primary language/framework:** [detected] - **Codebase size:** [file counts, key directories] - **Key observations:** [2-3 bullets] ### Focus Areas #### Focus Area 1: [Label] - **Directories:** [list] - **Starting files:** [2-3 files] - **Search patterns:** [Grep patterns] - **Complexity:** [Low/Medium/High] - **Assigned to:** explorer-1 (sonnet) #### Focus Area 2: [Label] - **Directories:** [list] - **Starting files:** [2-3 files] - **Search patterns:** [Grep patterns] - **Complexity:** [Low/Medium/High] - **Assigned to:** explorer-2 (sonnet) [... repeated for each focus area] ### Agent Composition | Role | Count | Model | Purpose | |------|-------|-------|---------| | Explorer | [N] | sonnet | Independent focus area exploration | | Synthesizer | 1 | opus | Merge findings, deep investigation | ### Task Dependencies - Exploration Tasks 1-[N]: parallel (no dependencies) - Synthesis Task: blocked by all exploration tasks -
Checkpoint (if
):ENABLE_CHECKPOINTING = true- Update
: set.claude/sessions/__da_live__/checkpoint.mdcurrent_phase: 1 - Write
with the full team plan from Step 4.claude/sessions/__da_live__/team_plan.md - Write
with reconnaissance findings from Step 2.claude/sessions/__da_live__/recon_summary.md - Append to
:progress.md[timestamp] Phase 1: Reconnaissance complete — [N] focus areas identified
- Update
Phase 2: Review & Approval
Goal: Present the team plan for user review and approval before allocating resources.
If
: Display "[Phase 2/6] Review & Approval — Presenting team plan..."ENABLE_PROGRESS = true
If REQUIRE_APPROVAL = false
REQUIRE_APPROVAL = falseSkip to Phase 3 with a brief note: "Auto-approving team plan (skill-invoked mode). Proceeding with [N] explorers and 1 synthesizer."
If REQUIRE_APPROVAL = true
REQUIRE_APPROVAL = true-
Present the team plan to the user (output the plan from Phase 1 Step 4), then use
:AskUserQuestion- "Approve" — Proceed to Phase 3 as-is
- "Modify" — User describes changes (adjust focus areas, add/remove explorers, change scope)
- "Regenerate" — Re-run reconnaissance with user feedback
-
If "Modify" (up to 3 cycles):
- Ask what to change using
AskUserQuestion - Apply modifications to the team plan (adjust focus areas, agent count, scope)
- Re-present the updated plan for approval
- If 3 modification cycles are exhausted, offer "Approve current plan" or "Abort analysis"
- Ask what to change using
-
If "Regenerate" (up to 2 cycles):
- Ask for feedback/new direction using
AskUserQuestion - Return to Phase 1 Step 2 with the user's feedback incorporated
- Re-compose and re-present the team plan
- If 2 regeneration cycles are exhausted, offer "Approve current plan" or "Abort analysis"
- Ask for feedback/new direction using
-
Checkpoint (if
):ENABLE_CHECKPOINTING = true- Update
: set.claude/sessions/__da_live__/checkpoint.md
, recordcurrent_phase: 2
(approved/auto-approved)approval_mode - Append to
:progress.md[timestamp] Phase 2: Plan approved (mode: [approval_mode])
- Update
Phase 3: Team Assembly
Goal: Create the team, spawn agents, create tasks, and assign work using the approved plan.
If
: Display "[Phase 3/6] Team Assembly — Creating team and spawning agents..."ENABLE_PROGRESS = true
-
Create the team:
- Use
with nameTeamCreate
(e.g.,deep-analysis-{timestamp}
)deep-analysis-1707300000 - Description: "Deep analysis of [analysis context]"
- Use
-
Spawn teammates: Use the Task tool with the
parameter to spawn teammates based on the approved plan:team_name-
N explorers (one per focus area) —
, model: sonnetsubagent_type: "code-explorer"- Named:
,explorer-1
, ...explorer-2explorer-N - Prompt each with: "You are part of a deep analysis team. Wait for your task assignment. The codebase is at: [PATH]. Analysis context: [context]"
- Named:
-
1 synthesizer —
subagent_type: "code-synthesizer"- Named:
synthesizer - Prompt with: "You are the synthesizer for a deep analysis team. You have Bash access for git history, dependency analysis, and static analysis. Wait for your task assignment. The codebase is at: [PATH]. Analysis context: [context]"
- Named:
-
-
Create tasks: Use
for each task based on the approved plan's focus areas:TaskCreate- Exploration Task per focus area: Subject: "Explore: [Focus area label]", Description: detailed exploration instructions including directories, starting files, search terms, and complexity estimate
- Synthesis Task: Subject: "Synthesize and evaluate exploration findings", Description: "Merge and synthesize findings from all exploration tasks into a unified analysis. Investigate gaps using Bash (git history, dependency trees). Evaluate completeness before finalizing."
- Use
to setTaskUpdate
pointing to all exploration task IDsaddBlockedBy
- Use
-
Assign exploration tasks (with status guard):
For each exploration task, apply the following status-guarded assignment:
- Use
to check the task's current status and ownerTaskGet - Only assign if status is
AND owner is emptypending - If already assigned or completed: log "Task [ID] already [status], skipping" and move on
- Use
to set the owner to the corresponding explorerTaskUpdate - Send the explorer a message with the task details via
:SendMessageSendMessage type: "message", recipient: "[explorer-N]", content: "Your exploration task [ID] is assigned. Focus area: [label]. Directories: [list]. Starting files: [list]. Search patterns: [list]. Begin exploration now.", summary: "Exploration task assigned"
Never re-assign a completed or in-progress task.
- Use
-
Checkpoint (if
):ENABLE_CHECKPOINTING = true- Update
: set.claude/sessions/__da_live__/checkpoint.md
, recordcurrent_phase: 3
,team_name
(list),explorer_names
(map of explorer → task ID),task_idssynthesis_task_id - Append to
:progress.md[timestamp] Phase 3: Team assembled — [N] explorers, 1 synthesizer
- Update
Phase 4: Focused Exploration
Goal: Workers explore their assigned areas independently.
If
: Display "[Phase 4/6] Focused Exploration — 0/[N] explorers complete"ENABLE_PROGRESS = true
Monitoring Loop
After assigning exploration tasks, monitor progress with status-aware tracking:
- When an explorer goes idle or sends a message, use
to check their task statusTaskGet - If task is
: Record the explorer's findings. Ifcompleted
, writeENABLE_CHECKPOINTING = true
toexplorer-{N}-findings.md
and update checkpoint..claude/sessions/__da_live__/ - If task is
: The explorer is still working — do NOT re-send the assignmentin_progress - If task is
and owner is set: The explorer received the assignment but hasn't started yet — wait, do NOT re-sendpending - If task is
and owner is empty: Assignment may have been lost — re-assign using the status guard from Phase 3 step 4pending
Never re-assign a completed or in-progress task. This is the primary duplicate prevention mechanism.
If
ENABLE_PROGRESS = true: Update the progress display as explorers complete: "[Phase 4/6] Focused Exploration — [completed]/[N] explorers complete"
- Workers explore their assigned focus areas independently — no cross-worker messaging
- Workers can respond to follow-up questions from the synthesizer
- Each worker marks its task as completed when done
- You (the lead) receive idle notifications as workers finish
- Wait for all exploration tasks to be marked complete before proceeding to Phase 5
Phase 5: Evaluation and Synthesis
Goal: Verify exploration completeness, launch synthesis with deep investigation.
If
: Display "[Phase 5/6] Synthesis — Merging findings and investigating gaps..."ENABLE_PROGRESS = true
Step 1: Structural Completeness Check
This is a structural check, not a quality assessment:
- Use
to verify all exploration tasks are completedTaskList - Check that each worker produced a report with content (review the messages/reports received)
- If a worker failed completely (empty or error output):
- Create a follow-up exploration task targeting the gap
- Assign it to an idle worker
- Add the new task to the synthesis task's
listblockedBy - Wait for the follow-up task to complete
- If all produced content: proceed immediately to Step 2
Step 2: Launch Synthesis
-
Use
to assign the synthesis task:TaskUpdateowner: "synthesizer" -
Send the synthesizer a message with exploration context and recon findings:
SendMessage type: "message", recipient: "synthesizer", content: "All exploration tasks are complete. Your synthesis task is now assigned. Analysis context: [analysis context] Codebase path: [PATH] Recon findings from planning phase: - Project structure: [brief summary of directory layout] - Primary language/framework: [what was detected] - Key areas identified: [the focus areas and why they were chosen] The workers are: [list of explorer names from the approved plan]. You can message them with follow-up questions if you find conflicts or gaps in their findings. You have Bash access for deep investigation — use it for git history analysis, dependency trees, static analysis, or any investigation that Read/Glob/Grep can't handle. Read the completed exploration tasks via TaskGet to access their reports, then synthesize into a unified analysis. Evaluate completeness before finalizing.", summary: "Synthesis task assigned, begin work" -
Wait for the synthesizer to mark the synthesis task as completed
-
Checkpoint (if
):ENABLE_CHECKPOINTING = true- Update
: set.claude/sessions/__da_live__/checkpoint.mdcurrent_phase: 5 - Write
with the synthesis results.claude/sessions/__da_live__/synthesis.md - Append to
:progress.md[timestamp] Phase 5: Synthesis complete
- Update
Phase 6: Completion + Cleanup
Goal: Collect results, present to user, and tear down the team.
If
: Display "[Phase 6/6] Completion — Collecting results and cleaning up..."ENABLE_PROGRESS = true
-
Collect synthesis output:
- The synthesizer's findings are in the messages it sent and/or the task completion output
- Read the synthesis results
-
Write exploration cache (if
):CACHE_TTL > 0- Create
directory (overwrite if exists).claude/sessions/exploration-cache/ - Write
:manifest.md## Exploration Cache Manifest - **analysis_context**: [the analysis context used] - **codebase_path**: [current working directory] - **timestamp**: [ISO timestamp] - **config_checksum**: [comma-separated list of config files and their mod-times] - **ttl_hours**: [CACHE_TTL value] - **explorer_count**: [N] - Write
with the full synthesis outputsynthesis.md - Write
with the Phase 1 reconnaissance findingsrecon_summary.md - Write
for each explorer's findings (if not already persisted from Phase 4 checkpoints)explorer-{N}-findings.md
- Create
-
Present or return results:
- Standalone invocation: Present the synthesized analysis to the user. The results remain in conversation memory for follow-up questions.
- Loaded by another skill: The synthesis is complete. Control returns to the calling workflow — do not present a standalone summary.
-
Shutdown teammates: Send shutdown requests to all spawned teammates (iterate over the actual agents from the approved plan):
SendMessage type: "shutdown_request", recipient: "explorer-1", content: "Analysis complete" SendMessage type: "shutdown_request", recipient: "explorer-2", content: "Analysis complete" [... for each explorer spawned] SendMessage type: "shutdown_request", recipient: "synthesizer", content: "Analysis complete" -
Archive session and cleanup team:
- If
: MoveENABLE_CHECKPOINTING = true
to.claude/sessions/__da_live__/.claude/sessions/da-{timestamp}/ - Use
to remove the team and its task listTeamDelete
- If
Error Handling
Settings Check Failure
- If
exists but is malformed or the.claude/agent-alchemy.local.md
section is unparseable: warn the user ("Settings file found but could not parse deep-analysis settings — using defaults") and proceed with default approval values.deep-analysis
Planning Phase Failure
- If reconnaissance fails (errors, empty results, unusual structure): fall back to static focus area templates (Step 3b)
- If the codebase appears empty: inform the user and ask how to proceed
Approval Phase Failure
- If maximum modification cycles (3) or regeneration cycles (2) are reached without approval: use
with options:AskUserQuestion- "Approve current plan" — Proceed with the latest version of the plan
- "Abort analysis" — Cancel the analysis entirely
Partial Worker Failure
- If one worker fails: create a follow-up task targeting the missed focus area, assign to an idle worker, add to synthesis
blockedBy - If two workers fail: attempt follow-ups, but if they also fail, instruct the synthesizer to work with partial results
- If all workers fail: inform the user and offer to retry or abort
Synthesizer Failure
- If the synthesizer fails: present the raw exploration results to the user directly
- Offer to retry synthesis or let the user work with partial results
General Failures
If any phase fails:
- Explain what went wrong
- Ask the user how to proceed:
- Retry the phase
- Continue with partial results
- Abort the analysis
Session Recovery
When resuming from an interrupted session (detected in Phase 0 Step 2), use the following per-phase strategy:
| Interrupted At | Recovery Strategy |
|---|---|
| Phase 1 | Restart from Phase 1 (reconnaissance is fast, ~1-2 min) |
| Phase 2 | Load saved from session dir, re-present for approval |
| Phase 3 | Load approved plan from checkpoint, restart team assembly |
| Phase 4 | Read completed files from session dir. Only spawn and assign explorers whose findings files are missing. Add existing findings to synthesizer context. |
| Phase 5 | Load all explorer findings from session dir. Spawn a fresh synthesizer and launch synthesis with the persisted findings. |
| Phase 6 | Load from session dir. Proceed directly to present/return results and cleanup. |
Recovery procedure:
- Read
to determinecheckpoint.md
and session state (team_name, explorer_names, task_ids)last_completed_phase - Load any persisted artifacts from the session directory (team_plan, explorer findings, synthesis)
- Resume from Phase
using the loaded statelast_completed_phase + 1 - For Phase 4 recovery: compare persisted
files against expected explorer list to determine which explorers still need to runexplorer-{N}-findings.md
Agent Coordination
- The lead (you) acts as the planner: performs recon, composes the team plan, handles approval, assigns work
- Workers explore independently — no cross-worker messaging (hub-and-spoke topology)
- The synthesizer can ask workers follow-up questions to resolve conflicts and fill gaps
- The synthesizer has Bash access for deep investigation (git history, dependency trees, static analysis)
- Wait for task dependencies to resolve before proceeding
- Handle agent failures gracefully — continue with partial results
- Agent count and focus area details come from the approved plan, not hardcoded values
When calling Task tool for teammates:
- Use
for the synthesizermodel: "opus" - Use
for workersmodel: "sonnet" - Always include
parameter to join the teamteam_name