Files
2026-07-13 13:12:00 +08:00

124 lines
4.2 KiB
Python

"""
Tests for :meth:`PolicyEngine.apply_label_writes` schema
validation (POLICIES.md §10 / §13).
Silent-drop semantics:
- Key not in ``LabelDef.values`` → dropped.
- Unknown key (no LabelDef) → set freely.
- Valid write → persisted via the store.
The drop path is silent by design (matches omnigent) —
a runtime validation failure does NOT raise. The surviving
writes still land atomically.
"""
from __future__ import annotations
from omnigent.runtime.policies.engine import PolicyEngine
from omnigent.spec.types import LabelDef
from omnigent.stores.conversation_store.sqlalchemy_store import (
SqlAlchemyConversationStore,
)
# ── Engine-level filtering ────────────────────────────
def _build_engine_with_defs(
store: SqlAlchemyConversationStore,
label_defs: dict[str, LabelDef],
*,
initial_labels: dict[str, str] | None = None,
) -> PolicyEngine:
"""Build an engine with specific label_defs."""
conv = store.create_conversation()
return PolicyEngine(
policies=[],
label_defs=label_defs,
ask_timeout=30,
conversation_id=conv.id,
initial_labels=initial_labels or {},
conversation_store=store,
)
def test_apply_label_writes_drops_value_outside_enum(
conversation_store: SqlAlchemyConversationStore,
) -> None:
"""A value not in ``LabelDef.values`` is silently
dropped. Prevents a policy (or a prompt-policy
classifier) from injecting an arbitrary string into an
enumerated label."""
engine = _build_engine_with_defs(
conversation_store,
{"integrity": LabelDef(values=["0", "1"])},
)
# "2" is not in values → dropped. "integrity": "1" is
# valid → lands.
engine.apply_label_writes({"integrity": "1", "other": "x"})
# Hot cache has the valid write + the unknown-key
# write (unknown keys pass through per POLICIES.md §10
# schemaless-set-freely rule).
assert engine.labels == {"integrity": "1", "other": "x"}
# Now try to set an out-of-enum value.
engine.apply_label_writes({"integrity": "2"})
# Dropped — cache still shows "1".
assert engine.labels["integrity"] == "1"
def test_apply_label_writes_partial_batch_survives(
conversation_store: SqlAlchemyConversationStore,
) -> None:
"""One key in a multi-key batch violates the schema;
OTHER keys still land. Silent-drop is per-key, not
all-or-nothing."""
engine = _build_engine_with_defs(
conversation_store,
{
"integrity": LabelDef(values=["0", "1"]),
"other": LabelDef(values=["a", "b"]),
},
initial_labels={"integrity": "0"},
)
# integrity "2" is out-of-enum (drop); other "a" is valid (land).
engine.apply_label_writes({"integrity": "2", "other": "a"})
# Only `other` landed; integrity unchanged.
assert engine.labels == {"integrity": "0", "other": "a"}
def test_apply_label_writes_schemaless_keys_pass_freely(
conversation_store: SqlAlchemyConversationStore,
) -> None:
"""Keys with no LabelDef are set freely — the
omnigent-parity behavior that lets policies write
ad-hoc labels without declaring a schema first
(POLICIES.md §10)."""
engine = _build_engine_with_defs(
conversation_store,
{}, # no label_defs at all
)
engine.apply_label_writes({"any": "value", "anything": "123"})
# Both landed — no schema to enforce.
assert engine.labels == {"any": "value", "anything": "123"}
def test_apply_label_writes_values_only_free_transitions(
conversation_store: SqlAlchemyConversationStore,
) -> None:
"""`values` declared — enum check only, transitions between
declared values are free."""
engine = _build_engine_with_defs(
conversation_store,
{"role": LabelDef(values=["admin", "user", "guest"])},
initial_labels={"role": "user"},
)
# Free transitions within the enum.
engine.apply_label_writes({"role": "admin"})
assert engine.labels["role"] == "admin"
engine.apply_label_writes({"role": "guest"})
assert engine.labels["role"] == "guest"
# Out-of-enum still rejected.
engine.apply_label_writes({"role": "root"})
assert engine.labels["role"] == "guest"