Phân quyền Board — tra cứu đầy đủ
Nguyên tắc nền: role chỉ đến từ bảng
space_members. Không header nào, không token nào nâng quyền được. Không có bản ghi membership → 403, kể cảGET.
viewer < member < admin < owner
Ma trận quyền theo hành động
| Hành động | API | Quyền tối thiểu | Ràng buộc thêm |
|---|---|---|---|
| Xem Space, task, wiki, plan, group | GET /api/… | viewer | |
| Tạo / sửa / xoá task | POST·PATCH·DELETE /api/tasks* | member | |
| Tạo task hàng loạt | POST /api/tasks/batch | member | Kiểm quyền ở mọi Space được tham chiếu |
| Chạy / dừng agent | POST /api/tasks/:id/run·stop | member | |
| Tạo & sửa kế hoạch | POST·PATCH /api/plans* | member | Riêng route theo id (GET·PATCH /api/plans/:id, POST /api/plans/:id/regenerate-branch) giải Space từ plan-draft (plans:read-by-id / plans:write-by-id) — vá rò F1: trước đây chúng rơi về rule field-optional không có projectId nên "optional" thành không scope, đọc/sửa được plan Space khác |
| Apply Plan | POST /api/plans/:id/apply | member | Giải Space từ plan-draft |
| Tạo / chạy Task Group | POST /api/groups* | member | |
| Ghi Wiki draft | POST /api/wiki/drafts | member | Scope field — thiếu Space là fail-closed, không "Space nào cũng được" |
| Duyệt / từ chối Wiki draft | POST /api/wiki/drafts/:id/approve·reject | admin | ⚠️ human only |
| Hợp nhất / đóng nhánh Wiki | POST /api/wiki/branches/:id/merge·close | admin | ⚠️ human only — merge một nhánh là duyệt mọi draft trong đó |
| Rollback trang Wiki | POST /api/wiki/pages/:slug/revisions/:v/rollback | admin | ⚠️ human only — ghi lại trang đã duyệt trong một lời gọi; Arkon đòi thêm wiki:write:all |
| Duyệt hai cổng MRP | POST /api/sources/:id/approve-extraction, …/plan/approve·reject·regenerate | admin | ⚠️ human only — duyệt extraction tiêu token AI; duyệt plan quyết định gì vào wiki |
| Nạp tài liệu | POST /api/sources/upload·url (+ GET /api/sources*) | member (ghi) / viewer (đọc) | Cần cờ AGENTBOARD_ARKON_SOURCES=1; scope ghi là field |
| Cờ tính năng | GET /api/features | (chỉ cần đăng nhập) | source:none — không scope Space, chỉ trả boolean |
| Approve & Merge | POST /api/tasks/:id/approve | admin | ⚠️ Bắt buộc actor.type === 'human' |
| Request Changes / Rework | POST /api/tasks/:id/rework | admin | ⚠️ Bắt buộc actor.type === 'human' |
| Sửa cấu hình Space | PATCH·DELETE /api/projects/:id | owner | |
| Thêm / xoá thành viên | POST·DELETE /api/spaces/:id/members | owner | Không xoá được owner cuối cùng (409) |
| Tạo Space mới | POST /api/projects | (chỉ cần đăng nhập) | Người tạo tự động thành owner |
Route chưa khai báo trong
AUTHZ_RULES → 403Mặc định là chặn, không phải cho qua. Thêm endpoint mới mà quên khai báo rule là endpoint đó không dùng được — đây là chủ ý.
Quản lý thành viên
# Xem danh sách
curl http://<host>/api/spaces/<spaceId>/members
# Thêm / đổi role
curl -X POST http://<host>/api/spaces/<spaceId>/members \
-H 'Content-Type: application/json' \
-d '{"email":"bob@corp.com","role":"member"}'
# Xoá
curl -X DELETE http://<host>/api/spaces/<spaceId>/members/bob@corp.com
Mất hết quyền quản trị? Đặt AGENTBOARD_BOOTSTRAP_OWNERS=you@corp.com rồi restart server.
Lệnh grant là idempotent — vừa là đường khởi tạo lần đầu, vừa là đường break-glass.
Chi tiết: Tạo Space & quản thành viên.