Files
AirCoding/AirPlan/docs/architecture/error-taxonomy-v1.md
AirCoding 33a76a1ebc Move project from external drive to local NVMe
迁移路径: /run/media/airlongdian/EasyU/AirCoding -> /home/airlongdian/DataDevices/AirWorkSpace/AirCoding

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-06-02 09:51:49 +08:00

301 lines
9.4 KiB
Markdown
Executable File

# AirCoding Error Taxonomy V1
Date: 2026-05-27
Status: Canonical error taxonomy for V1.0.0 Alpha skeleton
This document defines error kinds, severity, retryability, failure signatures, user-facing presentation, and routing rules.
## 1. Goals
The error taxonomy must support:
1. Consistent ToolResult and WorkerResult failures.
2. Scheduler retry/block/skip decisions.
3. User-facing concise errors.
4. Developer diagnostic detail.
5. Stable semantic signatures for repeated failure detection.
6. Safe distinction between implementation failure and architecture/product blockers.
## 2. Core Error Contract
```ts
type ErrorKind =
| "user_error"
| "project_error"
| "env_error"
| "dependency_error"
| "permission_error"
| "tool_error"
| "command_error"
| "build_error"
| "test_error"
| "static_analysis_error"
| "debug_error"
| "provider_error"
| "model_capability_error"
| "context_error"
| "agent_error"
| "scheduler_error"
| "workspace_error"
| "merge_error"
| "architecture_error"
| "policy_error"
| "system_error"
| "unknown_error"
type ErrorSeverity = "info" | "warning" | "error" | "fatal"
type Retryability = "retryable" | "retryable_after_change" | "not_retryable" | "unknown"
interface AirError {
error_id: string
kind: ErrorKind
severity: ErrorSeverity
message: string
detail?: string
retryability: Retryability
semantic_signature: string
cause_ref?: EntityRef
cause_refs?: EntityRef[]
user_action?: string
metadata?: Record<string, unknown>
}
```
## 3. Error Kind Semantics
| Kind | Meaning | Default route |
|---|---|---|
| `user_error` | invalid/contradictory user input or cancelled decision | Main Agent |
| `project_error` | project structure/config issue | Main Agent or Doctor |
| `env_error` | local environment missing/broken | Doctor |
| `dependency_error` | missing or incompatible dependency | Doctor/PermissionEngine |
| `permission_error` | action denied or needs confirmation | PermissionEngine/Main Agent |
| `tool_error` | tool implementation or validation failure | Scheduler/Debugger |
| `command_error` | shell process failed outside build/test classification | Scheduler/Debugger |
| `build_error` | build/configure/compile/link failure | Executor/Debugger |
| `test_error` | test command failed or assertion failed | Executor/Debugger |
| `static_analysis_error` | static analysis found issue or tool failed | Reviewer/Debugger |
| `debug_error` | debugger/instrumentation failed | Debugger/Scheduler |
| `provider_error` | provider API/network/auth/rate failure | Provider layer/Main Agent |
| `model_capability_error` | selected model lacks required feature | Scheduler/provider selector |
| `context_error` | context assembly/compaction/retrieval failure | ContextAssembler/Compactor |
| `agent_error` | worker protocol/crash/result validation issue | Scheduler |
| `scheduler_error` | graph/dispatch/recovery internal issue | Main Agent/developer log |
| `workspace_error` | worktree/copy/workspace setup failure | Scheduler |
| `merge_error` | merge/patch conflict or copy-back failure | Scheduler/Debugger/Architecture Designer |
| `architecture_error` | design/interface mismatch or invalid plan | Architecture Designer |
| `policy_error` | safety/security/policy violation | Main Agent/PermissionEngine |
| `system_error` | OS/resource/filesystem unexpected failure | Scheduler/Doctor |
| `unknown_error` | insufficient classification evidence | Scheduler/Debugger |
## 4. Severity Semantics
| Severity | Meaning | User visibility |
|---|---|---|
| `info` | non-blocking note | usually hidden or progress detail |
| `warning` | degraded path or skipped optional gate | shown in final report |
| `error` | task/tool failed but system can continue/retry | shown when relevant |
| `fatal` | session/graph cannot safely continue | immediately surfaced |
Severity does not imply retryability. A fatal provider outage may be retryable after user changes provider; a low-severity policy denial may be not retryable.
## 5. Retryability Rules
```text
retryable → same strategy may succeed
retryable_after_change → retry only after model/context/command/permission/env/workspace change
not_retryable → route to block/skip/cancel
unknown → first failure can be diagnosed, repeated unknown escalates
```
Default retryability by kind:
| Kind | Default retryability |
|---|---|
| provider_error | retryable or retryable_after_change |
| env_error | retryable_after_change |
| dependency_error | retryable_after_change |
| permission_error | retryable_after_change |
| build_error | retryable_after_change |
| test_error | retryable_after_change |
| merge_error | retryable_after_change |
| architecture_error | not_retryable until architecture decision |
| policy_error | not_retryable unless policy changes |
| agent_error | retryable_after_change |
| scheduler_error | unknown/fatal depending on invariant |
## 6. Semantic Failure Signature
Failure signatures are used for retry-loop detection and debug knowledge.
Signature inputs:
```text
kind
normalized tool/command name
normalized exit code or provider status
primary diagnostic semantic_signature
primary file/module path when relevant
normalized error message class
architecture/policy blocker class when relevant
```
Signature format:
```text
<kind>:<surface>:<class>:<location-or-none>:<hash>
```
Examples:
```text
build_error:cpp.build:undefined_reference:src/foo.cpp:ab12cd34
provider_error:llm.complete:rate_limit:none:91fe2300
merge_error:git.merge_workspace:patch_conflict:src/main.cpp:3344aa90
permission_error:shell.run:system_sensitive:/usr/bin:bb12cc88
```
Do not include volatile data such as timestamps, temp paths, PIDs, random IDs, full absolute home paths, or secret-like strings.
## 7. Mapping to Task Outcomes
| Error kind | Common task outcome |
|---|---|
| build/test/static_analysis | failed, then retry/debug |
| permission | blocked unless policy auto-allows |
| architecture | blocked and route to Architecture Designer |
| provider/model capability | failed or blocked depending fallback availability |
| merge/workspace | failed, retry serial/repair, or blocked |
| env/dependency | blocked or doctor fix task |
| policy | blocked/cancelled |
| agent/scheduler/system | failed or fatal blocked |
WorkerResult status rules:
1. Use `failed` when the task goal was not achieved but Scheduler can decide retry/skip.
2. Use `blocked` when a higher-level decision or external condition is required.
3. Use `cancelled` when explicitly stopped.
4. Do not label architecture/product impossibility as ordinary failure.
## 8. User-Facing Error Presentation
User-facing messages should include:
```text
what failed
why it matters
what AirCoding tried or can try next
whether user decision/action is needed
where evidence/report is stored
```
They should not include:
```text
secrets
raw huge logs
stack traces unless the user asks
irrelevant implementation detail
```
Developer detail goes to `air.developer.log` and artifacts.
## 9. Tool and Command Error Mapping
ToolResult errors must map into `AirError`.
```ts
interface ToolErrorOutput {
error: AirError
partial_output?: unknown
artifact_ids?: string[]
evidence_ref_ids?: string[]
}
```
Command failures are classified by purpose:
| Command purpose | Non-zero exit maps to |
|---|---|
| `build` | `build_error` |
| `test` | `test_error` |
| `doctor` | `env_error` or `dependency_error` |
| `debug` | `debug_error` or diagnosed target error |
| `general` | `command_error` |
## 10. Provider Error Mapping
Provider adapter maps provider-specific failures:
| Provider condition | Error kind |
|---|---|
| auth failure | `provider_error`, not retryable until config change |
| rate limit | `provider_error`, retryable_after_change or retryable after delay |
| model not found | `model_capability_error` or `provider_error` |
| context too large | `context_error` or `model_capability_error` |
| tool use unsupported | `model_capability_error` |
| network timeout | `provider_error`, retryable |
| malformed model output | `provider_error` or `agent_error` depending boundary |
## 11. Policy and Security Errors
Policy errors are not bypassed by retry. They require one of:
```text
user approval within policy
permission/profile change
architecture/task redesign
request refusal/cancellation
```
Security-sensitive details may be summarized in user-facing text and preserved in encrypted developer logs/artifacts when needed.
## 12. Error Events and Persistence
Errors appear in:
```text
tool.failed
command.failed
task.failed
task.blocked
agent.failed
context.compaction.failed
doctor.fix.failed
```
Each failure payload should include canonical `AirError` plus evidence refs:
```text
error.kind
error.message
error.detail when useful
error.retryability
error.semantic_signature
evidence refs
```
Diagnostics table uses `semantic_signature`; not every error is a diagnostic.
## 13. V1.0.0 Alpha Cut Line
V1.0.0 Alpha skeleton must implement:
1. `AirError`, `ErrorKind`, `ErrorSeverity`, `Retryability` contracts.
2. Tool/command/provider error mapping.
3. Semantic failure signature generation.
4. Scheduler retry/block mapping from error kind.
5. User-facing vs developer-detail formatting.
6. Event payload integration for all failure events.
Post-MVP:
```text
learned failure classifier
cross-session duplicate failure clustering
automatic debug knowledge promotion by signature
localized user-facing error text
provider-specific deep error parsers
```