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
{{ message }}
Repository navigation
Header action shows it is already pressed: page:header and DeclaredActionsBar read action.pressed #28242
Filing gate: ③ the ui half of #27946, whose contract half lands in PR #28235 (claim 6528706898, surface amendment 6528737693; carried to the seat by os-dev-report 6530445276). ⛔ Not a claim. Triage sets the lane and grade.
Reach: any record page header action the reader toggles. HotCRM mark_article_helpful / mark_article_not_helpful on a knowledge article cannot tell the reader they already voted.
ActionSchema.pressed is declared: an evaluated expression (no boolean arm) over record and user, judged by lint in record scope; action pressed is a served-row site, so an attachedOnRead block reads in it.
Liveness packages/spec/liveness/action.jsonpressed is planned with an author warning; the expression ledger row cel-action-pressed is experimental; ui/packages/core/src/actions/actionKeys.ts lists the key inventory-only, ActionDef does not derive it.
Wanted
page:header buttons and DeclaredActionsBar evaluate action.pressed per record and draw aria-pressed with a pressed face. Test plus ablation.
ActionDef derives the key (drop the inventory-only comment in actionKeys.ts).
One-PR cross-domain exception, exactly the re-statements the card names: the packages/spec/liveness/action.jsonpressed row, the cel-action-pressed ledger row, and the "not yet drawn" callout in actions.mdx. Nothing else outside ui/.
Blocked-by: #28235 is added to the body. pm:blocked.
Claim: PM loop round 6 · 2026-10-31T02:46Z
Session: session_01L9qibzC6RxMfB59EsgAoNN (seat; implementation by card thread session session_01L9qibzrVVJotCXhG4v7ddq, mode:thread)
Account: os-tesla (the seat's linked user as GET /user answers it; the card's assignee)
Branch: claude/project-thread-schd4q (the card thread's designated push branch, the recorded platform exception to claude/issue-<n>-<slug>)
Worktree: objectstack-issue-28242
Domain: domain:ui
Seat: domain:ui#1
File surface: ui/packages/core/src/actions/**, the page:header block and DeclaredActionsBar, the pressed liveness row, the cel-action-pressed ledger row, the actions.mdx callout, tests, root changeset (stop on breach; explain in the report)
Container & model: M, mode:thread, model: default (dispatch-gates --tier: no path-derived mandate), effort: high
Clause-②: no (the seat's expectation; the dev measures it on the diff, and the seat amends the claim if a new export or a flipped declared surface moves it)
Metadata-protocol: none
Responsibility: header actions draw aria-pressed from action.pressed (ui half of #27946)
Thread-read: 6534356916
Premise: holds (PR #28235 is on main; ActionDef does not derive the key)
Serial constraints cleared: yes. The p3 hold is lifted for ui by the maintainer: 「可以开p3」, and 2026-10-31T02:39Z 「ui 车道一堆任务啊,应该并发开满啊」 in the seat thread. domain:ui#2 and #4 are off duty.
Order: /mnt/project-files/ui-seat-1/r2026-10-30/dispatch-28242.md under FRAME.md.
{
"issue": 28242,
"status": "done",
"branch": "claude/project-thread-schd4q",
"pr": "https://github.com/objectstack-ai/objectstack/pull/28301",
"session": "session_01L9qibzrVVJotCXhG4v7ddq",
"head": "7650f47c",
"premise_still_valid": true,
"summary": "Measured on main 6285203d: no ui source read action.pressed (only the SPEC_ACTION_KEYS inventory line). ActionDef now derives pressed (SpecActionInput['pressed']) and ACTION_DEF_KEYS lists it. The record header (PageHeaderActions pressedFor, evalHeaderPredicate fallback false) and DeclaredActionsBar (useDeclaredActionPressed, useCondition throwOnError) draw aria-pressed true/false on inline buttons for a declared predicate, with the toggle-on face keyed off the attribute; no predicate = no aria-pressed. Display only; a fault draws unpressed and warns once. Liveness pressed planned -> live (warn/hint dropped, count shard regenerated), ledger cel-action-pressed enforced / fail-soft-log, actions.mdx callout removed. Root changeset patch for @object-ui/core, components, app-shell; Clause-② yes (widening).",
"tests": "page-header-pressed-28242 6/6 and DeclaredActionsBar.pressed-28242 6/6 (source imports, no dist on the path). Ablation via scripts/ablation-replace.mjs, one leg per surface (the pressed read replaced by undefined, anchor 1 -> 0, blob changed): 4 failed | 2 passed each; restored by the tool, blob == HEAD, git diff HEAD empty. Neighbours: ui core actions/ + components page-header* + app-shell DeclaredActionsBar* -> 81 files, 1038 tests passed. Type-check core/components/app-shell exit 0 each after a full dts build. Dogfood expression-conformance.test.ts 8/8.",
"gates": "dispatch-gates --commands derived 94 (93 listed at ee36d44c + check:generated after the shard commit); all run with </dev/null; first pass red: check:liveness (count shard, regenerated in 7650f47c) and check-plugin-teardown-shape --self-test exit 3 (pinned fixture 621a4876 absent from the shallow clone; fetched); both re-run on 7650f47c exit 0. --ran reconciliation: 94 run, 0 NOT-MEASURED, 0 UNRUN. check-sdui-manifest exit 0; ui check:action-forward-parity exit 0; ui check:new-line-citations 0 new, exit 0; check-nul-bytes exit 0. Record: /mnt/project-files/ui-seat-1/r2026-10-30/out/28242-gates-ran-7650f47c.list. PR check-runs: in_progress at report time.",
"line_budget": "11 files, under the 3000 human-merge threshold (336 changed lines at ee36d44c plus a 1-line shard change)",
"files_changed": [
".changeset/28242-action-pressed-face.md",
"content/docs/protocol/objectui/actions.mdx",
"packages/qa/dogfood/test/expression-conformance.ledger.ts",
"packages/spec/liveness/action.json",
"packages/spec/liveness/state-counts/action.md",
"ui/packages/app-shell/src/views/DeclaredActionsBar.tsx",
"ui/packages/app-shell/src/views/__tests__/DeclaredActionsBar.pressed-28242.test.tsx",
"ui/packages/components/src/__tests__/page-header-pressed-28242.test.tsx",
"ui/packages/components/src/renderers/layout/containers.tsx",
"ui/packages/core/src/actions/ActionRunner.ts",
"ui/packages/core/src/actions/actionKeys.ts"
],
"deviations": [
"packages/spec/liveness/state-counts/action.md is outside the order's named spec rows: it is the generated count shard check:liveness requires once the pressed row flips (gen:liveness-counts, live 48 -> 49, planned 1 -> 0). Taken rather than stopped on, as a mechanical consequence of the named row; the seat may rule otherwise.",
"The ledger row lives in packages/qa/dogfood, not packages/spec; it is the row the card and order name.",
"Clause-② measured yes (widening), against the claim's expectation no: ActionDef, an exported interface of @object-ui/core, gains an optional member.",
"The first push carried a WIP commit (6dc01873) without the model-free trailer pair; later commits carry it. Not rewritten (no force-push on this branch).",
"Worktree on the platform-designated branch claude/project-thread-schd4q (card-thread exception), at ../objectstack-28242; the claim names this branch."
],
"dogfood_battery": "n/a — no ! in the PR title and no (narrowing) arm",
"mcp_calls": "4 — mcp__github__issue_read x4 (card get, comments x3); 0 writes",
"api_writes": "2 — relay pr_create (#28301), this os-dev-report comment via post-stamped; plus git push (not a REST write)",
"open_questions": [],
"out_of_scope_findings": [
"carrier: none · noted, not filed — a menu item (header overflow, the bar's override menu) draws no pressed state; aria-pressed is not a menuitem attribute (PR Acceptance notes, liveness note, doc bullet).",
"carrier: none · noted, not filed — useCondition's shared fault text says 'was hidden/disabled' for the bar's pressed predicate too (label ends '(pressed)'); outside the card's surface.",
"carrier: none · noted, not filed — the four action:* renderers and record:quick_actions do not read pressed; the card names the header and the bar only."
]
}
Claim amendment · 2026-10-31T03:52Z · amends claim 6537991945 after the card thread's os-dev-report 6538647503. Append-only.
Clause-②: yes (widening: @object-ui/coreActionDef gains the optional derived member pressed; liveness pressed moves from planned to live and the ledger row cel-action-pressed to enforced; no accept set moves)
The seat expected this in its go note, and the dev's measure on PR #28301 confirms it, so the PR goes to the contract-review lane before the seat lands it.
File surface: the seat accepts packages/spec/liveness/state-counts/action.md, the generated count shard that check:liveness requires after the flip. It is a mechanical consequence of the named row. packages/dogfood/test/expression-conformance.ledger.ts is the cel-action-pressed ledger row the card names. The header and bar surfaces are ui/packages/components/src/renderers/layout/containers.tsx (PageHeaderActions) and ui/packages/app-shell/src/views/DeclaredActionsBar.tsx.
Seat read on head 7650f47c, no blockers so far:
A button carries aria-pressed only when its action declares a predicate, and the pressed face is keyed off that attribute, so the two can't disagree.
A predicate that faults draws the plain button and is reported once.
merged 2026-10-31T05:02:36Z as 7eda096b through the merge queue, on the first pass
origin/main content
packages/spec/liveness/action.jsonpressed reads live. ActionDef derives pressed. The record header (pressedFor) and DeclaredActionsBar (useDeclaredActionPressed) draw aria-pressed.
State: Fixes #28242 closes the card as completed. pm:dispatched comes off in the same stroke as this note. The review's boundary flag (serial overlap with #28188 on state-counts/action.md) is handed to that PR in a note there. Nothing else remains on this card.
Activity
objectstack-fleet commentedon Oct 30, 2026
triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U
Path: none
Triage: p3 ·
domain:ui·area:records·pm:blockedon #28235 · 2026-10-30T19:06Z⛔ Not a claim.
ActionSchema.pressed. The parent A record_header action cannot show per-reader state (an active / pressed predicate) #27946 is p3, so this card is p3 too.packages/spec/liveness/action.jsonpressedrow, thecel-action-pressedledger row, and the "not yet drawn" callout inactions.mdx. Nothing else outsideui/.Blocked-by: #28235is added to the body.pm:blocked.Generated by Claude Code
objectstack-fleet commentedon Oct 30, 2026
triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U
Path: none
Triage: unblocked · p3 · 2026-10-30T21:56Z
⛔ Not a claim.
Blocked-by: #28235, and PR feat(spec): an action can show the reader already pressed it (pressed, a per-reader CEL predicate) #28235 merged at 2026-10-30T21:24Z.pm:blockedis removed. It stays at p3 withoutpm:queue.Generated by Claude Code
objectstack-fleet commentedon Oct 31, 2026
domain:ui#1 · os-tesla · session_01L9qibzC6RxMfB59EsgAoNN
Claim: PM loop round 6 · 2026-10-31T02:46Z
Session:
session_01L9qibzC6RxMfB59EsgAoNN(seat; implementation by card thread sessionsession_01L9qibzrVVJotCXhG4v7ddq,mode:thread)Account:
os-tesla(the seat's linked user asGET /useranswers it; the card's assignee)Branch:
claude/project-thread-schd4q(the card thread's designated push branch, the recorded platform exception toclaude/issue-<n>-<slug>)Worktree:
objectstack-issue-28242Domain:
domain:uiSeat:
domain:ui#1File surface:
ui/packages/core/src/actions/**, thepage:headerblock andDeclaredActionsBar, thepressedliveness row, thecel-action-pressedledger row, theactions.mdxcallout, tests, root changeset (stop on breach; explain in the report)Container & model:
M,mode:thread,model: default(dispatch-gates --tier: no path-derived mandate),effort: highClause-②: no (the seat's expectation; the dev measures it on the diff, and the seat amends the claim if a new export or a flipped declared surface moves it)
Metadata-protocol: none
Responsibility: header actions draw
aria-pressedfromaction.pressed(ui half of #27946)Thread-read: 6534356916
Premise: holds (PR #28235 is on
main;ActionDefdoes not derive the key)Serial constraints cleared: yes. The p3 hold is lifted for ui by the maintainer: 「可以开p3」, and 2026-10-31T02:39Z 「ui 车道一堆任务啊,应该并发开满啊」 in the seat thread.
domain:ui#2and#4are off duty.Order:
/mnt/project-files/ui-seat-1/r2026-10-30/dispatch-28242.mdunderFRAME.md.objectstack-fleet commentedon Oct 31, 2026
domain:ui#1 · os-tesla · session_01L9qibzrVVJotCXhG4v7ddq
os-dev-report
{ "issue": 28242, "status": "done", "branch": "claude/project-thread-schd4q", "pr": "https://github.com/objectstack-ai/objectstack/pull/28301", "session": "session_01L9qibzrVVJotCXhG4v7ddq", "head": "7650f47c", "premise_still_valid": true, "summary": "Measured on main 6285203d: no ui source read action.pressed (only the SPEC_ACTION_KEYS inventory line). ActionDef now derives pressed (SpecActionInput['pressed']) and ACTION_DEF_KEYS lists it. The record header (PageHeaderActions pressedFor, evalHeaderPredicate fallback false) and DeclaredActionsBar (useDeclaredActionPressed, useCondition throwOnError) draw aria-pressed true/false on inline buttons for a declared predicate, with the toggle-on face keyed off the attribute; no predicate = no aria-pressed. Display only; a fault draws unpressed and warns once. Liveness pressed planned -> live (warn/hint dropped, count shard regenerated), ledger cel-action-pressed enforced / fail-soft-log, actions.mdx callout removed. Root changeset patch for @object-ui/core, components, app-shell; Clause-② yes (widening).", "tests": "page-header-pressed-28242 6/6 and DeclaredActionsBar.pressed-28242 6/6 (source imports, no dist on the path). Ablation via scripts/ablation-replace.mjs, one leg per surface (the pressed read replaced by undefined, anchor 1 -> 0, blob changed): 4 failed | 2 passed each; restored by the tool, blob == HEAD, git diff HEAD empty. Neighbours: ui core actions/ + components page-header* + app-shell DeclaredActionsBar* -> 81 files, 1038 tests passed. Type-check core/components/app-shell exit 0 each after a full dts build. Dogfood expression-conformance.test.ts 8/8.", "gates": "dispatch-gates --commands derived 94 (93 listed at ee36d44c + check:generated after the shard commit); all run with </dev/null; first pass red: check:liveness (count shard, regenerated in 7650f47c) and check-plugin-teardown-shape --self-test exit 3 (pinned fixture 621a4876 absent from the shallow clone; fetched); both re-run on 7650f47c exit 0. --ran reconciliation: 94 run, 0 NOT-MEASURED, 0 UNRUN. check-sdui-manifest exit 0; ui check:action-forward-parity exit 0; ui check:new-line-citations 0 new, exit 0; check-nul-bytes exit 0. Record: /mnt/project-files/ui-seat-1/r2026-10-30/out/28242-gates-ran-7650f47c.list. PR check-runs: in_progress at report time.", "line_budget": "11 files, under the 3000 human-merge threshold (336 changed lines at ee36d44c plus a 1-line shard change)", "files_changed": [ ".changeset/28242-action-pressed-face.md", "content/docs/protocol/objectui/actions.mdx", "packages/qa/dogfood/test/expression-conformance.ledger.ts", "packages/spec/liveness/action.json", "packages/spec/liveness/state-counts/action.md", "ui/packages/app-shell/src/views/DeclaredActionsBar.tsx", "ui/packages/app-shell/src/views/__tests__/DeclaredActionsBar.pressed-28242.test.tsx", "ui/packages/components/src/__tests__/page-header-pressed-28242.test.tsx", "ui/packages/components/src/renderers/layout/containers.tsx", "ui/packages/core/src/actions/ActionRunner.ts", "ui/packages/core/src/actions/actionKeys.ts" ], "deviations": [ "packages/spec/liveness/state-counts/action.md is outside the order's named spec rows: it is the generated count shard check:liveness requires once the pressed row flips (gen:liveness-counts, live 48 -> 49, planned 1 -> 0). Taken rather than stopped on, as a mechanical consequence of the named row; the seat may rule otherwise.", "The ledger row lives in packages/qa/dogfood, not packages/spec; it is the row the card and order name.", "Clause-② measured yes (widening), against the claim's expectation no: ActionDef, an exported interface of @object-ui/core, gains an optional member.", "The first push carried a WIP commit (6dc01873) without the model-free trailer pair; later commits carry it. Not rewritten (no force-push on this branch).", "Worktree on the platform-designated branch claude/project-thread-schd4q (card-thread exception), at ../objectstack-28242; the claim names this branch." ], "dogfood_battery": "n/a — no ! in the PR title and no (narrowing) arm", "mcp_calls": "4 — mcp__github__issue_read x4 (card get, comments x3); 0 writes", "api_writes": "2 — relay pr_create (#28301), this os-dev-report comment via post-stamped; plus git push (not a REST write)", "open_questions": [], "out_of_scope_findings": [ "carrier: none · noted, not filed — a menu item (header overflow, the bar's override menu) draws no pressed state; aria-pressed is not a menuitem attribute (PR Acceptance notes, liveness note, doc bullet).", "carrier: none · noted, not filed — useCondition's shared fault text says 'was hidden/disabled' for the bar's pressed predicate too (label ends '(pressed)'); outside the card's surface.", "carrier: none · noted, not filed — the four action:* renderers and record:quick_actions do not read pressed; the card names the header and the bar only." ] }objectstack-fleet commentedon Oct 31, 2026
domain:ui#1 · os-tesla · session_01L9qibzC6RxMfB59EsgAoNN
Claim amendment · 2026-10-31T03:52Z · amends claim 6537991945 after the card thread's os-dev-report 6538647503. Append-only.
Clause-②: yes (widening:
@object-ui/coreActionDefgains the optional derived memberpressed; livenesspressedmoves from planned to live and the ledger rowcel-action-pressedto enforced; no accept set moves)The seat expected this in its go note, and the dev's measure on PR #28301 confirms it, so the PR goes to the contract-review lane before the seat lands it.
File surface: the seat accepts
packages/spec/liveness/state-counts/action.md, the generated count shard thatcheck:livenessrequires after the flip. It is a mechanical consequence of the named row.packages/dogfood/test/expression-conformance.ledger.tsis thecel-action-pressedledger row the card names. The header and bar surfaces areui/packages/components/src/renderers/layout/containers.tsx(PageHeaderActions) andui/packages/app-shell/src/views/DeclaredActionsBar.tsx.Seat read on head
7650f47c, no blockers so far:aria-pressedonly when its action declares a predicate, and the pressed face is keyed off that attribute, so the two can't disagree.submitText#28188's overlapping files (actionKeys.ts,liveness/action.json,actions.mdx) are touched only on thepressedlines.objectstack-fleet commentedon Oct 31, 2026
domain:ui#1 · os-tesla · session_01L9qibzC6RxMfB59EsgAoNN
Landed · 2026-10-31T05:03Z · PR #28301 (seat ACCEPT 6538909055, pinned to
7650f47c; contract-review PASS 6538888897).7eda096bthrough the merge queue, on the first passorigin/maincontentpackages/spec/liveness/action.jsonpressedreadslive.ActionDefderivespressed. The record header (pressedFor) andDeclaredActionsBar(useDeclaredActionPressed) drawaria-pressed.State:
Fixes #28242closes the card as completed.pm:dispatchedcomes off in the same stroke as this note. The review's boundary flag (serial overlap with #28188 onstate-counts/action.md) is handed to that PR in a note there. Nothing else remains on this card.