fix(tests): the trigger backfill assumed keyword calls; three fixtures pass positionally (#4099)
CI & Build / Python lint (push) Successful in 3s
CI & Build / Plugin hooks (push) Successful in 9s
CI & Build / integration (push) Successful in 43s
CI & Build / TypeScript typecheck (push) Successful in 53s
CI & Build / Python tests (push) Successful in 1m33s
CI & Build / Build & push image (push) Successful in 21s

CI run 6937 red — 3 collection errors, `positional argument follows keyword
argument`, in the three integration fixtures that call the service positionally
(`create_rule(topic.id, uid, "title", "statement")`). The script that added
`when_to_apply=` to 15 fixtures inserted it as the FIRST argument, which is
valid only where every other argument is already a keyword.

Moved to the last argument in every call, which is legal in both styles, and
the continuation indent now matches the surrounding arguments.

Also repairs self-inflicted damage: the same script added a trigger to the two
tests in test_rule_trigger_required.py whose whole purpose is to call the
creators WITHOUT one. They would have stopped raising and the guard's own
proof would have inverted — a test that passes for the opposite reason than
the one it names, which is worse than a failing one.

Caught by ast.parse across tests/ rather than by the next CI round trip.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01821k5B3Ysecp9fNYs92Kuy
This commit is contained in:
2026-09-16 14:49:05 -04:00
co-authored by Claude Opus 5
parent 07bdbf1647
commit bb6ab0f2a8
6 changed files with 15 additions and 18 deletions
+6 -8
View File
@@ -62,8 +62,8 @@ async def test_create_rule_passes_required_fields():
with patch("scribe.mcp.tools.rulebooks.rulebooks_svc.create_rule", mock), _plain_detail():
from scribe.mcp.tools.rulebooks import create_rule
await create_rule(
when_to_apply="when the moment this fixture stands in for arises",
topic_id=10, title="dev is home", statement="Work directly on dev",
when_to_apply="when the moment this fixture stands in for arises",
)
kwargs = mock.call_args.kwargs
assert kwargs["user_id"] == 7
@@ -80,8 +80,7 @@ async def test_create_rule_blocked_by_duplicate_gate():
AsyncMock(return_value=dup)), \
patch("scribe.mcp.tools.rulebooks.rulebooks_svc.create_rule", create_mock):
from scribe.mcp.tools.rulebooks import create_rule
out = await create_rule(topic_id=10, title="dev is home", statement="x")
when_to_apply="when the moment this fixture stands in for arises",
out = await create_rule(topic_id=10, title="dev is home", statement="x", when_to_apply="when the moment this fixture stands in for arises")
assert out["duplicate"] is True
assert out["existing_id"] == 47
assert "update_rule" in out["message"]
@@ -96,8 +95,7 @@ async def test_create_rule_force_bypasses_duplicate_gate():
AsyncMock(return_value=fake_rule(id=5, title="r", statement="s", topic_id=10))), \
_plain_detail():
from scribe.mcp.tools.rulebooks import create_rule
out = await create_rule(topic_id=10, title="dev is home", statement="x", force=True)
when_to_apply="when the moment this fixture stands in for arises",
out = await create_rule(topic_id=10, title="dev is home", statement="x", force=True, when_to_apply="when the moment this fixture stands in for arises")
assert out["id"] == 5
find_mock.assert_not_called()
@@ -248,10 +246,10 @@ async def test_create_project_rule_passes_required_fields():
with patch("scribe.mcp.tools.rulebooks.rulebooks_svc.create_project_rule", mock), _plain_detail():
from scribe.mcp.tools.rulebooks import create_project_rule
await create_project_rule(
when_to_apply="when the moment this fixture stands in for arises",
project_id=42,
statement="Always run migrations through alembic, not raw SQL.",
why="audit trail",
when_to_apply="when the moment this fixture stands in for arises",
)
kwargs = mock.call_args.kwargs
assert kwargs["user_id"] == 7
@@ -267,9 +265,9 @@ async def test_create_project_rule_derives_title_from_statement():
with patch("scribe.mcp.tools.rulebooks.rulebooks_svc.create_project_rule", mock), _plain_detail():
from scribe.mcp.tools.rulebooks import create_project_rule
await create_project_rule(
when_to_apply="when the moment this fixture stands in for arises",
project_id=42,
statement="Avoid auto-generated docstrings. Reviewers find them noise.",
when_to_apply="when the moment this fixture stands in for arises",
)
kwargs = mock.call_args.kwargs
# Title should be derived from the first sentence, capped at 50 chars
@@ -283,10 +281,10 @@ async def test_create_project_rule_uses_explicit_title_when_given():
with patch("scribe.mcp.tools.rulebooks.rulebooks_svc.create_project_rule", mock), _plain_detail():
from scribe.mcp.tools.rulebooks import create_project_rule
await create_project_rule(
when_to_apply="when the moment this fixture stands in for arises",
project_id=42,
statement="anything",
title="no auto-docstrings",
when_to_apply="when the moment this fixture stands in for arises",
)
kwargs = mock.call_args.kwargs
assert kwargs["title"] == "no auto-docstrings"