From 6c8e68195a8c0ab697554442d2d1a87e9f6126b1 Mon Sep 17 00:00:00 2001 From: beads/crew/fang Date: Thu, 1 Jan 2026 15:33:43 -0800 Subject: [PATCH] bd sync: 2026-01-01 15:33:43 --- .beads/issues.jsonl | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/.beads/issues.jsonl b/.beads/issues.jsonl index 403c8faa..08918538 100644 --- a/.beads/issues.jsonl +++ b/.beads/issues.jsonl @@ -12,6 +12,7 @@ {"id":"bd-0kue","title":"Merge: onyx-1767106262992","description":"branch: polecat/onyx-1767106262992\ntarget: main\nsource_issue: onyx-1767106262992\nrig: beads","status":"closed","priority":2,"issue_type":"merge-request","created_at":"2025-12-30T06:59:46.964658-08:00","created_by":"beads/polecats/onyx","updated_at":"2025-12-30T15:44:43.3647-08:00","closed_at":"2025-12-30T10:27:23.072233-08:00"} {"id":"bd-0oqz","title":"Add GetMoleculeProgress RPC endpoint","description":"New RPC endpoint to get detailed progress for a specific molecule. Returns: moleculeID, title, assignee, and list of steps with their status (done/current/ready/blocked), start/close times. Used when user expands a worker in the activity feed TUI.","status":"closed","priority":2,"issue_type":"feature","created_at":"2025-12-23T16:26:38.137866-08:00","updated_at":"2025-12-23T18:27:49.033335-08:00","closed_at":"2025-12-23T18:27:49.033335-08:00"} {"id":"bd-0qx5","title":"Implement Jira issue timestamp comparison for sync","description":"In cmd/bd/jira.go:633, there's a TODO for a full implementation that would fetch the Jira issue and compare timestamps to detect conflicts during sync.\n\nFile: cmd/bd/jira.go:633","status":"closed","priority":4,"issue_type":"feature","created_at":"2025-12-28T16:32:52.601594-08:00","created_by":"stevey","updated_at":"2025-12-30T18:12:30.977631-08:00","closed_at":"2025-12-30T16:00:07.968921-08:00","close_reason":"Implemented Jira timestamp comparison for sync. Added fetchJiraIssueTimestamp() to fetch timestamps from Jira REST API, updated detectJiraConflicts() to compare actual timestamps, and improved conflict resolution functions to display timestamp details."} +{"id":"bd-0sgd","title":"Design escalation inbox for stuck workflows","description":"## Summary\n\nExtend the existing `gt escalate` system with tiered routing, structured decision patterns, and integration with gates and patrol lifecycles.\n\n## Background\n\nFrom gate design discussion and workflow analysis. Gas Town needs:\n1. Structured way for workers to request decisions (not just free-form escalation)\n2. Tiered routing (Deacon -\u003e Mayor -\u003e Overseer) instead of direct-to-human\n3. Integration with gates (timeout -\u003e escalate)\n4. Formalized patterns for all worker exit scenarios\n\n## Current State (what exists)\n\nThe escalation system is already partially built:\n\n- `gt escalate` command: CRITICAL/HIGH/MEDIUM severity\n- Creates bead tagged `escalation`\n- Sends mail to `overseer`\n- Mayor checks pending escalations on `gt prime`\n- Exit type `ESCALATED` for polecats\n- Event logging: `escalation_sent`\n\nSee: `gastown/docs/escalation.md`\n\n## What's Missing\n\n| Gap | Current | Proposed |\n|-----|---------|----------|\n| Tiered routing | Direct to overseer | Deacon -\u003e Mayor -\u003e Overseer |\n| Decision pattern | Free-form topic | Structured options in issue |\n| Categories | Just \"escalation\" tag | decision, help, blocked, failed, emergency |\n| Gate integration | None | Gate timeout -\u003e escalate |\n| Patrol integration | Ad-hoc | Formalized paths |\n\n## Design\n\n### Escalation Categories\n\n| Category | Description | Default Destination |\n|----------|-------------|---------------------|\n| `decision` | Multiple valid paths, need choice | Deacon -\u003e Mayor |\n| `help` | Need guidance/expertise | Deacon -\u003e Mayor |\n| `blocked` | Waiting on unresolvable dependency | Mayor |\n| `failed` | Unexpected error, can't proceed | Deacon |\n| `emergency` | Security/data integrity | Overseer (direct) |\n| `gate_timeout` | Gate didn't resolve in time | Deacon |\n| `lifecycle` | Worker stuck/needs recycle | Witness |\n\n### Extended Command\n\n```bash\n# Current (unchanged)\ngt escalate \"Something went wrong\"\ngt escalate -s CRITICAL \"Data corruption\"\n\n# New: Category-based\ngt escalate --type decision \"Which auth approach?\"\ngt escalate --type help \"Need architecture guidance\"\ngt escalate --type blocked \"Waiting on bd-xyz\"\ngt escalate --type failed \"Tests failing unexpectedly\"\ngt escalate --type emergency \"Security vulnerability found\"\n\n# New: Tiered routing\ngt escalate --to deacon \"Infra issue\"\ngt escalate --to mayor \"Cross-rig coordination needed\"\ngt escalate --to overseer \"Human judgment required\"\n\n# New: Structured decision\ngt escalate --type decision \\\n --question \"Which authentication approach?\" \\\n --options \"JWT tokens,Session cookies,OAuth2\" \\\n --context \"Admin panel needs login\" \\\n --issue bd-xyz\n```\n\n### Decision Pattern in Issues\n\nWhen `--type decision` is used, the issue is updated with structured format:\n\n```markdown\n## Decision Needed\n\n**Question:** Which authentication approach?\n\n| Option | Description |\n|--------|-------------|\n| A | JWT tokens |\n| B | Session cookies |\n| C | OAuth2 |\n\n**Context:** Admin panel needs login\n\n**Escalated by:** beads/polecats/obsidian\n**Escalated at:** 2026-01-01T15:00:00Z\n\n**To resolve:**\n1. Comment with chosen option (e.g., \"Decision: A\")\n2. Reassign to work queue or original worker\n```\n\nThis makes the issue the async communication channel for decisions.\n\n### Tiered Escalation Flow\n\n```\nWorker encounters issue\n |\n v\ngt escalate --type \u003ccategory\u003e --to \u003ctier\u003e\n |\n v\n[Deacon receives]\n |\n +-- Can resolve? --\u003e Updates issue, re-slings work\n |\n +-- Cannot resolve? --\u003e gt escalate --to mayor --forward\n |\n v\n [Mayor receives]\n |\n +-- Can resolve? --\u003e Updates issue, re-slings\n |\n +-- Cannot resolve? --\u003e gt escalate --to overseer\n |\n v\n [Overseer resolves]\n```\n\nEach tier can resolve OR forward. The escalation bead tracks the chain via comments/notes.\n\n### Integration Points\n\n#### Gate Timeouts (bd-7zka.2)\n\n```go\n// In Witness patrol (timer gates)\nif gate.Expired() {\n exec.Command(\"gt\", \"escalate\",\n \"--type\", \"gate_timeout\",\n \"--severity\", \"HIGH\",\n \"--issue\", gate.BlockedIssueID,\n fmt.Sprintf(\"Gate %s timed out after %s\", gate.ID, gate.Timeout)).Run()\n}\n```\n\n#### Witness Patrol\n\nWitness already detects stuck polecats. Formalize as escalation:\n\n```go\n// Instead of ad-hoc mail\nexec.Command(\"gt\", \"escalate\",\n \"--type\", \"lifecycle\",\n \"--to\", \"mayor\",\n \"--issue\", polecat.CurrentIssue,\n fmt.Sprintf(\"Polecat %s stuck: no progress for %d minutes\", polecat.ID, minutes)).Run()\n```\n\n#### Refinery\n\nOn merge failures that can't be auto-resolved:\n\n```go\nexec.Command(\"gt\", \"escalate\",\n \"--type\", \"failed\",\n \"--issue\", mr.IssueID,\n \"Merge failed: \"+reason).Run()\n```\n\n### Polecat Exit with Escalation\n\n```bash\n# Worker reaches decision point\n\n# 1. Update issue with decision structure\nbd update $ISSUE --notes \"$(cat \u003c\u003cEOF\n## Decision Needed\n\n**Question:** Which approach for caching?\n\n| Option | Description |\n|--------|-------------|\n| A | Redis (external dependency) |\n| B | In-memory (simpler, no persistence) |\n| C | SQLite (local persistence) |\n\n**Context:** API response times are slow, need caching layer.\nEOF\n)\"\n\n# 2. Escalate\ngt escalate --type decision --issue $ISSUE \"Caching approach needs decision\"\n\n# 3. Exit cleanly\ngt done --exit ESCALATED\n```\n\n### New Issue Statuses\n\nConsider adding to beads:\n\n| Status | Meaning |\n|--------|---------|\n| `decision_needed` | Waiting for decision from escalation |\n| `escalated` | General escalation pending |\n\nOr keep using `blocked` with escalation tag - simpler.\n\n## Implementation Plan\n\n### Phase 1: Extend gt escalate\n- Add `--type` flag for categories\n- Add `--to` flag for routing (deacon, mayor, overseer)\n- Add `--forward` flag for tier forwarding\n- Keep backward compatibility\n\n### Phase 2: Decision Pattern\n- Add `--question`, `--options`, `--context` flags\n- Auto-update issue with decision structure\n- Parse decision from issue comments on resolution\n\n### Phase 3: Gate Integration\n- Add `gate_timeout` escalation type\n- Witness: check timer gates, escalate on timeout\n- Refinery: check GH gates, escalate on timeout/failure\n\n### Phase 4: Patrol Integration\n- Formalize Witness stuck-polecat as escalation\n- Formalize Refinery merge-failure as escalation\n- Unified escalation handling in Mayor\n\n## Acceptance Criteria\n\n- [ ] `gt escalate --type decision` creates structured issue update\n- [ ] `gt escalate --to deacon|mayor|overseer` routes correctly\n- [ ] Gate timeouts trigger escalation (after bd-7zka.2)\n- [ ] Witness uses escalation for stuck polecats\n- [ ] Refinery uses escalation for merge failures\n- [ ] Escalation chain tracked in bead (who forwarded to whom)\n- [ ] `bd list --tag=escalation --type=decision` filters work\n\n## References\n\n- bd-7zka.2: Gate evaluation (uses escalation for timeouts)\n- gastown/docs/escalation.md: Current escalation protocol\n- gastown/crew/max/internal/cmd/escalate.go: Current implementation","status":"open","priority":2,"issue_type":"feature","created_at":"2026-01-01T15:03:37.684701-08:00","created_by":"beads/crew/fang","updated_at":"2026-01-01T15:15:11.955572-08:00"} {"id":"bd-0vg","title":"Pinned issues: persistent context markers","description":"Add ability to pin issues so they remain visible and are excluded from work-finding commands. Pinned issues serve as persistent context markers (handoffs, architectural notes, recovery instructions) that should not be claimed as work items.\n\nUse Cases:\n1. Handoff messages - Pin session handoffs so new agents always see them\n2. Architecture decisions - Pin ADRs or design notes for reference \n3. Recovery context - Pin amnesia-cure notes that help agents orient\n\nCore commands: bd pin, bd unpin, bd list --pinned/--no-pinned","status":"closed","priority":1,"issue_type":"epic","created_at":"2025-12-18T23:33:10.911092-08:00","updated_at":"2025-12-21T11:30:28.989696-08:00","closed_at":"2025-12-21T11:30:28.989696-08:00"} {"id":"bd-0vtq","title":"Investigate JSONL hash mismatch warnings (bd-160)","description":"During v0.39.1 release, saw repeated warnings:\n\nWARNING: JSONL file hash mismatch detected (bd-160)\n This indicates JSONL and export_hashes are out of sync.\n Clearing export_hashes to force full re-export.\n\nThis appeared multiple times during wisp close operations. Questions:\n1. What causes export_hashes to drift from actual JSONL content?\n2. Is this expected during wisp operations (since wisps do not export)?\n3. Should wisp operations skip the hash check entirely?\n4. Is there actual data integrity risk or just noise?\n\nThe warning references bd-160 - may need to check that issue for context.","status":"closed","priority":2,"issue_type":"bug","created_at":"2025-12-27T22:51:25.448856-08:00","created_by":"beads/crew/emma","updated_at":"2025-12-27T23:22:09.589444-08:00","closed_at":"2025-12-27T23:22:09.589444-08:00"} {"id":"bd-0w5","title":"Fix update-hooks verification in version-bump.yaml","description":"The update-hooks task verification command at version-bump.yaml:358 always succeeds due to '|| echo ...' fallback. Remove the fallback so verification actually fails when hooks aren't installed.","status":"tombstone","priority":3,"issue_type":"bug","created_at":"2025-12-17T22:23:06.55467-08:00","updated_at":"2025-12-25T01:21:01.952723-08:00","deleted_at":"2025-12-25T01:21:01.952723-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"bug"} @@ -137,7 +138,7 @@ {"id":"bd-5rj1","title":"Merge: bd-gqxd","description":"branch: polecat/furiosa\ntarget: main\nsource_issue: bd-gqxd\nrig: beads","status":"closed","priority":2,"issue_type":"merge-request","created_at":"2025-12-23T16:40:21.707706-08:00","updated_at":"2025-12-23T19:12:08.349245-08:00","closed_at":"2025-12-23T19:12:08.349245-08:00"} {"id":"bd-5s91","title":"CLI API Audit for OSS Launch","description":"Comprehensive CLI API audit before OSS launch.\n\n## Tasks\n1. Review gt command groupings - propose consolidation\n2. Review bd command groupings \n3. Document gt vs bd ownership boundaries\n4. Identify naming inconsistencies\n5. Document flag vs subcommand criteria\n\n## Context\n- Pre-OSS launch cleanup\n- Goal: clean, consistent, discoverable CLI surface","status":"closed","priority":1,"issue_type":"epic","created_at":"2025-12-25T00:15:41.355013-08:00","updated_at":"2025-12-25T13:26:25.587476-08:00","closed_at":"2025-12-25T13:26:25.587476-08:00"} {"id":"bd-5x0j","title":"bd swarm status command","description":"Add bd swarm status to show swarm state derived from beads.\n\n## Context\nThis is the key command that demonstrates 'discovery over tracking'. \nSwarm status is COMPUTED from:\n- Epic children statuses\n- Dependency structure\n- Issue assignments\n\nNOT stored separately. If beads changes, status changes.\n\n## Implementation\n1. New command: bd swarm status \u003cswarm-mol-id\u003e\n2. Find linked epic from swarm molecule\n3. Query all children of epic\n4. Compute and display:\n - Ready front (unblocked, open issues)\n - In progress (in_progress status)\n - Completed (closed)\n - Blocked (has unmet dependencies)\n - Progress percentage\n - Coordinator\n - Estimated remaining (based on avg session time)\n\n## Output Format\nReady Front Analysis: gt-epic-xxx\n\nCompleted: ✓ gt-001 (2h ago)\nActive: ⟳ gt-002 [nux], ⟳ gt-003 [toast]\nReady: ○ gt-004, ○ gt-005\nBlocked: ◌ gt-006 (needs 004, 005)\n\nProgress: 1/6 complete, 2/6 active (17%)\n\n## Reference\n~/gt/docs/swarm-architecture.md - 'Ready Front Visualization'\n\n## Acceptance\n- bd swarm status \u003cmol\u003e shows accurate state\n- State reflects current beads (not cached)\n- --json output for programmatic use","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-28T19:11:36.594118-08:00","created_by":"mayor","updated_at":"2025-12-28T21:28:21.976756-08:00","closed_at":"2025-12-28T21:28:21.976756-08:00","dependencies":[{"issue_id":"bd-5x0j","depends_on_id":"bd-oxgi","type":"blocks","created_at":"2025-12-28T19:11:52.464245-08:00","created_by":"daemon"}]} -{"id":"bd-615z","title":"Add ValidateTemplate() function","description":"Add internal/validation package with ValidateTemplate(issueType, description) that checks for missing sections and returns actionable errors.","status":"open","priority":3,"issue_type":"task","created_at":"2026-01-01T11:19:07.136885-08:00","created_by":"beads/crew/grip","updated_at":"2026-01-01T11:19:07.136885-08:00","dependencies":[{"issue_id":"bd-615z","depends_on_id":"bd-ou35","type":"parent-child","created_at":"2026-01-01T11:19:22.71669-08:00","created_by":"beads/crew/grip"},{"issue_id":"bd-615z","depends_on_id":"bd-v2mr","type":"blocks","created_at":"2026-01-01T11:19:23.924134-08:00","created_by":"beads/crew/grip"}]} +{"id":"bd-615z","title":"Add ValidateTemplate() function","description":"Add internal/validation package with ValidateTemplate(issueType, description) that checks for missing sections and returns actionable errors.","status":"closed","priority":3,"issue_type":"task","created_at":"2026-01-01T11:19:07.136885-08:00","created_by":"beads/crew/grip","updated_at":"2026-01-01T12:42:26.397143-08:00","closed_at":"2026-01-01T12:42:26.397143-08:00","close_reason":"Implemented ValidateTemplate() and LintIssue() with tests","dependencies":[{"issue_id":"bd-615z","depends_on_id":"bd-ou35","type":"parent-child","created_at":"2026-01-01T11:19:22.71669-08:00","created_by":"beads/crew/grip"},{"issue_id":"bd-615z","depends_on_id":"bd-v2mr","type":"blocks","created_at":"2026-01-01T11:19:23.924134-08:00","created_by":"beads/crew/grip"}]} {"id":"bd-66l4","title":"Runtime bonding: bd mol attach","description":"Attach a molecule to an already-running workflow.\n\nCOMMAND: bd mol attach \u003cepic-id\u003e \u003cproto\u003e [--after \u003cissue-id\u003e]\n\nBEHAVIOR:\n- Resolve running epic and proto\n- Spawn proto as new subtree\n- Wire to specified attachment point (or epic root)\n- Handle in-progress issues: new work doesn't block completed work\n\nUSE CASES:\n- Discovered need for docs while implementing feature\n- Hotfix needs attaching to release workflow\n- Additional testing scope identified mid-flight\n\nFLAGS:\n- --after ISSUE: Specific attachment point within epic\n- --type: sequential (default) or parallel\n- --var: Variables for the attached proto\n\nCONSIDERATIONS:\n- What if epic is already closed? Error or reopen?\n- What if attachment point issue is closed? Attach as ready-to-work?","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-21T00:59:16.920483-08:00","updated_at":"2025-12-21T01:08:43.530597-08:00","closed_at":"2025-12-21T01:08:43.530597-08:00","dependencies":[{"issue_id":"bd-66l4","depends_on_id":"bd-o5xe","type":"parent-child","created_at":"2025-12-21T00:59:51.435542-08:00","created_by":"daemon"},{"issue_id":"bd-66l4","depends_on_id":"bd-o91r","type":"blocks","created_at":"2025-12-21T00:59:51.813782-08:00","created_by":"daemon"}]} {"id":"bd-66w1","title":"Add external_projects to config schema","description":"Add external_projects mapping to .beads/config.yaml:\n\n```yaml\nexternal_projects:\n beads: ../beads\n gastown: ../gastown\n other: /absolute/path/to/project\n```\n\nUsed by bd ready and other commands to resolve external: references.\n\nPart of cross-project dependency system.\nSee: gastown/docs/cross-project-deps.md","status":"closed","priority":2,"issue_type":"feature","created_at":"2025-12-21T22:37:39.245017-08:00","updated_at":"2025-12-21T23:03:19.81448-08:00","closed_at":"2025-12-21T23:03:19.81448-08:00"} {"id":"bd-687g","title":"Code review: mol squash deletion bypasses tombstone system","description":"The deleteEphemeralChildren function in mol_squash.go uses DeleteIssue directly instead of the proper deletion flow. This bypasses tombstone creation, deletion tracking (deletions.jsonl), and dependency cleanup. Could cause issues with deletion propagation across clones.\n\nCurrent code uses d.DeleteIssue(ctx, id) but should probably use d.DeleteIssues(ctx, ids, false, true, false) for proper tombstone handling.\n\nAlternative: Document that ephemeral issues intentionally use hard delete since they are transient and should never propagate to other clones anyway.","status":"closed","priority":2,"issue_type":"bug","created_at":"2025-12-21T13:57:20.223345-08:00","updated_at":"2025-12-21T14:17:38.073899-08:00","closed_at":"2025-12-21T14:17:38.073899-08:00"} @@ -199,7 +200,7 @@ {"id":"bd-7z4","title":"Add tests for delete operations","description":"Core delete functionality including deleteViaDaemon, createTombstone, and deleteIssue functions have 0% coverage. These are critical for data integrity and need comprehensive test coverage.","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-18T07:00:34.867680882-07:00","updated_at":"2025-12-23T23:48:50.087306-08:00","closed_at":"2025-12-23T23:48:50.087306-08:00","dependencies":[{"issue_id":"bd-7z4","depends_on_id":"bd-6ss","type":"discovered-from","created_at":"2025-12-18T07:00:34.870254935-07:00","created_by":"matt"}]} {"id":"bd-7zka","title":"Implement formula features: Step.Condition and Step.Gate","description":"Multiple formula features in internal/formula/types.go are marked as \"Not yet implemented\":\n\nIMPLEMENTED (TODOs removed):\n- Step.Expand: Inline expansion - implemented in ApplyInlineExpansions (expand.go)\n- Step.ExpandVars: Variable overrides for expansion - implemented alongside Expand\n\nSTILL NOT IMPLEMENTED (TODOs remain):\n- Step.Condition: Make step optional based on variable (types.go:177-180)\n- Step.Gate: Async wait condition for step (types.go:185-187)\n- Gate struct: Schema defined but not processed in bd cook (types.go:209-210)\n\nFile: internal/formula/types.go","status":"open","priority":3,"issue_type":"feature","created_at":"2025-12-28T16:32:54.493002-08:00","created_by":"stevey","updated_at":"2025-12-30T19:32:30.362068-08:00"} {"id":"bd-7zka.1","title":"Implement Step.Condition evaluation in bd cook","description":"## Summary\nImplement conditional step execution based on variable values.\n\n## Location\n- Schema: `internal/formula/types.go:177-180`\n- Implement in: `internal/formula/cook.go` (or new file `condition.go`)\n\n## Current Schema\n```go\n// Condition makes this step optional based on a variable.\n// Format: \"{{var}}\" (truthy) or \"{{var}} == value\".\n// TODO(bd-7zka): Not yet implemented in bd cook. Filed as future work.\nCondition string `json:\"condition,omitempty\"`\n```\n\n## Implementation\n\n### Parsing\nSupport two formats:\n1. `\"{{var}}\"` - truthy check (non-empty, non-\"false\", non-\"0\")\n2. `\"{{var}} == value\"` - equality check\n\n```go\nfunc evaluateCondition(condition string, vars map[string]string) (bool, error) {\n // Check for equality format\n if strings.Contains(condition, \"==\") {\n parts := strings.SplitN(condition, \"==\", 2)\n varExpr := strings.TrimSpace(parts[0])\n expected := strings.TrimSpace(parts[1])\n \n // Extract variable name from {{var}}\n varName := extractVarName(varExpr)\n actual := vars[varName]\n return actual == expected, nil\n }\n \n // Truthy check\n varName := extractVarName(condition)\n val := vars[varName]\n return val != \"\" \u0026\u0026 val != \"false\" \u0026\u0026 val != \"0\", nil\n}\n```\n\n### Integration with bd cook\nIn the step processing loop, check condition before creating issue:\n```go\nif step.Condition != \"\" {\n include, err := evaluateCondition(step.Condition, vars)\n if err != nil {\n return fmt.Errorf(\"invalid condition %q: %w\", step.Condition, err)\n }\n if !include {\n continue // Skip this step\n }\n}\n```\n\n## Example Usage\n```yaml\nsteps:\n - title: \"Run integration tests\"\n condition: \"{{run_integration}}\"\n \n - title: \"Deploy to staging\"\n condition: \"{{environment}} == staging\"\n```\n\n## Testing\n- Test truthy evaluation (empty, \"false\", \"0\", valid value)\n- Test equality check\n- Test invalid condition format\n- Test missing variable (should be falsy)\n\n## Acceptance Criteria\n- [x] Truthy conditions work\n- [x] Equality conditions work\n- [x] Steps are skipped when condition is false\n- [x] Clear error on malformed condition\n- [x] Works with variable substitution","status":"closed","priority":3,"issue_type":"task","created_at":"2025-12-30T19:31:57.979217-08:00","created_by":"beads/crew/emma","updated_at":"2025-12-31T00:33:25.954831-08:00","closed_at":"2025-12-31T00:33:25.954831-08:00","close_reason":"Implemented Step.Condition evaluation in stepcondition.go with tests","dependencies":[{"issue_id":"bd-7zka.1","depends_on_id":"bd-7zka","type":"parent-child","created_at":"2025-12-30T19:31:57.97973-08:00","created_by":"beads/crew/emma"}]} -{"id":"bd-7zka.2","title":"Implement Gate evaluation in bd cook","description":"## Summary\nImplement async wait conditions (gates) for formula steps.\n\n## Location\n- Schema: `internal/formula/types.go:185-187, 209-220`\n- Implement in: `internal/formula/cook.go` or new `gate.go`\n\n## Current Schema\n```go\n// Gate defines an async wait condition for this step.\n// TODO(bd-7zka): Not yet implemented in bd cook. Will integrate with bd-udsi gates.\nGate *Gate `json:\"gate,omitempty\"`\n\n// Gate defines an async wait condition (integrates with bd-udsi).\n// TODO(bd-7zka): Not yet implemented in bd cook. Schema defined for future use.\ntype Gate struct {\n Type string `json:\"type\"` // gh:run, gh:pr, timer, human, mail\n ID string `json:\"id,omitempty\"`\n Timeout string `json:\"timeout,omitempty\"`\n}\n```\n\n## Implementation\n\n### Phase 1: Gate Schema to Issue Metadata\nWhen cooking a step with a gate, store gate info in the issue:\n```go\nif step.Gate != nil {\n issue.Gate = step.Gate // Need to add Gate field to Issue type\n issue.Status = \"gated\" // New status? Or use blocked?\n}\n```\n\n### Phase 2: Gate Evaluation (separate from cook)\nGate types to support:\n- `gh:run` - Wait for GitHub Actions workflow\n- `gh:pr` - Wait for PR state (merged, closed)\n- `timer` - Wait for duration\n- `human` - Wait for manual approval\n- `mail` - Wait for mail response\n\nThis likely needs a separate `bd gate` command or daemon integration.\n\n## Design Decision Needed\nShould gates be:\n1. Stored as issue metadata and evaluated separately?\n2. Processed during `bd cook` (blocking)?\n3. Create blocked dependency until gate clears?\n\nRecommend option 1: Store gate info, let separate process handle evaluation.\n\n## Example Usage\n```yaml\nsteps:\n - title: \"Wait for CI\"\n gate:\n type: gh:run\n id: \"test.yml\"\n timeout: \"1h\"\n \n - title: \"Deploy after approval\"\n gate:\n type: human\n timeout: \"24h\"\n```\n\n## Dependencies\n- May need coordination with bd-udsi (gate system)\n- Requires Issue type extension for gate metadata\n\n## Acceptance Criteria\n- [x] Gate info preserved from formula to issue\n- [x] Clear error if gate type is unknown\n- [x] Timeout parsed and stored\n- [x] Gate evaluation mechanism defined (even if not fully implemented)","status":"open","priority":3,"issue_type":"task","created_at":"2025-12-30T19:32:19.664542-08:00","created_by":"beads/crew/emma","updated_at":"2025-12-30T19:32:19.664542-08:00","dependencies":[{"issue_id":"bd-7zka.2","depends_on_id":"bd-7zka","type":"parent-child","created_at":"2025-12-30T19:32:19.666332-08:00","created_by":"beads/crew/emma"}]} +{"id":"bd-7zka.2","title":"Implement Gate evaluation in bd cook","description":"$(cat /tmp/gate-desc-fixed.md)","status":"open","priority":3,"issue_type":"task","created_at":"2025-12-30T19:32:19.664542-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-01T15:04:25.703462-08:00","dependencies":[{"issue_id":"bd-7zka.2","depends_on_id":"bd-7zka","type":"parent-child","created_at":"2025-12-30T19:32:19.666332-08:00","created_by":"beads/crew/emma"},{"issue_id":"bd-7zka.2","depends_on_id":"bd-0sgd","type":"related","created_at":"2026-01-01T15:04:06.917484-08:00","created_by":"beads/crew/fang"}]} {"id":"bd-801b","title":"Merge: bd-bqcc","description":"branch: polecat/capable\ntarget: main\nsource_issue: bd-bqcc\nrig: beads","status":"closed","priority":2,"issue_type":"merge-request","created_at":"2025-12-23T00:26:04.306756-08:00","updated_at":"2025-12-23T01:33:25.728087-08:00","closed_at":"2025-12-23T01:33:25.728087-08:00"} {"id":"bd-83f5","title":"Remove top-level comment alias","description":"Remove 'comment' as top-level command. Users should use 'comments add' instead. Reduces command surface area.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-28T12:59:12.33579-08:00","created_by":"stevey","updated_at":"2025-12-28T13:06:53.335122-08:00","closed_at":"2025-12-28T13:06:53.335122-08:00"} {"id":"bd-89f89fc0","title":"Remove unreachable RPC methods","description":"Several RPC server and client methods are unreachable and should be removed:\n\nServer methods (internal/rpc/server.go):\n- `Server.GetLastImportTime` (line 2116)\n- `Server.SetLastImportTime` (line 2123)\n- `Server.findJSONLPath` (line 2255)\n\nClient methods (internal/rpc/client.go):\n- `Client.Import` (line 311) - RPC import not used (daemon uses autoimport)\n\nEvidence:\n```bash\ngo run golang.org/x/tools/cmd/deadcode@latest -test ./...\n```\n\nImpact: Removes ~80 LOC of unused RPC code","status":"tombstone","priority":2,"issue_type":"task","created_at":"2025-10-28T16:20:02.432202-07:00","updated_at":"2025-12-25T01:21:01.952723-08:00","deleted_at":"2025-12-25T01:21:01.952723-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"task"} @@ -411,7 +412,7 @@ {"id":"bd-gfo3","title":"Merge: bd-ykd9","description":"branch: polecat/Doctor\ntarget: main\nsource_issue: bd-ykd9\nrig: beads","status":"closed","priority":2,"issue_type":"merge-request","created_at":"2025-12-23T13:34:43.778808-08:00","updated_at":"2025-12-23T19:12:08.353427-08:00","closed_at":"2025-12-23T19:12:08.353427-08:00"} {"id":"bd-gigi","title":"bd admin compact --older-than=0 ignores the flag, uses default 30 days","description":"When running bd admin compact --prune --older-than=0, the output says 'No expired tombstones to prune (TTL: 30 days)' - the flag value is ignored.\n\nRoot cause: In runCompactPrune() in compact_tombstone.go:180, the check 'if compactOlderThan \u003e 0' means that --older-than=0 is treated the same as not passing the flag, defaulting to 30 days.\n\nFix: Change the default flag value in compact.go:785 to -1 (sentinel for 'use default'), and treat 0 as 'expire all tombstones' by passing a negative TTL to pruneExpiredTombstones().\n\nMoved from gt-65gwa (gastown) - was filed in wrong rig.","status":"closed","priority":2,"issue_type":"bug","assignee":"beads/crew/emma","created_at":"2025-12-29T23:34:41.255352-08:00","created_by":"gastown/polecats/dementus","updated_at":"2025-12-30T00:00:43.476085-08:00","closed_at":"2025-12-30T00:00:43.476085-08:00","close_reason":"Fixed: flag default changed to -1 sentinel, 0 now means expire all"} {"id":"bd-gjla","title":"Test Thread","description":"Initial message for threading test","status":"tombstone","priority":2,"issue_type":"message","created_at":"2025-12-16T18:19:51.704324-08:00","updated_at":"2025-12-17T16:11:17.070763-08:00","dependencies":[{"issue_id":"bd-gjla","depends_on_id":"bd-f5cc","type":"duplicates","created_at":"2025-12-18T13:45:31.137191-08:00","created_by":"migration"}],"deleted_at":"2025-12-17T16:11:17.070763-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"message"} -{"id":"bd-gn5r","title":"Implement bd lint command","description":"New command to check issues for missing sections. Supports: bd lint (all open), bd lint \u003cid\u003e (single), bd lint --fix (interactive).","status":"open","priority":3,"issue_type":"task","created_at":"2026-01-01T11:19:08.013558-08:00","created_by":"beads/crew/grip","updated_at":"2026-01-01T11:19:08.013558-08:00","dependencies":[{"issue_id":"bd-gn5r","depends_on_id":"bd-ou35","type":"parent-child","created_at":"2026-01-01T11:19:22.736105-08:00","created_by":"beads/crew/grip"},{"issue_id":"bd-gn5r","depends_on_id":"bd-615z","type":"blocks","created_at":"2026-01-01T11:19:23.944461-08:00","created_by":"beads/crew/grip"}]} +{"id":"bd-gn5r","title":"Implement bd lint command","description":"New command to check issues for missing sections. Supports: bd lint (all open), bd lint \u003cid\u003e (single), bd lint --fix (interactive).","status":"closed","priority":3,"issue_type":"task","created_at":"2026-01-01T11:19:08.013558-08:00","created_by":"beads/crew/grip","updated_at":"2026-01-01T14:18:39.458936-08:00","closed_at":"2026-01-01T14:18:39.458936-08:00","close_reason":"Implemented bd lint command with daemon and direct mode support","dependencies":[{"issue_id":"bd-gn5r","depends_on_id":"bd-ou35","type":"parent-child","created_at":"2026-01-01T11:19:22.736105-08:00","created_by":"beads/crew/grip"},{"issue_id":"bd-gn5r","depends_on_id":"bd-615z","type":"blocks","created_at":"2026-01-01T11:19:23.944461-08:00","created_by":"beads/crew/grip"}]} {"id":"bd-gocx","title":"Run bump-version.sh 0.32.1","description":"Execute ./scripts/bump-version.sh 0.32.1 to update all version references","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-20T21:53:18.470174-08:00","updated_at":"2025-12-20T21:54:54.500836-08:00","closed_at":"2025-12-20T21:54:54.500836-08:00","dependencies":[{"issue_id":"bd-gocx","depends_on_id":"bd-an4s","type":"parent-child","created_at":"2025-12-20T21:53:18.471793-08:00","created_by":"daemon"},{"issue_id":"bd-gocx","depends_on_id":"bd-x3j8","type":"blocks","created_at":"2025-12-20T21:53:29.688436-08:00","created_by":"daemon"}]} {"id":"bd-gqxd","title":"Enrich MutationEvent with title and assignee","description":"Current MutationEvent only has IssueID, no context. Add Title and Assignee fields so activity feeds can display meaningful info without extra lookups. Emit these fields when creating mutation events in server_core.go.","status":"closed","priority":2,"issue_type":"feature","created_at":"2025-12-23T16:26:34.907259-08:00","updated_at":"2025-12-23T16:39:39.229462-08:00","closed_at":"2025-12-23T16:39:39.229462-08:00"} {"id":"bd-gr4q","title":"Gate await fields cleared by auto-flush/auto-import cycle","description":"## Problem\n\nWhen creating a gate with `--await` fields (e.g., `gh:run:123`), the await_type and await_id are initially stored correctly in the SQLite database. However, they get cleared (set to empty strings) during subsequent bd commands due to the auto-flush/auto-import cycle.\n\n## Reproduction Steps\n\n1. Create a gate with await:\n ```\n bd gate create --molecule test-mol --await gh:run:20517738002\n ```\n Output shows correct `await_type: gh:run, await_id: 20517738002`\n\n2. Check database - fields are present\n\n3. Run any bd command (e.g., `bd list`)\n\n4. Check database again - await_type and await_id are now empty\n\n## Root Cause\n\nGates are wisps (ephemeral issues). During the auto-flush cycle:\n1. Auto-flush exports issues to JSONL (filtering out wisps)\n2. Auto-import reads JSONL and updates DB rows\n3. The update clears fields that weren't in the JSONL (including await fields)\n\n## Workaround\n\nUsing `--no-auto-import --no-auto-flush` flags preserves the fields, but this isn't practical for normal use.\n\n## Impact\n\nGitHub gate evaluation (`bd gate eval`) cannot work because by the time eval runs, the await fields have been cleared.\n\n## Suggested Fix\n\nEither:\n1. Don't clear await fields during auto-import if they weren't in the source\n2. Store wisp fields separately from the main JSONL export\n3. Include wisps in export but filter them at sync time","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-12-25T22:59:11.309657-08:00","updated_at":"2025-12-25T23:20:20.33151-08:00","closed_at":"2025-12-25T23:20:20.33151-08:00"} @@ -456,7 +457,7 @@ {"id":"bd-ifa0","title":"Merge: amber-1767146829144","description":"branch: polecat/amber-1767146829144\ntarget: main\nsource_issue: amber-1767146829144\nrig: beads","status":"closed","priority":2,"issue_type":"merge-request","created_at":"2025-12-30T18:11:33.875918-08:00","created_by":"beads/polecats/amber","updated_at":"2025-12-30T19:35:50.452577-08:00","closed_at":"2025-12-30T18:16:13.605293-08:00"} {"id":"bd-ifuw","title":"test hook pin fix","status":"tombstone","priority":2,"issue_type":"task","created_at":"2025-12-23T04:43:15.598698-08:00","updated_at":"2025-12-23T04:51:29.438139-08:00","deleted_at":"2025-12-23T04:51:29.438139-08:00","deleted_by":"daemon","delete_reason":"delete","original_type":"task"} {"id":"bd-iic1","title":"Phase 2.2: Switch bdt storage to TOON format","description":"Currently bdt stores issues in JSONL format in issues.toon file. Phase 2.2 must implement actual TOON format storage - this is the fundamental goal of the bdtoon project.\n\n## Current State (Phase 2.1)\n- issues.toon stores JSONL (intermediate format)\n- --toon flag allows output in TOON format for LLM consumption\n- Problem: We're not actually using TOON as the fundamental storage format\n\n## Required Work (Phase 2.2)\n1. Switch issue file I/O to write TOON format instead of JSONL\n - Update cmd/bdt/storage.go to use EncodeTOON for writing\n - Update cmd/bdt/storage.go to decode TOON (currently decodes JSON)\n - Ensure round-trip: write TOON → read TOON → write TOON is byte-identical\n\n2. Update command implementations\n - cmd/bdt/create.go: Write newly created issues to TOON format\n - cmd/bdt/list.go: Read issues from TOON format\n - cmd/bdt/show.go: Read from TOON format\n - cmd/bdt/import.go: Convert imported JSONL to TOON\n - cmd/bdt/export.go: Export TOON to JSONL (for bd compatibility)\n\n3. Implement TOON parser that handles gotoon's encoder-only limitation\n - Since gotoon doesn't decode TOON, need custom TOON→JSON decoder\n - OR continue storing TOON but decoding via intermediate JSON conversion\n\n4. Git merge driver optimization\n - TOON is line-oriented, better for 3-way merges than binary formats\n - Configure git merge driver for .toon files\n\n5. Comprehensive testing\n - Round-trip tests: Issue → TOON → storage → read → Issue\n - Merge conflict resolution tests with TOON format\n - Large issue set performance tests\n\n## Success Criteria\n- issues.toon stores actual TOON format (not JSONL)\n- bdt list reads from TOON file\n- bdt create writes to TOON file\n- Round-trip: create issue → list → show returns identical data\n- All 65+ tests still passing\n- Performance comparable to JSONL storage","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-19T14:05:41.394964404-07:00","updated_at":"2025-12-19T14:37:17.879612634-07:00","closed_at":"2025-12-19T14:37:17.879612634-07:00"} -{"id":"bd-ik1b","title":"Add --validate flag to bd create","description":"Opt-in strict mode that fails creation if required sections are missing. Uses ValidateTemplate() under the hood.","status":"open","priority":3,"issue_type":"task","created_at":"2026-01-01T11:19:09.036754-08:00","created_by":"beads/crew/grip","updated_at":"2026-01-01T11:19:09.036754-08:00","dependencies":[{"issue_id":"bd-ik1b","depends_on_id":"bd-ou35","type":"parent-child","created_at":"2026-01-01T11:19:22.754415-08:00","created_by":"beads/crew/grip"},{"issue_id":"bd-ik1b","depends_on_id":"bd-615z","type":"blocks","created_at":"2026-01-01T11:19:23.964595-08:00","created_by":"beads/crew/grip"}]} +{"id":"bd-ik1b","title":"Add --validate flag to bd create","description":"Opt-in strict mode that fails creation if required sections are missing. Uses ValidateTemplate() under the hood.","status":"closed","priority":3,"issue_type":"task","assignee":"beads/crew/emma","created_at":"2026-01-01T11:19:09.036754-08:00","created_by":"beads/crew/grip","updated_at":"2026-01-01T14:20:06.932309-08:00","closed_at":"2026-01-01T14:20:06.932309-08:00","close_reason":"Implemented --validate flag for bd create command","dependencies":[{"issue_id":"bd-ik1b","depends_on_id":"bd-ou35","type":"parent-child","created_at":"2026-01-01T11:19:22.754415-08:00","created_by":"beads/crew/grip"},{"issue_id":"bd-ik1b","depends_on_id":"bd-615z","type":"blocks","created_at":"2026-01-01T11:19:23.964595-08:00","created_by":"beads/crew/grip"}]} {"id":"bd-in7","title":"Test message","description":"Hello world","status":"tombstone","priority":2,"issue_type":"message","created_at":"2025-12-17T23:16:13.184946-08:00","updated_at":"2025-12-25T01:21:01.952723-08:00","deleted_at":"2025-12-25T01:21:01.952723-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"message"} {"id":"bd-indn","title":"bd template commands fail with daemon mode","description":"The `bd template show` and `bd template instantiate` commands fail with 'Error loading template: no database connection' when daemon is running.\n\n**Reproduction:**\n```bash\nbd daemon --start\nbd template show bd-qqc # Error: no database connection\nbd template show bd-qqc --no-daemon # Works\n```\n\n**Expected:** Template commands should work with daemon like other commands.\n\n**Workaround:** Use `--no-daemon` flag.\n\n**Location:** Likely in cmd/bd/template.go - daemon RPC path not implemented for template operations.","status":"closed","priority":2,"issue_type":"bug","created_at":"2025-12-18T22:57:35.16596-08:00","updated_at":"2025-12-23T22:40:32.763595-08:00","closed_at":"2025-12-23T22:40:32.763595-08:00"} {"id":"bd-io8c","title":"Improve test coverage for internal/syncbranch (33.0% → 70%)","description":"Improve test coverage for internal/syncbranch package from 27% to 70%.\n\n## Current State\n- Coverage: 27.0%\n- Files: syncbranch.go, worktree.go\n- Tests: syncbranch_test.go (basic tests exist)\n\n## Functions Needing Tests\n\n### syncbranch.go (config management)\n- [x] ValidateBranchName - has tests\n- [ ] Get - needs store mock tests\n- [ ] GetFromYAML - needs YAML parsing tests\n- [ ] IsConfigured - needs file system tests\n- [ ] IsConfiguredWithDB - needs DB path tests\n- [ ] Set - needs store mock tests\n- [ ] Unset - needs store mock tests\n\n### worktree.go (git operations) - PRIORITY\n- [ ] CommitToSyncBranch - needs git repo fixture tests\n- [ ] PullFromSyncBranch - needs merge scenario tests\n- [ ] CheckDivergence - needs ahead/behind tests\n- [ ] ResetToRemote - needs reset scenario tests\n- [ ] performContentMerge - needs 3-way merge tests\n- [ ] extractJSONLFromCommit - needs git show tests\n- [ ] hasChangesInWorktree - needs dirty state tests\n- [ ] commitInWorktree - needs commit scenario tests\n\n## Implementation Guide\n\n1. **Use testutil fixtures:**\n ```go\n import \"github.com/steveyegge/beads/internal/testutil/fixtures\"\n \n func TestCommitToSyncBranch(t *testing.T) {\n repo := fixtures.NewGitRepo(t)\n defer repo.Cleanup()\n // ... test scenarios\n }\n ```\n\n2. **Test scenarios for worktree.go:**\n - Clean commit (no conflicts)\n - Non-fast-forward push (diverged)\n - Merge conflict resolution\n - Empty changes (nothing to commit)\n\n3. **Mock storage for syncbranch.go:**\n ```go\n store := memory.New()\n // Set up test config\n syncbranch.Set(ctx, store, \"beads-sync\")\n ```\n\n## Success Criteria\n- Coverage ≥ 70%\n- All public functions have at least one test\n- Edge cases covered for git operations\n- Tests pass with `go test -race ./internal/syncbranch`\n\n## Run Tests\n```bash\ngo test -v -cover ./internal/syncbranch\ngo test -race ./internal/syncbranch\n```","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-13T20:43:02.079145-08:00","updated_at":"2025-12-23T13:46:10.191435-08:00","closed_at":"2025-12-23T13:46:10.191435-08:00","dependencies":[{"issue_id":"bd-io8c","depends_on_id":"bd-iz5t","type":"parent-child","created_at":"2025-12-23T12:44:07.213092-08:00","created_by":"daemon"}]} @@ -827,7 +828,7 @@ {"id":"bd-uwkp","title":"Phase 2.4: Git merge driver optimization for TOON format","description":"Optimize git 3-way merge for TOON line-oriented format.\n\n## Overview\nTOON is line-oriented (unlike binary formats), enabling smarter git merge strategies. Implement custom merge driver to handle TOON-specific merge patterns.\n\n## Required Work\n\n### 2.4.1 TOON Merge Driver\n- [ ] Create .git/info/attributes entry for *.toon files\n- [ ] Implement custom merge driver script/command\n- [ ] Handle tabular format row merges (line-based 3-way)\n- [ ] Handle YAML-style format merges\n- [ ] Conflict markers for unsolvable conflicts\n\n### 2.4.2 Merge Patterns\n- [ ] Row addition: both branches add different rows → union\n- [ ] Row deletion: one branch deletes, other modifies → conflict (manual review)\n- [ ] Row modification: concurrent field changes → intelligent merge or conflict\n- [ ] Field ordering changes: ignore (TOON format resilient to order)\n\n### 2.4.3 Testing \u0026 Documentation\n- [ ] Unit tests for merge scenarios (3-way merge logic)\n- [ ] Integration tests with actual git merges\n- [ ] Conflict scenario testing\n- [ ] Documentation of merge strategy\n\n## Success Criteria\n- Git merge handles TOON conflicts intelligently\n- Fewer manual merge conflicts than JSONL\n- Round-trip preserved through merges\n- All 70+ tests still passing\n- Git history stays clean (minimal conflict markers)","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-19T14:43:14.339238776-07:00","updated_at":"2025-12-21T14:42:26.434306-08:00","closed_at":"2025-12-21T14:42:26.434306-08:00","dependencies":[{"issue_id":"bd-uwkp","depends_on_id":"bd-iic1","type":"discovered-from","created_at":"2025-12-19T14:43:14.34427988-07:00","created_by":"daemon"}]} {"id":"bd-uxlb","title":"Add bd agent state command for ZFC-compliant state reporting","description":"Add command for agents to write their own state to agent beads.\n\n```bash\nbd agent state \u003cagent-id\u003e \u003cstate\u003e\n# Example: bd agent state gt-mayor running\n# States: idle | running | stuck | stopped | dead\n```\n\nImplementation:\n1. Lookup agent bead by ID (type=agent)\n2. Update agent_state field in description\n3. Update last_activity timestamp\n4. Trigger bd sync if configured\n\nAlso add:\n- bd agent heartbeat \u003cagent-id\u003e - just updates last_activity\n- bd agent show \u003cagent-id\u003e - show agent bead details\n\nThis is the ZFC-compliant way for agents to self-report state.\n\nCross-ref: gt-p2vyo in gastown","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-28T01:49:46.325964-08:00","created_by":"mayor","updated_at":"2025-12-28T01:57:05.839623-08:00","closed_at":"2025-12-28T01:57:05.839623-08:00"} {"id":"bd-uz8r","title":"Phase 2.3: TOON deletion tracking","description":"Implement deletion tracking in TOON format.\n\n## Overview\nPhase 2.2 switched storage to TOON format. Phase 2.3 adds deletion tracking in TOON format for propagating deletions across clones.\n\n## Required Work\n\n### 2.3.1 Deletion Tracking (TOON Format)\n- [ ] Implement deletions.toon file (tracking deleted issue records)\n- [ ] Add DeleteTracker struct to record deleted issue IDs and metadata\n- [ ] Update bdt delete command to record in deletions.toon\n- [ ] Design deletion record format (ID, timestamp, reason, hash)\n- [ ] Implement auto-prune of old deletion records (configurable TTL)\n\n### 2.3.2 Sync Propagation\n- [ ] Load deletions.toon during import\n- [ ] Remove deleted issues from local database when imported from remote\n- [ ] Handle edge cases (delete same issue in multiple clones)\n- [ ] Deletion ordering and conflict resolution\n\n### 2.3.3 Testing\n- [ ] Unit tests for deletion tracking\n- [ ] Integration tests for deletion propagation\n- [ ] Multi-clone deletion scenarios\n- [ ] TTL expiration tests\n\n## Success Criteria\n- deletions.toon stores deletion records in TOON format\n- Deletions propagate across clones via git sync\n- Old records auto-prune after TTL\n- All 70+ tests still passing\n- bdt delete command works seamlessly","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-19T14:37:23.722066816-07:00","updated_at":"2025-12-21T14:42:27.491932-08:00","closed_at":"2025-12-21T14:42:27.491932-08:00","dependencies":[{"issue_id":"bd-uz8r","depends_on_id":"bd-iic1","type":"discovered-from","created_at":"2025-12-19T14:37:23.726825771-07:00","created_by":"daemon"}]} -{"id":"bd-v2mr","title":"Add RequiredSections() method to IssueType","description":"Add method to internal/types that returns recommended sections per issue type (bug, task, feature, epic). This is the foundation for validation.","status":"in_progress","priority":3,"issue_type":"task","created_at":"2026-01-01T11:19:06.129337-08:00","created_by":"beads/crew/grip","updated_at":"2026-01-01T11:26:29.617864-08:00","dependencies":[{"issue_id":"bd-v2mr","depends_on_id":"bd-ou35","type":"parent-child","created_at":"2026-01-01T11:19:22.697598-08:00","created_by":"beads/crew/grip"}]} +{"id":"bd-v2mr","title":"Add RequiredSections() method to IssueType","description":"Add method to internal/types that returns recommended sections per issue type (bug, task, feature, epic). This is the foundation for validation.","status":"closed","priority":3,"issue_type":"task","created_at":"2026-01-01T11:19:06.129337-08:00","created_by":"beads/crew/grip","updated_at":"2026-01-01T11:28:00.829607-08:00","closed_at":"2026-01-01T11:28:00.829607-08:00","close_reason":"Implemented RequiredSections() method on IssueType with tests","dependencies":[{"issue_id":"bd-v2mr","depends_on_id":"bd-ou35","type":"parent-child","created_at":"2026-01-01T11:19:22.697598-08:00","created_by":"beads/crew/grip"}]} {"id":"bd-v4hq","title":"Test refile command","description":"Testing bd refile","status":"closed","priority":3,"issue_type":"task","created_at":"2025-12-31T12:31:39.783077-08:00","created_by":"beads/crew/grip","updated_at":"2025-12-31T12:31:44.911284-08:00","closed_at":"2025-12-31T12:31:44.911284-08:00","close_reason":"Refiled to gt-lyc2b"} {"id":"bd-v55y","title":"bd repair: Limit verbose output for large orphan counts","description":"When there are thousands of orphaned references, bd repair prints them all, flooding the terminal.\n\nFix: Add --verbose flag; default to summary only (e.g., 'Found 1,234 orphaned dependencies'). Only print individual items with --verbose or when count is small (\u003c20).","status":"closed","priority":3,"issue_type":"feature","created_at":"2025-12-29T12:48:10.496115-08:00","created_by":"stevey","updated_at":"2025-12-29T12:59:05.123618-08:00","closed_at":"2025-12-29T12:59:05.123618-08:00","close_reason":"Fixed in commit d7a67ad6"} {"id":"bd-v5fn","title":"Add default limit to bd list (50 issues)","description":"Add a sensible default limit of 50 issues to bd list output, matching patterns from gh cli (30) and jira-cli (50).\n\n- Default to 50 when no --limit specified\n- --limit 0 means unlimited (explicit override)\n- Protects both agents and humans from overwhelming output\n\nThis is independent of the filter change but complementary.","notes":"## Implementation Plan\n\n### Code Changes (cmd/bd/list.go)\n\n1. **Change default limit** (init function, ~line 887):\n```go\n// Currently: listCmd.Flags().IntP(\"limit\", \"n\", 0, \"Limit results\")\n// Change to:\nlistCmd.Flags().IntP(\"limit\", \"n\", 50, \"Limit results (0 for unlimited)\")\n```\n\n2. **Update help text**:\n```go\n\"Limit results (default: 50, use 0 for unlimited)\"\n```\n\n3. **Handle explicit 0** in Run function:\n```go\n// --limit 0 means unlimited\nif cmd.Flags().Changed(\"limit\") \u0026\u0026 limit == 0 {\n filter.Limit = 0 // No limit applied\n} else if limit \u003e 0 {\n filter.Limit = limit\n} else {\n filter.Limit = 50 // Default\n}\n```\n\n### Testing\n- `bd list` shows max 50 issues\n- `bd list --limit 10` shows max 10\n- `bd list --limit 0` shows unlimited\n- Verify output indicates truncation: \"Showing 50 of 499 issues (use --limit 0 for all)\"\n\n### Documentation\n- Note in help: default changed from unlimited to 50","status":"closed","priority":2,"issue_type":"feature","created_at":"2025-12-29T15:25:08.299726-08:00","created_by":"stevey","updated_at":"2025-12-29T17:53:30.23005-08:00","closed_at":"2025-12-29T17:53:30.23005-08:00","close_reason":"Implemented in single commit","labels":["gh:788"]}