Conversation
|
Kiro Crew [operator: chenmingwei23]: This PR has been inactive for 7+ days. I reviewed the blockers but they require your input:
When the workflow runs are approved and CI produces a verdict, the pipeline will re-assess on its next cycle. |
|
🤖 Kiro Crew [operator: iamwhatever#241cc860]: This PR has been inactive for 7+ days with its CI never having run (fork workflow gating). I've assessed it and it is resolvable -- I'll rebase onto current main, verify the new e2e step under the reshaped cross-OS e2e job, apply the fork-workflow label and approve the runs, pushing as a co-author if anything needs adjusting. If you'd prefer I don't touch this PR, add the Note on the earlier hand-back: the blocker named there (four workflows stuck at |
4650c17 to
3dacfa9
Compare
UX Review (Fable 5, fork) — ✅ PASSUX-level review of UX-Verdict: PASS CI wiring, docs, and a verification-script extension only — no shipped UI control, string, or pixel changes, so there is no user-facing surface to judge. [UX-REVIEWED] fc0c78b |
Design Review (Fable 5, fork) — ✅ PASSDesign-level review of Design-Verdict: PASS Wires an existing, mutation-proven guard into the job that already has its prerequisites, honors the floor-mirror obligation, and declares every side effect. Suggestions
[DESIGN-REVIEWED] fc0c78b |
GPT 5.6 Review (fork) — ✅ no blocking findingsReviewed Review detailsNo findings. |
First Principles Review (Fable 5, fork) — ✅ PASSPremise-level review of All claims verified against the base tree. Key confirmations: the unit test header at First-Principles-Verdict: PASS Confirm #10625 exists and tracks wiring Not justified as shipped
What this change shipsInventory (9 items) — 8 justifiedIntent: make the real-browser proof of the agent picker inside Schedule dialogs actually run in CI, and extend it to the edit dialog — a FIX (closing a verified coverage gap: base grep confirms zero workflow invocations of a script the unit suite explicitly delegates to).
[FIRST-PRINCIPLES-REVIEWED] fc0c78b |
Opus 4.8 Review (fork) — ✅ no blocking findingsReviewed |
|
🤖 Kiro Crew [operator: iamwhatever#241cc860]: span=3d7b863170ab — disposition: justified as shipped.
|
|
🤖 Kiro Crew [operator: iamwhatever#241cc860]: span=3d40c6dd5b93 — disposition: accepted-and-deferred to #10625.
|
3dacfa9 to
966897e
Compare
…dit dialog The real-browser guard behind AgentSelector.dialog.test.tsx existed but no workflow invoked it, and it drove only the create dialog: the guarded behaviour had no automatic guard at all, and the edit dialog (the second door to the same picker) had never been driven even manually. - ci.yml: run 'npm run verify:agent-selector-dialog' in the e2e job, between the Chromium install and the i18n render gate it shares them with. The outDir is passed explicitly so a red run's screenshots land under website/test-results/, which the job's existing failure-artifact upload already collects; the script's /tmp default is discarded with the runner, leaving only the thrown error to debug a real-browser failure. - verify-agent-selector-dialog.mjs: factor the drill into driveAgentPicker() and run it against BOTH host dialogs; the edit leg reaches its dialog through a persisted-job fixture row (/api/crons). Fresh navigation between legs: Escape aimed at the dialog races the popup's unmounting DismissableLayer (observed timeout on an identical rebuild). - docs/ci/e2e-gate.md: document the step where the job's other gates are. - prepare-pr profiles/kirocrew.json: add the same command to the local gate floor. test_ci_blocking_scans_are_covered_by_the_floor requires every npm script ci.yml runs to be a local gate or a recorded exemption, so that a gate CI gains is one an installed prepare-pr copy can still learn about. Not exempted: the guard is a real gate and costs 7s, and the floor already builds the bundle it serves. No outDir there -- there is no artifact uploader locally, so the script's /tmp default is the useful one. The create leg's button lookup also narrows from /Add job|Create your first job/ to exact 'Add job'. The alternation existed only because the old fixture had no jobs, so the empty-state button was reachable; the edit leg's fixture persists one, which makes that branch dead and the exact matcher the stricter choice. Addresses kirodotdev#8963 Co-authored-by: Kiro Crew <noreply@kirodotdev.github.io>
966897e to
fc0c78b
Compare
|
🤖 Kiro Crew [operator: iamwhatever#241cc860]: Green and ready for maintainer review — 78 pass / 5 skipping / 0 failing at Why this sat for 7 days: nothing was wrong with the code. Because the PR edits The guard now actually runs, and both legs are proven — not asserted. From the The Two things CI caught that review could not have, both now fixed. Worth stating plainly, since the PR's own thesis is that an unrun guard is not a guard:
One sibling deliberately left, and tracked: #10625 wires Reviewer lanes at this head: Design PASS, First Principles PASS, UX PASS, GPT 5.6 and Opus 4.8 clean, 0 unresolved threads. First Principles raised the sibling-guard concern in earlier rounds; it is answered on the record and converged to PASS. @javenciu — your commit is preserved as author; I rebased onto current Over to a maintainer for the review decision. |
iamwhatever
left a comment
There was a problem hiding this comment.
Tier 1 auto-approve: chore / build tooling (4 files). Criteria: no conflict, no requested changes, security path denylist clean, design-doc gate clean, SAST annotations clean, security checklist all-NO, AI reviewers green. Category: CI plumbing only -- wires the existing verify:agent-selector-dialog real-browser guard into the e2e job (reusing that job's Chromium install and built bundle), extends the script to also drive the edit dialog, adds it to the prepare-pr gate list, and updates docs/ci/e2e-gate.md; no runtime code path changes. CodeQL is not applicable on this fork PR (default-setup emits no check-run); SAST coverage is Semgrep only, latest run success with 0 annotations.
|
🤖 Kiro Crew [operator: iamwhatever#241cc860]: Closing this as a maintainer CI-policy decision — not a problem with your work, and not a disagreement with the defect you identified. Why. We don't want another blocking real-browser gate running on every PR. Agentic testing is landing very shortly, and interaction coverage of this kind belongs there and in the release-time regression suite rather than in For the record, the work was sound. I drove it to green before this decision, so this is not a quality judgement:
Your diagnosis in #8963 was also correct, and that issue stays open: the script covered only the create dialog, and no workflow invoked it. The gap is real; only the delivery mechanism is changing. What is worth salvaging. The Thank you for the contribution, and apologies that it sat for a while before getting a clear answer — the fork workflow-approval gating meant CI had never run on it, so there was no verdict to respond to until this week. |
Pull request was closed
Problem / Motivation
website/src/test/AgentSelector.dialog.test.tsxpins structure only: its own header says happy-dom cannot exercise Radix's layer interplay faithfully and delegates the end-to-end proof towebsite/scripts/verify-agent-selector-dialog.mjs. But no workflow invoked that script (git grep 'verify:agent-selector-dialog' -- .github/= 0 hits at base), so the guarded behaviour had no automatic guard at all. And the script drove only the CREATE dialog: the EDIT dialog (JobDetailDialogopened from an existing job's row) hosts the same picker through a second door that had never been driven even manually.Why it matters
The picker-inside-modal-dialog interaction has already broken once (#6358: react-remove-scroll's
pointer-events: noneswallowed option clicks). A regression today would ship silently: the unit suite passes by design (it cannot see the defect class), and the script that can see it never runs. The edit dialog is the door users actually take to change an existing job's agent, so an edit-only regression (different mount order, same component) is invisible twice over.What changed (motivation → approach → change)
The script already had everything CI needs: it serves
website/distover loopback, answers every/api/**from fixtures, needs no gateway, and reuses a Chromium install. So the wiring belongs inci.yml'se2ejob between the Chromium install and the i18n render gate it shares those with — same reasoning that placed the render gate there.For the edit leg, the drill (open picker → mouse commit → dialog survives → keyboard path → wheel scroll → Escape scoping) is identical for both host dialogs, so it is factored into
driveAgentPicker(page, dialog, shot)and run against both. The edit dialog is reachable only through a persisted job row, so the fixture now answers/api/cronswith one plain message job. Between legs the script re-navigates instead of pressing Escape: Escape aimed at the dialog races the popup's unmounting DismissableLayer, which can still swallow it — observed as a create-dialog-never-detaches timeout on an identical rebuild.EXPECT=brokenmode stays create-only: it exists to reproduce the #6358 pre-fix state, which predates the edit-dialog leg.Two consequences of the above, declared rather than left to be discovered:
The create leg's button lookup narrows from
/Add job|Create your first job/to exactAdd job. The alternation existed only because the old fixture answered/api/cronswith an empty list, so the empty-state button was the reachable one. The edit leg needs a persisted job, which makes that branch dead — and the exact matcher is the stricter choice, because the alternation would let the create leg pass by entering through whichever button happened to exist if the fixture ever regressed to empty.Wiring a command into
ci.ymlalso obliges adding it to the prepare-pr local gate floor (profiles/kirocrew.jsongates[]).test_ci_blocking_scans_are_covered_by_the_floorenforces that every npm script CI runs is either a local gate or a recorded exemption, so that a gate CI gains after release is still one an installed prepare-pr copy can learn about. It is added, not exempted: the guard is a genuine gate, it costs 7s, and the floor already builds the bundle it serves. It sits before thei18n:renderentry, mirroring the step order inci.yml.Tests
This PR is itself test infrastructure. What locks the behavior in:
e2ejob (until this PR, the script's verdict was unreachable by automation).AgentSelector.dialog.test.tsx7/7 green — the unit pins and the e2e drill stay consistent.Manual verification
EXPECT=fixed node scripts/verify-agent-selector-dialog.mjs→OK [create]+OK [edit](4 independent green runs).node --checkon the script, js-yaml parse ofci.yml,scripts/docs-lint.shall green.Screenshots / video
Screenshot sets are produced by the script itself (
This PR changes CI wiring and a verification script only; the shipped dashboard bundle is untouched, so there is no user-visible delta to screenshot.create-*/edit-*: dropdown open, selection committed, keyboard filter) and were captured on every green run. The guard's evidence artifacts are its own output; no shipped UI pixel changes in this PR.Related Issues
Fixes #8963
Both points the issue raises are addressed here: the guard now drives the edit dialog as well as the create dialog, and the
e2ejob invokes it.Deliberately left, and tracked: #10625 wires
website/scripts/verify-crews-dialog-select.mjs, the one genuine sibling of this defect. It is delegated to by 6 files (includingCrewEditorSelect.test.tsx,CrewRoster.test.tsxandWorkspaceModal.test.tsx), is registered in nopackage.jsonscript, and is invoked by no workflow — so this PR's own harvest rule fires for it too. It is not folded in here because wiring it needs a newpackage.jsonentry and it guards the crews/workspace dialogs rather than the Schedule agent picker.website/scripts/verify-timezone-search.mjsis also unwired, but it is NOT an instance of this class and #10625 does not cover it:git grepfinds no file that delegates to it except itself, so no test promises coverage it does not deliver. An unreferenced script is dead weight, not a false guarantee.Pattern harvest
A delegating test header ("the real proof lives in script X") is a promise, not a guard: it holds only if some workflow invokes X. The unit suite here named its e2e counterpart for months while CI never ran it — structure-pinning tests passing green created the impression of coverage precisely where the defect class was invisible to them.
Rule candidate: every test that delegates its load-bearing assertion to an external script must be paired with a CI invocation of that script; a delegation comment without a workflow hit is a coverage gap, not coverage.
Checklist
docs/ci/e2e-gate.md)Contribution License Agreement
I confirm this contribution is made under the terms of the repository's contribution license agreement.