Skip to content

feat(spec): drillDown.target 补上 'navigate' —— 渲染器已兑现的第三个 arm (#5435) - #5556

Merged
os-zhuang merged 1 commit into
mainfrom
claude/issue-5435-chart-drilldown-navigate
Aug 5, 2026
Merged

feat(spec): drillDown.target 补上 'navigate' —— 渲染器已兑现的第三个 arm (#5435)#5556
os-zhuang merged 1 commit into
mainfrom
claude/issue-5435-chart-drilldown-navigate

Conversation

@os-zhuang

Copy link
Copy Markdown
Contributor

Fixes #5435

三项前提逐条复核,全部成立

origin/main(5acb93add)为准核过,没有一项过期:

  1. ChartDrillDownSchema 是 strict 的,target 联合恰为两成员 —— packages/spec/src/ui/chart.zod.ts:471 原文 z.enum(['drawer', 'dialog'], {…}),且带一条专为 'navigate' 定制的 error 回调(判词:「不被 chart 支持…… 它渲染抽屉 regardless」)。这条回调 issue 正文没提,是本 PR 必须一并处理的死枝。
  2. lint 真的 parse 它 —— packages/lint/src/validate-react-page-props.ts:288 ChartDrillDownSchema.safeParse(raw),所以作者写的 drillDown={{…}} 字面量确实过这道发布闸门。
  3. 触发前提 —— fix(types,plugin-charts): DrillDownConfig 只声明有人读的键,ObjectChart 补 target: 'navigate' (#3354) objectui#3382MERGED(2026-08-05 11:53Z)。

改了什么

target'drawer' | 'dialog' 扩成 'drawer' | 'dialog' | 'navigate',additive,之前能解析的一律照旧解析。

#5022 当初排除 'navigate' 的依据是一条测量而不是设计偏好:当时 ObjectChart 自绘抽屉只分支 'dialog','navigate' 静默落进 Sheet —— 声明一个渲染器不兑现的值,等于用协议承诺一次永远不会发生的跳转。objectui#3382 把这条测量改掉了,语义对齐 DrillDownDrawer.navigateOnly(table / pivot / metric 三个 widget 在共享 DrillDownConfig 上一直以来的行为)。测量失效,联合随之跟上。顺序不可颠倒:先有渲染器兑现,协议才声明。

JSDoc 写明兑现条件与回退:'navigate' 是唯一带 host 前提的 arm,宿主须提供 drill navigation(objectui 侧 DrillNavigationContext.openRecordList),缺失时文档化回落 'drawer' —— 既定行为而非故障。另注明 "Open in list" escape hatch 与本键无关,'navigate' 的意义是把跳转变成默认点击行为。

顺手清掉的死枝

那条定制 error 回调整条删除。它的判词现在是假的(chart 已经实现该 arm),留着就是一条对下一个作者撒谎的死枝 —— 而且它只在 'navigate' 被拒时才触发,一旦 'navigate' 合法就永不执行。删掉后 target 回落 zod 自己的 enum 报错,仍然按值拒绝。

生成物:一律走生成器

gen:react-blocks / gen:schema / gen:docs,无一手改:react-blocks.ts 类型串(手写源)、react-blocks.contract.jsonreferences/react-blocks.mdcontent/docs/references/ui/chart.mdx。逐一 diff 过,每处都只有这条联合的变化

一处不属于本 PR 的生成物移动,已剔除

gen:schema 顺带重写了 packages/spec/authorable-surface.base.json:baseRev 前移,并新增三个与本改动无关的键(system/EmailServiceConfig:appName / defaultTemplateContext / queueDelivery —— 来自已合并的 #5465)。本改动动的是 target值联合,不增删任何 authorable (diff 里 chart/drill 相关 0 命中),所以这是 main 上既有的基线漂移搭车。已 git checkout 还原,不随本 PR 提交。已在 #5358 附上这份现场标本(该 issue 正是描述「任何无关 PR 都能因此静默推进删除门锚点」)。

测试

先证红

改 schema 之前先在 validate-react-page-props.test.ts 写下「'navigate' 应被接受」,跑出红 —— 闸门带着 #5022 的判词拒绝:

- []
+ [ { "rule": "react-chart-drilldown-invalid",
      "message": "drillDown.target: `drillDown.target: 'navigate'` is not supported by a chart …" } ]
 Tests  1 failed | 83 skipped (84)

改 schema 后同一例转绿:Tests 84 passed (84)

反向验证(方向先判后跑)

预判:把联合改回两成员,chart.test.ts恰好 3 例红 —— accepts 表新增行、接受用例、三 arm 命名断言。跑出来:

× accepts target navigate
× target: 'navigate' is ACCEPTED — objectui#3382 made the renderer deliver it (#5435)
× a target outside the three declared arms is still rejected — widening is not loosening
 Tests  3 failed | 72 passed (75)

不多不少,方向一致。还原后 75/75 绿。

用例分诊(不是整批重拼)

两条钉着旧结论的用例按「整条替换」处理,而非改断言方向了事:

  • chart.test.ts 的「'navigate' 被拒」→ 换成接受用例,并额外断言那条退休判词不复存在(not.toContain('objectui#3354') / not.toContain('not supported by a chart'))—— 防的是 fix(lint): 收敛 validate-expressions / validate-security-posture 的 spec 不声明键 ?? 别名读法 (#5017) #5046 那种「断言通过是因为什么都没产生」。
  • 原「plain wrong VALUE 不被 navigate 判词污染」一例:判词删光后它会空过(vacuously green),故替换为真断言 —— 无效 target 仍按 invalid_value 被拒,且报错串恰好枚举三个 arm("values":["drawer","dialog","navigate"]),多出第四个成员会立刻红。

消费半径清扫

validate-react-page-props 的 fixture 面按规则被消费的范围扫,而非按改动包:全仓 drillDown 字面量在 packages/lintpackages/spec 之外 0 命中,无 cli/runtime fixture 需要跟改。

正向

  • pnpm --filter @objectstack/spec test314 files / 8011 passed
  • pnpm --filter @objectstack/lint test59 files / 1282 passed | 4 skipped
  • typecheck(spec + lint)⇒ 均 Done
  • check:react-blocks✅ 2 generated files in sync with packages/spec
  • check-changeset-no-major exit 0(本 changeset 为 minor,未被点名);check-changeset-fixed ⇒ 同步
  • node scripts/check-nul-bytes.mjs ⇒ OK(5501 文件);改动文件另做 grep -naP 自扫,0 命中

Changeset

.changeset/chart-drilldown-navigate-target.md —— @objectstack/spec: minor(additive 协议面)。@objectstack/lint 未单列:它本体只动了注释与用例,行为变化经由 spec 依赖流入,parse 的是同一个 schema。

🤖 Generated with Claude Code

https://claude.ai/code/session_018fxLGQdatPbBUvCgiVxg6D


Generated by Claude Code

ChartDrillDownSchema.target 从 'drawer' | 'dialog' 扩成
'drawer' | 'dialog' | 'navigate',additive(minor),之前能解析的一律照旧。

#5022 当初排除 'navigate' 依据的是一条**测量**而非设计偏好:当时 ObjectChart
自绘抽屉只分支 'dialog','navigate' 静默落进 Sheet,声明它等于用协议承诺一次
永不发生的跳转。objectui#3382 把这条测量改掉了 —— ObjectChart 现在真正兑现
'navigate',语义对齐 DrillDownDrawer.navigateOnly(table / pivot / metric 三个
widget 在共享 DrillDownConfig 上一直以来的行为)。测量失效,联合随之跟上。
顺序不可颠倒:先有渲染器兑现,协议才声明。

- target 的 JSDoc 写明兑现条件与回退:'navigate' 是唯一带 host 前提的 arm,
  宿主须提供 drill navigation(objectui 侧 DrillNavigationContext.openRecordList),
  缺失时文档化回落 'drawer'(既定行为,非故障)。
- 删除 z.enum 上那条只为 'navigate' 定制的 error 回调 —— 它的判词
  (「chart 不实现该 arm」)现在是假的,留着就是一条对下一个作者撒谎的死枝。
- 生成物一律走生成器(gen:react-blocks / gen:schema / gen:docs):
  react-blocks 类型串、contract.json、references/react-blocks.md、chart.mdx。

测试(先证红):改 schema 前先在 validate-react-page-props 写下「'navigate'
应被接受」,跑出红(闸门带着 #5022 的判词拒绝),再改 schema 转绿。
反向验证方向先判后跑:把联合改回两成员,chart.test.ts 恰好 3 例红
(accepts 行、接受用例、三 arm 命名断言),不多不少。
spec 8011 例、lint 1282 例全绿;两包 typecheck 通过。

Fixes #5435

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018fxLGQdatPbBUvCgiVxg6D
@vercel

vercel Bot commented Aug 5, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

1 Skipped Deployment
Project Deployment Actions Updated (UTC)
objectstack Ignored Ignored Aug 5, 2026 5:23pm

Request Review

@github-actions github-actions Bot added documentation Improvements or additions to documentation tests protocol:ui tooling size/m labels Aug 5, 2026
@github-actions

github-actions Bot commented Aug 5, 2026

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

This PR changes 2 package(s): @objectstack/lint, @objectstack/spec.

109 hand-written doc(s) reference the affected code and may need an implementation-accuracy re-verification:

  • content/docs/ai/agents.mdx (via @objectstack/spec)
  • content/docs/ai/skills-reference.mdx (via @objectstack/spec)
  • content/docs/ai/skills.mdx (via @objectstack/spec)
  • content/docs/api/client-sdk.mdx (via @objectstack/spec)
  • content/docs/api/environment-routing.mdx (via @objectstack/spec)
  • content/docs/api/error-catalog.mdx (via @objectstack/spec)
  • content/docs/api/error-handling-client.mdx (via @objectstack/spec)
  • content/docs/api/error-handling-server.mdx (via @objectstack/spec)
  • content/docs/api/index.mdx (via @objectstack/spec)
  • content/docs/automation/approvals.mdx (via @objectstack/spec)
  • content/docs/automation/connectors.mdx (via @objectstack/spec)
  • content/docs/automation/flows.mdx (via @objectstack/spec)
  • content/docs/automation/hook-bodies.mdx (via @objectstack/lint, packages/spec)
  • content/docs/automation/hooks.mdx (via @objectstack/spec)
  • content/docs/automation/index.mdx (via @objectstack/spec)
  • content/docs/automation/webhooks.mdx (via @objectstack/spec)
  • content/docs/automation/workflows.mdx (via @objectstack/spec)
  • content/docs/concepts/architecture.mdx (via @objectstack/spec)
  • content/docs/concepts/design-principles.mdx (via packages/spec)
  • content/docs/concepts/index.mdx (via @objectstack/spec)
  • content/docs/concepts/metadata-driven.mdx (via @objectstack/spec)
  • content/docs/concepts/metadata-lifecycle.mdx (via packages/spec)
  • content/docs/concepts/north-star.mdx (via @objectstack/spec)
  • content/docs/data-modeling/analytics.mdx (via @objectstack/spec)
  • content/docs/data-modeling/drivers.mdx (via @objectstack/spec)
  • content/docs/data-modeling/external-datasources.mdx (via @objectstack/spec)
  • content/docs/data-modeling/field-types.mdx (via @objectstack/spec)
  • content/docs/data-modeling/fields.mdx (via @objectstack/spec)
  • content/docs/data-modeling/formulas.mdx (via @objectstack/spec)
  • content/docs/data-modeling/index.mdx (via @objectstack/spec)
  • content/docs/data-modeling/objects.mdx (via @objectstack/spec)
  • content/docs/data-modeling/queries.mdx (via @objectstack/spec)
  • content/docs/data-modeling/schema-design.mdx (via @objectstack/spec)
  • content/docs/data-modeling/seed-data.mdx (via @objectstack/spec)
  • content/docs/data-modeling/validation-rules.mdx (via @objectstack/spec)
  • content/docs/data-modeling/validation.mdx (via @objectstack/spec)
  • content/docs/deployment/cli.mdx (via @objectstack/spec)
  • content/docs/deployment/tenancy-modes.mdx (via @objectstack/spec)
  • content/docs/deployment/troubleshooting.mdx (via @objectstack/spec)
  • content/docs/deployment/validating-metadata.mdx (via @objectstack/spec)
  • content/docs/getting-started/build-with-claude-code.mdx (via @objectstack/spec)
  • content/docs/getting-started/common-patterns.mdx (via @objectstack/spec)
  • content/docs/getting-started/examples.mdx (via @objectstack/spec)
  • content/docs/getting-started/quick-reference.mdx (via @objectstack/spec)
  • content/docs/getting-started/quick-start.mdx (via @objectstack/spec)
  • content/docs/getting-started/your-first-project.mdx (via @objectstack/spec)
  • content/docs/kernel/cluster.mdx (via @objectstack/spec)
  • content/docs/kernel/contracts/auth-service.mdx (via packages/spec)
  • content/docs/kernel/contracts/cache-service.mdx (via packages/spec)
  • content/docs/kernel/contracts/data-engine.mdx (via @objectstack/spec)
  • content/docs/kernel/contracts/index.mdx (via @objectstack/spec)
  • content/docs/kernel/contracts/metadata-service.mdx (via packages/spec)
  • content/docs/kernel/contracts/storage-service.mdx (via packages/spec)
  • content/docs/kernel/index.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/email-service.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/index.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/queue-service.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/sharing-service.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/sms-service.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/storage-service.mdx (via packages/spec)
  • content/docs/kernel/services-checklist.mdx (via @objectstack/spec)
  • content/docs/kernel/services.mdx (via @objectstack/spec)
  • content/docs/permissions/authorization.mdx (via @objectstack/lint, @objectstack/spec)
  • content/docs/permissions/permission-sets.mdx (via @objectstack/spec)
  • content/docs/permissions/permissions-matrix.mdx (via @objectstack/spec)
  • content/docs/permissions/positions.mdx (via @objectstack/spec)
  • content/docs/permissions/rls.mdx (via @objectstack/spec)
  • content/docs/permissions/sharing-rules.mdx (via @objectstack/spec)
  • content/docs/plugins/adding-a-metadata-type.mdx (via @objectstack/spec)
  • content/docs/plugins/development.mdx (via @objectstack/spec)
  • content/docs/plugins/index.mdx (via @objectstack/spec)
  • content/docs/plugins/packages.mdx (via @objectstack/spec)
  • content/docs/protocol/backward-compatibility.mdx (via @objectstack/spec)
  • content/docs/protocol/diagram.mdx (via packages/spec)
  • content/docs/protocol/kernel/config-resolution.mdx (via @objectstack/spec)
  • content/docs/protocol/kernel/http-protocol.mdx (via @objectstack/spec)
  • content/docs/protocol/kernel/i18n-standard.mdx (via @objectstack/spec)
  • content/docs/protocol/kernel/index.mdx (via @objectstack/spec)
  • content/docs/protocol/kernel/lifecycle.mdx (via @objectstack/spec)
  • content/docs/protocol/kernel/plugin-spec.mdx (via @objectstack/spec)
  • content/docs/protocol/knowledge.mdx (via @objectstack/spec)
  • content/docs/protocol/objectql/index.mdx (via @objectstack/spec)
  • content/docs/protocol/objectql/query-syntax.mdx (via @objectstack/spec)
  • content/docs/protocol/objectql/schema.mdx (via @objectstack/spec)
  • content/docs/protocol/objectql/security.mdx (via packages/spec)
  • content/docs/protocol/objectql/state-machine.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/actions.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/concept.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/index.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/layout-dsl.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/record-alert.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/widget-contract.mdx (via @objectstack/spec)
  • content/docs/releases/implementation-status.mdx (via @objectstack/spec)
  • content/docs/releases/index.mdx (via @objectstack/spec)
  • content/docs/releases/v12.mdx (via @objectstack/spec)
  • content/docs/releases/v13.mdx (via @objectstack/spec)
  • content/docs/releases/v16.mdx (via @objectstack/spec)
  • content/docs/releases/v17.mdx (via @objectstack/lint, @objectstack/spec)
  • content/docs/releases/v9.mdx (via @objectstack/spec)
  • content/docs/ui/actions.mdx (via @objectstack/spec)
  • content/docs/ui/apps.mdx (via @objectstack/spec)
  • content/docs/ui/create-vs-edit-form.mdx (via @objectstack/spec)
  • content/docs/ui/dashboards.mdx (via @objectstack/spec)
  • content/docs/ui/forms.mdx (via @objectstack/spec)
  • content/docs/ui/index.mdx (via @objectstack/spec)
  • content/docs/ui/public-data-collection.mdx (via @objectstack/spec)
  • content/docs/ui/setup-app.mdx (via @objectstack/spec)
  • content/docs/ui/translations.mdx (via @objectstack/spec)
  • content/docs/ui/views.mdx (via @objectstack/spec)

Advisory only. To re-verify, run the docs-accuracy-audit workflow scoped to these files:
node scripts/docs-audit/affected-docs.mjs origin/main → pass the list as args.docs.

@os-zhuang
os-zhuang marked this pull request as ready for review August 5, 2026 19:16
@os-zhuang
os-zhuang added this pull request to the merge queue Aug 5, 2026
Merged via the queue into main with commit e900015 Aug 5, 2026
25 checks passed
@os-zhuang
os-zhuang deleted the claude/issue-5435-chart-drilldown-navigate branch August 5, 2026 19:28
akarma-synetal pushed a commit to akarma-synetal/framework that referenced this pull request Aug 6, 2026
* docs(pm-dispatch): 探活入例行、报告丢失直接验收、座位行自查等五处协议更新

2026-08-05 实测教训回写(维护者指示):

1. step 6 新增「探活」固定动作:完成通知在宿主进程重启下会静默丢失——
   三个在飞 dev 死亡数小时无任何信号;每轮巡检对无产出的 dev 发状态
   询问,「no active task; resumed from transcript」回包即当场复活。
2. step 6 新增「报告丢失直接验收」兜底:PR 全绿 + agent 确认死亡/静默
   ≥2h + 报告未达 ⇒ 直接按 PR 对照 origin/main 验收(objectstack-ai#5550/objectstack-ai#5556 先例)。
3. 座位表协议新增「每轮核对自己的正文行」:协议升级迁移状态可把在任 PM
   记成待认领,叠加惰性回收条款即误回收风险(spec 座位当日实例)。
4. worktree 接手协议前置 SendMessage 复活路径(更便宜、保全上下文),
   接手协议降为 resume 不可用时的后备。
5. step 7 新增两条评审判据:验收判据本身可被 dev 用测量证伪(objectstack-ai#5452 字面
   grep 归零判据不成立,改钉配平不变量);tests/docs-only PR 走
   skip-changeset 标签且 rerun 无效需新 labeled 事件(objectstack-ai#5497/objectstack-ai#5502)。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018fxLGQdatPbBUvCgiVxg6D

* docs(pm-dispatch): skip-changeset 条目随 objectstack-ai#5625 更新 —— 闸门已实时读标签,教训改记为「载荷 vs 现状」通病标本

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018fxLGQdatPbBUvCgiVxg6D

---------

Co-authored-by: Claude <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation protocol:ui size/m tests tooling

Projects

None yet

2 participants