Repository navigation
fix(console): the Flow Runs picker reads a flattened flow item's label (objectui#12783) - #12828
Merged
objectstack-fleet[bot] merged 1 commit intoOct 17, 2026
Conversation
…l (objectui#12783)
objectstack's getMetaItems serves meta.getItems('flow') as flattened
items: name and label sit on the item, with no spec member. The page read
the name from either form but the label from spec.label only, so on a real
server the picker listed every flow by its API name. The label is now read
the way the name is, spec first and then the item itself.
Pins: a flattened answer shows `label (name)`; a spec-wrapped answer shows
the same text; an unlabelled flow shows its bare name.
Claude-Session: https://claude.ai/code/session_01Vk15bz8xHtKGUfXfCm16h4
Co-authored-by: Claude <noreply@anthropic.com>
Contributor
✅ Console Performance Budget
The eager closure is every chunk the entry reaches through static imports — what the browser fetches and parses before the app renders. The entry chunk on its own is a small fraction of it. 📦 Bundle Size Report
Size Limits
|
This was referenced Oct 16, 2026
Contributor
Author
席位核对 — ACCEPT ·
|
| reading | main 33ee9de |
this PR (d841908) |
|---|---|---|
picker options in label (name) form |
0 of 32 (showcase_task_completed, showcase_batch_reminders, …) |
32 of 32 ("Batch Task Reminders (Loop) (showcase_batch_reminders)", …) |
| trigger after a pick | the bare name | "Notify on Task Completed (showcase_task_completed)" |
3. Gates (check-runs pinned to this head).
- 36 runs: 33 success, 3 skipped (
Test (coverage), its matrix row,dependabot), 0 red. - Among the successes:
Lint,Type Check,Repo Gates,Test,Test (shard 1/16)…(16/16),Test (dist pins),Build & E2E,Build Docs,Bundle Analysis(PASS,6226923098: eager closure 3131.7 KB of 3744.1 KB),Live E2E (informational), the changeset checks,Line Citation GateandGoverned Surface Queue Guard. - The dev's local subset at
d841908:- 17 files / 139 tests, every suite under
apps/console/src/pages/developer/; - the closure build and the console type-check (
--listFilesincludes the new pin); - eslint, with 0 errors and none of the 20 existing warnings on a changed line;
- changeset presence,
check:changeset-claimsand new-line citations.
- 17 files / 139 tests, every suite under
- Red first on unchanged
main: 1 failed / 2 passed. The flattened case receivedshowcase_batch_reminders. Thespec-wrapped and unlabelled cases are guards, green by design. - Three ablations, each restored and proven:
- the flat arm dropped: case 1 red only;
- the
specarm dropped: case 2 red only; - the name standing in for a missing label: all 3 red.
4. Accepted deviations.
- The
specarm stays, as the claim pinned. Its retirement waits on a producer census, and the seat's answer A records it as objectui#12829. - Prose checked against the diff:
- the changeset's "objectstack's metadata list answers
meta.getItems('flow')with flattened items"; - "Nothing else on the page changes";
- the comment above the normalization.
- the changeset's "objectstack's metadata list answers
5. Out of scope (where each went).
- The page's
spec-wrapped read has no measured producer, and its fixtures feed only that shape, which is how this defect stayed green. → filed objectui#12829, with the census as its first step. - With labels shown, the longest option is clipped in the closed picker trigger by the shared
SelectTrigger'sline-clamp-1(thepackages/components/src/ui/No-Touch zone). The open list shows every option in full. → Acceptance notes. - The normalization reads
updatedAt ?? updated_atinto a field the page never renders. → Acceptance notes, and named in objectui#12829.
6. Landing.
- Not governed:
check-governed-merges.mjs --rootobjectui--testover the 3 paths reads NOT governed (0 of 3 paths hit the register). - 138 lines changed, under the 3000-line threshold.
Clause-②: no. Every check is green or an expected skip.- ⇒ The seat lands it: relay
pr_ready+automerge_enable, through the merge queue. - On MERGED,
Fixescloses objectui#12783.
Generated by Claude Code
objectstack-fleet
Bot
deleted the
claude/issue-12783-flow-runs-picker-label
branch
October 17, 2026 00:19
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Fixes #12783
Clause-②: no
The developer Flow Runs page's flow picker lists every flow by its API name against a real server. objectstack's
getMetaItemsanswersmeta.getItems('flow')with flattened items: each flow'snameandlabelsit on the item itself, with nospecmember. The page's item normalization inloadFlows(FlowRunsPage.tsx) read the name asit?.spec?.name ?? it?.namebut the label asit?.spec?.labelalone, so the label was alwaysundefinedand the option fell back to the bare name.The label is now read the way the name is,
specfirst and then the item itself:The picker therefore shows the page's own
label (name)form for a labelled flow, and a flow with no label still shows its bare name. Nothing else on the page changes: no export, prop, type member or i18n key.Reproduction, before and after (browser)
Backend: objectstack
66d456d01,examples/app-showcase,objectstack dev --seed-admin --freshon a private port, used as a backend only. Console: this worktree'sapps/consoleVite dev server pointed at it. The probe signs in, opens/apps/showcase_app/component/developer/flow-runs, records the rawGET /api/v1/meta/flowanswer the page receives, and reads every option of the picker.The raw answer the page receives (identical in both runs): envelope keys
type,items,registrations; 32 items; 0 items carry aspecmember; 32 carry a top-levellabel.showcase_batch_remindersis served asname: showcase_batch_reminders,label: Batch Task Reminders (Loop), nospec.main33ee9ded841908label (name)formshowcase_batch_remindersoption textshowcase_batch_remindersBatch Task Reminders (Loop) (showcase_batch_reminders)showcase_task_completedNotify on Task Completed (showcase_task_completed)On the branch, picking that flow shows the trigger
Batch Task Reminders (Loop) (showcase_batch_reminders), and the Test Run panel lists its input variabletaskswith typelist: the runner reads the flow body fromspec: it?.spec ?? it, which already fell back to the flat item.Pins
New file
apps/console/src/pages/developer/FlowRunsPage.flattenedLabel-12783.test.tsx, three cases, each reading the opened picker's option texts:{ type, items }, item flat, nospec):Batch Task Reminders (Loop) (showcase_batch_reminders), thennightly_sync;spec-wrapped answer: the same two texts;nightly_syncalone.Direction, measured on unchanged
main(fix absent, pins present):Tests 1 failed | 2 passed (3). Case 1 is red with- "Batch Task Reminders (Loop) (showcase_batch_reminders)"/+ "showcase_batch_reminders". Cases 2 and 3 are green there by design: they guard the forms the fix must not disturb. With the fix:Tests 3 passed (3).Ablations (one per pin, fix committed first)
Each leg went through
ablation-replace.mjsin wrap mode: the literal anchorlabel: it?.spec?.label ?? it?.label,hit once, the mutation was verified on disk (anchor count 1 to 0, blob changed), the pin file ran, and the file was restored fromHEAD. Restore was proven per leg by the blob hash equal to theHEADblob (5147dc4b438b) andgit diff HEADempty. The subject is imported from source (./FlowRunsPage), so no build sits between the mutation and the run.label: it?.spec?.label,1 failed, 2 passed)specarm:label: it?.label,1 failed, 2 passed)... ?? it?.spec?.name ?? it?.name,3 failed): every case lists the unlabellednightly_sync, received asnightly_sync (nightly_sync)Hypothesis 1: other reads on this page that assume
specNone that changes what a user sees. The page reads no flow description and no flow type. The only other
specread isspec: it?.spec ?? it, which already falls back to the flat item; the Test Run panel's input variables come from it and are live on the served list (thetasksreading above). Nothing outside the claimed lines was changed.Local gates (final commit
d841908)pnpm --workspace-concurrency=2 --filter '@object-ui/console^...' buildthrough the verify lock:VERDICT command-exit 0.pnpm exec vitest run --maxWorkers=2 apps/console/src/pages/developer/(repo-root form, every suite under the directory, the new file included):Test Files 17 passed (17),Tests 139 passed (139), exit 0.pnpm --filter @object-ui/console type-check(script name echoed:tsc --noEmit && tsc -b tsconfig.node.json --force): exit 0.tsc --noEmit --listFilesinapps/consolelists all 17 test files under the directory, the new one included.--no-inline-config: exit 0, 0 errors; every warning sits on a line this diff does not touch.node scripts/check-changeset-presence.mjs: exit 0, one changeset declared (@object-ui/consolepatch).pnpm check:new-line-citations: exit 0,0 new citation(s).pnpm check:changeset-claimsandpnpm check:pending-changeset-literals, both exit 0.The rest of the farm is CI's.
Acceptance notes
specarm has no measured producer. On the showcase server 0 of 32 listed items carryspec, and the spec'sGetMetaItemsResponseSchematypesitemsas unknown. The page's other suites (FlowRunsPage.test.tsx,FlowRunsPage.sharedSelect-11865.test.tsx,developerMetadataEnvelope.contractEnvelope-6917.test.tsx) feed onlyspec-wrapped items, which is why none of them saw this. This change keeps thespecarm for the label exactly as the name already had it, as the claim pinned; whether both arms should be retired in favour of the flat item alone is a separate question, raised in the dev report.Nested Fan-out Reminders (Loop of Parallel) (showcase_nested_fan_out_reminders), is clipped in the closed trigger toNested Fan-out Reminders (Loop of Parallel)..., and the clipped line is centred. That comes from the shared ShadcnSelectTrigger(itsline-clamp-1on the value span inside a button). The open list shows every option in full. Not filed: it is the primitive's generic behaviour, not this page's.FlowItem.updatedAtis normalized fromupdatedAtorupdated_atbut is never rendered. Left as is.The work was done in session
https://claude.ai/code/session_01Vk15bz8xHtKGUfXfCm16h4.Generated by Claude Code