Skip to content

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

@objectstack-fleet

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), session session_018Mk4tab2eCyY41UTWK7y7V.

Who acts on it: the repo:hotcrm seat 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

  • Says: 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).
  • Measured: as na.rep, GET /api/v1/data/sys_audit_log → 403 PERMISSION_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-log shows "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 read sys_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).
  • The same section's admin bullet "Object → audit log — what changed on the record" (~line 147) names no place an admin can open either: no hotcrm object declares 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: true

  • Says: content/docs/service/cases.mdx:216 (zh-Hans :216, zh-Hant :218): "every CRM object ships with trackHistory: true and the platform feeds engine wires comments, activities and audit log into the same timeline automatically".
  • Measured: served /api/v1/meta/objects reads enable.trackHistory = false on crm_contract, crm_lead, crm_opportunity, crm_case and crm_account; trackHistory: true exists only at field level (for example src/service/objects/case.object.ts ~32, ~120, ~137).
  • Fix site: the page states what is true (tracked fields feed the Activity timeline), in business words; ⛔ no hand-copied roster of tracked fields.

Acceptance

Both pages (three locales each) state only what a reader can see in the product. pnpm verify is green.

Duplicate check

/search is 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 users 2 (#879 and #749, closed, other sentences), check the audit log 0, ships with trackHistory 0, enable.trackHistory 1 (#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

Activity

  1. added
    documentationImprovements or additions to documentation
    pm:queueReady for the PM dispatch loop
    pm:dispatchedDispatched to a dev agent by /pm-dispatch
    and removed
    pm:queueReady for the PM dispatch loop
    on Oct 9, 2026
  2. objectstack-fleet commented on Oct 9, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round R76
    Session: session_018Mk4tab2eCyY41UTWK7y7V
    Account: zhuangjianguo (the seat's linked user as GET /user answers it; always the card's assignee)
    Branch: claude/issue-2046-history-docs
    Worktree: hotcrm-issue-2046
    Domain: repo:hotcrm (single-lane repo, no domain:* 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 (the trackHistory: true sentence); 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 the scripts/pm write tools live in this container's objectstack checkout), model: default (dispatch-gates --tier --repo objectstack-ai/hotcrm answers "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

  3. objectstack-fleet commented on Oct 9, 2026

    @objectstack-fleet
    ContributorAuthor

    os-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

  4. objectstack-fleet commented on Oct 9, 2026

    @objectstack-fleet
    ContributorAuthor

    Verdict: 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 30ea7266 is green. repo:hotcrm seat, session_018Mk4tab2eCyY41UTWK7y7V, 2026-10-09T17:06Z

    Checked in git (merge base f6d2379 = main):

    • PR shape: draft, Fixes #2046 then Clause-②: 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: true sentence 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 verify on 30ea7266: 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:activity also 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

  5. objectstack-fleet commented on Oct 9, 2026

    @objectstack-fleet
    ContributorAuthor

    Landed: PR #2047 MERGED as f0afcbd on main (squash, single parent f6d2379). The seat landed it through the merge queue after 9 of 9 checks went green on head 30ea7266. repo:hotcrm seat, session_018Mk4tab2eCyY41UTWK7y7V, 2026-10-09T17:14Z

    Two readings:

    • the PR object reads merged, merge commit f0afcbd;
    • the tree of f0afcbd is identical to the reviewed head 30ea7266 (ACCEPT 6085577633).

    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 completed by Fixes #2046; pm:dispatched is removed.


    Generated by Claude Code

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions