memleaf 0.2.96__tar.gz → 1.0.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.
- {memleaf-0.2.96 → memleaf-1.0.0}/CHANGELOG.md +22 -0
- {memleaf-0.2.96 → memleaf-1.0.0}/MANIFEST.in +2 -3
- {memleaf-0.2.96/src/memleaf.egg-info → memleaf-1.0.0}/PKG-INFO +3 -2
- {memleaf-0.2.96 → memleaf-1.0.0}/README.en.md +1 -1
- {memleaf-0.2.96 → memleaf-1.0.0}/README.md +1 -1
- {memleaf-0.2.96 → memleaf-1.0.0}/docs/acceptance-evidence-guide.md +12 -18
- {memleaf-0.2.96 → memleaf-1.0.0}/docs/host-acceptance-runbook.md +4 -7
- {memleaf-0.2.96 → memleaf-1.0.0}/docs/installed-artifact-verification.md +5 -2
- memleaf-1.0.0/docs/processing-quality-acceptance.md +33 -0
- {memleaf-0.2.96 → memleaf-1.0.0}/docs/query-performance.md +7 -8
- memleaf-1.0.0/docs/stability.md +56 -0
- {memleaf-0.2.96 → memleaf-1.0.0}/pyproject.toml +2 -1
- {memleaf-0.2.96 → memleaf-1.0.0}/src/memleaf/__init__.py +1 -1
- {memleaf-0.2.96 → memleaf-1.0.0}/src/memleaf/hermes_provider/plugin.yaml +1 -1
- {memleaf-0.2.96 → memleaf-1.0.0/src/memleaf.egg-info}/PKG-INFO +3 -2
- {memleaf-0.2.96 → memleaf-1.0.0}/src/memleaf.egg-info/SOURCES.txt +1 -3
- memleaf-0.2.96/docs/processing-quality-acceptance.md +0 -189
- memleaf-0.2.96/examples/incremental_acceptance.json +0 -747
- memleaf-0.2.96/examples/query_benchmark.py +0 -133
- memleaf-0.2.96/src/memleaf/acceptance.py +0 -477
- {memleaf-0.2.96 → memleaf-1.0.0}/LICENSE +0 -0
- {memleaf-0.2.96 → memleaf-1.0.0}/docs/automatic-processing-route.md +0 -0
- {memleaf-0.2.96 → memleaf-1.0.0}/docs/body-compaction.md +0 -0
- {memleaf-0.2.96 → memleaf-1.0.0}/docs/candidate-reconciliation.md +0 -0
- {memleaf-0.2.96 → memleaf-1.0.0}/docs/capture-budget-design.md +0 -0
- {memleaf-0.2.96 → memleaf-1.0.0}/docs/config-migrations.md +0 -0
- {memleaf-0.2.96 → memleaf-1.0.0}/docs/core-refactor.md +0 -0
- {memleaf-0.2.96 → memleaf-1.0.0}/docs/development-closeout.md +0 -0
- {memleaf-0.2.96 → memleaf-1.0.0}/docs/evidence-retention.md +0 -0
- {memleaf-0.2.96 → memleaf-1.0.0}/docs/explicit-memory-update.md +0 -0
- {memleaf-0.2.96 → memleaf-1.0.0}/docs/extraction-latency.md +0 -0
- {memleaf-0.2.96 → memleaf-1.0.0}/docs/failed-run-recovery.md +0 -0
- {memleaf-0.2.96 → memleaf-1.0.0}/docs/gate-evidence-boundary.md +0 -0
- {memleaf-0.2.96 → memleaf-1.0.0}/docs/general-processing.md +0 -0
- {memleaf-0.2.96 → memleaf-1.0.0}/docs/hermes-mcp-runtime.md +0 -0
- {memleaf-0.2.96 → memleaf-1.0.0}/docs/hermes-provider-compatibility.md +0 -0
- {memleaf-0.2.96 → memleaf-1.0.0}/docs/hermes-source-comparison-context.md +0 -0
- {memleaf-0.2.96 → memleaf-1.0.0}/docs/immutable-release-assets.md +0 -0
- {memleaf-0.2.96 → memleaf-1.0.0}/docs/incremental-commit-contract.md +0 -0
- {memleaf-0.2.96 → memleaf-1.0.0}/docs/incremental-execution.md +0 -0
- {memleaf-0.2.96 → memleaf-1.0.0}/docs/incremental-native-comparison.md +0 -0
- {memleaf-0.2.96 → memleaf-1.0.0}/docs/incremental-partial-recovery.md +0 -0
- {memleaf-0.2.96 → memleaf-1.0.0}/docs/incremental-planner-preview.md +0 -0
- {memleaf-0.2.96 → memleaf-1.0.0}/docs/incremental-runtime-contract.md +0 -0
- {memleaf-0.2.96 → memleaf-1.0.0}/docs/incremental-scope-registration.md +0 -0
- {memleaf-0.2.96 → memleaf-1.0.0}/docs/incremental-selected-retention.md +0 -0
- {memleaf-0.2.96 → memleaf-1.0.0}/docs/memory-lifecycle-tools.md +0 -0
- {memleaf-0.2.96 → memleaf-1.0.0}/docs/memory-state-contract.md +0 -0
- {memleaf-0.2.96 → memleaf-1.0.0}/docs/migration-preflight.md +0 -0
- {memleaf-0.2.96 → memleaf-1.0.0}/docs/public-query-integrity.md +0 -0
- {memleaf-0.2.96 → memleaf-1.0.0}/docs/remember-incremental-route.md +0 -0
- {memleaf-0.2.96 → memleaf-1.0.0}/docs/runtime-state-retention.md +0 -0
- {memleaf-0.2.96 → memleaf-1.0.0}/docs/semantic-extraction-protocol.md +0 -0
- {memleaf-0.2.96 → memleaf-1.0.0}/docs/source-work-contract.md +0 -0
- {memleaf-0.2.96 → memleaf-1.0.0}/docs/v0.2.26-processing-status.md +0 -0
- {memleaf-0.2.96 → memleaf-1.0.0}/examples/README.md +0 -0
- {memleaf-0.2.96 → memleaf-1.0.0}/examples/basic_usage.py +0 -0
- {memleaf-0.2.96 → memleaf-1.0.0}/examples/mcp_stdio.ndjson +0 -0
- {memleaf-0.2.96 → memleaf-1.0.0}/install.ps1 +0 -0
- {memleaf-0.2.96 → memleaf-1.0.0}/install.sh +0 -0
- {memleaf-0.2.96 → memleaf-1.0.0}/setup.cfg +0 -0
- {memleaf-0.2.96 → memleaf-1.0.0}/src/memleaf/__main__.py +0 -0
- {memleaf-0.2.96 → memleaf-1.0.0}/src/memleaf/adapters/__init__.py +0 -0
- {memleaf-0.2.96 → memleaf-1.0.0}/src/memleaf/adapters/antigravity.py +0 -0
- {memleaf-0.2.96 → memleaf-1.0.0}/src/memleaf/adapters/base.py +0 -0
- {memleaf-0.2.96 → memleaf-1.0.0}/src/memleaf/adapters/codex.py +0 -0
- {memleaf-0.2.96 → memleaf-1.0.0}/src/memleaf/adapters/hermes.py +0 -0
- {memleaf-0.2.96 → memleaf-1.0.0}/src/memleaf/admission.py +0 -0
- {memleaf-0.2.96 → memleaf-1.0.0}/src/memleaf/batch_review.py +0 -0
- {memleaf-0.2.96 → memleaf-1.0.0}/src/memleaf/body_preservation.py +0 -0
- {memleaf-0.2.96 → memleaf-1.0.0}/src/memleaf/budget.py +0 -0
- {memleaf-0.2.96 → memleaf-1.0.0}/src/memleaf/capture.py +0 -0
- {memleaf-0.2.96 → memleaf-1.0.0}/src/memleaf/cli.py +0 -0
- {memleaf-0.2.96 → memleaf-1.0.0}/src/memleaf/compaction.py +0 -0
- {memleaf-0.2.96 → memleaf-1.0.0}/src/memleaf/config.py +0 -0
- {memleaf-0.2.96 → memleaf-1.0.0}/src/memleaf/create_coordinator.py +0 -0
- {memleaf-0.2.96 → memleaf-1.0.0}/src/memleaf/credentials.py +0 -0
- {memleaf-0.2.96 → memleaf-1.0.0}/src/memleaf/evidence_budget.py +0 -0
- {memleaf-0.2.96 → memleaf-1.0.0}/src/memleaf/evidence_policy.py +0 -0
- {memleaf-0.2.96 → memleaf-1.0.0}/src/memleaf/evidence_structure.py +0 -0
- {memleaf-0.2.96 → memleaf-1.0.0}/src/memleaf/evidence_syntax.py +0 -0
- {memleaf-0.2.96 → memleaf-1.0.0}/src/memleaf/explicit_text_source.py +0 -0
- {memleaf-0.2.96 → memleaf-1.0.0}/src/memleaf/extraction_budget.py +0 -0
- {memleaf-0.2.96 → memleaf-1.0.0}/src/memleaf/extraction_capability.py +0 -0
- {memleaf-0.2.96 → memleaf-1.0.0}/src/memleaf/extraction_work_state.py +0 -0
- {memleaf-0.2.96 → memleaf-1.0.0}/src/memleaf/frontmatter.py +0 -0
- {memleaf-0.2.96 → memleaf-1.0.0}/src/memleaf/hermes_provider/README.md +0 -0
- {memleaf-0.2.96 → memleaf-1.0.0}/src/memleaf/hermes_provider/__init__.py +0 -0
- {memleaf-0.2.96 → memleaf-1.0.0}/src/memleaf/hermes_provider/_mcp_client.py +0 -0
- {memleaf-0.2.96 → memleaf-1.0.0}/src/memleaf/hermes_provider/_provider.py +0 -0
- {memleaf-0.2.96 → memleaf-1.0.0}/src/memleaf/hermes_provider/_shared.py +0 -0
- {memleaf-0.2.96 → memleaf-1.0.0}/src/memleaf/hermes_provider/evidence_budget.py +0 -0
- {memleaf-0.2.96 → memleaf-1.0.0}/src/memleaf/hermes_provider/provider_compatibility.py +0 -0
- {memleaf-0.2.96 → memleaf-1.0.0}/src/memleaf/hermes_runtime.py +0 -0
- {memleaf-0.2.96 → memleaf-1.0.0}/src/memleaf/historical_context.py +0 -0
- {memleaf-0.2.96 → memleaf-1.0.0}/src/memleaf/host_events.py +0 -0
- {memleaf-0.2.96 → memleaf-1.0.0}/src/memleaf/host_retention.py +0 -0
- {memleaf-0.2.96 → memleaf-1.0.0}/src/memleaf/host_runtime.py +0 -0
- {memleaf-0.2.96 → memleaf-1.0.0}/src/memleaf/host_turn_identity.py +0 -0
- {memleaf-0.2.96 → memleaf-1.0.0}/src/memleaf/inbox.py +0 -0
- {memleaf-0.2.96 → memleaf-1.0.0}/src/memleaf/incremental_commit.py +0 -0
- {memleaf-0.2.96 → memleaf-1.0.0}/src/memleaf/incremental_dates.py +0 -0
- {memleaf-0.2.96 → memleaf-1.0.0}/src/memleaf/incremental_execution.py +0 -0
- {memleaf-0.2.96 → memleaf-1.0.0}/src/memleaf/incremental_explicit.py +0 -0
- {memleaf-0.2.96 → memleaf-1.0.0}/src/memleaf/incremental_failed_recovery.py +0 -0
- {memleaf-0.2.96 → memleaf-1.0.0}/src/memleaf/incremental_journal.py +0 -0
- {memleaf-0.2.96 → memleaf-1.0.0}/src/memleaf/incremental_merge.py +0 -0
- {memleaf-0.2.96 → memleaf-1.0.0}/src/memleaf/incremental_native.py +0 -0
- {memleaf-0.2.96 → memleaf-1.0.0}/src/memleaf/incremental_partial.py +0 -0
- {memleaf-0.2.96 → memleaf-1.0.0}/src/memleaf/incremental_preview.py +0 -0
- {memleaf-0.2.96 → memleaf-1.0.0}/src/memleaf/incremental_prompts.py +0 -0
- {memleaf-0.2.96 → memleaf-1.0.0}/src/memleaf/incremental_protocol.py +0 -0
- {memleaf-0.2.96 → memleaf-1.0.0}/src/memleaf/incremental_recovery.py +0 -0
- {memleaf-0.2.96 → memleaf-1.0.0}/src/memleaf/incremental_run_state.py +0 -0
- {memleaf-0.2.96 → memleaf-1.0.0}/src/memleaf/incremental_runtime.py +0 -0
- {memleaf-0.2.96 → memleaf-1.0.0}/src/memleaf/incremental_scopes.py +0 -0
- {memleaf-0.2.96 → memleaf-1.0.0}/src/memleaf/incremental_selection.py +0 -0
- {memleaf-0.2.96 → memleaf-1.0.0}/src/memleaf/incremental_semantics.py +0 -0
- {memleaf-0.2.96 → memleaf-1.0.0}/src/memleaf/index.py +0 -0
- {memleaf-0.2.96 → memleaf-1.0.0}/src/memleaf/inspection.py +0 -0
- {memleaf-0.2.96 → memleaf-1.0.0}/src/memleaf/installer.py +0 -0
- {memleaf-0.2.96 → memleaf-1.0.0}/src/memleaf/legacy_update_journal.py +0 -0
- {memleaf-0.2.96 → memleaf-1.0.0}/src/memleaf/lifecycle_maintenance.py +0 -0
- {memleaf-0.2.96 → memleaf-1.0.0}/src/memleaf/llm/__init__.py +0 -0
- {memleaf-0.2.96 → memleaf-1.0.0}/src/memleaf/llm/base.py +0 -0
- {memleaf-0.2.96 → memleaf-1.0.0}/src/memleaf/llm/claude_compatible.py +0 -0
- {memleaf-0.2.96 → memleaf-1.0.0}/src/memleaf/llm/gemini.py +0 -0
- {memleaf-0.2.96 → memleaf-1.0.0}/src/memleaf/llm/openai_compatible.py +0 -0
- {memleaf-0.2.96 → memleaf-1.0.0}/src/memleaf/llm/router.py +0 -0
- {memleaf-0.2.96 → memleaf-1.0.0}/src/memleaf/llm/thinking.py +0 -0
- {memleaf-0.2.96 → memleaf-1.0.0}/src/memleaf/locking.py +0 -0
- {memleaf-0.2.96 → memleaf-1.0.0}/src/memleaf/mcp_server.py +0 -0
- {memleaf-0.2.96 → memleaf-1.0.0}/src/memleaf/memory_commit.py +0 -0
- {memleaf-0.2.96 → memleaf-1.0.0}/src/memleaf/memory_planner.py +0 -0
- {memleaf-0.2.96 → memleaf-1.0.0}/src/memleaf/memory_retraction.py +0 -0
- {memleaf-0.2.96 → memleaf-1.0.0}/src/memleaf/memory_update.py +0 -0
- {memleaf-0.2.96 → memleaf-1.0.0}/src/memleaf/memory_writer.py +0 -0
- {memleaf-0.2.96 → memleaf-1.0.0}/src/memleaf/migration.py +0 -0
- {memleaf-0.2.96 → memleaf-1.0.0}/src/memleaf/model_capabilities.py +0 -0
- {memleaf-0.2.96 → memleaf-1.0.0}/src/memleaf/model_discovery.py +0 -0
- {memleaf-0.2.96 → memleaf-1.0.0}/src/memleaf/model_execution.py +0 -0
- {memleaf-0.2.96 → memleaf-1.0.0}/src/memleaf/models.py +0 -0
- {memleaf-0.2.96 → memleaf-1.0.0}/src/memleaf/native_index.py +0 -0
- {memleaf-0.2.96 → memleaf-1.0.0}/src/memleaf/native_registration.py +0 -0
- {memleaf-0.2.96 → memleaf-1.0.0}/src/memleaf/parallel_model.py +0 -0
- {memleaf-0.2.96 → memleaf-1.0.0}/src/memleaf/planning_candidates.py +0 -0
- {memleaf-0.2.96 → memleaf-1.0.0}/src/memleaf/planning_context.py +0 -0
- {memleaf-0.2.96 → memleaf-1.0.0}/src/memleaf/process_common.py +0 -0
- {memleaf-0.2.96 → memleaf-1.0.0}/src/memleaf/process_jobs.py +0 -0
- {memleaf-0.2.96 → memleaf-1.0.0}/src/memleaf/process_journal.py +0 -0
- {memleaf-0.2.96 → memleaf-1.0.0}/src/memleaf/process_owner.py +0 -0
- {memleaf-0.2.96 → memleaf-1.0.0}/src/memleaf/processing.py +0 -0
- {memleaf-0.2.96 → memleaf-1.0.0}/src/memleaf/processing_route.py +0 -0
- {memleaf-0.2.96 → memleaf-1.0.0}/src/memleaf/prompts.py +0 -0
- {memleaf-0.2.96 → memleaf-1.0.0}/src/memleaf/provenance.py +0 -0
- {memleaf-0.2.96 → memleaf-1.0.0}/src/memleaf/provider_compatibility.py +0 -0
- {memleaf-0.2.96 → memleaf-1.0.0}/src/memleaf/query_clock.py +0 -0
- {memleaf-0.2.96 → memleaf-1.0.0}/src/memleaf/query_progress.py +0 -0
- {memleaf-0.2.96 → memleaf-1.0.0}/src/memleaf/query_scan.py +0 -0
- {memleaf-0.2.96 → memleaf-1.0.0}/src/memleaf/receipt_codec.py +0 -0
- {memleaf-0.2.96 → memleaf-1.0.0}/src/memleaf/recording_policy.py +0 -0
- {memleaf-0.2.96 → memleaf-1.0.0}/src/memleaf/redaction.py +0 -0
- {memleaf-0.2.96 → memleaf-1.0.0}/src/memleaf/remember_route.py +0 -0
- {memleaf-0.2.96 → memleaf-1.0.0}/src/memleaf/retention.py +0 -0
- {memleaf-0.2.96 → memleaf-1.0.0}/src/memleaf/retrieval.py +0 -0
- {memleaf-0.2.96 → memleaf-1.0.0}/src/memleaf/retrieval_gate.py +0 -0
- {memleaf-0.2.96 → memleaf-1.0.0}/src/memleaf/retrieval_lifecycle.py +0 -0
- {memleaf-0.2.96 → memleaf-1.0.0}/src/memleaf/runtime_retention.py +0 -0
- {memleaf-0.2.96 → memleaf-1.0.0}/src/memleaf/scope_maintenance.py +0 -0
- {memleaf-0.2.96 → memleaf-1.0.0}/src/memleaf/scope_state.py +0 -0
- {memleaf-0.2.96 → memleaf-1.0.0}/src/memleaf/semantic_maintenance.py +0 -0
- {memleaf-0.2.96 → memleaf-1.0.0}/src/memleaf/semantic_protocol.py +0 -0
- {memleaf-0.2.96 → memleaf-1.0.0}/src/memleaf/service.py +0 -0
- {memleaf-0.2.96 → memleaf-1.0.0}/src/memleaf/single_pass_memory_planner.py +0 -0
- {memleaf-0.2.96 → memleaf-1.0.0}/src/memleaf/single_pass_plan.py +0 -0
- {memleaf-0.2.96 → memleaf-1.0.0}/src/memleaf/source_policy.py +0 -0
- {memleaf-0.2.96 → memleaf-1.0.0}/src/memleaf/state_layout.py +0 -0
- {memleaf-0.2.96 → memleaf-1.0.0}/src/memleaf/subprocess_flags.py +0 -0
- {memleaf-0.2.96 → memleaf-1.0.0}/src/memleaf/summary_batch.py +0 -0
- {memleaf-0.2.96 → memleaf-1.0.0}/src/memleaf/target_reconciliation.py +0 -0
- {memleaf-0.2.96 → memleaf-1.0.0}/src/memleaf/turn_audit.py +0 -0
- {memleaf-0.2.96 → memleaf-1.0.0}/src/memleaf/turn_plan.py +0 -0
- {memleaf-0.2.96 → memleaf-1.0.0}/src/memleaf/update_coordinator.py +0 -0
- {memleaf-0.2.96 → memleaf-1.0.0}/src/memleaf/update_review.py +0 -0
- {memleaf-0.2.96 → memleaf-1.0.0}/src/memleaf/validation.py +0 -0
- {memleaf-0.2.96 → memleaf-1.0.0}/src/memleaf/vault.py +0 -0
- {memleaf-0.2.96 → memleaf-1.0.0}/src/memleaf.egg-info/dependency_links.txt +0 -0
- {memleaf-0.2.96 → memleaf-1.0.0}/src/memleaf.egg-info/entry_points.txt +0 -0
- {memleaf-0.2.96 → memleaf-1.0.0}/src/memleaf.egg-info/top_level.txt +0 -0
|
@@ -5,6 +5,28 @@ All notable changes to memleaf are documented here.
|
|
|
5
5
|
## Unreleased
|
|
6
6
|
|
|
7
7
|
|
|
8
|
+
## 1.0.0 — 2026-10-06
|
|
9
|
+
|
|
10
|
+
### Stable public interfaces and production-only distributions
|
|
11
|
+
|
|
12
|
+
- Define the 1.x compatibility scope for documented Python exports, CLI entry
|
|
13
|
+
points, MCP tools, configuration and persisted memory formats. Preserve the
|
|
14
|
+
0.2.96 production runtime, prompts, existing storage/recovery contracts and
|
|
15
|
+
five-request budget; no model request or Vault migration is added.
|
|
16
|
+
- Move the isolated acceptance harness, synthetic acceptance suite and query
|
|
17
|
+
benchmark into the ignored local development directory. Remove the former
|
|
18
|
+
`python -m memleaf.acceptance` developer entry point from public artifacts;
|
|
19
|
+
normal Python/CLI/MCP interfaces and usage/discovery examples remain.
|
|
20
|
+
- Remove obsolete packaged-tool instructions and prevent developer/private files
|
|
21
|
+
from re-entering wheel or source distributions through the release CI. Keep
|
|
22
|
+
the existing five-cell native installation matrix and publish verified bytes.
|
|
23
|
+
- The 0.2.96 installed Hermes acceptance remains evidence for the unchanged
|
|
24
|
+
production runtime: four successful turns, eight Memleaf requests and 42,518
|
|
25
|
+
observed tokens. The 1.0.0 release verifies interface compatibility, isolated
|
|
26
|
+
installed regressions and clean artifact payloads separately; a stable version
|
|
27
|
+
is not a guarantee of perfect future model responses.
|
|
28
|
+
|
|
29
|
+
|
|
8
30
|
## 0.2.96 — 2026-10-06
|
|
9
31
|
|
|
10
32
|
### Preserve existing information when replacing memory bodies
|
|
@@ -5,9 +5,8 @@ include install.ps1
|
|
|
5
5
|
include README.md
|
|
6
6
|
include README.en.md
|
|
7
7
|
recursive-include examples *.md *.ndjson *.py
|
|
8
|
-
recursive-exclude examples *_acceptance.py
|
|
8
|
+
recursive-exclude examples *_acceptance.py query_benchmark.py incremental_acceptance.json
|
|
9
9
|
prune tests
|
|
10
|
+
prune tests_public
|
|
10
11
|
|
|
11
12
|
include docs/*.md
|
|
12
|
-
|
|
13
|
-
include examples/incremental_acceptance.json
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: memleaf
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 1.0.0
|
|
4
4
|
Summary: A local-first Markdown memory core for AI agents
|
|
5
5
|
Author: memleaf contributors
|
|
6
6
|
License-Expression: MIT
|
|
7
7
|
Keywords: ai-agents,local-first,markdown,memory
|
|
8
|
+
Classifier: Development Status :: 5 - Production/Stable
|
|
8
9
|
Classifier: Intended Audience :: Developers
|
|
9
10
|
Classifier: Programming Language :: Python :: 3
|
|
10
11
|
Classifier: Programming Language :: Python :: 3 :: Only
|
|
@@ -23,7 +24,7 @@ Dynamic: license-file
|
|
|
23
24
|
|
|
24
25
|
[English](README.en.md) · [PyPI](https://pypi.org/project/memleaf/) · [GitHub](https://github.com/miffyblueboo/memleaf)
|
|
25
26
|
|
|
26
|
-
>
|
|
27
|
+
> **稳定版:1.0.0。** 公开接口进入稳定维护,版本与兼容范围见[稳定性约定](docs/stability.md)。
|
|
27
28
|
> 自动提炼和复核共用同一条“未来记忆价值”标准:模型综合未来复用、信息增量、再次读取时的直接可用性和忘记成本,只保留对未来理解、判断或行动有实质影响的最小核心;没有明确价值的信息不提炼,不按具体业务场景硬编码排除。
|
|
28
29
|
> 提炼先比较旧事项中的编号、目标、进展、责任和期限;补全未知信息也应维护原事项,另建独立待办不能替代项目事实更新。确认重复的记忆在现有处理请求中合并,保留历史与来源;项目和独立任务保持各自生命周期,Core 不按标题强行合并。
|
|
29
30
|
> 新请求兼容等价的字段表示;未知执行人保持 `null`,新增或变更负责人和期限需要真实来源;等待条件在正文维护,不再提炼 `waiting_on`。行动及相关字段经过有界语义复核,提炼与复核共用每份工作的最多五次模型请求额度,成功即停止;复核失败不写入。来源时间用于解析相对日期,不补造事实日期。
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
[中文](README.md) · [PyPI](https://pypi.org/project/memleaf/) · [GitHub](https://github.com/miffyblueboo/memleaf)
|
|
6
6
|
|
|
7
|
-
> **
|
|
7
|
+
> **Stable release: 1.0.0.** Public interfaces enter stable maintenance; see the [stability policy](docs/stability.md) for versioning and compatibility scope.
|
|
8
8
|
> Automatic extraction and review share one future-value standard: the model weighs likely reuse, information gain, direct usability when read again, and the cost of forgetting. It keeps only the smallest core that can materially help future understanding, decisions, or actions; information without clear value is not extracted, and no business-specific exclusion rule is hard-coded.
|
|
9
9
|
> Extraction compares existing identifiers, objectives, progress, responsibility and deadlines first. Filling an unknown also maintains the original item; a separate task does not replace updating shared project facts. Confirmed duplicates can be merged in the existing processing requests with their sources and history preserved. Independent project and task lifecycles remain separate; Core does not merge matching titles.
|
|
10
10
|
> New requests accept equivalent field representations. Unknown executors remain `null`; new or changed responsibility and deadlines require actual source evidence. Dependencies belong in the body; `waiting_on` is no longer extracted. Proposed actions and related fields undergo bounded semantic verification within a shared five-request limit per work item, stopping on success; failed verification blocks writes. Source time resolves relative dates without inventing factual dates.
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
[English](README.en.md) · [PyPI](https://pypi.org/project/memleaf/) · [GitHub](https://github.com/miffyblueboo/memleaf)
|
|
6
6
|
|
|
7
|
-
>
|
|
7
|
+
> **稳定版:1.0.0。** 公开接口进入稳定维护,版本与兼容范围见[稳定性约定](docs/stability.md)。
|
|
8
8
|
> 自动提炼和复核共用同一条“未来记忆价值”标准:模型综合未来复用、信息增量、再次读取时的直接可用性和忘记成本,只保留对未来理解、判断或行动有实质影响的最小核心;没有明确价值的信息不提炼,不按具体业务场景硬编码排除。
|
|
9
9
|
> 提炼先比较旧事项中的编号、目标、进展、责任和期限;补全未知信息也应维护原事项,另建独立待办不能替代项目事实更新。确认重复的记忆在现有处理请求中合并,保留历史与来源;项目和独立任务保持各自生命周期,Core 不按标题强行合并。
|
|
10
10
|
> 新请求兼容等价的字段表示;未知执行人保持 `null`,新增或变更负责人和期限需要真实来源;等待条件在正文维护,不再提炼 `waiting_on`。行动及相关字段经过有界语义复核,提炼与复核共用每份工作的最多五次模型请求额度,成功即停止;复核失败不写入。来源时间用于解析相对日期,不补造事实日期。
|
|
@@ -24,7 +24,7 @@ the suite count or from module-name references.
|
|
|
24
24
|
|
|
25
25
|
## Current route semantics
|
|
26
26
|
|
|
27
|
-
The
|
|
27
|
+
The supported runtime has one processing engine: incremental. New Vaults default
|
|
28
28
|
both `process.automatic_pipeline` and `process.remember_pipeline` to
|
|
29
29
|
`incremental`. A retained `legacy` value from an older Vault is not executable;
|
|
30
30
|
migration preflight reports it as `legacy_pipeline_configuration`, and runtime
|
|
@@ -38,23 +38,17 @@ preflight result.
|
|
|
38
38
|
|
|
39
39
|
## Preparation with no paid calls
|
|
40
40
|
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
is
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
count, repetitions, normalized suite hash, prompt hash and request bounds from
|
|
53
|
-
this command on the selected candidate; do not inherit numbers from an older
|
|
54
|
-
report. Also record the original suite file SHA-256: it is not the normalized
|
|
55
|
-
semantic suite hash. The reported bound is not a spending authorization. A private
|
|
56
|
-
held-out suite requires its own provenance, permission and count. Merely adding
|
|
57
|
-
a label `holdout` does not prove the examples were unseen in tuning.
|
|
41
|
+
Acceptance runners and synthetic fixtures are local development tools, not
|
|
42
|
+
entry points shipped with an installed package. Use a controlled development
|
|
43
|
+
checkout to plan the approved suite without constructing a model, loading
|
|
44
|
+
credentials or opening a production Vault. Record the suite file and normalized
|
|
45
|
+
hashes, prompt hash, repetitions and request bound from that exact checkout.
|
|
46
|
+
|
|
47
|
+
`process --dry-run` is a product processing preview and may call the configured
|
|
48
|
+
model. It is not a free substitute for local acceptance planning. A request bound
|
|
49
|
+
is not a spending authorization; a private held-out suite also needs provenance
|
|
50
|
+
and explicit data/route permission. A `holdout` label alone proves nothing about
|
|
51
|
+
whether those examples were used in development.
|
|
58
52
|
|
|
59
53
|
Do not execute until the actual route/model, local credential reference, suite
|
|
60
54
|
hash, repeats and total allowance are approved. Keep credentials local. Do not
|
|
@@ -46,14 +46,11 @@ Do not return API keys, tokens, authentication headers, credential-bearing URLs,
|
|
|
46
46
|
full configuration, chat bodies, native-memory text or backups. Keep raw paths
|
|
47
47
|
and necessary private fingerprints in local evidence rather than public CI.
|
|
48
48
|
|
|
49
|
-
|
|
49
|
+
Acceptance planning uses the exact candidate Python, locally retained tooling and approved
|
|
50
|
+
fixtures. Neither the runner nor its suite is included in an installed package;
|
|
51
|
+
do not construct a production runtime to replace a missing development tool.
|
|
50
52
|
|
|
51
|
-
|
|
52
|
-
python -m memleaf.acceptance --suite examples/incremental_acceptance.json --repeat 5
|
|
53
|
-
```
|
|
54
|
-
|
|
55
|
-
The suite path must point to the selected checkout; an installed wheel alone need
|
|
56
|
-
not place `examples/` in the current directory. Planning accepts no backend,
|
|
53
|
+
The suite path must point to the controlled local development checkout. Planning accepts no backend,
|
|
57
54
|
output or execution flags. Save stdout by the caller into the evidence directory,
|
|
58
55
|
not with the tool's `--output` option, which belongs to execution. Record both
|
|
59
56
|
file SHA-256 and the normalized suite digest in the result. This planning command
|
|
@@ -11,12 +11,15 @@ The build job:
|
|
|
11
11
|
|
|
12
12
|
1. compiles `src/` with Python's standard-library compiler;
|
|
13
13
|
2. builds one wheel and one source distribution;
|
|
14
|
-
3.
|
|
14
|
+
3. rejects development harnesses, tests, private runtime directories and local
|
|
15
|
+
environment files in either artifact;
|
|
16
|
+
4. uploads only those two distributions as the workflow artifact.
|
|
15
17
|
|
|
16
18
|
The `verify-artifacts` job downloads those exact bytes and installs each artifact
|
|
17
19
|
in its own fresh virtual environment. It imports `memleaf` and checks the
|
|
18
20
|
reported package version. It does not read a source-tree checkout, run a model,
|
|
19
|
-
access a production Vault or create a release.
|
|
21
|
+
access a production Vault or create a release. The former developer-only
|
|
22
|
+
`memleaf.acceptance` module must not be importable from either installation.
|
|
20
23
|
|
|
21
24
|
The matrix is:
|
|
22
25
|
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
# Processing quality and release checks
|
|
2
|
+
|
|
3
|
+
Memleaf uses the incremental capture, planner, compiler, review and commit path.
|
|
4
|
+
Extraction, review and eligible maintenance share each work item's durable
|
|
5
|
+
five-request budget. A successful result stops further extraction requests;
|
|
6
|
+
missing support remains unknown or unresolved rather than being invented.
|
|
7
|
+
|
|
8
|
+
## Separate kinds of evidence
|
|
9
|
+
|
|
10
|
+
- Deterministic checks verify source binding, identity, permissions, state,
|
|
11
|
+
recovery and request accounting without external model calls.
|
|
12
|
+
- Source-based review of actual retained memories verifies whether useful facts
|
|
13
|
+
were kept, unchanged requirements survived updates and independent matters
|
|
14
|
+
stayed independent. A JSON or schema pass alone is insufficient.
|
|
15
|
+
- Real-host acceptance verifies the loaded Core/Provider, actual session model,
|
|
16
|
+
capture and background processing through the installed host.
|
|
17
|
+
- Artifact CI verifies source syntax, clean distribution payloads and native
|
|
18
|
+
wheel/sdist installation. It does not establish model quality.
|
|
19
|
+
|
|
20
|
+
Development acceptance runners, synthetic fixtures, benchmarks and private
|
|
21
|
+
reports are retained locally and are not shipped as package modules, examples
|
|
22
|
+
or user-facing diagnostic tools. The normal runtime APIs and configuration are
|
|
23
|
+
used for supported product operations.
|
|
24
|
+
|
|
25
|
+
Real model acceptance records the actual route, all attempted runs, request
|
|
26
|
+
counts and obtainable usage metrics. Scripted replay is reported separately.
|
|
27
|
+
Unknown usage remains unknown; failed attempts are not relabelled as passing
|
|
28
|
+
checks. Normal `process --dry-run` may call the configured model and must not be
|
|
29
|
+
used as a free development preview.
|
|
30
|
+
|
|
31
|
+
See the [evidence guide](acceptance-evidence-guide.md),
|
|
32
|
+
[installed artifact checks](installed-artifact-verification.md) and
|
|
33
|
+
[stability policy](stability.md).
|
|
@@ -39,12 +39,11 @@ snapshot nor claimed to be eliminated.
|
|
|
39
39
|
|
|
40
40
|
## Reproduce an isolated local measurement
|
|
41
41
|
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
```
|
|
42
|
+
The isolated benchmark is retained only in the local development directory.
|
|
43
|
+
It is not distributed as an example or installed package tool. A measurement
|
|
44
|
+
must record the exact source or installed artifact being imported.
|
|
46
45
|
|
|
47
|
-
The
|
|
46
|
+
The local runner accepts sizes/repetitions only, not a production Vault, model config
|
|
48
47
|
or credentials. Each size uses a fresh TemporaryDirectory, 1..10,000 synthetic
|
|
49
48
|
independent Todo heads, and a fixed source clock. Fixture creation is outside the
|
|
50
49
|
timed section and does not rebuild an index for each inserted file. One warmup is
|
|
@@ -86,9 +85,9 @@ unchanged recheck parsing fell from N to zero. No business records were omitted
|
|
|
86
85
|
to improve latency. At 10,000 heads the fixture contains 7,550,000 bytes; it is not
|
|
87
86
|
a sample of private user conversations or an actual production Vault.
|
|
88
87
|
|
|
89
|
-
The harness is
|
|
90
|
-
|
|
91
|
-
|
|
88
|
+
The harness is excluded from both wheel and sdist. Local runs against an
|
|
89
|
+
installed wheel must use that wheel's imports, not an editable checkout.
|
|
90
|
+
The measurements do not cover provider latency, tokens, recall/semantic
|
|
92
91
|
quality, native Hermes installation or Windows/macOS performance. Those remain
|
|
93
92
|
separate G5 acceptance gates; successful timings never authorize switching.
|
|
94
93
|
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
# Memleaf 1.x stability policy
|
|
2
|
+
|
|
3
|
+
Memleaf 1.0.0 begins stable maintenance of its documented public interfaces.
|
|
4
|
+
Version numbers follow [Semantic Versioning](https://semver.org/): compatible
|
|
5
|
+
fixes use a patch release, compatible additions use a minor release, and
|
|
6
|
+
incompatible public API changes require a new major version. Stable maintenance
|
|
7
|
+
does not imply that every future conversation or model response will be correct.
|
|
8
|
+
|
|
9
|
+
## Public interfaces
|
|
10
|
+
|
|
11
|
+
The compatibility scope consists of:
|
|
12
|
+
|
|
13
|
+
- The names exported by `memleaf.__all__`, their documented constructors and
|
|
14
|
+
functions, and the documented public methods of `Memleaf`, `Core`,
|
|
15
|
+
`MemoryService`, `Memory` and `Vault`.
|
|
16
|
+
- The `memleaf`, `memleaf-mcp` and `memleaf-mcpw` entry points, documented CLI
|
|
17
|
+
commands and options, and their documented JSON fields and error codes.
|
|
18
|
+
- The published MCP tool names, accepted parameters and documented result
|
|
19
|
+
fields. Clients should tolerate additional optional fields.
|
|
20
|
+
- Documented configuration keys and the Markdown/frontmatter memory format.
|
|
21
|
+
Existing committed memories and persistent recovery state must retain their
|
|
22
|
+
identity, provenance and interpretation across compatible upgrades. Any
|
|
23
|
+
required migration must be documented before it is applied.
|
|
24
|
+
|
|
25
|
+
Module internals, names beginning with `_`, internal planner/reviewer protocols,
|
|
26
|
+
development harnesses and exact natural-language model wording are outside this
|
|
27
|
+
scope. An internal protocol change may fence pending model responses and require
|
|
28
|
+
an explicit recovery action; it must not silently reinterpret saved work, erase
|
|
29
|
+
unresolved outcomes or reset consumed request budgets.
|
|
30
|
+
|
|
31
|
+
## Upgrade to 1.0.0
|
|
32
|
+
|
|
33
|
+
The 1.0.0 runtime preserves the 0.2.96 production interfaces, configuration,
|
|
34
|
+
storage formats, prompts and five-request limit. It requires no new model calls
|
|
35
|
+
or Vault migration from 0.2.96. Earlier unsupported pipeline settings and pending
|
|
36
|
+
work retain their existing migration/recovery requirements; the version number
|
|
37
|
+
does not mark them complete.
|
|
38
|
+
|
|
39
|
+
Update Core and the copied Hermes Provider together through `memleaf install`,
|
|
40
|
+
then restart Hermes to load the installed files. The existing build/protocol
|
|
41
|
+
compatibility checks still apply. Codex connections must reconnect or restart
|
|
42
|
+
their MCP process after an upgrade.
|
|
43
|
+
|
|
44
|
+
The former `memleaf.acceptance` module, synthetic acceptance suite and query
|
|
45
|
+
benchmark are development tools. They are removed from the public package and
|
|
46
|
+
repository in 1.0.0 and retained only in the local development directory. Normal
|
|
47
|
+
usage examples, MCP discovery examples and artifact verification in CI remain.
|
|
48
|
+
|
|
49
|
+
## Release evidence
|
|
50
|
+
|
|
51
|
+
Each release builds one wheel and source distribution, verifies their payloads
|
|
52
|
+
and installs those same artifacts on the existing native CI matrix before
|
|
53
|
+
publishing. Local regressions and real-host/model acceptance are separate gates:
|
|
54
|
+
green installation checks do not prove model semantics, and a successful host
|
|
55
|
+
conversation does not replace package verification. Development tests and private
|
|
56
|
+
acceptance reports are kept outside the public source and distributions.
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "memleaf"
|
|
7
|
-
version = "0.
|
|
7
|
+
version = "1.0.0"
|
|
8
8
|
description = "A local-first Markdown memory core for AI agents"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.11"
|
|
@@ -13,6 +13,7 @@ license-files = ["LICENSE"]
|
|
|
13
13
|
authors = [{name = "memleaf contributors"}]
|
|
14
14
|
keywords = ["ai-agents", "local-first", "markdown", "memory"]
|
|
15
15
|
classifiers = [
|
|
16
|
+
"Development Status :: 5 - Production/Stable",
|
|
16
17
|
"Intended Audience :: Developers",
|
|
17
18
|
"Programming Language :: Python :: 3",
|
|
18
19
|
"Programming Language :: Python :: 3 :: Only",
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"""Local-first Markdown memory core for AI agents."""
|
|
2
2
|
|
|
3
|
-
__version__ = "0.
|
|
3
|
+
__version__ = "1.0.0"
|
|
4
4
|
|
|
5
5
|
from .config import DEFAULT_CONFIG, default_config, load_config, save_config
|
|
6
6
|
from .frontmatter import FrontmatterError, dump_frontmatter, dump_yaml, load_yaml, parse_frontmatter
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: memleaf
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 1.0.0
|
|
4
4
|
Summary: A local-first Markdown memory core for AI agents
|
|
5
5
|
Author: memleaf contributors
|
|
6
6
|
License-Expression: MIT
|
|
7
7
|
Keywords: ai-agents,local-first,markdown,memory
|
|
8
|
+
Classifier: Development Status :: 5 - Production/Stable
|
|
8
9
|
Classifier: Intended Audience :: Developers
|
|
9
10
|
Classifier: Programming Language :: Python :: 3
|
|
10
11
|
Classifier: Programming Language :: Python :: 3 :: Only
|
|
@@ -23,7 +24,7 @@ Dynamic: license-file
|
|
|
23
24
|
|
|
24
25
|
[English](README.en.md) · [PyPI](https://pypi.org/project/memleaf/) · [GitHub](https://github.com/miffyblueboo/memleaf)
|
|
25
26
|
|
|
26
|
-
>
|
|
27
|
+
> **稳定版:1.0.0。** 公开接口进入稳定维护,版本与兼容范围见[稳定性约定](docs/stability.md)。
|
|
27
28
|
> 自动提炼和复核共用同一条“未来记忆价值”标准:模型综合未来复用、信息增量、再次读取时的直接可用性和忘记成本,只保留对未来理解、判断或行动有实质影响的最小核心;没有明确价值的信息不提炼,不按具体业务场景硬编码排除。
|
|
28
29
|
> 提炼先比较旧事项中的编号、目标、进展、责任和期限;补全未知信息也应维护原事项,另建独立待办不能替代项目事实更新。确认重复的记忆在现有处理请求中合并,保留历史与来源;项目和独立任务保持各自生命周期,Core 不按标题强行合并。
|
|
29
30
|
> 新请求兼容等价的字段表示;未知执行人保持 `null`,新增或变更负责人和期限需要真实来源;等待条件在正文维护,不再提炼 `waiting_on`。行动及相关字段经过有界语义复核,提炼与复核共用每份工作的最多五次模型请求额度,成功即停止;复核失败不写入。来源时间用于解析相对日期,不补造事实日期。
|
|
@@ -44,15 +44,13 @@ docs/remember-incremental-route.md
|
|
|
44
44
|
docs/runtime-state-retention.md
|
|
45
45
|
docs/semantic-extraction-protocol.md
|
|
46
46
|
docs/source-work-contract.md
|
|
47
|
+
docs/stability.md
|
|
47
48
|
docs/v0.2.26-processing-status.md
|
|
48
49
|
examples/README.md
|
|
49
50
|
examples/basic_usage.py
|
|
50
|
-
examples/incremental_acceptance.json
|
|
51
51
|
examples/mcp_stdio.ndjson
|
|
52
|
-
examples/query_benchmark.py
|
|
53
52
|
src/memleaf/__init__.py
|
|
54
53
|
src/memleaf/__main__.py
|
|
55
|
-
src/memleaf/acceptance.py
|
|
56
54
|
src/memleaf/admission.py
|
|
57
55
|
src/memleaf/batch_review.py
|
|
58
56
|
src/memleaf/body_preservation.py
|
|
@@ -1,189 +0,0 @@
|
|
|
1
|
-
# Incremental processing acceptance (G5a tooling; not production activation)
|
|
2
|
-
|
|
3
|
-
Acceptance separates semantic quality, deterministic maintenance and coverage.
|
|
4
|
-
The online candidate path uses one incremental planner and at most two durable
|
|
5
|
-
request reservations per source/authorization work. It does not retain the old
|
|
6
|
-
Gate -> summary -> semantic-review tail as an acceptance requirement. Legacy
|
|
7
|
-
routes remain available for compatibility and deliberately stay the default
|
|
8
|
-
until separately authorized migration. The public repository keeps deterministic
|
|
9
|
-
test inputs and test code outside the tracked source tree. CI validates source
|
|
10
|
-
syntax and installed package artifacts; a green CI is not live-model acceptance.
|
|
11
|
-
|
|
12
|
-
## What runs, and what does not
|
|
13
|
-
|
|
14
|
-
`python -m memleaf.acceptance` is an offline acceptance utility, not a new online
|
|
15
|
-
planner, writer, plugin framework, daemon or MCP tool. It uses the real capture,
|
|
16
|
-
incremental runner/compiler, two-request Core budget and shared commit/recovery.
|
|
17
|
-
It creates fresh isolated Vaults for each case/repetition. No production Vault
|
|
18
|
-
argument, automatic installation, process termination, restore or pipeline
|
|
19
|
-
activation is provided. The fixed main prompt is unchanged.
|
|
20
|
-
|
|
21
|
-
The bundled `examples/incremental_acceptance.json` contains twelve **synthetic
|
|
22
|
-
public regression** trajectories, eighteen turns in total. They cover same-ID
|
|
23
|
-
completion/repetition, transient instructions, unsupported assistant preferences,
|
|
24
|
-
responsibility transfer, deadline preservation/cancellation/late observation,
|
|
25
|
-
independent projects, unknown attribution, observation dates, relative deadlines,
|
|
26
|
-
fact retraction, an independent new cycle and an independent late task. They are
|
|
27
|
-
not private incident reconstructions or a hidden holdout set. A private holdout
|
|
28
|
-
can use the same schema; labelling a case `holdout` does not prove it was never
|
|
29
|
-
used to tune prompts. Preserve that provenance outside the candidate's input.
|
|
30
|
-
|
|
31
|
-
Each JSON case has:
|
|
32
|
-
|
|
33
|
-
- `id`, `split` (`regression|holdout`) and a nonempty `semantic_checks` checklist;
|
|
34
|
-
- optional `initial_memories` with fixed IDs and ordinary Core memory fields;
|
|
35
|
-
- `turns` containing an `id`, original user/assistant `messages`, optional exact
|
|
36
|
-
write `scope`, and optional deterministic `expected` assertions.
|
|
37
|
-
|
|
38
|
-
Messages retain their roles, optional source time/sequence/ID, and explicit
|
|
39
|
-
assistant `final:true`. This fixture format requires one complete visible pair;
|
|
40
|
-
it does not fabricate an assistant or turn arbitrary tool logs into user input.
|
|
41
|
-
It deliberately does not implement a general source revision/fault-injection DSL.
|
|
42
|
-
Those deterministic paths, native sharing, selected/text remember, Forget,
|
|
43
|
-
background processes and migration remain covered by their existing public tests
|
|
44
|
-
and final native-host acceptance, not implicitly by these twelve fixtures.
|
|
45
|
-
|
|
46
|
-
Assertions support count, required/forbidden structural field subsets,
|
|
47
|
-
`same_ids_as` (zero-based earlier turn), maximum calls, execution status and
|
|
48
|
-
coverage status. They do not perform title/body keyword grading or demand exact
|
|
49
|
-
natural-language answers. Titles and bodies are retained for independent review.
|
|
50
|
-
Two tasks can share a reasonable title; only the actual identity/state constraints
|
|
51
|
-
matter. Checklists and expected assertions are **never included in a model input**.
|
|
52
|
-
|
|
53
|
-
## Plan first: no models, credentials or Vaults
|
|
54
|
-
|
|
55
|
-
```sh
|
|
56
|
-
python -m memleaf.acceptance \
|
|
57
|
-
--suite examples/incremental_acceptance.json --repeat 5
|
|
58
|
-
```
|
|
59
|
-
|
|
60
|
-
This reads/validates the suite and reports its SHA-256, prompt SHA-256/byte count,
|
|
61
|
-
case count, repeat count and request upper bounds. It does not initialize a Vault,
|
|
62
|
-
read a backend configuration or create output files. Twelve cases repeated five
|
|
63
|
-
times mean sixty independent case runs and ninety normal turn requests; the
|
|
64
|
-
absolute bound including a possible second dispatch is 180. The bound is not a
|
|
65
|
-
price quote or prediction that every turn will need recovery. A smaller explicit
|
|
66
|
-
cap is allowed; results then disclose unexecuted cases/steps instead of reporting
|
|
67
|
-
full completion. One final case stopped halfway is incomplete too.
|
|
68
|
-
|
|
69
|
-
## Explicit live execution, same configured route
|
|
70
|
-
|
|
71
|
-
```sh
|
|
72
|
-
python -m memleaf.acceptance \
|
|
73
|
-
--suite /private/approved-suite.json --repeat 5 \
|
|
74
|
-
--execute --authorize-model \
|
|
75
|
-
--backend-config /private/model-config.yaml \
|
|
76
|
-
--max-requests 180 --output /private/new-acceptance-run
|
|
77
|
-
```
|
|
78
|
-
|
|
79
|
-
All execution options are required. The backend configuration uses the existing
|
|
80
|
-
Memleaf format; only its `llm` settings are given to the existing ModelRouter.
|
|
81
|
-
The configured Vault, native note paths and host installations are never opened
|
|
82
|
-
by this utility. Choose the actually deployed DeepSeek Flash route and its
|
|
83
|
-
existing endpoint; the utility does not invent a model alias, change models to
|
|
84
|
-
make a test pass, or fall back to a host callback. CLI execution requires
|
|
85
|
-
`llm.thinking.single_pass: disabled` and a fixed single-dispatch API backend.
|
|
86
|
-
Requiring that setting does not prove the service honors it: applied controls
|
|
87
|
-
and observed reasoning statistics are reported separately when available.
|
|
88
|
-
|
|
89
|
-
The target directory must be new, with an existing parent. This is a fresh test
|
|
90
|
-
authorization, not a retry of a former acceptance run. Existing output is rejected
|
|
91
|
-
rather than clearing its request counter. The runner has no automatic resume or
|
|
92
|
-
transport-retry loop: a saved, interrupted trial remains a trial needing review;
|
|
93
|
-
starting a new output directory is a new expressly authorized test expense.
|
|
94
|
-
The Core's bounded invalid-response retry still counts toward both limits.
|
|
95
|
-
Partial semantic replan is not silently added to the regression run. Authentication,
|
|
96
|
-
configuration and transport failures stop the suite with a bounded reason; later
|
|
97
|
-
cases do not repeatedly consume the same broken route. Invalid model content is
|
|
98
|
-
retained as a failed trial rather than hidden by selecting a successful repeat.
|
|
99
|
-
|
|
100
|
-
Before each backend dispatch the runner persists one reservation in
|
|
101
|
-
`requests.json`; it cannot exceed `max_requests` even when the Core requests its
|
|
102
|
-
second attempt. A process dying after reservation may waste a slot. A network
|
|
103
|
-
failure may have reached the provider. Reservation counts are not exact charges.
|
|
104
|
-
Repeated trials use independent Vaults and empty control state, not a cached
|
|
105
|
-
successful response or an earlier repetition's memories.
|
|
106
|
-
|
|
107
|
-
Limits: 2 MiB suite, 64 cases, 128 total turns, 32 turns per case, 20 repetitions,
|
|
108
|
-
2048 dispatch reservations, and the existing Core input/output size bounds.
|
|
109
|
-
Exceeding a limit fails visibly or stops at the requested cap. Necessary input is
|
|
110
|
-
not truncated to manufacture passing results. Cases sharing a source sequence or
|
|
111
|
-
message identity without a distinct supported revision are invalid fixtures,
|
|
112
|
-
not evidence of a runtime regression.
|
|
113
|
-
|
|
114
|
-
## Output, privacy and measurements
|
|
115
|
-
|
|
116
|
-
The root and case directories are created private (0700, where supported), with
|
|
117
|
-
JSON files written 0600. Windows ACL behavior needs native verification. These
|
|
118
|
-
modes are not encryption. Output contains source text and generated memories;
|
|
119
|
-
do not attach a real run to a public issue or commit it. Tests in this batch use
|
|
120
|
-
only synthetic fixtures and local backends.
|
|
121
|
-
|
|
122
|
-
- `suite.json` freezes the input and independent review checklist.
|
|
123
|
-
- `report.json` contains safe per-step structural checks, runtime implementation
|
|
124
|
-
fingerprint, requested model identity, case split, prompt/suite hashes and
|
|
125
|
-
timings. It always returns `switch_authorized:false`.
|
|
126
|
-
- `requests.json` records reservation/outcome, input/output byte lengths and
|
|
127
|
-
hashes, available token/cache counts and known thinking-control observations.
|
|
128
|
-
The configured OpenAI-compatible adapter exposes the returned model label when
|
|
129
|
-
the response supplies a valid bounded label. Missing values stay unknown.
|
|
130
|
-
- Private `traces/` retain the exact prepared prompt and visible completion text,
|
|
131
|
-
not HTTP headers, credentials or hidden reasoning fields. Oversized completions
|
|
132
|
-
are represented by length/hash and an explicit omission, not a truncated valid
|
|
133
|
-
response. Failed-response payloads unavailable through the normal adapter stay
|
|
134
|
-
unavailable; the harness does not bypass it to capture reasoning or raw errors.
|
|
135
|
-
- Each case's `observations.json` retains current heads, original execution/commit
|
|
136
|
-
results and the independent semantic checklist. This can be compared with its
|
|
137
|
-
sources and raw visible responses without another evaluation-model call.
|
|
138
|
-
|
|
139
|
-
Ordinary runtime metrics are not broadened into plaintext logging. Trace retention
|
|
140
|
-
exists only within this expressly requested private acceptance output. Missing
|
|
141
|
-
or broken metric collection does not turn a valid completion into a failed model
|
|
142
|
-
request. A trace/journal write failure can leave partial data and a reserved or
|
|
143
|
-
returned attempt; it must not be interpreted as zero cost or zero writes.
|
|
144
|
-
|
|
145
|
-
`backend_reservations` is confirmed entry into the metered backend boundary;
|
|
146
|
-
`confirmed_responses` counts returned calls. Actual provider execution is unknown
|
|
147
|
-
for an interrupted/error call. Requested and returned model labels are distinct.
|
|
148
|
-
Endpoint identity is a SHA-256 fingerprint, never a URL containing credentials.
|
|
149
|
-
`duration_seconds` is wall time for the observed backend/step, not provider-only
|
|
150
|
-
inference time. Detailed stage timing/performance remains a separate measurement.
|
|
151
|
-
|
|
152
|
-
## Separate acceptance gates
|
|
153
|
-
|
|
154
|
-
The [installed artifact verification](installed-artifact-verification.md) gate
|
|
155
|
-
runs the complete inventory from wheel and sdist in isolated native environments.
|
|
156
|
-
Its OS matrix and explicit import/skip checks strengthen gate 1, not gates 2 or 4.
|
|
157
|
-
A workflow definition alone is not a passed native run; retain the per-commit
|
|
158
|
-
reports and keep actual Hermes installation and live semantics separate.
|
|
159
|
-
|
|
160
|
-
1. **Artifact consistency.** Build the wheel and sdist once, then install both
|
|
161
|
-
exact artifacts in isolated native environments and verify package imports.
|
|
162
|
-
This does not replace semantic review or live host acceptance.
|
|
163
|
-
2. **Live semantic judgement.** A structurally passing live run still records
|
|
164
|
-
`semantic_status:not_reviewed`. Review each repetition against its own source
|
|
165
|
-
and checklist: future value, non-invention, correct subject/scope, independent
|
|
166
|
-
topics, responsibility, deadline meaning, same-item maintenance and omissions.
|
|
167
|
-
Good paraphrases are accepted. Evaluate correctness, not similarity to an
|
|
168
|
-
example sentence. No second online or offline grading model is invoked.
|
|
169
|
-
3. **Coverage convergence.** Report complete/partial, committed operations,
|
|
170
|
-
NO_MEMORY and unresolved reasons separately. Complete coverage is not evidence
|
|
171
|
-
that every meaningful subtopic was extracted. An expected blocked result can
|
|
172
|
-
pass its structural check without counting as successful business extraction.
|
|
173
|
-
4. **Host, platform and migration.** Real Hermes capture/installed Provider,
|
|
174
|
-
Windows/macOS process behavior, existing Codex compatibility, stopped writers,
|
|
175
|
-
verified private backup, latest Forget evidence and authorized activation
|
|
176
|
-
remain external gates. No stub replay grants a production switch.
|
|
177
|
-
|
|
178
|
-
Retain all attempted repetitions, including errors and budget stops; never choose
|
|
179
|
-
only one successful seed. Five repeats are a starting point for observing
|
|
180
|
-
variation, not a reliability percentage. The public twelve-case set does not
|
|
181
|
-
replace the private A-I incidents, E01-E20 applicable paths, reverse cases, or a
|
|
182
|
-
held-out set. Compare the actual production baseline and the candidate under the
|
|
183
|
-
same source and route; do not rerun all historic prompts by default.
|
|
184
|
-
|
|
185
|
-
The fixed-oracle programmatic test flag is for trusted local injected backends;
|
|
186
|
-
it is not a network sandbox or proof that an arbitrary callback is offline.
|
|
187
|
-
The CLI intentionally provides no way to call a live service while relabelling
|
|
188
|
-
it a fixture test. Neither a fixture pass nor a live structural pass is a model
|
|
189
|
-
quality approval or release authorization.
|