blq-cli 0.10.0__tar.gz → 0.10.2__tar.gz

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 (180) hide show
  1. {blq_cli-0.10.0 → blq_cli-0.10.2}/CLAUDE.md +2 -0
  2. {blq_cli-0.10.0 → blq_cli-0.10.2}/PKG-INFO +1 -1
  3. {blq_cli-0.10.0 → blq_cli-0.10.2}/docs/commands/index.md +1 -0
  4. blq_cli-0.10.2/docs/plans/roadmap-to-1.0.md +135 -0
  5. {blq_cli-0.10.0 → blq_cli-0.10.2}/docs/sandbox.md +35 -1
  6. blq_cli-0.10.2/docs/superpowers/plans/2026-03-29-annotators-and-tighten.md +1133 -0
  7. {blq_cli-0.10.0 → blq_cli-0.10.2}/pyproject.toml +4 -1
  8. {blq_cli-0.10.0 → blq_cli-0.10.2}/src/blq/cli.py +11 -0
  9. {blq_cli-0.10.0 → blq_cli-0.10.2}/src/blq/commands/execution.py +31 -0
  10. {blq_cli-0.10.0 → blq_cli-0.10.2}/src/blq/commands/sandbox_cmd.py +112 -0
  11. blq_cli-0.10.2/src/blq/ext/annotator.py +226 -0
  12. blq_cli-0.10.2/src/blq_sandbox/source_annotator.py +219 -0
  13. blq_cli-0.10.2/src/blq_sandbox/tighten.py +90 -0
  14. blq_cli-0.10.2/src/blq_sandbox/violations.py +82 -0
  15. blq_cli-0.10.2/tests/test_annotator.py +263 -0
  16. blq_cli-0.10.2/tests/test_sandbox_tighten.py +73 -0
  17. blq_cli-0.10.2/tests/test_sandbox_violations.py +110 -0
  18. blq_cli-0.10.2/tests/test_source_annotator.py +184 -0
  19. {blq_cli-0.10.0 → blq_cli-0.10.2}/.claude/hooks/blq-suggest.sh +0 -0
  20. {blq_cli-0.10.0 → blq_cli-0.10.2}/.github/workflows/ci.yml +0 -0
  21. {blq_cli-0.10.0 → blq_cli-0.10.2}/.github/workflows/docs.yml +0 -0
  22. {blq_cli-0.10.0 → blq_cli-0.10.2}/.github/workflows/publish.yml +0 -0
  23. {blq_cli-0.10.0 → blq_cli-0.10.2}/.gitignore +0 -0
  24. {blq_cli-0.10.0 → blq_cli-0.10.2}/.mcp.json +0 -0
  25. {blq_cli-0.10.0 → blq_cli-0.10.2}/.readthedocs.yml +0 -0
  26. {blq_cli-0.10.0 → blq_cli-0.10.2}/AGENT.md +0 -0
  27. {blq_cli-0.10.0 → blq_cli-0.10.2}/AGENTS.md +0 -0
  28. {blq_cli-0.10.0 → blq_cli-0.10.2}/CONTRIBUTING.md +0 -0
  29. {blq_cli-0.10.0 → blq_cli-0.10.2}/README.md +0 -0
  30. {blq_cli-0.10.0 → blq_cli-0.10.2}/SKILL.md +0 -0
  31. {blq_cli-0.10.0 → blq_cli-0.10.2}/docs/commands/capture.md +0 -0
  32. {blq_cli-0.10.0 → blq_cli-0.10.2}/docs/commands/ci.md +0 -0
  33. {blq_cli-0.10.0 → blq_cli-0.10.2}/docs/commands/completions.md +0 -0
  34. {blq_cli-0.10.0 → blq_cli-0.10.2}/docs/commands/errors.md +0 -0
  35. {blq_cli-0.10.0 → blq_cli-0.10.2}/docs/commands/exec.md +0 -0
  36. {blq_cli-0.10.0 → blq_cli-0.10.2}/docs/commands/filter.md +0 -0
  37. {blq_cli-0.10.0 → blq_cli-0.10.2}/docs/commands/init.md +0 -0
  38. {blq_cli-0.10.0 → blq_cli-0.10.2}/docs/commands/maintenance.md +0 -0
  39. {blq_cli-0.10.0 → blq_cli-0.10.2}/docs/commands/query.md +0 -0
  40. {blq_cli-0.10.0 → blq_cli-0.10.2}/docs/commands/registry.md +0 -0
  41. {blq_cli-0.10.0 → blq_cli-0.10.2}/docs/commands/report.md +0 -0
  42. {blq_cli-0.10.0 → blq_cli-0.10.2}/docs/commands/run.md +0 -0
  43. {blq_cli-0.10.0 → blq_cli-0.10.2}/docs/commands/sql.md +0 -0
  44. {blq_cli-0.10.0 → blq_cli-0.10.2}/docs/commands/status.md +0 -0
  45. {blq_cli-0.10.0 → blq_cli-0.10.2}/docs/commands/sync.md +0 -0
  46. {blq_cli-0.10.0 → blq_cli-0.10.2}/docs/commands/watch.md +0 -0
  47. {blq_cli-0.10.0 → blq_cli-0.10.2}/docs/design/design-bird-migration.md +0 -0
  48. {blq_cli-0.10.0 → blq_cli-0.10.2}/docs/design/design-commands.md +0 -0
  49. {blq_cli-0.10.0 → blq_cli-0.10.2}/docs/design/design-config-command.md +0 -0
  50. {blq_cli-0.10.0 → blq_cli-0.10.2}/docs/design/design-extensions.md +0 -0
  51. {blq_cli-0.10.0 → blq_cli-0.10.2}/docs/design/design-git-integration.md +0 -0
  52. {blq_cli-0.10.0 → blq_cli-0.10.2}/docs/design/design-hooks-v2.md +0 -0
  53. {blq_cli-0.10.0 → blq_cli-0.10.2}/docs/design/design-live-inspection.md +0 -0
  54. {blq_cli-0.10.0 → blq_cli-0.10.2}/docs/design/design-parameterized-commands.md +0 -0
  55. {blq_cli-0.10.0 → blq_cli-0.10.2}/docs/design/design-run-args.md +0 -0
  56. {blq_cli-0.10.0 → blq_cli-0.10.2}/docs/design/design-sandbox-specs.md +0 -0
  57. {blq_cli-0.10.0 → blq_cli-0.10.2}/docs/design/design-sync.md +0 -0
  58. {blq_cli-0.10.0 → blq_cli-0.10.2}/docs/design/design-track-save.md +0 -0
  59. {blq_cli-0.10.0 → blq_cli-0.10.2}/docs/design/duck-hunt-v2-migration.md +0 -0
  60. {blq_cli-0.10.0 → blq_cli-0.10.2}/docs/design/duck-hunt-v3-migration.md +0 -0
  61. {blq_cli-0.10.0 → blq_cli-0.10.2}/docs/design/proposal-bird-v5.md +0 -0
  62. {blq_cli-0.10.0 → blq_cli-0.10.2}/docs/design/skill-inspect-enrichment.md +0 -0
  63. {blq_cli-0.10.0 → blq_cli-0.10.2}/docs/getting-started.md +0 -0
  64. {blq_cli-0.10.0 → blq_cli-0.10.2}/docs/index.md +0 -0
  65. {blq_cli-0.10.0 → blq_cli-0.10.2}/docs/integration.md +0 -0
  66. {blq_cli-0.10.0 → blq_cli-0.10.2}/docs/mcp.md +0 -0
  67. {blq_cli-0.10.0 → blq_cli-0.10.2}/docs/plans/explore-nsjail-python-wrapper.md +0 -0
  68. {blq_cli-0.10.0 → blq_cli-0.10.2}/docs/plans/explore-nsjail-spack-package.md +0 -0
  69. {blq_cli-0.10.0 → blq_cli-0.10.2}/docs/plans/patterns-integration-prompt.md +0 -0
  70. {blq_cli-0.10.0 → blq_cli-0.10.2}/docs/python-api.md +0 -0
  71. {blq_cli-0.10.0 → blq_cli-0.10.2}/docs/query-guide.md +0 -0
  72. {blq_cli-0.10.0 → blq_cli-0.10.2}/docs/requirements.txt +0 -0
  73. {blq_cli-0.10.0 → blq_cli-0.10.2}/docs/schema.md +0 -0
  74. {blq_cli-0.10.0 → blq_cli-0.10.2}/docs/superpowers/plans/2026-03-22-extension-system.md +0 -0
  75. {blq_cli-0.10.0 → blq_cli-0.10.2}/docs/superpowers/plans/2026-03-28-bwrap-engine.md +0 -0
  76. {blq_cli-0.10.0 → blq_cli-0.10.2}/docs/superpowers/plans/2026-03-28-command-locks.md +0 -0
  77. {blq_cli-0.10.0 → blq_cli-0.10.2}/docs/superpowers/plans/2026-03-29-strace-profiling.md +0 -0
  78. {blq_cli-0.10.0 → blq_cli-0.10.2}/docs/superpowers/specs/2026-03-22-extension-system-design.md +0 -0
  79. {blq_cli-0.10.0 → blq_cli-0.10.2}/experiments/agent-build-test.md +0 -0
  80. {blq_cli-0.10.0 → blq_cli-0.10.2}/mkdocs.yml +0 -0
  81. {blq_cli-0.10.0 → blq_cli-0.10.2}/src/blq/__init__.py +0 -0
  82. {blq_cli-0.10.0 → blq_cli-0.10.2}/src/blq/__main__.py +0 -0
  83. {blq_cli-0.10.0 → blq_cli-0.10.2}/src/blq/bird.py +0 -0
  84. {blq_cli-0.10.0 → blq_cli-0.10.2}/src/blq/bird_schema.sql +0 -0
  85. {blq_cli-0.10.0 → blq_cli-0.10.2}/src/blq/commands/README.md +0 -0
  86. {blq_cli-0.10.0 → blq_cli-0.10.2}/src/blq/commands/__init__.py +0 -0
  87. {blq_cli-0.10.0 → blq_cli-0.10.2}/src/blq/commands/ci_cmd.py +0 -0
  88. {blq_cli-0.10.0 → blq_cli-0.10.2}/src/blq/commands/clean_cmd.py +0 -0
  89. {blq_cli-0.10.0 → blq_cli-0.10.2}/src/blq/commands/config_cmd.py +0 -0
  90. {blq_cli-0.10.0 → blq_cli-0.10.2}/src/blq/commands/core.py +0 -0
  91. {blq_cli-0.10.0 → blq_cli-0.10.2}/src/blq/commands/events.py +0 -0
  92. {blq_cli-0.10.0 → blq_cli-0.10.2}/src/blq/commands/hooks_cmd.py +0 -0
  93. {blq_cli-0.10.0 → blq_cli-0.10.2}/src/blq/commands/hooks_gen.py +0 -0
  94. {blq_cli-0.10.0 → blq_cli-0.10.2}/src/blq/commands/init_cmd.py +0 -0
  95. {blq_cli-0.10.0 → blq_cli-0.10.2}/src/blq/commands/management.py +0 -0
  96. {blq_cli-0.10.0 → blq_cli-0.10.2}/src/blq/commands/management_cmd.py +0 -0
  97. {blq_cli-0.10.0 → blq_cli-0.10.2}/src/blq/commands/mcp_cmd.py +0 -0
  98. {blq_cli-0.10.0 → blq_cli-0.10.2}/src/blq/commands/migrate.py +0 -0
  99. {blq_cli-0.10.0 → blq_cli-0.10.2}/src/blq/commands/query_cmd.py +0 -0
  100. {blq_cli-0.10.0 → blq_cli-0.10.2}/src/blq/commands/record_cmd.py +0 -0
  101. {blq_cli-0.10.0 → blq_cli-0.10.2}/src/blq/commands/registry.py +0 -0
  102. {blq_cli-0.10.0 → blq_cli-0.10.2}/src/blq/commands/report_cmd.py +0 -0
  103. {blq_cli-0.10.0 → blq_cli-0.10.2}/src/blq/commands/serve_cmd.py +0 -0
  104. {blq_cli-0.10.0 → blq_cli-0.10.2}/src/blq/commands/sync_cmd.py +0 -0
  105. {blq_cli-0.10.0 → blq_cli-0.10.2}/src/blq/commands/watch_cmd.py +0 -0
  106. {blq_cli-0.10.0 → blq_cli-0.10.2}/src/blq/config_format.py +0 -0
  107. {blq_cli-0.10.0 → blq_cli-0.10.2}/src/blq/ext/__init__.py +0 -0
  108. {blq_cli-0.10.0 → blq_cli-0.10.2}/src/blq/ext/discovery.py +0 -0
  109. {blq_cli-0.10.0 → blq_cli-0.10.2}/src/blq/ext/local_executor.py +0 -0
  110. {blq_cli-0.10.0 → blq_cli-0.10.2}/src/blq/ext/pipeline.py +0 -0
  111. {blq_cli-0.10.0 → blq_cli-0.10.2}/src/blq/git.py +0 -0
  112. {blq_cli-0.10.0 → blq_cli-0.10.2}/src/blq/github.py +0 -0
  113. {blq_cli-0.10.0 → blq_cli-0.10.2}/src/blq/locks.py +0 -0
  114. {blq_cli-0.10.0 → blq_cli-0.10.2}/src/blq/output.py +0 -0
  115. {blq_cli-0.10.0 → blq_cli-0.10.2}/src/blq/query.py +0 -0
  116. {blq_cli-0.10.0 → blq_cli-0.10.2}/src/blq/schema.sql +0 -0
  117. {blq_cli-0.10.0 → blq_cli-0.10.2}/src/blq/serve.py +0 -0
  118. {blq_cli-0.10.0 → blq_cli-0.10.2}/src/blq/storage.py +0 -0
  119. {blq_cli-0.10.0 → blq_cli-0.10.2}/src/blq/templates/drone.yml.j2 +0 -0
  120. {blq_cli-0.10.0 → blq_cli-0.10.2}/src/blq/templates/git_hook.sh.j2 +0 -0
  121. {blq_cli-0.10.0 → blq_cli-0.10.2}/src/blq/templates/github_workflow.yml.j2 +0 -0
  122. {blq_cli-0.10.0 → blq_cli-0.10.2}/src/blq/templates/gitlab_ci.yml.j2 +0 -0
  123. {blq_cli-0.10.0 → blq_cli-0.10.2}/src/blq/templates/hook_script.sh.j2 +0 -0
  124. {blq_cli-0.10.0 → blq_cli-0.10.2}/src/blq/user_config.py +0 -0
  125. {blq_cli-0.10.0 → blq_cli-0.10.2}/src/blq_sandbox/__init__.py +0 -0
  126. {blq_cli-0.10.0 → blq_cli-0.10.2}/src/blq_sandbox/engines.py +0 -0
  127. {blq_cli-0.10.0 → blq_cli-0.10.2}/src/blq_sandbox/profile.py +0 -0
  128. {blq_cli-0.10.0 → blq_cli-0.10.2}/src/blq_sandbox/spec.py +0 -0
  129. {blq_cli-0.10.0 → blq_cli-0.10.2}/src/blq_sandbox/strace_parser.py +0 -0
  130. {blq_cli-0.10.0 → blq_cli-0.10.2}/src/blq_sandbox_bwrap/__init__.py +0 -0
  131. {blq_cli-0.10.0 → blq_cli-0.10.2}/src/blq_sandbox_bwrap/args.py +0 -0
  132. {blq_cli-0.10.0 → blq_cli-0.10.2}/src/blq_sandbox_systemd/__init__.py +0 -0
  133. {blq_cli-0.10.0 → blq_cli-0.10.2}/tests/__init__.py +0 -0
  134. {blq_cli-0.10.0 → blq_cli-0.10.2}/tests/conftest.py +0 -0
  135. {blq_cli-0.10.0 → blq_cli-0.10.2}/tests/sql/test_duck_hunt_v2_migration.sql +0 -0
  136. {blq_cli-0.10.0 → blq_cli-0.10.2}/tests/test_attempts_outcomes.py +0 -0
  137. {blq_cli-0.10.0 → blq_cli-0.10.2}/tests/test_auto_init.py +0 -0
  138. {blq_cli-0.10.0 → blq_cli-0.10.2}/tests/test_autoprune.py +0 -0
  139. {blq_cli-0.10.0 → blq_cli-0.10.2}/tests/test_bird.py +0 -0
  140. {blq_cli-0.10.0 → blq_cli-0.10.2}/tests/test_bwrap_args.py +0 -0
  141. {blq_cli-0.10.0 → blq_cli-0.10.2}/tests/test_bwrap_engine.py +0 -0
  142. {blq_cli-0.10.0 → blq_cli-0.10.2}/tests/test_ci.py +0 -0
  143. {blq_cli-0.10.0 → blq_cli-0.10.2}/tests/test_ci_generators.py +0 -0
  144. {blq_cli-0.10.0 → blq_cli-0.10.2}/tests/test_command_args.py +0 -0
  145. {blq_cli-0.10.0 → blq_cli-0.10.2}/tests/test_command_lock_field.py +0 -0
  146. {blq_cli-0.10.0 → blq_cli-0.10.2}/tests/test_core.py +0 -0
  147. {blq_cli-0.10.0 → blq_cli-0.10.2}/tests/test_execution_locks.py +0 -0
  148. {blq_cli-0.10.0 → blq_cli-0.10.2}/tests/test_exit_code_reason.py +0 -0
  149. {blq_cli-0.10.0 → blq_cli-0.10.2}/tests/test_ext_discovery.py +0 -0
  150. {blq_cli-0.10.0 → blq_cli-0.10.2}/tests/test_ext_integration.py +0 -0
  151. {blq_cli-0.10.0 → blq_cli-0.10.2}/tests/test_ext_local_executor.py +0 -0
  152. {blq_cli-0.10.0 → blq_cli-0.10.2}/tests/test_ext_pipeline.py +0 -0
  153. {blq_cli-0.10.0 → blq_cli-0.10.2}/tests/test_ext_types.py +0 -0
  154. {blq_cli-0.10.0 → blq_cli-0.10.2}/tests/test_git.py +0 -0
  155. {blq_cli-0.10.0 → blq_cli-0.10.2}/tests/test_hooks.py +0 -0
  156. {blq_cli-0.10.0 → blq_cli-0.10.2}/tests/test_hooks_gen.py +0 -0
  157. {blq_cli-0.10.0 → blq_cli-0.10.2}/tests/test_inspect.py +0 -0
  158. {blq_cli-0.10.0 → blq_cli-0.10.2}/tests/test_json_null_filter.py +0 -0
  159. {blq_cli-0.10.0 → blq_cli-0.10.2}/tests/test_locks.py +0 -0
  160. {blq_cli-0.10.0 → blq_cli-0.10.2}/tests/test_mcp_ci_tools.py +0 -0
  161. {blq_cli-0.10.0 → blq_cli-0.10.2}/tests/test_mcp_merge.py +0 -0
  162. {blq_cli-0.10.0 → blq_cli-0.10.2}/tests/test_mcp_server.py +0 -0
  163. {blq_cli-0.10.0 → blq_cli-0.10.2}/tests/test_phase1_structured_output.py +0 -0
  164. {blq_cli-0.10.0 → blq_cli-0.10.2}/tests/test_phase2_command_registry.py +0 -0
  165. {blq_cli-0.10.0 → blq_cli-0.10.2}/tests/test_query_api.py +0 -0
  166. {blq_cli-0.10.0 → blq_cli-0.10.2}/tests/test_query_filter.py +0 -0
  167. {blq_cli-0.10.0 → blq_cli-0.10.2}/tests/test_record_invocation.py +0 -0
  168. {blq_cli-0.10.0 → blq_cli-0.10.2}/tests/test_report.py +0 -0
  169. {blq_cli-0.10.0 → blq_cli-0.10.2}/tests/test_sandbox.py +0 -0
  170. {blq_cli-0.10.0 → blq_cli-0.10.2}/tests/test_sandbox_cmd.py +0 -0
  171. {blq_cli-0.10.0 → blq_cli-0.10.2}/tests/test_sandbox_events.py +0 -0
  172. {blq_cli-0.10.0 → blq_cli-0.10.2}/tests/test_sandbox_ext.py +0 -0
  173. {blq_cli-0.10.0 → blq_cli-0.10.2}/tests/test_sandbox_profile.py +0 -0
  174. {blq_cli-0.10.0 → blq_cli-0.10.2}/tests/test_sandbox_register.py +0 -0
  175. {blq_cli-0.10.0 → blq_cli-0.10.2}/tests/test_sandbox_systemd.py +0 -0
  176. {blq_cli-0.10.0 → blq_cli-0.10.2}/tests/test_storage.py +0 -0
  177. {blq_cli-0.10.0 → blq_cli-0.10.2}/tests/test_storage_prune.py +0 -0
  178. {blq_cli-0.10.0 → blq_cli-0.10.2}/tests/test_strace_parser.py +0 -0
  179. {blq_cli-0.10.0 → blq_cli-0.10.2}/tests/test_user_config.py +0 -0
  180. {blq_cli-0.10.0 → blq_cli-0.10.2}/tests/test_watch.py +0 -0
@@ -81,6 +81,8 @@ This is the initial scaffolding for `blq` (Build Log Query) - a CLI tool for cap
81
81
  - **Strace profiling** (`blq sandbox profile`) for sandbox spec discovery (Phase 0 Tier 2)
82
82
  - **Sandbox observability** (violation events, `blq sandbox` CLI, `sandbox_info` MCP tool)
83
83
  - **Sandbox registration** (`--sandbox` flag on register, auto-detect presets on init)
84
+ - **Annotator plugin system** for enriching run events (RunContext proxy, eager/deferred dispatch)
85
+ - **Sandbox spec tightening** (`blq sandbox tighten`) — auto-narrow from observed data
84
86
  - Full mypy type checking compliance
85
87
  - 730+ unit tests
86
88
  - Comprehensive documentation (README, docs/)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: blq-cli
3
- Version: 0.10.0
3
+ Version: 0.10.2
4
4
  Summary: Buidl Log Query - capture and query build/test logs with DuckDB
5
5
  Project-URL: Homepage, https://blq-cli.readthedocs.com/
6
6
  Project-URL: Repository, https://github.com/teaguesterling/blq-cli
@@ -79,6 +79,7 @@
79
79
  | `sandbox inspect <cmd>` | Show spec + grade for a command |
80
80
  | `sandbox suggest <cmd>` | Suggest spec from observed metrics |
81
81
  | `sandbox profile <cmd>` | Profile with strace to discover access patterns |
82
+ | `sandbox tighten <cmd>` | Auto-narrow spec from observed data |
82
83
 
83
84
  ## Utilities
84
85
 
@@ -0,0 +1,135 @@
1
+ # Roadmap to v1.0.0
2
+
3
+ *What needs to happen before blq can claim API stability.*
4
+
5
+ ## Criteria for 1.0
6
+
7
+ 1. **Core features complete** — no major capability gaps that would require breaking changes
8
+ 2. **API stable** — CLI commands, MCP tools, Python API, and TOML config format won't change incompatibly
9
+ 3. **Storage format finalized** — BIRD spec settled, directory name migration done
10
+ 4. **Architecture clean** — no major structural debt that forces workarounds
11
+
12
+ ## Milestones
13
+
14
+ ### 0.10.x — Sandbox Hardening (current)
15
+
16
+ **Done:**
17
+ - [x] Bwrap enforcement engine (network, filesystem, PID, tmpfs)
18
+ - [x] Strace profiling (`blq sandbox profile`)
19
+ - [x] Sandbox CLI (list, inspect, suggest, profile)
20
+ - [x] Auto-detect presets on init
21
+ - [x] `--sandbox` flag on register
22
+ - [x] Sandbox violation events
23
+ - [x] MCP sandbox_info tool
24
+ - [x] Annotator plugin system (RunContext, eager/deferred dispatch)
25
+ - [x] Spec tightening (`blq sandbox tighten`)
26
+
27
+ **Remaining:**
28
+ - [ ] Specific violation events — detect permission-denied patterns (#29)
29
+ - [ ] First annotator plugin — source context lookup (#30)
30
+
31
+ **Deferred to post-1.0:**
32
+ - nsjail engine (#42) — requires building from source
33
+ - seccomp learning mode (#43) — requires nsjail
34
+
35
+ ### 0.11.x — Unified Service Layer
36
+
37
+ The biggest architectural debt. Currently MCP shells out to `blq run --json` and reimplements query logic independently from the CLI.
38
+
39
+ **Goal:** Single implementation for each operation, called by both CLI and MCP.
40
+
41
+ - [ ] Extract execution service (#31)
42
+ - [ ] Extract query services (#32)
43
+
44
+ **Why before 1.0:** Every new feature currently needs parallel implementation in CLI and MCP. The duplication makes the API surface unreliable — MCP and CLI can diverge silently. A service layer means one source of truth.
45
+
46
+ ### 0.12.x — Sync (#21)
47
+
48
+ Fetch and query logs from CI systems. This is the last major feature gap.
49
+
50
+ - [ ] CI log fetching — GitHub Actions, GitLab CI (#33)
51
+ - [ ] Central store for cross-project aggregation (#34)
52
+
53
+ **Why before 1.0:** Users expect to query CI logs the same way they query local logs. Without sync, blq is local-only, which limits its value for teams.
54
+
55
+ ### 0.13.x — BIRD Spec Finalization
56
+
57
+ Settle the storage format before committing to API stability.
58
+
59
+ - [ ] `.lq/` vs `.bird/` directory decision and migration (#35)
60
+ - [ ] Finalize schema version, document storage guarantees (#36)
61
+
62
+ **Why before 1.0:** Changing the storage directory or schema after 1.0 would be a breaking change. Lock it down now.
63
+
64
+ ### 0.14.x — Polish & Stability
65
+
66
+ - [ ] Plugin system documentation and API stability (#37)
67
+ - [ ] Performance audit (#38)
68
+ - [ ] Comprehensive error messages (#39)
69
+ - [ ] Integration test suite — CLI → MCP → DuckDB round-trips (#40)
70
+ - [ ] API documentation — Python reference, MCP schemas (#41)
71
+
72
+ ### 1.0.0 — Stable Release
73
+
74
+ **Guarantees:**
75
+ - CLI command names and flags won't change incompatibly
76
+ - MCP tool names and parameters are stable
77
+ - TOML config format is stable (new fields may be added, existing won't change)
78
+ - Python API (`LogStore`, `LogQuery`) is stable
79
+ - Storage format won't require migration within 1.x
80
+ - Sandbox spec dimensions and presets won't change incompatibly
81
+
82
+ **What's explicitly NOT guaranteed at 1.0:**
83
+ - SQL macro signatures (DuckDB internals may evolve)
84
+ - Extension engine protocol (may add methods)
85
+ - Internal module structure (imports may change)
86
+
87
+ ## Post-1.0
88
+
89
+ - [ ] nsjail sandbox engine (#42)
90
+ - [ ] seccomp learning mode (#43)
91
+ - [ ] duckdb_mcp integration (ATTACH/DETACH workflow)
92
+ - [ ] Windows support exploration
93
+
94
+ ## Sequencing
95
+
96
+ ```
97
+ 0.10.x Sandbox hardening — finish remaining items
98
+
99
+ 0.11.x Unified service layer (architecture cleanup)
100
+
101
+ 0.12.x Sync (CI log fetching, cross-project)
102
+
103
+ 0.13.x BIRD spec finalization (storage format)
104
+
105
+ 0.14.x Polish (plugins, perf, docs, tests)
106
+
107
+ 1.0.0 Stable release
108
+ ```
109
+
110
+ The order matters:
111
+ - Sandbox hardening first because it's close to done and doesn't require architecture changes
112
+ - Service layer before sync because sync would otherwise need dual CLI/MCP implementation
113
+ - BIRD finalization after sync because sync may influence the storage format
114
+ - Polish last because it benefits from all prior work being stable
115
+
116
+ ## Non-goals for 1.0
117
+
118
+ - Windows support (bwrap/nsjail are Linux-only)
119
+ - GUI or web interface
120
+ - Real-time streaming (blq is batch-oriented)
121
+ - Multi-tenant / hosted service
122
+ - Backward compatibility with pre-0.10 storage formats (migration tools provided, but no runtime support)
123
+
124
+ ## Issue Tracker
125
+
126
+ All roadmap items are tracked as GitHub issues with milestone labels:
127
+
128
+ | Label | Issues |
129
+ |-------|--------|
130
+ | `milestone:0.10.x` | #29, #30 |
131
+ | `milestone:0.11.x` | #31, #32 |
132
+ | `milestone:0.12.x` | #21, #33, #34 |
133
+ | `milestone:0.13.x` | #35, #36 |
134
+ | `milestone:0.14.x` | #37, #38, #39, #40, #41 |
135
+ | `post-1.0` | #42, #43 |
@@ -146,7 +146,28 @@ blq run test
146
146
 
147
147
  If the command fails due to sandbox restrictions, blq generates a structured info event with the sandbox context, queryable via `blq events`.
148
148
 
149
- ### 5. Query
149
+ ### 5. Tighten
150
+
151
+ After accumulating runs, auto-narrow the spec based on observed resource usage:
152
+
153
+ ```bash
154
+ blq sandbox tighten test
155
+ # Tightening sandbox spec for 'test' (from 15 runs):
156
+ # memory: 512m -> 256m
157
+ # timeout: 1m -> 30s
158
+ # cpu: 30s -> 15s
159
+ # Updated commands.toml
160
+ ```
161
+
162
+ Use `--dry-run` to preview changes without writing:
163
+
164
+ ```bash
165
+ blq sandbox tighten test --dry-run
166
+ ```
167
+
168
+ Tightening only reduces bounds — it never loosens them. It applies headroom (2x memory, 2x CPU, 3x timeout) to observed maximums. Requires at least 3 runs for reliable data.
169
+
170
+ ### 6. Query
150
171
 
151
172
  Check sandbox status across all commands:
152
173
 
@@ -186,6 +207,19 @@ AI agents can query and manage sandbox specs:
186
207
 
187
208
  The `sandbox_info` tool returns the spec, grades, and observed resource metrics (memory peak, CPU usage, average duration) when monitoring data is available.
188
209
 
210
+ ## Annotators
211
+
212
+ Annotators are plugins that enrich stored events with additional context. They run after events are written to the database and add structured annotations to the `metadata` JSON column.
213
+
214
+ Each annotation has:
215
+ - **type** — what kind of enrichment (source, provenance, diagnostic)
216
+ - **display** — when to show it: `inline` (always), `detail` (inspect only), `hidden` (queryable only)
217
+ - **data** — annotator-specific payload
218
+
219
+ Annotators declare whether they're **eager** (run during `blq run`) or **deferred** (run on demand). Eager annotators execute in Window 2 alongside event storage. Deferred annotators run when explicitly requested.
220
+
221
+ Annotators are discovered via Python entry points (`blq.annotators` group).
222
+
189
223
  ## Requirements
190
224
 
191
225
  - **bwrap** (bubblewrap) for namespace isolation: `sudo apt install bubblewrap`