From 8497b0aac5ba5c78f96ecb384b36fe1ac6b1e5e5 Mon Sep 17 00:00:00 2001 From: dave Date: Sun, 4 Jan 2026 21:57:28 -0800 Subject: [PATCH] bd sync: 2026-01-04 21:57:28 --- .beads/issues.jsonl | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.beads/issues.jsonl b/.beads/issues.jsonl index a72adff5..c27eaae1 100644 --- a/.beads/issues.jsonl +++ b/.beads/issues.jsonl @@ -297,7 +297,7 @@ {"id":"bd-b3og","title":"Fix TestImportBugIntegration deadlock in importer_test.go","description":"Code health review found internal/importer/importer_test.go has TestImportBugIntegration skipped with:\n\nTODO: Test hangs due to database deadlock - needs investigation\n\nThis indicates a potential unresolved concurrency issue in the importer. The test has been skipped for an unknown duration.\n\nFix: Investigate the deadlock, fix the underlying issue, and re-enable the test.","status":"tombstone","priority":1,"issue_type":"bug","created_at":"2025-12-16T18:17:22.103838-08:00","updated_at":"2025-12-25T01:21:01.952723-08:00","dependencies":[{"issue_id":"bd-b3og","depends_on_id":"bd-tggf","type":"blocks","created_at":"2025-12-16T18:19:05.740642-08:00","created_by":"daemon"}],"deleted_at":"2025-12-25T01:21:01.952723-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"bug"} {"id":"bd-b6xo","title":"Remove or fix ClearDirtyIssues() - race condition risk (bd-52)","description":"Code health review found internal/storage/sqlite/dirty.go still exposes old ClearDirtyIssues() method (lines 103-108) which clears ALL dirty issues without checking what was actually exported.\n\nData loss risk: If export fails after some issues written to JSONL but before ClearDirtyIssues called, changes to remaining dirty issues will be lost.\n\nThe safer ClearDirtyIssuesByID() (lines 113-132) exists and clears only exported issues.\n\nFix: Either remove old method or mark it deprecated and ensure no code paths use it.","status":"tombstone","priority":1,"issue_type":"bug","created_at":"2025-12-16T18:17:20.534625-08:00","updated_at":"2025-12-25T01:21:01.952723-08:00","dependencies":[{"issue_id":"bd-b6xo","depends_on_id":"bd-tggf","type":"blocks","created_at":"2025-12-16T18:19:05.633738-08:00","created_by":"daemon"}],"deleted_at":"2025-12-25T01:21:01.952723-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"bug"} {"id":"bd-bdc9","title":"Update Homebrew formula","description":"Update the Homebrew tap with new version:\n\n```bash\n./scripts/update-homebrew.sh 0.33.2\n```\n\nThis script waits for GitHub Actions to complete (~5 min), then updates the formula with new SHA256 hashes.","status":"tombstone","priority":1,"issue_type":"task","created_at":"2025-12-21T16:10:13.762399-08:00","updated_at":"2025-12-21T17:29:31.791368-08:00","deleted_at":"2025-12-21T17:29:31.791368-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"task"} -{"id":"bd-beads-crew-dave","title":"Crew worker dave in beads - human-managed persistent workspace.","description":"Crew worker dave in beads - human-managed persistent workspace.\n\nrole_type: crew\nrig: beads\nagent_state: idle\nhook_bead: null\nrole_bead: gt-crew-role\ncleanup_status: null","status":"open","priority":2,"issue_type":"agent","created_at":"2025-12-30T23:14:04.538389-08:00","created_by":"deacon","updated_at":"2026-01-04T17:30:04.343096-08:00"} +{"id":"bd-beads-crew-dave","title":"Crew worker dave in beads - human-managed persistent workspace.","description":"Crew worker dave in beads - human-managed persistent workspace.\n\nrole_type: crew\nrig: beads\nagent_state: idle\nhook_bead: null\nrole_bead: gt-crew-role\ncleanup_status: null","status":"open","priority":2,"issue_type":"agent","created_at":"2025-12-30T23:14:04.538389-08:00","created_by":"deacon","updated_at":"2026-01-04T21:48:53.038191-08:00"} {"id":"bd-beads-crew-emma","title":"Crew worker emma in beads - human-managed persistent workspace.","description":"Crew worker emma in beads - human-managed persistent workspace.\n\nrole_type: crew\nrig: beads\nagent_state: idle\nhook_bead: null\nrole_bead: gt-crew-role\ncleanup_status: null","status":"open","priority":2,"issue_type":"agent","created_at":"2025-12-30T23:14:04.604042-08:00","created_by":"deacon","updated_at":"2026-01-04T16:14:59.877454-08:00"} {"id":"bd-beads-crew-fang","title":"Crew worker fang in beads - human-managed persistent workspace.","description":"Crew worker fang in beads - human-managed persistent workspace.\n\nrole_type: crew\nrig: beads\nagent_state: idle\nhook_bead: null\nrole_bead: gt-crew-role\ncleanup_status: null","status":"open","priority":2,"issue_type":"agent","created_at":"2025-12-30T23:14:04.672037-08:00","created_by":"deacon","updated_at":"2026-01-04T16:51:36.577055-08:00"} {"id":"bd-beads-crew-giles","title":"Crew worker giles in beads - human-managed persistent workspace.","description":"Crew worker giles in beads - human-managed persistent workspace.\n\nrole_type: crew\nrig: beads\nagent_state: idle\nhook_bead: null\nrole_bead: gt-crew-role\ncleanup_status: null\nactive_mr: null\nnotification_level: null","status":"open","priority":2,"issue_type":"agent","created_at":"2026-01-04T11:22:11.009942-08:00","created_by":"mayor","updated_at":"2026-01-04T11:22:11.009942-08:00"} @@ -314,8 +314,8 @@ {"id":"bd-beads-polecat-ruby","title":"bd-beads-polecat-ruby","description":"bd-beads-polecat-ruby\n\nrole_type: polecat\nrig: beads\nagent_state: spawning\nhook_bead: bd-p7i2\nrole_bead: hq-polecat-role\ncleanup_status: has_stash\nactive_mr: bd-j7v7\nnotification_level: null","status":"open","priority":2,"issue_type":"agent","created_at":"2026-01-04T16:16:58.553407-08:00","created_by":"mayor","updated_at":"2026-01-04T16:21:32.547113-08:00"} {"id":"bd-beads-polecat-testbot","title":"Agent: bd-beads-polecat-testbot","status":"tombstone","priority":0,"issue_type":"agent","created_at":"2026-01-02T12:24:15.11753-08:00","created_by":"beads/polecats/obsidian","updated_at":"2026-01-02T12:24:57.611128-08:00","labels":["rig:beads","role_type:polecat"],"deleted_at":"2026-01-02T12:24:57.611128-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"agent"} {"id":"bd-beads-polecat-topaz","title":"bd-beads-polecat-topaz","description":"bd-beads-polecat-topaz\n\nrole_type: polecat\nrig: beads\nagent_state: spawning\nhook_bead: bd-3tqg\nrole_bead: gt-polecat-role\ncleanup_status: null\nactive_mr: bd-ngfl\nnotification_level: null","status":"open","priority":2,"issue_type":"agent","created_at":"2026-01-04T11:36:03.898913-08:00","created_by":"mayor","updated_at":"2026-01-04T11:45:09.200848-08:00"} -{"id":"bd-beads-refinery","title":"Refinery for beads - processes merge queue.","description":"Refinery for beads - processes merge queue.\n\nrole_type: refinery\nrig: beads\nagent_state: idle\nhook_bead: null\nrole_bead: gt-refinery-role\ncleanup_status: null","status":"open","priority":2,"issue_type":"agent","created_at":"2025-12-30T23:14:04.469888-08:00","created_by":"deacon","updated_at":"2025-12-30T23:14:04.469888-08:00"} -{"id":"bd-beads-witness","title":"Witness for beads - monitors polecat health and progress.","description":"Witness for beads - monitors polecat health and progress.\n\nrole_type: witness\nrig: beads\nagent_state: idle\nhook_bead: null\nrole_bead: gt-witness-role\ncleanup_status: null","status":"open","priority":2,"issue_type":"agent","created_at":"2025-12-30T23:14:04.401378-08:00","created_by":"deacon","updated_at":"2026-01-02T21:19:43.755484-08:00"} +{"id":"bd-beads-refinery","title":"Refinery for beads - processes merge queue.","description":"Refinery for beads - processes merge queue.\n\nrole_type: refinery\nrig: beads\nagent_state: idle\nhook_bead: null\nrole_bead: gt-refinery-role\ncleanup_status: null","status":"open","priority":2,"issue_type":"agent","created_at":"2025-12-30T23:14:04.469888-08:00","created_by":"deacon","updated_at":"2026-01-04T21:36:40.565213-08:00"} +{"id":"bd-beads-witness","title":"Witness for beads - monitors polecat health and progress.","description":"Witness for beads - monitors polecat health and progress.\n\nrole_type: witness\nrig: beads\nagent_state: idle\nhook_bead: null\nrole_bead: gt-witness-role\ncleanup_status: null","status":"open","priority":2,"issue_type":"agent","created_at":"2025-12-30T23:14:04.401378-08:00","created_by":"deacon","updated_at":"2026-01-04T21:36:38.69011-08:00"} {"id":"bd-bgm","title":"Fix unparam unused parameter in cmd/bd/doctor.go:1879","description":"Linting issue: checkGitHooks - path is unused (unparam) at cmd/bd/doctor.go:1879:20. Error: func checkGitHooks(path string) doctorCheck {","status":"tombstone","priority":0,"issue_type":"bug","created_at":"2025-12-07T15:35:25.270293252-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":"bug"} {"id":"bd-bgr","title":"Test stdin 2","description":"Description from stdin test\n","status":"tombstone","priority":4,"issue_type":"task","created_at":"2025-12-17T17:28:05.41434-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":"task"} {"id":"bd-bha9","title":"Add missing updated_at index on issues table","description":"GetStaleIssues queries filter by updated_at but there's no index on this column.\n\n**Current query (ready.go:253-254):**\n```sql\nWHERE status != 'closed'\n AND datetime(updated_at) \u003c datetime('now', '-' || ? || ' days')\n```\n\n**Problem:** Full table scan when filtering stale issues.\n\n**Solution:** Add migration to create:\n```sql\nCREATE INDEX IF NOT EXISTS idx_issues_updated_at ON issues(updated_at);\n```\n\n**Note:** The datetime() function wrapper may prevent index usage. Consider also storing updated_at as INTEGER (unix timestamp) for better index efficiency, or test if SQLite can use the index despite the function.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-22T22:58:49.166051-08:00","updated_at":"2025-12-22T23:15:13.837078-08:00","closed_at":"2025-12-22T23:15:13.837078-08:00","dependencies":[{"issue_id":"bd-bha9","depends_on_id":"bd-h0we","type":"discovered-from","created_at":"2025-12-22T22:58:49.166949-08:00","created_by":"daemon"}]} @@ -487,7 +487,7 @@ {"id":"bd-hy9p","title":"Add --body-file flag to bd create for reading descriptions from files","description":"## Problem\n\nCreating issues with long/complex descriptions via CLI requires shell escaping gymnastics:\n\n```bash\n# Current workaround - awkward heredoc quoting\nbd create --title=\"...\" --description=\"$(cat \u003c\u003c'EOF'\n...markdown...\nEOF\n)\"\n\n# Often fails with quote escaping errors in eval context\n# Agents resort to writing temp files then reading them\n```\n\n## Proposed Solution\n\nAdd `--body-file` and `--description-file` flags to read description from a file, matching `gh` CLI pattern.\n\n```bash\n# Natural pattern that aligns with training data\ncat \u003e /tmp/desc.md \u003c\u003c 'EOF'\n...markdown content...\nEOF\n\nbd create --title=\"...\" --body-file=/tmp/desc.md\n```\n\n## Implementation\n\n### 1. Add new flags to `bd create`\n\n```go\ncreateCmd.Flags().String(\"body-file\", \"\", \"Read description from file (use - for stdin)\")\ncreateCmd.Flags().String(\"description-file\", \"\", \"Alias for --body-file\")\n```\n\n### 2. Flag precedence\n\n- If `--body-file` or `--description-file` is provided, read from file\n- If value is `-`, read from stdin\n- Otherwise fall back to `--body` or `--description` flag\n- If neither provided, description is empty (current behavior)\n\n### 3. Error handling\n\n- File doesn't exist → clear error message\n- File not readable → clear error message\n- stdin specified but not available → clear error message\n\n## Benefits\n\n✅ **Matches training data**: `gh issue create --body-file file.txt` is a common pattern\n✅ **No shell escaping issues**: File content is read directly\n✅ **Works with any content**: Markdown, special characters, quotes, etc.\n✅ **Agent-friendly**: Agents already write complex content to temp files\n✅ **User-friendly**: Easier for humans too when pasting long descriptions\n\n## Related Commands\n\nConsider adding similar support to:\n- `bd update --body-file` (for updating descriptions)\n- `bd comment --body-file` (if/when we add comments)\n\n## Examples\n\n```bash\n# From file\nbd create --title=\"Add new feature\" --body-file=feature.md\n\n# From stdin\necho \"Quick description\" | bd create --title=\"Bug fix\" --body-file=-\n\n# With other flags\nbd create \\\n --title=\"Security issue\" \\\n --type=bug \\\n --priority=0 \\\n --body-file=security-report.md \\\n --label=security\n```\n\n## Testing\n\n- Test with normal files\n- Test with stdin (`-`)\n- Test with non-existent files (error handling)\n- Test with binary files (should handle gracefully)\n- Test with empty files (valid - empty description)\n- Test that `--description-file` and `--body-file` are equivalent aliases","status":"tombstone","priority":1,"issue_type":"feature","created_at":"2025-11-22T00:02:08.762684-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":"feature"} {"id":"bd-hzvz","title":"Update info.go versionChanges","description":"Add entry to versionChanges in cmd/bd/info.go with agent-actionable changes for 0.30.7","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-19T22:56:48.649359-08:00","updated_at":"2025-12-19T22:57:31.604229-08:00","closed_at":"2025-12-19T22:57:31.604229-08:00","dependencies":[{"issue_id":"bd-hzvz","depends_on_id":"bd-8pyn","type":"parent-child","created_at":"2025-12-19T22:56:48.652068-08:00","created_by":"stevey"},{"issue_id":"bd-hzvz","depends_on_id":"bd-2ep8","type":"blocks","created_at":"2025-12-19T22:56:48.652376-08:00","created_by":"stevey"}]} {"id":"bd-i0rx","title":"Merge: bd-ao0s","description":"branch: polecat/rictus\ntarget: main\nsource_issue: bd-ao0s\nrig: beads","status":"closed","priority":2,"issue_type":"merge-request","created_at":"2025-12-20T01:13:42.716658-08:00","updated_at":"2025-12-20T23:17:26.993744-08:00","closed_at":"2025-12-20T23:17:26.993744-08:00"} -{"id":"bd-i3ed","title":"Refactor bd setup to recipe-based architecture (GH#898)","description":"## Summary\n\nReplace tool-specific setup commands (cursor, claude, etc.) with a generic recipe-based system. New tools become config entries, not code changes.\n\n## Motivation\n\nGH#898 requests Kilo Code integration. Current approach requires new Go code for each tool:\n- `cmd/bd/setup/cursor.go`\n- `cmd/bd/setup/kilocode.go` (proposed)\n- `cmd/bd/setup/windsurf.go` (future?)\n- ...\n\nThis does not scale. All these integrations do the same thing:\n1. Generate markdown content (beads workflow instructions)\n2. Write to tool-specific path\n\nThe **content** is identical. Only the **destination path** varies.\n\n## Design\n\n### Core Insight\n\nBeads does not need to know anything about Kilo Code, Cursor, or Claude Code beyond where they read their rules files. That is a path mapping—data, not code.\n\n### Recipe Format\n\n```toml\n# .beads/recipes.toml (user additions/overrides)\n[cursor]\npath = \".cursor/rules/bd.md\"\n\n[claude]\npath = \"CLAUDE.md\"\n\n[kilocode]\npath = \".kilocode/rules/bd.md\"\n\n[my-custom-editor]\npath = \".myeditor/config/bd.md\"\n```\n\n### Built-in Defaults\n\nShip sensible defaults compiled into binary:\n- cursor → `.cursor/rules/bd.md`\n- claude → `CLAUDE.md`\n- windsurf → `.windsurf/rules/bd.md`\n- cody → `.cody/rules/bd.md` (verify path)\n\nUser file overrides/extends built-in defaults.\n\n### Commands\n\n| Command | Description |\n|---------|-------------|\n| `bd setup \u003crecipe\u003e` | Write template to recipe path |\n| `bd setup --list` | Show available recipes (built-in + user) |\n| `bd setup --print` | Dump template to stdout |\n| `bd setup -o \u003cpath\u003e` | Write to arbitrary path (escape hatch) |\n| `bd setup \u003crecipe\u003e --check` | Verify if installed |\n| `bd setup \u003crecipe\u003e --remove` | Delete the file |\n| `bd setup --add \u003cname\u003e \u003cpath\u003e` | Save custom recipe |\n\n### Template\n\nSingle markdown template embedded in binary. Contains:\n- What beads is\n- Key commands (`bd ready`, `bd create`, `bd close`, etc.)\n- Workflow guidance\n- JSON flags for programmatic use\n\n### Implementation Plan\n\n1. Add `--print` and `-o` flags to existing setup command\n2. Create `internal/recipes/` package\n - Built-in recipes (Go map or embed)\n - Load/merge user `.beads/recipes.toml`\n3. Refactor `cmd/bd/setup/setup.go` to use recipes\n4. Remove tool-specific files (`cursor.go`, etc.)\n5. Add `--add` command to save custom recipes\n6. Update documentation\n\n### Migration\n\nExisting `bd setup cursor` continues to work—just backed by recipe lookup instead of dedicated code.\n\n## Out of Scope (for now)\n\n- `--global` flag (user-level config paths) — use `-o` escape hatch\n- `mode: append` (add to existing file) — wait until requested\n- GitHub recipe registry — overkill for path mappings\n- TOML migration for config.yaml — separate initiative\n\n## Response to GH#898\n\nOnce implemented, respond to PR:\n\n\u003e Thanks for the contribution! We are refactoring `bd setup` to a recipe-based approach where new tools are config entries, not code changes.\n\u003e\n\u003e Instead of new Go files, please submit a PR adding Kilo Code to the built-in recipes in `internal/recipes/builtin.go` (or equivalent). Happy to help if you have questions!\n\n## References\n\n- GH#898: Kilo Code integration request\n- Current setup code: `cmd/bd/setup/`\n","status":"open","priority":2,"issue_type":"feature","created_at":"2026-01-04T20:05:44.32166-08:00","created_by":"beads/crew/fang","updated_at":"2026-01-04T20:05:44.32166-08:00"} +{"id":"bd-i3ed","title":"Refactor bd setup to recipe-based architecture (GH#898)","description":"## Summary\n\nReplace tool-specific setup commands (cursor, claude, etc.) with a generic recipe-based system. New tools become config entries, not code changes.\n\n## Motivation\n\nGH#898 requests Kilo Code integration. Current approach requires new Go code for each tool:\n- `cmd/bd/setup/cursor.go`\n- `cmd/bd/setup/kilocode.go` (proposed)\n- `cmd/bd/setup/windsurf.go` (future?)\n- ...\n\nThis does not scale. All these integrations do the same thing:\n1. Generate markdown content (beads workflow instructions)\n2. Write to tool-specific path\n\nThe **content** is identical. Only the **destination path** varies.\n\n## Design\n\n### Core Insight\n\nBeads does not need to know anything about Kilo Code, Cursor, or Claude Code beyond where they read their rules files. That is a path mapping—data, not code.\n\n### Recipe Format\n\n```toml\n# .beads/recipes.toml (user additions/overrides)\n[cursor]\npath = \".cursor/rules/bd.md\"\n\n[claude]\npath = \"CLAUDE.md\"\n\n[kilocode]\npath = \".kilocode/rules/bd.md\"\n\n[my-custom-editor]\npath = \".myeditor/config/bd.md\"\n```\n\n### Built-in Defaults\n\nShip sensible defaults compiled into binary:\n- cursor → `.cursor/rules/bd.md`\n- claude → `CLAUDE.md`\n- windsurf → `.windsurf/rules/bd.md`\n- cody → `.cody/rules/bd.md` (verify path)\n\nUser file overrides/extends built-in defaults.\n\n### Commands\n\n| Command | Description |\n|---------|-------------|\n| `bd setup \u003crecipe\u003e` | Write template to recipe path |\n| `bd setup --list` | Show available recipes (built-in + user) |\n| `bd setup --print` | Dump template to stdout |\n| `bd setup -o \u003cpath\u003e` | Write to arbitrary path (escape hatch) |\n| `bd setup \u003crecipe\u003e --check` | Verify if installed |\n| `bd setup \u003crecipe\u003e --remove` | Delete the file |\n| `bd setup --add \u003cname\u003e \u003cpath\u003e` | Save custom recipe |\n\n### Template\n\nSingle markdown template embedded in binary. Contains:\n- What beads is\n- Key commands (`bd ready`, `bd create`, `bd close`, etc.)\n- Workflow guidance\n- JSON flags for programmatic use\n\n### Implementation Plan\n\n1. Add `--print` and `-o` flags to existing setup command\n2. Create `internal/recipes/` package\n - Built-in recipes (Go map or embed)\n - Load/merge user `.beads/recipes.toml`\n3. Refactor `cmd/bd/setup/setup.go` to use recipes\n4. Remove tool-specific files (`cursor.go`, etc.)\n5. Add `--add` command to save custom recipes\n6. Update documentation\n\n### Migration\n\nExisting `bd setup cursor` continues to work—just backed by recipe lookup instead of dedicated code.\n\n## Out of Scope (for now)\n\n- `--global` flag (user-level config paths) — use `-o` escape hatch\n- `mode: append` (add to existing file) — wait until requested\n- GitHub recipe registry — overkill for path mappings\n- TOML migration for config.yaml — separate initiative\n\n## Response to GH#898\n\nOnce implemented, respond to PR:\n\n\u003e Thanks for the contribution! We are refactoring `bd setup` to a recipe-based approach where new tools are config entries, not code changes.\n\u003e\n\u003e Instead of new Go files, please submit a PR adding Kilo Code to the built-in recipes in `internal/recipes/builtin.go` (or equivalent). Happy to help if you have questions!\n\n## References\n\n- GH#898: Kilo Code integration request\n- Current setup code: `cmd/bd/setup/`\n","status":"closed","priority":1,"issue_type":"feature","created_at":"2026-01-04T20:05:44.32166-08:00","created_by":"beads/crew/fang","updated_at":"2026-01-04T21:57:21.225792-08:00","closed_at":"2026-01-04T21:57:21.225792-08:00","close_reason":"Implemented recipe-based architecture for bd setup"} {"id":"bd-i5l","title":"Witness Patrol","description":"Per-rig worker monitor patrol loop with progressive nudging.","status":"tombstone","priority":2,"issue_type":"molecule","created_at":"2025-12-26T21:20:47.650732-08:00","created_by":"deacon","updated_at":"2025-12-27T00:10:54.176287-08:00","deleted_at":"2025-12-27T00:10:54.176287-08:00","deleted_by":"daemon","delete_reason":"delete","original_type":"molecule"} {"id":"bd-i7a6","title":"Test actor flag","status":"closed","priority":4,"issue_type":"task","created_at":"2025-12-26T20:47:28.470006-08:00","updated_at":"2025-12-28T09:26:06.084894-08:00","closed_at":"2025-12-28T09:26:06.084894-08:00"} {"id":"bd-ia3g","title":"BondRef.ProtoID field name is misleading for mol+mol bonds","description":"In bondMolMol, the BondRef.ProtoID field is used to store molecule IDs:\n\n```go\nBondedFrom: append(molA.BondedFrom, types.BondRef{\n ProtoID: molB.ID, // This is a molecule, not a proto\n ...\n})\n```\n\nThis is semantically confusing since ProtoID suggests it should only hold proto references.\n\n**Options:**\n1. Rename ProtoID to SourceID (breaking change, needs migration)\n2. Add documentation clarifying ProtoID can hold molecule IDs in bond context\n3. Leave as-is, accept the naming is imprecise\n\nLow priority since it's just naming, not functionality.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-21T10:23:00.755067-08:00","updated_at":"2025-12-30T15:44:43.355533-08:00","closed_at":"2025-12-30T00:40:56.399444-08:00","close_reason":"Merged via refinery"}