Decide one application. Approving grants the roles that applicant TYPE maps to server-side and consumes a seat — you cannot name a role in this call, which is what makes it safe to hand the admissions desk to a non-operator. An event_admin decides EVERY type, staff included — what an approval may grant is fixed by the table, and no application can ever grant an appointing role (organizer / event_admin); those go through ic_hack_admin_role, operator only. A rejection requires a note; the applicant sees it. `seats_full` on an approval means waitlist them instead. Args: { eid?, application_id, decision: 'approve'|'waitlist'|'reject', note? }. Returns: { ok, application, seats }. Required scope: hack:manage (any tier — the event role is the real gate).
Connector