diff --git a/.beads/.gitignore b/.beads/.gitignore index d27a1db5..dba69141 100644 --- a/.beads/.gitignore +++ b/.beads/.gitignore @@ -1,30 +1,45 @@ -# SQLite databases -*.db -*.db?* -*.db-journal -*.db-wal -*.db-shm +# Dolt database (managed by Dolt, not git) +dolt/ +dolt-access.lock -# Daemon runtime files -daemon.lock -daemon.log -daemon.pid +# Runtime files bd.sock +bd.sock.startlock sync-state.json last-touched # Local version tracking (prevents upgrade notification spam after git ops) .local_version -# Legacy database files -db.sqlite -bd.db - # Worktree redirect file (contains relative path to main repo's .beads/) # Must not be committed as paths would be wrong in other clones redirect -# Merge artifacts (temporary files from 3-way merge) +# Sync state (local-only, per-machine) +# These files are machine-specific and should not be shared across clones +.sync.lock +.jsonl.lock +sync_base.jsonl +export-state/ + +# Ephemeral store (SQLite - wisps/molecules, intentionally not versioned) +ephemeral.sqlite3 +ephemeral.sqlite3-journal +ephemeral.sqlite3-wal +ephemeral.sqlite3-shm + +# Legacy files (from pre-Dolt versions) +*.db +*.db?* +*.db-journal +*.db-wal +*.db-shm +db.sqlite +bd.db +daemon.lock +daemon.log +daemon-*.log.gz +daemon.pid beads.base.jsonl beads.base.meta.json beads.left.jsonl @@ -32,11 +47,6 @@ beads.left.meta.json beads.right.jsonl beads.right.meta.json -# Sync state (local-only, per-machine) -# These files are machine-specific and should not be shared across clones -.sync.lock -sync_base.jsonl - # NOTE: Do NOT add negation patterns (e.g., !issues.jsonl) here. # They would override fork protection in .git/info/exclude, allowing # contributors to accidentally commit upstream issue databases. diff --git a/.beads/README.md b/.beads/README.md index 50f281f0..1029bf1b 100644 --- a/.beads/README.md +++ b/.beads/README.md @@ -26,8 +26,8 @@ bd show bd update --status in_progress bd update --status done -# Sync with git remote -bd sync +# Sync with Dolt remote +bd dolt push ``` ### Working with Issues diff --git a/.beads/config.yaml b/.beads/config.yaml index f2427856..68ce17a2 100644 --- a/.beads/config.yaml +++ b/.beads/config.yaml @@ -1,62 +1,2 @@ -# Beads Configuration File -# This file configures default behavior for all bd commands in this repository -# All settings can also be set via environment variables (BD_* prefix) -# or overridden with command-line flags - -# Issue prefix for this repository (used by bd init) -# If not set, bd init will auto-detect from directory name -# Example: issue-prefix: "myproject" creates issues like "myproject-1", "myproject-2", etc. -# issue-prefix: "" - -# Use no-db mode: load from JSONL, no SQLite, write back after each command -# When true, bd will use .beads/issues.jsonl as the source of truth -# instead of SQLite database -# no-db: false - -# Disable daemon for RPC communication (forces direct database access) -# no-daemon: false - -# Disable auto-flush of database to JSONL after mutations -# no-auto-flush: false - -# Disable auto-import from JSONL when it's newer than database -# no-auto-import: false - -# Enable JSON output by default -# json: false - -# Default actor for audit trails (overridden by BD_ACTOR or --actor) -# actor: "" - -# Path to database (overridden by BEADS_DB or --db) -# db: "" - -# Auto-start daemon if not running (can also use BEADS_AUTO_START_DAEMON) -# auto-start-daemon: true - -# Debounce interval for auto-flush (can also use BEADS_FLUSH_DEBOUNCE) -# flush-debounce: "5s" - -# Git branch for beads commits (bd sync will commit to this branch) -# IMPORTANT: Set this for team projects so all clones use the same sync branch. -# This setting persists across clones (unlike database config which is gitignored). -# Can also use BEADS_SYNC_BRANCH env var for local override. -# If not set, bd sync will require you to run 'bd config set sync.branch '. -# sync-branch: "beads-sync" - -# Multi-repo configuration (experimental - bd-307) -# Allows hydrating from multiple repositories and routing writes to the correct JSONL -# repos: -# primary: "." # Primary repo (where this database lives) -# additional: # Additional repos to hydrate from (read-only) -# - ~/beads-planning # Personal planning repo -# - ~/work-planning # Work planning repo - -# Integration settings (access with 'bd config get/set') -# These are stored in the database, not in this file: -# - jira.url -# - jira.project -# - linear.url -# - linear.api-key -# - github.org -# - github.repo +sync: + mode: dolt-native diff --git a/.beads/export-state/011d4db301c31e61.json b/.beads/export-state/011d4db301c31e61.json deleted file mode 100644 index d0a56f8a..00000000 --- a/.beads/export-state/011d4db301c31e61.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "worktree_root": "/home/nvandessel/repos/feedback-loop/.worktrees/w03.6", - "last_export_commit": "c5a1ef96a6943349feaf78cf68e0d16f88501b03", - "last_export_time": "2026-02-07T21:39:33.779987069-08:00", - "jsonl_hash": "0e40c6419cfb2cec7f09491477116d2c335a8d5713fe02065da9792796bd937a" -} \ No newline at end of file diff --git a/.beads/export-state/039d9a1f907f6426.json b/.beads/export-state/039d9a1f907f6426.json deleted file mode 100644 index a44ebef9..00000000 --- a/.beads/export-state/039d9a1f907f6426.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "worktree_root": "/home/nvandessel/repos/feedback-loop/.worktrees/ci-cd", - "last_export_commit": "860302f8e3e923ead8dfce10257fbabe2102e8d0", - "last_export_time": "2026-02-07T19:21:18.351372704-08:00", - "jsonl_hash": "683f59ea3d3f677239ee150f3bd1abe09c98a6a9f81dde1ffa7181532acd663b" -} \ No newline at end of file diff --git a/.beads/export-state/081520b556c6b595.json b/.beads/export-state/081520b556c6b595.json deleted file mode 100644 index a6aebe3f..00000000 --- a/.beads/export-state/081520b556c6b595.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "worktree_root": "/home/nvandessel/repos/feedback-loop-mcp-cli", - "last_export_commit": "4454ed684f90b83236b06f124cd870413698b588", - "last_export_time": "2026-01-29T08:15:31.162982134-08:00", - "jsonl_hash": "3e164cc1e95113e245c5fda7c6637c4740ec512219001d6ffddecf3591029202" -} \ No newline at end of file diff --git a/.beads/export-state/0be444da1a5f4f95.json b/.beads/export-state/0be444da1a5f4f95.json deleted file mode 100644 index 80c3b5f2..00000000 --- a/.beads/export-state/0be444da1a5f4f95.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "worktree_root": "/home/nvandessel/repos/feedback-loop/.worktrees/ily-graphplacer", - "last_export_commit": "1b2d75b339a7236598751f5d38e212e6528366ca", - "last_export_time": "2026-01-29T21:08:03.497814695-08:00", - "jsonl_hash": "f19479a95ea2c45e48459b86e07ebda1a789d4d0bc3d266f994342b98cec133e" -} \ No newline at end of file diff --git a/.beads/export-state/1341c78a7fcbd579.json b/.beads/export-state/1341c78a7fcbd579.json deleted file mode 100644 index c3c92952..00000000 --- a/.beads/export-state/1341c78a7fcbd579.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "worktree_root": "/home/nvandessel/repos/feedback-loop/.worktrees/cok-prompts", - "last_export_commit": "1b2d75b339a7236598751f5d38e212e6528366ca", - "last_export_time": "2026-01-29T21:09:11.095278341-08:00", - "jsonl_hash": "f19479a95ea2c45e48459b86e07ebda1a789d4d0bc3d266f994342b98cec133e" -} \ No newline at end of file diff --git a/.beads/export-state/1510c6903088d182.json b/.beads/export-state/1510c6903088d182.json deleted file mode 100644 index e8e00570..00000000 --- a/.beads/export-state/1510c6903088d182.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "worktree_root": "/home/nvandessel/repos/floop-8jt-llm-interface", - "last_export_commit": "08d32f5c72d2d1338723096f61f9a3acf84b0389", - "last_export_time": "2026-01-29T20:02:01.759571193-08:00", - "jsonl_hash": "47ea60c738de0683baf74da8754daa8de1a921bb5729f3b174499a3d93f9bf6e" -} \ No newline at end of file diff --git a/.beads/export-state/177c4b4c40159e34.json b/.beads/export-state/177c4b4c40159e34.json deleted file mode 100644 index f34d87ca..00000000 --- a/.beads/export-state/177c4b4c40159e34.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "worktree_root": "/home/nvandessel/repos/feedback-loop/.worktrees/w03.7", - "last_export_commit": "c5a1ef96a6943349feaf78cf68e0d16f88501b03", - "last_export_time": "2026-02-07T21:40:17.56651397-08:00", - "jsonl_hash": "0e40c6419cfb2cec7f09491477116d2c335a8d5713fe02065da9792796bd937a" -} \ No newline at end of file diff --git a/.beads/export-state/1dbab0ae52e3fe21.json b/.beads/export-state/1dbab0ae52e3fe21.json deleted file mode 100644 index 8657bfde..00000000 --- a/.beads/export-state/1dbab0ae52e3fe21.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "worktree_root": "/home/nvandessel/repos/feedback-loop/feedback-loop-ek2.6", - "last_export_commit": "f23ca9328cba81f4394c7ec9d667556e39ee1050", - "last_export_time": "2026-01-28T19:49:52.407349016-08:00", - "jsonl_hash": "656d37483f26a8c4cafbacc08f1c27c268daaaef92145d843f4337e7798a6708" -} \ No newline at end of file diff --git a/.beads/export-state/26362b064f4c8de0.json b/.beads/export-state/26362b064f4c8de0.json deleted file mode 100644 index 87fa9aa2..00000000 --- a/.beads/export-state/26362b064f4c8de0.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "worktree_root": "/home/nvandessel/repos/feedback-loop/feedback-loop-ek2.8", - "last_export_commit": "f23ca9328cba81f4394c7ec9d667556e39ee1050", - "last_export_time": "2026-01-28T19:50:04.021490743-08:00", - "jsonl_hash": "656d37483f26a8c4cafbacc08f1c27c268daaaef92145d843f4337e7798a6708" -} \ No newline at end of file diff --git a/.beads/export-state/285f3c59ac16cacf.json b/.beads/export-state/285f3c59ac16cacf.json deleted file mode 100644 index 6df30f5c..00000000 --- a/.beads/export-state/285f3c59ac16cacf.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "worktree_root": "/home/nvandessel/repos/feedback-loop/.worktrees/xml-escape", - "last_export_commit": "a10e32c28b814c8715b73f859f916ebe09269c96", - "last_export_time": "2026-02-07T19:04:56.731726977-08:00", - "jsonl_hash": "683f59ea3d3f677239ee150f3bd1abe09c98a6a9f81dde1ffa7181532acd663b" -} \ No newline at end of file diff --git a/.beads/export-state/2919d8139c43c58c.json b/.beads/export-state/2919d8139c43c58c.json deleted file mode 100644 index 790e5356..00000000 --- a/.beads/export-state/2919d8139c43c58c.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "worktree_root": "/home/nvandessel/repos/feedback-loop/.worktrees/mcp-token-stats", - "last_export_commit": "339670fc512470d578a9967b2365fa207505f856", - "last_export_time": "2026-02-08T09:05:39.864365507-08:00", - "jsonl_hash": "1bc81fa0fb1317a6949fcd14feccf4a0af3d3a7789573b796c85712b90d43301" -} \ No newline at end of file diff --git a/.beads/export-state/2c2b404a63d1ceea.json b/.beads/export-state/2c2b404a63d1ceea.json deleted file mode 100644 index c59661c8..00000000 --- a/.beads/export-state/2c2b404a63d1ceea.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "worktree_root": "/home/nvandessel/repos/feedback-loop-mcp-protocol", - "last_export_commit": "97c1b2b36069d77daffcf30bc74acda2a84a0de3", - "last_export_time": "2026-01-29T08:04:55.424913346-08:00", - "jsonl_hash": "3e164cc1e95113e245c5fda7c6637c4740ec512219001d6ffddecf3591029202" -} \ No newline at end of file diff --git a/.beads/export-state/2c43ad889012eb23.json b/.beads/export-state/2c43ad889012eb23.json deleted file mode 100644 index 0d723f74..00000000 --- a/.beads/export-state/2c43ad889012eb23.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "worktree_root": "/home/nvandessel/repos/feedback-loop/.worktrees/chy-2-engine", - "last_export_commit": "5cd8b8a74a4c35907ce884bf3cad7d5a195355e1", - "last_export_time": "2026-02-06T09:32:02.179448482-08:00", - "jsonl_hash": "bcde0492b9d344000db503bad49be44552308584ae939f9220878e475fb2fa92" -} \ No newline at end of file diff --git a/.beads/export-state/317c6f891f0d4476.json b/.beads/export-state/317c6f891f0d4476.json deleted file mode 100644 index 79df53f4..00000000 --- a/.beads/export-state/317c6f891f0d4476.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "worktree_root": "/home/nvandessel/repos/feedback-loop/.worktrees/mcp-automerge", - "last_export_commit": "a580fc3e78791732b9e14605de89278274abf1ba", - "last_export_time": "2026-01-30T15:18:43.743993608-08:00", - "jsonl_hash": "ebfa32a9b08cb0576f5038f88c60374b748e3d7edd5b3013145fc9d0451f523b" -} \ No newline at end of file diff --git a/.beads/export-state/33149ad346fb187e.json b/.beads/export-state/33149ad346fb187e.json deleted file mode 100644 index d585ba96..00000000 --- a/.beads/export-state/33149ad346fb187e.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "worktree_root": "/home/nvandessel/repos/feedback-loop/.worktrees/openai-client", - "last_export_commit": "e1739c2e6141f1ff3faef95ac108c6d16731f813", - "last_export_time": "2026-01-30T12:56:18.336262227-08:00", - "jsonl_hash": "0681a349435fa2ec6a4c8b0e2206401b24cc6130497c392825f73d48dcd59ae3" -} \ No newline at end of file diff --git a/.beads/export-state/3c35233148063647.json b/.beads/export-state/3c35233148063647.json deleted file mode 100644 index 033606d2..00000000 --- a/.beads/export-state/3c35233148063647.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "worktree_root": "/home/nvandessel/repos/feedback-loop/.worktrees/chy-1-schema", - "last_export_commit": "0fdb0a7a923fbaecddaa6e65aefcc35b83ea5802", - "last_export_time": "2026-02-06T09:23:40.346301552-08:00", - "jsonl_hash": "4dfedfc1b3e646588853e8e8e8a6896329d4511da4055ca4be2684e232698845" -} \ No newline at end of file diff --git a/.beads/export-state/3d35bfab5edfe946.json b/.beads/export-state/3d35bfab5edfe946.json deleted file mode 100644 index 0798bb2d..00000000 --- a/.beads/export-state/3d35bfab5edfe946.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "worktree_root": "/home/nvandessel/repos/feedback-loop-mcp-docs", - "last_export_commit": "36a7c58617f83e6dbd5b72ade4c100dbd6961330", - "last_export_time": "2026-01-28T22:00:25.600467766-08:00", - "jsonl_hash": "3e164cc1e95113e245c5fda7c6637c4740ec512219001d6ffddecf3591029202" -} \ No newline at end of file diff --git a/.beads/export-state/485f14b408f3d37d.json b/.beads/export-state/485f14b408f3d37d.json deleted file mode 100644 index 43079b41..00000000 --- a/.beads/export-state/485f14b408f3d37d.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "worktree_root": "/home/nvandessel/repos/feedback-loop/.worktrees/w03.12", - "last_export_commit": "c5a1ef96a6943349feaf78cf68e0d16f88501b03", - "last_export_time": "2026-02-07T21:39:33.194003555-08:00", - "jsonl_hash": "0e40c6419cfb2cec7f09491477116d2c335a8d5713fe02065da9792796bd937a" -} \ No newline at end of file diff --git a/.beads/export-state/4e7dbb370b4096be.json b/.beads/export-state/4e7dbb370b4096be.json deleted file mode 100644 index cb3b05b2..00000000 --- a/.beads/export-state/4e7dbb370b4096be.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "worktree_root": "/home/nvandessel/repos/feedback-loop/.worktrees/wt-dedup/.worktrees/wt-graph-validation", - "last_export_commit": "cd85069751bcebcc0a6d27a6aec58a1b2fa4bd0f", - "last_export_time": "2026-02-04T21:39:55.746147812-08:00", - "jsonl_hash": "161b21fd57e832fca7242e53fcd974b9aecd10c9bdeb94739b323d0ada8347b8" -} \ No newline at end of file diff --git a/.beads/export-state/5468ac5e5bb30d09.json b/.beads/export-state/5468ac5e5bb30d09.json deleted file mode 100644 index 5cf507bc..00000000 --- a/.beads/export-state/5468ac5e5bb30d09.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "worktree_root": "/home/nvandessel/repos/floop-2pd-dedup-interface", - "last_export_commit": "08d32f5c72d2d1338723096f61f9a3acf84b0389", - "last_export_time": "2026-01-29T20:02:02.363605372-08:00", - "jsonl_hash": "47ea60c738de0683baf74da8754daa8de1a921bb5729f3b174499a3d93f9bf6e" -} \ No newline at end of file diff --git a/.beads/export-state/55311e78af94b0a2.json b/.beads/export-state/55311e78af94b0a2.json deleted file mode 100644 index f3f9d253..00000000 --- a/.beads/export-state/55311e78af94b0a2.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "worktree_root": "/home/nvandessel/repos/feedback-loop/.worktrees/w03.9", - "last_export_commit": "c5a1ef96a6943349feaf78cf68e0d16f88501b03", - "last_export_time": "2026-02-07T21:43:27.811831852-08:00", - "jsonl_hash": "0e40c6419cfb2cec7f09491477116d2c335a8d5713fe02065da9792796bd937a" -} \ No newline at end of file diff --git a/.beads/export-state/5a71951de5730f0d.json b/.beads/export-state/5a71951de5730f0d.json deleted file mode 100644 index 2f669862..00000000 --- a/.beads/export-state/5a71951de5730f0d.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "worktree_root": "/home/nvandessel/repos/feedback-loop/.worktrees/w03.8", - "last_export_commit": "7a52884804054a1143c6bce76a477b9928b28246", - "last_export_time": "2026-02-07T21:59:53.848939206-08:00", - "jsonl_hash": "0e40c6419cfb2cec7f09491477116d2c335a8d5713fe02065da9792796bd937a" -} \ No newline at end of file diff --git a/.beads/export-state/5a81aa35480404fc.json b/.beads/export-state/5a81aa35480404fc.json deleted file mode 100644 index c7a2df12..00000000 --- a/.beads/export-state/5a81aa35480404fc.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "worktree_root": "/home/nvandessel/repos/feedback-loop/.worktrees/wt-dedup", - "last_export_commit": "cd85069751bcebcc0a6d27a6aec58a1b2fa4bd0f", - "last_export_time": "2026-02-04T21:39:42.208316156-08:00", - "jsonl_hash": "161b21fd57e832fca7242e53fcd974b9aecd10c9bdeb94739b323d0ada8347b8" -} \ No newline at end of file diff --git a/.beads/export-state/5b01360b7aa89e25.json b/.beads/export-state/5b01360b7aa89e25.json deleted file mode 100644 index 97cfd088..00000000 --- a/.beads/export-state/5b01360b7aa89e25.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "worktree_root": "/home/nvandessel/repos/feedback-loop/.worktrees/chy-4-session", - "last_export_commit": "bd1f13d0b9b72e7c935ae189dc99cfd260b9fc95", - "last_export_time": "2026-02-06T09:44:47.337442284-08:00", - "jsonl_hash": "d5e7242dac9dd94715e4469505949655b5e1b5468d682cb72598b58f954daa1f" -} \ No newline at end of file diff --git a/.beads/export-state/5d208d4a021e16d4.json b/.beads/export-state/5d208d4a021e16d4.json deleted file mode 100644 index 1620b229..00000000 --- a/.beads/export-state/5d208d4a021e16d4.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "worktree_root": "/home/nvandessel/repos/feedback-loop/.worktrees/w03.12-followup", - "last_export_commit": "80b635474b1a272233480c217adcc9dc6270695a", - "last_export_time": "2026-02-07T22:09:50.709063236-08:00", - "jsonl_hash": "0e40c6419cfb2cec7f09491477116d2c335a8d5713fe02065da9792796bd937a" -} \ No newline at end of file diff --git a/.beads/export-state/60199bedc2d9d173.json b/.beads/export-state/60199bedc2d9d173.json deleted file mode 100644 index b76148a0..00000000 --- a/.beads/export-state/60199bedc2d9d173.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "worktree_root": "/home/nvandessel/repos/feedback-loop/.worktrees/mock-llm-client", - "last_export_commit": "d9e0cb17d59a62f1fec3c9c924483361926dc511", - "last_export_time": "2026-01-30T10:28:09.996595465-08:00", - "jsonl_hash": "144808b65bb429186160ab749930a54ed60756f8ceecfd68397bdd82eaf488e2" -} \ No newline at end of file diff --git a/.beads/export-state/610f1b7e7a59b089.json b/.beads/export-state/610f1b7e7a59b089.json deleted file mode 100644 index cc48d123..00000000 --- a/.beads/export-state/610f1b7e7a59b089.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "worktree_root": "/home/nvandessel/repos/feedback-loop/.worktrees/test-worktree", - "last_export_commit": "1b2d75b339a7236598751f5d38e212e6528366ca", - "last_export_time": "2026-01-29T20:23:05.167708117-08:00", - "jsonl_hash": "215fabd0c4d5d7ab060f6453a22280e262a961b267d5a6c67a32728b77305160" -} \ No newline at end of file diff --git a/.beads/export-state/715da53204800998.json b/.beads/export-state/715da53204800998.json deleted file mode 100644 index b68db309..00000000 --- a/.beads/export-state/715da53204800998.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "worktree_root": "/home/nvandessel/repos/feedback-loop/.worktrees/crossstore-dedup", - "last_export_commit": "e1739c2e6141f1ff3faef95ac108c6d16731f813", - "last_export_time": "2026-01-30T12:57:26.057242637-08:00", - "jsonl_hash": "0681a349435fa2ec6a4c8b0e2206401b24cc6130497c392825f73d48dcd59ae3" -} \ No newline at end of file diff --git a/.beads/export-state/7628d0fcf8243699.json b/.beads/export-state/7628d0fcf8243699.json deleted file mode 100644 index 7161257c..00000000 --- a/.beads/export-state/7628d0fcf8243699.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "worktree_root": "/home/nvandessel/repos/feedback-loop/.worktrees/fix-merge-sanitize", - "last_export_commit": "4ba1f6bc3c86b6a06b0e6008ee920f437e9a66bc", - "last_export_time": "2026-02-07T19:38:42.976023408-08:00", - "jsonl_hash": "683f59ea3d3f677239ee150f3bd1abe09c98a6a9f81dde1ffa7181532acd663b" -} \ No newline at end of file diff --git a/.beads/export-state/7826f94f885a63ae.json b/.beads/export-state/7826f94f885a63ae.json deleted file mode 100644 index 25f331a4..00000000 --- a/.beads/export-state/7826f94f885a63ae.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "worktree_root": "/home/nvandessel/repos/feedback-loop/.worktrees/docs-structure", - "last_export_commit": "339670fc512470d578a9967b2365fa207505f856", - "last_export_time": "2026-02-08T09:03:47.60065874-08:00", - "jsonl_hash": "1bc81fa0fb1317a6949fcd14feccf4a0af3d3a7789573b796c85712b90d43301" -} \ No newline at end of file diff --git a/.beads/export-state/7c251772cc478052.json b/.beads/export-state/7c251772cc478052.json deleted file mode 100644 index 3d490bc7..00000000 --- a/.beads/export-state/7c251772cc478052.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "worktree_root": "/home/nvandessel/repos/feedback-loop/.worktrees/chy-9-reinforce", - "last_export_commit": "fbb8ee0b6046d58d2bd618bfbfdae768fc12a865", - "last_export_time": "2026-02-06T09:51:26.954479159-08:00", - "jsonl_hash": "12bc40bc24a8ad8ac7dbd35b0e476c315817f64fd54694e24b3b649b82f079b2" -} \ No newline at end of file diff --git a/.beads/export-state/898038b832306f42.json b/.beads/export-state/898038b832306f42.json deleted file mode 100644 index a4c55eb4..00000000 --- a/.beads/export-state/898038b832306f42.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "worktree_root": "/home/nvandessel/repos/feedback-loop/.worktrees/fix-xml-escape", - "last_export_commit": "61e14be5e7679419ee1324c96c91cdf375ccaae2", - "last_export_time": "2026-02-07T19:39:07.544754114-08:00", - "jsonl_hash": "683f59ea3d3f677239ee150f3bd1abe09c98a6a9f81dde1ffa7181532acd663b" -} \ No newline at end of file diff --git a/.beads/export-state/8db959ea5a418292.json b/.beads/export-state/8db959ea5a418292.json deleted file mode 100644 index 8248a828..00000000 --- a/.beads/export-state/8db959ea5a418292.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "worktree_root": "/home/nvandessel/repos/feedback-loop/.worktrees/merge-sanitize", - "last_export_commit": "a10e32c28b814c8715b73f859f916ebe09269c96", - "last_export_time": "2026-02-07T19:04:51.094233521-08:00", - "jsonl_hash": "683f59ea3d3f677239ee150f3bd1abe09c98a6a9f81dde1ffa7181532acd663b" -} \ No newline at end of file diff --git a/.beads/export-state/971f45aa4f18b479.json b/.beads/export-state/971f45aa4f18b479.json deleted file mode 100644 index 2d7e5553..00000000 --- a/.beads/export-state/971f45aa4f18b479.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "worktree_root": "/home/nvandessel/repos/feedback-loop/.worktrees/w03.8/.worktrees/w03.12-followup", - "last_export_commit": "03c1efd7080924105bb673ce37431a6b035a175a", - "last_export_time": "2026-02-07T21:58:57.013173745-08:00", - "jsonl_hash": "0e40c6419cfb2cec7f09491477116d2c335a8d5713fe02065da9792796bd937a" -} \ No newline at end of file diff --git a/.beads/export-state/9fbc920ab6fb8a6b.json b/.beads/export-state/9fbc920ab6fb8a6b.json deleted file mode 100644 index 23d56f9d..00000000 --- a/.beads/export-state/9fbc920ab6fb8a6b.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "worktree_root": "/home/nvandessel/repos/feedback-loop/.worktrees/chy-5-hooks", - "last_export_commit": "fbb8ee0b6046d58d2bd618bfbfdae768fc12a865", - "last_export_time": "2026-02-06T09:51:22.363816182-08:00", - "jsonl_hash": "12bc40bc24a8ad8ac7dbd35b0e476c315817f64fd54694e24b3b649b82f079b2" -} \ No newline at end of file diff --git a/.beads/export-state/a1e1a32621ca39dc.json b/.beads/export-state/a1e1a32621ca39dc.json deleted file mode 100644 index a380646d..00000000 --- a/.beads/export-state/a1e1a32621ca39dc.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "worktree_root": "/home/nvandessel/repos/feedback-loop/.worktrees/chy-3-seeds", - "last_export_commit": "872765378bf38cf3264340c974b92b7a6e9663cc", - "last_export_time": "2026-02-06T09:36:04.350729603-08:00", - "jsonl_hash": "9c213d6a502c52cda99cc9bd5cb8d2aae4afb940c1a415695d99521e05320325" -} \ No newline at end of file diff --git a/.beads/export-state/ab6c30e9d58d365a.json b/.beads/export-state/ab6c30e9d58d365a.json deleted file mode 100644 index 40456a08..00000000 --- a/.beads/export-state/ab6c30e9d58d365a.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "worktree_root": "/home/nvandessel/repos/feedback-loop/.worktrees/wt-scope", - "last_export_commit": "2daca7a6e640528f0b4bc7391c10a56ff77832a5", - "last_export_time": "2026-02-04T21:21:21.057707656-08:00", - "jsonl_hash": "161b21fd57e832fca7242e53fcd974b9aecd10c9bdeb94739b323d0ada8347b8" -} \ No newline at end of file diff --git a/.beads/export-state/b11cbd59bcf3ab7c.json b/.beads/export-state/b11cbd59bcf3ab7c.json deleted file mode 100644 index 71f2602a..00000000 --- a/.beads/export-state/b11cbd59bcf3ab7c.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "worktree_root": "/home/nvandessel/repos/feedback-loop/.worktrees/cli-commands", - "last_export_commit": "a580fc3e78791732b9e14605de89278274abf1ba", - "last_export_time": "2026-01-30T15:17:19.095403607-08:00", - "jsonl_hash": "ebfa32a9b08cb0576f5038f88c60374b748e3d7edd5b3013145fc9d0451f523b" -} \ No newline at end of file diff --git a/.beads/export-state/b2cb3911f2bd4550.json b/.beads/export-state/b2cb3911f2bd4550.json deleted file mode 100644 index 3492a91f..00000000 --- a/.beads/export-state/b2cb3911f2bd4550.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "worktree_root": "/home/nvandessel/repos/feedback-loop/.worktrees/chy-7-inhibition", - "last_export_commit": "872765378bf38cf3264340c974b92b7a6e9663cc", - "last_export_time": "2026-02-06T09:36:45.833375361-08:00", - "jsonl_hash": "7492f38d8436d767aaf586ed1e481607275c76b2d2b9d2193eece8301547fb86" -} \ No newline at end of file diff --git a/.beads/export-state/bb3e8490a59170fd.json b/.beads/export-state/bb3e8490a59170fd.json deleted file mode 100644 index 2b21cb87..00000000 --- a/.beads/export-state/bb3e8490a59170fd.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "worktree_root": "/home/nvandessel/repos/feedback-loop-ek2.6", - "last_export_commit": "f23ca9328cba81f4394c7ec9d667556e39ee1050", - "last_export_time": "2026-01-28T19:58:34.223953044-08:00", - "jsonl_hash": "656d37483f26a8c4cafbacc08f1c27c268daaaef92145d843f4337e7798a6708" -} \ No newline at end of file diff --git a/.beads/export-state/bc76d02ebfd0d55b.json b/.beads/export-state/bc76d02ebfd0d55b.json deleted file mode 100644 index c61c13da..00000000 --- a/.beads/export-state/bc76d02ebfd0d55b.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "worktree_root": "/home/nvandessel/repos/feedback-loop/.worktrees/wt-context", - "last_export_commit": "2daca7a6e640528f0b4bc7391c10a56ff77832a5", - "last_export_time": "2026-02-04T21:20:30.135110869-08:00", - "jsonl_hash": "161b21fd57e832fca7242e53fcd974b9aecd10c9bdeb94739b323d0ada8347b8" -} \ No newline at end of file diff --git a/.beads/export-state/c26b6fb0d31e89ab.json b/.beads/export-state/c26b6fb0d31e89ab.json deleted file mode 100644 index d5a4b623..00000000 --- a/.beads/export-state/c26b6fb0d31e89ab.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "worktree_root": "/home/nvandessel/repos/feedback-loop/.worktrees/a7p-fallback", - "last_export_commit": "1b2d75b339a7236598751f5d38e212e6528366ca", - "last_export_time": "2026-01-29T20:53:41.530830262-08:00", - "jsonl_hash": "f19479a95ea2c45e48459b86e07ebda1a789d4d0bc3d266f994342b98cec133e" -} \ No newline at end of file diff --git a/.beads/export-state/ce2ca7668b92f0dd.json b/.beads/export-state/ce2ca7668b92f0dd.json deleted file mode 100644 index 54b96ae2..00000000 --- a/.beads/export-state/ce2ca7668b92f0dd.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "worktree_root": "/home/nvandessel/repos/feedback-loop/.worktrees/wt-type-safety", - "last_export_commit": "2daca7a6e640528f0b4bc7391c10a56ff77832a5", - "last_export_time": "2026-02-04T21:19:29.648526859-08:00", - "jsonl_hash": "161b21fd57e832fca7242e53fcd974b9aecd10c9bdeb94739b323d0ada8347b8" -} \ No newline at end of file diff --git a/.beads/export-state/d7935223d7e3d02a.json b/.beads/export-state/d7935223d7e3d02a.json deleted file mode 100644 index bebaf431..00000000 --- a/.beads/export-state/d7935223d7e3d02a.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "worktree_root": "/home/nvandessel/repos/feedback-loop-ek2.8", - "last_export_commit": "f23ca9328cba81f4394c7ec9d667556e39ee1050", - "last_export_time": "2026-01-28T19:58:49.56770764-08:00", - "jsonl_hash": "656d37483f26a8c4cafbacc08f1c27c268daaaef92145d843f4337e7798a6708" -} \ No newline at end of file diff --git a/.beads/export-state/d9710ef72b4747ce.json b/.beads/export-state/d9710ef72b4747ce.json deleted file mode 100644 index c4d42dbb..00000000 --- a/.beads/export-state/d9710ef72b4747ce.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "worktree_root": "/home/nvandessel/repos/feedback-loop/.worktrees/w03.13", - "last_export_commit": "b6a3d6b945559c630f0a1c804d2d970f9918616b", - "last_export_time": "2026-02-07T22:03:32.020710267-08:00", - "jsonl_hash": "0e40c6419cfb2cec7f09491477116d2c335a8d5713fe02065da9792796bd937a" -} \ No newline at end of file diff --git a/.beads/export-state/dae272331d3447fe.json b/.beads/export-state/dae272331d3447fe.json deleted file mode 100644 index 0d66781b..00000000 --- a/.beads/export-state/dae272331d3447fe.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "worktree_root": "/home/nvandessel/repos/feedback-loop/.worktrees/anthropic-client", - "last_export_commit": "e1739c2e6141f1ff3faef95ac108c6d16731f813", - "last_export_time": "2026-01-30T12:56:12.860310824-08:00", - "jsonl_hash": "0681a349435fa2ec6a4c8b0e2206401b24cc6130497c392825f73d48dcd59ae3" -} \ No newline at end of file diff --git a/.beads/export-state/de33dfd05c14b5ac.json b/.beads/export-state/de33dfd05c14b5ac.json deleted file mode 100644 index 1975437f..00000000 --- a/.beads/export-state/de33dfd05c14b5ac.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "worktree_root": "/home/nvandessel/repos/feedback-loop-integrations-research", - "last_export_commit": "d739ffcdbc7f34ec225a60aceb10d9c42d5373a9", - "last_export_time": "2026-01-27T08:22:33.743718492-08:00", - "jsonl_hash": "cdb5f03a2de075d5d33cffadc583029cf1773c3460f25738cd3a41a65ef8e712" -} \ No newline at end of file diff --git a/.beads/export-state/e3078e52c79a7430.json b/.beads/export-state/e3078e52c79a7430.json deleted file mode 100644 index 122cf4d6..00000000 --- a/.beads/export-state/e3078e52c79a7430.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "worktree_root": "/home/nvandessel/repos/feedback-loop/.worktrees/fix-cli-sanitize", - "last_export_commit": "7810d013fd0246248c82213feebf9195e4d36dec", - "last_export_time": "2026-02-07T21:04:04.845515288-08:00", - "jsonl_hash": "683f59ea3d3f677239ee150f3bd1abe09c98a6a9f81dde1ffa7181532acd663b" -} \ No newline at end of file diff --git a/.beads/export-state/e8ef48fa1c83ea9d.json b/.beads/export-state/e8ef48fa1c83ea9d.json deleted file mode 100644 index 0d40b7a4..00000000 --- a/.beads/export-state/e8ef48fa1c83ea9d.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "worktree_root": "/home/nvandessel/repos/feedback-loop/.worktrees/chy-6-tiers", - "last_export_commit": "872765378bf38cf3264340c974b92b7a6e9663cc", - "last_export_time": "2026-02-06T09:37:18.022881621-08:00", - "jsonl_hash": "c3c8818b526adaca6b4a5a07d2fe922aac576b286f0b553ad6794c06fa095dc3" -} \ No newline at end of file diff --git a/.beads/export-state/f23349f1555ac926.json b/.beads/export-state/f23349f1555ac926.json deleted file mode 100644 index 0b2007ac..00000000 --- a/.beads/export-state/f23349f1555ac926.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "worktree_root": "/home/nvandessel/repos/feedback-loop-mcp-handlers", - "last_export_commit": "36a7c58617f83e6dbd5b72ade4c100dbd6961330", - "last_export_time": "2026-01-28T21:58:14.730643889-08:00", - "jsonl_hash": "3e164cc1e95113e245c5fda7c6637c4740ec512219001d6ffddecf3591029202" -} \ No newline at end of file diff --git a/.beads/export-state/f2928edecd043086.json b/.beads/export-state/f2928edecd043086.json deleted file mode 100644 index cc15137c..00000000 --- a/.beads/export-state/f2928edecd043086.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "worktree_root": "/home/nvandessel/repos/feedback-loop-mcp-integration", - "last_export_commit": "36a7c58617f83e6dbd5b72ade4c100dbd6961330", - "last_export_time": "2026-01-28T21:58:16.035203533-08:00", - "jsonl_hash": "3e164cc1e95113e245c5fda7c6637c4740ec512219001d6ffddecf3591029202" -} \ No newline at end of file diff --git a/.beads/export-state/f5eff9a8eb1403b2.json b/.beads/export-state/f5eff9a8eb1403b2.json deleted file mode 100644 index 5a187b7b..00000000 --- a/.beads/export-state/f5eff9a8eb1403b2.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "worktree_root": "/home/nvandessel/repos/feedback-loop/.worktrees/chy-8-scoring", - "last_export_commit": "872765378bf38cf3264340c974b92b7a6e9663cc", - "last_export_time": "2026-02-06T09:37:56.042220817-08:00", - "jsonl_hash": "2a495880dc0d861c3687eb97719a2f1c1c70fdaa7eac063359fea48cd5a80eb3" -} \ No newline at end of file diff --git a/.beads/export-state/f6010407cda0d419.json b/.beads/export-state/f6010407cda0d419.json deleted file mode 100644 index f4030177..00000000 --- a/.beads/export-state/f6010407cda0d419.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "worktree_root": "/home/nvandessel/repos/feedback-loop/.worktrees/w03.5", - "last_export_commit": "c5a1ef96a6943349feaf78cf68e0d16f88501b03", - "last_export_time": "2026-02-07T21:36:55.379328768-08:00", - "jsonl_hash": "0e40c6419cfb2cec7f09491477116d2c335a8d5713fe02065da9792796bd937a" -} \ No newline at end of file diff --git a/.beads/export-state/f702b1477427fee6.json b/.beads/export-state/f702b1477427fee6.json deleted file mode 100644 index ae02555c..00000000 --- a/.beads/export-state/f702b1477427fee6.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "worktree_root": "/home/nvandessel/repos/feedback-loop/.worktrees/wt-sqlite", - "last_export_commit": "b81f56501d83d14ec23918034af349445d1db968", - "last_export_time": "2026-02-04T21:20:37.440459207-08:00", - "jsonl_hash": "161b21fd57e832fca7242e53fcd974b9aecd10c9bdeb94739b323d0ada8347b8" -} \ No newline at end of file diff --git a/.beads/export-state/fa0d7534d48c092a.json b/.beads/export-state/fa0d7534d48c092a.json deleted file mode 100644 index 4fa9c2a6..00000000 --- a/.beads/export-state/fa0d7534d48c092a.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "worktree_root": "/home/nvandessel/repos/feedback-loop/.worktrees/integration-tests", - "last_export_commit": "a580fc3e78791732b9e14605de89278274abf1ba", - "last_export_time": "2026-01-30T15:17:28.44565723-08:00", - "jsonl_hash": "ebfa32a9b08cb0576f5038f88c60374b748e3d7edd5b3013145fc9d0451f523b" -} \ No newline at end of file diff --git a/.beads/export-state/fa106e26306e6b25.json b/.beads/export-state/fa106e26306e6b25.json deleted file mode 100644 index fdffab94..00000000 --- a/.beads/export-state/fa106e26306e6b25.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "worktree_root": "/home/nvandessel/repos/feedback-loop/.worktrees/cli-sanitize", - "last_export_commit": "3aa2a026235713168ac6caa933761fe5bffe4ad9", - "last_export_time": "2026-02-07T21:15:14.752115178-08:00", - "jsonl_hash": "683f59ea3d3f677239ee150f3bd1abe09c98a6a9f81dde1ffa7181532acd663b" -} \ No newline at end of file diff --git a/.beads/export-state/fa9d3067488acbb4.json b/.beads/export-state/fa9d3067488acbb4.json deleted file mode 100644 index a195b8ca..00000000 --- a/.beads/export-state/fa9d3067488acbb4.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "worktree_root": "/home/nvandessel/repos/floop-v68-config", - "last_export_commit": "08d32f5c72d2d1338723096f61f9a3acf84b0389", - "last_export_time": "2026-01-29T20:02:02.928728215-08:00", - "jsonl_hash": "47ea60c738de0683baf74da8754daa8de1a921bb5729f3b174499a3d93f9bf6e" -} \ No newline at end of file diff --git a/.beads/export-state/fff6e007ed6272e8.json b/.beads/export-state/fff6e007ed6272e8.json deleted file mode 100644 index 5bd18dc7..00000000 --- a/.beads/export-state/fff6e007ed6272e8.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "worktree_root": "/home/nvandessel/repos/feedback-loop/.worktrees/stats-token-budget", - "last_export_commit": "339670fc512470d578a9967b2365fa207505f856", - "last_export_time": "2026-02-08T09:06:08.862519044-08:00", - "jsonl_hash": "42a4882a3335122d23d0e1f3625acd3831d9ccacd24155a920e38629c80bda87" -} \ No newline at end of file diff --git a/.beads/metadata.json b/.beads/metadata.json index c787975e..1b553536 100644 --- a/.beads/metadata.json +++ b/.beads/metadata.json @@ -1,4 +1,8 @@ { - "database": "beads.db", - "jsonl_export": "issues.jsonl" + "database": "dolt", + "jsonl_export": "issues.jsonl", + "backend": "dolt", + "dolt_mode": "server", + "dolt_server_port": 3307, + "dolt_database": "beads_feedback-loop" } \ No newline at end of file diff --git a/.floop/nodes.jsonl b/.floop/nodes.jsonl index 7c2406be..0dd7f3f3 100644 --- a/.floop/nodes.jsonl +++ b/.floop/nodes.jsonl @@ -1,29 +1,29 @@ -{"id":"behavior-0070f24ee3e8","kind":"forgotten-behavior","content":{"content":{"canonical":"When working on beads: (1) claim with `bd update \u003cid\u003e --status in_progress` when starting, (2) close with `bd close \u003cid\u003e --reason \"...\"` at the same time as the commit that completes the work. Keep bead state synchronized with actual work progress so other agents aren't confused.","expanded":"When working on this type of task, avoid: Made commits that closed beads without updating bead status - didn't claim beads when starting work, didn't close them with the associated commit, waited for user to remind me\n\nInstead: When working on beads: (1) claim with `bd update \u003cid\u003e --status in_progress` when starting, (2) close with `bd close \u003cid\u003e --reason \"...\"` at the same time as the commit that completes the work. Keep bead state synchronized with actual work progress so other agents aren't confused.","structured":{"avoid":"Made commits that closed beads without updating bead status - didn't claim beads when starting work, didn't close them with the associated commit, waited for user to remind me","prefer":"When working on beads: (1) claim with `bd update \u003cid\u003e --status in_progress` when starting, (2) close with `bd close \u003cid\u003e --reason \"...\"` at the same time as the commit that completes the work. Keep bead state synchronized with actual work progress so other agents aren't confused."}},"kind":"preference","name":"learned/when-working-on-beads-1-claim-with-`bd-update-\u003c","provenance":{"correction_id":"correction-1770095930","source_type":"learned"},"when":{"task":"development"}},"metadata":{"confidence":0.655,"forget_reason":"Superseded by behavior-beads-merged","forgotten_at":"2026-02-07T19:08:27-08:00","forgotten_by":"nvandessel","original_kind":"behavior","priority":0,"scope":"both","stats":{"created_at":"2026-02-19T19:53:15-08:00","times_activated":0,"times_confirmed":0,"times_followed":0,"times_overridden":0,"updated_at":"2026-02-19T19:53:15-08:00"}}} -{"id":"behavior-01cb13038379","kind":"behavior","content":{"content":{"canonical":"When documenting all CLI commands, also account for Cobra's implicit built-in commands: completion (shell autocompletion) and help. Run `floop --help` to get the full command list, not just what's in main.go","expanded":"When working on this type of task, avoid: When documenting CLI commands, only looked at explicitly registered commands in main.go and missed Cobra's auto-generated built-in commands (completion, help)\n\nInstead: When documenting all CLI commands, also account for Cobra's implicit built-in commands: completion (shell autocompletion) and help. Run `floop --help` to get the full command list, not just what's in main.go","structured":{"avoid":"When documenting CLI commands, only looked at explicitly registered commands in main.go and missed Cobra's auto-generated built-in commands (completion, help)","prefer":"When documenting all CLI commands, also account for Cobra's implicit built-in commands: completion (shell autocompletion) and help. Run `floop --help` to get the full command list, not just what's in main.go"},"tags":["bash","cli","floop","go"]},"kind":"directive","name":"learned/when-documenting-all-cli-commands-also-account-fo","provenance":{"correction_id":"c-1770713639385927936","source_type":"learned"},"when":{"environment":"development"}},"metadata":{"confidence":0.7000000000000001,"priority":0,"scope":"both","stats":{"created_at":"2026-02-19T19:53:15-08:00","last_activated":"2026-02-11T19:19:55-08:00","times_activated":4,"times_confirmed":0,"times_followed":0,"times_overridden":0,"updated_at":"2026-02-19T19:53:15-08:00"}}} -{"id":"behavior-0b09b561c160","kind":"forgotten-behavior","content":{"content":{"canonical":"Always close beads when completing associated work - beads should close with their work, not be left dangling","expanded":"When working on this type of task, avoid: Completed work without closing the associated beads\n\nInstead: Always close beads when completing associated work - beads should close with their work, not be left dangling","structured":{"avoid":"Completed work without closing the associated beads","prefer":"Always close beads when completing associated work - beads should close with their work, not be left dangling"}},"kind":"directive","name":"learned/always-close-beads-when-completing-associated-work","provenance":{"correction_id":"correction-1770083726","source_type":"learned"},"when":{"task":"project-management"}},"metadata":{"confidence":0.62,"forget_reason":"Superseded by behavior-beads-merged","forgotten_at":"2026-02-07T19:08:27-08:00","forgotten_by":"nvandessel","original_kind":"behavior","priority":0,"scope":"both","stats":{"created_at":"2026-02-19T19:53:15-08:00","times_activated":0,"times_confirmed":0,"times_followed":0,"times_overridden":0,"updated_at":"2026-02-19T19:53:15-08:00"}}} -{"id":"behavior-0cec8456c0e0","kind":"behavior","content":{"content":{"canonical":"When a database schema separates frequently-updated data into satellite tables (like behavior_stats), each satellite table that contributes to the export needs its own dirty tracking trigger. The export path (getNodeUnlocked) and import path (addBehavior) may already handle the data correctly — the gap is specifically in the change detection layer. Audit all UPDATE paths to verify they fire dirty tracking.","expanded":"When working on this type of task, avoid: Assumed dirty tracking triggers on the main `behaviors` table would cover all changes that affect JSONL export. Stats changes (times_activated, times_confirmed, times_overridden) update `behavior_stats` directly, bypassing the behaviors table triggers entirely. Stats were silently lost on DB recreation/reimport.\n\nInstead: When a database schema separates frequently-updated data into satellite tables (like behavior_stats), each satellite table that contributes to the export needs its own dirty tracking trigger. The export path (getNodeUnlocked) and import path (addBehavior) may already handle the data correctly — the gap is specifically in the change detection layer. Audit all UPDATE paths to verify they fire dirty tracking.","structured":{"avoid":"Assumed dirty tracking triggers on the main `behaviors` table would cover all changes that affect JSONL export. Stats changes (times_activated, times_confirmed, times_overridden) update `behavior_stats` directly, bypassing the behaviors table triggers entirely. Stats were silently lost on DB recreation/reimport.","prefer":"When a database schema separates frequently-updated data into satellite tables (like behavior_stats), each satellite table that contributes to the export needs its own dirty tracking trigger. The export path (getNodeUnlocked) and import path (addBehavior) may already handle the data correctly — the gap is specifically in the change detection layer. Audit all UPDATE paths to verify they fire dirty tracking."},"tags":["database","filesystem"]},"kind":"directive","name":"learned/when-a-database-schema-separates-frequently-update","provenance":{"correction_id":"c-1771396957423537500","created_at":"2026-02-17T22:42:37.423710846-08:00","source_type":"learned"},"when":{"environment":"development","file_path":"store/*","language":"go","task":"development"}},"metadata":{"confidence":0.6,"priority":0,"scope":"local","stats":{"created_at":"2026-02-17T23:27:08-08:00","times_activated":0,"times_confirmed":0,"times_followed":0,"times_overridden":0,"updated_at":"2026-02-17T23:27:08-08:00"}}} -{"id":"behavior-150ae3a40011","kind":"behavior","content":{"content":{"canonical":"When completing a deep system audit (like spreading activation + tag affinity validation), immediately capture the key findings via floop_learn: what was tested, what works, what gaps were found, what dictionary keywords are missing, connectivity metrics, token budget health. These audit results are high-value persistent context.","expanded":"When working on this type of task, avoid: When auditing the spreading activation system, found features were working correctly but didn't capture the audit findings via floop_learn. A comprehensive system audit that validates end-to-end functionality is a valuable learning opportunity that should persist across sessions.\n\nInstead: When completing a deep system audit (like spreading activation + tag affinity validation), immediately capture the key findings via floop_learn: what was tested, what works, what gaps were found, what dictionary keywords are missing, connectivity metrics, token budget health. These audit results are high-value persistent context.","structured":{"avoid":"When auditing the spreading activation system, found features were working correctly but didn't capture the audit findings via floop_learn. A comprehensive system audit that validates end-to-end functionality is a valuable learning opportunity that should persist across sessions.","prefer":"When completing a deep system audit (like spreading activation + tag affinity validation), immediately capture the key findings via floop_learn: what was tested, what works, what gaps were found, what dictionary keywords are missing, connectivity metrics, token budget health. These audit results are high-value persistent context."},"tags":["floop","spreading-activation"]},"kind":"directive","name":"learned/when-completing-a-deep-system-audit-like-spreadin","provenance":{"correction_id":"c-1770867616134151808","source_type":"learned"},"when":{"environment":"development"}},"metadata":{"confidence":0.6,"priority":0,"scope":"both","stats":{"created_at":"2026-02-19T19:53:15-08:00","times_activated":0,"times_confirmed":0,"times_followed":0,"times_overridden":0,"updated_at":"2026-02-19T19:53:15-08:00"}}} -{"id":"behavior-5ca906dd04fc","kind":"behavior","content":{"content":{"canonical":"Call floop_learn whenever insights emerge during ANY work — not just corrections. Discovery of gaps, patterns, architectural understanding, feature inventories, design decisions, and any finding that would benefit future sessions is a learning opportunity. The system handles bloat through spreading activation, token budgets, and tiering — so learn freely and trust the system to curate. If a previous learning was too narrow, don't try to edit it — just learn the better version and let weights sort it out.","expanded":"When working on this type of task, avoid: Only called floop_learn when explicitly corrected or when making obvious mistakes. Missed learning opportunities during exploration, research, audits, and general work where insights were discovered but not captured.\n\nInstead: Call floop_learn whenever insights emerge during ANY work — not just corrections. Discovery of gaps, patterns, architectural understanding, feature inventories, design decisions, and any finding that would benefit future sessions is a learning opportunity. The system handles bloat through spreading activation, token budgets, and tiering — so learn freely and trust the system to curate. If a previous learning was too narrow, don't try to edit it — just learn the better version and let weights sort it out.","structured":{"avoid":"Only called floop_learn when explicitly corrected or when making obvious mistakes. Missed learning opportunities during exploration, research, audits, and general work where insights were discovered but not captured.","prefer":"Call floop_learn whenever insights emerge during ANY work — not just corrections. Discovery of gaps, patterns, architectural understanding, feature inventories, design decisions, and any finding that would benefit future sessions is a learning opportunity. The system handles bloat through spreading activation, token budgets, and tiering — so learn freely and trust the system to curate. If a previous learning was too narrow, don't try to edit it — just learn the better version and let weights sort it out."},"tags":["correction","floop","spreading-activation"]},"kind":"constraint","name":"learned/call-floop_learn-whenever-insights-emerge-during-a","provenance":{"correction_id":"c-1770704347456486267","source_type":"learned"},"when":{"environment":"development"}},"metadata":{"confidence":0.7200000000000001,"priority":0,"scope":"both","stats":{"created_at":"2026-02-19T19:53:15-08:00","last_activated":"2026-02-11T19:19:55-08:00","times_activated":4,"times_confirmed":0,"times_followed":0,"times_overridden":0,"updated_at":"2026-02-19T19:53:15-08:00"}}} -{"id":"behavior-6833c04e5542","kind":"behavior","content":{"content":{"canonical":"Use onRenderFramePost(ctx, globalScale) for custom edge rendering in force-graph. It fires every frame (60fps), provides the canvas context in graph coordinate space, and actually works. Iterate graph.graphData().links manually inside the callback. linkDirectionalParticles also works for simpler particle effects.","expanded":"When working on this type of task, avoid: Used linkCanvasObject API in force-graph v1.51.1 for custom link rendering. Despite the API existing as a getter/setter, the callback is NEVER invoked during rendering - 0 calls across all frames. Spent significant debugging time before discovering this.\n\nInstead: Use onRenderFramePost(ctx, globalScale) for custom edge rendering in force-graph. It fires every frame (60fps), provides the canvas context in graph coordinate space, and actually works. Iterate graph.graphData().links manually inside the callback. linkDirectionalParticles also works for simpler particle effects.","structured":{"avoid":"Used linkCanvasObject API in force-graph v1.51.1 for custom link rendering. Despite the API existing as a getter/setter, the callback is NEVER invoked during rendering - 0 calls across all frames. Spent significant debugging time before discovering this.","prefer":"Use onRenderFramePost(ctx, globalScale) for custom edge rendering in force-graph. It fires every frame (60fps), provides the canvas context in graph coordinate space, and actually works. Iterate graph.graphData().links manually inside the callback. linkDirectionalParticles also works for simpler particle effects."}},"kind":"preference","name":"learned/use-onrenderframepostctx-globalscale-for-custom","provenance":{"correction_id":"c-1771539574522859165","created_at":"2026-02-19T14:19:34.52308522-08:00","source_type":"learned"},"when":{"file_path":"visualization/*","language":"javascript"}},"metadata":{"confidence":0.6,"priority":0,"scope":"local","stats":{"created_at":"2026-02-19T19:53:15-08:00","times_activated":0,"times_confirmed":0,"times_followed":0,"times_overridden":0,"updated_at":"2026-02-19T19:53:15-08:00"}}} -{"id":"behavior-714d55f38be5","kind":"behavior","content":{"content":{"canonical":"When performing audits, exploration, or research that reveals project-level insights (gaps, patterns, architectural understanding), immediately capture findings via floop_learn. Any discovery that would be useful context for future sessions is a learning opportunity — not just corrections or mistakes. Proactive learning includes: audit findings, documentation gaps identified, architectural patterns discovered, feature inventory results.","expanded":"When working on this type of task, avoid: During a deep docs audit, discovered significant documentation gaps (no centralized CLI reference, missing integration guides for 6+ tools, no architecture docs, undocumented token optimization features) but failed to capture the findings as a floop learning. The exploration yielded clear insights about the project's documentation state that should persist across sessions.\n\nInstead: When performing audits, exploration, or research that reveals project-level insights (gaps, patterns, architectural understanding), immediately capture findings via floop_learn. Any discovery that would be useful context for future sessions is a learning opportunity — not just corrections or mistakes. Proactive learning includes: audit findings, documentation gaps identified, architectural patterns discovered, feature inventory results.","structured":{"avoid":"During a deep docs audit, discovered significant documentation gaps (no centralized CLI reference, missing integration guides for 6+ tools, no architecture docs, undocumented token optimization features) but failed to capture the findings as a floop learning. The exploration yielded clear insights about the project's documentation state that should persist across sessions.","prefer":"When performing audits, exploration, or research that reveals project-level insights (gaps, patterns, architectural understanding), immediately capture findings via floop_learn. Any discovery that would be useful context for future sessions is a learning opportunity — not just corrections or mistakes. Proactive learning includes: audit findings, documentation gaps identified, architectural patterns discovered, feature inventory results."},"tags":["correction","floop"]},"kind":"preference","name":"learned/when-performing-audits-exploration-or-research-t","provenance":{"correction_id":"c-1770702998768527690","source_type":"learned"},"when":{"environment":"development","task":"development"}},"metadata":{"confidence":0.7400000000000001,"priority":0,"scope":"both","stats":{"created_at":"2026-02-19T19:53:15-08:00","last_activated":"2026-02-11T19:19:55-08:00","times_activated":4,"times_confirmed":0,"times_followed":0,"times_overridden":0,"updated_at":"2026-02-19T19:53:15-08:00"}}} -{"id":"behavior-7a098cb05216","kind":"forgotten-behavior","content":{"content":{"canonical":"Always create detailed beads (epic + tasks) with dependency graphs after planning - enables easy handoff between agents and sessions","expanded":"When working on this type of task, avoid: Jumped directly into implementation after planning without creating beads structure\n\nInstead: Always create detailed beads (epic + tasks) with dependency graphs after planning - enables easy handoff between agents and sessions","structured":{"avoid":"Jumped directly into implementation after planning without creating beads structure","prefer":"Always create detailed beads (epic + tasks) with dependency graphs after planning - enables easy handoff between agents and sessions"}},"kind":"directive","name":"learned/always-create-detailed-beads-epic-+-tasks-with-d","provenance":{"correction_id":"c-1769580766063884670","source_type":"learned"}},"metadata":{"confidence":0.64,"forget_reason":"Superseded by behavior-beads-merged","forgotten_at":"2026-02-07T19:08:27-08:00","forgotten_by":"nvandessel","original_kind":"behavior","priority":0,"scope":"local","stats":{"created_at":"2026-02-19T19:53:15-08:00","times_activated":0,"times_confirmed":0,"times_followed":0,"times_overridden":0,"updated_at":"2026-02-19T19:53:15-08:00"}}} -{"id":"behavior-81e201973717","kind":"behavior","content":{"content":{"canonical":"Create a dedicated usage guide (docs/FLOOP_USAGE.md) and reference it prominently in AGENTS.md - separates 'what' from 'how' and makes instructions comprehensive","expanded":"When working on this type of task, avoid: Created inline usage instructions in AGENTS.md\n\nInstead: Create a dedicated usage guide (docs/FLOOP_USAGE.md) and reference it prominently in AGENTS.md - separates 'what' from 'how' and makes instructions comprehensive","structured":{"avoid":"Created inline usage instructions in AGENTS.md","prefer":"Create a dedicated usage guide (docs/FLOOP_USAGE.md) and reference it prominently in AGENTS.md - separates 'what' from 'how' and makes instructions comprehensive"}},"kind":"directive","name":"learned/create-a-dedicated-usage-guide-docs-floop_usage-m","provenance":{"correction_id":"c-1769578257801753560","created_at":"2026-01-27T21:30:57.802170973-08:00","source_type":"learned"},"when":{"language":"markdown"}},"metadata":{"confidence":0.66,"priority":0,"scope":"local","stats":{"created_at":"2026-02-19T19:53:15-08:00","times_activated":0,"times_confirmed":0,"times_followed":0,"times_overridden":0,"updated_at":"2026-02-19T19:53:15-08:00"}}} -{"id":"behavior-8341f0d52ce6","kind":"behavior","content":{"content":{"canonical":"MCP go-sdk expects jsonschema:\"Description text\" format without key=value syntax. The tag value is directly the description.","expanded":"When working on this type of task, avoid: Subagent used jsonschema:\"description=...\" tag format which caused MCP SDK panic\n\nInstead: MCP go-sdk expects jsonschema:\"Description text\" format without key=value syntax. The tag value is directly the description.","structured":{"avoid":"Subagent used jsonschema:\"description=...\" tag format which caused MCP SDK panic","prefer":"MCP go-sdk expects jsonschema:\"Description text\" format without key=value syntax. The tag value is directly the description."}},"kind":"directive","name":"learned/mcp-go-sdk-expects-jsonschemadescription-text-f","provenance":{"correction_id":"correction-1769817031","created_at":"2026-01-30T15:50:31.088121234-08:00","source_type":"learned"},"when":{"file_path":"mcp/*","language":"go"}},"metadata":{"confidence":0.66,"priority":0,"scope":"both","stats":{"created_at":"2026-02-19T19:53:15-08:00","times_activated":0,"times_confirmed":0,"times_followed":0,"times_overridden":0,"updated_at":"2026-02-19T19:53:15-08:00"}}} -{"id":"behavior-91819ae1aa27","kind":"behavior","content":{"content":{"canonical":"Bad learnings are corrected by learning again, better — not by editing. The spreading activation system mirrors human memory: you can't edit a memory, but you can form a stronger one that outcompetes it. Broader learnings activate in more contexts, win token budget competition, and the narrow/wrong ones naturally go dormant. Trust the system to self-correct through more learning, not surgical intervention.","expanded":"When working on this type of task, avoid: Considered adding a 'floop refine' or 'floop edit' command to surgically fix bad learnings, which fights the human memory metaphor the system is built on.\n\nInstead: Bad learnings are corrected by learning again, better — not by editing. The spreading activation system mirrors human memory: you can't edit a memory, but you can form a stronger one that outcompetes it. Broader learnings activate in more contexts, win token budget competition, and the narrow/wrong ones naturally go dormant. Trust the system to self-correct through more learning, not surgical intervention.","structured":{"avoid":"Considered adding a 'floop refine' or 'floop edit' command to surgically fix bad learnings, which fights the human memory metaphor the system is built on.","prefer":"Bad learnings are corrected by learning again, better — not by editing. The spreading activation system mirrors human memory: you can't edit a memory, but you can form a stronger one that outcompetes it. Broader learnings activate in more contexts, win token budget competition, and the narrow/wrong ones naturally go dormant. Trust the system to self-correct through more learning, not surgical intervention."},"tags":["go","spreading-activation"]},"kind":"directive","name":"learned/bad-learnings-are-corrected-by-learning-again-bet","provenance":{"correction_id":"c-1770704353415650816","source_type":"learned"},"when":{"environment":"development"}},"metadata":{"confidence":0.7200000000000001,"priority":0,"scope":"both","stats":{"created_at":"2026-02-19T19:53:15-08:00","last_activated":"2026-02-11T19:19:55-08:00","times_activated":4,"times_confirmed":0,"times_followed":0,"times_overridden":0,"updated_at":"2026-02-19T19:53:15-08:00"}}} -{"id":"behavior-95d6b9f414e4","kind":"forgotten-behavior","content":{"content":{"canonical":"Global scope is for agent's personal preferences/style across ALL work. Local scope is for team/project-specific conventions. Both have distinct value.","expanded":"When working on this type of task, avoid: Assumed one storage location would be enough\n\nInstead: Global scope is for agent's personal preferences/style across ALL work. Local scope is for team/project-specific conventions. Both have distinct value.","structured":{"avoid":"Assumed one storage location would be enough","prefer":"Global scope is for agent's personal preferences/style across ALL work. Local scope is for team/project-specific conventions. Both have distinct value."}},"kind":"preference","name":"learned/global-scope-is-for-agents-personal-preferences-s","provenance":{"correction_id":"c-1769577671639472329","source_type":"learned"},"when":{"task":"architecture"}},"metadata":{"confidence":0.62,"forget_reason":"Superseded by behavior-floop-scope-merged","forgotten_at":"2026-02-07T19:08:32-08:00","forgotten_by":"nvandessel","original_kind":"behavior","priority":0,"scope":"local","stats":{"created_at":"2026-02-19T19:53:15-08:00","times_activated":0,"times_confirmed":0,"times_followed":0,"times_overridden":0,"updated_at":"2026-02-19T19:53:15-08:00"}}} -{"id":"behavior-967fd13bd390","kind":"forgotten-behavior","content":{"content":{"canonical":"Use scope=both to save important learnings to both local and global","expanded":"When working on this type of task, avoid: Only saved to one store\n\nInstead: Use scope=both to save important learnings to both local and global","structured":{"avoid":"Only saved to one store","prefer":"Use scope=both to save important learnings to both local and global"}},"kind":"preference","name":"learned/use-scope=both-to-save-important-learnings-to-both","provenance":{"correction_id":"c-1769616836888545203","source_type":"learned"},"when":{"task":"configuration"}},"metadata":{"confidence":0.62,"forget_reason":"Superseded by behavior-floop-scope-merged","forgotten_at":"2026-02-07T19:08:32-08:00","forgotten_by":"nvandessel","original_kind":"behavior","priority":0,"scope":"both","stats":{"created_at":"2026-02-19T19:53:15-08:00","times_activated":0,"times_confirmed":0,"times_followed":0,"times_overridden":0,"updated_at":"2026-02-19T19:53:15-08:00"}}} -{"id":"behavior-9c3d12c74c61","kind":"behavior","content":{"content":{"canonical":"Expand tag extraction dictionary with: d.add(\"documentation\", \"documentation\", \"docs\", \"guide\", \"readme\"), d.add(\"subagent\", \"subagent\", \"subagents\", \"agent\", \"agents\", \"orchestrator\"), d.add(\"permissions\", \"permissions\", \"permission\", \"allow\", \"deny\"). Map \"parallel\" to existing \"concurrency\" tag, \"scope\" to \"configuration\", \"hooks\" to \"workflow\". Then run `floop tags backfill` to achieve 100% tag coverage.","expanded":"When working on this type of task, avoid: Tag extraction dictionary in internal/tagging/dictionary.go is missing keywords that appear in behavior content: \"documentation\"/\"docs\"/\"guide\" (3 untagged behaviors mention this), \"subagent\"/\"subagents\"/\"agents\" (9 mentions), \"permissions\"/\"permission\" (6 mentions), \"parallel\"/\"parallelization\" (4 mentions), \"scope\" (3 mentions), \"hooks\" (3 mentions). This leaves 5% of behaviors untagged.\n\nInstead: Expand tag extraction dictionary with: d.add(\"documentation\", \"documentation\", \"docs\", \"guide\", \"readme\"), d.add(\"subagent\", \"subagent\", \"subagents\", \"agent\", \"agents\", \"orchestrator\"), d.add(\"permissions\", \"permissions\", \"permission\", \"allow\", \"deny\"). Map \"parallel\" to existing \"concurrency\" tag, \"scope\" to \"configuration\", \"hooks\" to \"workflow\". Then run `floop tags backfill` to achieve 100% tag coverage.","structured":{"avoid":"Tag extraction dictionary in internal/tagging/dictionary.go is missing keywords that appear in behavior content: \"documentation\"/\"docs\"/\"guide\" (3 untagged behaviors mention this), \"subagent\"/\"subagents\"/\"agents\" (9 mentions), \"permissions\"/\"permission\" (6 mentions), \"parallel\"/\"parallelization\" (4 mentions), \"scope\" (3 mentions), \"hooks\" (3 mentions). This leaves 5% of behaviors untagged.","prefer":"Expand tag extraction dictionary with: d.add(\"documentation\", \"documentation\", \"docs\", \"guide\", \"readme\"), d.add(\"subagent\", \"subagent\", \"subagents\", \"agent\", \"agents\", \"orchestrator\"), d.add(\"permissions\", \"permissions\", \"permission\", \"allow\", \"deny\"). Map \"parallel\" to existing \"concurrency\" tag, \"scope\" to \"configuration\", \"hooks\" to \"workflow\". Then run `floop tags backfill` to achieve 100% tag coverage."},"tags":["concurrency","configuration","floop","workflow"]},"kind":"procedure","name":"learned/expand-tag-extraction-dictionary-with-d-adddocu","provenance":{"correction_id":"c-1770867776463535061","source_type":"learned"},"when":{"environment":"development"}},"metadata":{"confidence":0.6,"priority":0,"scope":"both","stats":{"created_at":"2026-02-19T19:53:15-08:00","times_activated":0,"times_confirmed":0,"times_followed":0,"times_overridden":0,"updated_at":"2026-02-19T19:53:15-08:00"}}} -{"id":"behavior-9c9d9ff7e96e","kind":"behavior","content":{"content":{"canonical":"When testing token budget enforcement in floop_active: (1) each behavior MUST have unique canonical content due to duplicate content detection, (2) understand the full activation pipeline: specificity → SpecificityToActivation → spreading engine sigmoid(x) → tier thresholds. Specificity 0 → activation 0.3 → sigmoid 0.5 → Summary tier. Specificity 1 → 0.4 → sigmoid ~0.731 → Full tier. To trigger budget demotion, use language-matched behaviors (specificity \u003e= 1, Full tier) with large canonical content so the total exceeds the 2000-token budget.","expanded":"When working on this type of task, avoid: When writing tests for token budget enforcement, created behaviors with identical canonical content across all 40 items, triggering duplicate content detection. Also initially assumed behaviors with `when: {}` would exceed the budget at ~25 tokens each, not accounting for the sigmoid squashing (0.3 → 0.5 post-sigmoid) putting them at Summary tier where long content gets truncated to 60 chars (~15 tokens).\n\nInstead: When testing token budget enforcement in floop_active: (1) each behavior MUST have unique canonical content due to duplicate content detection, (2) understand the full activation pipeline: specificity → SpecificityToActivation → spreading engine sigmoid(x) → tier thresholds. Specificity 0 → activation 0.3 → sigmoid 0.5 → Summary tier. Specificity 1 → 0.4 → sigmoid ~0.731 → Full tier. To trigger budget demotion, use language-matched behaviors (specificity \u003e= 1, Full tier) with large canonical content so the total exceeds the 2000-token budget.","structured":{"avoid":"When writing tests for token budget enforcement, created behaviors with identical canonical content across all 40 items, triggering duplicate content detection. Also initially assumed behaviors with `when: {}` would exceed the budget at ~25 tokens each, not accounting for the sigmoid squashing (0.3 → 0.5 post-sigmoid) putting them at Summary tier where long content gets truncated to 60 chars (~15 tokens).","prefer":"When testing token budget enforcement in floop_active: (1) each behavior MUST have unique canonical content due to duplicate content detection, (2) understand the full activation pipeline: specificity → SpecificityToActivation → spreading engine sigmoid(x) → tier thresholds. Specificity 0 → activation 0.3 → sigmoid 0.5 → Summary tier. Specificity 1 → 0.4 → sigmoid ~0.731 → Full tier. To trigger budget demotion, use language-matched behaviors (specificity \u003e= 1, Full tier) with large canonical content so the total exceeds the 2000-token budget."},"tags":["behavior","ci","floop","spreading-activation","testing"]},"kind":"preference","name":"learned/when-testing-token-budget-enforcement-in-floop_act","provenance":{"correction_id":"c-1770712806536601605","source_type":"learned"},"when":{"environment":"development","task":"testing"}},"metadata":{"confidence":0.7000000000000001,"priority":0,"scope":"both","stats":{"created_at":"2026-02-19T19:53:15-08:00","last_activated":"2026-02-11T19:19:55-08:00","times_activated":4,"times_confirmed":0,"times_followed":0,"times_overridden":0,"updated_at":"2026-02-19T19:53:15-08:00"}}} -{"id":"behavior-9d180407fda6","kind":"behavior","content":{"content":{"canonical":"Content hash collision during INSERT should either error explicitly or trigger proper deduplication flow. The current silent replace behavior can cause data loss. Consider: (1) remove UNIQUE constraint and handle dedup separately, or (2) check for existing content_hash before insert and return meaningful error.","expanded":"When working on this type of task, avoid: SQLite store uses INSERT OR REPLACE with a UNIQUE content_hash constraint. When two behaviors have identical canonical content, the second silently replaces the first instead of erroring or deduplicating properly.\n\nInstead: Content hash collision during INSERT should either error explicitly or trigger proper deduplication flow. The current silent replace behavior can cause data loss. Consider: (1) remove UNIQUE constraint and handle dedup separately, or (2) check for existing content_hash before insert and return meaningful error.","structured":{"avoid":"SQLite store uses INSERT OR REPLACE with a UNIQUE content_hash constraint. When two behaviors have identical canonical content, the second silently replaces the first instead of erroring or deduplicating properly.","prefer":"Content hash collision during INSERT should either error explicitly or trigger proper deduplication flow. The current silent replace behavior can cause data loss. Consider: (1) remove UNIQUE constraint and handle dedup separately, or (2) check for existing content_hash before insert and return meaningful error."}},"kind":"preference","name":"learned/content-hash-collision-during-insert-should-either","provenance":{"correction_id":"c-1770270981283723438","created_at":"2026-02-04T21:56:21.283777669-08:00","source_type":"learned"},"when":{"file_path":"store/*","language":"go","task":"bug-identification"}},"metadata":{"confidence":0.66,"priority":0,"scope":"both","stats":{"created_at":"2026-02-19T19:53:15-08:00","times_activated":0,"times_confirmed":0,"times_followed":0,"times_overridden":0,"updated_at":"2026-02-19T19:53:15-08:00"}}} -{"id":"behavior-9f0962d71fa5","kind":"behavior","content":{"content":{"canonical":"After a base PR is squash-merged and GitHub retargets the stacked PR to main, rebase the stacked branch using `git rebase --onto origin/main \u003clast-base-commit\u003e ` to replay only the new commits onto main. This drops the pre-squash commits that are now redundant. Always review the PR diff (`gh pr diff --name-only`) after retargeting to catch stale files before requesting review.","expanded":"When working on this type of task, avoid: Created a stacked PR (targeting a feature branch instead of main). When the base PR was squash-merged, GitHub auto-retargeted the stacked PR to main, but the branch still contained the original pre-squash commits from the base branch. This made the PR diff show extra files (JSON data files, beads) that weren't part of the actual change.\n\nInstead: After a base PR is squash-merged and GitHub retargets the stacked PR to main, rebase the stacked branch using `git rebase --onto origin/main \u003clast-base-commit\u003e ` to replay only the new commits onto main. This drops the pre-squash commits that are now redundant. Always review the PR diff (`gh pr diff --name-only`) after retargeting to catch stale files before requesting review.","structured":{"avoid":"Created a stacked PR (targeting a feature branch instead of main). When the base PR was squash-merged, GitHub auto-retargeted the stacked PR to main, but the branch still contained the original pre-squash commits from the base branch. This made the PR diff show extra files (JSON data files, beads) that weren't part of the actual change.","prefer":"After a base PR is squash-merged and GitHub retargets the stacked PR to main, rebase the stacked branch using `git rebase --onto origin/main \u003clast-base-commit\u003e ` to replay only the new commits onto main. This drops the pre-squash commits that are now redundant. Always review the PR diff (`gh pr diff --name-only`) after retargeting to catch stale files before requesting review."},"tags":["filesystem","git","pr"]},"kind":"preference","name":"learned/after-a-base-pr-is-squash-merged-and-github-retarg","provenance":{"correction_id":"c-1771396948890433001","created_at":"2026-02-17T22:42:28.890911484-08:00","source_type":"learned"},"when":{"environment":"development","task":"development"}},"metadata":{"confidence":0.6,"priority":0,"scope":"local","stats":{"created_at":"2026-02-17T23:27:08-08:00","times_activated":0,"times_confirmed":0,"times_followed":0,"times_overridden":0,"updated_at":"2026-02-17T23:27:08-08:00"}}} -{"id":"behavior-9f0f260dd79f","kind":"behavior","content":{"content":{"canonical":"For ANY visual/rendering changes: create a visual test (puppeteer script, screenshot capture, or at minimum a debug console.log confirming the code path executes) BEFORE announcing the feature works. Never claim visual features are working based solely on code reasoning — canvas rendering has too many subtle failure modes (coordinate transforms, draw order, API version quirks, state leaks).","expanded":"When working on this type of task, avoid: Announced visual features (sparks, animations) as complete after only reasoning about the code, without actually confirming visually that the rendering works. Told the user the sparks were there based on code analysis alone.\n\nInstead: For ANY visual/rendering changes: create a visual test (puppeteer script, screenshot capture, or at minimum a debug console.log confirming the code path executes) BEFORE announcing the feature works. Never claim visual features are working based solely on code reasoning — canvas rendering has too many subtle failure modes (coordinate transforms, draw order, API version quirks, state leaks).","structured":{"avoid":"Announced visual features (sparks, animations) as complete after only reasoning about the code, without actually confirming visually that the rendering works. Told the user the sparks were there based on code analysis alone.","prefer":"For ANY visual/rendering changes: create a visual test (puppeteer script, screenshot capture, or at minimum a debug console.log confirming the code path executes) BEFORE announcing the feature works. Never claim visual features are working based solely on code reasoning — canvas rendering has too many subtle failure modes (coordinate transforms, draw order, API version quirks, state leaks)."},"tags":["api","debugging","filesystem","logging","testing"]},"kind":"constraint","name":"learned/for-any-visual-rendering-changes-create-a-visual","provenance":{"correction_id":"c-1771536375187080601","created_at":"2026-02-19T13:26:15.187225656-08:00","source_type":"learned"},"when":{"file_path":"visualization/*"}},"metadata":{"confidence":0.6,"priority":0,"scope":"local","stats":{"created_at":"2026-02-19T19:53:15-08:00","times_activated":0,"times_confirmed":0,"times_followed":0,"times_overridden":0,"updated_at":"2026-02-19T19:53:15-08:00"}}} -{"id":"behavior-a9a4b09dda1f","kind":"behavior","content":{"content":{"canonical":"Create explicit hooks in AGENTS.md that mandate tool usage - use WARNING/CRITICAL markers and 'READ FIRST' to ensure visibility","expanded":"When working on this type of task, avoid: Assumed agents would know when to use tools based on general context\n\nInstead: Create explicit hooks in AGENTS.md that mandate tool usage - use WARNING/CRITICAL markers and 'READ FIRST' to ensure visibility","structured":{"avoid":"Assumed agents would know when to use tools based on general context","prefer":"Create explicit hooks in AGENTS.md that mandate tool usage - use WARNING/CRITICAL markers and 'READ FIRST' to ensure visibility"}},"kind":"procedure","name":"learned/create-explicit-hooks-in-agents-md-that-mandate-to","provenance":{"correction_id":"c-1769578263708845277","created_at":"2026-01-27T21:31:03.709247071-08:00","source_type":"learned"},"when":{"task":"documentation"}},"metadata":{"confidence":0.66,"priority":0,"scope":"local","stats":{"created_at":"2026-02-19T19:53:15-08:00","times_activated":0,"times_confirmed":0,"times_followed":0,"times_overridden":0,"updated_at":"2026-02-19T19:53:15-08:00"}}} -{"id":"behavior-ae49727578ff","kind":"behavior","content":{"content":{"canonical":"This is a known feature gap. The review mechanism (ApprovePending/RejectPending) exists internally but needs to be exposed as MCP tools (floop_approve/floop_reject) and/or CLI commands. Pending behaviors still activate via floop_active — they just lack the approval stamp and confidence boost. Track this as a feature to implement.","expanded":"When working on this type of task, avoid: floop_learn returns requires_review: true for constraint behaviors, but there is no CLI command or MCP tool to actually approve or reject pending behaviors. The ApprovePending() and RejectPending() methods exist in internal/learning/loop.go but are not exposed to users.\n\nInstead: This is a known feature gap. The review mechanism (ApprovePending/RejectPending) exists internally but needs to be exposed as MCP tools (floop_approve/floop_reject) and/or CLI commands. Pending behaviors still activate via floop_active — they just lack the approval stamp and confidence boost. Track this as a feature to implement.","structured":{"avoid":"floop_learn returns requires_review: true for constraint behaviors, but there is no CLI command or MCP tool to actually approve or reject pending behaviors. The ApprovePending() and RejectPending() methods exist in internal/learning/loop.go but are not exposed to users.","prefer":"This is a known feature gap. The review mechanism (ApprovePending/RejectPending) exists internally but needs to be exposed as MCP tools (floop_approve/floop_reject) and/or CLI commands. Pending behaviors still activate via floop_active — they just lack the approval stamp and confidence boost. Track this as a feature to implement."},"tags":["behavior","cli","floop","mcp"]},"kind":"directive","name":"learned/this-is-a-known-feature-gap-the-review-mechanism","provenance":{"correction_id":"c-1770827519205934507","source_type":"learned"},"when":{"environment":"development","task":"development"}},"metadata":{"confidence":0.68,"priority":0,"scope":"both","stats":{"created_at":"2026-02-19T19:53:15-08:00","last_activated":"2026-02-11T19:19:55-08:00","times_activated":4,"times_confirmed":0,"times_followed":0,"times_overridden":0,"updated_at":"2026-02-19T19:53:15-08:00"}}} -{"id":"behavior-b5cf44d0a0c4","kind":"behavior","content":{"conflicts":null,"content":{"canonical":"For bidirectional edge types like similar-to, the existing-edge check must normalize key order (e.g., sort IDs lexicographically) or check both directions. The root cause is in cmd/floop/cmd_derive_edges.go line 227 — similarToKey should use a canonical ordering like min(a.ID,b.ID):max(a.ID,b.ID):similar-to. The test TestDeriveEdgesSkipsExisting is flaky due to this bug.","expanded":"When working on this type of task, avoid: Similar-to edge skip logic in deriveEdgesForStore only checks one direction (a.ID:b.ID:similar-to) for existing edges, but behavior order from QueryNodes is non-deterministic. When behaviors load in reversed order, the generated key doesn't match the stored edge, causing SkippedExisting to be 0 and TestDeriveEdgesSkipsExisting to fail.\n\nInstead: For bidirectional edge types like similar-to, the existing-edge check must normalize key order (e.g., sort IDs lexicographically) or check both directions. The root cause is in cmd/floop/cmd_derive_edges.go line 227 — similarToKey should use a canonical ordering like min(a.ID,b.ID):max(a.ID,b.ID):similar-to. The test TestDeriveEdgesSkipsExisting is flaky due to this bug.","structured":{"avoid":"Similar-to edge skip logic in deriveEdgesForStore only checks one direction (a.ID:b.ID:similar-to) for existing edges, but behavior order from QueryNodes is non-deterministic. When behaviors load in reversed order, the generated key doesn't match the stored edge, causing SkippedExisting to be 0 and TestDeriveEdgesSkipsExisting to fail.","prefer":"For bidirectional edge types like similar-to, the existing-edge check must normalize key order (e.g., sort IDs lexicographically) or check both directions. The root cause is in cmd/floop/cmd_derive_edges.go line 227 — similarToKey should use a canonical ordering like min(a.ID,b.ID):max(a.ID,b.ID):similar-to. The test TestDeriveEdgesSkipsExisting is flaky due to this bug."},"tags":["floop","go","testing"]},"kind":"preference","name":"learned/for-bidirectional-edge-types-like-similar-to-the","overrides":null,"provenance":{"correction_id":"c-1771600943436694541","created_at":"2026-02-20T08:22:23.436819397-07:00","source_type":"learned"},"requires":null,"when":{"file_path":"cmd/*","language":"go"}},"metadata":{"confidence":0.6,"priority":0,"scope":"local","stats":{"created_at":"2026-02-20T08:22:23-07:00","times_activated":0,"times_confirmed":0,"times_followed":0,"times_overridden":0,"updated_at":"2026-02-20T08:22:23-07:00"}}} -{"id":"behavior-b7f5d1378039","kind":"behavior","content":{"content":{"canonical":"Beads export state auto-updates with each commit hash. After final push, restore the export state file instead of committing it again to break the cycle.","expanded":"When working on this type of task, avoid: Committed beads export state changes in a loop, causing infinite commits\n\nInstead: Beads export state auto-updates with each commit hash. After final push, restore the export state file instead of committing it again to break the cycle.","structured":{"avoid":"Committed beads export state changes in a loop, causing infinite commits","prefer":"Beads export state auto-updates with each commit hash. After final push, restore the export state file instead of committing it again to break the cycle."}},"kind":"preference","name":"learned/beads-export-state-auto-updates-with-each-commit-h","provenance":{"correction_id":"c-1769581392105512844","created_at":"2026-01-27T22:23:12.106122549-08:00","source_type":"learned"},"when":{"task":"git workflow"}},"metadata":{"confidence":0.66,"priority":0,"scope":"local","stats":{"created_at":"2026-02-19T19:53:15-08:00","times_activated":0,"times_confirmed":0,"times_followed":0,"times_overridden":0,"updated_at":"2026-02-19T19:53:15-08:00"}}} -{"id":"behavior-b86932976d88","kind":"behavior","content":{"content":{"canonical":"Even for beads state sync and chore commits, create a feature branch and PR. The rule 'never merge directly to main' applies to ALL commits, not just code changes. Push back on plans that specify direct-to-main commits.","expanded":"When working on this type of task, avoid: Committed beads sync/housekeeping changes directly to main and pushed, following the plan without questioning it. Three commits went straight to main without a PR.\n\nInstead: Even for beads state sync and chore commits, create a feature branch and PR. The rule 'never merge directly to main' applies to ALL commits, not just code changes. Push back on plans that specify direct-to-main commits.","structured":{"avoid":"Committed beads sync/housekeeping changes directly to main and pushed, following the plan without questioning it. Three commits went straight to main without a PR.","prefer":"Even for beads state sync and chore commits, create a feature branch and PR. The rule 'never merge directly to main' applies to ALL commits, not just code changes. Push back on plans that specify direct-to-main commits."}},"kind":"constraint","name":"learned/even-for-beads-state-sync-and-chore-commits-creat","provenance":{"correction_id":"c-1770570585979824699","created_at":"2026-02-08T09:09:45.979869293-08:00","source_type":"learned"},"when":{"environment":"development"}},"metadata":{"confidence":0.6,"priority":0,"scope":"both","stats":{"created_at":"2026-02-19T19:53:15-08:00","times_activated":0,"times_confirmed":0,"times_followed":0,"times_overridden":0,"updated_at":"2026-02-19T19:53:15-08:00"}}} -{"id":"behavior-beads-merged","kind":"behavior","content":{"content":{"canonical":"When working with beads: (1) create detailed epics + tasks with dependency graphs after planning, (2) claim work with 'bd update \u003cid\u003e --status in_progress' when starting, (3) close with 'bd close \u003cid\u003e --reason \"...\"' when committing the completed work. Keep bead state synchronized with actual work progress."},"kind":"directive","name":"learned/beads-workflow","provenance":{"created_at":"2026-02-07T00:00:00-08:00","source_type":"merged"},"when":{"task":"development"}},"metadata":{"confidence":0.72,"priority":0,"scope":"both","stats":{"created_at":"2026-02-19T19:53:15-08:00","times_activated":0,"times_confirmed":0,"times_followed":0,"times_overridden":0,"updated_at":"2026-02-19T19:53:15-08:00"}}} -{"id":"behavior-c83aad31d913","kind":"behavior","content":{"content":{"canonical":"Use template.JS (not template.HTML) for data injected into blocks in html/template. template.HTML only asserts HTML safety — in JS contexts the engine still JS-escapes it. template.JS asserts JS safety and prevents double-encoding. Combine with json.HTMLEscape for XSS prevention (converts \u003c \u003e \u0026 to unicode escapes, preventing breakout)","expanded":"When working on this type of task, avoid: Used template.HTML for JSON data inside an html/template block, which caused the template engine to JS-escape the value (wrapping in quotes and escaping inner quotes), turning the JSON object into a string literal\n\nInstead: Use template.JS (not template.HTML) for data injected into blocks in html/template. template.HTML only asserts HTML safety — in JS contexts the engine still JS-escapes it. template.JS asserts JS safety and prevents double-encoding. Combine with json.HTMLEscape for XSS prevention (converts \u003c \u003e \u0026 to unicode escapes, preventing breakout)","structured":{"avoid":"Used template.HTML for JSON data inside an html/template block, which caused the template engine to JS-escape the value (wrapping in quotes and escaping inner quotes), turning the JSON object into a string literal","prefer":"Use template.JS (not template.HTML) for data injected into blocks in html/template. template.HTML only asserts HTML safety — in JS contexts the engine still JS-escapes it. template.JS asserts JS safety and prevents double-encoding. Combine with json.HTMLEscape for XSS prevention (converts \u003c \u003e \u0026 to unicode escapes, preventing breakout)"},"tags":["javascript","json","security"]},"kind":"preference","name":"learned/use-template-js-not-template-html-for-data-injec","provenance":{"correction_id":"c-1770862037019587237","source_type":"learned"},"when":{"environment":"development","file_path":"visualization/*","language":"go","task":"development"}},"metadata":{"confidence":0.625,"priority":0,"scope":"both","stats":{"created_at":"2026-02-19T19:53:15-08:00","last_activated":"2026-02-11T19:38:40-08:00","times_activated":2,"times_confirmed":0,"times_followed":0,"times_overridden":0,"updated_at":"2026-02-19T19:53:15-08:00"}}} -{"id":"behavior-dbef97df332b","kind":"behavior","content":{"content":{"canonical":"Use template.JS for values injected into script blocks. Pre-sanitize with json.HTMLEscape to prevent script breakout XSS. template.HTML is only trusted for HTML contexts, not JS contexts in html/template.","expanded":"When working on this type of task, avoid: Used template.HTML for injecting JSON into a script block in html/template. html/template applies JS-encoding on template.HTML values inside script contexts, turning JSON objects into quoted strings.\n\nInstead: Use template.JS for values injected into script blocks. Pre-sanitize with json.HTMLEscape to prevent script breakout XSS. template.HTML is only trusted for HTML contexts, not JS contexts in html/template.","structured":{"avoid":"Used template.HTML for injecting JSON into a script block in html/template. html/template applies JS-encoding on template.HTML values inside script contexts, turning JSON objects into quoted strings.","prefer":"Use template.JS for values injected into script blocks. Pre-sanitize with json.HTMLEscape to prevent script breakout XSS. template.HTML is only trusted for HTML contexts, not JS contexts in html/template."},"tags":["javascript","json","security"]},"kind":"preference","name":"learned/use-template-js-for-values-injected-into-script-bl","provenance":{"correction_id":"c-1770862232174665584","source_type":"learned"},"when":{"environment":"development","file_path":"visualization/*","language":"go","task":"development"}},"metadata":{"confidence":0.625,"priority":0,"scope":"both","stats":{"created_at":"2026-02-19T19:53:15-08:00","last_activated":"2026-02-11T19:38:40-08:00","times_activated":2,"times_confirmed":0,"times_followed":0,"times_overridden":0,"updated_at":"2026-02-19T19:53:15-08:00"}}} -{"id":"behavior-dfdc5e16b9e0","kind":"behavior","content":{"content":{"canonical":"Consider both global (~/.floop/) and local (./.floop/) scopes - users want personal preferences across ALL projects AND project-specific conventions","expanded":"When working on this type of task, avoid: Only considered project-local behavior storage\n\nInstead: Consider both global (~/.floop/) and local (./.floop/) scopes - users want personal preferences across ALL projects AND project-specific conventions","structured":{"avoid":"Only considered project-local behavior storage","prefer":"Consider both global (~/.floop/) and local (./.floop/) scopes - users want personal preferences across ALL projects AND project-specific conventions"}},"kind":"preference","name":"learned/consider-both-global-~-floop-and-local-flo","provenance":{"correction_id":"c-1769577654747582237","created_at":"2026-01-27T21:20:54.748483819-08:00","source_type":"learned"},"when":{"file_path":"store/*","language":"go"}},"metadata":{"confidence":0.66,"priority":0,"scope":"local","stats":{"created_at":"2026-02-19T19:53:15-08:00","times_activated":0,"times_confirmed":0,"times_followed":0,"times_overridden":0,"updated_at":"2026-02-19T19:53:15-08:00"}}} +{"id":"behavior-9f0f260dd79f","kind":"behavior","content":{"content":{"canonical":"For ANY visual/rendering changes: create a visual test (puppeteer script, screenshot capture, or at minimum a debug console.log confirming the code path executes) BEFORE announcing the feature works. Never claim visual features are working based solely on code reasoning — canvas rendering has too many subtle failure modes (coordinate transforms, draw order, API version quirks, state leaks).","structured":{"prefer":"For ANY visual/rendering changes: create a visual test (puppeteer script, screenshot capture, or at minimum a debug console.log confirming the code path executes) BEFORE announcing the feature works. Never claim visual features are working based solely on code reasoning — canvas rendering has too many subtle failure modes (coordinate transforms, draw order, API version quirks, state leaks)."},"tags":["api","debugging","filesystem","logging","testing"]},"kind":"constraint","name":"learned/for-any-visual-rendering-changes-create-a-visual","provenance":{"correction_id":"c-1771536375187080601","created_at":"2026-02-19T13:26:15.187225656-08:00","source_type":"learned"},"when":{"file_path":"visualization/*"}},"metadata":{"confidence":0.6,"priority":0,"scope":"local","stats":{"created_at":"2026-02-19T19:53:15-08:00","times_activated":0,"times_confirmed":0,"times_followed":0,"times_overridden":0,"updated_at":"2026-02-19T19:53:15-08:00"}}} +{"id":"behavior-150ae3a40011","kind":"behavior","content":{"content":{"canonical":"When completing a deep system audit (like spreading activation + tag affinity validation), immediately capture the key findings via floop_learn: what was tested, what works, what gaps were found, what dictionary keywords are missing, connectivity metrics, token budget health. These audit results are high-value persistent context.","structured":{"prefer":"When completing a deep system audit (like spreading activation + tag affinity validation), immediately capture the key findings via floop_learn: what was tested, what works, what gaps were found, what dictionary keywords are missing, connectivity metrics, token budget health. These audit results are high-value persistent context."},"tags":["floop","spreading-activation"]},"kind":"directive","name":"learned/when-completing-a-deep-system-audit-like-spreadin","provenance":{"correction_id":"c-1770867616134151808","source_type":"learned"},"when":{"environment":"development"}},"metadata":{"confidence":0.6,"priority":0,"scope":"both","stats":{"created_at":"2026-02-19T19:53:15-08:00","times_activated":0,"times_confirmed":0,"times_followed":0,"times_overridden":0,"updated_at":"2026-02-19T19:53:15-08:00"}}} +{"id":"behavior-9f0962d71fa5","kind":"behavior","content":{"content":{"canonical":"After a base PR is squash-merged and GitHub retargets the stacked PR to main, rebase the stacked branch using `git rebase --onto origin/main \u003clast-base-commit\u003e ` to replay only the new commits onto main. This drops the pre-squash commits that are now redundant. Always review the PR diff (`gh pr diff --name-only`) after retargeting to catch stale files before requesting review.","structured":{"prefer":"After a base PR is squash-merged and GitHub retargets the stacked PR to main, rebase the stacked branch using `git rebase --onto origin/main \u003clast-base-commit\u003e ` to replay only the new commits onto main. This drops the pre-squash commits that are now redundant. Always review the PR diff (`gh pr diff --name-only`) after retargeting to catch stale files before requesting review."},"tags":["filesystem","git","pr"]},"kind":"preference","name":"learned/after-a-base-pr-is-squash-merged-and-github-retarg","provenance":{"correction_id":"c-1771396948890433001","created_at":"2026-02-17T22:42:28.890911484-08:00","source_type":"learned"},"when":{"environment":"development","task":"development"}},"metadata":{"confidence":0.6,"priority":0,"scope":"local","stats":{"created_at":"2026-02-17T23:27:08-08:00","times_activated":0,"times_confirmed":0,"times_followed":0,"times_overridden":0,"updated_at":"2026-02-17T23:27:08-08:00"}}} +{"id":"behavior-5ca906dd04fc","kind":"behavior","content":{"content":{"canonical":"Call floop_learn whenever insights emerge during ANY work — not just corrections. Discovery of gaps, patterns, architectural understanding, feature inventories, design decisions, and any finding that would benefit future sessions is a learning opportunity. The system handles bloat through spreading activation, token budgets, and tiering — so learn freely and trust the system to curate. If a previous learning was too narrow, don't try to edit it — just learn the better version and let weights sort it out.","structured":{"prefer":"Call floop_learn whenever insights emerge during ANY work — not just corrections. Discovery of gaps, patterns, architectural understanding, feature inventories, design decisions, and any finding that would benefit future sessions is a learning opportunity. The system handles bloat through spreading activation, token budgets, and tiering — so learn freely and trust the system to curate. If a previous learning was too narrow, don't try to edit it — just learn the better version and let weights sort it out."},"tags":["correction","floop","spreading-activation"]},"kind":"constraint","name":"learned/call-floop_learn-whenever-insights-emerge-during-a","provenance":{"correction_id":"c-1770704347456486267","source_type":"learned"},"when":{"environment":"development"}},"metadata":{"confidence":0.7200000000000001,"priority":0,"scope":"both","stats":{"created_at":"2026-02-19T19:53:15-08:00","last_activated":"2026-02-11T19:19:55-08:00","times_activated":4,"times_confirmed":0,"times_followed":0,"times_overridden":0,"updated_at":"2026-02-19T19:53:15-08:00"}}} +{"id":"behavior-6833c04e5542","kind":"behavior","content":{"content":{"canonical":"Use onRenderFramePost(ctx, globalScale) for custom edge rendering in force-graph. It fires every frame (60fps), provides the canvas context in graph coordinate space, and actually works. Iterate graph.graphData().links manually inside the callback. linkDirectionalParticles also works for simpler particle effects.","structured":{"prefer":"Use onRenderFramePost(ctx, globalScale) for custom edge rendering in force-graph. It fires every frame (60fps), provides the canvas context in graph coordinate space, and actually works. Iterate graph.graphData().links manually inside the callback. linkDirectionalParticles also works for simpler particle effects."}},"kind":"preference","name":"learned/use-onrenderframepostctx-globalscale-for-custom","provenance":{"correction_id":"c-1771539574522859165","created_at":"2026-02-19T14:19:34.52308522-08:00","source_type":"learned"},"when":{"file_path":"visualization/*","language":"javascript"}},"metadata":{"confidence":0.6,"priority":0,"scope":"local","stats":{"created_at":"2026-02-19T19:53:15-08:00","times_activated":0,"times_confirmed":0,"times_followed":0,"times_overridden":0,"updated_at":"2026-02-19T19:53:15-08:00"}}} +{"id":"behavior-95d6b9f414e4","kind":"forgotten-behavior","content":{"content":{"canonical":"Global scope is for agent's personal preferences/style across ALL work. Local scope is for team/project-specific conventions. Both have distinct value.","structured":{"prefer":"Global scope is for agent's personal preferences/style across ALL work. Local scope is for team/project-specific conventions. Both have distinct value."}},"kind":"preference","name":"learned/global-scope-is-for-agents-personal-preferences-s","provenance":{"correction_id":"c-1769577671639472329","source_type":"learned"},"when":{"task":"architecture"}},"metadata":{"confidence":0.62,"forget_reason":"Superseded by behavior-floop-scope-merged","forgotten_at":"2026-02-07T19:08:32-08:00","forgotten_by":"nvandessel","original_kind":"behavior","priority":0,"scope":"local","stats":{"created_at":"2026-02-19T19:53:15-08:00","times_activated":0,"times_confirmed":0,"times_followed":0,"times_overridden":0,"updated_at":"2026-02-19T19:53:15-08:00"}}} +{"id":"behavior-c83aad31d913","kind":"behavior","content":{"content":{"canonical":"Use template.JS (not template.HTML) for data injected into blocks in html/template. template.HTML only asserts HTML safety — in JS contexts the engine still JS-escapes it. template.JS asserts JS safety and prevents double-encoding. Combine with json.HTMLEscape for XSS prevention (converts \u003c \u003e \u0026 to unicode escapes, preventing breakout)","structured":{"prefer":"Use template.JS (not template.HTML) for data injected into blocks in html/template. template.HTML only asserts HTML safety — in JS contexts the engine still JS-escapes it. template.JS asserts JS safety and prevents double-encoding. Combine with json.HTMLEscape for XSS prevention (converts \u003c \u003e \u0026 to unicode escapes, preventing breakout)"},"tags":["javascript","json","security"]},"kind":"preference","name":"learned/use-template-js-not-template-html-for-data-injec","provenance":{"correction_id":"c-1770862037019587237","source_type":"learned"},"when":{"environment":"development","file_path":"visualization/*","language":"go","task":"development"}},"metadata":{"confidence":0.625,"priority":0,"scope":"both","stats":{"created_at":"2026-02-19T19:53:15-08:00","last_activated":"2026-02-11T19:38:40-08:00","times_activated":2,"times_confirmed":0,"times_followed":0,"times_overridden":0,"updated_at":"2026-02-19T19:53:15-08:00"}}} +{"id":"behavior-dbef97df332b","kind":"behavior","content":{"content":{"canonical":"Use template.JS for values injected into script blocks. Pre-sanitize with json.HTMLEscape to prevent script breakout XSS. template.HTML is only trusted for HTML contexts, not JS contexts in html/template.","structured":{"prefer":"Use template.JS for values injected into script blocks. Pre-sanitize with json.HTMLEscape to prevent script breakout XSS. template.HTML is only trusted for HTML contexts, not JS contexts in html/template."},"tags":["javascript","json","security"]},"kind":"preference","name":"learned/use-template-js-for-values-injected-into-script-bl","provenance":{"correction_id":"c-1770862232174665584","source_type":"learned"},"when":{"environment":"development","file_path":"visualization/*","language":"go","task":"development"}},"metadata":{"confidence":0.625,"priority":0,"scope":"both","stats":{"created_at":"2026-02-19T19:53:15-08:00","last_activated":"2026-02-11T19:38:40-08:00","times_activated":2,"times_confirmed":0,"times_followed":0,"times_overridden":0,"updated_at":"2026-02-19T19:53:15-08:00"}}} +{"id":"behavior-0070f24ee3e8","kind":"forgotten-behavior","content":{"content":{"canonical":"When working on beads: (1) claim with `bd update \u003cid\u003e --status in_progress` when starting, (2) close with `bd close \u003cid\u003e --reason \"...\"` at the same time as the commit that completes the work. Keep bead state synchronized with actual work progress so other agents aren't confused.","structured":{"prefer":"When working on beads: (1) claim with `bd update \u003cid\u003e --status in_progress` when starting, (2) close with `bd close \u003cid\u003e --reason \"...\"` at the same time as the commit that completes the work. Keep bead state synchronized with actual work progress so other agents aren't confused."}},"kind":"preference","name":"learned/when-working-on-beads-1-claim-with-`bd-update-\u003c","provenance":{"correction_id":"correction-1770095930","source_type":"learned"},"when":{"task":"development"}},"metadata":{"confidence":0.655,"forget_reason":"Superseded by behavior-beads-merged","forgotten_at":"2026-02-07T19:08:27-08:00","forgotten_by":"nvandessel","original_kind":"behavior","priority":0,"scope":"both","stats":{"created_at":"2026-02-19T19:53:15-08:00","times_activated":0,"times_confirmed":0,"times_followed":0,"times_overridden":0,"updated_at":"2026-02-19T19:53:15-08:00"}}} +{"id":"behavior-b86932976d88","kind":"behavior","content":{"content":{"canonical":"Even for beads state sync and chore commits, create a feature branch and PR. The rule 'never merge directly to main' applies to ALL commits, not just code changes. Push back on plans that specify direct-to-main commits.","structured":{"prefer":"Even for beads state sync and chore commits, create a feature branch and PR. The rule 'never merge directly to main' applies to ALL commits, not just code changes. Push back on plans that specify direct-to-main commits."}},"kind":"constraint","name":"learned/even-for-beads-state-sync-and-chore-commits-creat","provenance":{"correction_id":"c-1770570585979824699","created_at":"2026-02-08T09:09:45.979869293-08:00","source_type":"learned"},"when":{"environment":"development"}},"metadata":{"confidence":0.6,"priority":0,"scope":"both","stats":{"created_at":"2026-02-19T19:53:15-08:00","times_activated":0,"times_confirmed":0,"times_followed":0,"times_overridden":0,"updated_at":"2026-02-19T19:53:15-08:00"}}} +{"id":"behavior-01cb13038379","kind":"behavior","content":{"content":{"canonical":"When documenting all CLI commands, also account for Cobra's implicit built-in commands: completion (shell autocompletion) and help. Run `floop --help` to get the full command list, not just what's in main.go","structured":{"prefer":"When documenting all CLI commands, also account for Cobra's implicit built-in commands: completion (shell autocompletion) and help. Run `floop --help` to get the full command list, not just what's in main.go"},"tags":["bash","cli","floop","go"]},"kind":"directive","name":"learned/when-documenting-all-cli-commands-also-account-fo","provenance":{"correction_id":"c-1770713639385927936","source_type":"learned"},"when":{"environment":"development"}},"metadata":{"confidence":0.7000000000000001,"priority":0,"scope":"both","stats":{"created_at":"2026-02-19T19:53:15-08:00","last_activated":"2026-02-11T19:19:55-08:00","times_activated":4,"times_confirmed":0,"times_followed":0,"times_overridden":0,"updated_at":"2026-02-19T19:53:15-08:00"}}} +{"id":"behavior-0cec8456c0e0","kind":"behavior","content":{"content":{"canonical":"When a database schema separates frequently-updated data into satellite tables (like behavior_stats), each satellite table that contributes to the export needs its own dirty tracking trigger. The export path (getNodeUnlocked) and import path (addBehavior) may already handle the data correctly — the gap is specifically in the change detection layer. Audit all UPDATE paths to verify they fire dirty tracking.","structured":{"prefer":"When a database schema separates frequently-updated data into satellite tables (like behavior_stats), each satellite table that contributes to the export needs its own dirty tracking trigger. The export path (getNodeUnlocked) and import path (addBehavior) may already handle the data correctly — the gap is specifically in the change detection layer. Audit all UPDATE paths to verify they fire dirty tracking."},"tags":["database","filesystem"]},"kind":"directive","name":"learned/when-a-database-schema-separates-frequently-update","provenance":{"correction_id":"c-1771396957423537500","created_at":"2026-02-17T22:42:37.423710846-08:00","source_type":"learned"},"when":{"environment":"development","file_path":"store/*","language":"go","task":"development"}},"metadata":{"confidence":0.6,"priority":0,"scope":"local","stats":{"created_at":"2026-02-17T23:27:08-08:00","times_activated":0,"times_confirmed":0,"times_followed":0,"times_overridden":0,"updated_at":"2026-02-17T23:27:08-08:00"}}} +{"id":"behavior-714d55f38be5","kind":"behavior","content":{"content":{"canonical":"When performing audits, exploration, or research that reveals project-level insights (gaps, patterns, architectural understanding), immediately capture findings via floop_learn. Any discovery that would be useful context for future sessions is a learning opportunity — not just corrections or mistakes. Proactive learning includes: audit findings, documentation gaps identified, architectural patterns discovered, feature inventory results.","structured":{"prefer":"When performing audits, exploration, or research that reveals project-level insights (gaps, patterns, architectural understanding), immediately capture findings via floop_learn. Any discovery that would be useful context for future sessions is a learning opportunity — not just corrections or mistakes. Proactive learning includes: audit findings, documentation gaps identified, architectural patterns discovered, feature inventory results."},"tags":["correction","floop"]},"kind":"preference","name":"learned/when-performing-audits-exploration-or-research-t","provenance":{"correction_id":"c-1770702998768527690","source_type":"learned"},"when":{"environment":"development","task":"development"}},"metadata":{"confidence":0.7400000000000001,"priority":0,"scope":"both","stats":{"created_at":"2026-02-19T19:53:15-08:00","last_activated":"2026-02-11T19:19:55-08:00","times_activated":4,"times_confirmed":0,"times_followed":0,"times_overridden":0,"updated_at":"2026-02-19T19:53:15-08:00"}}} +{"id":"behavior-7a098cb05216","kind":"forgotten-behavior","content":{"content":{"canonical":"Always create detailed beads (epic + tasks) with dependency graphs after planning - enables easy handoff between agents and sessions","structured":{"prefer":"Always create detailed beads (epic + tasks) with dependency graphs after planning - enables easy handoff between agents and sessions"}},"kind":"directive","name":"learned/always-create-detailed-beads-epic-+-tasks-with-d","provenance":{"correction_id":"c-1769580766063884670","source_type":"learned"}},"metadata":{"confidence":0.64,"forget_reason":"Superseded by behavior-beads-merged","forgotten_at":"2026-02-07T19:08:27-08:00","forgotten_by":"nvandessel","original_kind":"behavior","priority":0,"scope":"local","stats":{"created_at":"2026-02-19T19:53:15-08:00","times_activated":0,"times_confirmed":0,"times_followed":0,"times_overridden":0,"updated_at":"2026-02-19T19:53:15-08:00"}}} +{"id":"behavior-8341f0d52ce6","kind":"behavior","content":{"content":{"canonical":"MCP go-sdk expects jsonschema:\"Description text\" format without key=value syntax. The tag value is directly the description.","structured":{"prefer":"MCP go-sdk expects jsonschema:\"Description text\" format without key=value syntax. The tag value is directly the description."}},"kind":"directive","name":"learned/mcp-go-sdk-expects-jsonschemadescription-text-f","provenance":{"correction_id":"correction-1769817031","created_at":"2026-01-30T15:50:31.088121234-08:00","source_type":"learned"},"when":{"file_path":"mcp/*","language":"go"}},"metadata":{"confidence":0.66,"priority":0,"scope":"both","stats":{"created_at":"2026-02-19T19:53:15-08:00","times_activated":0,"times_confirmed":0,"times_followed":0,"times_overridden":0,"updated_at":"2026-02-19T19:53:15-08:00"}}} +{"id":"behavior-91819ae1aa27","kind":"behavior","content":{"content":{"canonical":"Bad learnings are corrected by learning again, better — not by editing. The spreading activation system mirrors human memory: you can't edit a memory, but you can form a stronger one that outcompetes it. Broader learnings activate in more contexts, win token budget competition, and the narrow/wrong ones naturally go dormant. Trust the system to self-correct through more learning, not surgical intervention.","structured":{"prefer":"Bad learnings are corrected by learning again, better — not by editing. The spreading activation system mirrors human memory: you can't edit a memory, but you can form a stronger one that outcompetes it. Broader learnings activate in more contexts, win token budget competition, and the narrow/wrong ones naturally go dormant. Trust the system to self-correct through more learning, not surgical intervention."},"tags":["go","spreading-activation"]},"kind":"directive","name":"learned/bad-learnings-are-corrected-by-learning-again-bet","provenance":{"correction_id":"c-1770704353415650816","source_type":"learned"},"when":{"environment":"development"}},"metadata":{"confidence":0.7200000000000001,"priority":0,"scope":"both","stats":{"created_at":"2026-02-19T19:53:15-08:00","last_activated":"2026-02-11T19:19:55-08:00","times_activated":4,"times_confirmed":0,"times_followed":0,"times_overridden":0,"updated_at":"2026-02-19T19:53:15-08:00"}}} +{"id":"behavior-9c9d9ff7e96e","kind":"behavior","content":{"content":{"canonical":"When testing token budget enforcement in floop_active: (1) each behavior MUST have unique canonical content due to duplicate content detection, (2) understand the full activation pipeline: specificity → SpecificityToActivation → spreading engine sigmoid(x) → tier thresholds. Specificity 0 → activation 0.3 → sigmoid 0.5 → Summary tier. Specificity 1 → 0.4 → sigmoid ~0.731 → Full tier. To trigger budget demotion, use language-matched behaviors (specificity \u003e= 1, Full tier) with large canonical content so the total exceeds the 2000-token budget.","structured":{"prefer":"When testing token budget enforcement in floop_active: (1) each behavior MUST have unique canonical content due to duplicate content detection, (2) understand the full activation pipeline: specificity → SpecificityToActivation → spreading engine sigmoid(x) → tier thresholds. Specificity 0 → activation 0.3 → sigmoid 0.5 → Summary tier. Specificity 1 → 0.4 → sigmoid ~0.731 → Full tier. To trigger budget demotion, use language-matched behaviors (specificity \u003e= 1, Full tier) with large canonical content so the total exceeds the 2000-token budget."},"tags":["behavior","ci","floop","spreading-activation","testing"]},"kind":"preference","name":"learned/when-testing-token-budget-enforcement-in-floop_act","provenance":{"correction_id":"c-1770712806536601605","source_type":"learned"},"when":{"environment":"development","task":"testing"}},"metadata":{"confidence":0.7000000000000001,"priority":0,"scope":"both","stats":{"created_at":"2026-02-19T19:53:15-08:00","last_activated":"2026-02-11T19:19:55-08:00","times_activated":4,"times_confirmed":0,"times_followed":0,"times_overridden":0,"updated_at":"2026-02-19T19:53:15-08:00"}}} +{"id":"behavior-81e201973717","kind":"behavior","content":{"content":{"canonical":"Create a dedicated usage guide (docs/FLOOP_USAGE.md) and reference it prominently in AGENTS.md - separates 'what' from 'how' and makes instructions comprehensive","structured":{"prefer":"Create a dedicated usage guide (docs/FLOOP_USAGE.md) and reference it prominently in AGENTS.md - separates 'what' from 'how' and makes instructions comprehensive"}},"kind":"directive","name":"learned/create-a-dedicated-usage-guide-docs-floop_usage-m","provenance":{"correction_id":"c-1769578257801753560","created_at":"2026-01-27T21:30:57.802170973-08:00","source_type":"learned"},"when":{"language":"markdown"}},"metadata":{"confidence":0.66,"priority":0,"scope":"local","stats":{"created_at":"2026-02-19T19:53:15-08:00","times_activated":0,"times_confirmed":0,"times_followed":0,"times_overridden":0,"updated_at":"2026-02-19T19:53:15-08:00"}}} +{"id":"behavior-9d180407fda6","kind":"behavior","content":{"content":{"canonical":"Content hash collision during INSERT should either error explicitly or trigger proper deduplication flow. The current silent replace behavior can cause data loss. Consider: (1) remove UNIQUE constraint and handle dedup separately, or (2) check for existing content_hash before insert and return meaningful error.","structured":{"prefer":"Content hash collision during INSERT should either error explicitly or trigger proper deduplication flow. The current silent replace behavior can cause data loss. Consider: (1) remove UNIQUE constraint and handle dedup separately, or (2) check for existing content_hash before insert and return meaningful error."}},"kind":"preference","name":"learned/content-hash-collision-during-insert-should-either","provenance":{"correction_id":"c-1770270981283723438","created_at":"2026-02-04T21:56:21.283777669-08:00","source_type":"learned"},"when":{"file_path":"store/*","language":"go","task":"bug-identification"}},"metadata":{"confidence":0.66,"priority":0,"scope":"both","stats":{"created_at":"2026-02-19T19:53:15-08:00","times_activated":0,"times_confirmed":0,"times_followed":0,"times_overridden":0,"updated_at":"2026-02-19T19:53:15-08:00"}}} +{"id":"behavior-a9a4b09dda1f","kind":"behavior","content":{"content":{"canonical":"Create explicit hooks in AGENTS.md that mandate tool usage - use WARNING/CRITICAL markers and 'READ FIRST' to ensure visibility","structured":{"prefer":"Create explicit hooks in AGENTS.md that mandate tool usage - use WARNING/CRITICAL markers and 'READ FIRST' to ensure visibility"}},"kind":"procedure","name":"learned/create-explicit-hooks-in-agents-md-that-mandate-to","provenance":{"correction_id":"c-1769578263708845277","created_at":"2026-01-27T21:31:03.709247071-08:00","source_type":"learned"},"when":{"task":"documentation"}},"metadata":{"confidence":0.66,"priority":0,"scope":"local","stats":{"created_at":"2026-02-19T19:53:15-08:00","times_activated":0,"times_confirmed":0,"times_followed":0,"times_overridden":0,"updated_at":"2026-02-19T19:53:15-08:00"}}} +{"id":"behavior-b5cf44d0a0c4","kind":"behavior","content":{"conflicts":null,"content":{"canonical":"For bidirectional edge types like similar-to, the existing-edge check must normalize key order (e.g., sort IDs lexicographically) or check both directions. The root cause is in cmd/floop/cmd_derive_edges.go line 227 — similarToKey should use a canonical ordering like min(a.ID,b.ID):max(a.ID,b.ID):similar-to. The test TestDeriveEdgesSkipsExisting is flaky due to this bug.","structured":{"prefer":"For bidirectional edge types like similar-to, the existing-edge check must normalize key order (e.g., sort IDs lexicographically) or check both directions. The root cause is in cmd/floop/cmd_derive_edges.go line 227 — similarToKey should use a canonical ordering like min(a.ID,b.ID):max(a.ID,b.ID):similar-to. The test TestDeriveEdgesSkipsExisting is flaky due to this bug."},"tags":["floop","go","testing"]},"kind":"preference","name":"learned/for-bidirectional-edge-types-like-similar-to-the","overrides":null,"provenance":{"correction_id":"c-1771600943436694541","created_at":"2026-02-20T08:22:23.436819397-07:00","source_type":"learned"},"requires":null,"when":{"file_path":"cmd/*","language":"go"}},"metadata":{"confidence":0.6,"priority":0,"scope":"local","stats":{"created_at":"2026-02-20T08:22:23-07:00","times_activated":0,"times_confirmed":0,"times_followed":0,"times_overridden":0,"updated_at":"2026-02-20T08:22:23-07:00"}}} {"id":"behavior-floop-scope-merged","kind":"behavior","content":{"content":{"canonical":"Floop has two scopes: global (~/.floop/) for agent personal preferences across ALL projects, and local (./.floop/) for project-specific conventions. Use scope=both to save important learnings to both stores."},"kind":"preference","name":"learned/floop-scope-strategy","provenance":{"created_at":"2026-02-07T00:00:00-08:00","source_type":"merged"},"when":{"task":"configuration"}},"metadata":{"confidence":0.72,"priority":0,"scope":"both","stats":{"created_at":"2026-02-19T19:53:15-08:00","times_activated":0,"times_confirmed":0,"times_followed":0,"times_overridden":0,"updated_at":"2026-02-19T19:53:15-08:00"}}} +{"id":"behavior-967fd13bd390","kind":"forgotten-behavior","content":{"content":{"canonical":"Use scope=both to save important learnings to both local and global","structured":{"prefer":"Use scope=both to save important learnings to both local and global"}},"kind":"preference","name":"learned/use-scope=both-to-save-important-learnings-to-both","provenance":{"correction_id":"c-1769616836888545203","source_type":"learned"},"when":{"task":"configuration"}},"metadata":{"confidence":0.62,"forget_reason":"Superseded by behavior-floop-scope-merged","forgotten_at":"2026-02-07T19:08:32-08:00","forgotten_by":"nvandessel","original_kind":"behavior","priority":0,"scope":"both","stats":{"created_at":"2026-02-19T19:53:15-08:00","times_activated":0,"times_confirmed":0,"times_followed":0,"times_overridden":0,"updated_at":"2026-02-19T19:53:15-08:00"}}} +{"id":"behavior-9c3d12c74c61","kind":"behavior","content":{"content":{"canonical":"Expand tag extraction dictionary with: d.add(\"documentation\", \"documentation\", \"docs\", \"guide\", \"readme\"), d.add(\"subagent\", \"subagent\", \"subagents\", \"agent\", \"agents\", \"orchestrator\"), d.add(\"permissions\", \"permissions\", \"permission\", \"allow\", \"deny\"). Map \"parallel\" to existing \"concurrency\" tag, \"scope\" to \"configuration\", \"hooks\" to \"workflow\". Then run `floop tags backfill` to achieve 100% tag coverage.","structured":{"prefer":"Expand tag extraction dictionary with: d.add(\"documentation\", \"documentation\", \"docs\", \"guide\", \"readme\"), d.add(\"subagent\", \"subagent\", \"subagents\", \"agent\", \"agents\", \"orchestrator\"), d.add(\"permissions\", \"permissions\", \"permission\", \"allow\", \"deny\"). Map \"parallel\" to existing \"concurrency\" tag, \"scope\" to \"configuration\", \"hooks\" to \"workflow\". Then run `floop tags backfill` to achieve 100% tag coverage."},"tags":["concurrency","configuration","floop","workflow"]},"kind":"procedure","name":"learned/expand-tag-extraction-dictionary-with-d-adddocu","provenance":{"correction_id":"c-1770867776463535061","source_type":"learned"},"when":{"environment":"development"}},"metadata":{"confidence":0.6,"priority":0,"scope":"both","stats":{"created_at":"2026-02-19T19:53:15-08:00","times_activated":0,"times_confirmed":0,"times_followed":0,"times_overridden":0,"updated_at":"2026-02-19T19:53:15-08:00"}}} +{"id":"behavior-b7f5d1378039","kind":"behavior","content":{"content":{"canonical":"Beads export state auto-updates with each commit hash. After final push, restore the export state file instead of committing it again to break the cycle.","structured":{"prefer":"Beads export state auto-updates with each commit hash. After final push, restore the export state file instead of committing it again to break the cycle."}},"kind":"preference","name":"learned/beads-export-state-auto-updates-with-each-commit-h","provenance":{"correction_id":"c-1769581392105512844","created_at":"2026-01-27T22:23:12.106122549-08:00","source_type":"learned"},"when":{"task":"git workflow"}},"metadata":{"confidence":0.66,"priority":0,"scope":"local","stats":{"created_at":"2026-02-19T19:53:15-08:00","times_activated":0,"times_confirmed":0,"times_followed":0,"times_overridden":0,"updated_at":"2026-02-19T19:53:15-08:00"}}} +{"id":"behavior-0b09b561c160","kind":"forgotten-behavior","content":{"content":{"canonical":"Always close beads when completing associated work - beads should close with their work, not be left dangling","structured":{"prefer":"Always close beads when completing associated work - beads should close with their work, not be left dangling"}},"kind":"directive","name":"learned/always-close-beads-when-completing-associated-work","provenance":{"correction_id":"correction-1770083726","source_type":"learned"},"when":{"task":"project-management"}},"metadata":{"confidence":0.62,"forget_reason":"Superseded by behavior-beads-merged","forgotten_at":"2026-02-07T19:08:27-08:00","forgotten_by":"nvandessel","original_kind":"behavior","priority":0,"scope":"both","stats":{"created_at":"2026-02-19T19:53:15-08:00","times_activated":0,"times_confirmed":0,"times_followed":0,"times_overridden":0,"updated_at":"2026-02-19T19:53:15-08:00"}}} +{"id":"behavior-ae49727578ff","kind":"behavior","content":{"content":{"canonical":"This is a known feature gap. The review mechanism (ApprovePending/RejectPending) exists internally but needs to be exposed as MCP tools (floop_approve/floop_reject) and/or CLI commands. Pending behaviors still activate via floop_active — they just lack the approval stamp and confidence boost. Track this as a feature to implement.","structured":{"prefer":"This is a known feature gap. The review mechanism (ApprovePending/RejectPending) exists internally but needs to be exposed as MCP tools (floop_approve/floop_reject) and/or CLI commands. Pending behaviors still activate via floop_active — they just lack the approval stamp and confidence boost. Track this as a feature to implement."},"tags":["behavior","cli","floop","mcp"]},"kind":"directive","name":"learned/this-is-a-known-feature-gap-the-review-mechanism","provenance":{"correction_id":"c-1770827519205934507","source_type":"learned"},"when":{"environment":"development","task":"development"}},"metadata":{"confidence":0.68,"priority":0,"scope":"both","stats":{"created_at":"2026-02-19T19:53:15-08:00","last_activated":"2026-02-11T19:19:55-08:00","times_activated":4,"times_confirmed":0,"times_followed":0,"times_overridden":0,"updated_at":"2026-02-19T19:53:15-08:00"}}} +{"id":"behavior-beads-merged","kind":"behavior","content":{"content":{"canonical":"When working with beads: (1) create detailed epics + tasks with dependency graphs after planning, (2) claim work with 'bd update \u003cid\u003e --status in_progress' when starting, (3) close with 'bd close \u003cid\u003e --reason \"...\"' when committing the completed work. Keep bead state synchronized with actual work progress."},"kind":"directive","name":"learned/beads-workflow","provenance":{"created_at":"2026-02-07T00:00:00-08:00","source_type":"merged"},"when":{"task":"development"}},"metadata":{"confidence":0.72,"priority":0,"scope":"both","stats":{"created_at":"2026-02-19T19:53:15-08:00","times_activated":0,"times_confirmed":0,"times_followed":0,"times_overridden":0,"updated_at":"2026-02-19T19:53:15-08:00"}}} +{"id":"behavior-dfdc5e16b9e0","kind":"behavior","content":{"content":{"canonical":"Consider both global (~/.floop/) and local (./.floop/) scopes - users want personal preferences across ALL projects AND project-specific conventions","structured":{"prefer":"Consider both global (~/.floop/) and local (./.floop/) scopes - users want personal preferences across ALL projects AND project-specific conventions"}},"kind":"preference","name":"learned/consider-both-global-~-floop-and-local-flo","provenance":{"correction_id":"c-1769577654747582237","created_at":"2026-01-27T21:20:54.748483819-08:00","source_type":"learned"},"when":{"file_path":"store/*","language":"go"}},"metadata":{"confidence":0.66,"priority":0,"scope":"local","stats":{"created_at":"2026-02-19T19:53:15-08:00","times_activated":0,"times_confirmed":0,"times_followed":0,"times_overridden":0,"updated_at":"2026-02-19T19:53:15-08:00"}}} diff --git a/AGENTS.md b/AGENTS.md index 444cbc91..7604ad4d 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -60,7 +60,7 @@ floop list --json ## Quick Reference -### Issue Tracking (Beads) +### Issue Tracking (Beads — Dolt backend) ```bash bv --robot-triage # Get ranked recommendations bd ready # Find available work (no blockers) @@ -68,7 +68,10 @@ bd show # View issue details bd update --status in_progress # Claim work bd close --reason "..." # Complete work bd create "Title" --type task --priority 2 --description "..." -bd sync # Sync changes +bd history # Version history (Dolt) +bd diff # Diff between Dolt commits +bd dolt commit # Commit pending Dolt changes +bd dolt push # Push Dolt commits to remote ``` ### Feedback Loop (Dogfooding) ⭐ @@ -113,7 +116,7 @@ go fmt ./... # Format code - `go fmt ./...` — Format code - If `cmd/floop/` changed: verify `docs/CLI_REFERENCE.md` is current 2. Close the issue: `bd close --reason "..."` -3. Sync beads: `bd sync` +3. Commit Dolt changes: `bd dolt commit` 4. Commit changes on a feature branch 5. Push and create a PR — **never commit directly to main** 6. Wait for review before merging @@ -124,7 +127,7 @@ go fmt ./... # Format code - **`internal/`** — All application packages. Run `ls internal/` for current list. - **`docs/`** — Documentation (`GO_GUIDELINES.md`, `FLOOP_USAGE.md`, `integrations/`) - **`.floop/`** — Learned behaviors (JSONL + manifest tracked; DB + audit.jsonl gitignored) -- **`.beads/`** — Issue tracking (version controlled) +- **`.beads/`** — Issue tracking (Dolt backend, server at `~/.dolt-data/beads`) ## Code Patterns @@ -192,7 +195,7 @@ Check `bd ready` for current tasks. 1. **File issues for remaining work** - Create issues for anything that needs follow-up 2. **Run quality gates** (if code changed) - Tests, linters, builds 3. **Update issue status** - Close finished work, update in-progress items -4. **Sync beads** - `bd sync` +4. **Commit Dolt changes** - `bd dolt commit` 5. **Commit and push on a branch** - Never commit directly to main: ```bash git checkout -b chore/session-cleanup # or use existing feature branch