strata-agent-memory 0.2.5__tar.gz → 0.2.7__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (162) hide show
  1. {strata_agent_memory-0.2.5/strata_agent_memory.egg-info → strata_agent_memory-0.2.7}/PKG-INFO +3 -2
  2. {strata_agent_memory-0.2.5 → strata_agent_memory-0.2.7}/README.md +2 -1
  3. {strata_agent_memory-0.2.5 → strata_agent_memory-0.2.7}/agent_memory/__init__.py +1 -1
  4. {strata_agent_memory-0.2.5 → strata_agent_memory-0.2.7}/agent_memory/audit.py +42 -3
  5. {strata_agent_memory-0.2.5 → strata_agent_memory-0.2.7}/agent_memory/cli.py +344 -41
  6. {strata_agent_memory-0.2.5 → strata_agent_memory-0.2.7}/agent_memory/contracts.py +180 -13
  7. {strata_agent_memory-0.2.5 → strata_agent_memory-0.2.7}/agent_memory/evidence.py +543 -54
  8. strata_agent_memory-0.2.7/agent_memory/lane.py +1150 -0
  9. {strata_agent_memory-0.2.5 → strata_agent_memory-0.2.7}/agent_memory/ledger.py +20 -2
  10. {strata_agent_memory-0.2.5 → strata_agent_memory-0.2.7}/agent_memory/mcp_server.py +15 -4
  11. strata_agent_memory-0.2.7/agent_memory/measure.py +692 -0
  12. {strata_agent_memory-0.2.5 → strata_agent_memory-0.2.7}/agent_memory/pathmap.py +36 -5
  13. {strata_agent_memory-0.2.5 → strata_agent_memory-0.2.7}/agent_memory/recheck.py +136 -19
  14. {strata_agent_memory-0.2.5 → strata_agent_memory-0.2.7}/agent_memory/records.py +96 -3
  15. {strata_agent_memory-0.2.5 → strata_agent_memory-0.2.7}/agent_memory/relay/client.py +116 -1
  16. {strata_agent_memory-0.2.5 → strata_agent_memory-0.2.7}/agent_memory/relay/core.py +14 -3
  17. {strata_agent_memory-0.2.5 → strata_agent_memory-0.2.7}/agent_memory/reliability.py +92 -15
  18. {strata_agent_memory-0.2.5 → strata_agent_memory-0.2.7}/agent_memory/remote.py +41 -3
  19. {strata_agent_memory-0.2.5 → strata_agent_memory-0.2.7}/agent_memory/serve.py +336 -6
  20. {strata_agent_memory-0.2.5 → strata_agent_memory-0.2.7}/agent_memory/supersession.py +9 -0
  21. {strata_agent_memory-0.2.5 → strata_agent_memory-0.2.7}/agent_memory/trust.py +16 -6
  22. strata_agent_memory-0.2.7/deploy/lib/served-ledger.sh +58 -0
  23. {strata_agent_memory-0.2.5 → strata_agent_memory-0.2.7}/deploy/mac/README.md +6 -0
  24. {strata_agent_memory-0.2.5 → strata_agent_memory-0.2.7}/deploy/mac/seed-board.sh +3 -0
  25. {strata_agent_memory-0.2.5 → strata_agent_memory-0.2.7}/deploy/mac/seed-topics.sh +3 -0
  26. {strata_agent_memory-0.2.5 → strata_agent_memory-0.2.7}/deploy/mac/upgrade-driver.sh +11 -0
  27. {strata_agent_memory-0.2.5 → strata_agent_memory-0.2.7}/deploy/plugins/README.md +8 -0
  28. {strata_agent_memory-0.2.5 → strata_agent_memory-0.2.7}/deploy/plugins/claude-code/skills/approvals/SKILL.md +2 -2
  29. {strata_agent_memory-0.2.5 → strata_agent_memory-0.2.7}/deploy/plugins/claude-code/skills/approve/SKILL.md +2 -2
  30. {strata_agent_memory-0.2.5 → strata_agent_memory-0.2.7}/deploy/plugins/claude-code/skills/inbox/SKILL.md +2 -2
  31. {strata_agent_memory-0.2.5 → strata_agent_memory-0.2.7}/deploy/plugins/claude-code/skills/reject/SKILL.md +2 -2
  32. {strata_agent_memory-0.2.5 → strata_agent_memory-0.2.7}/pyproject.toml +5 -2
  33. {strata_agent_memory-0.2.5 → strata_agent_memory-0.2.7/strata_agent_memory.egg-info}/PKG-INFO +3 -2
  34. {strata_agent_memory-0.2.5 → strata_agent_memory-0.2.7}/strata_agent_memory.egg-info/SOURCES.txt +24 -0
  35. strata_agent_memory-0.2.7/tests/test_assessment_67b26eae.py +277 -0
  36. strata_agent_memory-0.2.7/tests/test_audit_lane_numbers_ea89ba26.py +289 -0
  37. strata_agent_memory-0.2.7/tests/test_audit_measurement_13190a20.py +441 -0
  38. {strata_agent_memory-0.2.5 → strata_agent_memory-0.2.7}/tests/test_backlog_check.py +3 -2
  39. strata_agent_memory-0.2.7/tests/test_contract_amend_649e0b45.py +354 -0
  40. {strata_agent_memory-0.2.5 → strata_agent_memory-0.2.7}/tests/test_deploy_mac.py +3 -1
  41. {strata_agent_memory-0.2.5 → strata_agent_memory-0.2.7}/tests/test_evidence.py +4 -3
  42. strata_agent_memory-0.2.7/tests/test_install_lane_cb430a30.py +335 -0
  43. strata_agent_memory-0.2.7/tests/test_lane_63b7cf8b.py +762 -0
  44. strata_agent_memory-0.2.7/tests/test_lane_derived_roots_817ab446.py +263 -0
  45. strata_agent_memory-0.2.7/tests/test_lane_nightly_84b22b63.py +203 -0
  46. strata_agent_memory-0.2.7/tests/test_lane_priority_779d51ba.py +328 -0
  47. strata_agent_memory-0.2.7/tests/test_lane_stop_63b7cf8b.py +159 -0
  48. {strata_agent_memory-0.2.5 → strata_agent_memory-0.2.7}/tests/test_ledger.py +7 -2
  49. {strata_agent_memory-0.2.5 → strata_agent_memory-0.2.7}/tests/test_live_wake_c217c336.py +58 -2
  50. strata_agent_memory-0.2.7/tests/test_local_lanes_sibling_1411a2b2.py +275 -0
  51. strata_agent_memory-0.2.7/tests/test_outcome_commit_binding_b1de564d.py +527 -0
  52. strata_agent_memory-0.2.7/tests/test_outcome_needs_evidence_b1de564d.py +130 -0
  53. {strata_agent_memory-0.2.5 → strata_agent_memory-0.2.7}/tests/test_packaging.py +3 -1
  54. {strata_agent_memory-0.2.5 → strata_agent_memory-0.2.7}/tests/test_plugins.py +4 -4
  55. strata_agent_memory-0.2.7/tests/test_recheck_away_207af145.py +276 -0
  56. strata_agent_memory-0.2.7/tests/test_recheck_remote_8185d2d3.py +317 -0
  57. strata_agent_memory-0.2.7/tests/test_recheck_sandbox_543e48a7.py +627 -0
  58. strata_agent_memory-0.2.7/tests/test_recheck_sandbox_nits_543e48a7.py +73 -0
  59. {strata_agent_memory-0.2.5 → strata_agent_memory-0.2.7}/tests/test_relay_client.py +7 -2
  60. {strata_agent_memory-0.2.5 → strata_agent_memory-0.2.7}/tests/test_relay_core.py +3 -3
  61. {strata_agent_memory-0.2.5 → strata_agent_memory-0.2.7}/tests/test_relay_release_526f5261.py +2 -1
  62. strata_agent_memory-0.2.7/tests/test_relay_release_gate_b3b3e487.py +383 -0
  63. {strata_agent_memory-0.2.5 → strata_agent_memory-0.2.7}/tests/test_remote.py +4 -2
  64. strata_agent_memory-0.2.7/tests/test_rollback_78710ebf.py +510 -0
  65. strata_agent_memory-0.2.7/tests/test_served_ledger_6e8e49f3.py +261 -0
  66. strata_agent_memory-0.2.7/tests/test_sit_var_bindings_e802ca84.py +288 -0
  67. {strata_agent_memory-0.2.5 → strata_agent_memory-0.2.7}/LICENSE +0 -0
  68. {strata_agent_memory-0.2.5 → strata_agent_memory-0.2.7}/agent_memory/__main__.py +0 -0
  69. {strata_agent_memory-0.2.5 → strata_agent_memory-0.2.7}/agent_memory/approvals.py +0 -0
  70. {strata_agent_memory-0.2.5 → strata_agent_memory-0.2.7}/agent_memory/compact.py +0 -0
  71. {strata_agent_memory-0.2.5 → strata_agent_memory-0.2.7}/agent_memory/compiler.py +0 -0
  72. {strata_agent_memory-0.2.5 → strata_agent_memory-0.2.7}/agent_memory/export.py +0 -0
  73. {strata_agent_memory-0.2.5 → strata_agent_memory-0.2.7}/agent_memory/hooks.py +0 -0
  74. {strata_agent_memory-0.2.5 → strata_agent_memory-0.2.7}/agent_memory/identity.py +0 -0
  75. {strata_agent_memory-0.2.5 → strata_agent_memory-0.2.7}/agent_memory/instances.py +0 -0
  76. {strata_agent_memory-0.2.5 → strata_agent_memory-0.2.7}/agent_memory/kit.py +0 -0
  77. {strata_agent_memory-0.2.5 → strata_agent_memory-0.2.7}/agent_memory/memorizer.py +0 -0
  78. {strata_agent_memory-0.2.5 → strata_agent_memory-0.2.7}/agent_memory/relay/__init__.py +0 -0
  79. {strata_agent_memory-0.2.5 → strata_agent_memory-0.2.7}/agent_memory/relay/adapters.py +0 -0
  80. {strata_agent_memory-0.2.5 → strata_agent_memory-0.2.7}/agent_memory/relay/cli.py +0 -0
  81. {strata_agent_memory-0.2.5 → strata_agent_memory-0.2.7}/agent_memory/render.py +0 -0
  82. {strata_agent_memory-0.2.5 → strata_agent_memory-0.2.7}/agent_memory/roster.py +0 -0
  83. {strata_agent_memory-0.2.5 → strata_agent_memory-0.2.7}/agent_memory/signing.py +0 -0
  84. {strata_agent_memory-0.2.5 → strata_agent_memory-0.2.7}/agent_memory/stats.py +0 -0
  85. {strata_agent_memory-0.2.5 → strata_agent_memory-0.2.7}/agent_memory/wake.py +0 -0
  86. {strata_agent_memory-0.2.5 → strata_agent_memory-0.2.7}/deploy/mac/agent-keys.sh +0 -0
  87. {strata_agent_memory-0.2.5 → strata_agent_memory-0.2.7}/deploy/mac/agent-session.sh +0 -0
  88. {strata_agent_memory-0.2.5 → strata_agent_memory-0.2.7}/deploy/mac/backup-tokens.sh +0 -0
  89. {strata_agent_memory-0.2.5 → strata_agent_memory-0.2.7}/deploy/mac/install-hooks-mac.sh +0 -0
  90. {strata_agent_memory-0.2.5 → strata_agent_memory-0.2.7}/deploy/mac/install-relay-driver.sh +0 -0
  91. {strata_agent_memory-0.2.5 → strata_agent_memory-0.2.7}/deploy/mac/install-replica-driver.sh +0 -0
  92. {strata_agent_memory-0.2.5 → strata_agent_memory-0.2.7}/deploy/mac/install-runner-driver.sh +0 -0
  93. {strata_agent_memory-0.2.5 → strata_agent_memory-0.2.7}/deploy/mac/instances.example.json +0 -0
  94. {strata_agent_memory-0.2.5 → strata_agent_memory-0.2.7}/deploy/mac/onboard-agent.sh +0 -0
  95. {strata_agent_memory-0.2.5 → strata_agent_memory-0.2.7}/deploy/mac/relay-agent.sh +0 -0
  96. {strata_agent_memory-0.2.5 → strata_agent_memory-0.2.7}/deploy/mac/seed-mail-context.sh +0 -0
  97. {strata_agent_memory-0.2.5 → strata_agent_memory-0.2.7}/deploy/plugins/.claude-plugin/marketplace.json +0 -0
  98. {strata_agent_memory-0.2.5 → strata_agent_memory-0.2.7}/deploy/plugins/claude-code/.claude-plugin/plugin.json +0 -0
  99. {strata_agent_memory-0.2.5 → strata_agent_memory-0.2.7}/deploy/plugins/claude-code/bin/agent-memory-approvals +0 -0
  100. {strata_agent_memory-0.2.5 → strata_agent_memory-0.2.7}/deploy/plugins/claude-code/bin/agent-memory-wake +0 -0
  101. {strata_agent_memory-0.2.5 → strata_agent_memory-0.2.7}/deploy/plugins/claude-code/hooks/hooks.json +0 -0
  102. {strata_agent_memory-0.2.5 → strata_agent_memory-0.2.7}/deploy/plugins/claude-code/monitors/monitors.json +0 -0
  103. {strata_agent_memory-0.2.5 → strata_agent_memory-0.2.7}/deploy/plugins/claude-code/rules/approvals.md +0 -0
  104. {strata_agent_memory-0.2.5 → strata_agent_memory-0.2.7}/deploy/plugins/codex/skills/agent-memory-answer/SKILL.md +0 -0
  105. {strata_agent_memory-0.2.5 → strata_agent_memory-0.2.7}/deploy/plugins/codex/skills/agent-memory-answer/agents/openai.yaml +0 -0
  106. {strata_agent_memory-0.2.5 → strata_agent_memory-0.2.7}/deploy/plugins/codex/skills/agent-memory-approvals/SKILL.md +0 -0
  107. {strata_agent_memory-0.2.5 → strata_agent_memory-0.2.7}/deploy/plugins/codex/skills/agent-memory-approvals/agents/openai.yaml +0 -0
  108. {strata_agent_memory-0.2.5 → strata_agent_memory-0.2.7}/deploy/plugins/codex/skills/agent-memory-approvals/rules/approvals.md +0 -0
  109. {strata_agent_memory-0.2.5 → strata_agent_memory-0.2.7}/deploy/plugins/codex/skills/agent-memory-approvals/scripts/agent-memory-approvals +0 -0
  110. {strata_agent_memory-0.2.5 → strata_agent_memory-0.2.7}/deploy/relay/README.md +0 -0
  111. {strata_agent_memory-0.2.5 → strata_agent_memory-0.2.7}/deploy/relay/agent-memory-relay@.service +0 -0
  112. {strata_agent_memory-0.2.5 → strata_agent_memory-0.2.7}/deploy/relay/install-relay-mac.sh +0 -0
  113. {strata_agent_memory-0.2.5 → strata_agent_memory-0.2.7}/deploy/relay/install-relay.sh +0 -0
  114. {strata_agent_memory-0.2.5 → strata_agent_memory-0.2.7}/deploy/relay/macos/com.strata.agent-memory.relay.plist.template +0 -0
  115. {strata_agent_memory-0.2.5 → strata_agent_memory-0.2.7}/deploy/relay/relay-launch.sh +0 -0
  116. {strata_agent_memory-0.2.5 → strata_agent_memory-0.2.7}/setup.cfg +0 -0
  117. {strata_agent_memory-0.2.5 → strata_agent_memory-0.2.7}/strata_agent_memory.egg-info/dependency_links.txt +0 -0
  118. {strata_agent_memory-0.2.5 → strata_agent_memory-0.2.7}/strata_agent_memory.egg-info/entry_points.txt +0 -0
  119. {strata_agent_memory-0.2.5 → strata_agent_memory-0.2.7}/strata_agent_memory.egg-info/requires.txt +0 -0
  120. {strata_agent_memory-0.2.5 → strata_agent_memory-0.2.7}/strata_agent_memory.egg-info/top_level.txt +0 -0
  121. {strata_agent_memory-0.2.5 → strata_agent_memory-0.2.7}/tests/test_audit.py +0 -0
  122. {strata_agent_memory-0.2.5 → strata_agent_memory-0.2.7}/tests/test_changelog_fragments.py +0 -0
  123. {strata_agent_memory-0.2.5 → strata_agent_memory-0.2.7}/tests/test_changelog_guard_shallow_57a2f78e.py +0 -0
  124. {strata_agent_memory-0.2.5 → strata_agent_memory-0.2.7}/tests/test_ci_docs_only_353ce010.py +0 -0
  125. {strata_agent_memory-0.2.5 → strata_agent_memory-0.2.7}/tests/test_cli.py +0 -0
  126. {strata_agent_memory-0.2.5 → strata_agent_memory-0.2.7}/tests/test_compact.py +0 -0
  127. {strata_agent_memory-0.2.5 → strata_agent_memory-0.2.7}/tests/test_compiler.py +0 -0
  128. {strata_agent_memory-0.2.5 → strata_agent_memory-0.2.7}/tests/test_compiler_render.py +0 -0
  129. {strata_agent_memory-0.2.5 → strata_agent_memory-0.2.7}/tests/test_config.py +0 -0
  130. {strata_agent_memory-0.2.5 → strata_agent_memory-0.2.7}/tests/test_contracts.py +0 -0
  131. {strata_agent_memory-0.2.5 → strata_agent_memory-0.2.7}/tests/test_deploy_relay.py +0 -0
  132. {strata_agent_memory-0.2.5 → strata_agent_memory-0.2.7}/tests/test_deploy_replica.py +0 -0
  133. {strata_agent_memory-0.2.5 → strata_agent_memory-0.2.7}/tests/test_deploy_tokens.py +0 -0
  134. {strata_agent_memory-0.2.5 → strata_agent_memory-0.2.7}/tests/test_find_root_b4b5019b.py +0 -0
  135. {strata_agent_memory-0.2.5 → strata_agent_memory-0.2.7}/tests/test_hooks.py +0 -0
  136. {strata_agent_memory-0.2.5 → strata_agent_memory-0.2.7}/tests/test_identity.py +0 -0
  137. {strata_agent_memory-0.2.5 → strata_agent_memory-0.2.7}/tests/test_issue_bridge.py +0 -0
  138. {strata_agent_memory-0.2.5 → strata_agent_memory-0.2.7}/tests/test_ledger_index.py +0 -0
  139. {strata_agent_memory-0.2.5 → strata_agent_memory-0.2.7}/tests/test_memorizer.py +0 -0
  140. {strata_agent_memory-0.2.5 → strata_agent_memory-0.2.7}/tests/test_pathmap.py +0 -0
  141. {strata_agent_memory-0.2.5 → strata_agent_memory-0.2.7}/tests/test_phase2.py +0 -0
  142. {strata_agent_memory-0.2.5 → strata_agent_memory-0.2.7}/tests/test_receipt_reports_274e6199.py +0 -0
  143. {strata_agent_memory-0.2.5 → strata_agent_memory-0.2.7}/tests/test_recheck.py +0 -0
  144. {strata_agent_memory-0.2.5 → strata_agent_memory-0.2.7}/tests/test_records.py +0 -0
  145. {strata_agent_memory-0.2.5 → strata_agent_memory-0.2.7}/tests/test_redaction.py +0 -0
  146. {strata_agent_memory-0.2.5 → strata_agent_memory-0.2.7}/tests/test_relay_adapters.py +0 -0
  147. {strata_agent_memory-0.2.5 → strata_agent_memory-0.2.7}/tests/test_relay_codex.py +0 -0
  148. {strata_agent_memory-0.2.5 → strata_agent_memory-0.2.7}/tests/test_relay_instance_2a2e3887.py +0 -0
  149. {strata_agent_memory-0.2.5 → strata_agent_memory-0.2.7}/tests/test_reliability.py +0 -0
  150. {strata_agent_memory-0.2.5 → strata_agent_memory-0.2.7}/tests/test_remote_signing.py +0 -0
  151. {strata_agent_memory-0.2.5 → strata_agent_memory-0.2.7}/tests/test_review2_fixes.py +0 -0
  152. {strata_agent_memory-0.2.5 → strata_agent_memory-0.2.7}/tests/test_review3_fixes.py +0 -0
  153. {strata_agent_memory-0.2.5 → strata_agent_memory-0.2.7}/tests/test_review_fixes.py +0 -0
  154. {strata_agent_memory-0.2.5 → strata_agent_memory-0.2.7}/tests/test_scale.py +0 -0
  155. {strata_agent_memory-0.2.5 → strata_agent_memory-0.2.7}/tests/test_serve.py +0 -0
  156. {strata_agent_memory-0.2.5 → strata_agent_memory-0.2.7}/tests/test_signing.py +0 -0
  157. {strata_agent_memory-0.2.5 → strata_agent_memory-0.2.7}/tests/test_sit_fleet_1b24b0b1.py +0 -0
  158. {strata_agent_memory-0.2.5 → strata_agent_memory-0.2.7}/tests/test_sit_fleet_ci_0d9b76a2.py +0 -0
  159. {strata_agent_memory-0.2.5 → strata_agent_memory-0.2.7}/tests/test_stats.py +0 -0
  160. {strata_agent_memory-0.2.5 → strata_agent_memory-0.2.7}/tests/test_supersedes_61416280.py +0 -0
  161. {strata_agent_memory-0.2.5 → strata_agent_memory-0.2.7}/tests/test_trust.py +0 -0
  162. {strata_agent_memory-0.2.5 → strata_agent_memory-0.2.7}/tests/test_uv_lock_env_274e6199.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: strata-agent-memory
3
- Version: 0.2.5
3
+ Version: 0.2.7
4
4
  Summary: Portable, auditable, cross-vendor memory for LLM agents: evidence-bound claims, trust tiers, and compiled context views.
5
5
  Author: Strata Intelligence
6
6
  License-Expression: Apache-2.0
@@ -75,7 +75,7 @@ pip install strata-agent-memory # the CLI is `agent-memory`; or, from a chec
75
75
  cd your-project && agent-memory init
76
76
 
77
77
  agent-memory run -- pytest -q # -> {"id": "ev_…", "kind": "test", "passed": 42, ...}
78
- agent-memory claim outcome "auth tests pass" -e ev_… --commit
78
+ agent-memory claim outcome "auth tests pass" -e ev_… # inside a git checkout it binds HEAD too
79
79
  agent-memory claim outcome "deployed" # -> rejected: outcome claims require at least one receipt
80
80
 
81
81
  agent-memory claim fact "sessions renew via renewSession()" --source src/auth.py
@@ -91,6 +91,7 @@ agent-memory claim fact "w3lib.get_meta_refresh takes baseurl" --source w3lib/ht
91
91
  agent-memory compile --role worker --task "extend auth" # a fork-mode brief; reports what memory holds nothing on
92
92
  agent-memory compile --role verifier --contract ctr_… --round 2 --lens security # isolated review brief with a lens
93
93
  agent-memory audit # tiers, static-only outcomes, taint chains, verifier lineage matrix
94
+ agent-memory audit --since 2026-09-21 --until 2026-09-28 # and the measurement section for that week (default: the last seven days)
94
95
  agent-memory reliability # how often claims like these were refuted, with n and an interval; fitted staleness
95
96
  AGENT_MEMORY_HARNESS=ollama agent-memory recheck --map /Users/craig/src=/home/chris/src # the nightly lane, from another machine
96
97
  agent-memory serve # HTTP API, SSE and remote MCP on loopback; add --tokens FILE
@@ -51,7 +51,7 @@ pip install strata-agent-memory # the CLI is `agent-memory`; or, from a chec
51
51
  cd your-project && agent-memory init
52
52
 
53
53
  agent-memory run -- pytest -q # -> {"id": "ev_…", "kind": "test", "passed": 42, ...}
54
- agent-memory claim outcome "auth tests pass" -e ev_… --commit
54
+ agent-memory claim outcome "auth tests pass" -e ev_… # inside a git checkout it binds HEAD too
55
55
  agent-memory claim outcome "deployed" # -> rejected: outcome claims require at least one receipt
56
56
 
57
57
  agent-memory claim fact "sessions renew via renewSession()" --source src/auth.py
@@ -67,6 +67,7 @@ agent-memory claim fact "w3lib.get_meta_refresh takes baseurl" --source w3lib/ht
67
67
  agent-memory compile --role worker --task "extend auth" # a fork-mode brief; reports what memory holds nothing on
68
68
  agent-memory compile --role verifier --contract ctr_… --round 2 --lens security # isolated review brief with a lens
69
69
  agent-memory audit # tiers, static-only outcomes, taint chains, verifier lineage matrix
70
+ agent-memory audit --since 2026-09-21 --until 2026-09-28 # and the measurement section for that week (default: the last seven days)
70
71
  agent-memory reliability # how often claims like these were refuted, with n and an interval; fitted staleness
71
72
  AGENT_MEMORY_HARNESS=ollama agent-memory recheck --map /Users/craig/src=/home/chris/src # the nightly lane, from another machine
72
73
  agent-memory serve # HTTP API, SSE and remote MCP on loopback; add --tokens FILE
@@ -9,4 +9,4 @@ see, what did it claim, and can the proof be re-run.
9
9
  The core is dependency-free (Python 3.10+ standard library only).
10
10
  """
11
11
 
12
- __version__ = "0.2.5"
12
+ __version__ = "0.2.7"
@@ -27,13 +27,14 @@ from collections import Counter, defaultdict
27
27
  from typing import Dict, List, Optional
28
28
 
29
29
  from . import evidence as ev
30
+ from . import measure as measure_mod
30
31
  from . import reliability as rel
31
32
  from . import supersession as supersession_mod
32
33
  from . import roster as roster_mod
33
34
  from . import signing
34
35
  from .contracts import status_of
35
36
  from .ledger import UNTRUSTED_POLICY
36
- from .records import is_redacted, receipt_visible_to
37
+ from .records import is_assessment, is_redacted, receipt_visible_to
37
38
  from .trust import TIERS, assess, lineage_differs, summarize
38
39
 
39
40
  # Anything a compiled view would have to render on its own line. The renderer collapses
@@ -190,12 +191,15 @@ def _roster_sections(ledger, rep: Dict, by_id: Dict[str, dict], reader_user: Opt
190
191
 
191
192
 
192
193
  def report(ledger, recheck: bool = False, cwd: Optional[str] = None, timeout: Optional[float] = 300,
193
- path_map=None, reader_user: Optional[str] = None) -> dict:
194
+ path_map=None, reader_user: Optional[str] = None, since: Optional[str] = None,
195
+ until: Optional[str] = None) -> dict:
194
196
  """The audit, for one reader. ``reader_user`` is who is asking: a user-scoped claim is
195
197
  one person's private memory and is listed for its owner and for nobody else, the same
196
198
  rule ``receipt_visible_to`` applies everywhere a record is shown (verification review
197
199
  F1: the audit listed every user's private statements to any token). A local audit
198
- with no reader named sees everything, as the local ledger's owner does."""
200
+ with no reader named sees everything, as the local ledger's owner does. ``since`` and
201
+ ``until`` are the measurement section's window (measure.window; ValueError when it is
202
+ empty or a bound does not parse)."""
199
203
  assessment = assess(ledger)
200
204
  claims = ledger.claims()
201
205
  if reader_user is not None:
@@ -214,10 +218,14 @@ def report(ledger, recheck: bool = False, cwd: Optional[str] = None, timeout: Op
214
218
  "unrechecked_outcomes": [],
215
219
  "failing_receipt_outcomes": [],
216
220
  "static_only_outcomes": [],
221
+ "dirty_bound_outcomes": [],
217
222
  "assurance_overridden": [],
218
223
  "same_vendor_only": [],
219
224
  "self_verified_by_author": [],
220
225
  "same_session_different_harness": [],
226
+ # D6 (ctr_67b26eae6bff4b63): another identity's reading of a claim, asked for; listed
227
+ # here and nowhere a verdict is counted
228
+ "assessments": [],
221
229
  "formatted_statements": [],
222
230
  "redactions": {"count": 0, "ids": []},
223
231
  # absent and empty mean different things (an absent key is the starter default
@@ -298,6 +306,12 @@ def report(ledger, recheck: bool = False, cwd: Optional[str] = None, timeout: Op
298
306
  if backed in ("static", "attested"):
299
307
  # a clean static gate is not evidence that the thing runs
300
308
  rep["static_only_outcomes"].append({**entry, "assurance": backed})
309
+ # the writer's own word that its receipts ran on a tree no sha reproduces: no
310
+ # lane checks those out, so a practice of it is a PM's question per author (S3)
311
+ heads = [item.get("sha") for item in b.get("evidence") or []
312
+ if isinstance(item, dict) and item.get("kind") == "commit" and item.get("dirty")]
313
+ if heads:
314
+ rep["dirty_bound_outcomes"].append({**entry, "user": a.get("user"), "head": heads[0]})
301
315
  # a measure, not a tier: every claim whose only verifiers are agents of its own
302
316
  # vendor, whether the ledger's policy lets that reach `verified` or not
303
317
  if info["verified_by"] and not info.get("cross_vendor") and not info.get("self_verified_by_author") \
@@ -351,6 +365,17 @@ def report(ledger, recheck: bool = False, cwd: Optional[str] = None, timeout: Op
351
365
  claim = by_id.get(v["body"].get("claim"))
352
366
  if claim is None:
353
367
  continue
368
+ if is_assessment(v): # a reading, not a verdict: its own column, never the matrix
369
+ rep["assessments"].append({
370
+ "id": v["id"], "claim": claim["id"], "verdict": v["body"]["verdict"],
371
+ "by": v["author"].get("harness"), "vendor": v["author"].get("vendor"),
372
+ "user": v["author"].get("user"), "ts": v["ts"],
373
+ "lineage": ("another lineage" if lineage_differs(claim["author"], v["author"])
374
+ else "same lineage: never counted"),
375
+ "note": str(v["body"].get("note") or "")[:160], "cited": list(v["body"].get("cited") or []),
376
+ "statement": claim["body"]["statement"][:120],
377
+ })
378
+ continue
354
379
  verdict = v["body"]["verdict"]
355
380
  key = f"{claim['author'].get('vendor')}->{v['author'].get('vendor')}"
356
381
  cell = rep["lineage_matrix"].setdefault(key, {"verified": 0, "refuted": 0, "inconclusive": 0})
@@ -463,6 +488,11 @@ def report(ledger, recheck: bool = False, cwd: Optional[str] = None, timeout: Op
463
488
  rep["recheck"].append(entry)
464
489
  # what the reliability measurements leave out, and why (the PE's ruling, item 4)
465
490
  rep["not_measured"] = {"superseded": len(rep["superseded"]), "artefact": len(rep["withdrawn"])}
491
+ # the vision's numbers for a window, recomputable by anyone with the shards
492
+ # (ctr_13190a200fbbd682; docs/BENCHMARK-PLAN.md section 3)
493
+ rep["measurement"] = measure_mod.measurement(
494
+ ledger, since, until, sees=lambda rec: _reader_sees(ledger, rec, by_id, reader_user),
495
+ assessment=assessment)
466
496
  return rep
467
497
 
468
498
 
@@ -516,6 +546,9 @@ def format_report(rep: dict) -> str:
516
546
  lambda r: f"{r['id']} [{r['by']}] {r['statement']} -- receipts: {', '.join(r['receipts'])}")
517
547
  section("Outcome claims backed only by static evidence (static-pass/dynamic-fail risk)",
518
548
  rep["static_only_outcomes"], lambda r: f"{r['id']} [{r['by']}, {r['assurance']}] {r['statement']}")
549
+ section("Outcome claims bound to a dirty tree (their commit is not what ran; no lane re-runs them at it)",
550
+ rep.get("dirty_bound_outcomes", []),
551
+ lambda r: f"{r['id']} [{r['by']}, {r['user']}] at {str(r['head'])[:12]} {r['statement']}")
519
552
  section("Receipts whose assurance was declared above the computed default", rep["assurance_overridden"],
520
553
  lambda r: f"{r['id']} [{r['by']}] declared {r['declared']}, computed {r['computed']}: {r['what']}"
521
554
  + (f" (cited by {', '.join(r['claims'])})" if r["claims"] else " (cited by no claim)"))
@@ -527,6 +560,9 @@ def format_report(rep: dict) -> str:
527
560
  rep.get("same_session_different_harness", []),
528
561
  lambda r: f"{r['id']} [{r['by']} -> {r['verified_by']}, {r['user']} session {r['session']}] "
529
562
  f"{r['statement']}")
563
+ section("Assessments (a reading on request, never a check: they move no tier)", rep.get("assessments", []),
564
+ lambda r: f"{r['id']} on {r['claim']} [{r['verdict']} by {r['by']}, {r['vendor']}, {r['user']}; "
565
+ f"{r['lineage']}] {r['note']}" + (f" (cites {', '.join(r['cited'])})" if r["cited"] else ""))
530
566
  section("Statements shaped like a document (injection risk)", rep.get("formatted_statements", []),
531
567
  lambda r: f"{r['id']} [{r['by']}] {r['field']} starts a line with: {r['line']}")
532
568
  section("Refuted", rep["refuted"], lambda r: f"{r['id']} {r['statement']} -- {'; '.join(r['reasons'])} (dependents: {r['dependents']})")
@@ -617,6 +653,9 @@ def format_report(rep: dict) -> str:
617
653
  "same_lineage_agreement": rep["same_lineage_agreement"],
618
654
  "staleness": rep["staleness"],
619
655
  "judgment_calibration": rep["judgment_calibration"]}).rstrip("\n"))
656
+ if rep.get("measurement"): # a replica older than this section sends none
657
+ lines.extend(measure_mod.format_noise(rep["measurement"]))
658
+ lines.extend(measure_mod.format_measurement(rep["measurement"]))
620
659
  if rep["recheck"]:
621
660
  section("Evidence re-check", rep["recheck"],
622
661
  lambda r: f"{r['claim']} {r['evidence']}: {r['outcome']} -- {r['detail']}"