shellbrain 0.1.34__tar.gz → 0.1.36__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 (465) hide show
  1. {shellbrain-0.1.34 → shellbrain-0.1.36}/PKG-INFO +31 -30
  2. {shellbrain-0.1.34 → shellbrain-0.1.36}/README.md +30 -29
  3. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/core/entities/associations.py +0 -1
  4. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/core/entities/concepts.py +31 -5
  5. shellbrain-0.1.36/app/core/entities/evidence.py +222 -0
  6. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/core/entities/memories.py +80 -4
  7. shellbrain-0.1.36/app/core/entities/structural_memory_relations.py +153 -0
  8. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/core/policies/memories/add_plan.py +22 -7
  9. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/core/policies/memories/link_rules.py +9 -32
  10. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/core/policies/memories/update_plan.py +46 -9
  11. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/core/policies/retrieval/context_pack.py +4 -5
  12. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/core/policies/retrieval/expansion.py +13 -34
  13. shellbrain-0.1.36/app/core/policies/retrieval/ontology_semantics.py +226 -0
  14. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/core/ports/db/concept_repositories.py +24 -4
  15. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/core/ports/db/memory_repositories.py +35 -31
  16. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/core/ports/db/retrieval_repositories.py +3 -13
  17. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/core/use_cases/concepts/show/execute.py +3 -1
  18. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/core/use_cases/concepts/show/request.py +6 -1
  19. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/core/use_cases/concepts/update/__init__.py +2 -0
  20. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/core/use_cases/concepts/update/execute.py +195 -27
  21. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/core/use_cases/concepts/update/request.py +40 -7
  22. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/core/use_cases/concepts/views.py +63 -0
  23. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/core/use_cases/memories/add/execute.py +10 -0
  24. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/core/use_cases/memories/add/result.py +1 -0
  25. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/core/use_cases/memories/effect_plan.py +38 -15
  26. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/core/use_cases/memories/reference_checks.py +93 -17
  27. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/core/use_cases/memories/update/execute.py +23 -3
  28. shellbrain-0.1.36/app/core/use_cases/memories/update/request.py +256 -0
  29. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/core/use_cases/memories/update/result.py +2 -1
  30. shellbrain-0.1.36/app/core/use_cases/plan_execution.py +370 -0
  31. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/core/use_cases/retrieval/build_context/execute.py +1 -1
  32. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/core/use_cases/retrieval/context_pack_pipeline.py +17 -3
  33. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/core/use_cases/retrieval/deterministic_graph_recall.py +158 -167
  34. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/core/use_cases/retrieval/expansion.py +26 -23
  35. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/core/use_cases/retrieval/read_concepts.py +56 -44
  36. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/core/use_cases/retrieval/seed_retrieval.py +22 -19
  37. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/entrypoints/cli/handlers/internal_agent/concepts/update.py +1 -0
  38. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/entrypoints/cli/handlers/internal_agent/memories/update.py +1 -0
  39. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/entrypoints/cli/parser/builder.py +17 -16
  40. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/infrastructure/db/runtime/models/associations.py +0 -17
  41. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/infrastructure/db/runtime/models/concepts.py +56 -21
  42. shellbrain-0.1.36/app/infrastructure/db/runtime/models/evidence.py +114 -0
  43. shellbrain-0.1.36/app/infrastructure/db/runtime/models/experiences.py +130 -0
  44. shellbrain-0.1.36/app/infrastructure/db/runtime/models/memories.py +110 -0
  45. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/infrastructure/db/runtime/models/utility.py +0 -17
  46. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/infrastructure/db/runtime/models/views.py +21 -27
  47. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/infrastructure/db/runtime/repos/relational/concepts_repo.py +234 -41
  48. shellbrain-0.1.36/app/infrastructure/db/runtime/repos/relational/evidence_repo.py +353 -0
  49. shellbrain-0.1.36/app/infrastructure/db/runtime/repos/relational/experiences_repo.py +159 -0
  50. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/infrastructure/db/runtime/repos/relational/memories_repo.py +56 -7
  51. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/infrastructure/db/runtime/repos/relational/read_policy_repo.py +24 -59
  52. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/infrastructure/db/runtime/repos/semantic/keyword_retrieval_repo.py +10 -3
  53. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/infrastructure/db/runtime/repos/semantic/semantic_retrieval_repo.py +28 -6
  54. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/infrastructure/host_apps/inner_agents/prompt.py +72 -70
  55. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/infrastructure/telemetry/write_records.py +45 -17
  56. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/settings/internal-agents/defaults.yaml +1 -1
  57. shellbrain-0.1.36/migrations/_legacy_usage_views.py +91 -0
  58. shellbrain-0.1.36/migrations/_usage_view_sql.py +1114 -0
  59. {shellbrain-0.1.34 → shellbrain-0.1.36}/migrations/versions/20260312_0003_drop_create_confidence.py +11 -2
  60. {shellbrain-0.1.34 → shellbrain-0.1.36}/migrations/versions/20260318_0006_usage_telemetry_schema.py +1 -1
  61. {shellbrain-0.1.34 → shellbrain-0.1.36}/migrations/versions/20260414_0010_model_usage_telemetry.py +5 -3
  62. {shellbrain-0.1.34 → shellbrain-0.1.36}/migrations/versions/20260414_0011_usage_problem_tokens_multi_solution_metrics.py +4 -2
  63. {shellbrain-0.1.34 → shellbrain-0.1.36}/migrations/versions/20260415_0012_read_pack_cost_and_read_roi.py +1 -1
  64. {shellbrain-0.1.34 → shellbrain-0.1.36}/migrations/versions/20260422_0015_problem_runs.py +7 -5
  65. {shellbrain-0.1.34 → shellbrain-0.1.36}/migrations/versions/20260516_0020_knowledge_build_observability.py +1 -1
  66. shellbrain-0.1.36/migrations/versions/20260522_0029_remove_frontier_and_memory_anchors.py +490 -0
  67. shellbrain-0.1.36/migrations/versions/20260522_0030_concept_lifecycle_events.py +116 -0
  68. shellbrain-0.1.36/migrations/versions/20260522_0031_unified_evidence_storage.py +469 -0
  69. shellbrain-0.1.36/migrations/versions/20260522_0032_memory_lifecycle_events.py +171 -0
  70. shellbrain-0.1.36/migrations/versions/20260522_0033_concept_memory_role_cleanup.py +205 -0
  71. shellbrain-0.1.36/migrations/versions/20260522_0034_structural_memory_relations.py +387 -0
  72. shellbrain-0.1.36/migrations/versions/20260522_0035_retire_legacy_compatibility_tables.py +346 -0
  73. {shellbrain-0.1.34 → shellbrain-0.1.36}/pyproject.toml +1 -1
  74. {shellbrain-0.1.34 → shellbrain-0.1.36}/shellbrain.egg-info/PKG-INFO +31 -30
  75. {shellbrain-0.1.34 → shellbrain-0.1.36}/shellbrain.egg-info/SOURCES.txt +11 -1
  76. shellbrain-0.1.34/app/core/entities/evidence.py +0 -37
  77. shellbrain-0.1.34/app/core/entities/facts.py +0 -30
  78. shellbrain-0.1.34/app/core/use_cases/memories/update/request.py +0 -135
  79. shellbrain-0.1.34/app/core/use_cases/plan_execution.py +0 -167
  80. shellbrain-0.1.34/app/infrastructure/db/runtime/models/evidence.py +0 -21
  81. shellbrain-0.1.34/app/infrastructure/db/runtime/models/experiences.py +0 -88
  82. shellbrain-0.1.34/app/infrastructure/db/runtime/models/memories.py +0 -80
  83. shellbrain-0.1.34/app/infrastructure/db/runtime/repos/relational/evidence_repo.py +0 -116
  84. shellbrain-0.1.34/app/infrastructure/db/runtime/repos/relational/experiences_repo.py +0 -41
  85. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/__init__.py +0 -0
  86. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/__main__.py +0 -0
  87. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/core/__init__.py +0 -0
  88. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/core/entities/__init__.py +0 -0
  89. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/core/entities/admin_errors.py +0 -0
  90. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/core/entities/backups.py +0 -0
  91. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/core/entities/episodes.py +0 -0
  92. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/core/entities/guidance.py +0 -0
  93. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/core/entities/identity.py +0 -0
  94. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/core/entities/ids.py +0 -0
  95. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/core/entities/inner_agents.py +0 -0
  96. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/core/entities/knowledge_builder.py +0 -0
  97. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/core/entities/machine_config.py +0 -0
  98. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/core/entities/runtime_context.py +0 -0
  99. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/core/entities/scenarios.py +0 -0
  100. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/core/entities/session_state.py +0 -0
  101. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/core/entities/settings.py +0 -0
  102. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/core/entities/utility.py +0 -0
  103. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/core/errors.py +0 -0
  104. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/core/policies/__init__.py +0 -0
  105. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/core/policies/concepts/__init__.py +0 -0
  106. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/core/policies/concepts/relation_rules.py +0 -0
  107. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/core/policies/concepts/search_text.py +0 -0
  108. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/core/policies/episodes/__init__.py +0 -0
  109. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/core/policies/episodes/event_content.py +0 -0
  110. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/core/policies/episodes/knowledge_building.py +0 -0
  111. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/core/policies/memories/__init__.py +0 -0
  112. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/core/policies/retrieval/__init__.py +0 -0
  113. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/core/policies/retrieval/bm25.py +0 -0
  114. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/core/policies/retrieval/fusion_rrf.py +0 -0
  115. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/core/policies/retrieval/lexical_query.py +0 -0
  116. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/core/policies/retrieval/scoring.py +0 -0
  117. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/core/ports/__init__.py +0 -0
  118. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/core/ports/db/__init__.py +0 -0
  119. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/core/ports/db/episode_repositories.py +0 -0
  120. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/core/ports/db/guidance.py +0 -0
  121. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/core/ports/db/knowledge_builder.py +0 -0
  122. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/core/ports/db/problem_runs.py +0 -0
  123. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/core/ports/db/unit_of_work.py +0 -0
  124. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/core/ports/embeddings/__init__.py +0 -0
  125. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/core/ports/embeddings/provider.py +0 -0
  126. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/core/ports/embeddings/retrieval.py +0 -0
  127. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/core/ports/host_apps/__init__.py +0 -0
  128. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/core/ports/host_apps/inner_agents.py +0 -0
  129. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/core/ports/local_state/__init__.py +0 -0
  130. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/core/ports/local_state/session_state_store.py +0 -0
  131. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/core/ports/reporting/__init__.py +0 -0
  132. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/core/ports/reporting/metrics.py +0 -0
  133. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/core/ports/system/__init__.py +0 -0
  134. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/core/ports/system/clock.py +0 -0
  135. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/core/ports/system/idgen.py +0 -0
  136. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/core/use_cases/__init__.py +0 -0
  137. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/core/use_cases/admin/__init__.py +0 -0
  138. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/core/use_cases/admin/analytics_diagnostics.py +0 -0
  139. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/core/use_cases/admin/backfill_model_usage/__init__.py +0 -0
  140. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/core/use_cases/admin/backfill_model_usage/backfill_model_usage.py +0 -0
  141. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/core/use_cases/admin/backfill_model_usage/request.py +0 -0
  142. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/core/use_cases/admin/backfill_model_usage/result.py +0 -0
  143. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/core/use_cases/admin/create_backup.py +0 -0
  144. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/core/use_cases/admin/diagnose_runtime.py +0 -0
  145. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/core/use_cases/admin/generate_analytics_report.py +0 -0
  146. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/core/use_cases/admin/initialize_runtime.py +0 -0
  147. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/core/use_cases/admin/restore_backup.py +0 -0
  148. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/core/use_cases/admin/verify_backup.py +0 -0
  149. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/core/use_cases/build_guidance.py +0 -0
  150. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/core/use_cases/concepts/__init__.py +0 -0
  151. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/core/use_cases/concepts/add/__init__.py +0 -0
  152. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/core/use_cases/concepts/add/execute.py +0 -0
  153. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/core/use_cases/concepts/add/request.py +0 -0
  154. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/core/use_cases/concepts/add/result.py +0 -0
  155. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/core/use_cases/concepts/containment_checks.py +0 -0
  156. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/core/use_cases/concepts/embeddings.py +0 -0
  157. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/core/use_cases/concepts/reference_checks.py +0 -0
  158. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/core/use_cases/concepts/show/__init__.py +0 -0
  159. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/core/use_cases/concepts/show/result.py +0 -0
  160. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/core/use_cases/concepts/update/result.py +0 -0
  161. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/core/use_cases/episodes/__init__.py +0 -0
  162. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/core/use_cases/episodes/events/__init__.py +0 -0
  163. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/core/use_cases/episodes/events/request.py +0 -0
  164. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/core/use_cases/episodes/sync_discovered_host_session.py +0 -0
  165. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/core/use_cases/episodes/sync_episode/__init__.py +0 -0
  166. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/core/use_cases/episodes/sync_episode/request.py +0 -0
  167. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/core/use_cases/episodes/sync_episode/result.py +0 -0
  168. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/core/use_cases/episodes/sync_episode/sync_episode.py +0 -0
  169. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/core/use_cases/knowledge_builder/__init__.py +0 -0
  170. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/core/use_cases/knowledge_builder/build_knowledge/__init__.py +0 -0
  171. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/core/use_cases/knowledge_builder/build_knowledge/execute.py +0 -0
  172. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/core/use_cases/knowledge_builder/build_knowledge/request.py +0 -0
  173. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/core/use_cases/knowledge_builder/build_knowledge/result.py +0 -0
  174. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/core/use_cases/knowledge_builder/teach_knowledge/__init__.py +0 -0
  175. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/core/use_cases/knowledge_builder/teach_knowledge/execute.py +0 -0
  176. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/core/use_cases/knowledge_builder/teach_knowledge/request.py +0 -0
  177. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/core/use_cases/knowledge_builder/teach_knowledge/result.py +0 -0
  178. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/core/use_cases/memories/__init__.py +0 -0
  179. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/core/use_cases/memories/add/__init__.py +0 -0
  180. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/core/use_cases/memories/add/request.py +0 -0
  181. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/core/use_cases/memories/update/__init__.py +0 -0
  182. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/core/use_cases/metrics/__init__.py +0 -0
  183. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/core/use_cases/metrics/analyze_agent_behavior.py +0 -0
  184. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/core/use_cases/metrics/build_snapshot.py +0 -0
  185. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/core/use_cases/metrics/generate_dashboard.py +0 -0
  186. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/core/use_cases/retrieval/__init__.py +0 -0
  187. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/core/use_cases/retrieval/build_context/__init__.py +0 -0
  188. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/core/use_cases/retrieval/concept_seed_retrieval.py +0 -0
  189. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/core/use_cases/retrieval/read/__init__.py +0 -0
  190. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/core/use_cases/retrieval/read/execute.py +0 -0
  191. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/core/use_cases/retrieval/read/request.py +0 -0
  192. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/core/use_cases/retrieval/read/result.py +0 -0
  193. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/core/use_cases/retrieval/recall/__init__.py +0 -0
  194. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/core/use_cases/retrieval/recall/execute.py +0 -0
  195. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/core/use_cases/retrieval/recall/request.py +0 -0
  196. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/core/use_cases/retrieval/recall/result.py +0 -0
  197. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/core/use_cases/scenarios/__init__.py +0 -0
  198. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/core/use_cases/scenarios/record/__init__.py +0 -0
  199. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/core/use_cases/scenarios/record/execute.py +0 -0
  200. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/core/use_cases/scenarios/record/request.py +0 -0
  201. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/core/use_cases/scenarios/record/result.py +0 -0
  202. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/entrypoints/__init__.py +0 -0
  203. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/entrypoints/cli/__init__.py +0 -0
  204. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/entrypoints/cli/error_responses.py +0 -0
  205. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/entrypoints/cli/handlers/__init__.py +0 -0
  206. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/entrypoints/cli/handlers/cli_operation.py +0 -0
  207. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/entrypoints/cli/handlers/dependencies.py +0 -0
  208. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/entrypoints/cli/handlers/human/__init__.py +0 -0
  209. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/entrypoints/cli/handlers/human/admin.py +0 -0
  210. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/entrypoints/cli/handlers/human/admin_dependencies.py +0 -0
  211. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/entrypoints/cli/handlers/human/init.py +0 -0
  212. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/entrypoints/cli/handlers/human/metrics.py +0 -0
  213. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/entrypoints/cli/handlers/human/upgrade.py +0 -0
  214. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/entrypoints/cli/handlers/internal_agent/__init__.py +0 -0
  215. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/entrypoints/cli/handlers/internal_agent/concepts/__init__.py +0 -0
  216. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/entrypoints/cli/handlers/internal_agent/concepts/add.py +0 -0
  217. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/entrypoints/cli/handlers/internal_agent/concepts/show.py +0 -0
  218. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/entrypoints/cli/handlers/internal_agent/episodes/__init__.py +0 -0
  219. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/entrypoints/cli/handlers/internal_agent/episodes/events.py +0 -0
  220. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/entrypoints/cli/handlers/internal_agent/episodes/selection.py +0 -0
  221. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/entrypoints/cli/handlers/internal_agent/episodes/serialization.py +0 -0
  222. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/entrypoints/cli/handlers/internal_agent/memories/__init__.py +0 -0
  223. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/entrypoints/cli/handlers/internal_agent/memories/add.py +0 -0
  224. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/entrypoints/cli/handlers/internal_agent/memories/utility_vote_evidence.py +0 -0
  225. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/entrypoints/cli/handlers/internal_agent/retrieval/__init__.py +0 -0
  226. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/entrypoints/cli/handlers/internal_agent/retrieval/execution.py +0 -0
  227. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/entrypoints/cli/handlers/internal_agent/retrieval/read.py +0 -0
  228. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/entrypoints/cli/handlers/internal_agent/scenarios/__init__.py +0 -0
  229. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/entrypoints/cli/handlers/internal_agent/scenarios/record.py +0 -0
  230. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/entrypoints/cli/handlers/result_envelopes.py +0 -0
  231. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/entrypoints/cli/handlers/session_state.py +0 -0
  232. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/entrypoints/cli/handlers/working_agent/__init__.py +0 -0
  233. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/entrypoints/cli/handlers/working_agent/recall.py +0 -0
  234. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/entrypoints/cli/handlers/working_agent/teach.py +0 -0
  235. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/entrypoints/cli/main.py +0 -0
  236. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/entrypoints/cli/operation_command.py +0 -0
  237. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/entrypoints/cli/parser/__init__.py +0 -0
  238. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/entrypoints/cli/presenters/__init__.py +0 -0
  239. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/entrypoints/cli/presenters/init.py +0 -0
  240. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/entrypoints/cli/presenters/json.py +0 -0
  241. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/entrypoints/cli/presenters/metrics.py +0 -0
  242. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/entrypoints/cli/request_parsing/__init__.py +0 -0
  243. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/entrypoints/cli/request_parsing/concepts.py +0 -0
  244. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/entrypoints/cli/request_parsing/episodes.py +0 -0
  245. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/entrypoints/cli/request_parsing/hydration.py +0 -0
  246. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/entrypoints/cli/request_parsing/memories.py +0 -0
  247. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/entrypoints/cli/request_parsing/payload_validation.py +0 -0
  248. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/entrypoints/cli/request_parsing/prepared.py +0 -0
  249. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/entrypoints/cli/request_parsing/retrieval.py +0 -0
  250. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/entrypoints/cli/request_parsing/scenarios.py +0 -0
  251. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/entrypoints/cli/request_parsing/teach.py +0 -0
  252. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/entrypoints/cli/runner.py +0 -0
  253. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/entrypoints/cli/runtime.py +0 -0
  254. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/entrypoints/host_hooks/__init__.py +0 -0
  255. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/entrypoints/host_hooks/claude_session_start.py +0 -0
  256. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/entrypoints/host_hooks/cursor_statusline.py +0 -0
  257. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/entrypoints/jobs/__init__.py +0 -0
  258. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/entrypoints/jobs/episode_sync.py +0 -0
  259. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/infrastructure/__init__.py +0 -0
  260. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/infrastructure/db/__init__.py +0 -0
  261. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/infrastructure/db/admin/__init__.py +0 -0
  262. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/infrastructure/db/admin/app_role_safety.py +0 -0
  263. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/infrastructure/db/admin/backups/__init__.py +0 -0
  264. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/infrastructure/db/admin/backups/destructive_guard.py +0 -0
  265. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/infrastructure/db/admin/backups/logical_backup.py +0 -0
  266. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/infrastructure/db/admin/backups/manifest_store.py +0 -0
  267. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/infrastructure/db/admin/backups/restore.py +0 -0
  268. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/infrastructure/db/admin/connection.py +0 -0
  269. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/infrastructure/db/admin/instance_guard.py +0 -0
  270. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/infrastructure/db/admin/migrations.py +0 -0
  271. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/infrastructure/db/admin/privileges.py +0 -0
  272. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/infrastructure/db/admin/provisioning/__init__.py +0 -0
  273. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/infrastructure/db/admin/provisioning/docker_prerequisites.py +0 -0
  274. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/infrastructure/db/admin/provisioning/external_postgres.py +0 -0
  275. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/infrastructure/db/admin/provisioning/init_effects.py +0 -0
  276. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/infrastructure/db/admin/provisioning/managed_local.py +0 -0
  277. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/infrastructure/db/admin/storage_setup.py +0 -0
  278. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/infrastructure/db/runtime/__init__.py +0 -0
  279. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/infrastructure/db/runtime/engine.py +0 -0
  280. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/infrastructure/db/runtime/models/__init__.py +0 -0
  281. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/infrastructure/db/runtime/models/episodes.py +0 -0
  282. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/infrastructure/db/runtime/models/instance_metadata.py +0 -0
  283. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/infrastructure/db/runtime/models/knowledge_builder.py +0 -0
  284. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/infrastructure/db/runtime/models/metadata.py +0 -0
  285. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/infrastructure/db/runtime/models/problem_runs.py +0 -0
  286. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/infrastructure/db/runtime/models/registry.py +0 -0
  287. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/infrastructure/db/runtime/models/telemetry.py +0 -0
  288. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/infrastructure/db/runtime/queries/__init__.py +0 -0
  289. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/infrastructure/db/runtime/queries/agent_behavior.py +0 -0
  290. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/infrastructure/db/runtime/queries/analytics.py +0 -0
  291. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/infrastructure/db/runtime/queries/metrics.py +0 -0
  292. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/infrastructure/db/runtime/queries/metrics_adapter.py +0 -0
  293. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/infrastructure/db/runtime/queries/model_usage_backfill.py +0 -0
  294. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/infrastructure/db/runtime/repos/__init__.py +0 -0
  295. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/infrastructure/db/runtime/repos/relational/__init__.py +0 -0
  296. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/infrastructure/db/runtime/repos/relational/associations_repo.py +0 -0
  297. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/infrastructure/db/runtime/repos/relational/episodes_repo.py +0 -0
  298. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/infrastructure/db/runtime/repos/relational/knowledge_builder_repo.py +0 -0
  299. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/infrastructure/db/runtime/repos/relational/problem_runs_repo.py +0 -0
  300. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/infrastructure/db/runtime/repos/relational/telemetry_repo.py +0 -0
  301. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/infrastructure/db/runtime/repos/relational/utility_repo.py +0 -0
  302. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/infrastructure/db/runtime/repos/semantic/__init__.py +0 -0
  303. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/infrastructure/db/runtime/repos/semantic/concept_retrieval_repo.py +0 -0
  304. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/infrastructure/db/runtime/session.py +0 -0
  305. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/infrastructure/db/runtime/uow.py +0 -0
  306. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/infrastructure/embeddings/__init__.py +0 -0
  307. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/infrastructure/embeddings/local_provider.py +0 -0
  308. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/infrastructure/embeddings/prewarm.py +0 -0
  309. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/infrastructure/embeddings/query_vector_search.py +0 -0
  310. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/infrastructure/host_apps/__init__.py +0 -0
  311. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/infrastructure/host_apps/assets/__init__.py +0 -0
  312. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/infrastructure/host_apps/assets/claude.py +0 -0
  313. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/infrastructure/host_apps/assets/codex.py +0 -0
  314. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/infrastructure/host_apps/assets/cursor.py +0 -0
  315. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/infrastructure/host_apps/assets/cursor_statusline_config.py +0 -0
  316. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/infrastructure/host_apps/assets/inspection.py +0 -0
  317. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/infrastructure/host_apps/assets/managed_markdown.py +0 -0
  318. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/infrastructure/host_apps/assets/managed_tree.py +0 -0
  319. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/infrastructure/host_apps/assets/packaged_assets.py +0 -0
  320. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/infrastructure/host_apps/assets/paths.py +0 -0
  321. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/infrastructure/host_apps/assets/service.py +0 -0
  322. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/infrastructure/host_apps/assets/types.py +0 -0
  323. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/infrastructure/host_apps/identity/__init__.py +0 -0
  324. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/infrastructure/host_apps/identity/claude_hook_install.py +0 -0
  325. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/infrastructure/host_apps/identity/claude_runtime.py +0 -0
  326. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/infrastructure/host_apps/identity/codex_runtime.py +0 -0
  327. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/infrastructure/host_apps/identity/compatibility.py +0 -0
  328. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/infrastructure/host_apps/identity/cursor_statusline.py +0 -0
  329. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/infrastructure/host_apps/identity/resolver.py +0 -0
  330. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/infrastructure/host_apps/inner_agents/__init__.py +0 -0
  331. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/infrastructure/host_apps/inner_agents/codex_cli.py +0 -0
  332. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/infrastructure/host_apps/inner_agents/output_parser.py +0 -0
  333. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/infrastructure/host_apps/transcripts/__init__.py +0 -0
  334. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/infrastructure/host_apps/transcripts/claude_code.py +0 -0
  335. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/infrastructure/host_apps/transcripts/codex.py +0 -0
  336. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/infrastructure/host_apps/transcripts/cursor.py +0 -0
  337. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/infrastructure/host_apps/transcripts/model_usage.py +0 -0
  338. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/infrastructure/host_apps/transcripts/normalization.py +0 -0
  339. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/infrastructure/host_apps/transcripts/session_selection.py +0 -0
  340. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/infrastructure/host_apps/transcripts/source_discovery.py +0 -0
  341. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/infrastructure/host_apps/transcripts/tool_filter.py +0 -0
  342. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/infrastructure/local_state/__init__.py +0 -0
  343. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/infrastructure/local_state/init_lock.py +0 -0
  344. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/infrastructure/local_state/machine_config_store.py +0 -0
  345. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/infrastructure/local_state/operation_registration.py +0 -0
  346. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/infrastructure/local_state/paths.py +0 -0
  347. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/infrastructure/local_state/repo_registration_store.py +0 -0
  348. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/infrastructure/local_state/session_state_file_store.py +0 -0
  349. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/infrastructure/process/__init__.py +0 -0
  350. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/infrastructure/process/episode_sync/__init__.py +0 -0
  351. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/infrastructure/process/episode_sync/autostart.py +0 -0
  352. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/infrastructure/process/episode_sync/launcher.py +0 -0
  353. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/infrastructure/process/episode_sync/lock_file.py +0 -0
  354. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/infrastructure/process/episode_sync/poller.py +0 -0
  355. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/infrastructure/process/episode_sync/status_store.py +0 -0
  356. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/infrastructure/reporting/__init__.py +0 -0
  357. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/infrastructure/reporting/metrics/__init__.py +0 -0
  358. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/infrastructure/reporting/metrics/artifacts.py +0 -0
  359. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/infrastructure/reporting/metrics/browser.py +0 -0
  360. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/infrastructure/reporting/metrics/pager.py +0 -0
  361. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/infrastructure/reporting/metrics/render_html.py +0 -0
  362. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/infrastructure/system/__init__.py +0 -0
  363. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/infrastructure/system/clock.py +0 -0
  364. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/infrastructure/system/id_generator.py +0 -0
  365. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/infrastructure/system/package_upgrade.py +0 -0
  366. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/infrastructure/telemetry/__init__.py +0 -0
  367. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/infrastructure/telemetry/inner_agent_records.py +0 -0
  368. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/infrastructure/telemetry/operation_invocations.py +0 -0
  369. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/infrastructure/telemetry/operation_polling.py +0 -0
  370. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/infrastructure/telemetry/read_records.py +0 -0
  371. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/infrastructure/telemetry/recall_records.py +0 -0
  372. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/infrastructure/telemetry/recorder.py +0 -0
  373. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/infrastructure/telemetry/records.py +0 -0
  374. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/infrastructure/telemetry/sink.py +0 -0
  375. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/infrastructure/telemetry/storage_protocols.py +0 -0
  376. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/infrastructure/telemetry/sync_records.py +0 -0
  377. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/settings/__init__.py +0 -0
  378. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/settings/defaults/create_policy.yaml +0 -0
  379. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/settings/defaults/read_policy.yaml +0 -0
  380. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/settings/defaults/runtime.yaml +0 -0
  381. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/settings/defaults/thresholds.yaml +0 -0
  382. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/settings/defaults/update_policy.yaml +0 -0
  383. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/startup/__init__.py +0 -0
  384. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/startup/admin.py +0 -0
  385. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/startup/admin_db.py +0 -0
  386. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/startup/admin_dependencies.py +0 -0
  387. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/startup/admin_diagnose.py +0 -0
  388. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/startup/analytics.py +0 -0
  389. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/startup/backup.py +0 -0
  390. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/startup/cli.py +0 -0
  391. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/startup/cli_runtime.py +0 -0
  392. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/startup/config.py +0 -0
  393. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/startup/create_policy.py +0 -0
  394. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/startup/db.py +0 -0
  395. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/startup/dsn_resolution.py +0 -0
  396. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/startup/embeddings.py +0 -0
  397. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/startup/episode_poller.py +0 -0
  398. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/startup/episode_sync_launcher.py +0 -0
  399. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/startup/host_hooks.py +0 -0
  400. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/startup/internal_agent_config.py +0 -0
  401. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/startup/internal_agents.py +0 -0
  402. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/startup/knowledge_builder.py +0 -0
  403. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/startup/metrics.py +0 -0
  404. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/startup/migrations.py +0 -0
  405. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/startup/model_usage_backfill.py +0 -0
  406. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/startup/operation_dependencies.py +0 -0
  407. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/startup/read_policy.py +0 -0
  408. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/startup/repo_context.py +0 -0
  409. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/startup/repos.py +0 -0
  410. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/startup/retrieval.py +0 -0
  411. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/startup/runtime_admin.py +0 -0
  412. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/startup/runtime_context.py +0 -0
  413. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/startup/settings.py +0 -0
  414. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/startup/thresholds.py +0 -0
  415. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/startup/update_policy.py +0 -0
  416. {shellbrain-0.1.34 → shellbrain-0.1.36}/app/startup/use_cases.py +0 -0
  417. {shellbrain-0.1.34 → shellbrain-0.1.36}/migrations/__init__.py +0 -0
  418. {shellbrain-0.1.34 → shellbrain-0.1.36}/migrations/env.py +0 -0
  419. {shellbrain-0.1.34 → shellbrain-0.1.36}/migrations/versions/20260226_0001_initial_schema.py +0 -0
  420. {shellbrain-0.1.34 → shellbrain-0.1.36}/migrations/versions/20260312_0002_add_hard_invariants.py +0 -0
  421. {shellbrain-0.1.34 → shellbrain-0.1.36}/migrations/versions/20260313_0004_episode_sync_hardening.py +0 -0
  422. {shellbrain-0.1.34 → shellbrain-0.1.36}/migrations/versions/20260313_0005_evidence_episode_event_refs.py +0 -0
  423. {shellbrain-0.1.34 → shellbrain-0.1.36}/migrations/versions/20260319_0007_identity_session_guidance.py +0 -0
  424. {shellbrain-0.1.34 → shellbrain-0.1.36}/migrations/versions/20260320_0008_instance_metadata_and_backup_safety.py +0 -0
  425. {shellbrain-0.1.34 → shellbrain-0.1.36}/migrations/versions/20260410_0009_frontier_memory_family.py +0 -0
  426. {shellbrain-0.1.34 → shellbrain-0.1.36}/migrations/versions/20260421_0013_concept_context_graph.py +0 -0
  427. {shellbrain-0.1.34 → shellbrain-0.1.36}/migrations/versions/20260422_0014_concept_read_telemetry.py +0 -0
  428. {shellbrain-0.1.34 → shellbrain-0.1.36}/migrations/versions/20260508_0016_recall_telemetry.py +0 -0
  429. {shellbrain-0.1.34 → shellbrain-0.1.36}/migrations/versions/20260511_0017_inner_agent_invocations.py +0 -0
  430. {shellbrain-0.1.34 → shellbrain-0.1.36}/migrations/versions/20260513_0018_knowledge_build_runs.py +0 -0
  431. {shellbrain-0.1.34 → shellbrain-0.1.36}/migrations/versions/20260515_0019_scenario_records.py +0 -0
  432. {shellbrain-0.1.34 → shellbrain-0.1.36}/migrations/versions/20260519_0021_knowledge_build_watermark_stable.py +0 -0
  433. {shellbrain-0.1.34 → shellbrain-0.1.36}/migrations/versions/20260519_0022_update_evidence_links.py +0 -0
  434. {shellbrain-0.1.34 → shellbrain-0.1.36}/migrations/versions/20260519_0023_explicit_teach_trigger.py +0 -0
  435. {shellbrain-0.1.34 → shellbrain-0.1.36}/migrations/versions/20260519_0024_read_retrieval_latency_indexes.py +0 -0
  436. {shellbrain-0.1.34 → shellbrain-0.1.36}/migrations/versions/20260519_0025_repair_recall_source_input_section_constraint.py +0 -0
  437. {shellbrain-0.1.34 → shellbrain-0.1.36}/migrations/versions/20260519_0026_repair_knowledge_build_trigger_constraint.py +0 -0
  438. {shellbrain-0.1.34 → shellbrain-0.1.36}/migrations/versions/20260519_0027_concept_embeddings.py +0 -0
  439. {shellbrain-0.1.34 → shellbrain-0.1.36}/migrations/versions/20260520_0028_knowledge_build_lifecycle.py +0 -0
  440. {shellbrain-0.1.34 → shellbrain-0.1.36}/migrations/versions/__init__.py +0 -0
  441. {shellbrain-0.1.34 → shellbrain-0.1.36}/onboarding_assets/__init__.py +0 -0
  442. {shellbrain-0.1.34 → shellbrain-0.1.36}/onboarding_assets/claude/CLAUDE.md +0 -0
  443. {shellbrain-0.1.34 → shellbrain-0.1.36}/onboarding_assets/claude/skills/shellbrain/SKILL.md +0 -0
  444. {shellbrain-0.1.34 → shellbrain-0.1.36}/onboarding_assets/claude/skills/shellbrain-usage-review/SKILL.md +0 -0
  445. {shellbrain-0.1.34 → shellbrain-0.1.36}/onboarding_assets/codex/AGENTS.md +0 -0
  446. {shellbrain-0.1.34 → shellbrain-0.1.36}/onboarding_assets/codex/clean-architecture/SKILL.md +0 -0
  447. {shellbrain-0.1.34 → shellbrain-0.1.36}/onboarding_assets/codex/clean-code/SKILL.md +0 -0
  448. {shellbrain-0.1.34 → shellbrain-0.1.36}/onboarding_assets/codex/shellbrain/SKILL.md +0 -0
  449. {shellbrain-0.1.34 → shellbrain-0.1.36}/onboarding_assets/codex/shellbrain/agents/openai.yaml +0 -0
  450. {shellbrain-0.1.34 → shellbrain-0.1.36}/onboarding_assets/codex/shellbrain/assets/shellbrain-large.svg +0 -0
  451. {shellbrain-0.1.34 → shellbrain-0.1.36}/onboarding_assets/codex/shellbrain/assets/shellbrain-small.svg +0 -0
  452. {shellbrain-0.1.34 → shellbrain-0.1.36}/onboarding_assets/codex/shellbrain/assets/shellbrain_logo.png +0 -0
  453. {shellbrain-0.1.34 → shellbrain-0.1.36}/onboarding_assets/codex/shellbrain/references/request-shapes.md +0 -0
  454. {shellbrain-0.1.34 → shellbrain-0.1.36}/onboarding_assets/codex/shellbrain/references/session-workflow.md +0 -0
  455. {shellbrain-0.1.34 → shellbrain-0.1.36}/onboarding_assets/codex/shellbrain-usage-review/SKILL.md +0 -0
  456. {shellbrain-0.1.34 → shellbrain-0.1.36}/onboarding_assets/codex/shellbrain-usage-review/agents/openai.yaml +0 -0
  457. {shellbrain-0.1.34 → shellbrain-0.1.36}/onboarding_assets/codex/shellbrain-usage-review/assets/shellbrain-small.svg +0 -0
  458. {shellbrain-0.1.34 → shellbrain-0.1.36}/onboarding_assets/codex/shellbrain-usage-review/assets/shellbrain_logo.png +0 -0
  459. {shellbrain-0.1.34 → shellbrain-0.1.36}/onboarding_assets/cursor/skills/shellbrain/SKILL.md +0 -0
  460. {shellbrain-0.1.34 → shellbrain-0.1.36}/onboarding_assets/cursor/skills/shellbrain-usage-review/SKILL.md +0 -0
  461. {shellbrain-0.1.34 → shellbrain-0.1.36}/setup.cfg +0 -0
  462. {shellbrain-0.1.34 → shellbrain-0.1.36}/shellbrain.egg-info/dependency_links.txt +0 -0
  463. {shellbrain-0.1.34 → shellbrain-0.1.36}/shellbrain.egg-info/entry_points.txt +0 -0
  464. {shellbrain-0.1.34 → shellbrain-0.1.36}/shellbrain.egg-info/requires.txt +0 -0
  465. {shellbrain-0.1.34 → shellbrain-0.1.36}/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.34
3
+ Version: 0.1.36
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
@@ -22,7 +22,28 @@ Requires-Dist: sentence-transformers<4.0,>=3.0
22
22
 
23
23
  Agents forget across sessions. They rediscover the same problems, repeat the same mistakes, and relearn what you already taught them. **ShellBrain makes their work compound.**
24
24
 
25
- ### Recall in one command.
25
+ ## Install
26
+
27
+ ```bash
28
+ curl -L shellbrain.ai/install | bash
29
+ ```
30
+
31
+ **Works for Codex, Claude Code, and Cursor.** The installer runs `shellbrain init` for you. Repos register themselves on first use.
32
+
33
+ Requirements.
34
+ - macOS or Linux, Python 3.11+, Docker for the managed local Postgres+pgvector runtime.
35
+
36
+ ### Upgrade for latest capabilities
37
+
38
+ ```bash
39
+ shellbrain upgrade
40
+ ```
41
+
42
+ The install script also works as an upgrade path: `curl -L shellbrain.ai/upgrade | bash`. Manual alternative: `pipx upgrade shellbrain && shellbrain init`.
43
+
44
+ ---
45
+
46
+ ## Recall in one command.
26
47
  Episodic, empirical, conceptual. Three categories, one retrieval surface.
27
48
 
28
49
  ---
