10. Signal Taxonomy and Causal Attribution
A flat friction score (errors × 3 + retries × 2) tells you how much friction happened but not which part of your configuration caused it. On a project running an ACE-v1 loop for ten weeks, this gap produced a misleading priority queue: Bash tool generated 3,377 retries vs 597 for Read vs 254 for Edit. Raw volume pointed at Bash as the problem, but the actual pattern was missing batching instructions, not a bad Bash rule. Without typed signals, a curator fixes the wrong layer.
A note on naming: arXiv:2510.04618 (Stanford/SambaNova, Oct 2025) uses "ACE" for an inference-time context evolution technique. The ACE described here is a config-persistence loop operating across sessions, not within them. Different concept, same acronym. The v2 improvements below apply to this guide's definition.
Signal Categories
Replace the flat score with a five-category taxonomy. Each event gets a category and an attribution candidate.
| Category | Definition | Example |
|---|---|---|
| syntactic | Tool error, parse failure, malformed call | Invalid JSON in tool call |
| semantic | Output rejected by user, retry with clarification | "No, I meant the other format" |
| procedural | Rule conflict, missing step, wrong execution phase | Write-before-Read violation |
| alignment | Tone violation, out-of-scope change, hallucinated claim | Claude adds unrequested refactoring |
| performance | Token overrun, context overflow, /compact forced mid-task | Session degrading at 85% context |
Weighting should reflect impact, not frequency. A single alignment violation in a production-critical flow costs more than 50 syntactic retries on a local script.
Causal Attribution
For each friction event, capture the active context: which rule files were loaded, which skills were invoked, and which profile was active. This lets the Curator build a rule-to-friction correlation table without running LLM-as-judge over the full session history.
# friction-event schema
id: evt_20260519_bash_batching_001
timestamp: "2026-05-19T14:32:00Z"
session_id: "2094ff6d"
category: procedural
tool: Bash
retry_count: 4
description: "Three sequential Bash calls where one batched call would have sufficed"
active_rules:
- .claude/rules/lean-ctx.md
- .claude/rules/bash-safety.md
active_skills: []
profile: default
suspected_cause: "lean-ctx.md missing explicit Bash batching instruction"
resolved: falseStore events as append-only YAML files or newline-delimited JSON. They are the raw material for the Curator; keep them local and gitignore them by default unless your team chooses a shared signal store (see Section 11).
Per-Pattern Tracking
Beyond individual events, track friction by pattern over time. Replace a weekly total with a dict:
friction_patterns:
week: "2026-W20"
write_before_read: 10
gitignore_violation: 10
exit_code_1_unchecked: 38
bash_no_batching: 47
permission_denied_hook: 12The pattern time series is what lets you measure whether a merged rule had any effect. Without it, you are guessing.