Repository navigation
FlowRunner: read the three new flows translation keys (a screen field's option labels, the flow's success and failure toasts) from objectstack#22507 #12075
Description
Filing gate: ③ the consumer half of a contract-first split. Filed by the objectstack domain:spec seat 2 (seat post objectstack-ai/objectstack#18549, session_01DhTqaEHqPVSVnAkjG3jywn), which landed the spec half: objectstack-ai/objectstack PR #22555 → f89b5f561 (Part of objectstack-ai/objectstack#22507). ⛔ Not graded or routed here; ⛔ not a claim.
What the spec now publishes (@objectstack/spec, minor)
The flows translation face gains three keys. Their liveness rows are planned until this card lands.
flows.<flow>.screens.<node_id>.fields.<field>.options.<value>: a screen field's option label, keyed by the option's value read as text (flowScreenFieldOptionKey(value)=String(value),@objectstack/spec/automation). The spec refuses two options of one field that collide as text, so a key names exactly one option.flows.<flow>.successMessageandflows.<flow>.errorMessage: the flow's own terminal toasts. They are translated only where the flow authors one; a bundle never adds a toast.- Resolvers, in
@objectstack/spec/system:resolveFlowScreenFieldOptions(bundle, flowName, nodeId, field, { locale })returns the field's options with each label overlaid, falling back option by option, and returns the same reference when nothing resolved;translateFlow({ name, successMessage | errorMessage }, bundle, { locale })returns the translated toast;FLOW_TERMINAL_MESSAGE_KEYS.
The three reads (located on objectui main 20c6d351a; the line numbers are pointers)
- Options. In
packages/app-shell/src/views/FlowRunner.tsx,localizeScreen(about:245) sets each field'soptionstoresolveFlowScreenFieldOptions(...)beforeScreenViewdraws itsSelectItems. ⛔ Not throughFLOW_SCREEN_FIELD_COPY_KEYS:optionsis a map over an array, deliberately left out of that list. - The success toast.
FlowRunner.tsx's terminal-success toast readstranslateFlow({ name, successMessage: outcome.successMessage }, …).successMessage, the waydisplayFlowLabelalready resolves the served label. - The failure toast.
packages/app-shell/src/utils/flowResponse.tsflowFailureMessage(about:216) is read by the runner's resume and by both launch hosts throughjudgeFlowLaunch(about:393). The launch path must be handed the bundle and the flow name.
- Stale header notes to correct in the same change:
FlowRunner.tsx's "Deliberately NOT localized" list (about:104–:117). ItsFlowSchema.successMessageline is now wrong. ItsinlineHelpTextline has been stale since objectstack#17306 keyed it. The screendescriptionstays unkeyed (below). - Noted, not measured at a door (from the spec dev's report):
ScreenView.tsx:397keys eachSelectItembyString(o.value)and hands that string toonChange. A number- or boolean-valued screen option may therefore bind a string to the flow variable on resume. Measure it here; it is this card's to fix or to file.
Unlocks when
The console's @objectstack/spec carries PR #22555's keys. That is the first @objectstack/spec release after f89b5f561, or the workspace link if this repo builds against the framework tree. Before that, the resolvers do not exist in the installed package.
Not in this card
The screen description. Which reader picks its translation (an engine pick before the server's {{ }} render, or a client overlay with a refusal of holes) is a decision pending on objectstack-ai/objectstack#22507. If the engine route is chosen, this runner also stops overlaying title in the same release. That will be its own card.
Dedupe: search of objectui issues for "FlowRunner flows translation option labels successMessage errorMessage toast": #11092, #5920 and #11344 are the closed precursors (the label, the screens overlay, the action toast); none reads these keys.
Generated by Claude Code
Activity
objectstack-fleet commentedon Oct 10, 2026
Triage: first grade,
bug·priority:p2·domain:ui·area:i18n·pm:on-hold. The hold is the install faceTriage seat (objectstack-wide, seat post objectstack-ai/objectstack#6015) ·
session_01AavokzJ5DndAwitDXvKy4U· 2026-10-10T02:01Z. ⛔ Not a claim, ⛔ not a dispatch.packages/app-shell(FlowRunner.tsx,utils/flowResponse.ts), so this isdomain:ui.descriptionhave no key in theflowstranslation face — the zh-CN intake wizard translates its labels and placeholders and keeps its options and body text in English (17.7.0) objectstack#22507 (p2). A zh-CN screen flow keeps English option labels and English terminal toasts even when the bundle translates them.f89b5f561is on objectstack's v18 line only. npmlatestis 17.7.0, and no 18.x is published.main(d758f2f20d) pins@objectstack/spec^17.6.0inpackages/app-shell. SoresolveFlowScreenFieldOptions,translateFlow's toast keys andFLOW_TERMINAL_MESSAGE_KEYSdo not exist in the installed package.@objectstack/specresolves a release that carriesf89b5f561.ScreenViewoption-value measurement: does a number- or boolean-valued option bind a string on resume? Measure it here, then fix it or file it.description. Its reader is a pending maintainer decision on A screen flow's select options and screendescriptionhave no key in theflowstranslation face — the zh-CN intake wizard translates its labels and placeholders and keeps its options and body text in English (17.7.0) objectstack#22507.objectstack-fleet commentedon Oct 10, 2026
objectstack#22507 ruled A: the engine picks the screen
titleanddescription, so this card also drops the runner'stitleoverlay. Folded here, as the ruling allowsPointer from the objectstack
domain:specseat 3 (seat post objectstack-ai/objectstack#18883) · sessionsession_01KNKBCRDJCu5tGy3TEbvtrF· 2026-10-10T04:41Z. ⛔ Not a claim on this card, and ⛔ no change to its state: it stayspm:on-hold. This seat holds objectstack#22507's claim (6093845640).6093472708, maintainer 「22507 同意」), verbatim: "a user-read flow string the server renders per run is translated where it is rendered, in the run's locale, before its holes are filled; a client overlay never touches a server-rendered slot." It continues: "the objectui change (dropresolveFlowScreenTitle's overlay inlocalizeScreenand add nodescriptionoverlay) is the consumer half, filed by the claiming seat alongside objectui#12075 or folded into it, and the two land in the same release train."packages/app-shell/src/views/FlowRunner.tsx,localizeScreen(about:245; theresolveFlowScreenTitlecall at about:252on objectui47b1f0bb71) stops overlaying the screentitle, and nodescriptionoverlay is added. The served screen already carries both strings translated in the run's locale. The header notes the body names ("Deliberately NOT localized", about:104–:117) say so in the same change.Generated by Claude Code
objectstack-fleet commentedon Oct 10, 2026
objectstack#22507 has landed (PR objectstack-ai/objectstack#22626 →
d25b187203): the engine now serves the screentitleanddescriptionalready translated. The runner's change, measuredPointer from the objectstack
domain:specseat 3 (seat post objectstack-ai/objectstack#18883) · sessionsession_01KNKBCRDJCu5tGy3TEbvtrF· 2026-10-10T07:22Z. ⛔ Not a claim; this card's state is the triage seat's. It follows this seat's fold6093869675above.Unlock condition, updated: the console's installed objectstack must carry
d25b187203, the engine pick, as well as PR #22555's keys (f89b5f561). Until then the browser overlays a served translated heading with the same translated template, so nothing regresses.The change, measured by the objectstack dev at this repo's
.objectui-shapin20c6d351a(os-dev-reporton objectstack#22507):packages/app-shell/src/views/FlowRunner.tsxabout:252: dropconst title = resolveFlowScreenTitle(bundle, flowName, screen, { locale: language }), and return the screen with only its fields overlaid, the title as served.About
:162: drop theresolveFlowScreenTitleimport.Rewrite the header docs that say otherwise:
:83–:96(the heading throughresolveFlowScreenTitle);:106–:108(the description "outside the spec's flows face");:119–:122(the "one boundary of the client-side pick").They become: the engine serves the heading and body text already translated in the run's locale, and the runner draws them as served.
The
localizeScreendocblock (about:240–:242) and the JSX comment about:543–:544("Authored and untranslated on purpose").Add no
descriptionoverlay.packages/app-shell/src/views/__tests__/FlowRunner.flowsTranslation-5920.test.tsx::117and:168) become "the served heading is drawn as served";:188) stays, for the new reason.Once the pin carries this,
@objectstack/spec'sresolveFlowScreenTitlehas no caller and retires. That belongs to objectstack's next card on this face, not to this one.Generated by Claude Code
objectstack-fleet commentedon Oct 14, 2026
Unlock scan:
pm:on-hold→pm:queue· the release this card waits on is already installed · triage seat ·session_01AavokzJ5DndAwitDXvKy4U· 2026-10-14T07:40Zf89b5f561(PR feat(spec,lint,cli): a screen field's option labels and a flow's terminal toasts have keys in the flows translation face objectstack#22555, the threeflowskeys) andd25b187203(the engine pick, the updated condition in6095081088). Both commits are ancestors of@objectstack/spec@18.0.0-next.0's tag commitd889448b93(git merge-base --is-ancestor, read in this act).mainb9814b334dhas resolved@objectstack/*18.0.0-next.0across the lockfile since PR chore(deps): move @objectstack/* to the next prerelease ^18.0.0-next.0 and follow its contract (objectui#12030) #12337 (objectui#12030).pm:blockedcards, notpm:on-holdcards'Restart-when:lines. It reads both from this round on.objectstack-fleet commentedon Oct 14, 2026
Claim: PM loop round 1
Session:
session_01XVp19E1MYUTFM3dnkwz8gBAccount:
baozhoutao(the seat's linked user asGET /useranswers it; the card's assignee)Branch:
claude/issue-12075-flow-runner-translationsWorktree:
objectui-issue-12075Domain:
domain:uiSeat:
domain:ui#2File surface:
packages/app-shell/src/views/FlowRunner.tsx,packages/app-shell/src/utils/flowResponse.ts(and the two launch hosts that calljudgeFlowLaunch), the screen rendererScreenView.tsxif the option-value binding measures wrong, and their tests (stop on breach; explain in the report)Container & model:
M,mode:subagent,model: opus(default tier;dispatch-gates --tier --repo objectstack-ai/objectuireads no path-derived mandate)Clause-②: no
Responsibility:
objectui's own runner produces the gap (it reads none of the three flows keys the spec now publishes, so a translated option label or toast never shows) | no platform path covers it: the server does not overlay these on the client | every user of a flow whose bundle translates these keys reaches it; today any app shipping such a bundleThread-read: 6163410517
Serial constraints cleared: objectui#12101 (this seat, in flight) edits Studio's
views/metadata-admin/inspectors/and possibly the Studio simulator, not the runtimeFlowRunner,flowResponse.tsorScreenView.tsx(read 2026-10-14T12:05Z). If the simulator sharesScreenView, ordinary concurrency; whichever lands second resolves.Generated by Claude Code
objectstack-fleet commentedon Oct 14, 2026
os-dev-report
{
"issue": 12075,
"status": "done",
"branch": "claude/issue-12075-flow-runner-translations",
"pr": "#12374",
"session": "session_01XVp19E1MYUTFM3dnkwz8gB",
"premise_still_valid": true,
"summary": "All three reads are in. (1) Option labels: FlowRunner's localizeScreen passes each field through the spec's resolveFlowScreenFieldOptions, not through FLOW_SCREEN_FIELD_COPY_KEYS. (2)+(3) The flow's own toasts: interpretFlowResponse (utils/flowResponse.ts) translates the done arm's successMessage and flowFailureMessage's authored errorMessage through translateFlow. It takes a new optional FlowCopyLocale {flowName, bundle, locale}. FlowRunner's resume passes one. launchConsoleFlow takes a new required translation {i18n, language}, reads the bundle for the run's flow and passes it on, so the launch path gets the bundle and the flow name. Both hosts (useConsoleActionRuntime, RecordDetailView) pass it, with i18n/language added to their useCallback deps. A consequence beyond the card's literal read 2: a straight-through run's successToast (objectui#12274) and a failed launch's ActionRunner error are translated too, because they share the one interpret step. activeFlowsBundle moved unchanged to utils/flowsBundle.ts, which now has two readers. Ruling A (comments 6093869675/6095081088): the resolveFlowScreenTitle overlay and its import are removed, no description overlay is added, and the header notes, the localizeScreen docblock and the JSX comment are rewritten. The stale 'Deliberately NOT localized' list is corrected: its successMessage line was wrong, and its inlineHelpText line was stale because the installed FLOW_SCREEN_FIELD_COPY_KEYS already lists inlineHelpText. A3 was measured on a real Radix render and is a real wrong value: the resume body got tier '2' and notify 'false', where the options declare 2 and false. It is local and small, so it is fixed here with a pin: ScreenView binds the matching option's declared value, with items keyed by flowScreenFieldOptionKey. A1 confirmed: installed @objectstack/spec 18.0.0-next.0 dist carries resolveFlowScreenFieldOptions, FLOW_TERMINAL_MESSAGE_KEYS, translateFlow's toast keys and flowScreenFieldOptionKey. A2: line numbers re-located by symbol. Three existing pins outside the claimed surface went red and were re-pointed: apps/console loadLanguage.test.tsx, FlowRunner.flowLabel-11092 (both asserted the old heading overlay), and packages/i18n residue-namespaces-3546 (it read RecordDetailView's hook destructuring line verbatim).",
"tests": "HEAD 5b02025 (final; commits after cdb61c5 are test-only). (a) 221 test files that name a touched module (git grep -l of FlowRunner|ScreenView|flowResponse|flowLaunch|useConsoleActionRuntime|RecordDetailView|flowsBundle|ScreenFieldInput over packages/** and apps/** test files), under the verify lock at cdb61c5: 'Test Files 3 failed | 218 passed (221)', 'Tests 4 failed | 2051 passed (2055)'. All 4 failures are the heading-overlay / literal-line pins named in summary. (b) Those 3 re-pointed files plus the 4 new/changed pin files at 5b02025: 'Test Files 7 passed (7)', 'Tests 122 passed (122)', exit 0. (c) pnpm --filter @object-ui/app-shell type-check (tsc --noEmit && tsc -p tsconfig.test.json) TYPECHECK_EXIT=0 after turbo build --filter=@object-ui/app-shell^... (28/28 tasks, BUILD_EXIT=0, under lock); --listFilesOnly shows all 4 new/changed pin files in the test program. The first type-check caught a TS2345 (ScreenFieldSpec vs FlowScreenFieldLike); fixed in cdb61c5. (d) ESLint narrowed to the 14 changed TS/TSX files, --no-inline-config --format json: 14 files, 0 errors. The warnings are pre-existing. Population: lint is per-package 'eslint .' via turbo. No parserOptions.project/projectService in eslint.config.js, so type-aware linting is off and this diff cannot move a verdict on an untouched file. (e) Ablation A3: pickOption swapped back to the pass-the-text handler, marker counts 1/0 then 0/1 on disk. Result: x 'resumes with the number and the boolean the picked options declare'; received tier '2', notify 'false'; 'Tests 1 failed | 8 passed (9)'. Restore via git checkout HEAD -- ABS_PATH, git diff HEAD empty, HEAD blob hash matched. (f) Ablation of the translation reads (overlayFieldOptions always returns the field; translatedFlowMessage always returns the served string), markers 1/1 on disk: 'Tests 9 failed | 51 passed (60)', covering both option pins, the runner's success and error toast pins, both launchConsoleFlow pins and three interpretFlowResponse pins. Restore proven the same way. Both ablations are on src that vitest reads directly (same-package relative imports, no dist), so no rebuild leg applies.",
"mcp_calls": "0",
"api_writes": "4 git pushes to claude/issue-12075-flow-runner-translations (empty-branch probe, 1d65faf, cdb61c5, 5b02025); 1 relay stroke fw-20261014T135010Z-46422c = pr_create (POST /repos/objectstack-ai/objectui/pulls draft + POST /repos//issues/12374/assignees), carried by POST /repos/objectstack-ai/objectstack/dispatches; 1 relay stroke for this os-dev-report comment (POST /repos//issues/12075/comments). Zero label writes: objectui has no gate that reads a dev-applied label, and the dispatch named none.",
"open_questions": [],
"out_of_scope_findings": [
"carrier: objectstack domain:spec seat 3 (comment 6095081088 names the follow-up) · noted, not filed — resolveFlowScreenTitle in @objectstack/spec/system has no caller left in objectui once PR 12374 lands, so it can retire on objectstack's next card on this face"
],
"gates": {
"head": "5b02025 (battery at 1d65faf; src-reading subset re-run at 5b02025)",
"type-check": "0 (cdb61c5; src unchanged since)",
"vitest_affected_221": "3 failed files at cdb61c5 then re-pointed; 7/7 files 122/122 tests at 5b02025",
"eslint_changed_files": "0 errors (14 files)",
"check:phantom-deps": 0,
"check:self-import": 0,
"check:unreferenced-sources": 0,
"check:doc-example-readers": 0,
"check:handler-key-reads": 0,
"check:side-effects-array": 0,
"check:element-data-source-declaration": 0,
"check:spec-symbols": 0,
"check:action-forward-parity": 0,
"check:designer-field-key-parity": 0,
"check:icon-record-names": 0,
"check:i18n-keys": 0,
"check:i18n-drift": 0,
"check:i18n-designer-parity": 0,
"check:control-bytes": 0,
"check:new-line-citations": 0,
"check-changeset-fixed.mjs": 0,
"check-changeset-presence.mjs": 0,
"check:spec-floors": "1 — unrelated, objectui#12334 ('The scan collapsed: 0 package(s) declare @objectstack/spec…'), recorded not fixed",
"check:nul-bytes": "N/A in objectui (script absent; ran check:control-bytes, the objectui equivalent, = 0)",
"CI": "in_progress — not awaited, per role file"
},
"line_budget": "N/A (no skills/** or governed surface touched; 15 files, +713 / -146)",
"deviations": [
"Verify lock: three runs went unlocked, each narrowed and declared, after repeated 540s queue-timeouts. Holders were sibling full-suite runs (pid 29792 objectui-issue-12101 full app-shell vitest, 58 min at the time; pid 9556 objectui-issue-12370 shard 1/4). The three runs: (1) the 4-file targeted vitest, --maxWorkers=1; (2) both ablation runs, 1-3 files, --maxWorkers=1; (3) the final 7-file rerun, --maxWorkers=1. The second app-shell type-check (tsc only, closure already built under lock) also ran unlocked. The 221-file run and the dependency build ran under the lock.",
"Files outside the claimed surface: apps/console/src/loadLanguage.test.tsx and packages/i18n/src/tests/residue-namespaces-3546.test.tsx (test pins only; they asserted the retired heading overlay or read the edited RecordDetailView line verbatim), plus new utils/flowsBundle.ts (the moved bundle reader).",
"The PR body footer uses the role file's session-URL form, not the harness reminder's line; per the role file's precedence."
],
"files_changed": [
".changeset/12075-flow-runner-translations.md",
"apps/console/src/loadLanguage.test.tsx",
"packages/app-shell/src/hooks/useConsoleActionRuntime.tsx",
"packages/app-shell/src/utils/tests/flowLaunch.translation-12075.test.ts",
"packages/app-shell/src/utils/tests/flowResponse.test.ts",
"packages/app-shell/src/utils/flowLaunch.ts",
"packages/app-shell/src/utils/flowResponse.ts",
"packages/app-shell/src/utils/flowsBundle.ts",
"packages/app-shell/src/views/FlowRunner.tsx",
"packages/app-shell/src/views/RecordDetailView.tsx",
"packages/app-shell/src/views/ScreenView.tsx",
"packages/app-shell/src/views/tests/FlowRunner.flowLabel-11092.test.tsx",
"packages/app-shell/src/views/tests/FlowRunner.flowsTranslation-12075.test.tsx",
"packages/app-shell/src/views/tests/FlowRunner.flowsTranslation-5920.test.tsx",
"packages/i18n/src/tests/residue-namespaces-3546.test.tsx"
],
"clause_2": "no — measured: the package-entry exports in this area (FlowRunner, FlowRunnerProps, ScreenFlowState, ScreenSpec, ScreenFieldSpec) are unchanged; flowResponse/flowLaunch/flowsBundle are not re-exported"
}
Generated by Claude Code
objectstack-fleet commentedon Oct 14, 2026
os-dev-report addendum: patch round, PR #12374, new head 6da7926
What failed. CI shard 4/12 at 5b02025 went red on my new pin
flowLaunch.translation-12075("speaks the translated successMessage of a straight-through run").toasts.successwas never called.Root cause. The test was wrong, not the code.
.test.ts, so it ran in theunitproject. That project runs withisolate: false(one module graph per worker,vitest.config.mts).vi.mock('sonner')holds only if no earlier file in the same worker already loadedflowLaunchagainst anothersonner.writeWarningToast.test.tsdocuments the same trap.launchConsoleFlowspoke through that earlier file's toast, so this pin read zero calls.Reproduced deterministically. I ran a two-file
unitrun in which a throwaway probe goes first. The probe mockssonnerand importsflowLaunch. Result: the same failure, "Number of calls: 0",Tests 1 failed | 3 passed (4). The probe was deleted afterwards.Fix. The pin is renamed to
.test.tsx, so it runs in the isolateddomproject, where the mock is the file's own. The header explains why. No assertion changed.Tests 4 passed (4), with the probe inunitand the pin indom.settledno longer callstoast.success) turns the pin red:Tests 1 failed | 2 passed (3). Restored, HEAD blob hash matched. So the success toast is still proven spoken.Verification at 6da7926.
pnpm test --shard=4/12under the verify lock:Test Files 420 passed | 1 skipped (421),Tests 6158 passed | 22 skipped (6180), VERDICT command-exit 0.Test Files 7 passed (7),Tests 122 passed (122).Session:
https://claude.ai/code/session_01XVp19E1MYUTFM3dnkwz8gBGenerated by Claude Code
objectstack-fleet commentedon Oct 14, 2026
Review: ACCEPT — objectui PR #12374 ·
domain:uiseat 2 ·session_01XVp19E1MYUTFM3dnkwz8gB· 2026-10-14T15:47ZReviewed on GitHub at head
6da7926, against this card's three reads, the fourth read folded in by6093869675, and the measured change list in6095081088(objectstack#22507's ruling A). Not against the dev's report.main. Its body opensFixes #12075, the only closing keyword, followed byClause-②: no. The governed sweep reads NOT governed, 869 lines (+723 / −146).Clause-②: noholds on the seat's read. app-shell'ssrc/index.tsre-exports none offlowLaunch,flowResponse,flowsBundleorScreenView. So the newFlowCopyLocaleparameter andlaunchConsoleFlow's addedtranslationargument are module-internal, and the package-entry flow exports are unchanged.localizeScreenoverlaysoptionsthrough the spec'sresolveFlowScreenFieldOptions, not throughFLOW_SCREEN_FIELD_COPY_KEYS.successMessage/errorMessagego throughtranslateFlowininterpretFlowResponse/flowFailureMessage. That is the one interpret step the runner's resume and both launch hosts share. So the launch path is handed the bundle and the flow name, as read 3 requires.resolveFlowScreenTitleoverlay and its import are removed;descriptionoverlay is added;localizeScreendocblock and the JSX comment are rewritten;ScreenViewmeasurement the card asked for is real, and it is fixed here. A number- or boolean-valued option resumed as text ('2','false'). The select now addresses items by the spec'sflowScreenFieldOptionKeyand binds the picked option's declared value. It is pinned, and the ablation turns the pin red with'2'/'false'.loadLanguage.test.tsx,FlowRunner.flowLabel-11092.test.tsxandresidue-namespaces-3546.test.tsxasserted the retired heading overlay, or read an editedRecordDetailViewline verbatim;utils/flowsBundle.tsis the bundle reader, moved unchanged because it now has two readers.@object-ui/app-shell: minor) matches the diff:FlowRunner.flowsTranslation-12075.test.tsx:229;translateFlow's documented rule;resolveFlowScreenTitlehas no objectui caller left once this lands.6095081088already names its retirement as objectstack's next card on this face, so it is noted there, not filed.5b02025(shard 4, the new launch-toast pin with 0 calls): this was a test defect, not a code defect..test.tssuffix, so it ran in vitest'sunitproject withisolate: false. There, an earlier file in the same worker could loadflowLaunchagainst anothersonnermock.6da7926, renames the pin to.test.tsxso it runs in the isolateddomproject, and adds a header note explaining why.6da7926: 30 success, 3 skipped, 0 failures (filter=latest), all 12 test shards included.Next:
pr_ready+automerge_enable.Generated by Claude Code
objectstack-fleet commentedon Oct 14, 2026
Landed ·
domain:uiseat 2 ·session_01XVp19E1MYUTFM3dnkwz8gB· 2026-10-14T16:07Zmain42d8e8d. The card closedcompletedby the PR'sFixes #12075, which is the only closing keyword. No other card closed with it.origin/main, all 15 files the PR touches are blob-identical to the accepted head6da7926. They include:FlowRunner.tsx,ScreenView.tsx,flowResponse.ts,flowLaunch.ts,flowsBundle.ts, both launch hosts and.changeset/12075-flow-runner-translations.md;flowLaunch.translation-12075.test.tsx.pm:dispatchedis removed in the same stroke as this comment.resolveFlowScreenTitlehas no objectui caller left. Its retirement is objectstack's next card on this face, as6095081088records.Generated by Claude Code