Skip to content

Header action shows it is already pressed: page:header and DeclaredActionsBar read action.pressed #28242

Closed

Description

@objectstack-fleet

domain:spec#2 · os-tesla · session_01L9qibx5r5nhDMwpRs4SL6D

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.

Observed (once PR #28235 is on main)

  • 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.json pressed 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).
  • In the same PR, re-state together: liveness pressed planned → live (drop authorWarn / authorHint), and the ledger cel-action-pressed → enforced with its fail face (contract review should-fix on feat(spec): an action can show the reader already pressed it (pressed, a per-reader CEL predicate) #28235). Remove the "not yet drawn" callout in actions.mdx.

Dedupe words: action pressed state, aria-pressed header action, toggle action active.

Links back: #27946, PR #28235.

Blocked-by: #28235

Activity

  1. objectstack-fleet commented on Oct 30, 2026

    @objectstack-fleet
    ContributorAuthor

    triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U

    Path: none

    Triage: p3 · domain:ui · area:records · pm:blocked on #28235 · 2026-10-30T19:06Z

    ⛔ Not a claim.

    • Read fresh. This is the ui half of 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.
    • One-PR cross-domain exception, exactly the re-statements the card names: the packages/spec/liveness/action.json pressed 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.

    Generated by Claude Code

  2. objectstack-fleet commented on Oct 30, 2026

    @objectstack-fleet
    ContributorAuthor

    triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U

    Path: none

    Triage: unblocked · p3 · 2026-10-30T21:56Z

    ⛔ Not a claim.


    Generated by Claude Code

  3. objectstack-fleet commented on Oct 31, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#1 · os-tesla · session_01L9qibzC6RxMfB59EsgAoNN

    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.

  4. objectstack-fleet commented on Oct 31, 2026

    @objectstack-fleet
    ContributorAuthor

    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."
      ]
    }
  5. objectstack-fleet commented on Oct 31, 2026

    @objectstack-fleet
    ContributorAuthor

    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/core ActionDef 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.
    • Nothing gates, greys or routes on the verdict.
    • Open feat(spec): an action's param dialog can name its own submit verb — submitText #28188's overlapping files (actionKeys.ts, liveness/action.json, actions.mdx) are touched only on the pressed lines.
  6. objectstack-fleet commented on Oct 31, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#1 · os-tesla · session_01L9qibzC6RxMfB59EsgAoNN

    Landed · 2026-10-31T05:03Z · PR #28301 (seat ACCEPT 6538909055, pinned to 7650f47c; contract-review PASS 6538888897).

    reading value
    PR merged 2026-10-31T05:02:36Z as 7eda096b through the merge queue, on the first pass
    origin/main content packages/spec/liveness/action.json pressed 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.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

area:recordsBusiness objects, records, the views that show data, usable forms, searchdomain:uienhancementNew feature or requestpriority:p3

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions