From d59a96fb1f0ea89732ce2461214a16dcf77a1742 Mon Sep 17 00:00:00 2001 From: Trecek Date: Sun, 28 Jun 2026 20:15:23 -0700 Subject: [PATCH] fix: update INVARIANT_REGISTRY enforcement_layer to match server-side guards Change `recipe-read-headless` and `write-path-prefix` entries from `enforcement_layer="hook-deny"` to `enforcement_layer="server-side"` to reflect the actual enforcement reality: P5-A3-WP1 (commit c9ed35e3d) added `_check_recipe_read_prohibition()` and `_check_write_target_boundary()` in `server/_guards.py`, which are injected into `run_cmd` and `run_python` tool handlers. Add two pin tests asserting the new `server-side` values for both entries. --- .../core/types/_type_invariant_registry.py | 4 ++-- tests/core/test_invariant_registry.py | 14 ++++++++++++++ 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/src/autoskillit/core/types/_type_invariant_registry.py b/src/autoskillit/core/types/_type_invariant_registry.py index 7c7ce8496..e3def0680 100644 --- a/src/autoskillit/core/types/_type_invariant_registry.py +++ b/src/autoskillit/core/types/_type_invariant_registry.py @@ -82,7 +82,7 @@ class InvariantDef: prohibition="Must not read recipe/skill/agent files directly in headless sessions", source_doc="SKILL.md", gate_target="guards/recipe_read_guard.py", - enforcement_layer="hook-deny", + enforcement_layer="server-side", backends=_BOTH, ), "write-path-prefix": InvariantDef( @@ -90,7 +90,7 @@ class InvariantDef: prohibition="Writes outside allowed prefix are blocked in write-scoped sessions", source_doc="SKILL.md", gate_target="guards/write_guard.py", - enforcement_layer="hook-deny", + enforcement_layer="server-side", backends=_CLAUDE_ONLY, ), "skill-orchestration-from-L1": InvariantDef( diff --git a/tests/core/test_invariant_registry.py b/tests/core/test_invariant_registry.py index 977e0e254..dbe941b6a 100644 --- a/tests/core/test_invariant_registry.py +++ b/tests/core/test_invariant_registry.py @@ -100,6 +100,20 @@ def test_env_key_enforcement_layer() -> None: assert INVARIANT_REGISTRY["env-key-in-with-args"].enforcement_layer == "server-side" +def test_recipe_read_enforcement_layer() -> None: + """recipe-read-headless must have enforcement_layer='server-side'.""" + from autoskillit.core import INVARIANT_REGISTRY + + assert INVARIANT_REGISTRY["recipe-read-headless"].enforcement_layer == "server-side" + + +def test_write_path_prefix_enforcement_layer() -> None: + """write-path-prefix must have enforcement_layer='server-side'.""" + from autoskillit.core import INVARIANT_REGISTRY + + assert INVARIANT_REGISTRY["write-path-prefix"].enforcement_layer == "server-side" + + def test_all_gate_targets_are_nonempty() -> None: """Every gate_target must be a non-empty string.""" from autoskillit.core import INVARIANT_REGISTRY