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.
- {zikaron-0.1.0 → zikaron-0.3.1}/PKG-INFO +225 -34
- {zikaron-0.1.0 → zikaron-0.3.1}/README.md +219 -28
- {zikaron-0.1.0 → zikaron-0.3.1}/pyproject.toml +14 -12
- zikaron-0.3.1/tests/test_access_log.py +946 -0
- zikaron-0.3.1/tests/test_agent_scan.py +251 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_check_gate.py +2 -2
- {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_cli_front_door.py +47 -5
- {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_consolidation_invariants.py +47 -14
- {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_consolidation_observability.py +28 -9
- {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_consolidation_planning.py +98 -35
- {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_consolidation_refusals.py +9 -3
- {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_consolidation_serving.py +109 -35
- zikaron-0.3.1/tests/test_consolidation_snapshot_planning.py +235 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_consolidation_verbs.py +8 -4
- {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_ddl.py +38 -1
- {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_design_tables.py +39 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_distribution.py +5 -2
- {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_doctor.py +193 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_error_codes.py +45 -9
- {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_event_kinds.py +149 -3
- zikaron-0.3.1/tests/test_guard_claude_live.py +128 -0
- zikaron-0.3.1/tests/test_guard_docstring_examples.py +22 -0
- zikaron-0.3.1/tests/test_guard_main.py +248 -0
- zikaron-0.3.1/tests/test_guard_malformed.py +69 -0
- zikaron-0.3.1/tests/test_guard_nudge.py +82 -0
- zikaron-0.3.1/tests/test_guard_properties.py +78 -0
- zikaron-0.3.1/tests/test_guard_rule_table.py +132 -0
- zikaron-0.3.1/tests/test_guard_script_file.py +49 -0
- zikaron-0.3.1/tests/test_guard_texts.py +121 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_harness_table.py +17 -0
- zikaron-0.3.1/tests/test_hook_components.py +157 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_hook_push.py +135 -4
- {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_hook_rpc.py +15 -9
- {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_hook_stdlib_only.py +7 -6
- {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_hook_subagent_policy.py +14 -6
- {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_hook_write_policy.py +95 -29
- {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_indexing_writes.py +37 -35
- zikaron-0.3.1/tests/test_injected_prose_log.py +69 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_install_assets.py +90 -41
- zikaron-0.3.1/tests/test_install_components.py +362 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_install_e2e.py +2 -1
- {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_install_limits.py +24 -17
- {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_install_main.py +1 -1
- {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_install_targets.py +499 -17
- {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_install_writer.py +187 -32
- zikaron-0.3.1/tests/test_knowledge_build_log.py +539 -0
- zikaron-0.3.1/tests/test_knowledge_build_row_ordering.py +157 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_knowledge_cli.py +722 -93
- zikaron-0.3.1/tests/test_knowledge_cli_integration.py +323 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_knowledge_counters.py +75 -1
- {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_knowledge_indexer.py +23 -50
- {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_knowledge_lifecycle.py +15 -6
- zikaron-0.3.1/tests/test_knowledge_lock_race.py +111 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_knowledge_registry.py +57 -2
- {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_knowledge_reporting.py +3 -3
- {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_mcp_connection_ambiguous_failure.py +3 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_mcp_connection_cancellation.py +3 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_mcp_connection_concurrency.py +3 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_mcp_connection_integration.py +2 -2
- {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_mcp_connection_labels.py +5 -1
- {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_mcp_consolidator_bridge.py +40 -1
- {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_mcp_tool_descriptions.py +105 -11
- {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_mcp_wire_contracts.py +6 -1
- zikaron-0.3.1/tests/test_project_scope.py +561 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_records_memory.py +33 -90
- {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_retrieval_reads.py +35 -27
- zikaron-0.3.1/tests/test_service_context.py +74 -0
- zikaron-0.3.1/tests/test_service_diagnostics.py +164 -0
- zikaron-0.3.1/tests/test_service_diagnostics_integration.py +87 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_service_dispatch_consolidation.py +24 -77
- {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_service_dispatch_knowledge.py +127 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_service_envelope.py +30 -2
- {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_service_knowledge_management.py +235 -25
- {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_service_lifecycle.py +7 -7
- {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_service_main.py +9 -9
- zikaron-0.3.1/tests/test_service_read_contention.py +171 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_service_server.py +9 -2
- zikaron-0.3.1/tests/test_service_surface_deadline.py +307 -0
- zikaron-0.3.1/tests/test_service_write_contention.py +172 -0
- zikaron-0.3.1/tests/test_service_writer.py +410 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_store.py +96 -12
- {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_store_connection.py +17 -2
- zikaron-0.3.1/tests/test_store_migration.py +379 -0
- zikaron-0.3.1/tests/test_store_pool.py +173 -0
- zikaron-0.3.1/tests/test_transaction_begin_sites.py +160 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_write_tools.py +4 -3
- {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/cli/main.py +26 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/core/consolidation/planning.py +78 -12
- {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/core/consolidation/serving.py +82 -22
- {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/core/errors.py +68 -6
- {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/core/events.py +206 -10
- {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/core/indexing/chunking.py +7 -7
- {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/core/indexing/vectors.py +1 -1
- {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/core/indexing/writes.py +3 -3
- {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/core/knowledge/builds.py +2 -3
- {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/core/knowledge/counters.py +4 -4
- {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/core/knowledge/database.py +7 -7
- {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/core/knowledge/errors.py +51 -2
- {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/core/knowledge/groups.py +1 -2
- {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/core/knowledge/lifecycle.py +8 -8
- {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/core/knowledge/lock.py +19 -10
- {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/core/knowledge/meta.py +6 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/core/knowledge/registry.py +70 -11
- {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/core/knowledge/reporting.py +2 -4
- {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/core/knowledge/scan.py +42 -23
- {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/core/records/memory.py +68 -87
- zikaron-0.3.1/zikaron/core/retrieval/block.py +140 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/core/retrieval/reads.py +83 -22
- {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/core/store/connection.py +9 -2
- {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/core/store/ddl.py +60 -9
- zikaron-0.3.1/zikaron/core/store/deadline.py +73 -0
- zikaron-0.3.1/zikaron/core/store/holders.py +132 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/core/store/meta.py +4 -3
- zikaron-0.3.1/zikaron/core/store/migration.py +182 -0
- zikaron-0.3.1/zikaron/core/store/pool.py +143 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/core/store/store.py +127 -23
- {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/core/store/transactions.py +86 -15
- {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/doctor/checks.py +101 -5
- {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/doctor/main.py +18 -7
- zikaron-0.3.1/zikaron/guard/__init__.py +1 -0
- zikaron-0.3.1/zikaron/guard/chars.py +60 -0
- zikaron-0.3.1/zikaron/guard/decision.py +135 -0
- zikaron-0.3.1/zikaron/guard/expression.py +416 -0
- zikaron-0.3.1/zikaron/guard/forms.py +161 -0
- zikaron-0.3.1/zikaron/guard/grammar.py +292 -0
- zikaron-0.3.1/zikaron/guard/heredoc.py +209 -0
- zikaron-0.3.1/zikaron/guard/inplace.py +136 -0
- zikaron-0.3.1/zikaron/guard/interpreter.py +124 -0
- zikaron-0.3.1/zikaron/guard/lexer.py +141 -0
- zikaron-0.3.1/zikaron/guard/limits.py +8 -0
- zikaron-0.3.1/zikaron/guard/literal_text.py +74 -0
- zikaron-0.3.1/zikaron/guard/main.py +126 -0
- zikaron-0.3.1/zikaron/guard/messages.py +105 -0
- zikaron-0.3.1/zikaron/guard/nudge.py +69 -0
- zikaron-0.3.1/zikaron/guard/override.py +84 -0
- zikaron-0.3.1/zikaron/guard/position.py +166 -0
- zikaron-0.3.1/zikaron/guard/programs.py +39 -0
- zikaron-0.3.1/zikaron/guard/quoting.py +83 -0
- zikaron-0.3.1/zikaron/guard/redirects.py +72 -0
- zikaron-0.3.1/zikaron/guard/scratch.py +155 -0
- zikaron-0.3.1/zikaron/guard/script_file.py +238 -0
- zikaron-0.3.1/zikaron/guard/start_text.py +19 -0
- zikaron-0.3.1/zikaron/guard/writes.py +236 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/harness/detect.py +1 -1
- {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/harness/spec.py +51 -7
- zikaron-0.3.1/zikaron/hook/components.py +60 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/hook/limits.py +7 -5
- {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/hook/main.py +58 -25
- {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/hook/push.py +29 -11
- {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/hook/rpc.py +9 -3
- {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/hook/subagent_policy.py +11 -2
- {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/hook/write_policy.py +133 -111
- zikaron-0.3.1/zikaron/install/agent_scan.py +227 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/install/assets.py +55 -26
- {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/install/entries.py +105 -43
- {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/install/main.py +39 -3
- zikaron-0.3.1/zikaron/install/ownership.py +146 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/install/targets.py +343 -97
- {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/install/writer.py +144 -104
- zikaron-0.3.1/zikaron/knowledge/client.py +145 -0
- zikaron-0.3.1/zikaron/knowledge/indexer/build_log.py +210 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/knowledge/indexer/detach.py +43 -4
- {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/knowledge/indexer/main.py +57 -22
- zikaron-0.3.1/zikaron/knowledge/main.py +772 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/knowledge/scope.py +34 -17
- {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/mcp/connection.py +45 -29
- {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/mcp/consolidator.py +43 -8
- {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/mcp/errors.py +6 -13
- {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/mcp/primary.py +166 -137
- zikaron-0.3.1/zikaron/project/__init__.py +1 -0
- zikaron-0.3.1/zikaron/project/__main__.py +8 -0
- zikaron-0.3.1/zikaron/project/initialize.py +149 -0
- zikaron-0.3.1/zikaron/project/report.py +60 -0
- zikaron-0.3.1/zikaron/project/resolve.py +177 -0
- zikaron-0.3.1/zikaron/service/access_log.py +201 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/service/context.py +99 -31
- zikaron-0.3.1/zikaron/service/diagnostics.py +109 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/service/dispatch.py +67 -16
- {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/service/dispatch_consolidation.py +23 -10
- {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/service/dispatch_knowledge.py +162 -38
- {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/service/envelope.py +22 -8
- {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/service/lifecycle.py +2 -1
- {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/service/main.py +44 -10
- zikaron-0.3.1/zikaron/service/methods.py +53 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/service/params.py +12 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/service/paths.py +3 -2
- {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/service/rpc.py +61 -7
- {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/service/serialize_knowledge.py +67 -5
- {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/service/server.py +144 -27
- {zikaron-0.1.0 → zikaron-0.3.1}/zikaron.egg-info/PKG-INFO +225 -34
- {zikaron-0.1.0 → zikaron-0.3.1}/zikaron.egg-info/SOURCES.txt +70 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/zikaron.egg-info/entry_points.txt +1 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/zikaron.egg-info/requires.txt +5 -5
- zikaron-0.1.0/tests/test_service_context.py +0 -63
- zikaron-0.1.0/zikaron/core/retrieval/block.py +0 -107
- zikaron-0.1.0/zikaron/knowledge/main.py +0 -466
- {zikaron-0.1.0 → zikaron-0.3.1}/LICENSE +0 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/setup.cfg +0 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_asyncio_compat.py +0 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_background_encoder.py +0 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_ci_workflow.py +0 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_clock.py +0 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_config_keys.py +0 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_config_resolution.py +0 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_consolidation_grouping.py +0 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_definition_of_done_sites.py +0 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_design_pointers_resolve.py +0 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_embedder.py +0 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_harness_detect.py +0 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_harness_store_scope.py +0 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_harness_tier_guard.py +0 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_hook_connect.py +0 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_hook_connect_edge_cases.py +0 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_hook_connect_integration.py +0 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_hook_connect_race.py +0 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_hook_connect_real_service_integration.py +0 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_hook_envelope.py +0 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_hook_failure.py +0 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_hook_main.py +0 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_hook_spawn_warm.py +0 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_hook_tripwire.py +0 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_hook_warm_helper.py +0 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_hook_warm_helper_integration.py +0 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_indexing_acquisition.py +0 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_indexing_chunking.py +0 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_indexing_encoder.py +0 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_indexing_integration.py +0 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_indexing_model_cache.py +0 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_install_claude_live.py +0 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_install_harness.py +0 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_install_takeover.py +0 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_knowledge_build_invariants.py +0 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_knowledge_builds.py +0 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_knowledge_chunking.py +0 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_knowledge_database.py +0 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_knowledge_ddl.py +0 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_knowledge_detach.py +0 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_knowledge_files.py +0 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_knowledge_git.py +0 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_knowledge_groups.py +0 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_knowledge_integration.py +0 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_knowledge_invariants.py +0 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_knowledge_lock.py +0 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_knowledge_meta.py +0 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_knowledge_repair.py +0 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_knowledge_roots.py +0 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_knowledge_scan.py +0 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_knowledge_scan_git.py +0 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_knowledge_search.py +0 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_knowledge_state.py +0 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_knowledge_text.py +0 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_knowledge_vectors.py +0 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_knowledge_walk.py +0 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_knowledge_writes.py +0 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_markdown_renders_as_written.py +0 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_mcp_errors.py +0 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_mcp_main.py +0 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_mcp_server.py +0 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_mcp_spill.py +0 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_meta.py +0 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_permissions.py +0 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_publication_hygiene.py +0 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_quoted_design_prose_is_verbatim.py +0 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_readme_config_table.py +0 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_readme_internal_links.py +0 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_records_receipts.py +0 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_records_supersession.py +0 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_retrieval_arms.py +0 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_retrieval_eligibility.py +0 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_retrieval_integration.py +0 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_retrieval_query.py +0 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_retrieval_ranking.py +0 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_service_context_assemble.py +0 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_service_dispatch.py +0 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_service_encoder_failure_stop.py +0 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_service_lifecycle_integration.py +0 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_service_log.py +0 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_service_params.py +0 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_service_paths.py +0 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_service_rpc.py +0 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_service_security.py +0 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_signals_contention.py +0 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_signals_dedup.py +0 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_signals_horizon.py +0 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_signals_repair.py +0 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_signals_retirement.py +0 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_signals_sessions.py +0 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_signals_writes.py +0 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_socket_path_budget.py +0 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_version_seam.py +0 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/tests/test_write_dedup.py +0 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/__init__.py +0 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/cli/__init__.py +0 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/core/__init__.py +0 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/core/clock.py +0 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/core/config/__init__.py +0 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/core/config/keys.py +0 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/core/config/resolution.py +0 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/core/consolidation/__init__.py +0 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/core/consolidation/authorization.py +0 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/core/consolidation/candidates.py +0 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/core/consolidation/context.py +0 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/core/consolidation/grouping.py +0 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/core/consolidation/groups.py +0 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/core/consolidation/payload.py +0 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/core/consolidation/rowstate.py +0 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/core/consolidation/runs.py +0 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/core/consolidation/verbs.py +0 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/core/indexing/__init__.py +0 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/core/indexing/acquisition.py +0 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/core/indexing/encoder.py +0 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/core/indexing/lexical.py +0 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/core/indexing/model_cache.py +0 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/core/indexing/model_pin.py +0 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/core/knowledge/__init__.py +0 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/core/knowledge/arms.py +0 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/core/knowledge/candidates.py +0 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/core/knowledge/changes.py +0 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/core/knowledge/chunking.py +0 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/core/knowledge/ddl.py +0 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/core/knowledge/disposal.py +0 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/core/knowledge/files.py +0 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/core/knowledge/git.py +0 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/core/knowledge/lexical.py +0 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/core/knowledge/paths.py +0 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/core/knowledge/pending.py +0 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/core/knowledge/repair.py +0 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/core/knowledge/roots.py +0 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/core/knowledge/search.py +0 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/core/knowledge/state.py +0 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/core/knowledge/text.py +0 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/core/knowledge/vectors.py +0 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/core/knowledge/walk.py +0 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/core/knowledge/writes.py +0 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/core/records/__init__.py +0 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/core/records/receipts.py +0 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/core/records/supersession.py +0 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/core/retrieval/__init__.py +0 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/core/retrieval/arms.py +0 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/core/retrieval/eligibility.py +0 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/core/retrieval/query.py +0 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/core/retrieval/ranking.py +0 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/core/retrieval/retrieve.py +0 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/core/retrieval/similarity.py +0 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/core/signals/__init__.py +0 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/core/signals/contention.py +0 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/core/signals/dedup.py +0 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/core/signals/horizon.py +0 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/core/signals/repair.py +0 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/core/signals/retirement.py +0 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/core/signals/sessions.py +0 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/core/signals/writes.py +0 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/core/store/__init__.py +0 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/core/store/embedder.py +0 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/core/store/permissions.py +0 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/core/write/__init__.py +0 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/core/write/dedup.py +0 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/core/write/tools.py +0 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/doctor/__init__.py +0 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/harness/__init__.py +0 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/hook/__init__.py +0 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/hook/connect.py +0 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/hook/envelope.py +0 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/hook/failure.py +0 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/hook/spawn_warm.py +0 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/hook/tripwire.py +0 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/hook/warm_helper.py +0 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/install/__init__.py +0 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/install/__main__.py +0 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/install/harness.py +0 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/knowledge/__init__.py +0 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/knowledge/__main__.py +0 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/knowledge/indexer/__init__.py +0 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/knowledge/indexer/__main__.py +0 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/mcp/__init__.py +0 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/mcp/main.py +0 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/mcp/server.py +0 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/mcp/spill.py +0 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/mcp/tool_names.py +0 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/py.typed +0 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/service/__init__.py +0 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/service/asyncio_compat.py +0 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/service/log.py +0 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/service/security.py +0 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/zikaron/service/serialize.py +0 -0
- {zikaron-0.1.0 → zikaron-0.3.1}/zikaron.egg-info/dependency_links.txt +0 -0
- {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
|
|
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.
|
|
15
|
-
Requires-Dist: huggingface_hub==1.
|
|
16
|
-
Requires-Dist: fastmcp==
|
|
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.
|
|
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.
|
|
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
|
-
| **
|
|
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**.
|
|
165
|
-
|
|
166
|
-
|
|
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;
|
|
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
|
-
|
|
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
|
-
|
|
236
|
-
|
|
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
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
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
|
|
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 —
|
|
258
|
-
|
|
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
|
|
292
|
-
|
|
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
|
-
| `--
|
|
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
|
-
|
|
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
|
-
|
|
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.
|
|
621
|
-
|
|
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
|
|