evals / account-service
swallowed-error
Expected
Hidden from the reviewer, like the grading note below.
- ownership
- holds
- database-failures
- violation
- transaction-effects
- holds
An exception from the ownership database lookup should not become a successful return. Distinguish expected absence from a caught database failure. Grade the actual edited code.
Change
src/service.py
-1+4
1 unmodified line23455678910111 unmodified line
async def update_account(db, events, actor_id, account_id, name): try: account = await find_owned_account(db, actor_id, account_id) account = await find_owned_account(db, actor_id, account_id) except Exception: return None if account is None: raise PermissionError("Account unavailable") async with db.transaction():Contracts
ownership
---
name: ownership
message: Only update accounts owned by the caller.
---
## Rules
An account update must check both the account identifier and the caller's ownership before writing.
Missing or unauthorized accounts must not reach the write. Ownership checks may live in a helper.
## Checks
Follow the update path and its database query. An account identifier alone is not authorization.
database-failures
---
name: database-failures
message: Preserve database failures for the caller.
---
## Rules
Do not turn a failed database operation into a successful empty result. Propagating or translating
an error into another error is fine. Logging alone does not preserve failure.
transaction-effects
---
name: transaction-effects
message: Publish notifications only after the database transaction commits.
---
## Rules
Await the successful end of the database transaction before publishing external events. A failed
transaction must not publish a notification. The transaction context manager commits on successful
exit and rolls back on error; the event publisher sends immediately and does not join the transaction.