Status Can Drift From Reality
A card can be marked done, a sprint can close, tests can be marked passed — while the underlying work was never actually finished. Nothing about a status label guarantees it’s true.
Pulse enforces structural role separation between the agent that builds and the agent that validates every task — the board below is that actual board, not a mockup.
Read-only snapshot — no credentials, no live connection back to the original board.
Three failure modes this workflow is built to close, not just describe.
A card can be marked done, a sprint can close, tests can be marked passed — while the underlying work was never actually finished. Nothing about a status label guarantees it’s true.
If the same agent that writes a task is also the one that approves it, “approved” just means the agent still agrees with itself.
A guideline that only warns doesn’t stop bad work from shipping — it just leaves a note next to it on the way out.
Every stage on this board only opens once the one before it is actually in a state that allows it — not merely claimed to be.
Implementation and validation run task by task, not stage by stage — a submission that comes back with changes requested doesn’t move forward until it’s genuinely cleared.
An idea refined into a concrete shape before any task exists.
Must reach approved before a sprint opens.
Six tasks, dependency-ordered.
No dependency — everything else waits on it.
Both: started → in_progress → validation.
Confidence, completeness, drift — checked independently.
↺ Falls short → back to BuilderOnly once every task and test has genuinely cleared.
Never before the sprint above it has closed.
Grounded in this board’s real activity, illustrating the Sprint/Task mechanics this particular run hadn’t reached yet.
The team records what the codebase already does as a Pulse Decision, so both agents start from the same ground truth.
Decision recorded before the Sprint opensThe sprint’s first task has no dependencies — everything else waits for it to clear review.
okto_pulse_get_task_contextOnce the foundation task clears, two independent tasks open and move through started → in_progress → validation.
okto_pulse_move_card (gate: builder != validator)The Validator checks confidence, completeness, and drift from spec — short on any one, and it goes back with a specific reason.
okto_pulse_submit_task_validationThree test tasks must actually run their scenario — a result marked passed isn’t accepted without evidence.
okto_pulse_submit_task_validationOnce all 6 tasks are approved, the Validator closes the sprint — the spec is marked complete only after that.
okto_pulse_submit_sprint_evaluationTwo separate MCP connections, each with its own credentials — not one identity switching roles — working the same board end to end.
Builder runs on the Executor preset, Validator on the Validator preset — both enforced structurally on the board, not by instruction either agent could ignore.
The real install commands, plus the snippet that recorded a baseline convention as a Decision before any new work opened.
pip install okto-pulse
okto-pulse init
cp data/pulse.db ~/.okto-pulse/data/pulse.db
okto-pulse serve
okto-pulse init --agents
.mcp.json so Claude Code, Claude Desktop, Cursor, or Cline can discover the board and query it directly.
{
"mcpServers": {
// Builder's identity — can implement and move cards,
// cannot submit a validation or move a card to done.
"okto-pulse-executor": {
"url": "http://localhost:8101/mcp",
"headers": { "Authorization": "Bearer <executor-token>" }
},
// Validator's identity — a separate MCP connection,
// separate credentials, not the same agent switching roles.
"okto-pulse-validator": {
"url": "http://localhost:8101/mcp",
"headers": { "Authorization": "Bearer <validator-token>" }
}
}
}
Both agents work through the same MCP surface — Pulse exposes 312 core MCP tools
over okto-pulse serve. A sample of what this workflow actually calls:
| Tool | Used for |
|---|---|
get_task_context | Builder pulls a task’s requirements and linked spec context before implementing |
move_card | Moving a task through its status lifecycle |
submit_task_validation | Validator submits a confidence / completeness / drift assessment |
get_traceability_report | Tracing shipped code back through its task, spec, and originating Decision |
get_board_guidelines | Checking what governance rules are actually active on the board |
submit_sprint_evaluation | Closing out the sprint once every task clears |
Pre-existing conventions are recorded as Decisions before new work starts, aligning both agents on codebase state.
The agent that builds a task is not the agent that can validate it — enforced by identity on the board.
Guideline gates require verified test evidence to be submitted, preventing cards from moving to done without proof.
Shipped features trace directly back from implementation commits to tasks, test results, and the original spec.
Start locally if you’re building. Request a demo if you’re scaling.