feat(memory): add audit export surface

This commit is contained in:
2026-05-15 11:15:16 +02:00
parent c5110f61b0
commit 914b698af7
6 changed files with 333 additions and 95 deletions

View File

@@ -13,6 +13,7 @@ from kontextual_engine import (
MemoryRefreshRequest,
MemoryRetentionRequest,
MemoryQueryRequest,
MemoryRuntimeExportRequest,
MemoryRuntimeService,
MemoryUpdateRequest,
OperationContext,
@@ -73,6 +74,7 @@ def test_memory_runtime_service_imports_contracts_and_reports_audit_context() ->
assert summary.audit_event is not None
assert summary.audit_event.actor_id == "agent-codex"
assert summary.audit_event.correlation_id == "corr-memory"
assert repo.get_memory_audit_event(summary.audit_event.event_id) == summary.audit_event
assert repo.get_memory_profile(summary.profile_id).memory_kinds == (
"reasoning",
"knowledge",
@@ -283,6 +285,53 @@ def test_memory_package_export_emits_markitect_context_package_inputs_without_de
assert export.audit_event.operation == "memory.package.export"
def test_memory_runtime_export_includes_persisted_audit_and_event_traces() -> None:
repo = InMemoryMemoryGraphRepository()
service = MemoryRuntimeService(repo)
context = operation_context()
summary = service.import_markitect_graph(_graph_contract(), context=context)
query = service.query_memory(MemoryQueryRequest(graph_id=summary.graph_id), context)
retention = service.apply_retention(
MemoryRetentionRequest(graph_id=summary.graph_id, stale_after_days=0),
context,
)
audit_operations = {
event.operation
for event in repo.list_memory_audit_events(
graph_id=summary.graph_id,
correlation_id=context.correlation_id,
)
}
export = service.export_runtime_envelope(
MemoryRuntimeExportRequest(
graph_id=summary.graph_id,
event_kinds=("recorded", "retention"),
operations=("memory.query", "memory.retention.apply"),
),
context,
)
assert query.success is True
assert retention.appended_events[0].kind == "retention"
assert {"memory.import_markitect_graph", "memory.query", "memory.retention.apply"} <= audit_operations
assert export.success is True
assert export.envelope["schema_version"] == "kontextual.memory.runtime-export.v1"
assert export.envelope["metadata"]["counts"] == {
"nodes": 2,
"edges": 1,
"events": 2,
"audit_events": 2,
}
assert {event["kind"] for event in export.envelope["events"]} == {"recorded", "retention"}
assert {event["operation"] for event in export.envelope["audit_events"]} == {
"memory.query",
"memory.retention.apply",
}
assert export.audit_event is not None
assert repo.get_memory_audit_event(export.audit_event.event_id) == export.audit_event
def test_memory_runtime_service_rejects_invalid_edge_contracts() -> None:
repo = InMemoryMemoryGraphRepository()
service = MemoryRuntimeService(repo)