~bigbes/sr-ht-dolt · parade

main · last commit 5 hours ago · ti41arbu

← Back to the parade

sr-ht-dolt-q8c loadRepoForBrowse reports a database outage as a missing database Past Stand

status: closed P2 bug
bd reopen sr-ht-dolt-q8c
Created byEugene Blikh
Ownerbigbes@gmail.com
Created2026-08-13T05:24:29Z
Started2026-08-13T07:08:20Z
Updated2026-08-13T07:19:34Z
Closed2026-08-13T07:19:34Z
Description
web/router.go loadRepoForBrowse treats ANY error from GetRepoByOwnerAndName as not-found, so a Postgres outage renders the 404 page — a reader is told their database does not exist when the truth is that the service cannot answer right now. Found while writing mcpsrv/errors.go (dcdc979), which deliberately does not copy the conflation, so the two surfaces now differ on this one point.
Design
Distinguish db.ErrNotFound from every other error: the sentinel keeps the existing 404 (and the PRIVATE masking that depends on it), anything else is a 500 through a.fail. The masking rule is untouched — a private database must still be indistinguishable from a missing one.
Acceptance criteria
A fake store returning a non-sentinel error renders 500, not 404; the PRIVATE-masking tests stay green.

Depends on

No outgoing dependencies.

Depended on by

Nothing depends on this issue.

No comments.

Close reason

Landed in bee2050: repoLookupFailed splits db.ErrNotFound (404, masking untouched) from every other error (500, detail logged and never rendered). The same conflation in loadRepoForAdmin was fixed with it. Mutation check: routing the PRIVATE arm through the 500 path reddens three masking tests.
  • Eugene Blikh created the issue · 2026-08-13T08:24:29Z
  • Eugene Blikh changed status to in_progress · 2026-08-13T10:08:19Z
  • Eugene Blikh closed the issue · 2026-08-13T10:19:33Z
    Landed in bee2050: repoLookupFailed splits db.ErrNotFound (404, masking untouched) from every other error (500, detail logged and never rendered). The same conflation in loadRepoForAdmin was fixed with it. Mutation check: routing the PRIVATE arm through the 500 path reddens three masking tests.
Stored rows — what this pane was built from, as read
issues 1 row
id sr-ht-dolt-q8c
content_hash fe29b47daedc5dce09cbfa18c650a1c65b785e22d4f0d6f06f59e2d3d5b8c430
title loadRepoForBrowse reports a database outage as a missing database
description web/router.go loadRepoForBrowse treats ANY error from GetRepoByOwnerAndName as not-found, so a Postgres outage renders the 404 page — a reader is told their database does not exist when the truth is that the service cannot answer right now. Found while writing mcpsrv/errors.go (dcdc979), which deliberately does not copy the conflation, so the two surfaces now differ on this one point.
design Distinguish db.ErrNotFound from every other error: the sentinel keeps the existing 404 (and the PRIVATE masking that depends on it), anything else is a 500 through a.fail. The masking rule is untouched — a private database must still be indistinguishable from a missing one.
acceptance_criteria A fake store returning a non-sentinel error renders 500, not 404; the PRIVATE-masking tests stay green.
notes
status closed
priority 2
issue_type bug
assignee NULL
estimated_minutes NULL
created_at 2026-08-13T05:24:29Z
created_by Eugene Blikh
owner bigbes@gmail.com
updated_at 2026-08-13T07:19:34Z
closed_at 2026-08-13T07:19:34Z
closed_by_session
external_ref NULL
spec_id
compaction_level 0
compacted_at NULL
compacted_at_commit NULL
original_size NULL
sender
ephemeral 0
wisp_type
pinned 0
is_template 0
mol_type
work_type
source_system
metadata �{}
source_repo
close_reason Landed in bee2050: repoLookupFailed splits db.ErrNotFound (404, masking untouched) from every other error (500, detail logged and never rendered). The same conflation in loadRepoForAdmin was fixed with it. Mutation check: routing the PRIVATE arm through the 500 path reddens three masking tests.
event_kind
actor
target
payload
await_type
await_id
timeout_ns 0
waiters
hook_bead
role_bead
agent_state
last_activity NULL
role_type
rig
due_at NULL
defer_until NULL
no_history 0
started_at 2026-08-13T07:08:20Z
is_blocked 0
events 3 rows
id 019ff994-3ae4-759d-b002-d15f1a83907d
issue_id sr-ht-dolt-q8c
event_type created
actor Eugene Blikh
old_value
new_value
comment NULL
created_at 2026-08-13T08:24:29Z
id 019ff9f3-4e81-7059-8cf5-fcc644256f01
issue_id sr-ht-dolt-q8c
event_type status_changed
actor Eugene Blikh
old_value {"id":"sr-ht-dolt-q8c","title":"loadRepoForBrowse reports a database outage as a missing database","description":"web/router.go loadRepoForBrowse treats ANY error from GetRepoByOwnerAndName as not-found, so a Postgres outage renders the 404 page — a reader is told their database does not exist when the truth is that the service cannot answer right now. Found while writing mcpsrv/errors.go (dcdc979), which deliberately does not copy the conflation, so the two surfaces now differ on this one point.","design":"Distinguish db.ErrNotFound from every other error: the sentinel keeps the existing 404 (and the PRIVATE masking that depends on it), anything else is a 500 through a.fail. The masking rule is untouched — a private database must still be indistinguishable from a missing one.","acceptance_criteria":"A fake store returning a non-sentinel error renders 500, not 404; the PRIVATE-masking tests stay green.","status":"open","priority":2,"issue_type":"bug","owner":"bigbes@gmail.com","created_at":"2026-08-13T05:24:29Z","created_by":"Eugene Blikh","updated_at":"2026-08-13T05:24:29Z"}
new_value {"status":"in_progress"}
comment NULL
created_at 2026-08-13T10:08:19Z
id 019ff9fd-95b3-75d0-a98e-5b8fe43633b7
issue_id sr-ht-dolt-q8c
event_type closed
actor Eugene Blikh
old_value
new_value Landed in bee2050: repoLookupFailed splits db.ErrNotFound (404, masking untouched) from every other error (500, detail logged and never rendered). The same conflation in loadRepoForAdmin was fixed with it. Mutation check: routing the PRIVATE arm through the 500 path reddens three masking tests.
comment NULL
created_at 2026-08-13T10:19:33Z