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
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
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 main1d7148bf (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.
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".
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.
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).
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".
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).
nav_home points at executive_dashboard for everyone (src/sales/apps/crm.app.ts).
sales_home_page, app_launcher_page and utility_bar_page render only at a typed URL, so content/docs/sales/activities.mdx:96 ("the page you land on") is false.
A service agent's home and nav show revenue tiles and Opportunities / Campaigns / Forecasts it cannot read ("You don't have access").
An ownerless lead makes lead_assignment fail (A-08, C-20).
notify_hot / notify_std error with "at least one recipient is required … {record.owner_id}" whenever the lead has no owner, e.g. web-to-lead (src/sales/flows/lead-assignment.flow.ts).
p3: the outcome is right, but the way there is broken or misleading
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).
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.tsvisible).
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).
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.
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".
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).
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).
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).
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.
"Accounts by Location" has nothing to plot (A-13): every seeded account has office_location: null (src/sales/data/sales.seed.ts).
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);
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
main1d7148bf(HotCRM 4.0.1,@objectstack/*17.7.0) by three cloud testers, and each was re-checked by therepo:hotcrmseat against its screenshot. Filed by therepo:hotcrmseat,session_012zh91QzFgePbkmuHnugLN3.Who acts on it: the
repo:hotcrmseat. 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, underqa/2026-10-10-browser-pass/<a|b|c>/:REPORT.mdholds 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
POST crm_quote_line_item200). The quote still says 19,000 / 17,100 while its lines sum to 24,000; the drafted contract says 17,100.src/revenue/objects/quote_line_item.hook.ts.quote_total_rollupskips settled quotes, but nothing refuses a line write on an accepted or expired parent.content/docs/sales/quotes.mdx:120, "the quote is frozen".src/sales/flows/lead-conversion.flow.ts:133), whilecrm_opportunity.amountis required.create_opportunity("Amount is required") after the account and contact were created and the "New contact" toast fired. The lead staysnew.crm_caseread scope isown(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).src/service/views/case.view.ts:424), web cases carry none, andcrm_case.crm_accountis optional in metadata.content/docs/service/cases.mdx:148says "Move an unowned case to In Progress … and it becomes yours".nav_homepoints atexecutive_dashboardfor everyone (src/sales/apps/crm.app.ts).sales_home_page,app_launcher_pageandutility_bar_pagerender only at a typed URL, socontent/docs/sales/activities.mdx:96("the page you land on") is false.requiredPermissions([finding] GET /meta/app/:name/layers, /published, /history and /diff serve the app document with no nav filter, so entries pruned by requiredPermissions and the docs audience reach every member objectstack#20130).lead_assignmentfail (A-08, C-20).notify_hot/notify_stderror with "at least one recipient is required …{record.owner_id}" whenever the lead has no owner, e.g. web-to-lead (src/sales/flows/lead-assignment.flow.ts).p3: the outcome is right, but the way there is broken or misleading
requiredflags that block a default the server would supply (A-04, A-21, B-11, C-08, A-20).src/sales/views/lead.view.ts:293-296).unit_priceis required, so the list-price default is unreachable (src/revenue/objects/opportunity_line_item.object.ts:145).expiration_dateis required, so the +30-day default is unreachable (src/revenue/objects/quote.object.ts:171-176).period_endandsnapshot_dateare required although the hook derives them (src/sales/objects/forecast.object.ts:106,137).stagehas no fielddefaultValue(src/sales/objects/opportunity.object.ts:227).src/service/actions/case.actions.tsvisible).src/marketing/actions/campaign.actions.ts:28,src/marketing/flows/campaign-enrollment.flow.ts).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.src/service/objects/knowledge_article.hook.ts:119, andcontent/docs/service/knowledge-base.mdx:63, which says the date "reflects real attention".period_labeldesc (src/sales/views/forecast.view.ts:39).src/marketing/objects/campaign.hook.ts:84).src/sales/objects/contact.hook.ts:191).src/revenue/objects/product.hook.ts:70).flows:blocks carry only screen flows (src/sales/translations/zh-CN/app.ts:604).src/sales/translations/zh-CN/app.ts:30-31).crm_lead/crm_case(A-09, B-08). Giveweb_to_lead(src/sales/views/lead.view.ts:893) andweb_to_case(src/service/views/case.view.ts:452) a label; the console fallback goes upstream.office_location: null(src/sales/data/sales.seed.ts).docs/feature-inventory.mdand two docs pages describe the app as it was (A-12, B-18, C-21):view_count;content/docs/service/knowledge-base.mdx:33says "most-viewed first".400 MAPPING_FORMAT_MISMATCH("declares sourceFormat "csv" but the payload is "json"") for bothcrm_lead_importandcrm_account_import.@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)./forms/contact-usand/forms/supportanswer 404, and/_console/forms/<slug>redirects to login. The working anonymous URL is/_console/f/<slug>.publicLinksemantics in public forms:sharing.publicLinkreads as the "Generated public share URL" but is only a slug — the authored path (/forms/contact-us) answers 404, and the real anonymous URL (/_console/f/<slug>) is shown to the author nowhere objectstack#22079 (closed 2026-10-08, after 17.7.0). Re-derivesrc/sales/views/lead.view.ts:941,src/service/views/case.view.ts:482-486, the inventory rows andcontent/docs/service/cases.mdx:96on the bumped platform.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:quote_line_item1,accepted quote3,frozen4,case_escalation3,sales_home_page1,utility_bar1,Sales Home3,executive_dashboard1,period_end4,defaultValue2,Enroll Members1,period_label4: all closed. The two Sales Home hits ([17.0-rc2验收] sales_home_page / app_launcher_page / utility_bar_page 多个组件渲染为「Component Placeholder」,首页欢迎语用户名插值为空 #734, 同 #758 缺陷类:activities.mdx 的「标准列表视图」清单与「主页活动小部件」都对不上 src/views/task.view.ts,且 Sales Home 的三个标签页是空壳 #771) are the pages' original work, which the measurement shows unreachable today.opportunityAmount,Record not found,crm_account required,Lead Owner is required,unit_price,expiration_date,Escalate Case,is_primary,last_reviewed_at,opportunity(ies),Large Deal Approval,office_location,web_to_lead,MAPPING_FORMAT_MISMATCH,notify_hot,notify_std,publicLink.No open card covers any item.
Generated by Claude Code