opencode-bot: changes for issue #193 #202

Merged
Grandiras merged 1 commit from opencode/issue-193 into main 2026-09-18 20:31:10 +00:00
Collaborator

Closes #193.

Closes #193.
opencode-bot: finish the task for #193
All checks were successful
CI / build (pull_request) Successful in 41s
4470065d1e
Author
Collaborator

🤖 Reviewing this PR — the review will link the full session transcript.

🤖 Reviewing this PR — the review will link the full session transcript. <!-- opencode-run:review -->
opencode-reviewer left a comment

✅ Verdict: approve — no blocking issues found.

Moves the three board-scoped admin pages onto the board as /board/{id}/settings/{columns,tags,access} plus a rename/delete page, gates them on the board's admin grant row instead of the super-admin policy, and redirects the old routes. The permission model is sound: pages resolve the board for the viewer and render board.denied for non-admins, while every write is still refused in the services by BoardPermissions.RequireAdminister, so a role taken away mid-visit is refused server-side and not only hidden. The header's "Board settings" entry is gated on the same grant rows (GetAdministeredAsync, refreshed on BoardsChanged), and _isSuperAdmin is read from the same snapshot the Admin policy uses, so entry and pages cannot disagree. The old routes redirect without leaking anything (plain [Authorize]; the bare forms' "first administered board" substitution is the one deliberate one and only for URLs that never named a board). ActiveBoardId's first-segment parse handles the settings sub-paths; SettingsHref's null-forgiving dereference is only reached under CanManageActiveBoard. Localization keys exist in both locales, the e2e suite has been moved to the new routes, and no references to the removed access-ignored reads (GetAllAsync/ResolveForAdminAsync/GetAccessSummariesAsync) or board MoveAsync remain. Docs are updated consistently with the code.

Minor notes, none blocking: Boards.razor no longer clears _newName or toasts on create (moot — it navigates straight to the new board); the columns/tags pages still import the sortable JS module before discovering the list is empty on a denied render (harmless); and a board admin now sees the full deployment member list on the access page — inherent to board admins granting access, and documented as such.



⏱ 4m 20s · 14 steps · $0.0548 · tokens: 167.7k in / 13.9k out (+758.1k cache-read) · Go: 5h 56% · wk 47% · mo 25%
📜 Full session transcript

✅ **Verdict: approve** — no blocking issues found. Moves the three board-scoped admin pages onto the board as `/board/{id}/settings/{columns,tags,access}` plus a rename/delete page, gates them on the board's admin grant row instead of the super-admin policy, and redirects the old routes. The permission model is sound: pages resolve the board for the viewer and render `board.denied` for non-admins, while every write is still refused in the services by `BoardPermissions.RequireAdminister`, so a role taken away mid-visit is refused server-side and not only hidden. The header's "Board settings" entry is gated on the same grant rows (`GetAdministeredAsync`, refreshed on `BoardsChanged`), and `_isSuperAdmin` is read from the same snapshot the Admin policy uses, so entry and pages cannot disagree. The old routes redirect without leaking anything (plain `[Authorize]`; the bare forms' "first administered board" substitution is the one deliberate one and only for URLs that never named a board). `ActiveBoardId`'s first-segment parse handles the settings sub-paths; `SettingsHref`'s null-forgiving dereference is only reached under `CanManageActiveBoard`. Localization keys exist in both locales, the e2e suite has been moved to the new routes, and no references to the removed access-ignored reads (`GetAllAsync`/`ResolveForAdminAsync`/`GetAccessSummariesAsync`) or board `MoveAsync` remain. Docs are updated consistently with the code. Minor notes, none blocking: `Boards.razor` no longer clears `_newName` or toasts on create (moot — it navigates straight to the new board); the columns/tags pages still import the sortable JS module before discovering the list is empty on a denied render (harmless); and a board admin now sees the full deployment member list on the access page — inherent to board admins granting access, and documented as such. --- --- ⏱ 4m 20s · 14 steps · $0.0548 · tokens: 167.7k in / 13.9k out (+758.1k cache-read) · Go: 5h 56% · wk 47% · mo 25% 📜 [Full session transcript](https://git.grandiras.net/Grandiras/opencode-bot/src/branch/opencode-logs/transcripts/Grandiras/Ponente/pr-202/run-2026-09-18T20-25-34-965Z.md) <!-- opencode-reviewed-head:4470065d1e091aad0a7267594c7a426cc903b73b --> <!-- opencode-verdict:approve -->
Grandiras deleted branch opencode/issue-193 2026-09-18 20:31:11 +00:00
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
2 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
Grandiras/Ponente!202
No description provided.