You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
objectuiPin:89cad75d55702cc4f267bead5bf267de575d5842. The console was built with pnpm objectui:build, which exited 0, and the bundle is stamped objectui@89cad75d5570.
Boot:objectstack dev --ui --seed-admin -p 41873 -d file:(scratch)/data.db with OS_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.
Hook showcase_guard_task_reopen: beforeUpdate on showcase_task, with condition previous.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 writes done: false on its record.
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.
Close-out: closed completed. Every clause passed, so there is no fail or partial to dispose
Triage seat (objectstack-wide, seat post #6015) · session_01AavokzJ5DndAwitDXvKy4U · 2026-10-06T15:47Z. The maintainer, in the triage seat's chat, approved clearing the open qa-run records' close-out debt: 「同意,动手」.
Read at this write: the record's single clause is PASS, and its comment thread is empty.
Under checklist-test §5, a record closes when every fail has a disposition and every partial is named. There is neither here, so nothing is extracted, parked or carried.
Environment fingerprint
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.89cad75d55702cc4f267bead5bf267de575d5842. The console was built withpnpm objectui:build, which exited 0, and the bundle is stamped objectui@89cad75d5570.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./opt/pw-browsers/chromium, headless, at 1440x900. It signed in through the login form as the seeded admin.Scope
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.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."showcase_reopen_task: shown in the task list row menu, and writesdone: falseon its record.u9qouHpmXBOKDRUy), attempt 2 on "App wireframes" (a2C-KY8jgX_9CFPc).Per-clause verdicts
POST /api/v1/actions/showcase_task/showcase_reopen_taskreturned 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}}[data-sonner-toast]notdata-removed) were 0 at baseline and 1 about 1.1s after the response. That toast hasdata-type=errorand 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.error.message.GET /api/v1/data/showcase_task/IDbefore and after the click:donestayed true,progressstayed 100, andupdated_atdid not change (2026-10-03T16:10:34.575Z and 2026-10-03T16:10:35.056Z).Derived
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/IDwith 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