@@ -44,20 +65,21 @@ The episodic layer is truth. Empirical memory extracts. Concept memory abstracts
44
65
 
45
66
  ---
46
67
 
47
- ## How agents use ShellBrain
68
+ ## How Agents Use ShellBrain
48
69
 
49
- **Working agents call `recall`.** That is the normal interface they have to think about. One command, **one _carefully curated_ compact brief**, with sources cited.
70
+ ### Recall
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.
50
73
 
51
74
  ```bash
52
75
  shellbrain recall --json '{"query":"what context matters for this migration lock timeout?","current_problem":{"goal":"fix the migration hang","surface":"db admin","obstacle":"lock timeout","hypothesis":"none yet"}}'
53
76
  ```
54
77
 
55
- Lower-level commands exist for inner agents.
56
- - `read`, `events`, `concept show`, `memory add`, `memory update`, `concept add`, `concept update`
78
+ **Working agents focus on only their work.**
57
79
 
58
- When a user explicitly says to store or teach Shellbrain something, working agents can call `teach`. It stores the statement as evidence and immediately runs Shellbrain's teach agent.
80
+ ### Teach
59
81
 
60
- **Working agents focus on only their work.**
82
+ **Working agents call `shellbrain teach` for explicit teaching.** You can tell an agent to remember important ideas.
61
83
 
