Skip to content

Docs accuracy: the Leads page says CSV-imported leads are round-robined to reps, but an import makes the importer the owner; task.hook.ts header says "warns" where it refuses #2360

Closed

Description

@objectstack-fleet

Source

hotcrm#2329's report (comment 6462380992, PR #2359) measured both items on the 18.2.0 dev server while it wrote the data-import page.

# Text today (origin/main f660fd8) Measured
1 src/docs/crm_sales_leads.md:32 (and .zh.md:21): "A lead created without an owner (web-to-lead, CSV import, API capture) is auto-assigned to the sales rep with the fewest open leads". POST import of a lead row with a blank owner, as an admin, gives owner = the importer. content/docs/guides/importing-your-data.mdx agrees with the measurement, and #2329's crm_admin_data_import states the measured behaviour. The User Manual page therefore contradicts the Admin Manual page.
2 src/sales/objects/task.hook.ts:10, header comment: "Warns when reminder_date is after due_date." The handler refuses with VALIDATION_FAILED / 400. The comment is stale.

Target

  1. crm_sales_leads (en and zh) names only the doors that really leave a lead ownerless and so reach the round-robin. Measure each one that is named: web-to-lead and API capture as a system write. "CSV import" either goes, or links to crm_admin_data_import. ⛔ Do not change the import or the assignment behaviour to match the prose.
  2. task.hook.ts's header says it refuses.

Done when

  • Both statements match measured behaviour, each with its probe recorded in the PR.
  • docs-drift / docs-books pass, and so does pnpm verify.
  • No behaviour change.

Grade: priority:p3. A false statement to users in the shipped manual, with no data effect. Size: S.

Dedupe: none of the 25 open hotcrm issues matches round-robin, CSV import, lead owner or crm_sales_leads.

Filed by the repo:hotcrm lane seat (session session_01J8VVAnPkgK6CWrJa6t7Fk5) from #2329's out-of-scope findings.

Activity

  1. objectstack-fleet commented on Oct 28, 2026

    @objectstack-fleet
    ContributorAuthor

    Dispatch order · #2360 · repo:hotcrm seat 1 · huangyiirene · session session_01J8VVAnPkgK6CWrJa6t7Fk5 · 2026-10-28T07:11Z

    This order takes the slot freed by #2357, which landed as PR #2358 (511b5f2). Lane concurrency is 2, per Irene's 「后续并发降到2」, and the other slot is #2330. The card body is the spec. The seat filed it from #2329's measured findings.

    Container & model: S · mode:thread · model TIER_DEFAULT · effort high (the thread runs at the project default).
    Role file: objectstack-ai/objectstack .claude/agents/os-dev.md. Read it in full. hotcrm AGENTS.md binds. Re-measure every file:line against origin/main (0312803 or later).
    Writes:

    • The PR goes only through the relay op pr_create: draft, base main, assignees: [huangyiirene].
    • Comments go only through scripts/pm/post-stamped.mjs.
    • ⛔ No GitHub MCP write. ⛔ No issue filing: out-of-scope findings go in the report.
    • The write budget is tight, so make two writes: the PR and the report.

    Report: the os-dev-report JSON, posted as a comment on this card and sent as the final message to the seat thread. ⛔ Start editing only after the newest Claim: on this card names your branch. Push work in progress at each milestone, so a stop loses nothing.

    Ruling (not to be re-decided)

    • The text follows the code. ⛔ No change to the import, assignment or task behaviour.

    • Item 1. Measure each door crm_sales_leads names, on the 18.2.0 dev server:

      • web-to-lead
      • API capture as a system write
      • CSV/REST import as a member and as an admin

      Keep a door in the round-robin sentence only if a lead created through it is really ownerless and so reaches lead_auto_assign. For import, state what the measurement shows and link ./crm_admin_data_import.md, which batch 2 already wrote to that measurement. Write the en and zh pages together.

    • Item 2. task.hook.ts's header says the handler refuses (VALIDATION_FAILED / 400) when reminder_date is after due_date. Change the comment only.

    • If docs-drift pins the lead sentence, update its expectation to the measured text in the same commit.

    PM mechanism assumptions

    1. In-app docs, batch 2 (app package): getting started, activities, metric definitions and AI skills, plus admin setup and data import #2329's measurement stands: an admin's import of a blank-owner lead row makes the importer the owner. Re-measure it once. If it does not hold, stop and report.

    Serial constraints: none. #2330 touches module docs, books, src/marketing/index.ts, the locale packs' Help label and the link-check config, none of which this card edits.


    Generated by Claude Code

  2. added
    pm:dispatchedDispatched to a dev agent by /pm-dispatch
    and removed
    pm:queueReady for the PM dispatch loop
    on Oct 28, 2026
  3. objectstack-fleet commented on Oct 28, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 1
    Session: session_01J8VVAnPkgK6CWrJa6t7Fk5
    Account: huangyiirene
    Branch: claude/project-thread-xpo8c3
    Worktree: hotcrm-issue-2360 (card thread; branch is platform-designated, the measured platform exception to claude/issue-N-slug; implementing session session_01J8VVAo4oRPhkffQUg8HR7n)
    Domain: repo:hotcrm (single-lane repo, no domain:*)
    Seat: repo:hotcrm#1
    File surface: src/docs/crm_sales_leads.md and .zh.md, src/sales/objects/task.hook.ts (header comment only), test/docs-drift.test.ts only if it pins the lead sentence, one changeset (stop on breach; explain in the report)
    Container & model: M, mode:thread, model: TIER_DEFAULT (sister repo, hand-derived), effort: the order asked high; the thread runs at the project default, which only the maintainer sets
    Clause-②: no
    Metadata-protocol: none
    Responsibility: #2360: the Leads page names only measured ownerless doors; task.hook.ts header says it refuses; no behaviour change
    Thread-read: 6463015633
    Premise: holds — re-read at claim on hotcrm origin/main 0312803 (order comment 6463015633)
    Serial constraints cleared: none — #2330 touches module docs, books, src/marketing/index.ts, locale Help labels and the link-check config

  4. objectstack-fleet commented on Oct 28, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report

    {
      "issue": 2360,
      "status": "done",
      "branch": "claude/project-thread-xpo8c3",
      "pr": "https://github.com/objectstack-ai/hotcrm/pull/2361",
      "session": "session_01J8VVAo4oRPhkffQUg8HR7n",
      "premise_still_valid": true,
      "summary": "Both items held on origin/main 0312803. crm_sales_leads (en + zh) now names web-to-lead as the only door into the round-robin, says a lead a person puts in (UI, API under a session or API key, file import) keeps that person as owner, and links ./crm_admin_data_import.md for the import case. task.hook.ts header now says the reminder check refuses (VALIDATION_FAILED / 400). Docs, one comment and a patch changeset; no behaviour change. PM mechanism assumption 1 holds: an admin's blank-owner import makes the importer the owner.",
      "tests": "Probes on 18.2.0, shipped artifact (objectstack dev -a dist/objectstack.json) after pnpm demo:staff, rep pool = na.rep + eu.rep: anonymous POST /api/v1/forms/contact-us/submit 201 -> owner eu.rep (pool), lead_source web; POST /api/v1/data/crm_lead/import mappingName crm_lead_import blank owner as admin / sales.manager / na.rep 200 -> owner = importer each time; JSON import as admin -> admin; POST /api/v1/data/crm_lead as admin / sales.manager -> caller; API key minted at POST /api/v1/keys by sales.manager, create with x-api-key 201 -> sales.manager. System write: no public door makes one; test/hooks-runtime.test.ts lead_auto_assign seed-door case pins that it is routed (passed in pnpm verify). Item 2: POST crm_task reminder 2026-11-12 > due 2026-11-10 -> 400 VALIDATION_FAILED; control 2026-11-08 -> 201. pnpm verify on head 976deca: exit 0, Test Files 242 passed (242), Tests 4606 passed | 1 skipped (4607), 653 s. No ablation: no tested behaviour changed.",
      "gates": "local: pnpm verify (validate 'Validation passed', typecheck, lint --strict 0 errors / 19 suggestions, 'source hygiene clean', 'source token ratchet clean', build, vitest run) exit 0 captured before any pipe, head 976deca. hotcrm has no dispatch-gates.mjs; families hand-derived from package.json verify. CI check-runs on PR 2361: in_progress at report time, not waited on.",
      "dogfood_battery": "n/a - no ! in the PR title and no (narrowing) arm",
      "mcp_calls": "5 - mcp__github__issue_read x3 (get, get_comments x2), mcp__github__pull_request_read x1 (get PR 2358 for body shape), ToolSearch loads only; zero MCP write tools",
      "api_writes": "2 - relay pr_create (POST pulls + POST issues/2361/assignees via fleet-write run 40651674167, read-back identical) and this os-dev-report comment via post-stamped on hotcrm#2360. git push x2 not counted.",
      "deviations": "(1) Commit b36c51c carries the harness's model-named Co-Authored-By trailer; reported, history not rewritten; 976deca uses the model-free trailer. (2) Worked in the container's own checkout on the platform-designated branch (card thread, one agent), not a separate worktree. (3) Did not subscribe to PR activity: the dispatch contract leaves CI convergence to the seat.",
      "open_questions": [],
      "out_of_scope_findings": [
        "class: a (misleading copy) · reach: public product site page content/docs/administration/setup.mdx:68 (+ .zh-Hans.mdx:68, .zh-Hant.mdx:70) says 'An ownerless lead - web-to-lead, CSV import, API capture - is assigned on insert'; the probes in PR 2361 show import and API capture are owned by the writer · evidence: PR 2361 Tests table · dedupe words: setup.mdx, round-robin, CSV import, API capture, lead owner · same family as #2360, file surface outside this claim",
        "carrier: none · noted, not filed: a user-manual page now links an Admin Manual page that a sales rep cannot open (doc access refusal, read in #2327); the prose stands on its own"
      ]
    }

    Generated by Claude Code

  5. objectstack-fleet commented on Oct 28, 2026

    @objectstack-fleet
    ContributorAuthor

    Landed · repo:hotcrm seat 1 · session session_01J8VVAnPkgK6CWrJa6t7Fk5 · 2026-10-28T08:15Z

    Reading Probe Result
    PR #2361 GET /pulls/2361 Merged 2026-10-28T07:45Z as d5f6270 from head 976deca7ad. That is the head the seat ACCEPTed (6463533434).
    main CI on d5f6270 GET /commits/d5f6270/check-runs All 5 runs report success.

    State: the PR's closing line closed this card as completed, and this stroke removes its lane label.

    The in-app Leads page now names web-to-lead as the only door into the round-robin. It says that a lead entered through the UI, the API or a file import keeps its writer as owner, and it links the import page. The task hook's header now says it refuses.

    The docs-site pages that repeat the old claim are #2362, which this stroke dispatches.


    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

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions