main · last commit
5 hours ago ·
ti41arbu
sr-ht-dolt-q8c loadRepoForBrowse reports a database outage as a missing database
Past Stand
bd reopen sr-ht-dolt-q8c
| Created by | Eugene Blikh |
| Owner | bigbes@gmail.com |
| Created | 2026-08-13T05:24:29Z |
| Started | 2026-08-13T07:08:20Z |
| Updated | 2026-08-13T07:19:34Z |
| Closed | 2026-08-13T07:19:34Z |
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.
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.
A fake store returning a non-sentinel error renders 500, not 404; the PRIVATE-masking tests stay green.
No outgoing dependencies.
Nothing depends on this issue.
| 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 |
| 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 |
No comments.
Close reason