62
84
  ---
63
85
 
@@ -69,27 +91,6 @@ Memory that is grounded in evidence, small in scope, and asked for rather than p
69
91
 
70
92
  ---
71
93
 
72
- ## Install
73
-
74
- ```bash
75
- curl -L shellbrain.ai/install | bash
76
- ```
77
-
78
- **Works for Codex, Claude Code, and Cursor.** The installer runs `shellbrain init` for you. Repos register themselves on first use.
79
-
80
- Requirements.
81
- - macOS or Linux, Python 3.11+, Docker for the managed local Postgres+pgvector runtime.
82
-
83
- ### Upgrade for latest capabilities
84
-
85
- ```bash
86
- shellbrain upgrade
87
- ```
88
-
89
- The install script also works as an upgrade path: `curl -L shellbrain.ai/upgrade | bash`. Manual alternative: `pipx upgrade shellbrain && shellbrain init`.
90
-
91
- ---
92
-
93
94
  ## How to Use ShellBrain
94
95
 
95
96
  Use Shellbrain in your agent of choice. Then, just work normally.
@@ -104,7 +105,7 @@ Use Shellbrain in your agent of choice. Then, just work normally.
104
105
 
105
106
  ## Repair
106
107
 
107
- `shellbrain admin doctor` to inspect. `shellbrain init` to repair if doctor flags it. Do not rerun init every session — it is not a no-op.
108
+ `shellbrain admin doctor` to inspect. `shellbrain init` to repair if doctor flags it. Do not rerun init every session.
108
109
 
109
110
  ---
110
111
 
@@ -8,7 +8,28 @@
8
8
 
9
9
  Agents forget across sessions. They rediscover the same problems, repeat the same mistakes, and relearn what you already taught them. **ShellBrain makes their work compound.**
10
10
 
11
- ### Recall in one command.
11
+ ## Install
12
+
13
+ ```bash
14
+ curl -L shellbrain.ai/install | bash
15
+ ```
16
+
17
+ **Works for Codex, Claude Code, and Cursor.** The installer runs `shellbrain init` for you. Repos register themselves on first use.
18
+
19
+ Requirements.
20
+ - macOS or Linux, Python 3.11+, Docker for the managed local Postgres+pgvector runtime.
21
+
22
+ ### Upgrade for latest capabilities
23
+
24
+ ```bash
25
+ shellbrain upgrade
26
+ ```
27
+
28
+ The install script also works as an upgrade path: `curl -L shellbrain.ai/upgrade | bash`. Manual alternative: `pipx upgrade shellbrain && shellbrain init`.
29
+
30
+ ---
31
+
32
+ ## Recall in one command.
12
33
  Episodic, empirical, conceptual. Three categories, one retrieval surface.
13
34
 
14
35
  ---
@@ -30,20 +51,21 @@ The episodic layer is truth. Empirical memory extracts. Concept memory abstracts
30
51
 
