Skip to content

Send for Approval, Start Signing and Activate confirm with the generic 「操作已成功完成」 instead of saying what happened #158

Closed

Description

@objectstack-fleet

Filing gate: ① user-visible defect, reproduced in the browser on @objectstack 18.2.0 (hotclm PR #155 branch), zh-CN.

Symptom. Legal presses 送审, the records manager presses 发起签署 and later 生效. Each succeeds and each toast reads only 「操作已成功完成」. The renewal action, by contrast, says 「续签草稿已创建。」 and the wizard 「合同已发起。」.

Where. src/actions/contract-lifecycle.actions.ts: the actions built by transition(…) (submit_contract, accept_contract, send_for_approval, start_signing, activate_contract, withdraw_contract, terminate_contract) declare no successMessage, so the console falls back to its generic sentence. 18.2 makes successMessage a template slot over result and record (objectstack 384bb7b), so a sentence such as "Sent for approval." or one naming {{ record.contract_number }} is available; zh-CN keys go in the actions translation bundle.

Expected. Each transition says what changed, e.g. 「已送审,进入审批。」「已进入签署。」「合同已生效。」.

Business reason. These are the moments a contract changes hands; a generic toast leaves the user checking the status chip to see whether the right thing happened.

Reader. hotclm execution seat (PM seat #36).

Duplicate search. hotclm issues, all states, "successMessage / 操作已成功完成 / generic toast": 0 hits.

Activity

  1. objectstack-fleet commented on Oct 27, 2026

    @objectstack-fleet
    ContributorAuthor

    Triage — 2026-10-27

    Filed from the 18.2.0 browser pass (hotclm PR #155, landed as 21f2319). Defect, user-visible, reproduced: accepted.

    Route: app-side. Give each transition(…) action a successMessage (18.2 template slot), with en source strings and zh-CN keys in the actions bundle. Copy follows the card's examples; the seat reviews the wording on the PR.

    State: → pm:queue + bug.


    Generated by Claude Code

  2. objectstack-fleet commented on Oct 27, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 17
    Ruling-ref: none (triaged defect, comment 6437438025)
    Session: session_017nzWFRUo2U7evMkPdVniAn
    Account: zhuangjianguo (the seat's linked user as GET /user answers it; the card's assignee)
    Branch: claude/issue-158-transition-success-messages
    Worktree: hotclm-issue-158
    Domain: repo:hotclm (single-lane sister repo — no domain:*)
    Seat: repo:hotclm#1
    File surface: src/actions/contract-lifecycle.actions.ts (successMessage on the transition(…) actions) · src/translations/{en,zh-CN}/objects.contract.ts (their action keys) — stop on breach; explain in the report
    Container & model: S, mode:subagent, model: opus (TIER_DEFAULT; hand-derived for a sister repo), effort: medium
    Clause-②: no
    Metadata-protocol: none
    Responsibility: this app's action feedback (what a lifecycle step says it did) | none | every user who moves a contract through its lifecycle
    Thread-read: 6437438025
    Premise: re-measured by the dev on origin/main 91a79dd (@objectstack 18.2.0) with README personas first
    Serial constraints cleared: #159 landed (PR #163); in flight #127 (profiles), #64 (obligation) — disjoint files.


    Generated by Claude Code

  3. objectstack-fleet commented on Oct 27, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report

    {
      "issue": 158,
      "status": "done",
      "branch": "claude/issue-158-transition-success-messages",
      "pr": "https://github.com/objectstack-ai/hotclm/pull/167",
      "session": "session_017nzWFRUo2U7evMkPdVniAn (subagent; parent's)",
      "premise_still_valid": true,
      "summary": "Re-measured on origin/main 91a79dd (@objectstack 18.2.0, zh-CN): every lifecycle press toasted 「操作已成功完成」 (en: 'Action completed successfully'). transition(...) now takes a required successMessage, and its six actions (submit, withdraw, accept, send_for_approval, start_signing, activate) plus the hand-written terminate_contract (named on the card) each say what changed. The en source and the zh-CN text are under _actions.NAME.successMessage in objects.contract.ts. zh-CN uses the card's three examples word for word: 已送审,进入审批。/ 已进入签署。/ 合同已生效。. The {{ record.contract_number }} hole was measured to validate and render in both locales, including from the translated sentence (「MSA-2026-0016 已送审,进入审批。」). It was not shipped: these actions are record_header only, so the toast sits under a header that already shows the number.",
      "tests": "No test suite in this app. Browser on 18.2.0, pnpm demo:zh --port 3145, fresh DB each side, README personas (create-user, sys_user_position, change-password, set-user-manager, demo re-run to hand over the rows). Chromium /opt/pw-browsers/chromium, toast read from the sonner element. BEFORE 91a79dd: 提交/撤回/受理审查/送审/发起签署/生效/终止 all 「操作已成功完成」, en Terminate 'Action completed successfully'. AFTER ce953fa: Business Requester 1 提交 「合同已提交。」 and 撤回 「草稿已撤回,合同已作废。」; Legal Counsel 1 受理审查 「已受理,进入法务审查。」 and 送审 「已送审,进入审批。」; Records Manager 发起签署 「已进入签署。」 and 生效 「合同已生效。」; Legal Counsel 1 终止 「合同已终止。」; en-US Terminate 'Contract terminated.' and Accept for Review 'Accepted into legal review.'. Every press answered POST /api/v1/actions/clm_contract/ACTION 200 and the header moved to the new status. The console showed the same 404 + 401 resource errors before and after. Template probe (uncommitted, then reverted with git checkout HEAD; git diff HEAD empty): validate/lint/i18n-gate EXIT=0, toasts 「合同 AMD-2026-0001 已终止。」 and 'Contract AMD-2026-0002 terminated.'. No step was refused to a persona. Setup note: the Records Manager's own POST of a clean version answered 403 (master not editable, row-level), so the legal owner filed the prerequisites. No ablation: no tested behaviour.",
      "gates": "head ce953fa: pnpm install EXIT=0 · pnpm validate EXIT=0 (✓ Validation passed) · pnpm lint EXIT=0 (1 warning(s), 6 suggestion(s): main's security-controlled-by-parent-owner-policy-without-opt-in, nothing new) · pnpm typecheck EXIT=0 · pnpm lint:i18n-gate EXIT=0 (0 missing keys across 2 locales) · CLM_DEMO_SEED=1 pnpm validate EXIT=0. CI: PR #167 check-run 'Validate' completed success on ce953fa. dispatch-gates.mjs not run: it is objectstack's, and hotclm's gate list comes from its package.json.",
      "dogfood_battery": "n/a — hotclm, no ! in the title, Clause-②: no",
      "mcp_calls": "0",
      "api_writes": "2 relay writes: pr_create objectstack-ai/hotclm#167 (fleet-write run 40482923334, read-back identical), and this os-dev-report comment on #158 via post-stamped. Plus git push (not REST).",
      "open_questions": [],
      "out_of_scope_findings": ["carrier: none — noted in the PR's Acceptance notes, not filed: the records manager cannot file a contract version on an approved contract (row-level edit on the master), so the clean version that 发起签署 requires has to come from legal. This was measured during setup only. Whether records should file it is a product question, not a defect against a declared contract."]
    }

    Generated by Claude Code

  4. objectstack-fleet commented on Oct 27, 2026

    @objectstack-fleet
    ContributorAuthor

    Ruling-ref: none (triaged defect, comment 6437438025)

    Landed — PR #167 · 2026-10-27

    reading value
    PR #167 MERGED (squash on main), merged at its ACCEPT head ce953fa; Fixes #158 closes this card
    authority maintainer, project thread, verbatim: 「你可以自己审核的就自己合并」

    Release: each lifecycle step now says what it did (已送审,进入审批。 / 已进入签署。 / 合同已生效。 …), in zh-CN and en. State: pm:dispatched removed, assignee cleared.


    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

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions