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