Skip to content

Make dashboards say what they count, and set one money and number format: SLA captions, duplicate tiles, Top Products, funnel by owner, quota attainment, titles, currency, quantities, discounts, dates, stage labels #2370

Closed

Description

@objectstack-fleet

Ruled: Irene · 2026-10-29T02:08Z · the UX plan of the #2320 browser pass: six HotCRM cards plus objectstack suggestion cards, queued (4+5) → 6 → 10 → 9 → 7 → (8+3). This is card 6 of 6, themes 8 (dashboards and reports) and 3 (formats).

Source

The #2320 browser pass on platform 18.2.0 (six tracks, 115 UI suggestions). Filing gate ③ a task the maintainer directed. Each row cites its track report on #2320 and the suggestion id there; the steps and screenshots are in that track's REPORT.md (project files qa-2320/<track>/). The platform parts of the same themes are objectstack#27355 (console) and objectstack#27356 (Setup and Studio).

Measure each row first on origin/main. A row that is already fixed, or that turns out to need the platform, is not forced: report it with the evidence and move on.

What the numbers count (theme 8)

# Observed on 18.2.0 Report Target
1 "SLA Compliance 100%" sits beside "SLA Violations 4": one counts closed cases, the other open ones, and neither title says so. Service S13, Marketing S15 Titles that state the base ("SLA met, closed cases" / "Open cases past SLA").
2 The same Revenue Trend tile is on three dashboards; a KPI shows its measure name, not a description. Marketing S11 One home for the tile; KPI captions in words.
3 Top Products says revenue but sums list price. Revenue S18 Sum the sold amount, or say list price.
4 The "funnel by owner" report's chart is not split by owner; its table repeats the owner on each row with no subtotals. Sales S13, Marketing S16 A chart split by owner, and grouped rows with subtotals, as far as 18.2.0 reports allow.
5 Quota attainment is always empty in the demo, because only the scheduled snapshot writes it. Marketing S13 The demo seed carries a snapshot, or the tile says when it fills.
6 Navigation labels and report titles differ for the same report. Marketing S16 One name.

One format convention (theme 3)

# Observed on 18.2.0 Report Target
7 Executive Overview shows "1,290,000" and Sales Home "1,220,000.00"; neither shows a currency. Sales S9, Marketing S17 One convention, written in the developer docs: amounts carry the currency; KPI tiles drop the cents. Do not fight the platform's multi-currency work (objectstack epic #8345).
8 Line items: quantity "1.00", totals without decimals beside unit prices with two; subtotal and total show the same number two ways. Sales S23, Revenue S6 Whole-number quantities; one money format per record.
9 A quote's discount is drawn as a progress bar; dates show no year; a price book's validity reads "In 5 days". Revenue S1 S12 Discount as a percentage; dates with the year; validity as a date.
10 Executive Overview's Pipeline by Stage axis shows NeedsAnalysis; Sales Performance shows "Needs Analysis". Setup S11 The option label. Measure whether the dataset or the renderer is at fault; if the renderer, report it.

