M1: Beads Repo and Role Labels
2026-02-20T19:16:35Z by Showboat 0.6.0
Starting M1 QA. Pre-existing state: 26 beads total (1 open, 25 closed). The open bead is 'beads-84n' with label 'dev'.
export BEADS_DIR=$(pwd)/beads/.beads && bd status
📊 Issue Database Status
Summary:
Total Issues: 26
Open: 1
In Progress: 0
Blocked: 0
Closed: 25
Ready to Work: 1
For more details, use 'bd list' to see individual issues.
PASS: bd status works. Repo is healthy with 26 beads (1 open, 25 closed).
export BEADS_DIR=$(pwd)/beads/.beads && bd create "QA: dev-only task" --labels dev -d "Task labeled dev for QA testing" --json
{
"id": "beads-1tk",
"title": "QA: dev-only task",
"description": "Task labeled dev for QA testing",
"status": "open",
"priority": 2,
"issue_type": "task",
"owner": "hild@b4mad.net",
"created_at": "2026-02-20T19:17:55.795273Z",
"created_by": "Marcel Hild",
"updated_at": "2026-02-20T19:17:55.795273Z"
}
Note: bd create --json output does NOT include labels field. This is a known issue (see CLAUDE.md lessons learned). Need bd show to verify labels.
export BEADS_DIR=$(pwd)/beads/.beads && bd show beads-1tk --json
[
{
"id": "beads-1tk",
"title": "QA: dev-only task",
"description": "Task labeled dev for QA testing",
"status": "open",
"priority": 2,
"issue_type": "task",
"owner": "hild@b4mad.net",
"created_at": "2026-02-20T19:17:56Z",
"created_by": "Marcel Hild",
"updated_at": "2026-02-20T19:17:56Z",
"labels": [
"dev"
]
}
]
PASS: Dev-labeled bead created (beads-1tk). bd show confirms labels: [dev]. Also confirms bd show returns an array.
export BEADS_DIR=$(pwd)/beads/.beads && bd create "QA: pm-only task" --labels pm -d "Task labeled pm for QA testing" --json
{
"id": "beads-yra",
"title": "QA: pm-only task",
"description": "Task labeled pm for QA testing",
"status": "open",
"priority": 2,
"issue_type": "task",
"owner": "hild@b4mad.net",
"created_at": "2026-02-20T19:18:15.352864Z",
"created_by": "Marcel Hild",
"updated_at": "2026-02-20T19:18:15.352864Z"
}
export BEADS_DIR=$(pwd)/beads/.beads && bd create "QA: multi-label task" --labels dev --labels pm -d "Task labeled both dev and pm" --json
{
"id": "beads-91j",
"title": "QA: multi-label task",
"description": "Task labeled both dev and pm",
"status": "open",
"priority": 2,
"issue_type": "task",
"owner": "hild@b4mad.net",
"created_at": "2026-02-20T19:18:20.269501Z",
"created_by": "Marcel Hild",
"updated_at": "2026-02-20T19:18:20.269501Z"
}
export BEADS_DIR=$(pwd)/beads/.beads && bd create "QA: no-label task" -d "Task with no labels for QA testing" --json
{
"id": "beads-0p0",
"title": "QA: no-label task",
"description": "Task with no labels for QA testing",
"status": "open",
"priority": 2,
"issue_type": "task",
"owner": "hild@b4mad.net",
"created_at": "2026-02-20T19:18:24.555213Z",
"created_by": "Marcel Hild",
"updated_at": "2026-02-20T19:18:24.555213Z"
}
export BEADS_DIR=$(pwd)/beads/.beads && bd show beads-91j --json
[
{
"id": "beads-91j",
"title": "QA: multi-label task",
"description": "Task labeled both dev and pm",
"status": "open",
"priority": 2,
"issue_type": "task",
"owner": "hild@b4mad.net",
"created_at": "2026-02-20T19:18:20Z",
"created_by": "Marcel Hild",
"updated_at": "2026-02-20T19:18:20Z",
"labels": [
"dev",
"pm"
]
}
]
PASS: Created 4 test beads: dev-only (beads-1tk), pm-only (beads-yra), multi-label dev+pm (beads-91j), no-label (beads-0p0). Multi-label bead confirmed to have both labels via bd show.
export BEADS_DIR=$(pwd)/beads/.beads && bd ready --label dev --json
[
{
"id": "beads-1tk",
"title": "QA: dev-only task",
"description": "Task labeled dev for QA testing",
"status": "open",
"priority": 2,
"issue_type": "task",
"owner": "hild@b4mad.net",
"created_at": "2026-02-20T19:17:56Z",
"created_by": "Marcel Hild",
"updated_at": "2026-02-20T19:17:56Z",
"dependency_count": 0,
"dependent_count": 0,
"comment_count": 0
},
{
"id": "beads-84n",
"title": "Dev only",
"description": "Only for dev",
"status": "open",
"priority": 1,
"issue_type": "task",
"owner": "hild@b4mad.net",
"created_at": "2026-02-20T19:04:57Z",
"created_by": "Marcel Hild",
"updated_at": "2026-02-20T19:04:57Z",
"dependency_count": 0,
"dependent_count": 0,
"comment_count": 0
},
{
"id": "beads-91j",
"title": "QA: multi-label task",
"description": "Task labeled both dev and pm",
"status": "open",
"priority": 2,
"issue_type": "task",
"owner": "hild@b4mad.net",
"created_at": "2026-02-20T19:18:20Z",
"created_by": "Marcel Hild",
"updated_at": "2026-02-20T19:18:20Z",
"dependency_count": 0,
"dependent_count": 0,
"comment_count": 0
}
]
export BEADS_DIR=$(pwd)/beads/.beads && bd ready --label pm --json
[
{
"id": "beads-91j",
"title": "QA: multi-label task",
"description": "Task labeled both dev and pm",
"status": "open",
"priority": 2,
"issue_type": "task",
"owner": "hild@b4mad.net",
"created_at": "2026-02-20T19:18:20Z",
"created_by": "Marcel Hild",
"updated_at": "2026-02-20T19:18:20Z",
"dependency_count": 0,
"dependent_count": 0,
"comment_count": 0
},
{
"id": "beads-yra",
"title": "QA: pm-only task",
"description": "Task labeled pm for QA testing",
"status": "open",
"priority": 2,
"issue_type": "task",
"owner": "hild@b4mad.net",
"created_at": "2026-02-20T19:18:15Z",
"created_by": "Marcel Hild",
"updated_at": "2026-02-20T19:18:15Z",
"dependency_count": 0,
"dependent_count": 0,
"comment_count": 0
}
]
PASS: Label filtering works correctly. 'bd ready --label dev' returns 3 beads (2 dev-only + 1 multi-label). 'bd ready --label pm' returns 2 beads (1 pm-only + 1 multi-label). No cross-contamination. Multi-label bead (beads-91j) correctly appears in both filters.
export BEADS_DIR=$(pwd)/beads/.beads && bd ready --json
[
{
"id": "beads-0p0",
"title": "QA: no-label task",
"description": "Task with no labels for QA testing",
"status": "open",
"priority": 2,
"issue_type": "task",
"owner": "hild@b4mad.net",
"created_at": "2026-02-20T19:18:25Z",
"created_by": "Marcel Hild",
"updated_at": "2026-02-20T19:18:25Z",
"dependency_count": 0,
"dependent_count": 0,
"comment_count": 0
},
{
"id": "beads-1tk",
"title": "QA: dev-only task",
"description": "Task labeled dev for QA testing",
"status": "open",
"priority": 2,
"issue_type": "task",
"owner": "hild@b4mad.net",
"created_at": "2026-02-20T19:17:56Z",
"created_by": "Marcel Hild",
"updated_at": "2026-02-20T19:17:56Z",
"dependency_count": 0,
"dependent_count": 0,
"comment_count": 0
},
{
"id": "beads-84n",
"title": "Dev only",
"description": "Only for dev",
"status": "open",
"priority": 1,
"issue_type": "task",
"owner": "hild@b4mad.net",
"created_at": "2026-02-20T19:04:57Z",
"created_by": "Marcel Hild",
"updated_at": "2026-02-20T19:04:57Z",
"dependency_count": 0,
"dependent_count": 0,
"comment_count": 0
},
{
"id": "beads-91j",
"title": "QA: multi-label task",
"description": "Task labeled both dev and pm",
"status": "open",
"priority": 2,
"issue_type": "task",
"owner": "hild@b4mad.net",
"created_at": "2026-02-20T19:18:20Z",
"created_by": "Marcel Hild",
"updated_at": "2026-02-20T19:18:20Z",
"dependency_count": 0,
"dependent_count": 0,
"comment_count": 0
},
{
"id": "beads-yra",
"title": "QA: pm-only task",
"description": "Task labeled pm for QA testing",
"status": "open",
"priority": 2,
"issue_type": "task",
"owner": "hild@b4mad.net",
"created_at": "2026-02-20T19:18:15Z",
"created_by": "Marcel Hild",
"updated_at": "2026-02-20T19:18:15Z",
"dependency_count": 0,
"dependent_count": 0,
"comment_count": 0
}
]
PASS: Unlabeled bead (beads-0p0) appears in unfiltered 'bd ready' (5 beads) but NOT in 'bd ready --label dev' (3 beads) or 'bd ready --label pm' (2 beads). Label filtering correctly excludes unlabeled beads.
export BEADS_DIR=$(pwd)/beads/.beads && bd create "QA: unusual label" --labels "qa-testing-123" -d "Bead with unusual label" --json
{
"id": "beads-2aw",
"title": "QA: unusual label",
"description": "Bead with unusual label",
"status": "open",
"priority": 2,
"issue_type": "task",
"owner": "hild@b4mad.net",
"created_at": "2026-02-20T19:19:16.908231Z",
"created_by": "Marcel Hild",
"updated_at": "2026-02-20T19:19:16.908231Z"
}
export BEADS_DIR=$(pwd)/beads/.beads && bd ready --label qa-testing-123 --json
[
{
"id": "beads-2aw",
"title": "QA: unusual label",
"description": "Bead with unusual label",
"status": "open",
"priority": 2,
"issue_type": "task",
"owner": "hild@b4mad.net",
"created_at": "2026-02-20T19:19:17Z",
"created_by": "Marcel Hild",
"updated_at": "2026-02-20T19:19:17Z",
"dependency_count": 0,
"dependent_count": 0,
"comment_count": 0
}
]
PASS: Unusual label 'qa-testing-123' works fine. Created and filtered correctly.
export BEADS_DIR=$(pwd)/beads/.beads && bd ready --label nonexistent --json
[]
PASS: Filtering by nonexistent label returns empty array [], no error.
export BEADS_DIR=$(pwd)/beads/.beads && bd show beads-0p0 --json
[
{
"id": "beads-0p0",
"title": "QA: no-label task",
"description": "Task with no labels for QA testing",
"status": "open",
"priority": 2,
"issue_type": "task",
"owner": "hild@b4mad.net",
"created_at": "2026-02-20T19:18:25Z",
"created_by": "Marcel Hild",
"updated_at": "2026-02-20T19:18:25Z"
}
]
Observation: No-label bead (beads-0p0) via bd show --json omits the 'labels' field entirely rather than showing 'labels: []'. Scripts should check for missing key, not just empty array.
export BEADS_DIR=$(pwd)/beads/.beads && bd create "QA: no description" --labels dev --json 2>&1
⚠ Creating issue without description.
Issues without descriptions lack context for future work.
Consider adding --description="Why this issue exists and what needs to be done"
{
"id": "beads-78o",
"title": "QA: no description",
"status": "open",
"priority": 2,
"issue_type": "task",
"owner": "hild@b4mad.net",
"created_at": "2026-02-20T19:19:50.7725Z",
"created_by": "Marcel Hild",
"updated_at": "2026-02-20T19:19:50.7725Z"
}
PASS: Creating bead without --description emits a warning but succeeds. Confirms CLAUDE.md lesson learned.
Observation: bd ready --json output does NOT include 'labels' field (confirmed by inspecting all results above). This means you cannot determine a bead's labels from bd ready alone — must use bd show or bd list for that.
export BEADS_DIR=$(pwd)/beads/.beads && bd create "QA: empty label" --labels "" -d "Bead with empty string label" --json 2>&1
{
"id": "beads-ye6",
"title": "QA: empty label",
"description": "Bead with empty string label",
"status": "open",
"priority": 2,
"issue_type": "task",
"owner": "hild@b4mad.net",
"created_at": "2026-02-20T19:20:06.105856Z",
"created_by": "Marcel Hild",
"updated_at": "2026-02-20T19:20:06.105856Z"
}
export BEADS_DIR=$(pwd)/beads/.beads && bd show beads-ye6 --json
[
{
"id": "beads-ye6",
"title": "QA: empty label",
"description": "Bead with empty string label",
"status": "open",
"priority": 2,
"issue_type": "task",
"owner": "hild@b4mad.net",
"created_at": "2026-02-20T19:20:06Z",
"created_by": "Marcel Hild",
"updated_at": "2026-02-20T19:20:06Z"
}
]
Edge case: Empty string label ('--labels ""') is silently ignored — bead has no labels field. No error, no warning. Arguably correct behavior.
export BEADS_DIR=$(pwd)/beads/.beads && bd show beads-zzz --json 2>&1; echo "exit: $?"
Error fetching beads-zzz: no issue found matching "beads-zzz"
{
"error": "no issues found matching the provided IDs"
}
exit: 1
PASS: bd show with nonexistent ID returns JSON error object and exit code 1. Good error handling.
export BEADS_DIR=$(pwd)/beads/.beads && for id in beads-1tk beads-yra beads-91j beads-0p0 beads-2aw beads-78o beads-ye6; do echo "Closing $id:" && bd close $id --reason "QA test cleanup" --json 2>&1 | python3 -c "import sys,json; d=json.load(sys.stdin); print(d[0][\"status\"] if isinstance(d,list) else d.get(\"status\",d))"; done
Closing beads-1tk:
closed
Closing beads-yra:
closed
Closing beads-91j:
closed
Closing beads-0p0:
closed
Closing beads-2aw:
closed
Closing beads-78o:
closed
Closing beads-ye6:
closed
Observation: bd close --json also returns an array (like bd show). Consistent but surprising — CLAUDE.md only documents this for bd show. All 7 QA test beads closed successfully.
export BEADS_DIR=$(pwd)/beads/.beads && bd status
📊 Issue Database Status
Summary:
Total Issues: 33
Open: 1
In Progress: 0
Blocked: 0
Closed: 32
Ready to Work: 1
For more details, use 'bd list' to see individual issues.
Post-cleanup: 33 total beads (1 open = pre-existing beads-84n, 32 closed). Repo is healthy.
M1 QA Summary
All M1 acceptance criteria PASS.
Tests Run
- bd status — Repo healthy, works correctly
- Create dev-labeled bead — PASS
- Create pm-labeled bead — PASS
- Create multi-label (dev+pm) bead — PASS
- Create no-label bead — PASS
- bd ready --label dev — Returns only dev beads (including multi-label), excludes pm-only and unlabeled — PASS
- bd ready --label pm — Returns only pm beads (including multi-label), excludes dev-only and unlabeled — PASS
- Unlabeled beads excluded from label-filtered ready — PASS
- Multi-label bead appears in both dev and pm filters — PASS
- Unusual label (qa-testing-123) — Works fine, PASS
- Nonexistent label filter — Returns empty array, no error, PASS
- Empty string label — Silently ignored, no labels stored, PASS
- bd show returns array — Confirmed, PASS
- bd create without description — Warning emitted but succeeds, PASS
- bd show nonexistent ID — Returns error JSON + exit 1, PASS
Observations
- bd create --json output omits labels field (must use bd show to verify)
- bd ready --json output omits labels field (must use bd show or bd list)
- bd close --json also returns array (not just bd show)
- No-label beads omit the labels key entirely (not labels: [])
- Empty string label is silently discarded
No Blockers Found
M1 is solid. All core functionality works as specified.