veritas-kanban/docs/features/delegation.md
V.K. Watson 50dfff84ef revert: restore port 3001 across codebase, keep Express 5 path fix
Reverts port change from 1b7a9fe. OpenClaw gateway will move off 3001 instead.
2026-02-20 21:12:49 -06:00

418 lines
12 KiB
Markdown

# Approval Delegation
Vacation mode with scoped approval delegation and automatic routing for seamless team continuity.
## Overview
Approval Delegation allows users to delegate their approval authority to another user or agent when they're unavailable (vacation, off-hours, high workload). Delegations can be scoped by project, task type, or time range to ensure approvals continue flowing without bottlenecks.
## Features
- **Vacation mode** — Temporarily delegate all approvals
- **Scoped delegation** — Limit by project, task type, priority, or agent
- **Time-bound** — Set start/end dates for automatic activation/expiration
- **Automatic routing** — Approval requests automatically route to delegates
- **Audit trail** — Full history of who approved what on whose behalf
- **Multiple delegates** — Chain of delegation for redundancy
- **Override capability** — Delegator can still approve even when delegation is active
## API Endpoints
### Create Delegation
```bash
# Delegate all approvals (vacation mode)
curl -X POST http://localhost:3001/api/approvals/delegate \
-H "Content-Type: application/json" \
-H "X-API-Key: YOUR_KEY" \
-d '{
"delegateFrom": "brad",
"delegateTo": "VERITAS",
"startDate": "2026-02-10T00:00:00Z",
"endDate": "2026-02-17T23:59:59Z",
"reason": "Vacation"
}'
# Delegate specific project approvals
curl -X POST http://localhost:3001/api/approvals/delegate \
-H "Content-Type: application/json" \
-H "X-API-Key: YOUR_KEY" \
-d '{
"delegateFrom": "brad",
"delegateTo": "VERITAS",
"scope": {
"projects": ["rubicon", "launchmeld"]
},
"startDate": "2026-02-10T00:00:00Z",
"endDate": "2026-02-17T23:59:59Z",
"reason": "Vacation - Rubicon and LaunchMeld only"
}'
# Delegate by task type and priority
curl -X POST http://localhost:3001/api/approvals/delegate \
-H "Content-Type: application/json" \
-H "X-API-Key: YOUR_KEY" \
-d '{
"delegateFrom": "brad",
"delegateTo": "VERITAS",
"scope": {
"taskTypes": ["code", "bug"],
"priorities": ["high", "critical"]
},
"startDate": "2026-02-08T17:00:00Z",
"endDate": "2026-02-09T09:00:00Z",
"reason": "After hours - urgent code reviews only"
}'
# Delegate to multiple people with fallback
curl -X POST http://localhost:3001/api/approvals/delegate \
-H "Content-Type: application/json" \
-H "X-API-Key: YOUR_KEY" \
-d '{
"delegateFrom": "brad",
"delegateTo": ["VERITAS", "sarah"],
"scope": {
"projects": ["rubicon"]
},
"startDate": "2026-02-10T00:00:00Z",
"endDate": "2026-02-17T23:59:59Z",
"reason": "Vacation - VERITAS first, Sarah as fallback"
}'
```
### Get Active Delegations
```bash
# Get all active delegations
curl http://localhost:3001/api/approvals/delegate \
-H "X-API-Key: YOUR_KEY"
# Get delegations for specific user
curl "http://localhost:3001/api/approvals/delegate?user=brad" \
-H "X-API-Key: YOUR_KEY"
# Get delegations where user is delegate
curl "http://localhost:3001/api/approvals/delegate?delegate=VERITAS" \
-H "X-API-Key: YOUR_KEY"
```
### Update Delegation
```bash
# Extend delegation end date
curl -X PATCH http://localhost:3001/api/approvals/delegate/{delegationId} \
-H "Content-Type: application/json" \
-H "X-API-Key: YOUR_KEY" \
-d '{
"endDate": "2026-02-20T23:59:59Z"
}'
# Change delegate
curl -X PATCH http://localhost:3001/api/approvals/delegate/{delegationId} \
-H "Content-Type: application/json" \
-H "X-API-Key: YOUR_KEY" \
-d '{
"delegateTo": "sarah"
}'
# Update scope
curl -X PATCH http://localhost:3001/api/approvals/delegate/{delegationId} \
-H "Content-Type: application/json" \
-H "X-API-Key: YOUR_KEY" \
-d '{
"scope": {
"projects": ["rubicon", "launchmeld", "dealmeld"]
}
}'
```
### Delete Delegation
```bash
# Cancel delegation early
curl -X DELETE http://localhost:3001/api/approvals/delegate/{delegationId} \
-H "X-API-Key: YOUR_KEY"
```
## Request Schema
### Create/Update Delegation
| Field | Type | Required | Description |
| -------------- | --------- | -------- | ---------------------------------------------------- |
| `delegateFrom` | string | ✅ | User delegating approval authority |
| `delegateTo` | string/[] | ✅ | User(s)/agent(s) receiving authority (order matters) |
| `startDate` | ISO 8601 | ✅ | When delegation becomes active |
| `endDate` | ISO 8601 | ✅ | When delegation expires |
| `reason` | string | ❌ | Why delegation is needed |
| `scope` | object | ❌ | Limits (omit for full delegation) |
### Scope Object
| Field | Type | Description |
| ------------ | -------- | ---------------------------------------- |
| `projects` | string[] | Project IDs (empty = all projects) |
| `taskTypes` | string[] | Task types (code, bug, feature, etc.) |
| `priorities` | string[] | Priorities (low, medium, high, critical) |
| `agents` | string[] | Specific agent assignments |
**Note:** Scope fields are ANDed together. Omit scope for full delegation.
## Response Schema
### Delegation Object
```json
{
"id": "del_abc123",
"delegateFrom": "brad",
"delegateTo": ["VERITAS", "sarah"],
"startDate": "2026-02-10T00:00:00Z",
"endDate": "2026-02-17T23:59:59Z",
"reason": "Vacation",
"scope": {
"projects": ["rubicon"],
"taskTypes": null,
"priorities": null,
"agents": null
},
"active": true,
"createdAt": "2026-02-07T15:00:00Z",
"createdBy": "brad"
}
```
## Delegation Behavior
### Matching Logic
When an approval request arrives, the system checks for active delegations:
1. **Time check** — Is current time between `startDate` and `endDate`?
2. **Scope check** — Does the task match delegation scope?
3. **Delegate selection** — If multiple delegates, pick first available
### Scope Matching
All specified scope fields must match (AND logic):
```json
{
"scope": {
"projects": ["rubicon"],
"priorities": ["high", "critical"]
}
}
```
Matches: Rubicon project AND (high OR critical priority)
Does NOT match: Rubicon + medium priority OR non-Rubicon + high priority
### Approval Process
1. Task requires approval from Brad
2. Active delegation exists: Brad → VERITAS (Rubicon project)
3. Task is in Rubicon project
4. Approval request automatically routes to VERITAS
5. VERITAS approves on Brad's behalf
6. Audit log records: "Approved by VERITAS on behalf of Brad (delegation del_abc123)"
### Delegator Override
Even with active delegation, the original delegator can still approve:
- Brad delegates to VERITAS
- Task requires Brad's approval
- Brad can still approve directly (VERITAS also can)
- First approval wins
## Storage
Delegations are stored in `.veritas-kanban/approvals/delegations.json`:
```json
[
{
"id": "del_abc123",
"delegateFrom": "brad",
"delegateTo": ["VERITAS"],
"startDate": "2026-02-10T00:00:00Z",
"endDate": "2026-02-17T23:59:59Z",
"reason": "Vacation",
"scope": null,
"active": true,
"createdAt": "2026-02-07T15:00:00Z"
}
]
```
Approval audit logs include delegation references:
```json
{
"taskId": "task_abc123",
"approver": "VERITAS",
"onBehalfOf": "brad",
"delegationId": "del_abc123",
"timestamp": "2026-02-11T10:30:00Z"
}
```
## Common Use Cases
### Vacation Mode
Delegate all approvals while away:
```bash
curl -X POST http://localhost:3001/api/approvals/delegate \
-H "Content-Type: application/json" \
-H "X-API-Key: YOUR_KEY" \
-d '{
"delegateFrom": "brad",
"delegateTo": "VERITAS",
"startDate": "2026-02-10T00:00:00Z",
"endDate": "2026-02-17T23:59:59Z",
"reason": "Vacation - out of office"
}'
```
### After-Hours Coverage
Delegate urgent approvals to on-call agent:
```bash
curl -X POST http://localhost:3001/api/approvals/delegate \
-H "Content-Type: application/json" \
-H "X-API-Key: YOUR_KEY" \
-d '{
"delegateFrom": "brad",
"delegateTo": "VERITAS",
"scope": {
"priorities": ["critical"]
},
"startDate": "2026-02-07T18:00:00Z",
"endDate": "2026-02-08T09:00:00Z",
"reason": "After hours - critical approvals only"
}'
```
### Project Handoff
Delegate specific project during transition:
```bash
curl -X POST http://localhost:3001/api/approvals/delegate \
-H "Content-Type: application/json" \
-H "X-API-Key: YOUR_KEY" \
-d '{
"delegateFrom": "brad",
"delegateTo": "sarah",
"scope": {
"projects": ["rubicon"]
},
"startDate": "2026-02-08T00:00:00Z",
"endDate": "2026-03-01T23:59:59Z",
"reason": "Project handoff - Sarah taking over Rubicon"
}'
```
### High Workload Distribution
Delegate code reviews when overloaded:
```bash
curl -X POST http://localhost:3001/api/approvals/delegate \
-H "Content-Type: application/json" \
-H "X-API-Key: YOUR_KEY" \
-d '{
"delegateFrom": "brad",
"delegateTo": ["VERITAS", "sarah", "john"],
"scope": {
"taskTypes": ["code"],
"priorities": ["low", "medium"]
},
"startDate": "2026-02-08T00:00:00Z",
"endDate": "2026-02-14T23:59:59Z",
"reason": "High workload - delegating non-critical code reviews"
}'
```
## Frontend Display
The Settings → Agents tab includes a "Delegation" section:
- **Create delegation** — Form with date pickers and scope selectors
- **Active delegations** — List with status badges
- **Edit/delete** — Inline actions for existing delegations
- **Vacation mode toggle** — Quick action for full delegation
Task detail panels show delegation status:
- "Approval required from Brad (delegated to VERITAS)"
- "Approved by VERITAS on behalf of Brad"
## Agent Integration
Agents should check for delegated approvals:
```bash
# Check if agent has delegated authority
curl "http://localhost:3001/api/approvals/delegate?delegate=VERITAS" \
-H "X-API-Key: YOUR_KEY"
# Approve on behalf of delegator
curl -X POST http://localhost:3001/api/tasks/{taskId}/approve \
-H "Content-Type: application/json" \
-H "X-API-Key: YOUR_KEY" \
-d '{
"approver": "VERITAS",
"onBehalfOf": "brad",
"delegationId": "del_abc123"
}'
```
## Notifications
When delegation becomes active/expires:
- Email/Teams notification to delegator and delegate
- Squad chat system message: "Brad delegated approvals to VERITAS (Feb 10-17)"
- Broadcast notification when vacation mode starts
When approvals happen via delegation:
- Notify both delegator and delegate
- Include delegation context in notification
## Security Notes
- Only the delegator can create/modify/delete their delegations
- Admin role can manage all delegations (emergency override)
- Audit logs include full delegation context
- Delegation IDs are unique and non-guessable
- All API endpoints require authentication
## Best Practices
1. **Set realistic end dates** — Don't leave delegations open-ended
2. **Use scope for sensitive projects** — Limit blast radius
3. **Multiple delegates for redundancy** — Avoid single points of failure
4. **Document reasons** — Helps with future reference
5. **Test before vacation** — Create delegation a day early to verify routing
6. **Notify delegates** — Don't surprise people with new responsibilities
7. **Review active delegations** — Clean up expired/unnecessary delegations
## Limitations
- Delegations don't cascade (delegate can't re-delegate)
- Maximum 5 delegates per delegation (prevents abuse)
- Scope fields are ANDed (can't do complex OR logic)
- Time zones are UTC (convert local times appropriately)
- No automatic notification of delegates (must inform manually)
## Related Documentation
- [Agent Permission Levels](#) — Intern, Specialist, Lead tiers
- [Approval Workflow](#) — Task review and approval process
- [Audit Logs](#) — Full approval history and delegation tracking