Completes SPEC §4.8. The prior commit left this as a noted follow-up; a
conformance class without an executable check and a published vector is not a
standard, just an assertion.
- jcp-conformance: `c22_dual_ceilings` registered in checks(), so it runs in the
harness alongside C1-C21 (verified: "✓ C22 dual ceilings: money beside joules,
no rate invented"). It asserts every property §4.8 requires — a joules-only
grant's encoding omits the field entirely; adding a money ceiling changes the
grant's identity; an allow debits both dimensions; money binding while joules
have room denies funds-exceeded and debits neither; the mirror (joules bind,
money has room) denies budget-exceeded; a foreign currency is refused
currency-mismatch rather than converted; an absent ceiling means "joules alone
bound", not zero; and attenuation refuses a raise, a drop, or a
re-denomination while a plain attenuate inherits.
- conformance/v1/dual_ceilings.json: a NEW file (following standing.json's
precedent of one file per feature) carrying the fixed-key dual-ceiling grant
and the three receipts that define C22 — allow / funds-exceeded /
currency-mismatch — plus spent_after {uj:10, minor:300} proving the denials
debited nothing. A cross-language verifier can replay all three.
Verified the backward-compatibility guarantee rather than trusting it:
gen-vectors was run into a temp dir and vectors.json, standing.json, and
meta.json all diffed BYTE-IDENTICAL against the committed copies. Only the new
file is added.
Workspace green (40 suites), clippy clean.
Co-Authored-By: Claude Opus 4.8 <[email protected]>