Skip to content

fix(plugin-approvals): label the approval request's record_id "Record", since the column shows the record and not its id - #28347

Merged
objectstack-fleet[bot] merged 5 commits into
mainfrom
claude/project-thread-wzzflr
Oct 31, 2026
Merged

objectstack-fleet[bot] merged 5 commits into
mainfrom
claude/project-thread-wzzflr

Conversation

@objectstack-fleet

@objectstack-fleet objectstack-fleet Bot commented Oct 31, 2026 •

Copy link
Copy Markdown
Contributor

domain:spec#2 · os-tesla · session_01L9qibx5r5nhDMwpRs4SL6D

Requested by Tesla · project thread

Fixes #28250

Clause-②: no
Metadata-protocol: none

维护者速读

  • 改了什么:审批请求(sys_approval_request)的 record_id 字段显示名由 “Record ID” 改为 “Record”;中文 “记录”、日文 “レコード”、西班牙文 “Registro” 同步改。
  • 为什么改:Setup › 审批请求列表里这一列显示的是目标记录的图标和名称,不是 ID;表头写 “Record ID” 让管理员去找一个并不存在的 ID(HotCRM 客户走查 S9 发现)。
  • 风险与回滚:只改显示名;字段名 record_id、查询、种子数据、与 object_name 的指针对、记录锁都不变;回滚即 revert 本 PR。
  • 先看:packages/plugins/plugin-approvals/src/sys-approval-request.object.ts(record_id 的 label)、packages/plugins/plugin-approvals/src/translations/zh-CN.objects.generated.ts(sys_approval_request.fields.record_id)。
  • 两分钟验证:在 Console 打开 Setup › 审批请求,四个列表视图的表头、请求详情页的亮点条与 Details 标签都显示 “Record”(中文界面显示 “记录”)。
  • 需要你做的:无,席位落地。

What changes

