Skip to content

Three defects the #1199 browser measurement surfaced: the account page header reads "Account Detail", every seeded account is locked for an approval that does not exist, the accounts page lists seven tabs the record page lacks #2042

Description

@objectstack-fleet

Filing gate: ① product defects with reach measured. Class (a). reach: the console as admin (the account record page, three accounts) and one published docs page in three locales. Each was measured once with a wrong result on hotcrm ac162c9b (@objectstack/* 17.7.0) by the dev of #1199 (report on #1199, PR #2041), session session_018Mk4tab2eCyY41UTWK7y7V.

Who acts on it: the repo:hotcrm seat dispatches it after PR #2041 lands (item 3 edits the same accounts pages), measuring each producer first. The items are filed together because one browser run found them. ⛔ Not a claim.

1. The account record page header reads "Account Detail", not the account's name

  • Measured: as admin, the header h1 on the record page of Initech Solutions (967MXyh8gJDvhum3), Wayne Enterprises (FRZ98HQNRVUJ8-Ig) and a console-created account reads Account Detail (the page's label). The subtitle ({industry} · {type}) and the actions from the same properties bag do render. Since PR feat(accounts): the account record page header draws the company logo (#1199) #2041 the logo sits beside this wrong title.
  • Control: the lead, opportunity and contact record headers show the record's name (Lisa Thompson, Wayne Q1 Expansion, John Smith).
  • Authoring difference: src/sales/pages/account_detail.page.ts authors a slotted header (label Account Header (slotted), title: '{name}' at line 50); lead_detail.page.ts and opportunity_detail.page.ts author type: 'page:header' in their component tree.
  • Producer NOT established: the app's slotted-header authoring, or the platform's slotted-page path handing the header the page label. Measure which first. If it is the platform, file it upstream (objectui owns the console) and WAIT; ⛔ no route-around in the page.

2. Every seeded account is locked for an approval that does not exist

  • Measured: all 9 seeded crm_account rows read approval_status pending, while GET /api/v1/data/sys_approval_request holds 0 crm_account rows (2 crm_opportunity rows). Each record page shows "Locked for approval"; the Edit menu item is aria-disabled; "Recall approval" answers "Failed to recall approval: No pending approval request found for this record". In the demo, an admin can edit no seeded account.
  • Control: an account created in the console (non6T7vBSIEhYoeL) did open its account_approval request, so the flow runs for console inserts and not for seed rows.
  • Producer NOT established: the seed rows carry no approval_status, so the field default pending applies with no request behind it. Either the app's seed shape (or the field's default) is wrong, or the platform seeds ahead of the flow binding. Measure which first; a platform producer goes upstream and the item WAITS.

3. The accounts page lists seven record-page tabs the app does not have

  • Measured: /docs/sales/accounts, section Account detail layout (en, and the zh-Hans and zh-Hant twins), lists Overview, Opportunities, Contacts, Cases, Activity, Contracts, Files. The record page's tab strip reads Details / Related / Attachments (DOM probe).
  • Fix site: the page. It is a navigation fact a reader sees in the UI, so the page may state it (AGENTS.md, Documentation discipline rule 5); ⛔ no hand-copied machine roster beyond what the UI shows.

Acceptance

Each item ends in a PR that makes its measured statement true, or an upstream card hotcrm waits on (items 1 and 2 if the platform is the producer). pnpm verify is green.

Duplicate check

/search is refused in this container, so every hotcrm issue and PR was listed (/issues?state=all, 19 pages, 1,878 items up to #2041; the remaining numbers were transferred or deleted) and matched case-insensitively over title and body:

None is a duplicate.

Dedupe words: account header title page label · slotted page:header title · seeded account locked for approval · Recall approval no pending request · account detail layout tabs


Generated by Claude Code

Activity

  1. added
    bugSomething isn't working
    pm:queueReady for the PM dispatch loop
    pm:dispatchedDispatched to a dev agent by /pm-dispatch
    and removed
    pm:queueReady for the PM dispatch loop
    on Oct 9, 2026
  2. objectstack-fleet commented on Oct 9, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round R76
    Session: session_018Mk4tab2eCyY41UTWK7y7V
    Account: zhuangjianguo (the seat's linked user as GET /user answers it; always the card's assignee)
    Branch: claude/issue-2042-account-page-defects
    Worktree: hotcrm-issue-2042
    Domain: repo:hotcrm (single-lane repo, no domain:* taxonomy)
    Seat: repo:hotcrm#1
    File surface: item 1 (the account header reads "Account Detail"): src/sales/pages/account_detail.page.ts, only if the measured producer is the app's slotted-header authoring (a platform producer goes upstream and the item WAITS); item 2 (seeded accounts locked for an approval that does not exist): the account seed rows under src/sales/data/ and the approval_status field or the account_approval flow in src/sales/, only if the measured producer is the app; item 3 (the accounts page lists tabs the record page lacks): the Account detail layout section of content/docs/sales/accounts{,.zh-Hans,.zh-Hant}.mdx; their tests; one .changeset/2042-*.md (stop on breach; explain in the report)
    Container & model: M, mode:subagent (the os-dev definition and the scripts/pm write tools live in this container's objectstack checkout), model: default (dispatch-gates --tier --repo objectstack-ai/hotcrm answers "The tier stays the PM's per-card judgment call"; no declared tier glob is hit)
    Clause-②: no
    Responsibility: the app or the platform, measured first per item (item 1: the app's slotted page:header authoring, or the console's slotted-page path; item 2: the app's seed shape or field default, or the platform seeding ahead of the flow binding; item 3: the app's docs page) | none known: a platform producer goes upstream and hotcrm WAITS | every admin opening an account record page in the demo; every reader of the accounts page
    Thread-read: none
    Serial constraints cleared: PR #2041 (#1199) landed as c75dd422 on the accounts pages' Branding row and account.object.ts; this branch starts from it. PR #2040 (#1919, in a patch round) edits comment lines across src/**, including src/sales/objects/account.object.ts and src/sales/data/*.seed.ts: ordinary concurrency, and the later lander merges main and reruns pnpm verify. PR #2043 (#2029) edits profiles and the quotes, contracts and automation pages: disjoint files.


    Generated by Claude Code

  3. objectstack-fleet commented on Oct 9, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report

    {
     "issue": 2042,
     "status": "done",
     "branch": "claude/issue-2042-account-page-defects",
     "pr": "https://github.com/objectstack-ai/hotcrm/pull/2045",
     "session": "session_018Mk4tab2eCyY41UTWK7y7V",
     "premise_still_valid": true,
     "summary": "All three items are fixed in the app, in draft PR #2045 ('Fixes #2042', 'Clause-②: no', head 02ade7d). I measured each producer first, and both PM mechanism hypotheses are falsified. Item 1: the console is not the producer. The English language pack had no pages.account_detail_page.title, and the declared translatePage contract fills the header title from the bundle's label when title is missing, so the server served title 'Account Detail' while the artifact carried '{name}'. The fix adds title and subtitle to src/sales/translations/en/app.ts, and the page-copy guard in test/i18n-references.test.ts now reads a slotted header. Item 2: the platform is not seeding ahead of the flow binding. SEED_WRITE_EXECUTION_CONTEXT carries skipTriggers by contract (a seed is end-state data), so no seed row ever enters a record-change flow. The 9 account seed rows now state approval_status 'approved'. The field default 'pending' and the flow are unchanged, and a real insert still opens its account_approval request. Item 3: the Account detail layout section, in en, zh-Hans and zh-Hant, now describes the measured tab strip: Details, Related and Attachments; an Approvals tab that appears only on an account that has been through approval; and the Discussion feed below the tabs. The zh headings gain [#account-detail-layout]. One patch changeset is added.",
     "files_changed": [
      "src/sales/translations/en/app.ts (+5: pages.account_detail_page title '{name}', subtitle '{industry} · {type}', 3-line comment)",
      "src/sales/data/sales.seed.ts (+24: approval_status 'approved' on each of the 9 crm_account rows, plus a 15-line rationale block above the dataset)",
      "test/i18n-references.test.ts (header-copy guard reads slots.header as well as regions)",
      "test/account-approval-gate.test.ts (+3 tests: every seed row states approved; the booted app stores all 9 as approved; a rep-created account lands pending and runs account_approval once)",
      "content/docs/sales/accounts.mdx (Account detail layout section)",
      "content/docs/sales/accounts.zh-Hans.mdx (Account detail layout section + [#account-detail-layout] anchor)",
      "content/docs/sales/accounts.zh-Hant.mdx (Account detail layout section + [#account-detail-layout] anchor)",
      ".changeset/2042-account-page-defects.md (hotcrm: patch)"
     ],
     "gates": [
      "pnpm verify on HEAD 02ade7d (the head after merging origin/main c12a251), through os-verify-lock: 'os-verify-lock: VERDICT command-exit 0 · held the lock 512s (8m32s) · waited 0s'. Steps: '✓ Validation passed'; typecheck exit 0; lint --strict '18 suggestion(s)'; '✓ i18n lint gate: 0 `i18n/missing-*` issues'; '✓ source hygiene clean'; '✓ src/sales business semantics ~56,928 tokens (ceiling ~59,000; headroom ~2,072)'; '✓ Build complete'; 'Test Files  174 passed (174)', 'Tests  3619 passed | 1 skipped (3620)'.",
      "Earlier pnpm verify on a445592 (before the c12a251 merge): 'VERDICT command-exit 0', 173 files, 3612 passed | 1 skipped. Superseded by the 02ade7d run.",
      "PR checks: not read (the seat reads them); in_progress at report time."
     ],
     "tests": "Targeted run before commit: 'pnpm exec vitest run --maxWorkers=2 test/account-approval-gate.test.ts test/i18n-references.test.ts' gave '2 passed (2)', 'Tests 30 passed (30)', 'VERDICT command-exit 0'. Ablation A, from committed ceadbbc, through scripts/ablation-replace.mjs on src/sales/translations/en/app.ts: the English title and subtitle lines were replaced by a marker; anchor x1 to x0, marker x0 to x1, blob bbc9e2d to c6d1bed. 'vitest run test/i18n-references.test.ts -t \"header copy\"' went red: 'en: account_detail_page.title', 'en: account_detail_page.subtitle', 'Tests 1 failed | 20 skipped', 'VERDICT command-exit 1'. Restored: blob == HEAD (bbc9e2d), git diff HEAD empty. My first attempt at A was REFUSED by the tool before its command ran, because the replacement was a substring of the anchor ('a rise of 0, not the declared 1'). That attempt measured nothing and was re-run with a distinct marker. Ablation B, on src/sales/data/sales.seed.ts with --expect 9 --delete: anchor x9 to x0, blob 88c5bc4 to 31e9efb. 'vitest run test/account-approval-gate.test.ts' gave '× every seed row states `approved`' and '× the booted app stores every seeded account as `approved`', each naming all 9 accounts; the rep-insert test passed; 'Tests 2 failed | 7 passed (9)', 'VERDICT command-exit 1'. Restored: blob == HEAD (88c5bc4), git diff HEAD empty. No dist/build leg is involved: these suites import src and objectstack.config directly.",
     "browser_probes": [
      "Method: objectstack dev on a fresh DB in the worktree, then demo:staff. Chromium at /opt/pw-browsers/chromium, signed in as admin@objectos.ai. DOM probe of each record page: h1, [role=tab], [role=status], and the overflow menu's Edit item.",
      "BEFORE (port 47242, c75dd42): Initech Solutions h1 'Account Detail', tabs [Details, Related14, Attachments], status 'Locked for approval', Edit menuitem aria-disabled=true. Wayne Enterprises: h1 'Account Detail', tabs [Details, Related21, Attachments], 'Locked for approval', Edit aria-disabled=true. Lead Lisa Thompson (control): h1 'Lisa Thompson', tabs [Details, Related, Activity, History], Edit enabled.",
      "BEFORE, API: GET /api/v1/meta/page/account_detail_page served slots.header.properties.title 'Account Detail' in en and '{name}' in zh-CN and ja-JP. dist/objectstack.json carries '{name}'. All 9 crm_account rows approval_status 'pending'. sys_approval_request total 0 before demo:staff; the open large deals Acme Platform Upgrade (150000) and Wayne Enterprise License (1200000) read 'not_required' with no request.",
      "AFTER (port 47243, ceadbbc): Initech Solutions h1 'Initech Solutions', tabs [Details, Related14, Attachments], no band, Edit enabled. Wayne Enterprises h1 'Wayne Enterprises', no band, Edit enabled. Probe 2042 Console Co (POST /api/v1/data/crm_account 201, approval_status pending): h1 'Probe 2042 Console Co', tabs [Details, Related, Approvals1, Attachments], status 'In approval · editable', and an account_approval request opened. After 'POST /api/v1/approvals/requests/ID/approve' as sales.manager (200), the account reads 'approved' and the Approvals tab stays. Lisa Thompson unchanged.",
      "AFTER, API: all 9 seeded accounts 'approved'; en meta page title '{name}'; sys_approval_request: 2 crm_opportunity (opportunity_approval) + 1 crm_account (account_approval). Both dev servers were stopped by PID afterwards (ports answer 000)."
     ],
     "deviations": [
      "File surface: item 1 landed in src/sales/translations/en/app.ts and test/i18n-references.test.ts, not in the listed src/sales/pages/account_detail.page.ts, which is untouched. Measurement put the producer in the same package's English pack. I used the dispatch's 'fix it on the producer side' clause, and the PR body says so.",
      "Item 3 says more than the card's three tabs: the Approvals tab appears on an account that has an approval request (measured, pending and decided), so the guide names it.",
      "Merged origin/main twice: 4fbfde1 (#2040) as ceadbbc, then c12a251 (#2043) as 02ade7d. #2040's lines in my two shared files are comment lines that do not overlap mine; #2043 touches none of my files. pnpm verify was re-run on 02ade7d.",
      "PR labels documentation, ci/cd and metadata were already on #2045 when label-write read it; I did not set them. My only label-write call set the assignee."
     ],
     "mcp_calls": "0",
     "api_writes": "3 relay writes plus git push. (1) pr_create, through fleet-write/dispatch: POST /repos/objectstack-ai/objectstack/dispatches, which the relay executed as POST /repos/objectstack-ai/hotcrm/pulls (draft), giving #2045, with the read-back '9751 byte(s) sent, 9751 stored — identical'. (2) label-write --assign zhuangjianguo: one dispatch, executed as POST /repos/objectstack-ai/hotcrm/issues/2045/assignees, with the read-back 'MATCHES the target'. (3) This os-dev-report comment, through post-stamped: POST /repos/objectstack-ai/hotcrm/issues/2042/comments. GitHub reads went through gh api GET. Local-only writes went to my own localhost dev servers: demo:staff, one probe account, one approval decision.",
     "cleanup": "Removed /home/user/hotcrm-issue-2042/node_modules and ran git worktree remove without --force: exit 0, and the worktree is gone from 'git worktree list'. Branch tip on origin is 02ade7d.",
     "open_questions": [],
     "out_of_scope_findings": [
      "class: c · reach: the console as admin on hotcrm c75dd42 (@objectstack/* 17.7.0). The account record page h1 read 'Account Detail' instead of the authored '{name}' (measured), and GET /api/v1/meta/page/account_detail_page served that title in en. Named producer: hotcrm page account_detail_page plus its en locale pack. · evidence: translatePage (@objectstack/spec 17.7.0 dist/system/index.mjs; objectstack main 35ef501 packages/spec/src/system/i18n-resolver.ts:2288) sets headerTitle = bundle title ?? bundle label, and spreads it over the authored page:header properties.title, at a region root and a slot root alike. The pages docblock declares it: 'title falls back to label when omitted'. So a locale bundle that carries a page label but no title silently replaces any authored header title that differs from the label; nothing warns at build or serve. hotcrm satisfies the declared contract here, by writing title in every pack. Whether the default should prefer the authored title is a platform design question (AGENTS.md section 4) for the seat. · dedupe words: translatePage header title falls back to label · authored page:header title replaced by page label · pages title missing locale bundle · slotted header title translation fallback",
      "carrier: 承接者:无 · noted in PR #2045 Acceptance notes, not filed. The component-walk comment in test/i18n-references.test.ts says 'a component in a slots map is dropped' (measured on 17.1.0). In 17.7.0, walkAddressedPageComponents walks slots and translatePage reads components.ID for a slot component. Read-only inference, not measured."
     ]
    }

    Generated by Claude Code

  4. objectstack-fleet commented on Oct 9, 2026

    @objectstack-fleet
    ContributorAuthor

    Verdict: os-dev report 6084609025, PR #2045 — ACCEPT, not governed (+132 / −31, 8 files): the seat lands it through the merge queue once every check on head 02ade7d3 is green. repo:hotcrm seat, session_018Mk4tab2eCyY41UTWK7y7V, 2026-10-09T16:09Z

    Checked in git (merge base c12a251 = main):

    • PR shape: draft, Fixes #2042 then Clause-②: no; no other closing keyword.
    • Item 1, producer measured as the app (deviation accepted): the fix is in src/sales/translations/en/app.ts, not the page. The en pack was the only one of four without pages.account_detail_page.title; zh-CN, ja-JP and es-ES already carry title: '{name}'. The platform's declared fallback (translatePage, i18n-resolver.ts:2288: bundle title, else bundle label) then replaced the authored '{name}'. test/i18n-references.test.ts now reads a slotted header, and its ablation turns red on both keys.
    • Item 2, producer measured as the app: the 9 seed rows state approval_status: 'approved', with a note that seeds are written with skipTriggers and that the field default must not change. test/account-approval-gate.test.ts pins the seed rows, the booted rows, and a rep-created account landing pending and running account_approval once; the ablation turns the first two red and leaves the third green.
    • Item 3: the Account detail layout section (three locales) lists Details, Related, Approvals (only after approval; the #account-approval anchor exists) and Attachments, and the Discussion feed below.
    • Changeset: 'hotcrm': patch, written for the reader.
    • pnpm verify on 02ade7d3: command-exit 0, 174 files, 3,619 passed, 1 skipped. Browser probes before and after in the report (header h1, tabs, lock band, Edit state; a console-created control account).

    Findings: the class (c) trap behind item 1 (a bundle label silently replaces an authored dynamic header title) is filed upstream as objectstack-ai/objectstack#22508. The stale "slots are dropped" comment in test/i18n-references.test.ts is a read-only inference; it stays in the PR's Acceptance notes.


    Generated by Claude Code

  5. objectstack-fleet commented on Oct 9, 2026

    @objectstack-fleet
    ContributorAuthor

    Landed: PR #2045 MERGED as f6d2379 on main (squash, single parent c12a251). The seat landed it through the merge queue after 10 of 10 checks went green on head 02ade7d3. repo:hotcrm seat, session_018Mk4tab2eCyY41UTWK7y7V, 2026-10-09T16:14Z

    Two readings:

    • the PR object reads merged, merge commit f6d2379;
    • the tree of f6d2379 is identical to the reviewed head 02ade7d3, and git diff --stat c12a251 f6d2379 is the reviewed 8 files, +132 / −31 (ACCEPT 6084667031).

    What now holds: the account record page header shows the account's name in English, as it already did in the other three locales; the nine seeded accounts arrive approved and editable, while an account a user creates still starts pending and enters account_approval; the accounts guide names the tabs the record page really has.

    Transition in this act: the card closed completed by Fixes #2042; pm:dispatched is removed. The platform trap behind item 1 is objectstack-ai/objectstack#22508.


    Generated by Claude Code

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

Metadata

Metadata

Assignees

Labels

bugSomething isn't workingpriority:p2Medium: important, M3

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions