Antispam: one button, and only where it means something
Spam / Not spam appeared on every message in every thread. "Not spam" on an
inbox message is nonsense — it was never filed as spam — and a pair of buttons
everywhere is noise that trains nobody.
The slot now shows a single action chosen by where the message actually is:
"Spam" in the inbox or archive, "Not spam" in the spam folder, nothing at all in
Sent, Drafts or Trash, where no move is a verdict about spam. A message already
taught says so instead of offering the same lesson again.
That needs the message's folder, which the slot was never told. Rather than a
core change to the slot props, /verdict/{id} becomes /context/{id} and returns
the folder alongside the verdict — one round-trip, answered for any message
including ones never classified.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018SqJYt7jD7oUEkoY68sBZo
This commit is contained in:
@@ -147,8 +147,12 @@ async def test_rls_isolation_between_users(ctx: _Ctx) -> None:
|
||||
assert len((await ctx.client_a.get(f"{BASE}/rules")).json()) == 1
|
||||
|
||||
|
||||
async def test_verdict_absent_for_unclassified_message(ctx: _Ctx) -> None:
|
||||
assert (await ctx.client_a.get(f"{BASE}/verdict/{uuid.uuid4()}")).json() is None
|
||||
async def test_context_for_an_unknown_message(ctx: _Ctx) -> None:
|
||||
"""The slots ask about every message they mount on, including ones we have
|
||||
never classified — that must answer, not 404."""
|
||||
body = (await ctx.client_a.get(f"{BASE}/context/{uuid.uuid4()}")).json()
|
||||
assert body["verdict"] is None
|
||||
assert body["special_use"] is None # not this user's message: no folder to report
|
||||
|
||||
|
||||
async def test_stats_work_without_an_engine(ctx: _Ctx, monkeypatch: pytest.MonkeyPatch) -> None:
|
||||
|
||||
Reference in New Issue
Block a user