Not here: chart data-label format, cut-off table columns and empty-chart states (objectstack#27355 rows 2–4); empty date buckets (objectstack#26893).

Done when

  • Each row is fixed, or reported as already fixed or platform-only, with the measurement.
  • A behaviour change (hook, flow, action visibility, refusal) has a test that goes red with it reverted. A metadata-only change (layout, order, label) is checked by the existing metadata and docs guards.
  • The in-app manual pages that describe a changed surface say what it does now, in en and zh.
  • pnpm verify is green, and the PR includes a changeset.

Grade: priority:p3. Contradictory numbers make managers distrust the dashboards. Size: M. The implementer may split the card into two PRs along the table's sections.

Filed by the repo:hotcrm lane seat (session session_01J8VVAnPkgK6CWrJa6t7Fk5) from Irene's ruling on the #2320 UX summary. Dedupe: read the 20 open hotcrm issues. None covers these rows; overlaps are named in the rows.

Activity

  1. objectstack-fleet commented on Oct 29, 2026

    @objectstack-fleet
    ContributorAuthor

    Dispatch order · #2370 · repo:hotcrm seat 1 · huangyiirene · session session_01J8VVAnPkgK6CWrJa6t7Fk5 · 2026-10-29T05:00Z

    This order takes the slot freed by #2368 (PR #2378). It is UX card 6, the last in Irene's queue order: #2371 → #2366 → #2367 → #2368 → #2369 → #2370. The card body is the spec. #2369 holds the other slot.

    Container & model: M · mode:thread · model TIER_DEFAULT · effort high (the thread runs at the project default).
    Role file: objectstack-ai/objectstack .claude/agents/os-dev.md. Read it in full. hotcrm AGENTS.md binds. Re-measure every row on origin/main (66c63cb or later).
    Writes:

    • The PR goes only through the relay op pr_create: draft, base main, assignees: [huangyiirene].
    • Comments go only through scripts/pm/post-stamped.mjs.
    • ⛔ No GitHub MCP write. ⛔ No issue filing: platform findings go in the report, and the seat files them.
    • The write budget is tight, so make two writes: the PR and the report. If you split the card into two PRs along its sections (dashboards, formats), that is three writes.

    Report: the os-dev-report JSON, posted as a comment on this card and sent as the final message to the seat thread. List each row as one of: fixed, already fixed, or platform-only (with the evidence). ⛔ Start editing only after the newest Claim: on this card names your branch. Push work in progress at each milestone, so a stop loses nothing.

    Scope notes

    • Dashboards (rows 1–6): change titles, captions, measures and filters in the dashboard, report and dataset metadata. Before and after screenshots, as the persona each dashboard serves. Read project memories hotcrm-browser-pass-howto and hotcrm-console-18-2-facts first.
    • Row 3 (Top Products): if the dataset can sum the sold amount (line items), do that. Otherwise rename the widget to say list price. State which, with the measurement.
    • Row 5 (quota attainment): if you add a seeded snapshot, keep test/seed-consistency.test.ts green. Do not change the scheduled snapshot flow.
    • Formats (rows 7–10): write the money and number convention once, in the developer docs (docs/), then apply it.
      • Do not fight the platform's multi-currency work (objectstack epic #8345): no hard-coded currency symbol where a field's currency can carry it.
      • Chart data-label formatting, cut-off table columns, empty-chart states and empty date buckets are platform cards (objectstack#27355 rows 2–4, #26893). Do not work around them.
    • Translations: a changed widget title or caption carries its zh-CN, ja-JP and es-ES entries where it already has them. Do not move translation files (Module split: each module package registers its own translations (ledger move rows R6, R7, R14, M3, M4, S3, S4) #2352 is blocked).

    PM mechanism assumptions

    1. Dashboard titles and widget keys are pinned by tests and docs (docs-*, the in-app Analytics pages). Update the pins and the manual pages with the change.

    Serial constraints: #2369 edits form and record-page metadata, not dashboards. If a format change touches a field definition that #2369 also edits (quote line items, product price), merge origin/main before you finish.


    Generated by Claude Code

  2. added
    pm:dispatchedDispatched to a dev agent by /pm-dispatch
    and removed
    pm:queueReady for the PM dispatch loop
    on Oct 29, 2026
  3. objectstack-fleet commented on Oct 29, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 1
    Session: session_01J8VVAnPkgK6CWrJa6t7Fk5
    Account: huangyiirene
    Branch: claude/project-thread-es8o0t
    Worktree: hotcrm-issue-2370 (card thread; branch is platform-designated, the measured platform exception to claude/issue-N-slug; implementing session session_01J8VVAoAy1McNK4cq14Q2vC)
    Domain: repo:hotcrm (single-lane repo, no domain:*)
    Seat: repo:hotcrm#1
    File surface: dashboards, reports and datasets under src/**/dashboards|reports|datasets/, field display formats on the rows' objects (amounts, quantities, discount, dates), the demo seed for a quota snapshot, translation entries for changed titles (no file moves), the format convention in docs/, test/ pins, the in-app Analytics manual pages (en + zh), one changeset; ⛔ the scheduled snapshot flow (stop on breach; explain in the report)
    Container & model: M, mode:thread, model: TIER_DEFAULT (sister repo, hand-derived), effort: the order asked high; the thread runs at the project default, which only the maintainer sets
    Clause-②: no
    Metadata-protocol: none
    Responsibility: #2370 UX card 6: dashboard rows 1–6 and format rows 7–10, measured first; fixed, already fixed or platform-only per row
    Thread-read: 6488391756
    Premise: holds — re-read at claim on hotcrm origin/main 66c63cb (order comment 6488391756)
    Serial constraints cleared: #2369 edits form and record-page metadata; merge origin/main before finishing if a format change touches a field it also edits

  4. added 2 commits that reference this issue on Oct 29, 2026
  5. objectstack-fleet commented on Oct 29, 2026

    @objectstack-fleet
    ContributorAuthor

    repo:hotcrm#1 · huangyiirene · session_01J8VVAoAy1McNK4cq14Q2vC
    os-dev-report

    {
      "issue": 2370,
      "status": "done",
      "branch": "claude/project-thread-es8o0t",
      "pr": "https://github.com/objectstack-ai/hotcrm/pull/2379",
      "session": "session_01J8VVAoAy1McNK4cq14Q2vC",
      "premise_still_valid": true,
      "summary": "Rows: 1 fixed (Open Cases Past SLA counts open cases only; SLA Met (Closed Cases); report SLA on Closed Cases). 2 trend fixed (Revenue Trend only on Executive Overview), KPI caption platform-only. 3 fixed by rename to List Price by Category (sum over formula total_price refused DATASET_INVALID). 4 fixed within 18.2.0 (matrix owner x stage with per-owner Total, bar by owner). 5 explained in the description, seeding forbidden by #702. 6 fixed (nav label = report label in en/zh-CN/ja-JP/es-ES). 7 fixed (Sales Home format 0,0; currency from tenant localization). 8 quantity fixed (scale 0, fractional refused), formula currency face platform-only. 9 dates fixed (format short), percent bar platform-only. 10 already fixed (axis draws 'Needs Analysis' on two lines; NeedsAnalysis was two SVG tspans read as innerText). Docs en/zh-Hans/zh-Hant and docs/developers/number-formats.md updated; also corrected the stale 'No tile shows a trend arrow' section (compareTo since #2296).",
      "tests": "pnpm verify on 31bc156: Test Files 252 passed (252), Tests 4854 passed | 1 skipped (4855). New: app-navigation-shape 'each entry is labelled with its report's own name, in every locale' (24/24); ablation zh-CN nav label -> red 'zh-CN nav_report_pipeline_coverage: \"管道覆盖率\" vs report \"季度管道覆盖率\"'. line-item-conventions whole-units test x2 (23/23); ablation scale 2 -> both red 'promise resolved ... instead of rejecting'. ffcec3d (docs + comment): docs-dashboard-tiles 11/11.",
      "gates": "local: pnpm verify exit 0 (validate, typecheck, lint, hygiene, hygiene:tokens, build, test); pnpm hygiene && pnpm hygiene:tokens exit 0 after ffcec3d. PR check-runs: pending at report time.",
      "dogfood_battery": "n/a — no `!` in the PR title and no (narrowing) arm",
      "mcp_calls": "4 — mcp__github__issue_read (reads only)",
      "api_writes": "2 — relay pr_create (#2379, assignee huangyiirene, read back identical); this comment via post-stamped.mjs",
      "open_questions": [],
      "out_of_scope_findings": [
        "class: c · reach: platform console — metric tile prints the measure label (e.g. 'Total Amount') under the value, not the widget description · measured 18.2.0 · dedupe: metric tile caption description",
        "class: c · reach: platform console — Field.formula returnType 'currency' renders a bare grouped number ('24,000' beside '$6,000.00') in list, related list and record page · measured 18.2.0 · dedupe: formula currency face",
        "class: c · reach: platform console — Field.percent draws a progress bar in lists and record pages; no field or page key turns it off · measured 18.2.0 · dedupe: percent progress bar",
        "class: c · reach: platform analytics — report charts cannot split a series by a second dimension, and summary reports show no group subtotals · measured 18.2.0 · dedupe: report chart series by dimension",
        "class: c · reach: platform analytics — dataset sum over a formula field refused DATASET_INVALID, so sold line-item revenue cannot be summed · measured 18.2.0 · dedupe: dataset measure over formula",
        "carrier: person (seat) · noted, not filed"
      ]
    }

    Generated by Claude Code

  6. objectstack-fleet commented on Oct 29, 2026

    @objectstack-fleet
    ContributorAuthor

    Landed · repo:hotcrm seat 1 · session session_01J8VVAnPkgK6CWrJa6t7Fk5 · 2026-10-29T06:21Z

    Reading Probe Result
    PR #2379 GET /pulls/2379 Merged 2026-10-29T05:51Z as c362ccd, from head ffcec3d, which is the head the seat ACCEPTed.
    main CI on c362ccd GET /commits/c362ccd/check-runs All 6 runs success.

    State:

    • Fixed: the SLA tile, gauge and report each say whether they count open or closed cases. The revenue trend lives only on Executive Overview. "Top Products" now says it sums catalog list prices. The owner funnel is an owner × stage matrix with a per-owner total. Sidebar report names match their report pages. Money tiles share one face, line quantities are whole numbers, line totals are declared as money, and quote and price-book dates keep the year. The convention is docs/developers/number-formats.md.
    • Behaviour change: a fractional line quantity (2.5) is now refused.
    • Platform gaps: the KPI tile caption, the formula currency face, the percent bar switch, the report series split and subtotals, and dataset sum over a formula field. The seat files them upstream.
    • Card: closed with the merge (Fixes #2370). The seat removes pm:dispatched in this stroke.

    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

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions