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
Implementation notes are shown to users as help text — field and dashboard-widget descriptions cite hook files, card numbers, DESIGN.md sections and PRs #95
Filing class: ① product defect (user-visible) — reach: browser, measured on 17.7.0. Reader: the repo:hotclm seat, dispatch from pm:queue.
Source: the #87 full browser pass on 17.7.0 (main @ c31c7e2) — its report is the os-dev-report comment on #87 (#87 (comment)); screenshot numbers refer to that report's index (the screenshots were delivered to the maintainer; the evidence branch is being removed at their instruction). Finding 11; screenshots 050, 065, 095, 111, 121.
Symptom
description texts render as user-facing help, and many are notes for developers:
fields: "open → accepted / rejected / withdrawn; the decided states are terminal (contract.hook.ts)" (050); "Enforced by contract.hook.ts; overdue is written only by the daily job (card 09)" (095); "(DESIGN.md §01: signing entities are configuration, not schema)", "(DESIGN.md §04)", "(§13 Q2)", "The expiry job (F13) flags is_expiring renewal_notice_days…" (111);
dashboard widgets: "Not an average duration — see the PR.", "The ball is in their court — the queue F4 chases", "Older than every seeded type SLA (longest is 10 days) — a fixed threshold…" (121);
the approval rung label "Head of Legal + Finance Controller (会签)" in the English UI (065).
Expected
Every description (and its zh-CN translation) is written for the person reading the screen; implementation notes move to code comments. Sweep src/objects/**, src/dashboards/**, src/flows/** and the translation bundles; the comment notes about DESIGN.md/cards stay as comments. ⛔ No behaviour change.
Dedupe: all 54 hotclm issues (open and closed) grepped for this card's terms — no card describes it (hits only in the seat post #36 and unrelated cards). (terms: help text, description)
Filed by the repo:hotclm PM seat from the #87 browser pass.
Claim: PM loop round 8
Session: session_01HihZ11bQSqjCgjzHbpv4M1
Account: zhuangjianguo (the seat's linked user as GET /user answers it; the card's assignee)
Branch: claude/issue-95-user-facing-descriptions
Worktree: hotclm-issue-95
Domain: repo:hotclm (single-lane sister repo — no domain:*)
Seat: repo:hotclm#1
File surface: src/objects/*.object.ts · src/dashboards/** · src/flows/** except the two held flows · src/translations/** — ⛔ not src/views/** / src/apps/** (#99) nor the held files below; descriptions in held files are left for a follow-up (Part of #95) — stop on breach; explain in the report
Container & model: M, mode:subagent, model: opus (TIER_DEFAULT; hand-derived for a sister repo)
Clause-②: no
Responsibility: n/a — copy defect, this app's own metadata text
Thread-read: none
Serial constraints cleared: PR #91 (src/objects/contract.hook.ts · src/flows/contract-intake.flow.ts · src/actions/contract-lifecycle.actions.ts), PR #101 (README.md · scripts/demo.mjs · src/flows/contract-approval.flow.ts), PR #102 (src/data/**), PR #92 / #81 (AGENTS.md) — all excluded from this surface; #99 dispatched in parallel on src/apps/** · src/views/**
Read at: 2026-10-10T04:33Z
{
"issue": 95,
"status": "done",
"branch": "claude/issue-95-user-facing-descriptions",
"pr": "https://github.com/objectstack-ai/hotclm/pull/103",
"session": "session_01HihZ11bQSqjCgjzHbpv4M1",
"premise_still_valid": true,
"summary": "Draft PR #103 (Part of #95) covers the claimed surface: objects, dashboards, flows (not the two held flows) and translations. Every description there was enumerated and classified. Rewritten: 54 of 115 object descriptions, 4 of 22 dashboard descriptions, 6 of 10 in-surface flow descriptions; the en bundle mirrors all 58 inline changes and 15 zh-CN values were rewritten. Hook files, card numbers, DESIGN.md sections, PR and decision references, flow codes, API field names and mechanics are gone from user text; notes not already in a header comment moved to code comments beside the field. Four texts were wrong and were corrected while rewritten: the review-SLA help promised a per-type reminder (it fires at a fixed 30 days); the obligation and payment-plan status tables (both locales) omitted transitions the hook allows; the is_expiring writer is F12, not F13 (now in the code comment); Contract Language said ISO code on a name picker. No key added or removed, no behaviour change. Descriptions in held or out-of-surface files are listed in descriptions_left_in_excluded_files, so #95 stays open.",
"tests": "pnpm verify (validate, lint, typecheck, lint:i18n-gate) via os-verify-lock on HEAD 7794860: VERDICT command-exit 0. validate: 'Validation passed (1114ms)'. lint: exit 0, '6 suggestion(s)', all pre-existing contract_approval empty-slate notices on an untouched file. typecheck: tsc --noEmit, no output. i18n gate: LOCALES en, zh-CN; REACH 12 surface classes; 'COVERAGE: 0 missing keys across 2 locale(s)'. CI on 779486057d: 'Validate' completed success x2 (push + pull_request), read once. Control-byte self-scan of the 25 changed files: no match (grep exit 1). Browser: objectstack dev on port 3495 with a fresh SQLite DB, once on 46e65f0 and once on the branch; Playwright on /opt/pw-browsers/chromium-1194; signed in as the seeded dev admin. Rendered text, before to after, was diffed: deviation New form Status help; three Legal Workbench widget helps; 15 field helps on the contract New form, which the backfill dialog inherits. A zh-CN browser-locale pass showed the new dashboard and obligation-status strings. Boot showed no degraded / no such table / plugin-load failure; the same 9 boot diagnostics appear before and after. Browser console: one 401 get-session before sign-in and one 404 resource on the login page, in both runs. Servers were stopped by PGID (5238, 7731, 10655, 11400), every scratch DB was deleted and port 3495 is free. Ablation: not applicable (copy-only change, no guard added).",
"mcp_calls": "0",
"api_writes": "3 relay strokes, each a POST /repos/objectstack-ai/objectstack/dispatches executed as objectstack-fleet[bot]: (1) pr_create, POST /repos/objectstack-ai/hotclm/pulls, gave #103 draft; read-back 9269 bytes identical. (2) assign, POST /repos/objectstack-ai/hotclm/issues/103/assignees, via label-write.mjs; read-back matches. (3) comment, POST /repos/objectstack-ai/hotclm/issues/95/comments: this report. Plus git push of the branch (5 pushes, not REST).",
"gates": {
"head": "7794860",
"validate": "pass",
"lint": "pass (exit 0, 6 pre-existing suggestions)",
"typecheck": "pass",
"lint:i18n-gate": "pass (0 missing keys, en + zh-CN)",
"ci": "Validate: success x2 on 779486057d"
},
"line_budget": "n/a",
"files_changed": [
"src/dashboards/finance.dashboard.ts",
"src/dashboards/legal.dashboard.ts",
"src/flows/executed-upload.flow.ts",
"src/flows/legal-review-sla.flow.ts",
"src/flows/obligation-due.flow.ts",
"src/flows/renewal-notice.flow.ts",
"src/flows/signature-record.flow.ts",
"src/objects/clause.object.ts",
"src/objects/contract-type.object.ts",
"src/objects/contract-version.object.ts",
"src/objects/contract.object.ts",
"src/objects/deviation.object.ts",
"src/objects/obligation.object.ts",
"src/objects/party.object.ts",
"src/objects/payment-plan.object.ts",
"src/objects/review.object.ts",
"src/objects/signature.object.ts",
"src/translations/en/app.ts",
"src/translations/en/objects.catalog.ts",
"src/translations/en/objects.contract.ts",
"src/translations/en/objects.lifecycle.ts",
"src/translations/zh-CN/app.ts",
"src/translations/zh-CN/objects.catalog.ts",
"src/translations/zh-CN/objects.contract.ts",
"src/translations/zh-CN/objects.lifecycle.ts"
],
"descriptions_left_in_excluded_files": [
"src/flows/contract-approval.flow.ts:280 rung label 'Head of Legal + Finance Controller (会签)' and :433 edge label 'Legal + finance (会签)' (held by PR #101)",
"src/actions/contract-lifecycle.actions.ts:105 / :122 / :146 descriptions cite Routing (F2), approval ladder (F5), 'F9 stamps activated_at' (held by PR #91), and their clm_contract._actions bundle keys in en and zh-CN",
"src/actions/contract-backfill.actions.ts:48 description ('created directly in active with is_backfilled set'), :57 helpText ('becomes both signed_at and executed_at'), :58 helpText ('version 1, kind final_signed'), and _actions.executed_upload.description in both bundles (not in the claimed surface)",
"src/datasets/cycle-time.dataset.ts:69 'see the module comment for the measurement that rules one out'; obligation.dataset.ts:24 and payment.dataset.ts:31 'the arrears the daily job stamps'; the datasets.* bundle keys carry the same text (not in surface)",
"src/profiles/finance|legal|records|requester.profile.ts row-policy descriptions and src/sharing/contract.sharing.ts sharing-rule descriptions open with 'DESIGN.md §04' and policy names; Setup shows them (not in surface)",
"src/views/** and src/apps/**: owned by #99; the scan found no implementation note there"
],
"deviations": [
"The backfill dialog screenshot was replaced by the contract New form. The dialog needs execute_contract, which the seeded platform admin does not hold. I granted clm_admin on the local scratch DB (one POST to localhost sys_user_permission_set); the permission classifier then refused to build on that grant. That DB was deleted and the before run re-captured on a fresh DB with no grant. The contract form renders the same field help the dialog inherits through its field-backed params.",
"Commits are split by area with each area's bundle keys (objects, dashboards, flows, plus one tweak commit), not translations alone, so every commit keeps the en bundle equal to the inline source.",
"Commit trailers are model-free (Co-Authored-By: Claude, plus Claude-Session) and the PR footer is the session-URL form, per the os-dev agent contract. The harness reminder asked for a model-named Co-Authored-By and a different footer; I did not use them.",
"Zone 2 assumption (2) was only partly true. lint:i18n-gate checks key coverage, not whether a value is stale, so a changed English value with an untouched zh-CN value would still be green. No key changed; both bundles were kept in step by hand.",
"Zone 2 assumption (1) confirmed: the card's list was a sample. The inventory found 64 inline rewrites plus 15 zh-CN-only value rewrites.",
"Zone 2 assumption (3) applied, e.g. the fixed 30-day threshold and 'department sharing is not in the standard product' are kept as user meaning.",
"Four help texts were factually wrong and were corrected in the same rewrite (in surface, text only): review SLA, obligation and payment status tables, Contract Language. They are named in the PR body."
],
"screenshots": [
"/tmp/claude-0/-home-user/e1694940-137d-56f8-bc26-8cb8aad03deb/scratchpad/issue-95/pw/before-1-deviation-form.png",
"/tmp/claude-0/-home-user/e1694940-137d-56f8-bc26-8cb8aad03deb/scratchpad/issue-95/pw/after-1-deviation-form.png",
"/tmp/claude-0/-home-user/e1694940-137d-56f8-bc26-8cb8aad03deb/scratchpad/issue-95/pw/before-2-legal-dashboard.png",
"/tmp/claude-0/-home-user/e1694940-137d-56f8-bc26-8cb8aad03deb/scratchpad/issue-95/pw/after-2-legal-dashboard.png",
"/tmp/claude-0/-home-user/e1694940-137d-56f8-bc26-8cb8aad03deb/scratchpad/issue-95/pw/before-3-contract-form.png",
"/tmp/claude-0/-home-user/e1694940-137d-56f8-bc26-8cb8aad03deb/scratchpad/issue-95/pw/after-3-contract-form.png",
"/tmp/claude-0/-home-user/e1694940-137d-56f8-bc26-8cb8aad03deb/scratchpad/issue-95/pw/after-zh-legal-dashboard.png"
],
"open_questions": [],
"out_of_scope_findings": [
"class: a · reach: public door, party New form in the browser (port 3495, this run). The Country help reads 'Drives governing-law defaults and screening.', but nothing in the app reads clm_party.country_code: its only uses are highlightFields and a party.view.ts column, and the intake governing_law input has no default. Evidence: grep of src for country_code. Dedupe words: country_code, governing-law defaults, party country help, misleading help text",
"carrier: 承接者:无 · noted, not filed: the payment-plan.object.ts header comment still draws the state table without the partial to paid / overdue edges (code comment, not user text)",
"carrier: 承接者:无 · noted, not filed: the boot logs one sys_migration UNIQUE insert retry, and the login page logs one 404 resource load; both appear before and after this change (observation)"
]
}
ACCEPT — PR #103, head 7794860 · objects / dashboards / flows / translations half (Part of #95) · 2026-10-10T05:04Z
Reviewed by the repo:hotclm seat against GitHub.
check
reading
CI on the head
both Validate check-runs success on 7794860 = PR head.sha
scope
25 files, all under src/objects/ · src/dashboards/ · src/flows/ · src/translations/; none of the files held by PR #91 / #101 / #102, nothing governed
closing keyword
Part of #95 — the card stays open for the descriptions in excluded files
content
every description in the surface enumerated and classified; 54 / 115 object, 4 / 22 dashboard and 6 / 10 in-surface flow descriptions rewritten for the reader, notes moved to code comments; en mirrors every inline change, 15 zh-CN values rewritten; no key added or removed
corrected while rewritten
four help texts that were false: the review-SLA reminder (fixed 30 days, not per type), the obligation and payment status tables (missing allowed transitions, both locales), Contract Language ("ISO code" on a name picker)
browser
before / after on the deviation form, three Legal Workbench widgets and the contract New form; a zh-CN pass; the same 9 boot diagnostics before and after
Landing: waits on the maintainer's merge approval.
What stays on #95 (the follow-up, after the holding PRs land)
src/actions/contract-backfill.actions.ts — description and two helpTexts with mechanics, and its bundle keys
src/datasets/*.dataset.ts and the datasets.* bundle keys — "see the module comment…", "the daily job stamps"
src/profiles/*.profile.ts row-policy and src/sharing/contract.sharing.ts rule descriptions opening with "DESIGN.md §04" (shown in Setup)
new, from this run:clm_party.country_code help says "Drives governing-law defaults and screening", but nothing in the app reads the field — a help text that claims a capability; fix the wording in the follow-up
Release: the objects / dashboards / flows / translations half is delivered (Part of #95). The remainder named in the ACCEPT above (descriptions in the files PRs #91 and #101 held, plus the country_code help) stays on this card; both holding PRs are now merged, so the card goes back to pm:queue with no assignee for the next dispatch.
Claim: PM loop round 14
Session: session_017nzWFRUo2U7evMkPdVniAn
Account: zhuangjianguo (the seat's linked user as GET /user answers it; the card's assignee)
Branch: claude/issue-95-remainder
Worktree: hotclm-issue-95
Domain: repo:hotclm (single-lane sister repo — no domain:*)
Seat: repo:hotclm#1
File surface: the remainder named in PR #103's ACCEPT and landing — user-facing descriptions in src/flows/contract-approval.flow.ts (会签 labels), src/actions/contract-lifecycle.actions.ts / contract-backfill.actions.ts, src/datasets/**, src/profiles/** (row-policy and sharing descriptions), src/objects/party.object.ts (country_code help) and their bundle entries; plus the seat's add-ons: templateNote in src/flows/contract-intake.flow.ts shown in English under zh-CN (#123 report), stale code comments naming the retired bind-position-sets.ts in src/apps/clm.app.ts (#122 report), signature-record.flow.ts's "false default" note, the records.profile.ts docblock, src/flows/index.ts:15 card numbers, README's demo row count (830 since #128) — stop on breach; explain in the report
Container & model: M, mode:subagent, model: opus (TIER_DEFAULT; hand-derived for a sister repo), effort: medium
Clause-②: no
Metadata-protocol: none
Responsibility: this app's user-facing help text and its code comments | none known | every member reading a description, help text or the zh-CN wizard
Thread-read: 6392495591
Premise: PR #103 landed the objects / dashboards / flows / translations half; its holding PRs (#91, #101) are merged, so the remainder is free; re-checked by the dev on origin/mainabd5401
Serial constraints cleared: #99 (PR #123), #109 (PR #128), #11 (PR #122) landed. In flight: #129 (contract.object.ts validations, objects.contract.ts bundles) — disjoint files.
{
"issue": 95,
"status": "done",
"branch": "claude/issue-95-remainder",
"pr": "https://github.com/objectstack-ai/hotclm/pull/131",
"session": "session_017nzWFRUo2U7evMkPdVniAn",
"premise_still_valid": true,
"summary": "Draft PR #131 (Part of #95) delivers the remainder except the action descriptions. Rewritten in source and both bundles: the approval rung-2 step label and edge (no 会签 in the English UI), the flow description, the party country_code help (no longer claims governing-law defaults and screening), three dataset descriptions, 12 row-policy descriptions and 7 sharing-rule descriptions. The intake version step's templateNote is replaced by the platform's supported route: a static screen description plus the Draft from template toggle's inlineHelpText, both bundle keys, rendered in zh-CN on a type with and without a template. Four stale code comments were corrected and README now reads 830 rows. Not delivered: the action descriptions in contract-lifecycle.actions.ts and contract-backfill.actions.ts. Their _actions bundle keys live in src/translations/*/objects.contract.ts, which this dispatch put off limits (#129 holds it), so neither the inline text nor the bundles were touched. The proposed wording is in the PR body.",
"tests": "No test suite in hotclm; the evidence is real boots on 18.1.0. pnpm demo --port 3495 on a fresh .objectstack/data, before (main abd5401) and after (branch). Both seeded {\"inserted\":830,\"errored\":404}. Normalised WARN/ERROR signatures: 423 lines each side; they differ only in two timestamps. No degraded, no such table or plugin-load failure. Personas: the dev admin, and Business Requester 1 made through POST /api/v1/auth/admin/create-user 200 then change-password 200. As admin, the NDA type was given a template on its Edit form (PATCH 200). Playwright with Chromium /opt/pw-browsers/chromium, as the requester. In zh-CN on DPA (no template), the version step went from the English note to '这份合同的起点文件。默认在下一步上传。'. On NDA (template) the same description shows, plus 从模板起草 with '这类合同带有模板。勾选后,模板会作为第 1 版附上,不用再上传文件。'. The en equivalents rendered. Behaviour is unchanged: NDA with the toggle ticked reached 提交合同 and filed 'v1 · Draft' from nda-template.pdf; DPA reached the 上传首个版本 form. As admin, the party Edit Country help rendered the new text in en and zh-CN, and the old claim was not found. Setup Dataset list: the new descriptions in en and zh-CN. Permission set Row-Level Security tabs: the new descriptions, with no DESIGN.md. The contract_finance_post_approval sharing rule detail shows the new text. The flow designer shows the node '(joint sign-off)' and the edge 'Legal + finance, jointly'. GET /api/v1/i18n/translations/{en,zh-CN} serves the approvals label (en joint sign-off, zh 会签), screen_document and country_code. Browser console: the pre-login 401 and one 404, the same before and after. NOT MEASURED: the rung-2 step label as an approver sees it in 待我处理. Reaching the joint rung needs an accepted deviation in band B or C, so a legal persona with a position, which is outside the admin plus requester persona set. NOT MEASURED: action dialogs, not changed. The control-byte scan of the 22 changed files found nothing (grep exit 1). Ablation: n/a, copy and comment change.",
"gates": "Run on the working tree committed unchanged as head aacd216; each exit captured to a file before any pipe. pnpm install EXIT=0. pnpm validate EXIT=0 ('✓ Validation passed (926ms)'). pnpm lint EXIT=0 ('6 suggestion(s)', the unchanged approval-approvers-may-resolve-empty set). pnpm typecheck EXIT=0. pnpm lint:i18n-gate EXIT=0 ('COVERAGE : 0 missing keys across 2 locale(s)'). CLM_DEMO_SEED=1 pnpm validate EXIT=0 ('✓ Validation passed (868ms)'). The validate warnings are the same 7 as main's boot. objectstack's dispatch-gates.mjs does not apply to hotclm; the gate list is the four in AGENTS.md. PR check-runs on aacd216: Validate completed/success x1 and Validate in_progress x1 when read (not awaited).",
"dogfood_battery": "n/a — hotclm has no dogfood battery; no ! in the title",
"mcp_calls": "0",
"api_writes": "2 relay writes, each a POST /repos/objectstack-ai/objectstack/dispatches executed as objectstack-fleet[bot]. (1) pr_create, POST /repos/objectstack-ai/hotclm/pulls, opened #131 as a draft with assignee zhuangjianguo; read-back 9392 bytes identical. (2) This os-dev-report comment, POST /repos/objectstack-ai/hotclm/issues/95/comments, via post-stamped.mjs. Plus one git push of the branch (not REST).",
"open_questions": [
{
"question": "The action descriptions (submit_contract, send_for_approval, activate_contract, executed_upload and its two param helps) are the last part of #95. Their bundle keys are in src/translations/*/objects.contract.ts, which #129 holds. How should they land?",
"options": [
"A — once #129 lands, dispatch a small follow-up on #95 that edits the two action files and the _actions keys in both objects.contract.ts bundles, using the wording proposed in PR #131's body; that follow-up closes #95",
"B — have the #129 dev carry the _actions bundle edits as well (scope creep on #129)"
],
"recommendation": "A, because it keeps #129 to its own scope. The follow-up is mechanical (6 strings × 3 places) and needs only the #129 merge."
}
],
"out_of_scope_findings": [
"carrier: 承接者:无 · noted, not filed: row-level security policy and sharing-rule descriptions have no translation key on 18.1.0 (TranslationDataSchema has no permission-set or sharing-rule group), so Setup shows them in English under zh-CN (measured: clm_requester Row-Level Security tab, zh-CN locale). Admin-facing; observation, no defect class claimed. Dedupe words: permission set translation, row policy description i18n, sharing rule description zh-CN",
"carrier: 承接者:无 · noted, not filed: src/datasets/cycle-time.dataset.ts's header records a 17.3.0 measurement 'against the 820-row demo'. Historical, left as written.",
"scope note: src/sharing/contract.sharing.ts sits outside src/profiles/** but is read as inside the claim's 'row-policy and sharing descriptions' item, the only place those sharing-rule descriptions live. Named in the PR's Acceptance notes."
]
}
Release: the remainder of the help text is delivered except the action descriptions, and the version step of the launch wizard now reads in zh-CN. Last piece: the action descriptions in contract-lifecycle.actions.ts / contract-backfill.actions.ts and their _actions keys in both objects.contract.ts bundles, with the wording PR #131's body proposes — the seat dispatches it now on the same claim (the bundle file #129 held is free since PR #130). State unchanged: pm:dispatched.
{
"issue": 95,
"status": "done",
"branch": "claude/issue-95-action-descriptions",
"pr": "https://github.com/objectstack-ai/hotclm/pull/132",
"session": "session_017nzWFRUo2U7evMkPdVniAn",
"premise_still_valid": true,
"summary": "Draft PR #132 (Fixes #95) closes the card. Every description and help string in contract-lifecycle.actions.ts and contract-backfill.actions.ts was listed and sorted into fine or rewrite. Six carried implementation notes and were rewritten: submit_contract, send_for_approval and activate_contract, the executed_upload description, and its signed_date and executed_file helps. PR #131's English wording is used unchanged. The en _actions bundle mirrors all six. In zh-CN only submit_contract carried a note (审批标记) and was rewritten; the other zh-CN values were already written for the reader. Fine and untouched: accept, start_signing, terminate and its reason help, start_renewal, withdraw (incl. withdraw_contract, description and confirm), the success messages, the owner-only refusal messages, and the contract_type, party and archive_no helps. The notes (F2 route_* stamps, F5, F9 activated_at, is_backfilled, signed_at/executed_at/final_signed) now sit in the code comments beside each action. No key changed and behaviour is unchanged.",
"tests": "No test suite in hotclm. The evidence is two real boots on 18.1.0, pnpm demo --port 3495 on a fresh .objectstack/data: before = main d7c706c, after = 77987fe. Each seeded {\"inserted\":830,\"errored\":404}. The normalised WARN/ERROR signatures are 439 lines on each side with 0 diff lines. No degraded, no such table or plugin-load failure. Personas: the dev admin, and Business Requester 1 made through POST /api/v1/auth/admin/create-user 200 then change-password 200. The requester's own draft came from POST /api/v1/data/clm_contract as the requester (201). Playwright with Chromium /opt/pw-browsers/chromium, en-US and zh-CN. Setup Action list, Description column, as admin: en shows the four new texts; zh-CN shows the new submit_contract text 「把草稿交出去。系统会定好它的审批路线,并指派一位法务审查;不需要法务审查的类型则直接送审。」 and the other three unchanged, as intended. The executed_upload designer input-dialog preview: Signed On reads 'The date on the executed document. It is recorded as both the signed date and the execution date.' and Executed Copy reads 'The signed PDF or scan. It is filed as version 1, the final signed version.' (before: signed_at and executed_at / kind final_signed), in both locales, since the preview reads the inline source. Served GET /api/v1/i18n/translations/{en,zh-CN} and GET /api/v1/meta/actions carry the new texts. Header, draft contract, admin and requester on their own draft, en and zh-CN, before and after: Submit/提交 is shown, hovering gives no tooltip, and the description is absent from the DOM. On 18.1.0 a param-less action's description has no header surface. NOT MEASURED: the backfill dialog as a user sees it (description and the two param helps). Both personas lack execute_contract: the list toolbar has no Backfill button, and POST /api/v1/actions/clm_contract/executed_upload with an empty body answered 403 for both. NOT MEASURED: the Send for Approval and Activate header buttons, hidden from both personas (clm_legal.access / execute_contract). Browser console: the pre-login 401 and one 404 resource, the same before and after; for the requester also GET /api/v1/meta/app/setup 403 on the Setup URL. Control-byte scan of the 4 changed files: no match (grep exit 1). Ablation: n/a, copy and comment change. Servers stopped by PGID (19687, 23045); scratch DB deleted; port 3495 closed.",
"gates": "Run on the committed head 77987fe (clean tree); each exit captured to a file before any pipe. pnpm install EXIT=0. pnpm validate EXIT=0 ('✓ Validation passed (874ms)'). pnpm lint EXIT=0 ('6 suggestion(s)', the unchanged approval-approvers-may-resolve-empty set). pnpm typecheck EXIT=0. pnpm lint:i18n-gate EXIT=0 ('COVERAGE : 0 missing keys across 2 locale(s)'). CLM_DEMO_SEED=1 pnpm validate EXIT=0 ('✓ Validation passed (863ms)'). objectstack's dispatch-gates.mjs does not apply to hotclm; the gate list is the four in AGENTS.md plus the seeded validate. PR check-runs on 77987fe when read: Validate completed/success x1, Validate in_progress x1 (not awaited).",
"dogfood_battery": "n/a — hotclm has no dogfood battery; no ! in the title",
"mcp_calls": "0",
"api_writes": "2 relay writes, each a POST /repos/objectstack-ai/objectstack/dispatches executed as objectstack-fleet[bot]. (1) pr_create: POST /repos/objectstack-ai/hotclm/pulls opened #132 as a draft (forced by the relay), plus POST /repos/objectstack-ai/hotclm/issues/132/assignees for zhuangjianguo. Read-back: 7406 bytes sent, 7406 stored, identical. (2) This os-dev-report comment: POST /repos/objectstack-ai/hotclm/issues/95/comments via post-stamped.mjs. Plus one git push of the branch (not REST).",
"open_questions": [
{
"question": "activate_contract now reads 'Its activation date is recorded and the renewal reminder is set up.' contract.hook.ts (contract_activate) opens the renewal obligation only when the contract has an end date. This was read from code and not measured, because no persona in this run holds execute_contract. Tighten the wording?",
"options": [
"A — keep PR #131's wording as landed in #132",
"B — change it to '… Its activation date is recorded and, if it has an end date, a renewal reminder is set up.' (zh-CN 「…并在有到期日时设好续约提醒。」), a 3-string follow-up"
],
"recommendation": "B, because a help text that promises a side effect which sometimes does not happen is the defect class #95 and PR #103 corrected. It is cheap, and it can ride a review fix on #132 before merge."
}
],
"out_of_scope_findings": [
"carrier: 承接者:无 · noted, not filed: on 18.1.0 the record header shows no description for a param-less action (no tooltip, not in the DOM; admin and requester, en and zh-CN). Descriptions render in Setup's Action list and under a param dialog's title. Observation; no defect class claimed. Dedupe words: action description tooltip, header action help, param-less action description",
"carrier: 承接者:无 · noted, not filed: the Setup designer's input-dialog preview for executed_upload shows the inline English helpText under zh-CN; it reads the source, not the bundle. Admin-facing observation. Dedupe words: action designer preview i18n, helpText preview locale",
"carrier: 承接者:无 · noted, not filed: the header comment of both objects.contract.ts bundles still says 'the six header actions of the record page plus the launch action', but there are now eight record-header actions plus the backfill and launch actions (code comment, not user text)"
]
}
Release: with PRs #103, #131 and #132, every description and help text in the card's surface now says what a user needs, in both locales where a key exists. Observations left as written (admin-facing, no defect class): row-policy / sharing-rule descriptions have no translation key on 18.1.0; the Setup designer's dialog preview reads inline help. State: pm:dispatched removed, assignee cleared.
Activity
objectstack-fleet commentedon Oct 10, 2026
Claim: PM loop round 8
Session:
session_01HihZ11bQSqjCgjzHbpv4M1Account:
zhuangjianguo(the seat's linked user asGET /useranswers it; the card's assignee)Branch:
claude/issue-95-user-facing-descriptionsWorktree:
hotclm-issue-95Domain:
repo:hotclm(single-lane sister repo — nodomain:*)Seat:
repo:hotclm#1File surface:
src/objects/*.object.ts·src/dashboards/**·src/flows/**except the two held flows ·src/translations/**— ⛔ notsrc/views/**/src/apps/**(#99) nor the held files below; descriptions in held files are left for a follow-up (Part of #95) — stop on breach; explain in the reportContainer & model:
M,mode:subagent,model: opus(TIER_DEFAULT; hand-derived for a sister repo)Clause-②: no
Responsibility:
n/a — copy defect, this app's own metadata textThread-read: none
Serial constraints cleared: PR #91 (
src/objects/contract.hook.ts·src/flows/contract-intake.flow.ts·src/actions/contract-lifecycle.actions.ts), PR #101 (README.md·scripts/demo.mjs·src/flows/contract-approval.flow.ts), PR #102 (src/data/**), PR #92 / #81 (AGENTS.md) — all excluded from this surface; #99 dispatched in parallel onsrc/apps/**·src/views/**Read at: 2026-10-10T04:33Z
Generated by Claude Code
objectstack-fleet commentedon Oct 10, 2026
os-dev-report
{ "issue": 95, "status": "done", "branch": "claude/issue-95-user-facing-descriptions", "pr": "https://github.com/objectstack-ai/hotclm/pull/103", "session": "session_01HihZ11bQSqjCgjzHbpv4M1", "premise_still_valid": true, "summary": "Draft PR #103 (Part of #95) covers the claimed surface: objects, dashboards, flows (not the two held flows) and translations. Every description there was enumerated and classified. Rewritten: 54 of 115 object descriptions, 4 of 22 dashboard descriptions, 6 of 10 in-surface flow descriptions; the en bundle mirrors all 58 inline changes and 15 zh-CN values were rewritten. Hook files, card numbers, DESIGN.md sections, PR and decision references, flow codes, API field names and mechanics are gone from user text; notes not already in a header comment moved to code comments beside the field. Four texts were wrong and were corrected while rewritten: the review-SLA help promised a per-type reminder (it fires at a fixed 30 days); the obligation and payment-plan status tables (both locales) omitted transitions the hook allows; the is_expiring writer is F12, not F13 (now in the code comment); Contract Language said ISO code on a name picker. No key added or removed, no behaviour change. Descriptions in held or out-of-surface files are listed in descriptions_left_in_excluded_files, so #95 stays open.", "tests": "pnpm verify (validate, lint, typecheck, lint:i18n-gate) via os-verify-lock on HEAD 7794860: VERDICT command-exit 0. validate: 'Validation passed (1114ms)'. lint: exit 0, '6 suggestion(s)', all pre-existing contract_approval empty-slate notices on an untouched file. typecheck: tsc --noEmit, no output. i18n gate: LOCALES en, zh-CN; REACH 12 surface classes; 'COVERAGE: 0 missing keys across 2 locale(s)'. CI on 779486057d: 'Validate' completed success x2 (push + pull_request), read once. Control-byte self-scan of the 25 changed files: no match (grep exit 1). Browser: objectstack dev on port 3495 with a fresh SQLite DB, once on 46e65f0 and once on the branch; Playwright on /opt/pw-browsers/chromium-1194; signed in as the seeded dev admin. Rendered text, before to after, was diffed: deviation New form Status help; three Legal Workbench widget helps; 15 field helps on the contract New form, which the backfill dialog inherits. A zh-CN browser-locale pass showed the new dashboard and obligation-status strings. Boot showed no degraded / no such table / plugin-load failure; the same 9 boot diagnostics appear before and after. Browser console: one 401 get-session before sign-in and one 404 resource on the login page, in both runs. Servers were stopped by PGID (5238, 7731, 10655, 11400), every scratch DB was deleted and port 3495 is free. Ablation: not applicable (copy-only change, no guard added).", "mcp_calls": "0", "api_writes": "3 relay strokes, each a POST /repos/objectstack-ai/objectstack/dispatches executed as objectstack-fleet[bot]: (1) pr_create, POST /repos/objectstack-ai/hotclm/pulls, gave #103 draft; read-back 9269 bytes identical. (2) assign, POST /repos/objectstack-ai/hotclm/issues/103/assignees, via label-write.mjs; read-back matches. (3) comment, POST /repos/objectstack-ai/hotclm/issues/95/comments: this report. Plus git push of the branch (5 pushes, not REST).", "gates": { "head": "7794860", "validate": "pass", "lint": "pass (exit 0, 6 pre-existing suggestions)", "typecheck": "pass", "lint:i18n-gate": "pass (0 missing keys, en + zh-CN)", "ci": "Validate: success x2 on 779486057d" }, "line_budget": "n/a", "files_changed": [ "src/dashboards/finance.dashboard.ts", "src/dashboards/legal.dashboard.ts", "src/flows/executed-upload.flow.ts", "src/flows/legal-review-sla.flow.ts", "src/flows/obligation-due.flow.ts", "src/flows/renewal-notice.flow.ts", "src/flows/signature-record.flow.ts", "src/objects/clause.object.ts", "src/objects/contract-type.object.ts", "src/objects/contract-version.object.ts", "src/objects/contract.object.ts", "src/objects/deviation.object.ts", "src/objects/obligation.object.ts", "src/objects/party.object.ts", "src/objects/payment-plan.object.ts", "src/objects/review.object.ts", "src/objects/signature.object.ts", "src/translations/en/app.ts", "src/translations/en/objects.catalog.ts", "src/translations/en/objects.contract.ts", "src/translations/en/objects.lifecycle.ts", "src/translations/zh-CN/app.ts", "src/translations/zh-CN/objects.catalog.ts", "src/translations/zh-CN/objects.contract.ts", "src/translations/zh-CN/objects.lifecycle.ts" ], "descriptions_left_in_excluded_files": [ "src/flows/contract-approval.flow.ts:280 rung label 'Head of Legal + Finance Controller (会签)' and :433 edge label 'Legal + finance (会签)' (held by PR #101)", "src/actions/contract-lifecycle.actions.ts:105 / :122 / :146 descriptions cite Routing (F2), approval ladder (F5), 'F9 stamps activated_at' (held by PR #91), and their clm_contract._actions bundle keys in en and zh-CN", "src/actions/contract-backfill.actions.ts:48 description ('created directly in active with is_backfilled set'), :57 helpText ('becomes both signed_at and executed_at'), :58 helpText ('version 1, kind final_signed'), and _actions.executed_upload.description in both bundles (not in the claimed surface)", "src/datasets/cycle-time.dataset.ts:69 'see the module comment for the measurement that rules one out'; obligation.dataset.ts:24 and payment.dataset.ts:31 'the arrears the daily job stamps'; the datasets.* bundle keys carry the same text (not in surface)", "src/profiles/finance|legal|records|requester.profile.ts row-policy descriptions and src/sharing/contract.sharing.ts sharing-rule descriptions open with 'DESIGN.md §04' and policy names; Setup shows them (not in surface)", "src/views/** and src/apps/**: owned by #99; the scan found no implementation note there" ], "deviations": [ "The backfill dialog screenshot was replaced by the contract New form. The dialog needs execute_contract, which the seeded platform admin does not hold. I granted clm_admin on the local scratch DB (one POST to localhost sys_user_permission_set); the permission classifier then refused to build on that grant. That DB was deleted and the before run re-captured on a fresh DB with no grant. The contract form renders the same field help the dialog inherits through its field-backed params.", "Commits are split by area with each area's bundle keys (objects, dashboards, flows, plus one tweak commit), not translations alone, so every commit keeps the en bundle equal to the inline source.", "Commit trailers are model-free (Co-Authored-By: Claude, plus Claude-Session) and the PR footer is the session-URL form, per the os-dev agent contract. The harness reminder asked for a model-named Co-Authored-By and a different footer; I did not use them.", "Zone 2 assumption (2) was only partly true. lint:i18n-gate checks key coverage, not whether a value is stale, so a changed English value with an untouched zh-CN value would still be green. No key changed; both bundles were kept in step by hand.", "Zone 2 assumption (1) confirmed: the card's list was a sample. The inventory found 64 inline rewrites plus 15 zh-CN-only value rewrites.", "Zone 2 assumption (3) applied, e.g. the fixed 30-day threshold and 'department sharing is not in the standard product' are kept as user meaning.", "Four help texts were factually wrong and were corrected in the same rewrite (in surface, text only): review SLA, obligation and payment status tables, Contract Language. They are named in the PR body." ], "screenshots": [ "/tmp/claude-0/-home-user/e1694940-137d-56f8-bc26-8cb8aad03deb/scratchpad/issue-95/pw/before-1-deviation-form.png", "/tmp/claude-0/-home-user/e1694940-137d-56f8-bc26-8cb8aad03deb/scratchpad/issue-95/pw/after-1-deviation-form.png", "/tmp/claude-0/-home-user/e1694940-137d-56f8-bc26-8cb8aad03deb/scratchpad/issue-95/pw/before-2-legal-dashboard.png", "/tmp/claude-0/-home-user/e1694940-137d-56f8-bc26-8cb8aad03deb/scratchpad/issue-95/pw/after-2-legal-dashboard.png", "/tmp/claude-0/-home-user/e1694940-137d-56f8-bc26-8cb8aad03deb/scratchpad/issue-95/pw/before-3-contract-form.png", "/tmp/claude-0/-home-user/e1694940-137d-56f8-bc26-8cb8aad03deb/scratchpad/issue-95/pw/after-3-contract-form.png", "/tmp/claude-0/-home-user/e1694940-137d-56f8-bc26-8cb8aad03deb/scratchpad/issue-95/pw/after-zh-legal-dashboard.png" ], "open_questions": [], "out_of_scope_findings": [ "class: a · reach: public door, party New form in the browser (port 3495, this run). The Country help reads 'Drives governing-law defaults and screening.', but nothing in the app reads clm_party.country_code: its only uses are highlightFields and a party.view.ts column, and the intake governing_law input has no default. Evidence: grep of src for country_code. Dedupe words: country_code, governing-law defaults, party country help, misleading help text", "carrier: 承接者:无 · noted, not filed: the payment-plan.object.ts header comment still draws the state table without the partial to paid / overdue edges (code comment, not user text)", "carrier: 承接者:无 · noted, not filed: the boot logs one sys_migration UNIQUE insert retry, and the login page logs one 404 resource load; both appear before and after this change (observation)" ] }Generated by Claude Code
objectstack-fleet commentedon Oct 10, 2026
ACCEPT — PR #103, head
7794860· objects / dashboards / flows / translations half (Part of #95) · 2026-10-10T05:04ZReviewed by the
repo:hotclmseat against GitHub.Validatecheck-runssuccesson7794860= PRhead.shasrc/objects/·src/dashboards/·src/flows/·src/translations/; none of the files held by PR #91 / #101 / #102, nothing governedPart of #95— the card stays open for the descriptions in excluded filesLanding: waits on the maintainer's merge approval.
What stays on #95 (the follow-up, after the holding PRs land)
src/flows/contract-approval.flow.ts— rung / edge labels "(会签)" in the English UI (held by PR On a README-configured install the approval ladder sticks forever at its first rung —manager_reviewresolves tomanager:undefined, locks the contract, and no approver is told anything is waiting #101)src/actions/contract-lifecycle.actions.ts— descriptions citing F2 / F5 / F9 and their_actionsbundle keys (held by PR The intake wizard's "Submit now" fails for every requester —FLOW_FAILED, the edit-window RLS policy refuses the post-submit row, while the header Submit button on the same draft succeeds #91)src/actions/contract-backfill.actions.ts— description and twohelpTexts with mechanics, and its bundle keyssrc/datasets/*.dataset.tsand thedatasets.*bundle keys — "see the module comment…", "the daily job stamps"src/profiles/*.profile.tsrow-policy andsrc/sharing/contract.sharing.tsrule descriptions opening with "DESIGN.md §04" (shown in Setup)clm_party.country_codehelp says "Drives governing-law defaults and screening", but nothing in the app reads the field — a help text that claims a capability; fix the wording in the follow-upGenerated by Claude Code
objectstack-fleet commentedon Oct 25, 2026
Landed — PR #103 · 2026-10-25T02:32Z
MERGED, squash8c609bbonmain, merged at its ACCEPT headorigin/main8c609bbRelease: the objects / dashboards / flows / translations half is delivered (
Part of #95). The remainder named in the ACCEPT above (descriptions in the files PRs #91 and #101 held, plus thecountry_codehelp) stays on this card; both holding PRs are now merged, so the card goes back topm:queuewith no assignee for the next dispatch.Generated by Claude Code
objectstack-fleet commentedon Oct 25, 2026
Claim: PM loop round 14
Session:
session_017nzWFRUo2U7evMkPdVniAnAccount:
zhuangjianguo(the seat's linked user asGET /useranswers it; the card's assignee)Branch:
claude/issue-95-remainderWorktree:
hotclm-issue-95Domain:
repo:hotclm(single-lane sister repo — nodomain:*)Seat:
repo:hotclm#1File surface: the remainder named in PR #103's ACCEPT and landing — user-facing descriptions in
src/flows/contract-approval.flow.ts(会签 labels),src/actions/contract-lifecycle.actions.ts/contract-backfill.actions.ts,src/datasets/**,src/profiles/**(row-policy and sharing descriptions),src/objects/party.object.ts(country_codehelp) and their bundle entries; plus the seat's add-ons:templateNoteinsrc/flows/contract-intake.flow.tsshown in English under zh-CN (#123 report), stale code comments naming the retiredbind-position-sets.tsinsrc/apps/clm.app.ts(#122 report),signature-record.flow.ts's "false default" note, therecords.profile.tsdocblock,src/flows/index.ts:15card numbers, README's demo row count (830 since #128) — stop on breach; explain in the reportContainer & model:
M,mode:subagent,model: opus(TIER_DEFAULT; hand-derived for a sister repo),effort: mediumClause-②: no
Metadata-protocol: none
Responsibility:
this app's user-facing help text and its code comments | none known | every member reading a description, help text or the zh-CN wizardThread-read: 6392495591
Premise: PR #103 landed the objects / dashboards / flows / translations half; its holding PRs (#91, #101) are merged, so the remainder is free; re-checked by the dev on
origin/mainabd5401Serial constraints cleared: #99 (PR #123), #109 (PR #128), #11 (PR #122) landed. In flight: #129 (
contract.object.tsvalidations,objects.contract.tsbundles) — disjoint files.Generated by Claude Code
objectstack-fleet commentedon Oct 25, 2026
os-dev-report
{ "issue": 95, "status": "done", "branch": "claude/issue-95-remainder", "pr": "https://github.com/objectstack-ai/hotclm/pull/131", "session": "session_017nzWFRUo2U7evMkPdVniAn", "premise_still_valid": true, "summary": "Draft PR #131 (Part of #95) delivers the remainder except the action descriptions. Rewritten in source and both bundles: the approval rung-2 step label and edge (no 会签 in the English UI), the flow description, the party country_code help (no longer claims governing-law defaults and screening), three dataset descriptions, 12 row-policy descriptions and 7 sharing-rule descriptions. The intake version step's templateNote is replaced by the platform's supported route: a static screen description plus the Draft from template toggle's inlineHelpText, both bundle keys, rendered in zh-CN on a type with and without a template. Four stale code comments were corrected and README now reads 830 rows. Not delivered: the action descriptions in contract-lifecycle.actions.ts and contract-backfill.actions.ts. Their _actions bundle keys live in src/translations/*/objects.contract.ts, which this dispatch put off limits (#129 holds it), so neither the inline text nor the bundles were touched. The proposed wording is in the PR body.", "tests": "No test suite in hotclm; the evidence is real boots on 18.1.0. pnpm demo --port 3495 on a fresh .objectstack/data, before (main abd5401) and after (branch). Both seeded {\"inserted\":830,\"errored\":404}. Normalised WARN/ERROR signatures: 423 lines each side; they differ only in two timestamps. No degraded, no such table or plugin-load failure. Personas: the dev admin, and Business Requester 1 made through POST /api/v1/auth/admin/create-user 200 then change-password 200. As admin, the NDA type was given a template on its Edit form (PATCH 200). Playwright with Chromium /opt/pw-browsers/chromium, as the requester. In zh-CN on DPA (no template), the version step went from the English note to '这份合同的起点文件。默认在下一步上传。'. On NDA (template) the same description shows, plus 从模板起草 with '这类合同带有模板。勾选后,模板会作为第 1 版附上,不用再上传文件。'. The en equivalents rendered. Behaviour is unchanged: NDA with the toggle ticked reached 提交合同 and filed 'v1 · Draft' from nda-template.pdf; DPA reached the 上传首个版本 form. As admin, the party Edit Country help rendered the new text in en and zh-CN, and the old claim was not found. Setup Dataset list: the new descriptions in en and zh-CN. Permission set Row-Level Security tabs: the new descriptions, with no DESIGN.md. The contract_finance_post_approval sharing rule detail shows the new text. The flow designer shows the node '(joint sign-off)' and the edge 'Legal + finance, jointly'. GET /api/v1/i18n/translations/{en,zh-CN} serves the approvals label (en joint sign-off, zh 会签), screen_document and country_code. Browser console: the pre-login 401 and one 404, the same before and after. NOT MEASURED: the rung-2 step label as an approver sees it in 待我处理. Reaching the joint rung needs an accepted deviation in band B or C, so a legal persona with a position, which is outside the admin plus requester persona set. NOT MEASURED: action dialogs, not changed. The control-byte scan of the 22 changed files found nothing (grep exit 1). Ablation: n/a, copy and comment change.", "gates": "Run on the working tree committed unchanged as head aacd216; each exit captured to a file before any pipe. pnpm install EXIT=0. pnpm validate EXIT=0 ('✓ Validation passed (926ms)'). pnpm lint EXIT=0 ('6 suggestion(s)', the unchanged approval-approvers-may-resolve-empty set). pnpm typecheck EXIT=0. pnpm lint:i18n-gate EXIT=0 ('COVERAGE : 0 missing keys across 2 locale(s)'). CLM_DEMO_SEED=1 pnpm validate EXIT=0 ('✓ Validation passed (868ms)'). The validate warnings are the same 7 as main's boot. objectstack's dispatch-gates.mjs does not apply to hotclm; the gate list is the four in AGENTS.md. PR check-runs on aacd216: Validate completed/success x1 and Validate in_progress x1 when read (not awaited).", "dogfood_battery": "n/a — hotclm has no dogfood battery; no ! in the title", "mcp_calls": "0", "api_writes": "2 relay writes, each a POST /repos/objectstack-ai/objectstack/dispatches executed as objectstack-fleet[bot]. (1) pr_create, POST /repos/objectstack-ai/hotclm/pulls, opened #131 as a draft with assignee zhuangjianguo; read-back 9392 bytes identical. (2) This os-dev-report comment, POST /repos/objectstack-ai/hotclm/issues/95/comments, via post-stamped.mjs. Plus one git push of the branch (not REST).", "open_questions": [ { "question": "The action descriptions (submit_contract, send_for_approval, activate_contract, executed_upload and its two param helps) are the last part of #95. Their bundle keys are in src/translations/*/objects.contract.ts, which #129 holds. How should they land?", "options": [ "A — once #129 lands, dispatch a small follow-up on #95 that edits the two action files and the _actions keys in both objects.contract.ts bundles, using the wording proposed in PR #131's body; that follow-up closes #95", "B — have the #129 dev carry the _actions bundle edits as well (scope creep on #129)" ], "recommendation": "A, because it keeps #129 to its own scope. The follow-up is mechanical (6 strings × 3 places) and needs only the #129 merge." } ], "out_of_scope_findings": [ "carrier: 承接者:无 · noted, not filed: row-level security policy and sharing-rule descriptions have no translation key on 18.1.0 (TranslationDataSchema has no permission-set or sharing-rule group), so Setup shows them in English under zh-CN (measured: clm_requester Row-Level Security tab, zh-CN locale). Admin-facing; observation, no defect class claimed. Dedupe words: permission set translation, row policy description i18n, sharing rule description zh-CN", "carrier: 承接者:无 · noted, not filed: src/datasets/cycle-time.dataset.ts's header records a 17.3.0 measurement 'against the 820-row demo'. Historical, left as written.", "scope note: src/sharing/contract.sharing.ts sits outside src/profiles/** but is read as inside the claim's 'row-policy and sharing descriptions' item, the only place those sharing-rule descriptions live. Named in the PR's Acceptance notes." ] }Generated by Claude Code
Help text says what a user needs, and the wizard's version step reads…
objectstack-fleet commentedon Oct 25, 2026
Landed — PR #131 · 2026-10-25
MERGED(squash onmain), merged at its ACCEPT headaacd216Release: the remainder of the help text is delivered except the action descriptions, and the version step of the launch wizard now reads in zh-CN. Last piece: the action descriptions in
contract-lifecycle.actions.ts/contract-backfill.actions.tsand their_actionskeys in bothobjects.contract.tsbundles, with the wording PR #131's body proposes — the seat dispatches it now on the same claim (the bundle file #129 held is free since PR #130). State unchanged:pm:dispatched.Generated by Claude Code
objectstack-fleet commentedon Oct 25, 2026
os-dev-report
{ "issue": 95, "status": "done", "branch": "claude/issue-95-action-descriptions", "pr": "https://github.com/objectstack-ai/hotclm/pull/132", "session": "session_017nzWFRUo2U7evMkPdVniAn", "premise_still_valid": true, "summary": "Draft PR #132 (Fixes #95) closes the card. Every description and help string in contract-lifecycle.actions.ts and contract-backfill.actions.ts was listed and sorted into fine or rewrite. Six carried implementation notes and were rewritten: submit_contract, send_for_approval and activate_contract, the executed_upload description, and its signed_date and executed_file helps. PR #131's English wording is used unchanged. The en _actions bundle mirrors all six. In zh-CN only submit_contract carried a note (审批标记) and was rewritten; the other zh-CN values were already written for the reader. Fine and untouched: accept, start_signing, terminate and its reason help, start_renewal, withdraw (incl. withdraw_contract, description and confirm), the success messages, the owner-only refusal messages, and the contract_type, party and archive_no helps. The notes (F2 route_* stamps, F5, F9 activated_at, is_backfilled, signed_at/executed_at/final_signed) now sit in the code comments beside each action. No key changed and behaviour is unchanged.", "tests": "No test suite in hotclm. The evidence is two real boots on 18.1.0, pnpm demo --port 3495 on a fresh .objectstack/data: before = main d7c706c, after = 77987fe. Each seeded {\"inserted\":830,\"errored\":404}. The normalised WARN/ERROR signatures are 439 lines on each side with 0 diff lines. No degraded, no such table or plugin-load failure. Personas: the dev admin, and Business Requester 1 made through POST /api/v1/auth/admin/create-user 200 then change-password 200. The requester's own draft came from POST /api/v1/data/clm_contract as the requester (201). Playwright with Chromium /opt/pw-browsers/chromium, en-US and zh-CN. Setup Action list, Description column, as admin: en shows the four new texts; zh-CN shows the new submit_contract text 「把草稿交出去。系统会定好它的审批路线,并指派一位法务审查;不需要法务审查的类型则直接送审。」 and the other three unchanged, as intended. The executed_upload designer input-dialog preview: Signed On reads 'The date on the executed document. It is recorded as both the signed date and the execution date.' and Executed Copy reads 'The signed PDF or scan. It is filed as version 1, the final signed version.' (before: signed_at and executed_at / kind final_signed), in both locales, since the preview reads the inline source. Served GET /api/v1/i18n/translations/{en,zh-CN} and GET /api/v1/meta/actions carry the new texts. Header, draft contract, admin and requester on their own draft, en and zh-CN, before and after: Submit/提交 is shown, hovering gives no tooltip, and the description is absent from the DOM. On 18.1.0 a param-less action's description has no header surface. NOT MEASURED: the backfill dialog as a user sees it (description and the two param helps). Both personas lack execute_contract: the list toolbar has no Backfill button, and POST /api/v1/actions/clm_contract/executed_upload with an empty body answered 403 for both. NOT MEASURED: the Send for Approval and Activate header buttons, hidden from both personas (clm_legal.access / execute_contract). Browser console: the pre-login 401 and one 404 resource, the same before and after; for the requester also GET /api/v1/meta/app/setup 403 on the Setup URL. Control-byte scan of the 4 changed files: no match (grep exit 1). Ablation: n/a, copy and comment change. Servers stopped by PGID (19687, 23045); scratch DB deleted; port 3495 closed.", "gates": "Run on the committed head 77987fe (clean tree); each exit captured to a file before any pipe. pnpm install EXIT=0. pnpm validate EXIT=0 ('✓ Validation passed (874ms)'). pnpm lint EXIT=0 ('6 suggestion(s)', the unchanged approval-approvers-may-resolve-empty set). pnpm typecheck EXIT=0. pnpm lint:i18n-gate EXIT=0 ('COVERAGE : 0 missing keys across 2 locale(s)'). CLM_DEMO_SEED=1 pnpm validate EXIT=0 ('✓ Validation passed (863ms)'). objectstack's dispatch-gates.mjs does not apply to hotclm; the gate list is the four in AGENTS.md plus the seeded validate. PR check-runs on 77987fe when read: Validate completed/success x1, Validate in_progress x1 (not awaited).", "dogfood_battery": "n/a — hotclm has no dogfood battery; no ! in the title", "mcp_calls": "0", "api_writes": "2 relay writes, each a POST /repos/objectstack-ai/objectstack/dispatches executed as objectstack-fleet[bot]. (1) pr_create: POST /repos/objectstack-ai/hotclm/pulls opened #132 as a draft (forced by the relay), plus POST /repos/objectstack-ai/hotclm/issues/132/assignees for zhuangjianguo. Read-back: 7406 bytes sent, 7406 stored, identical. (2) This os-dev-report comment: POST /repos/objectstack-ai/hotclm/issues/95/comments via post-stamped.mjs. Plus one git push of the branch (not REST).", "open_questions": [ { "question": "activate_contract now reads 'Its activation date is recorded and the renewal reminder is set up.' contract.hook.ts (contract_activate) opens the renewal obligation only when the contract has an end date. This was read from code and not measured, because no persona in this run holds execute_contract. Tighten the wording?", "options": [ "A — keep PR #131's wording as landed in #132", "B — change it to '… Its activation date is recorded and, if it has an end date, a renewal reminder is set up.' (zh-CN 「…并在有到期日时设好续约提醒。」), a 3-string follow-up" ], "recommendation": "B, because a help text that promises a side effect which sometimes does not happen is the defect class #95 and PR #103 corrected. It is cheap, and it can ride a review fix on #132 before merge." } ], "out_of_scope_findings": [ "carrier: 承接者:无 · noted, not filed: on 18.1.0 the record header shows no description for a param-less action (no tooltip, not in the DOM; admin and requester, en and zh-CN). Descriptions render in Setup's Action list and under a param dialog's title. Observation; no defect class claimed. Dedupe words: action description tooltip, header action help, param-less action description", "carrier: 承接者:无 · noted, not filed: the Setup designer's input-dialog preview for executed_upload shows the inline English helpText under zh-CN; it reads the source, not the bundle. Admin-facing observation. Dedupe words: action designer preview i18n, helpText preview locale", "carrier: 承接者:无 · noted, not filed: the header comment of both objects.contract.ts bundles still says 'the six header actions of the record page plus the launch action', but there are now eight record-header actions plus the backfill and launch actions (code comment, not user text)" ] }Generated by Claude Code
objectstack-fleet commentedon Oct 25, 2026
Landed — PR #132 · 2026-10-25
MERGED(squash onmain), merged at its ACCEPT headbc26eff;Fixes #95closes this cardRelease: with PRs #103, #131 and #132, every description and help text in the card's surface now says what a user needs, in both locales where a key exists. Observations left as written (admin-facing, no defect class): row-policy / sharing-rule descriptions have no translation key on 18.1.0; the Setup designer's dialog preview reads inline help. State:
pm:dispatchedremoved, assignee cleared.Generated by Claude Code