You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
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
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.
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.
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.
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.
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.
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/main66c63cb (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
{
"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"
]
}
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.
Activity
objectstack-fleet commentedon Oct 29, 2026
Dispatch order · #2370 ·
repo:hotcrmseat 1 ·huangyiirene· sessionsession_01J8VVAnPkgK6CWrJa6t7Fk5· 2026-10-29T05:00ZThis 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· modelTIER_DEFAULT· efforthigh(the thread runs at the project default).Role file:
objectstack-ai/objectstack.claude/agents/os-dev.md. Read it in full. hotcrmAGENTS.mdbinds. Re-measure every row onorigin/main(66c63cbor later).Writes:
pr_create: draft, basemain,assignees: [huangyiirene].scripts/pm/post-stamped.mjs.Report: the
os-dev-reportJSON, 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 newestClaim:on this card names your branch. Push work in progress at each milestone, so a stop loses nothing.Scope notes
hotcrm-browser-pass-howtoandhotcrm-console-18-2-factsfirst.test/seed-consistency.test.tsgreen. Do not change the scheduled snapshot flow.docs/), then apply it.PM mechanism assumptions
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/mainbefore you finish.Generated by Claude Code
objectstack-fleet commentedon Oct 29, 2026
Claim: PM loop round 1
Session:
session_01J8VVAnPkgK6CWrJa6t7Fk5Account:
huangyiireneBranch:
claude/project-thread-es8o0tWorktree:
hotcrm-issue-2370(card thread; branch is platform-designated, the measured platform exception toclaude/issue-N-slug; implementing sessionsession_01J8VVAoAy1McNK4cq14Q2vC)Domain:
repo:hotcrm(single-lane repo, nodomain:*)Seat:
repo:hotcrm#1File 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 indocs/,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 setsClause-②: 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/main66c63cb(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
docs(#2370): dashboards and reports pages match the renamed tiles and…
docs(#2370): dashboards page states which KPI tiles carry a comparison
objectstack-fleet commentedon Oct 29, 2026
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
objectstack-fleet commentedon Oct 29, 2026
Landed ·
repo:hotcrmseat 1 · sessionsession_01J8VVAnPkgK6CWrJa6t7Fk5· 2026-10-29T06:21ZGET /pulls/2379c362ccd, from headffcec3d, which is the head the seat ACCEPTed.mainCI onc362ccdGET /commits/c362ccd/check-runssuccess.State:
docs/developers/number-formats.md.sumover a formula field. The seat files them upstream.Fixes #2370). The seat removespm:dispatchedin this stroke.Generated by Claude Code