Skip to content

docs: write five claims to what the product does — docs-truth sweep (#1063) - #1067

Merged
huangyiirene merged 1 commit into
mainfrom
claude/issue-1063-docs-truth-sweep
Aug 11, 2026
Merged

docs: write five claims to what the product does — docs-truth sweep (#1063)#1067
huangyiirene merged 1 commit into
mainfrom
claude/issue-1063-docs-truth-sweep

Conversation

@huangyiirene

Copy link
Copy Markdown
Collaborator

Fixes #1063
Fixes #998
Fixes #1012
Fixes #732
Fixes #961
Fixes #709

Description

Docs-truth sweep: five separately filed findings, all ruled the same way on 2026-08-11 — the documentation claims something the product does not do, so the documentation moves — packaged into one PR per the sweep card #1063. No capability expansion anywhere: every ruling declined the "make the product match the docs" option.

Review is by checklist line, not diff order. The git diff --stat file list maps 1:1 onto the checklist below (33 files: 22 + 1 guard for #998, 3 for #1012, 3 for #961, 3 for #709, 1 changeset; #732 needed no file).

Per-item checklist

# 落点 before after
#998 22 doc files, 25 occurrences (analytics/index ×3, getting-started/quick-tour ×3, guides/search-and-navigation, marketing/index ×3, revenue/approvals ×3, revenue/index ×3, sales/index ×3, service/index ×3) the app is called Enterprise CRM — a spelling src/ has never carried HotCRM, the string CrmApp.label / the locale bundles / dist/objectstack.json / the marketplace manifest all ship, and the one the app launcher shows. Re-counted on origin/main: 25 occurrences across 22 files, exactly as filed
#998 guard test/docs-quick-tour-navigation.test.ts the app's own name was unguarded — the launcher list sat outside the guarded block, and the occurrence inside it was not bold, so the "bold must be a real name" rule passed over it CrmApp.label joins the assertion set: the block's start marker and the app-launcher bullet on all three locale pages are derived from it, plus the label joins ALLOWED_BOLD. Renaming the app in src/ now goes red until the pages follow
#1012 README.md:62 (banner) and README.md:130 (repository-layout block) 13 actions — and server actions + AI tools (13) one section down 26, the registered count, re-measured on this tree after pnpm build (26 Actions; premise confirmed, not moved). ⚠️ The card named one README location; the layout block states the same figure a second time and was wrong on every calibre (that directory holds 6 files), so both are fixed — flagged here for review
#1012 docs/STATUS.md (the note under the validator transcript) "which calibre a reader should be told is an open product question — #1012 — and this block does not settle it" the note states the settled calibre (registrations), keeps the 6-files/26-registrations distinction, and records that the README now states the same 26. Filed premise said STATUS.md:17; the 13 actions reference actually sits at :35 on today's tree (it moved when #1011 landed)
#1012 guard test/docs-drift.test.ts, the #729 rule (added by PR #1010) actions deliberately absent — "this guard does not pick a side" an actions kind read off the registered stack, plus two CLAIMS spellings (banner + layout block). The banner pattern is bold-scoped on purpose: actions is the one noun here that is also an ordinary English word in these pages — a bare (\d+) actions reads whats-new's Copilot prompt "What are the next 3 actions I should take?" as an inventory claim
#732 content/docs/sales/forecasting.mdx ×3 locales (filed) the Copilot skill writes a forecast record and stores the transcript on it no change needed — already true on main in all three locales. PR #742 landed the docs-truth half: the skill "composes describe_object / aggregate_data / query_records / visualize_data … answers in the conversation … opens no forecast row", and the Source field row reads "ai (reserved for an agent or integration of your own — nothing in HotCRM writes it)". Verified line by line in en / zh-Hans / zh-Hant. The card closes because the remaining half (build the write capability) was declined by the ruling. The soft "AI grounding" line stays untouched, as the earlier PM review directed
#961 content/docs/marketing/campaign-members.mdx ×3 locales — the «Standard list views» section a Members tab with four member list views: All Members, Responded, Bounced / Unsubscribed, Converted to Opportunity «Where members appear»: the Campaign Members panel on the shared Related tab, with its real columns Lead / Contact / Status / Response Date. Re-measured: crm_campaign_member registers zero views; highlightFields = [crm_campaign, crm_lead, crm_contact, status, response_date] minus the panel-scoped crm_campaign; no relatedList: 'primary' anywhere in the repo. All four retired names are still named, in italics, per the #927/#932 convention
#961 same three files, the enrolment list "open a campaign and click Add Members, then pick from lead and contact list views", and "from a lead or contact" the picker path that ships — Add to Campaign — plus the campaign panel's New button for one-at-a-time entry. ⚠️ Measured deviation from the ruling's wording: the ruling says "the Add to Campaign action on lead/contact pages", but CreateCampaignAction declares objectName: 'crm_lead' and no contact action carries it (src/actions/contact.actions.ts has only Mark as Primary Contact / Send Email). The docs now say lead only — the measured reality, per the sweep card's "use the measured value and say so" rule
#709 content/docs/administration/profiles.mdx ×3 locales, Marketing User block "Create, read and edit leads, contacts and campaigns org-wide" per object: leads — create, read org-wide, edit own-and-created; contacts — read org-wide, create refused (master-detail insert needs edit on the master account, which this profile holds nowhere), edit own-and-created; campaigns and campaign members — create and edit any, because both carry a row-level rule authored for this set (marketing_campaign_updates, marketing_campaign_member_updates, verified in src/profiles/marketing-user.profile.ts)
#709 same three files, Service Agent block "Read accounts, contacts (editable) and leads org-wide" the (editable) claim is dropped: reading is org-wide, saving needs owner and creator, which a contact that arrived with the account never is
#709 same three files, new section the owner-and-creator update gate was nowhere on the page, so "org-wide" read like a write scope Why "org-wide" describes reading, not writing — states the gate once, says View All never grants a write, and names the row-level rule as the deliberate per-object exception. No grant changed in src/; the permission expansion stays parked on #1062
sweep .changeset/docs-truth-sweep-app-name-actions-members-permissions.md one patch changeset covering all five items (see Changeset convention below)

Changeset convention for this PR shape

Conclusion: ship a changeset, do not use skip-changeset. .github/workflows/changeset-check.yml fails any PR that adds none unless the skip-changeset label is applied, and its error text reserves that label for changes that "genuinely ship nothing (pure CI/docs chores)". This repo's own precedent is unambiguous — every recent docs-truth PR shipped a 'hotcrm': patch changeset (#1019, #1014/#1011/#1015, #995, #1001, #1010). A published doc-site page is product surface here, and this PR also changes two guard tests. So: one changeset, patch, covering all five items.

Type of Change

  • Documentation update
  • New tests added (two guard rules: the app-name assertions and the actions count rule)

Related Issues

Six Fixes lines at the top of this body: the sweep card #1063 and its five members.

Changes Made

Testing

  • Unit tests pass — pnpm test: 81 files, 1889 passed | 1 skipped
  • Linting passes — pnpm lint exit 0 (116 warnings, all pre-existing)
  • Build succeeds — pnpm build exit 0; pnpm validate exit 0 ("Validation passed"); pnpm hygiene clean
  • New tests added

Reverse verification (red before, green after) — measured on this tree, both new guard rules:

  1. Put - **Enterprise CRM** — the main app… back on quick-tour.mdx:46 → predicted red on the new launcher rule only. Measured 1 failed | 41 passed: "the app-launcher list … calls this app something other than the name it ships … expected 'Enterprise CRM' to be 'HotCRM'".
  2. Put **13 actions** back in the README banner → predicted red on the count rule only. Measured 1 failed | 75 passed: "README.md:62 says "13 actions", the stack registers 26 actions".

Both files were restored and the suites re-run green afterwards.

Additional Notes

🤖 Generated with Claude Code

https://claude.ai/code/session_011NVPRcYcPzZ6rqEhPU79dC


Generated by Claude Code

…#732)

Five separately filed docs-truth findings, all ruled the same way — the
documentation moves, the product does not — landing as one sweep.

#998: 22 doc pages in three locales called this app *Enterprise CRM*, a
spelling `src/` has never carried; `CrmApp.label`, the locale bundles, the
build artifact and the marketplace manifest all say HotCRM, which is what
the app launcher shows. All 25 occurrences follow the metadata.
`test/docs-quick-tour-navigation.test.ts` now derives both the guarded
block's start marker and the app-launcher bullet from `CrmApp.label`, so
the two holes that hid this (the launcher list sat outside the block; the
occurrence inside it was not bold) are closed.

#1012: the README advertised 13 actions beside eight registration counts.
The stack registers 26 and the source tree holds 6 `*.actions.ts` files.
The reader-facing calibre is the registration count — it matches every
other figure in that sentence and is the only one a guard can re-derive.
README (banner and layout block, which said 13 on any calibre) states 26,
`docs/STATUS.md` stops calling the calibre open, and the #729 count rule
gains an `actions` kind read off the registered stack.

#961: the campaign-members page promised a *Members* tab, four member list
views and an **Add Members** picker. `crm_campaign_member` ships no views,
no `relatedList: 'primary'` exists in this repo, and the panel's New button
opens a create drawer. The section now describes the Campaign Members panel
and its real columns, and points at the path that does ship — the
**Add to Campaign** action, declared on `crm_lead` only.

#709: `administration/profiles` promised two writes the platform refuses —
marketing creating contacts (master-detail insert needs edit on the master
account, measured 403) and agent/marketing editing contacts and leads they
neither own nor created. Both personas now state reach per object, and a
new section explains the owner-and-creator update gate once, naming the two
objects this app opens with a row-level rule. No grant changed; the
permission expansion is parked on #1062.

#732: verified already true on `main` in all three locales after PR #742 —
the skill reads and answers only, `source: 'ai'` is reserved for an agent
or integration, no transcript is stored. No text change needed.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011NVPRcYcPzZ6rqEhPU79dC
@vercel

vercel Bot commented Aug 11, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

1 Skipped Deployment
Project Deployment Actions Updated (UTC)
hotcrm Ignored Ignored Aug 11, 2026 5:25am

Request Review

@github-actions github-actions Bot added documentation Improvements or additions to documentation ci/cd CI plumbing and the verification pipeline labels Aug 11, 2026
@huangyiirene
huangyiirene marked this pull request as ready for review August 11, 2026 05:33
@huangyiirene
huangyiirene added this pull request to the merge queue Aug 11, 2026
Merged via the queue into main with commit c5bc586 Aug 11, 2026
10 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment