Files
hermes-agent/tests/tools/test_skill_provenance.py
T
kshitijk4poor e333113871 fix(review): keep /refine under the background_review origin; attendedness is its own flag
The salvaged commit forked an explicit /refine under a new "refine_review" origin so
the memory delete gate would not treat it as unattended. But is_background_review()
is the key for every other review guard — skill_manager_guards (curator-owned-only,
read-before-write), skill_manager_tool (archive instead of rmtree), skill_ledger
actor, write_approval staging, the [auto] tag — so a /refine fork silently escaped
all of them.

Carry attendedness separately: the fork keeps origin "background_review" and sets
_review_attended; turn_context binds it beside the origin ContextVar; the memory
gate keys on the new is_unattended_review(). Also run the gate AFTER
_validate_single_op / the operations list check, as memory_tool's own docstring
requires, so an invalid replace is rejected now rather than staged and failed at
approve time.
2026-09-09 12:19:13 +05:30

74 lines
2.4 KiB
Python

"""Tests for tools/skill_provenance.py — write-origin ContextVar."""
import contextvars
def test_set_and_get_origin():
from tools.skill_provenance import (
set_current_write_origin,
reset_current_write_origin,
get_current_write_origin,
)
token = set_current_write_origin("background_review")
try:
assert get_current_write_origin() == "background_review"
finally:
reset_current_write_origin(token)
def test_empty_origin_falls_back_to_foreground():
from tools.skill_provenance import (
set_current_write_origin,
reset_current_write_origin,
get_current_write_origin,
)
token = set_current_write_origin("")
try:
# Empty is coerced to "foreground" at the set() boundary.
assert get_current_write_origin() == "foreground"
finally:
reset_current_write_origin(token)
def test_context_isolation_between_copies():
"""ContextVar scoping: modifications in one copy do not leak out."""
from tools.skill_provenance import (
set_current_write_origin,
get_current_write_origin,
BACKGROUND_REVIEW,
)
# Start at the module default.
original = get_current_write_origin()
def _run_in_copy():
set_current_write_origin(BACKGROUND_REVIEW)
return get_current_write_origin()
ctx = contextvars.copy_context()
inside = ctx.run(_run_in_copy)
assert inside == BACKGROUND_REVIEW
# Parent context unaffected.
assert get_current_write_origin() == original
def test_attended_review_is_still_a_background_review():
"""/refine keeps the background_review origin: every curator/skill-ledger/approval guard keyed on
is_background_review() must still apply; only the unattended-only memory delete gate stands down."""
from tools.skill_provenance import (
BACKGROUND_REVIEW, is_background_review, is_unattended_review, reset_current_write_origin,
reset_review_attended, set_current_write_origin, set_review_attended,
)
token = set_current_write_origin(BACKGROUND_REVIEW)
try:
assert is_background_review() and is_unattended_review()
att = set_review_attended(True)
try:
assert is_background_review() and not is_unattended_review()
finally:
reset_review_attended(att)
finally:
reset_current_write_origin(token)
assert not is_background_review() and not is_unattended_review()