RF-17 — Gate staleness declarations overstate runtime semantics

State: fixed 2026-08-27 Repair shape: contract cleanup or feature decision
Severity: low

Finding

The review-gate contract presents staleness: as the policy deciding when an accepted review becomes stale. Forty-two live gates declare the field: forty-one use changed, and title/body alignment uses rewrite(0.5). Runtime freshness does not read the field; every note or criterion text change is exact-hash stale.

Evidence

  • The former review-gate type described staleness: changed | always | ... as operative policy.
  • Title/body alignment formerly declared rewrite(0.5).
  • Registered implementation search finds staleness decisions in hash comparison, not gate-frontmatter consumption.

Why it matters

This is a false system-definition affordance. Authors can believe a policy is enforced when it is only decorative metadata.

Provisional repair direction

For the low-cost correction, make the contract state the current exact-change semantics and remove or normalize unsupported values. Retain an extensible field only if a concrete second policy has an accepted consumer and tests.

Done when

  • Every admitted value has one documented runtime meaning and consumer.
  • The title/body gate no longer claims an unenforced threshold.
  • Validator, type contract, gate files, and selector tests agree.

Resolution

changed is now the only supported gate-staleness declaration. The review-gate schema admits only that value, catalog resolution rejects missing or different values, and the type and review-system contracts state that it names the system-wide exact-text rule rather than a per-gate tuning surface. The title/body-alignment gate now declares changed. Regression tests cover schema and resolver rejection of rewrite(0.5) and prove that a single-character note edit stales an accepted pair under the supported policy.