Skip to main content

Nomic Loop Documentation

The Nomic Loop is aragora's autonomous self-improvement system—a society of AI agents that debates and implements improvements to its own codebase.

Note: The nomic loop is experimental. Run it in a sandbox and review changes before auto-commit.

Overview​

The name "nomic" comes from the game of Nomic, where players modify the rules of the game as part of gameplay. Similarly, the nomic loop allows AI agents to propose, debate, and implement changes to aragora itself.

Architecture​

The nomic loop is a 6-phase cycle with two implementations:

Event-driven, robust, checkpoint-resumable. Uses NomicStateMachine with phase handlers.

Legacy Integration​

Phase-based, integrated with aragora features. Uses NomicLoop class for backward compatibility.

┌─────────────────────────────────────────────────────────────────────┐
│ NOMIC LOOP │
├─────────────────────────────────────────────────────────────────────┤
│ │
│ Phase 1: CONTEXT │
│ ├── Claude (Claude Code) ──┐ │
│ ├── Codex (Codex CLI) ├── Explore codebase, read docs │
│ ├── Gemini (Kilo Code) │ │
│ └── Grok (Kilo Code) ──────┘ │
│ │
│ Phase 2: DEBATE │
│ ├── Agents propose improvements based on context │
│ ├── Arena orchestrates critique rounds │
│ └── Agents vote on proposals (weighted by Elo rating) │
│ │
│ Phase 3: DESIGN │
│ ├── Generate implementation design │
│ ├── Identify affected files │
│ └── Safety review (auto-approve or human review) │
│ │
│ Phase 4: IMPLEMENT │
│ ├── Generate code from design │
│ ├── Validate syntax and dangerous patterns │
│ └── Write files with backup │
│ │
│ Phase 5: VERIFY │
│ ├── Syntax check (python -m py_compile) │
│ ├── Import check (python -c "import aragora") │
│ └── Test suite (pytest) │
│ │
│ Phase 6: COMMIT (if all checks pass) │
│ └── Auto-commit with detailed message │
│ │
└─────────────────────────────────────────────────────────────────────┘

Running the Nomic Loop​

Basic Usage​

# Run with streaming dashboard
NOMIC_AUTO_COMMIT=1 python scripts/run_nomic_with_stream.py run --cycles 24 --auto

# Run without streaming
NOMIC_AUTO_COMMIT=1 python scripts/nomic_loop.py --cycles 10 --auto

Command Line Options​

OptionDescriptionDefault
--cycles NNumber of improvement cycles10
--autoAuto-commit successful changes (requires NOMIC_AUTO_COMMIT=1)False
--human-approvalRequire human approval for commitsFalse
--skip-genesisSkip codebase analysisFalse

Safety Gates (Environment)​

VariableDescriptionDefault
NOMIC_AUTO_COMMITAllow --auto commits (must be 1 to enable)0
NOMIC_AUTO_CONTINUEAuto-continue non-interactive runs1
ARAGORA_ENABLE_FORKINGEnable parallel forked debates in the nomic loop0

Approval Workflow​

The nomic loop can require approvals for sensitive changes via aragora/nomic/approval.py. The default policy classifies files into info, review, or critical based on path patterns and enforces votes or timeouts before changes proceed.

Live Dashboard​

The streaming version provides real-time visibility:

  • HTTP Dashboard: http://localhost:8080
  • WebSocket Stream: ws://localhost:8765/ws
  • Public View: https://aragora.ai

Cycle Phases​

Phase 1: Context​

All agents explore the codebase using their respective CLI tools:

  • Claude: Uses Claude Code for deep analysis
  • Codex: Uses OpenAI Codex CLI
  • Gemini: Uses Google's Kilo Code
  • Grok: Uses xAI's Grok CLI (via Kilo Code)

Each agent reads key files and identifies potential improvements. Implemented by ContextPhase class.

Phase 2: Debate​

The Arena orchestrates a structured debate cycle:

  1. Proposal: Agents submit structured proposals
  2. Critique: Each agent critiques other proposals (severity scores 0-1)
  3. Voting: Agents vote on proposals (weighted by Elo rating)
  4. Consensus: Check if threshold is reached
{
"title": "Add semantic caching for debate context",
"description": "Implement vector-based caching to reduce redundant LLM calls",
"impact": "HIGH",
"complexity": "MEDIUM",
"files_affected": ["aragora/debate/orchestrator.py", "aragora/memory/store.py"]
}

Implemented by DebatePhase class with consensus_threshold configuration.

Phase 3: Design​

Generate implementation design from the winning proposal:

  1. Generate Design: Create detailed implementation plan
  2. Identify Files: Determine affected files
  3. Safety Review: Check for protected files and dangerous patterns
  4. Approval: Auto-approve low-risk designs or flag for human review

Implemented by DesignPhase class with auto_approve_threshold configuration.

Phase 4: Implement​

Code generation from the approved design:

  1. Generate Code: Agent produces implementation
  2. Validate Syntax: Check for syntax errors
  3. Check Patterns: Detect dangerous code patterns
  4. Write Files: Create backup and write changes
# Example: Claude implements
claude-code --task "Implement the approved proposal" --context proposal.json

Implemented by ImplementPhase class with backup/rollback support.

Test Generation​

The nomic loop can generate tests from specifications using the TDD helpers in aragora/nomic/test_generator.py, producing unit and edge-case tests alongside implementation steps.

Phase 5: Verify​

Three-stage verification:

  1. Syntax Check: python -m py_compile on all modified files
  2. Import Check: python -c "import aragora" ensures no broken imports
  3. Test Suite: pytest tests/ must pass (currently 34,400+ tests)

Implemented by VerifyPhase class. Triggers rollback on failure.

Phase 6: Commit​

If all checks pass:

git add -A
git commit -m "feat(nomic): <title>

<description>

Proposed by: <agent>
Approved by: <voters>
Cycle: N

🤖 Generated with [Claude Code](https://claude.com/claude-code)"

Implemented by CommitPhase class.

Python API​

Using NomicLoop (Legacy)​

from aragora.nomic import NomicLoop

# Create loop with agents
loop = NomicLoop(
aragora_path="/path/to/project",
agents=agents,
max_cycles=10,
auto_commit=True,
)

# Run cycles
await loop.run()

# Or run a single cycle
result = await loop.run_cycle()
from aragora.nomic import (
NomicStateMachine,
create_nomic_state_machine,
create_handlers,
NomicState,
)

# Create with factory
state_machine = create_nomic_state_machine(
aragora_path="/path/to/project",
agents=agents,
)

# Or create manually with handlers
handlers = create_handlers(aragora_path, agents)
state_machine = NomicStateMachine(handlers=handlers)

# Run the loop
await state_machine.run()

Phase Classes​

Each phase can be used independently:

from aragora.nomic.phases import (
ContextPhase,
DebatePhase,
DesignPhase,
ImplementPhase,
VerifyPhase,
CommitPhase,
)

# Example: Run debate phase
debate = DebatePhase(
aragora_path=path,
claude_agent=claude,
codex_agent=codex,
consensus_threshold=0.66,
)
result = await debate.run(context="Improve error handling")

# Example: Run design phase
design = DesignPhase(
aragora_path=path,
claude_agent=claude,
protected_files=["CLAUDE.md", "core_types.py"],
auto_approve_threshold=0.5,
)
result = await design.run(proposal=winning_proposal)

Safety Gates​

from aragora.nomic.gates import (
is_protected_file,
check_change_volume,
check_dangerous_patterns,
check_all_gates,
GateConfig,
)

# Check if file is protected
if is_protected_file("CLAUDE.md"):
print("Cannot modify protected file")

# Check change volume
result = check_change_volume(
files_changed=15,
max_files=20,
lines_added=500,
lines_removed=100,
max_lines=1000,
)

# Check all gates at once
config = GateConfig(max_files=10, max_lines=500)
result = check_all_gates({
"files": ["a.py", "b.py"],
"code": "import os\nos.system('echo hello')",
"estimated_duration": 300,
})

State Management​

State File​

Located at .nomic/nomic_state.json:

{
"phase": "verify",
"stage": "complete",
"cycle": 3,
"all_passed": true,
"features_integrated": {
"Phase 1": ["ContinuumMemory", "ReplayRecorder", ...],
"Phase 2": ["ConsensusMemory", "InsightExtractor"],
...
}
}

Checkpoints​

The CheckpointManager saves state for crash recovery:

checkpoint.save("debate-123", {
"phase": "debate",
"round": 2,
"messages": [...],
"votes": [...]
})

Resume after crash:

python scripts/run_nomic_with_stream.py run --resume

Backups​

Before each cycle, critical files are backed up:

.nomic/backups/
├── backup_cycle_1_20260103_120000/
│ ├── scripts/nomic_loop.py
│ ├── aragora/core_types.py
│ └── ...
└── backup_cycle_2_20260103_130000/
└── ...

Agent Specialization​

Each agent has a persona that evolves based on success:

AgentRoleSpecialization
ClaudeVisionaryArchitecture, design patterns
CodexEngineerImplementation, performance
GeminiStrategistProduct vision, viral growth
GrokLateral ThinkerCreative solutions, edge cases

Personas are managed by PersonaManager and evolve via PersonaLaboratory.

Structured Thinking Protocols​

Each agent uses a specialized thinking protocol to ensure high-quality proposals:

Claude (Visionary Architect)​

1. EXPLORE: Understand current state - read files, trace code paths
2. PLAN: Design approach before implementing - consider alternatives
3. REASON: Show thinking step-by-step - explain tradeoffs
4. PROPOSE: Make concrete, actionable proposals with clear impact

Uses Claude Code's Explore/Plan modes for deep codebase understanding.

Codex (Pragmatic Engineer)​

1. TRACE: Follow code paths to understand dependencies and data flow
2. ANALYZE: Identify patterns, anti-patterns, and improvement opportunities
3. DESIGN: Consider multiple implementation approaches with pros/cons
4. VALIDATE: Think about edge cases, tests, and failure modes

Shows reasoning chains: "I observed X → which implies Y → so we should Z"

Gemini (Product Strategist)​

1. EXPLORE: Understand current state - what exists, what's missing
2. ENVISION: Imagine the ideal outcome - what would success look like
3. REASON: Show thinking step-by-step - explain tradeoffs
4. PROPOSE: Make concrete, actionable proposals with clear impact

Focuses on viral growth potential and developer excitement.

Grok (Lateral Synthesizer)​

1. DIVERGE: Generate multiple unconventional perspectives
2. CONNECT: Find surprising links between disparate ideas
3. SYNTHESIZE: Combine insights into novel, coherent proposals
4. GROUND: Anchor creative ideas in practical implementation

Shows lateral thinking: "Others see X, but what if Y..."

Integrated Features​

The nomic loop integrates all 30+ features:

Memory Systems​

  • ContinuumMemory (multi-timescale)
  • MemoryStream (per-agent)
  • ConsensusMemory (topic tracking)
  • SemanticRetriever (embeddings)

Evolution​

  • PersonaManager (traits)
  • PromptEvolver (system prompts)
  • PersonaLaboratory (A/B testing)
  • EloSystem (skill tracking)

Verification​

  • ProofExecutor (code verification)
  • FormalVerificationManager (Z3)
  • ReliabilityScorer (confidence)

Resilience​

  • CheckpointManager (crash recovery)
  • BreakpointManager (human intervention)
  • DebateTracer (audit logs)

Monitoring​

Logs​

Main log at .nomic/nomic_loop.log:

=== NOMIC LOOP STARTED: 2026-01-03T13:52:49 ===
[13:52:50] NOMIC CYCLE 1
[13:52:50] [replay] Recording cycle 1
[13:52:50] [persona] claude-visionary: balanced
[13:52:54] claude (Claude Code): exploring codebase...

Metrics​

Track via the dashboard or logs:

  • Consensus rate per cycle
  • Average rounds to convergence
  • Test pass rate
  • Feature implementation success rate

Troubleshooting​

Loop Stuck in Phase​

Check if an agent CLI tool is hung:

ps aux | grep -E "claude|codex|kilo"

Kill and resume:

pkill -f "codex exec"
python scripts/run_nomic_with_stream.py run --resume

Tests Failing​

  1. Check the specific failure in .nomic/nomic_loop.log
  2. Rollback to last backup if needed
  3. Run tests manually: pytest tests/ -v

Checkpoint Corruption​

Reset state:

rm .nomic/nomic_state.json
rm .nomic/checkpoints.db

Best Practices​

  1. Run with --auto for autonomous operation
  2. Monitor the live dashboard for real-time visibility
  3. Review commits even with auto-commit (can revert)
  4. Set cycle limits appropriate for the task
  5. Use human-approval for critical codebases