Skip to content

docs(ROADMAP): 按 #3673/#3699 落地后的现实改写 P1.12.2 与 Permission Management 两段 (#3700) - #3705

Merged
yinlianghui merged 1 commit into
mainfrom
claude/issue-3700-roadmap-p112-truth
Aug 7, 2026
Merged

docs(ROADMAP): 按 #3673/#3699 落地后的现实改写 P1.12.2 与 Permission Management 两段 (#3700)#3705
yinlianghui merged 1 commit into
mainfrom
claude/issue-3700-roadmap-p112-truth

Conversation

@yinlianghui

Copy link
Copy Markdown
Collaborator

Fixes #3700

纯文档改动,只动 ROADMAP.md 一个文件的两段(:825-839),零代码、零行为变化。无 changeset —— 根文档不是发布包,用户可见产物零 delta。

注:正文不写尖括号加字母的形式(GitHub 正文消毒器会把它当 HTML 标签在存储时剥掉),路由一律写成 /apps/setup/:objectName

先定惯例,再改字(派发单要求)

issue #3700 把取舍留给了维护者:「ROADMAP 是历史账本还是当前真相快照」。不必问 —— 这个文件自己已经答过三次,普查 ROADMAP.md 其它段落对「已推翻/已退场」项的处理,惯例是一致的:

位置 现有写法 形态
:152 **ViewDesigner:** _(Removed — replaced by ViewConfigPanel)_ 子标题挂斜体退场注,下面的 [x] 历史项保留
:157 - [x] Removed: ViewDesigner replaced by ViewConfigPanel … 退场本身作为一条 [x] 记账
:1046 - [x] Tab-drag UX retired in favour of Manage Views dialog (commit 3371239c) [x] + 「retired in favour of X」+ 裸引用
:997 - [x] Auto-redirect … — removed; object now uses metadata pipeline [x] + 破折号 + 当前形态
:82 … the client-side @object-ui/tenant package was removed as dead surface, #2564 保留已删符号名 + 裸 issue 号

即:历史账本 + 就地标注,条目不删、不打删除线,文字改写成「当前形态」并挂一个裸文本引用((PR #771) / (Issue #719) / (commit …) 这三种,全文只有 6 处 markdown 链接,issue 链接仅 1 处)。本 PR 照此办理 —— 因此没有新增任何链接,check-doc-links 的扫描面不受影响。

九项逐条核实(全部对 origin/main @ b19f54f39 实测)

# 原文(:831-839) 实测现状 证据
1 Shared SystemObjectViewPage component using ObjectView 文件已删 pages/system/ 下已无该文件;全仓 grep 两个符号,排除 ROADMAP/CHANGELOG 后零命中(PR #3699)
2 /system/users driven by sys_user … via ObjectView 路由是重定向,不是页面 AppContent.tsx:203 SystemObjectRedirect objectName="sys_user"(PR #3673)
3 /system/organizations driven by sys_org 重定向到 sys_organization;sys_org 不存在 AppContent.tsx:204;grep -rlw sys_org ../objectstack/packages/ = 0 个文件
4 /system/roles driven by sys_role 重定向到 sys_position;无 sys_role 对象 AppContent.tsx:205;sys_role 的 18 处命中全在 CHANGELOG 与改名说明里,无对象定义;packages/spec/PROTOCOL_MAP.md:104 写明 ADR-0090 改名
5 /system/permissions driven by sys_permission 该路由未声明;sys_permission 不是框架对象名 AppContent.tsx:191-201 的注释写明「absent on purpose」;grep -rlw sys_permission packages/ 唯一命中是 sys-capability.object.ts 的 docblock,内容正是「不叫 sys_permission」
6 /system/audit-log … via ObjectView (read-only) 路由在,但页面是独立手写的 AuditLogPage.tsx 436 行::152 fetch(${API_BASE}/data/sys_audit_log?…),手写 $filter/$orderby/$top/$skip(:144-150)、手写 Table(:296)与 Sheet 详情;不经 ObjectView
7 Admin-only CRUD via ObjectView operations config 随组件消失 operations/canMutate = !readOnly && isAdmin 就长在被删的 SystemObjectViewPage 里(PR #3699)
8 Automatic search/sort/filter/pagination from ObjectView 同上 同上
9 22 system page tests passing 该套测试不存在 pages/system/__tests__/ 现只有 SystemHubPage.counts.test.tsxSystemHubPage.metadataCards.test.tsx

同源漂移的 :825-828 Permission Management Page 段(sys_permission CRUD grid / search-filter / admin-only create-delete):该页与该路由均已不存在,对象名亦非框架真名 —— 依据同上第 5、7 条。

九条无一仍然成立,issue 前提完全属实。

前后对照

改前(:830-839,九个 [x] 全部失实):

**ObjectView-Driven System Pages (P1.12.2):**
- [x] Shared `SystemObjectViewPage` component using `ObjectView` from `@object-ui/plugin-view`
- [x] User Management (`/system/users`) driven by `sys_user` metadata via ObjectView
- [x] Organization Management (`/system/organizations`) driven by `sys_org` metadata via ObjectView
- [x] Role Management (`/system/roles`) driven by `sys_role` metadata via ObjectView
- [x] Permission Management (`/system/permissions`) driven by `sys_permission` metadata via ObjectView
- [x] Audit Log (`/system/audit-log`) driven by `sys_audit_log` metadata via ObjectView (read-only)
- [x] Admin-only CRUD operations controlled via ObjectView `operations` config
- [x] Automatic search, sort, filter, pagination from ObjectView capabilities
- [x] 22 system page tests passing

改后(子标题挂退场注,九条逐一改写为「当前形态 + 落地 PR」):

**ObjectView-Driven System Pages (P1.12.2):** _(Retired — the console's wrapper pages are gone; these objects are contributed by framework plugins and reached through the Setup app's generic object route)_
- [x] Shared `SystemObjectViewPage` component, and the hand-copied `systemObjects` definitions behind it — deleted as dead code once nothing in the repo referenced them (PR #3699)
- [x] User Management (`/system/users`) — page gone; the URL survives as a redirect onto the framework's `sys_user` object route (PR #3673)
- [x] Organization Management (`/system/organizations`) — page gone; the URL redirects to `sys_organization` (PR #3673). The `sys_org` named here was never a framework object
- [x] Role Management (`/system/roles`) — page gone; the URL redirects to `sys_position` (PR #3673), ADR-0090 D3 having renamed `sys_role` → `sys_position`
- [ ] Permission Management (`/system/permissions`) — no route is declared for it. The framework splits this surface into `sys_capability` and `sys_permission_set`, so binding the URL to either would pick for the maintainer; left undeclared pending that decision, see #3655
- [x] Audit Log (`/system/audit-log`) — the route still resolves, but to `AuditLogPage`, a standalone read-only page that queries `sys_audit_log` over REST and renders its own table, filters, pagination and detail sheet; ObjectView is not involved
- [x] Admin-only CRUD operations — were the `operations` config on `SystemObjectViewPage`'s own schema, and went with the component (PR #3699)
- [x] Automatic search, sort, filter, pagination — likewise; what serves these objects today is the framework's Setup app route, not this repo's
- [x] System page test suite — retired with the pages; `pages/system/__tests__/` now covers `SystemHubPage` only

Permission Management Page 段同法:子标题加 _(Retired — the page was deleted; the successor surface is pending maintainer decision, see #3655)_,三条改写为「当年交付过 → 随 console 瘦身一并删除」,并就地把对象名纠正为 sys_capability / sys_permission_set

两处刻意的取舍

措辞纪律(遵 #3656:不复植失真特征词)

#3656 的规矩是:承载错误机制的特征词改完要 grep 归零,而不是换个说法把它留着。本 PR 逐条量了:

特征词 改前 改后
driven by … metadata 5 0
via ObjectView 6 0
from ObjectView capabilities 1 0
22 system page tests 1 0

第一版草稿里 via ObjectView 只降到 1(第 7 条把它留在了主语位置,读起来仍像在陈述现行机制),已改写成过去式主语「were the operations config on …」后才真正归零 —— 如实记下,因为这正是 #3656 那个 carries no continue-on-error 教训的同型。

刻意保留的两个符号名(不是复植,而是纠错):SystemObjectViewPage(:831)与 sys_org(:833)。二者都紧跟「已删除 / 从来就不是框架对象」的判词,下一个 grep 到它们的 agent 读到的是结论而非诱饵 —— 这与 :82 保留 @object-ui/tenant、:152 保留 ViewDesigner 的既有惯例一致。

验证

改动不含代码,本仓无任何测试或脚本读取 ROADMAP.md 的正文(scripts/__tests__/check-doc-links.test.ts 里的 ROADMAP 是内存里合成的 fixture,见 :778 / :812,与真实文件无关),故没有可跑绿的单元测试 —— 如实写明,不凑数。真正管这块的是 doc-links 门禁,ROADMAP.md 是它第 5 个扫描根(check-doc-links.mjs:397,rule: 'disk'):

改前 baseline: node scripts/check-doc-links.mjs   → Links are valid across 7 scan roots.   EXIT=0
改后:          node scripts/check-doc-links.mjs   → Links are valid across 7 scan roots.   EXIT=0

阳性对照(先预测,后运行) —— 前后同为绿,必须先证明「门禁确实看了我改的那几行」,否则绿是「没看」而不是「没问题」。预测:往第 831 行(本 PR 改写过的行)注入一个死链,门禁应转红并点名 ROADMAP.md:831。实测吻合:

- [example-relative] ROADMAP.md:831 -> ./docs/adr/9999-does-not-exist.md
EXIT=1

随后还原,门禁复绿(EXIT=0),grep -c 9999 ROADMAP.md = 0,工作树干净。

控制字符:

node scripts/check-control-bytes.mjs → OK (scanned 3680 tracked text file(s); skipped 85 binary)   EXIT=0
grep -naP '[\x00-\x08\x0b\x0c\x0e-\x1f]' ROADMAP.md → 无输出(exit 1)

围栏

  • CHANGELOG.md:595 未动 —— 它是史实记录,记的是「当时确实做了这件事」,不该被改写。
  • content/docs/releases/ 未动;无 changeset。
  • ⛔ 代码零改动,AppContent.tsx / AuditLogPage.tsx 只读不写。
  • git diff 只有一个 hunk:@@ -825,15 +825,15 @@,15 增 15 删,全部落在这两段内。

越界发现(只报不改)

同一个 ### P1.12 章节里还有两处同源漂移,落在派发单给的两段之外,按纪律不在本 PR 修改,已单独立单 #3704(观察类,finding,未认领):

  • ROADMAP.md:857 —— - [x] /system/permissions → PermissionManagementPage,该路由与该页面均已不存在(依据同上第 5 条)。
  • ROADMAP.md:871 —— - [x] 11 new tests (SystemHubPage, AppManagementPage, PermissionManagementPage),其中 PermissionManagementPage 的测试随页面一并消失。

本 PR 增删各 15 行、行号不移位,故 #3704 里记的 :857 / :871 在本 PR 合并后依然成立。


🤖 Generated with Claude Code

https://claude.ai/code/session_01GTRjn8xBqp75dk7kFupVRt


Generated by Claude Code

/#3699 reality (#3700)

All nine [x] in "ObjectView-Driven System Pages (P1.12.2)" had gone false:
the shared component was deleted (PR #3699), four URLs became redirects onto
framework objects (PR #3673), /system/permissions is deliberately undeclared,
the audit page is a standalone REST page, and the 22-test suite is gone. The
Permission Management Page block above it drifted from the same source.

Rewritten per this file's own retirement convention (an italic _(Retired — …)_
annotation on the sub-header plus rewritten [x] items carrying a bare PR ref,
as at :152 ViewDesigner and :1046 tab-drag). The /system/permissions successor
stays neutral and unchecked — pending the maintainer's call in #3655.

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

vercel Bot commented Aug 7, 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)
objectui Ignored Ignored Aug 7, 2026 11:36pm

Request Review

@github-actions github-actions Bot added the documentation Improvements or additions to documentation label Aug 7, 2026
@yinlianghui
yinlianghui marked this pull request as ready for review August 7, 2026 23:37
@yinlianghui
yinlianghui added this pull request to the merge queue Aug 7, 2026
Merged via the queue into main with commit 35e84b6 Aug 7, 2026
6 checks passed
@yinlianghui
yinlianghui deleted the claude/issue-3700-roadmap-p112-truth branch August 7, 2026 23:38
akarma-synetal pushed a commit to akarma-synetal/objectui that referenced this pull request Aug 10, 2026
…objectstack-ai#3704) (objectstack-ai#3714)

:857 与 :871 是 objectstack-ai#3700/objectstack-ai#3705 围栏外的同源漂移:`/system/permissions` 路由
今天未声明(AppContent.tsx:191-201 注明「absent on purpose」),
PermissionManagementPage 已随 apps/console 瘦身删除(commit cccdf84),
其测试亦零命中。

照 PR objectstack-ai#3705 的落地手法:条目不删、就地改写成当前形态并挂裸文本引用;
permissions 空缺保持中性、只指向 objectstack-ai#3655,不预判 sys_capability /
sys_permission_set;PermissionManagementPage 作纠错锚保留(判词紧跟其后);
计数不写新硬编码数字。


Claude-Session: https://claude.ai/code/session_01GTRjn8xBqp75dk7kFupVRt

Co-authored-by: Claude <noreply@anthropic.com>
akarma-synetal pushed a commit to akarma-synetal/objectui that referenced this pull request Aug 10, 2026
…jectstack-ai#3712) (objectstack-ai#3732)

objectstack-ai#3704 / PR objectstack-ai#3714 的围栏之外还剩两处同源漂移:

一、MetadataManagerPage 整片(:858 / :862 / :868 / :999)。该组件在
apps/console/src/ 下零文件零引用;`/system/metadata/:metadataType` 今天的
route element 是 MetadataRedirect,一跳转到 metadata-admin 引擎自己的
metadata/:type,元素为 MetadataResourceListPage
(packages/app-shell/src/views/metadata-admin/ResourceListPage.tsx),由引擎的
MetadataResourceRegistry 驱动。:999 所指的 ObjectManagerListAdapter 与
listComponent 两个载体亦均零命中 —— object 根本不需要自定义列表,由
builtinComponents.tsx 的 registerMetadataResource({ type: 'object', … })
接入通用外壳;引擎侧对应的插槽是 MetadataResourceConfig.ListPage,今天只有
datasource 覆写它。故连紧邻的 :1000(listComponent 判词的另一半)一并改写,
否则 :999 改完与它自相矛盾 —— 这正是分诊裁定要避免的形态。

二、:872 `Total: 20 system page tests passing`。「system page tests」无固定
指称(窄读 13、宽读 18,皆非 20),照 :871 / PR objectstack-ai#3705 先例**不种新计数**,
改写为不含硬编码数字、并提示按需自行度量的表述。

手法沿用 objectstack-ai#3700 / PR objectstack-ai#3705:条目一律不删、就地按现实改写、原 [x] 保留(里程碑
确实以另一形态交付过)、错误名保留作纠错锚且判词紧跟其后、引用只挂裸文本编号、
不新增任何硬编码计数、不写版本号字面量。

围栏外另有 P1.12.3 / P1.16 的残余漂移(config/metadataTypeRegistry.ts、
listMode、MetadataGrid 等),按纪律只报不改,另立单。

Claude-Session: https://claude.ai/code/session_01GTRjn8xBqp75dk7kFupVRt

Co-authored-by: Claude <noreply@anthropic.com>
akarma-synetal pushed a commit to akarma-synetal/objectui that referenced this pull request Aug 10, 2026
…ectstack-ai#3858)

objectstack-ai#3712 / PR objectstack-ai#3732 的围栏(MetadataManagerPage / listComponent 一族)之外,
P1.12.3 与 P1.16 两节还剩九条失实条目。手法沿 objectstack-ai#3700 / PR objectstack-ai#3705objectstack-ai#3704 /
PR objectstack-ai#3714objectstack-ai#3712 / PR objectstack-ai#3732:条目一律不删、就地按现实改写、原 [x] 保留、
错误名保留作纠错锚且判词紧跟其后、引用只挂裸文本编号、不种新计数。

P1.12.3 四条:

- metadataTypeRegistry —— 全仓零命中。但它并非"从未存在":文件确实以
  apps/console/src/config/metadataTypeRegistry.ts 落过地(d601ef6 加入),
  在 ff9a0d9(移除 studio app、迁往 metadata-admin 引擎)被删。今天的等价物
  是引擎自己的 MetadataResourceRegistry
  (packages/app-shell/src/views/metadata-admin/registry.ts),行类型
  MetadataResourceConfig,由 registerMetadataResource() 填;且未注册的类型
  同样可列可编,注册只是覆写默认值 —— "centralized config" 的语义也变了。
- SystemHubPage 注册表生成卡片 —— metadataTypeCards 是手写字面量
  (Applications / Metadata / Datasources),其上方注释自述 per-type 卡片
  在引擎开始自动列举全部类型后即被移除;dashboard / page / report 三张卡
  都不存在。真正按注册表列举类型的是引擎的 MetadataDirectoryPage。
- 动态 /system/metadata/:metadataType —— 该拼法只在 console host fragment
  (apps/console/src/AppContent.tsx)声明,三种 arity 的 route element 都是
  MetadataRedirect,并非页面。真正渲染的动态路由是引擎的 metadata/:type
  (packages/app-shell/src/console/AppContent.tsx);"in all route contexts"
  这半句对它成立(with-app 与 zero-app 两支都声明了),故如实保留。
- app / object 专属路由 —— app 仍成立(system/apps → AppManagementPage);
  object 已无专属页,由引擎通用外壳承载,配置见 builtinComponents.tsx 与
  views/metadata-admin/anchors.ts 的 registerMetadataResource({ type:
  'object', … }),只给列/搜索字段/建单字段/锚点,无组件覆写。全仓仅
  permission(EditPage)与 datasource(ListPage)替换外壳页。

P1.16 四条 + :1001:

- listMode / MetadataTypeConfig / MetadataGrid 三个符号全仓零命中;
  MetadataResourceConfig 没有任何渲染模式键,列形状只有 listColumns
  (加 ListPage 整页替换)。
- "grid mode 下的表格渲染"—— 表格是真的,但不是一档模式:
  ResourceListPage 对所有类型无条件渲染同一个 table,无分支可切。
- report 一条须订正卡片正文的举证:report **有** registerMetadataResource
  注册(anchors.ts,基线 4e93e40 上即已存在),卡片正文"零注册"的
  grep 结论有误。真实判词是:注册项里没有任何东西选择渲染模式(因为无模式
  可选),它配的是对象锚点组与建单种子。
- :1001 按分诊注记逐入口分别判,且前提已部分过期:卡片正文称
  sidebar / QuickActions 仍指 legacy 别名,而 objectstack-ai#3739 / PR objectstack-ai#3748 已合并 ——
  两个 sidebar 的 sys-objects 与 home 的 manage-objects 现均指引擎正规路由
  /apps/setup/metadata/object;hub cards 本就没有 object 卡。故三个入口
  今天没有一个指向该拼法,离开的原因各不相同,如实分述。

围栏内只动这九行。节标题 **Metadata Manager Grid Mode:** 依"错误名留作
纠错锚"之例不动;:865 的 MetadataService 三个方法经核实真实存在,不在改写
之列。

Fixes objectstack-ai#3738

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

Projects

None yet

2 participants