Skip to content

Make the public web forms read as guest-facing, and cap a guest's case priority at High: priority options and hotline hint, guest field labels, no pre-filled zero, case number on thank-you #2368

Closed

Description

@objectstack-fleet

Ruled: Irene · 2026-10-29T02:08Z · the UX plan of the #2320 browser pass: six HotCRM cards plus objectstack suggestion cards, queued (4+5) → 6 → 10 → 9 → 7 → (8+3). This is card 4 of 6, themes 9 (public web forms), with the web-to-case thank-you from theme 4.

Source

The #2320 browser pass on platform 18.2.0 (six tracks, 115 UI suggestions). Filing gate ③ a task the maintainer directed. Each row cites its track report on #2320 and the suggestion id there; the steps and screenshots are in that track's REPORT.md (project files qa-2320/<track>/). The platform parts of the same themes are objectstack#27355 (console) and objectstack#27356 (Setup and Studio).

Measure each row first on origin/main. A row that is already fixed, or that turns out to need the platform, is not forced: report it with the evidence and move on.

Ruling on guest priority (Irene, not to be re-decided)

A guest on the web-to-case form may pick at most High. Today a guest can pick Critical, which escalates at once and notifies the service manager (CASE-00041).

  • Measure first: can an 18.2.0 public form restrict a select's options for that form alone?
    • If it can, offer Low, Medium and High.
    • If it cannot, drop the priority field from the public form, and the case takes its default. Report the missing per-form option filter as a platform finding (the seat files it).
  • Either way, the anonymous submit door must not create a Critical case. A crafted POST with Critical must be refused or capped at High. Measure the door and test it.
  • Add the hint 「紧急故障请拨打服务热线」 to the form (en: "For an urgent outage, call the service hotline.").

Copy and defaults

# Observed on 18.2.0 Report Target
1 Web-to-case fields read "Supplied Name" and "Supplied Email". Service S3 Guest-facing labels ("Your name", "Your email"), en and zh.
2 The Contact Us form shows Annual Revenue as "0.00", which reads as filled in. Sales S6 No default value.
3 Web-to-case ends on "Thank you!" with no case number. Service S3 The confirmation names the case number, if 18.2.0 forms can template it; otherwise a platform finding.

Not here: branding, button colour and field highlighting on refusal (objectstack#27355 rows 9–10).

Done when

  • Each row is fixed, or reported as already fixed or platform-only, with the measurement.
  • A behaviour change (hook, flow, action visibility, refusal) has a test that goes red with it reverted. A metadata-only change (layout, order, label) is checked by the existing metadata and docs guards.
  • The in-app manual pages that describe a changed surface say what it does now, in en and zh. The Service Manual states the guest priority cap and the hotline hint.
  • pnpm verify is green, and the PR includes a changeset.

Grade: priority:p3. The only HotCRM page that customers and prospects see; the priority cap closes an escalation a guest can trigger. Size: S. The implementer may split the card into two PRs along the table's sections.

Filed by the repo:hotcrm lane seat (session session_01J8VVAnPkgK6CWrJa6t7Fk5) from Irene's ruling on the #2320 UX summary. Dedupe: read the 20 open hotcrm issues. None covers these rows; overlaps are named in the rows.

Activity

  1. objectstack-fleet commented on Oct 29, 2026

    @objectstack-fleet
    ContributorAuthor

    Dispatch order · #2368 · repo:hotcrm seat 1 · huangyiirene · session session_01J8VVAnPkgK6CWrJa6t7Fk5 · 2026-10-29T04:22Z

    This order takes the slot freed by #2371 (PR #2376). It is UX card 4 in Irene's queue order: #2371 → #2366 → #2367 → #2368 → #2369 → #2370. The card body is the spec, and its guest-priority ruling is Irene's and final. #2367 holds the other slot.

    Container & model: M · 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 on origin/main (495bff5 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: platform findings go in the report, and the seat files them.
    • 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.

    Scope notes

    • Guest priority, in this order:
      1. Measure whether an 18.2.0 public form can restrict a select's options for that form alone. State the probe and its answer in the PR.
      2. Measure the anonymous submit door (POST /api/v1/forms/<web-to-case>/submit) with priority: critical. Today it answers 201 and escalates (CASE-00041).
      3. Whatever the form shows, that door must not create a Critical case. Refuse it, or cap it at High; say which you chose and why. Test it.
      4. Add the hotline hint 「紧急故障请拨打服务热线」 (en: "For an urgent outage, call the service hotline.") where the form shows help text.
    • Escalation: if a guest's case is capped at High, check that the escalation and notification paths for Critical are not fired by anything else on that insert.
    • Guest-facing copy in en and zh, and in the other locales where the labels already have entries. Do not move translation files (Module split: each module package registers its own translations (ledger move rows R6, R7, R14, M3, M4, S3, S4) #2352 is blocked).
    • Before and after screenshots of both public forms, signed out. Read project memory hotcrm-browser-pass-howto first.

    PM mechanism assumptions

    1. Internal users creating a case in the console can still pick Critical. Only the public form and its door are capped. Test both sides.

    Serial constraints: none known. #2367 edits navigation and views.


    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 29, 2026
  3. objectstack-fleet commented on Oct 29, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 1
    Session: session_01J8VVAnPkgK6CWrJa6t7Fk5
    Account: huangyiirene
    Branch: claude/project-thread-45r09q
    Worktree: hotcrm-issue-2368 (card thread; branch is platform-designated, the measured platform exception to claude/issue-N-slug; implementing session session_01J8VVAmA6c9KrsMQiv9s7ak)
    Domain: repo:hotcrm (single-lane repo, no domain:*)
    Seat: repo:hotcrm#1
    File surface: the web-to-case and contact-us public form metadata, the case hook path that receives the anonymous submit (guest priority cap), case/lead labels and help text shown on the forms (+ translation entries, no file moves), test/ for the forms and the cap, the Service Manual and web-form docs pages (en + zh, site en/zh-Hans/zh-Hant), one changeset; ⛔ permission sets, positions, sharing (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: #2368 UX card 4: guest priority max High (form + submit door, measured first), hotline hint, guest-facing copy, no pre-filled zero, case number on thank-you
    Thread-read: 6487867778
    Premise: holds — re-read at claim on hotcrm origin/main 495bff5 (order comment 6487867778)
    Serial constraints cleared: none known — #2367 edits navigation and views

  4. objectstack-fleet commented on Oct 29, 2026

    @objectstack-fleet
    ContributorAuthor

    repo:hotcrm#1 · huangyiirene · session_01J8VVAmA6c9KrsMQiv9s7ak
    os-dev-report

    {
      "issue": 2368,
      "status": "done",
      "branch": "claude/project-thread-45r09q",
      "pr": "https://github.com/objectstack-ai/hotcrm/pull/2378",
      "session": "session_01J8VVAmA6c9KrsMQiv9s7ak",
      "premise_still_valid": true,
      "summary": "Measured on 495bff5 (18.2.0): a public form cannot restrict a select's options per form (a form-row options subset is served by GET /forms/support but /_console/f/support still lists all four), and POST /forms/support/submit with priority critical answered 201 and stored an escalated critical case. Per the ruling's fallback, priority is off web_to_case (the door drops it, the case takes low), and the guest branch of case_sla_defaults caps a guest critical at high (capped, not refused: the case is real and the hotline hint covers a P1). Hotline hint as the section description, guest labels Your name / Your email in en, zh-CN, es-ES, ja-JP; Service Manual (en/zh) and the Cases site page (en/zh-Hans/zh-Hant) updated. Rows 2 (currency placeholder 0.00) and 3 (case number on thank-you) are platform-only, no change.",
      "tests": "pnpm verify at 486d3f5: validate, typecheck, lint, hygiene, hygiene:tokens, build green; vitest Test Files 252 passed (252), Tests 4823 passed | 1 skipped; VERIFY_EXIT=0. New test/web-to-case-guest-priority.test.ts (5); updated case-sla-matrix, flow-escalation-ownerless-case (new systemInsert helper), case-create-form-narrowing, case-guest-branch-leftovers (comments). Ablations, exact-anchor replace, restored with git checkout HEAD, git diff HEAD empty after: A1 cap line removed -> web-to-case-guest-priority + case-sla-matrix 2 failed | 39 passed; A2 priority back on web_to_case -> web-to-case-guest-priority 2 failed | 3 passed.",
      "gates": "local: pnpm verify exit 0 at 486d3f5 (the repo's whole chain; hotcrm has no dispatch-gates derivation). CI on PR #2378 at open: Label Pull Request success, Vercel Preview Comments success; Build and Test (22.x), Check Changeset, Playwright, Typecheck and Build, link-check, Quality Checks, Analyze Code in_progress.",
      "dogfood_battery": "n/a — no ! in the PR title and no (narrowing) arm",
      "mcp_calls": "6 — github issue_read x3, pull_request_read x2 (PR #2376 body as template, #2378 check runs); claude-code-remote subscribe_pr_activity x1. No GitHub MCP write.",
      "api_writes": "2 — relay pr_create (POST /repos/objectstack-ai/hotcrm/pulls draft + POST issues/2378/assignees), this os-dev-report comment via post-stamped.mjs. Plus git push of the branch (not REST).",
      "open_questions": [],
      "out_of_scope_findings": [
        "class: a · reach: /_console/f/support renders all four crm_case.priority options when the web_to_case row declares options [low, medium, high] (screenshot probe-form-option-subset-ignored-en.png in project files issue-2368), and POST /api/v1/forms/support/submit accepts a value outside the row subset (registerFormEndpoints checks keys and required only) · 18.2.0 has no per-form option filter · dedupe words: public form option subset, form field options ignored, anonymous form select options",
        "class: a · reach: /_console/f/contact-us Annual Revenue shows placeholder 0.00 on an empty optional currency field, reading as filled in (console ui-components CurrencyField placeholder fallback 0.00) · dedupe words: currency placeholder 0.00, empty currency field",
        "class: a · reach: /_console/f/support after submit shows Thank you! with no case number: the submit answer is the id only, thank-you title/message have no interpolation, and submitBehavior is not translated · dedupe words: thank-you message record number, submitBehavior translation, public form confirmation",
        "carrier: Irene · noted, not filed: a web case now arrives at Low; whether web cases should start higher is a product call"
      ]
    }

    Generated by Claude Code

  5. objectstack-fleet commented on Oct 29, 2026

    @objectstack-fleet
    ContributorAuthor

    Landed · repo:hotcrm seat 1 · session session_01J8VVAnPkgK6CWrJa6t7Fk5 · 2026-10-29T05:28Z

    Reading Probe Result
    PR #2378 GET /pulls/2378 Merged 2026-10-29T04:59Z as 66c63cb, from head 486d3f5, which is the head the seat ACCEPTed (6488364174).
    main CI on 66c63cb GET /commits/66c63cb/check-runs All 6 runs success.

    State:

    • Fixed: the public web-to-case form no longer asks a guest for a priority. A guest submission that arrives as Critical is capped at High on the server. The form shows the hint 「紧急故障请拨打服务热线」, and the guest fields read "Your name" and "Your email".
    • Product call left open: web cases now arrive at the default priority (Low). The seat is raising that with the director.
    • Platform gaps: the option-subset, thank-you and section-description rows are objectstack#27398.
    • Card: closed with the merge (Fixes #2368). The seat removes pm:dispatched in this stroke.

    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

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions