codemap 0.0.21 — two gates that claimed more confidence than they had

R1-C62 — a contract rule naming something absent was counted as enforced. Rename
a layer, forget codemap.toml, and the gate printed a green tick over a rule that
could no longer fire. The inertness stays (writing a contract ahead of the code
is a documented, legitimate use); the count now carries declared vs applicable
where they differ, the absent names are listed, `applicability` is in the
structured answer always, and `no_phantom_rules = true` makes an absent name a
failure for those who want it. The question came from outside the project — a
third-party repo about requirements that stop being true, run rather than read.

R1-C63 — the answer has a version now. SCHEMA_VERSION versions the artifact and
said nothing in 0.0.20, correctly: the graph was byte-identical while the gate's
output changed completely. On a text diff that is the same picture as the
hash-order defect filed four days earlier, and only a hand-written message told
them apart. ANSWER_FORMAT starts at 1, travels as a trailer on markdown answers
and as a field in every serve/MCP envelope, and a pinned hash over six rendered
surfaces refuses to let the shape move silently.

Verified from PyPI against 0.0.20 on trees carrying the shape of each defect,
under a fixed PYTHONHASHSEED:

  phantom contract      0.0.20: layered (3), independent (1), forbidden (1)
                        0.0.21: layered (3 declared, 0 applicable), … + names
  + no_phantom_rules    0.0.20: exit 0  →  0.0.21: exit 2
  sound contract        one added line: the trailer
  consumer's live tree  one added line: the trailer; verdict exit 0 → exit 0
  graph                 nodes and edges hash identical, schema 0.13 → 0.13

Schema 0.13, tenth release running. Suite 972 → 990.