The Approval Requests list views draw the record_id cell as the target record (its object's icon and name), because record_id is the id half of the request's pointer pair with object_name (ADR-0052 §5). The header "Record ID" therefore disagreed with the cell.

  • packages/plugins/plugin-approvals/src/sys-approval-request.object.ts: record_id label 'Record ID' becomes 'Record'. Nothing else in the field moves.
  • packages/plugins/plugin-approvals/src/translations/en.objects.generated.ts: regenerated by node scripts/check-i18n-bundles.mjs --write; the only diff across all nine bundle packages is this one leaf.
  • zh-CN / ja-JP / es-ES hand values: 记录 ID → 记录, レコード ID → レコード, ID de registro → Registro. These are the words the same plugin already uses for sys_approval_action.record_id ("Record"), so the two approval objects now agree. The leaf has no source-hash entry in any locale, so no hash table moves.
  • Changeset: @objectstack/plugin-approvals patch.

Tests

No test pinned the old label (git grep for each of the four old strings outside the bundles: 0 hits in tests, 0 under ui/), and a label is display copy no consumer parses, so no new pin is added. The pointer-pair, query and seed tests are untouched and pass unchanged.

Acceptance notes

  • object_name keeps its label "Object". It is not a list column (no list view shows a pointer's type half), and on the Details tab "Object" beside "Record" reads correctly, so it is not the same defect.
  • origin/main moved after branch-off; git merge-tree against it is clean and none of the incoming files are this PR's.
  • Same pattern elsewhere, carried by the seat as its own domain:server card: sys_audit_log and sys_activity (plugin-audit) also declare record_id with referenceVia and keep "Record ID". sys_mail_association.record_id (service-mailbox) is a different case: its record page shows it only in the highlights strip, which draws the stored id, so its label is right until that strip leaves it out.

Verification

All readings at head f17b7d75 on objectstack-ai/objectstack (merge base 501c864d), unless a line names an earlier head.

Tests
  • At 27ee7b7d (the later commits change only the changeset text in this package's scope): pnpm --filter @objectstack/plugin-approvals test: Tests 1361/1361 passed; pnpm --filter @objectstack/plugin-approvals typecheck (tsc, scripts tsconfig, test-typecheck ledger held): lock VERDICT command-exit 0.
  • node scripts/check-i18n-bundles.mjs --write: exit 0; only en.objects.generated.ts changed, by the one leaf.
Gates
  • Build: the i18n prerequisite closure (62/62 tasks) and then turbo run build --filter='./packages/**' (77/77 tasks), lock VERDICT command-exit 0 both.
  • dispatch-gates --commands at f17b7d75: 55 families (the same list as at 27ee7b7d), each run with stdin from /dev/null, exit codes recorded before any pipe. --ran: 55 derived, 55 run, 0 NOT-MEASURED, 0 UNRUN, 0 red.
  • All 55 answered exit 0 on the first run at this head. At 27ee7b7d two had first answered exit 3 (prerequisite not met) until their prerequisites were cleared: check-plugin-teardown-shape --self-test (its pinned control commit 621a4876 fetched into the shallow clone) and check:dual-build-cjs-loads (after the packages build).
  • The full CI farm (test:repo, the UI lanes) is CI's.

Generated by Claude Code

…"Record"

The column shows the target record's name and icon, so the header
"Record ID" told the reader to look for an id that is not there.
Field name, queries, seeds and the pointer pair are unchanged.

Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01L9qibz9o2UXx9eqto4hqY3
@github-actions github-actions Bot added size/s documentation Improvements or additions to documentation tooling Fix lands in tooling, not a product package — enters pm:queue only with Unblocks: or a named surface labels Oct 31, 2026
@github-actions

github-actions Bot commented Oct 31, 2026 •

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

This PR changes 1 package(s): @objectstack/plugin-approvals, touching 2 documentable anchor(s).

6 hand-written doc(s) NAME something this change touched and may need an implementation-accuracy re-verification:

  • content/docs/automation/approvals.mdx (via sys_approval_request (symbol, a field of const object enObjects; a field of const object esESObjects; a field of const object jaJPObjects; a field of const object zhCNObjects))
  • content/docs/automation/flows.mdx (via sys_approval_request (symbol, a field of const object enObjects; a field of const object esESObjects; a field of const object jaJPObjects; a field of const object zhCNObjects))
  • content/docs/automation/workflows.mdx (via sys_approval_request (symbol, a field of const object enObjects; a field of const object esESObjects; a field of const object jaJPObjects; a field of const object zhCNObjects))
  • content/docs/data-modeling/field-types.mdx (via sys_approval_request (symbol, a field of const object enObjects; a field of const object esESObjects; a field of const object jaJPObjects; a field of const object zhCNObjects))
  • content/docs/plugins/packages.mdx (via sys_approval_request (symbol, a field of const object enObjects; a field of const object esESObjects; a field of const object jaJPObjects; a field of const object zhCNObjects))
  • content/docs/ui/translations.mdx (via sys_approval_request (symbol, a field of const object enObjects; a field of const object esESObjects; a field of const object jaJPObjects; a field of const object zhCNObjects))

⛔ 2 release-owned page(s) also name something this change touched. These are read-only:

  • content/docs/releases/v16.mdx (via sys_approval_request (symbol, a field of const object enObjects; a field of const object esESObjects; a field of const object jaJPObjects; a field of const object zhCNObjects))
  • content/docs/releases/v17/17-6.mdx (via sys_approval_request (symbol, a field of const object enObjects; a field of const object esESObjects; a field of const object jaJPObjects; a field of const object zhCNObjects))

content/docs/releases/ is RELEASE-OWNED (AGENTS.md "Documentation Guardrails"): release
notes are written centrally at release time, and a code PR that edits them is the exact PR
that guardrail exists to stop. They are still audited — read-only. If one of them is actually
wrong, file an issue or open a dedicated docs-only PR; do not edit it here.

What this run could not see
  • the SDK route bridge reached 59 of 211 client-bound route-ledger rows — the other 152 have no registrar path: tail to select them, so pages documenting THEIR client methods cannot appear above, on this or any run. Of those 152: 0 are remediable by widening that discovery convention (an in-repo file declares the path; the convention did not scan it); 55 are structural — on a ledger where NOT ONE row is declared in-repo, so no discovery change reaches them at any price; 97 are undecided (no in-repo declaration, on a ledger that has other in-repo registrars — absence and an unreadable spelling are not distinguishable here). The rows themselves: node scripts/docs-audit/affected-docs.mjs --bridge-coverage
  • a page that states a rule by its inputs shares no identifier with the emitter that implements the rule, so an emitter-only diff cannot list it — not on this run and not on any run. Measured on fix(driver-sql): emit varchar(maxLength) for a text field a declared index keys on #11430: content/docs/protocol/objectql/types.mdx documents the text-family column mapping by the ObjectQL type names it maps FROM (text / textarea / html) while the diff changed createColumn; it went unlisted, and it was the page that diff falsified, in four places. No shared token exists to detect this on, so a rule your change carries has to be re-read by hand in the pages that restate it.
  • a key NAME is not a key, so the hand re-read the line above prescribes can land on the wrong schema. The same spelling is authorable on one governed type and a [REMOVED] tombstone on another for each of active, aria, joins, objects, template, tools and version (censused on [finding] tools is a key on BOTH AgentSchema (tombstoned, dead) and SkillSchema (live, cloud-attested), so a name-based search attributes skill examples to the agent key — it produced a false stop-the-line alarm on PR #19059 #19093 over the liveness ledger's governed types, top-level keys); nothing in a search result distinguishes the two, so a grep hit on a LIVE example reads as evidence about the DEAD key. Measured on fix(spec): the agent.tools liveness row says dead — it claimed live on a key the schema tombstoned #19059: content/docs/ai/agents.mdx was reported as contradicting the agent.tools tombstone over its tools: example at :161, which is inside the defineSkill({ block opened at :155 — the page was already correct. Settle ownership by PARSING the value against both schemas, never by the name: that literal PASSES SkillSchema, and as an AgentSchema it FAILS at tools with the tombstone prescription. ⛔ These names are not the whole class — a key retired through a .strict() guidance map leaves no tombstone in the walked shape and none of them here (tool.category, live as AIToolDefinition.category).

Coarse fallback — 6 page(s) merely mention a changed package (the pre-#9192 predicate, kept for the deliberately-wide backstop): node scripts/docs-audit/affected-docs.mjs --json 488b3ed092796136551c36a5eb6d143c44a2b878 → packageMentionDocs.

Which tree this was computed on

This run read content/docs from 9e4c6b3c586a058710739a7b85204fb166814991 — the merge of head f17b7d7581e5c9e368734adc421ccd4ab1aaa893 into base 488b3ed092796136551c36a5eb6d143c44a2b878, which is what actions/checkout gives a pull_request run. Not the PR head.

A worktree cut from an older main holds a different content/docs, so re-deriving there can legitimately return a different list — that is a different tree, not a wrong row. To answer on the same tree:

# while this PR is open — GitHub drops the merge commit once it closes
git fetch origin 9e4c6b3c586a058710739a7b85204fb166814991 && git checkout 9e4c6b3c586a058710739a7b85204fb166814991
# afterwards, rebuild it from the two parents, which stay fetchable
git fetch origin 488b3ed092796136551c36a5eb6d143c44a2b878 f17b7d7581e5c9e368734adc421ccd4ab1aaa893 && git checkout -B drift-repro 488b3ed092796136551c36a5eb6d143c44a2b878 && git merge --no-ff f17b7d7581e5c9e368734adc421ccd4ab1aaa893

node scripts/docs-audit/affected-docs.mjs --json 488b3ed092796136551c36a5eb6d143c44a2b878

⚠️ That checkout carried uncommitted changes, so the commit above does not fully identify what was read.

Advisory only, and a precision-first one (#9192): a page is listed because it names a
symbol, wire route or SDK method this diff touched — not because it mentions a changed
package. Each row says which anchor put it there, so a wrong row is reportable rather than
merely annoying. To re-verify, run the docs-accuracy-audit workflow scoped to these files:
node scripts/docs-audit/affected-docs.mjs 488b3ed092796136551c36a5eb6d143c44a2b878 → pass the list as
args.docs, on the commit named under Which tree this was computed on.

…cord"

Both declare referenceVia, so the console draws the target record in
the list cell and on the Details tab. sys_mail_association keeps
"Record ID": its record page shows the field only in the highlights
strip, which draws the stored id as text.

Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01L9qibz9o2UXx9eqto4hqY3
…rd_id

The sibling objects move to their own card. The changeset now says the
approval request's highlights strip leaves record_id out.

Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01L9qibz9o2UXx9eqto4hqY3
@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

domain:spec#2 · os-tesla · session_01L9qibx5r5nhDMwpRs4SL6D

维护者速读

  • 改了什么: 审批请求(sys_approval_request)的 record_id 字段显示名由 “Record ID” 改为 “Record”,中文 “记录”、日文 “レコード”、西班牙文 “Registro” 同步。
  • 为什么改: Setup › 审批请求列表里这一列画的是目标记录的图标和名称,不是 ID,表头写 “Record ID” 会误导管理员。
  • 风险与回滚: 只改显示名;字段名、查询、种子数据、指针对都不变。回滚即 revert。
  • 先看: packages/plugins/plugin-approvals/src/sys-approval-request.object.ts(record_id 的 label)。
  • 两分钟验证: Console 打开 Setup › 审批请求,列表表头显示 “Record”(中文界面 “记录”)。
  • 需要你做的: 无。不属于受管面,纯显示名,由席位落地。审计日志和活动对象的同类问题另开为 server 卡 Record pointer columns headed "Record ID" show the record's name: sys_audit_log, sys_activity, sys_mail_association #28353。
  • 席位意见: ACCEPT,可落地。

席位核对 · ACCEPT · domain:spec seat 2 (#18549) · 2026-10-31T06:29Z

Head f17b7d7581e5c9e368734adc421ccd4ab1aaa893. Card #28250 (domain:server, taken before the maintainer's 「为什么跨车道接卡」 and kept under 「已经在处理的可以继续」), claim 6539513940; the widening amendment 6539738537 was withdrawn by 6539878762 and the diff is back to sys_approval_request only.

  • Shape: draft to main, made by the relay; Fixes #28250; Clause-②: no, Metadata-protocol: none at line start. Changeset @objectstack/plugin-approvals patch.
  • Contract review: none owed. One field label and its four bundle values move; no key, type, default or accept set.
  • Diff read by the seat: 6 files, +15/−5: the source label, the regenerated en bundle leaf, three hand values matching sys_approval_action.record_id, the changeset. No plugin-audit or service-mailbox path remains after the revert commit.
  • Follow-ups filed: Record pointer columns headed "Record ID" show the record's name: sys_audit_log, sys_activity, sys_mail_association #28353 (sys_audit_log, sys_activity "Record ID" over a drawn record; sys_mail_association stays, as its highlights strip shows the raw id).
  • Gates: check-runs on this head 48 success or path-skipped, 0 red. check-governed-merges --branch: NOT governed, 6 paths, +15/−5.
  • Authority: maintainer standing go-ahead 「按 pm-dispatch 审过的pr你可以自主落地」 (2026-10-30T14:20Z, project thread).
  • Landing: pr_ready + automerge_enable in this act.

@objectstack-fleet
objectstack-fleet Bot marked this pull request as ready for review October 31, 2026 06:30
@objectstack-fleet
objectstack-fleet Bot enabled auto-merge October 31, 2026 06:30
@objectstack-fleet
objectstack-fleet Bot added this pull request to the merge queue Oct 31, 2026
Merged via the queue into main with commit 6212fdc Oct 31, 2026
53 checks passed
@objectstack-fleet
objectstack-fleet Bot deleted the claude/project-thread-wzzflr branch October 31, 2026 06:47
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 size/s tooling Fix lands in tooling, not a product package — enters pm:queue only with Unblocks: or a named surface

Projects

None yet

Development

Successfully merging this pull request may close these issues.

plugin-approvals: the Approval Requests column "Record ID" shows the target record's name, so call the field "Record" (#27356 row 7)

1 participant