Repository navigation
Setup field help is written for developers ("Foreign key to sys_user.id", "via isGrantActive", "(P3 digest middleware)", "Reaper / Rotator / Archiver") and shows inert fields — rewrite it for admins and hide Last Certified At (hotcrm#2194 T2-U02) #25331
Description
维护者速读
- 事由: 一轮 Setup 测试遇到 9 处面向开发者的字段说明(外键、函数名、ADR 编号、内部组件名),还有标明「目前无效」的字段。
- 要做: 把这些说明改写成管理员能读懂的话;隐藏尚无作用的字段(如 Last Certified At)。
- 完成标准: 下列字符串在管理员界面上不再出现。
Filing gate ③ a task the maintainer set: the maintainer's ruling on objectstack-ai/hotcrm#2194, recorded there at 6354968262 (the director seat, posting from the maintainer's account): 「25251 B hotcrm B」, 2026-10-23T01:05:47Z. That is letter B for all three rounds, exactly as the seat recommended, and it adopts T2-U02. Filed by the repo:hotcrm seat 1 (os-elon-musk, session session_014xanhPEmGTMTfVH4UokwJT) under objectstack-ai/hotcrm#2194's After the ruling. ⛔ Not a claim.
Grade: triage's. The seat suggests priority:p3: an adopted suggestion with a measured cost on an existing surface, no wrong data and no contract change.
Reader (who acts): objectstack triage routes and grades it. The landing below is the seat's reading of origin/main; paths under src/ are HotCRM's (objectstack-ai/hotcrm).
Governing text
- The ruling above. Per [Decision] Which of the 33 UI and UX suggestions from the 2026-10-20 browser passes to adopt (seat: adopt 23, fold 4 into open cards, defer 6) hotcrm#2194's own governing text, this item is an adopted suggestion through filing gate ②, not a defect card, and a platform or console landing is changed there, never re-implemented in HotCRM: 「平台相关的功能,应该尽量先改平台。」 (maintainer, 2026-10-18, ledger
6245607810).
Why (measured)
- Pages / persona: many Setup forms, the system administrator.
- Now: developer text in admin help: "Foreign key to sys_user.", "NULL only on a grant written before the column existed", "Reserved for a future access-recertification workflow … Inert today", "via isGrantActive", "(P3 digest middleware)", "Owned by objectql (better-auth is oblivious to this column)", "[ADR-0086 D3]", "ADR-0057 … Reaper / Rotator / Archiver". 9 distinct developer-facing strings met in one pass.
- Evidence: objectstack-ai/hotcrm track 2 report, UI and UX suggestions, U-02;
07-people-users-assign-permset-dialog.png,13-access-capabilities-detail.png,22-config-settings-lifecycle.png. Re-measured unchanged on@objectstack/*18.0.0 by the round 2 pass (round 2 track 2 report, UI and UX suggestions, the section's opening paragraph).
Landing
Read on objectstack origin/main 7b047b44 (git grep -F, sources and generated en bundles, tests excluded):
- "Foreign key to sys_user.id":
packages/platform-objects/src/apps/translations/en.objects.generated.ts~:1593, ~:1657 (10 hits in all). - "NULL only on a grant written before …":
packages/plugins/plugin-security/src/objects/sys-user-permission-set.object.ts~:107. - "Reserved for a future access-recertification workflow": the same file ~:209 and
sys-user-position.object.ts~:182 (the inert Last Certified At). - "via isGrantActive":
packages/plugins/plugin-approvals/src/sys-approval-delegation.object.ts~:120. - "(P3 digest middleware)":
packages/services/service-messaging/src/objects/notification-preference.object.ts~:163 (and "P3 quiet-hours middleware" beside it). - "better-auth is oblivious":
packages/platform-objectssys_userfield help (7 hits). - "Reaper / Rotator / Archiver":
packages/objectql/src/lifecycle/lifecycle-settings.ts~:22. - "[ADR-0086 D3]": 0 hits today; the dev re-measures the page the tester saw.
service-messagingalready carries anadmin-copy-vocabulary.test.ts; the dev reads whether it is the place to extend.
Done when
- Each string above is replaced, on the admin-facing help, by a sentence an administrator can act on, in every shipped locale bundle (regenerated, not hand-edited).
- Last Certified At (and any field whose own help says it is inert) is not shown on the Setup forms until something reads it.
- A pin that the strings above no longer reach the admin-facing help.
Size: M.
Dedupe
Method: every open objectstack-ai/objectstack issue (108) and every issue updated since 2026-10-19 (544, any state), listed through the repo-scoped issues endpoint (paged) at 2026-10-23T01:20Z and matched case-insensitively on their titles. Words: developer, admin copy, help text, inert. 4 hits: #25203, #24910, #24576 (help-text residues on other surfaces) and #24339 (an ADR note), all closed. Not on point. New.
Generated by Claude Code
Activity
objectstack-fleet commentedon Oct 23, 2026
Claim: PM loop round 1
Session:
session_01RsXNmkeex9WY5XsjNwtRYv(a card thread scheduled by the project's coordinator, which follows.claude/agents/os-dev.mdas its role file; the seat session issession_014Hse9cj2i4o5UAVrd21NKr)Account:
os-teslaBranch:
claude/project-thread-xlmv3p(the thread's designated branch: a card thread can push only that branch, a measured platform exception toclaude/issue-<n>-<slug>)Worktree:
objectstack-issue-25331Domain:
domain:engineSeat:
domain:engine#1(seat post #6367)File surface: packages/platform-objects (identity/apps objects + generated bundles), plugin-security/src/objects/, plugin-approvals/src/sys-approval-delegation.object.ts (the
via isGrantActivehelp only), service-messaging/src/objects/notification-preference.object.ts, objectql/src/lifecycle/lifecycle-settings.ts, their bundles and one pin (stop on breach; explain in the report)Container & model:
M,mode:thread,model: TIER_DEFAULT (dispatch-gates --tier: no path-derived mandate),effort: highClause-②: no
Metadata-protocol: none
Responsibility: the platform's own object declarations and console produce it | no existing path covers it | every administrator on Setup reaches it today
Thread-read: none
Serial constraints cleared: #25332 (this seat, in flight) regenerates the same
platform-objectsbundles from other source lines: parallel, the second to land re-runs the generator after mergingmain. #25280 (domain:services, queued) ownssys-approval-delegation'sorganization_idhelp; this card leaves that line alone. Seat 2's #25278 / #25295: no shared file in these regions (#25295 iscreate_user/ invite visibility).Clause-② reading: no (help text and form visibility only; no accept set moves). Dispatch order:
/mnt/project-files/engine-seat1/dispatch-25331.md(+common.md). Ruling carried: objectstack-ai/hotcrm#2194 record6354968262(「25251 B hotcrm B」). Claimed 2026-10-23T03:46Z.Generated by Claude Code
objectstack-fleet commentedon Oct 23, 2026
os-dev-report
{ "issue": 25331, "status": "done", "branch": "claude/project-thread-xlmv3p", "pr": "https://github.com/objectstack-ai/objectstack/pull/25377", "session": "session_01RsXNmkeex9WY5XsjNwtRYv", "premise_still_valid": true, "summary": "Every developer string on the card is rewritten as administrator help in the sources (plugin-security user_id / permission_set / access-review pair, plugin-approvals valid_from only, service-messaging digest and quiet_hours, objectql Data Lifecycle settings, platform-objects sys_user ai_access and locale plus every OAuth reference field), en bundles regenerated and zh-CN / ja-JP / es-ES translated by hand. last_certified_at and certified_by on both assignment objects are hidden: true (columns kept). Pinned by five new entries in the four existing admin-copy vocabulary tests plus a new objectql lifecycle-settings copy test. Head ee5da23123.", "tests": "head ee5da23123: pnpm turbo run test --only --continue on metadata-core 19/19 files, platform-objects 88/88, plugin-security 212/212, plugin-approvals 94/94, service-messaging 60/60, objectql 465/465 (os-verify-lock VERDICT command-exit 0). First run red in 2 platform-objects translation-decision tests reading sys_user.fields.ai_access.help as capability evidence; fixed by keeping 'ai_seat capability' (能力 / ケイパビリティ) in that help. typecheck 6/6 (VERDICT command-exit 0). check-i18n-bundles: 10/10 in sync. No ablation: copy + declared flag; each new matcher entry carries a positive control on the old string.", "gates": "dispatch-gates --commands: 71 families run, 70 exit 0; pnpm check:dual-build-cjs-loads exit 3 PREREQUISITE NOT MET (no full workspace build) = NOT MEASURED, CI runs it. check-engine-split-ratio and check-plugin-teardown-shape --self-test first exited 2/3 on a shallow clone, 0 after git fetch --unshallow. --ran with exit codes: 71 accounted, 70 run, 1 NOT-MEASURED. PR check-runs: in_progress at report time.", "dogfood_battery": "n/a — no ! in the PR title and Clause-② no without a (narrowing) arm", "line_budget": "37 files, +292 / -148 (440 changed lines, generated bundles included)", "files_changed": 37, "deviations": [ "packages/metadata-core/src/objects/sys-metadata.object.ts (package_version_id help, one line) is outside the claim's file surface: taken under os-dev rule 3's bounded in-place fix (same class, mechanical, in the population platform-objects' setup-copy-vocabulary test already walks, so the new foreign-key entry could not go green without it). Seat: amend the file surface.", "Also rewrote the sibling OAuth reference-field helps (Foreign key to sys_oauth_application.client_id / sys_session.id / sys_oauth_refresh_token.id / sys_oauth_resource.identifier) and sys_user.ai_access's code names, inside the declared platform-objects identity surface, so one form does not mix admin and developer help.", "Four source-hashes.generated.ts entries (plugin-approvals and service-messaging, ja-JP and es-ES) dropped by the generator because those leaves are now translated rather than byte copies." ], "mcp_calls": "3 — mcp__github__issue_read (get, get_comments x2); no write tool", "api_writes": "2 — fleet relay pr_create (POST pulls + POST issues/25377/assignees, one action, run 39901364669) and this os-dev-report comment via post-stamped", "open_questions": [], "out_of_scope_findings": [ "carrier: none · noted, not filed — 34 platform-objects en field-help leaves still name better-auth (e.g. Managed by better-auth) and a few name code identifiers or table.column paths (sys_business_unit_member.is_primary, sys_file.name); not on the card's list. Dedupe words: better-auth help, admin copy, developer vocabulary", "carrier: none · noted, not filed — [ADR-0086 D3] has 0 hits in any bundle; it lives in packages/spec .describe() text (security/capabilities.ts, permission.zod.ts packageId). Whether the Capabilities detail page renders that text is NOT MEASURED (no running console)." ] }Generated by Claude Code
objectstack-fleet commentedon Oct 23, 2026
ACCEPT → PR #25377 comment 6357944420 (ready + auto-merge set 2026-10-23T05:15Z).
Generated by Claude Code