Veritas Kanban includes optional enforcement gates that can harden your workflow by blocking task transitions or automating run/telemetry behavior. All enforcement gates are disabled by default and must be explicitly enabled via the Settings API.
| Gate | Behavior | Default |
|---|---|---|
squadChat |
Auto-post task lifecycle events to squad chat | false |
reviewGate |
Blocks completion unless all four reviewScores are 10 (4x10 review gate). |
false |
closingComments |
Blocks completion unless at least one review comment has ≥20 characters. | false |
autoTelemetry |
Auto-emits run.started/run.completed on status changes. |
false |
autoTimeTracking |
Auto-starts/stops task timers when status changes. | false |
orchestratorDelegation |
Warn when orchestrator does implementation work instead of delegating | false |
ceremonyDesignReview |
Requires a design-review ceremony for high-risk or multi-agent task completion. Values: off, warn, block. |
off |
ceremonyFailureRetrospective |
Requires a retrospective ceremony after blocked work or failed attempts. Values: off, warn, block. |
off |
Feature settings live under /api/settings/features. Use PATCH to enable or disable
enforcement gates.
curl http://localhost:3001/api/settings/features | jq
curl -X PATCH http://localhost:3001/api/settings/features \
-H 'Content-Type: application/json' \
-d '{
"enforcement": {
"reviewGate": true,
"closingComments": true
}
}'
curl -X PATCH http://localhost:3001/api/settings/features \
-H 'Content-Type: application/json' \
-d '{
"enforcement": {
"autoTelemetry": true,
"autoTimeTracking": true,
"squadChat": true
}
}'
curl -X PATCH http://localhost:3001/api/settings/features \
-H 'Content-Type: application/json' \
-d '{
"enforcement": {
"orchestratorDelegation": true
}
}'
curl -X PATCH http://localhost:3001/api/settings/features \
-H 'Content-Type: application/json' \
-d '{
"enforcement": {
"ceremonyDesignReview": "block",
"ceremonyFailureRetrospective": "warn"
}
}'
curl -X PATCH http://localhost:3001/api/settings/features \
-H 'Content-Type: application/json' \
-d '{
"enforcement": {
"squadChat": false,
"reviewGate": false,
"closingComments": false,
"autoTelemetry": false,
"autoTimeTracking": false,
"orchestratorDelegation": false,
"ceremonyDesignReview": "off",
"ceremonyFailureRetrospective": "off"
}
}'
Note: If the
enforcementobject is missing entirely, all enforcement behavior is skipped.
What it does: Automatically posts task lifecycle events to squad chat when status changes.
Triggered on:
in-progress, blocked, done, cancelledRequires:
squadChat flag. This is controlled by the global enforcement.squadChat setting.Example:
When a task moves to in-progress, squad chat automatically receives:
Task US-42 started by VERITAS
Use case: Keep team visibility without manual posting. Great for distributed teams or multi-agent orchestration where you want automatic status broadcasts.
What it does: Blocks task completion unless all four review scores are 10.
Triggered on:
status: "done"Error response:
{
"success": false,
"error": {
"code": "REVIEW_GATE_FAILED",
"message": "Cannot complete task — 4x10 review scores required (all four dimensions must be 10)",
"details": {
"currentScores": {
"security": 10,
"reliability": 10,
"performance": 8,
"accessibility": 9
},
"requiredScores": {
"security": 10,
"reliability": 10,
"performance": 10,
"accessibility": 10
}
}
}
}
HTTP status: 400 Bad Request
Use case: Enforce quality standards — no task ships without perfect scores. Teams can customize score requirements by adjusting the enforcement logic.
What it does: Blocks task completion unless at least one review comment has ≥20 characters.
Triggered on:
status: "done"Error response:
{
"success": false,
"error": {
"code": "CLOSING_COMMENT_REQUIRED",
"message": "Cannot complete task — closing comment required (≥20 characters)",
"details": {
"commentCount": 2,
"longestComment": 15,
"requiredLength": 20
}
}
}
HTTP status: 400 Bad Request
Use case: Ensure agents provide a meaningful deliverable summary before marking work complete. Prevents “done” without explanation.
What it does: Automatically emits run.started and run.completed telemetry events on status changes.
Triggered on:
in-progress → emits run.starteddone or cancelled → emits run.completed with success: true/falseTelemetry events:
// run.started
{
"type": "run.started",
"taskId": "US-42",
"agent": "VERITAS",
"timestamp": "2026-02-10T14:30:00Z"
}
// run.completed
{
"type": "run.completed",
"taskId": "US-42",
"agent": "VERITAS",
"durationMs": 125000,
"success": true,
"timestamp": "2026-02-10T14:32:05Z"
}
Use case: Eliminate manual telemetry emission. The dashboard’s Success Rate, Run Duration, and Agent Comparison graphs rely on these events. Enable this gate to guarantee data integrity without relying on agents to remember.
Trade-off: Removes agent control over when runs “start” — status change becomes the source of truth. Best for teams where status transitions already represent work boundaries.
What it does: Automatically starts/stops time trackers when status changes.
Triggered on:
in-progress → calls POST /api/tasks/{id}/time/startdone, blocked, cancelled → calls POST /api/tasks/{id}/time/stopUse case: Remove the burden of manual timer management. Ensures accurate time tracking data for metrics and cost prediction. Pairs well with autoTelemetry for complete hands-off tracking.
Trade-off: Agents lose granular control over when timers start/stop. If an agent needs to pause work mid-status, this gate won’t capture that nuance.
What it does: Warns when the orchestrator agent does implementation work instead of delegating to sub-agents.
Triggered on:
Behavior:
squadChat is also enabled)Warning message:
[ORCHESTRATOR_DELEGATION_WARNING] Orchestrator VERITAS performed implementation work on US-42. Consider delegating to a sub-agent.
Use case: Maintain separation of concerns in multi-agent workflows. The orchestrator should plan, assign, and review — not implement. This gate acts as a guardrail to catch when the orchestrator strays from its role.
How it works: The system detects file writes and command executions. If the active agent is the orchestrator and the operation looks like implementation work (not planning/review), a warning is emitted.
Configuration: This gate is informational — it won’t block operations. It’s designed to surface anti-patterns without disrupting workflows.
What they do: Create auditable ceremony requirements before task completion when the task shape says human or cross-agent review is needed.
Triggered on:
ceremonyDesignReview: completing a task with multiple agents, critical priority, or review-heavy run modes (strategy, eng-review, paranoid-review)ceremonyFailureRetrospective: completing work that was blocked or has failed attemptsBehavior:
off: no requirement is createdwarn: a pending ceremony is created, a governance trace is recorded, and completion continuesblock: a pending ceremony is created, a governance trace is recorded, and completion is blocked until the matching ceremony is completedCeremony records: Stored under /api/ceremonies with required artifacts, participants, action items, and target links back to the task/run/workflow.
Complete a ceremony:
curl -X POST http://localhost:3001/api/ceremonies/ceremony_123/complete \
-H 'Content-Type: application/json' \
-d '{
"completedBy": "brad",
"artifacts": [
{
"kind": "decision-packet",
"title": "Design review notes",
"body": "Reviewed scope, risks, rollback, and follow-up actions."
}
],
"actionItems": [
{
"title": "Track follow-up hardening issue",
"priority": "high"
}
]
}'
Use case: Multi-agent and failed-run work should not silently disappear into Done. Ceremony gates leave a durable review or retrospective record, with governance traces explaining whether the gate warned or blocked.
If you’re an autonomous agent interacting with the Veritas Kanban API, here’s how to handle enforcement gates gracefully.
Before attempting a status change to done:
curl http://localhost:3001/api/settings/features | jq '.data.enforcement'
Response:
{
"squadChat": false,
"reviewGate": true,
"closingComments": true,
"autoTelemetry": false,
"autoTimeTracking": false,
"orchestratorDelegation": false,
"ceremonyDesignReview": "block",
"ceremonyFailureRetrospective": "warn"
}
What this tells you:
reviewGate: true → You must ensure all 4 review scores are 10 before marking doneclosingComments: true → You must have at least one comment ≥20 charactersautoTelemetry: false → You are responsible for emitting run.* events yourselfautoTimeTracking: false → You must manually start/stop timersceremonyDesignReview: block → Complete any pending design-review ceremony before marking risky work doneceremonyFailureRetrospective: warn → Expect a pending retrospective record after blocked or failed workBefore marking a task done, verify:
If reviewGate is enabled: Fetch the task and check reviewScores:
curl http://localhost:3001/api/tasks/US-42 | jq '.data.reviewScores'
All four dimensions (security, reliability, performance, accessibility) must be 10.
If closingComments is enabled: Fetch task comments and ensure at least one is ≥20 characters:
curl http://localhost:3001/api/tasks/US-42 | jq '.data.comments'
If either check fails, fix the deficiency before attempting completion:
reviewGate: Request a review or fix review issuesclosingComments: Add a substantive comment via POST /api/tasks/{id}/commentsIf you attempt a task completion and hit a gate, the API will return 400 Bad Request:
Example: reviewGate violation
curl -X PATCH http://localhost:3001/api/tasks/US-42 \
-H "Content-Type: application/json" \
-d '{"status":"done"}'
Response:
{
"success": false,
"error": {
"code": "REVIEW_GATE_FAILED",
"message": "Cannot complete task — 4x10 review scores required (all four dimensions must be 10)",
"details": {
"currentScores": {
"security": 10,
"reliability": 10,
"performance": 8,
"accessibility": 9
}
}
}
}
What to do:
error.code — This tells you which gate failederror.details — Contains actionable information (e.g., which scores are failing)REVIEW_GATE_FAILED: Address the failing review dimensionsCLOSING_COMMENT_REQUIRED: Add a substantive commentError codes you may encounter:
REVIEW_GATE_FAILED — 4x10 review scores not metCLOSING_COMMENT_REQUIRED — No comment ≥20 charactersAUTO_TELEMETRY_FAILED — Telemetry emission error (rare, usually indicates a system issue)AUTO_TIME_TRACKING_FAILED — Timer operation failed (rare)If you are the orchestrator and orchestratorDelegation is enabled:
sessions_spawn (OpenClaw) or your platform’s equivalentExample: Correct orchestrator behavior
# Orchestrator creates a sub-agent task
curl -X POST http://localhost:3001/api/tasks \
-H "Content-Type: application/json" \
-d '{
"title": "Implement OAuth login",
"type": "code",
"assignedAgent": "codex-1",
"parentTaskId": "US-42"
}'
If these gates are enabled, the system handles tracking automatically:
POST /api/tasks/{id}/time/start — it happens on status change to in-progressrun.started / run.completed events — they fire on status transitionsIf these gates are disabled:
Enforcement settings rarely change. Cache the enforcement config for the duration of your session and only re-fetch if:
400 error you didn’t expectEfficient pattern:
# Cache enforcement config at session start
ENFORCEMENT=$(curl -s http://localhost:3001/api/settings/features | jq '.data.enforcement')
# Use cached values for pre-flight checks
if [ "$(echo $ENFORCEMENT | jq -r '.reviewGate')" == "true" ]; then
# Check review scores before attempting completion
fi
The API does not fail silently — it returns 400 Bad Request with an error code and details. Check your error handling logic. If you’re using a library that swallows errors, add explicit error logging.
Check the enforcement config:
curl http://localhost:3001/api/settings/features | jq '.data.enforcement'
If a gate is true and you want it off, disable it:
curl -X PATCH http://localhost:3001/api/settings/features \
-H 'Content-Type: application/json' \
-d '{"enforcement":{"<gate-name>":false}}'
The current implementation is hard-coded to 4x10. To customize:
server/src/middleware/enforcement-middleware.tsThis happens if both autoTelemetry is enabled AND your agent manually emits events. Pick one:
autoTelemetry and remove manual run.* calls from your agentautoTelemetry and keep manual callsDo not enable autoTelemetry if your agents already emit telemetry manually.
Enforcement gates turn process suggestions into structural guarantees. Use them to harden your workflow when quality gates matter more than speed.