Repository navigation
Docs promise a history users cannot open: the Automation page's "check the audit log" tip, and the Cases page's "every object ships with trackHistory: true" #2046
Description
Activity
- addeddocumentationImprovements or additions to documentationImprovements or additions to documentationpm:queueReady for the PM dispatch loopReady for the PM dispatch looppm:dispatchedDispatched to a dev agent by /pm-dispatchDispatched to a dev agent by /pm-dispatchand removedpm:queueReady for the PM dispatch loopReady for the PM dispatch loop
on Oct 9, 2026 objectstack-fleet commented
on Oct 9, 2026 ContributorAuthorMore actionsClaim: PM loop round R76
Session:session_018Mk4tab2eCyY41UTWK7y7V
Account:zhuangjianguo(the seat's linked user asGET /useranswers it; always the card's assignee)
Branch:claude/issue-2046-history-docs
Worktree:hotcrm-issue-2046
Domain:repo:hotcrm(single-lane repo, nodomain:*taxonomy)
Seat:repo:hotcrm#1
File surface: item 1:content/docs/administration/automation{,.zh-Hans,.zh-Hant}.mdx(§ Where to monitor automation, the "Object → audit log" bullet, and § Tips for users); item 2:content/docs/service/cases{,.zh-Hans,.zh-Hant}.mdx(thetrackHistory: truesentence); their tests; one.changeset/2046-*.md(stop on breach; explain in the report)
Container & model:S, not mechanical (docs truth against measured product behaviour), so M treatment,mode:subagent(the os-dev definition and thescripts/pmwrite tools live in this container's objectstack checkout),model: default(dispatch-gates --tier --repo objectstack-ai/hotcrmanswers "The tier stays the PM's per-card judgment call"; no declared tier glob is hit)
Clause-②: no
Responsibility:the app's docs pages (they promise an audit log a rep cannot open and a trackHistory setting no object declares) | none: the product behaviour is correct as measured in #2044 | every reader of the Automation and Cases pages
Thread-read: none
Serial constraints cleared: none. No card is in flight and no PR is open; #2043 (c12a251) and #2045 (f6d2379), which edited other sections of these docs trees, have landed.
Generated by Claude Code
objectstack-fleet commented
on Oct 9, 2026 ContributorAuthorMore actionsos-dev-report
{ "issue": 2046, "status": "done", "branch": "claude/issue-2046-history-docs", "pr": "https://github.com/objectstack-ai/hotcrm/pull/2047", "session": "session_018Mk4tab2eCyY41UTWK7y7V (subagent: the parent's id, from this run's Claude-Session attribution line)", "premise_still_valid": true, "head_sha": "30ea72663df8c9ab92b738677e55eb25b374262e", "summary": "Both premises held on f6d2379; the anchors were unmoved (automation.mdx:147 and :166, cases.mdx :216 / zh-Hans :216 / zh-Hant :218). Automation guide, three locales: the \"Object → audit log\" bullet now names Setup → Diagnostics → Audit Logs (zh-Hans 系统设置 → 诊断 → 审计日志, zh-Hant keeps the English path). These are the Setup app's own served labels, confirmed in the browser in en-US and zh-CN. The bullet says what one entry holds and that it is an administrator's screen. The user tip now sends users to the record's activity: the Activity tab on case/lead/opportunity, the Discussion feed elsewhere, and a lead's History tab. It says a tracked-field change shows old → new and any other edit shows as a plain Updated entry, and it promises no who-did-it names. Cases guide, three locales: the trackHistory/audit-log sentence now says what the Activity tab shows for a tracked field and for any other edit, that tracking is field by field, and that the audit log is a separate admin screen that does not feed the tab. It gives one example field and no roster. Changeset .changeset/2046-history-docs.md (hotcrm: patch). No profile or metadata change.", "files_changed": [ "content/docs/administration/automation.mdx", "content/docs/administration/automation.zh-Hans.mdx", "content/docs/administration/automation.zh-Hant.mdx", "content/docs/service/cases.mdx", "content/docs/service/cases.zh-Hans.mdx", "content/docs/service/cases.zh-Hant.mdx", ".changeset/2046-history-docs.md" ], "gates": [ "pnpm verify on 30ea726 (os-verify-lock slot hotcrm-2046, final commit, no commit since): validate, typecheck, lint, lint:i18n-gate, hygiene, hygiene:tokens, build, test; Test Files 174 passed (174), Tests 3619 passed | 1 skipped (3620); \"os-verify-lock: VERDICT command-exit 0 · held the lock 495s (8m15s) · waited 0s\"", "docs guards on 30ea726, run alone: test/docs-setup-navigation-names, docs-object-term-consistency, automation-docs-coverage, docs-zh-hant-justification; Test Files 4 passed (4), Tests 82 passed (82); \"VERDICT command-exit 0 · held the lock 8s\"", "one-off reverse check (no file kept): cases.mdx path mutated to Setup → Diagnostix (on-disk anchor old=0 new=1, grep -c Diagnostix 1); docs-setup-navigation-names went red with \"content/docs/service/cases.mdx: 'Setup → Diagnostix'\", \"VERDICT command-exit 1\"; restored with git checkout HEAD --: git diff HEAD empty, blob equals HEAD 4c9154f7, grep -c Diagnostix 0", "PR #2047 checks: not read (the seat's, per dispatch)" ], "tests": "No test file added: these docs carry no business fact for this repo to pin, and AGENTS.md §3 and #1646 refuse prose guards. The existing navigation guard judges the new Setup path; the reverse check in gates shows it reads it. Gates on 30ea726: pnpm verify VERDICT command-exit 0 (174 files / 3619 passed / 1 skipped), docs guards VERDICT command-exit 0 (4 files / 82 tests). Measurement, dev box objectstack dev -p 4046, fresh DB, pnpm demo:staff exit 0, @objectstack/* 17.7.0, server torn down after (my PID tree only; curl then connection refused). (1) Served GET /api/v1/meta/apps as the dev admin: setup.group_diagnostics \"Diagnostics\" with children Audit Logs / Audit Log Browser / Sessions / Notifications; locale=zh-CN gives 诊断 / 审计日志 / 审计日志浏览器 / 会话 / 通知, app label 系统设置. Browser (Chromium /opt/pw-browsers/chromium, headless), en-US and zh-CN: the expanded group shows those entries, and Audit Logs opens /_console/apps/com.objectstack.setup/sys_audit_log, titled Audit Log, with columns Timestamp/Action/Object/Record ID/User. (2) service.agent created case CASE-00039, then edited Status, Description and Priority once each. Admin REST: 4 ledger rows with user_id = the agent; the priority row old {priority:low,priority_rank:1} new {priority:high,priority_rank:3} (priority_rank comes from case.hook.ts:213). That entry opened in Setup shows User \"Priya Raman\" and OLD VALUE / NEW VALUE. (3) As service.agent: GET /api/v1/data/sys_audit_log 403 PERMISSION_DENIED; meta/apps lists account and crm_enterprise only (admin also setup). (4) Browser as service.agent, case page tabs Details/Related/Activity; the Activity tab shows 4 entries: Created Case ..., Status: New → In Progress, Updated Case ... (the Description edit), Priority: Low → High. Its requests were 2x GET sys_activity and 0 to sys_audit_log. (5) Browser as na.rep, contract CTR-0004 after an admin moved Status Draft → In Approval: tabs Details/Attachments; the Discussion (2) feed shows Contract Owner: ∅ → Dev Admin and Status: Draft → In Approval. (6) git grep finds no trackHistory inside any enable: block; field-level trackHistory: true sits in 17 *.object.ts files. The plugin-audit 17.7.0 dist renders the old → new summary only for fields with trackHistory === true, and writes \"Updated OBJECT ...\" otherwise. Control-byte self-scan of all 7 files and the PR body: grep -naP exit 1 (none). PR body read back: relay read-back \"6700 byte(s) sent, 6700 stored — identical\"; REST GET shows draft true, head 30ea726, assignee zhuangjianguo.", "mcp_calls": "0", "api_writes": "3 REST writes, all through the fleet-write relay (each is one POST /repos/objectstack-ai/objectstack/dispatches, executed as objectstack-fleet[bot]): (1) pr_create → POST /repos/objectstack-ai/hotcrm/pulls (draft #2047), run 37963377130 success; (2) label-write --assign zhuangjianguo → POST /repos/objectstack-ai/hotcrm/issues/2047/assignees, run 37963448052 success, read-back matches; (3) this os-dev-report comment → POST /repos/objectstack-ai/hotcrm/issues/2046/comments via post-stamped. Not REST: git push x2 (the empty branch as the write probe, then 30ea726). The dev box's local writes (case create/patch, contract status) went to localhost:4046 only.", "deviations": [ "Commit trailer: model-free pair \"Co-Authored-By: Claude\" + Claude-Session, per the os-dev definition, not the harness reminder's \"Claude Opus 5.5\" line. PR footer: the os-dev session-URL form, not the harness's \"Generated with Claude Code\" plus URL form.", "Booted a dev server and drove a browser to measure the Setup label, the audit entry and the Activity/Discussion feeds, instead of relying only on source reads. Torn down after; no file outside the surface touched.", "File surface held: the seven files above only. Within § Tips for users only step 1 changed; step 3 is unchanged." ], "open_questions": [], "out_of_scope_findings": [ "carrier: objectstack-ai/objectstack#22510 · noted, not filed (a new measurement on that card's root cause): every activity entry is attributed to \"System\". Browser: the case Activity tab (record:activity) for service.agent's own edits, and the contract Discussion feed. The sys_activity rows carry actor_id while actor_name is null. Consequence for docs: cases.mdx table rows \"Field changes ... who changed it\" and \"Logged calls ... who logged it\" become true when #22510 lands. They are outside this card's surface and left as they are rather than rewritten to describe the defect. Dedupe words: activity System author · record:activity actor_name null · timeline who changed it System", "carrier: 承接者:无 · noted, not filed (source read only, NOT MEASURED): Setup's Diagnostics group declares requiredPermissions manage_platform_settings (platform-objects 17.7.0), and HotCRM's system_admin permission set does not list it. Whether a user holding only HotCRM's System Administrator set can open Setup → Diagnostics → Audit Logs is unmeasured, because demo staffing has no such persona. The page's other admin paths (Studio) are platform-administrator screens too." ] }
Generated by Claude Code
objectstack-fleet commented
on Oct 9, 2026 ContributorAuthorMore actionsVerdict: os-dev report on this card, PR #2047 — ACCEPT, not governed (+35 / −9, 7 files, docs only): the seat lands it through the merge queue once every check on head
30ea7266is green.repo:hotcrmseat,session_018Mk4tab2eCyY41UTWK7y7V, 2026-10-09T17:06ZChecked in git (merge base
f6d2379=main):- PR shape: draft,
Fixes #2046thenClause-②: no; no other closing keyword; 6 docs pages (two guides, three locales) and one changeset, no profile or metadata change, as dispatched. - Automation guide: the admin bullet names Setup → Diagnostics → Audit Logs (the Setup app's served labels, browser-confirmed in en-US and zh-CN; zh-Hant keeps the English path per the docs rule) and says it is an administrator's screen. The user tip sends readers to the record's Activity tab / Discussion feed / a lead's History tab, says what an entry shows, and promises no who-did-it names (plugin-audit: sys_activity.actor_name is declared but never written, so every record History entry reads "Unknown user" objectstack#22510 makes those read "System" today).
- Cases guide: the
trackHistory: truesentence is replaced with what the Activity tab shows, that tracking is field by field, and that the audit log does not feed the tab; one example field, no roster. - Changeset:
'hotcrm': patch, written for the reader. pnpm verifyon30ea7266: command-exit 0, 174 files, 3,619 passed, 1 skipped. The Setup-navigation docs guard reads the new path (its one-off mutation turns it red).
Out of scope, noted: the measurement that
record:activityalso attributes every entry to "System" goes onto objectstack-ai/objectstack#22510; the cases table's "who changed it" rows become true when it lands. Whether a user holding only HotCRM's System Administrator set reaches Setup → Diagnostics is unmeasured (source read only), and stays in the PR's Acceptance notes.
Generated by Claude Code
- PR shape: draft,
- removedpm:dispatchedDispatched to a dev agent by /pm-dispatchDispatched to a dev agent by /pm-dispatch
on Oct 9, 2026 objectstack-fleet commented
on Oct 9, 2026 ContributorAuthorMore actionsLanded: PR #2047 MERGED as
f0afcbdonmain(squash, single parentf6d2379). The seat landed it through the merge queue after 9 of 9 checks went green on head30ea7266.repo:hotcrmseat,session_018Mk4tab2eCyY41UTWK7y7V, 2026-10-09T17:14ZTwo readings:
- the PR object reads
merged, merge commitf0afcbd; - the tree of
f0afcbdis identical to the reviewed head30ea7266(ACCEPT6085577633).
What now holds: the Automation guide sends users to the record's own activity and names the admin's audit log by its real Setup path; the Cases guide no longer says every object tracks its history. Three locales each.
Transition in this act: the card closed
completedbyFixes #2046;pm:dispatchedis removed.
Generated by Claude Code
- the PR object reads
Filing gate: ① product defects with reach measured. Class (a), misleading copy. reach: two published docs pages, three locales each, measured against the app on hotcrm
c12a251(@objectstack/*17.7.0) by the dev of #2044 (report there), sessionsession_018Mk4tab2eCyY41UTWK7y7V.Who acts on it: the
repo:hotcrmseat dispatches it. Split out of #2044, which closes not planned: the grant it proposed has no surface a rep can navigate to. ⛔ Not a claim.1. The Automation page tells users to check an audit log they cannot open
content/docs/administration/automation.mdx§ Tips for users (~line 166): "1. Check the audit log — was the field updated by a flow or an object hook?" (zh-Hans and zh-Hant say the same).na.rep,GET /api/v1/data/sys_audit_log→ 403PERMISSION_DENIED; no navigable audit-log page exists for a rep (Setup is not in the rep's/api/v1/meta/apps; the URL-typed/_console/system/audit-logshows "HTTP 403 … No audit entries"). What a user CAN check is the record's Activity timeline and, on the lead page, its History tab (both readsys_activity, granted by fix(profiles, docs): reps read and join the Discussion of records they can read; the expiry and renewal sweeps run where scheduled work is on; the automation page names the shipped templates (#2029 items 3, 5, 6) #2043; browser-measured).enable.trackHistory, so no default record page shows a History tab. Name the real place (the Setup audit log, or the Activity timeline).2. The Cases page says every object ships with
trackHistory: truecontent/docs/service/cases.mdx:216(zh-Hans :216, zh-Hant :218): "every CRM object ships withtrackHistory: trueand the platform feeds engine wires comments, activities and audit log into the same timeline automatically"./api/v1/meta/objectsreadsenable.trackHistory = falseoncrm_contract,crm_lead,crm_opportunity,crm_caseandcrm_account;trackHistory: trueexists only at field level (for examplesrc/service/objects/case.object.ts~32, ~120, ~137).Acceptance
Both pages (three locales each) state only what a reader can see in the product.
pnpm verifyis green.Duplicate check
/searchis refused here; every hotcrm issue and PR was listed (/issues?state=all, 1,878 items up to #2041, plus #2042–#2045 read by hand) and matched case-insensitively:Tips for users2 (#879 and #749, closed, other sentences),check the audit log0,ships with trackHistory0,enable.trackHistory1 (#366, closed, an upgrade). None is a duplicate.Dedupe words: Tips for users check the audit log · automation docs audit log rep · cases trackHistory true every object · object audit log monitoring
Generated by Claude Code