zikaron 0.1.0__tar.gz → 0.3.0__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 (351) hide show
  1. {zikaron-0.1.0/zikaron.egg-info → zikaron-0.3.0}/PKG-INFO +157 -29
  2. {zikaron-0.1.0 → zikaron-0.3.0}/README.md +156 -28
  3. {zikaron-0.1.0 → zikaron-0.3.0}/pyproject.toml +1 -1
  4. zikaron-0.3.0/tests/test_access_log.py +946 -0
  5. zikaron-0.3.0/tests/test_agent_scan.py +251 -0
  6. {zikaron-0.1.0 → zikaron-0.3.0}/tests/test_cli_front_door.py +35 -1
  7. {zikaron-0.1.0 → zikaron-0.3.0}/tests/test_consolidation_invariants.py +47 -14
  8. {zikaron-0.1.0 → zikaron-0.3.0}/tests/test_consolidation_observability.py +28 -9
  9. {zikaron-0.1.0 → zikaron-0.3.0}/tests/test_consolidation_planning.py +98 -35
  10. {zikaron-0.1.0 → zikaron-0.3.0}/tests/test_consolidation_refusals.py +9 -3
  11. {zikaron-0.1.0 → zikaron-0.3.0}/tests/test_consolidation_serving.py +109 -35
  12. zikaron-0.3.0/tests/test_consolidation_snapshot_planning.py +235 -0
  13. {zikaron-0.1.0 → zikaron-0.3.0}/tests/test_consolidation_verbs.py +8 -4
  14. {zikaron-0.1.0 → zikaron-0.3.0}/tests/test_ddl.py +38 -1
  15. {zikaron-0.1.0 → zikaron-0.3.0}/tests/test_design_tables.py +39 -0
  16. {zikaron-0.1.0 → zikaron-0.3.0}/tests/test_doctor.py +193 -0
  17. {zikaron-0.1.0 → zikaron-0.3.0}/tests/test_error_codes.py +45 -9
  18. {zikaron-0.1.0 → zikaron-0.3.0}/tests/test_event_kinds.py +149 -3
  19. {zikaron-0.1.0 → zikaron-0.3.0}/tests/test_hook_push.py +135 -4
  20. {zikaron-0.1.0 → zikaron-0.3.0}/tests/test_hook_rpc.py +15 -9
  21. {zikaron-0.1.0 → zikaron-0.3.0}/tests/test_hook_subagent_policy.py +14 -6
  22. {zikaron-0.1.0 → zikaron-0.3.0}/tests/test_hook_write_policy.py +95 -29
  23. {zikaron-0.1.0 → zikaron-0.3.0}/tests/test_indexing_writes.py +37 -35
  24. zikaron-0.3.0/tests/test_injected_prose_log.py +69 -0
  25. {zikaron-0.1.0 → zikaron-0.3.0}/tests/test_install_assets.py +90 -41
  26. {zikaron-0.1.0 → zikaron-0.3.0}/tests/test_install_e2e.py +2 -1
  27. {zikaron-0.1.0 → zikaron-0.3.0}/tests/test_install_limits.py +24 -17
  28. {zikaron-0.1.0 → zikaron-0.3.0}/tests/test_install_main.py +1 -1
  29. {zikaron-0.1.0 → zikaron-0.3.0}/tests/test_install_targets.py +499 -17
  30. {zikaron-0.1.0 → zikaron-0.3.0}/tests/test_install_writer.py +187 -32
  31. zikaron-0.3.0/tests/test_knowledge_build_log.py +539 -0
  32. zikaron-0.3.0/tests/test_knowledge_build_row_ordering.py +157 -0
  33. {zikaron-0.1.0 → zikaron-0.3.0}/tests/test_knowledge_cli.py +722 -93
  34. zikaron-0.3.0/tests/test_knowledge_cli_integration.py +323 -0
  35. {zikaron-0.1.0 → zikaron-0.3.0}/tests/test_knowledge_counters.py +75 -1
  36. {zikaron-0.1.0 → zikaron-0.3.0}/tests/test_knowledge_indexer.py +23 -50
  37. {zikaron-0.1.0 → zikaron-0.3.0}/tests/test_knowledge_lifecycle.py +15 -6
  38. zikaron-0.3.0/tests/test_knowledge_lock_race.py +111 -0
  39. {zikaron-0.1.0 → zikaron-0.3.0}/tests/test_knowledge_registry.py +57 -2
  40. {zikaron-0.1.0 → zikaron-0.3.0}/tests/test_knowledge_reporting.py +3 -3
  41. {zikaron-0.1.0 → zikaron-0.3.0}/tests/test_mcp_connection_ambiguous_failure.py +3 -0
  42. {zikaron-0.1.0 → zikaron-0.3.0}/tests/test_mcp_connection_cancellation.py +3 -0
  43. {zikaron-0.1.0 → zikaron-0.3.0}/tests/test_mcp_connection_concurrency.py +3 -0
  44. {zikaron-0.1.0 → zikaron-0.3.0}/tests/test_mcp_connection_integration.py +2 -2
  45. {zikaron-0.1.0 → zikaron-0.3.0}/tests/test_mcp_connection_labels.py +5 -1
  46. {zikaron-0.1.0 → zikaron-0.3.0}/tests/test_mcp_consolidator_bridge.py +40 -1
  47. {zikaron-0.1.0 → zikaron-0.3.0}/tests/test_mcp_tool_descriptions.py +105 -11
  48. {zikaron-0.1.0 → zikaron-0.3.0}/tests/test_mcp_wire_contracts.py +6 -1
  49. zikaron-0.3.0/tests/test_project_scope.py +561 -0
  50. {zikaron-0.1.0 → zikaron-0.3.0}/tests/test_records_memory.py +33 -90
  51. {zikaron-0.1.0 → zikaron-0.3.0}/tests/test_retrieval_reads.py +35 -27
  52. zikaron-0.3.0/tests/test_service_context.py +74 -0
  53. zikaron-0.3.0/tests/test_service_diagnostics.py +157 -0
  54. zikaron-0.3.0/tests/test_service_diagnostics_integration.py +79 -0
  55. {zikaron-0.1.0 → zikaron-0.3.0}/tests/test_service_dispatch_consolidation.py +24 -77
  56. {zikaron-0.1.0 → zikaron-0.3.0}/tests/test_service_dispatch_knowledge.py +127 -0
  57. {zikaron-0.1.0 → zikaron-0.3.0}/tests/test_service_envelope.py +30 -2
  58. {zikaron-0.1.0 → zikaron-0.3.0}/tests/test_service_knowledge_management.py +235 -25
  59. {zikaron-0.1.0 → zikaron-0.3.0}/tests/test_service_lifecycle.py +7 -7
  60. {zikaron-0.1.0 → zikaron-0.3.0}/tests/test_service_main.py +9 -9
  61. zikaron-0.3.0/tests/test_service_read_contention.py +171 -0
  62. {zikaron-0.1.0 → zikaron-0.3.0}/tests/test_service_server.py +9 -2
  63. zikaron-0.3.0/tests/test_service_surface_deadline.py +307 -0
  64. zikaron-0.3.0/tests/test_service_write_contention.py +172 -0
  65. zikaron-0.3.0/tests/test_service_writer.py +410 -0
  66. {zikaron-0.1.0 → zikaron-0.3.0}/tests/test_store.py +96 -12
  67. {zikaron-0.1.0 → zikaron-0.3.0}/tests/test_store_connection.py +17 -2
  68. zikaron-0.3.0/tests/test_store_migration.py +379 -0
  69. zikaron-0.3.0/tests/test_store_pool.py +173 -0
  70. zikaron-0.3.0/tests/test_transaction_begin_sites.py +160 -0
  71. {zikaron-0.1.0 → zikaron-0.3.0}/tests/test_write_tools.py +4 -3
  72. {zikaron-0.1.0 → zikaron-0.3.0}/zikaron/cli/main.py +26 -0
  73. {zikaron-0.1.0 → zikaron-0.3.0}/zikaron/core/consolidation/planning.py +78 -12
  74. {zikaron-0.1.0 → zikaron-0.3.0}/zikaron/core/consolidation/serving.py +82 -22
  75. {zikaron-0.1.0 → zikaron-0.3.0}/zikaron/core/errors.py +68 -6
  76. {zikaron-0.1.0 → zikaron-0.3.0}/zikaron/core/events.py +206 -10
  77. {zikaron-0.1.0 → zikaron-0.3.0}/zikaron/core/indexing/chunking.py +7 -7
  78. {zikaron-0.1.0 → zikaron-0.3.0}/zikaron/core/indexing/vectors.py +1 -1
  79. {zikaron-0.1.0 → zikaron-0.3.0}/zikaron/core/indexing/writes.py +3 -3
  80. {zikaron-0.1.0 → zikaron-0.3.0}/zikaron/core/knowledge/builds.py +2 -3
  81. {zikaron-0.1.0 → zikaron-0.3.0}/zikaron/core/knowledge/counters.py +4 -4
  82. {zikaron-0.1.0 → zikaron-0.3.0}/zikaron/core/knowledge/database.py +7 -7
  83. {zikaron-0.1.0 → zikaron-0.3.0}/zikaron/core/knowledge/errors.py +51 -2
  84. {zikaron-0.1.0 → zikaron-0.3.0}/zikaron/core/knowledge/groups.py +1 -2
  85. {zikaron-0.1.0 → zikaron-0.3.0}/zikaron/core/knowledge/lifecycle.py +8 -8
  86. {zikaron-0.1.0 → zikaron-0.3.0}/zikaron/core/knowledge/lock.py +19 -10
  87. {zikaron-0.1.0 → zikaron-0.3.0}/zikaron/core/knowledge/meta.py +6 -0
  88. {zikaron-0.1.0 → zikaron-0.3.0}/zikaron/core/knowledge/registry.py +70 -11
  89. {zikaron-0.1.0 → zikaron-0.3.0}/zikaron/core/knowledge/reporting.py +2 -4
  90. {zikaron-0.1.0 → zikaron-0.3.0}/zikaron/core/knowledge/scan.py +42 -23
  91. {zikaron-0.1.0 → zikaron-0.3.0}/zikaron/core/records/memory.py +68 -87
  92. zikaron-0.3.0/zikaron/core/retrieval/block.py +140 -0
  93. {zikaron-0.1.0 → zikaron-0.3.0}/zikaron/core/retrieval/reads.py +83 -22
  94. {zikaron-0.1.0 → zikaron-0.3.0}/zikaron/core/store/connection.py +9 -2
  95. {zikaron-0.1.0 → zikaron-0.3.0}/zikaron/core/store/ddl.py +60 -9
  96. zikaron-0.3.0/zikaron/core/store/deadline.py +73 -0
  97. zikaron-0.3.0/zikaron/core/store/holders.py +132 -0
  98. {zikaron-0.1.0 → zikaron-0.3.0}/zikaron/core/store/meta.py +4 -3
  99. zikaron-0.3.0/zikaron/core/store/migration.py +182 -0
  100. zikaron-0.3.0/zikaron/core/store/pool.py +143 -0
  101. {zikaron-0.1.0 → zikaron-0.3.0}/zikaron/core/store/store.py +127 -23
  102. {zikaron-0.1.0 → zikaron-0.3.0}/zikaron/core/store/transactions.py +86 -15
  103. {zikaron-0.1.0 → zikaron-0.3.0}/zikaron/doctor/checks.py +101 -5
  104. {zikaron-0.1.0 → zikaron-0.3.0}/zikaron/doctor/main.py +18 -7
  105. {zikaron-0.1.0 → zikaron-0.3.0}/zikaron/harness/detect.py +1 -1
  106. {zikaron-0.1.0 → zikaron-0.3.0}/zikaron/harness/spec.py +18 -7
  107. {zikaron-0.1.0 → zikaron-0.3.0}/zikaron/hook/limits.py +7 -5
  108. {zikaron-0.1.0 → zikaron-0.3.0}/zikaron/hook/push.py +29 -11
  109. {zikaron-0.1.0 → zikaron-0.3.0}/zikaron/hook/rpc.py +9 -3
  110. {zikaron-0.1.0 → zikaron-0.3.0}/zikaron/hook/subagent_policy.py +5 -1
  111. {zikaron-0.1.0 → zikaron-0.3.0}/zikaron/hook/write_policy.py +133 -111
  112. zikaron-0.3.0/zikaron/install/agent_scan.py +227 -0
  113. {zikaron-0.1.0 → zikaron-0.3.0}/zikaron/install/assets.py +55 -26
  114. {zikaron-0.1.0 → zikaron-0.3.0}/zikaron/install/entries.py +37 -12
  115. zikaron-0.3.0/zikaron/install/ownership.py +146 -0
  116. {zikaron-0.1.0 → zikaron-0.3.0}/zikaron/install/targets.py +178 -68
  117. {zikaron-0.1.0 → zikaron-0.3.0}/zikaron/install/writer.py +138 -101
  118. zikaron-0.3.0/zikaron/knowledge/client.py +145 -0
  119. zikaron-0.3.0/zikaron/knowledge/indexer/build_log.py +210 -0
  120. {zikaron-0.1.0 → zikaron-0.3.0}/zikaron/knowledge/indexer/detach.py +43 -4
  121. {zikaron-0.1.0 → zikaron-0.3.0}/zikaron/knowledge/indexer/main.py +57 -22
  122. zikaron-0.3.0/zikaron/knowledge/main.py +772 -0
  123. {zikaron-0.1.0 → zikaron-0.3.0}/zikaron/knowledge/scope.py +34 -17
  124. {zikaron-0.1.0 → zikaron-0.3.0}/zikaron/mcp/connection.py +45 -29
  125. {zikaron-0.1.0 → zikaron-0.3.0}/zikaron/mcp/consolidator.py +43 -8
  126. {zikaron-0.1.0 → zikaron-0.3.0}/zikaron/mcp/errors.py +6 -13
  127. {zikaron-0.1.0 → zikaron-0.3.0}/zikaron/mcp/primary.py +166 -137
  128. zikaron-0.3.0/zikaron/project/__init__.py +1 -0
  129. zikaron-0.3.0/zikaron/project/__main__.py +8 -0
  130. zikaron-0.3.0/zikaron/project/initialize.py +149 -0
  131. zikaron-0.3.0/zikaron/project/report.py +60 -0
  132. zikaron-0.3.0/zikaron/project/resolve.py +177 -0
  133. zikaron-0.3.0/zikaron/service/access_log.py +201 -0
  134. {zikaron-0.1.0 → zikaron-0.3.0}/zikaron/service/context.py +99 -31
  135. zikaron-0.3.0/zikaron/service/diagnostics.py +93 -0
  136. {zikaron-0.1.0 → zikaron-0.3.0}/zikaron/service/dispatch.py +67 -16
  137. {zikaron-0.1.0 → zikaron-0.3.0}/zikaron/service/dispatch_consolidation.py +23 -10
  138. {zikaron-0.1.0 → zikaron-0.3.0}/zikaron/service/dispatch_knowledge.py +162 -38
  139. {zikaron-0.1.0 → zikaron-0.3.0}/zikaron/service/envelope.py +22 -8
  140. {zikaron-0.1.0 → zikaron-0.3.0}/zikaron/service/lifecycle.py +2 -1
  141. {zikaron-0.1.0 → zikaron-0.3.0}/zikaron/service/main.py +44 -10
  142. zikaron-0.3.0/zikaron/service/methods.py +53 -0
  143. {zikaron-0.1.0 → zikaron-0.3.0}/zikaron/service/params.py +12 -0
  144. {zikaron-0.1.0 → zikaron-0.3.0}/zikaron/service/paths.py +3 -2
  145. {zikaron-0.1.0 → zikaron-0.3.0}/zikaron/service/rpc.py +61 -7
  146. {zikaron-0.1.0 → zikaron-0.3.0}/zikaron/service/serialize_knowledge.py +67 -5
  147. {zikaron-0.1.0 → zikaron-0.3.0}/zikaron/service/server.py +144 -27
  148. {zikaron-0.1.0 → zikaron-0.3.0/zikaron.egg-info}/PKG-INFO +157 -29
  149. {zikaron-0.1.0 → zikaron-0.3.0}/zikaron.egg-info/SOURCES.txt +34 -0
  150. zikaron-0.1.0/tests/test_service_context.py +0 -63
  151. zikaron-0.1.0/zikaron/core/retrieval/block.py +0 -107
  152. zikaron-0.1.0/zikaron/knowledge/main.py +0 -466
  153. {zikaron-0.1.0 → zikaron-0.3.0}/LICENSE +0 -0
  154. {zikaron-0.1.0 → zikaron-0.3.0}/setup.cfg +0 -0
  155. {zikaron-0.1.0 → zikaron-0.3.0}/tests/test_asyncio_compat.py +0 -0
  156. {zikaron-0.1.0 → zikaron-0.3.0}/tests/test_background_encoder.py +0 -0
  157. {zikaron-0.1.0 → zikaron-0.3.0}/tests/test_check_gate.py +0 -0
  158. {zikaron-0.1.0 → zikaron-0.3.0}/tests/test_ci_workflow.py +0 -0
  159. {zikaron-0.1.0 → zikaron-0.3.0}/tests/test_clock.py +0 -0
  160. {zikaron-0.1.0 → zikaron-0.3.0}/tests/test_config_keys.py +0 -0
  161. {zikaron-0.1.0 → zikaron-0.3.0}/tests/test_config_resolution.py +0 -0
  162. {zikaron-0.1.0 → zikaron-0.3.0}/tests/test_consolidation_grouping.py +0 -0
  163. {zikaron-0.1.0 → zikaron-0.3.0}/tests/test_definition_of_done_sites.py +0 -0
  164. {zikaron-0.1.0 → zikaron-0.3.0}/tests/test_design_pointers_resolve.py +0 -0
  165. {zikaron-0.1.0 → zikaron-0.3.0}/tests/test_distribution.py +0 -0
  166. {zikaron-0.1.0 → zikaron-0.3.0}/tests/test_embedder.py +0 -0
  167. {zikaron-0.1.0 → zikaron-0.3.0}/tests/test_harness_detect.py +0 -0
  168. {zikaron-0.1.0 → zikaron-0.3.0}/tests/test_harness_store_scope.py +0 -0
  169. {zikaron-0.1.0 → zikaron-0.3.0}/tests/test_harness_table.py +0 -0
  170. {zikaron-0.1.0 → zikaron-0.3.0}/tests/test_harness_tier_guard.py +0 -0
  171. {zikaron-0.1.0 → zikaron-0.3.0}/tests/test_hook_connect.py +0 -0
  172. {zikaron-0.1.0 → zikaron-0.3.0}/tests/test_hook_connect_edge_cases.py +0 -0
  173. {zikaron-0.1.0 → zikaron-0.3.0}/tests/test_hook_connect_integration.py +0 -0
  174. {zikaron-0.1.0 → zikaron-0.3.0}/tests/test_hook_connect_race.py +0 -0
  175. {zikaron-0.1.0 → zikaron-0.3.0}/tests/test_hook_connect_real_service_integration.py +0 -0
  176. {zikaron-0.1.0 → zikaron-0.3.0}/tests/test_hook_envelope.py +0 -0
  177. {zikaron-0.1.0 → zikaron-0.3.0}/tests/test_hook_failure.py +0 -0
  178. {zikaron-0.1.0 → zikaron-0.3.0}/tests/test_hook_main.py +0 -0
  179. {zikaron-0.1.0 → zikaron-0.3.0}/tests/test_hook_spawn_warm.py +0 -0
  180. {zikaron-0.1.0 → zikaron-0.3.0}/tests/test_hook_stdlib_only.py +0 -0
  181. {zikaron-0.1.0 → zikaron-0.3.0}/tests/test_hook_tripwire.py +0 -0
  182. {zikaron-0.1.0 → zikaron-0.3.0}/tests/test_hook_warm_helper.py +0 -0
  183. {zikaron-0.1.0 → zikaron-0.3.0}/tests/test_hook_warm_helper_integration.py +0 -0
  184. {zikaron-0.1.0 → zikaron-0.3.0}/tests/test_indexing_acquisition.py +0 -0
  185. {zikaron-0.1.0 → zikaron-0.3.0}/tests/test_indexing_chunking.py +0 -0
  186. {zikaron-0.1.0 → zikaron-0.3.0}/tests/test_indexing_encoder.py +0 -0
  187. {zikaron-0.1.0 → zikaron-0.3.0}/tests/test_indexing_integration.py +0 -0
  188. {zikaron-0.1.0 → zikaron-0.3.0}/tests/test_indexing_model_cache.py +0 -0
  189. {zikaron-0.1.0 → zikaron-0.3.0}/tests/test_install_claude_live.py +0 -0
  190. {zikaron-0.1.0 → zikaron-0.3.0}/tests/test_install_harness.py +0 -0
  191. {zikaron-0.1.0 → zikaron-0.3.0}/tests/test_install_takeover.py +0 -0
  192. {zikaron-0.1.0 → zikaron-0.3.0}/tests/test_knowledge_build_invariants.py +0 -0
  193. {zikaron-0.1.0 → zikaron-0.3.0}/tests/test_knowledge_builds.py +0 -0
  194. {zikaron-0.1.0 → zikaron-0.3.0}/tests/test_knowledge_chunking.py +0 -0
  195. {zikaron-0.1.0 → zikaron-0.3.0}/tests/test_knowledge_database.py +0 -0
  196. {zikaron-0.1.0 → zikaron-0.3.0}/tests/test_knowledge_ddl.py +0 -0
  197. {zikaron-0.1.0 → zikaron-0.3.0}/tests/test_knowledge_detach.py +0 -0
  198. {zikaron-0.1.0 → zikaron-0.3.0}/tests/test_knowledge_files.py +0 -0
  199. {zikaron-0.1.0 → zikaron-0.3.0}/tests/test_knowledge_git.py +0 -0
  200. {zikaron-0.1.0 → zikaron-0.3.0}/tests/test_knowledge_groups.py +0 -0
  201. {zikaron-0.1.0 → zikaron-0.3.0}/tests/test_knowledge_integration.py +0 -0
  202. {zikaron-0.1.0 → zikaron-0.3.0}/tests/test_knowledge_invariants.py +0 -0
  203. {zikaron-0.1.0 → zikaron-0.3.0}/tests/test_knowledge_lock.py +0 -0
  204. {zikaron-0.1.0 → zikaron-0.3.0}/tests/test_knowledge_meta.py +0 -0
  205. {zikaron-0.1.0 → zikaron-0.3.0}/tests/test_knowledge_repair.py +0 -0
  206. {zikaron-0.1.0 → zikaron-0.3.0}/tests/test_knowledge_roots.py +0 -0
  207. {zikaron-0.1.0 → zikaron-0.3.0}/tests/test_knowledge_scan.py +0 -0
  208. {zikaron-0.1.0 → zikaron-0.3.0}/tests/test_knowledge_scan_git.py +0 -0
  209. {zikaron-0.1.0 → zikaron-0.3.0}/tests/test_knowledge_search.py +0 -0
  210. {zikaron-0.1.0 → zikaron-0.3.0}/tests/test_knowledge_state.py +0 -0
  211. {zikaron-0.1.0 → zikaron-0.3.0}/tests/test_knowledge_text.py +0 -0
  212. {zikaron-0.1.0 → zikaron-0.3.0}/tests/test_knowledge_vectors.py +0 -0
  213. {zikaron-0.1.0 → zikaron-0.3.0}/tests/test_knowledge_walk.py +0 -0
  214. {zikaron-0.1.0 → zikaron-0.3.0}/tests/test_knowledge_writes.py +0 -0
  215. {zikaron-0.1.0 → zikaron-0.3.0}/tests/test_markdown_renders_as_written.py +0 -0
  216. {zikaron-0.1.0 → zikaron-0.3.0}/tests/test_mcp_errors.py +0 -0
  217. {zikaron-0.1.0 → zikaron-0.3.0}/tests/test_mcp_main.py +0 -0
  218. {zikaron-0.1.0 → zikaron-0.3.0}/tests/test_mcp_server.py +0 -0
  219. {zikaron-0.1.0 → zikaron-0.3.0}/tests/test_mcp_spill.py +0 -0
  220. {zikaron-0.1.0 → zikaron-0.3.0}/tests/test_meta.py +0 -0
  221. {zikaron-0.1.0 → zikaron-0.3.0}/tests/test_permissions.py +0 -0
  222. {zikaron-0.1.0 → zikaron-0.3.0}/tests/test_publication_hygiene.py +0 -0
  223. {zikaron-0.1.0 → zikaron-0.3.0}/tests/test_quoted_design_prose_is_verbatim.py +0 -0
  224. {zikaron-0.1.0 → zikaron-0.3.0}/tests/test_readme_config_table.py +0 -0
  225. {zikaron-0.1.0 → zikaron-0.3.0}/tests/test_readme_internal_links.py +0 -0
  226. {zikaron-0.1.0 → zikaron-0.3.0}/tests/test_records_receipts.py +0 -0
  227. {zikaron-0.1.0 → zikaron-0.3.0}/tests/test_records_supersession.py +0 -0
  228. {zikaron-0.1.0 → zikaron-0.3.0}/tests/test_retrieval_arms.py +0 -0
  229. {zikaron-0.1.0 → zikaron-0.3.0}/tests/test_retrieval_eligibility.py +0 -0
  230. {zikaron-0.1.0 → zikaron-0.3.0}/tests/test_retrieval_integration.py +0 -0
  231. {zikaron-0.1.0 → zikaron-0.3.0}/tests/test_retrieval_query.py +0 -0
  232. {zikaron-0.1.0 → zikaron-0.3.0}/tests/test_retrieval_ranking.py +0 -0
  233. {zikaron-0.1.0 → zikaron-0.3.0}/tests/test_service_context_assemble.py +0 -0
  234. {zikaron-0.1.0 → zikaron-0.3.0}/tests/test_service_dispatch.py +0 -0
  235. {zikaron-0.1.0 → zikaron-0.3.0}/tests/test_service_encoder_failure_stop.py +0 -0
  236. {zikaron-0.1.0 → zikaron-0.3.0}/tests/test_service_lifecycle_integration.py +0 -0
  237. {zikaron-0.1.0 → zikaron-0.3.0}/tests/test_service_log.py +0 -0
  238. {zikaron-0.1.0 → zikaron-0.3.0}/tests/test_service_params.py +0 -0
  239. {zikaron-0.1.0 → zikaron-0.3.0}/tests/test_service_paths.py +0 -0
  240. {zikaron-0.1.0 → zikaron-0.3.0}/tests/test_service_rpc.py +0 -0
  241. {zikaron-0.1.0 → zikaron-0.3.0}/tests/test_service_security.py +0 -0
  242. {zikaron-0.1.0 → zikaron-0.3.0}/tests/test_signals_contention.py +0 -0
  243. {zikaron-0.1.0 → zikaron-0.3.0}/tests/test_signals_dedup.py +0 -0
  244. {zikaron-0.1.0 → zikaron-0.3.0}/tests/test_signals_horizon.py +0 -0
  245. {zikaron-0.1.0 → zikaron-0.3.0}/tests/test_signals_repair.py +0 -0
  246. {zikaron-0.1.0 → zikaron-0.3.0}/tests/test_signals_retirement.py +0 -0
  247. {zikaron-0.1.0 → zikaron-0.3.0}/tests/test_signals_sessions.py +0 -0
  248. {zikaron-0.1.0 → zikaron-0.3.0}/tests/test_signals_writes.py +0 -0
  249. {zikaron-0.1.0 → zikaron-0.3.0}/tests/test_socket_path_budget.py +0 -0
  250. {zikaron-0.1.0 → zikaron-0.3.0}/tests/test_version_seam.py +0 -0
  251. {zikaron-0.1.0 → zikaron-0.3.0}/tests/test_write_dedup.py +0 -0
  252. {zikaron-0.1.0 → zikaron-0.3.0}/zikaron/__init__.py +0 -0
  253. {zikaron-0.1.0 → zikaron-0.3.0}/zikaron/cli/__init__.py +0 -0
  254. {zikaron-0.1.0 → zikaron-0.3.0}/zikaron/core/__init__.py +0 -0
  255. {zikaron-0.1.0 → zikaron-0.3.0}/zikaron/core/clock.py +0 -0
  256. {zikaron-0.1.0 → zikaron-0.3.0}/zikaron/core/config/__init__.py +0 -0
  257. {zikaron-0.1.0 → zikaron-0.3.0}/zikaron/core/config/keys.py +0 -0
  258. {zikaron-0.1.0 → zikaron-0.3.0}/zikaron/core/config/resolution.py +0 -0
  259. {zikaron-0.1.0 → zikaron-0.3.0}/zikaron/core/consolidation/__init__.py +0 -0
  260. {zikaron-0.1.0 → zikaron-0.3.0}/zikaron/core/consolidation/authorization.py +0 -0
  261. {zikaron-0.1.0 → zikaron-0.3.0}/zikaron/core/consolidation/candidates.py +0 -0
  262. {zikaron-0.1.0 → zikaron-0.3.0}/zikaron/core/consolidation/context.py +0 -0
  263. {zikaron-0.1.0 → zikaron-0.3.0}/zikaron/core/consolidation/grouping.py +0 -0
  264. {zikaron-0.1.0 → zikaron-0.3.0}/zikaron/core/consolidation/groups.py +0 -0
  265. {zikaron-0.1.0 → zikaron-0.3.0}/zikaron/core/consolidation/payload.py +0 -0
  266. {zikaron-0.1.0 → zikaron-0.3.0}/zikaron/core/consolidation/rowstate.py +0 -0
  267. {zikaron-0.1.0 → zikaron-0.3.0}/zikaron/core/consolidation/runs.py +0 -0
  268. {zikaron-0.1.0 → zikaron-0.3.0}/zikaron/core/consolidation/verbs.py +0 -0
  269. {zikaron-0.1.0 → zikaron-0.3.0}/zikaron/core/indexing/__init__.py +0 -0
  270. {zikaron-0.1.0 → zikaron-0.3.0}/zikaron/core/indexing/acquisition.py +0 -0
  271. {zikaron-0.1.0 → zikaron-0.3.0}/zikaron/core/indexing/encoder.py +0 -0
  272. {zikaron-0.1.0 → zikaron-0.3.0}/zikaron/core/indexing/lexical.py +0 -0
  273. {zikaron-0.1.0 → zikaron-0.3.0}/zikaron/core/indexing/model_cache.py +0 -0
  274. {zikaron-0.1.0 → zikaron-0.3.0}/zikaron/core/indexing/model_pin.py +0 -0
  275. {zikaron-0.1.0 → zikaron-0.3.0}/zikaron/core/knowledge/__init__.py +0 -0
  276. {zikaron-0.1.0 → zikaron-0.3.0}/zikaron/core/knowledge/arms.py +0 -0
  277. {zikaron-0.1.0 → zikaron-0.3.0}/zikaron/core/knowledge/candidates.py +0 -0
  278. {zikaron-0.1.0 → zikaron-0.3.0}/zikaron/core/knowledge/changes.py +0 -0
  279. {zikaron-0.1.0 → zikaron-0.3.0}/zikaron/core/knowledge/chunking.py +0 -0
  280. {zikaron-0.1.0 → zikaron-0.3.0}/zikaron/core/knowledge/ddl.py +0 -0
  281. {zikaron-0.1.0 → zikaron-0.3.0}/zikaron/core/knowledge/disposal.py +0 -0
  282. {zikaron-0.1.0 → zikaron-0.3.0}/zikaron/core/knowledge/files.py +0 -0
  283. {zikaron-0.1.0 → zikaron-0.3.0}/zikaron/core/knowledge/git.py +0 -0
  284. {zikaron-0.1.0 → zikaron-0.3.0}/zikaron/core/knowledge/lexical.py +0 -0
  285. {zikaron-0.1.0 → zikaron-0.3.0}/zikaron/core/knowledge/paths.py +0 -0
  286. {zikaron-0.1.0 → zikaron-0.3.0}/zikaron/core/knowledge/pending.py +0 -0
  287. {zikaron-0.1.0 → zikaron-0.3.0}/zikaron/core/knowledge/repair.py +0 -0
  288. {zikaron-0.1.0 → zikaron-0.3.0}/zikaron/core/knowledge/roots.py +0 -0
  289. {zikaron-0.1.0 → zikaron-0.3.0}/zikaron/core/knowledge/search.py +0 -0
  290. {zikaron-0.1.0 → zikaron-0.3.0}/zikaron/core/knowledge/state.py +0 -0
  291. {zikaron-0.1.0 → zikaron-0.3.0}/zikaron/core/knowledge/text.py +0 -0
  292. {zikaron-0.1.0 → zikaron-0.3.0}/zikaron/core/knowledge/vectors.py +0 -0
  293. {zikaron-0.1.0 → zikaron-0.3.0}/zikaron/core/knowledge/walk.py +0 -0
  294. {zikaron-0.1.0 → zikaron-0.3.0}/zikaron/core/knowledge/writes.py +0 -0
  295. {zikaron-0.1.0 → zikaron-0.3.0}/zikaron/core/records/__init__.py +0 -0
  296. {zikaron-0.1.0 → zikaron-0.3.0}/zikaron/core/records/receipts.py +0 -0
  297. {zikaron-0.1.0 → zikaron-0.3.0}/zikaron/core/records/supersession.py +0 -0
  298. {zikaron-0.1.0 → zikaron-0.3.0}/zikaron/core/retrieval/__init__.py +0 -0
  299. {zikaron-0.1.0 → zikaron-0.3.0}/zikaron/core/retrieval/arms.py +0 -0
  300. {zikaron-0.1.0 → zikaron-0.3.0}/zikaron/core/retrieval/eligibility.py +0 -0
  301. {zikaron-0.1.0 → zikaron-0.3.0}/zikaron/core/retrieval/query.py +0 -0
  302. {zikaron-0.1.0 → zikaron-0.3.0}/zikaron/core/retrieval/ranking.py +0 -0
  303. {zikaron-0.1.0 → zikaron-0.3.0}/zikaron/core/retrieval/retrieve.py +0 -0
  304. {zikaron-0.1.0 → zikaron-0.3.0}/zikaron/core/retrieval/similarity.py +0 -0
  305. {zikaron-0.1.0 → zikaron-0.3.0}/zikaron/core/signals/__init__.py +0 -0
  306. {zikaron-0.1.0 → zikaron-0.3.0}/zikaron/core/signals/contention.py +0 -0
  307. {zikaron-0.1.0 → zikaron-0.3.0}/zikaron/core/signals/dedup.py +0 -0
  308. {zikaron-0.1.0 → zikaron-0.3.0}/zikaron/core/signals/horizon.py +0 -0
  309. {zikaron-0.1.0 → zikaron-0.3.0}/zikaron/core/signals/repair.py +0 -0
  310. {zikaron-0.1.0 → zikaron-0.3.0}/zikaron/core/signals/retirement.py +0 -0
  311. {zikaron-0.1.0 → zikaron-0.3.0}/zikaron/core/signals/sessions.py +0 -0
  312. {zikaron-0.1.0 → zikaron-0.3.0}/zikaron/core/signals/writes.py +0 -0
  313. {zikaron-0.1.0 → zikaron-0.3.0}/zikaron/core/store/__init__.py +0 -0
  314. {zikaron-0.1.0 → zikaron-0.3.0}/zikaron/core/store/embedder.py +0 -0
  315. {zikaron-0.1.0 → zikaron-0.3.0}/zikaron/core/store/permissions.py +0 -0
  316. {zikaron-0.1.0 → zikaron-0.3.0}/zikaron/core/write/__init__.py +0 -0
  317. {zikaron-0.1.0 → zikaron-0.3.0}/zikaron/core/write/dedup.py +0 -0
  318. {zikaron-0.1.0 → zikaron-0.3.0}/zikaron/core/write/tools.py +0 -0
  319. {zikaron-0.1.0 → zikaron-0.3.0}/zikaron/doctor/__init__.py +0 -0
  320. {zikaron-0.1.0 → zikaron-0.3.0}/zikaron/harness/__init__.py +0 -0
  321. {zikaron-0.1.0 → zikaron-0.3.0}/zikaron/hook/__init__.py +0 -0
  322. {zikaron-0.1.0 → zikaron-0.3.0}/zikaron/hook/connect.py +0 -0
  323. {zikaron-0.1.0 → zikaron-0.3.0}/zikaron/hook/envelope.py +0 -0
  324. {zikaron-0.1.0 → zikaron-0.3.0}/zikaron/hook/failure.py +0 -0
  325. {zikaron-0.1.0 → zikaron-0.3.0}/zikaron/hook/main.py +0 -0
  326. {zikaron-0.1.0 → zikaron-0.3.0}/zikaron/hook/spawn_warm.py +0 -0
  327. {zikaron-0.1.0 → zikaron-0.3.0}/zikaron/hook/tripwire.py +0 -0
  328. {zikaron-0.1.0 → zikaron-0.3.0}/zikaron/hook/warm_helper.py +0 -0
  329. {zikaron-0.1.0 → zikaron-0.3.0}/zikaron/install/__init__.py +0 -0
  330. {zikaron-0.1.0 → zikaron-0.3.0}/zikaron/install/__main__.py +0 -0
  331. {zikaron-0.1.0 → zikaron-0.3.0}/zikaron/install/harness.py +0 -0
  332. {zikaron-0.1.0 → zikaron-0.3.0}/zikaron/install/main.py +0 -0
  333. {zikaron-0.1.0 → zikaron-0.3.0}/zikaron/knowledge/__init__.py +0 -0
  334. {zikaron-0.1.0 → zikaron-0.3.0}/zikaron/knowledge/__main__.py +0 -0
  335. {zikaron-0.1.0 → zikaron-0.3.0}/zikaron/knowledge/indexer/__init__.py +0 -0
  336. {zikaron-0.1.0 → zikaron-0.3.0}/zikaron/knowledge/indexer/__main__.py +0 -0
  337. {zikaron-0.1.0 → zikaron-0.3.0}/zikaron/mcp/__init__.py +0 -0
  338. {zikaron-0.1.0 → zikaron-0.3.0}/zikaron/mcp/main.py +0 -0
  339. {zikaron-0.1.0 → zikaron-0.3.0}/zikaron/mcp/server.py +0 -0
  340. {zikaron-0.1.0 → zikaron-0.3.0}/zikaron/mcp/spill.py +0 -0
  341. {zikaron-0.1.0 → zikaron-0.3.0}/zikaron/mcp/tool_names.py +0 -0
  342. {zikaron-0.1.0 → zikaron-0.3.0}/zikaron/py.typed +0 -0
  343. {zikaron-0.1.0 → zikaron-0.3.0}/zikaron/service/__init__.py +0 -0
  344. {zikaron-0.1.0 → zikaron-0.3.0}/zikaron/service/asyncio_compat.py +0 -0
  345. {zikaron-0.1.0 → zikaron-0.3.0}/zikaron/service/log.py +0 -0
  346. {zikaron-0.1.0 → zikaron-0.3.0}/zikaron/service/security.py +0 -0
  347. {zikaron-0.1.0 → zikaron-0.3.0}/zikaron/service/serialize.py +0 -0
  348. {zikaron-0.1.0 → zikaron-0.3.0}/zikaron.egg-info/dependency_links.txt +0 -0
  349. {zikaron-0.1.0 → zikaron-0.3.0}/zikaron.egg-info/entry_points.txt +0 -0
  350. {zikaron-0.1.0 → zikaron-0.3.0}/zikaron.egg-info/requires.txt +0 -0
  351. {zikaron-0.1.0 → zikaron-0.3.0}/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.0
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
@@ -124,7 +124,7 @@ reads which one it is addressing before it reads a description. Consolidation ne
124
124
  | **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
125
  | **MCP server** | Translates the agent's tool calls into requests to the service. One process per agent instance; loads no model. |
126
126
  | **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. |
127
+ | **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
128
 
129
129
  The service exists for one measured reason: loading the embedding model costs about **780 ms**, and
130
130
  retrieval sits on the path of every message you send. Keeping the model resident turns that into a
@@ -161,16 +161,21 @@ and never fails your turn.
161
161
  which harness a project is for from the project itself (a `.claude/` or a `.kiro/` directory),
162
162
  falls back to the `CLAUDECODE` marker when the project says nothing, and **refuses — telling you
163
163
  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.
164
+ says**. `CLAUDECODE` reaches the processes a session spawns, so a **Claude Code** agent asked to
165
+ run the installer is detected; kiro exports no marker, so there it is a `.kiro/` in the project or
166
+ nothing. A person running it from a terminal outside a session, into a project that has not been
167
+ set up yet, is the case where nothing says anything and `--harness` is required.
168
+
169
+ Under kiro it additionally validates the consolidator's model id against the binary, because kiro
170
+ substitutes an unknown model silently; Claude Code refuses one itself, at spawn, so no such check
171
+ is needed there.
167
172
 
168
173
  ## Install
169
174
 
170
175
  **Two supported paths, and the first is recommended for a reason worth reading.**
171
176
 
172
177
  ```bash
173
- # Recommended. `--managed-python` is not optional; the paragraph below says why.
178
+ # Recommended. `--managed-python` is not optional; "Why `uv` is recommended" below says why.
174
179
  uv tool install --managed-python zikaron
175
180
  ```
176
181
 
@@ -179,6 +184,11 @@ uv tool install --managed-python zikaron
179
184
  uv tool install --managed-python git+https://github.com/nathan-shapiro/Zikaron.git
180
185
  ```
181
186
 
187
+ Both of those need [`uv`](https://docs.astral.sh/uv/) and **no Python**, which is the point; the
188
+ `git+` form also needs `git` on `PATH`, which `uv` calls rather than bundles. `uv`'s own installer is
189
+ `curl -LsSf https://astral.sh/uv/install.sh | sh`, and on a stripped-down image you may have to
190
+ install `curl` and `ca-certificates` before that line will run.
191
+
182
192
  ```bash
183
193
  # Alternative — a source checkout on a Python you already have.
184
194
  git clone https://github.com/nathan-shapiro/Zikaron.git
@@ -218,44 +228,88 @@ goes bad on disk *afterwards* is `zikaron doctor`'s to find rather than startup'
218
228
  64 MB on every start costs more of the push hook's budget than it is worth, which is measured in
219
229
  `design/distribution.md` §"Model acquisition". `zikaron doctor` reports which state your cache is in.
220
230
 
221
- Then install into the project you want Zikaron in:
231
+ Then install into the project you want Zikaron in, naming the harness:
222
232
 
223
233
  ```bash
224
234
  cd /path/to/your/project
225
- zikaron install --project .
235
+ zikaron install --project . --harness claude-code # or: --harness kiro
226
236
  ```
227
237
 
228
- Under **kiro**, name the config for the agent you actually work in:
238
+ **Name it on a first install, rather than leaving it to be detected.** Detection looks for a
239
+ `.kiro/` or `.claude/` directory in the project and for `CLAUDECODE` in the environment, and it
240
+ refuses rather than guessing when neither says. Running from an ordinary terminal, a first install
241
+ is exactly the case where neither says anything: a Claude Code project has no `.claude/` yet —
242
+ neither the trust dialog nor an ordinary tool use creates one — and `CLAUDECODE` is exported into
243
+ the processes a session spawns, not into a terminal outside one. (Ask a *Claude Code* agent to run
244
+ the installer and detection does succeed, because `CLAUDECODE` reaches it; kiro exports no marker,
245
+ so there it is a `.kiro/` in the project or nothing.)
246
+
247
+ Under **kiro**, also name the config for the agent you actually work in:
229
248
 
230
249
  ```bash
231
- zikaron install --project . --agent .kiro/agents/<your-agent>.json
250
+ zikaron install --project . --harness kiro --agent .kiro/agents/<your-agent>.json
232
251
  ```
233
252
 
234
253
  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.
254
+ three commands have a module form you can run with that virtualenv's interpreter, and the spelling
255
+ is not uniform:
237
256
 
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.
257
+ | command | module form |
258
+ |---|---|
259
+ | `zikaron install` | `python -m zikaron.install` |
260
+ | `zikaron knowledge` | `python -m zikaron.knowledge` |
261
+ | `zikaron init` | `python -m zikaron.project` |
262
+
263
+ `zikaron doctor` and `zikaron --version` have no such form; both are new with the `zikaron` command.
264
+
265
+ Omitting `--harness` falls back to the detection described under [Requirements](#requirements), which
266
+ refuses rather than guessing when it cannot tell. `--agent` is kiro-only, and passing it under Claude
267
+ Code is refused rather than ignored — there its entries go into fixed project files instead. To see
268
+ exactly what would be written without writing anything, pass `--print-only`; it previews past an
269
+ absent harness binary or an unvalidated model, and says so — but it still has to know *which*
270
+ harness, so pass `--harness` alongside it exactly as a real install would.
271
+
272
+ **Re-run the installer after you upgrade the package.** Upgrading replaces the code, not what an
273
+ earlier version wrote into your project, and a release can change a merged entry — `alwaysLoad` is
274
+ one such change. On both harnesses re-running upgrades those entries in place and needs no
275
+ `--force`; it refuses only where another Zikaron install owns something, or, under Claude Code,
276
+ where you have added a hook of your own inside Zikaron's group (both below), which is what `--force`
277
+ exists for. `zikaron doctor` afterwards says whether a Claude Code project's Zikaron entries carry
278
+ `alwaysLoad` — the one thing about `.mcp.json` it judges.
279
+
280
+ **What upgrading the package does not do by itself:**
281
+
282
+ - **A service already running keeps the old code** until it idles out (`idle_timeout`, below) or is
283
+ stopped — `pkill -f zikaron.service.main`. Until then `zikaron knowledge` may be refused with a
284
+ `bounds` error naming a field you never typed: that is the older service not knowing the newer
285
+ command.
286
+ - **A store moves forward, never back.** The first time a newer service opens a project's store it
287
+ migrates it in one transaction, without saying so, and an older Zikaron then refuses that store —
288
+ `0.1.0` cannot open one `0.3.0` has opened. If more than one environment serves the same project,
289
+ upgrade them together.
242
290
 
243
291
  Finally, if the project is a git repository, tell git to ignore the store — and, under Claude Code,
244
292
  the MCP config too:
245
293
 
246
294
  ```bash
247
295
  echo '.zikaron/' >> .gitignore
248
- echo '.mcp.json' >> .gitignore # Claude Code only; see below
296
+ echo '.mcp.json*' >> .gitignore # Claude Code only; see below
249
297
  ```
250
298
 
299
+ **The `*` covers `.mcp.json.bak`**, the copy the installer takes of `.mcp.json` before the first
300
+ merge that finds none there (the backup rule is below). It sits at the repository root and holds the
301
+ file as it then stood — the same absolute paths, and whatever the entry held at the time, an `env`
302
+ included — and it is where `--force` sends you to look for a key it dropped.
303
+
251
304
  **`.mcp.json` is the awkward one.** Claude Code intends that file to be committed and shared — that
252
305
  is what "project-scoped" means — but the entries Zikaron writes into it name absolute paths inside
253
306
  *your* virtualenv, so a clone-mate gets a server that cannot start, plus an approval prompt for it.
254
307
  This is the same objection that keeps the hook entries out of the checked-in `settings.json`; the
255
308
  difference is that `settings.local.json` exists as an untracked sibling and `.mcp.json` has no
256
309
  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.
310
+ the file, or accept that each clone re-runs the installer. Re-running is safe — an entry naming a
311
+ *different* virtualenv is exactly what the installer refuses loudly rather than merging over, which
312
+ is the clone-mate case.
259
313
 
260
314
  The installer does not edit `.gitignore` for you; appending to it is not a decision an installer
261
315
  should make silently. But it matters and is easy to forget: without it the memory database and its
@@ -278,7 +332,7 @@ and under **Claude Code**:
278
332
  | `.claude/agents/zikaron-consolidator.md` | the consolidation subagent, as frontmatter plus its prompt |
279
333
  | `.claude/skills/zikaron-consolidate/SKILL.md` | how to run a consolidation, and how to recover a stuck one |
280
334
  | `.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 |
335
+ | `.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 |
282
336
 
283
337
  **`settings.local.json`, not `settings.json`**, and it matters if you commit your settings: the hook
284
338
  entries name absolute paths inside *your* virtualenv, so they are meaningless in anyone else's clone.
@@ -288,8 +342,28 @@ spawn, which kiro achieves by firing its ordinary hooks for subagent sessions in
288
342
  It backs up any file it merges into (`<file>.bak`, and the first backup wins), and **refreshes a
289
343
  shipped file whose contents are not what this version ships** — after backing it up, and saying so.
290
344
  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.
345
+ the next install rather than kept. **Under Claude Code the same holds inside a file it *merges*
346
+ into**: a Zikaron hook entry whose command is this install's but whose `timeout` or matcher you
347
+ changed is rewritten, and the install names the trigger so you can re-apply it. Otherwise a new
348
+ default timeout could never reach an existing install. What refuses is an entry naming a *different*
349
+ Zikaron install — or a Zikaron hook group you have added your own second entry to, since the
350
+ installer replaces a group wholesale rather than merging inside one, so refusing is the only way not
351
+ to drop your entry silently. `--force` overrides that, and then says which command of your own it
352
+ dropped.
353
+
354
+ `.mcp.json` is merged **per key**: a key you added to Zikaron's own entry is kept and named in the
355
+ output, a value this install writes — `alwaysLoad` in particular — is set to this install's and
356
+ named too, whether it was missing or different, and only a different `command` or `--mode` refuses. `--force` is the exception: it
357
+ replaces the entry whole, says which of your keys that dropped, and points you at the `.bak` beside
358
+ the file. It does not say whether the backup has them, because it cannot know — the first backup
359
+ wins, so the `.bak` on disk may have been written before or after you added the key.
360
+
361
+ Under kiro the same rules hold inside the agent config you name: the `mcpServers` entry merges per
362
+ key, a Zikaron hook entry whose command is this install's is rewritten and its trigger named, and
363
+ only an entry naming a different install's command, or another `--mode`, refuses. A hook of Zikaron's
364
+ on a trigger this install does not write is left alone. Kiro's install also validates the
365
+ consolidator's model id, because an unknown model would otherwise be silently replaced by the
366
+ harness's default.
293
367
 
294
368
  `@zikaron` has to be in `tools` or Zikaron's tools are simply absent: the `mcpServers` entry
295
369
  *configures* the server and `tools` is what *selects* from it. It goes into `allowedTools` too, so the
@@ -361,6 +435,14 @@ consolidator's: a subagent has nobody to answer a permission prompt, so an unapp
361
435
  there does not ask, it fails at the moment consolidation needs it. The file read above is the
362
436
  exception — that one prompts.
363
437
 
438
+ **A subagent that sets its own `tools:` list cannot see Zikaron at all.** Registering a server in
439
+ `.mcp.json` makes it available project-wide, but an agent whose frontmatter carries an explicit
440
+ `tools:` allowlist gets exactly that list — the registration does not add to it. So a correct
441
+ install, a running service and a subagent doing the work can still produce zero memories, with
442
+ nothing anywhere saying why. The install names any such agent it finds and tells you to add
443
+ `mcp__zikaron` to its `tools:`, and `zikaron doctor` reports the same. Your allowlist is a
444
+ deliberate grant, so neither one edits it for you.
445
+
364
446
  **Your own agent can see the four consolidation verbs**, and that is not a misconfiguration. A server
365
447
  has to be registered for the whole session before any subagent can reach it, so registering the
366
448
  consolidator's server exposes it to you too. Under kiro the two tool sets are separated mechanically;
@@ -380,7 +462,7 @@ global and unregisters the tool, after which the consolidator itself refuses to
380
462
  | `--model <id>` | the consolidator's model (default: `claude-sonnet-5` under kiro, `sonnet` under Claude Code) |
381
463
  | `--format {object,array}` | **kiro only.** Which hook format to write when the target config has none yet |
382
464
  | `--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 |
465
+ | `--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
466
 
385
467
  Both hook formats kiro accepts are supported, and a config that already uses one keeps it: kiro
386
468
  rewrites a config in whichever format it read, so mixing them in one file has no defined meaning.
@@ -408,7 +490,16 @@ It exits non-zero if any check fails. **A model cache that is not there yet is n
408
490
  is no prefetch at install time, so a first run reports it as fetched on first use and exits 0. The
409
491
  last row reports rather than checks: the linked SQLite version varies between interpreter builds on
410
492
  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.
493
+ Some rows appear only where a project gives them something to check: under Claude Code, whether
494
+ the Zikaron servers in `.mcp.json` carry `alwaysLoad` — an older install lacks it, and a re-install
495
+ fixes that — and which of your subagents cannot reach Zikaron's tools.
496
+ `zikaron doctor --project <dir>` checks another project.
497
+
498
+ **`zikaron --version` names the version you installed**, which is the first thing to put in a bug
499
+ report; `doctor` reports on the machine and leaves the version to this. A PyPI install reports a
500
+ release. A `git+` install or a source checkout between releases reports a `.dev` version — a `.dev0`
501
+ suffix means "working toward that number, not released" — so it never impersonates a release, but it
502
+ does span every commit until the next bump, and a bug report from one needs the commit as well.
412
503
 
413
504
  Then start a session with the agent you installed into. On start you should see nothing unusual — the
414
505
  write policy goes into the model's context, not to your terminal. Then, from the project directory:
@@ -449,6 +540,7 @@ a knowledge base called design docs"*. It has tools to list, create, rename, ref
449
540
  remove them. The same verbs are available at a shell, for when no agent is running:
450
541
 
451
542
  ```bash
543
+ zikaron init # once per project; safe to run twice
452
544
  zikaron knowledge list
453
545
  zikaron knowledge add "design docs" --path ./design \
454
546
  --description "Architecture and design records"
@@ -456,7 +548,21 @@ zikaron knowledge refresh # every corpus; name one to narrow it
456
548
  zikaron knowledge status "design docs"
457
549
  ```
458
550
 
459
- Three things are worth knowing before you point one at a directory.
551
+ **`init` comes first because every `knowledge` verb refuses a project with no store**, and it is the
552
+ only command that creates one. In a project your agent has already opened there is a store
553
+ already, and `init` will say so and exit 0 — so putting it at the top of a provisioning script
554
+ costs at most the service start the next command would pay anyway. The **first** `init` — the one
555
+ that creates the store — can outlast the deadline on a cold model cache and exit 1 while the
556
+ service keeps fetching the model; running it again succeeds when the service was only slow, and the
557
+ command points at `.zikaron/service.log` for when it was not.
558
+
559
+ **They act on the project you run them in.** The directory is resolved as `--project` if you pass
560
+ it, else the harness's own project directory if it exports one, else the directory you are standing
561
+ in — so a command typed a few levels down is a different project from the one your agent uses, and
562
+ saying so is the whole point of the refusal. It names the store it found above you, if there is one,
563
+ and never acts on it.
564
+
565
+ Three more things are worth knowing before you point a knowledge base at a directory.
460
566
 
461
567
  **Building takes minutes and runs in the background.** `add` and `refresh` start a build and return.
462
568
  A **first** build answers nothing at all while it runs: the corpus reports `reindex_required` for
@@ -465,6 +571,13 @@ answering from what is already indexed while it works — as does a `--full` one
465
571
  of a rebuild forced by a changed embedding model, which empties the corpus before it starts and so
466
572
  answers nothing until it finishes. `status` says how far it has got.
467
573
 
574
+ In a script or a CI step, use `zikaron knowledge refresh --wait`: it reports progress and returns
575
+ once every build against those corpora has let go of its corpus — including one an earlier `add`
576
+ started, which it waits for rather than stepping past — exiting non-zero if any build left its corpus
577
+ unusable. By then each build's record of what it cost has been written to `memory.db`, or dropped if
578
+ the store stayed locked; the indexer process itself may still be exiting. Without `--wait` the step
579
+ can finish while an indexer is still running, and whatever kills the step kills the build too.
580
+
468
581
  **Nothing updates an index on its own.** There is no watcher and no schedule: a corpus drifts from
469
582
  its files until somebody refreshes it. A search says so when it can — a result whose file has
470
583
  changed since it was indexed comes back marked `stale`.
@@ -584,7 +697,8 @@ it is `0600` or `0700`. The **installer** also writes harness config — the fil
584
697
  knowledge/ one database per knowledge base, named by a generated id.
585
698
  Absent until you create one
586
699
  config.toml your per-project overrides, if you wrote any
587
- service.log the background service: startup, resolved config, errors
700
+ service.log the background service: startup, resolved config, errors, why it stopped,
701
+ any request running longer than 30 s, and the stack dumps below
588
702
  hook.log one line per hook failure, write-policy-override note, or session/environment
589
703
  mismatch. Absent means none happened. Not every line is a failure: an override
590
704
  that is used but exceeds the injection budget is printed anyway and logged
@@ -610,6 +724,15 @@ its next group — or, if that process is killed first, by the next one that sta
610
724
  copy of memory text that lives outside `.zikaron/`, which is why the erasure procedure under
611
725
  [Secrets](#secrets) removes it by hand. Nothing spills under kiro.
612
726
 
727
+ **What `service.log` tells you about a service that stopped, or stopped answering.** A clean stop
728
+ writes one `stopping: reason=…` line: `idle`, `store_replaced`, `encoder_failed`, or `sigterm` /
729
+ `sigint` when it was asked to stop. A request still running after the 30 s idle poll is logged as
730
+ `long request: method=… session=… age=…` on every poll until it ends — `session=unresolved` if it
731
+ never got that far. Two signals write a dump without stopping the service: `kill -USR2 <pid>` writes
732
+ the requests in flight and every asyncio task's stack, and `kill -USR1 <pid>` writes every thread's
733
+ stack, which is the one that still works when the service's event loop itself is stuck. The second is
734
+ raw text, without the timestamp and `pid=` every other line carries.
735
+
613
736
  Two notes on reading the rest. `memory.db` can look implausibly small while `memory.db-wal` is large —
614
737
  that is normal for a database held open by the service, since recent writes live in the log until a
615
738
  checkpoint; the files together are the store. And `hook.log` records only a fixed failure label and an
@@ -617,8 +740,11 @@ error code, never your prompt or a memory's text, so it cannot hold a leaked sec
617
740
 
618
741
  There is one more log that is not a file: an event table inside `memory.db`. It records what happened
619
742
  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,
743
+ the database because those rows must commit alongside the change they describe. It also holds an
744
+ access log, best-effort: a `call` row for each request the service answers — which method, how long
745
+ it took, and what it refused, if anything — and a `knowledge_build` row for each corpus build.
746
+ Neither carries text. A knowledge base's own database has no event log: it keeps four **search**
747
+ counters in its metadata — searches, empty searches,
622
748
  results returned, results stale — which `zikaron_knowledge_status` reports beside the last build's
623
749
  own file, byte and skip-reason counts.
624
750
 
@@ -640,13 +766,15 @@ symptoms it cannot see.
640
766
  | 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
767
  | 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
768
  | 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 |
769
+ | 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
770
  | 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
771
  | 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
772
  | 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
773
  | "Agents not available for crew stages: zikaron-consolidator" | add it to `toolsSettings.crew.availableAgents`, or re-run the installer |
648
774
  | consolidation seems stuck | ask to consolidate again — that takes the run over |
649
775
  | 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 |
776
+ | 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 |
777
+ | 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
778
  | a hook command "not found" | the config names a different virtualenv than the one you installed from; re-run the installer with `--force` |
651
779
  | a memory looks half-written when injected | an over-long gist; see the note below |
652
780