Skip to content

runtime: the flow and permission-set "New similar" clone notices carry a code, so the Console can translate them (zh-CN shows English today) #29727

Closed

Description

@objectstack-fleet

domain:ui#5 · zhuangjianguo · session_01QsR2jQjvWkZ7is6GXbC6DB

Filing gate: ② out-of-scope finding, class a (measured), from #29706 row 1, which the seat moved out of that card because it needs server-lane surface (claim amendment on #29706). Filed by domain:ui#5. ⛔ Not a claim. No grade: triage sets it.

Business reason. "New similar" on a flow is one of the first things a Chinese-speaking builder does in Studio. The banner's second sentence ("The copy is switched off and does not run until you switch it on…") renders in English under a zh screen. The epic PM seat filed it as p1 in #29706, epic #28130.

What happens

Measured on main at 7b55ea95, zh-CN (/mnt/project-files/issue-29706/premise.md, row 1).

  • The flow clone answer is { flow, packageId, notice } and has no code. notice is the English constant FLOW_CLONE_NOTICE (packages/runtime/src/flow-clone.ts ~L191, served from domains/automation.ts). The Console prints data.notice verbatim (StudioDesignSurface, auto-new-similar-notice).
  • Access's "New similar" on a permission set has the same gap: a verbatim English success notice with no code.

The existing pattern to follow

A server sentence a person reads reaches the Console translated by code. The Console maps a known code to an i18n key and keeps the wire text for an unknown code. Examples: CloudConnectionPanel's translateFailureCode, and the publish sheet's BATCH_ABORTED_CODE line. No new mechanism.

Wanted

  1. Server: both clone answers carry a stable code beside notice, for example noticeCode: 'FLOW_CLONE_DISABLED_COPY'. Keep notice as the English fallback. The client's CloneFlowResponse type, and the permission-set equivalent, gain the optional field.
  2. Console (ui leg, after 1 lands): map the code to a studio-namespace key in en and zh, and fall back to notice for an unknown code.

Tests

  • Server: the clone route's answer carries the code, and a CONTROL keeps notice unchanged.
  • Console: in zh-CN, the banner shows the translated sentence for the known code. An unknown code shows the wire notice. An ablation reds both.

Lanes: leg 1 domain:server (runtime + client type; contract tier for the answer shape), leg 2 domain:ui.

Dedupe: is:issue clone notice code, is:issue FLOW_CLONE_NOTICE (none open).

Links back: #29706, #28130.

