Governance without coordination
A Pulse card can reach done with no proof the handoff ever happened.
No atomic claim/handoff primitive. A coordination problem, not a spec problem.
Pulse decides what's built and what "done" means. Nexus decides who gets to touch it and when. Run together, on a real forked codebase.
Governance tracks work but not coordination. Coordination moves work but proves no "done." This run tests both gaps directly, not just describes them.
A Pulse card can reach done with no proof the handoff ever happened.
No atomic claim/handoff primitive. A coordination problem, not a spec problem.
The frontend card's first submission: completeness 78, board threshold 80.
"The agent said it's done" isn't evidence.
The sync/async threshold, CSV columns, signed-URL expiry: each resolved by Q&A before a line of code existed.
A first reading becomes a baked-in assumption, with no record of the alternatives.
The Nexus handoff's opened → claimed → completed trail.
A chat transcript isn't durable storage. Kill the process, lose the state.
The real Pulse app and the real Nexus workspace, live-look and interactive, not screenshots.
Wire Plane's Issues List to its own unused async CSV export pipeline. Pulse owns what; Nexus owns who.
Investigated and refined against real code before a line is written.
Every spec clears five quality gates. Every card's "done" is independently validated.
API contract created under session fallback local-agent and claimed/completed by frontend-agent.
A real, replayable event log, not a chat transcript that dies with the session.
Every stage a real MCP tool call touched, from the first ambiguity-killing question to the last regression fix.
Sync/async threshold, CSV columns, signed-URL expiry, resolved via Q&A first.
An unused async export pipeline already exists: three assumptions superseded.
19 evaluated requirements (8 functional + 5 technical + 6 acceptance criteria), 6 business rules, 1 API contract — gate passed across all 5 dimensions (Completeness 85 ≥ 70, Granularity 86 ≥ 80, Coherence 84 ≥ 80, Test Quality 85 ≥ 80, Ambiguity 18 ≤ 30).
Backend, Frontend, and their two dependent test cards, made active.
Real code, real pytest run (7/7 in test_export_issues_rich_filters_app.py), card reaches done.
handoff_create → handoff_claim → handoff_complete, contract refined on completion.
Real code against the delivered contract, verified by a clean typecheck.
Every completion claim is checked against the board's own completeness threshold before it counts as done.
Playwright added, verified end-to-end, a real regression caught and fixed.
The actual state behind this run: see demo-state/ for what each file is and how to view it.
The ambiguity-killer Q&A: sync/async threshold, CSV columns, signed-URL expiry, resolved before a spec is written.
The real codebase investigation that superseded three of the ideation's assumptions before implementation began.
Requirement Lint at 0 defects, decomposed into the active sprint's 4 cards.
Contract created under session fallback local-agent (due to an MCP session reconnect quirk) and claimed/completed by frontend-agent.
The real API contract payload, refined and reported back on completion.
No step in this run is "the agent said so." Every number below is a real test run, a real gate score, or a real, replayable result.
No shared code, config, or service. Each is a precedent for the other, not a dependency. The only link: one agent client holding both MCP URLs, against the same plane/ checkout.
| Demo name | okto-plane-handoff-demo |
| Target app | Fork of makeplane/plane (Django API + React/Vite web, ~35k stars), branch feature/issue-csv-export |
| Feature | Filter-aware CSV export on the Issues List view, wired into Plane's own existing (previously unused) async export pipeline |
| Pulse board | My Board: 1 ideation, 1 refinement, 1 spec, 1 sprint, 4 cards |
| Nexus workspace | Agents spec-agent, backend-agent, frontend-agent, validator-agent, and local-agent (session fallback) registered (5 total) |
spec-agent
Ideation, refinement, spec authoring and validation
backend-agent
Implemented the export endpoint + Celery task, ran real tests
frontend-agent
Claimed the handoff, implemented the toolbar action against the contract
validator-agent
Submitted task validations against Pulse's thresholds
plane/apps/api/plane/app/views/exporter/base.py
ExportIssuesEndpoint now accepts an optional rich_filters payload, validated via the same ComplexFilterBackend the live Issues List endpoint already uses.
apps/api/plane/bgtasks/export_task.py
issue_export_task applies rich_filters as an additional constraint on the existing role-scoped queryset, via _apply_rich_filters.
apps/web/core/components/issues/export-csv-action.tsx
The toolbar action, wired into IssuesHeader's Header.RightItem, gated by the same permission check as the adjacent "Add work item" button.
apps/api/.../test_export_issues_rich_filters_app.py
The backend test suite: 7 passing contract and unit tests in test_export_issues_rich_filters_app.py, covering the queryset-construction path end to end.
apps/web/e2e/export-csv.spec.ts
The frontend Playwright suite: 3 scenarios, written and committed.
Four moments where real evidence overrode the original plan, each one written down with what triggered it and what it changed.
Plane already shipped a complete async export pipeline: an unused rich_filters field, a stubbed filter-picker in the frontend. All three of the ideation's proposals (a new sync path, a 24h URL expiry, a new column set) were dropped for Plane's own existing conventions.
→ Less new code, more brownfield-correct, informed by what the codebase already had, not by assumption.
The backend's first pass assumed Plane's legacy flat filter-key vocabulary. Investigating the Issues List view's real filter store during frontend implementation found it already produces the JSON filter-tree shape the backend natively consumes.
→ The conversion step was removed; the frontend needs zero client-side mapping. The refinement was reported back through the real Nexus handoff result.
Pulse's task-validation gate requires estimated_completeness >= 80, enforced independently of the reviewer's own recommendation. The Frontend card was submitted at an honest 78, real evidence, not a rounded-up number, alongside a reviewer recommendation of "approve" on the implementation's own merits.
→ The gate applied its own arithmetic. This is the gate doing exactly what it's designed to do: a threshold a reviewer's opinion can't override.
Closing the test-coverage gap meant standing up Playwright infrastructure that didn't exist yet. Along the way, running the export pipeline against live infrastructure, the real Celery worker, database, and object storage, verified the implementation more strongly than the unit suite alone.
→ The suite, the verified fix, and a new regression test shipped; one environment-tuning step is documented as the exact next move.
Four commands stand up the whole stack: Plane, Pulse, and Nexus, wired together.
Install Pulse + Nexus
pip install okto-pulse
pip install "okto-nexus[serve]"
Clone & install deps
git clone github.com/Infrasity-Labs/
okto-plane-handoff-demo
pip install -r scripts/requirements.txt
Bring up the stack
./scripts/00_setup.sh
Seed the Pulse board
python3 scripts/01_seed_pulse_board.py \
--api-key dash_<your-key>
localhost Plane itself, via the proxy
127.0.0.1:8100 Pulse dashboard
127.0.0.1:8202 Nexus dashboard
Real. The board export, spec export, sprint structure, handoff event log, and screenshots come straight from demo-state/ and docs/walkthrough.md in the repo. Note that score records exist across two places: the five-dimension validation gate is recorded in docs/walkthrough.md, while the spec evaluation breakdown is exported in demo-state/spec-export.json.
Either one answers half the question. Pulse alone can't structurally guarantee a handoff happened; Nexus alone has no gated proof of "done." Together, a spec-gated card gets handed off with an audit trail proving both.
No. They're architecturally independent: no shared code, config, or service. The only connection is one agent client holding both MCP server URLs, working against the same plane/ checkout.
Filter-aware CSV export on Plane's Issues List view, wired into Plane's own existing (previously unused) async export pipeline, not a toy example.
Yes. See Run It Yourself below. Fork the repo, run the setup script against your own Pulse instance, and connect your own agents to your own Nexus instance.
This repo's own content (docs, scripts, demo-state) is Elastic License 2.0, matching Pulse and Nexus. The embedded plane/ fork retains its own AGPL-3.0 license.
Fork the repo, run the setup script against your own Pulse, and connect your own agents to your own Nexus.