31
52
  ---
32
53
 
33
- ## How agents use ShellBrain
54
+ ## How Agents Use ShellBrain
34
55
 
35
- **Working agents call `recall`.** That is the normal interface they have to think about. One command, **one _carefully curated_ compact brief**, with sources cited.
56
+ ### Recall
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.
36
59
 
37
60
  ```bash
38
61
  shellbrain recall --json '{"query":"what context matters for this migration lock timeout?","current_problem":{"goal":"fix the migration hang","surface":"db admin","obstacle":"lock timeout","hypothesis":"none yet"}}'
39
62
  ```
40
63
 
41
- Lower-level commands exist for inner agents.
42
- - `read`, `events`, `concept show`, `memory add`, `memory update`, `concept add`, `concept update`
64
+ **Working agents focus on only their work.**
43
65
 
44
- When a user explicitly says to store or teach Shellbrain something, working agents can call `teach`. It stores the statement as evidence and immediately runs Shellbrain's teach agent.
66
+ ### Teach
45
67
 
46
- **Working agents focus on only their work.**
68
+ **Working agents call `shellbrain teach` for explicit teaching.** You can tell an agent to remember important ideas.
47
69
 
48
70
  ---
49
71
 
@@ -55,27 +77,6 @@ Memory that is grounded in evidence, small in scope, and asked for rather than p
55
77
 
56
78
  ---
57
79
 
58
- ## Install
59
-
60
- ```bash
61
- curl -L shellbrain.ai/install | bash
62
- ```
63
-
64
- **Works for Codex, Claude Code, and Cursor.** The installer runs `shellbrain init` for you. Repos register themselves on first use.
65
-
66
- Requirements.
67
- - macOS or Linux, Python 3.11+, Docker for the managed local Postgres+pgvector runtime.
68
-
69
- ### Upgrade for latest capabilities
70
-
71
- ```bash
72
- shellbrain upgrade
73
- ```
74
-
75
- The install script also works as an upgrade path: `curl -L shellbrain.ai/upgrade | bash`. Manual alternative: `pipx upgrade shellbrain && shellbrain init`.
76
-
77
- ---
78
-
79
80
  ## How to Use ShellBrain
80
81
 
81
82
  Use Shellbrain in your agent of choice. Then, just work normally.
@@ -90,7 +91,7 @@ Use Shellbrain in your agent of choice. Then, just work normally.
90
91
 
91
92
  ## Repair
92
93
 
93
- `shellbrain admin doctor` to inspect. `shellbrain init` to repair if doctor flags it. Do not rerun init every session — it is not a no-op.
94
+ `shellbrain admin doctor` to inspect. `shellbrain init` to repair if doctor flags it. Do not rerun init every session.
94
95
 
95
96
  ---
96
97
 
@@ -18,7 +18,6 @@ class AssociationRelationType(str, Enum):
18
18
 
19
19
  DEPENDS_ON = "depends_on"
20
20
  ASSOCIATED_WITH = "associated_with"
21
- MATURES_INTO = "matures_into"
22
21
 
23
22
 
24
23
  class AssociationSourceMode(str, Enum):
@@ -35,6 +35,16 @@ class ConceptLifecycleStatus(str, Enum):
35
35
  STALE = "stale"
36
36
  SUPERSEDED = "superseded"
37
37
  WRONG = "wrong"
38
+ ARCHIVED = "archived"
39
+
40
+
41
+ class ConceptLifecycleTargetType(str, Enum):
42
+ """Truth-bearing concept record types with mutable lifecycle state."""
43
+
44
+ RELATION = "relation"
45
+ CLAIM = "claim"
46
+ GROUNDING = "grounding"
47
+ MEMORY_LINK = "memory_link"
38
48
 
39
49
 
40
50
  class ConceptRelationPredicate(str, Enum):
@@ -73,7 +83,6 @@ class AnchorKind(str, Enum):
73
83
  LOG = "log"
74
84
  DOC = "doc"
75
85
  COMMIT = "commit"
76
- MEMORY = "memory"
77
86
 
78
87
 
79
88
  class AnchorStatus(str, Enum):
@@ -103,10 +112,8 @@ class ConceptMemoryLinkRole(str, Enum):
103
112
  EXAMPLE_OF = "example_of"
104
113
  SOLUTION_FOR = "solution_for"
