Перейти к содержанию

Граница API ProtoPrompt v1

В ProtoPrompt 0.20 появляется protoprompt.api — узкая точка импорта, которая замораживается для линии 1.x. До 1.0 её статус — v1 candidate. В 1.0.0 эта же граница станет SemVer-stable ядром после прохождения остальных release gate.

Старые импорты продолжают работать, но не получают неявно более сильную гарантию совместимости 1.x.

from protoprompt.api import (
    MemoryKind,
    MemoryScope,
    MemoryWriter,
    SqliteMemoryLedger,
)

ledger = SqliteMemoryLedger("memory.db")
ledger.setup()
writer = MemoryWriter(
    ledger,
    scope=MemoryScope(tenant="acme", user="alice", thread="support"),
)
candidate = writer.assert_candidate(
    kind=MemoryKind.FACT,
    content="Согласованный тариф поддержки — enterprise.",
    source_ref="host:crm:account-42",
)
active = writer.confirm(candidate.record_id, expected_revision=candidate.revision)

Что замораживается

Установочный api_contract_v1.json — исполняемое release evidence, а не автоматическая выгрузка всех имён. Он фиксирует:

  • точный список экспортов protoprompt.api;
  • публичные поля и read-методы ContextPlan, MemoryRecord, MemoryEvent, receipts и relations;
  • публичные lifecycle/read/export/scoped-erasure методы MemoryWriter;
  • MemoryPolicy.safe_default(), fingerprint и content-free explanation;
  • значения enum для lifecycle, trust, provenance, relations и встроенных storage modes;
  • operational setup/close boundary встроенных SQLite/PostgreSQL Ledger и sealed storage-conformance receipt.

ContextPlan, MemoryRecord, MemoryEvent, audit и erasure receipts — result-типы. Контрактом служат их документированные публичные поля и методы; приложение не должно вызывать их конструкторы напрямую. Private-поля с _ в начале в контракт не входят.

Для MemoryPolicy кандидатно-стабильной точкой является MemoryPolicy.safe_default(). Прямая композиция собственных admission и recall policy остаётся experimental, пока их policy language не получат отдельный freeze.

Что остаётся experimental

Следующие поверхности не становятся стабильными только потому, что старые импорты продолжают работать:

Поверхность Статус
custom policies и review workflow в protoprompt.ledger.admission experimental
planner, composer и checkpoints в protoprompt.ledger.recall experimental
task-resume форматы и planner experimental
lineage / working-memory research в protoprompt.agent experimental
provider/framework integrations optional adapters с отдельной совместимостью
apps/* reference applications и demos
сторонние Ledger backends не поддерживаются; public backend plugin protocol отсутствует

Встроенный PostgreSQL class входит в candidate API, но его backup mode operator_managed остаётся явной обязанностью оператора. API freeze не утверждает, что уже доказаны managed backup/restore, PITR, replicas, WAL retention или physical-media erasure.

Политика совместимости

До 1.0 изменение candidate boundary требует явной записи в changelog и намеренного обновления contract tests и hash манифеста. Начиная с 1.0.0, в рамках 1.x документированные имена и смыслы сохраняются, кроме необходимого fail-closed исправления безопасности. Допускаются additive методы и optional поля, если существующие вызовы продолжают работать.

Exceptions, validation failures, scope isolation, trust transitions и deletion semantics — часть поведения, а не implementation detail. Private methods, внутренности БД, точный текст исключений, repr и прямые конструкторы result-only типов не замораживаются.

Проверка контракта

Манифест входит в wheel и sdist. Его чтение не открывает storage, не загружает credentials, не вызывает сеть и не импортирует optional provider SDK:

from protoprompt.api import V1_API_MANIFEST_SHA256, v1_api_manifest

manifest = v1_api_manifest()
assert manifest["status"] == "v1_candidate"
print(V1_API_MANIFEST_SHA256)
print([item["name"] for item in manifest["exports"]])

CI проверяет точный порядок экспортов, identity реализаций, публичные поля dataclass, публичные members, значения enum, experimental exclusions, digest манифеста, состав пакетов и импорт без optional dependencies.