diff --git a/.beads/.beads-credential-key b/.beads/.beads-credential-key
new file mode 100644
index 0000000..bd386db
--- /dev/null
+++ b/.beads/.beads-credential-key
@@ -0,0 +1 @@
+4©��������p�W3�J�R9�(:�ޚ
\ No newline at end of file
diff --git a/.beads/.gitignore b/.beads/.gitignore
index e6fb002..aef2b5b 100644
--- a/.beads/.gitignore
+++ b/.beads/.gitignore
@@ -7,6 +7,19 @@ bd.sock
 bd.sock.startlock
 sync-state.json
 last-touched
+.exclusive-lock
+
+# Daemon runtime (lock, log, pid)
+daemon.*
+
+# Interactions log (runtime, not versioned)
+interactions.jsonl
+
+# Push state (runtime, per-machine)
+push-state.json
+
+# Lock files (various runtime locks)
+*.lock
 
 # Local version tracking (prevents upgrade notification spam after git ops)
 .local_version
@@ -30,6 +43,13 @@ ephemeral.sqlite3-shm
 dolt-server.pid
 dolt-server.log
 dolt-server.lock
+dolt-server.port
+
+# Corrupt backup directories (created by bd doctor --fix recovery)
+*.corrupt.backup/
+
+# Backup data (auto-exported JSONL, local-only)
+backup/
 
 # Legacy files (from pre-Dolt versions)
 *.db
@@ -39,10 +59,6 @@ dolt-server.lock
 *.db-shm
 db.sqlite
 bd.db
-daemon.lock
-daemon.log
-daemon-*.log.gz
-daemon.pid
 # NOTE: Do NOT add negation patterns here.
 # They would override fork protection in .git/info/exclude.
 # Config files (metadata.json, config.yaml) are tracked by git by default
diff --git a/.beads/dolt-monitor.pid b/.beads/dolt-monitor.pid
deleted file mode 100644
index 526f378..0000000
--- a/.beads/dolt-monitor.pid
+++ /dev/null
@@ -1 +0,0 @@
-16696
\ No newline at end of file
diff --git a/.beads/dolt-server.activity b/.beads/dolt-server.activity
deleted file mode 100644
index 7eb8c6a..0000000
--- a/.beads/dolt-server.activity
+++ /dev/null
@@ -1 +0,0 @@
-1774391767
\ No newline at end of file
diff --git a/.beads/dolt-server.port b/.beads/dolt-server.port
index b67857a..44ec4ce 100644
--- a/.beads/dolt-server.port
+++ b/.beads/dolt-server.port
@@ -1 +1 @@
-3307
\ No newline at end of file
+64072
\ No newline at end of file
diff --git a/.beads/dolt-sql-server.pid b/.beads/dolt-sql-server.pid
deleted file mode 100644
index f39b36f..0000000
--- a/.beads/dolt-sql-server.pid
+++ /dev/null
@@ -1 +0,0 @@
-7624
diff --git a/.beads/hooks/post-checkout b/.beads/hooks/post-checkout
index 206fe24..2a650b1 100644
--- a/.beads/hooks/post-checkout
+++ b/.beads/hooks/post-checkout
@@ -1,9 +1,24 @@
 #!/usr/bin/env sh
-# --- BEGIN BEADS INTEGRATION v0.57.0 ---
+# --- BEGIN BEADS INTEGRATION v0.61.0 ---
 # This section is managed by beads. Do not remove these markers.
 if command -v bd >/dev/null 2>&1; then
   export BD_GIT_HOOK=1
-  bd hooks run post-checkout "$@"
-  _bd_exit=$?; if [ $_bd_exit -ne 0 ]; then exit $_bd_exit; fi
+  _bd_timeout=${BEADS_HOOK_TIMEOUT:-30}
+  if command -v timeout >/dev/null 2>&1; then
+    timeout "$_bd_timeout" bd hooks run post-checkout "$@"
+    _bd_exit=$?
+    if [ $_bd_exit -eq 124 ]; then
+      echo >&2 "beads: hook 'post-checkout' timed out after ${_bd_timeout}s — continuing without beads"
+      _bd_exit=0
+    fi
+  else
+    bd hooks run post-checkout "$@"
+    _bd_exit=$?
+  fi
+  if [ $_bd_exit -eq 3 ]; then
+    echo >&2 "beads: database not initialized — skipping hook 'post-checkout'"
+    _bd_exit=0
+  fi
+  if [ $_bd_exit -ne 0 ]; then exit $_bd_exit; fi
 fi
-# --- END BEADS INTEGRATION ---
+# --- END BEADS INTEGRATION v0.61.0 ---
diff --git a/.beads/hooks/post-merge b/.beads/hooks/post-merge
index 73fc60c..bd1c175 100644
--- a/.beads/hooks/post-merge
+++ b/.beads/hooks/post-merge
@@ -1,9 +1,24 @@
 #!/usr/bin/env sh
-# --- BEGIN BEADS INTEGRATION v0.57.0 ---
+# --- BEGIN BEADS INTEGRATION v0.61.0 ---
 # This section is managed by beads. Do not remove these markers.
 if command -v bd >/dev/null 2>&1; then
   export BD_GIT_HOOK=1
-  bd hooks run post-merge "$@"
-  _bd_exit=$?; if [ $_bd_exit -ne 0 ]; then exit $_bd_exit; fi
+  _bd_timeout=${BEADS_HOOK_TIMEOUT:-30}
+  if command -v timeout >/dev/null 2>&1; then
+    timeout "$_bd_timeout" bd hooks run post-merge "$@"
+    _bd_exit=$?
+    if [ $_bd_exit -eq 124 ]; then
+      echo >&2 "beads: hook 'post-merge' timed out after ${_bd_timeout}s — continuing without beads"
+      _bd_exit=0
+    fi
+  else
+    bd hooks run post-merge "$@"
+    _bd_exit=$?
+  fi
+  if [ $_bd_exit -eq 3 ]; then
+    echo >&2 "beads: database not initialized — skipping hook 'post-merge'"
+    _bd_exit=0
+  fi
+  if [ $_bd_exit -ne 0 ]; then exit $_bd_exit; fi
 fi
-# --- END BEADS INTEGRATION ---
+# --- END BEADS INTEGRATION v0.61.0 ---
diff --git a/.beads/hooks/pre-commit b/.beads/hooks/pre-commit
index 90dc813..6244403 100644
--- a/.beads/hooks/pre-commit
+++ b/.beads/hooks/pre-commit
@@ -1,9 +1,24 @@
 #!/usr/bin/env sh
-# --- BEGIN BEADS INTEGRATION v0.57.0 ---
+# --- BEGIN BEADS INTEGRATION v0.61.0 ---
 # This section is managed by beads. Do not remove these markers.
 if command -v bd >/dev/null 2>&1; then
   export BD_GIT_HOOK=1
-  bd hooks run pre-commit "$@"
-  _bd_exit=$?; if [ $_bd_exit -ne 0 ]; then exit $_bd_exit; fi
+  _bd_timeout=${BEADS_HOOK_TIMEOUT:-30}
+  if command -v timeout >/dev/null 2>&1; then
+    timeout "$_bd_timeout" bd hooks run pre-commit "$@"
+    _bd_exit=$?
+    if [ $_bd_exit -eq 124 ]; then
+      echo >&2 "beads: hook 'pre-commit' timed out after ${_bd_timeout}s — continuing without beads"
+      _bd_exit=0
+    fi
+  else
+    bd hooks run pre-commit "$@"
+    _bd_exit=$?
+  fi
+  if [ $_bd_exit -eq 3 ]; then
+    echo >&2 "beads: database not initialized — skipping hook 'pre-commit'"
+    _bd_exit=0
+  fi
+  if [ $_bd_exit -ne 0 ]; then exit $_bd_exit; fi
 fi
-# --- END BEADS INTEGRATION ---
+# --- END BEADS INTEGRATION v0.61.0 ---
diff --git a/.beads/hooks/pre-push b/.beads/hooks/pre-push
index 7c3dd9b..9a5ee48 100644
--- a/.beads/hooks/pre-push
+++ b/.beads/hooks/pre-push
@@ -1,9 +1,24 @@
 #!/usr/bin/env sh
-# --- BEGIN BEADS INTEGRATION v0.57.0 ---
+# --- BEGIN BEADS INTEGRATION v0.61.0 ---
 # This section is managed by beads. Do not remove these markers.
 if command -v bd >/dev/null 2>&1; then
   export BD_GIT_HOOK=1
-  bd hooks run pre-push "$@"
-  _bd_exit=$?; if [ $_bd_exit -ne 0 ]; then exit $_bd_exit; fi
+  _bd_timeout=${BEADS_HOOK_TIMEOUT:-30}
+  if command -v timeout >/dev/null 2>&1; then
+    timeout "$_bd_timeout" bd hooks run pre-push "$@"
+    _bd_exit=$?
+    if [ $_bd_exit -eq 124 ]; then
+      echo >&2 "beads: hook 'pre-push' timed out after ${_bd_timeout}s — continuing without beads"
+      _bd_exit=0
+    fi
+  else
+    bd hooks run pre-push "$@"
+    _bd_exit=$?
+  fi
+  if [ $_bd_exit -eq 3 ]; then
+    echo >&2 "beads: database not initialized — skipping hook 'pre-push'"
+    _bd_exit=0
+  fi
+  if [ $_bd_exit -ne 0 ]; then exit $_bd_exit; fi
 fi
-# --- END BEADS INTEGRATION ---
+# --- END BEADS INTEGRATION v0.61.0 ---
diff --git a/.beads/hooks/prepare-commit-msg b/.beads/hooks/prepare-commit-msg
index a9023a4..4312713 100644
--- a/.beads/hooks/prepare-commit-msg
+++ b/.beads/hooks/prepare-commit-msg
@@ -1,9 +1,24 @@
 #!/usr/bin/env sh
-# --- BEGIN BEADS INTEGRATION v0.57.0 ---
+# --- BEGIN BEADS INTEGRATION v0.61.0 ---
 # This section is managed by beads. Do not remove these markers.
 if command -v bd >/dev/null 2>&1; then
   export BD_GIT_HOOK=1
-  bd hooks run prepare-commit-msg "$@"
-  _bd_exit=$?; if [ $_bd_exit -ne 0 ]; then exit $_bd_exit; fi
+  _bd_timeout=${BEADS_HOOK_TIMEOUT:-30}
+  if command -v timeout >/dev/null 2>&1; then
+    timeout "$_bd_timeout" bd hooks run prepare-commit-msg "$@"
+    _bd_exit=$?
+    if [ $_bd_exit -eq 124 ]; then
+      echo >&2 "beads: hook 'prepare-commit-msg' timed out after ${_bd_timeout}s — continuing without beads"
+      _bd_exit=0
+    fi
+  else
+    bd hooks run prepare-commit-msg "$@"
+    _bd_exit=$?
+  fi
+  if [ $_bd_exit -eq 3 ]; then
+    echo >&2 "beads: database not initialized — skipping hook 'prepare-commit-msg'"
+    _bd_exit=0
+  fi
+  if [ $_bd_exit -ne 0 ]; then exit $_bd_exit; fi
 fi
-# --- END BEADS INTEGRATION ---
+# --- END BEADS INTEGRATION v0.61.0 ---
diff --git a/.beads/metadata.json b/.beads/metadata.json
index 68ef479..2e24b07 100644
--- a/.beads/metadata.json
+++ b/.beads/metadata.json
@@ -2,6 +2,6 @@
   "database": "dolt",
   "backend": "dolt",
   "dolt_mode": "server",
-  "dolt_server_port": 3307,
-  "dolt_database": "beadboard"
+  "dolt_database": "beadboard",
+  "project_id": "f4cfaa47-ce9f-4cf2-a269-78e46625e5ea"
 }
\ No newline at end of file
diff --git a/AGENTS.md b/AGENTS.md
index 3c534bd..21699da 100644
--- a/AGENTS.md
+++ b/AGENTS.md
@@ -209,7 +209,7 @@ networkingMode=mirrored
 ```
 Then `wsl --shutdown`. Not required for single-platform setups.
 
-<!-- BEGIN BEADS INTEGRATION -->
+<!-- BEGIN BEADS INTEGRATION v:1 profile:full hash:d4f96305 -->
 ## Issue Tracking with bd (beads)
 
 **IMPORTANT**: This project uses **bd (beads)** for ALL issue tracking. Do NOT use markdown TODOs, task lists, or other tracking methods.
@@ -294,4 +294,30 @@ bd automatically syncs via Dolt:
 
 For more details, see README.md and docs/QUICKSTART.md.
 
+## Landing the Plane (Session Completion)
+
+**When ending a work session**, you MUST complete ALL steps below. Work is NOT complete until `git push` succeeds.
+
+**MANDATORY WORKFLOW:**
+
+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. **PUSH TO REMOTE** - This is MANDATORY:
+   ```bash
+   git pull --rebase
+   bd dolt push
+   git push
+   git status  # MUST show "up to date with origin"
+   ```
+5. **Clean up** - Clear stashes, prune remote branches
+6. **Verify** - All changes committed AND pushed
+7. **Hand off** - Provide context for next session
+
+**CRITICAL RULES:**
+- Work is NOT complete until `git push` succeeds
+- NEVER stop before pushing - that leaves work stranded locally
+- NEVER say "ready to push when you are" - YOU must push
+- If push fails, resolve and retry until it succeeds
+
 <!-- END BEADS INTEGRATION -->
