Repository navigation
QA run · records-forms.script-action-hook-refusal-toast (1/1) · 4a428c11 · 2026-10-03 · 1 PASS / 0 PARTIAL / 0 FAIL / 0 BLOCKED / 0 NOT-RUN #21610
Copy link
Copy link
Closed
Labels
Description
Environment fingerprint
- Framework tree:
4a428c11a0on branchclaude/issue-21596-hook-refusal-toast-item(PR qa(checklist): a hook-refused script action shows exactly one error toast carrying its sentence — item, showcase fixture, and one run #21609). The dev server restarted onto this tree before attempt 1. Branch headff3d71c7cfdiffers from it only by a zh-CN action label. - objectuiPin:
89cad75d55702cc4f267bead5bf267de575d5842. The console was built withpnpm objectui:build, which exited 0, and the bundle is stamped objectui@89cad75d5570. - Boot:
objectstack dev --ui --seed-admin -p 41873 -d file:(scratch)/data.dbwithOS_PORT=41873. It used its own port, its own file DB and the stock showcase seed. - Driver: Playwright through
/opt/pw-browsers/chromium, headless, at 1440x900. It signed in through the login form as the seeded admin. - Time: 2026-10-03T16:11Z. Two attempts, each on a fresh page load. One runner, sequential.
Scope
- Selector:
records-forms.script-action-hook-refusal-toast, item revision 1. The item is authored in PR qa(checklist): a hook-refused script action shows exactly one error toast carrying its sentence — item, showcase fixture, and one run #21609 for qa(checklist): a script action refused by a hook with a user-facing sentence shows exactly one error toast carrying it — the re-observation objectui#9151 has had no home for since 2026-09-14 #21596. - Fixture: introduced by the same PR.
- Hook
showcase_guard_task_reopen: beforeUpdate onshowcase_task, with conditionprevious.done == true && record.done != true. Its sandboxed body throws "A finished task cannot be reopened. Create a follow-up task instead." - Script action
showcase_reopen_task: shown in the task list row menu, and writesdone: falseon its record.
- Hook
- Records driven: attempt 1 on finished task "Audit current IA" (
u9qouHpmXBOKDRUy), attempt 2 on "App wireframes" (a2C-KY8jgX_9CFPc).
Per-clause verdicts
| item | clause | oracle | verdict | evidence (text) |
|---|---|---|---|---|
| records-forms.script-action-hook-refusal-toast | 0: the action route answers a 4xx carrying the sentence | network | pass | Both attempts: POST /api/v1/actions/showcase_task/showcase_reopen_task returned 400 with body {"success":false,"error":{"code":"VALIDATION_ERROR","message":"hook 'showcase_guard_task_reopen' threw: Error: A finished task cannot be reopened. Create a follow-up task instead.","httpStatus":400}} |
| records-forms.script-action-hook-refusal-toast | 1: exactly one new error toast containing the sentence | dom | pass | Live toasts ([data-sonner-toast] not data-removed) were 0 at baseline and 1 about 1.1s after the response. That toast has data-type=error and the same text as the response message. A MutationObserver installed before the click saw exactly 1 toast node added in the next 6s, at 193 ms and 145 ms after the click. Screenshot: one red error toast at the top right, over the task list. |
| records-forms.script-action-hook-refusal-toast | 2: the toast is tied to that request | network | pass | The only non-GET request between the baseline read and the toast read was that POST, which returned 400. The toast text equals the response's error.message. |
| records-forms.script-action-hook-refusal-toast | 3: the record is unchanged | api | pass | GET /api/v1/data/showcase_task/ID before and after the click: done stayed true, progress stayed 100, and updated_at did not change (2026-10-03T16:10:34.575Z and 2026-10-03T16:10:35.056Z). |
Derived
- Item verdict: pass. All 4 clauses passed, and the result was reproduced on two records.
- Fixture gaps: none.
Note for the objectui#9151 reading
The toast the user sees carries the sandbox wrapper ahead of the sentence: "hook 'showcase_guard_task_reopen' threw: Error: A finished task cannot be reopened. Create a follow-up task instead."
The same refusal through PATCH /api/v1/data/showcase_task/ID with body {"done":false} answers 400 {"error":"A finished task cannot be reopened. Create a follow-up task instead."}.
This does not fail the item, because the clause asks only that the toast contains the sentence. It is, however, the reading named in the reopen condition of #17682.
Generated by Claude Code
Reactions are currently unavailable
Activity
objectstack-fleet commentedon Oct 6, 2026
Close-out: closed
completed. Every clause passed, so there is no fail or partial to disposeTriage seat (objectstack-wide, seat post #6015) ·
session_01AavokzJ5DndAwitDXvKy4U· 2026-10-06T15:47Z. The maintainer, in the triage seat's chat, approved clearing the openqa-runrecords' close-out debt: 「同意,动手」.Generated by Claude Code
qa(checklist): a hook-refused script action shows exactly one error t…