8. Admin Quorum · Approval Group

Q / Q+O / AG 라벨의 영속화 + Owner counting rule + 7-day expiry

Admin Quorum

Workspace · Policy 변경의 다수결 승인 그룹. Owner / Admin / Non-Signing Admin / Security Admin 이 멤버 자격.

CREATE TABLE admin_quorums (
  id             BINARY(16) PRIMARY KEY,
  workspace_id   BINARY(16) NOT NULL UNIQUE,  -- workspace 당 1개
  threshold      INT NOT NULL,                 -- N of M (Owner 포함 가능)
  created_at     DATETIME(6) NOT NULL,
  changed_at     DATETIME(6) NOT NULL,          -- 변경은 Q+O
  FOREIGN KEY (workspace_id) REFERENCES workspaces(id)
);

CREATE TABLE admin_quorum_members (
  quorum_id  BINARY(16) NOT NULL,
  user_id    BINARY(16) NOT NULL,
  joined_at  DATETIME(6) NOT NULL,
  PRIMARY KEY (quorum_id, user_id),
  FOREIGN KEY (quorum_id) REFERENCES admin_quorums(id),
  FOREIGN KEY (user_id) REFERENCES users(id)
);

Owner Counting Rule

add-users.md, p.1 직접 인용 (Stage 2 ANSWERED)

Q 또는 Q+O 흐름에서 Owner 의 승인은 mandatory 이며 threshold count 에 포함될 수 있다. 예: threshold 가 3 of 5 일 때:

  • 2 Admins + Owner = 충족 (Owner 카운트 포함)
  • 3 Admins = 미충족; Owner 의 추가 승인 전까지 거부

Approval Group (AG)

일부 작업을 Owner 없이도 가능하게 위임하는 별개 메커니즘. Settings > Quorums > Approval groups 에서 작업별로 Owner 요구 토글.

CREATE TABLE approval_groups (
  id           BINARY(16) PRIMARY KEY,
  workspace_id BINARY(16) NOT NULL,
  action       VARCHAR(64) NOT NULL,  -- 'delete_user', 'edit_user', ...
  requires_owner BOOLEAN NOT NULL,
  threshold    INT NOT NULL,
  FOREIGN KEY (workspace_id) REFERENCES workspaces(id)
);

CREATE TABLE approval_group_members (
  group_id   BINARY(16) NOT NULL,
  user_id    BINARY(16) NOT NULL,
  PRIMARY KEY (group_id, user_id)
);

Add user 흐름의 7-day Expiry

Add user 승인은 mobile 로 Owner + Admin Quorum 에 전송. threshold 가 7일 안에 충족되지 않으면 request expire되어 사용자 추가 안 됨. approval_requests.expires_at 컬럼 + scheduled job 으로 강제.

Edit user 의 Customize

Edit user 는 Approval groups 로 흐름 customize 가능. 정확한 범위 (membership / threshold / Owner 요구 토글) 는 본 자료에 명시 없음.