| A | Semantic compression | RPC-shaped — one capability per endpoint or GraphQL op, no merges | Some merges, but still mostly RPC | Domain entities exist, relations partial | Compressed, relations cover common navigation; primary filter via search | Task-shaped: capability set tracks user tasks and domain verbs, not paths or mutation list; issue trackers use search + context/dashboard views |
| B | Typed values | Most fields are string | Some select / entity_ref but many _id strings remain | Most FK fields typed, dates typed, enums typed | All FK fields typed, all dates typed, enums typed, blob used where appropriate | Strict typing checklist passes; string_semantics set on every non-trivial string |
| C | Relation utility | No relations | A few one-to-one relations | Many relations but no materialize for scoped sub-resources | All sub-resource URLs have materialize; reverse traversal works | Full relation graph including self-referential parents / children; views: for composed reads where the domain requires it |
| D | Action outputs | Several actions lack provides: or output | Some output.description is generic ("updates resource") | All actions declare projection or side-effect with specific description | Side-effect descriptions name the domain effect concretely | Side-effect descriptions are domain-accurate, projection-action provides: are exact subsets |
| E | Mappings completeness | Capabilities without mappings | All capabilities have mappings, but path / query / body drift | Mappings match spec for most ops | Mappings match spec for all ops; pagination declared where the API paginates | validate --spec passes; pagination, body formats, GraphQL variables all correct |
| F | Views usage | No views: even where the README implies composed reads | views: exist but only as documentation | A views: entry per composed read concept, with transport: view wired | views: cover all composed reads, with relation_outputs: for next-hop nav | Composed reads expose first-class query + get symbols; issue trackers include context + dashboard (or equivalent) views |
| G | Transport evidence | No evidence | Tier 0 only (schema validate) | Tier 1 (Hermit) passes | Tier 1 + Tier 2 (live) pass | Tier 1 + Tier 2 + Tier 3 (sandbox) pass for writes |
| H | Eval coverage | No eval/cases.yaml | Coverage fails (missing buckets) | Coverage passes with minimum cases | Coverage passes with adversarial cases included | Coverage passes with adversarial, multi-step, and pagination-intent cases |
| I | Description hygiene | Descriptions contain REST paths, status codes, bare URLs | Some clean descriptions, some stale | Most descriptions are domain-only | All descriptions are domain-only and agent-facing | Descriptions are concise, imperative, and never restate typed structure |
| J | README quality | Missing or stale | Lists commands only | Documents auth env vars and scope | Adds OpenAPI source path, sandbox info, known limitations | Full README: capability count, auth, OpenAPI source, sandbox info, limitations, example expressions |
| K | Information-flow annotations | Mutating caps with zero flow labels/sinks | data_classes: only; no field labels | Sensitive text fields labeled; some sinks marked | All outbound/destructive inputs have sink_class:; scrub caps have sanitizes: | Closed registry; full label+sink coverage on mutating surface; witness-validated via schema validate |