Repository navigation
Description
维护者速读
- 事由: 管理员界面的文案让管理员去调 REST 接口:短信「发送测试」说「在请求体里传 to」,克隆自动化后的提示说「把完整定义 PUT 到 /api/v1/automation/」。
- 要做: 管理员文案里不出现接口路径。克隆提示这一半原定并入 console: Packaged Automation's clone result offers no way to switch the source flow off, though the clone runs beside it and the sharing-rule clone dialog offers one objectui#13270,但那张卡已关闭且保留了服务端原文,文案在本仓 runtime,一并在本卡处理。
- 完成标准: 两处文案不再含接口或请求体说明。
Filing gate ③ a task the maintainer set: the maintainer's ruling on objectstack-ai/hotcrm#2194, recorded there at 6354968262 (the director seat, posting from the maintainer's account): 「25251 B hotcrm B」, 2026-10-23T01:05:47Z. That is letter B for all three rounds, exactly as the seat recommended, and it adopts R2-T2-U07 (the SMS half; the clone-notice half was folded into objectstack-ai/objectui#13270, which closed completed before the ruling with the notice kept verbatim, and the notice text is this repo's, so it rides here too: see Why). Filed by the repo:hotcrm seat 1 (os-elon-musk, session session_014xanhPEmGTMTfVH4UokwJT) under objectstack-ai/hotcrm#2194's After the ruling. ⛔ Not a claim.
Grade: triage's. The seat suggests priority:p3: an adopted suggestion with a measured cost on an existing surface, no wrong data and no contract change.
Reader (who acts): objectstack triage routes and grades it. The landing below is the seat's reading of origin/main; paths under src/ are HotCRM's (objectstack-ai/hotcrm).
Governing text
- The ruling above. Per [Decision] Which of the 33 UI and UX suggestions from the 2026-10-20 browser passes to adopt (seat: adopt 23, fold 4 into open cards, defer 6) hotcrm#2194's own governing text, this item is an adopted suggestion through filing gate ②, not a defect card, and a platform or console landing is changed there, never re-implemented in HotCRM: 「平台相关的功能,应该尽量先改平台。」 (maintainer, 2026-10-18, ledger
6245607810).
Why (measured)
- Pages / persona: Setup → SMS Delivery (Send test) and Setup → Packaged Automation (Clone), the system administrator.
- Now (18.0.0): "otherwise pass "to" in the request body", and "send its complete definition with
status: 'obsolete'toPUT /api/v1/automation/<name>. The activation toggle (POST /api/v1/automation/<name>/toggle) switches packaged flows only and refuses the clone." - Cost: two new instances of developer copy since the round 1 pass (T2-U02 / T2-U07).
- Evidence: objectstack-ai/hotcrm round 2 track 2 report, UI and UX suggestions, U-07;
23-config-settings-sms.png,03-F01-packaged-automation-clone-runs-beside-original.png. - The clone half's carrier: console: Packaged Automation's clone result offers no way to switch the source flow off, though the clone runs beside it and the sharing-rule clone dialog offers one objectui#13270 landed (PR fix(app-shell): offer switch-source-off and open-in-Studio on the packaged flow clone result objectui#13279, closed 2026-10-20T18:56Z) a Switch "…" off action beside the notice and kept the server's notice verbatim, so the REST sentence still shows.
Landing
Read on objectstack origin/main 7b047b44:
packages/services/service-sms/src/sms-plugin.ts~:102, ~:115, ~:124: "Pass "to" in the request body …" in the Send test answers.packages/runtime/src/flow-clone.ts~:183–185: the clone notice's REST recipe.packages/client/src/index.ts~:5698 documents the same for SDK callers, which stays (it is developer copy).- Where the admin needs a control instead of the recipe, it exists: the console's Switch off (console: Packaged Automation's clone result offers no way to switch the source flow off, though the clone runs beside it and the sharing-rule clone dialog offers one objectui#13270) for the clone, and Setup → Email and SMS: Send test has nowhere to enter a recipient, and Email saves with its required fields empty #24767's recipient field for the SMS test.
Done when
- The SMS Send test answers and the clone notice served to the console contain no endpoint path and no request-body instruction; each names the control the admin uses instead.
- The REST detail stays where developers read it (the client TSDoc, the API docs).
- Pins on both strings.
Size: S.
Dedupe
Method: every open objectstack-ai/objectstack issue (108) and every issue updated since 2026-10-19 (544, any state), listed through the repo-scoped issues endpoint (paged) at 2026-10-23T01:20Z and matched case-insensitively on their titles. Words: sms, clone, request body, admin copy. 4 hits, all closed: #24983, #24924 (notification-template channels), #24767 (the SMS recipient field) and #24359 (unrelated). Not on point. New.
Generated by Claude Code
Activity
objectstack-fleet commentedon Oct 23, 2026
Claim: PM loop round 1 ·
domain:servicesseat 1 (seat post #6021, project run by the Sales account) · S mechanical card, in-seat subagent · 2026-10-23T11:40ZSession:
session_016g7nYP9wdNx1GDa5XDr7UyAccount:
os-sales(the seat's linked user asGET /useranswers it; the card's assignee)Branch:
claude/issue-25345-admin-copy-endpointsWorktree:
objectstack-issue-25345Domain:
domain:servicesSeat:
domain:services#1File surface:
packages/services/service-sms/src/(the Send test answers, ~:102/:115/:124) andpackages/runtime/src/flow-clone.ts(the clone notice, ~:183–185), plus their tests and a changeset.packages/client/src/index.tsTSDoc stays (developer copy). Stop on breach; explain in the report.Container & model:
S 级机械卡,mode:subagent(general-purpose subagent loading.claude/agents/os-dev.mdas its role file; this thread has noos-devagent type),model: default tier(dispatch-gates.mjs --tier: "no path-derived mandate"),effort: mediumClause-②: no
Metadata-protocol: none
Responsibility: n/a — not a defect card (adopted suggestion, filing gate ③ on hotcrm#2194's ruling)
Thread-read: none
Serial constraints cleared: no open claim or PR declares
service-sms/srcorruntime/src/flow-clone.ts; no same-day merge on either path (git log origin/main --since=2026-10-23empty).Resume-from: none
objectstack-fleet commentedon Oct 23, 2026
os-dev-report
{ "issue": 25345, "status": "done", "branch": "claude/issue-25345-admin-copy-endpoints", "pr": "https://github.com/objectstack-ai/objectstack/pull/25421", "session": "session_016g7nYP9wdNx1GDa5XDr7Uy", "premise_still_valid": true, "summary": "The four Send test SMS recipient refusals (service-sms resolveSmsTestRecipient) no longer say to pass \"to\" in the request body. They now name what the admin does on the page: press Send test SMS while signed in as an admin whose account has a phone number, or press it again once the account can be read. The `to` override is documented in the TSDoc only. FLOW_CLONE_NOTICE (runtime flow-clone.ts) drops the PUT and toggle endpoint recipe. It now names the Packaged automation page's Switch \"…\" off action for a packaged original (it covers packaged flows only and does not reach the clone), and Studio's Enabled switch plus a publish for the clone. The client automation.toggle TSDoc is unchanged. Mechanism assumption corrected: the dispatch named 'the SMS settings' test recipient field (#24767)', but no such field exists on origin/main 830a63a680. smsSettingsManifest declares none, and #24848 fixed #24767 by sending to the signed-in admin's own sys_user.phone_number. So the copy names the controls that do exist. Adding a field is a service-settings manifest change, outside this claim. The clone controls were read from objectui main 2c4e5f5afd (PackagedAutomationPage.tsx; the Switch \"{{label}}\" off button switches the packaged SOURCE, and the Studio flow switch writes status obsolete). Deviation: the brief's commit trailer `Co-Authored-By: Claude Opus 5.5 (1M context)` was refused by the pre-push check:commit-card-trailers hook (AGENTS.md: the pair is model-free). The unpublished commit was amended to the model-free `Co-authored-by: Claude` trailer with the noreply address plus the Claude-Session line, with no override used. The PR body ends with the brief's exact two footer lines.", "tests": "head f57343bda5. Build: pnpm --workspace-concurrency=2 --filter '@objectstack/service-sms^...' --filter '@objectstack/runtime^...' build, under the lock: VERDICT command-exit 0. pnpm --filter @objectstack/service-sms test: Test Files 7 passed (7), Tests 107 passed (107); pnpm --filter @objectstack/service-sms typecheck: exit 0. pnpm --filter @objectstack/runtime typecheck: exit 0 (check:test-typecheck OK). pnpm --filter @objectstack/runtime test: Test Files 438 passed (438), Tests 7023 passed | 19 skipped (7042), VERDICT command-exit 0. New pins: automation-flow-clone.test.ts (new-wording asserts, plus notice === FLOW_CLONE_NOTICE with no /api/, no 'request body', no PUT/POST) and sms-test-recipient.pin.test.ts (served route: no phone, failed read, no engine; in-process: no user; each asserts its opening sentence and remedy, 'nothing was sent', 'Send test SMS', and no /api/, 'request body' or 'pass \"to\"'). No ablation: only message text and its pins changed. test:repo was not run locally and is declared to CI.", "gates": "dispatch-gates.mjs --commands: 69 derived. Each was run with its exit captured before any pipe: 68 exit 0, including check:doc-authoring, check:issue-citations, check:nul-bytes, the changeset gates, check:route-ledger-census, and query-options-erasure, slot-lookup and type-check-debt re-run without the 150 s cap. check:dual-build-cjs-loads exited 3 (PREREQUISITE NOT MET, needs a full-repo dist) and is NOT MEASURED locally. --ran reconciliation: 69 accounted, 68 run, 1 NOT-MEASURED, exit 0. PR check-runs on f57343bda5 at report time: 'No other open PR may claim the same issue' success; Check Changeset, Governed Surface Queue Guard, Lint (ESLint, PM dispatch-gates, docs & code guards, repo & tooling, CI/release/engine, scoped x3), Type Check (workspace, source, consumer, debt ledger) and the claim checks all in_progress; the two opt-in jobs skipped. Test Core and Build Core had not been listed yet.", "dogfood_battery": "n/a — no `!` in the PR title and no (narrowing) arm", "mcp_calls": "0", "api_writes": "2 relay strokes. (1) fleet-write pr_create: POST /repos/objectstack-ai/objectstack/pulls as a draft, plus the assignee POST /issues/25421/assignees (os-sales), run 39956650773, success, the body read back byte-identical. (2) post-stamped.mjs: POST /repos/objectstack-ai/objectstack/issues/25345/comments, this report. git push is direct and was not counted.", "open_questions": [], "out_of_scope_findings": [ "class: a (misleading admin copy, same family as this card) · reach: Setup → Email, Send test email; the plugin-email mail/test refusals at packages/plugins/plugin-email/src/email-plugin.ts around lines 196, 209 and 216 say 'pass \"to\" in the request body' / 'Add an email address to your account, or pass \"to\" in the request body', and the mail settings page has no recipient field either (same producer shape as #24848) · evidence: git grep 'in the request body' on origin/main 830a63a680 · dedupe words: send test email, request body, admin copy, mail/test recipient", "carrier: none · noted, not filed: the existing .changeset/24767-settings-test-send-recipient.md tells readers that on deployments without phone sign-in 'Send test SMS' still needs a `to` in the request body. That is developer-facing changeset text, release-owned once consumed, and it was left untouched." ] }objectstack-fleet commentedon Oct 23, 2026
Landed ·
domain:servicesseat 1 (seat post #6021) ·os-sales·session_016g7nYP9wdNx1GDa5XDr7Uy· 2026-10-23T14:09Z6365789931; one re-queue after a runner Checkout failure, stand-down note on the PR), headf57343bda5origin/main2b7c331537State: the card was closed by
Fixes #25345.pm:dispatchedis off and the assignee is cleared.Generated by Claude Code