@askexenow/exe-os 0.9.104 → 0.9.106

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (89) hide show
  1. package/dist/bin/agentic-ontology-backfill.js +24 -10
  2. package/dist/bin/agentic-reflection-backfill.js +24 -10
  3. package/dist/bin/agentic-semantic-label.js +24 -10
  4. package/dist/bin/backfill-conversations.js +24 -10
  5. package/dist/bin/backfill-responses.js +24 -10
  6. package/dist/bin/backfill-vectors.js +24 -10
  7. package/dist/bin/bulk-sync-postgres.js +24 -10
  8. package/dist/bin/cleanup-stale-review-tasks.js +24 -10
  9. package/dist/bin/cli.js +24 -10
  10. package/dist/bin/exe-agent.js +15 -9
  11. package/dist/bin/exe-assign.js +24 -10
  12. package/dist/bin/exe-boot.js +24 -10
  13. package/dist/bin/exe-call.js +15 -9
  14. package/dist/bin/exe-cloud.js +24 -10
  15. package/dist/bin/exe-dispatch.js +24 -10
  16. package/dist/bin/exe-doctor.js +24 -10
  17. package/dist/bin/exe-export-behaviors.js +24 -10
  18. package/dist/bin/exe-forget.js +50 -11
  19. package/dist/bin/exe-gateway.js +24 -10
  20. package/dist/bin/exe-heartbeat.js +24 -10
  21. package/dist/bin/exe-kill.js +24 -10
  22. package/dist/bin/exe-launch-agent.js +24 -10
  23. package/dist/bin/exe-new-employee.js +24 -10
  24. package/dist/bin/exe-pending-messages.js +24 -10
  25. package/dist/bin/exe-pending-notifications.js +24 -10
  26. package/dist/bin/exe-pending-reviews.js +24 -10
  27. package/dist/bin/exe-rename.js +24 -10
  28. package/dist/bin/exe-review.js +24 -10
  29. package/dist/bin/exe-search.js +50 -11
  30. package/dist/bin/exe-session-cleanup.js +24 -10
  31. package/dist/bin/exe-start-codex.js +24 -10
  32. package/dist/bin/exe-start-opencode.js +24 -10
  33. package/dist/bin/exe-status.js +24 -10
  34. package/dist/bin/exe-team.js +24 -10
  35. package/dist/bin/git-sweep.js +24 -10
  36. package/dist/bin/graph-backfill.js +24 -10
  37. package/dist/bin/graph-export.js +24 -10
  38. package/dist/bin/intercom-check.js +24 -10
  39. package/dist/bin/pre-publish.js +15 -9
  40. package/dist/bin/scan-tasks.js +24 -10
  41. package/dist/bin/setup.js +24 -10
  42. package/dist/bin/shard-migrate.js +24 -10
  43. package/dist/gateway/index.js +24 -10
  44. package/dist/hooks/bug-report-worker.js +24 -10
  45. package/dist/hooks/codex-stop-task-finalizer.js +24 -10
  46. package/dist/hooks/commit-complete.js +24 -10
  47. package/dist/hooks/error-recall.js +50 -11
  48. package/dist/hooks/ingest.js +24 -10
  49. package/dist/hooks/instructions-loaded.js +24 -10
  50. package/dist/hooks/notification.js +24 -10
  51. package/dist/hooks/post-compact.js +24 -10
  52. package/dist/hooks/post-tool-combined.js +50 -11
  53. package/dist/hooks/pre-compact.js +24 -10
  54. package/dist/hooks/pre-tool-use.js +24 -10
  55. package/dist/hooks/prompt-submit.js +50 -11
  56. package/dist/hooks/session-end.js +24 -10
  57. package/dist/hooks/session-start.js +50 -11
  58. package/dist/hooks/stop.js +24 -10
  59. package/dist/hooks/subagent-stop.js +24 -10
  60. package/dist/hooks/summary-worker.js +24 -10
  61. package/dist/index.js +24 -10
  62. package/dist/lib/cloud-sync.js +9 -1
  63. package/dist/lib/database.js +9 -1
  64. package/dist/lib/db.js +9 -1
  65. package/dist/lib/device-registry.js +9 -1
  66. package/dist/lib/employee-templates.js +15 -9
  67. package/dist/lib/exe-daemon.js +50 -11
  68. package/dist/lib/hybrid-search.js +50 -11
  69. package/dist/lib/identity.js +9 -1
  70. package/dist/lib/messaging.js +9 -1
  71. package/dist/lib/reminders.js +9 -1
  72. package/dist/lib/schedules.js +24 -10
  73. package/dist/lib/skill-learning.js +9 -1
  74. package/dist/lib/store.js +24 -10
  75. package/dist/lib/tasks.js +9 -1
  76. package/dist/lib/tmux-routing.js +9 -1
  77. package/dist/lib/token-spend.js +9 -1
  78. package/dist/mcp/server.js +50 -11
  79. package/dist/mcp/tools/complete-reminder.js +9 -1
  80. package/dist/mcp/tools/create-reminder.js +9 -1
  81. package/dist/mcp/tools/create-task.js +9 -1
  82. package/dist/mcp/tools/deactivate-behavior.js +9 -1
  83. package/dist/mcp/tools/list-reminders.js +9 -1
  84. package/dist/mcp/tools/list-tasks.js +9 -1
  85. package/dist/mcp/tools/send-message.js +9 -1
  86. package/dist/mcp/tools/update-task.js +9 -1
  87. package/dist/runtime/index.js +24 -10
  88. package/dist/tui/App.js +24 -10
  89. package/package.json +1 -1
@@ -1606,7 +1606,15 @@ function getClient() {
1606
1606
  if (!_resilientClient) {
1607
1607
  return _adapterClient;
1608
1608
  }
1609
- return _resilientClient;
1609
+ if (process.env.EXE_DB_READONLY === "1") {
1610
+ return _resilientClient;
1611
+ }
1612
+ process.stderr.write(
1613
+ "[database] ERROR: Daemon is not running \u2014 refusing direct SQLite write access.\n[database] Direct writes bypass the single-writer gate and corrupt FTS5 indexes.\n[database] Restart the daemon: kill $(cat ~/.exe-os/exed.pid) && exe-os update\n[database] Or set EXE_DB_READONLY=1 if you only need read access.\n"
1614
+ );
1615
+ throw new Error(
1616
+ "Daemon not running. Direct SQLite writes are blocked to prevent FTS5 corruption. Restart daemon or set EXE_DB_READONLY=1 for read-only access."
1617
+ );
1610
1618
  }
1611
1619
  async function initDaemonClient() {
1612
1620
  if (process.env.DATABASE_URL && process.env.EXE_USE_POSTGRES === "1") return;
@@ -3935,7 +3943,7 @@ var init_platform_procedures = __esm({
3935
3943
  title: "Bug report status check \u2014 surface available fixes on boot",
3936
3944
  domain: "support",
3937
3945
  priority: "p1",
3938
- content: "Once per session (COO boot only, never repeat), call list_my_bug_reports to check if any previously filed bug reports have been fixed by AskExe. If any report has status 'fixed' with a fixed_version, surface it to the founder immediately: '\u{1F527} N bug fix(es) available \u2014 run exe-os update to get version X.Y.Z'. This is a one-time check at boot, not a recurring poll. If no reports exist or none are fixed, skip silently. If the MCP tool is unavailable or the network call fails, skip silently \u2014 this is informational, not blocking."
3946
+ content: "Once per session (COO boot only, never repeat), call support(action='list_my_bugs') to check if any previously filed bug reports have been fixed by AskExe. If any report has status 'closed' with a fixed_version, surface it to the founder immediately: '\u{1F527} N bug fix(es) available \u2014 run exe-os update to get version X.Y.Z'. You can also file new bugs with support(action='create_bug') and check status anytime with support(action='list_my_bugs'). This boot check is one-time, not a recurring poll. If the tool is unavailable, skip silently."
3939
3947
  },
3940
3948
  {
3941
3949
  title: "Feature request triage \u2014 upstream feature vs local customization",
@@ -3947,7 +3955,7 @@ var init_platform_procedures = __esm({
3947
3955
  title: "Feature request status check \u2014 surface shipped features on boot",
3948
3956
  domain: "support",
3949
3957
  priority: "p1",
3950
- content: "Once per session (COO boot only, never repeat), call list_my_feature_requests to check if any previously filed feature requests have been shipped by AskExe. If any request has status 'shipped' with a shipped_version, surface it to the founder immediately: '\u{1F680} N feature(s) shipped \u2014 run exe-os update to get version X.Y.Z'. This is a one-time check at boot, not a recurring poll. If no requests exist or none are shipped, skip silently. If the MCP tool is unavailable or the network call fails, skip silently \u2014 this is informational, not blocking."
3958
+ content: "Once per session (COO boot only, never repeat), call support(action='list_my_features') to check if any previously filed feature requests have been shipped by AskExe. If any request has status 'shipped' with a shipped_version, surface it to the founder immediately: '\u{1F680} N feature(s) shipped \u2014 run exe-os update to get version X.Y.Z'. You can also file new requests with support(action='create_feature') and check status anytime with support(action='list_my_features'). This boot check is one-time, not a recurring poll. If the tool is unavailable, skip silently."
3951
3959
  },
3952
3960
  // --- Tool guidance ---
3953
3961
  {
@@ -3983,6 +3991,18 @@ var init_platform_procedures = __esm({
3983
3991
  priority: "p0",
3984
3992
  content: "exe-os has TWO version numbers that move independently. This is normal \u2014 do not treat a mismatch as an error. (1) CLI version (e.g. 0.9.89, 0.9.90) \u2014 the npm package installed locally. Updates frequently: bug fixes, new MCP tools, platform procedures, search improvements, client-side changes. Update with `npm install -g @askexenow/exe-os@latest`. (2) Stack version (e.g. 0.9.7, 0.9.8) \u2014 the Docker images on the VPS. Updates less frequently: only when server-side daemon, gateway, wiki, or CRM images need rebuilding. Update with `exe-os stack-update --target <version> --yes`. The CLI version will almost always be higher than the stack version. A CLI at 0.9.90 with a stack at 0.9.8 is perfectly normal \u2014 it means the CLI got 12 patches since the last Docker image rebuild. Only update the stack when: (a) the boot brief surfaces a fix that mentions 'stack update required', (b) a new stack manifest version is bundled in the CLI (`exe-os stack-update --check` shows pending changes), or (c) AskExe support explicitly tells you to. Do NOT attempt to make the numbers match \u2014 they are separate tracks."
3985
3993
  },
3994
+ {
3995
+ title: "Update lifecycle \u2014 what each command does and what picks up new code",
3996
+ domain: "operations",
3997
+ priority: "p0",
3998
+ content: "Three update paths exist \u2014 know which does what. (1) `npm install -g @askexenow/exe-os@latest` \u2014 customer update. Replaces all dist/ files. postinstall copies slash commands AND restarts the daemon automatically. MCP server picks up new code on next `/mcp` reconnect or new Claude Code session. Hooks pick up new code on next session (they spawn fresh processes). (2) `exe-os update` \u2014 interactive update command. Runs `npm install -g` then `install --global` which restarts daemon, regenerates session wrappers, normalizes roster, registers Codex hooks. This is the recommended customer path. (3) `npm run deploy` \u2014 dev-only (COO/CTO on main branch). Builds, installs globally, runs `install --global`, restarts daemon. Never run from a worktree. NEVER confuse `exe-os setup` (first-time setup wizard for new installs) with `exe-os update` (update existing install). Setup creates encryption keys, configures cloud, runs first sync. Update just replaces code and restarts services. They are completely different commands."
3999
+ },
4000
+ {
4001
+ title: "First install \u2014 setup wizard and license activation",
4002
+ domain: "operations",
4003
+ priority: "p1",
4004
+ content: "Fresh install: `npm install -g @askexenow/exe-os` then run `exe` to start the setup wizard. The wizard prompts for: encryption passphrase (creates master key), license key (exe_sk_* from AskExe team), COO name, and optional team members. No license key = free tier (1 employee, 5K memories). After setup: hooks install automatically, MCP server registers in ~/.claude.json, daemon starts. Verify health: run `exe-os healthcheck` or use mcp_ping() tool."
4005
+ },
3986
4006
  // --- Operations ---
3987
4007
  {
3988
4008
  title: "Managers must supervise deployed workers",
@@ -4033,12 +4053,6 @@ var init_platform_procedures = __esm({
4033
4053
  priority: "p0",
4034
4054
  content: "When you dispatch work, you OWN the review. Check list_tasks(status='needs_review') on EVERY prompt \u2014 don't wait for intercom nudges (they're unreliable). When a task shows needs_review: (1) read the deliverable (git diff in worktree, exe/output/ files, or task result summary), (2) verify it works (tsc, build, run), (3) close_task if good or create a fix task if not. Reviews sitting >30 minutes is a pipeline stall. The whole chain: worker calls update_task(done) \u2192 system flags needs_review \u2192 manager pulls and verifies \u2192 close_task \u2192 COO reviews manager's work \u2192 merge to main. Every level actively pulls \u2014 nobody waits."
4035
4055
  },
4036
- {
4037
- title: "Bug fix lifecycle \u2014 triage upstream after every verified fix so customers see the status",
4038
- domain: "workflow",
4039
- priority: "p0",
4040
- content: "When a bug from support(action='list_bugs') is fixed and verified, the reviewer MUST triage it upstream: support(action='triage_bug', id='<bug-id>', notes='<what was fixed>', fixed_version='<version>', linked_commit='<hash>'). This closes the bug in the customer's view \u2014 their COO checks list_my_bugs and sees status change from open \u2192 closed with the fix version. Without triage, customers see 'open' forever even after the fix ships. Same for feature requests: support(action='triage_feature', ..., shipped_version='<version>'). Triage is part of the review gate \u2014 a fix is not done until the upstream report is closed."
4041
- },
4042
4056
  {
4043
4057
  title: "Intercom is a speedup, not delivery \u2014 DB is the source of truth",
4044
4058
  domain: "architecture",
@@ -4094,7 +4108,7 @@ var init_platform_procedures = __esm({
4094
4108
  title: "MCP tools \u2014 identity, behavior, and support",
4095
4109
  domain: "tool-use",
4096
4110
  priority: "p1",
4097
- content: `identity(action="get") / get_identity: read an agent's exe.md (Layer 1 identity). identity(action="update") / update_identity: write an agent's exe.md. Identity > behavior. behavior(action="store") / store_behavior: record a correction or pattern (Layer 2 expertise). behavior(action="list") / list_behaviors: view active behaviors. behavior(action="deactivate") / deactivate_behavior: soft-delete a stale behavior. support(action="create_bug") / create_bug_report: file a bug report to AskExe (title, description, severity). support(action="create_feature") / create_feature_request: file a feature request. support(action="health") / support_health: check support server readiness. support(action="triage_bug"): triage a bug (id, triage_notes). AskExe-internal only. CRITICAL: triage uses triage_notes NOT notes.`
4111
+ content: `identity(action="get") / get_identity: read an agent's exe.md (Layer 1 identity). identity(action="update") / update_identity: write an agent's exe.md. Identity > behavior. behavior(action="store") / store_behavior: record a correction or pattern (Layer 2 expertise). behavior(action="list") / list_behaviors: view active behaviors. behavior(action="deactivate") / deactivate_behavior: soft-delete a stale behavior. support(action="create_bug"): file a bug report (title, description, severity p0-p3). Auto-delivers to AskExe. support(action="create_feature"): file a feature request (title, description, use_case). support(action="list_my_bugs"): check status of YOUR filed bug reports \u2014 see which are open, triaged, or fixed with version number. support(action="list_my_features"): check status of YOUR filed feature requests \u2014 see which are planned, shipped, or closed. support(action="health"): verify support server is reachable. When a bug you filed shows status='fixed' with a fixed_version, update exe-os to that version to get the fix. support(action="triage_bug"): AskExe-internal only. CRITICAL: triage uses triage_notes NOT notes.`
4098
4112
  },
4099
4113
  {
4100
4114
  title: "MCP tools \u2014 communication and messaging",
@@ -1832,7 +1832,15 @@ function getClient() {
1832
1832
  if (!_resilientClient) {
1833
1833
  return _adapterClient;
1834
1834
  }
1835
- return _resilientClient;
1835
+ if (process.env.EXE_DB_READONLY === "1") {
1836
+ return _resilientClient;
1837
+ }
1838
+ process.stderr.write(
1839
+ "[database] ERROR: Daemon is not running \u2014 refusing direct SQLite write access.\n[database] Direct writes bypass the single-writer gate and corrupt FTS5 indexes.\n[database] Restart the daemon: kill $(cat ~/.exe-os/exed.pid) && exe-os update\n[database] Or set EXE_DB_READONLY=1 if you only need read access.\n"
1840
+ );
1841
+ throw new Error(
1842
+ "Daemon not running. Direct SQLite writes are blocked to prevent FTS5 corruption. Restart daemon or set EXE_DB_READONLY=1 for read-only access."
1843
+ );
1836
1844
  }
1837
1845
  async function initDaemonClient() {
1838
1846
  if (process.env.DATABASE_URL && process.env.EXE_USE_POSTGRES === "1") return;
@@ -4410,7 +4418,7 @@ var init_platform_procedures = __esm({
4410
4418
  title: "Bug report status check \u2014 surface available fixes on boot",
4411
4419
  domain: "support",
4412
4420
  priority: "p1",
4413
- content: "Once per session (COO boot only, never repeat), call list_my_bug_reports to check if any previously filed bug reports have been fixed by AskExe. If any report has status 'fixed' with a fixed_version, surface it to the founder immediately: '\u{1F527} N bug fix(es) available \u2014 run exe-os update to get version X.Y.Z'. This is a one-time check at boot, not a recurring poll. If no reports exist or none are fixed, skip silently. If the MCP tool is unavailable or the network call fails, skip silently \u2014 this is informational, not blocking."
4421
+ content: "Once per session (COO boot only, never repeat), call support(action='list_my_bugs') to check if any previously filed bug reports have been fixed by AskExe. If any report has status 'closed' with a fixed_version, surface it to the founder immediately: '\u{1F527} N bug fix(es) available \u2014 run exe-os update to get version X.Y.Z'. You can also file new bugs with support(action='create_bug') and check status anytime with support(action='list_my_bugs'). This boot check is one-time, not a recurring poll. If the tool is unavailable, skip silently."
4414
4422
  },
4415
4423
  {
4416
4424
  title: "Feature request triage \u2014 upstream feature vs local customization",
@@ -4422,7 +4430,7 @@ var init_platform_procedures = __esm({
4422
4430
  title: "Feature request status check \u2014 surface shipped features on boot",
4423
4431
  domain: "support",
4424
4432
  priority: "p1",
4425
- content: "Once per session (COO boot only, never repeat), call list_my_feature_requests to check if any previously filed feature requests have been shipped by AskExe. If any request has status 'shipped' with a shipped_version, surface it to the founder immediately: '\u{1F680} N feature(s) shipped \u2014 run exe-os update to get version X.Y.Z'. This is a one-time check at boot, not a recurring poll. If no requests exist or none are shipped, skip silently. If the MCP tool is unavailable or the network call fails, skip silently \u2014 this is informational, not blocking."
4433
+ content: "Once per session (COO boot only, never repeat), call support(action='list_my_features') to check if any previously filed feature requests have been shipped by AskExe. If any request has status 'shipped' with a shipped_version, surface it to the founder immediately: '\u{1F680} N feature(s) shipped \u2014 run exe-os update to get version X.Y.Z'. You can also file new requests with support(action='create_feature') and check status anytime with support(action='list_my_features'). This boot check is one-time, not a recurring poll. If the tool is unavailable, skip silently."
4426
4434
  },
4427
4435
  // --- Tool guidance ---
4428
4436
  {
@@ -4458,6 +4466,18 @@ var init_platform_procedures = __esm({
4458
4466
  priority: "p0",
4459
4467
  content: "exe-os has TWO version numbers that move independently. This is normal \u2014 do not treat a mismatch as an error. (1) CLI version (e.g. 0.9.89, 0.9.90) \u2014 the npm package installed locally. Updates frequently: bug fixes, new MCP tools, platform procedures, search improvements, client-side changes. Update with `npm install -g @askexenow/exe-os@latest`. (2) Stack version (e.g. 0.9.7, 0.9.8) \u2014 the Docker images on the VPS. Updates less frequently: only when server-side daemon, gateway, wiki, or CRM images need rebuilding. Update with `exe-os stack-update --target <version> --yes`. The CLI version will almost always be higher than the stack version. A CLI at 0.9.90 with a stack at 0.9.8 is perfectly normal \u2014 it means the CLI got 12 patches since the last Docker image rebuild. Only update the stack when: (a) the boot brief surfaces a fix that mentions 'stack update required', (b) a new stack manifest version is bundled in the CLI (`exe-os stack-update --check` shows pending changes), or (c) AskExe support explicitly tells you to. Do NOT attempt to make the numbers match \u2014 they are separate tracks."
4460
4468
  },
4469
+ {
4470
+ title: "Update lifecycle \u2014 what each command does and what picks up new code",
4471
+ domain: "operations",
4472
+ priority: "p0",
4473
+ content: "Three update paths exist \u2014 know which does what. (1) `npm install -g @askexenow/exe-os@latest` \u2014 customer update. Replaces all dist/ files. postinstall copies slash commands AND restarts the daemon automatically. MCP server picks up new code on next `/mcp` reconnect or new Claude Code session. Hooks pick up new code on next session (they spawn fresh processes). (2) `exe-os update` \u2014 interactive update command. Runs `npm install -g` then `install --global` which restarts daemon, regenerates session wrappers, normalizes roster, registers Codex hooks. This is the recommended customer path. (3) `npm run deploy` \u2014 dev-only (COO/CTO on main branch). Builds, installs globally, runs `install --global`, restarts daemon. Never run from a worktree. NEVER confuse `exe-os setup` (first-time setup wizard for new installs) with `exe-os update` (update existing install). Setup creates encryption keys, configures cloud, runs first sync. Update just replaces code and restarts services. They are completely different commands."
4474
+ },
4475
+ {
4476
+ title: "First install \u2014 setup wizard and license activation",
4477
+ domain: "operations",
4478
+ priority: "p1",
4479
+ content: "Fresh install: `npm install -g @askexenow/exe-os` then run `exe` to start the setup wizard. The wizard prompts for: encryption passphrase (creates master key), license key (exe_sk_* from AskExe team), COO name, and optional team members. No license key = free tier (1 employee, 5K memories). After setup: hooks install automatically, MCP server registers in ~/.claude.json, daemon starts. Verify health: run `exe-os healthcheck` or use mcp_ping() tool."
4480
+ },
4461
4481
  // --- Operations ---
4462
4482
  {
4463
4483
  title: "Managers must supervise deployed workers",
@@ -4508,12 +4528,6 @@ var init_platform_procedures = __esm({
4508
4528
  priority: "p0",
4509
4529
  content: "When you dispatch work, you OWN the review. Check list_tasks(status='needs_review') on EVERY prompt \u2014 don't wait for intercom nudges (they're unreliable). When a task shows needs_review: (1) read the deliverable (git diff in worktree, exe/output/ files, or task result summary), (2) verify it works (tsc, build, run), (3) close_task if good or create a fix task if not. Reviews sitting >30 minutes is a pipeline stall. The whole chain: worker calls update_task(done) \u2192 system flags needs_review \u2192 manager pulls and verifies \u2192 close_task \u2192 COO reviews manager's work \u2192 merge to main. Every level actively pulls \u2014 nobody waits."
4510
4530
  },
4511
- {
4512
- title: "Bug fix lifecycle \u2014 triage upstream after every verified fix so customers see the status",
4513
- domain: "workflow",
4514
- priority: "p0",
4515
- content: "When a bug from support(action='list_bugs') is fixed and verified, the reviewer MUST triage it upstream: support(action='triage_bug', id='<bug-id>', notes='<what was fixed>', fixed_version='<version>', linked_commit='<hash>'). This closes the bug in the customer's view \u2014 their COO checks list_my_bugs and sees status change from open \u2192 closed with the fix version. Without triage, customers see 'open' forever even after the fix ships. Same for feature requests: support(action='triage_feature', ..., shipped_version='<version>'). Triage is part of the review gate \u2014 a fix is not done until the upstream report is closed."
4516
- },
4517
4531
  {
4518
4532
  title: "Intercom is a speedup, not delivery \u2014 DB is the source of truth",
4519
4533
  domain: "architecture",
@@ -4569,7 +4583,7 @@ var init_platform_procedures = __esm({
4569
4583
  title: "MCP tools \u2014 identity, behavior, and support",
4570
4584
  domain: "tool-use",
4571
4585
  priority: "p1",
4572
- content: `identity(action="get") / get_identity: read an agent's exe.md (Layer 1 identity). identity(action="update") / update_identity: write an agent's exe.md. Identity > behavior. behavior(action="store") / store_behavior: record a correction or pattern (Layer 2 expertise). behavior(action="list") / list_behaviors: view active behaviors. behavior(action="deactivate") / deactivate_behavior: soft-delete a stale behavior. support(action="create_bug") / create_bug_report: file a bug report to AskExe (title, description, severity). support(action="create_feature") / create_feature_request: file a feature request. support(action="health") / support_health: check support server readiness. support(action="triage_bug"): triage a bug (id, triage_notes). AskExe-internal only. CRITICAL: triage uses triage_notes NOT notes.`
4586
+ content: `identity(action="get") / get_identity: read an agent's exe.md (Layer 1 identity). identity(action="update") / update_identity: write an agent's exe.md. Identity > behavior. behavior(action="store") / store_behavior: record a correction or pattern (Layer 2 expertise). behavior(action="list") / list_behaviors: view active behaviors. behavior(action="deactivate") / deactivate_behavior: soft-delete a stale behavior. support(action="create_bug"): file a bug report (title, description, severity p0-p3). Auto-delivers to AskExe. support(action="create_feature"): file a feature request (title, description, use_case). support(action="list_my_bugs"): check status of YOUR filed bug reports \u2014 see which are open, triaged, or fixed with version number. support(action="list_my_features"): check status of YOUR filed feature requests \u2014 see which are planned, shipped, or closed. support(action="health"): verify support server is reachable. When a bug you filed shows status='fixed' with a fixed_version, update exe-os to that version to get the fix. support(action="triage_bug"): AskExe-internal only. CRITICAL: triage uses triage_notes NOT notes.`
4573
4587
  },
4574
4588
  {
4575
4589
  title: "MCP tools \u2014 communication and messaging",
package/dist/bin/cli.js CHANGED
@@ -4487,7 +4487,15 @@ function getClient() {
4487
4487
  if (!_resilientClient) {
4488
4488
  return _adapterClient;
4489
4489
  }
4490
- return _resilientClient;
4490
+ if (process.env.EXE_DB_READONLY === "1") {
4491
+ return _resilientClient;
4492
+ }
4493
+ process.stderr.write(
4494
+ "[database] ERROR: Daemon is not running \u2014 refusing direct SQLite write access.\n[database] Direct writes bypass the single-writer gate and corrupt FTS5 indexes.\n[database] Restart the daemon: kill $(cat ~/.exe-os/exed.pid) && exe-os update\n[database] Or set EXE_DB_READONLY=1 if you only need read access.\n"
4495
+ );
4496
+ throw new Error(
4497
+ "Daemon not running. Direct SQLite writes are blocked to prevent FTS5 corruption. Restart daemon or set EXE_DB_READONLY=1 for read-only access."
4498
+ );
4491
4499
  }
4492
4500
  async function initDaemonClient() {
4493
4501
  if (process.env.DATABASE_URL && process.env.EXE_USE_POSTGRES === "1") return;
@@ -9116,7 +9124,7 @@ var init_platform_procedures = __esm({
9116
9124
  title: "Bug report status check \u2014 surface available fixes on boot",
9117
9125
  domain: "support",
9118
9126
  priority: "p1",
9119
- content: "Once per session (COO boot only, never repeat), call list_my_bug_reports to check if any previously filed bug reports have been fixed by AskExe. If any report has status 'fixed' with a fixed_version, surface it to the founder immediately: '\u{1F527} N bug fix(es) available \u2014 run exe-os update to get version X.Y.Z'. This is a one-time check at boot, not a recurring poll. If no reports exist or none are fixed, skip silently. If the MCP tool is unavailable or the network call fails, skip silently \u2014 this is informational, not blocking."
9127
+ content: "Once per session (COO boot only, never repeat), call support(action='list_my_bugs') to check if any previously filed bug reports have been fixed by AskExe. If any report has status 'closed' with a fixed_version, surface it to the founder immediately: '\u{1F527} N bug fix(es) available \u2014 run exe-os update to get version X.Y.Z'. You can also file new bugs with support(action='create_bug') and check status anytime with support(action='list_my_bugs'). This boot check is one-time, not a recurring poll. If the tool is unavailable, skip silently."
9120
9128
  },
9121
9129
  {
9122
9130
  title: "Feature request triage \u2014 upstream feature vs local customization",
@@ -9128,7 +9136,7 @@ var init_platform_procedures = __esm({
9128
9136
  title: "Feature request status check \u2014 surface shipped features on boot",
9129
9137
  domain: "support",
9130
9138
  priority: "p1",
9131
- content: "Once per session (COO boot only, never repeat), call list_my_feature_requests to check if any previously filed feature requests have been shipped by AskExe. If any request has status 'shipped' with a shipped_version, surface it to the founder immediately: '\u{1F680} N feature(s) shipped \u2014 run exe-os update to get version X.Y.Z'. This is a one-time check at boot, not a recurring poll. If no requests exist or none are shipped, skip silently. If the MCP tool is unavailable or the network call fails, skip silently \u2014 this is informational, not blocking."
9139
+ content: "Once per session (COO boot only, never repeat), call support(action='list_my_features') to check if any previously filed feature requests have been shipped by AskExe. If any request has status 'shipped' with a shipped_version, surface it to the founder immediately: '\u{1F680} N feature(s) shipped \u2014 run exe-os update to get version X.Y.Z'. You can also file new requests with support(action='create_feature') and check status anytime with support(action='list_my_features'). This boot check is one-time, not a recurring poll. If the tool is unavailable, skip silently."
9132
9140
  },
9133
9141
  // --- Tool guidance ---
9134
9142
  {
@@ -9164,6 +9172,18 @@ var init_platform_procedures = __esm({
9164
9172
  priority: "p0",
9165
9173
  content: "exe-os has TWO version numbers that move independently. This is normal \u2014 do not treat a mismatch as an error. (1) CLI version (e.g. 0.9.89, 0.9.90) \u2014 the npm package installed locally. Updates frequently: bug fixes, new MCP tools, platform procedures, search improvements, client-side changes. Update with `npm install -g @askexenow/exe-os@latest`. (2) Stack version (e.g. 0.9.7, 0.9.8) \u2014 the Docker images on the VPS. Updates less frequently: only when server-side daemon, gateway, wiki, or CRM images need rebuilding. Update with `exe-os stack-update --target <version> --yes`. The CLI version will almost always be higher than the stack version. A CLI at 0.9.90 with a stack at 0.9.8 is perfectly normal \u2014 it means the CLI got 12 patches since the last Docker image rebuild. Only update the stack when: (a) the boot brief surfaces a fix that mentions 'stack update required', (b) a new stack manifest version is bundled in the CLI (`exe-os stack-update --check` shows pending changes), or (c) AskExe support explicitly tells you to. Do NOT attempt to make the numbers match \u2014 they are separate tracks."
9166
9174
  },
9175
+ {
9176
+ title: "Update lifecycle \u2014 what each command does and what picks up new code",
9177
+ domain: "operations",
9178
+ priority: "p0",
9179
+ content: "Three update paths exist \u2014 know which does what. (1) `npm install -g @askexenow/exe-os@latest` \u2014 customer update. Replaces all dist/ files. postinstall copies slash commands AND restarts the daemon automatically. MCP server picks up new code on next `/mcp` reconnect or new Claude Code session. Hooks pick up new code on next session (they spawn fresh processes). (2) `exe-os update` \u2014 interactive update command. Runs `npm install -g` then `install --global` which restarts daemon, regenerates session wrappers, normalizes roster, registers Codex hooks. This is the recommended customer path. (3) `npm run deploy` \u2014 dev-only (COO/CTO on main branch). Builds, installs globally, runs `install --global`, restarts daemon. Never run from a worktree. NEVER confuse `exe-os setup` (first-time setup wizard for new installs) with `exe-os update` (update existing install). Setup creates encryption keys, configures cloud, runs first sync. Update just replaces code and restarts services. They are completely different commands."
9180
+ },
9181
+ {
9182
+ title: "First install \u2014 setup wizard and license activation",
9183
+ domain: "operations",
9184
+ priority: "p1",
9185
+ content: "Fresh install: `npm install -g @askexenow/exe-os` then run `exe` to start the setup wizard. The wizard prompts for: encryption passphrase (creates master key), license key (exe_sk_* from AskExe team), COO name, and optional team members. No license key = free tier (1 employee, 5K memories). After setup: hooks install automatically, MCP server registers in ~/.claude.json, daemon starts. Verify health: run `exe-os healthcheck` or use mcp_ping() tool."
9186
+ },
9167
9187
  // --- Operations ---
9168
9188
  {
9169
9189
  title: "Managers must supervise deployed workers",
@@ -9214,12 +9234,6 @@ var init_platform_procedures = __esm({
9214
9234
  priority: "p0",
9215
9235
  content: "When you dispatch work, you OWN the review. Check list_tasks(status='needs_review') on EVERY prompt \u2014 don't wait for intercom nudges (they're unreliable). When a task shows needs_review: (1) read the deliverable (git diff in worktree, exe/output/ files, or task result summary), (2) verify it works (tsc, build, run), (3) close_task if good or create a fix task if not. Reviews sitting >30 minutes is a pipeline stall. The whole chain: worker calls update_task(done) \u2192 system flags needs_review \u2192 manager pulls and verifies \u2192 close_task \u2192 COO reviews manager's work \u2192 merge to main. Every level actively pulls \u2014 nobody waits."
9216
9236
  },
9217
- {
9218
- title: "Bug fix lifecycle \u2014 triage upstream after every verified fix so customers see the status",
9219
- domain: "workflow",
9220
- priority: "p0",
9221
- content: "When a bug from support(action='list_bugs') is fixed and verified, the reviewer MUST triage it upstream: support(action='triage_bug', id='<bug-id>', notes='<what was fixed>', fixed_version='<version>', linked_commit='<hash>'). This closes the bug in the customer's view \u2014 their COO checks list_my_bugs and sees status change from open \u2192 closed with the fix version. Without triage, customers see 'open' forever even after the fix ships. Same for feature requests: support(action='triage_feature', ..., shipped_version='<version>'). Triage is part of the review gate \u2014 a fix is not done until the upstream report is closed."
9222
- },
9223
9237
  {
9224
9238
  title: "Intercom is a speedup, not delivery \u2014 DB is the source of truth",
9225
9239
  domain: "architecture",
@@ -9275,7 +9289,7 @@ var init_platform_procedures = __esm({
9275
9289
  title: "MCP tools \u2014 identity, behavior, and support",
9276
9290
  domain: "tool-use",
9277
9291
  priority: "p1",
9278
- content: `identity(action="get") / get_identity: read an agent's exe.md (Layer 1 identity). identity(action="update") / update_identity: write an agent's exe.md. Identity > behavior. behavior(action="store") / store_behavior: record a correction or pattern (Layer 2 expertise). behavior(action="list") / list_behaviors: view active behaviors. behavior(action="deactivate") / deactivate_behavior: soft-delete a stale behavior. support(action="create_bug") / create_bug_report: file a bug report to AskExe (title, description, severity). support(action="create_feature") / create_feature_request: file a feature request. support(action="health") / support_health: check support server readiness. support(action="triage_bug"): triage a bug (id, triage_notes). AskExe-internal only. CRITICAL: triage uses triage_notes NOT notes.`
9292
+ content: `identity(action="get") / get_identity: read an agent's exe.md (Layer 1 identity). identity(action="update") / update_identity: write an agent's exe.md. Identity > behavior. behavior(action="store") / store_behavior: record a correction or pattern (Layer 2 expertise). behavior(action="list") / list_behaviors: view active behaviors. behavior(action="deactivate") / deactivate_behavior: soft-delete a stale behavior. support(action="create_bug"): file a bug report (title, description, severity p0-p3). Auto-delivers to AskExe. support(action="create_feature"): file a feature request (title, description, use_case). support(action="list_my_bugs"): check status of YOUR filed bug reports \u2014 see which are open, triaged, or fixed with version number. support(action="list_my_features"): check status of YOUR filed feature requests \u2014 see which are planned, shipped, or closed. support(action="health"): verify support server is reachable. When a bug you filed shows status='fixed' with a fixed_version, update exe-os to that version to get the fix. support(action="triage_bug"): AskExe-internal only. CRITICAL: triage uses triage_notes NOT notes.`
9279
9293
  },
9280
9294
  {
9281
9295
  title: "MCP tools \u2014 communication and messaging",
@@ -1401,7 +1401,7 @@ var PLATFORM_PROCEDURES = [
1401
1401
  title: "Bug report status check \u2014 surface available fixes on boot",
1402
1402
  domain: "support",
1403
1403
  priority: "p1",
1404
- content: "Once per session (COO boot only, never repeat), call list_my_bug_reports to check if any previously filed bug reports have been fixed by AskExe. If any report has status 'fixed' with a fixed_version, surface it to the founder immediately: '\u{1F527} N bug fix(es) available \u2014 run exe-os update to get version X.Y.Z'. This is a one-time check at boot, not a recurring poll. If no reports exist or none are fixed, skip silently. If the MCP tool is unavailable or the network call fails, skip silently \u2014 this is informational, not blocking."
1404
+ content: "Once per session (COO boot only, never repeat), call support(action='list_my_bugs') to check if any previously filed bug reports have been fixed by AskExe. If any report has status 'closed' with a fixed_version, surface it to the founder immediately: '\u{1F527} N bug fix(es) available \u2014 run exe-os update to get version X.Y.Z'. You can also file new bugs with support(action='create_bug') and check status anytime with support(action='list_my_bugs'). This boot check is one-time, not a recurring poll. If the tool is unavailable, skip silently."
1405
1405
  },
1406
1406
  {
1407
1407
  title: "Feature request triage \u2014 upstream feature vs local customization",
@@ -1413,7 +1413,7 @@ var PLATFORM_PROCEDURES = [
1413
1413
  title: "Feature request status check \u2014 surface shipped features on boot",
1414
1414
  domain: "support",
1415
1415
  priority: "p1",
1416
- content: "Once per session (COO boot only, never repeat), call list_my_feature_requests to check if any previously filed feature requests have been shipped by AskExe. If any request has status 'shipped' with a shipped_version, surface it to the founder immediately: '\u{1F680} N feature(s) shipped \u2014 run exe-os update to get version X.Y.Z'. This is a one-time check at boot, not a recurring poll. If no requests exist or none are shipped, skip silently. If the MCP tool is unavailable or the network call fails, skip silently \u2014 this is informational, not blocking."
1416
+ content: "Once per session (COO boot only, never repeat), call support(action='list_my_features') to check if any previously filed feature requests have been shipped by AskExe. If any request has status 'shipped' with a shipped_version, surface it to the founder immediately: '\u{1F680} N feature(s) shipped \u2014 run exe-os update to get version X.Y.Z'. You can also file new requests with support(action='create_feature') and check status anytime with support(action='list_my_features'). This boot check is one-time, not a recurring poll. If the tool is unavailable, skip silently."
1417
1417
  },
1418
1418
  // --- Tool guidance ---
1419
1419
  {
@@ -1449,6 +1449,18 @@ var PLATFORM_PROCEDURES = [
1449
1449
  priority: "p0",
1450
1450
  content: "exe-os has TWO version numbers that move independently. This is normal \u2014 do not treat a mismatch as an error. (1) CLI version (e.g. 0.9.89, 0.9.90) \u2014 the npm package installed locally. Updates frequently: bug fixes, new MCP tools, platform procedures, search improvements, client-side changes. Update with `npm install -g @askexenow/exe-os@latest`. (2) Stack version (e.g. 0.9.7, 0.9.8) \u2014 the Docker images on the VPS. Updates less frequently: only when server-side daemon, gateway, wiki, or CRM images need rebuilding. Update with `exe-os stack-update --target <version> --yes`. The CLI version will almost always be higher than the stack version. A CLI at 0.9.90 with a stack at 0.9.8 is perfectly normal \u2014 it means the CLI got 12 patches since the last Docker image rebuild. Only update the stack when: (a) the boot brief surfaces a fix that mentions 'stack update required', (b) a new stack manifest version is bundled in the CLI (`exe-os stack-update --check` shows pending changes), or (c) AskExe support explicitly tells you to. Do NOT attempt to make the numbers match \u2014 they are separate tracks."
1451
1451
  },
1452
+ {
1453
+ title: "Update lifecycle \u2014 what each command does and what picks up new code",
1454
+ domain: "operations",
1455
+ priority: "p0",
1456
+ content: "Three update paths exist \u2014 know which does what. (1) `npm install -g @askexenow/exe-os@latest` \u2014 customer update. Replaces all dist/ files. postinstall copies slash commands AND restarts the daemon automatically. MCP server picks up new code on next `/mcp` reconnect or new Claude Code session. Hooks pick up new code on next session (they spawn fresh processes). (2) `exe-os update` \u2014 interactive update command. Runs `npm install -g` then `install --global` which restarts daemon, regenerates session wrappers, normalizes roster, registers Codex hooks. This is the recommended customer path. (3) `npm run deploy` \u2014 dev-only (COO/CTO on main branch). Builds, installs globally, runs `install --global`, restarts daemon. Never run from a worktree. NEVER confuse `exe-os setup` (first-time setup wizard for new installs) with `exe-os update` (update existing install). Setup creates encryption keys, configures cloud, runs first sync. Update just replaces code and restarts services. They are completely different commands."
1457
+ },
1458
+ {
1459
+ title: "First install \u2014 setup wizard and license activation",
1460
+ domain: "operations",
1461
+ priority: "p1",
1462
+ content: "Fresh install: `npm install -g @askexenow/exe-os` then run `exe` to start the setup wizard. The wizard prompts for: encryption passphrase (creates master key), license key (exe_sk_* from AskExe team), COO name, and optional team members. No license key = free tier (1 employee, 5K memories). After setup: hooks install automatically, MCP server registers in ~/.claude.json, daemon starts. Verify health: run `exe-os healthcheck` or use mcp_ping() tool."
1463
+ },
1452
1464
  // --- Operations ---
1453
1465
  {
1454
1466
  title: "Managers must supervise deployed workers",
@@ -1499,12 +1511,6 @@ var PLATFORM_PROCEDURES = [
1499
1511
  priority: "p0",
1500
1512
  content: "When you dispatch work, you OWN the review. Check list_tasks(status='needs_review') on EVERY prompt \u2014 don't wait for intercom nudges (they're unreliable). When a task shows needs_review: (1) read the deliverable (git diff in worktree, exe/output/ files, or task result summary), (2) verify it works (tsc, build, run), (3) close_task if good or create a fix task if not. Reviews sitting >30 minutes is a pipeline stall. The whole chain: worker calls update_task(done) \u2192 system flags needs_review \u2192 manager pulls and verifies \u2192 close_task \u2192 COO reviews manager's work \u2192 merge to main. Every level actively pulls \u2014 nobody waits."
1501
1513
  },
1502
- {
1503
- title: "Bug fix lifecycle \u2014 triage upstream after every verified fix so customers see the status",
1504
- domain: "workflow",
1505
- priority: "p0",
1506
- content: "When a bug from support(action='list_bugs') is fixed and verified, the reviewer MUST triage it upstream: support(action='triage_bug', id='<bug-id>', notes='<what was fixed>', fixed_version='<version>', linked_commit='<hash>'). This closes the bug in the customer's view \u2014 their COO checks list_my_bugs and sees status change from open \u2192 closed with the fix version. Without triage, customers see 'open' forever even after the fix ships. Same for feature requests: support(action='triage_feature', ..., shipped_version='<version>'). Triage is part of the review gate \u2014 a fix is not done until the upstream report is closed."
1507
- },
1508
1514
  {
1509
1515
  title: "Intercom is a speedup, not delivery \u2014 DB is the source of truth",
1510
1516
  domain: "architecture",
@@ -1560,7 +1566,7 @@ var PLATFORM_PROCEDURES = [
1560
1566
  title: "MCP tools \u2014 identity, behavior, and support",
1561
1567
  domain: "tool-use",
1562
1568
  priority: "p1",
1563
- content: `identity(action="get") / get_identity: read an agent's exe.md (Layer 1 identity). identity(action="update") / update_identity: write an agent's exe.md. Identity > behavior. behavior(action="store") / store_behavior: record a correction or pattern (Layer 2 expertise). behavior(action="list") / list_behaviors: view active behaviors. behavior(action="deactivate") / deactivate_behavior: soft-delete a stale behavior. support(action="create_bug") / create_bug_report: file a bug report to AskExe (title, description, severity). support(action="create_feature") / create_feature_request: file a feature request. support(action="health") / support_health: check support server readiness. support(action="triage_bug"): triage a bug (id, triage_notes). AskExe-internal only. CRITICAL: triage uses triage_notes NOT notes.`
1569
+ content: `identity(action="get") / get_identity: read an agent's exe.md (Layer 1 identity). identity(action="update") / update_identity: write an agent's exe.md. Identity > behavior. behavior(action="store") / store_behavior: record a correction or pattern (Layer 2 expertise). behavior(action="list") / list_behaviors: view active behaviors. behavior(action="deactivate") / deactivate_behavior: soft-delete a stale behavior. support(action="create_bug"): file a bug report (title, description, severity p0-p3). Auto-delivers to AskExe. support(action="create_feature"): file a feature request (title, description, use_case). support(action="list_my_bugs"): check status of YOUR filed bug reports \u2014 see which are open, triaged, or fixed with version number. support(action="list_my_features"): check status of YOUR filed feature requests \u2014 see which are planned, shipped, or closed. support(action="health"): verify support server is reachable. When a bug you filed shows status='fixed' with a fixed_version, update exe-os to that version to get the fix. support(action="triage_bug"): AskExe-internal only. CRITICAL: triage uses triage_notes NOT notes.`
1564
1570
  },
1565
1571
  {
1566
1572
  title: "MCP tools \u2014 communication and messaging",
@@ -1756,7 +1756,15 @@ function getClient() {
1756
1756
  if (!_resilientClient) {
1757
1757
  return _adapterClient;
1758
1758
  }
1759
- return _resilientClient;
1759
+ if (process.env.EXE_DB_READONLY === "1") {
1760
+ return _resilientClient;
1761
+ }
1762
+ process.stderr.write(
1763
+ "[database] ERROR: Daemon is not running \u2014 refusing direct SQLite write access.\n[database] Direct writes bypass the single-writer gate and corrupt FTS5 indexes.\n[database] Restart the daemon: kill $(cat ~/.exe-os/exed.pid) && exe-os update\n[database] Or set EXE_DB_READONLY=1 if you only need read access.\n"
1764
+ );
1765
+ throw new Error(
1766
+ "Daemon not running. Direct SQLite writes are blocked to prevent FTS5 corruption. Restart daemon or set EXE_DB_READONLY=1 for read-only access."
1767
+ );
1760
1768
  }
1761
1769
  async function initDaemonClient() {
1762
1770
  if (process.env.DATABASE_URL && process.env.EXE_USE_POSTGRES === "1") return;
@@ -3777,7 +3785,7 @@ var init_platform_procedures = __esm({
3777
3785
  title: "Bug report status check \u2014 surface available fixes on boot",
3778
3786
  domain: "support",
3779
3787
  priority: "p1",
3780
- content: "Once per session (COO boot only, never repeat), call list_my_bug_reports to check if any previously filed bug reports have been fixed by AskExe. If any report has status 'fixed' with a fixed_version, surface it to the founder immediately: '\u{1F527} N bug fix(es) available \u2014 run exe-os update to get version X.Y.Z'. This is a one-time check at boot, not a recurring poll. If no reports exist or none are fixed, skip silently. If the MCP tool is unavailable or the network call fails, skip silently \u2014 this is informational, not blocking."
3788
+ content: "Once per session (COO boot only, never repeat), call support(action='list_my_bugs') to check if any previously filed bug reports have been fixed by AskExe. If any report has status 'closed' with a fixed_version, surface it to the founder immediately: '\u{1F527} N bug fix(es) available \u2014 run exe-os update to get version X.Y.Z'. You can also file new bugs with support(action='create_bug') and check status anytime with support(action='list_my_bugs'). This boot check is one-time, not a recurring poll. If the tool is unavailable, skip silently."
3781
3789
  },
3782
3790
  {
3783
3791
  title: "Feature request triage \u2014 upstream feature vs local customization",
@@ -3789,7 +3797,7 @@ var init_platform_procedures = __esm({
3789
3797
  title: "Feature request status check \u2014 surface shipped features on boot",
3790
3798
  domain: "support",
3791
3799
  priority: "p1",
3792
- content: "Once per session (COO boot only, never repeat), call list_my_feature_requests to check if any previously filed feature requests have been shipped by AskExe. If any request has status 'shipped' with a shipped_version, surface it to the founder immediately: '\u{1F680} N feature(s) shipped \u2014 run exe-os update to get version X.Y.Z'. This is a one-time check at boot, not a recurring poll. If no requests exist or none are shipped, skip silently. If the MCP tool is unavailable or the network call fails, skip silently \u2014 this is informational, not blocking."
3800
+ content: "Once per session (COO boot only, never repeat), call support(action='list_my_features') to check if any previously filed feature requests have been shipped by AskExe. If any request has status 'shipped' with a shipped_version, surface it to the founder immediately: '\u{1F680} N feature(s) shipped \u2014 run exe-os update to get version X.Y.Z'. You can also file new requests with support(action='create_feature') and check status anytime with support(action='list_my_features'). This boot check is one-time, not a recurring poll. If the tool is unavailable, skip silently."
3793
3801
  },
3794
3802
  // --- Tool guidance ---
3795
3803
  {
@@ -3825,6 +3833,18 @@ var init_platform_procedures = __esm({
3825
3833
  priority: "p0",
3826
3834
  content: "exe-os has TWO version numbers that move independently. This is normal \u2014 do not treat a mismatch as an error. (1) CLI version (e.g. 0.9.89, 0.9.90) \u2014 the npm package installed locally. Updates frequently: bug fixes, new MCP tools, platform procedures, search improvements, client-side changes. Update with `npm install -g @askexenow/exe-os@latest`. (2) Stack version (e.g. 0.9.7, 0.9.8) \u2014 the Docker images on the VPS. Updates less frequently: only when server-side daemon, gateway, wiki, or CRM images need rebuilding. Update with `exe-os stack-update --target <version> --yes`. The CLI version will almost always be higher than the stack version. A CLI at 0.9.90 with a stack at 0.9.8 is perfectly normal \u2014 it means the CLI got 12 patches since the last Docker image rebuild. Only update the stack when: (a) the boot brief surfaces a fix that mentions 'stack update required', (b) a new stack manifest version is bundled in the CLI (`exe-os stack-update --check` shows pending changes), or (c) AskExe support explicitly tells you to. Do NOT attempt to make the numbers match \u2014 they are separate tracks."
3827
3835
  },
3836
+ {
3837
+ title: "Update lifecycle \u2014 what each command does and what picks up new code",
3838
+ domain: "operations",
3839
+ priority: "p0",
3840
+ content: "Three update paths exist \u2014 know which does what. (1) `npm install -g @askexenow/exe-os@latest` \u2014 customer update. Replaces all dist/ files. postinstall copies slash commands AND restarts the daemon automatically. MCP server picks up new code on next `/mcp` reconnect or new Claude Code session. Hooks pick up new code on next session (they spawn fresh processes). (2) `exe-os update` \u2014 interactive update command. Runs `npm install -g` then `install --global` which restarts daemon, regenerates session wrappers, normalizes roster, registers Codex hooks. This is the recommended customer path. (3) `npm run deploy` \u2014 dev-only (COO/CTO on main branch). Builds, installs globally, runs `install --global`, restarts daemon. Never run from a worktree. NEVER confuse `exe-os setup` (first-time setup wizard for new installs) with `exe-os update` (update existing install). Setup creates encryption keys, configures cloud, runs first sync. Update just replaces code and restarts services. They are completely different commands."
3841
+ },
3842
+ {
3843
+ title: "First install \u2014 setup wizard and license activation",
3844
+ domain: "operations",
3845
+ priority: "p1",
3846
+ content: "Fresh install: `npm install -g @askexenow/exe-os` then run `exe` to start the setup wizard. The wizard prompts for: encryption passphrase (creates master key), license key (exe_sk_* from AskExe team), COO name, and optional team members. No license key = free tier (1 employee, 5K memories). After setup: hooks install automatically, MCP server registers in ~/.claude.json, daemon starts. Verify health: run `exe-os healthcheck` or use mcp_ping() tool."
3847
+ },
3828
3848
  // --- Operations ---
3829
3849
  {
3830
3850
  title: "Managers must supervise deployed workers",
@@ -3875,12 +3895,6 @@ var init_platform_procedures = __esm({
3875
3895
  priority: "p0",
3876
3896
  content: "When you dispatch work, you OWN the review. Check list_tasks(status='needs_review') on EVERY prompt \u2014 don't wait for intercom nudges (they're unreliable). When a task shows needs_review: (1) read the deliverable (git diff in worktree, exe/output/ files, or task result summary), (2) verify it works (tsc, build, run), (3) close_task if good or create a fix task if not. Reviews sitting >30 minutes is a pipeline stall. The whole chain: worker calls update_task(done) \u2192 system flags needs_review \u2192 manager pulls and verifies \u2192 close_task \u2192 COO reviews manager's work \u2192 merge to main. Every level actively pulls \u2014 nobody waits."
3877
3897
  },
3878
- {
3879
- title: "Bug fix lifecycle \u2014 triage upstream after every verified fix so customers see the status",
3880
- domain: "workflow",
3881
- priority: "p0",
3882
- content: "When a bug from support(action='list_bugs') is fixed and verified, the reviewer MUST triage it upstream: support(action='triage_bug', id='<bug-id>', notes='<what was fixed>', fixed_version='<version>', linked_commit='<hash>'). This closes the bug in the customer's view \u2014 their COO checks list_my_bugs and sees status change from open \u2192 closed with the fix version. Without triage, customers see 'open' forever even after the fix ships. Same for feature requests: support(action='triage_feature', ..., shipped_version='<version>'). Triage is part of the review gate \u2014 a fix is not done until the upstream report is closed."
3883
- },
3884
3898
  {
3885
3899
  title: "Intercom is a speedup, not delivery \u2014 DB is the source of truth",
3886
3900
  domain: "architecture",
@@ -3936,7 +3950,7 @@ var init_platform_procedures = __esm({
3936
3950
  title: "MCP tools \u2014 identity, behavior, and support",
3937
3951
  domain: "tool-use",
3938
3952
  priority: "p1",
3939
- content: `identity(action="get") / get_identity: read an agent's exe.md (Layer 1 identity). identity(action="update") / update_identity: write an agent's exe.md. Identity > behavior. behavior(action="store") / store_behavior: record a correction or pattern (Layer 2 expertise). behavior(action="list") / list_behaviors: view active behaviors. behavior(action="deactivate") / deactivate_behavior: soft-delete a stale behavior. support(action="create_bug") / create_bug_report: file a bug report to AskExe (title, description, severity). support(action="create_feature") / create_feature_request: file a feature request. support(action="health") / support_health: check support server readiness. support(action="triage_bug"): triage a bug (id, triage_notes). AskExe-internal only. CRITICAL: triage uses triage_notes NOT notes.`
3953
+ content: `identity(action="get") / get_identity: read an agent's exe.md (Layer 1 identity). identity(action="update") / update_identity: write an agent's exe.md. Identity > behavior. behavior(action="store") / store_behavior: record a correction or pattern (Layer 2 expertise). behavior(action="list") / list_behaviors: view active behaviors. behavior(action="deactivate") / deactivate_behavior: soft-delete a stale behavior. support(action="create_bug"): file a bug report (title, description, severity p0-p3). Auto-delivers to AskExe. support(action="create_feature"): file a feature request (title, description, use_case). support(action="list_my_bugs"): check status of YOUR filed bug reports \u2014 see which are open, triaged, or fixed with version number. support(action="list_my_features"): check status of YOUR filed feature requests \u2014 see which are planned, shipped, or closed. support(action="health"): verify support server is reachable. When a bug you filed shows status='fixed' with a fixed_version, update exe-os to that version to get the fix. support(action="triage_bug"): AskExe-internal only. CRITICAL: triage uses triage_notes NOT notes.`
3940
3954
  },
3941
3955
  {
3942
3956
  title: "MCP tools \u2014 communication and messaging",
@@ -1908,7 +1908,15 @@ function getClient() {
1908
1908
  if (!_resilientClient) {
1909
1909
  return _adapterClient;
1910
1910
  }
1911
- return _resilientClient;
1911
+ if (process.env.EXE_DB_READONLY === "1") {
1912
+ return _resilientClient;
1913
+ }
1914
+ process.stderr.write(
1915
+ "[database] ERROR: Daemon is not running \u2014 refusing direct SQLite write access.\n[database] Direct writes bypass the single-writer gate and corrupt FTS5 indexes.\n[database] Restart the daemon: kill $(cat ~/.exe-os/exed.pid) && exe-os update\n[database] Or set EXE_DB_READONLY=1 if you only need read access.\n"
1916
+ );
1917
+ throw new Error(
1918
+ "Daemon not running. Direct SQLite writes are blocked to prevent FTS5 corruption. Restart daemon or set EXE_DB_READONLY=1 for read-only access."
1919
+ );
1912
1920
  }
1913
1921
  async function initDaemonClient() {
1914
1922
  if (process.env.DATABASE_URL && process.env.EXE_USE_POSTGRES === "1") return;
@@ -3465,7 +3473,7 @@ var init_platform_procedures = __esm({
3465
3473
  title: "Bug report status check \u2014 surface available fixes on boot",
3466
3474
  domain: "support",
3467
3475
  priority: "p1",
3468
- content: "Once per session (COO boot only, never repeat), call list_my_bug_reports to check if any previously filed bug reports have been fixed by AskExe. If any report has status 'fixed' with a fixed_version, surface it to the founder immediately: '\u{1F527} N bug fix(es) available \u2014 run exe-os update to get version X.Y.Z'. This is a one-time check at boot, not a recurring poll. If no reports exist or none are fixed, skip silently. If the MCP tool is unavailable or the network call fails, skip silently \u2014 this is informational, not blocking."
3476
+ content: "Once per session (COO boot only, never repeat), call support(action='list_my_bugs') to check if any previously filed bug reports have been fixed by AskExe. If any report has status 'closed' with a fixed_version, surface it to the founder immediately: '\u{1F527} N bug fix(es) available \u2014 run exe-os update to get version X.Y.Z'. You can also file new bugs with support(action='create_bug') and check status anytime with support(action='list_my_bugs'). This boot check is one-time, not a recurring poll. If the tool is unavailable, skip silently."
3469
3477
  },
3470
3478
  {
3471
3479
  title: "Feature request triage \u2014 upstream feature vs local customization",
@@ -3477,7 +3485,7 @@ var init_platform_procedures = __esm({
3477
3485
  title: "Feature request status check \u2014 surface shipped features on boot",
3478
3486
  domain: "support",
3479
3487
  priority: "p1",
3480
- content: "Once per session (COO boot only, never repeat), call list_my_feature_requests to check if any previously filed feature requests have been shipped by AskExe. If any request has status 'shipped' with a shipped_version, surface it to the founder immediately: '\u{1F680} N feature(s) shipped \u2014 run exe-os update to get version X.Y.Z'. This is a one-time check at boot, not a recurring poll. If no requests exist or none are shipped, skip silently. If the MCP tool is unavailable or the network call fails, skip silently \u2014 this is informational, not blocking."
3488
+ content: "Once per session (COO boot only, never repeat), call support(action='list_my_features') to check if any previously filed feature requests have been shipped by AskExe. If any request has status 'shipped' with a shipped_version, surface it to the founder immediately: '\u{1F680} N feature(s) shipped \u2014 run exe-os update to get version X.Y.Z'. You can also file new requests with support(action='create_feature') and check status anytime with support(action='list_my_features'). This boot check is one-time, not a recurring poll. If the tool is unavailable, skip silently."
3481
3489
  },
3482
3490
  // --- Tool guidance ---
3483
3491
  {
@@ -3513,6 +3521,18 @@ var init_platform_procedures = __esm({
3513
3521
  priority: "p0",
3514
3522
  content: "exe-os has TWO version numbers that move independently. This is normal \u2014 do not treat a mismatch as an error. (1) CLI version (e.g. 0.9.89, 0.9.90) \u2014 the npm package installed locally. Updates frequently: bug fixes, new MCP tools, platform procedures, search improvements, client-side changes. Update with `npm install -g @askexenow/exe-os@latest`. (2) Stack version (e.g. 0.9.7, 0.9.8) \u2014 the Docker images on the VPS. Updates less frequently: only when server-side daemon, gateway, wiki, or CRM images need rebuilding. Update with `exe-os stack-update --target <version> --yes`. The CLI version will almost always be higher than the stack version. A CLI at 0.9.90 with a stack at 0.9.8 is perfectly normal \u2014 it means the CLI got 12 patches since the last Docker image rebuild. Only update the stack when: (a) the boot brief surfaces a fix that mentions 'stack update required', (b) a new stack manifest version is bundled in the CLI (`exe-os stack-update --check` shows pending changes), or (c) AskExe support explicitly tells you to. Do NOT attempt to make the numbers match \u2014 they are separate tracks."
3515
3523
  },
3524
+ {
3525
+ title: "Update lifecycle \u2014 what each command does and what picks up new code",
3526
+ domain: "operations",
3527
+ priority: "p0",
3528
+ content: "Three update paths exist \u2014 know which does what. (1) `npm install -g @askexenow/exe-os@latest` \u2014 customer update. Replaces all dist/ files. postinstall copies slash commands AND restarts the daemon automatically. MCP server picks up new code on next `/mcp` reconnect or new Claude Code session. Hooks pick up new code on next session (they spawn fresh processes). (2) `exe-os update` \u2014 interactive update command. Runs `npm install -g` then `install --global` which restarts daemon, regenerates session wrappers, normalizes roster, registers Codex hooks. This is the recommended customer path. (3) `npm run deploy` \u2014 dev-only (COO/CTO on main branch). Builds, installs globally, runs `install --global`, restarts daemon. Never run from a worktree. NEVER confuse `exe-os setup` (first-time setup wizard for new installs) with `exe-os update` (update existing install). Setup creates encryption keys, configures cloud, runs first sync. Update just replaces code and restarts services. They are completely different commands."
3529
+ },
3530
+ {
3531
+ title: "First install \u2014 setup wizard and license activation",
3532
+ domain: "operations",
3533
+ priority: "p1",
3534
+ content: "Fresh install: `npm install -g @askexenow/exe-os` then run `exe` to start the setup wizard. The wizard prompts for: encryption passphrase (creates master key), license key (exe_sk_* from AskExe team), COO name, and optional team members. No license key = free tier (1 employee, 5K memories). After setup: hooks install automatically, MCP server registers in ~/.claude.json, daemon starts. Verify health: run `exe-os healthcheck` or use mcp_ping() tool."
3535
+ },
3516
3536
  // --- Operations ---
3517
3537
  {
3518
3538
  title: "Managers must supervise deployed workers",
@@ -3563,12 +3583,6 @@ var init_platform_procedures = __esm({
3563
3583
  priority: "p0",
3564
3584
  content: "When you dispatch work, you OWN the review. Check list_tasks(status='needs_review') on EVERY prompt \u2014 don't wait for intercom nudges (they're unreliable). When a task shows needs_review: (1) read the deliverable (git diff in worktree, exe/output/ files, or task result summary), (2) verify it works (tsc, build, run), (3) close_task if good or create a fix task if not. Reviews sitting >30 minutes is a pipeline stall. The whole chain: worker calls update_task(done) \u2192 system flags needs_review \u2192 manager pulls and verifies \u2192 close_task \u2192 COO reviews manager's work \u2192 merge to main. Every level actively pulls \u2014 nobody waits."
3565
3585
  },
3566
- {
3567
- title: "Bug fix lifecycle \u2014 triage upstream after every verified fix so customers see the status",
3568
- domain: "workflow",
3569
- priority: "p0",
3570
- content: "When a bug from support(action='list_bugs') is fixed and verified, the reviewer MUST triage it upstream: support(action='triage_bug', id='<bug-id>', notes='<what was fixed>', fixed_version='<version>', linked_commit='<hash>'). This closes the bug in the customer's view \u2014 their COO checks list_my_bugs and sees status change from open \u2192 closed with the fix version. Without triage, customers see 'open' forever even after the fix ships. Same for feature requests: support(action='triage_feature', ..., shipped_version='<version>'). Triage is part of the review gate \u2014 a fix is not done until the upstream report is closed."
3571
- },
3572
3586
  {
3573
3587
  title: "Intercom is a speedup, not delivery \u2014 DB is the source of truth",
3574
3588
  domain: "architecture",
@@ -3624,7 +3638,7 @@ var init_platform_procedures = __esm({
3624
3638
  title: "MCP tools \u2014 identity, behavior, and support",
3625
3639
  domain: "tool-use",
3626
3640
  priority: "p1",
3627
- content: `identity(action="get") / get_identity: read an agent's exe.md (Layer 1 identity). identity(action="update") / update_identity: write an agent's exe.md. Identity > behavior. behavior(action="store") / store_behavior: record a correction or pattern (Layer 2 expertise). behavior(action="list") / list_behaviors: view active behaviors. behavior(action="deactivate") / deactivate_behavior: soft-delete a stale behavior. support(action="create_bug") / create_bug_report: file a bug report to AskExe (title, description, severity). support(action="create_feature") / create_feature_request: file a feature request. support(action="health") / support_health: check support server readiness. support(action="triage_bug"): triage a bug (id, triage_notes). AskExe-internal only. CRITICAL: triage uses triage_notes NOT notes.`
3641
+ content: `identity(action="get") / get_identity: read an agent's exe.md (Layer 1 identity). identity(action="update") / update_identity: write an agent's exe.md. Identity > behavior. behavior(action="store") / store_behavior: record a correction or pattern (Layer 2 expertise). behavior(action="list") / list_behaviors: view active behaviors. behavior(action="deactivate") / deactivate_behavior: soft-delete a stale behavior. support(action="create_bug"): file a bug report (title, description, severity p0-p3). Auto-delivers to AskExe. support(action="create_feature"): file a feature request (title, description, use_case). support(action="list_my_bugs"): check status of YOUR filed bug reports \u2014 see which are open, triaged, or fixed with version number. support(action="list_my_features"): check status of YOUR filed feature requests \u2014 see which are planned, shipped, or closed. support(action="health"): verify support server is reachable. When a bug you filed shows status='fixed' with a fixed_version, update exe-os to that version to get the fix. support(action="triage_bug"): AskExe-internal only. CRITICAL: triage uses triage_notes NOT notes.`
3628
3642
  },
3629
3643
  {
3630
3644
  title: "MCP tools \u2014 communication and messaging",
@@ -338,7 +338,7 @@ var init_platform_procedures = __esm({
338
338
  title: "Bug report status check \u2014 surface available fixes on boot",
339
339
  domain: "support",
340
340
  priority: "p1",
341
- content: "Once per session (COO boot only, never repeat), call list_my_bug_reports to check if any previously filed bug reports have been fixed by AskExe. If any report has status 'fixed' with a fixed_version, surface it to the founder immediately: '\u{1F527} N bug fix(es) available \u2014 run exe-os update to get version X.Y.Z'. This is a one-time check at boot, not a recurring poll. If no reports exist or none are fixed, skip silently. If the MCP tool is unavailable or the network call fails, skip silently \u2014 this is informational, not blocking."
341
+ content: "Once per session (COO boot only, never repeat), call support(action='list_my_bugs') to check if any previously filed bug reports have been fixed by AskExe. If any report has status 'closed' with a fixed_version, surface it to the founder immediately: '\u{1F527} N bug fix(es) available \u2014 run exe-os update to get version X.Y.Z'. You can also file new bugs with support(action='create_bug') and check status anytime with support(action='list_my_bugs'). This boot check is one-time, not a recurring poll. If the tool is unavailable, skip silently."
342
342
  },
343
343
  {
344
344
  title: "Feature request triage \u2014 upstream feature vs local customization",
@@ -350,7 +350,7 @@ var init_platform_procedures = __esm({
350
350
  title: "Feature request status check \u2014 surface shipped features on boot",
351
351
  domain: "support",
352
352
  priority: "p1",
353
- content: "Once per session (COO boot only, never repeat), call list_my_feature_requests to check if any previously filed feature requests have been shipped by AskExe. If any request has status 'shipped' with a shipped_version, surface it to the founder immediately: '\u{1F680} N feature(s) shipped \u2014 run exe-os update to get version X.Y.Z'. This is a one-time check at boot, not a recurring poll. If no requests exist or none are shipped, skip silently. If the MCP tool is unavailable or the network call fails, skip silently \u2014 this is informational, not blocking."
353
+ content: "Once per session (COO boot only, never repeat), call support(action='list_my_features') to check if any previously filed feature requests have been shipped by AskExe. If any request has status 'shipped' with a shipped_version, surface it to the founder immediately: '\u{1F680} N feature(s) shipped \u2014 run exe-os update to get version X.Y.Z'. You can also file new requests with support(action='create_feature') and check status anytime with support(action='list_my_features'). This boot check is one-time, not a recurring poll. If the tool is unavailable, skip silently."
354
354
  },
355
355
  // --- Tool guidance ---
356
356
  {
@@ -386,6 +386,18 @@ var init_platform_procedures = __esm({
386
386
  priority: "p0",
387
387
  content: "exe-os has TWO version numbers that move independently. This is normal \u2014 do not treat a mismatch as an error. (1) CLI version (e.g. 0.9.89, 0.9.90) \u2014 the npm package installed locally. Updates frequently: bug fixes, new MCP tools, platform procedures, search improvements, client-side changes. Update with `npm install -g @askexenow/exe-os@latest`. (2) Stack version (e.g. 0.9.7, 0.9.8) \u2014 the Docker images on the VPS. Updates less frequently: only when server-side daemon, gateway, wiki, or CRM images need rebuilding. Update with `exe-os stack-update --target <version> --yes`. The CLI version will almost always be higher than the stack version. A CLI at 0.9.90 with a stack at 0.9.8 is perfectly normal \u2014 it means the CLI got 12 patches since the last Docker image rebuild. Only update the stack when: (a) the boot brief surfaces a fix that mentions 'stack update required', (b) a new stack manifest version is bundled in the CLI (`exe-os stack-update --check` shows pending changes), or (c) AskExe support explicitly tells you to. Do NOT attempt to make the numbers match \u2014 they are separate tracks."
388
388
  },
389
+ {
390
+ title: "Update lifecycle \u2014 what each command does and what picks up new code",
391
+ domain: "operations",
392
+ priority: "p0",
393
+ content: "Three update paths exist \u2014 know which does what. (1) `npm install -g @askexenow/exe-os@latest` \u2014 customer update. Replaces all dist/ files. postinstall copies slash commands AND restarts the daemon automatically. MCP server picks up new code on next `/mcp` reconnect or new Claude Code session. Hooks pick up new code on next session (they spawn fresh processes). (2) `exe-os update` \u2014 interactive update command. Runs `npm install -g` then `install --global` which restarts daemon, regenerates session wrappers, normalizes roster, registers Codex hooks. This is the recommended customer path. (3) `npm run deploy` \u2014 dev-only (COO/CTO on main branch). Builds, installs globally, runs `install --global`, restarts daemon. Never run from a worktree. NEVER confuse `exe-os setup` (first-time setup wizard for new installs) with `exe-os update` (update existing install). Setup creates encryption keys, configures cloud, runs first sync. Update just replaces code and restarts services. They are completely different commands."
394
+ },
395
+ {
396
+ title: "First install \u2014 setup wizard and license activation",
397
+ domain: "operations",
398
+ priority: "p1",
399
+ content: "Fresh install: `npm install -g @askexenow/exe-os` then run `exe` to start the setup wizard. The wizard prompts for: encryption passphrase (creates master key), license key (exe_sk_* from AskExe team), COO name, and optional team members. No license key = free tier (1 employee, 5K memories). After setup: hooks install automatically, MCP server registers in ~/.claude.json, daemon starts. Verify health: run `exe-os healthcheck` or use mcp_ping() tool."
400
+ },
389
401
  // --- Operations ---
390
402
  {
391
403
  title: "Managers must supervise deployed workers",
@@ -436,12 +448,6 @@ var init_platform_procedures = __esm({
436
448
  priority: "p0",
437
449
  content: "When you dispatch work, you OWN the review. Check list_tasks(status='needs_review') on EVERY prompt \u2014 don't wait for intercom nudges (they're unreliable). When a task shows needs_review: (1) read the deliverable (git diff in worktree, exe/output/ files, or task result summary), (2) verify it works (tsc, build, run), (3) close_task if good or create a fix task if not. Reviews sitting >30 minutes is a pipeline stall. The whole chain: worker calls update_task(done) \u2192 system flags needs_review \u2192 manager pulls and verifies \u2192 close_task \u2192 COO reviews manager's work \u2192 merge to main. Every level actively pulls \u2014 nobody waits."
438
450
  },
439
- {
440
- title: "Bug fix lifecycle \u2014 triage upstream after every verified fix so customers see the status",
441
- domain: "workflow",
442
- priority: "p0",
443
- content: "When a bug from support(action='list_bugs') is fixed and verified, the reviewer MUST triage it upstream: support(action='triage_bug', id='<bug-id>', notes='<what was fixed>', fixed_version='<version>', linked_commit='<hash>'). This closes the bug in the customer's view \u2014 their COO checks list_my_bugs and sees status change from open \u2192 closed with the fix version. Without triage, customers see 'open' forever even after the fix ships. Same for feature requests: support(action='triage_feature', ..., shipped_version='<version>'). Triage is part of the review gate \u2014 a fix is not done until the upstream report is closed."
444
- },
445
451
  {
446
452
  title: "Intercom is a speedup, not delivery \u2014 DB is the source of truth",
447
453
  domain: "architecture",
@@ -497,7 +503,7 @@ var init_platform_procedures = __esm({
497
503
  title: "MCP tools \u2014 identity, behavior, and support",
498
504
  domain: "tool-use",
499
505
  priority: "p1",
500
- content: `identity(action="get") / get_identity: read an agent's exe.md (Layer 1 identity). identity(action="update") / update_identity: write an agent's exe.md. Identity > behavior. behavior(action="store") / store_behavior: record a correction or pattern (Layer 2 expertise). behavior(action="list") / list_behaviors: view active behaviors. behavior(action="deactivate") / deactivate_behavior: soft-delete a stale behavior. support(action="create_bug") / create_bug_report: file a bug report to AskExe (title, description, severity). support(action="create_feature") / create_feature_request: file a feature request. support(action="health") / support_health: check support server readiness. support(action="triage_bug"): triage a bug (id, triage_notes). AskExe-internal only. CRITICAL: triage uses triage_notes NOT notes.`
506
+ content: `identity(action="get") / get_identity: read an agent's exe.md (Layer 1 identity). identity(action="update") / update_identity: write an agent's exe.md. Identity > behavior. behavior(action="store") / store_behavior: record a correction or pattern (Layer 2 expertise). behavior(action="list") / list_behaviors: view active behaviors. behavior(action="deactivate") / deactivate_behavior: soft-delete a stale behavior. support(action="create_bug"): file a bug report (title, description, severity p0-p3). Auto-delivers to AskExe. support(action="create_feature"): file a feature request (title, description, use_case). support(action="list_my_bugs"): check status of YOUR filed bug reports \u2014 see which are open, triaged, or fixed with version number. support(action="list_my_features"): check status of YOUR filed feature requests \u2014 see which are planned, shipped, or closed. support(action="health"): verify support server is reachable. When a bug you filed shows status='fixed' with a fixed_version, update exe-os to that version to get the fix. support(action="triage_bug"): AskExe-internal only. CRITICAL: triage uses triage_notes NOT notes.`
501
507
  },
502
508
  {
503
509
  title: "MCP tools \u2014 communication and messaging",