What Changed
String-format rubric items in `kb.yaml` are no longer matched by regex. The legacy regex path (`RUBRIC_CHECKERS`, `match_rubric_item()`, `is_already_covered()`) has been removed.
Rubric items must now be either:
Available Checkers
| Checker | Params | What it checks |
|---------|--------|----------------|
| `descriptive_title` | — | Title is not generic (TODO, Untitled, etc.) |
| `has_tags` | — | Entry has at least one tag |
| `has_outlinks` | — | Entry links to another entry (stubs exempt) |
| `status_present` | — | Entry has a status value |
| `priority_present` | — | Entry has `priority` in metadata |
| `has_field` | `field:
How to Migrate
For each string item in your `kb.yaml` `evaluation_rubric`:
1. If a checker exists — convert to named format: ```yaml # Before - "Component specifies its filesystem path"
# After - checker: has_field params: field: path text: "Component specifies its filesystem path" ```
2. If no checker applies — leave as a plain string for LLM judgment: ```yaml - "ADR explains the rationale for the chosen approach" ```
3. If already enforced by schema validation — mark as schema-covered: ```yaml - text: "Entry body is non-empty" covered_by: schema ```
Verifying Migration
```bash