Repository navigation
fix(console): offer Create Namespace again after Refresh - #3002
Conversation
After a 403, Create Namespace stayed disabled through in-app navigation and the page's Refresh, even once an administrator granted Namespace create; only a browser reload asked again, and the page never said so (finding 2083). Refresh now clears the refusal, and the refusal says to select Refresh after an administrator grants access. In-app navigation still keeps it. Client only. Tests pin an unknown administrator answer (still the primary action), a refusal bound to the account the API refused, and the grant-then-Refresh path (finding 2087).
|
🦞👀 Pull request received. I will update this pull request when review starts. ClawSweeper review completeClawSweeper finished reviewing this revision. The review result is being finalized. |
|
Codex review: needs maintainer review before merge. What this changesThis PR restores Create Namespace after Refresh and explains how to retry after an administrator grants access. Example: A reader's attempt to create Granted team is denied, then an administrator grants Namespace creation.
Review scores
ProductKind: Bug fix · Worth it: Yes · Fix scope: Complete Merge readiness✅ Ready for maintainer review Keep this PR open: it provides a focused recovery improvement absent from current main, and no introduced code defect was found. Priority: P2 Before mergeNone. FindingsNone. Tests
Agent review detailsHow this fits togetherThe console renders Namespaces and submits creation requests to OCC, which authorizes the caller before saving the Namespace and queuing provisioning. flowchart LR
User[Console user] --> Refresh[Refresh action]
Refresh --> View[Namespaces view]
View --> API[Namespace creation API]
API --> IAM[IAM authorization]
IAM --> State[Namespace and provisioning work]
Technical reviewBest possible solution: Retain this small Refresh-based recovery path within the existing Namespaces renderer and server-authorized creation workflow. Do we have a high-confidence way to reproduce the issue? Current-main source retains the creation refusal through Refresh, and the added browser scenario targets denial followed by a grant and Refresh; no target code was run during this read-only review. Is this the best way to solve the issue? The patch uses the existing Refresh signal and renderer, preserves suppression across navigation, and leaves every creation attempt subject to server authorization. AGENTS.md: found and applied where relevant. Codex review notes: model internal, reasoning medium; reviewed against e615044ad212. Provenance checked
TestingProof path: in-process harness. SecurityNone. EvidenceWhat I checked:
Likely related people:
Review metrics
LabelsLabel changes:
Label justifications:
Rank-up movesOptional improvements that raise the rating; they are not merge blockers.
Rating scale6/6 🦀 challenger crab · 5/6 🦞 diamond lobster · 4/6 🐚 platinum hermit · 3/6 🦐 gold shrimp · 2/6 🦪 silver shellfish · 1/6 🧂 unranked krab. Overall follows the weaker of proof and patch quality; ✨ marks media proof (a screenshot, video, or linked artifact) that directly shows the changed behavior. WorkflowClawSweeper edits this one comment on every review. Comment HistoryReviewed October 20, 2026, 12:59 AM ET / 04:59 UTC (Revision 3). |
The console flow now says the 403 refusal holds per account across navigation until the page's Refresh passes fromRefresh, and that OCC authorizes each attempt; the Storybook walkthrough checks the Refresh guidance. Word-neutral in platform-console.md (2498 of 2500).
|
@clawsweeper re-review |
|
🦞👀 Re-review progress:
|
|
@clawsweeper re-review |
|
🦞👀 Re-review progress:
|
Problem
#2983 keeps a 403 on Namespace creation for the rest of the page's life: Create Namespace stays disabled and the refusal shows. Once an administrator grants Namespace create, nothing in the console offers it again. In-app navigation keeps the refusal, and so does the page's own Refresh. Only a browser reload asks again, and the page never says so; only the docs do (finding 2083). Separately, 3 of 8 mutants of the gate survived (finding 2087):
Change
namespaces.mjs: the page's Refresh now clears the recorded refusal and offers Create Namespace again. In-app navigation still keeps it, so a refused reader is not invited to fail again on every page change. The refusal now says how to get out: "Your access does not include creating Namespaces in this Installation. After an administrator grants access, select Refresh to try again."console.mjs: passes the load's existingfromRefreshflag into the Namespaces page context. That is one argument; no session, sign-in or IAM change.docs/guides/console/create-namespace.md, the Storybook scenario description andnamespace-create-workflow.mdnow name Refresh.docs/flows/platform-console.md's Namespace paragraph traces it: the 403 refusal holds per account across navigation until Refresh passesfromRefresh; OCC authorizes each attempt. That paragraph is rewritten word-neutrally, because the file is at 2498 of 2500 words.Verification
tests/browser/console-namespace-create.test.mjs:namespace:create, Refresh re-enables the button and the create succeeds. This fails on main./observabilityanswers 503, and Create Namespace stays the primary action.namespaces.mjs, 9 mutants, 2 CPUs): 8 killed.showRefused()strips the primary class on every render that shows the refusal.git merge-treeagainst all 19 open PRs that touch these files (feat(console): move Share Agent into an Access tab #2999 fix(console): let members with agent:create use the create form #2998 fix(console): say email in the failed sign-in message #2997 feat(console): Settings with Sign out and session facts #2996 feat: add Gateway managed mode to Agent deployments #2982 feat: share discoverable Driver configuration definitions #2980 Restore the validated Console destination after session expiry #2979 fix(console): let the create preflight carry any configuration both creates accept #2833 feat(console): show the authorized native Gateway people roster #2596 feat(console): stop and delete Agents from the Agents list #2524 Draft implementation: managed outbound HTTPS for dedicated Gateways #2518 fix(console): distinguish stale runtime status from loss of access #2505 fix(console): keep followed logs steady and report the first output #2502 Add OCE policy simulation and tester for network and plugin actions #2445 fix: preserve native plugin permissions across Harness selection and admission #2258 fix(console): grant Agent access to accepted Configuration Secrets #2255 Support custom Installation profiles and readable Preset starters #2253 feat(auth): sign people in to occ with a device code (rfc-0019) #1619 feat: assign configured OpenClaw roles to Agent users #906). Each shows the same conflicted files and hunk counts against this head as against main.Screenshots, before | after (
ns-refused: right after the 403;ns-granted-refresh: after an administrator grants create and the reader selects Refresh):Storybook: Pages/Namespaces scenario
namespaceCreateRefused(description updated).Risks
Low. A refused reader can try again after Refresh; the API refuses again and the refusal returns, as before. One user-facing sentence was added.