mempalace-code 1.15.1__tar.gz → 1.16.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.
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/AGENTS.md +19 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/CHANGELOG.md +21 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/PKG-INFO +41 -7
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/README.md +40 -6
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/docs/AGENT_INSTALL.md +13 -1
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/docs/BACKUP_RESTORE.md +64 -5
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/docs/LLM_USAGE_RULES.md +16 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/docs/RELEASING.md +146 -12
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/docs/quality/PALACE-SCOPE-RESOURCE-BOUNDARY.md +4 -2
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/docs/quality/acceptance/README.md +9 -3
- mempalace_code-1.16.0/docs/quality/acceptance/v1.16.0.md +115 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/docs/quality/scorecard.json +8 -8
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/docs/quality/scorecard.md +8 -8
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/agent_plugin/plugin.json +1 -1
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/backup.py +60 -9
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/cli_commands/watch.py +3 -2
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/config.py +20 -2
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/disk_budget.py +16 -5
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/watcher.py +13 -3
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/pyproject.toml +1 -1
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/scripts/release_install_metadata_smoke.py +36 -8
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/scripts/release_readiness_gate.py +456 -117
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/conftest.py +2 -1
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_agent_skill_authority_contract.py +16 -26
- mempalace_code-1.16.0/tests/test_backup_dir.py +254 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_docs_drift_guard.py +1 -1
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_release_install_metadata_smoke.py +127 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_release_readiness_gate.py +239 -15
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_version_check.py +3 -1
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/uv.lock +1 -1
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/.gitignore +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/.gitleaks.toml +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/.pre-commit-config.yaml +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/CLAUDE.md +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/CONTRIBUTING.md +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/LICENSE +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/NOTICE +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/SECURITY.md +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/assets/mempalace_banner.jpg +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/benchmarks/BENCHMARKS.md +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/benchmarks/HYBRID_MODE.md +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/benchmarks/README.md +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/benchmarks/code_retrieval_bench.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/benchmarks/convomem_bench.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/benchmarks/data/code_retrieval_queries.json +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/benchmarks/demo_perf_budgets.json +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/benchmarks/demo_perf_budgets.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/benchmarks/dotnet_bench.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/benchmarks/embed_ab_bench.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/benchmarks/locomo_bench.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/benchmarks/longmemeval_bench.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/benchmarks/membench_bench.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/benchmarks/minilm_runtime_compatibility_fixture.json +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/benchmarks/results_embed_ab_2026-04-09.json +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/benchmarks/results_token_delta_mempalace.json +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/benchmarks/retrieval_quality_facts.json +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/benchmarks/token_delta_bench.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/benchmarks/token_delta_fixture_facts.json +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/docs/BENCH_TOKEN_DELTA.md +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/docs/COMPARISON_GRAPHIFY.md +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/docs/DEPENDENCY_UPGRADE_GATE.md +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/docs/HOW_SEARCH_WORKS.md +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/docs/OFFLINE_USAGE.md +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/docs/UPDATES.md +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/docs/UPSTREAM_COMPARISON.md +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/docs/UPSTREAM_HARDENING.md +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/docs/WHY_THIS_FORK.md +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/docs/demo/code-intelligence-packet.json +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/docs/demo/code-intelligence-packet.md +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/docs/dependency-audit-allowlist.json +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/docs/operations/wing-migration.md +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/docs/quality/README.md +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/docs/quality/acceptance/v1.15.0.md +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/docs/quality/acceptance/v1.15.1.md +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/docs/quality/autopilot-demo-gate-ledger.json +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/docs/quality/autopilot-demo-gate-ledger.md +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/docs/quality/upstream-comparison.json +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/docs/quality/workflow-review-protocol.md +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/docs/release-admission-rulesets.md +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/examples/HOOKS_TUTORIAL.md +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/examples/basic_mining.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/examples/convo_import.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/examples/gemini_cli_setup.md +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/examples/mcp_setup.md +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/hooks/README.md +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/hooks/mempal_precompact_hook.sh +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/hooks/mempal_save_hook.sh +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace/__init__.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace/mcp_server.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/README.md +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/__init__.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/__main__.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/_stdio.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/agent_plugin/mcp.json +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/agent_plugin/schemas/1.0.0/mcp.schema.json +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/agent_plugin/schemas/1.0.0/plugin.schema.json +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/agent_plugin/schemas/SCHEMA-NOTICE.md +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/agent_plugin/skills/mempalace/SKILL.md +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/agent_plugins.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/architecture.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/cli.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/cli_commands/__init__.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/cli_commands/agent_plugin.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/cli_commands/alias.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/cli_commands/backup_restore.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/cli_commands/common.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/cli_commands/diary.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/cli_commands/export_import.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/cli_commands/ingest.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/cli_commands/maintenance.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/cli_commands/model.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/cli_commands/preflight.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/cli_commands/query.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/cli_commands/update.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/cli_commands/version_check.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/cli_commands/wing_migration.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/cli_invocation.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/convo_miner.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/dialect.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/diary.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/entity_detector.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/entity_registry.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/errors.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/export.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/general_extractor.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/knowledge_graph.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/language_catalog.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/launchd.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/layers.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/mcp/__init__.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/mcp/dispatch.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/mcp/protocol_compat.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/mcp/protocol_text.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/mcp/registry.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/mcp/runtime.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/mcp/tools/__init__.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/mcp/tools/architecture.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/mcp/tools/diary.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/mcp/tools/graph.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/mcp/tools/kg.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/mcp/tools/read.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/mcp/tools/search.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/mcp/tools/write.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/mcp_launcher.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/mcp_server.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/mcp_tool_profiles.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/miner.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/mining/__init__.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/mining/batching.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/mining/chunkers.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/mining/kg_extract.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/mining/languages.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/mining/orchestrator.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/mining/projects.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/mining/scanner.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/mining/source_text.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/mining/symbols.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/mirror_preflight.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/normalize.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/onboarding.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/operation_lock.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/palace_graph.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/py.typed +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/reader.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/retrieval_rerank.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/room_detector_local.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/search_reranker.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/searcher.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/source_io.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/spellcheck.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/split_mega_files.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/storage.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/taxonomy_filters.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/treesitter.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/updater.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/version.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/version_check.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/wing_migration.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/pyrightconfig.strict.json +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/scripts/architecture_guard.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/scripts/bootstrap.sh +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/scripts/dependency_upgrade_gate.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/scripts/docs_drift_guard.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/scripts/gate_inventory.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/scripts/gen_code_intelligence_packet.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/scripts/gitleaks_scan.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/scripts/nuke_wing.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/scripts/public_safety_scan.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/scripts/pytest_failure_summary.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/scripts/quality_scorecard.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/scripts/release_admission_checks.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/scripts/release_artifact_gate.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/scripts/release_notes.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/scripts/release_preflight.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/scripts/release_public_read.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/scripts/release_status_gate.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/scripts/upstream_comparison_guard.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/scripts/wing_migration.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/scripts/workflow_summary_guard.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/fixtures/unreasoned_suppression.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/release_smoke_support.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_agent_plugin_package.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_architecture_extraction.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_architecture_guard.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_autopilot_demo_gate_ledger.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_backup.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_backup_cli.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_chunking.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_claude_hooks.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_cli.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_cli_command_modules.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_cli_golden_scenarios.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_code_intelligence_packet.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_code_retrieval_bench.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_config.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_convo_miner.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_demo_perf_budgets.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_dependency_upgrade_gate.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_dialect.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_disk_budget.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_dotnet_bench.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_dotnet_config.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_e2e.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_embed_ab_bench.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_embedding_runtime.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_entity_detector.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_entity_registry.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_explicit_wing_consistency.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_export.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_gate_inventory.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_general_extractor.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_gitleaks_scan.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_installed_artifact_behavior.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_installed_cli_palace_scope.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_kg_extract.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_knowledge_graph.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_lang_detect.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_language_catalog.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_layers.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_legacy_benchmark_retrieval.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_license_notice.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_longmemeval_metrics.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_mcp_protocol_compat.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_mcp_registry.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_mcp_server.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_mcp_tool_profiles.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_mine_source_exact.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_miner.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_miner_modules.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_normalize.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_nuke_wing.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_offline.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_onboarding.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_operation_lock.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_packaging_namespace.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_palace_graph.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_palace_kg_owner.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_palace_scope_resource_boundary.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_public_safety_scan.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_pyright_optional_dependencies.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_pytest_failure_summary.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_quality_palace_scope_resource_boundary.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_quality_scorecard.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_reader.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_regular_source_guard.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_release_artifact_gate.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_release_notes.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_release_preflight.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_release_public_read.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_release_ruleset_contract.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_release_skill_contract.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_release_status_gate.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_release_workflow_admission.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_retrieval_rerank.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_search_reranker.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_searcher.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_split_mega_files.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_stdio.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_storage.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_storage_lance.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_symbol_extract.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_taxonomy_filters.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_token_delta_bench.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_treesitter.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_type_suppressions.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_uat2_mining.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_uat2_watch_ops.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_uat_compress_layers.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_uat_config_init.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_uat_convo_core.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_uat_convo_formats.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_uat_convos.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_uat_ids.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_uat_install_r2.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_uat_kg.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_uat_kg_backup.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_uat_kg_mining.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_uat_leases.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_uat_mcp_protocol.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_uat_mcp_search.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_uat_mining.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_uat_model_fetch.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_uat_model_install.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_uat_ops_misc.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_uat_repair.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_uat_repair_backup.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_uat_repair_reads.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_uat_search_read.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_uat_watch.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_updater.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_upstream_comparison_guard.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_version_consistency.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_watcher.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_watcher_resource_bounds.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_watcher_resource_subprocess.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_wing_migration.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_workflow_summary_guard.py +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tools/gitleaks/go.mod +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tools/gitleaks/go.sum +0 -0
- {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tools/gitleaks/tools.go +0 -0
|
@@ -17,6 +17,16 @@ credential-free hosted workflows. An optional interoperability exercise with an
|
|
|
17
17
|
AI client requires separate explicit owner authorization, runs outside the
|
|
18
18
|
release gate, and cannot block a release.
|
|
19
19
|
|
|
20
|
+
**Direct functional release boundary.** Before release candidate publication,
|
|
21
|
+
run the exact installed wheel through its real CLI and credential-free stdio MCP
|
|
22
|
+
interfaces in disposable environments. Reconcile every discovered command and
|
|
23
|
+
subcommand, every enabled tool in every profile, and supported runtime extras
|
|
24
|
+
with concrete success or documented refusal evidence and relevant failure/retry
|
|
25
|
+
postconditions. Help, parser errors, tool listings, handler-only calls and source
|
|
26
|
+
pytest counts do not prove functional execution. Missing required coverage blocks
|
|
27
|
+
release even when CI passes. Record confirmed problems through backlog-utility
|
|
28
|
+
and retain a public-safe acceptance report. Follow `docs/RELEASING.md` section 1a.
|
|
29
|
+
|
|
20
30
|
**Commit attribution boundary.** Commits in this repository must not contain a
|
|
21
31
|
Claude `Co-Authored-By` trailer. Configure automation to omit it; do not add it
|
|
22
32
|
and clean it up later.
|
|
@@ -241,6 +251,15 @@ Edits still require admitted authority and no conflicting writer.
|
|
|
241
251
|
## Operational Lessons
|
|
242
252
|
|
|
243
253
|
- **Keep this file and public docs public-safe.** `AGENTS.md` is the canonical public instruction file; `CLAUDE.md` is only its pointer. Public docs may name package ranges, workflow categories, advisory IDs, and reproducible commands. Private remotes, hostnames, tokens, credentials, local machine paths, customer/project details, incident specifics, and non-public operational history never go here or in other public docs; put private or machine-local lessons only in an ignored local-only note outside the published tree, such as `.codex-local/LESSONS.md`.
|
|
254
|
+
- **Audit privacy before every public delivery.** Follow the privacy audit in
|
|
255
|
+
`docs/RELEASING.md` section 2. Inspect the exact tracked/staged/committed tree,
|
|
256
|
+
including hidden LLM instructions, prompts, settings, examples and sealed backlog
|
|
257
|
+
history, then both distribution archives and the history reachable from the
|
|
258
|
+
outgoing ref. Secret scanning alone cannot establish that operational or personal
|
|
259
|
+
information is public-safe. Retain redacted findings and the reviewed identities;
|
|
260
|
+
a confirmed private disclosure or consequential unresolved classification blocks
|
|
261
|
+
its public delivery. Preserve private local evidence and sealed records; never
|
|
262
|
+
rewrite history, scrub canonical JSON or weaken detectors to pass this gate.
|
|
244
263
|
- **Record reusable lessons only when they are public knowledge.** When a session exposes a project gotcha, publish step, verification boundary, or agent-behavior correction that is safe for public readers and useful to future contributors, rewrite the matching lesson here in place, or add one when none matches.
|
|
245
264
|
- **Verify on the surface that will run the change, and name what was not run.** Python tests alone do not prove GitHub Actions runtime changes: use local YAML/static checks such as `actionlint`, then verify the real hosted workflow run when action runtime behavior matters. Direct handler calls are useful for MCP compatibility but do not prove a separate stdio MCP client, and CLI help does not prove the command executes. A release-readiness summary must distinguish unit tests, focused integration tests, direct API smoke, real CLI execution, and hosted/daemon behavior that was not run; a tag-only or release-only workflow without a real trigger run is reported as syntax-checked and version-checked, not execution-tested. Never imply full local coverage for hosted-only behavior.
|
|
246
265
|
- **Check the intended public release target.** Before publishing, verify the repository, branch, tag, and workflow that public users will see. Do not assume local remote names or private mirrors represent public release truth.
|
|
@@ -2,6 +2,27 @@
|
|
|
2
2
|
|
|
3
3
|
## Unreleased
|
|
4
4
|
|
|
5
|
+
## v1.16.0 — 2026-10-05
|
|
6
|
+
|
|
7
|
+
### Added
|
|
8
|
+
|
|
9
|
+
- Configure `backup_dir` independently of the palace location, with the existing
|
|
10
|
+
environment override mechanism. Manual, scheduled, pre-watch and pre-optimize
|
|
11
|
+
backups share the selected managed directory for creation, listing and rotation.
|
|
12
|
+
Each palace has an isolated directory under the selected root.
|
|
13
|
+
|
|
14
|
+
### Fixed
|
|
15
|
+
|
|
16
|
+
- Measure managed backup storage in the selected directory and check available
|
|
17
|
+
space on the archive destination. Invalid or inaccessible configured paths fail
|
|
18
|
+
without falling back. Existing archives stay in place, and explicit `--out`
|
|
19
|
+
keeps its rotation bypass and priority.
|
|
20
|
+
- Release acceptance now executes every enabled MCP tool in every profile, checks
|
|
21
|
+
both protocol handshakes, and discovers all delegated migration actions. Help
|
|
22
|
+
and parser guidance do not count as functional execution.
|
|
23
|
+
- Release socket fixtures use a short owned path on platforms with limited Unix
|
|
24
|
+
socket path lengths, with checked cleanup and explicit unsupported-platform handling.
|
|
25
|
+
|
|
5
26
|
## v1.15.1 — 2026-10-04
|
|
6
27
|
|
|
7
28
|
Includes the v1.15.0 changes and the corrections below.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: mempalace-code
|
|
3
|
-
Version: 1.
|
|
3
|
+
Version: 1.16.0
|
|
4
4
|
Summary: Developer memory tool — mine codebases and conversations into a LanceDB-backed searchable palace. No API key required.
|
|
5
5
|
Project-URL: Homepage, https://github.com/rergards/mempalace-code
|
|
6
6
|
Project-URL: Repository, https://github.com/rergards/mempalace-code
|
|
@@ -624,14 +624,17 @@ export MEMPALACE_DISK_MIN_FREE_BYTES=1GiB # global floor (watcher + bac
|
|
|
624
624
|
Or set byte values in `~/.mempalace/config.json`. This example keeps the 1 GiB global default
|
|
625
625
|
and raises the watcher and backup floors to 2 GiB each. The file must be a plain JSON object
|
|
626
626
|
without comments; a file that fails to parse, or whose top level is not an object, is ignored as
|
|
627
|
-
a whole with a one-line warning. A
|
|
628
|
-
reported on stderr and the next setting in precedence order applies instead.
|
|
627
|
+
a whole with a one-line warning. A size value that cannot be parsed (for example `"lots"`)
|
|
628
|
+
is reported on stderr and the next size setting in precedence order applies instead.
|
|
629
|
+
An invalid `backup_dir` fails the managed backup operation without a fallback;
|
|
630
|
+
see [Backup directory configuration](https://github.com/rergards/mempalace-code/blob/main/docs/BACKUP_RESTORE.md#choosing-the-managed-backup-directory).
|
|
629
631
|
|
|
630
632
|
```json
|
|
631
633
|
{
|
|
632
634
|
"disk_min_free_bytes": 1073741824,
|
|
633
635
|
"watch_disk_min_free_bytes": 2147483648,
|
|
634
|
-
"backup_disk_min_free_bytes": 2147483648
|
|
636
|
+
"backup_disk_min_free_bytes": 2147483648,
|
|
637
|
+
"backup_dir": null
|
|
635
638
|
}
|
|
636
639
|
```
|
|
637
640
|
|
|
@@ -1115,6 +1118,31 @@ leading `NAME=value` assignments) carries `HF_HOME` and every `MEMPALACE_*` sett
|
|
|
1115
1118
|
rendering shell, such as `MEMPALACE_BACKUP_RETAIN_COUNT`; re-render after changing them.
|
|
1116
1119
|
`schedule` warns when no palace exists at the target path yet.
|
|
1117
1120
|
|
|
1121
|
+
**Backup directory:** Set `backup_dir` in `~/.mempalace/config.json` to put managed
|
|
1122
|
+
archives on another disk, for example `{"backup_dir": "/mnt/backup/mempalace"}`.
|
|
1123
|
+
`MEMPALACE_BACKUP_DIR` overrides that setting. Paths expand `~`; relative paths
|
|
1124
|
+
resolve against the current directory and produce a warning. Use an absolute path
|
|
1125
|
+
for scheduled jobs. An absent setting or JSON `null` keeps the default
|
|
1126
|
+
`<palace_parent>/backups/<palace_name>/` directory.
|
|
1127
|
+
|
|
1128
|
+
The configured directory is a root. Each palace uses a child named
|
|
1129
|
+
`<palace_name>-<hash>`, where the hash comes from its canonical source path, so
|
|
1130
|
+
palaces with the same name keep separate archives and retention. Manual,
|
|
1131
|
+
scheduled, pre-watch and pre-optimize backups, listing and footprint accounting
|
|
1132
|
+
use that child. Free space is checked on the archive destination filesystem.
|
|
1133
|
+
Missing directories are created during backup; listing creates no directories.
|
|
1134
|
+
Invalid or inaccessible settings fail without writing to the default directory.
|
|
1135
|
+
Managed children must be outside the palace and cannot be symbolic links.
|
|
1136
|
+
New backup roots and managed children have owner-only access; an existing
|
|
1137
|
+
configured root keeps its permissions. Archives remain owner-only.
|
|
1138
|
+
|
|
1139
|
+
Changing this setting moves or deletes no existing archives. Previous managed
|
|
1140
|
+
archives remain at their old path; use `backup list --dir /previous/managed/path`
|
|
1141
|
+
to list them. Explicit `--out` takes priority and keeps its existing behavior,
|
|
1142
|
+
including no managed retention, even when `backup_dir` is invalid.
|
|
1143
|
+
See [Backup directory configuration](https://github.com/rergards/mempalace-code/blob/main/docs/BACKUP_RESTORE.md#choosing-the-managed-backup-directory)
|
|
1144
|
+
for inspection commands, permissions and existing-archive behavior.
|
|
1145
|
+
|
|
1118
1146
|
**Retention (automatic pruning):**
|
|
1119
1147
|
|
|
1120
1148
|
`pre_optimize` and `pre_watch` archives are **bounded by default** to the newest 5 per kind (implicit safe default for repeated mine/optimize cycles and watcher restarts).
|
|
@@ -1127,7 +1155,11 @@ export MEMPALACE_BACKUP_RETAIN_COUNT=5 # explicit limit for all kinds; overrid
|
|
|
1127
1155
|
export MEMPALACE_BACKUP_RETAIN_COUNT=0 # 0 disables pruning for every kind
|
|
1128
1156
|
```
|
|
1129
1157
|
|
|
1130
|
-
Or in `~/.mempalace/config.json`: `{"backup_retain_count": 5}`.
|
|
1158
|
+
Or in `~/.mempalace/config.json`: `{"backup_retain_count": 5}`. Retention affects only
|
|
1159
|
+
the palace's selected managed directory. With `backup_dir` unset, that directory is
|
|
1160
|
+
`<palace_parent>/backups/<palace_name>/`; a configured root uses the isolated child
|
|
1161
|
+
described above. Explicit `--out` archives are never pruned, and `backup create --out`
|
|
1162
|
+
refuses to overwrite an existing file.
|
|
1131
1163
|
|
|
1132
1164
|
`backup list` (`--json` for scripts) prints `stale` in its FLAGS column for archives that would be pruned at the current retain count, `oversized` for archives larger than `MEMPALACE_BACKUP_WARN_SIZE_BYTES`, `degraded` for a snapshot of a damaged palace, and `shared` for archives an older release wrote into the shared `<palace_parent>/backups/` directory (they may belong to a sibling palace; check their wings before restoring, and retention never deletes them).
|
|
1133
1165
|
|
|
@@ -1164,7 +1196,9 @@ Set the backup-specific floor to `0` to disable the backup guard.
|
|
|
1164
1196
|
|
|
1165
1197
|
**Auto-backup before optimize (on by default):**
|
|
1166
1198
|
|
|
1167
|
-
`backup_before_optimize` is **`true` by default**.
|
|
1199
|
+
`backup_before_optimize` is **`true` by default**. Before every `optimize()` call
|
|
1200
|
+
(runs after mining), a `pre_optimize_*.tar.gz` backup is created in the selected managed
|
|
1201
|
+
directory. With `backup_dir` unset, this is `<palace_parent>/backups/<palace_name>/`.
|
|
1168
1202
|
|
|
1169
1203
|
To opt out, add to `~/.mempalace/config.json`:
|
|
1170
1204
|
```json
|
|
@@ -1681,7 +1715,7 @@ python -m pyright --pythonpath "$(python -c 'import sys; print(sys.executable)')
|
|
|
1681
1715
|
Apache 2.0 — see [LICENSE](https://github.com/rergards/mempalace-code/blob/main/LICENSE) and [NOTICE](https://github.com/rergards/mempalace-code/blob/main/NOTICE).
|
|
1682
1716
|
|
|
1683
1717
|
<!-- Link Definitions -->
|
|
1684
|
-
[version-shield]: https://img.shields.io/badge/version-1.
|
|
1718
|
+
[version-shield]: https://img.shields.io/badge/version-1.16.0-4dc9f6?style=flat-square&labelColor=0a0e14
|
|
1685
1719
|
[release-link]: https://github.com/rergards/mempalace-code/releases
|
|
1686
1720
|
[python-shield]: https://img.shields.io/badge/python-3.11+-7dd8f8?style=flat-square&labelColor=0a0e14&logo=python&logoColor=7dd8f8
|
|
1687
1721
|
[python-link]: https://www.python.org/
|
|
@@ -564,14 +564,17 @@ export MEMPALACE_DISK_MIN_FREE_BYTES=1GiB # global floor (watcher + bac
|
|
|
564
564
|
Or set byte values in `~/.mempalace/config.json`. This example keeps the 1 GiB global default
|
|
565
565
|
and raises the watcher and backup floors to 2 GiB each. The file must be a plain JSON object
|
|
566
566
|
without comments; a file that fails to parse, or whose top level is not an object, is ignored as
|
|
567
|
-
a whole with a one-line warning. A
|
|
568
|
-
reported on stderr and the next setting in precedence order applies instead.
|
|
567
|
+
a whole with a one-line warning. A size value that cannot be parsed (for example `"lots"`)
|
|
568
|
+
is reported on stderr and the next size setting in precedence order applies instead.
|
|
569
|
+
An invalid `backup_dir` fails the managed backup operation without a fallback;
|
|
570
|
+
see [Backup directory configuration](https://github.com/rergards/mempalace-code/blob/main/docs/BACKUP_RESTORE.md#choosing-the-managed-backup-directory).
|
|
569
571
|
|
|
570
572
|
```json
|
|
571
573
|
{
|
|
572
574
|
"disk_min_free_bytes": 1073741824,
|
|
573
575
|
"watch_disk_min_free_bytes": 2147483648,
|
|
574
|
-
"backup_disk_min_free_bytes": 2147483648
|
|
576
|
+
"backup_disk_min_free_bytes": 2147483648,
|
|
577
|
+
"backup_dir": null
|
|
575
578
|
}
|
|
576
579
|
```
|
|
577
580
|
|
|
@@ -1055,6 +1058,31 @@ leading `NAME=value` assignments) carries `HF_HOME` and every `MEMPALACE_*` sett
|
|
|
1055
1058
|
rendering shell, such as `MEMPALACE_BACKUP_RETAIN_COUNT`; re-render after changing them.
|
|
1056
1059
|
`schedule` warns when no palace exists at the target path yet.
|
|
1057
1060
|
|
|
1061
|
+
**Backup directory:** Set `backup_dir` in `~/.mempalace/config.json` to put managed
|
|
1062
|
+
archives on another disk, for example `{"backup_dir": "/mnt/backup/mempalace"}`.
|
|
1063
|
+
`MEMPALACE_BACKUP_DIR` overrides that setting. Paths expand `~`; relative paths
|
|
1064
|
+
resolve against the current directory and produce a warning. Use an absolute path
|
|
1065
|
+
for scheduled jobs. An absent setting or JSON `null` keeps the default
|
|
1066
|
+
`<palace_parent>/backups/<palace_name>/` directory.
|
|
1067
|
+
|
|
1068
|
+
The configured directory is a root. Each palace uses a child named
|
|
1069
|
+
`<palace_name>-<hash>`, where the hash comes from its canonical source path, so
|
|
1070
|
+
palaces with the same name keep separate archives and retention. Manual,
|
|
1071
|
+
scheduled, pre-watch and pre-optimize backups, listing and footprint accounting
|
|
1072
|
+
use that child. Free space is checked on the archive destination filesystem.
|
|
1073
|
+
Missing directories are created during backup; listing creates no directories.
|
|
1074
|
+
Invalid or inaccessible settings fail without writing to the default directory.
|
|
1075
|
+
Managed children must be outside the palace and cannot be symbolic links.
|
|
1076
|
+
New backup roots and managed children have owner-only access; an existing
|
|
1077
|
+
configured root keeps its permissions. Archives remain owner-only.
|
|
1078
|
+
|
|
1079
|
+
Changing this setting moves or deletes no existing archives. Previous managed
|
|
1080
|
+
archives remain at their old path; use `backup list --dir /previous/managed/path`
|
|
1081
|
+
to list them. Explicit `--out` takes priority and keeps its existing behavior,
|
|
1082
|
+
including no managed retention, even when `backup_dir` is invalid.
|
|
1083
|
+
See [Backup directory configuration](https://github.com/rergards/mempalace-code/blob/main/docs/BACKUP_RESTORE.md#choosing-the-managed-backup-directory)
|
|
1084
|
+
for inspection commands, permissions and existing-archive behavior.
|
|
1085
|
+
|
|
1058
1086
|
**Retention (automatic pruning):**
|
|
1059
1087
|
|
|
1060
1088
|
`pre_optimize` and `pre_watch` archives are **bounded by default** to the newest 5 per kind (implicit safe default for repeated mine/optimize cycles and watcher restarts).
|
|
@@ -1067,7 +1095,11 @@ export MEMPALACE_BACKUP_RETAIN_COUNT=5 # explicit limit for all kinds; overrid
|
|
|
1067
1095
|
export MEMPALACE_BACKUP_RETAIN_COUNT=0 # 0 disables pruning for every kind
|
|
1068
1096
|
```
|
|
1069
1097
|
|
|
1070
|
-
Or in `~/.mempalace/config.json`: `{"backup_retain_count": 5}`.
|
|
1098
|
+
Or in `~/.mempalace/config.json`: `{"backup_retain_count": 5}`. Retention affects only
|
|
1099
|
+
the palace's selected managed directory. With `backup_dir` unset, that directory is
|
|
1100
|
+
`<palace_parent>/backups/<palace_name>/`; a configured root uses the isolated child
|
|
1101
|
+
described above. Explicit `--out` archives are never pruned, and `backup create --out`
|
|
1102
|
+
refuses to overwrite an existing file.
|
|
1071
1103
|
|
|
1072
1104
|
`backup list` (`--json` for scripts) prints `stale` in its FLAGS column for archives that would be pruned at the current retain count, `oversized` for archives larger than `MEMPALACE_BACKUP_WARN_SIZE_BYTES`, `degraded` for a snapshot of a damaged palace, and `shared` for archives an older release wrote into the shared `<palace_parent>/backups/` directory (they may belong to a sibling palace; check their wings before restoring, and retention never deletes them).
|
|
1073
1105
|
|
|
@@ -1104,7 +1136,9 @@ Set the backup-specific floor to `0` to disable the backup guard.
|
|
|
1104
1136
|
|
|
1105
1137
|
**Auto-backup before optimize (on by default):**
|
|
1106
1138
|
|
|
1107
|
-
`backup_before_optimize` is **`true` by default**.
|
|
1139
|
+
`backup_before_optimize` is **`true` by default**. Before every `optimize()` call
|
|
1140
|
+
(runs after mining), a `pre_optimize_*.tar.gz` backup is created in the selected managed
|
|
1141
|
+
directory. With `backup_dir` unset, this is `<palace_parent>/backups/<palace_name>/`.
|
|
1108
1142
|
|
|
1109
1143
|
To opt out, add to `~/.mempalace/config.json`:
|
|
1110
1144
|
```json
|
|
@@ -1621,7 +1655,7 @@ python -m pyright --pythonpath "$(python -c 'import sys; print(sys.executable)')
|
|
|
1621
1655
|
Apache 2.0 — see [LICENSE](https://github.com/rergards/mempalace-code/blob/main/LICENSE) and [NOTICE](https://github.com/rergards/mempalace-code/blob/main/NOTICE).
|
|
1622
1656
|
|
|
1623
1657
|
<!-- Link Definitions -->
|
|
1624
|
-
[version-shield]: https://img.shields.io/badge/version-1.
|
|
1658
|
+
[version-shield]: https://img.shields.io/badge/version-1.16.0-4dc9f6?style=flat-square&labelColor=0a0e14
|
|
1625
1659
|
[release-link]: https://github.com/rergards/mempalace-code/releases
|
|
1626
1660
|
[python-shield]: https://img.shields.io/badge/python-3.11+-7dd8f8?style=flat-square&labelColor=0a0e14&logo=python&logoColor=7dd8f8
|
|
1627
1661
|
[python-link]: https://www.python.org/
|
|
@@ -1072,7 +1072,19 @@ Same as above — likely fragment corruption. Run
|
|
|
1072
1072
|
|
|
1073
1073
|
### "Table unreadable" or LanceDB errors
|
|
1074
1074
|
|
|
1075
|
-
Storage corruption.
|
|
1075
|
+
Storage corruption. Follow the inspected recovery procedure in
|
|
1076
|
+
[BACKUP_RESTORE.md](BACKUP_RESTORE.md#health-check-and-repair) before rollback; data
|
|
1077
|
+
added after the selected recovery point is lost. Automatic backups use the selected
|
|
1078
|
+
managed directory. `~/.mempalace/backups/palace/pre_optimize_*.tar.gz` is the default
|
|
1079
|
+
when `backup_dir` is unset. To choose another disk, follow
|
|
1080
|
+
[backup directory configuration](BACKUP_RESTORE.md#choosing-the-managed-backup-directory),
|
|
1081
|
+
merge the key into the existing config, and use an absolute path. Preserve existing
|
|
1082
|
+
archives, mounts and services; setting `backup_dir` does not migrate them.
|
|
1083
|
+
Pre-optimize archives are bounded by default (newest 5 kept); scheduled archives are
|
|
1084
|
+
bounded by default (newest 14 kept); set `MEMPALACE_BACKUP_RETAIN_COUNT=0` to keep all
|
|
1085
|
+
kinds unbounded. Successful optimize runs also perform best-effort verified
|
|
1086
|
+
stale-version cleanup; use `"$MEMPALACE_BIN" cleanup` manually for older accumulations
|
|
1087
|
+
or emergency disk recovery after stopping writers.
|
|
1076
1088
|
|
|
1077
1089
|
### Re-mine doesn't fix the issue
|
|
1078
1090
|
|
|
@@ -667,9 +667,57 @@ tarball. Do not run that suggestion
|
|
|
667
667
|
directly. Set its palace as `RESTORE_TARGET`, set the tarball as `ARCHIVE`, and
|
|
668
668
|
follow the inspected force-restore procedure in [Tarball Backup](#tarball-backup-full-snapshot).
|
|
669
669
|
|
|
670
|
+
### Choosing the managed backup directory
|
|
671
|
+
|
|
672
|
+
Set `backup_dir` in `~/.mempalace/config.json` to select a backup root independently
|
|
673
|
+
of the palace. Merge this key into the existing JSON object; preserve other settings:
|
|
674
|
+
|
|
675
|
+
```json
|
|
676
|
+
{
|
|
677
|
+
"backup_dir": "/mnt/backup/mempalace"
|
|
678
|
+
}
|
|
679
|
+
```
|
|
680
|
+
|
|
681
|
+
`MEMPALACE_BACKUP_DIR` overrides the JSON setting. Paths expand `~`; a relative path
|
|
682
|
+
resolves against the process's current directory and emits a warning. Use an absolute
|
|
683
|
+
path for scheduled jobs and services. An absent key or JSON `null` keeps the default
|
|
684
|
+
`<palace_parent>/backups/<palace_name>/` layout.
|
|
685
|
+
|
|
686
|
+
The setting selects a root. Each palace uses
|
|
687
|
+
`<backup_dir>/<palace_name>-<hash>/`, where `<hash>` is the first 16 hexadecimal digits
|
|
688
|
+
of SHA-256 of its canonical palace path. Palaces with the same name have separate
|
|
689
|
+
directories and retention. Manual, scheduled, pre-watch and pre-optimize archives,
|
|
690
|
+
listing, rotation and managed-backup size accounting use this selected directory.
|
|
691
|
+
The backup guard checks free space on the archive's destination filesystem.
|
|
692
|
+
|
|
693
|
+
Creating a backup creates missing directories; listing creates none. Blank, malformed,
|
|
694
|
+
non-directory or inaccessible configured paths fail with an error. MemPalace never
|
|
695
|
+
switches to the default directory after such an error. The managed child must be
|
|
696
|
+
outside the palace and cannot be a symbolic link. New roots and managed children use
|
|
697
|
+
owner-only access (`0700`); an existing configured root keeps its permissions. Archives
|
|
698
|
+
use `0600`.
|
|
699
|
+
|
|
700
|
+
Changing `backup_dir` moves or deletes no archives. Earlier managed archives remain
|
|
701
|
+
at their previous path and leave the selected retention set. To inspect them:
|
|
702
|
+
|
|
703
|
+
```bash
|
|
704
|
+
mempalace-code backup list --json
|
|
705
|
+
mempalace-code backup list --dir /previous/managed/path --json
|
|
706
|
+
```
|
|
707
|
+
|
|
708
|
+
Inspect the archive paths returned by `backup list` before any manual removal. Listing
|
|
709
|
+
an extra directory does not enroll it in managed rotation. Legacy shared archives
|
|
710
|
+
remain listed with the `shared` flag and are never pruned.
|
|
711
|
+
|
|
712
|
+
Explicit `backup create --out /path/archive.tar.gz` takes priority over `backup_dir`,
|
|
713
|
+
even when that setting is invalid. It keeps the existing no-overwrite behavior and
|
|
714
|
+
disables managed rotation for that operation. The disk guard uses the explicit
|
|
715
|
+
destination. See [Retention](#retention-automatic-pruning) for per-kind limits.
|
|
716
|
+
|
|
670
717
|
### Auto-Backup Before Optimize
|
|
671
718
|
|
|
672
|
-
Enabled by default. Every `mempalace-code mine` creates a backup before compacting storage
|
|
719
|
+
Enabled by default. Every `mempalace-code mine` creates a backup before compacting storage.
|
|
720
|
+
With `backup_dir` unset, the default palace uses:
|
|
673
721
|
|
|
674
722
|
```
|
|
675
723
|
~/.mempalace/backups/palace/pre_optimize_YYYYMMDD_HHMMSS_ffffff.tar.gz
|
|
@@ -704,7 +752,8 @@ export MEMPALACE_BACKUP_RETAIN_COUNT=10
|
|
|
704
752
|
export MEMPALACE_BACKUP_RETAIN_COUNT=0
|
|
705
753
|
```
|
|
706
754
|
|
|
707
|
-
Each palace has its own managed
|
|
755
|
+
Each palace has its own [selected managed directory](#choosing-the-managed-backup-directory).
|
|
756
|
+
With `backup_dir` unset, it is `<palace_parent>/backups/<palace_name>/`
|
|
708
757
|
(the default palace `~/.mempalace/palace` uses `~/.mempalace/backups/palace/`). Retention prunes
|
|
709
758
|
**only that directory**, so palaces that share a parent directory never prune each other's
|
|
710
759
|
archives. Archives written with explicit `--out` paths are never pruned, and `backup create
|
|
@@ -915,6 +964,11 @@ The last sentence names the setting that actually set the floor, for example
|
|
|
915
964
|
|
|
916
965
|
The projection is conservative: it assumes the archive size equals the uncompressed palace + KG size. Actual compressed archives are usually smaller, but the guard refuses when even the worst-case estimate would leave insufficient headroom.
|
|
917
966
|
|
|
967
|
+
Free space comes from the filesystem of the selected managed directory or explicit
|
|
968
|
+
`--out` destination. The palace and backup root can be on different disks. Watcher
|
|
969
|
+
write thresholds still check the palace filesystem; `watch <dir> status` accounts
|
|
970
|
+
for archives in the selected managed directory.
|
|
971
|
+
|
|
918
972
|
### Configuring the backup floor
|
|
919
973
|
|
|
920
974
|
```bash
|
|
@@ -956,13 +1010,18 @@ If the backup guard refuses because disk is nearly full:
|
|
|
956
1010
|
|
|
957
1011
|
1. Check what is taking space:
|
|
958
1012
|
```bash
|
|
959
|
-
|
|
1013
|
+
mempalace-code backup list --json
|
|
1014
|
+
# Set BACKUP_PATH to a listed archive's containing directory after inspection.
|
|
1015
|
+
: "${BACKUP_PATH:?set BACKUP_PATH to the inspected backup directory}"
|
|
1016
|
+
du -sh ~/.mempalace/palace "$BACKUP_PATH"
|
|
960
1017
|
```
|
|
961
1018
|
2. List existing backups and remove stale ones manually if immediate space is needed:
|
|
962
1019
|
```bash
|
|
963
1020
|
mempalace-code backup list
|
|
964
|
-
ls -lh
|
|
965
|
-
|
|
1021
|
+
ls -lh "$BACKUP_PATH"
|
|
1022
|
+
: "${BACKUP_PATH:?set BACKUP_PATH to the inspected backup directory}"
|
|
1023
|
+
# Remove only an inspected archive that you intend to discard.
|
|
1024
|
+
rm -i "$BACKUP_PATH/<stale_archive>.tar.gz"
|
|
966
1025
|
```
|
|
967
1026
|
3. Re-run the backup once enough space is freed.
|
|
968
1027
|
|
|
@@ -243,6 +243,22 @@ in human mode or `recovery_command` in the single JSON object on stdout. Review
|
|
|
243
243
|
target, and mutation authority before using the exact emitted command. Do not add flags, change the
|
|
244
244
|
action, or invent a nearby retry.
|
|
245
245
|
|
|
246
|
+
## Backup configuration and recovery
|
|
247
|
+
|
|
248
|
+
Backup operations use the direct CLI; the minimal memory profile exposes no backup
|
|
249
|
+
tool. Follow [BACKUP_RESTORE.md](BACKUP_RESTORE.md#choosing-the-managed-backup-directory)
|
|
250
|
+
when the owner requests backup configuration or recovery. `backup_dir` selects a root
|
|
251
|
+
with a separate managed child for each palace; `MEMPALACE_BACKUP_DIR` takes precedence.
|
|
252
|
+
Use an absolute path for services and scheduled jobs. Preserve existing configuration
|
|
253
|
+
keys and inspect `mempalace-code backup list --json` to confirm archive paths.
|
|
254
|
+
|
|
255
|
+
Changing the setting moves or deletes no existing archives. An invalid or inaccessible
|
|
256
|
+
configured path fails; retain the requested destination and report the error. Do not
|
|
257
|
+
unset it, change mounts, or add `--out` as an unapproved recovery. An owner-selected
|
|
258
|
+
`--out` destination bypasses managed rotation. Backup permission does not authorize
|
|
259
|
+
archive deletion, restore over an existing palace, or service changes. Use the inspected
|
|
260
|
+
restore procedure in the linked guide within the current authority.
|
|
261
|
+
|
|
246
262
|
## Ambiguous Write Outcome
|
|
247
263
|
|
|
248
264
|
On timeout, lost response, restart, or context loss after calling `mempalace_add_drawer`, `mempalace_kg_add`, `mempalace_kg_invalidate`, or `mempalace_diary_write`, do not immediately repeat the write. Reconcile observable poststate before any retry.
|
|
@@ -50,7 +50,28 @@ Update the version, changelog, public documentation, and generated scorecard in
|
|
|
50
50
|
one reviewable change. Keep `## Unreleased` at the top of `CHANGELOG.md`; move
|
|
51
51
|
the completed items into the new version heading when cutting the release.
|
|
52
52
|
|
|
53
|
-
|
|
53
|
+
Resolve existing authorization before asking for another approval. Preparation,
|
|
54
|
+
disposable-platform testing, candidate push, public promotion, publication and
|
|
55
|
+
live deployment are separate effects; apply the active request to each. A missing
|
|
56
|
+
permission blocks only its dependent effect. Qualification remains credential-free.
|
|
57
|
+
|
|
58
|
+
Check each changed behavior's public routes: README, its feature guide, agent
|
|
59
|
+
installation and LLM rules, CLI/MCP examples, and packaged instructions when the
|
|
60
|
+
capability belongs there. Update current claims, defaults, environment precedence,
|
|
61
|
+
failure recovery and preservation guarantees against source. Keep dated historical
|
|
62
|
+
evidence intact. Do not add backup operations to the minimal memory plugin, which
|
|
63
|
+
exposes only its declared memory tools.
|
|
64
|
+
|
|
65
|
+
Inspect every path selected for the public commit, including newly staged backlog
|
|
66
|
+
records. Private journals and machine-bound task histories remain local. Use the
|
|
67
|
+
existing ignore owner and supported backlog operations; preserve sealed records and
|
|
68
|
+
validate the store. An index-only exclusion preserves files at that moment, but a
|
|
69
|
+
later branch switch or merge can remove them if another ref still tracks them.
|
|
70
|
+
Before such integration, retain verified sealed bytes through the supported backup
|
|
71
|
+
or validated export route; compare their hashes and run native backlog validation
|
|
72
|
+
afterward. A clean Git tree proves no uncommitted diff, not preservation of ignored data.
|
|
73
|
+
|
|
74
|
+
Run source and documentation checks before building the installed candidate. None needs the candidate
|
|
54
75
|
SHA or public `main`; the exact-SHA public admission runs in section 3c, after
|
|
55
76
|
public `main` carries the candidate:
|
|
56
77
|
|
|
@@ -59,11 +80,7 @@ python scripts/docs_drift_guard.py
|
|
|
59
80
|
python scripts/public_safety_scan.py --tracked --staged
|
|
60
81
|
python scripts/quality_scorecard.py --check
|
|
61
82
|
python scripts/gen_code_intelligence_packet.py --check
|
|
62
|
-
python scripts/release_preflight.py --
|
|
63
|
-
python scripts/release_install_metadata_smoke.py --all-installers --install-spec . --json
|
|
64
|
-
python -m build --wheel --outdir dist
|
|
65
|
-
WHEEL=dist/mempalace_code-X.Y.Z-py3-none-any.whl
|
|
66
|
-
python scripts/release_readiness_gate.py --installed-golden-wheel "$WHEEL" --json
|
|
83
|
+
python scripts/release_preflight.py --json
|
|
67
84
|
python -m pytest tests/ -x -q -m "not needs_network"
|
|
68
85
|
python -m pytest tests/test_mcp_protocol_compat.py -q
|
|
69
86
|
python -m pytest tests/test_cli_golden_scenarios.py -q
|
|
@@ -73,9 +90,41 @@ python -m pyright --pythonpath "$(python -c 'import sys; print(sys.executable)')
|
|
|
73
90
|
python -m pyright -p pyrightconfig.strict.json
|
|
74
91
|
```
|
|
75
92
|
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
93
|
+
Then build both distribution formats into an owned output directory, check their
|
|
94
|
+
members and metadata, and use one exact wheel for all installed checks:
|
|
95
|
+
|
|
96
|
+
```bash
|
|
97
|
+
python -m build --outdir dist
|
|
98
|
+
WHEEL="$(pwd)/dist/mempalace_code-X.Y.Z-py3-none-any.whl"
|
|
99
|
+
python scripts/release_artifact_gate.py --dist dist --require-wheel --require-sdist --json
|
|
100
|
+
python scripts/release_install_metadata_smoke.py --all-installers --install-spec "$WHEEL" --json
|
|
101
|
+
python scripts/release_readiness_gate.py --installed-golden-wheel "$WHEEL" --json
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
Use the pending version in place of `X.Y.Z`; retain the wheel digest and the source
|
|
105
|
+
objects it represents. On a supported Linux fixture run the same exact-wheel
|
|
106
|
+
installer command with `MEMPALACE_RELEASE_SYSTEMD_USER=1`, as described below.
|
|
107
|
+
An unavailable Linux user manager leaves that receipt `UNRUN`; it does not invalidate
|
|
108
|
+
already passing platform rows or authorize a live service change.
|
|
109
|
+
|
|
110
|
+
Write section 1a's report after installed qualification, then commit the reviewed
|
|
111
|
+
source, report and public-safe metadata within the active authority. Scan the full
|
|
112
|
+
staged tree again before committing so new files are included. Finally run:
|
|
113
|
+
|
|
114
|
+
```bash
|
|
115
|
+
python scripts/release_preflight.py --tag vX.Y.Z --require-clean --json
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
With `--tag`, the preflight verifies the committed `acceptance_report` for the
|
|
119
|
+
exact package objects. A pending report or dirty tree is a prerequisite during
|
|
120
|
+
preparation, not a reason to ask again for an already authorized source commit.
|
|
121
|
+
Rebuild distribution archives after a documentation-only source change. Compare
|
|
122
|
+
their members with the tested wheel: runtime/plugin files, dependency and entrypoint
|
|
123
|
+
metadata, and accepted package source objects must match before reusing application
|
|
124
|
+
evidence. A README-only change in the wheel's metadata requires a new artifact check
|
|
125
|
+
and installed metadata smoke; record both wheel identities and the exact difference.
|
|
126
|
+
Other package changes require rerunning the affected installed acceptance and
|
|
127
|
+
updating its report. Archive timestamps alone do not prove a runtime change.
|
|
79
128
|
|
|
80
129
|
`gen_code_intelligence_packet.py --check` regenerates the code-intelligence demo
|
|
81
130
|
packet in a temp directory and compares it with the committed
|
|
@@ -92,7 +141,8 @@ check. It is the canonical pre-tag command and fails closed when upstream
|
|
|
92
141
|
python scripts/release_preflight.py --tag vX.Y.Z --require-clean --check-live-upstream
|
|
93
142
|
```
|
|
94
143
|
|
|
95
|
-
`release_install_metadata_smoke.py --all-installers` installs
|
|
144
|
+
`release_install_metadata_smoke.py --all-installers --install-spec "$WHEEL"` installs
|
|
145
|
+
the exact candidate wheel through
|
|
96
146
|
the canonical `venv`, `bootstrap-venv`, `pipx`, and `uv-tool` contours and proves
|
|
97
147
|
`importlib.metadata.version`,
|
|
98
148
|
`mempalace_code.__version__`, and `mempalace-code version-check --status`
|
|
@@ -118,7 +168,7 @@ evidence. Recovery: rerun the same aggregate command in the disposable Ubuntu jo
|
|
|
118
168
|
|
|
119
169
|
```bash
|
|
120
170
|
MEMPALACE_RELEASE_SYSTEMD_USER=1 python scripts/release_install_metadata_smoke.py \
|
|
121
|
-
--all-installers --install-spec
|
|
171
|
+
--all-installers --install-spec "$WHEEL" --json
|
|
122
172
|
```
|
|
123
173
|
|
|
124
174
|
The manager matrix above remains a lightweight metadata, recovery, plugin, and
|
|
@@ -256,7 +306,36 @@ an LLM agent would, following the public documentation literally.
|
|
|
256
306
|
agent configuration, crontab, launchd, or systemd user units; render schedules
|
|
257
307
|
and daemon files without installing them.
|
|
258
308
|
3. **Exercise every area** below and record what ran in the report's coverage
|
|
259
|
-
table
|
|
309
|
+
table. Direct functional acceptance is a mandatory release condition, separate
|
|
310
|
+
from source tests and CI. Discover commands, delegated subcommands, tools and
|
|
311
|
+
profiles from the installed package. For each supported operation, record the
|
|
312
|
+
exact public-interface invocation, accepted input, expected result, observed
|
|
313
|
+
result and relevant state after failure or retry. Exercise each enabled MCP
|
|
314
|
+
tool in each profile through a separate stdio client, including both supported
|
|
315
|
+
protocol handshakes. Listing a tool proves discovery only. `--help`, parent
|
|
316
|
+
guidance and missing-argument errors prove guidance only; they cannot replace
|
|
317
|
+
execution of the operation. A deliberately retired or unauthorized operation
|
|
318
|
+
is covered by its documented refusal and unchanged-state check, explicitly
|
|
319
|
+
labelled as refusal-only. Live operations use disposable supported fixtures;
|
|
320
|
+
never widen operational authority to satisfy coverage.
|
|
321
|
+
|
|
322
|
+
Reconcile the discovered surface with executed scenarios. An omitted required
|
|
323
|
+
case is blocking `UNRUN`; do not mark the release PASS or defer the missing
|
|
324
|
+
case as a low-severity issue. Platform-specific behavior must run on a supported
|
|
325
|
+
platform. Preserve machine-readable invocation and outcome evidence outside
|
|
326
|
+
the published tree, bound to the exact wheel SHA-256. The existing installed
|
|
327
|
+
owner remains `scripts/release_readiness_gate.py`; supplement its scenarios
|
|
328
|
+
where its aggregate evidence does not establish the required behavior.
|
|
329
|
+
|
|
330
|
+
The installed owner discovers the root parser and the delegated
|
|
331
|
+
`wing-migration` parser. It attributes checked successes, documented refusals
|
|
332
|
+
and verified daemon launches separately from guidance and discovery. A parent
|
|
333
|
+
usage message or an operation's `--help` cannot satisfy its execution case.
|
|
334
|
+
MCP scenarios use a separate disposable palace for each profile, validate each
|
|
335
|
+
enabled tool's result and mutation post-state, and check both protocol
|
|
336
|
+
handshakes with recovery after invalid modern metadata. The suite aggregate
|
|
337
|
+
fails when a discovered operation or enabled tool/profile case is missing.
|
|
338
|
+
|
|
260
339
|
|
|
261
340
|
| Area | Scope |
|
|
262
341
|
|---|---|
|
|
@@ -304,6 +383,61 @@ recorded in the report.
|
|
|
304
383
|
|
|
305
384
|
## 2. Review public repository surfaces
|
|
306
385
|
|
|
386
|
+
### Privacy audit before public delivery
|
|
387
|
+
|
|
388
|
+
Run this audit for each release before any public candidate push, promotion or
|
|
389
|
+
publication. Reuse results only when the tree, artifacts and outgoing ancestry
|
|
390
|
+
are unchanged. Enumerate files with Git, which includes hidden tracked paths;
|
|
391
|
+
default filesystem searches can omit them:
|
|
392
|
+
|
|
393
|
+
```bash
|
|
394
|
+
git ls-files
|
|
395
|
+
git diff --cached --name-only
|
|
396
|
+
python scripts/public_safety_scan.py --committed --tracked --staged
|
|
397
|
+
python scripts/gitleaks_scan.py full-history --artifact-dir .codex-local/release-privacy
|
|
398
|
+
python scripts/release_artifact_gate.py --dist dist --require-wheel --require-sdist --json
|
|
399
|
+
```
|
|
400
|
+
|
|
401
|
+
Inspect `AGENTS.md`, `CLAUDE.md`, every tracked `.agents/` and `.claude/` instruction,
|
|
402
|
+
prompt, shared reference and setting, `docs/LLM_USAGE_RULES.md`, packaged plugin
|
|
403
|
+
instructions, examples, workflows and all newly staged metadata. Examine sealed
|
|
404
|
+
backlog history as well as current task fields. Check for private remotes, hosts,
|
|
405
|
+
addresses, machine identifiers, real local paths, personal/customer information,
|
|
406
|
+
private project or operational context and credentials. Do not read local credential
|
|
407
|
+
stores or invoke AI clients to perform qualification. Reports contain file positions,
|
|
408
|
+
categories and redacted findings, never secret values or private transcripts.
|
|
409
|
+
|
|
410
|
+
Review ambiguous matches against source and provenance. Generic examples, synthetic
|
|
411
|
+
fixtures and intended public author/contact metadata can resemble private data;
|
|
412
|
+
neither a pattern match nor an automatic PASS settles their classification. Do not
|
|
413
|
+
assume an internal author label is approved for disclosure just because it is sealed
|
|
414
|
+
or already tracked. Record the classification and its basis in the private evidence.
|
|
415
|
+
|
|
416
|
+
Inspect member names and text contents of both wheel and sdist, including README
|
|
417
|
+
metadata, internal instructions and serialized data. The artifact gate checks
|
|
418
|
+
distribution shape; it does not replace content review. Retain the exact archive
|
|
419
|
+
digests, source SHA, scope, findings, dispositions and any uninspected binary members.
|
|
420
|
+
|
|
421
|
+
The pinned full-history scan includes reachable refs. Check the actual outgoing
|
|
422
|
+
ref's parent history separately: excluding a file from the current tree leaves older
|
|
423
|
+
blobs reachable. Local development history and ignored maintainer notes may contain
|
|
424
|
+
retained private evidence. Keep them local. Section 3's candidate carries the reviewed
|
|
425
|
+
tree with current public `main` as its parent; never send local development history
|
|
426
|
+
as a substitute. Inspect the outgoing candidate and archive identities again before
|
|
427
|
+
delivery. If existing public ancestry contains a confirmed disclosure, record it as
|
|
428
|
+
an unresolved exposure; a new clean snapshot cannot remove it.
|
|
429
|
+
|
|
430
|
+
A confirmed private disclosure or consequential unknown classification blocks its
|
|
431
|
+
public delivery. Do not rename an unknown to PASS, delete evidence, edit sealed JSON,
|
|
432
|
+
rewrite published history or add a scanner exemption. Preserve the finding and
|
|
433
|
+
propose the smallest in-scope correction; a history rewrite or disclosure-policy
|
|
434
|
+
change needs its own authority. A clean-tree or secret-scan result alone cannot be
|
|
435
|
+
reported as "no private data remains in the repository". Recovery: inspect the
|
|
436
|
+
retained redacted report, correct the affected surface within authority, then rerun
|
|
437
|
+
the affected scan and exact-ref check.
|
|
438
|
+
|
|
439
|
+
### Public presentation
|
|
440
|
+
|
|
307
441
|
Before asking for tag/publish approval, inspect the public repository as a
|
|
308
442
|
visitor would:
|
|
309
443
|
|
{mempalace_code-1.15.1 → mempalace_code-1.16.0}/docs/quality/PALACE-SCOPE-RESOURCE-BOUNDARY.md
RENAMED
|
@@ -161,7 +161,8 @@ storage handles are closed before retained resources are measured. The `lsof` me
|
|
|
161
161
|
counts numeric descriptors; `cwd`, `txt`, and `mem` records are excluded.
|
|
162
162
|
Unavailable or incomplete descriptor measurements fail the measurement check;
|
|
163
163
|
they cannot produce zero growth or a passing descriptor result.
|
|
164
|
-
|
|
164
|
+
With `backup_dir` unset, managed pre-optimize backups use `backups/<palace name>/`
|
|
165
|
+
and are included in the
|
|
165
166
|
regression's disk measurement and retention assertion, which requires at least one
|
|
166
167
|
archive. The fixture uses a disposable HOME and palace.
|
|
167
168
|
|
|
@@ -202,7 +203,8 @@ The workflow initializes a fixture project, mines it, performs a no-op mine,
|
|
|
202
203
|
backs up and restores the palace, searches and reads mined content, and runs one
|
|
203
204
|
real `--on-save` watch cycle. The no-op output includes `no changes detected`,
|
|
204
205
|
creates no managed backup archive, and has zero byte growth across the palace and
|
|
205
|
-
its sibling `backups/` directory
|
|
206
|
+
its default sibling `backups/` directory (`backup_dir` is unset in this fixture).
|
|
207
|
+
The watcher waits for `state=watch-ready`,
|
|
206
208
|
updates one already-mined source, accepts one post-debounce retry for native
|
|
207
209
|
watch registration, observes `[project: 1 change(s)]`, then exits cleanly on
|
|
208
210
|
SIGTERM with `1 re-mine cycle(s), 1 event(s)`.
|
|
@@ -54,9 +54,15 @@ and complete is for the reviewer.
|
|
|
54
54
|
The wheel digest identifies the tested artifact. The preflight binds the source ids
|
|
55
55
|
instead, because the tag workflow rebuilds the distributions from the same tree.
|
|
56
56
|
|
|
57
|
-
`result: PASS`
|
|
58
|
-
|
|
59
|
-
|
|
57
|
+
`result: PASS` requires complete direct functional coverage under RELEASING
|
|
58
|
+
section 1a. Every discovered supported command/subcommand and enabled MCP tool
|
|
59
|
+
in every profile needs actual installed-interface execution and checked results.
|
|
60
|
+
Separate success, documented refusal, failure/retry, and discovery-only evidence.
|
|
61
|
+
Help, parser errors, listings, direct handler calls and source-test counts cannot
|
|
62
|
+
substitute for operation coverage. Missing required coverage is blocking `UNRUN`;
|
|
63
|
+
it cannot be deferred to obtain PASS. Platform-specific cases run on a supported
|
|
64
|
+
platform. No confirmed critical or high issue may remain open; other product
|
|
65
|
+
findings must be fixed or explicitly deferred with a reason and a backlog reference.
|
|
60
66
|
|
|
61
67
|
## Sections
|
|
62
68
|
|