一键导入
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.