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
Found by booting the app and driving it in a real browser. First browser verification of this project; this is what it produced.
duly_task_complete, duly_task_undo and duly_task_skip (merged in #41) are unreachable from the UI. #4's 35 tests pass — they assert metadata shape, handler registration under the dispatch key, and engine-level dispatch. None of that says a human can click the thing.
Measured, on main at 7c30a39, Chromium 1194
Declared location
Surface
What actually renders
list_toolbar (bulk, declarative bulkActionDefs)
list, rows selected
✅ Complete · Skip — works end to end
list_item
grid row ⋯ menu
❌ Edit, Delete only
record_header
detail header
❌ Edit + ⋯ only
record_more
detail ⋯ overflow
❌ Share, Delete only
All three locations are valid members of ACTION_LOCATIONS in @objectstack/spec 17.2.0, and the predicates match the records under test (an open task; visible is status == "open" || status == "in_progress").
Zero console errors, zero page errors, zero 4xx across every screen.
One earlier probe of mine was a false positive and is retracted: a substring search found "Skip" on the detail page, but that was "Skipped" in the built-in status pipeline, not the action. Opening the overflow menu properly is what settled it.
What does work
The declarative bulk path, verified end to end in the browser: select two rows → Complete → confirm → the row leaves My week (6 rows → 5) → the server shows status: done with completed_at stamped by the Task lifecycle hook — completed_at and last_update_at stamping #3 hook. No errors.
The built-in status pipeline on the record detail page (Open / In progress / Done / Skipped / Cancelled) — a platform affordance that comes free with a trackHistory select, not one of our actions.
So the product is not unusable. But the interaction the product is designed around — a one-click tick on the row, with undo — is not there.
The uncomfortable part
#4's dev had to hand-write these three handlers because the platform has no declarative row-level field write (objectstack#14092). The half they were able to build as pure metadata renders and works; the half they had to write by hand does not render at all.
That is the metadata-first rule earning its keep in a way none of us predicted: it did not merely produce less code, it produced the half that survives contact with the UI.
Scope
Root-cause why an object-bound type: 'script' action with locations: ['list_item'] is not picked up by the grid renderer. objectui honours list_item in RelatedList.tsx (child rows on a detail page) and record_header/record_more in containers.tsx / DetailView.tsx, so the code paths exist — something about these declarations is not reaching them. Establish that before changing anything.
If the cause is ours, fix it. If it is a platform gap, file it upstream and say so on this card — do not work around it with a second implementation.
Add a check that fails when a declared action is not reachable. Every existing assertion is satisfied by an action nobody can click, which is exactly how this shipped green.
Found by booting the app and driving it in a real browser. First browser verification of this project; this is what it produced.
duly_task_complete,duly_task_undoandduly_task_skip(merged in #41) are unreachable from the UI. #4's 35 tests pass — they assert metadata shape, handler registration under the dispatch key, and engine-level dispatch. None of that says a human can click the thing.Measured, on
mainat7c30a39, Chromium 1194list_toolbar(bulk, declarativebulkActionDefs)list_itemrecord_headerrecord_moreAll three locations are valid members of
ACTION_LOCATIONSin@objectstack/spec17.2.0, and the predicates match the records under test (anopentask;visibleisstatus == "open" || status == "in_progress").Zero console errors, zero page errors, zero 4xx across every screen.
One earlier probe of mine was a false positive and is retracted: a substring search found
"Skip"on the detail page, but that was"Skipped"in the built-in status pipeline, not the action. Opening the overflow menu properly is what settled it.What does work
status: donewithcompleted_atstamped by the Task lifecycle hook — completed_at and last_update_at stamping #3 hook. No errors.trackHistoryselect, not one of our actions.So the product is not unusable. But the interaction the product is designed around — a one-click tick on the row, with undo — is not there.
The uncomfortable part
#4's dev had to hand-write these three handlers because the platform has no declarative row-level field write (objectstack#14092). The half they were able to build as pure metadata renders and works; the half they had to write by hand does not render at all.
That is the metadata-first rule earning its keep in a way none of us predicted: it did not merely produce less code, it produced the half that survives contact with the UI.
Scope
type: 'script'action withlocations: ['list_item']is not picked up by the grid renderer. objectui honourslist_iteminRelatedList.tsx(child rows on a detail page) andrecord_header/record_moreincontainers.tsx/DetailView.tsx, so the code paths exist — something about these declarations is not reaching them. Establish that before changing anything.Note for #16 (mobile)
Swipe-to-complete was going to reuse these actions. Whatever the answer here is, it decides that too.