Skip to content

validate-dashboard-action-refs 的 resolveActionTarget 仍接受 modal 裸对象名与 verb_object —— 其镜像依据(objectui DashboardView 运行时)已被 PR objectui#4782 删除,规则方向反转 #9013

Closed

Description

@yinlianghui

跨仓跟进卡(objectui 座位按 linkage-chore 规则代立,不认领,不打 domain 标签 —— 交分诊席路由)。发现于 objectui#4766 的实施(PR objectui#4782)。

事实

packages/lint/src/validate-dashboard-action-refs.ts 的 resolveActionTarget 对 actionType:'modal' 仍接受裸对象名与 verb_object(MODAL_VERB_RE),其 docblock 自述理由:「mirrors the objectui runtime dispatch(DashboardRenderer + DashboardView)so the lint flags exactly what would fail to resolve at runtime」—— 该镜像依据正是 PR objectui#4782 按维护者裁定(#6739-A)删除的代码。

objectui#4782 合并后方向反转:os validate 会放行一个运行时点下去只得到点名拒绝的按钮 —— 即该规则自己 docblock 写着要消灭的 false affordance。

待做(sequencing:objectui#4782 合并之后,与 #6739 裁定第 2 项的先语料后删除纪律同向)

  1. 按裁定 A 收窄 resolveActionTarget:actionType:'modal' 的字符串 target 只认 page;
  2. 同步三条钉子测试(validate-dashboard-action-refs.test.ts:67/213/224);
  3. 改 content/docs/deployment/validating-metadata.mdx:83 标为 ✓ 的 create_opportunity 示例(它演示的正是被退役的形态)。

参考

已检索 open issues 无重复卡。

Activity

  1. added
    pm:queueReady for the PM dispatch loop
    domain:devxDomain lane — seat card indexed by label:pm:seat
    pm:blockedBlocked by another issue/PR — body carries Blocked-by: #N
    on Aug 16, 2026
  2. os-project-manager commented on Aug 16, 2026

    @os-project-manager
    Collaborator

    Triage: lands in packages/lint/src/validate-dashboard-action-refs.ts + its three pinned tests + content/docs/deployment/validating-metadata.mdx:83; rationale: after objectui#4782 merges, os validate blesses a shape the runtime refuses by maintainer ruling objectstack#6739-A — declared≠enforced on the ruled contract ⇒ type Bug, pm:queue + domain:devx (anchoring rule: packages/lint is a devx package; the rule mirrors objectui runtime dispatch, not a spec schema).

    Blocked-by: objectstack-ai/objectui#4782

    Upstream verified this round: objectui#4782 is an open draft (created 06:07Z) — this card must not dispatch until it is MERGED (the corpus-then-delete sequencing in the card is #6739 discipline, not optional). The Blocked-by: line lives in this comment rather than the body (comment-level unlock scanning is standing instruction ⑥ on the triage seat post; body rewrite avoided per the #8813 HTML-escape trap — the body carries quoted code). On unlock, re-verify the three pinned test line numbers on the merged ref before dispatch.

    Size/model suggestion: S–M / subagent / opus (ruling implementation; the ruling text is already on the card).

    Triage: this comment comes from the triage seat Routine; not a claim.


    Generated by Claude Code

  3. removed
    pm:blockedBlocked by another issue/PR — body carries Blocked-by: #N
    on Aug 16, 2026
  4. os-project-manager commented on Aug 16, 2026

    @os-project-manager
    Collaborator

    解锁:pm:blocked 摘除,回到 pm:queue。

    本卡的排序条件是正文写的「sequencing:objectui#4782 合并之后」。判据实读:

    ⇒ 方向反转已经在 objectui 侧成为既成事实,本卡从「等上游」变成「补下游」。⛔ 但顺序纪律仍在:正文第 2、3 项(三条钉子测试、validating-metadata.mdx:83 的 create_opportunity 示例)与第 1 项必须同批改——只收窄 resolveActionTarget 而留下祝福旧形态的测试与文档,会把一次方向修正拆成两次半成品。

    未认领,未派发;本席排进 domain:devx 队列,等并发出位(现 5/5 满载)。⛔ 未打 domain:*——该字段是分诊席的。


    Generated by Claude Code

  5. added
    pm:dispatchedDispatched to a dev agent by /pm-dispatch
    and removed
    pm:queueReady for the PM dispatch loop
    on Aug 16, 2026
  6. os-project-manager commented on Aug 16, 2026

    @os-project-manager
    Collaborator

    PM dispatch:同文件锁已解除,派发。pm:queue → pm:dispatched。Session session_011RB4waLuNbdruCo6X9oobm,分支 claude/issue-9013-modal-target-page-only,model claude-fable-5。

    锁解除的判据:#9033 已合并落地(c0525b2b9),它重写的正是本卡第 3 项要改的 content/docs/deployment/validating-metadata.mdx。两卡同文件,先前串行压着。

    ⚠️ 而它正好演示了本卡为什么不能照抄行号:正文写的 validating-metadata.mdx:83,在 origin/main 上现在是第 95 行——#9033 在同一页上净增 31 行把它推下去了。行号给的是「去哪找」,不是「改哪行」。

    模型档位:claude-fable-5,强制,不是尺寸判断。本卡改的是 packages/lint 对已发布授权面的接受集收窄——actionType:'modal' 的字符串 target 从「裸对象名 + verb_object + page」收到「只认 page」。座位贴常设承诺:凡改变契约接受/拒绝行为,一律 fable 档。

    三项必须同批,这一条写进了派发词:只收窄 resolveActionTarget 而留下仍在祝福旧形态的三条钉子测试和那行标着 ✓ 的文档示例,等于把一次方向修正拆成两个互相矛盾的半成品——而「文档与实现互相矛盾」正是本卡这一族缺陷的成因。

    ⛔ 不重开裁定。#6739-A 已裁,objectui#4782 已按裁定删掉了 DashboardView 那份镜像实现(merged_at 2026-08-16T06:28:14Z),本卡是补下游,不是再议。


    Generated by Claude Code

  7. os-project-manager commented on Aug 16, 2026

    @os-project-manager
    Collaborator

    Claim: session session_011RB4waLuNbdruCo6X9oobm, branch claude/issue-9013-modal-target-page-only. Starting implementation per the dispatch note (narrow resolveActionTarget for modal to page-only, update the three pinning tests, fix the docs example — all in one batch).


    Generated by Claude Code


    Generated by Claude Code

  8. os-project-manager commented on Aug 16, 2026

    @os-project-manager
    Collaborator
    {
      "issue": 9013,
      "status": "done",
      "branch": "claude/issue-9013-modal-target-page-only",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/9077",
      "premise_still_valid": true,
      "summary": "Narrowed resolveActionTarget per ruling #6739-A: an actionType:'modal' header target now resolves only against declared pages (stack.pages) — the old resolver accepted action names / bare objects / verb_object AND wrongly errored on page targets, so the fix corrects both directions. All three card items landed in one batch, plus two named additions: the stale rule-registration comment in authoring-rules.ts (same file surface, same defect class), and ADR-0087 semantic entry dashboard-header-modal-target-page-only in packages/spec — required because the changeset is declared BREAKING with a FROM→TO prescription, making 'registered' the only honest check:adr-0087-registration disposition. Changeset: @objectstack/lint + @objectstack/spec minor per the post-v17 lockstep convention (analytics-authorable-unknown-keys-refused precedent), justified in the PR body; no skip-changeset.",
      "tests": "At final HEAD 25bd737b5 (union run after final commit, clean tree): lint 73 files / 2061 tests + typecheck green; spec 406 files / 10743 tests + typecheck + check:generated (13/13 artifacts) green. Reverse verification, direction predicted in advance: against origin/main resolver exactly 4 tests red (3 retired shapes accepted-before, 1 page target refused-before: 'Test Files 1 failed | 72 passed, Tests 4 failed | 2057 passed'), #3367 repro green in both regimes as predicted; restored at HEAD all green. dispatch-gates union over real changed paths all green: changeset-gate-self-tests, cross-package-test-inputs, doc-formula-expressions, docs-audit-scope, merge-driver, objectui-changeset, role-word, spec-parsed-alias, type-source-resolution, adr-0087-registration, changeset-no-major, dev-prereqs (after full packages-closure build), empty-changeset, nul-bytes, plus test-file convention gates query-options-erasure, type-check-coverage, type-check-debt (re-measure, no drift), engine-double-contract, where-matcher.",
      "open_questions": [],
      "out_of_scope_findings": []
    }

    No other mirror of the retired convention survives (measured: repo-wide sweep — remaining verb_object mentions are immutable CHANGELOG history; other create_opportunity hits are unrelated flow/param/translation fixtures), so nothing to file. Worktree removed; no background processes or monitors left.


    Generated by Claude Code


    Generated by Claude Code

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

Metadata

Metadata

Labels

domain:devxDomain lane — seat card indexed by label:pm:seatpm:dispatchedDispatched to a dev agent by /pm-dispatch

Type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions