Anthropic Multi Session Claude Agent SDK Pattern Research
Anthropic Multi-Session Claude Agent SDK Pattern Research
Research Date: November 29, 2025 Research Focus: Component activation system alignment with Anthropic's official patterns Target System: CODITECT Framework (288 components, 117KB registry)
Executive Summary
Anthropic has established a comprehensive multi-session agent pattern through their Claude Agent SDK and autonomous coding quickstart that directly addresses our component activation challenge. Their approach centers on filesystem-based discovery with explicit configuration, file-based state persistence, and two-agent initialization patterns for long-running autonomous workflows.
Key Findings
- Filesystem Discovery is Standard - Components (Skills, Agents, Commands, Hooks) live in
.claude/directory structure and are discovered automatically whensetting_sourcesis configured - Explicit Activation Required - Tools/Skills must be added to
allowed_toolsarray for security - State Files Enable Continuity -
claude-progress.txt,feature_list.json, and git history provide session handoff - Init Scripts Are First-Class - The
init.shpattern is officially endorsed for environment setup and validation - Two-Agent Pattern for Complex Tasks - Initializer agent (session 1) sets up infrastructure; coding agent (sessions 2+) makes incremental progress
Direct Applicability to CODITECT
Our ComponentActivator (567 lines) and framework-registry.json (117KB) align 90% with Anthropic's architecture. We need:
- Enhanced init.sh - Add component activation to existing script (2-3 hours)
- component-activation-status.json - Track activated components like
feature_list.json(1-2 hours) - setting_sources Configuration - Ensure Skills/Agents/Commands discoverable (30 minutes)
- Session Startup Workflow - Load activation status at beginning of each session (1 hour)
Total Implementation Effort: 5-7 hours (P0 priority)
ROI: Eliminates manual component activation, enables seamless multi-session workflows, aligns with official Anthropic patterns for future SDK compatibility.
Detailed Findings by Source
1. Long-Running Agent Harness (Official Engineering Blog)
Source: Effective harnesses for long-running agents
Core Architecture: Two-Agent Pattern
Anthropic's approach uses specialized agents for different phases:
- Initializer Agent - First session only, sets up foundation
- Coding Agent - Subsequent sessions, incremental progress
Key Quote
"The key insight here was finding a way for agents to quickly understand the state of work when starting with a fresh context window, which is accomplished with the Claude-progress.txt file alongside the git history."
State Persistence Mechanisms
Three primary artifacts enable session continuity:
| Artifact | Purpose | Format | Modification Rules |
|---|---|---|---|
claude-progress.txt | Session log documenting agent actions | Plain text | Append-only |
feature_list.json | Structured feature requirements | JSON | Only passes field modified |
| Git repository | Version control with descriptive commits | Git history | Standard git workflow |
Why JSON for feature_list.json
"We chose JSON because the model is less likely to inappropriately change or overwrite JSON files compared to Markdown files."
Initialization Script Pattern
The initializer creates an init.sh script with specific capabilities:
- Development server startup
- Basic end-to-end testing before feature work
- Quick environment validation
Session Startup Sequence (Official Pattern)
1. Run pwd (verify working directory)
2. Read claude-progress.txt and git logs
3. Read feature_list.json
4. Run init.sh to start development server
5. Execute verification tests
6. Select one incomplete feature to work on
Feature Tracking System
JSON structure for tracking work:
{
"category": "functional",
"description": "Feature description",
"steps": ["step1", "step2"],
"passes": false
}
Critical Constraint
"It is unacceptable to remove or edit tests because this could lead to missing or buggy functionality."
Agents only modify the passes field status - never delete or alter test definitions.
Session Continuity Problem-Solution Mapping
| Issue | Solution |
|---|---|
| Agent declares project complete prematurely | Comprehensive feature list with 200+ items marked "failing" |
| Undocumented code changes | Git commits with descriptive messages + progress updates |
| Premature feature completion | Mandatory self-verification before marking features passing |
| Environment setup overhead | init.sh script for rapid server startup |
Testing Requirements
Agents must verify features end-to-end using browser automation tools (Puppeteer MCP), not just unit tests or server-side validation.
Implications for CODITECT
- Our
component-activation-status.jsonshould follow thefeature_list.jsonpattern - Use JSON (not YAML/TOML) to prevent unintended modifications
- Track activation state with boolean flags (like
passesfield) - Enhanced
init.shshould verify component availability - Git commits should document component activation changes
2. Autonomous Coding Quickstart (GitHub Repository)
Source: Claude-quickstarts/autonomous-coding
Implementation Architecture
The demo uses autonomous_agent_demo.py orchestrating a two-agent workflow.
Generated Files After First Run
project/
├── feature_list.json # Test cases (source of truth)
├── init.sh # Environment setup script
├── app_spec.txt # Copied specification
├── claude-progress.txt # Session progress notes
├── .claude_settings.json # Security configuration
└── [application files] # Generated code
Two-Agent Workflow
Initializer Agent (Session 1)
- Reads
app_spec.txt - Creates
feature_list.jsonwith 200 test cases - Sets up project structure
- Initializes git repository
- Creates first commit
Coding Agent (Sessions 2+)
- Reads
feature_list.jsonto identify incomplete features - Implements features one by one
- Marks features as passing in JSON
- Updates
claude-progress.txtwith session notes - Commits working code with descriptive messages
Session Continuity Mechanism
Automatic Resume
"Press Ctrl+C to pause; run the same command to resume"
3-second delay between sessions allows graceful handoff without human intervention.
Security Architecture (security.py)
Defense-in-depth through security.py:
- OS-level command isolation - Prevents unauthorized system access
- Filesystem restrictions - Project directory only
- Bash allowlist - Only specific commands permitted:
- File inspection:
ls,cat,grep - Node.js:
npm,node,npx - Git:
git(all subcommands) - Process management:
ps,kill
- File inspection:
Key Pattern: Security is configured via .claude_settings.json, not hardcoded.
Implications for CODITECT
- Our
scripts/init.shshould be generated/enhanced by initializer logic - Component activation should be tracked like feature implementation
- Security constraints should live in
.claude/settings.jsonor.claude/settings.local.json - Session resume should load
component-activation-status.jsonautomatically - Git integration tracks component activation history
3. Claude Agent SDK Component Registration
Sources
Filesystem-Based Discovery Architecture
The SDK uses directory structure conventions for automatic component discovery:
.claude/
├── agents/ # Subagents (Markdown files)
├── skills/ # Skills (SKILL.md files)
├── commands/ # Slash commands (Markdown)
├── hooks/ # Event-driven callbacks
├── settings.json # Configuration (shared via git)
├── settings.local.json # Local config (not committed)
└── CLAUDE.md # Project context/instructions
```dockerfile
User-level components live in `~/.claude/` for cross-project availability.
#### Configuration via ClaudeAgentOptions
#### Python Example
```python
from claude_agent_sdk import query, ClaudeAgentOptions
options = ClaudeAgentOptions(
cwd="/path/to/project",
setting_sources=["user", "project", "local"], # Enables discovery
allowed_tools=["Skill", "Read", "Write", "Bash"], # Security allowlist
permission_mode="manual", # Requires approval
mcp_servers={"custom": custom_server} # Custom tool servers
)
async for message in query(
prompt="Analyze this codebase",
options=options
):
print(message)
TypeScript Example
import { query, ClaudeAgentOptions } from "@anthropic-ai/claude-agent-sdk";
const options: ClaudeAgentOptions = {
cwd: "/path/to/project",
settingSources: ['user', 'project', 'local'], // camelCase in TS
allowedTools: ["Skill", "Read", "Write", "Bash"],
permissionMode: "manual",
mcpServers: { custom: customServer }
};
for await (const message of query({
prompt: "Analyze this codebase",
options
})) {
console.log(message);
}
setting_sources Configuration (Critical)
Key Quote
"By default, the SDK does not load any filesystem settings."
You must explicitly configure setting_sources (Python) or settingSources (TypeScript) to enable component discovery.
Available values
| Value | Location | Purpose |
|---|---|---|
"user" | ~/.claude/ | Personal cross-project components |
"project" | .claude/ | Project-specific, shared via git |
"local" | .claude/settings.local.json | Personal project overrides (not committed) |
Discovery Process
- Startup: SDK scans configured directories
- Metadata Load: Skill/Agent/Command frontmatter parsed
- Full Content Load: Triggered when Claude determines relevance
- Autonomous Selection: Model chooses components based on context matching
Skills Activation Pattern
Skills require two configuration steps:
- Enable Discovery:
setting_sources=["user", "project"] - Add to Allowlist:
allowed_tools=["Skill"]
Without both, Skills remain unavailable regardless of filesystem presence.
Example
options = ClaudeAgentOptions(
setting_sources=["user", "project"], # Discovers .claude/skills/
allowed_tools=["Skill", "Read", "Write"] # Allows Skill invocation
)
Custom Tool Registration
Custom tools use the @tool decorator pattern with in-process MCP servers:
Python
from claude_agent_sdk import tool, create_sdk_mcp_server
@tool("get_weather", "Get current temperature", {"latitude": float, "longitude": float})
async def get_weather(args: dict) -> dict:
# Implementation
return {"content": [{"type": "text", "text": f"Temperature: {temp}°F"}]}
custom_server = create_sdk_mcp_server(
name="my-tools",
version="1.0.0",
tools=[get_weather]
)
options = ClaudeAgentOptions(
mcp_servers={"my-tools": custom_server},
allowed_tools=["mcp__my-tools__get_weather"] # Naming convention
)
Tool Naming Convention: mcp__{server_name}__{tool_name}
Hooks System
Hooks intercept agent loop events through ClaudeAgentOptions.hooks:
from claude_agent_sdk import HookMatcher
async def check_tool(input_data, tool_use_id, context) -> dict:
# Permission decision logic
return {
"hookEventName": "PreToolUse",
"permissionDecision": "allow", # or "deny"
"reasoning": "Safe operation"
}
options = ClaudeAgentOptions(
hooks={
"PreToolUse": HookMatcher(
tool_names=["Write"],
handler=check_tool
)
}
)
Current hook event: "PreToolUse" for permission decisions.
Implications for CODITECT
- Our 60 agents, all skills, 89 commands should live in
.claude/structure framework-registry.jsonmetadata aligns with SDK's discovery metadata- Component activation = ensuring
setting_sources+allowed_toolsconfigured ComponentActivatorshould generateClaudeAgentOptionsconfiguration- Hooks can validate component activation state before tool use
4. Settings.json Configuration System
Sources
Configuration Hierarchy
Settings load with descending priority:
- Enterprise managed policies (cannot be overridden)
- Command-line arguments (temporary session overrides)
- Local project settings (
.claude/settings.local.json) - Shared project settings (
.claude/settings.json) - User settings (
~/.claude/settings.json)
Key Quote
"Settings are merged, with more specific settings adding to or overriding broader ones."
Representative settings.json Structure
{
"permissions": {
"allow": ["Bash(npm run lint)", "Read(~/.zshrc)"],
"deny": ["Bash(curl:*)", "Read(./.env)"],
"ask": ["Write(*.py)"]
},
"env": {
"CLAUDE_CODE_ENABLE_TELEMETRY": "1",
"NODE_ENV": "development"
},
"model": "claude-sonnet-4.5-20250929",
"cleanupPeriodDays": 30,
"includeCoAuthoredBy": true,
"hooks": {
"postWrite": "python -m black {file}",
"preWrite": "python -m pylint {file}"
},
"enabledMcpjsonServers": ["weather-api", "database-connector"],
"enabledPlugins": ["github-integration", "jira-sync"]
}
Key Setting Categories
Permission Controls
allow- Permits specified tool operationsdeny- Blocks sensitive file access and dangerous commandsask- Requires user confirmation for certain operationsadditionalDirectories- Expands accessible working directories
Behavioral Settings
model- Overrides default Claude model selectioncleanupPeriodDays- Local chat transcript retention (default: 30)includeCoAuthoredBy- Git commit attribution (default: true)companyAnnouncements- Startup messages displayed to users
Integration & Extension
env- Environment variables applied to every sessionhooks- Custom command execution before/after tool useenabledMcpjsonServers- Model Context Protocol server approvalenabledPlugins- Controls which marketplace plugins are active
Git Integration
Claude Code automatically configures git to ignore .claude/settings.local.json when created, preventing accidental commit of personal preferences.
Migration from Legacy Config
Important
"
claude configwill be deprecated in place of settings.json"
All configuration is moving to the JSON file format for consistency.
Implications for CODITECT
- Our
component-activation-status.jsonshould use similar structure tosettings.json - Activation state could live in
.claude/settings.local.json(personal) or.claude/settings.json(shared) - Environment variables for component paths can live in
envsection - Hooks can automate component activation verification
- Permission system can restrict which components are usable
5. Session Initialization & Memory Management
Source: Claude Agent: Proven 2025 Playbook
Three-Beat Agentic Loop
Each session follows this pattern:
- Gather Context – Load only immediately relevant information
- Take Action – Execute tools and operations
- Verify Work – Check outputs and update persistent storage
Before starting tasks: Call ensureMemory() to create required folder structures and initialize baseline files.
Context Engineering Pattern
Rather than relying on conversation history alone:
Key Quote
"Prior notes loaded from memory files, then merged with current user goal to inform planning"
This prevents "context rot" where important signals get buried as input grows.
Memory Management Architecture
Durable Storage Structure
memory/
├── NOTES.md # Appended progressively
├── decisions/ # Archived decision records
└── research/ # Findings & summaries
Helper Functions
appendNote()- Writes timestamped entriessearchMemory()- Retrieves relevant prior context by keyword
This enables agents to maintain continuity across disconnected sessions.
State Persistence Mechanisms
Structured Note-Taking
After each task, the agent calls save_note_to_memory with:
- Title
- Summary
- Optional tags
Compaction
Older turns are summarized into bullet points, preserving intent and constraints while reducing token load.
Just-in-Time Retrieval
Only load notes matching the current goal, keeping the context window sharp.
Tool Initialization Pattern
Tools are registered declaratively with input schemas. The orchestrator retrieves relevant prior context before presenting the planning prompt, ensuring the agent has situational awareness from past work.
Implications for CODITECT
- Our
MEMORY-CONTEXT/aligns with this pattern (sessions/, checkpoints/) - Component activation status should be loaded "just-in-time" at session start
init.shshould call equivalent ofensureMemory()for component directories- Activation history can be compacted (only recent changes + current state)
- Memory retrieval can identify which components were used in past sessions
Impact Analysis on CODITECT Framework
Current CODITECT Architecture
Existing Components
| Component | Lines/Size | Purpose |
|---|---|---|
ComponentActivator | 567 lines | Loads 288 components from registries |
framework-registry.json | 117KB | Metadata for 60 agents, all skills, 89 commands |
scripts/init.sh | ~100 lines | Environment initialization |
scripts/activate-all-components.py | ~200 lines | Manual activation workflow |
Gap: No automatic component activation on session start.
Alignment with Anthropic Patterns
What We Already Have (90% Alignment)
✅ Filesystem-based component storage - .claude/agents/, .claude/skills/, .claude/commands/
✅ Metadata registry - framework-registry.json similar to SDK discovery metadata
✅ Init script - scripts/init.sh for environment setup
✅ Session context preservation - MEMORY-CONTEXT/ system
✅ Git-based state tracking - Checkpoint system with git commits
✅ Configuration hierarchy - settings.json, settings.local.json
What We're Missing (10% Gap)
❌ Component activation status file - Like feature_list.json, track which components are active
❌ Session startup activation - Load activation status at beginning of each session
❌ setting_sources configuration - Ensure SDK can discover our components
❌ Enhanced init.sh - Add component activation verification
❌ Activation state persistence - JSON file tracking activation changes across sessions
Required Changes
1. Component Activation Status File (P0 - High Impact)
File: .claude/component-activation-status.json
Schema (aligned with feature_list.json pattern)
{
"version": "1.0.0",
"last_updated": "2025-11-29T10:30:00Z",
"activation_summary": {
"total_components": 288,
"activated": 245,
"deactivated": 43
},
"components": [
{
"type": "agent",
"name": "codi-documentation-writer",
"path": ".claude/agents/codi-documentation-writer.md",
"activated": true,
"activated_at": "2025-11-28T14:20:00Z",
"reason": "Required for documentation generation"
},
{
"type": "skill",
"name": "git-workflow-automation",
"path": ".claude/skills/git-workflow-automation.md",
"activated": true,
"activated_at": "2025-11-29T09:15:00Z",
"reason": "Multi-session git synchronization"
},
{
"type": "command",
"name": "git-sync",
"path": ".claude/commands/git-sync.md",
"activated": false,
"deactivated_at": "2025-11-27T16:45:00Z",
"reason": "Debugging incomplete - reactivate after testing"
}
]
}
Why JSON (not YAML/TOML)
Following Anthropic's reasoning - "the model is less likely to inappropriately change or overwrite JSON files."
Effort: 1-2 hours to design schema + generate initial file from framework-registry.json
2. Enhanced init.sh Script (P0 - Critical)
Current: Basic environment verification (git status, dependencies, etc.)
Enhanced Version (following Anthropic pattern)
#!/bin/bash
# Enhanced init.sh following Anthropic multi-session pattern
set -e
echo "=== CODITECT Session Initialization ==="
# 1. Verify working directory
echo "Working directory: $(pwd)"
# 2. Load component activation status
if [ -f ".claude/component-activation-status.json" ]; then
echo "✓ Loading component activation status..."
ACTIVATED_COUNT=$(jq '.activation_summary.activated' .claude/component-activation-status.json)
TOTAL_COUNT=$(jq '.activation_summary.total_components' .claude/component-activation-status.json)
echo " Components active: $ACTIVATED_COUNT / $TOTAL_COUNT"
else
echo "⚠ No activation status file found. Creating..."
python3 .coditect/scripts/generate-activation-status.py
fi
# 3. Verify critical components activated
echo "✓ Verifying critical components..."
python3 .coditect/scripts/verify-critical-components.py
# 4. Load session context from MEMORY-CONTEXT
if [ -d "MEMORY-CONTEXT/sessions" ]; then
LATEST_SESSION=$(ls -t MEMORY-CONTEXT/sessions/*.json 2>/dev/null | head -1)
if [ -n "$LATEST_SESSION" ]; then
echo "✓ Latest session: $(basename $LATEST_SESSION)"
fi
fi
# 5. Git status check
echo "✓ Git status:"
git status --short | head -10
# 6. Activate components based on project type
echo "✓ Activating project-specific components..."
python3 .coditect/scripts/activate-project-components.py
echo "=== Initialization Complete ==="
Effort: 2-3 hours to enhance existing script + create supporting Python scripts
3. Session Startup Workflow (P0 - Critical)
Pattern (following Anthropic's autonomous coding startup)
# Conceptual workflow - integrate into session start
async def initialize_coditect_session():
"""
Initialize CODITECT session following Anthropic multi-session pattern.
"""
# 1. Verify working directory
cwd = os.getcwd()
print(f"Working directory: {cwd}")
# 2. Load component activation status
activation_file = ".claude/component-activation-status.json"
if os.path.exists(activation_file):
with open(activation_file) as f:
activation_status = json.load(f)
print(f"Components active: {activation_status['activation_summary']['activated']} / "
f"{activation_status['activation_summary']['total_components']}")
else:
print("⚠ No activation status - generating...")
activation_status = generate_initial_activation_status()
# 3. Read git history for context
git_log = subprocess.run(
["git", "log", "--oneline", "-10"],
capture_output=True,
text=True
).stdout
print("Recent git history loaded")
# 4. Load session context from MEMORY-CONTEXT
latest_session = get_latest_session_export()
if latest_session:
print(f"Latest session: {latest_session['session_id']}")
# 5. Run init.sh for environment validation
subprocess.run(["bash", "scripts/init.sh"], check=True)
# 6. Configure ClaudeAgentOptions with activated components
activated_agents = [
c['name'] for c in activation_status['components']
if c['type'] == 'agent' and c['activated']
]
activated_skills = [
c['name'] for c in activation_status['components']
if c['type'] == 'skill' and c['activated']
]
options = ClaudeAgentOptions(
cwd=cwd,
setting_sources=["user", "project", "local"],
allowed_tools=["Skill"] + activated_skills + ["Read", "Write", "Bash"],
# ... other options
)
return options, activation_status
# Usage at session start
options, activation_status = await initialize_coditect_session()
Effort: 1 hour to implement + integrate into existing session management
4. setting_sources Configuration (P0 - Quick Win)
Ensure SDK can discover our components
Update: .claude/settings.json
{
"version": "1.0.0",
"settingSources": ["user", "project", "local"],
"allowedTools": [
"Skill",
"Read",
"Write",
"Bash",
"Grep",
"Glob",
"WebSearch",
"WebFetch"
],
"permissionMode": "manual",
"env": {
"CODITECT_ROOT": "/Users/halcasteel/PROJECTS/coditect-rollout-master/submodules/core/coditect-core",
"CODITECT_REGISTRY": "/Users/halcasteel/PROJECTS/coditect-rollout-master/submodules/core/coditect-core/framework-registry.json"
},
"hooks": {
"preToolUse": "python3 .coditect/scripts/verify-component-activation.py"
}
}
For SDK usage in Python
from claude_agent_sdk import ClaudeAgentOptions
options = ClaudeAgentOptions(
cwd="/Users/halcasteel/PROJECTS/coditect-rollout-master/submodules/core/coditect-core",
setting_sources=["user", "project", "local"], # Discovers .claude/ components
allowed_tools=["Skill", "Read", "Write", "Bash"] # Security allowlist
)
Effort: 30 minutes to update configuration files
5. Activation State Persistence (P1 - Medium Impact)
Track component activation changes across sessions (like git commits for features)
Implementation
def update_component_activation(component_name, activated, reason):
"""
Update component activation status with timestamp and reason.
Follows pattern of feature_list.json with controlled modifications.
"""
status_file = ".claude/component-activation-status.json"
with open(status_file, 'r') as f:
status = json.load(f)
# Find component
for component in status['components']:
if component['name'] == component_name:
# Only modify activation fields (like passes in feature_list.json)
component['activated'] = activated
component['activated_at' if activated else 'deactivated_at'] = datetime.utcnow().isoformat() + 'Z'
component['reason'] = reason
break
# Update summary counts
status['activation_summary']['activated'] = sum(
1 for c in status['components'] if c['activated']
)
status['activation_summary']['deactivated'] = sum(
1 for c in status['components'] if not c['activated']
)
status['last_updated'] = datetime.utcnow().isoformat() + 'Z'
# Save atomically
tmp_file = status_file + '.tmp'
with open(tmp_file, 'w') as f:
json.dump(status, f, indent=2)
os.replace(tmp_file, status_file)
# Git commit the change
subprocess.run(["git", "add", status_file], check=True)
subprocess.run([
"git", "commit", "-m",
f"{'Activate' if activated else 'Deactivate'} component: {component_name}\n\nReason: {reason}"
], check=True)
print(f"✓ Component {component_name} {'activated' if activated else 'deactivated'}")
Effort: 1-2 hours to implement + test
Summary of Required Changes
| Change | Priority | Effort | Impact | Dependencies |
|---|---|---|---|---|
| Component activation status file | P0 | 1-2h | High | None |
| Enhanced init.sh | P0 | 2-3h | High | Activation status file |
| Session startup workflow | P0 | 1h | High | Init script, activation status |
| setting_sources configuration | P0 | 30m | Medium | None |
| Activation state persistence | P1 | 1-2h | Medium | Activation status file |
| Total | P0/P1 | 5.5-7.5h | High | None external |
Implementation Roadmap
Phase 1: Foundation (2-3 hours) - P0
Goal: Establish component activation tracking infrastructure
Tasks
-
Design activation status schema (30 min)
- Review
framework-registry.jsonstructure - Design JSON schema following
feature_list.jsonpattern - Document field definitions and constraints
- Review
-
Generate initial activation status file (1 hour)
- Write
scripts/generate-activation-status.py - Parse
framework-registry.json - Create
.claude/component-activation-status.json - Validate JSON structure
- Write
-
Update settings.json configuration (30 min)
- Add
setting_sourcesconfiguration - Configure
allowed_toolsfor component types - Add environment variables for CODITECT paths
- Test configuration loading
- Add
-
Commit baseline (15 min)
- Git add new files
- Commit with descriptive message
- Verify clean state
Success Criteria
- ✅
.claude/component-activation-status.jsonexists with all 288 components - ✅
.claude/settings.jsonhassetting_sourcesconfigured - ✅ JSON schema validated
- ✅ Committed to git
Phase 2: Session Initialization (2-3 hours) - P0
Goal: Automatic component activation on session start
Tasks
-
Enhance init.sh script (1.5 hours)
- Add activation status loading
- Add component count reporting
- Add critical component verification
- Add project-specific component activation
- Test script execution
-
Create supporting Python scripts (1 hour)
scripts/verify-critical-components.py- Check essential components activescripts/activate-project-components.py- Activate components by project type- Test each script independently
-
Implement session startup workflow (30 min)
- Create
scripts/session-startup.py - Integrate init.sh call
- Load activation status
- Configure ClaudeAgentOptions
- Test end-to-end workflow
- Create
-
Document workflow (30 min)
- Update
docs/CLAUDE-4.5-BEST-PRACTICES.md - Add session initialization guide
- Include code examples
- Document troubleshooting steps
- Update
Success Criteria
- ✅
scripts/init.shloads and reports activation status - ✅ Critical components verified on startup
- ✅ Session startup workflow functional
- ✅ Documentation complete
Phase 3: Activation Management (1-2 hours) - P1
Goal: Track activation changes with git history
Tasks
-
Implement activation update function (1 hour)
- Create
scripts/update-component-activation.py - Add timestamp tracking
- Add reason documentation
- Implement atomic file updates
- Add git commit integration
- Create
-
Create CLI interface (30 min)
- Add argument parsing
- Add activation/deactivation commands
- Add status query command
- Add help documentation
-
Test activation workflow (30 min)
- Activate test component
- Verify JSON updated
- Verify git commit created
- Deactivate component
- Verify state changes
Success Criteria
- ✅ Can activate/deactivate components via CLI
- ✅ Changes tracked in git history
- ✅ Timestamps and reasons documented
- ✅ Atomic updates prevent corruption
Phase 4: Validation & Documentation (30-60 min) - P1
Goal: Ensure alignment with Anthropic patterns
Tasks
-
Cross-reference with Anthropic docs (15 min)
- Review all implemented patterns
- Verify naming conventions
- Check file structures
- Validate JSON schemas
-
Integration testing (30 min)
- Full session startup test
- Component activation workflow
- Multi-session continuity
- Error handling
-
Update documentation (15 min)
- Update
.claude/CLAUDE.md - Update
README.md - Add to
docs/CLAUDE-4.5-BEST-PRACTICES.md - Update training materials
- Update
Success Criteria
- ✅ All patterns align with Anthropic docs
- ✅ Integration tests passing
- ✅ Documentation complete
- ✅ Ready for production use
Code Examples
1. Enhanced init.sh (Full Implementation)
#!/bin/bash
# Enhanced init.sh following Anthropic multi-session pattern
# CODITECT Framework Session Initialization
set -e
echo "=== CODITECT Session Initialization ==="
echo ""
# 1. Verify working directory
echo "📁 Working Directory"
echo " Path: $(pwd)"
EXPECTED_DIR="/Users/halcasteel/PROJECTS/coditect-rollout-master/submodules/core/coditect-core"
if [ "$(pwd)" != "$EXPECTED_DIR" ]; then
echo " ⚠ Warning: Not in expected directory"
echo " Expected: $EXPECTED_DIR"
fi
echo ""
# 2. Load component activation status
echo "🔧 Component Activation Status"
ACTIVATION_FILE=".claude/component-activation-status.json"
if [ -f "$ACTIVATION_FILE" ]; then
echo " ✓ Loading activation status..."
ACTIVATED_COUNT=$(jq '.activation_summary.activated' "$ACTIVATION_FILE")
TOTAL_COUNT=$(jq '.activation_summary.total_components' "$ACTIVATION_FILE")
LAST_UPDATED=$(jq -r '.last_updated' "$ACTIVATION_FILE")
echo " Components: $ACTIVATED_COUNT / $TOTAL_COUNT activated"
echo " Last updated: $LAST_UPDATED"
else
echo " ⚠ No activation status file found"
echo " Creating initial activation status..."
python3 scripts/generate-activation-status.py
echo " ✓ Created: $ACTIVATION_FILE"
fi
echo ""
# 3. Verify critical components activated
echo "✅ Critical Component Verification"
python3 scripts/verify-critical-components.py
echo ""
# 4. Load session context from MEMORY-CONTEXT
echo "💾 Session Context"
if [ -d "MEMORY-CONTEXT/sessions" ]; then
SESSION_COUNT=$(ls MEMORY-CONTEXT/sessions/*.json 2>/dev/null | wc -l | tr -d ' ')
if [ "$SESSION_COUNT" -gt 0 ]; then
LATEST_SESSION=$(ls -t MEMORY-CONTEXT/sessions/*.json 2>/dev/null | head -1)
echo " Total sessions: $SESSION_COUNT"
echo " Latest: $(basename $LATEST_SESSION)"
else
echo " No previous sessions found"
fi
else
echo " ⚠ MEMORY-CONTEXT/sessions directory not found"
fi
echo ""
# 5. Git status check
echo "📊 Git Status"
if git rev-parse --git-dir > /dev/null 2>&1; then
BRANCH=$(git branch --show-current)
echo " Branch: $BRANCH"
# Show uncommitted changes
CHANGES=$(git status --short | wc -l | tr -d ' ')
if [ "$CHANGES" -gt 0 ]; then
echo " ⚠ Uncommitted changes: $CHANGES files"
git status --short | head -10 | sed 's/^/ /'
if [ "$CHANGES" -gt 10 ]; then
echo " ... and $(($CHANGES - 10)) more"
fi
else
echo " ✓ Working tree clean"
fi
# Show recent commits
echo " Recent commits:"
git log --oneline -3 | sed 's/^/ /'
else
echo " ⚠ Not a git repository"
fi
echo ""
# 6. Activate project-specific components
echo "🚀 Project-Specific Component Activation"
python3 scripts/activate-project-components.py
echo ""
# 7. Environment validation
echo "🌍 Environment Validation"
echo " Python: $(python3 --version 2>&1 | sed 's/Python //')"
echo " Node: $(node --version 2>&1 || echo 'Not installed')"
echo " Git: $(git --version | sed 's/git version //')"
# Check for jq (required for JSON parsing)
if ! command -v jq &> /dev/null; then
echo " ⚠ jq not installed (required for JSON parsing)"
echo " Install: brew install jq"
fi
echo ""
echo "=== ✅ Initialization Complete ==="
echo ""
echo "Ready to start CODITECT session!"
echo "Use 'python3 scripts/session-startup.py' to configure agent options."
2. component-activation-status.json Schema
{
"$schema": "http://json-schema.org/draft-07/schema#",
"title": "CODITECT Component Activation Status",
"description": "Tracks which components are activated across sessions (following Anthropic feature_list.json pattern)",
"type": "object",
"required": ["version", "last_updated", "activation_summary", "components"],
"properties": {
"version": {
"type": "string",
"description": "Schema version for compatibility",
"pattern": "^\\d+\\.\\d+\\.\\d+$"
},
"last_updated": {
"type": "string",
"description": "ISO 8601 timestamp of last modification",
"format": "date-time"
},
"activation_summary": {
"type": "object",
"required": ["total_components", "activated", "deactivated"],
"properties": {
"total_components": {
"type": "integer",
"minimum": 0
},
"activated": {
"type": "integer",
"minimum": 0
},
"deactivated": {
"type": "integer",
"minimum": 0
}
}
},
"components": {
"type": "array",
"items": {
"type": "object",
"required": ["type", "name", "path", "activated"],
"properties": {
"type": {
"type": "string",
"enum": ["agent", "skill", "command", "hook", "plugin"]
},
"name": {
"type": "string",
"description": "Unique component name"
},
"path": {
"type": "string",
"description": "Relative path from CODITECT root"
},
"activated": {
"type": "boolean",
"description": "Current activation state (like passes in feature_list.json)"
},
"activated_at": {
"type": "string",
"format": "date-time",
"description": "When component was last activated"
},
"deactivated_at": {
"type": "string",
"format": "date-time",
"description": "When component was last deactivated"
},
"reason": {
"type": "string",
"description": "Why component was activated/deactivated"
},
"dependencies": {
"type": "array",
"items": {
"type": "string"
},
"description": "Component names this depends on"
},
"tags": {
"type": "array",
"items": {
"type": "string"
},
"description": "Categorization tags"
}
}
}
}
}
}
3. Session Startup Workflow (Python)
#!/usr/bin/env python3
"""
Session Startup Workflow
Follows Anthropic multi-session pattern for component activation
"""
import os
import json
import subprocess
from datetime import datetime
from pathlib import Path
from typing import Dict, List, Optional
# Try to import Claude SDK (optional - graceful degradation)
try:
from claude_agent_sdk import ClaudeAgentOptions
SDK_AVAILABLE = True
except ImportError:
SDK_AVAILABLE = False
print("⚠ Claude Agent SDK not installed - skipping SDK configuration")
class SessionInitializer:
"""Initialize CODITECT session following Anthropic patterns."""
def __init__(self, cwd: Optional[Path] = None):
self.cwd = cwd or Path.cwd()
self.activation_file = self.cwd / ".claude" / "component-activation-status.json"
self.activation_status = None
def verify_working_directory(self) -> bool:
"""Verify we're in the correct working directory."""
print(f"📁 Working directory: {self.cwd}")
# Check for .coditect or .claude directory
if not (self.cwd / ".claude").exists() and not (self.cwd / ".coditect").exists():
print("⚠ Warning: No .claude or .coditect directory found")
return False
return True
def load_activation_status(self) -> Dict:
"""Load component activation status (like feature_list.json)."""
print("\n🔧 Loading component activation status...")
if not self.activation_file.exists():
print("⚠ No activation status file found - generating...")
self.generate_activation_status()
with open(self.activation_file) as f:
self.activation_status = json.load(f)
summary = self.activation_status['activation_summary']
print(f" Components: {summary['activated']} / {summary['total_components']} activated")
print(f" Last updated: {self.activation_status['last_updated']}")
return self.activation_status
def generate_activation_status(self):
"""Generate initial activation status from framework-registry.json."""
# This would parse framework-registry.json and create activation status
# Placeholder - actual implementation in scripts/generate-activation-status.py
print(" Running scripts/generate-activation-status.py...")
subprocess.run(
["python3", "scripts/generate-activation-status.py"],
cwd=self.cwd,
check=True
)
def load_git_context(self) -> Dict:
"""Load recent git history for context."""
print("\n📊 Loading git context...")
try:
# Get current branch
branch = subprocess.run(
["git", "branch", "--show-current"],
cwd=self.cwd,
capture_output=True,
text=True,
check=True
).stdout.strip()
# Get recent commits
log = subprocess.run(
["git", "log", "--oneline", "-10"],
cwd=self.cwd,
capture_output=True,
text=True,
check=True
).stdout.strip()
# Get uncommitted changes
status = subprocess.run(
["git", "status", "--short"],
cwd=self.cwd,
capture_output=True,
text=True,
check=True
).stdout.strip()
print(f" Branch: {branch}")
print(f" Recent commits: {len(log.splitlines())}")
if status:
print(f" ⚠ Uncommitted changes: {len(status.splitlines())} files")
return {
"branch": branch,
"recent_commits": log.splitlines(),
"uncommitted_changes": status.splitlines() if status else []
}
except subprocess.CalledProcessError as e:
print(f" ⚠ Git error: {e}")
return {}
def load_session_context(self) -> Optional[Dict]:
"""Load latest session export from MEMORY-CONTEXT."""
print("\n💾 Loading session context...")
sessions_dir = self.cwd / "MEMORY-CONTEXT" / "sessions"
if not sessions_dir.exists():
print(" ⚠ No MEMORY-CONTEXT/sessions directory")
return None
# Find latest session file
session_files = sorted(sessions_dir.glob("*.json"), key=os.path.getmtime, reverse=True)
if not session_files:
print(" No previous sessions found")
return None
latest = session_files[0]
print(f" Latest session: {latest.name}")
with open(latest) as f:
return json.load(f)
def run_init_script(self):
"""Run init.sh for environment validation."""
print("\n🚀 Running init.sh...")
init_script = self.cwd / "scripts" / "init.sh"
if not init_script.exists():
print(" ⚠ scripts/init.sh not found")
return
subprocess.run(["bash", str(init_script)], cwd=self.cwd, check=True)
def configure_agent_options(self) -> Optional[object]:
"""Configure ClaudeAgentOptions with activated components."""
if not SDK_AVAILABLE:
print("\n⚠ Claude Agent SDK not available - skipping configuration")
return None
print("\n⚙️ Configuring ClaudeAgentOptions...")
# Get activated components by type
activated = {
'agents': [],
'skills': [],
'commands': [],
'hooks': []
}
for component in self.activation_status['components']:
if component['activated']:
comp_type = component['type']
if comp_type in activated:
activated[comp_type].append(component['name'])
print(f" Activated agents: {len(activated['agents'])}")
print(f" Activated skills: {len(activated['skills'])}")
print(f" Activated commands: {len(activated['commands'])}")
print(f" Activated hooks: {len(activated['hooks'])}")
# Build allowed_tools list
allowed_tools = [
"Skill", # Enable Skills feature
"Read", "Write", "Edit", # File operations
"Bash", "Grep", "Glob", # System operations
"WebSearch", "WebFetch" # Web operations
]
# Configure options
options = ClaudeAgentOptions(
cwd=str(self.cwd),
setting_sources=["user", "project", "local"],
allowed_tools=allowed_tools,
permission_mode="manual"
)
print(" ✓ Options configured")
return options
def initialize(self) -> Dict:
"""Full initialization workflow."""
print("=== CODITECT Session Initialization ===\n")
# 1. Verify working directory
if not self.verify_working_directory():
raise RuntimeError("Invalid working directory")
# 2. Load activation status
activation_status = self.load_activation_status()
# 3. Load git context
git_context = self.load_git_context()
# 4. Load session context
session_context = self.load_session_context()
# 5. Run init script
self.run_init_script()
# 6. Configure agent options
agent_options = self.configure_agent_options()
print("\n=== ✅ Initialization Complete ===\n")
return {
"activation_status": activation_status,
"git_context": git_context,
"session_context": session_context,
"agent_options": agent_options
}
def main():
"""Main entry point."""
initializer = SessionInitializer()
context = initializer.initialize()
# Save initialization context for reference
context_file = Path.cwd() / ".claude" / "session-init-context.json"
with open(context_file, 'w') as f:
# Remove agent_options (not JSON serializable)
json_context = {k: v for k, v in context.items() if k != 'agent_options'}
json.dump(json_context, f, indent=2, default=str)
print(f"Session initialization context saved: {context_file}")
if __name__ == "__main__":
main()
URL Documentation & Sources
Primary Sources
-
Effective harnesses for long-running agents
- Key Sections: Two-agent pattern, feature_list.json, init.sh, session continuity
- Critical Quote: "The key insight here was finding a way for agents to quickly understand the state of work when starting with a fresh context window, which is accomplished with the Claude-progress.txt file alongside the git history."
- Relevance: Direct pattern for our component activation tracking
-
Claude-quickstarts/autonomous-coding
- Key Sections: Implementation code, security.py, file structure
- Critical Quote: "Press Ctrl+C to pause; run the same command to resume"
- Relevance: Concrete implementation example for multi-session workflows
-
- Key Sections: Filesystem discovery, ClaudeAgentOptions, setting_sources
- Critical Quote: "By default, the SDK does not load any filesystem settings."
- Relevance: Configuration requirements for component discovery
-
- Key Sections: Skills activation, allowed_tools, filesystem locations
- Critical Quote: "Unlike subagents (which can be defined programmatically), Skills must be created as filesystem artifacts."
- Relevance: How our Skills should be structured and activated
-
- Key Sections: Tool registration, @tool decorator, naming convention
- Critical Quote: Tool naming follows
mcp__{server_name}__{tool_name}pattern - Relevance: How to register custom components as tools
Supporting Sources
-
- Key Sections: Configuration hierarchy, settings.json structure, hooks
- Critical Quote: "Settings are merged, with more specific settings adding to or overriding broader ones."
- Relevance: How to structure our configuration files
-
Claude Code Configuration Guide
- Key Sections: Practical examples, common patterns
- Relevance: Real-world configuration examples
-
A developer's guide to settings.json
- Key Sections: Detailed field explanations, use cases
- Relevance: Understanding configuration options
-
Claude Agent: Proven 2025 Playbook
- Key Sections: Memory management, context engineering, session initialization
- Critical Quote: "Prior notes loaded from memory files, then merged with current user goal to inform planning"
- Relevance: How to integrate component activation with session context
-
Building agents with the Claude Agent SDK
- Key Sections: High-level architecture, design patterns
- Critical Quote: "The key design principle behind the Claude Agent SDK is to give your agents a computer, allowing them to work like humans do."
- Relevance: Philosophical alignment with our framework goals
Search Results Referenced
-
Anthropic Claude Agent SDK session initialization state persistence 2025
- VentureBeat coverage of multi-session SDK launch
-
Claude Agent SDK component registration tool activation pattern
- DataCamp tutorial on SDK usage
-
Claude Code .Claude directory settings.json configuration initialization
- AI Native Dev guide to configuration
-
Anthropic autonomous coding quickstart init.sh feature_list.json implementation
- Best practices for Claude Code usage
Recommendations
Immediate Actions (Next 24 Hours)
-
Implement component-activation-status.json (P0 - 1-2h)
- Create schema based on feature_list.json pattern
- Generate initial file from framework-registry.json
- Commit to git
-
Update .Claude/settings.json (P0 - 30m)
- Add setting_sources configuration
- Configure allowed_tools for component types
- Add CODITECT environment variables
-
Test current component discovery (P0 - 30m)
- Verify SDK can find our agents/skills/commands
- Check for any filesystem permission issues
- Document current state
Short-Term (Next 48 Hours)
-
Enhance scripts/init.sh (P0 - 2-3h)
- Add activation status loading
- Add component verification
- Test enhanced script
-
Create session startup workflow (P0 - 1h)
- Implement scripts/session-startup.py
- Integrate with init.sh
- Test end-to-end
Medium-Term (Next Week)
-
Implement activation management (P1 - 1-2h)
- Create scripts/update-component-activation.py
- Add git commit integration
- Create CLI interface
-
Update documentation (P1 - 1h)
- Document new workflows in docs/Claude-4.5-BEST-PRACTICES.md
- Update .Claude/Claude.md
- Add training materials
-
Integration testing (P1 - 1h)
- Multi-session workflow testing
- Component activation/deactivation
- Error handling validation
Long-Term Considerations
-
SDK Integration (P2 - Future)
- Consider migrating to ClaudeAgentOptions for session management
- Evaluate programmatic component registration
- Explore custom MCP server for component management
-
Monitoring & Analytics (P2 - Future)
- Track which components are used most frequently
- Identify unused components for deprecation
- Measure activation overhead
Conclusion
Anthropic's multi-session pattern provides a proven, production-ready architecture that aligns 90% with our existing CODITECT framework. The remaining 10% gap can be closed with 5-7 hours of focused implementation:
Core Pattern Alignment
- ✅ Filesystem-based component discovery (we already have .Claude/ structure)
- ✅ JSON-based state tracking (framework-registry.json exists)
- ✅ Git-based session continuity (MEMORY-CONTEXT system operational)
- ✅ Init script pattern (scripts/init.sh exists)
- ❌ Component activation status tracking (need component-activation-status.json)
- ❌ Session startup activation (need enhanced init.sh + startup workflow)
Implementation Priority
- P0 (Critical - 5h): Component activation status file + enhanced init.sh + session startup workflow
- P1 (Important - 2h): Activation management + documentation
- P2 (Future): SDK integration + monitoring
ROI
- Eliminates manual component activation - Currently requires
scripts/activate-all-components.py - Enables seamless multi-session workflows - Components remain active across sessions
- Aligns with official Anthropic patterns - Future-proof for SDK updates
- Improves session startup speed - Only activate needed components
- Provides activation history - Git tracks why/when components activated
Next Step: Begin Phase 1 implementation (component-activation-status.json + settings.json configuration).
Research Completed: November 29, 2025 Total Research Time: ~2 hours Primary Sources: 14 URLs Total Word Count: ~8,500 words Implementation Effort: 5-7 hours (P0), 7-9 hours (P0+P1)
Sources:
- Effective harnesses for long-running agents
- Claude-quickstarts/autonomous-coding
- Agent SDK overview
- Agent Skills in the SDK
- Custom Tools
- Claude Code Settings
- Building agents with the Claude Agent SDK
- Claude Agent: Proven 2025 Playbook
- Claude Code Configuration Guide
- A developer's guide to settings.json
- Anthropic launches Claude Sonnet 4.5 and Agent SDK
- How to Use Claude Agent SDK Tutorial
- Configuring Claude Code
- Claude Code Best Practices