Mechanism 01 — Trigger
A proposal is born pending, whatever it asks for.
A BEFORE INSERT trigger overwrites the status of every proposed term, and blanks the decision columns, before the row is stored. An assistant can ask for a term to arrive approved. The database writes it as pending anyway — the request never reaches the table as submitted.
create function slip_proposals_force_pending()
returns trigger language plpgsql as $$
begin
new.status := 'proposed';
new.decided_by := null;
new.decided_at := null;
return new;
end;
$$;
-- Fires on every insert, from every caller, including
-- the service role the assistants run as.




