zikaron 0.1.0__tar.gz → 0.3.1__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 (387) hide show
  1. {zikaron-0.1.0 → zikaron-0.3.1}/PKG-INFO +225 -34
  2. {zikaron-0.1.0 → zikaron-0.3.1}/README.md +219 -28
  3. {zikaron-0.1.0 → zikaron-0.3.1}/pyproject.toml +14 -12
  4. zikaron-0.3.1/tests/test_access_log.py +946 -0
  5. zikaron-0.3.1/tests/test_agent_scan.py +251 -0
  6. {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_check_gate.py +2 -2
  7. {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_cli_front_door.py +47 -5
  8. {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_consolidation_invariants.py +47 -14
  9. {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_consolidation_observability.py +28 -9
  10. {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_consolidation_planning.py +98 -35
  11. {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_consolidation_refusals.py +9 -3
  12. {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_consolidation_serving.py +109 -35
  13. zikaron-0.3.1/tests/test_consolidation_snapshot_planning.py +235 -0
  14. {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_consolidation_verbs.py +8 -4
  15. {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_ddl.py +38 -1
  16. {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_design_tables.py +39 -0
  17. {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_distribution.py +5 -2
  18. {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_doctor.py +193 -0
  19. {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_error_codes.py +45 -9
  20. {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_event_kinds.py +149 -3
  21. zikaron-0.3.1/tests/test_guard_claude_live.py +128 -0
  22. zikaron-0.3.1/tests/test_guard_docstring_examples.py +22 -0
  23. zikaron-0.3.1/tests/test_guard_main.py +248 -0
  24. zikaron-0.3.1/tests/test_guard_malformed.py +69 -0
  25. zikaron-0.3.1/tests/test_guard_nudge.py +82 -0
  26. zikaron-0.3.1/tests/test_guard_properties.py +78 -0
  27. zikaron-0.3.1/tests/test_guard_rule_table.py +132 -0
  28. zikaron-0.3.1/tests/test_guard_script_file.py +49 -0
  29. zikaron-0.3.1/tests/test_guard_texts.py +121 -0
  30. {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_harness_table.py +17 -0
  31. zikaron-0.3.1/tests/test_hook_components.py +157 -0
  32. {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_hook_push.py +135 -4
  33. {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_hook_rpc.py +15 -9
  34. {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_hook_stdlib_only.py +7 -6
  35. {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_hook_subagent_policy.py +14 -6
  36. {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_hook_write_policy.py +95 -29
  37. {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_indexing_writes.py +37 -35
  38. zikaron-0.3.1/tests/test_injected_prose_log.py +69 -0
  39. {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_install_assets.py +90 -41
  40. zikaron-0.3.1/tests/test_install_components.py +362 -0
  41. {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_install_e2e.py +2 -1
  42. {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_install_limits.py +24 -17
  43. {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_install_main.py +1 -1
  44. {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_install_targets.py +499 -17
  45. {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_install_writer.py +187 -32
  46. zikaron-0.3.1/tests/test_knowledge_build_log.py +539 -0
  47. zikaron-0.3.1/tests/test_knowledge_build_row_ordering.py +157 -0
  48. {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_knowledge_cli.py +722 -93
  49. zikaron-0.3.1/tests/test_knowledge_cli_integration.py +323 -0
  50. {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_knowledge_counters.py +75 -1
  51. {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_knowledge_indexer.py +23 -50
  52. {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_knowledge_lifecycle.py +15 -6
  53. zikaron-0.3.1/tests/test_knowledge_lock_race.py +111 -0
  54. {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_knowledge_registry.py +57 -2
  55. {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_knowledge_reporting.py +3 -3
  56. {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_mcp_connection_ambiguous_failure.py +3 -0
  57. {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_mcp_connection_cancellation.py +3 -0
  58. {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_mcp_connection_concurrency.py +3 -0
  59. {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_mcp_connection_integration.py +2 -2
  60. {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_mcp_connection_labels.py +5 -1
  61. {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_mcp_consolidator_bridge.py +40 -1
  62. {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_mcp_tool_descriptions.py +105 -11
  63. {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_mcp_wire_contracts.py +6 -1
  64. zikaron-0.3.1/tests/test_project_scope.py +561 -0
  65. {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_records_memory.py +33 -90
  66. {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_retrieval_reads.py +35 -27
  67. zikaron-0.3.1/tests/test_service_context.py +74 -0
  68. zikaron-0.3.1/tests/test_service_diagnostics.py +164 -0
  69. zikaron-0.3.1/tests/test_service_diagnostics_integration.py +87 -0
  70. {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_service_dispatch_consolidation.py +24 -77
  71. {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_service_dispatch_knowledge.py +127 -0
  72. {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_service_envelope.py +30 -2
  73. {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_service_knowledge_management.py +235 -25
  74. {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_service_lifecycle.py +7 -7
  75. {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_service_main.py +9 -9
  76. zikaron-0.3.1/tests/test_service_read_contention.py +171 -0
  77. {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_service_server.py +9 -2
  78. zikaron-0.3.1/tests/test_service_surface_deadline.py +307 -0
  79. zikaron-0.3.1/tests/test_service_write_contention.py +172 -0
  80. zikaron-0.3.1/tests/test_service_writer.py +410 -0
  81. {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_store.py +96 -12
  82. {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_store_connection.py +17 -2
  83. zikaron-0.3.1/tests/test_store_migration.py +379 -0
  84. zikaron-0.3.1/tests/test_store_pool.py +173 -0
  85. zikaron-0.3.1/tests/test_transaction_begin_sites.py +160 -0
  86. {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_write_tools.py +4 -3
  87. {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/cli/main.py +26 -0
  88. {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/core/consolidation/planning.py +78 -12
  89. {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/core/consolidation/serving.py +82 -22
  90. {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/core/errors.py +68 -6
  91. {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/core/events.py +206 -10
  92. {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/core/indexing/chunking.py +7 -7
  93. {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/core/indexing/vectors.py +1 -1
  94. {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/core/indexing/writes.py +3 -3
  95. {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/core/knowledge/builds.py +2 -3
  96. {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/core/knowledge/counters.py +4 -4
  97. {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/core/knowledge/database.py +7 -7
  98. {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/core/knowledge/errors.py +51 -2
  99. {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/core/knowledge/groups.py +1 -2
  100. {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/core/knowledge/lifecycle.py +8 -8
  101. {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/core/knowledge/lock.py +19 -10
  102. {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/core/knowledge/meta.py +6 -0
  103. {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/core/knowledge/registry.py +70 -11
  104. {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/core/knowledge/reporting.py +2 -4
  105. {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/core/knowledge/scan.py +42 -23
  106. {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/core/records/memory.py +68 -87
  107. zikaron-0.3.1/zikaron/core/retrieval/block.py +140 -0
  108. {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/core/retrieval/reads.py +83 -22
  109. {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/core/store/connection.py +9 -2
  110. {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/core/store/ddl.py +60 -9
  111. zikaron-0.3.1/zikaron/core/store/deadline.py +73 -0
  112. zikaron-0.3.1/zikaron/core/store/holders.py +132 -0
  113. {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/core/store/meta.py +4 -3
  114. zikaron-0.3.1/zikaron/core/store/migration.py +182 -0
  115. zikaron-0.3.1/zikaron/core/store/pool.py +143 -0
  116. {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/core/store/store.py +127 -23
  117. {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/core/store/transactions.py +86 -15
  118. {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/doctor/checks.py +101 -5
  119. {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/doctor/main.py +18 -7
  120. zikaron-0.3.1/zikaron/guard/__init__.py +1 -0
  121. zikaron-0.3.1/zikaron/guard/chars.py +60 -0
  122. zikaron-0.3.1/zikaron/guard/decision.py +135 -0
  123. zikaron-0.3.1/zikaron/guard/expression.py +416 -0
  124. zikaron-0.3.1/zikaron/guard/forms.py +161 -0
  125. zikaron-0.3.1/zikaron/guard/grammar.py +292 -0
  126. zikaron-0.3.1/zikaron/guard/heredoc.py +209 -0
  127. zikaron-0.3.1/zikaron/guard/inplace.py +136 -0
  128. zikaron-0.3.1/zikaron/guard/interpreter.py +124 -0
  129. zikaron-0.3.1/zikaron/guard/lexer.py +141 -0
  130. zikaron-0.3.1/zikaron/guard/limits.py +8 -0
  131. zikaron-0.3.1/zikaron/guard/literal_text.py +74 -0
  132. zikaron-0.3.1/zikaron/guard/main.py +126 -0
  133. zikaron-0.3.1/zikaron/guard/messages.py +105 -0
  134. zikaron-0.3.1/zikaron/guard/nudge.py +69 -0
  135. zikaron-0.3.1/zikaron/guard/override.py +84 -0
  136. zikaron-0.3.1/zikaron/guard/position.py +166 -0
  137. zikaron-0.3.1/zikaron/guard/programs.py +39 -0
  138. zikaron-0.3.1/zikaron/guard/quoting.py +83 -0
  139. zikaron-0.3.1/zikaron/guard/redirects.py +72 -0
  140. zikaron-0.3.1/zikaron/guard/scratch.py +155 -0
  141. zikaron-0.3.1/zikaron/guard/script_file.py +238 -0
  142. zikaron-0.3.1/zikaron/guard/start_text.py +19 -0
  143. zikaron-0.3.1/zikaron/guard/writes.py +236 -0
  144. {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/harness/detect.py +1 -1
  145. {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/harness/spec.py +51 -7
  146. zikaron-0.3.1/zikaron/hook/components.py +60 -0
  147. {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/hook/limits.py +7 -5
  148. {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/hook/main.py +58 -25
  149. {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/hook/push.py +29 -11
  150. {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/hook/rpc.py +9 -3
  151. {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/hook/subagent_policy.py +11 -2
  152. {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/hook/write_policy.py +133 -111
  153. zikaron-0.3.1/zikaron/install/agent_scan.py +227 -0
  154. {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/install/assets.py +55 -26
  155. {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/install/entries.py +105 -43
  156. {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/install/main.py +39 -3
  157. zikaron-0.3.1/zikaron/install/ownership.py +146 -0
  158. {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/install/targets.py +343 -97
  159. {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/install/writer.py +144 -104
  160. zikaron-0.3.1/zikaron/knowledge/client.py +145 -0
  161. zikaron-0.3.1/zikaron/knowledge/indexer/build_log.py +210 -0
  162. {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/knowledge/indexer/detach.py +43 -4
  163. {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/knowledge/indexer/main.py +57 -22
  164. zikaron-0.3.1/zikaron/knowledge/main.py +772 -0
  165. {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/knowledge/scope.py +34 -17
  166. {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/mcp/connection.py +45 -29
  167. {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/mcp/consolidator.py +43 -8
  168. {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/mcp/errors.py +6 -13
  169. {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/mcp/primary.py +166 -137
  170. zikaron-0.3.1/zikaron/project/__init__.py +1 -0
  171. zikaron-0.3.1/zikaron/project/__main__.py +8 -0
  172. zikaron-0.3.1/zikaron/project/initialize.py +149 -0
  173. zikaron-0.3.1/zikaron/project/report.py +60 -0
  174. zikaron-0.3.1/zikaron/project/resolve.py +177 -0
  175. zikaron-0.3.1/zikaron/service/access_log.py +201 -0
  176. {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/service/context.py +99 -31
  177. zikaron-0.3.1/zikaron/service/diagnostics.py +109 -0
  178. {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/service/dispatch.py +67 -16
  179. {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/service/dispatch_consolidation.py +23 -10
  180. {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/service/dispatch_knowledge.py +162 -38
  181. {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/service/envelope.py +22 -8
  182. {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/service/lifecycle.py +2 -1
  183. {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/service/main.py +44 -10
  184. zikaron-0.3.1/zikaron/service/methods.py +53 -0
  185. {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/service/params.py +12 -0
  186. {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/service/paths.py +3 -2
  187. {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/service/rpc.py +61 -7
  188. {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/service/serialize_knowledge.py +67 -5
  189. {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/service/server.py +144 -27
  190. {zikaron-0.1.0 → zikaron-0.3.1}/zikaron.egg-info/PKG-INFO +225 -34
  191. {zikaron-0.1.0 → zikaron-0.3.1}/zikaron.egg-info/SOURCES.txt +70 -0
  192. {zikaron-0.1.0 → zikaron-0.3.1}/zikaron.egg-info/entry_points.txt +1 -0
  193. {zikaron-0.1.0 → zikaron-0.3.1}/zikaron.egg-info/requires.txt +5 -5
  194. zikaron-0.1.0/tests/test_service_context.py +0 -63
  195. zikaron-0.1.0/zikaron/core/retrieval/block.py +0 -107
  196. zikaron-0.1.0/zikaron/knowledge/main.py +0 -466
  197. {zikaron-0.1.0 → zikaron-0.3.1}/LICENSE +0 -0
  198. {zikaron-0.1.0 → zikaron-0.3.1}/setup.cfg +0 -0
  199. {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_asyncio_compat.py +0 -0
  200. {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_background_encoder.py +0 -0
  201. {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_ci_workflow.py +0 -0
  202. {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_clock.py +0 -0
  203. {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_config_keys.py +0 -0
  204. {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_config_resolution.py +0 -0
  205. {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_consolidation_grouping.py +0 -0
  206. {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_definition_of_done_sites.py +0 -0
  207. {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_design_pointers_resolve.py +0 -0
  208. {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_embedder.py +0 -0
  209. {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_harness_detect.py +0 -0
  210. {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_harness_store_scope.py +0 -0
  211. {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_harness_tier_guard.py +0 -0
  212. {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_hook_connect.py +0 -0
  213. {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_hook_connect_edge_cases.py +0 -0
  214. {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_hook_connect_integration.py +0 -0
  215. {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_hook_connect_race.py +0 -0
  216. {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_hook_connect_real_service_integration.py +0 -0
  217. {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_hook_envelope.py +0 -0
  218. {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_hook_failure.py +0 -0
  219. {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_hook_main.py +0 -0
  220. {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_hook_spawn_warm.py +0 -0
  221. {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_hook_tripwire.py +0 -0
  222. {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_hook_warm_helper.py +0 -0
  223. {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_hook_warm_helper_integration.py +0 -0
  224. {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_indexing_acquisition.py +0 -0
  225. {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_indexing_chunking.py +0 -0
  226. {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_indexing_encoder.py +0 -0
  227. {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_indexing_integration.py +0 -0
  228. {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_indexing_model_cache.py +0 -0
  229. {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_install_claude_live.py +0 -0
  230. {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_install_harness.py +0 -0
  231. {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_install_takeover.py +0 -0
  232. {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_knowledge_build_invariants.py +0 -0
  233. {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_knowledge_builds.py +0 -0
  234. {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_knowledge_chunking.py +0 -0
  235. {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_knowledge_database.py +0 -0
  236. {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_knowledge_ddl.py +0 -0
  237. {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_knowledge_detach.py +0 -0
  238. {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_knowledge_files.py +0 -0
  239. {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_knowledge_git.py +0 -0
  240. {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_knowledge_groups.py +0 -0
  241. {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_knowledge_integration.py +0 -0
  242. {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_knowledge_invariants.py +0 -0
  243. {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_knowledge_lock.py +0 -0
  244. {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_knowledge_meta.py +0 -0
  245. {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_knowledge_repair.py +0 -0
  246. {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_knowledge_roots.py +0 -0
  247. {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_knowledge_scan.py +0 -0
  248. {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_knowledge_scan_git.py +0 -0
  249. {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_knowledge_search.py +0 -0
  250. {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_knowledge_state.py +0 -0
  251. {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_knowledge_text.py +0 -0
  252. {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_knowledge_vectors.py +0 -0
  253. {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_knowledge_walk.py +0 -0
  254. {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_knowledge_writes.py +0 -0
  255. {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_markdown_renders_as_written.py +0 -0
  256. {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_mcp_errors.py +0 -0
  257. {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_mcp_main.py +0 -0
  258. {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_mcp_server.py +0 -0
  259. {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_mcp_spill.py +0 -0
  260. {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_meta.py +0 -0
  261. {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_permissions.py +0 -0
  262. {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_publication_hygiene.py +0 -0
  263. {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_quoted_design_prose_is_verbatim.py +0 -0
  264. {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_readme_config_table.py +0 -0
  265. {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_readme_internal_links.py +0 -0
  266. {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_records_receipts.py +0 -0
  267. {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_records_supersession.py +0 -0
  268. {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_retrieval_arms.py +0 -0
  269. {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_retrieval_eligibility.py +0 -0
  270. {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_retrieval_integration.py +0 -0
  271. {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_retrieval_query.py +0 -0
  272. {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_retrieval_ranking.py +0 -0
  273. {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_service_context_assemble.py +0 -0
  274. {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_service_dispatch.py +0 -0
  275. {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_service_encoder_failure_stop.py +0 -0
  276. {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_service_lifecycle_integration.py +0 -0
  277. {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_service_log.py +0 -0
  278. {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_service_params.py +0 -0
  279. {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_service_paths.py +0 -0
  280. {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_service_rpc.py +0 -0
  281. {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_service_security.py +0 -0
  282. {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_signals_contention.py +0 -0
  283. {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_signals_dedup.py +0 -0
  284. {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_signals_horizon.py +0 -0
  285. {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_signals_repair.py +0 -0
  286. {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_signals_retirement.py +0 -0
  287. {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_signals_sessions.py +0 -0
  288. {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_signals_writes.py +0 -0
  289. {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_socket_path_budget.py +0 -0
  290. {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_version_seam.py +0 -0
  291. {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_write_dedup.py +0 -0
  292. {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/__init__.py +0 -0
  293. {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/cli/__init__.py +0 -0
  294. {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/core/__init__.py +0 -0
  295. {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/core/clock.py +0 -0
  296. {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/core/config/__init__.py +0 -0
  297. {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/core/config/keys.py +0 -0
  298. {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/core/config/resolution.py +0 -0
  299. {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/core/consolidation/__init__.py +0 -0
  300. {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/core/consolidation/authorization.py +0 -0
  301. {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/core/consolidation/candidates.py +0 -0
  302. {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/core/consolidation/context.py +0 -0
  303. {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/core/consolidation/grouping.py +0 -0
  304. {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/core/consolidation/groups.py +0 -0
  305. {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/core/consolidation/payload.py +0 -0
  306. {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/core/consolidation/rowstate.py +0 -0
  307. {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/core/consolidation/runs.py +0 -0
  308. {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/core/consolidation/verbs.py +0 -0
  309. {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/core/indexing/__init__.py +0 -0
  310. {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/core/indexing/acquisition.py +0 -0
  311. {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/core/indexing/encoder.py +0 -0
  312. {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/core/indexing/lexical.py +0 -0
  313. {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/core/indexing/model_cache.py +0 -0
  314. {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/core/indexing/model_pin.py +0 -0
  315. {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/core/knowledge/__init__.py +0 -0
  316. {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/core/knowledge/arms.py +0 -0
  317. {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/core/knowledge/candidates.py +0 -0
  318. {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/core/knowledge/changes.py +0 -0
  319. {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/core/knowledge/chunking.py +0 -0
  320. {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/core/knowledge/ddl.py +0 -0
  321. {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/core/knowledge/disposal.py +0 -0
  322. {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/core/knowledge/files.py +0 -0
  323. {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/core/knowledge/git.py +0 -0
  324. {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/core/knowledge/lexical.py +0 -0
  325. {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/core/knowledge/paths.py +0 -0
  326. {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/core/knowledge/pending.py +0 -0
  327. {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/core/knowledge/repair.py +0 -0
  328. {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/core/knowledge/roots.py +0 -0
  329. {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/core/knowledge/search.py +0 -0
  330. {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/core/knowledge/state.py +0 -0
  331. {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/core/knowledge/text.py +0 -0
  332. {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/core/knowledge/vectors.py +0 -0
  333. {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/core/knowledge/walk.py +0 -0
  334. {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/core/knowledge/writes.py +0 -0
  335. {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/core/records/__init__.py +0 -0
  336. {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/core/records/receipts.py +0 -0
  337. {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/core/records/supersession.py +0 -0
  338. {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/core/retrieval/__init__.py +0 -0
  339. {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/core/retrieval/arms.py +0 -0
  340. {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/core/retrieval/eligibility.py +0 -0
  341. {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/core/retrieval/query.py +0 -0
  342. {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/core/retrieval/ranking.py +0 -0
  343. {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/core/retrieval/retrieve.py +0 -0
  344. {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/core/retrieval/similarity.py +0 -0
  345. {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/core/signals/__init__.py +0 -0
  346. {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/core/signals/contention.py +0 -0
  347. {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/core/signals/dedup.py +0 -0
  348. {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/core/signals/horizon.py +0 -0
  349. {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/core/signals/repair.py +0 -0
  350. {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/core/signals/retirement.py +0 -0
  351. {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/core/signals/sessions.py +0 -0
  352. {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/core/signals/writes.py +0 -0
  353. {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/core/store/__init__.py +0 -0
  354. {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/core/store/embedder.py +0 -0
  355. {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/core/store/permissions.py +0 -0
  356. {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/core/write/__init__.py +0 -0
  357. {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/core/write/dedup.py +0 -0
  358. {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/core/write/tools.py +0 -0
  359. {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/doctor/__init__.py +0 -0
  360. {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/harness/__init__.py +0 -0
  361. {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/hook/__init__.py +0 -0
  362. {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/hook/connect.py +0 -0
  363. {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/hook/envelope.py +0 -0
  364. {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/hook/failure.py +0 -0
  365. {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/hook/spawn_warm.py +0 -0
  366. {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/hook/tripwire.py +0 -0
  367. {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/hook/warm_helper.py +0 -0
  368. {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/install/__init__.py +0 -0
  369. {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/install/__main__.py +0 -0
  370. {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/install/harness.py +0 -0
  371. {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/knowledge/__init__.py +0 -0
  372. {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/knowledge/__main__.py +0 -0
  373. {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/knowledge/indexer/__init__.py +0 -0
  374. {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/knowledge/indexer/__main__.py +0 -0
  375. {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/mcp/__init__.py +0 -0
  376. {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/mcp/main.py +0 -0
  377. {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/mcp/server.py +0 -0
  378. {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/mcp/spill.py +0 -0
  379. {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/mcp/tool_names.py +0 -0
  380. {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/py.typed +0 -0
  381. {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/service/__init__.py +0 -0
  382. {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/service/asyncio_compat.py +0 -0
  383. {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/service/log.py +0 -0
  384. {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/service/security.py +0 -0
  385. {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/service/serialize.py +0 -0
  386. {zikaron-0.1.0 → zikaron-0.3.1}/zikaron.egg-info/dependency_links.txt +0 -0
  387. {zikaron-0.1.0 → zikaron-0.3.1}/zikaron.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: zikaron
3
- Version: 0.1.0
3
+ Version: 0.3.1
4
4
  Summary: Memory and searchable project knowledge for coding agents
5
5
  License-Expression: MIT
6
6
  Project-URL: Homepage, https://github.com/nathan-shapiro/Zikaron
@@ -11,16 +11,16 @@ Description-Content-Type: text/markdown
11
11
  License-File: LICENSE
12
12
  Requires-Dist: aiosqlite==0.22.1
13
13
  Requires-Dist: sqlite-vec==0.1.9
14
- Requires-Dist: fastembed==0.8.0
15
- Requires-Dist: huggingface_hub==1.26.0
16
- Requires-Dist: fastmcp==3.4.7
14
+ Requires-Dist: fastembed==0.8.1
15
+ Requires-Dist: huggingface_hub==1.33.0
16
+ Requires-Dist: fastmcp==4.0.10
17
17
  Provides-Extra: dev
18
- Requires-Dist: ruff==0.16.7; extra == "dev"
18
+ Requires-Dist: ruff==0.16.9; extra == "dev"
19
19
  Requires-Dist: mypy==2.3.1; extra == "dev"
20
20
  Requires-Dist: pytest==9.1.1; extra == "dev"
21
21
  Requires-Dist: pytest-cov==7.1.0; extra == "dev"
22
22
  Requires-Dist: pytest-asyncio==1.4.0; extra == "dev"
23
- Requires-Dist: hypothesis==6.168.0; extra == "dev"
23
+ Requires-Dist: hypothesis==6.168.3; extra == "dev"
24
24
  Requires-Dist: pyyaml==6.0.3; extra == "dev"
25
25
  Requires-Dist: types-PyYAML==6.0.12.20260906; extra == "dev"
26
26
  Requires-Dist: build==1.3.0; extra == "dev"
@@ -61,6 +61,12 @@ yes, it is out of scope. That store is for what cost somebody time to discover,
61
61
  be discovered again by the next agent, at full price. A knowledge base has no such test — it is
62
62
  whatever corpus you point it at.
63
63
 
64
+ **And, on request, two edit guards for Claude Code** — independent of both stores. One refuses a
65
+ find-replace edit to an authored file (`sed -i`, an inline script, a heredoc into the file) and
66
+ points the agent at `Read` and `Edit`; the other reminds it, after each edit, to re-read what it
67
+ changed. See [Edit guards](#edit-guards-claude-code-on-request); a project may install the memory
68
+ store, the guards, or both.
69
+
64
70
  It runs entirely on your machine: SQLite databases under `.zikaron/`, a local embedding model, and a
65
71
  small background service on a Unix socket. **Zikaron reaches the network for exactly one thing** —
66
72
  the embedding-model download described under [Install](#install), pinned to one revision and
@@ -124,7 +130,8 @@ reads which one it is addressing before it reads a description. Consolidation ne
124
130
  | **service** | A long-running process per project. Holds the embedding model in memory and the databases open, and answers requests over a Unix socket. Starts itself when needed and stops itself when idle. |
125
131
  | **MCP server** | Translates the agent's tool calls into requests to the service. One process per agent instance; loads no model. |
126
132
  | **hook** | A single-shot executable your agent runs on start, before each message, and — under Claude Code — when it spawns a subagent. Deliberately tiny; loads no model and never touches the databases directly. |
127
- | **indexer** | A detached process started per knowledge-base build — by the service when an agent asks, or by the `zikaron.knowledge` command when you do. It outlives the call that started it, loads a model, saturates a core for a minute or more, and exits when the build finishes. If you see one in `ps`, that is a corpus building, not a runaway. |
133
+ | **guard** | Claude Code only, installed on request: a single-shot executable the harness runs before each Bash call and after each edit. Regular expressions over the call, plus one bounded read of a script the call runs from a scratch directory — no model, no service, no store. |
134
+ | **indexer** | A detached process started per knowledge-base build — by the service on every `add`/`refresh`, whether an agent asked or you did, or by you running the foreground command a build result prints. It outlives the call that started it, loads a model, saturates a core for a minute or more, and exits when the build finishes. If you see one in `ps`, that is a corpus building, not a runaway. |
128
135
 
129
136
  The service exists for one measured reason: loading the embedding model costs about **780 ms**, and
130
137
  retrieval sits on the path of every message you send. Keeping the model resident turns that into a
@@ -161,16 +168,21 @@ and never fails your turn.
161
168
  which harness a project is for from the project itself (a `.claude/` or a `.kiro/` directory),
162
169
  falls back to the `CLAUDECODE` marker when the project says nothing, and **refuses — telling you
163
170
  to name the harness — when the project names both, or when neither the project nor the marker
164
- says**. Under kiro it additionally validates the consolidator's model id against the binary,
165
- because kiro substitutes an unknown model silently; Claude Code refuses one itself, at
166
- spawn, so no such check is needed there.
171
+ says**. `CLAUDECODE` reaches the processes a session spawns, so a **Claude Code** agent asked to
172
+ run the installer is detected; kiro exports no marker, so there it is a `.kiro/` in the project or
173
+ nothing. A person running it from a terminal outside a session, into a project that has not been
174
+ set up yet, is the case where nothing says anything and `--harness` is required.
175
+
176
+ Under kiro it additionally validates the consolidator's model id against the binary, because kiro
177
+ substitutes an unknown model silently; Claude Code refuses one itself, at spawn, so no such check
178
+ is needed there.
167
179
 
168
180
  ## Install
169
181
 
170
182
  **Two supported paths, and the first is recommended for a reason worth reading.**
171
183
 
172
184
  ```bash
173
- # Recommended. `--managed-python` is not optional; the paragraph below says why.
185
+ # Recommended. `--managed-python` is not optional; "Why `uv` is recommended" below says why.
174
186
  uv tool install --managed-python zikaron
175
187
  ```
176
188
 
@@ -179,6 +191,11 @@ uv tool install --managed-python zikaron
179
191
  uv tool install --managed-python git+https://github.com/nathan-shapiro/Zikaron.git
180
192
  ```
181
193
 
194
+ Both of those need [`uv`](https://docs.astral.sh/uv/) and **no Python**, which is the point; the
195
+ `git+` form also needs `git` on `PATH`, which `uv` calls rather than bundles. `uv`'s own installer is
196
+ `curl -LsSf https://astral.sh/uv/install.sh | sh`, and on a stripped-down image you may have to
197
+ install `curl` and `ca-certificates` before that line will run.
198
+
182
199
  ```bash
183
200
  # Alternative — a source checkout on a Python you already have.
184
201
  git clone https://github.com/nathan-shapiro/Zikaron.git
@@ -218,44 +235,98 @@ goes bad on disk *afterwards* is `zikaron doctor`'s to find rather than startup'
218
235
  64 MB on every start costs more of the push hook's budget than it is worth, which is measured in
219
236
  `design/distribution.md` §"Model acquisition". `zikaron doctor` reports which state your cache is in.
220
237
 
221
- Then install into the project you want Zikaron in:
238
+ Then install into the project you want Zikaron in, naming the harness:
222
239
 
223
240
  ```bash
224
241
  cd /path/to/your/project
225
- zikaron install --project .
242
+ zikaron install --project . --harness claude-code # or: --harness kiro
243
+ ```
244
+
245
+ Under Claude Code, `--components` adds the [edit guards](#edit-guards-claude-code-on-request), or
246
+ installs them alone; without it you get the memory store only, exactly as before:
247
+
248
+ ```bash
249
+ zikaron install --project . --harness claude-code --components both # memory and guards
250
+ zikaron install --project . --harness claude-code --components guards # guards only
226
251
  ```
227
252
 
228
- Under **kiro**, name the config for the agent you actually work in:
253
+ Installing one later keeps the other: an install touches only what it was asked for.
254
+
255
+ **Name it on a first install, rather than leaving it to be detected.** Detection looks for a
256
+ `.kiro/` or `.claude/` directory in the project and for `CLAUDECODE` in the environment, and it
257
+ refuses rather than guessing when neither says. Running from an ordinary terminal, a first install
258
+ is exactly the case where neither says anything: a Claude Code project has no `.claude/` yet —
259
+ neither the trust dialog nor an ordinary tool use creates one — and `CLAUDECODE` is exported into
260
+ the processes a session spawns, not into a terminal outside one. (Ask a *Claude Code* agent to run
261
+ the installer and detection does succeed, because `CLAUDECODE` reaches it; kiro exports no marker,
262
+ so there it is a `.kiro/` in the project or nothing.)
263
+
264
+ Under **kiro**, also name the config for the agent you actually work in:
229
265
 
230
266
  ```bash
231
- zikaron install --project . --agent .kiro/agents/<your-agent>.json
267
+ zikaron install --project . --harness kiro --agent .kiro/agents/<your-agent>.json
232
268
  ```
233
269
 
234
270
  If `zikaron` is not on your `PATH` — a source checkout whose virtualenv you have not activated —
235
- every command below also works as `python -m zikaron.<command>`, run with that virtualenv's
236
- interpreter. `zikaron doctor` has no such form; it is new with the `zikaron` command.
271
+ three commands have a module form you can run with that virtualenv's interpreter, and the spelling
272
+ is not uniform:
237
273
 
238
- Pass `--harness claude-code` or `--harness kiro` to override the detection described under
239
- [Requirements](#requirements). `--agent` is kiro-only, and passing it under Claude Code is refused
240
- rather than ignored — there its entries go into fixed project files instead. To see exactly what
241
- would be written without writing anything, pass `--print-only` on either harness.
274
+ | command | module form |
275
+ |---|---|
276
+ | `zikaron install` | `python -m zikaron.install` |
277
+ | `zikaron knowledge` | `python -m zikaron.knowledge` |
278
+ | `zikaron init` | `python -m zikaron.project` |
279
+
280
+ `zikaron doctor` and `zikaron --version` have no such form; both are new with the `zikaron` command.
281
+
282
+ Omitting `--harness` falls back to the detection described under [Requirements](#requirements), which
283
+ refuses rather than guessing when it cannot tell. `--agent` is kiro-only, and passing it under Claude
284
+ Code is refused rather than ignored — there its entries go into fixed project files instead. To see
285
+ exactly what would be written without writing anything, pass `--print-only`; it previews past an
286
+ absent harness binary or an unvalidated model, and says so — but it still has to know *which*
287
+ harness, so pass `--harness` alongside it exactly as a real install would.
288
+
289
+ **Re-run the installer after you upgrade the package.** Upgrading replaces the code, not what an
290
+ earlier version wrote into your project, and a release can change a merged entry — `alwaysLoad` is
291
+ one such change. On both harnesses re-running upgrades those entries in place and needs no
292
+ `--force`; it refuses only where another Zikaron install owns something, or, under Claude Code,
293
+ where you have added a hook of your own inside Zikaron's group (both below), which is what `--force`
294
+ exists for. `zikaron doctor` afterwards says whether a Claude Code project's Zikaron entries carry
295
+ `alwaysLoad` — the one thing about `.mcp.json` it judges.
296
+
297
+ **What upgrading the package does not do by itself:**
298
+
299
+ - **A service already running keeps the old code** until it idles out (`idle_timeout`, below) or is
300
+ stopped — `pkill -f zikaron.service.main`. Until then `zikaron knowledge` may be refused with a
301
+ `bounds` error naming a field you never typed: that is the older service not knowing the newer
302
+ command.
303
+ - **A store moves forward, never back.** The first time a newer service opens a project's store it
304
+ migrates it in one transaction, without saying so, and an older Zikaron then refuses that store —
305
+ `0.1.0` cannot open one `0.3.0` has opened. If more than one environment serves the same project,
306
+ upgrade them together.
242
307
 
243
308
  Finally, if the project is a git repository, tell git to ignore the store — and, under Claude Code,
244
309
  the MCP config too:
245
310
 
246
311
  ```bash
247
312
  echo '.zikaron/' >> .gitignore
248
- echo '.mcp.json' >> .gitignore # Claude Code only; see below
313
+ echo '.mcp.json*' >> .gitignore # Claude Code only; see below
249
314
  ```
250
315
 
316
+ **The `*` covers `.mcp.json.bak`**, the copy the installer takes of `.mcp.json` before the first
317
+ merge that finds none there (the backup rule is below). It sits at the repository root and holds the
318
+ file as it then stood — the same absolute paths, and whatever the entry held at the time, an `env`
319
+ included — and it is where `--force` sends you to look for a key it dropped.
320
+
251
321
  **`.mcp.json` is the awkward one.** Claude Code intends that file to be committed and shared — that
252
322
  is what "project-scoped" means — but the entries Zikaron writes into it name absolute paths inside
253
323
  *your* virtualenv, so a clone-mate gets a server that cannot start, plus an approval prompt for it.
254
324
  This is the same objection that keeps the hook entries out of the checked-in `settings.json`; the
255
325
  difference is that `settings.local.json` exists as an untracked sibling and `.mcp.json` has no
256
326
  equivalent. With no per-project, machine-local MCP scope to move it to, the choice is yours: ignore
257
- the file, or accept that each clone re-runs the installer. Re-running is safe — a differing Zikaron
258
- entry is refused loudly rather than merged over.
327
+ the file, or accept that each clone re-runs the installer. Re-running is safe — an entry naming a
328
+ *different* virtualenv is exactly what the installer refuses loudly rather than merging over, which
329
+ is the clone-mate case.
259
330
 
260
331
  The installer does not edit `.gitignore` for you; appending to it is not a decision an installer
261
332
  should make silently. But it matters and is easy to forget: without it the memory database and its
@@ -278,7 +349,13 @@ and under **Claude Code**:
278
349
  | `.claude/agents/zikaron-consolidator.md` | the consolidation subagent, as frontmatter plus its prompt |
279
350
  | `.claude/skills/zikaron-consolidate/SKILL.md` | how to run a consolidation, and how to recover a stuck one |
280
351
  | `.claude/settings.local.json` | three hooks — session start, per-message, and per-subagent — plus both approval keys, `enabledMcpjsonServers` and `permissions.allow` |
281
- | `.mcp.json` | both servers: `zikaron` for your own tools, `zikaron-consolidator` for the consolidation verbs |
352
+ | `.mcp.json` | both servers: `zikaron` for your own tools, `zikaron-consolidator` for the consolidation verbs — each marked `alwaysLoad` so their descriptions are in context from the start rather than fetched per tool |
353
+
354
+ With `--components guards` the install writes `.claude/settings.local.json` alone, and in it only
355
+ hooks: the session-start and per-subagent hooks, which carry a short note about the guards, and the
356
+ two guard hooks — before each Bash call, after each edit. No server, no approval key, no
357
+ consolidator. With `--components both` you get all of the above together, and the start hooks carry
358
+ the write policy and the guards' note.
282
359
 
283
360
  **`settings.local.json`, not `settings.json`**, and it matters if you commit your settings: the hook
284
361
  entries name absolute paths inside *your* virtualenv, so they are meaningless in anyone else's clone.
@@ -288,8 +365,28 @@ spawn, which kiro achieves by firing its ordinary hooks for subagent sessions in
288
365
  It backs up any file it merges into (`<file>.bak`, and the first backup wins), and **refreshes a
289
366
  shipped file whose contents are not what this version ships** — after backing it up, and saying so.
290
367
  That is what makes upgrading work, and the cost is that a hand-edit to a shipped file is reverted on
291
- the next install rather than kept. Under kiro it also validates the consolidator's model id, because
292
- an unknown model would otherwise be silently replaced by the harness's default.
368
+ the next install rather than kept. **Under Claude Code the same holds inside a file it *merges*
369
+ into**: a Zikaron hook entry whose command is this install's but whose `timeout` or matcher you
370
+ changed is rewritten, and the install names the trigger so you can re-apply it. Otherwise a new
371
+ default timeout could never reach an existing install. What refuses is an entry naming a *different*
372
+ Zikaron install — or a Zikaron hook group you have added your own second entry to, since the
373
+ installer replaces a group wholesale rather than merging inside one, so refusing is the only way not
374
+ to drop your entry silently. `--force` overrides that, and then says which command of your own it
375
+ dropped.
376
+
377
+ `.mcp.json` is merged **per key**: a key you added to Zikaron's own entry is kept and named in the
378
+ output, a value this install writes — `alwaysLoad` in particular — is set to this install's and
379
+ named too, whether it was missing or different, and only a different `command` or `--mode` refuses. `--force` is the exception: it
380
+ replaces the entry whole, says which of your keys that dropped, and points you at the `.bak` beside
381
+ the file. It does not say whether the backup has them, because it cannot know — the first backup
382
+ wins, so the `.bak` on disk may have been written before or after you added the key.
383
+
384
+ Under kiro the same rules hold inside the agent config you name: the `mcpServers` entry merges per
385
+ key, a Zikaron hook entry whose command is this install's is rewritten and its trigger named, and
386
+ only an entry naming a different install's command, or another `--mode`, refuses. A hook of Zikaron's
387
+ on a trigger this install does not write is left alone. Kiro's install also validates the
388
+ consolidator's model id, because an unknown model would otherwise be silently replaced by the
389
+ harness's default.
293
390
 
294
391
  `@zikaron` has to be in `tools` or Zikaron's tools are simply absent: the `mcpServers` entry
295
392
  *configures* the server and `tools` is what *selects* from it. It goes into `allowedTools` too, so the
@@ -361,6 +458,14 @@ consolidator's: a subagent has nobody to answer a permission prompt, so an unapp
361
458
  there does not ask, it fails at the moment consolidation needs it. The file read above is the
362
459
  exception — that one prompts.
363
460
 
461
+ **A subagent that sets its own `tools:` list cannot see Zikaron at all.** Registering a server in
462
+ `.mcp.json` makes it available project-wide, but an agent whose frontmatter carries an explicit
463
+ `tools:` allowlist gets exactly that list — the registration does not add to it. So a correct
464
+ install, a running service and a subagent doing the work can still produce zero memories, with
465
+ nothing anywhere saying why. The install names any such agent it finds and tells you to add
466
+ `mcp__zikaron` to its `tools:`, and `zikaron doctor` reports the same. Your allowlist is a
467
+ deliberate grant, so neither one edits it for you.
468
+
364
469
  **Your own agent can see the four consolidation verbs**, and that is not a misconfiguration. A server
365
470
  has to be registered for the whole session before any subagent can reach it, so registering the
366
471
  consolidator's server exposes it to you too. Under kiro the two tool sets are separated mechanically;
@@ -369,6 +474,39 @@ guard, the receipts and the lease are untouched — but an unauthorized consolid
369
474
  tokens and could write a poorly-judged long-term record. `permissions.deny` is **not** the fix: it is
370
475
  global and unregisters the tool, after which the consolidator itself refuses to start.
371
476
 
477
+ ### Edit guards (Claude Code, on request)
478
+
479
+ `--components guards` (or `both`) installs two deterministic hooks that hold an agent to two rules,
480
+ with no model and no store behind them (`design/edit-guards.md`):
481
+
482
+ - **A find-replace edit to an authored file is refused** — `sed -i`, `perl -pi`, an inline Python
483
+ or node script that writes a file, a heredoc or `echo` redirected into one, and a script under
484
+ `/tmp` or `$TMPDIR` that the command runs and that does any of these. The refusal reaches the
485
+ agent as the tool's result and tells it to use `Read` and `Edit`, or `Write` for a new file.
486
+ Paths under `/tmp`, `/var/tmp` and `$TMPDIR` are exempt, and so is a command carrying the
487
+ override the refusal itself describes, for the files whose bytes a program owns.
488
+ - **After each edit, the agent is reminded** that the file has not been re-read, and asked for one
489
+ re-read of the edited material once that file's editing is done. A Bash command gets no such
490
+ reminder, so when the agent overrides a refusal, the guard's acknowledgement names what the
491
+ command changes and asks for that re-read instead.
492
+
493
+ They are not a security boundary: a script the guard reads is one run from a scratch directory,
494
+ and a script anywhere else — one of the project's own programs — is never read, by design. A guard
495
+ that fails for any reason allows the call.
496
+
497
+ They write no log and no store record: a refusal, an override and its reason are in the session's
498
+ own transcript. `zikaron doctor` does not report on them. To see the refusal without a model in
499
+ the loop, hand the guard the payload Claude Code would send it, from the project directory — run
500
+ from a scratch directory such as `/tmp`, the same command is exempt and prints nothing:
501
+
502
+ ```bash
503
+ printf '%s' '{"hook_event_name":"PreToolUse","tool_name":"Bash","cwd":"'"$PWD"'","tool_input":{"command":"sed -i s/a/b/ README.md"}}' | zikaron-guard
504
+ ```
505
+
506
+ It prints the deny the agent would read as the command's result. Asking an agent to run `sed -i`
507
+ usually shows something else: told the rule when its session starts, it reaches for `Read` and
508
+ `Edit` without trying.
509
+
372
510
  ### Options
373
511
 
374
512
  | Flag | Effect |
@@ -380,7 +518,8 @@ global and unregisters the tool, after which the consolidator itself refuses to
380
518
  | `--model <id>` | the consolidator's model (default: `claude-sonnet-5` under kiro, `sonnet` under Claude Code) |
381
519
  | `--format {object,array}` | **kiro only.** Which hook format to write when the target config has none yet |
382
520
  | `--no-trust-tools` | do not pre-approve Zikaron's own tools, so every Zikaron tool call asks permission |
383
- | `--force` | replace a symlink at a shipped path, and overwrite entries wired to a different Zikaron install that would otherwise be refused |
521
+ | `--components {memory,guards,both}` | what to install: the memory store (the default), the edit guards below, or both. **Claude Code only** for `guards` and `both`; `--model` is refused with `guards`, which ships no consolidator |
522
+ | `--force` | replace a symlink at a shipped path, and overwrite entries wired to a different Zikaron install that would otherwise be refused. It also stops merging: a server entry — `.mcp.json`'s, or kiro's `mcpServers` — is replaced **whole**, so a key you added to Zikaron's own entry goes, and under Claude Code a Zikaron hook group is replaced whole, so a hook of your own inside it goes too. Both are named in the output |
384
523
 
385
524
  Both hook formats kiro accepts are supported, and a config that already uses one keeps it: kiro
386
525
  rewrites a config in whichever format it read, so mixing them in one file has no defined meaning.
@@ -408,7 +547,16 @@ It exits non-zero if any check fails. **A model cache that is not there yet is n
408
547
  is no prefetch at install time, so a first run reports it as fetched on first use and exits 0. The
409
548
  last row reports rather than checks: the linked SQLite version varies between interpreter builds on
410
549
  one machine and there is no correct value to compare against, so stating it is the whole point.
411
- `zikaron doctor --project <dir>` checks another project's socket path.
550
+ Some rows appear only where a project gives them something to check: under Claude Code, whether
551
+ the Zikaron servers in `.mcp.json` carry `alwaysLoad` — an older install lacks it, and a re-install
552
+ fixes that — and which of your subagents cannot reach Zikaron's tools.
553
+ `zikaron doctor --project <dir>` checks another project.
554
+
555
+ **`zikaron --version` names the version you installed**, which is the first thing to put in a bug
556
+ report; `doctor` reports on the machine and leaves the version to this. A PyPI install reports a
557
+ release. A `git+` install or a source checkout between releases reports a `.dev` version — a `.dev0`
558
+ suffix means "working toward that number, not released" — so it never impersonates a release, but it
559
+ does span every commit until the next bump, and a bug report from one needs the commit as well.
412
560
 
413
561
  Then start a session with the agent you installed into. On start you should see nothing unusual — the
414
562
  write policy goes into the model's context, not to your terminal. Then, from the project directory:
@@ -449,6 +597,7 @@ a knowledge base called design docs"*. It has tools to list, create, rename, ref
449
597
  remove them. The same verbs are available at a shell, for when no agent is running:
450
598
 
451
599
  ```bash
600
+ zikaron init # once per project; safe to run twice
452
601
  zikaron knowledge list
453
602
  zikaron knowledge add "design docs" --path ./design \
454
603
  --description "Architecture and design records"
@@ -456,7 +605,21 @@ zikaron knowledge refresh # every corpus; name one to narrow it
456
605
  zikaron knowledge status "design docs"
457
606
  ```
458
607
 
459
- Three things are worth knowing before you point one at a directory.
608
+ **`init` comes first because every `knowledge` verb refuses a project with no store**, and it is the
609
+ only command that creates one. In a project your agent has already opened there is a store
610
+ already, and `init` will say so and exit 0 — so putting it at the top of a provisioning script
611
+ costs at most the service start the next command would pay anyway. The **first** `init` — the one
612
+ that creates the store — can outlast the deadline on a cold model cache and exit 1 while the
613
+ service keeps fetching the model; running it again succeeds when the service was only slow, and the
614
+ command points at `.zikaron/service.log` for when it was not.
615
+
616
+ **They act on the project you run them in.** The directory is resolved as `--project` if you pass
617
+ it, else the harness's own project directory if it exports one, else the directory you are standing
618
+ in — so a command typed a few levels down is a different project from the one your agent uses, and
619
+ saying so is the whole point of the refusal. It names the store it found above you, if there is one,
620
+ and never acts on it.
621
+
622
+ Three more things are worth knowing before you point a knowledge base at a directory.
460
623
 
461
624
  **Building takes minutes and runs in the background.** `add` and `refresh` start a build and return.
462
625
  A **first** build answers nothing at all while it runs: the corpus reports `reindex_required` for
@@ -465,6 +628,13 @@ answering from what is already indexed while it works — as does a `--full` one
465
628
  of a rebuild forced by a changed embedding model, which empties the corpus before it starts and so
466
629
  answers nothing until it finishes. `status` says how far it has got.
467
630
 
631
+ In a script or a CI step, use `zikaron knowledge refresh --wait`: it reports progress and returns
632
+ once every build against those corpora has let go of its corpus — including one an earlier `add`
633
+ started, which it waits for rather than stepping past — exiting non-zero if any build left its corpus
634
+ unusable. By then each build's record of what it cost has been written to `memory.db`, or dropped if
635
+ the store stayed locked; the indexer process itself may still be exiting. Without `--wait` the step
636
+ can finish while an indexer is still running, and whatever kills the step kills the build too.
637
+
468
638
  **Nothing updates an index on its own.** There is no watcher and no schedule: a corpus drifts from
469
639
  its files until somebody refreshes it. A search says so when it can — a result whose file has
470
640
  changed since it was indexed comes back marked `stale`.
@@ -584,7 +754,8 @@ it is `0600` or `0700`. The **installer** also writes harness config — the fil
584
754
  knowledge/ one database per knowledge base, named by a generated id.
585
755
  Absent until you create one
586
756
  config.toml your per-project overrides, if you wrote any
587
- service.log the background service: startup, resolved config, errors
757
+ service.log the background service: startup, resolved config, errors, why it stopped,
758
+ any request running longer than 30 s, and the stack dumps below
588
759
  hook.log one line per hook failure, write-policy-override note, or session/environment
589
760
  mismatch. Absent means none happened. Not every line is a failure: an override
590
761
  that is used but exceeds the injection budget is printed anyway and logged
@@ -610,6 +781,15 @@ its next group — or, if that process is killed first, by the next one that sta
610
781
  copy of memory text that lives outside `.zikaron/`, which is why the erasure procedure under
611
782
  [Secrets](#secrets) removes it by hand. Nothing spills under kiro.
612
783
 
784
+ **What `service.log` tells you about a service that stopped, or stopped answering.** A clean stop
785
+ writes one `stopping: reason=…` line: `idle`, `store_replaced`, `encoder_failed`, or `sigterm` /
786
+ `sigint` when it was asked to stop. A request still running after the 30 s idle poll is logged as
787
+ `long request: method=… session=… age=…` on every poll until it ends — `session=unresolved` if it
788
+ never got that far. Two signals write a dump without stopping the service: `kill -USR2 <pid>` writes
789
+ the requests in flight and every asyncio task's stack, and `kill -USR1 <pid>` writes every thread's
790
+ stack, which is the one that still works when the service's event loop itself is stuck. The second is
791
+ raw text, without the timestamp and `pid=` every other line carries.
792
+
613
793
  Two notes on reading the rest. `memory.db` can look implausibly small while `memory.db-wal` is large —
614
794
  that is normal for a database held open by the service, since recent writes live in the log until a
615
795
  checkpoint; the files together are the store. And `hook.log` records only a fixed failure label and an
@@ -617,8 +797,11 @@ error code, never your prompt or a memory's text, so it cannot hold a leaked sec
617
797
 
618
798
  There is one more log that is not a file: an event table inside `memory.db`. It records what happened
619
799
  on every **memory** read and write — used to measure whether the write policy is working, and kept in
620
- the database because those rows must commit alongside the change they describe. A knowledge base has
621
- no event log: it keeps four **search** counters in its own metadata — searches, empty searches,
800
+ the database because those rows must commit alongside the change they describe. It also holds an
801
+ access log, best-effort: a `call` row for each request the service answers — which method, how long
802
+ it took, and what it refused, if anything — and a `knowledge_build` row for each corpus build.
803
+ Neither carries text. A knowledge base's own database has no event log: it keeps four **search**
804
+ counters in its metadata — searches, empty searches,
622
805
  results returned, results stale — which `zikaron_knowledge_status` reports beside the last build's
623
806
  own file, byte and skip-reason counts.
624
807
 
@@ -640,13 +823,15 @@ symptoms it cannot see.
640
823
  | nothing searchable works at all | `zikaron doctor` — extension loading, FTS5 and `sqlite-vec` are the three that fail this way, and all three are properties of the interpreter rather than of your project |
641
824
  | the MCP server starts and immediately dies | `zikaron doctor` — an over-long `$XDG_RUNTIME_DIR` makes the socket path exceed what the platform allows, and this is the only channel that says so |
642
825
  | no memories are being injected | `.zikaron/hook.log`, then `pgrep -af zikaron.service.main` |
643
- | the agent has no `zikaron_*` tools | kiro: `/tools`, and check `@zikaron` is in the agent's `tools`. Claude Code: `/mcp`, and check neither server is pending approval |
826
+ | the agent has no `zikaron_*` tools | kiro: `/tools`, and check `@zikaron` is in the agent's `tools`. Claude Code: `/mcp`, and check neither server is pending approval — then check whether that agent's own frontmatter sets `tools:`, which overrides the project-wide registration entirely (below) |
644
827
  | every Zikaron tool call asks permission | kiro: add `@zikaron` to the agent's `allowedTools`. Claude Code: it is `permissions.allow` in `settings.local.json` that did not take |
645
828
  | a knowledge search returns nothing, or too little | `zikaron_knowledge_status` (or `zikaron knowledge status <name>`) — a corpus **refreshing** answers from what is already indexed, but one building for the first time answers nothing until it finishes. `reindex_required` means it has no usable index **right now**: never built, or a rebuild emptied it and was interrupted before it finished, or its database is gone, or the configured embedding model changed since it was built. `refresh` rebuilds it |
646
829
  | knowledge results look wrong for the file on disk | the index has drifted; nothing refreshes it on a schedule. A result whose file changed since indexing is marked `stale` — run `refresh` |
647
830
  | "Agents not available for crew stages: zikaron-consolidator" | add it to `toolsSettings.crew.availableAgents`, or re-run the installer |
648
831
  | consolidation seems stuck | ask to consolidate again — that takes the run over |
649
832
  | the service will not start | `.zikaron/service.log`; a change to a **hard** store-coupled key (`embed_model`, `embed_dim`) is the usual cause. A soft one never refuses **over what is already stored** — but any key set outside its range refuses at startup, whatever its coupling |
833
+ | the service is running but stops answering | `.zikaron/service.log`'s last `long request:` lines name the request it is stuck in; `kill -USR2 <pid>` adds the requests in flight and every task's stack, and `kill -USR1 <pid>` every thread's stack if the loop itself is blocked (`pgrep -af zikaron.service.main` gives the pid). A `memory_plan_groups` or `memory_next_group` under five minutes is a plan, not a wedge. `hook.log` says which kind it is: **`transport`** on every push, though the socket connects, is a blocked loop; **`deadline_passed`** — or `unanswered`, when the answer lost the race to the hook's deadline — on every push with **no `call` rows** behind them in the event table is a request holding the store's writer, and the same run **with** `call` rows is every read connection taken; **`unanswered`** alone is a push whose own request hangs. One kind looks healthy in `hook.log`: pushes succeed while every write answers `store_busy` after about five seconds — the writer's lock held with nothing running — and the `long request:` line names that one too |
834
+ | Zikaron's tools are listed but arrive name-only, or the agent's first calls are refused for argument shape | Claude Code: an install predating `alwaysLoad`, which `zikaron doctor` reports. Upgrade Zikaron where the project was installed from and re-run the installer there; the entry upgrades in place and needs no `--force` |
650
835
  | a hook command "not found" | the config names a different virtualenv than the one you installed from; re-run the installer with `--force` |
651
836
  | a memory looks half-written when injected | an over-long gist; see the note below |
652
837
 
@@ -736,6 +921,12 @@ than deleted, because both hold settings that are not Zikaron's. **All three set
736
921
  the install writes three** — leaving `enabledMcpjsonServers` behind names two servers that no longer
737
922
  exist, which loads nothing and breaks nothing but is not an uninstall.
738
923
 
924
+ **The edit guards** live only in `.claude/settings.local.json`: remove the `PreToolUse` and
925
+ `PostToolUse` hook groups whose command is `zikaron-guard`, and the `SessionStart` and
926
+ `SubagentStart` groups whose command is `zikaron-hook`. To keep the memory store and drop only the
927
+ guards, re-running the installer will not do it — an install never removes a selection — so delete
928
+ the two guard groups and the `--components …` arguments from the two start groups' command.
929
+
739
930
  Note that `rm -rf .zikaron` takes the knowledge bases with it. They are rebuildable — an index is a
740
931
  view onto files you still have — but rebuilding one takes minutes per corpus.
741
932