Контракт политики памяти (кандидат v1)¶
MemoryPolicy — небольшой явный контракт, который связывает два разных
решения о durable memory:
MemoryAdmissionPolicyрешает, можно ли подтвердить конкретный candidate из host-owned ingress.LedgerRecallPolicyрешает, как выбирать уже active записи в один ограниченный recall lane.
Это намеренно не алиасы. Admission не делает recall, а recall не подтверждает
candidate. MemoryPolicy даёт хосту один versioned, content-free объект для
review и явной передачи в обе границы.
Это additive кандидат на API freeze v1, а не workflow engine, policy модели, автоматический ingestion или утверждение, что все существующие Ledger адаптеры уже stable.
Безопасный default¶
from protoprompt.ledger import MemoryPolicy
policy = MemoryPolicy.safe_default()
assert policy.admission.allowed_origins == ("host_assertion",)
assert policy.recall.require_admission_audit is True
print(policy.explain()) # content-free receipt политики и fingerprint
Default допускает только прошедшие review host_assertion facts, decisions и
preferences с confidence не ниже 0.75. Он сам не создаёт запись и не
подтверждает user/document/tool/model text.
Явная интеграция хоста¶
Хост по-прежнему владеет scope, ingress, review и request boundary. Передавай matching components явно и не отдавай wrapper модели или браузерному клиенту:
from protoprompt import MemoryScope
from protoprompt.ledger import (
MemoryPolicy,
MemoryReviewGate,
MemoryWriter,
SqliteMemoryLedger,
)
from protoprompt.ledger.recall import LedgerRecallPlanner
ledger = SqliteMemoryLedger("ledger.db")
ledger.setup()
writer = MemoryWriter(
ledger,
scope=MemoryScope(tenant="local", user="alice", thread="chat-42"),
)
policy = MemoryPolicy.safe_default()
gate = MemoryReviewGate(
writer,
origin="host_assertion",
policy=policy.admission,
)
planner = LedgerRecallPlanner(writer, policy=policy.recall)
Для custom policy обе components строятся намеренно. Recall component должна
быть не слабее admission; иначе MemoryPolicy(...) завершается ошибкой при
создании.
Проверяемая связь¶
MemoryPolicy отклоняет пару, если нарушено хотя бы одно условие:
- recall требует immutable admission-audit evidence;
- recall задаёт concrete origins, а не legacy compatibility lane с
неограниченными origin, и исключает
unknown/legacy_unknown; - origins и kinds recall являются подмножествами origins и kinds admission;
- minimum confidence recall не ниже minimum confidence admission.
Значит, запись, выбранная через combined contract, могла пройти paired admission rule. Это API-shaping safety invariant, а не Python sandbox и не система авторизации.
Receipt и versioning¶
policy.explain() возвращает свежие JSON-safe metadata: schema wrapper-а,
identity/version политики, оба nested component receipt и deterministic
content-free fingerprint. Там нет memory text, scope, record ID, task text,
secrets или provider messages.
schema_version, policy_id и policy_version принадлежат wrapper-у.
Вложенные admission/recall policies сохраняют свои compatibility versions.
Сохраняй exact reviewed policy receipt рядом с конфигурацией deployment, а не
считай одинаковые человеческие имена доказательством одинаковой семантики.
Границы¶
- Existing standalone
MemoryAdmissionPolicyиLedgerRecallPolicyостаются поддерживаемыми experimental compatibility API. Они не превращаются молча вMemoryPolicy. MemoryPolicyне меняетMemoryWriter, не auto-wire-ит legacy vector или transcript storage, не решает prompt injection, не разбирает conflicts и не отправляет provider request.- Хост всё ещё обязан защищать Ledger/database, назначение scope, review authority и checkpoint secrets. См. отдельные ограничения в руководствах Memory Ledger и bounded Ledger recall.