105
114
  FAILED_TACTIC_FOR = "failed_tactic_for"
106
- CHANGED = "changed"
107
- VALIDATED = "validated"
108
- CONTRADICTED = "contradicted"
109
- WARNED_ABOUT = "warned_about"
115
+ WARNS_ABOUT = "warns_about"
116
+ CHANGE_RELEVANT_TO = "change_relevant_to"
110
117
 
111
118
 
112
119
  class ConceptEvidenceTargetType(str, Enum):
@@ -116,6 +123,7 @@ class ConceptEvidenceTargetType(str, Enum):
116
123
  CLAIM = "claim"
117
124
  GROUNDING = "grounding"
118
125
  MEMORY_LINK = "memory_link"
126
+ LIFECYCLE_EVENT = "lifecycle_event"
119
127
 
120
128
 
121
129
  class ConceptEvidenceKind(str, Enum):
@@ -193,10 +201,28 @@ class ConceptLifecycle:
193
201
  confidence: float = 0.5
194
202
  observed_at: datetime | None = None
195
203
  validated_at: datetime | None = None
204
+ invalidated_at: datetime | None = None
196
205
  source_kind: ConceptSourceKind | None = None
197
206
  source_ref: str | None = None
198
207
  superseded_by_id: str | None = None
199
208
  created_by: ConceptCreatedBy = ConceptCreatedBy.MANUAL
209
+ updated_by: ConceptCreatedBy | None = None
210
+
211
+
212
+ @dataclass(frozen=True, kw_only=True)
213
+ class ConceptLifecycleEvent:
214
+ """One auditable lifecycle transition for a truth-bearing concept record."""
215
+
216
+ id: str
217
+ repo_id: str
218
+ target_type: ConceptLifecycleTargetType
219
+ target_id: str
220
+ from_status: ConceptLifecycleStatus
221
+ to_status: ConceptLifecycleStatus
222
+ rationale: str
223
+ actor: ConceptCreatedBy
224
+ superseded_by_id: str | None = None
225
+ created_at: datetime | None = None
200
226
 
201
227
 
202
228
  @dataclass(frozen=True, kw_only=True)
@@ -0,0 +1,222 @@
1
+ """This module defines evidence references and unified evidence-link entities."""
2
+
3
+ import hashlib
4
+ import json
5
+ from dataclasses import dataclass
6
+ from datetime import datetime
7
+ from enum import Enum
8
+
9
+ from app.core.entities.ids import (
10
+ AssociationEdgeId,
11
+ EvidenceId,
12
+ EvidenceRefText,
13
+ MemoryId,
14
+ RepoId,
15
+ )
16
+
17
+
18
+ class EvidenceTargetType(str, Enum):
19
+ """Storage-neutral targets that may carry evidence."""
20
+
21
+ MEMORY = "memory"
22
+ ASSOCIATION_EDGE = "association_edge"
23
+ UTILITY_OBSERVATION = "utility_observation"
24
+ CONCEPT_CLAIM = "concept_claim"
25
+ CONCEPT_RELATION = "concept_relation"
26
+ CONCEPT_GROUNDING = "concept_grounding"
27
+ CONCEPT_MEMORY_LINK = "concept_memory_link"
28
+ CONCEPT_LIFECYCLE_EVENT = "concept_lifecycle_event"
29
+ MEMORY_LIFECYCLE_EVENT = "memory_lifecycle_event"
30
+ STRUCTURAL_MEMORY_RELATION = "structural_memory_relation"
31
+
32
+
33
+ class EvidenceSourceKind(str, Enum):
34
+ """Storage-neutral kinds of evidence sources."""
35
+
36
+ EPISODE_EVENT = "episode_event"
37
+ ANCHOR = "anchor"
38
+ MEMORY = "memory"
39
+ COMMIT = "commit"
40
+ TRANSCRIPT = "transcript"
41
+ TEST = "test"
42
+ MANUAL = "manual"
43
+
44
+
45
+ class EvidenceRole(str, Enum):
46
+ """Semantic role an evidence source plays for a target."""
47
+
48
+ SUPPORTS = "supports"
49
+ CONTRADICTS = "contradicts"
50
+ OBSERVED_IN = "observed_in"
51
+ CREATED_FROM = "created_from"
52
+ VALIDATED_BY = "validated_by"
53
+ INVALIDATED_BY = "invalidated_by"
54
+ EXPLAINS = "explains"
55
+
56
+
57
+ @dataclass(kw_only=True)
58
+ class EvidenceRef:
59
+ """This dataclass models a canonical evidence reference entry."""
60
+
61
+ id: EvidenceId
62
+ repo_id: RepoId
63
+ ref: EvidenceRefText
64
+ kind: EvidenceSourceKind = EvidenceSourceKind.EPISODE_EVENT
65
+ canonical_hash: str | None = None
66
+ episode_event_id: str | None = None
67
+ anchor_id: str | None = None
68
+ memory_id: str | None = None
69
+ commit_ref: str | None = None
70
+ transcript_ref: str | None = None
71
+ note: str | None = None
72
+
73
+
74
+ @dataclass(frozen=True, kw_only=True)
75
+ class EvidenceTarget:
76
+ """One evidence-backed target in the unified evidence API."""
77
+
78
+ target_type: EvidenceTargetType
79
+ target_id: str
80
+
81
+ def __post_init__(self) -> None:
82
+ object.__setattr__(
83
+ self, "target_type", EvidenceTargetType(self.target_type)
84
+ )
85
+ if not self.target_id.strip():
86
+ raise ValueError("evidence target_id must be non-empty")
87
+
88
+
89
+ @dataclass(frozen=True, kw_only=True)
90
+ class EvidenceSource:
91
+ """One normalized source that can support an evidence-backed target."""
92
+
93
+ source_kind: EvidenceSourceKind
94
+ ref: str | None = None
95
+ episode_event_id: str | None = None
96
+ anchor_id: str | None = None
97
+ memory_id: str | None = None
98
+ commit_ref: str | None = None
99
+ transcript_ref: str | None = None
100
+ note: str | None = None
101
+
102
+ def __post_init__(self) -> None:
103
+ object.__setattr__(
104
+ self, "source_kind", EvidenceSourceKind(self.source_kind)
105
+ )
106
+ if self.source_kind is EvidenceSourceKind.EPISODE_EVENT:
107
+ event_ref = self.ref or self.episode_event_id
108
+ if event_ref is None or not event_ref.strip():
109
+ raise ValueError("episode_event evidence requires ref")
110
+ if self.ref is not None and self.episode_event_id is not None:
111
+ if self.ref != self.episode_event_id:
112
+ raise ValueError("episode_event ref and episode_event_id differ")
113
+ object.__setattr__(self, "ref", event_ref)
114
+ object.__setattr__(self, "episode_event_id", event_ref)
115
+ _require_no_fields(
116
+ self,
117
+ "anchor_id",
118
+ "memory_id",
119
+ "commit_ref",
120
+ "transcript_ref",
121
+ "note",
122
+ )
123
+ return
124
+
125
+ required_field = _SOURCE_REQUIRED_FIELD[self.source_kind]
126
+ _require_one_field(self, required_field)
127
+ _require_no_fields(
128
+ self,
129
+ *(
130
+ field
131
+ for field in _SOURCE_REFERENCE_FIELDS
132
+ if field != required_field
133
+ ),
134
+ "ref",
135
+ "episode_event_id",
136
+ )
137
+
138
+
139
+ @dataclass(frozen=True, kw_only=True)
140
+ class EvidenceLinkView:
141
+ """One resolved evidence link with a storage-neutral target and source."""
142
+
143
+ target: EvidenceTarget
144
+ source: EvidenceSource
145
+ role: EvidenceRole
146
+ evidence_id: EvidenceId | None = None
147
+ created_at: datetime | None = None
148
+
149
+
150
+ @dataclass(kw_only=True)
151
+ class MemoryEvidenceLink:
152
+ """This dataclass models a many-to-many link between shellbrain and evidence."""
153
+
154
+ memory_id: MemoryId
155
+ evidence_id: EvidenceId
156
+
157
+
158
+ @dataclass(kw_only=True)
159
+ class AssociationEdgeEvidenceLink:
160
+ """This dataclass models a many-to-many link between association edges and evidence."""
161
+
162
+ edge_id: AssociationEdgeId
163
+ evidence_id: EvidenceId
164
+
165
+
166
+ _SOURCE_REQUIRED_FIELD: dict[EvidenceSourceKind, str] = {
167
+ EvidenceSourceKind.ANCHOR: "anchor_id",
168
+ EvidenceSourceKind.MEMORY: "memory_id",
169
+ EvidenceSourceKind.COMMIT: "commit_ref",
170
+ EvidenceSourceKind.TRANSCRIPT: "transcript_ref",
171
+ EvidenceSourceKind.TEST: "note",
172
+ EvidenceSourceKind.MANUAL: "note",
173
+ }
174
+ _SOURCE_REFERENCE_FIELDS = frozenset(_SOURCE_REQUIRED_FIELD.values())
175
+
176
+
177
+ def _require_one_field(source: EvidenceSource, field: str) -> None:
178
+ value = getattr(source, field)
179
+ if value is None or not str(value).strip():
180
+ raise ValueError(f"{source.source_kind.value} evidence requires {field}")
181
+
182
+
183
+ def _require_no_fields(source: EvidenceSource, *fields: str) -> None:
184
+ extra_fields = [
185
+ field
186
+ for field in fields
187
+ if getattr(source, field) is not None
188
+ ]
189
+ if extra_fields:
190
+ raise ValueError(
191
+ f"{source.source_kind.value} evidence does not accept: "
192
+ + ", ".join(sorted(extra_fields))
193
+ )
194
+
195
+
196
+ def canonical_evidence_hash(source: EvidenceSource) -> str:
197
+ """Return the source-only canonical hash used to dedupe evidence refs."""
198
+
199
+ payload = {
200
+ "kind": source.source_kind.value,
201
+ "identity": _source_identity(source),
202
+ }
203
+ serialized = json.dumps(
204
+ payload, sort_keys=True, separators=(",", ":"), ensure_ascii=False
205
+ )
206
+ return "sha256:" + hashlib.sha256(serialized.encode("utf-8")).hexdigest()
207
+
208
+
209
+ def evidence_source_ref(source: EvidenceSource) -> str:
210
+ """Return the required display/source reference string for one evidence source."""
211
+
212
+ return _source_identity(source)
213
+
214
+
215
+ def _source_identity(source: EvidenceSource) -> str:
216
+ if source.source_kind is EvidenceSourceKind.EPISODE_EVENT:
217
+ assert source.episode_event_id is not None
218
+ return source.episode_event_id
219
+ required_field = _SOURCE_REQUIRED_FIELD[source.source_kind]
220
+ value = getattr(source, required_field)
221
+ assert value is not None
222
+ return str(value)
@@ -9,9 +9,13 @@ from app.core.entities.ids import MemoryId, RepoId
9
9
 
