One artifact, four moves.
The spec is the backlog. The backlog is the board. The board is the list of Radicle issues. Each move keeps those four views aligned without copying data between systems.
The Extreme-BDD loop
-
Write a scenario
Add a
@pendingscenario to the appropriatebdd/features/<file>.feature. Required tags: one priority (@p1,@p2, or@p3), plus the actor line As a <Profile> where<Profile>exists indocs/USER_PROFILES.md. -
Open the board
Run
python3 scripts/board_server.pyand visithttp://127.0.0.1:8844/. The board reads your working tree, so the new scenario shows up before you commit. Drag it across columns to set lifecycle state inbdd/BOARD_STATE.json. -
Mirror to Radicle issues
Run
python3 scripts/sync_bdd_issues.py --apply. The script opens or edits a Radicle issue for each@pendingscenario, appliesbddandp1/p2/p3labels, and writes the scenario → issue mapping tobdd/ISSUE_MAP.json. -
Implement & promote
Implement the scenario, remove
@pending, run the targeted BDD harness, and gossip the change viarad sync. The board reflects the change immediately; collaborators see it after their next sync.
The two surfaces, the one mirror
Canonical surface (git)
Working tree files: bdd/features/*.feature, bdd/BOARD_STATE.json, bdd/ISSUE_MAP.json. Uncommitted edits are visible to the board.
Collaboration surface (Radicle)
rad issue list and rad issue show. Discussion, ownership, assignment, and prioritisation happen here so they replicate via gossip.
Mirror step (script)
scripts/sync_bdd_issues.py copies metadata canonical → collaboration. It never invents new backlog items.
Why @pending is the unit of work
@pending means “this scenario describes desired
behavior that is not yet implemented.” Removing the tag is the
explicit, auditable promotion event from “backlog” to
“done”. There is no half-state. The BDD runner skips
@pending scenarios, so the suite is always green on what
has shipped and silent on what has not.
Lifecycle projection (protocol 1.11+)
- Non-pending BDD alone does not prove a card is Done.
- Current passing PMCI/local test evidence can project a non-pending scenario to Done.
- Current failing evidence projects a scenario back to Testing even when board state persisted it in Done.
- Passing evidence for an older commit is stale and cannot close the current card.
bdd/BOARD_STATE.jsonremains ordering, timestamp, and explicit-override metadata; the server returns a derivedcards[].columnIdwithout rewriting the file.
rad sync, your collaborators get the same
backlog without any of you logging into a shared system.