ワンクリックで
rounds-architecture
Display hexagonal architecture overview with ASCII diagram and key file locations
Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
メニュー
Display hexagonal architecture overview with ASCII diagram and key file locations
Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
SOC 職業分類に基づく
Assess telemetry data — identifies distinct transaction types from an explore query and launches sub-agents to analyze each for instrumentation quality, code efficiency, usage correctness, and skill improvement opportunities
Print available rounds skills, project directory layout, and a brief overview of what rounds does
Exploratory querying of telemetry data — search logs by keyword/metadata, search spans by metadata, and build full transaction trees from trace IDs using the rounds adapter interfaces
Get full details for a single rounds error signature including diagnosis, recent events, and related signatures
Investigate a distributed trace by ID — fetches the full trace, reads source files, and explains the end-to-end code flow
List error signatures in the rounds database, optionally filtered by status
| name | rounds-architecture |
| description | Display hexagonal architecture overview with ASCII diagram and key file locations |
| user_invocable | true |
| args | null |
| generated | true |
| generation_timestamp | "2026-02-13T22:07:37.095Z" |
| generation_version | 2.0 |
| source_project | rounds |
| source_codebase_hash | a44338f108beaf54 |
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.