veritas-kanban/docs/security/permission-coverage.json
2026-06-05 09:43:04 -05:00

1335 lines
48 KiB
JSON

{
"version": 1,
"lastReviewed": "2026-06-03",
"notes": "Authority surface manifest for v5.0. The REST route-map entry is backed by shared/src/utils/api-permissions.ts, and CI compares it against server/src/routes/v1/index.ts.",
"surfaces": [
{
"id": "rest:v1-route-map",
"kind": "rest",
"classification": "authenticated-write",
"permissions": ["route-map"],
"source": "shared/src/utils/api-permissions.ts",
"denialReason": "REST requests are denied by explicit route permission guards or by the client preflight map."
},
{
"id": "websocket:task:changed",
"kind": "websocket",
"classification": "authenticated-read",
"permissions": ["task:read"],
"source": "server/src/services/broadcast-service.ts",
"denialReason": "Task change events require task read access in the event workspace."
},
{
"id": "websocket:chat:delta",
"kind": "websocket",
"classification": "authenticated-read",
"permissions": ["task:read"],
"source": "server/src/services/broadcast-service.ts",
"denialReason": "Chat delta events require task read access in the event workspace."
},
{
"id": "websocket:chat:message",
"kind": "websocket",
"classification": "authenticated-read",
"permissions": ["task:read"],
"source": "server/src/services/broadcast-service.ts",
"denialReason": "Chat message events require task read access in the event workspace."
},
{
"id": "websocket:chat:error",
"kind": "websocket",
"classification": "authenticated-read",
"permissions": ["task:read"],
"source": "server/src/services/broadcast-service.ts",
"denialReason": "Chat error events require task read access in the event workspace."
},
{
"id": "websocket:squad:message",
"kind": "websocket",
"classification": "agent-scoped",
"permissions": ["agent:read"],
"source": "server/src/services/broadcast-service.ts",
"denialReason": "Squad messages require agent read access."
},
{
"id": "websocket:telemetry:event",
"kind": "websocket",
"classification": "authenticated-read",
"permissions": ["telemetry:read"],
"source": "server/src/services/broadcast-service.ts",
"denialReason": "Telemetry events require telemetry read access."
},
{
"id": "websocket:broadcast:new",
"kind": "websocket",
"classification": "agent-scoped",
"permissions": ["agent:read"],
"source": "server/src/services/broadcast-service.ts",
"denialReason": "Agent broadcast notifications require agent read access."
},
{
"id": "websocket:workflow:status",
"kind": "websocket",
"classification": "authenticated-read",
"permissions": ["workflow:read"],
"source": "server/src/services/broadcast-service.ts",
"denialReason": "Workflow status events require workflow read access."
},
{
"id": "websocket:tasks:subscribed",
"kind": "websocket",
"classification": "authenticated-read",
"permissions": ["task:read"],
"source": "server/src/index.ts",
"denialReason": "Task channel subscription confirmations are only sent after task read authorization."
},
{
"id": "websocket:workflow:subscribed",
"kind": "websocket",
"classification": "authenticated-read",
"permissions": ["workflow:read"],
"source": "server/src/index.ts",
"denialReason": "Workflow subscription confirmations are only sent after workflow read authorization."
},
{
"id": "websocket:agent:status",
"kind": "websocket",
"classification": "agent-scoped",
"permissions": ["agent:read"],
"source": "server/src/routes/agent-status.ts",
"denialReason": "Agent status events require agent read access."
},
{
"id": "websocket:agent:status:subscribed",
"kind": "websocket",
"classification": "agent-scoped",
"permissions": ["agent:read"],
"source": "server/src/index.ts",
"denialReason": "Agent status subscription confirmations are only sent after agent read authorization."
},
{
"id": "websocket:agent:output",
"kind": "websocket",
"classification": "authenticated-read",
"permissions": ["task:read"],
"source": "server/src/index.ts",
"denialReason": "Agent output subscriptions require task read access."
},
{
"id": "websocket:agent:complete",
"kind": "websocket",
"classification": "authenticated-read",
"permissions": ["task:read"],
"source": "server/src/index.ts",
"denialReason": "Agent completion subscriptions require task read access."
},
{
"id": "websocket:agent:error",
"kind": "websocket",
"classification": "authenticated-read",
"permissions": ["task:read"],
"source": "server/src/index.ts",
"denialReason": "Agent error subscriptions require task read access."
},
{
"id": "websocket:chat:subscribed",
"kind": "websocket",
"classification": "authenticated-read",
"permissions": ["task:read"],
"source": "server/src/index.ts",
"denialReason": "Chat subscription confirmations are only sent after task read authorization."
},
{
"id": "websocket:subscribed",
"kind": "websocket",
"classification": "authenticated-read",
"permissions": ["task:read"],
"source": "server/src/index.ts",
"denialReason": "Task output subscription confirmations are only sent after task read authorization."
},
{
"id": "websocket:error",
"kind": "websocket",
"classification": "authenticated-read",
"permissions": ["workspace:read"],
"source": "server/src/index.ts",
"denialReason": "WebSocket denial errors are only sent on an authenticated connection."
},
{
"id": "websocket-inbound:chat:subscribe",
"kind": "websocket-inbound",
"classification": "authenticated-read",
"permissions": ["task:read"],
"source": "server/src/index.ts",
"denialReason": "Chat subscriptions require task read access in the requested workspace."
},
{
"id": "websocket-inbound:subscribe:tasks",
"kind": "websocket-inbound",
"classification": "authenticated-read",
"permissions": ["task:read"],
"source": "server/src/index.ts",
"denialReason": "Task event channel subscriptions require task read access in the requested workspace."
},
{
"id": "websocket-inbound:workflow:subscribe",
"kind": "websocket-inbound",
"classification": "authenticated-read",
"permissions": ["workflow:read"],
"source": "server/src/index.ts",
"denialReason": "Workflow event channel subscriptions require workflow read access in the requested workspace."
},
{
"id": "websocket-inbound:subscribe",
"kind": "websocket-inbound",
"classification": "authenticated-read",
"permissions": ["task:read"],
"source": "server/src/index.ts",
"denialReason": "Agent output subscriptions require task read access in the requested workspace."
},
{
"id": "workflow-step:agent",
"kind": "workflow-step",
"classification": "agent-scoped",
"permissions": ["workflow:execute", "agent:read"],
"source": "shared/src/types/workflow.ts",
"denialReason": "Agent workflow steps require workflow execution permission and an allowed agent."
},
{
"id": "workflow-step:loop",
"kind": "workflow-step",
"classification": "agent-scoped",
"permissions": ["workflow:execute", "agent:read"],
"source": "shared/src/types/workflow.ts",
"denialReason": "Loop workflow steps require workflow execution permission and an allowed agent."
},
{
"id": "workflow-step:gate",
"kind": "workflow-step",
"classification": "authenticated-write",
"permissions": ["workflow:execute"],
"source": "shared/src/types/workflow.ts",
"denialReason": "Gate workflow steps require workflow execution permission."
},
{
"id": "workflow-step:parallel",
"kind": "workflow-step",
"classification": "agent-scoped",
"permissions": ["workflow:execute", "agent:read"],
"source": "shared/src/types/workflow.ts",
"denialReason": "Parallel workflow steps require workflow execution permission and allowed agents."
},
{
"id": "transition-gate:require-agent",
"kind": "transition-gate",
"classification": "internal-only",
"permissions": [],
"source": "shared/src/types/transition-hooks.types.ts",
"justification": "Transition gates execute inside an already authorized task status change."
},
{
"id": "transition-gate:require-plan",
"kind": "transition-gate",
"classification": "internal-only",
"permissions": [],
"source": "shared/src/types/transition-hooks.types.ts",
"justification": "Transition gates execute inside an already authorized task status change."
},
{
"id": "transition-gate:require-verification-complete",
"kind": "transition-gate",
"classification": "internal-only",
"permissions": [],
"source": "shared/src/types/transition-hooks.types.ts",
"justification": "Transition gates execute inside an already authorized task status change."
},
{
"id": "transition-gate:require-time-tracked",
"kind": "transition-gate",
"classification": "internal-only",
"permissions": [],
"source": "shared/src/types/transition-hooks.types.ts",
"justification": "Transition gates execute inside an already authorized task status change."
},
{
"id": "transition-gate:require-closing-comment",
"kind": "transition-gate",
"classification": "internal-only",
"permissions": [],
"source": "shared/src/types/transition-hooks.types.ts",
"justification": "Transition gates execute inside an already authorized task status change."
},
{
"id": "transition-gate:require-subtasks-complete",
"kind": "transition-gate",
"classification": "internal-only",
"permissions": [],
"source": "shared/src/types/transition-hooks.types.ts",
"justification": "Transition gates execute inside an already authorized task status change."
},
{
"id": "transition-gate:require-blocker-reason",
"kind": "transition-gate",
"classification": "internal-only",
"permissions": [],
"source": "shared/src/types/transition-hooks.types.ts",
"justification": "Transition gates execute inside an already authorized task status change."
},
{
"id": "transition-action:auto-start-timer",
"kind": "transition-action",
"classification": "internal-only",
"permissions": [],
"source": "shared/src/types/transition-hooks.types.ts",
"justification": "Transition actions execute only after the initiating task transition is authorized."
},
{
"id": "transition-action:auto-stop-timer",
"kind": "transition-action",
"classification": "internal-only",
"permissions": [],
"source": "shared/src/types/transition-hooks.types.ts",
"justification": "Transition actions execute only after the initiating task transition is authorized."
},
{
"id": "transition-action:send-webhook",
"kind": "transition-action",
"classification": "workspace-admin",
"permissions": ["admin:manage"],
"source": "shared/src/types/transition-hooks.types.ts",
"denialReason": "Webhook transition actions can only be configured through admin-guarded transition hook settings."
},
{
"id": "transition-action:send-notification",
"kind": "transition-action",
"classification": "workspace-admin",
"permissions": ["admin:manage"],
"source": "shared/src/types/transition-hooks.types.ts",
"denialReason": "Notification transition actions can only be configured through admin-guarded transition hook settings."
},
{
"id": "transition-action:prompt-lessons-learned",
"kind": "transition-action",
"classification": "internal-only",
"permissions": [],
"source": "shared/src/types/transition-hooks.types.ts",
"justification": "Transition actions execute only after the initiating task transition is authorized."
},
{
"id": "transition-action:log-activity",
"kind": "transition-action",
"classification": "internal-only",
"permissions": [],
"source": "shared/src/types/transition-hooks.types.ts",
"justification": "Transition actions execute only after the initiating task transition is authorized."
},
{
"id": "command-palette:new-task",
"kind": "command-palette",
"classification": "authenticated-write",
"permissions": ["task:write"],
"source": "web/src/components/layout/CommandPalette.tsx",
"denialReason": "Creating a task through the command palette requires task write access."
},
{
"id": "command-palette:toggle-theme",
"kind": "command-palette",
"classification": "internal-only",
"permissions": [],
"source": "web/src/components/layout/CommandPalette.tsx",
"justification": "Theme switching is a client-local preference and does not call a privileged API."
},
{
"id": "command-palette:open-search",
"kind": "command-palette",
"classification": "authenticated-read",
"permissions": ["task:read", "work_product:read"],
"source": "web/src/components/layout/CommandPalette.tsx",
"denialReason": "Opening semantic search leads to task and work product read APIs."
},
{
"id": "command-palette:move-todo",
"kind": "command-palette",
"classification": "authenticated-write",
"permissions": ["task:write"],
"source": "web/src/components/layout/CommandPalette.tsx",
"denialReason": "Moving a task to To Do requires task write access."
},
{
"id": "command-palette:move-inprogress",
"kind": "command-palette",
"classification": "authenticated-write",
"permissions": ["task:write"],
"source": "web/src/components/layout/CommandPalette.tsx",
"denialReason": "Moving a task to In Progress requires task write access."
},
{
"id": "command-palette:move-blocked",
"kind": "command-palette",
"classification": "authenticated-write",
"permissions": ["task:write"],
"source": "web/src/components/layout/CommandPalette.tsx",
"denialReason": "Moving a task to Blocked requires task write access."
},
{
"id": "command-palette:move-done",
"kind": "command-palette",
"classification": "authenticated-write",
"permissions": ["task:write"],
"source": "web/src/components/layout/CommandPalette.tsx",
"denialReason": "Moving a task to Done requires task write access."
},
{
"id": "command-palette:nav-up",
"kind": "command-palette",
"classification": "authenticated-read",
"permissions": ["task:read"],
"source": "web/src/components/layout/CommandPalette.tsx",
"denialReason": "Task selection shortcuts are only useful after task read access is granted."
},
{
"id": "command-palette:nav-down",
"kind": "command-palette",
"classification": "authenticated-read",
"permissions": ["task:read"],
"source": "web/src/components/layout/CommandPalette.tsx",
"denialReason": "Task selection shortcuts are only useful after task read access is granted."
},
{
"id": "command-palette:open-task",
"kind": "command-palette",
"classification": "authenticated-read",
"permissions": ["task:read"],
"source": "web/src/components/layout/CommandPalette.tsx",
"denialReason": "Opening a selected task requires task read access."
},
{
"id": "command-palette:go-board",
"kind": "command-palette",
"classification": "authenticated-read",
"permissions": ["task:read"],
"source": "web/src/lib/views.ts",
"denialReason": "Board navigation leads to task read APIs."
},
{
"id": "command-palette:go-activity",
"kind": "command-palette",
"classification": "authenticated-read",
"permissions": ["telemetry:read"],
"source": "web/src/lib/views.ts",
"denialReason": "Activity navigation leads to activity and telemetry read APIs."
},
{
"id": "command-palette:go-backlog",
"kind": "command-palette",
"classification": "authenticated-read",
"permissions": ["task:read"],
"source": "web/src/lib/views.ts",
"denialReason": "Backlog navigation leads to task read APIs."
},
{
"id": "command-palette:go-archive",
"kind": "command-palette",
"classification": "authenticated-read",
"permissions": ["task:read"],
"source": "web/src/lib/views.ts",
"denialReason": "Archive navigation leads to task read APIs."
},
{
"id": "command-palette:go-templates",
"kind": "command-palette",
"classification": "authenticated-read",
"permissions": ["settings:read"],
"source": "web/src/lib/views.ts",
"denialReason": "Template navigation leads to settings read APIs."
},
{
"id": "command-palette:go-workflows",
"kind": "command-palette",
"classification": "authenticated-read",
"permissions": ["workflow:read"],
"source": "web/src/lib/views.ts",
"denialReason": "Workflow navigation leads to workflow read APIs."
},
{
"id": "command-palette:go-operations",
"kind": "command-palette",
"classification": "authenticated-read",
"permissions": ["task:read", "telemetry:read", "workflow_run:read"],
"source": "web/src/lib/views.ts",
"denialReason": "Operations digest navigation leads to task, telemetry, and scheduled deliverable read APIs."
},
{
"id": "command-palette:go-evidence",
"kind": "command-palette",
"classification": "authenticated-read",
"permissions": ["report:read", "task:read", "telemetry:read", "work_product:read"],
"source": "web/src/lib/views.ts",
"denialReason": "Evidence navigation leads to source-backed task, telemetry, and work-product report APIs."
},
{
"id": "command-palette:go-time",
"kind": "command-palette",
"classification": "authenticated-read",
"permissions": ["report:read", "task:read", "telemetry:read"],
"source": "web/src/lib/views.ts",
"denialReason": "Time navigation leads to source-backed task and telemetry report APIs."
},
{
"id": "command-palette:go-drift",
"kind": "command-palette",
"classification": "authenticated-read",
"permissions": ["telemetry:read"],
"source": "web/src/lib/views.ts",
"denialReason": "Drift navigation leads to telemetry read APIs."
},
{
"id": "command-palette:go-decisions",
"kind": "command-palette",
"classification": "authenticated-read",
"permissions": ["task:read"],
"source": "web/src/lib/views.ts",
"denialReason": "Decision navigation leads to task-linked decision read APIs."
},
{
"id": "command-palette:go-scoring",
"kind": "command-palette",
"classification": "authenticated-read",
"permissions": ["report:read"],
"source": "web/src/lib/views.ts",
"denialReason": "Scoring navigation leads to report read APIs."
},
{
"id": "command-palette:go-policies",
"kind": "command-palette",
"classification": "authenticated-read",
"permissions": ["policy:read"],
"source": "web/src/lib/views.ts",
"denialReason": "Policy navigation leads to policy read APIs."
},
{
"id": "background-job:agent-registry-stale-check",
"kind": "background-job",
"classification": "internal-only",
"permissions": [],
"source": "server/src/services/agent-registry-service.ts",
"justification": "Agent stale checks are server-owned maintenance and are not caller-triggered."
},
{
"id": "background-job:github-sync-poll",
"kind": "background-job",
"classification": "internal-only",
"permissions": [],
"source": "server/src/services/github-sync-service.ts",
"justification": "GitHub sync polling runs from configured server state and is not caller-triggered."
},
{
"id": "background-job:prometheus-event-loop-lag",
"kind": "background-job",
"classification": "internal-only",
"permissions": [],
"source": "server/src/services/metrics/prometheus.ts",
"justification": "Event loop lag sampling records process metrics and is not caller-triggered."
},
{
"id": "background-job:task-github-reconcile",
"kind": "background-job",
"classification": "internal-only",
"permissions": [],
"source": "server/src/services/task-service.ts",
"justification": "Task GitHub reconciliation runs from configured server state and is not caller-triggered."
},
{
"id": "background-job:websocket-heartbeat",
"kind": "background-job",
"classification": "internal-only",
"permissions": [],
"source": "server/src/index.ts",
"justification": "WebSocket heartbeats maintain authenticated connections and do not expose data."
},
{
"id": "cli:agent-status:agent",
"kind": "cli",
"classification": "public/setup",
"permissions": [],
"source": "cli/src/commands/agent-status.ts",
"justification": "Parent command only; subcommands carry authorization."
},
{
"id": "cli:agent-status:status",
"kind": "cli",
"classification": "agent-scoped",
"permissions": ["agent:read"],
"source": "cli/src/commands/agent-status.ts",
"denialReason": "Agent status reads require agent read access."
},
{
"id": "cli:agent-status:working",
"kind": "cli",
"classification": "agent-scoped",
"permissions": ["telemetry:write"],
"source": "cli/src/commands/agent-status.ts",
"denialReason": "Agent status writes require telemetry write access."
},
{
"id": "cli:agent-status:idle",
"kind": "cli",
"classification": "agent-scoped",
"permissions": ["telemetry:write"],
"source": "cli/src/commands/agent-status.ts",
"denialReason": "Agent status writes require telemetry write access."
},
{
"id": "cli:agent-status:sub-agent",
"kind": "cli",
"classification": "agent-scoped",
"permissions": ["telemetry:write"],
"source": "cli/src/commands/agent-status.ts",
"denialReason": "Agent status writes require telemetry write access."
},
{
"id": "cli:agents:start",
"kind": "cli",
"classification": "agent-scoped",
"permissions": ["task:read", "task:write"],
"source": "cli/src/commands/agents.ts",
"denialReason": "Starting an agent requires task read and task write access."
},
{
"id": "cli:agents:stop",
"kind": "cli",
"classification": "agent-scoped",
"permissions": ["task:read", "task:write"],
"source": "cli/src/commands/agents.ts",
"denialReason": "Stopping an agent requires task read and task write access."
},
{
"id": "cli:agents:agents:pending",
"kind": "cli",
"classification": "agent-scoped",
"permissions": ["agent:read"],
"source": "cli/src/commands/agents.ts",
"denialReason": "Listing pending agent requests requires agent read access."
},
{
"id": "cli:agents:agents:complete",
"kind": "cli",
"classification": "agent-scoped",
"permissions": ["task:write"],
"source": "cli/src/commands/agents.ts",
"denialReason": "Completing an agent request requires task write access."
},
{
"id": "cli:agents:agents:status",
"kind": "cli",
"classification": "agent-scoped",
"permissions": ["agent:read"],
"source": "cli/src/commands/agents.ts",
"denialReason": "Agent request status requires agent read access."
},
{
"id": "cli:automation:automation:pending",
"kind": "cli",
"classification": "authenticated-read",
"permissions": ["task:read"],
"source": "cli/src/commands/automation.ts",
"denialReason": "Automation task reads require task read access."
},
{
"id": "cli:automation:automation:running",
"kind": "cli",
"classification": "authenticated-read",
"permissions": ["task:read"],
"source": "cli/src/commands/automation.ts",
"denialReason": "Automation task reads require task read access."
},
{
"id": "cli:automation:automation:start",
"kind": "cli",
"classification": "authenticated-write",
"permissions": ["task:read", "task:write"],
"source": "cli/src/commands/automation.ts",
"denialReason": "Starting automation requires task read and task write access."
},
{
"id": "cli:automation:automation:complete",
"kind": "cli",
"classification": "authenticated-write",
"permissions": ["task:read", "task:write"],
"source": "cli/src/commands/automation.ts",
"denialReason": "Completing automation requires task read and task write access."
},
{
"id": "cli:backlog:backlog",
"kind": "cli",
"classification": "public/setup",
"permissions": [],
"source": "cli/src/commands/backlog.ts",
"justification": "Parent command only; subcommands carry authorization."
},
{
"id": "cli:backlog:list",
"kind": "cli",
"classification": "authenticated-read",
"permissions": ["task:read"],
"source": "cli/src/commands/backlog.ts",
"denialReason": "Backlog reads require task read access."
},
{
"id": "cli:backlog:add",
"kind": "cli",
"classification": "authenticated-write",
"permissions": ["task:write"],
"source": "cli/src/commands/backlog.ts",
"denialReason": "Adding backlog items requires task write access."
},
{
"id": "cli:backlog:promote",
"kind": "cli",
"classification": "authenticated-write",
"permissions": ["task:write"],
"source": "cli/src/commands/backlog.ts",
"denialReason": "Promoting backlog items requires task write access."
},
{
"id": "cli:backlog:demote",
"kind": "cli",
"classification": "authenticated-write",
"permissions": ["task:write"],
"source": "cli/src/commands/backlog.ts",
"denialReason": "Demoting tasks requires task write access."
},
{
"id": "cli:backlog:delete",
"kind": "cli",
"classification": "authenticated-write",
"permissions": ["task:write"],
"source": "cli/src/commands/backlog.ts",
"denialReason": "Deleting backlog items requires task write access."
},
{
"id": "cli:backlog:count",
"kind": "cli",
"classification": "authenticated-read",
"permissions": ["task:read"],
"source": "cli/src/commands/backlog.ts",
"denialReason": "Backlog counts require task read access."
},
{
"id": "cli:comments:comment",
"kind": "cli",
"classification": "authenticated-write",
"permissions": ["task:read", "comment:write"],
"source": "cli/src/commands/comments.ts",
"denialReason": "Adding comments requires task read and comment write access."
},
{
"id": "cli:github:github",
"kind": "cli",
"classification": "public/setup",
"permissions": [],
"source": "cli/src/commands/github.ts",
"justification": "Parent command only; subcommands carry authorization."
},
{
"id": "cli:github:sync",
"kind": "cli",
"classification": "authenticated-write",
"permissions": ["task:write"],
"source": "cli/src/commands/github.ts",
"denialReason": "GitHub sync mutates task state and requires task write access."
},
{
"id": "cli:github:status",
"kind": "cli",
"classification": "authenticated-read",
"permissions": ["task:read"],
"source": "cli/src/commands/github.ts",
"denialReason": "GitHub sync status requires task read access."
},
{
"id": "cli:github:config",
"kind": "cli",
"classification": "authenticated-write",
"permissions": ["task:read", "task:write"],
"source": "cli/src/commands/github.ts",
"denialReason": "GitHub sync config reads and writes require task route access."
},
{
"id": "cli:github:mappings",
"kind": "cli",
"classification": "authenticated-read",
"permissions": ["task:read"],
"source": "cli/src/commands/github.ts",
"denialReason": "GitHub mappings require task read access."
},
{
"id": "cli:notifications:notify",
"kind": "cli",
"classification": "authenticated-write",
"permissions": ["comment:write"],
"source": "cli/src/commands/notifications.ts",
"denialReason": "Creating notifications requires comment write access."
},
{
"id": "cli:notifications:notify:check",
"kind": "cli",
"classification": "authenticated-write",
"permissions": ["comment:write"],
"source": "cli/src/commands/notifications.ts",
"denialReason": "Notification checks can create notifications and require comment write access."
},
{
"id": "cli:notifications:notify:pending",
"kind": "cli",
"classification": "agent-scoped",
"permissions": ["agent:read"],
"source": "cli/src/commands/notifications.ts",
"denialReason": "Pending notification reads require agent read access."
},
{
"id": "cli:notifications:notify:list",
"kind": "cli",
"classification": "agent-scoped",
"permissions": ["agent:read"],
"source": "cli/src/commands/notifications.ts",
"denialReason": "Notification lists require agent read access."
},
{
"id": "cli:notifications:notify:clear",
"kind": "cli",
"classification": "authenticated-write",
"permissions": ["comment:write"],
"source": "cli/src/commands/notifications.ts",
"denialReason": "Clearing notifications requires comment write access."
},
{
"id": "cli:projects:project",
"kind": "cli",
"classification": "public/setup",
"permissions": [],
"source": "cli/src/commands/projects.ts",
"justification": "Parent command only; subcommands carry authorization."
},
{
"id": "cli:projects:list",
"kind": "cli",
"classification": "authenticated-read",
"permissions": ["settings:read"],
"source": "cli/src/commands/projects.ts",
"denialReason": "Project reads require settings read access."
},
{
"id": "cli:projects:create",
"kind": "cli",
"classification": "authenticated-write",
"permissions": ["settings:write"],
"source": "cli/src/commands/projects.ts",
"denialReason": "Project creation requires settings write access."
},
{
"id": "cli:setup:setup",
"kind": "cli",
"classification": "authenticated-write",
"permissions": ["task:read", "task:write"],
"source": "cli/src/commands/setup.ts",
"denialReason": "Setup can create a sample task and requires task write access unless skipped."
},
{
"id": "cli:sprints:sprint",
"kind": "cli",
"classification": "public/setup",
"permissions": [],
"source": "cli/src/commands/sprints.ts",
"justification": "Parent command only; subcommands carry authorization."
},
{
"id": "cli:sprints:list",
"kind": "cli",
"classification": "authenticated-read",
"permissions": ["settings:read"],
"source": "cli/src/commands/sprints.ts",
"denialReason": "Sprint reads require settings read access."
},
{
"id": "cli:sprints:create",
"kind": "cli",
"classification": "authenticated-write",
"permissions": ["settings:write"],
"source": "cli/src/commands/sprints.ts",
"denialReason": "Sprint creation requires settings write access."
},
{
"id": "cli:sprints:update",
"kind": "cli",
"classification": "authenticated-write",
"permissions": ["settings:write"],
"source": "cli/src/commands/sprints.ts",
"denialReason": "Sprint updates require settings write access."
},
{
"id": "cli:sprints:delete",
"kind": "cli",
"classification": "authenticated-write",
"permissions": ["settings:write"],
"source": "cli/src/commands/sprints.ts",
"denialReason": "Sprint deletion requires settings write access."
},
{
"id": "cli:sprints:suggestions",
"kind": "cli",
"classification": "authenticated-read",
"permissions": ["task:read"],
"source": "cli/src/commands/sprints.ts",
"denialReason": "Archive suggestions require task read access."
},
{
"id": "cli:sprints:close",
"kind": "cli",
"classification": "authenticated-write",
"permissions": ["task:write"],
"source": "cli/src/commands/sprints.ts",
"denialReason": "Closing a sprint mutates tasks and requires task write access."
},
{
"id": "cli:summary:summary",
"kind": "cli",
"classification": "authenticated-read",
"permissions": ["report:read"],
"source": "cli/src/commands/summary.ts",
"denialReason": "Summary output requires report read access."
},
{
"id": "cli:summary:standup",
"kind": "cli",
"classification": "authenticated-read",
"permissions": ["report:read"],
"source": "cli/src/commands/summary.ts",
"denialReason": "Standup reports require report read access."
},
{
"id": "cli:summary:memory",
"kind": "cli",
"classification": "authenticated-read",
"permissions": ["report:read"],
"source": "cli/src/commands/summary.ts",
"denialReason": "Memory summaries require report read access."
},
{
"id": "cli:tasks:list",
"kind": "cli",
"classification": "authenticated-read",
"permissions": ["task:read"],
"source": "cli/src/commands/tasks.ts",
"denialReason": "Task lists require task read access."
},
{
"id": "cli:tasks:show",
"kind": "cli",
"classification": "authenticated-read",
"permissions": ["task:read"],
"source": "cli/src/commands/tasks.ts",
"denialReason": "Task details require task read access."
},
{
"id": "cli:tasks:create",
"kind": "cli",
"classification": "authenticated-write",
"permissions": ["task:write"],
"source": "cli/src/commands/tasks.ts",
"denialReason": "Task creation requires task write access."
},
{
"id": "cli:tasks:update",
"kind": "cli",
"classification": "authenticated-write",
"permissions": ["task:read", "task:write"],
"source": "cli/src/commands/tasks.ts",
"denialReason": "Task updates require task read and task write access."
},
{
"id": "cli:tasks:archive",
"kind": "cli",
"classification": "authenticated-write",
"permissions": ["task:read", "task:write"],
"source": "cli/src/commands/tasks.ts",
"denialReason": "Task archive operations require task read and task write access."
},
{
"id": "cli:tasks:delete",
"kind": "cli",
"classification": "authenticated-write",
"permissions": ["task:read", "task:write"],
"source": "cli/src/commands/tasks.ts",
"denialReason": "Task deletion requires task read and task write access."
},
{
"id": "cli:time:time",
"kind": "cli",
"classification": "public/setup",
"permissions": [],
"source": "cli/src/commands/time.ts",
"justification": "Parent command only; subcommands carry authorization."
},
{
"id": "cli:time:start",
"kind": "cli",
"classification": "authenticated-write",
"permissions": ["task:read", "task:write"],
"source": "cli/src/commands/time.ts",
"denialReason": "Starting timers requires task read and task write access."
},
{
"id": "cli:time:stop",
"kind": "cli",
"classification": "authenticated-write",
"permissions": ["task:read", "task:write"],
"source": "cli/src/commands/time.ts",
"denialReason": "Stopping timers requires task read and task write access."
},
{
"id": "cli:time:entry",
"kind": "cli",
"classification": "authenticated-write",
"permissions": ["task:read", "task:write"],
"source": "cli/src/commands/time.ts",
"denialReason": "Manual time entries require task read and task write access."
},
{
"id": "cli:time:show",
"kind": "cli",
"classification": "authenticated-read",
"permissions": ["task:read"],
"source": "cli/src/commands/time.ts",
"denialReason": "Time entry display requires task read access."
},
{
"id": "cli:usage:usage",
"kind": "cli",
"classification": "authenticated-read",
"permissions": ["report:read"],
"source": "cli/src/commands/usage.ts",
"denialReason": "Usage reports require report read access."
},
{
"id": "cli:workflow:begin",
"kind": "cli",
"classification": "authenticated-write",
"permissions": ["task:read", "task:write", "telemetry:write"],
"source": "cli/src/commands/workflow.ts",
"denialReason": "Workflow begin mutates task, timer, and agent status state."
},
{
"id": "cli:workflow:done",
"kind": "cli",
"classification": "authenticated-write",
"permissions": ["task:read", "task:write", "comment:write", "telemetry:write"],
"source": "cli/src/commands/workflow.ts",
"denialReason": "Workflow completion mutates task, timer, comment, and agent status state."
},
{
"id": "cli:workflow:block",
"kind": "cli",
"classification": "authenticated-write",
"permissions": ["task:read", "task:write", "comment:write"],
"source": "cli/src/commands/workflow.ts",
"denialReason": "Blocking a task mutates task and comment state."
},
{
"id": "cli:workflow:unblock",
"kind": "cli",
"classification": "authenticated-write",
"permissions": ["task:read", "task:write"],
"source": "cli/src/commands/workflow.ts",
"denialReason": "Unblocking a task requires task write access."
},
{
"id": "mcp:start_agent",
"kind": "mcp",
"classification": "agent-scoped",
"permissions": ["task:read", "task:write"],
"source": "mcp/src/tools/agents.ts",
"denialReason": "Starting an agent requires task read and task write access."
},
{
"id": "mcp:stop_agent",
"kind": "mcp",
"classification": "agent-scoped",
"permissions": ["task:read", "task:write"],
"source": "mcp/src/tools/agents.ts",
"denialReason": "Stopping an agent requires task read and task write access."
},
{
"id": "mcp:list_pending_automation",
"kind": "mcp",
"classification": "authenticated-read",
"permissions": ["task:read"],
"source": "mcp/src/tools/automation.ts",
"denialReason": "Listing pending automation requires task read access."
},
{
"id": "mcp:list_running_automation",
"kind": "mcp",
"classification": "authenticated-read",
"permissions": ["task:read"],
"source": "mcp/src/tools/automation.ts",
"denialReason": "Listing running automation requires task read access."
},
{
"id": "mcp:start_automation",
"kind": "mcp",
"classification": "authenticated-write",
"permissions": ["task:read", "task:write"],
"source": "mcp/src/tools/automation.ts",
"denialReason": "Starting automation requires task read and task write access."
},
{
"id": "mcp:complete_automation",
"kind": "mcp",
"classification": "authenticated-write",
"permissions": ["task:read", "task:write"],
"source": "mcp/src/tools/automation.ts",
"denialReason": "Completing automation requires task read and task write access."
},
{
"id": "mcp:add_comment",
"kind": "mcp",
"classification": "authenticated-write",
"permissions": ["comment:write"],
"source": "mcp/src/tools/comments.ts",
"denialReason": "Adding comments requires comment write access."
},
{
"id": "mcp:list_comments",
"kind": "mcp",
"classification": "authenticated-read",
"permissions": ["task:read"],
"source": "mcp/src/tools/comments.ts",
"denialReason": "Listing comments requires task read access."
},
{
"id": "mcp:delete_comment",
"kind": "mcp",
"classification": "authenticated-write",
"permissions": ["comment:write"],
"source": "mcp/src/tools/comments.ts",
"denialReason": "Deleting comments requires comment write access."
},
{
"id": "mcp:create_notification",
"kind": "mcp",
"classification": "authenticated-write",
"permissions": ["comment:write"],
"source": "mcp/src/tools/notifications.ts",
"denialReason": "Creating notifications requires comment write access."
},
{
"id": "mcp:get_pending_notifications",
"kind": "mcp",
"classification": "agent-scoped",
"permissions": ["agent:read"],
"source": "mcp/src/tools/notifications.ts",
"denialReason": "Pending notification reads require agent read access."
},
{
"id": "mcp:check_notifications",
"kind": "mcp",
"classification": "authenticated-write",
"permissions": ["comment:write"],
"source": "mcp/src/tools/notifications.ts",
"denialReason": "Notification checks can create notifications and require comment write access."
},
{
"id": "mcp:list_projects",
"kind": "mcp",
"classification": "authenticated-read",
"permissions": ["settings:read"],
"source": "mcp/src/tools/projects.ts",
"denialReason": "Project listing requires settings read access."
},
{
"id": "mcp:get_project",
"kind": "mcp",
"classification": "authenticated-read",
"permissions": ["settings:read"],
"source": "mcp/src/tools/projects.ts",
"denialReason": "Project details require settings read access."
},
{
"id": "mcp:create_project",
"kind": "mcp",
"classification": "authenticated-write",
"permissions": ["settings:write"],
"source": "mcp/src/tools/projects.ts",
"denialReason": "Creating projects requires settings write access."
},
{
"id": "mcp:update_project",
"kind": "mcp",
"classification": "authenticated-write",
"permissions": ["settings:write"],
"source": "mcp/src/tools/projects.ts",
"denialReason": "Updating projects requires settings write access."
},
{
"id": "mcp:delete_project",
"kind": "mcp",
"classification": "authenticated-write",
"permissions": ["settings:write"],
"source": "mcp/src/tools/projects.ts",
"denialReason": "Deleting projects requires settings write access."
},
{
"id": "mcp:get_project_stats",
"kind": "mcp",
"classification": "authenticated-read",
"permissions": ["task:read"],
"source": "mcp/src/tools/projects.ts",
"denialReason": "Project stats require task read access."
},
{
"id": "mcp:reorder_projects",
"kind": "mcp",
"classification": "authenticated-write",
"permissions": ["settings:write"],
"source": "mcp/src/tools/projects.ts",
"denialReason": "Reordering projects requires settings write access."
},
{
"id": "mcp:list_sprints",
"kind": "mcp",
"classification": "authenticated-read",
"permissions": ["settings:read"],
"source": "mcp/src/tools/sprints.ts",
"denialReason": "Sprint listing requires settings read access."
},
{
"id": "mcp:get_sprint",
"kind": "mcp",
"classification": "authenticated-read",
"permissions": ["settings:read"],
"source": "mcp/src/tools/sprints.ts",
"denialReason": "Sprint details require settings read access."
},
{
"id": "mcp:create_sprint",
"kind": "mcp",
"classification": "authenticated-write",
"permissions": ["settings:write"],
"source": "mcp/src/tools/sprints.ts",
"denialReason": "Creating sprints requires settings write access."
},
{
"id": "mcp:update_sprint",
"kind": "mcp",
"classification": "authenticated-write",
"permissions": ["settings:write"],
"source": "mcp/src/tools/sprints.ts",
"denialReason": "Updating sprints requires settings write access."
},
{
"id": "mcp:delete_sprint",
"kind": "mcp",
"classification": "authenticated-write",
"permissions": ["settings:write"],
"source": "mcp/src/tools/sprints.ts",
"denialReason": "Deleting sprints requires settings write access."
},
{
"id": "mcp:can_delete_sprint",
"kind": "mcp",
"classification": "authenticated-read",
"permissions": ["settings:read"],
"source": "mcp/src/tools/sprints.ts",
"denialReason": "Sprint deletion checks require settings read access."
},
{
"id": "mcp:reorder_sprints",
"kind": "mcp",
"classification": "authenticated-write",
"permissions": ["settings:write"],
"source": "mcp/src/tools/sprints.ts",
"denialReason": "Reordering sprints requires settings write access."
},
{
"id": "mcp:get_archive_suggestions",
"kind": "mcp",
"classification": "authenticated-read",
"permissions": ["task:read"],
"source": "mcp/src/tools/sprints.ts",
"denialReason": "Archive suggestions require task read access."
},
{
"id": "mcp:close_sprint",
"kind": "mcp",
"classification": "authenticated-write",
"permissions": ["task:write"],
"source": "mcp/src/tools/sprints.ts",
"denialReason": "Closing a sprint mutates tasks and requires task write access."
},
{
"id": "mcp:get_summary",
"kind": "mcp",
"classification": "authenticated-read",
"permissions": ["report:read"],
"source": "mcp/src/tools/summary.ts",
"denialReason": "Summary tools require report read access."
},
{
"id": "mcp:get_memory_summary",
"kind": "mcp",
"classification": "authenticated-read",
"permissions": ["report:read"],
"source": "mcp/src/tools/summary.ts",
"denialReason": "Memory summary tools require report read access."
},
{
"id": "mcp:list_tasks",
"kind": "mcp",
"classification": "authenticated-read",
"permissions": ["task:read"],
"source": "mcp/src/tools/tasks.ts",
"denialReason": "Task listing requires task read access."
},
{
"id": "mcp:get_task",
"kind": "mcp",
"classification": "authenticated-read",
"permissions": ["task:read"],
"source": "mcp/src/tools/tasks.ts",
"denialReason": "Task details require task read access."
},
{
"id": "mcp:create_task",
"kind": "mcp",
"classification": "authenticated-write",
"permissions": ["task:write"],
"source": "mcp/src/tools/tasks.ts",
"denialReason": "Task creation requires task write access."
},
{
"id": "mcp:update_task",
"kind": "mcp",
"classification": "authenticated-write",
"permissions": ["task:read", "task:write"],
"source": "mcp/src/tools/tasks.ts",
"denialReason": "Task updates require task read and task write access."
},
{
"id": "mcp:archive_task",
"kind": "mcp",
"classification": "authenticated-write",
"permissions": ["task:read", "task:write"],
"source": "mcp/src/tools/tasks.ts",
"denialReason": "Task archive operations require task read and task write access."
},
{
"id": "mcp:delete_task",
"kind": "mcp",
"classification": "authenticated-write",
"permissions": ["task:read", "task:write"],
"source": "mcp/src/tools/tasks.ts",
"denialReason": "Task deletion requires task read and task write access."
}
]
}