Skip to main content

Validation gates

Validation in Pulse is not advisory. The four governance gates are enforced server-side, and 10 of Pulse’s 216 MCP tools exist specifically to record the evidence those gates require. Skip the evidence and the transition fails — move_spec and move_card reject the request with a CONFLICT error. This page documents the four gates and the tools that drive them:
  • Gate 1 — Spec evaluation (validated → in_progress). Qualitative score with narrative; default threshold 80. 4 tools (server.py:10089–10974).
  • Gate 2 — Spec validation (approved → validated). Three-axis threshold check (completeness / assertiveness / ambiguity) that locks spec content. 2 tools (server.py:12323–12426).
  • Gate 3 — Task validation (validation → done). Independent reviewer evidence; auto-fail on threshold violations. 3 tools (server.py:12165–12322).
  • Gate 4 — Test theater prevention (update_test_scenario_status). Test status updates require structured evidence; sprint close re-validates every passed scenario. 1 tool (server.py:6267).
Source-of-truth citations: okto-pulse-feature-inventory.md:353–370 (spec evaluation), :371–377 (spec validation), :485–492 (task validation), :333–352 (test scenario status), :982–1021 (governance gates), :877–887 (Validator preset). For lifecycle context — how each gate slots into the pipeline — see The ADLC pipeline. For permission-flag definitions, see Permissions on the MCP overview.

Why four gates and not one

Pulse splits validation into four because they answer different questions: Each gate has its own permission flag, its own data shape, and its own retry path. An agent cannot satisfy one gate by impersonating another.

Gate 1 — Spec evaluation

The spec evaluation captures a qualitative judgement of spec quality, with a written narrative the gate threshold is measured against. Default threshold: score ≥ 80. Configurable per board.
Submitting an evaluation does not advance the spec — it records the evidence. The transition itself happens via move_spec and re-checks the latest evaluation against the threshold. An evaluation can be delete-d and re-submitted while the spec is still validated.

Gate 2 — Spec validation

Spec validation is the content-lock gate. It runs three threshold checks — completeness, assertiveness, ambiguity — each with written evidence. Once it passes, the spec is locked: edits require an explicit validated_to_draft move and a justification.
The spec content lock is what makes a spec a contract rather than a wiki page. Cards in-flight against a locked spec see the same content the implementer started with. Bypassing the lock to “just fix a typo” is rejected — make the edit explicit by moving the spec to validated_to_draft, recording the change, and re-running both gates.

Gate 3 — Task validation

Task validation is the independent-reviewer gate. The closing agent provides a conclusion, completeness, and drift via update_card. A separate reviewer agent then submits a validation record — auto-fail rules apply even if the reviewer’s recommendation is approve.

Auto-fail rules

The Task Validation Gate runs auto-fail checks independent of the reviewer’s recommendation: Auto-fails are reported via the auto_fail and auto_fail_reason fields on the validation record. They cannot be overridden by the closing agent; the failing condition has to be fixed and the validation re-submitted.
The Task Validation Gate is a board policy, not a hard requirement. Boards in solo-developer mode can disable it (the validation → done transition then runs only the conclusion + completeness + drift fields check). Multi-agent boards almost always leave it on — it is the cheapest defense against a closing agent rubber-stamping its own work.

Gate 4 — Test theater prevention

A spec’s → done gate requires every linked test scenario to be passed. Without an evidence requirement on update_test_scenario_status, agents can simply set status = passed and walk away. Pulse rejects this. The evidence schema for status passed: Setting status = passed without these fields returns VALIDATION_ERROR. Sprint close re-validates every scenario marked passed — a scenario whose evidence has been deleted between status update and sprint close regresses to pending and the sprint cannot close.
A scenario can also be moved to failing, skipped, or pending. Only passed carries the evidence gate — but failing is what unlocks the bug-card test-first gate (a bug card cannot move to in_progress without a failing linked scenario). See the Sprints & cards page for the full bug-card flow.

The Validator preset

Pulse ships 5 built-in agent presets (okto-pulse-feature-inventory.md:877–887). One of them — Validator — is the only preset that carries Permissions.TASK_VALIDATION_SUBMIT by default. The closing agent and the validating agent are intentionally not the same role. Boards configure agents to a preset on creation. To submit a task validation as a non-Validator preset agent, ask a board admin to assign you the Validator preset or to create a custom preset with Permissions.TASK_VALIDATION_SUBMIT.
On a single-developer board the same human owns every agent role, so the preset matters less. On multi-agent boards (one agent per role) the Validator preset is the protection — the implementer agent cannot rubber-stamp its own work because the submit_task_validation permission flag is not on its preset.

Permissions

A blocked submit returns FORBIDDEN. Adjust the agent’s preset in Board → Agents → Edit.

Errors


Next steps

Specs

Author the spec content the evaluation and validation gates score.

Sprints & cards

Card lifecycle, conclusion fields, and the bug-card test-first gate.

Comments & questions

Resolve gate-blocking ambiguity via Q&A on the parent entity.

ADLC pipeline

Where each gate sits in the end-to-end flow.
Last modified on May 17, 2026