Skip to content

Browser pass #2058 — HotCRM-side defects (18 items: accepted quote still takes lines, half-converted leads, agents losing their cases, unreachable Sales Home, …) — list card, split per item at dispatch #2060

Description

@objectstack-fleet

Filing gate: ① product defects with reach measured, the HotCRM-side findings of the maintainer's browser pass #2058. They were measured in a browser on main 1d7148bf (HotCRM 4.0.1, @objectstack/* 17.7.0) by three cloud testers, and each was re-checked by the repo:hotcrm seat against its screenshot. Filed by the repo:hotcrm seat, session_012zh91QzFgePbkmuHnugLN3.

Who acts on it: the repo:hotcrm seat. This is a list card: each item is split into its own card or dispatched on its own when it is picked up, as #2029 was. The items are folded here because one seat fire may file at most three cards.

Evidence: every item names its finding id. Reports and screenshots are on the never-merged evidence branches claude/qa-browser-pass-a|b|c, under qa/2026-10-10-browser-pass/<a|b|c>/: REPORT.md holds the steps, the API answers and the server-log lines, and each finding's PNG sits beside it.

Not here:

The items

p2: a business outcome is wrong

  1. A quote the customer accepted still takes new line items, and its totals stop matching its lines (B-09).
    • QTE-0007 was accepted with subtotal 19,000. A second line was added from Related → New (POST crm_quote_line_item 200). The quote still says 19,000 / 17,100 while its lines sum to 24,000; the drafted contract says 17,100.
    • Owner: src/revenue/objects/quote_line_item.hook.ts. quote_total_rollup skips settled quotes, but nothing refuses a line write on an accepted or expired parent.
    • Expected: content/docs/sales/quotes.mdx:120, "the quote is frozen".
  2. Lead conversion with "Create Opportunity" ticked and no amount leaves a half-converted lead (A-01).
    • The screen's Opportunity Amount is optional (src/sales/flows/lead-conversion.flow.ts:133), while crm_opportunity.amount is required.
    • Submit fails at create_opportunity ("Amount is required") after the account and contact were created and the "New contact" toast fired. The lead stays new.
    • Re-running with an amount recovers.
  3. A service agent who creates or escalates a Critical case is shown "Record not found" right after "Case created successfully" (B-04).
    • The case is escalated and reassigned to the service-manager pool. The agent's crm_case read scope is own (src/sales/profiles/service-agent.profile.ts:25), and no sharing rule keeps the creator or previous owner on it (src/service/sharing/case.sharing.ts).
  4. An agent cannot claim an anonymous web case as-is (B-03).
    • The agent form makes Account required (src/service/views/case.view.ts:424), web cases carry none, and crm_case.crm_account is optional in metadata.
    • Saving In Progress fails: "Please check the highlighted fields: Account".
    • content/docs/service/cases.mdx:148 says "Move an unowned case to In Progress … and it becomes yours".
  5. Every persona lands on Executive Overview, and Sales Home, the App Launcher and the Utility Bar have no UI path (C-07, B-19, C-14, A-22).
  6. An ownerless lead makes lead_assignment fail (A-08, C-20).

p3: the outcome is right, but the way there is broken or misleading

  1. Form required flags that block a default the server would supply (A-04, A-21, B-11, C-08, A-20).
    • The default lead form requires Lead Owner, though insert stamps the creator (src/sales/views/lead.view.ts:293-296).
    • Line item unit_price is required, so the list-price default is unreachable (src/revenue/objects/opportunity_line_item.object.ts:145).
    • Quote expiration_date is required, so the +30-day default is unreachable (src/revenue/objects/quote.object.ts:171-176).
    • Forecast period_end and snapshot_date are required although the hook derives them (src/sales/objects/forecast.object.ts:106,137).
    • Opportunity stage has no field defaultValue (src/sales/objects/opportunity.object.ts:227).
  2. Actions offered to personas who cannot complete them (C-12, C-13).
    • A sales rep is offered Escalate / Close Case, which end in "Node 'escalate' failed: update_record(crm_case) failed: You do not have permission" (src/service/actions/case.actions.ts visible).
    • A rep is offered Enroll Members, which enrols nobody. For any user, the flow ends with no result message (src/marketing/actions/campaign.actions.ts:28, src/marketing/flows/campaign-enrollment.flow.ts).
  3. Every contact ends up "primary" (A-15). Conversion into an existing account stamps is_primary: true (src/sales/flows/lead-conversion.flow.ts:473), and Mark as Primary never demotes the others (src/sales/actions/contact.actions.ts:26). The demo's Primary Contacts view lists 11 of 11.
  4. A reader's Helpful vote refreshes the article's Last Reviewed date (B-17). See src/service/objects/knowledge_article.hook.ts:119, and content/docs/service/knowledge-base.mdx:63, which says the date "reflects real attention".
  5. All Forecasts groups periods alphabetically ("Sep 2026 → Q4 2026 → Q4 2025 …") (C-09). It groups by the text period_label desc (src/sales/views/forecast.view.ts:39).
  6. Refusal copy:
    • The campaign date error names API fields: "Campaign start_date … must not be after end_date" (C-11, src/marketing/objects/campaign.hook.ts:84).
    • "2 open opportunity(ies), 0 active quote(s)" (A-17, src/sales/objects/contact.hook.ts:191).
    • The product delete refusal counts quote lines as quotes (B-16, src/revenue/objects/product.hook.ts:70).
  7. Locales:
    • Approval flow and step names stay English in zh-CN / ja-JP / es-ES, e.g. "Large Deal Approval (on create) / Sales Manager Review" (C-15). The packs' flows: blocks carry only screen flows (src/sales/translations/zh-CN/app.ts:604).
    • zh-CN labels both the Activity group and the Events item 活动 (C-16, src/sales/translations/zh-CN/app.ts:30-31).
  8. Public forms have no label, so visitors see the heading crm_lead / crm_case (A-09, B-08). Give web_to_lead (src/sales/views/lead.view.ts:893) and web_to_case (src/service/views/case.view.ts:452) a label; the console fallback goes upstream.
  9. "Accounts by Location" has nothing to plot (A-13): every seeded account has office_location: null (src/sales/data/sales.seed.ts).
  10. docs/feature-inventory.md and two docs pages describe the app as it was (A-12, B-18, C-21):
    • ACC-006 lists a renewals tab;
    • ACC-004 says "open opportunities";
    • SVC-001 lists signature, rating and feedback fields;
    • SVC-007 says escalation does not reassign;
    • KB-005 / KB-006 cite view_count;
    • ADM-001 lists 7 groups;
    • ACT-012, PRM-001 (7 sets, not 6), PRM-006 (10 rules, not 9) and ADM-010 (38 cases, not 8);
    • content/docs/service/knowledge-base.mdx:33 says "most-viewed first".
  11. Measure first, because the testers disagree: imports through a shipped mapping (A-11 against C's ADM-004).
    • Tester A got 400 MAPPING_FORMAT_MISMATCH ("declares sourceFormat "csv" but the payload is "json"") for both crm_lead_import and crm_account_import.
    • Tester C imported 2 accounts through "Account Import (CSV)" with 200.
    • Find which path reaches which, then file the defect on the right side.
  12. After the pin bump (chore(deps): upgrade @objectstack/* past 17.7.0 once the next release publishes — it carries the platform fixes #2016, #2000, #1583 and #1585 wait on #2031), re-point the public-form links (A-07, B-07, C-03).

Acceptance

Each item is closed by its own PR, or recorded here as not a defect with the reason. The split card or PR names the finding id.

Duplicate check

Every hotcrm issue and PR was listed (/issues?state=all, 1,896 rows) and matched case-insensitively on each item's dedupe words:

No open card covers any item.


Generated by Claude Code

Activity

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't workingpm:queueReady for the PM dispatch looppriority:p2Medium: important, M3

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions