Repository navigation
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 #13270
Description
Filing gate ③ a task the maintainer set: objectstack-ai/hotcrm#2207, the maintainer's browser round on ObjectStack 18.0.0 (「hotcrm 升级到 objectstack 18.0 然后重新安排一轮浏览器测试」). Each defect gets its own card, by the maintainer's ruling 「按照按照具体的issue单独提交卡片,不受数量限制。」 (recorded on objectstack-ai/hotcrm#2188, 6283467378). This is finding F-01 of track 2 (the Setup pass as the system administrator), by the cloud tester session_01BkRPwuAufrFwoEEfuigDm9. It was measured on HotCRM main 16c28664 with @objectstack/* 18.0.0 (framework 06cab4849, console objectui 616df6598b42), in Chromium at 1440×900 on a locally booted, seeded install. The evidence is on the branch claude/qa-v18-setup-pass at 4d7cc467d (REPORT.md), which is never merged. Filed by the repo:hotcrm seat 2 (os-support-ai, session session_01KqkTQNLcxVc588eZpJmp1r). ⛔ Not a claim. Grade: triage's.
Reader (who acts): objectui triage routes it. The behaviour of the clone itself is objectstack's declared design and is not what this card asks to change.
The finding, as measured
- Persona / URL: dev admin, Setup → Apps → Packaged Automation (
/_console/apps/com.objectstack.setup/component/automation/packaged). - Steps:
- On
contact_welcome(record-change, contact created), Clone → nameqa_contact_welcome_copy→200 POST /api/v1/automation/contact_welcome/clone. - Create one contact.
- On
- Actual:
- One contact produced 2
contact_welcomenotifications: the original and the clone both ran. - The page shows the server's notice and no action. The notice's only instruction is a REST call: "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."
- One contact produced 2
- Expected (the product's own sibling): Declared Sharing Rules' Clone result says "The declared rule … still grants access until you switch it off" and offers a Switch "…" off button (
16-access-declared-sharing-rules-cloned.png). - Evidence:
03-F01-packaged-automation-clone-runs-beside-original.png. - Reach: every admin who customises a packaged record-change or schedule flow by cloning it. Until they find another door, each record runs the business logic twice.
Seat review (source at the tested pins)
- By design, not this card:
- The clone is created
draft, which stays bound to its trigger (objectstackpackages/runtime/src/flow-clone.ts:97-112,FLOW_CLONE_STATUS = 'draft'). - The notice says so (
flow-clone.ts:177-185). - ADR-0126 (
docs/adr/0126-packaged-metadata-customization-model.md:338): "Clone and disable are independent primitives". - The page lists packaged flows only (
objectuipackages/app-shell/src/views/setup/PackagedAutomationPage.tsx:373), and the toggle is the packaged-flow ledger (objectstack#20726).
- The clone is created
- The defect: after a successful clone,
PackagedAutomationPage.tsx:429renderscloneResult.noticeas text and nothing else. The siblingSharingRuleCloneDialog.tsx:176offersSwitch "{source}" offat the same moment. - Other doors exist but are not offered:
- The original's own switch is on the same table.
- By source only (not verified in a browser), Studio's package-less scope
/studio/~org/automations(objectui#11553, in the pin) lists the clone, with an enable switch. - The Setup page links to neither.
- Narrowest statement: the clone result on Packaged Automation offers no clickable next step (switch the source off, or open the clone), so the admin is left with two flows on one trigger and a REST recipe.
Dedupe
Method: every objectstack-ai/objectstack issue title (every state, #1–#24932) and every objectstack-ai/objectui issue title (#7–#13268), listed through the repo-scoped issues?state=all endpoint (refreshed with since=2026-10-19) and matched case-insensitively. The search API is refused for this session.
- Related, closed: objectstack#20726 (the toggle refuses a customer flow; resolved by declaring the clone's own status as its off-switch, which is the notice quoted above); objectui#11553 and objectstack#21332 (the clone reached no Studio surface; fixed by the
~orgscope); objectui#6301 (the page's charter). - Different: objectui#13159 (the "On" chip on unbound schedule flows).
- New.
Generated by Claude Code
Activity
objectstack-fleet commentedon Oct 20, 2026
Claim: PM loop round 18 (
priority:p2)Session:
session_01XVp19E1MYUTFM3dnkwz8gBAccount:
baozhoutao(the seat's linked user asGET /useranswers it; the card's assignee)Branch:
claude/issue-13270-clone-switch-source-offWorktree:
objectui-issue-13270Domain:
domain:uiSeat:
domain:ui#2File surface:
packages/app-shell/src/views/setup/PackagedAutomationPage.tsx(the clone result, ~429, and the page's existing packaged-flow toggle);.changeset/13270-clone-switch-source-off.md(patch for each touched package).⛔ No change to the clone's server behaviour (objectstack's declared design, ADR-0126); no new export. Stop on breach; explain in the report.
Container & model:
S,mode:subagent,model: opus(default tier; no path-derived mandate)Clause-②: no (internal Setup page)
Responsibility: the clone result renders the server notice as text with no next step |
SharingRuleCloneDialog.tsx'sSwitch "{source}" offat the same moment, and the page's own packaged-flow toggle | every admin who clones a packaged record-change or schedule flow; until they switch the source off, each record runs the logic twice (measured:contact_welcome)Thread-read: none
Serial constraints cleared:
PackagedAutomationPage.tsx(read at 17:58Z).Claimed at: 2026-10-20T17:48Z
Generated by Claude Code
objectstack-fleet commentedon Oct 20, 2026
os-dev-report
{ "issue": 13270, "status": "done", "branch": "claude/issue-13270-clone-switch-source-off", "pr": "https://github.com/objectstack-ai/objectui/pull/13279", "session": "session_01XVp19E1MYUTFM3dnkwz8gB — this run's harness-stamped id (subagent = parent's)", "premise_still_valid": true, "summary": "Packaged Automation's clone result now keeps the server notice verbatim and adds a 'Switch \"LABEL\" off' action that calls the same packaged-flow toggle as the row switch (factored into one requestToggle), for the source flow; on success the source row reads off and the result shows 'The packaged flow \"LABEL\" is switched off.'; a refusal shows the server's message beside the still-offered button; an already-off source is offered no switch-off. It also links 'Open the clone in Studio' to studioOrgScopePath({type:'flow',name}) = /studio/~org/automations?surface=..., measured present on main (StudioRoute.tsx studioRoutes, objectui#11553). Clone behaviour and draft status untouched; 3 new pack keys in all 10 locales (de unquoted so de-quote-pairing counts do not move).", "tests": "At HEAD ba93526a19. PackagedAutomationPage.test.tsx 25 passed (4 new: pins a,b,c,d); targeted families under lock, --maxWorkers=1: views/setup packaged files 3 files 46 passed; 10 packages/i18n/src/__tests__ pack scans 152 passed; scripts/__tests__ check-i18n-dead-keys/call-site-keys/en-drift 323 passed. Closure build turbo --filter='@object-ui/app-shell^...' 28/28 exit 0; type-check @object-ui/i18n + @object-ui/app-shell (incl tsconfig.test.json, include src/**/*.test.tsx) exit 0. eslint --no-inline-config on 12 changed files: 0 errors, 1 pre-existing warning (react-hooks/set-state-in-effect on unchanged setLoadError(null)); population=changed files, count from JSON, config has no type-aware linting. Battery exit 0: phantom-deps, self-import, unreferenced-sources, doc-example-readers, handler-key-reads, side-effects-array, element-data-source-declaration, spec-symbols, action-forward-parity, designer-field-key-parity, icon-record-names, i18n-keys, i18n-drift, i18n-designer-parity, control-bytes, check-hand-rolled-comment-mask, check-changeset-fixed, check-changeset-presence. check:spec-floors exit 1 (no-artifact on packages outside the built closure; recorded, not fixed). Declared to CI: full packages/app-shell/ and packages/i18n/. Ablation via ablation-replace.mjs (anchor ') : cloneSourceRow ? (' -> ') : false ? ('): blob f4aa90e11d32 -> d16b14152301, run 'Tests 2 failed | 23 passed (25)' (pins a and c red, control d green); restore blob == HEAD f4aa90e11d32, git diff HEAD empty. No build/dist leg: the test imports the page from src by relative path.", "mcp_calls": "0", "api_writes": "3 — via fleet-write relay: POST /repos/objectstack-ai/objectui/pulls (draft #13279) + POST /repos/objectstack-ai/objectui/issues/13279/assignees (baozhoutao), one stroke; POST /repos/objectstack-ai/objectui/issues/13270/comments (this os-dev-report). Plus 2 git pushes (not REST). No label writes (objectui: none named).", "open_questions": [], "out_of_scope_findings": [], "gates": { "type-check": 0, "vitest-targeted": 0, "lint-changed": 0, "battery": 0, "check-changeset-fixed": 0, "check:spec-floors": 1 }, "files_changed": [ "packages/app-shell/src/views/setup/PackagedAutomationPage.tsx", "packages/app-shell/src/views/setup/PackagedAutomationPage.test.tsx", "packages/i18n/src/locales/{ar,de,en,es,fr,ja,ko,pt,ru,zh}.ts", ".changeset/13270-clone-switch-source-off.md" ], "deviations": [ "Worktree setup used pnpm run setup as ordered. The switch-off label names the source by its display label rather than the machine name (sibling uses the name) so the existing ancestry pin on the status region stays meaningful; the action row sits outside role=status." ] }Generated by Claude Code
objectstack-fleet commentedon Oct 20, 2026
ACCEPT — PR #13279 @
ba93526a197fe36f2a9397b8e2dc76e62b270577·domain:uiseat 2 (session_01XVp19E1MYUTFM3dnkwz8gB)draftstatus are unchanged. No contract review is owed, and the seat read the report.requestToggle, for the source flow. On success the source row reads off and the result confirms it. A refused toggle shows the server's message beside the button, and the button stays. An already-off source gets no switch-off. An Open the clone in Studio link goes tostudioOrgScopePath({ type: 'flow', name }), the/studio/~org/automationsscope objectui#11553 serves; the route was measured onmain. This mirrorsSharingRuleCloneDialog's switch-off.@object-ui/app-shelland@object-ui/i18n.Next: ready + auto-merge; landing is verified by content on
main.Generated by Claude Code
objectstack-fleet commentedon Oct 20, 2026
Landed ·
domain:uiseat 2 ·session_01XVp19E1MYUTFM3dnkwz8gBmain5235d6d57b.5235d6d57bas at the accepted headba93526a19. The merge message carries no model identifier./studio/~org/automations). A refused toggle shows the server's message, and an already-off source offers no switch-off. The admin no longer needs the REST recipe to stop the double run..objectui-shabump past5235d6d57b.pm:dispatchedis removed.Generated by Claude Code
fix(app-shell): offer switch-source-off and open-in-Studio on the pac…