shellbrain 0.1.13__tar.gz → 0.1.14__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 (201) hide show
  1. {shellbrain-0.1.13 → shellbrain-0.1.14}/PKG-INFO +14 -1
  2. {shellbrain-0.1.13 → shellbrain-0.1.14}/README.md +13 -0
  3. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/core/policies/_shared/executor.py +2 -2
  4. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/periphery/admin/analytics_diagnostics.py +1 -1
  5. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/periphery/admin/instance_guard.py +20 -1
  6. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/periphery/db/repos/relational/evidence_repo.py +10 -1
  7. {shellbrain-0.1.13 → shellbrain-0.1.14}/pyproject.toml +1 -1
  8. {shellbrain-0.1.13 → shellbrain-0.1.14}/shellbrain.egg-info/PKG-INFO +14 -1
  9. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/__init__.py +0 -0
  10. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/__main__.py +0 -0
  11. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/boot/__init__.py +0 -0
  12. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/boot/admin_db.py +0 -0
  13. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/boot/config.py +0 -0
  14. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/boot/create_policy.py +0 -0
  15. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/boot/db.py +0 -0
  16. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/boot/embeddings.py +0 -0
  17. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/boot/home.py +0 -0
  18. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/boot/migrations.py +0 -0
  19. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/boot/read_policy.py +0 -0
  20. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/boot/repos.py +0 -0
  21. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/boot/retrieval.py +0 -0
  22. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/boot/thresholds.py +0 -0
  23. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/boot/update_policy.py +0 -0
  24. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/boot/use_cases.py +0 -0
  25. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/config/__init__.py +0 -0
  26. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/config/defaults/create_policy.yaml +0 -0
  27. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/config/defaults/read_policy.yaml +0 -0
  28. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/config/defaults/runtime.yaml +0 -0
  29. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/config/defaults/thresholds.yaml +0 -0
  30. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/config/defaults/update_policy.yaml +0 -0
  31. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/config/loader.py +0 -0
  32. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/core/__init__.py +0 -0
  33. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/core/contracts/__init__.py +0 -0
  34. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/core/contracts/errors.py +0 -0
  35. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/core/contracts/requests.py +0 -0
  36. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/core/contracts/responses.py +0 -0
  37. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/core/entities/__init__.py +0 -0
  38. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/core/entities/associations.py +0 -0
  39. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/core/entities/episodes.py +0 -0
  40. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/core/entities/evidence.py +0 -0
  41. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/core/entities/facts.py +0 -0
  42. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/core/entities/guidance.py +0 -0
  43. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/core/entities/identity.py +0 -0
  44. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/core/entities/memory.py +0 -0
  45. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/core/entities/runtime_context.py +0 -0
  46. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/core/entities/session_state.py +0 -0
  47. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/core/entities/telemetry.py +0 -0
  48. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/core/entities/utility.py +0 -0
  49. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/core/interfaces/__init__.py +0 -0
  50. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/core/interfaces/clock.py +0 -0
  51. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/core/interfaces/config.py +0 -0
  52. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/core/interfaces/embeddings.py +0 -0
  53. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/core/interfaces/idgen.py +0 -0
  54. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/core/interfaces/repos.py +0 -0
  55. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/core/interfaces/retrieval.py +0 -0
  56. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/core/interfaces/session_state_store.py +0 -0
  57. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/core/interfaces/unit_of_work.py +0 -0
  58. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/core/policies/__init__.py +0 -0
  59. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/core/policies/_shared/__init__.py +0 -0
  60. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/core/policies/_shared/side_effects.py +0 -0
  61. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/core/policies/create_policy/__init__.py +0 -0
  62. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/core/policies/create_policy/pipeline.py +0 -0
  63. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/core/policies/read_policy/__init__.py +0 -0
  64. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/core/policies/read_policy/bm25.py +0 -0
  65. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/core/policies/read_policy/context_pack_builder.py +0 -0
  66. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/core/policies/read_policy/expansion.py +0 -0
  67. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/core/policies/read_policy/fusion_rrf.py +0 -0
  68. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/core/policies/read_policy/lexical_query.py +0 -0
  69. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/core/policies/read_policy/pipeline.py +0 -0
  70. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/core/policies/read_policy/scenario_lift.py +0 -0
  71. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/core/policies/read_policy/scoring.py +0 -0
  72. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/core/policies/read_policy/seed_retrieval.py +0 -0
  73. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/core/policies/read_policy/utility_prior.py +0 -0
  74. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/core/policies/update_policy/__init__.py +0 -0
  75. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/core/policies/update_policy/pipeline.py +0 -0
  76. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/core/use_cases/__init__.py +0 -0
  77. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/core/use_cases/build_guidance.py +0 -0
  78. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/core/use_cases/create_memory.py +0 -0
  79. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/core/use_cases/manage_session_state.py +0 -0
  80. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/core/use_cases/read_memory.py +0 -0
  81. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/core/use_cases/record_episode_sync_telemetry.py +0 -0
  82. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/core/use_cases/record_operation_telemetry.py +0 -0
  83. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/core/use_cases/sync_episode.py +0 -0
  84. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/core/use_cases/update_memory.py +0 -0
  85. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/migrations/__init__.py +0 -0
  86. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/migrations/env.py +0 -0
  87. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/migrations/versions/20260226_0001_initial_schema.py +0 -0
  88. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/migrations/versions/20260312_0002_add_hard_invariants.py +0 -0
  89. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/migrations/versions/20260312_0003_drop_create_confidence.py +0 -0
  90. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/migrations/versions/20260313_0004_episode_sync_hardening.py +0 -0
  91. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/migrations/versions/20260313_0005_evidence_episode_event_refs.py +0 -0
  92. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/migrations/versions/20260318_0006_usage_telemetry_schema.py +0 -0
  93. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/migrations/versions/20260319_0007_identity_session_guidance.py +0 -0
  94. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/migrations/versions/20260320_0008_instance_metadata_and_backup_safety.py +0 -0
  95. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/migrations/versions/__init__.py +0 -0
  96. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/onboarding_assets/__init__.py +0 -0
  97. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/onboarding_assets/claude/skills/shellbrain-session-start/SKILL.md +0 -0
  98. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/onboarding_assets/claude/skills/shellbrain-usage-review/SKILL.md +0 -0
  99. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/onboarding_assets/codex/shellbrain-session-start/SKILL.md +0 -0
  100. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/onboarding_assets/codex/shellbrain-session-start/agents/openai.yaml +0 -0
  101. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/onboarding_assets/codex/shellbrain-session-start/assets/shellbrain-large.svg +0 -0
  102. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/onboarding_assets/codex/shellbrain-session-start/assets/shellbrain-small.svg +0 -0
  103. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/onboarding_assets/codex/shellbrain-session-start/references/request-shapes.md +0 -0
  104. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/onboarding_assets/codex/shellbrain-session-start/references/session-workflow.md +0 -0
  105. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/onboarding_assets/codex/shellbrain-usage-review/SKILL.md +0 -0
  106. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/onboarding_assets/codex/shellbrain-usage-review/agents/openai.yaml +0 -0
  107. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/onboarding_assets/cursor/skills/shellbrain-session-start/SKILL.md +0 -0
  108. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/onboarding_assets/cursor/skills/shellbrain-usage-review/SKILL.md +0 -0
  109. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/periphery/__init__.py +0 -0
  110. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/periphery/admin/__init__.py +0 -0
  111. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/periphery/admin/analytics.py +0 -0
  112. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/periphery/admin/analytics_queries.py +0 -0
  113. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/periphery/admin/backup.py +0 -0
  114. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/periphery/admin/destructive_guard.py +0 -0
  115. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/periphery/admin/doctor.py +0 -0
  116. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/periphery/admin/external_runtime.py +0 -0
  117. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/periphery/admin/init.py +0 -0
  118. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/periphery/admin/init_errors.py +0 -0
  119. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/periphery/admin/machine_state.py +0 -0
  120. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/periphery/admin/managed_runtime.py +0 -0
  121. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/periphery/admin/privileges.py +0 -0
  122. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/periphery/admin/repo_state.py +0 -0
  123. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/periphery/admin/restore.py +0 -0
  124. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/periphery/admin/storage_setup.py +0 -0
  125. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/periphery/admin/upgrade.py +0 -0
  126. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/periphery/cli/__init__.py +0 -0
  127. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/periphery/cli/handlers.py +0 -0
  128. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/periphery/cli/hydration.py +0 -0
  129. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/periphery/cli/main.py +0 -0
  130. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/periphery/cli/presenter_json.py +0 -0
  131. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/periphery/cli/schema_validation.py +0 -0
  132. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/periphery/db/__init__.py +0 -0
  133. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/periphery/db/engine.py +0 -0
  134. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/periphery/db/models/__init__.py +0 -0
  135. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/periphery/db/models/associations.py +0 -0
  136. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/periphery/db/models/episodes.py +0 -0
  137. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/periphery/db/models/evidence.py +0 -0
  138. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/periphery/db/models/experiences.py +0 -0
  139. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/periphery/db/models/instance_metadata.py +0 -0
  140. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/periphery/db/models/memories.py +0 -0
  141. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/periphery/db/models/metadata.py +0 -0
  142. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/periphery/db/models/registry.py +0 -0
  143. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/periphery/db/models/telemetry.py +0 -0
  144. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/periphery/db/models/utility.py +0 -0
  145. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/periphery/db/models/views.py +0 -0
  146. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/periphery/db/repos/__init__.py +0 -0
  147. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/periphery/db/repos/relational/__init__.py +0 -0
  148. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/periphery/db/repos/relational/associations_repo.py +0 -0
  149. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/periphery/db/repos/relational/episodes_repo.py +0 -0
  150. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/periphery/db/repos/relational/experiences_repo.py +0 -0
  151. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/periphery/db/repos/relational/memories_repo.py +0 -0
  152. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/periphery/db/repos/relational/read_policy_repo.py +0 -0
  153. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/periphery/db/repos/relational/telemetry_repo.py +0 -0
  154. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/periphery/db/repos/relational/utility_repo.py +0 -0
  155. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/periphery/db/repos/semantic/__init__.py +0 -0
  156. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/periphery/db/repos/semantic/keyword_retrieval_repo.py +0 -0
  157. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/periphery/db/repos/semantic/semantic_retrieval_repo.py +0 -0
  158. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/periphery/db/session.py +0 -0
  159. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/periphery/db/uow.py +0 -0
  160. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/periphery/embeddings/__init__.py +0 -0
  161. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/periphery/embeddings/local_provider.py +0 -0
  162. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/periphery/embeddings/query_vector_search.py +0 -0
  163. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/periphery/episodes/__init__.py +0 -0
  164. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/periphery/episodes/claude_code.py +0 -0
  165. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/periphery/episodes/codex.py +0 -0
  166. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/periphery/episodes/cursor.py +0 -0
  167. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/periphery/episodes/launcher.py +0 -0
  168. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/periphery/episodes/normalization.py +0 -0
  169. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/periphery/episodes/poller.py +0 -0
  170. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/periphery/episodes/poller_lock.py +0 -0
  171. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/periphery/episodes/source_discovery.py +0 -0
  172. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/periphery/episodes/tool_filter.py +0 -0
  173. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/periphery/identity/__init__.py +0 -0
  174. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/periphery/identity/claude_hook_install.py +0 -0
  175. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/periphery/identity/claude_runtime.py +0 -0
  176. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/periphery/identity/codex_runtime.py +0 -0
  177. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/periphery/identity/compatibility.py +0 -0
  178. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/periphery/identity/resolver.py +0 -0
  179. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/periphery/metrics/__init__.py +0 -0
  180. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/periphery/metrics/artifacts.py +0 -0
  181. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/periphery/metrics/browser.py +0 -0
  182. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/periphery/metrics/queries.py +0 -0
  183. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/periphery/metrics/render_html.py +0 -0
  184. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/periphery/metrics/service.py +0 -0
  185. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/periphery/onboarding/__init__.py +0 -0
  186. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/periphery/onboarding/host_assets.py +0 -0
  187. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/periphery/session_state/__init__.py +0 -0
  188. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/periphery/session_state/file_store.py +0 -0
  189. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/periphery/telemetry/__init__.py +0 -0
  190. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/periphery/telemetry/operation_summary.py +0 -0
  191. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/periphery/telemetry/session_selection.py +0 -0
  192. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/periphery/telemetry/sync_summary.py +0 -0
  193. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/periphery/validation/__init__.py +0 -0
  194. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/periphery/validation/integrity_validation.py +0 -0
  195. {shellbrain-0.1.13 → shellbrain-0.1.14}/app/periphery/validation/semantic_validation.py +0 -0
  196. {shellbrain-0.1.13 → shellbrain-0.1.14}/setup.cfg +0 -0
  197. {shellbrain-0.1.13 → shellbrain-0.1.14}/shellbrain.egg-info/SOURCES.txt +0 -0
  198. {shellbrain-0.1.13 → shellbrain-0.1.14}/shellbrain.egg-info/dependency_links.txt +0 -0
  199. {shellbrain-0.1.13 → shellbrain-0.1.14}/shellbrain.egg-info/entry_points.txt +0 -0
  200. {shellbrain-0.1.13 → shellbrain-0.1.14}/shellbrain.egg-info/requires.txt +0 -0
  201. {shellbrain-0.1.13 → shellbrain-0.1.14}/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.13
3
+ Version: 0.1.14
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
@@ -96,6 +96,19 @@ Fish PATH setup is written to `~/.config/fish/conf.d/shellbrain.fish`.
96
96
 
97
97
  ---
98
98
 
99
+ ## DB-backed tests
100
+
101
+ **Live memories and DB-backed tests now use different Postgres hosts.**
102
+
103
+ - managed local Shellbrain keeps durable memories on the machine-owned managed instance
104
+ - DB-backed tests and scratch validation should use the dedicated repo-owned test host from `docker-compose.test.yml`
105
+ - `scripts/run_tests` provisions a disposable test database on that dedicated host by default
106
+ - `scripts/storage_status` shows the live managed target, the dedicated test host, and any legacy local test host that is still hanging around
107
+
108
+ If you are running managed local Shellbrain, do not leave a stale `SHELLBRAIN_DB_DSN` export in your shell profile that points at the old local compose database. The machine config wins anyway, and the stale env var just makes the storage layout harder to reason about.
109
+
110
+ ---
111
+
99
112
  ## Docs
100
113
 
101
114
  - [shellbrain.ai/humans](https://shellbrain.ai/humans/) — install, upgrade, getting started
@@ -82,6 +82,19 @@ Fish PATH setup is written to `~/.config/fish/conf.d/shellbrain.fish`.
82
82
 
83
83
  ---
84
84
 
85
+ ## DB-backed tests
86
+
87
+ **Live memories and DB-backed tests now use different Postgres hosts.**
88
+
89
+ - managed local Shellbrain keeps durable memories on the machine-owned managed instance
90
+ - DB-backed tests and scratch validation should use the dedicated repo-owned test host from `docker-compose.test.yml`
91
+ - `scripts/run_tests` provisions a disposable test database on that dedicated host by default
92
+ - `scripts/storage_status` shows the live managed target, the dedicated test host, and any legacy local test host that is still hanging around
93
+
94
+ If you are running managed local Shellbrain, do not leave a stale `SHELLBRAIN_DB_DSN` export in your shell profile that points at the old local compose database. The machine config wins anyway, and the stale env var just makes the storage layout harder to reason about.
95
+
96
+ ---
97
+
85
98
  ## Docs
86
99
 
87
100
  - [shellbrain.ai/humans](https://shellbrain.ai/humans/) — install, upgrade, getting started
@@ -52,7 +52,7 @@ def apply_side_effects(
52
52
  if effect_type == "memory_evidence.attach":
53
53
  refs = params["refs"]
54
54
  assert isinstance(refs, list)
55
- for ref in refs:
55
+ for ref in sorted(str(ref) for ref in refs):
56
56
  evidence = uow.evidence.upsert_ref(repo_id=str(params["repo_id"]), ref=str(ref))
57
57
  uow.evidence.link_memory_evidence(memory_id=str(params["memory_id"]), evidence_id=evidence.id)
58
58
  continue
@@ -124,7 +124,7 @@ def apply_side_effects(
124
124
  )
125
125
  evidence_refs = params.get("evidence_refs", [])
126
126
  assert isinstance(evidence_refs, list)
127
- for ref in evidence_refs:
127
+ for ref in sorted(str(ref) for ref in evidence_refs):
128
128
  evidence = uow.evidence.upsert_ref(repo_id=str(params["repo_id"]), ref=str(ref))
129
129
  uow.evidence.link_association_edge_evidence(edge_id=edge.id, evidence_id=evidence.id)
130
130
  continue
@@ -13,7 +13,7 @@ def classify_operation_failure(
13
13
  """Return one stable diagnosis payload for an operation failure."""
14
14
 
15
15
  message = (error_message or "").lower()
16
- if "uq_evidence_repo_ref" in message:
16
+ if "uq_evidence_repo_ref" in message or "uq_evidence_repo_episode_event" in message:
17
17
  return _diagnosis(
18
18
  category="duplicate_evidence_ref",
19
19
  summary="Evidence refs are being inserted twice for the same repo/event pair.",
@@ -45,17 +45,36 @@ def dsn_fingerprint(dsn: str) -> str:
45
45
  return hashlib.sha256(normalize_dsn(dsn).encode("utf-8")).hexdigest()
46
46
 
47
47
 
48
+ def host_port_from_dsn(dsn: str) -> tuple[str, int]:
49
+ """Extract the normalized host/port pair from one DSN."""
50
+
51
+ parsed = urlparse(dsn.replace("+psycopg", ""))
52
+ return ((parsed.hostname or "").lower(), parsed.port or 5432)
53
+
54
+
48
55
  def database_name_from_dsn(dsn: str) -> str:
49
56
  """Extract the target database name from one DSN."""
50
57
 
51
58
  return urlparse(dsn.replace("+psycopg", "")).path.lstrip("/")
52
59
 
53
60
 
54
- def assert_disposable_test_dsn(*, test_dsn: str, protected_dsn: str | None = None) -> None:
61
+ def assert_disposable_test_dsn(
62
+ *,
63
+ test_dsn: str,
64
+ protected_dsn: str | None = None,
65
+ protected_host_ports: set[tuple[str, int]] | None = None,
66
+ ) -> None:
55
67
  """Refuse to treat a protected or production-shaped database as disposable."""
56
68
 
57
69
  if protected_dsn and dsn_fingerprint(test_dsn) == dsn_fingerprint(protected_dsn):
58
70
  raise RuntimeError("Refusing destructive test setup against the protected live database DSN.")
71
+ protected_pairs = set(protected_host_ports or set())
72
+ if protected_dsn:
73
+ protected_pairs.add(host_port_from_dsn(protected_dsn))
74
+ if host_port_from_dsn(test_dsn) in protected_pairs:
75
+ raise RuntimeError(
76
+ "Refusing destructive test setup against the protected live database host/port."
77
+ )
59
78
  db_name = database_name_from_dsn(test_dsn).lower()
60
79
  if db_name in PROTECTED_DB_NAMES:
61
80
  raise RuntimeError(
@@ -3,7 +3,7 @@
3
3
  from datetime import datetime, timezone
4
4
  from uuid import uuid4
5
5
 
6
- from sqlalchemy import select, update
6
+ from sqlalchemy import select, text, update
7
7
  from sqlalchemy.dialects.postgresql import insert
8
8
 
9
9
  from app.core.entities.evidence import EvidenceRef
@@ -24,6 +24,7 @@ class EvidenceRepo(IEvidenceRepo):
24
24
  def upsert_ref(self, repo_id: str, ref: str) -> EvidenceRef:
25
25
  """This method inserts or returns a canonical evidence reference row."""
26
26
 
27
+ self._acquire_ref_guard(repo_id=repo_id, ref=ref)
27
28
  existing = (
28
29
  self._session.execute(
29
30
  select(evidence_refs).where(
@@ -63,6 +64,14 @@ class EvidenceRepo(IEvidenceRepo):
63
64
  )
64
65
  return EvidenceRef(id=evidence_id, repo_id=repo_id, ref=ref, episode_event_id=ref)
65
66
 
67
+ def _acquire_ref_guard(self, *, repo_id: str, ref: str) -> None:
68
+ """Serialize concurrent writes for one repo/ref pair within the active transaction."""
69
+
70
+ self._session.execute(
71
+ text("SELECT pg_advisory_xact_lock(hashtext(:repo_id), hashtext(:ref))"),
72
+ {"repo_id": repo_id, "ref": ref},
73
+ )
74
+
66
75
  def link_memory_evidence(self, memory_id: str, evidence_id: str) -> None:
67
76
  """This method creates shellbrain-to-evidence link rows."""
68
77
 
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "shellbrain"
7
- version = "0.1.13"
7
+ version = "0.1.14"
8
8
  description = "Repo-scoped Shellbrain CLI with explicit evidence-backed writes."
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.11"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: shellbrain
3
- Version: 0.1.13
3
+ Version: 0.1.14
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
@@ -96,6 +96,19 @@ Fish PATH setup is written to `~/.config/fish/conf.d/shellbrain.fish`.
96
96
 
97
97
  ---
98
98
 
99
+ ## DB-backed tests
100
+
101
+ **Live memories and DB-backed tests now use different Postgres hosts.**
102
+
103
+ - managed local Shellbrain keeps durable memories on the machine-owned managed instance
104
+ - DB-backed tests and scratch validation should use the dedicated repo-owned test host from `docker-compose.test.yml`
105
+ - `scripts/run_tests` provisions a disposable test database on that dedicated host by default
106
+ - `scripts/storage_status` shows the live managed target, the dedicated test host, and any legacy local test host that is still hanging around
107
+
108
+ If you are running managed local Shellbrain, do not leave a stale `SHELLBRAIN_DB_DSN` export in your shell profile that points at the old local compose database. The machine config wins anyway, and the stale env var just makes the storage layout harder to reason about.
109
+
110
+ ---
111
+
99
112
  ## Docs
100
113
 
101
114
  - [shellbrain.ai/humans](https://shellbrain.ai/humans/) — install, upgrade, getting started
File without changes
File without changes
File without changes
File without changes