All posts
Team ZEUSDOGFOOD 2026 builderssecurityauthfastapirbac

The rule

GET /api/judge/scores as judge_a returns 200. The same URL with ?judge=judge_a as judge_b must return 401/403. As participant, 401/403. No exceptions, no frontend hiding — the check lives in the FastAPI dependency.

Judges requesting anything but their own id get a 403; organizers must pass an explicit judge_id; everyone else is denied. Verified live across seven role/endpoint combinations in ARCHITECTURE.md.

if current_user.role == UserRole.JUDGE:
    if judge_id and judge_id != current_user.id:
        raise HTTPException(403, "Cannot view other judge's scores")

Defense in depth

Self-review is blocked at POST /api/judge/scores/{id} (403 for team members), declared conflicts block scoring per project, and every scoring mutation appends an audit_events row.

Playwright judge-isolation spec plus run.py prove it on every boot. Residual risk: none known — the one cell of the threat model we are fully green on.

Run it yourself

Every post maps to a real route or file in this repo. Start with the gallery, then the docs.

Browse projectsMore posts

Keep reading

View all