ui: main's Test UI (9/16) is red since #26786. The actionKeys pin lists every spec ActionSchema key, and SPEC_ACTION_KEYS lacks the new disabledReason #26849
Description
Source
The ui seat found this while reading two card PRs' reds (PR #26821 Test UI 5/16 and PR #26824 Test UI 15/16, both 18:24Z). It then checked origin/main: main's own push run at aeb9cf0d has Test UI (9/16) red on the same assertion (job).
Problem
PR #26786 merged at 13dc413f (18:09Z). It is part 1 of #26619 and adds disabledReason to ActionSchema in packages/spec/src/ui/action.zod.ts. ui/packages/core/src/actions/__tests__/actionKeys.pin.test.ts › "lists every key the spec ActionSchema declares" walks the spec schema and compares it with SPEC_ACTION_KEYS in ui/packages/core/src/actions/actionKeys.ts. The array has no disabledReason, so every Test UI run on main or on a PR merged with main fails:
AssertionError: expected { missing: [ 'disabledReason' ], …(1) } to deeply equal { missing: [], stale: [] }
❯ packages/core/src/actions/__tests__/actionKeys.pin.test.ts:140:32
classifyActionKeys reads KNOWN_ACTION_KEYS, which includes SPEC_ACTION_KEYS. Until the array lists the key, the console also reports an action that carries disabledReason as having an unknown key.
Target
Add 'disabledReason' to SPEC_ACTION_KEYS, after 'disabled', with a comment of the kind 'description' has. The comment says the array restates the spec's declared keys: the entry follows #26786, and the readers ship with the console half of #26619. ActionDef is not changed here; the console half of #26619 decides whether ActionDef declares it.
File surface
ui/packages/core/src/actions/actionKeys.ts (one entry and its comment), one changeset (@object-ui/core patch). No packages/spec/** change, no new key.
Acceptance
pnpm --filter @object-ui/core exec vitest run src/actions/__tests__/actionKeys is green. Main's Test UI shards are green after the merge.
Activity
objectstack-fleet commentedon Oct 27, 2026
Claim: PM loop round 1
Session:
session_01QsR2jTfvjNTaR29ehLk26TAccount:
zhuangjianguoBranch:
claude/project-thread-r1zdiq(platform-assigned card-thread branch; a card thread can push only its assigned branch, and the name carries no issue number, so this claim is the identity record)Worktree:
objectstack-issue-26849Domain:
domain:uiSeat:
domain:ui#4File surface:
ui/packages/core/src/actions/actionKeys.ts(oneSPEC_ACTION_KEYSentry and its comment), at most one test line beside it, one root changeset; ⛔ActionDef(the console half of #26619); ⛔packages/spec/**, server packages, any new key (stop on breach; explain in the report)Container & model:
S,mode:thread,model: TIER_DEFAULT(dispatch-gates --tier: no path-derived mandate; reason: the maintainer's standing rule 「只认领不需要 fable 的卡」, 2026-10-27T10:39Z),effort: highClause-②: no
Metadata-protocol: none
Responsibility: the console's action key inventory (ui core, this lane) restates the spec's
ActionSchemakeys and missesdisabledReason, which #26786 added · the platform path that may cover it: none, the pin test is the guard and it is red · reached by every Test UI run on main and on every PR merged with mainThread-read: none
Premise: holds (
git show origin/main:ui/packages/core/src/actions/actionKeys.ts | grep -c disabledReason→ 0 on origin/main4702c468at 2026-10-27T18:30Z; main's Test UI (9/16) ataeb9cf0dfails onactionKeys.pin.test.ts:140)Priority: p0 jump (main red), ahead of the seat's concurrency
Serial constraints cleared: no open PR touches the surface (scan of the 80 most recently updated open PRs 2026-10-27T18:29Z)
Dispatched at 2026-10-27T18:31Z to the card thread on that branch; the order lives in the thread's opening message.
Generated by Claude Code
objectstack-fleet commentedon Oct 27, 2026
os-dev-report
{ "issue": 26849, "status": "done", "branch": "claude/project-thread-r1zdiq", "pr": "https://github.com/objectstack-ai/objectstack/pull/26866", "head": "e80b8cda", "session": "session_01QsR2jRCnmxMuS4uyUq5ZHo", "premise_still_valid": true, "summary": "SPEC_ACTION_KEYS in ui/packages/core/src/actions/actionKeys.ts gains 'disabledReason' after 'disabled', with a comment of the kind 'description' carries (restates the spec's declared keys; follows #26786; readers ship with the console half of #26619). One assertion beside the existing classifyActionKeys case pins that an action carrying disabledReason classifies with no unknown and no retired key. One root changeset, @object-ui/core patch, carrying the claim's Clause-②: no and Metadata-protocol: none. ActionDef, packages/spec and server code untouched.", "files_changed": [ "ui/packages/core/src/actions/actionKeys.ts", "ui/packages/core/src/actions/__tests__/actionKeys.pin.test.ts", ".changeset/26849-action-keys-disabled-reason.md" ], "line_budget": "3 files, +18 / -0 (7 in actionKeys.ts, 1 test line, 10 changeset)", "tests": "at e80b8cda: pnpm --dir ui exec vitest run packages/core/src/actions/__tests__/actionKeys.pin.test.ts -> Test Files 1 passed (1), Tests 19 passed (19); pnpm exec turbo run type-check --filter=@object-ui/core --concurrency=2 under os-verify-lock -> VERDICT command-exit 0, 4/4 tasks. Red-before: main's Test UI (9/16) at aeb9cf0d. No ablation: data-entry diff.", "gates": "at e80b8cda: dispatch-gates --commands derived 34; all 34 exit 0 (PR-body gates run against the final body via GITHUB_EVENT_PATH); vitest run scripts/ under the lock 178 passed | 2 skipped files, 5065 passed | 2 skipped tests; check:type-check-debt under the lock 0 raw tsc errors; --ran: 34 derived, 34 run, 0 NOT-MEASURED. ui check:new-line-citations 0 new. PR check-runs: in_progress at report time.", "dogfood_battery": "n/a — no ! in the PR title and no (narrowing) arm", "deviations": [ "The order's acceptance command runs vitest from the package directory, which ui/scripts/vitest-invocation-guard.mjs refuses; ran the ui-rooted equivalent from ui/AGENTS.md (named in the PR body).", "Commit carries the repo's model-free trailer pair, not the harness attribution reminder's model-named Co-Authored-By (pre-push check:commit-card-trailers)." ], "mcp_calls": "1 — mcp__claude-code-remote__get_session (own session id); 0 GitHub MCP calls", "api_writes": "2 — fleet-write relay pr_create (POST /repos/objectstack-ai/objectstack/pulls + assignees, read back identical, 3807 bytes); this os-dev-report comment via post-stamped. Plus git push (not REST).", "open_questions": [], "out_of_scope_findings": [] }objectstack-fleet commentedon Oct 27, 2026
Seat close ·
domain:ui#4·session_01QsR2jTfvjNTaR29ehLk26TMain is fixed. #26859 (
a20824f3, 19:19Z) addsdisabledReasontoSPEC_ACTION_KEYS, which is this card's Target.git show origin/main:ui/packages/core/src/actions/actionKeys.ts | grep -c disabledReason→ 1. This seat's PR #26866 is closed as superseded. Closing as completed.Generated by Claude Code