10
10
 
11
11
  MemoryKindValue = Literal[
12
- "problem", "solution", "failed_tactic", "fact", "preference", "change", "frontier"
12
+ "problem", "solution", "failed_tactic", "fact", "preference", "change"
13
13
  ]
14
- AssociationRelationValue = Literal["depends_on", "associated_with", "matures_into"]
14
+ AssociationRelationValue = Literal["depends_on", "associated_with"]
15
+ MemoryLifecycleStatusValue = Literal[
16
+ "active", "maybe_stale", "stale", "superseded", "wrong", "archived"
17
+ ]
18
+ MemoryLifecycleActorValue = Literal["worker", "librarian", "manual", "import"]
15
19
 
16
20
 
17
21
  class MemoryKind(str, Enum):
@@ -23,7 +27,6 @@ class MemoryKind(str, Enum):
23
27
  FACT = "fact"
24
28
  PREFERENCE = "preference"
25
29
  CHANGE = "change"
26
- FRONTIER = "frontier"
27
30
 
28
31
  @property
29
32
  def requires_problem_link(self) -> bool:
@@ -65,6 +68,55 @@ class MemoryScope(str, Enum):
65
68
  GLOBAL = "global"
66
69
 
67
70
 
71
+ class MemoryLifecycleStatus(str, Enum):
72
+ """Lifecycle state for concrete durable memories."""
73
+
74
+ ACTIVE = "active"
75
+ MAYBE_STALE = "maybe_stale"
76
+ STALE = "stale"
77
+ SUPERSEDED = "superseded"
78
+ WRONG = "wrong"
79
+ ARCHIVED = "archived"
80
+
81
+ @property
82
+ def has_positive_retrieval_signal(self) -> bool:
83
+ """Return whether normal read/recall may retrieve this memory."""
84
+
85
+ return self in DEFAULT_RETRIEVABLE_MEMORY_STATUSES
86
+
87
+ @property
88
+ def retrieval_multiplier(self) -> float:
89
+ """Return the default retrieval strength multiplier for this lifecycle state."""
90
+
91
+ return {
92
+ MemoryLifecycleStatus.ACTIVE: 1.0,
93
+ MemoryLifecycleStatus.MAYBE_STALE: 0.65,
94
+ MemoryLifecycleStatus.STALE: 0.25,
95
+ MemoryLifecycleStatus.SUPERSEDED: 0.0,
96
+ MemoryLifecycleStatus.WRONG: 0.0,
97
+ MemoryLifecycleStatus.ARCHIVED: 0.0,
98
+ }[self]
99
+
100
+
101
+ class MemoryLifecycleActor(str, Enum):
102
+ """Actor classes allowed to mutate concrete memory lifecycle state."""
103
+
104
+ WORKER = "worker"
105
+ LIBRARIAN = "librarian"
106
+ MANUAL = "manual"
107
+ IMPORT = "import"
108
+
109
+
110
+ DEFAULT_RETRIEVABLE_MEMORY_STATUSES: Final[tuple[MemoryLifecycleStatus, ...]] = (
111
+ MemoryLifecycleStatus.ACTIVE,
112
+ MemoryLifecycleStatus.MAYBE_STALE,
113
+ MemoryLifecycleStatus.STALE,
114
+ )
115
+ DEFAULT_RETRIEVABLE_MEMORY_STATUS_VALUES: Final[tuple[str, ...]] = tuple(
116
+ status.value for status in DEFAULT_RETRIEVABLE_MEMORY_STATUSES
117
+ )
118
+
119
+
68
120
  @dataclass(frozen=True)
69
121
  class EvidenceRefs:
70
122
  """Validated immutable episode-event evidence references."""
@@ -138,9 +190,33 @@ class Memory:
138
190
  kind: MemoryKind
139
191
  text: str
140
192
  created_at: datetime | None = None
141
- archived: bool = False
193
+ status: MemoryLifecycleStatus = MemoryLifecycleStatus.ACTIVE
194
+ validated_at: datetime | None = None
195
+ invalidated_at: datetime | None = None
196
+ superseded_by_id: MemoryId | None = None
197
+ updated_by: MemoryLifecycleActor | None = None
142
198
 
143
199
  def is_visible_in(self, repo_id: RepoId | str) -> bool:
144
200
  """Return whether this memory is visible inside a repo operation context."""
145
201
 
146
202
  return self.repo_id == repo_id or self.scope == MemoryScope.GLOBAL
203
+
204
+ def has_positive_retrieval_signal(self) -> bool:
205
+ """Return whether normal read/recall should retrieve this memory."""
206
+
207
+ return self.status.has_positive_retrieval_signal
208
+
209
+
210
+ @dataclass(kw_only=True)
211
+ class MemoryLifecycleEvent:
212
+ """Append-only audit event for concrete memory lifecycle transitions."""
213
+
214
+ id: str
215
+ repo_id: RepoId
216
+ memory_id: MemoryId
217
+ from_status: MemoryLifecycleStatus
218
+ to_status: MemoryLifecycleStatus
219
+ rationale: str
220
+ actor: MemoryLifecycleActor
221
+ superseded_by_id: MemoryId | None = None
222
+ created_at: datetime | None = None