Activity

  1. objectstack-fleet commented on Nov 3, 2026

    @objectstack-fleet
    ContributorAuthor

    triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U

    Path: none

    Triage: first-touch audit · p1 · domain:server kept · pm:triage → pm:queue · 2026-11-03T03:02Z

    ⛔ Not a claim. This answers domain:server#5's doorbell (6594343187).


    Generated by Claude Code

  2. objectstack-fleet commented on Nov 3, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:server#3 · os-warren · session_01JQwxbYyp6wSRcywGFK2L4A

    Seat reading · 2026-11-03T03:40Z · ⛔ Not a claim. Assigned to server seat 3 by the lane coordinator.

    Blocked-by: #29758

  3. objectstack-fleet commented on Nov 3, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:server#3 · os-warren · session_01JQwxbYyp6wSRcywGFK2L4A

    Claim: PM loop · card thread · 2026-11-03T05:21Z
    Session: session_01JQwxbYyp6wSRcywGFK2L4A (the seat); the card thread is session_01JQwxbWvgXNaTVoBWSiMCCC
    Account: os-warren (the seat's linked user; the card's assignee)
    Branch: claude/project-thread-noal4l (the card thread's harness-pinned branch; it names no issue, so this claim is the identity record)
    Worktree: the card thread's own container checkout
    Domain: domain:server
    Seat: domain:server#3
    File surface: packages/runtime/src/flow-clone.ts, packages/runtime/src/domains/automation.ts (clone answer), packages/runtime/src/domains/permission-set-clone.ts, packages/runtime/src/route-ledger.ts (the two clone rows), their door tests, one runtime changeset. ⛔ Not protocol.ts (frozen, #27737 6594835694). The dev stops if the change goes outside these files.
    Container & model: M, mode:thread, TIER_DEFAULT, effort: project default
    Clause-②: no
    Metadata-protocol: none
    Responsibility: n/a — not a defect card (a missing code, never shipped)
    Thread-read: 6594851343
    Premise: holds. On origin/main 97c2982c, the flow clone answer is { flow, packageId, notice } and the permission-set clone answer is { permissionSet, package, notice }, and neither carries a code. The contract half landed as #29758 (PR #29779, f87239ae): an optional noticeCode on CloneFlowResponseSchema.data.
    Seat reading: this PR is leg 1 only, the server side, covering both doors. The permission-set notice has three composed variants (environment-wide, in a package, in a package created for it), so it gets one code per variant. No parameter key is needed, because the package name is already on the answer as data.package. Leg 2, the Console mapping, belongs to the ui lane, so this PR writes Refs #29727, not Fixes.
    Serial constraints cleared: no seat-3 card in flight touches these files.
    Resume-from: none — fresh from origin/main
    Tier: S (runtime only; no packages/spec/src/** and no governed path).

    State: pm:blocked → pm:dispatched, assigned to os-warren. Order: project folder pm-orders/server/seat3/order-29727.md.

  4. objectstack-fleet commented on Nov 3, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:server#3 · os-warren · session_01JQwxbWvgXNaTVoBWSiMCCC
    os-dev-report

    {
      "issue": 29727,
      "status": "done",
      "branch": "claude/project-thread-noal4l",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/29823",
      "session": "session_01JQwxbWvgXNaTVoBWSiMCCC",
      "premise_still_valid": true,
      "summary": "Leg 1 (server) only. The flow clone answer carries noticeCode FLOW_CLONE_DISABLED_COPY (exported FLOW_CLONE_NOTICE_CODE beside FLOW_CLONE_NOTICE), the key CloneFlowResponseSchema declares since #29779. The permission-set clone answer carries one code per notice variant (PERMISSION_SET_CLONE_ENVIRONMENT_WIDE / _IN_PACKAGE / _IN_CREATED_PACKAGE); permissionSetCloneLandingKind sorts a landing once and both the sentence and permissionSetCloneNoticeCode (via the exported PERMISSION_SET_CLONE_NOTICE_CODES table) read it, so code and sentence cannot drift. notice is byte-identical on both doors. Both route-ledger clone rows name the key; runtime patch changeset. Refs #29727, no Fixes; protocol.ts untouched. Head da10eb94 has the same tree as ecac38e6, where every reading was taken: the pre-push trailer hook refused a Refs line in the commit message, which was reworded before the first push.",
      "tests": "Door suites (automation-flow-clone, automation-flow-clone-custom-package, permission-set-clone): Test Files 3 passed (3), Tests 78 passed (78). Full pnpm --filter @objectstack/runtime test: Test Files 534 passed (534), Tests 8559 passed, 19 skipped (8578). runtime typecheck + build exit 0. Dogfood after the dogfood^... closure build: automation-flow-clone-door + permission-set-clone-door, Test Files 2 passed (2), Tests 16 passed (16). Ablation via scripts/ablation-replace.mjs (unit suites import src, no dist step; git diff HEAD empty after each leg): A1 flow door drops noticeCode, 2 failed/76; A2 permission-set door drops noticeCode, 4 failed/74; A3 code collapses created into in-package, 2 failed/76; A4 CONTROL flow sentence drift, 2 failed/76; A5 CONTROL permission-set sentence drift, 2 failed/37.",
      "gates": "dispatch-gates --commands derived 67 families; all ran with exit codes recorded before any pipe; --ran: 67 accounted, 66 run, 1 NOT-MEASURED. check-plugin-teardown-shape --self-test exit 3 on the shallow clone, exit 0 after git fetch --unshallow. check:dual-build-cjs-loads exit 3 (not every package has a dist): NOT MEASURED, left to CI. PR check-runs: in_progress at report time.",
      "dogfood_battery": "n/a: no ! in the PR title and no (narrowing) arm",
      "mcp_calls": "0",
      "api_writes": "2: relay pr_create (POST pulls, #29823, read-back 8123 bytes identical) and this os-dev-report comment via post-stamped.mjs (POST issues/29727/comments). git push is not a REST write.",
      "open_questions": [],
      "security_findings": "withheld",
      "out_of_scope_findings": [
        "carrier: #29727 leg 2 (domain:ui). The order asked to add the optional field to the Console's type for the permission-set answer if one exists; it does (ui/packages/app-shell/src/views/metadata-admin/permission-set-clone.ts, PermissionSetCloned, which copies only notice), but ui/** is outside the claimed file surface, so it is left for leg 2, which must read noticeCode there to map it. Noted, not filed."
      ]
    }

    Generated by Claude Code

  5. objectstack-fleet commented on Nov 3, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:server#3 · os-warren · session_01JQwxbYyp6wSRcywGFK2L4A

    Claim amendment · #29727 · 2026-11-03T06:20Z · amends the claim on this card (same seat session, card thread session_01JQwxbWvgXNaTVoBWSiMCCC, branch claude/project-thread-noal4l)

  6. 1 remaining item

  7. objectstack-fleet commented on Nov 3, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#5 · zhuangjianguo · session_01QsR2jQjvWkZ7is6GXbC6DB

    Claim: PM loop round 8 · 2026-11-03T07:14Z
    Session: session_01QsR2jRCNECdyCZ6R9rvtF7 (card thread, os-dev); dispatched by seat session session_01QsR2jQjvWkZ7is6GXbC6DB
    Account: zhuangjianguo
    Branch: claude/project-thread-j5l6y7 (platform-assigned to the card thread; it can push only this branch)
    Worktree: objectstack-issue-29727
    Domain: domain:ui
    Seat: domain:ui#5
    Scope: leg 2 (ui) of this card, after leg 1 (server) landed as PR #29823 (42ff86f6). The Console maps the clone answers' noticeCode (FLOW_CLONE_DISABLED_COPY and the three PERMISSION_SET_CLONE_* codes) to studio-namespace keys in en and zh, and shows the wire notice for an unknown or missing code. Fixes #29727.
    File surface: ui/packages/app-shell/src/views/studio-design/FlowItemMoreMenu.tsx, ui/packages/app-shell/src/views/studio-design/StudioDesignSurface.tsx (the flow copy and permission-set new-similar strips only), ui/packages/app-shell/src/views/metadata-admin/permission-set-clone.ts, ui/packages/app-shell/src/views/metadata-admin/PermissionMatrixEditor.tsx (the cloned-notice lines only), ui/packages/i18n/src/namespaces/studio/en.ts and zh.ts, their tests, one changeset. ⛔ packages/runtime/**, packages/spec/** and StudioItemHeader.tsx are out. The dev names the exact files after measuring the premise, and the seat amends this line before any edit outside it (stop on breach).
    Container & model: M, mode:thread, model: default tier (no Fable per the maintainer's standing rule), effort: high
    Clause-②: yes (widening) — provisional: new studio i18n keys and an optional noticeCode on the Console's PermissionSetCloned type are expected. The dev runs scripts/pm/clause2-line.mjs on the diff, and the seat amends this line if its output differs.
    Metadata-protocol: none
    Responsibility: a Chinese-speaking builder using "New similar" on a flow or a permission set | the banner's sentence renders in English under a zh screen | Studio builders reading zh-CN
    Thread-read: none
    Premise: to prove first on current main, per the brief (/mnt/project-files/issue-29727/brief.md): the banner shows the English sentence for both doors in zh-CN.
    Serial constraints: ordinary concurrency on shared files, the later lander merges main. #29835 (#29809, seat 4) and #29841 (#29729, seat 2) edit PermissionMatrixEditor.tsx, and #29841 edits the studio en/zh packs. #29842 (#29692) and #29843 (#29691) edit StudioDesignSurface.tsx, and #29842 edits FlowItemMoreMenu.tsx. The dev reports any line overlap before editing and merges main right before pr_create.

  8. objectstack-fleet commented on Nov 3, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#5 · zhuangjianguo · session_01QsR2jQjvWkZ7is6GXbC6DB

    Claim amended · 2026-11-03T07:21Z · file surface named exactly, from the dev's premise measurement. The rest of the claim is unchanged.

    File surface: ui/packages/app-shell/src/views/studio-design/FlowItemMoreMenu.tsx (the FlowCopied type, its reader, a new exported flowCloneNoticeText); ui/packages/app-shell/src/views/studio-design/StudioDesignSurface.tsx (the flow and permission-set new-similar strips, plus two import lines); ui/packages/app-shell/src/views/metadata-admin/permission-set-clone.ts (the PermissionSetCloned type, its reader, a new exported permissionSetCloneNoticeText); ui/packages/app-shell/src/views/metadata-admin/PermissionMatrixEditor.tsx (the cloned-notice line plus its one import line, approved by the seat); ui/packages/i18n/src/namespaces/studio/en.ts and zh.ts (four keys each); the tests AutomationsPillar.newSimilar-28567.test.tsx, StudioDesignSurface.accessNewSimilar-28573.test.tsx and PermissionMatrixEditor.cloneToCustomize.test.tsx; and .changeset/29727-clone-notice-translated.md. The dev measured no line overlap with #29835, #29841, #29842 or #29843 on their PR hunks.

  9. objectstack-fleet commented on Nov 3, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#5 · zhuangjianguo · session_01QsR2jQjvWkZ7is6GXbC6DB

    Claim amended · 2026-11-03T07:24Z · the Clause-② value, measured. The rest of the claim is unchanged.

    Clause-②: no
    Metadata-protocol: none

    Why no: the four new keys are rows of the studio namespace's own string table (a Record<string,string>, outside the ten locale packs), and the two types that gain an optional noticeCode (FlowCopied, PermissionSetCloned) are not on @object-ui/app-shell's exports (src/index.ts names neither). That matches #29706's PR #29773, which added studio-namespace keys with Clause-②: no. No contract review is owed, so this lands on CI and the seat's read.

  10. objectstack-fleet commented on Nov 3, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#5 · zhuangjianguo · session_01QsR2jRCNECdyCZ6R9rvtF7
    os-dev-report

    {
      "issue": 29727,
      "status": "done",
      "branch": "claude/project-thread-j5l6y7",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/29861",
      "head": "b4ee61da",
      "session": "session_01QsR2jRCNECdyCZ6R9rvtF7",
      "premise_still_valid": true,
      "summary": "Leg 2 (ui), Fixes #29727. The Console maps the clone answers' noticeCode to studio-namespace keys in en and zh: FLOW_CLONE_DISABLED_COPY on the Automations New similar strip (flowCloneNoticeText, FlowItemMoreMenu.tsx); PERMISSION_SET_CLONE_ENVIRONMENT_WIDE / _IN_PACKAGE / _IN_CREATED_PACKAGE on the Access New similar strip and the matrix editor's clone notice (permissionSetCloneNoticeText, permission-set-clone.ts), naming data.package. An unknown code, a missing code, or a package-landing code without a package shows the wire notice as sent. Both strips carry noticeCode through the navigation arrival to the copy's pillar. Premise proven on main: the 5 known-code zh pins red, the received banner text is the English sentence; live zh-CN before/after screenshots on a showcase backend agree.",
      "tests": "Premise (impl files at 42ff86f6, new tests): Test Files 3 failed (3), Tests 5 failed | 48 passed (53). Fixed head 40f355ea: 3 files, 53/53. Post-merge b4ee61da: 5 files incl. columnHeaders-29729 and badge, 69/69. turbo type-check app-shell + i18n 66/66 before and after merge. eslint on 9 touched files: 0 errors. Ablation via scripts/ablation-replace.mjs (src-aliased, no dist), restores proved by blob hash equal to HEAD: A1 drop flow mapping 1 failed/52; A2 map every flow code 2 failed/51 (both CONTROLs); A3 map every permission-set code 15 failed/38; A4 no permission-set code matches 4 failed/49.",
      "gates": "dispatch-gates --commands derived 35 families; all run, all exit 0 (check-sdui-manifest and self-test included; pnpm --dir ui exec vitest run scripts/ Test Files 170 passed | 2 skipped). --ran: 35 accounted, 35 run, 0 NOT-MEASURED. check-i18n-en-drift exit 0. Body gates on the final body: check-changeset-no-major, check-adr-0087-registration, check-closing-keyword-parity, check-partof-closing-keyword all exit 0. Re-run at b4ee61da: sdui-manifest, changeset-no-major, empty-changeset, nul-bytes, en-drift exit 0. PR check-runs: in_progress at report time.",
      "line_budget": "10 files, +314 / -33 vs origin/main (code 6 files, tests 3, changeset 1)",
      "files_changed": [
        "ui/packages/app-shell/src/views/studio-design/FlowItemMoreMenu.tsx",
        "ui/packages/app-shell/src/views/studio-design/StudioDesignSurface.tsx",
        "ui/packages/app-shell/src/views/metadata-admin/permission-set-clone.ts",
        "ui/packages/app-shell/src/views/metadata-admin/PermissionMatrixEditor.tsx",
        "ui/packages/i18n/src/namespaces/studio/en.ts",
        "ui/packages/i18n/src/namespaces/studio/zh.ts",
        "ui/packages/app-shell/src/views/studio-design/AutomationsPillar.newSimilar-28567.test.tsx",
        "ui/packages/app-shell/src/views/studio-design/StudioDesignSurface.accessNewSimilar-28573.test.tsx",
        "ui/packages/app-shell/src/views/metadata-admin/PermissionMatrixEditor.cloneToCustomize.test.tsx",
        ".changeset/29727-clone-notice-translated.md"
      ],
      "deviations": [
        "PermissionMatrixEditor.tsx: one import line (L132) beyond the cloned-notice lines; seat approved before the edit.",
        "Clause-②: the changeset first carried the claim's provisional yes (widening); scripts/pm/clause2-line.mjs has no CLI or diff mode, so the seat ruled no and the changeset and body carry no.",
        "Screenshot harness: a fresh pnpm dev showcase backend on a private port plus Console Vite; the before leg restored the six implementation files to 42ff86f6 under a trap and restored them after (hash-checked). Booting needed the 8 ui packages check-dev-prereqs names to be built. Both servers torn down by their recorded process groups."
      ],
      "dogfood_battery": "n/a: no ! in the PR title and no (narrowing) arm",
      "mcp_calls": "0 GitHub MCP calls",
      "api_writes": "2: relay pr_create (POST pulls, #29861, 7821 bytes sent and stored identical, no assignees) and this os-dev-report comment via post-stamped.mjs (POST issues/29727/comments). git push is not a REST write.",
      "screenshots": "/mnt/project-files/issue-29727/: before-zh-CN-flow-new-similar.png, after-zh-CN-flow-new-similar.png, before-zh-CN-permission-set-new-similar.png, after-zh-CN-permission-set-new-similar.png",
      "open_questions": [],
      "security_findings": "withheld",
      "out_of_scope_findings": []
    }
  11. objectstack-fleet commented on Nov 3, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#5 · zhuangjianguo · session_01QsR2jQjvWkZ7is6GXbC6DB

    Landed · leg 2 (ui) · 2026-11-03T09:04Z

    Probe Reading
    PR #29861 merged through the queue at 2026-11-03T09:04Z, aeeb13ff. The seat ACCEPT is 6599083771. No contract review was owed (Clause-②: no).
    Card #29727 closed (completed) by that merge through Fixes #29727. Leg 1 (server) landed earlier as PR #29823 (42ff86f6). No other card was closed by the body.
    • State: pm:dispatched is removed and the card stays closed. Both legs are done: in zh-CN, the flow and permission-set "New similar" banners show the Console's own sentence for the server's noticeCode, and an unknown or missing code shows the wire notice.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions