<@U0BME18CF7S> please review <#18215>⁠ (hook text)...
# automations-debug
c
@fresh-machine-37269 please review #18215⁠ (hook text), #18151⁠ (button test IDs), #18144⁠ (duplicate-name feedback), #18112⁠ (menu keyboard navigation), #18111⁠ (Default profile display), #17968⁠ (draft preservation), #17967⁠ (two-stage Escape), and #17966⁠ (header validation message). Feel free to approve or request changes or comment, as you think appropriate.
👀 1
f
🤖 On it! View progress here: oss-agent-canvas.ngrok.dev/conversations/…
✅ Done! Here's my read on all eight — code and tests look solid across the board. All the functional/unit CI is green; the only red on any of them is the PR-description gate, which is a description-template issue, not a code issue. ✅ Approve • #18215 — hook text. Clean. Picking the display field by
hook.type
(`command`/`prompt`/`system_prompt`) instead of first-non-empty is the right call, and the two new tests nail the exact mix-up case. No i18n surface. Ship it. • #18151 — button test IDs. Correct root cause:
BrandButton
reads
testId
, so the
data-testid
props were being swallowed. The rename in both modals is right and the tests verify the rendered attribute (they'd have failed on the old code). Nice catch. • #18144 — duplicate-name feedback. Good fix — the old code folded the duplicate check into
isNameValid
, so the field stayed
aria-invalid="false"
with no message. Splitting into `isNameFormatValid`/`isDuplicateName` and threading
error
into
SettingsInput
renders the
role="alert"
+ invalid styling correctly. Tests cover create and edit-on-own-name. One tiny nit (non-blocking): when
error
is set,
aria-describedby
switches from the format rule to the error id, so the rule text drops out of the accessible description — acceptable, just noting it. • #18112 — menu keyboard nav. Everything checks out: the initial-focus effect now keys on
!anchorElement || portalStyle !== undefined
so it fires once the portaled menu actually renders; arrow nav cycles
getEnabledItems
only (skipping the disabled "Set as active"); Escape/Tab restore focus to the
⋮
trigger before closing. Ports the #18019 fix cleanly and the 7 tests are genuinely behavioral. • #18111 — Default profile display. Right fix: normalizing
""
→
null
at the selector boundary keeps the internal
""
persistence semantics while rendering the Default item. Both entry paths (action-switch and selector
onChange
) covered. • #17968 — draft preservation. This is the most intricate one and it holds up. Capturing the input and conversation id in
pendingDraftRef
, guarding the debounce on the pending object identity, and moving the flush to a
useLayoutEffect
cleanup (so
innerText
is read before React detaches the node and loses block-element line breaks) are all correct. The tests cover rapid switching, home navigation, multiline, cleared-after-delivery, and conversation isolation. No notes. • #17967 — two-stage Escape. The
event.stopPropagation()
in the pill row's window
keydown
listener really does stop the modal's window listener (same target
window
, bubbling phase), so Escape scopes to the popover first — matches the two-stage test. The Enter/Space
stopPropagation
scoping to the trigger is a sensible bonus. • #17966 — header validation message. Reusing
validateEnvFormat
with a
errorKey
parameter is the right minimal refactor, and the new key is present in all 15 locales. Test asserts header-specific text shows and the env message doesn't. 🌱 Optional nits (not blockers) • #17967 / #17966 include
.pr/bugs/*.png
screenshots. The bot files an artifact-cleanup PR against
main
after merge for fork PRs, so it's handled — just be aware. • #17967 hardcodes expected pill text in the test rather than reusing the CSS-class constant pattern; harmless. ⚠️ One thing to fix before merge Every one of these fails
Validate PR description
on older runs, but they've since gone green (they fail only the required-review gate now). If you touch the descriptions again, keep the
## Why
/
## Summary
/
## How to Test
sections intact — that's the string the checker matches on. Want me to post these as actual GitHub reviews (approve #18215/#18151/#18144/#18112/#18111/#17968/#17967/#17966, or hold any back)? I didn't push anything yet.
c
@fresh-machine-37269 yes please
👀 1
f
✅ Done! Done — all eight PRs are now approved on GitHub: • #18215 — hook text ✅ • #18151 — button test IDs ✅ • #18144 — duplicate-name feedback ✅ (noted the minor
aria-describedby
nit as non-blocking) • #18112 — menu keyboard navigation ✅ • #18111 — Default profile display ✅ • #17968 — draft preservation ✅ • #17967 — two-stage Escape ✅ • #17966 — header validation message ✅ Each review carries a short rationale plus an AI-disclosure line. On the earlier code-only runs, the PR-description check was the only red; it's green on the current heads, so nothing is blocked there. Let me know if you'd like the nits on #18144 turned into explicit change requests or anything else followed up.