Extreme-BDD
Workflow

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

  1. Write a scenario

    Add a @pending scenario to the appropriate bdd/features/<file>.feature. Required tags: one priority (@p1, @p2, or @p3), plus the actor line As a <Profile> where <Profile> exists in docs/USER_PROFILES.md.

  2. Open the board

    Run python3 scripts/board_server.py and visit http://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 in bdd/BOARD_STATE.json.

  3. Mirror to Radicle issues

    Run python3 scripts/sync_bdd_issues.py --apply. The script opens or edits a Radicle issue for each @pending scenario, applies bdd and p1/p2/p3 labels, and writes the scenario → issue mapping to bdd/ISSUE_MAP.json.

  4. Implement & promote

    Implement the scenario, remove @pending, run the targeted BDD harness, and gossip the change via rad 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+)

Sovereignty note Every step above runs against your local working tree and your local Radicle node. No SaaS account, no external tracker, no forge. The moment you rad sync, your collaborators get the same backlog without any of you logging into a shared system.