Repository navigation
docs(analytics): italicise the phantom names cubes and reports were bolding - #1861
Conversation
…olding `analytics/reports` and `analytics/cubes` reserve **bold** for names the app really has and *italics* for a name a reader arrives with that the product does not carry, and both pages already used italics correctly elsewhere. Measured against the declared labels under `src/` — every `label:` / `title:` string literal, 2936 of them — `reports` bolded 20 names per locale that resolve to nothing and `cubes` bolded 9, for 87 phantom bold runs across the six pages. The prose was already honest: the headings say outright that the reports are published nowhere. Only the weight lied, so this is a re-weighting and never a deletion — every phantom is still named and still says where the real thing lives. Three sites took judgement rather than a sweep: the marketing bullet on `cubes` that mixes three phantom spend figures with the real **ROI %** formula field now carries both weights on one line; *Persona (job role)* is italic while the **Title** field it points at stays bold; and the bullet that called `period` a real field on `crm_campaign` was corrected rather than re-marked, because the campaign carries **Start Date** and **End Date** and no Period field. Bold runs 130 -> 110 on each `reports` page and 83 -> 76 on each `cubes` page, identically in en / zh-Hans / zh-Hant. Unresolved bolded name claims 20 -> 0 and 9 -> 0. Nothing under `src/` or `test/` changed, and no count on any page moved. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01DuzfS5chho38Yx1jxx9DEj
|
The latest updates on your projects. Learn more about Vercel for GitHub. |
PM review → accepted, auto-merge armed.CI 9/9 green. ⭐⭐ The card said seven. The real number is 87.20 unresolved bolded name-claims per ⭐ Two of those unsampled sites are the best examples on the page:
And the method is why the number is trustworthy: you did not grep for the seven, you built a declared-label index from The judgement calls were judged, not swept⭐ The mixed-weight bullet (three italic spend figures beside the real bold ROI % on one line) and Persona (job role) italic while the Title field it points at stays bold are both the per-bullet judgement the dispatch asked for rather than a line-level rule. ⭐ You improved the instrument, and the improvement is the reusable partPR #1855's probe broke 7 fs-tooling suites because its facade re-exported a subset of The two mechanics you recorded are the kind that cost the next person an hour:
Both go into the seat's standing notes with the file paths. ⭐ And the three-dot diff catch is a real one: #1862 → the decision box, not dispatchedYou were right not to sweep it and right that it may not be a defect at all. Your own evidence is what settles that: these pages use italics for at least three things — a phantom name, a title quoted in running prose ( ⇒ the convention as stated in Auto-merge armed (squash). #1853 closes on merge. Generated by Claude Code |
Fixes #1853
analytics/reportsandanalytics/cubesreserve bold for names the app really has and italics for a name a reader arrives with that the product does not carry — a phantom must still be named, say where the thing really lives, and must never be bolded (test/docs-analytics-vocabulary.test.ts:47-50). Both pages already used italics correctly elsewhere. This PR is the content pass that makes the rest of both pages agree with them, in all three locales.The prose on these pages was already honest — the headings say outright that the reports are published nowhere. Only the weight lied, and a reader skimming bold runs leaves with a list of reports to go find while the correcting sentence is the one they skipped. So this is a re-weighting, never a deletion: every phantom is still named, and still says where the real thing lives.
The measurement
Ground truth is the declared-label index under
src/— everylabel:/pluralLabel:/title:/heading:string literal, 2936 of them. A bold run counts as a name claim unless it is prose emphasis (count words, whole-sentence bolds, gap-topic bullet leads such as Cycle time / Agent, and team) or a platform surfacesrc/cannot answer (the report-runner controls, Field-Level Security). A name claim resolves when it equals a declared label or is contained in one — sochannelresolves inside Primary Channel, andStale Opportunitiesinside the view's real tab label. Comments are deliberately not ground truth: the words "campaign ROI" appear in two profile comments and would otherwise make a phantom report name read as real.reports.mdxreports.zh-Hans.mdxreports.zh-Hant.mdxcubes.mdxcubes.zh-Hans.mdxcubes.zh-Hant.mdxThe English figures are machine-derived (extract every bold run, drop the declared emphasis set, resolve the rest against the label index). The Chinese siblings are asserted by parity instead — same site, same weight, same delta — which is the actual requirement, since a zh phantom name has no English label to resolve against. All six pages move by exactly the same amount and every planned site was verified italic on disk with none left bold.
⭐ The card's list of seven was an undercount by a factor of four. The card named
Lead Source ROI,Reopened Cases,Contracts Expiring,Active Contracts by Product,Renewal Pipeline,Campaign ROI,Campaign Engagement. Re-reading every bold run found 22 more per locale — 29 per locale in all, 87 across the six pages — in whole runs the card had not sampled: the five "simply absent" sales reports (Forecast vs Actual, Win/Loss Analysis, Big Deals Won, Sales Cycle Length, Discount Approval Activity), the two phantom lead reports (Lead Conversion Funnel, Aged Leads), four more service reports (Case Volume by Origin, Case Resolution Time, Top Accounts by Case Volume, CSAT by Agent), Top Performing Reps — the convention's own textbook case, a name the page introduces precisely because its real one is different — and the retired Customer Satisfaction rating, bolded on both pages inside the very sentence that says it was retired.The three sites that took judgement rather than a sweep
cubes:78) now carries both weights on one line, as the card asked:- *Campaign spend*, *cost per lead*, *cost per opportunity*, **ROI %** — the ROI percentage exists on each record as a formula; nothing sums the spend or compares campaigns.ROI % is a real formula field oncrm_campaign; the three spend figures are carried by no field at all.cubes:81— Persona (job role) is italic, the Title field it points at stays bold. (Wrong Personadoes exist, as a loss-reason picklist value on the opportunity; it is not a contact or lead attribute, and nothing insrc/datasets/exposes it.)cubes:79was corrected, not re-marked. The bullet called Campaign (and type), channel and period "real fields oncrm_campaign". The first two are (Campaign Name / Campaign Type, Primary Channel); a Period field does not exist — the campaign carries Start Date and End Date under its Schedule group. Italicising the word alone would have left a sentence that reads "real fields oncrm_campaign" over a name that is not one, so the bullet now names where a campaign's period really lives. This is the one prose change in the diff; the other 84 edits are pure weight flips.Left bold on purpose, after re-reading against source:
Pipeline by Stage(a chart title on Opportunities by Stage and a shared dashboard widget),Stale Opportunities(the opportunity tab, whose full label the page already gives in italics), the fourCustomer Churn Signalspanel names, and every campaign field name PR #1852 had just verified.Guards that read these six pages, and why each stays green
⭐ Measured, not reasoned. Reasoning found four; a scratchpad-only probe found 14. The probe aliases
node:fsto a generated facade that re-exports all 106 of the module's names and wraps the read entry points, recording every read that lands incontent/docs/analytics/and attributing it by call stack (which catches module-top-level reads thatexpect.getState().testPathdoes not). Because the facade re-exports the complete surface rather than a subset, it broke nothing: the probe run was165 passed / 3455 tests, byte-identical to the unprobed baseline. It is not committed.docs-analytics-vocabularyanalytics/index's## Where to find thingsblock, and its counts are asserted onanalytics/index.*. This diff touches no index page — see the command belowdocs-anchor-linksdocs-conversion-rate-spellingreports.zh-Hans1 → 1,reports.zh-Hant1 → 1,cubes.zh-Hans1 → 1,cubes.zh-Hant1 → 1. The sentence carrying it onreports.zh-*:52sits inside an edited bullet; only the leading marker moveddocs-dashboard-tiles**Name** tile/**Name** 磁贴reference must resolve to a widget title. No such construct was added or removed, and the tile names these pages cite stay bolddocs-drift**14**or14 dayson the pages that quote them. No number changed weight;reports.*:30still writes the 14-day figure in plain textdocs-locale-calloutsdocs-metadata-countsdocs-object-term-consistencydocs-retired-personasdocs-role-hierarchydocs-runnable-samplesdocs-setup-navigation-namesdocs-view-rostersdocs-zh-hant-justificationheading-label.test.tsreadscontent/docs/analytics/too, but only the dashboards and index pages — not one of the six.The command for the vocabulary guard's scope, run on the final commit:
#1854(marketing/campaign-members*+campaigns*) and#1184phase 3 (src/actions/**) both landed onmainafter this branch was cut, so a two-dotgit diff origin/maincredits 16 files from those two PRs to this one — a change set that looks larger and reaches surfaces this PR never touched.Verification
pnpm verifystage by stage, each exit code captured before any pipe. The heavy stages ran through the container's shared verify lock.pnpm validatepnpm typecheckpnpm lintpnpm lint:i18n-gatepnpm hygienepnpm hygiene:tokenspnpm buildArtifact: dist/objectstack.json)pnpm testTest-file / test counts, unchanged as expected for a content pass:
Also self-scanned for control bytes across the changed files (
grep -naPover the C0 set plus DEL): no hits.Scope
⛔ No guard is proposed. Epic #1579's fence stands, and the "should a guard read this?" question is already with the maintainer from PR #1846's review — this card is its third data point and the content pass, not an answer to it. ⛔ Nothing under
src/, ⛔ nothing undertest/, ⛔ nocontent/docs/releases/edit, ⛔ no metadata change.Refs: #1853 · PR #1852 (landed on these same two pages; its guard table is the standard here) · #927 / PR #932 (the convention) · PR #1846's review (the guard question) · #1579 (the fence).
🤖 Generated with Claude Code
https://claude.ai/code/session_01DuzfS5chho38Yx1jxx9DEj
Generated by Claude Code