.claude/skills/rounds-architecture/SKILL.md
Display hexagonal architecture overview with ASCII diagram and key file locations
npx skillsauth add tinkermonkey/rounds rounds-architectureInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Quick-reference skill for understanding the rounds hexagonal architecture, continuous error diagnosis system.
/rounds-architecture
Displays a comprehensive overview of the rounds project architecture including:
This skill helps developers quickly understand:
The skill displays the following information:
┌─────────────────────────────────────────────────────────────┐
│ COMPOSITION ROOT │
│ main.py:1-150 │
│ ┌──────────────────────────────────────────────────────┐ │
│ │ Dependency Injection & Wiring │ │
│ │ - Load Config (config.py) │ │
│ │ - Instantiate Adapters │ │
│ │ - Wire Services │ │
│ │ - Start Run Mode (daemon/cli/webhook) │ │
│ └──────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────┘
│
┌───────────────┼───────────────┐
▼ ▼ ▼
┌────────────────────────────────────────────────────────────┐
│ CORE DOMAIN │
│ core/ (no external deps) │
│ ┌──────────────────────────────────────────────────────┐ │
│ │ Domain Models (models.py:1-100) │ │
│ │ - Signature (frozen dataclass) │ │
│ │ - Diagnosis (immutable) │ │
│ │ - ErrorEvent │ │
│ └──────────────────────────────────────────────────────┘ │
│ ┌──────────────────────────────────────────────────────┐ │
│ │ Ports (ports.py:1-200) │ │
│ │ - TelemetryPort (abstract) │ │
│ │ - StorePort (abstract) │ │
│ │ - DiagnosisPort (abstract) │ │
│ │ - NotificationPort (abstract) │ │
│ └──────────────────────────────────────────────────────┘ │
│ ┌──────────────────────────────────────────────────────┐ │
│ │ Services (orchestration logic) │ │
│ │ - fingerprint.py:1-80 (error fingerprinting) │ │
│ │ - triage.py:1-60 (classification) │ │
│ │ - investigator.py:1-100 (diagnosis orchestration) │ │
│ │ - poll_service.py:1-120 (polling loop) │ │
│ │ - management_service.py:1-80 (CLI/webhook ops) │ │
│ └──────────────────────────────────────────────────────┘ │
└────────────────────────────────────────────────────────────┘
│ │ │
▼ ▼ ▼
┌────────────────────────────────────────────────────────────┐
│ ADAPTER LAYER │
│ adapters/ (port implementations) │
│ ┌──────────────────────────────────────────────────────┐ │
│ │ Telemetry Adapters (adapters/telemetry/) │ │
│ │ - signoz.py:1-150 (SigNoz traces) │ │
│ │ - jaeger.py (Jaeger traces) │ │
│ │ - grafana_stack.py (Grafana Stack) │ │
│ └──────────────────────────────────────────────────────┘ │
│ ┌──────────────────────────────────────────────────────┐ │
│ │ Store Adapters (adapters/store/) │ │
│ │ - sqlite.py:1-180 (SQLite persistence) │ │
│ └──────────────────────────────────────────────────────┘ │
│ ┌──────────────────────────────────────────────────────┐ │
│ │ Diagnosis Adapters (adapters/diagnosis/) │ │
│ │ - claude_code.py:1-130 (LLM analysis) │ │
│ └──────────────────────────────────────────────────────┘ │
│ ┌──────────────────────────────────────────────────────┐ │
│ │ Notification Adapters (adapters/notification/) │ │
│ │ - stdout.py (console output) │ │
│ │ - markdown.py (file reports) │ │
│ │ - github_issues.py (GitHub integration) │ │
│ └──────────────────────────────────────────────────────┘ │
│ ┌──────────────────────────────────────────────────────┐ │
│ │ Scheduler Adapters (adapters/scheduler/) │ │
│ │ - daemon.py (polling orchestration) │ │
│ └──────────────────────────────────────────────────────┘ │
│ ┌──────────────────────────────────────────────────────┐ │
│ │ Webhook Adapters (adapters/webhook/) │ │
│ │ - http_server.py (HTTP server) │ │
│ │ - receiver.py (alert processing) │ │
│ └──────────────────────────────────────────────────────┘ │
│ ┌──────────────────────────────────────────────────────┐ │
│ │ CLI Adapters (adapters/cli/) │ │
│ │ - commands.py (interactive commands) │ │
│ └──────────────────────────────────────────────────────┘ │
└────────────────────────────────────────────────────────────┘
Composition Root:
rounds/main.py - Entry point, dependency wiring, run mode selectionCore Domain:
rounds/core/models.py - Signature, Diagnosis, ErrorEvent (immutable dataclasses)rounds/core/ports.py - Abstract port interfaces (TelemetryPort, StorePort, etc.)rounds/core/fingerprint.py - Error fingerprinting logicrounds/core/triage.py - Error classificationrounds/core/investigator.py - Diagnosis orchestrationrounds/core/poll_service.py - Polling loop coordinatorrounds/core/management_service.py - CLI/webhook operationsConfiguration:
rounds/config.py - Pydantic BaseSettings, environment-based configTelemetry Adapters:
rounds/adapters/telemetry/signoz.py - SigNoz trace queriesrounds/adapters/telemetry/jaeger.py - Jaeger trace queriesrounds/adapters/telemetry/grafana_stack.py - Grafana Stack integrationPersistence Adapters:
rounds/adapters/store/sqlite.py - SQLite signature store (async with aiosqlite)Diagnosis Adapters:
rounds/adapters/diagnosis/claude_code.py - Claude Code LLM integrationNotification Adapters:
rounds/adapters/notification/stdout.py - Console reportingrounds/adapters/notification/markdown.py - File-based reportsrounds/adapters/notification/github_issues.py - GitHub issue creationScheduler Adapters:
rounds/adapters/scheduler/daemon.py - Continuous polling daemonWebhook Adapters:
rounds/adapters/webhook/http_server.py - HTTP server (aiohttp)rounds/adapters/webhook/receiver.py - Alert webhook processingCLI Adapters:
rounds/adapters/cli/commands.py - Interactive CLI commandsTesting:
rounds/tests/fakes/ - Fake implementations of ports for testingrounds/tests/core/ - Domain logic unit testsrounds/tests/adapters/ - Adapter integration testsrounds/tests/integration/ - End-to-end testsCore Domain Rules:
Adapter Layer Rules:
Composition Root Rules:
main.pyUser/External System
│
▼
main.py (Composition Root)
│
├─► config.py (Settings)
│
├─► Adapter Instantiation
│ ├─► TelemetryPort ← SigNozAdapter
│ ├─► StorePort ← SQLiteAdapter
│ ├─► DiagnosisPort ← ClaudeCodeAdapter
│ └─► NotificationPort ← StdoutAdapter
│
├─► Service Instantiation
│ ├─► FingerprintService
│ ├─► TriageService
│ ├─► InvestigatorService
│ └─► PollService
│
└─► Run Mode Selection
├─► Daemon Mode → poll_service.run()
├─► CLI Mode → CLI prompt loop
└─► Webhook Mode → HTTP server.start()
Daemon Mode:
TELEMETRY_BACKEND=signoz RUN_MODE=daemon python -m rounds.main
CLI Mode:
RUN_MODE=cli python -m rounds.main
Webhook Mode:
RUN_MODE=webhook WEBHOOK_PORT=8080 python -m rounds.main
Port-Adapter Pattern:
Dependency Injection:
main.pyImmutable Domain Models:
@dataclass(frozen=True) for all domain entitiesAsync-First I/O:
async def methodsasyncio.to_thread()Configuration as Environment:
.env supportUnit Tests (Domain Logic):
tests/fakes/Integration Tests (Adapters):
Example - Using Fakes:
from rounds.tests.fakes.store import FakeStore
from rounds.core.investigator import InvestigatorService
async def test_investigation():
store = FakeStore()
investigator = InvestigatorService(store=store, ...)
# Test domain logic without SQLite
Environment Variables:
TELEMETRY_BACKEND: "signoz" | "jaeger" | "grafana_stack"STORE_BACKEND: "sqlite" (default)DIAGNOSIS_BACKEND: "claude_code" (default)RUN_MODE: "daemon" | "cli" | "webhook"POLL_INTERVAL_SECONDS: Polling frequency (default: 60)CLAUDE_CODE_BUDGET_USD: Per-diagnosis budget limitDAILY_BUDGET_LIMIT: Daily spending capSee: rounds/config.py:1-100 for complete configuration schema
When running in daemon mode, the system follows this flow:
1. PollService.run() [poll_service.py:45]
↓
2. TelemetryPort.query_recent_errors() [signoz.py:60]
↓
3. FingerprintService.fingerprint() [fingerprint.py:30]
↓
4. StorePort.upsert_signature() [sqlite.py:80]
↓
5. TriageService.should_investigate() [triage.py:25]
↓
6. InvestigatorService.investigate() [investigator.py:50]
↓
7. DiagnosisPort.diagnose() [claude_code.py:40]
↓
8. NotificationPort.send() [stdout.py:20]
To add support for a new telemetry backend:
rounds/adapters/telemetry/myservice.pyasync def query_recent_errors()config.py (e.g., MYSERVICE_API_URL)tests/adapters/telemetry/# View core domain models
cat rounds/core/models.py
# View port interfaces
cat rounds/core/ports.py
# View SQLite adapter implementation
cat rounds/adapters/store/sqlite.py
# View composition root
cat rounds/main.py
# Run tests to see fakes in action
pytest rounds/tests/core/ -v
Benefit 1 - Testability:
Benefit 2 - Flexibility:
Benefit 3 - Maintainability:
This skill was automatically generated from project analysis on 2026-02-13.
testing
Run pytest with coverage and display results
devops
Mark a rounds error signature as resolved after a fix has been deployed
data-ai
Re-run LLM diagnosis for an existing rounds error signature
development
--- name: rounds-patterns description: Show common coding patterns: frozen dataclasses, async ports, immutable collections user_invocable: true args: generated: true generation_timestamp: 2026-02-13T22:09:52.359861Z generation_version: "2.0" source_project: rounds source_codebase_hash: a44338f108beaf54 --- # Rounds Coding Patterns Quick-reference skill for **rounds** project coding patterns and conventions. ## Usage ```bash /rounds-patterns ``` ## Purpose Displays the core coding patterns