-- Release matrix, version 1. Fixed by #14. -- -- A rule change is a NEW VERSION, never an UPDATE. Without the version history -- a past release cannot be reconstructed when an award is protested — the one -- thing the function form of these rules costs. -- -- Mirrored in src/release/matrix.ts, which the evaluation surface renders its -- dimmed cells from. The screen and the policy must not be able to disagree. INSERT INTO release_matrix (version, class, level, released) VALUES -- Non-content pre-bid signal: who opened, who acknowledged, who intends to -- bid. This is what #12 actually promised the retailer, and it is the reason -- sealing response content costs them nothing they were counting on. (1, 'vendor_identity', 'invited', 'true'), (1, 'participation_signal', 'invited', 'true'), -- Exact quantities behind the acknowledgement gate. The coarse volume band -- stays in the teaser (#14 decision 4). (1, 'scenario_quantity', 'acknowledged', 'true'), -- Sealed until the deadline, then the whole field at once. (1, 'answer_text', 'open', 'true'), (1, 'exception_text', 'open', 'true'), (1, 'vault_document', 'open', 'true'), (1, 'price_quote', 'open', 'true'), (1, 'derived_cost', 'open', 'true'), -- A vendor's own scoring, released to them at award. They never see anything -- of the field — no count, no identities, no rank including their own. (1, 'own_scoring', 'awarded', 'true'); -- TWO-ENVELOPE, deferred not declined: moving price_quote and derived_cost to a -- level reached only after scoring locks is a version bump here plus an -- irreversible lock transition. That is the point of choosing a matrix over -- lifecycle logic written inline in each policy.