Repository navigation
Conversation
The required Secret picker's error now names the label the page shows (API key Secret or Service account token Secret) on Create Agent and the authentication source form, and a shown error follows a renamed label (finding 1987). A picker showing its error no longer opens its list on focus, so the console's own check does not cover the error; click, typing and ArrowDown still open it (finding 1988). A Create Secret refusal other than a name conflict takes focus inside the dialog, on the refusal, instead of dropping it to the page (finding 1989).
|
🦞👀 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 changes before merge. What this changesSecret-picker validation names the visible field, keeps its error unobscured, and focuses creation refusals inside the dialog. Example: Create Research assistant using Service Accounts without selecting a Secret.
Review scores
ProductKind: Bug fix · Worth it: Yes · Fix scope: Complete Merge readiness⛔ Needs changes before merge - 1 item remains This PR fixes concrete Secret-picker usability defects with a focused shared-component change; no introduced correctness or security defect was found. Priority: P2 Before merge
FindingsNone. Agent review detailsHow this fits togetherThe console’s shared Secret picker serves Agent creation and credential editing, translating selections, validation results, and Secret API responses into bindings and accessible feedback. flowchart TD
A[Agent creation form] --> C[Shared Secret picker]
B[Credentials form] --> C
C --> D[Field validation helpers]
C --> E[Namespace Secret API]
E --> F[Creation dialog feedback]
D --> G[Visible accessible errors]
F --> G
Technical reviewBest possible solution: Land the focused shared-picker repair after the existing native-media handoff is completed. Do we have a high-confidence way to reproduce the issue? Current-main source exposes the reported paths, and before screenshots corroborate the obscured validation error; no target code was executed during this review. Is this the best way to solve the issue? The patch repairs the existing shared owner using established validation and focus helpers while preserving selection, keyboard access, and name-conflict recovery. AGENTS.md: found and applied where relevant. Codex review notes: model internal, reasoning medium; reviewed against 3484c9d715aa. Provenance checked
TestingProof path: in-process harness. SecurityNone. EvidenceWhat I checked:
LabelsLabel changes: No label changes. Label justifications:
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 HistoryReview history (3 earlier review cycles)Reviewed October 19, 2026, 5:36 PM ET / 21:36 UTC (Revision 4). |
|
@clawsweeper re-review |
|
🦞👀 Re-review progress:
|
|
Thanks. The only before-merge item is the native-attachment upload. This host can't upload native GitHub attachments, so the media follows the maintainers' committed-media flow: the screenshots ( |
|
@clawsweeper re-review |
|
🦞👀 Re-review progress:
|
|
@clawsweeper re-review |
|
🦞👀 Re-review progress:
|
|
@clawsweeper re-review |
|
🦞👀 |
Problem
Three lows from the live walk on oce-dogfood-b and the form-field lanes (#2907, #2918), all in the Secret picker (
secret-picker.mjs):validateFields) moves focus to a required picker, the list covers the new error under the field until Escape.NAMESPACE_NOT_READYon a provisioning Namespace; also 400/403/404/429) disabled the submit while it ran, so focus dropped to the page body behind the open dialog.Change
aria-invalid="true") does not open its list on focus. Click (new listener), typing and ArrowDown still open it, as before. A valid picker still opens on focus as today.revealStatus(feedback, dialog), in view. An unknown outcome is handled the same way.Pages / Create Agent / Model credential Secret requiredandPages / Create Agent / Create Secret refused;form-field-workflow.mdsteps 6-8 updated (the list no longer needs Escape).Presentation only: no API or authorization change.
Verification
console-form-fields.test.mjs: Create Agent's required Secret error names its field and stays in sight (1440 and 390). It checks the error text for both methods, a closed list with the error on top (elementFromPoint), and that click, ArrowDown and typing still open the list. A refused Create Secret keeps focus in the dialog on the refusal, in view, for 409NAMESPACE_NOT_READY, 403 and 429 (1440 and 390), and a name conflict still focuses Name.console-form-fields-2.test.mjs: the authentication source form names "Service account token Secret" in its required error, with the list closed.3110ba7c7, which moved both touched test files): both touched files ran 3/3 at 2 CPUs (25 tests per run).merge-treeof this head against the 16 open PRs that touch console, Storybook or browser-test files (fix(console): match Chromium's break points for long Agent names #2916, fix(console): let the create preflight carry any configuration both creates accept #2833, feat: add per-agent sandbox network policies and denial review #2599, feat: admit explicit Gateway identities and show native people in OCC #2596, feat(console): stop and delete Agents from the Agents list #2524, RFC and 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, docs(specs): propose rfc-0019 for repository options without a repository driver #878, feat: add Agent workload tags #115) shows the same conflict count as main for each: zero new conflict hunks.Media (Storybook fixtures on the merged head)
These are the author's Storybook screenshots and walkthrough. We reproduced the three states at 1440 × 900 and 390 × 844 in Chromium, with the picker from
dd92bd62a6ddfor the before comparison and the PR at3110ba7c75f5for the after comparison. We checked the field label and error, whether the list obscured the error, and where focus landed after the simulated refusal. The captures show Console behavior with fixture data. They do not exercise live Secret creation or storage.Model credential Secret required (Create Agent, Service Accounts): before, the open list covers the field's error; after, the error names the shown field ("Service account token Secret is required.") and the list stays closed
Authentication source required fields: before, the list opens over the error; after, it stays closed
Create Secret refused (409 NAMESPACE_NOT_READY): before, focus is on Name, not the refusal; after, the refusal has focus inside the dialog
Stories:
Pages / Create Agent / Model credential Secret required,Pages / Create Agent / Create Secret refused,Pages / Agent detail / Authentication source required fields.Recording: walkthrough (1280x800, webm): Create Agent's Service account token Secret error with the list closed, the label and error following the method ("API key Secret is required."), click and ArrowDown opening the list, then the Create Secret refusal taking focus in the dialog.
Risks
Low. Keyboard readers who Tab into a picker that shows its error now press ArrowDown or type to open the list; one without an error still opens on focus. Findings 1987, 1988, 1989; UX plan C3 follow-up. Finding 1993 (Share Agent explainer) is left for #906, which rewrites
access.mjs.