shellbrain 0.1.47__tar.gz → 0.1.49__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 (496) hide show
  1. {shellbrain-0.1.47 → shellbrain-0.1.49}/PKG-INFO +6 -11
  2. {shellbrain-0.1.47 → shellbrain-0.1.49}/README.md +5 -10
  3. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/core/ports/host_apps/inner_agents.py +0 -1
  4. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/core/use_cases/retrieval/build_context/execute.py +4 -34
  5. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/core/use_cases/retrieval/deterministic_graph_recall.py +4 -39
  6. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/core/use_cases/retrieval/recall/__init__.py +1 -5
  7. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/core/use_cases/retrieval/recall/request.py +0 -19
  8. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/entrypoints/cli/parser/builder.py +8 -8
  9. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/entrypoints/cli/presenters/init.py +2 -2
  10. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/entrypoints/cli/request_parsing/payload_validation.py +0 -42
  11. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/entrypoints/cli/request_parsing/retrieval.py +1 -9
  12. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/entrypoints/cli/runner.py +6 -5
  13. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/infrastructure/host_apps/inner_agents/prompt.py +11 -23
  14. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/infrastructure/telemetry/recall_records.py +0 -1
  15. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/infrastructure/telemetry/records.py +0 -1
  16. {shellbrain-0.1.47 → shellbrain-0.1.49}/onboarding_assets/claude/CLAUDE.md +3 -1
  17. {shellbrain-0.1.47 → shellbrain-0.1.49}/onboarding_assets/claude/skills/shellbrain/SKILL.md +8 -10
  18. {shellbrain-0.1.47 → shellbrain-0.1.49}/onboarding_assets/codex/AGENTS.md +3 -1
  19. {shellbrain-0.1.47/onboarding_assets/cursor/skills → shellbrain-0.1.49/onboarding_assets/codex}/shellbrain/SKILL.md +12 -10
  20. {shellbrain-0.1.47 → shellbrain-0.1.49}/onboarding_assets/codex/shellbrain/references/session-workflow.md +8 -13
  21. {shellbrain-0.1.47/onboarding_assets/codex → shellbrain-0.1.49/onboarding_assets/cursor/skills}/shellbrain/SKILL.md +8 -15
  22. {shellbrain-0.1.47 → shellbrain-0.1.49}/pyproject.toml +1 -1
  23. {shellbrain-0.1.47 → shellbrain-0.1.49}/shellbrain.egg-info/PKG-INFO +6 -11
  24. {shellbrain-0.1.47 → shellbrain-0.1.49}/shellbrain.egg-info/SOURCES.txt +0 -1
  25. shellbrain-0.1.47/onboarding_assets/codex/shellbrain/references/request-shapes.md +0 -122
  26. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/__init__.py +0 -0
  27. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/__main__.py +0 -0
  28. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/core/__init__.py +0 -0
  29. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/core/entities/__init__.py +0 -0
  30. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/core/entities/admin_errors.py +0 -0
  31. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/core/entities/associations.py +0 -0
  32. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/core/entities/backups.py +0 -0
  33. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/core/entities/concepts.py +0 -0
  34. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/core/entities/episodes.py +0 -0
  35. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/core/entities/evidence.py +0 -0
  36. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/core/entities/guidance.py +0 -0
  37. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/core/entities/identity.py +0 -0
  38. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/core/entities/ids.py +0 -0
  39. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/core/entities/inner_agents.py +0 -0
  40. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/core/entities/knowledge_builder.py +0 -0
  41. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/core/entities/machine_config.py +0 -0
  42. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/core/entities/memories.py +0 -0
  43. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/core/entities/repositories.py +0 -0
  44. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/core/entities/runtime_context.py +0 -0
  45. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/core/entities/scenarios.py +0 -0
  46. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/core/entities/session_state.py +0 -0
  47. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/core/entities/settings.py +0 -0
  48. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/core/entities/snapshots.py +0 -0
  49. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/core/entities/structural_memory_relations.py +0 -0
  50. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/core/entities/utility.py +0 -0
  51. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/core/entities/wiki_summaries.py +0 -0
  52. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/core/errors.py +0 -0
  53. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/core/policies/__init__.py +0 -0
  54. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/core/policies/concepts/__init__.py +0 -0
  55. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/core/policies/concepts/relation_rules.py +0 -0
  56. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/core/policies/concepts/search_text.py +0 -0
  57. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/core/policies/episodes/__init__.py +0 -0
  58. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/core/policies/episodes/event_content.py +0 -0
  59. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/core/policies/episodes/knowledge_building.py +0 -0
  60. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/core/policies/memories/__init__.py +0 -0
  61. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/core/policies/memories/add_plan.py +0 -0
  62. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/core/policies/memories/link_rules.py +0 -0
  63. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/core/policies/memories/update_plan.py +0 -0
  64. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/core/policies/retrieval/__init__.py +0 -0
  65. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/core/policies/retrieval/bm25.py +0 -0
  66. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/core/policies/retrieval/context_pack.py +0 -0
  67. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/core/policies/retrieval/expansion.py +0 -0
  68. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/core/policies/retrieval/fusion_rrf.py +0 -0
  69. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/core/policies/retrieval/lexical_query.py +0 -0
  70. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/core/policies/retrieval/ontology_semantics.py +0 -0
  71. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/core/policies/retrieval/scoring.py +0 -0
  72. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/core/policies/wiki_summary_freshness.py +0 -0
  73. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/core/ports/__init__.py +0 -0
  74. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/core/ports/db/__init__.py +0 -0
  75. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/core/ports/db/concept_repositories.py +0 -0
  76. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/core/ports/db/episode_repositories.py +0 -0
  77. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/core/ports/db/guidance.py +0 -0
  78. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/core/ports/db/knowledge_builder.py +0 -0
  79. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/core/ports/db/memory_repositories.py +0 -0
  80. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/core/ports/db/problem_runs.py +0 -0
  81. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/core/ports/db/repository_index.py +0 -0
  82. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/core/ports/db/retrieval_repositories.py +0 -0
  83. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/core/ports/db/snapshots.py +0 -0
  84. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/core/ports/db/unit_of_work.py +0 -0
  85. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/core/ports/db/wiki_summaries.py +0 -0
  86. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/core/ports/embeddings/__init__.py +0 -0
  87. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/core/ports/embeddings/provider.py +0 -0
  88. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/core/ports/embeddings/retrieval.py +0 -0
  89. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/core/ports/host_apps/__init__.py +0 -0
  90. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/core/ports/local_state/__init__.py +0 -0
  91. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/core/ports/local_state/session_state_store.py +0 -0
  92. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/core/ports/local_state/shadow_git.py +0 -0
  93. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/core/ports/reporting/__init__.py +0 -0
  94. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/core/ports/reporting/metrics.py +0 -0
  95. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/core/ports/system/__init__.py +0 -0
  96. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/core/ports/system/clock.py +0 -0
  97. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/core/ports/system/idgen.py +0 -0
  98. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/core/use_cases/__init__.py +0 -0
  99. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/core/use_cases/admin/__init__.py +0 -0
  100. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/core/use_cases/admin/analytics_diagnostics.py +0 -0
  101. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/core/use_cases/admin/backfill_model_usage/__init__.py +0 -0
  102. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/core/use_cases/admin/backfill_model_usage/backfill_model_usage.py +0 -0
  103. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/core/use_cases/admin/backfill_model_usage/request.py +0 -0
  104. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/core/use_cases/admin/backfill_model_usage/result.py +0 -0
  105. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/core/use_cases/admin/create_backup.py +0 -0
  106. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/core/use_cases/admin/diagnose_runtime.py +0 -0
  107. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/core/use_cases/admin/generate_analytics_report.py +0 -0
  108. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/core/use_cases/admin/initialize_runtime.py +0 -0
  109. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/core/use_cases/admin/restore_backup.py +0 -0
  110. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/core/use_cases/admin/verify_backup.py +0 -0
  111. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/core/use_cases/build_guidance.py +0 -0
  112. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/core/use_cases/concepts/__init__.py +0 -0
  113. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/core/use_cases/concepts/add/__init__.py +0 -0
  114. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/core/use_cases/concepts/add/execute.py +0 -0
  115. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/core/use_cases/concepts/add/request.py +0 -0
  116. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/core/use_cases/concepts/add/result.py +0 -0
  117. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/core/use_cases/concepts/containment_checks.py +0 -0
  118. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/core/use_cases/concepts/embeddings.py +0 -0
  119. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/core/use_cases/concepts/reference_checks.py +0 -0
  120. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/core/use_cases/concepts/show/__init__.py +0 -0
  121. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/core/use_cases/concepts/show/execute.py +0 -0
  122. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/core/use_cases/concepts/show/request.py +0 -0
  123. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/core/use_cases/concepts/show/result.py +0 -0
  124. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/core/use_cases/concepts/update/__init__.py +0 -0
  125. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/core/use_cases/concepts/update/execute.py +0 -0
  126. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/core/use_cases/concepts/update/request.py +0 -0
  127. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/core/use_cases/concepts/update/result.py +0 -0
  128. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/core/use_cases/concepts/views.py +0 -0
  129. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/core/use_cases/episodes/__init__.py +0 -0
  130. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/core/use_cases/episodes/events/__init__.py +0 -0
  131. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/core/use_cases/episodes/events/request.py +0 -0
  132. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/core/use_cases/episodes/sync_discovered_host_session.py +0 -0
  133. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/core/use_cases/episodes/sync_episode/__init__.py +0 -0
  134. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/core/use_cases/episodes/sync_episode/request.py +0 -0
  135. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/core/use_cases/episodes/sync_episode/result.py +0 -0
  136. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/core/use_cases/episodes/sync_episode/sync_episode.py +0 -0
  137. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/core/use_cases/knowledge_builder/__init__.py +0 -0
  138. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/core/use_cases/knowledge_builder/build_knowledge/__init__.py +0 -0
  139. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/core/use_cases/knowledge_builder/build_knowledge/execute.py +0 -0
  140. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/core/use_cases/knowledge_builder/build_knowledge/request.py +0 -0
  141. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/core/use_cases/knowledge_builder/build_knowledge/result.py +0 -0
  142. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/core/use_cases/knowledge_builder/teach_knowledge/__init__.py +0 -0
  143. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/core/use_cases/knowledge_builder/teach_knowledge/execute.py +0 -0
  144. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/core/use_cases/knowledge_builder/teach_knowledge/request.py +0 -0
  145. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/core/use_cases/knowledge_builder/teach_knowledge/result.py +0 -0
  146. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/core/use_cases/memories/__init__.py +0 -0
  147. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/core/use_cases/memories/add/__init__.py +0 -0
  148. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/core/use_cases/memories/add/execute.py +0 -0
  149. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/core/use_cases/memories/add/request.py +0 -0
  150. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/core/use_cases/memories/add/result.py +0 -0
  151. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/core/use_cases/memories/effect_plan.py +0 -0
  152. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/core/use_cases/memories/reference_checks.py +0 -0
  153. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/core/use_cases/memories/update/__init__.py +0 -0
  154. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/core/use_cases/memories/update/execute.py +0 -0
  155. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/core/use_cases/memories/update/request.py +0 -0
  156. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/core/use_cases/memories/update/result.py +0 -0
  157. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/core/use_cases/metrics/__init__.py +0 -0
  158. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/core/use_cases/metrics/analyze_agent_behavior.py +0 -0
  159. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/core/use_cases/metrics/build_snapshot.py +0 -0
  160. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/core/use_cases/metrics/generate_dashboard.py +0 -0
  161. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/core/use_cases/plan_execution.py +0 -0
  162. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/core/use_cases/retrieval/__init__.py +0 -0
  163. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/core/use_cases/retrieval/build_context/__init__.py +0 -0
  164. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/core/use_cases/retrieval/concept_seed_retrieval.py +0 -0
  165. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/core/use_cases/retrieval/context_pack_pipeline.py +0 -0
  166. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/core/use_cases/retrieval/expansion.py +0 -0
  167. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/core/use_cases/retrieval/read/__init__.py +0 -0
  168. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/core/use_cases/retrieval/read/execute.py +0 -0
  169. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/core/use_cases/retrieval/read/request.py +0 -0
  170. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/core/use_cases/retrieval/read/result.py +0 -0
  171. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/core/use_cases/retrieval/read_concepts.py +0 -0
  172. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/core/use_cases/retrieval/recall/execute.py +0 -0
  173. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/core/use_cases/retrieval/recall/result.py +0 -0
  174. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/core/use_cases/retrieval/seed_retrieval.py +0 -0
  175. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/core/use_cases/scenarios/__init__.py +0 -0
  176. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/core/use_cases/scenarios/record/__init__.py +0 -0
  177. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/core/use_cases/scenarios/record/execute.py +0 -0
  178. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/core/use_cases/scenarios/record/request.py +0 -0
  179. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/core/use_cases/scenarios/record/result.py +0 -0
  180. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/core/use_cases/snapshots/__init__.py +0 -0
  181. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/core/use_cases/snapshots/capture_snapshot/__init__.py +0 -0
  182. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/core/use_cases/snapshots/capture_snapshot/execute.py +0 -0
  183. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/core/use_cases/snapshots/capture_snapshot/request.py +0 -0
  184. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/core/use_cases/snapshots/capture_snapshot/result.py +0 -0
  185. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/core/use_cases/snapshots/code_delta_context/__init__.py +0 -0
  186. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/core/use_cases/snapshots/code_delta_context/execute.py +0 -0
  187. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/core/use_cases/snapshots/code_delta_context/request.py +0 -0
  188. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/core/use_cases/wiki/__init__.py +0 -0
  189. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/core/use_cases/wiki/execute.py +0 -0
  190. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/core/use_cases/wiki/request.py +0 -0
  191. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/core/use_cases/wiki/result.py +0 -0
  192. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/core/use_cases/wiki/summaries.py +0 -0
  193. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/entrypoints/__init__.py +0 -0
  194. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/entrypoints/cli/__init__.py +0 -0
  195. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/entrypoints/cli/error_responses.py +0 -0
  196. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/entrypoints/cli/handlers/__init__.py +0 -0
  197. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/entrypoints/cli/handlers/cli_operation.py +0 -0
  198. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/entrypoints/cli/handlers/dependencies.py +0 -0
  199. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/entrypoints/cli/handlers/human/__init__.py +0 -0
  200. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/entrypoints/cli/handlers/human/admin.py +0 -0
  201. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/entrypoints/cli/handlers/human/admin_dependencies.py +0 -0
  202. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/entrypoints/cli/handlers/human/init.py +0 -0
  203. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/entrypoints/cli/handlers/human/metrics.py +0 -0
  204. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/entrypoints/cli/handlers/human/upgrade.py +0 -0
  205. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/entrypoints/cli/handlers/human/wiki.py +0 -0
  206. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/entrypoints/cli/handlers/internal_agent/__init__.py +0 -0
  207. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/entrypoints/cli/handlers/internal_agent/concepts/__init__.py +0 -0
  208. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/entrypoints/cli/handlers/internal_agent/concepts/add.py +0 -0
  209. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/entrypoints/cli/handlers/internal_agent/concepts/show.py +0 -0
  210. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/entrypoints/cli/handlers/internal_agent/concepts/update.py +0 -0
  211. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/entrypoints/cli/handlers/internal_agent/episodes/__init__.py +0 -0
  212. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/entrypoints/cli/handlers/internal_agent/episodes/events.py +0 -0
  213. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/entrypoints/cli/handlers/internal_agent/episodes/selection.py +0 -0
  214. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/entrypoints/cli/handlers/internal_agent/episodes/serialization.py +0 -0
  215. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/entrypoints/cli/handlers/internal_agent/memories/__init__.py +0 -0
  216. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/entrypoints/cli/handlers/internal_agent/memories/add.py +0 -0
  217. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/entrypoints/cli/handlers/internal_agent/memories/update.py +0 -0
  218. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/entrypoints/cli/handlers/internal_agent/memories/utility_vote_evidence.py +0 -0
  219. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/entrypoints/cli/handlers/internal_agent/retrieval/__init__.py +0 -0
  220. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/entrypoints/cli/handlers/internal_agent/retrieval/execution.py +0 -0
  221. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/entrypoints/cli/handlers/internal_agent/retrieval/read.py +0 -0
  222. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/entrypoints/cli/handlers/internal_agent/scenarios/__init__.py +0 -0
  223. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/entrypoints/cli/handlers/internal_agent/scenarios/record.py +0 -0
  224. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/entrypoints/cli/handlers/result_envelopes.py +0 -0
  225. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/entrypoints/cli/handlers/session_state.py +0 -0
  226. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/entrypoints/cli/handlers/working_agent/__init__.py +0 -0
  227. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/entrypoints/cli/handlers/working_agent/recall.py +0 -0
  228. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/entrypoints/cli/handlers/working_agent/snapshot.py +0 -0
  229. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/entrypoints/cli/handlers/working_agent/teach.py +0 -0
  230. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/entrypoints/cli/main.py +0 -0
  231. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/entrypoints/cli/operation_command.py +0 -0
  232. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/entrypoints/cli/parser/__init__.py +0 -0
  233. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/entrypoints/cli/presenters/__init__.py +0 -0
  234. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/entrypoints/cli/presenters/json.py +0 -0
  235. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/entrypoints/cli/presenters/metrics.py +0 -0
  236. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/entrypoints/cli/request_parsing/__init__.py +0 -0
  237. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/entrypoints/cli/request_parsing/concepts.py +0 -0
  238. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/entrypoints/cli/request_parsing/episodes.py +0 -0
  239. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/entrypoints/cli/request_parsing/hydration.py +0 -0
  240. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/entrypoints/cli/request_parsing/memories.py +0 -0
  241. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/entrypoints/cli/request_parsing/prepared.py +0 -0
  242. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/entrypoints/cli/request_parsing/scenarios.py +0 -0
  243. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/entrypoints/cli/request_parsing/teach.py +0 -0
  244. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/entrypoints/cli/runtime.py +0 -0
  245. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/entrypoints/host_hooks/__init__.py +0 -0
  246. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/entrypoints/host_hooks/claude_session_start.py +0 -0
  247. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/entrypoints/host_hooks/cursor_statusline.py +0 -0
  248. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/entrypoints/jobs/__init__.py +0 -0
  249. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/entrypoints/jobs/episode_sync.py +0 -0
  250. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/infrastructure/__init__.py +0 -0
  251. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/infrastructure/db/__init__.py +0 -0
  252. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/infrastructure/db/admin/__init__.py +0 -0
  253. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/infrastructure/db/admin/app_role_safety.py +0 -0
  254. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/infrastructure/db/admin/backups/__init__.py +0 -0
  255. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/infrastructure/db/admin/backups/destructive_guard.py +0 -0
  256. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/infrastructure/db/admin/backups/logical_backup.py +0 -0
  257. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/infrastructure/db/admin/backups/manifest_store.py +0 -0
  258. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/infrastructure/db/admin/backups/restore.py +0 -0
  259. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/infrastructure/db/admin/connection.py +0 -0
  260. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/infrastructure/db/admin/instance_guard.py +0 -0
  261. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/infrastructure/db/admin/migrations.py +0 -0
  262. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/infrastructure/db/admin/privileges.py +0 -0
  263. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/infrastructure/db/admin/provisioning/__init__.py +0 -0
  264. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/infrastructure/db/admin/provisioning/docker_prerequisites.py +0 -0
  265. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/infrastructure/db/admin/provisioning/external_postgres.py +0 -0
  266. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/infrastructure/db/admin/provisioning/init_effects.py +0 -0
  267. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/infrastructure/db/admin/provisioning/managed_local.py +0 -0
  268. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/infrastructure/db/admin/storage_setup.py +0 -0
  269. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/infrastructure/db/runtime/__init__.py +0 -0
  270. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/infrastructure/db/runtime/engine.py +0 -0
  271. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/infrastructure/db/runtime/models/__init__.py +0 -0
  272. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/infrastructure/db/runtime/models/associations.py +0 -0
  273. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/infrastructure/db/runtime/models/concepts.py +0 -0
  274. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/infrastructure/db/runtime/models/episodes.py +0 -0
  275. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/infrastructure/db/runtime/models/evidence.py +0 -0
  276. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/infrastructure/db/runtime/models/experiences.py +0 -0
  277. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/infrastructure/db/runtime/models/instance_metadata.py +0 -0
  278. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/infrastructure/db/runtime/models/knowledge_builder.py +0 -0
  279. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/infrastructure/db/runtime/models/memories.py +0 -0
  280. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/infrastructure/db/runtime/models/metadata.py +0 -0
  281. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/infrastructure/db/runtime/models/problem_runs.py +0 -0
  282. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/infrastructure/db/runtime/models/registry.py +0 -0
  283. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/infrastructure/db/runtime/models/snapshots.py +0 -0
  284. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/infrastructure/db/runtime/models/telemetry.py +0 -0
  285. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/infrastructure/db/runtime/models/utility.py +0 -0
  286. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/infrastructure/db/runtime/models/views.py +0 -0
  287. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/infrastructure/db/runtime/models/wiki_summaries.py +0 -0
  288. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/infrastructure/db/runtime/queries/__init__.py +0 -0
  289. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/infrastructure/db/runtime/queries/agent_behavior.py +0 -0
  290. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/infrastructure/db/runtime/queries/analytics.py +0 -0
  291. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/infrastructure/db/runtime/queries/metrics.py +0 -0
  292. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/infrastructure/db/runtime/queries/metrics_adapter.py +0 -0
  293. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/infrastructure/db/runtime/queries/model_usage_backfill.py +0 -0
  294. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/infrastructure/db/runtime/repos/__init__.py +0 -0
  295. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/infrastructure/db/runtime/repos/relational/__init__.py +0 -0
  296. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/infrastructure/db/runtime/repos/relational/associations_repo.py +0 -0
  297. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/infrastructure/db/runtime/repos/relational/concepts_repo.py +0 -0
  298. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/infrastructure/db/runtime/repos/relational/episodes_repo.py +0 -0
  299. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/infrastructure/db/runtime/repos/relational/evidence_repo.py +0 -0
  300. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/infrastructure/db/runtime/repos/relational/experiences_repo.py +0 -0
  301. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/infrastructure/db/runtime/repos/relational/knowledge_builder_repo.py +0 -0
  302. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/infrastructure/db/runtime/repos/relational/memories_repo.py +0 -0
  303. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/infrastructure/db/runtime/repos/relational/problem_runs_repo.py +0 -0
  304. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/infrastructure/db/runtime/repos/relational/read_policy_repo.py +0 -0
  305. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/infrastructure/db/runtime/repos/relational/repository_index_repo.py +0 -0
  306. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/infrastructure/db/runtime/repos/relational/snapshots_repo.py +0 -0
  307. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/infrastructure/db/runtime/repos/relational/telemetry_repo.py +0 -0
  308. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/infrastructure/db/runtime/repos/relational/utility_repo.py +0 -0
  309. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/infrastructure/db/runtime/repos/relational/wiki_summaries_repo.py +0 -0
  310. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/infrastructure/db/runtime/repos/semantic/__init__.py +0 -0
  311. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/infrastructure/db/runtime/repos/semantic/concept_retrieval_repo.py +0 -0
  312. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/infrastructure/db/runtime/repos/semantic/keyword_retrieval_repo.py +0 -0
  313. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/infrastructure/db/runtime/repos/semantic/semantic_retrieval_repo.py +0 -0
  314. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/infrastructure/db/runtime/session.py +0 -0
  315. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/infrastructure/db/runtime/uow.py +0 -0
  316. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/infrastructure/embeddings/__init__.py +0 -0
  317. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/infrastructure/embeddings/local_provider.py +0 -0
  318. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/infrastructure/embeddings/prewarm.py +0 -0
  319. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/infrastructure/embeddings/query_vector_search.py +0 -0
  320. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/infrastructure/host_apps/__init__.py +0 -0
  321. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/infrastructure/host_apps/assets/__init__.py +0 -0
  322. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/infrastructure/host_apps/assets/claude.py +0 -0
  323. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/infrastructure/host_apps/assets/codex.py +0 -0
  324. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/infrastructure/host_apps/assets/cursor.py +0 -0
  325. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/infrastructure/host_apps/assets/cursor_statusline_config.py +0 -0
  326. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/infrastructure/host_apps/assets/inspection.py +0 -0
  327. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/infrastructure/host_apps/assets/managed_markdown.py +0 -0
  328. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/infrastructure/host_apps/assets/managed_tree.py +0 -0
  329. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/infrastructure/host_apps/assets/packaged_assets.py +0 -0
  330. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/infrastructure/host_apps/assets/paths.py +0 -0
  331. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/infrastructure/host_apps/assets/service.py +0 -0
  332. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/infrastructure/host_apps/assets/types.py +0 -0
  333. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/infrastructure/host_apps/identity/__init__.py +0 -0
  334. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/infrastructure/host_apps/identity/claude_hook_install.py +0 -0
  335. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/infrastructure/host_apps/identity/claude_runtime.py +0 -0
  336. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/infrastructure/host_apps/identity/codex_runtime.py +0 -0
  337. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/infrastructure/host_apps/identity/compatibility.py +0 -0
  338. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/infrastructure/host_apps/identity/cursor_statusline.py +0 -0
  339. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/infrastructure/host_apps/identity/resolver.py +0 -0
  340. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/infrastructure/host_apps/inner_agents/__init__.py +0 -0
  341. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/infrastructure/host_apps/inner_agents/claude_cli.py +0 -0
  342. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/infrastructure/host_apps/inner_agents/codex_cli.py +0 -0
  343. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/infrastructure/host_apps/inner_agents/output_parser.py +0 -0
  344. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/infrastructure/host_apps/transcripts/__init__.py +0 -0
  345. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/infrastructure/host_apps/transcripts/claude_code.py +0 -0
  346. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/infrastructure/host_apps/transcripts/codex.py +0 -0
  347. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/infrastructure/host_apps/transcripts/cursor.py +0 -0
  348. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/infrastructure/host_apps/transcripts/model_usage.py +0 -0
  349. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/infrastructure/host_apps/transcripts/normalization.py +0 -0
  350. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/infrastructure/host_apps/transcripts/session_selection.py +0 -0
  351. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/infrastructure/host_apps/transcripts/source_discovery.py +0 -0
  352. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/infrastructure/host_apps/transcripts/tool_filter.py +0 -0
  353. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/infrastructure/local_state/__init__.py +0 -0
  354. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/infrastructure/local_state/init_lock.py +0 -0
  355. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/infrastructure/local_state/machine_config_store.py +0 -0
  356. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/infrastructure/local_state/operation_registration.py +0 -0
  357. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/infrastructure/local_state/paths.py +0 -0
  358. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/infrastructure/local_state/recall_mode_store.py +0 -0
  359. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/infrastructure/local_state/repo_registration_store.py +0 -0
  360. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/infrastructure/local_state/session_state_file_store.py +0 -0
  361. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/infrastructure/local_state/shadow_git_store.py +0 -0
  362. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/infrastructure/process/__init__.py +0 -0
  363. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/infrastructure/process/episode_sync/__init__.py +0 -0
  364. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/infrastructure/process/episode_sync/autostart.py +0 -0
  365. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/infrastructure/process/episode_sync/launcher.py +0 -0
  366. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/infrastructure/process/episode_sync/lock_file.py +0 -0
  367. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/infrastructure/process/episode_sync/poller.py +0 -0
  368. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/infrastructure/process/episode_sync/status_store.py +0 -0
  369. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/infrastructure/reporting/__init__.py +0 -0
  370. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/infrastructure/reporting/metrics/__init__.py +0 -0
  371. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/infrastructure/reporting/metrics/artifacts.py +0 -0
  372. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/infrastructure/reporting/metrics/browser.py +0 -0
  373. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/infrastructure/reporting/metrics/pager.py +0 -0
  374. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/infrastructure/reporting/metrics/render_html.py +0 -0
  375. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/infrastructure/reporting/wiki/__init__.py +0 -0
  376. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/infrastructure/reporting/wiki/browser.py +0 -0
  377. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/infrastructure/reporting/wiki/render_html.py +0 -0
  378. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/infrastructure/reporting/wiki/server.py +0 -0
  379. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/infrastructure/reporting/wiki/summary_worker.py +0 -0
  380. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/infrastructure/system/__init__.py +0 -0
  381. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/infrastructure/system/clock.py +0 -0
  382. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/infrastructure/system/id_generator.py +0 -0
  383. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/infrastructure/system/package_upgrade.py +0 -0
  384. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/infrastructure/telemetry/__init__.py +0 -0
  385. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/infrastructure/telemetry/inner_agent_records.py +0 -0
  386. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/infrastructure/telemetry/operation_invocations.py +0 -0
  387. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/infrastructure/telemetry/operation_polling.py +0 -0
  388. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/infrastructure/telemetry/read_records.py +0 -0
  389. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/infrastructure/telemetry/recorder.py +0 -0
  390. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/infrastructure/telemetry/sink.py +0 -0
  391. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/infrastructure/telemetry/storage_protocols.py +0 -0
  392. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/infrastructure/telemetry/sync_records.py +0 -0
  393. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/infrastructure/telemetry/write_records.py +0 -0
  394. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/settings/__init__.py +0 -0
  395. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/settings/defaults/create_policy.yaml +0 -0
  396. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/settings/defaults/read_policy.yaml +0 -0
  397. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/settings/defaults/runtime.yaml +0 -0
  398. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/settings/defaults/thresholds.yaml +0 -0
  399. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/settings/defaults/update_policy.yaml +0 -0
  400. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/settings/internal-agents/defaults.yaml +0 -0
  401. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/startup/__init__.py +0 -0
  402. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/startup/admin.py +0 -0
  403. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/startup/admin_db.py +0 -0
  404. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/startup/admin_dependencies.py +0 -0
  405. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/startup/admin_diagnose.py +0 -0
  406. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/startup/analytics.py +0 -0
  407. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/startup/backup.py +0 -0
  408. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/startup/cli.py +0 -0
  409. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/startup/cli_runtime.py +0 -0
  410. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/startup/config.py +0 -0
  411. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/startup/create_policy.py +0 -0
  412. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/startup/db.py +0 -0
  413. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/startup/dsn_resolution.py +0 -0
  414. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/startup/embeddings.py +0 -0
  415. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/startup/episode_poller.py +0 -0
  416. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/startup/episode_sync_launcher.py +0 -0
  417. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/startup/host_hooks.py +0 -0
  418. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/startup/internal_agent_config.py +0 -0
  419. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/startup/internal_agents.py +0 -0
  420. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/startup/knowledge_builder.py +0 -0
  421. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/startup/metrics.py +0 -0
  422. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/startup/migrations.py +0 -0
  423. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/startup/model_usage_backfill.py +0 -0
  424. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/startup/operation_dependencies.py +0 -0
  425. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/startup/read_policy.py +0 -0
  426. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/startup/repo_context.py +0 -0
  427. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/startup/repos.py +0 -0
  428. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/startup/retrieval.py +0 -0
  429. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/startup/runtime_admin.py +0 -0
  430. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/startup/runtime_context.py +0 -0
  431. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/startup/settings.py +0 -0
  432. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/startup/snapshot_baseline.py +0 -0
  433. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/startup/thresholds.py +0 -0
  434. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/startup/update_policy.py +0 -0
  435. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/startup/use_cases.py +0 -0
  436. {shellbrain-0.1.47 → shellbrain-0.1.49}/app/startup/wiki.py +0 -0
  437. {shellbrain-0.1.47 → shellbrain-0.1.49}/migrations/__init__.py +0 -0
  438. {shellbrain-0.1.47 → shellbrain-0.1.49}/migrations/_legacy_usage_views.py +0 -0
  439. {shellbrain-0.1.47 → shellbrain-0.1.49}/migrations/_usage_view_sql.py +0 -0
  440. {shellbrain-0.1.47 → shellbrain-0.1.49}/migrations/env.py +0 -0
  441. {shellbrain-0.1.47 → shellbrain-0.1.49}/migrations/versions/20260226_0001_initial_schema.py +0 -0
  442. {shellbrain-0.1.47 → shellbrain-0.1.49}/migrations/versions/20260312_0002_add_hard_invariants.py +0 -0
  443. {shellbrain-0.1.47 → shellbrain-0.1.49}/migrations/versions/20260312_0003_drop_create_confidence.py +0 -0
  444. {shellbrain-0.1.47 → shellbrain-0.1.49}/migrations/versions/20260313_0004_episode_sync_hardening.py +0 -0
  445. {shellbrain-0.1.47 → shellbrain-0.1.49}/migrations/versions/20260313_0005_evidence_episode_event_refs.py +0 -0
  446. {shellbrain-0.1.47 → shellbrain-0.1.49}/migrations/versions/20260318_0006_usage_telemetry_schema.py +0 -0
  447. {shellbrain-0.1.47 → shellbrain-0.1.49}/migrations/versions/20260319_0007_identity_session_guidance.py +0 -0
  448. {shellbrain-0.1.47 → shellbrain-0.1.49}/migrations/versions/20260320_0008_instance_metadata_and_backup_safety.py +0 -0
  449. {shellbrain-0.1.47 → shellbrain-0.1.49}/migrations/versions/20260410_0009_frontier_memory_family.py +0 -0
  450. {shellbrain-0.1.47 → shellbrain-0.1.49}/migrations/versions/20260414_0010_model_usage_telemetry.py +0 -0
  451. {shellbrain-0.1.47 → shellbrain-0.1.49}/migrations/versions/20260414_0011_usage_problem_tokens_multi_solution_metrics.py +0 -0
  452. {shellbrain-0.1.47 → shellbrain-0.1.49}/migrations/versions/20260415_0012_read_pack_cost_and_read_roi.py +0 -0
  453. {shellbrain-0.1.47 → shellbrain-0.1.49}/migrations/versions/20260421_0013_concept_context_graph.py +0 -0
  454. {shellbrain-0.1.47 → shellbrain-0.1.49}/migrations/versions/20260422_0014_concept_read_telemetry.py +0 -0
  455. {shellbrain-0.1.47 → shellbrain-0.1.49}/migrations/versions/20260422_0015_problem_runs.py +0 -0
  456. {shellbrain-0.1.47 → shellbrain-0.1.49}/migrations/versions/20260508_0016_recall_telemetry.py +0 -0
  457. {shellbrain-0.1.47 → shellbrain-0.1.49}/migrations/versions/20260511_0017_inner_agent_invocations.py +0 -0
  458. {shellbrain-0.1.47 → shellbrain-0.1.49}/migrations/versions/20260513_0018_knowledge_build_runs.py +0 -0
  459. {shellbrain-0.1.47 → shellbrain-0.1.49}/migrations/versions/20260515_0019_scenario_records.py +0 -0
  460. {shellbrain-0.1.47 → shellbrain-0.1.49}/migrations/versions/20260516_0020_knowledge_build_observability.py +0 -0
  461. {shellbrain-0.1.47 → shellbrain-0.1.49}/migrations/versions/20260519_0021_knowledge_build_watermark_stable.py +0 -0
  462. {shellbrain-0.1.47 → shellbrain-0.1.49}/migrations/versions/20260519_0022_update_evidence_links.py +0 -0
  463. {shellbrain-0.1.47 → shellbrain-0.1.49}/migrations/versions/20260519_0023_explicit_teach_trigger.py +0 -0
  464. {shellbrain-0.1.47 → shellbrain-0.1.49}/migrations/versions/20260519_0024_read_retrieval_latency_indexes.py +0 -0
  465. {shellbrain-0.1.47 → shellbrain-0.1.49}/migrations/versions/20260519_0025_repair_recall_source_input_section_constraint.py +0 -0
  466. {shellbrain-0.1.47 → shellbrain-0.1.49}/migrations/versions/20260519_0026_repair_knowledge_build_trigger_constraint.py +0 -0
  467. {shellbrain-0.1.47 → shellbrain-0.1.49}/migrations/versions/20260519_0027_concept_embeddings.py +0 -0
  468. {shellbrain-0.1.47 → shellbrain-0.1.49}/migrations/versions/20260520_0028_knowledge_build_lifecycle.py +0 -0
  469. {shellbrain-0.1.47 → shellbrain-0.1.49}/migrations/versions/20260522_0029_remove_frontier_and_memory_anchors.py +0 -0
  470. {shellbrain-0.1.47 → shellbrain-0.1.49}/migrations/versions/20260522_0030_concept_lifecycle_events.py +0 -0
  471. {shellbrain-0.1.47 → shellbrain-0.1.49}/migrations/versions/20260522_0031_unified_evidence_storage.py +0 -0
  472. {shellbrain-0.1.47 → shellbrain-0.1.49}/migrations/versions/20260522_0032_memory_lifecycle_events.py +0 -0
  473. {shellbrain-0.1.47 → shellbrain-0.1.49}/migrations/versions/20260522_0033_concept_memory_role_cleanup.py +0 -0
  474. {shellbrain-0.1.47 → shellbrain-0.1.49}/migrations/versions/20260522_0034_structural_memory_relations.py +0 -0
  475. {shellbrain-0.1.47 → shellbrain-0.1.49}/migrations/versions/20260522_0035_retire_legacy_compatibility_tables.py +0 -0
  476. {shellbrain-0.1.47 → shellbrain-0.1.49}/migrations/versions/20260526_0036_shadow_snapshots.py +0 -0
  477. {shellbrain-0.1.47 → shellbrain-0.1.49}/migrations/versions/20260606_0037_wiki_summaries.py +0 -0
  478. {shellbrain-0.1.47 → shellbrain-0.1.49}/migrations/versions/__init__.py +0 -0
  479. {shellbrain-0.1.47 → shellbrain-0.1.49}/onboarding_assets/__init__.py +0 -0
  480. {shellbrain-0.1.47 → shellbrain-0.1.49}/onboarding_assets/claude/skills/shellbrain-usage-review/SKILL.md +0 -0
  481. {shellbrain-0.1.47 → shellbrain-0.1.49}/onboarding_assets/codex/clean-architecture/SKILL.md +0 -0
  482. {shellbrain-0.1.47 → shellbrain-0.1.49}/onboarding_assets/codex/clean-code/SKILL.md +0 -0
  483. {shellbrain-0.1.47 → shellbrain-0.1.49}/onboarding_assets/codex/shellbrain/agents/openai.yaml +0 -0
  484. {shellbrain-0.1.47 → shellbrain-0.1.49}/onboarding_assets/codex/shellbrain/assets/shellbrain-large.svg +0 -0
  485. {shellbrain-0.1.47 → shellbrain-0.1.49}/onboarding_assets/codex/shellbrain/assets/shellbrain-small.svg +0 -0
  486. {shellbrain-0.1.47 → shellbrain-0.1.49}/onboarding_assets/codex/shellbrain/assets/shellbrain_logo.png +0 -0
  487. {shellbrain-0.1.47 → shellbrain-0.1.49}/onboarding_assets/codex/shellbrain-usage-review/SKILL.md +0 -0
  488. {shellbrain-0.1.47 → shellbrain-0.1.49}/onboarding_assets/codex/shellbrain-usage-review/agents/openai.yaml +0 -0
  489. {shellbrain-0.1.47 → shellbrain-0.1.49}/onboarding_assets/codex/shellbrain-usage-review/assets/shellbrain-small.svg +0 -0
  490. {shellbrain-0.1.47 → shellbrain-0.1.49}/onboarding_assets/codex/shellbrain-usage-review/assets/shellbrain_logo.png +0 -0
  491. {shellbrain-0.1.47 → shellbrain-0.1.49}/onboarding_assets/cursor/skills/shellbrain-usage-review/SKILL.md +0 -0
  492. {shellbrain-0.1.47 → shellbrain-0.1.49}/setup.cfg +0 -0
  493. {shellbrain-0.1.47 → shellbrain-0.1.49}/shellbrain.egg-info/dependency_links.txt +0 -0
  494. {shellbrain-0.1.47 → shellbrain-0.1.49}/shellbrain.egg-info/entry_points.txt +0 -0
  495. {shellbrain-0.1.47 → shellbrain-0.1.49}/shellbrain.egg-info/requires.txt +0 -0
  496. {shellbrain-0.1.47 → shellbrain-0.1.49}/shellbrain.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: shellbrain
3
- Version: 0.1.47
3
+ Version: 0.1.49
4
4
  Summary: Repo-scoped Shellbrain CLI with explicit evidence-backed writes.
5
5
  Requires-Python: >=3.11
6
6
  Description-Content-Type: text/markdown
@@ -69,10 +69,12 @@ The episodic layer is truth. Empirical memory extracts. Concept memory abstracts
69
69
 
70
70
  ### Recall
71
71
 
72
- **Working agents call `shellbrain recall`.** That is the normal interface they have to think about. One command, **one _carefully curated_ compact brief**, with sources cited.
72
+ **Working agents call `shellbrain recall`.** That is the normal interface they have to think about. One command, **one _carefully curated_ compact brief** for the task at hand.
73
+
74
+ Recall receives only the quoted query, so include the relevant task, failure, subsystem, or decision naturally in the question.
73
75
 
74
76
  ```bash
75
- shellbrain recall --json '{"query":"What is ShellBrain and how does it help a working coding agent?","current_problem":{"goal":"understand ShellBrain","surface":"README","obstacle":"new readers do not know the product yet","hypothesis":"a real recall brief should show what agents get back"}}'
77
+ shellbrain recall "What is ShellBrain, and how does it help a working coding agent?"
76
78
  ```
77
79
 
78
80
  Response shape:
@@ -90,14 +92,7 @@ Response shape:
90
92
  "anchors": ["`README.md`"],
91
93
  "conflicts": ["..."],
92
94
  "gaps": ["..."],
93
- "next_checks": ["..."],
94
- "sources": [
95
- {
96
- "kind": "memory",
97
- "id": "...",
98
- "section": "direct"
99
- }
100
- ]
95
+ "next_checks": ["..."]
101
96
  },
102
97
  "fallback_reason": null
103
98
  },
@@ -55,10 +55,12 @@ The episodic layer is truth. Empirical memory extracts. Concept memory abstracts
55
55
 
56
56
  ### Recall
57
57
 
58
- **Working agents call `shellbrain recall`.** That is the normal interface they have to think about. One command, **one _carefully curated_ compact brief**, with sources cited.
58
+ **Working agents call `shellbrain recall`.** That is the normal interface they have to think about. One command, **one _carefully curated_ compact brief** for the task at hand.
59
+
60
+ Recall receives only the quoted query, so include the relevant task, failure, subsystem, or decision naturally in the question.
59
61
 
60
62
  ```bash
61
- shellbrain recall --json '{"query":"What is ShellBrain and how does it help a working coding agent?","current_problem":{"goal":"understand ShellBrain","surface":"README","obstacle":"new readers do not know the product yet","hypothesis":"a real recall brief should show what agents get back"}}'
63
+ shellbrain recall "What is ShellBrain, and how does it help a working coding agent?"
62
64
  ```
63
65
 
64
66
  Response shape:
@@ -76,14 +78,7 @@ Response shape:
76
78
  "anchors": ["`README.md`"],
77
79
  "conflicts": ["..."],
78
80
  "gaps": ["..."],
79
- "next_checks": ["..."],
80
- "sources": [
81
- {
82
- "kind": "memory",
83
- "id": "...",
84
- "section": "direct"
85
- }
86
- ]
81
+ "next_checks": ["..."]
87
82
  },
88
83
  "fallback_reason": null
89
84
  },
@@ -34,7 +34,6 @@ class InnerAgentRunRequest(_StrictModel):
34
34
  max_private_reads: int = Field(default=0, ge=0, le=10)
35
35
  max_brief_tokens: int | None = Field(default=None, ge=1, le=100_000)
36
36
  query: str = Field(min_length=1)
37
- current_problem: dict[str, str]
38
37
  repo_root: str | None = None
39
38
  synthesis_only: bool = False
40
39
  deterministic_pack: dict[str, Any] | None = None
@@ -160,7 +160,6 @@ def _inner_agent_request(
160
160
  max_private_reads=settings.max_private_reads,
161
161
  max_brief_tokens=settings.max_brief_tokens,
162
162
  query=request.query,
163
- current_problem=request.current_problem.model_dump(mode="python"),
164
163
  repo_root=repo_root,
165
164
  synthesis_only=synthesis_only,
166
165
  deterministic_pack=deterministic_pack,
@@ -175,10 +174,7 @@ def _provider_result(
175
174
 
176
175
  read_trace = _read_trace(inner_agent_result)
177
176
  source_items = _source_items_from_read_trace(read_trace)
178
- brief = _normalize_provider_brief(
179
- inner_agent_result.brief or {},
180
- deterministic_sources=_sources_from_source_items(source_items),
181
- )
177
+ brief = _normalize_provider_brief(inner_agent_result.brief or {})
182
178
  fallback_reason = (
183
179
  "no_candidates"
184
180
  if not source_items and _read_trace_no_context_reason(read_trace)
@@ -272,10 +268,7 @@ def _deterministic_graph_result(
272
268
  )
273
269
  if synthesis_result.status == "ok" and synthesis_result.brief is not None:
274
270
  return RecallMemoryResult(
275
- brief=_normalize_provider_brief(
276
- synthesis_result.brief,
277
- deterministic_sources=_sources_from_source_items(source_items),
278
- ),
271
+ brief=_normalize_provider_brief(synthesis_result.brief),
279
272
  fallback_reason=None,
280
273
  telemetry={
281
274
  "candidate_pack": graph_pack,
@@ -433,16 +426,13 @@ def _no_context_brief() -> dict[str, Any]:
433
426
  "conflicts": [],
434
427
  "gaps": ["Shellbrain has no relevant memories or concepts for this query."],
435
428
  "next_checks": [],
436
- "sources": [],
437
429
  }
438
430
 
439
431
 
440
- def _normalize_provider_brief(
441
- brief: dict[str, Any], *, deterministic_sources: list[dict[str, Any]]
442
- ) -> dict[str, Any]:
432
+ def _normalize_provider_brief(brief: dict[str, Any]) -> dict[str, Any]:
443
433
  """Ensure provider output keeps the stable worker-facing brief shape."""
444
434
 
445
- normalized = {
435
+ return {
446
436
  "summary": str(brief.get("summary") or "").strip()
447
437
  or "Shellbrain synthesized relevant recall context.",
448
438
  "constraints": _string_list(brief.get("constraints")),
@@ -453,9 +443,7 @@ def _normalize_provider_brief(
453
443
  "conflicts": _string_list(brief.get("conflicts")),
454
444
  "gaps": _string_list(brief.get("gaps")),
455
445
  "next_checks": _string_list(brief.get("next_checks")),
456
- "sources": deterministic_sources,
457
446
  }
458
- return normalized
459
447
 
460
448
 
461
449
  def _string_list(value: Any) -> list[str]:
@@ -590,7 +578,6 @@ def _source_items_from_read_trace(read_trace: dict[str, Any]) -> list[dict[str,
590
578
  "source_kind": source_kind,
591
579
  "source_id": source_id,
592
580
  "input_section": "inner_agent.read_trace",
593
- "output_section": "sources",
594
581
  }
595
582
  )
596
583
  ordinal += 1
@@ -605,29 +592,12 @@ def _source_items_from_read_trace(read_trace: dict[str, Any]) -> list[dict[str,
605
592
  "source_kind": "concept",
606
593
  "source_id": concept_ref,
607
594
  "input_section": "inner_agent.read_trace",
608
- "output_section": "sources",
609
595
  }
610
596
  )
611
597
  ordinal += 1
612
598
  return items
613
599
 
614
600
 
615
- def _sources_from_source_items(
616
- source_items: list[dict[str, Any]]
617
- ) -> list[dict[str, Any]]:
618
- """Render brief sources from telemetry provenance rows."""
619
-
620
- return [
621
- {
622
- "kind": item["source_kind"],
623
- "id": item["source_id"],
624
- "section": item["input_section"],
625
- }
626
- for item in source_items
627
- if item.get("output_section") is not None
628
- ]
629
-
630
-
631
601
  def _read_trace_no_context_reason(read_trace: dict[str, Any]) -> str | None:
632
602
  """Return an explicit no-context reason from provider trace, when present."""
633
603
 
@@ -55,7 +55,6 @@ _CONCEPT_HARD_CAP = 8
55
55
  _RELATION_NEIGHBOR_CAP = 4
56
56
  _HIGH_SIGNAL_RELATIONS = {"depends_on", "constrains", "precedes", "contains"}
57
57
  _HIGH_SIGNAL_CLAIMS = {"invariant", "failure_mode", "usage_note", "behavior"}
58
- _PLACEHOLDER_VALUES = {"none", "none yet", "n/a", "na", "unknown", "not sure"}
59
58
 
60
59
 
61
60
  @dataclass(frozen=True)
@@ -142,7 +141,6 @@ def build_deterministic_graph_pack(
142
141
  "strategy": "deterministic_graph",
143
142
  "request": {
144
143
  "query": request.query,
145
- "current_problem": request.current_problem.model_dump(mode="python"),
146
144
  },
147
145
  "query_lanes": [
148
146
  {"lane": lane.name, "query": lane.query, "terms": list(lane.terms)}
@@ -222,7 +220,6 @@ def deterministic_brief_from_graph_pack(pack: dict[str, Any]) -> dict[str, Any]:
222
220
  "conflicts": [],
223
221
  "gaps": ["Shellbrain has no relevant memories or concepts for this query."],
224
222
  "next_checks": [],
225
- "sources": [],
226
223
  }
227
224
  concept_items = concepts + neighbors
228
225
  constraints = _brief_memory_texts(
@@ -267,7 +264,6 @@ def deterministic_brief_from_graph_pack(pack: dict[str, Any]) -> dict[str, Any]:
267
264
  ),
268
265
  "gaps": [],
269
266
  "next_checks": _next_checks(pack),
270
- "sources": _sources_from_graph_pack(pack),
271
267
  }
272
268
 
273
269
 
@@ -290,7 +286,6 @@ def source_items_from_graph_pack(pack: dict[str, Any]) -> list[dict[str, Any]]:
290
286
  "source_kind": "memory",
291
287
  "source_id": source_id,
292
288
  "input_section": _source_section_for_memory(memory),
293
- "output_section": "sources",
294
289
  }
295
290
  )
296
291
  ordinal += 1
@@ -311,7 +306,6 @@ def source_items_from_graph_pack(pack: dict[str, Any]) -> list[dict[str, Any]]:
311
306
  "source_kind": "concept",
312
307
  "source_id": str(source_id),
313
308
  "input_section": "concept_orientation",
314
- "output_section": "sources",
315
309
  }
316
310
  )
317
311
  ordinal += 1
@@ -320,10 +314,9 @@ def source_items_from_graph_pack(pack: dict[str, Any]) -> list[dict[str, Any]]:
320
314
 
321
315
  def _build_query_lanes(request: MemoryRecallRequest) -> list[_QueryLane]:
322
316
  original = _lane("original", request.query)
323
- current_problem = _current_problem_lane(request)
324
317
  identifiers = _identifier_lane(request)
325
318
  traps = _prior_cases_lane(request)
326
- lanes = [lane for lane in (original, current_problem, identifiers, traps) if lane]
319
+ lanes = [lane for lane in (original, identifiers, traps) if lane]
327
320
  deduped: list[_QueryLane] = []
328
321
  seen_queries: set[str] = set()
329
322
  for lane in lanes:
@@ -343,24 +336,13 @@ def _lane(name: str, query: str) -> _QueryLane | None:
343
336
  return _QueryLane(name=name, query=text, terms=terms)
344
337
 
345
338
 
346
- def _current_problem_lane(request: MemoryRecallRequest) -> _QueryLane | None:
347
- problem = request.current_problem.model_dump(mode="python")
348
- parts = [
349
- value
350
- for key in ("surface", "obstacle", "hypothesis", "goal")
351
- if _useful_problem_part(value := str(problem.get(key) or ""))
352
- ]
353
- return _lane("current_problem", " ".join(parts))
354
-
355
-
356
339
  def _identifier_lane(request: MemoryRecallRequest) -> _QueryLane | None:
357
- problem_text = " ".join(request.current_problem.model_dump(mode="python").values())
358
- identifiers = _extract_identifiers(f"{request.query} {problem_text}")
340
+ identifiers = _extract_identifiers(request.query)
359
341
  return _lane("identifiers", " ".join(identifiers))
360
342
 
361
343
 
362
344
  def _prior_cases_lane(request: MemoryRecallRequest) -> _QueryLane | None:
363
- terms = list(dict.fromkeys(_tokenize(f"{request.query} {request.current_problem.obstacle}")))
345
+ terms = list(dict.fromkeys(_tokenize(request.query)))
364
346
  strongest = " ".join(terms[:8])
365
347
  if not strongest:
366
348
  return None
@@ -371,7 +353,7 @@ def _prior_cases_lane(request: MemoryRecallRequest) -> _QueryLane | None:
371
353
 
372
354
 
373
355
  def _broad_domain_lane(request: MemoryRecallRequest) -> _QueryLane | None:
374
- terms = _tokenize(f"{request.current_problem.surface} {request.current_problem.goal}")
356
+ terms = _tokenize(request.query)
375
357
  if not terms:
376
358
  return None
377
359
  return _lane("broad_domain", " ".join(dict.fromkeys(terms[:8])))
@@ -1222,18 +1204,6 @@ def _next_checks(pack: dict[str, Any]) -> list[str]:
1222
1204
  return list(dict.fromkeys(checks))[:3]
1223
1205
 
1224
1206
 
1225
- def _sources_from_graph_pack(pack: dict[str, Any]) -> list[dict[str, str]]:
1226
- return [
1227
- {
1228
- "kind": item["source_kind"],
1229
- "id": item["source_id"],
1230
- "section": item["input_section"],
1231
- }
1232
- for item in source_items_from_graph_pack(pack)
1233
- if item.get("output_section") is not None
1234
- ]
1235
-
1236
-
1237
1207
  def _conflict_summary(item: object) -> str:
1238
1208
  if isinstance(item, dict):
1239
1209
  return str(item.get("summary") or item.get("reason") or item)
@@ -1392,11 +1362,6 @@ def _tokenize(text: str) -> tuple[str, ...]:
1392
1362
  return tuple(re.findall(r"[a-z0-9_./:-]+", text.lower()))
1393
1363
 
1394
1364
 
1395
- def _useful_problem_part(value: str) -> bool:
1396
- text = value.strip().lower()
1397
- return bool(text and text not in _PLACEHOLDER_VALUES)
1398
-
1399
-
1400
1365
  def _dedupe_reasons(reasons: Iterable[dict[str, Any]]) -> list[dict[str, Any]]:
1401
1366
  seen: set[str] = set()
1402
1367
  deduped = []
@@ -1,14 +1,10 @@
1
1
  """Memory recall use case."""
2
2
 
3
- from app.core.use_cases.retrieval.recall.request import (
4
- MemoryRecallRequest,
5
- RecallCurrentProblem,
6
- )
3
+ from app.core.use_cases.retrieval.recall.request import MemoryRecallRequest
7
4
  from app.core.use_cases.retrieval.recall.result import RecallMemoryResult
8
5
 
9
6
  __all__ = [
10
7
  "MemoryRecallRequest",
11
- "RecallCurrentProblem",
12
8
  "RecallMemoryResult",
13
9
  "execute_recall_memory",
14
10
  ]
@@ -2,8 +2,6 @@
2
2
 
3
3
  from __future__ import annotations
4
4
 
5
- from typing import Literal
6
-
7
5
  from pydantic import BaseModel, ConfigDict, Field, field_validator
8
6
 
9
7
  from app.core.entities.ids import RepoId
@@ -24,28 +22,11 @@ def _normalize_repo_id(value: RepoId) -> RepoId:
24
22
  return RepoId(_normalize_required_string(str(value), field_name="repo_id"))
25
23
 
26
24
 
27
- class RecallCurrentProblem(_StrictModel):
28
- """Required worker problem context for recall synthesis."""
29
-
30
- goal: str = Field(min_length=1)
31
- surface: str = Field(min_length=1)
32
- obstacle: str = Field(min_length=1)
33
- hypothesis: str = Field(min_length=1)
34
-
35
- @field_validator("goal", "surface", "obstacle", "hypothesis")
36
- @classmethod
37
- def _validate_non_blank(cls, value: str) -> str:
38
- return _normalize_required_string(value, field_name="current_problem fields")
39
-
40
-
41
25
  class MemoryRecallRequest(_StrictModel):
42
26
  """Canonical recall request payload."""
43
27
 
44
- op: Literal["recall"] = "recall"
45
28
  repo_id: RepoId
46
29
  query: str = Field(min_length=1)
47
- limit: int | None = Field(default=None, ge=1, le=100)
48
- current_problem: RecallCurrentProblem
49
30
 
50
31
  @field_validator("repo_id")
51
32
  @classmethod
@@ -45,7 +45,8 @@ _TOP_LEVEL_HELP = dedent(
45
45
  - Use `shellbrain recall` for normal task context.
46
46
  - Use `shellbrain teach` only when the user explicitly asks to store or teach Shellbrain something.
47
47
  - If you changed any files since your last user-facing response, run `shellbrain snapshot` exactly once after validation and immediately before your next user-facing response. Do this on every response cycle where files changed; skip only when no files changed.
48
- - Send a concrete `query` plus required `current_problem`.
48
+ - Send one concrete natural-language query.
49
+ - Recall receives only this query, so include relevant task context naturally.
49
50
  - Avoid generic prompts like "what should I know about this repo?"
50
51
 
51
52
  Internal recall agents:
@@ -74,7 +75,7 @@ _TOP_LEVEL_HELP = dedent(
74
75
  shellbrain admin migrate
75
76
 
76
77
  Working agents:
77
- shellbrain recall --json '{"query":"What context matters for this migration lock timeout?","current_problem":{"goal":"fix migration locking","surface":"db admin","obstacle":"lock timeout","hypothesis":"missing timeout guard"}}'
78
+ shellbrain recall "What context matters for this migration lock timeout?"
78
79
  shellbrain teach --json '{"text":"In this repo, startup wires dependencies but should not own workflow behavior.","current_problem":{"goal":"record architecture preference","surface":"startup and clean architecture","obstacle":"agents may put behavior in startup","hypothesis":"teach should become a durable preference or concept claim"}}'
79
80
  shellbrain snapshot
80
81
 
@@ -158,14 +159,13 @@ _RECALL_HELP = dedent(
158
159
  This is the normal working-agent interface. Working agents should call
159
160
  `recall`, not internal commands like `read`, `events`, or `concept show`.
160
161
 
161
- Requires `query` and `current_problem`.
162
- `current_problem` must include non-empty `goal`, `surface`, `obstacle`, and
163
- `hypothesis`; use an explicit value like "none yet" when there is no hypothesis.
164
- Accepts optional `limit`.
162
+ Pass one self-contained natural-language query naming the failure mode,
163
+ subsystem, decision, file area, or constraint that matters. Recall receives
164
+ only this query, so include relevant task context naturally.
165
165
  It does not mutate memories, concepts, utility observations, or problem runs.
166
166
 
167
167
  Example:
168
- shellbrain recall --json '{"query":"What context matters for this migration lock timeout?","current_problem":{"goal":"fix migration locking","surface":"db admin","obstacle":"Docker unavailable","hypothesis":"none yet"}}'
168
+ shellbrain recall "What context matters for this migration lock timeout?"
169
169
  """
170
170
  )
171
171
 
@@ -565,7 +565,7 @@ def build_parser() -> argparse.ArgumentParser:
565
565
  formatter_class=_HelpFormatter,
566
566
  )
567
567
  _add_repo_context_arguments(recall_parser, suppress_default=True)
568
- _add_payload_arguments(recall_parser)
568
+ recall_parser.add_argument("query", help="Natural-language recall query.")
569
569
 
570
570
  teach_parser = subparsers.add_parser(
571
571
  "teach",
@@ -34,7 +34,7 @@ def render_success_lines(
34
34
  "Repo registration: deferred until first Shellbrain use inside a repo."
35
35
  )
36
36
  lines.append(
37
- 'Next: from inside a repo, run shellbrain recall --json \'{"query":"What prior Shellbrain context matters for this task?","current_problem":{"goal":"start work","surface":"repo session","obstacle":"none yet","hypothesis":"none yet"}}\''
37
+ 'Next: from inside a repo, run shellbrain recall "What prior Shellbrain context matters for this task?"'
38
38
  )
39
39
  else:
40
40
  lines.insert(1, f"Repo: {registration.repo_id}")
@@ -44,7 +44,7 @@ def render_success_lines(
44
44
  "Repo identity is weak-local and will change if this directory moves. Use --repo-id for a durable override.",
45
45
  )
46
46
  lines.append(
47
- 'Next: shellbrain recall --json \'{"query":"What prior Shellbrain context matters for this task?","current_problem":{"goal":"start work","surface":"repo session","obstacle":"none yet","hypothesis":"none yet"}}\''
47
+ 'Next: shellbrain recall "What prior Shellbrain context matters for this task?"'
48
48
  )
49
49
  lines.extend(notes)
50
50
  return lines
@@ -84,37 +84,6 @@ class AgentReadRequest(StrictBaseModel):
84
84
  return value
85
85
 
86
86
 
87
- class AgentRecallCurrentProblem(StrictBaseModel):
88
- """Agent-facing current-problem context for recall synthesis."""
89
-
90
- goal: str = Field(min_length=1)
91
- surface: str = Field(min_length=1)
92
- obstacle: str = Field(min_length=1)
93
- hypothesis: str = Field(min_length=1)
94
-
95
- @field_validator("goal", "surface", "obstacle", "hypothesis")
96
- @classmethod
97
- def _validate_non_blank(cls, value: str) -> str:
98
- """Require every problem context field to be explicit."""
99
-
100
- return _normalize_required_string(
101
- value, field_name="current_problem fields"
102
- )
103
-
104
-
105
- class AgentRecallRequest(StrictBaseModel):
106
- """Agent-facing recall payload with worker problem context."""
107
-
108
- query: str = Field(min_length=1)
109
- limit: int | None = Field(default=None, ge=1, le=100)
110
- current_problem: AgentRecallCurrentProblem
111
-
112
- @field_validator("query")
113
- @classmethod
114
- def _validate_query(cls, value: str) -> str:
115
- return _normalize_required_string(value, field_name="query")
116
-
117
-
118
87
  class AgentTeachRequest(StrictBaseModel):
119
88
  """Worker-facing payload for explicit user teaching."""
120
89
 
@@ -282,17 +251,6 @@ def validate_read_schema(
282
251
  return None, _format_validation_errors(exc)
283
252
 
284
253
 
285
- def validate_recall_schema(
286
- payload: dict[str, Any],
287
- ) -> tuple[AgentRecallRequest | None, list[ErrorDetail]]:
288
- """Validate and parse agent recall payloads into the minimal recall contract."""
289
-
290
- try:
291
- return AgentRecallRequest.model_validate(payload), []
292
- except ValidationError as exc:
293
- return None, _format_validation_errors(exc)
294
-
295
-
296
254
  def validate_events_schema(
297
255
  payload: dict[str, Any],
298
256
  ) -> tuple[AgentEventsRequest | None, list[ErrorDetail]]:
@@ -9,7 +9,6 @@ from app.entrypoints.cli.request_parsing.payload_validation import (
9
9
  validate_internal_read_contract,
10
10
  validate_internal_recall_contract,
11
11
  validate_read_schema,
12
- validate_recall_schema,
13
12
  )
14
13
  from app.entrypoints.cli.request_parsing.prepared import (
15
14
  PreparedOperationRequest,
@@ -67,14 +66,7 @@ def prepare_recall_request(
67
66
  ) -> PreparedOperationRequest[MemoryRecallRequest]:
68
67
  """Validate and hydrate one raw recall payload."""
69
68
 
70
- agent_request, errors = validate_recall_schema(payload)
71
- if errors:
72
- return PreparedOperationRequest(
73
- request=None, errors=errors, error_stage="schema_validation"
74
- )
75
- assert agent_request is not None
76
- hydrated = agent_request.model_dump(mode="python", exclude_none=True)
77
- hydrated.setdefault("op", "recall")
69
+ hydrated = dict(payload)
78
70
  hydrated.setdefault("repo_id", inferred_repo_id)
79
71
  request, contract_errors = validate_internal_recall_contract(hydrated)
80
72
  return PreparedOperationRequest(
@@ -122,13 +122,14 @@ def main(
122
122
  repo_root_arg=getattr(args, "repo_root", None),
123
123
  repo_id_arg=getattr(args, "repo_id", None),
124
124
  )
125
- payload = (
126
- {}
127
- if command == "snapshot"
128
- else _load_payload(
125
+ if command == "snapshot":
126
+ payload = {}
127
+ elif command == "recall":
128
+ payload = {"query": args.query}
129
+ else:
130
+ payload = _load_payload(
129
131
  getattr(args, "json_text", None), getattr(args, "json_file", None)
130
132
  )
131
- )
132
133
  except ValueError as exc:
133
134
  parser.error(str(exc))
134
135
  return 2
@@ -83,18 +83,17 @@ admin/init/upgrade/metrics, filesystem writes, settings writes, and direct DB
83
83
  writes.
84
84
 
85
85
  # PROTOCOL
86
- 1. Read the payload: `query`, `current_problem`, `repo_root`, and budgets.
86
+ 1. Read the payload: `query`, `repo_root`, and budgets. Treat `query` as the
87
+ complete worker context.
87
88
  Use the repo-root-prefixed commands from the payload whenever `repo_root` is
88
89
  provided. Do not omit `--repo-root` in nested Codex.
89
90
  2. Run events first:
90
91
  ```bash
91
92
  shellbrain --no-sync --repo-root "<repo_root>" events --json '{"limit":10}'
92
93
  ```
93
- 3. Build a compact search text from the query and useful parts of
94
- current_problem.goal, surface, obstacle, and hypothesis. Omit placeholders
95
- such as "none yet". Prefer concrete error terms, domain nouns,
96
- files/symbols, and the actual obstacle over generic goal text. Use recent
97
- events to sharpen the query when they reveal better terms.
94
+ 3. Build a compact search text from the query. Prefer concrete error terms,
95
+ domain nouns, files/symbols, and the actual obstacle over generic wording.
96
+ Use recent events to sharpen the query when they reveal better terms.
98
97
  4. Run at least one targeted read:
99
98
  ```bash
100
99
  shellbrain --no-sync --repo-root "<repo_root>" read --json '{"query":"<combined search text>","kinds":["problem","solution","failed_tactic","fact","preference","change"]}'
@@ -114,7 +113,7 @@ writes.
114
113
  ```
115
114
  If multiple concepts match, inspect at most the few most relevant within
116
115
  budget. Prefer concepts whose claims, groundings, or memory links connect
117
- directly to current_problem.surface or current_problem.obstacle. Mention
116
+ directly to the query. Mention
118
117
  competing or ambiguous concepts only when the ambiguity affects the worker.
119
118
  6. Run extra reads only when they are likely to improve the brief: events reveal
120
119
  a sharper query, concept details suggest a related term, the first read was
@@ -155,13 +154,13 @@ context, with empty or minimal arrays and a concrete
155
154
  Lead with the answer. Keep only details that change what the worker should do.
156
155
  Use plain English. One idea per sentence. Leave sections empty unless useful.
157
156
  Summary: max two sentences. Lists: max three items. Items: max one sentence.
158
- Full provenance belongs in telemetry; keep visible sources and anchors minimal.
157
+ Full provenance belongs in telemetry; keep visible anchors minimal.
159
158
 
160
159
  # OUTPUT
161
160
  Return only valid JSON matching `output_contract`.
162
161
  The brief must be compact and action-oriented: summary, constraints,
163
162
  known_traps, prior_cases, concept_orientation, anchors, conflicts, gaps,
164
- next_checks, and sources. Use conflicts for stale, disputed, superseded,
163
+ and next_checks. Use conflicts for stale, disputed, superseded,
165
164
  low-confidence, or mutually inconsistent context. Use gaps for missing context
166
165
  or unresolved questions. Use next_checks for one to three concrete checks the
167
166
  worker should perform because retrieved context makes them high leverage.
@@ -180,7 +179,7 @@ You are Shellbrain build_context_synthesizer.
180
179
  # JOB
181
180
  Synthesize a compact operational recall brief from the deterministic recall
182
181
  graph pack. Do not request more data. Do not run commands. Do not inspect files.
183
- Do not invent facts. Use only the pack.
182
+ Do not invent facts. Use only the pack. The query is the complete worker request.
184
183
 
185
184
  Your job is not to summarize everything. Your job is to tell the working coding
186
185
  agent what prior knowledge changes what it should do next.
@@ -318,9 +317,8 @@ Summary: max two sentences. Lists: max three items. Items: max one sentence.
318
317
  Full provenance belongs in telemetry; keep visible anchors minimal.
319
318
 
320
319
  # OUTPUT
321
- Return only valid JSON matching `output_contract`. Return a `brief` object only;
322
- do not include read_trace or sources. Keep each list compact. Shellbrain attaches
323
- deterministic source provenance after synthesis.
320
+ Return only valid JSON matching `output_contract`. Return a `brief` object only.
321
+ Keep each list compact.
324
322
  """
325
323
 
326
324
 
@@ -867,7 +865,6 @@ def render_build_context_prompt(request: InnerAgentRunRequest) -> str:
867
865
  shellbrain = _shellbrain_command(request.repo_root, no_sync=True)
868
866
  payload = {
869
867
  "query": request.query,
870
- "current_problem": request.current_problem,
871
868
  "repo_root": request.repo_root,
872
869
  "budgets": {
873
870
  "max_private_reads": request.max_private_reads,
@@ -905,14 +902,6 @@ def render_build_context_prompt(request: InnerAgentRunRequest) -> str:
905
902
  "conflicts": ["string"],
906
903
  "gaps": ["string"],
907
904
  "next_checks": ["string"],
908
- "sources": [
909
- {
910
- "kind": "memory|concept|episode_event",
911
- "id": "source id or concept ref",
912
- "facet": "claim|relation|grounding|memory_link|event|memory when applicable",
913
- "used_in": "summary|constraints|known_traps|prior_cases|concept_orientation|anchors|conflicts|gaps|next_checks",
914
- }
915
- ],
916
905
  },
917
906
  "read_trace": {
918
907
  "commands": [
@@ -938,7 +927,6 @@ def render_build_context_synthesis_prompt(request: InnerAgentRunRequest) -> str:
938
927
 
939
928
  payload = {
940
929
  "query": request.query,
941
- "current_problem": request.current_problem,
942
930
  "budgets": {
943
931
  "max_brief_tokens": request.max_brief_tokens,
944
932
  },
@@ -50,7 +50,6 @@ def build_recall_summary_records(
50
50
  source_kind=str(item["source_kind"]),
51
51
  source_id=str(item["source_id"]),
52
52
  input_section=str(item["input_section"]),
53
- output_section=_optional_string(item.get("output_section")),
54
53
  )
55
54
  )
56
55
 
@@ -107,7 +107,6 @@ class RecallSourceItemRecord:
107
107
  source_kind: str
108
108
  source_id: str
109
109
  input_section: str
110
- output_section: str | None
111
110
 
112
111
 
113
112
  @dataclass(frozen=True)
@@ -22,9 +22,11 @@ If prior context may help:
22
22
  Then run:
23
23
 
24
24
  ```bash
25
- shellbrain recall --json '{"query":"<targeted question>","current_problem":{"goal":"<goal>","surface":"<surface>","obstacle":"<obstacle>","hypothesis":"<hypothesis or none yet>"}}'
25
+ shellbrain recall "<targeted natural-language question>"
26
26
  ```
27
27
 
28
+ Recall receives only this query, so include relevant task context naturally in the question.
29
+
28
30
  If recall would not help:
29
31
 
30
32
  `SB: skip | same signature | <one-line reason>`