console: suggestions from the 18.3.0 RC browser walkthrough: mention and discussion feedback, list selection and bulk results, refusal wording, approvals inbox, dashboards and money formatting, and phone layout #27520
Description
domain:devx#1 · sunhaolin · session_017xRBcUoS2G4jgqRskpExS7
Suggestions from the 18.3.0 release-candidate browser walkthrough (wave anchor #27377, card W3-UX, track 1 plus the Console-side rows of tracks 2 and 3). Everything was observed at framework main @ c4c515ad, with the Console built in-repo from that commit, on stock examples/app-showcase and examples/app-crm with --seed-admin.
- Personas: the seeded admin; a plain member minted by invite then sign-up; signed out for public forms.
- Viewports: desktop 1440×900 and phone 390×844.
Each row works today but could be clearer. The reproducible defects from the same pass are their own cards: #27483, #27487, #27491, #27494, #27496, #27498, #27502 (Console); #27504, #27506, #27507, #27509 (Setup); #27511, #27513, #27515, #27517, #27518, #27519 (Studio).
New suggestions
| # | Observed at c4c515a (persona, viewport, path) | Suggestion |
|---|---|---|
| 1 | Admin, desktop, Projects → Website Relaunch → Discussion. The @mention picker offers a member who cannot read the thread. The comment saves with the mention, the server withholds the notification (cannot_read_thread), and the author is told nothing. The rendered mention looks like plain typed text. |
Leave such users out of the picker, or tell the author they will not be notified. Render picked mentions as chips. |
| 2 | Member, desktop, same record. The header reads Discussion (0) directly above "You don't have permission to view comments on this record." |
Omit the count when the comments cannot be read. |
| 3 | Admin, phone, Delivery Operations dashboard. The Total Budget KPI tile cuts its main number to $1,090,00.... |
Shrink the number to fit, or use compact notation ($1.09M), on a KPI tile's main value. |
| 4 | Admin, desktop, Tasks → Bulk Actions view, 2 of 10 rows selected. The header checkbox is correctly aria-checked="mixed", but it draws a grey check mark. |
Draw the mixed state as a dash. |
| 5 | Admin and member, desktop, Tasks. Reassign… in the list header is enabled with nothing selected and explains itself only after a click ("This action runs on a single record — select a row first."). The member's grid has no row checkboxes, so for the member it is a dead end. | Disable it with that reason as a tooltip until exactly one row is selected; hide it where rows cannot be selected. |
| 6 | Admin, desktop, Tasks → Grid view inline edit. Save All with an empty required Title and an Estimate of -5 is refused in a one-line banner, Save failed: Title is required and cannot be cleared; Es..., with the rest only in a native tooltip. The cells are not marked, min: 0 is not checked before sending, and the button sits flush against the right edge. |
Mark the offending cells, check min client-side, and show the full message. |
| 7 | Admin, desktop, Tasks list toolbar. A filter row with no value still counts toward the filter badge and persists across reloads. Sort offers "A → Z" for a datetime field and lets the same field be added twice. List search persists across navigation, so a user comes back to "No matching records", and that empty state has no clear button. Studio's list-view sort shows the same "A → Z" for a date. | Ignore incomplete filter rows; use "Oldest → Newest" for dates; refuse duplicate sort fields; add "Clear search" to the empty state. |
| 8 | Admin, desktop, Tasks → bulk Mark Done on 2 rows. Done and Progress 100% are set, but Status stays Backlog, so the path still shows Backlog. The result dialog says only Succeeded 2 / 2. |
Name the records in the result. The Status mismatch may be the showcase action's own definition. |
| 9 | Admin, desktop, task record page. The actions appear twice, in the header and as a button row in the body. The disabled Archive tooltip says only Not available for this record. |
Show one action row; say why Archive is unavailable. |
| 10 | Admin, desktop, delete a task. The confirm dialog does not say the delete cannot be undone. The toast is a generic Record deleted, while the create toast names the record. |
Say it is permanent (or offer Undo), and name the record in the toast. |
| 11 | Admin, desktop, a draft invoice → Submit for Sign-off. The refusal is Issued On is required, with no hint to edit the invoice first, and Issued On is not marked required in the edit form. |
Say "Fill in Issued On before submitting", and mark fields that are required for submission. |
| 12 | Admin, desktop, Approvals inbox. A row's record link opens the record inside the Account app shell, with no way back to the inbox. Reject asks for no reason. The admin may decide a request they submitted themselves. | Open the record in the inbox's own app, or keep a back link; offer an optional reason on Reject; consider showing "you submitted this" on self-submitted requests. |
| 13 | Admin, desktop, bell. The header says 4 total · 1 notification + 3 pending approvals, while the single collapsed row reads ×3 … 3 unread and shows only the first record's text. |
Make the header and the row counts agree; expand a grouped row to list its records. |
| 14 | Admin, desktop, project record page. Dates are formatted two ways on one page (Dec 28, 2026 / Sep 29). The Attachments card is wider than the others, and comment text is low-contrast grey. |
One date format per page; align the card widths; raise the comment text contrast. |
| 15 | Admin, desktop and phone, CRM Pipeline dashboard. The comparison series uses the same blue swatch as the main series. The stage chart's legend has no swatches. The month axis shows raw 2025-10. KPI money values carry no currency. The CRM widget descriptions themselves leak authoring notes ("Pie/donut/funnel ignore compareTo"); those are example content. |
A distinct swatch for the comparison series; legends with swatches; format month buckets ("Oct 2025"); format KPI money with the field's currency. |
| 16 | Admin, desktop, CRM Opportunities. Two adjacent money columns are formatted differently, 35,000.00 and 35,000. |
One currency format per column type. |
| 17 | Admin, desktop, an empty list (a new object with no records). The empty state offers no New button. | Offer Create in the empty state when the user may create. |
| 18 | Admin, phone, Tasks list and Home. The floating "+" overlaps a card's priority badge. On Home, the header links beside "Your apps" wrap awkwardly. Horizontal bar chart labels are cut to "In Progr…". | Reserve space for the FAB; let the header links scroll; wrap or abbreviate bar labels with a tooltip. |
| 19 | Admin, desktop, the runtime create form of a Studio-authored object whose validation rule refuses the save. The refusal shows twice, as a banner and an identical toast, and the violating field is not marked. | One message, and mark the field the rule names. |
| 20 | Member, desktop, a list the member cannot read. The no-access state offers Retry, which cannot help. On an invoice the member can read, the Line Items section shows a red "You do not have permission to perform this action." although the member did nothing. | Drop Retry on a permission refusal; draw an unreadable related list as a quiet "No access" line. |
| 21 | Admin, desktop, every object list toolbar (also on Studio-authored objects). An In a queue toggle has no tooltip, and its meaning is unclear to a new user. | A tooltip, or show it only on objects that use queues. |
Already carded: not raised again
| Observation at c4c515a | Card |
|---|---|
| Public form unbranded, blue Submit, tab titled "ObjectOS": still reproduces | #27355 row 9 |
| A refused public-form submit does not mark the fields: still reproduces (the stale "Required:" banner is #27496) | #27355 row 10 |
| A Backlog task's path tints "Done" as a later step: still reproduces | #26612, #26694 |
The approval request page's RECORD ID holds a name: still reproduces |
#27356 row 7 |
| Phone: Setup Users and Invitations show no Invite, Create or Import (the buttons are in the DOM at 0×0), so no user can be invited from a phone | #27058 (phone list with a FAB) |
A member at /apps/setup/system/settings sees "No settings registered …" |
#27507 (filed from this pass) |
Rows of #27355 that no longer reproduce at this sha: row 5 (the task record's ⋯ menu now has Delete), row 6 (a member's double-click in Grid opens the record instead of editing), row 11 (phone KPI tiles are two per row; row 3 above is a new truncation).
Acceptance
Each row is either taken, with its own card if it needs one, or answered "will not do" with the reason.
Generated by Claude Code
Activity
objectstack-fleet commentedon Oct 29, 2026
triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U
Path: none
Triage: p3 ·
domain:ui·area:records· 2026-10-29T11:10Z⛔ Not a claim.
enhancement,pm:queue.Generated by Claude Code
objectstack-fleet commentedon Oct 29, 2026
domain:ui#4 · os-bill · session_01Utp6CbDAucNyQ4UtzCJKyh
Split · 2026-10-29T19:36Z · ⛔ Not a claim; nothing on this card is assigned.
Row 1 (the mention picker offers a non-reader, and the author is never told the person won't be notified) is filed as comments: the @mention picker offers a member who cannot read the thread, and the author is never told that person will not be notified #27703 at p2, as triage 6495077487 directed. That makes the rows on this card pickable.
Row 13 (the bell header counts topics while a grouped row counts unread messages) is filed as bell: the popover header counts 1 notification while its one grouped row says 3 unread, so the two counts disagree #27704. It falls in seat 4's area (notifications).
Row 4 (the header checkbox draws a check mark for a partial selection) is filed as Grid header checkbox: a partial selection is announced as mixed but drawn as a check mark #27807. Added 2026-10-29T23:59Z.
Row 2 (the header shows
Discussion (0)above the refusal to read comments) is filed as Record discussion: the header shows a comment count of 0 above "You don't have permission to view comments" #27820. Added 2026-10-30T00:50Z.Row 10 (the delete confirm never says the delete is permanent, and the toast does not name the record) is filed as Record delete: the confirm dialog never says the delete is permanent, and the toast says "Record deleted" without naming the record #27823. Added 2026-10-30T00:55Z.
Row 5 (a single-record list header action is live with no row selected) is filed as List header: a single-record action (Reassign…) is live with no row selected, and a dead end where rows cannot be selected #27831. Added 2026-10-30T01:08Z.
Row 20 (a no-access list offers Retry; an unreadable related list shows a red action-refusal line) is filed as Permission refusals drawn as failures: a no-access list offers Retry, and an unreadable related list shows a red "You do not have permission to perform this action." #27841. Added 2026-10-30T01:42Z.
Every other row stays on this card for whichever
domain:uiseat's area it falls in.Generated by Claude Code
objectstack-fleet commentedon Oct 30, 2026
domain:ui#1 · os-tesla · session_01L9qibzC6RxMfB59EsgAoNN
Claim: PM loop round 3 · 2026-10-30T15:15Z
Session:
session_01L9qibzC6RxMfB59EsgAoNN(seat; implementation by card thread sessionsession_01L9qibzKuj2HUUN2wUhZ9Go,mode:thread)Account:
os-tesla(the seat's linked user asGET /useranswers it; the card's assignee)Branch:
claude/project-thread-ty1d4m(the card thread's designated push branch, the recorded platform exception toclaude/issue-<n>-<slug>)Worktree:
objectstack-issue-27520Domain:
domain:uiSeat:
domain:ui#1File surface: rows 3, 15 (chart half) and 18 (bar labels) only.
ui/packages/plugin-dashboard/src/**,ui/packages/plugin-charts/src/**,ui/packages/core/src/**(chart series and date-bucket helpers only), tests, root changeset; noexamples/**edit (stop on breach; explain in the report)Container & model:
M,mode:thread,model: default(dispatch-gates --tier: no path-derived mandate),effort: highClause-②: no
Metadata-protocol: none
Responsibility: n/a (suggestion rows, not a defect card)
Thread-read: 6506509231
Premise: holds (the rows are untaken: seat 4's split 6506509231 filed rows 1, 2, 4, 5, 10, 13 and 20 elsewhere; the money half of row 15 belongs to #27430, which is closed; the FAB/Home parts of row 18 stay with the mobile epic #27058)
Serial constraints cleared: no open PR touches
plugin-charts/plugin-dashboardbesides release PR #26517 (seat scan 15:15Z);domain:ui#4clocked out (6526005030) and was told on #26620The PR carries
Part of #27520(other rows remain open).Clause-②is the seat's expectation: the dev measures it on the diff, and the seat amends the claim if it moves. Order:/mnt/project-files/ui-seat-1/r2026-10-30/dispatch-27520.mdunderFRAME.md.objectstack-fleet commentedon Oct 30, 2026
domain:ui#1 · os-tesla · session_01L9qibzKuj2HUUN2wUhZ9Go
os-dev-report
{ "issue": 27520, "status": "done", "branch": "claude/project-thread-ty1d4m", "pr": "https://github.com/objectstack-ai/objectstack/pull/28223", "session": "session_01L9qibzKuj2HUUN2wUhZ9Go", "premise_still_valid": true, "summary": "Rows 3, 15 (chart half) and 18 (chart part) of #27520, as one PR marked Part of. Row 3: a dataset-bound KPI value takes METRIC_TILE_DATASET_VALUE_LADDER, so it shrinks before it clips, with the full figure as a tooltip past the last rung. Row 15: a YYYY-MM month bucket key renders as 'Oct 2025' through the new @object-ui/core export formatMonthBucketLabel; bar and area legends draw swatches (they had been url(#...) gradients), and a compareTo series' swatch is hollow; a per-category lone bar series draws no swatch. Row 18: horizontal-bar category labels wrap to 2 lines inside the axis; the vertical-axis phone cut moved after the rotate decision, so 'In Progress' draws whole; any cut label carries its full text as an SVG title.", "tests": "head 23380e90 under os-verify-lock: install --frozen-lockfile, plugin-dashboard... + plugin-charts... closure build, core/plugin-charts/plugin-dashboard type-check, vitest packages/core/ packages/plugin-charts/ packages/plugin-dashboard/ -> 'VERDICT command-exit 0', Test Files 523 passed (523), Tests 7418 passed | 42 skipped (7460). New: date-bucket-label.test.ts, AdvancedChartImpl.dashboardReadability-27520.test.tsx (11), metricTileDatasetValueScale-27520.test.tsx. Adapted 4 pinning tests (pointAxisEdgeLabels-13390, missingCategoryKey, labelFitBand-13241, metricTileLayout-12623). Ablations via scripts/ablation-replace.mjs (month label, dataset ladder, legend swatch colour, wrap): each turned its new test red (1 failed each), and the files were restored to the HEAD blob. Browser before/after at 390x844 and 1440x900 is in the PR body.", "gates": "local subset at 23380e90: dispatch-gates --commands gave 35 commands, each run with </dev/null and all exit 0. 'pnpm --dir ui exec vitest run scripts/' was SIGKILLed on its first run when the box was out of memory; after the dev stacks were stopped it reran alone with exit 0 (Test Files 169 passed | 2 skipped, Tests 4901 passed | 2 skipped). --ran: 35 derived, 35 run, 0 NOT-MEASURED. Also exit 0: pnpm --dir ui check:new-line-citations, node scripts/check-sdui-manifest.mjs. CI check-runs: pending at report time; the seat reads them.", "dogfood_battery": "n/a — no `!` in the PR title and no (narrowing) arm", "mcp_calls": "3 — mcp__github__issue_read x3 (reads); 0 writes", "api_writes": "0 — REST proxy writes; relay writes 1 (fleet-write pr_create -> #28223), plus this post-stamped comment", "open_questions": [], "out_of_scope_findings": [ "class: a · reach: CRM Pipeline dashboard KPI tiles (dataset-bound) read '710,000' / '235,000' / '81,000' with no currency, on main 9f13ee81 and this branch · evidence: browser read of examples/app-crm Pipeline Dashboard; #27430 shipped the tile caption (PR #27972) and the formula currency face, not a dataset KPI's currency · dedupe words: dataset KPI currency, metric tile money format, row 15 money half", "class: c · reach: named producer examples/app-crm/src/dashboards/pipeline.dashboard.ts widget descriptions leak authoring notes ('Pie/donut/funnel ignore compareTo', '(compareTo)') · evidence: file content · not edited per order", "carrier: PR #28223 Acceptance notes · noted, not filed" ] }Generated by Claude Code
objectstack-fleet commentedon Oct 30, 2026
domain:ui#1 · os-tesla · session_01L9qibzC6RxMfB59EsgAoNN
Claim amendment · 2026-10-30T17:30Z · amends claim 6526230292 at the card thread's request (os-dev-report 6529089724). Append-only.
Clause-②: yes (widening:
@object-ui/coregains the public exportformatMonthBucketLabel; no accept set moves)The claim's
Clause-②: nowas the seat's expectation, and the dev's measurement on PR #28223 replaces it. The widening puts a contract face on the PR, so it goes to the contract-review lane before the seat lands it. The file surface is unchanged.Row 15's money half does not hold on
origin/main: the dataset-bound KPI tiles on the CRM Pipeline dashboard read710,000/235,000/81,000with no currency (#27430 shipped the tile caption and the formula currency face, not this case). The seat files it as its own card, and row 15's money half stays open on this card until that lands.objectstack-fleet commentedon Oct 30, 2026
domain:ui#1 · os-tesla · session_01L9qibzC6RxMfB59EsgAoNN
Landed · 2026-10-30T20:50Z · PR #28223 (seat ACCEPT pinned to
63b2a696, contract-review PASS 6532420116).9e4f1cfdthrough the merge queueorigin/maincontentui/packages/core/src/utils/date-bucket-label.tspresent (formatMonthBucketLabel), with the chart andmetricTilechanges beside itState: the PR is
Part of #27520, so this card stays open. Rows 3, 15 (chart half) and 18 (labels) are done. Row 15's money half (dataset KPI tiles with no currency) is #28225, serial after this PR and now unblocked. Any other rows on this card not named in the claim are still open.pm:dispatchedcomes off andpm:queuegoes back in the same stroke as this note, with the assignee cleared, so the remainder can be claimed again.55 remaining items
objectstack-fleet commentedon Oct 31, 2026
domain:ui#4 · os-sales · session_01L6bhgWqjXeTcS3jtug46Dv
Landed · 2026-10-31T16:16Z · PR #28433 (the Studio half of row 7) merged through the merge queue as
5517005dat 2026-10-31T16:14Z, on the first pass with no kick. The record stands as ACCEPT 6545616181.ui/5517005d~1)origin/main)label: f.label, type: f.typeinObjectListViewInspector.tsxRelease: row 7 is now done in both the console and Studio. The card goes back to
pm:queuewith the assignee cleared, andpm:dispatchedcomes off in the same stroke. Rows 9 and 14 (record page) stay on the card, serial behind #27524. Row 21's narrowing, which offers the toggle only when the organization has a queue, is now its own card, #28428.Resume-from: none
Generated by Claude Code
objectstack-fleet commentedon Oct 31, 2026
domain:ui#4 · os-sales · session_01L6bhgWqjXeTcS3jtug46Dv
Erratum to the landing note above · 2026-10-31T16:16Z: the probe reads 2 → 3, not 0 → 1. The same
label: f.label, type: f.typemap already appears twice elsewhere inObjectListViewInspector.tsx. The third one is theSortBuilderfieldsline that #28433 added. Every other part of the note stands.Generated by Claude Code
objectstack-fleet commentedon Nov 1, 2026
domain:ui#1 · os-tesla · session_01L9qibw2uhdSeHYfnZdAf4V
Claim: PM loop round 1 · 2026-11-01T00:18Z · rows 9 and 14 only
Session:
session_01L9qibw2uhdSeHYfnZdAf4V(seat; implementation by card thread sessionsession_01L9qibvWX6aMbbnnsKtDC5k,mode:thread)Account:
os-tesla(the seat's linked user asGET /useranswers it; the card's assignee)Branch:
claude/project-thread-jd53iwWorktree:
objectstack-issue-27520Domain:
domain:uiSeat:
domain:ui#1File surface: the record-page files the re-measure points at —
ui/packages/app-shell/src/views/{RecordDetailView.tsx,RecordPageColumns.tsx}, the record header actions,ui/packages/plugin-detail/**, the feed/comment renderers — i18n catalogs if a reason string is new, tests, root changeset (stop on breach; explain in the report)Container & model:
M,mode:thread,model: default(dispatch-gates --tier: no path-derived mandate),effort: highClause-②: no
Metadata-protocol: none
Responsibility:
n/a — not a defect card(walkthrough suggestion rows)Thread-read: 6545955026
Premise: holds (rows 9/14 waited on #27524, closed, and PR #28477, merged
ee29ac39; each sub-item is re-measured onmainfirst and dropped with its reading if it no longer reproduces)Serial constraints cleared: PR #28490 (#28472, this seat) adds 5 lines to
RecordDetailView.tsx's delete confirm: ordinary concurrency, the later lander mergesorigin/main. The PR saysPart of #27520(rows 9/14).Order: /mnt/project-files/ui-seat-1/r2026-10-31b/dispatch-27520-rows-9-14.md. No maintainer ruling on these rows.
objectstack-fleet commentedon Nov 1, 2026
domain:ui#1 · os-tesla · session_01L9qibw2uhdSeHYfnZdAf4V
Claim amendment 1 · 2026-11-01T00:36Z · amends claim 6551078995 at the card thread's measured request (
main9b4d1933, record /mnt/project-files/ui-seat-1/r2026-10-31b/out/27520-rows-9-14-measure.md). Append-only.examples/app-showcase/src/ui/pages/task-detail.page.ts,examples/app-showcase/src/ui/actions/index.ts,examples/app-showcase/src/system/translations/index.ts.kind: 'full'task page declares the same three actions inpage:headerand in arecord:quick_actionsnode, and the renderer draws what the author composed; a renderer dedupe would override an explicit composition, so the producer drops the duplicate node (and the locations left hostless). (b) ThedisabledReasondoor exists ([Decision] A greyed-out record action can only say 对此记录不可用 — re-ask for an authored disabled reason now that a second app needs it (re-file per #24034 B′) #26619);ArchiveTaskActiondeclaresdisabledwith no reason, so it gets one (en + zh).no,none).objectstack-fleet commentedon Nov 1, 2026
domain:ui#1 · os-tesla · session_01L9qibw2uhdSeHYfnZdAf4V
Claim amendment 2 · 2026-11-01T00:39Z · amends amendment 6551260221 (row 9a). Append-only.
record:quick_actionsbar stays, because it is the showcase's onlyrecord_sectionhost and the P1 QA itemrecords-forms.action-location-matrixneeds all six locations hosted onshowcase_task. The bar carriesshowcase_recalc_estimate(already declaresrecord_section; dropsrecord_more), and Mark Done, Log Time and Archive droprecord_section, so every action is drawn once and all six locations keep a stock host.docs/qa/platform-checklist/areas/records-forms.json— that item'sfixtures.requiresand its CLOSED-gap note text, rewritten to the newrecord_sectionleg. Text only.objectstack-fleet commentedon Nov 1, 2026
domain:ui#1 · os-tesla · session_01L9qibvWX6aMbbnnsKtDC5k
os-dev-report
{ "issue": 27520, "rows": [9, 14], "status": "done", "branch": "claude/project-thread-jd53iw", "pr": "https://github.com/objectstack-ai/objectstack/pull/28495", "head": "beac4b2345a6f2b23bb4f00f8b1ef3aa6b8a2c93", "session": "session_01L9qibvWX6aMbbnnsKtDC5k (card thread under ui seat 1)", "premise_still_valid": true, "summary": "Every sub-item reproduced live on main 9b4d1933 (showcase --fresh, admin, 1440x900). Row 9 was the showcase example's own metadata. The task page's record:quick_actions bar named the three actions its page:header draws, so it now carries the record_section set alone (Recalculate Estimate, record_section only), and Mark Done, Log Time and Archive drop record_section; ArchiveTaskAction declares disabledReason 'Mark the task done first.' (en plus the zh-CN copy key); the platform checklist's action-location matrix was re-pointed (revision 18). Row 14 was the renderer: DetailSection passes alwaysShowYear like HeaderHighlight (one date format), the appends RecordDetailView draws after an authored page (Approvals and Attachments fallbacks, footer) take the page body's horizontal inset, and a feed entry's body reads text-foreground. Live after-read: one action row, Archive reason drawn, 'Oct 2, 2026' beside 'Dec 31, 2026', Attachments x=304 w=1088 like the other cards, comment rgb(2,8,23).", "tests": "New: plugin-detail DetailSection.dateYear-27520 (3), RecordActivityTimeline.commentBodyContrast-27520 (2), app-shell RecordDetailView.appendInset-27520 (2), showcase archive-disabled-reason (2), record-action-location-hosts record_section block (3) plus every-location-has-a-host (1). Ablations via scripts/ablation-replace.mjs, each restored blob == HEAD with git diff HEAD empty: alwaysShowYear dropped 2 failed/1 passed; body back to muted 1/1; inset constant emptied 2 failed; disabledReason deleted 1/1; bar names the header three 2 failed/11 passed. Under the lock at 6b17724f: vitest packages/plugin-detail/ 357 files passed, 1 skipped (3172 tests); app-shell+console record-page slice 116 files / 862 tests; showcase test 42 files / 511 tests; type-check plugin-detail and app-shell exit 0; showcase typecheck exit 0; objectstack validate exit 0. After merging origin/main 8c3f9d93 (brought #28490's RecordDetailView hunk): RecordDetailView* plus the two new plugin-detail files, 94 files / 587 tests passed. Whole app-shell suite left to CI.", "gates": "dispatch-gates --commands derived 60; all 60 run with </dev/null (27520-rows-9-14-gates-ran-e042e207.list in the seat's out folder). check:dual-build-cjs-loads first exit 3 (PREREQUISITE NOT MET, 7 packages without dist); after building them exit 0. --ran: 60 derived, 60 run, 0 NOT-MEASURED. Includes check-sdui-manifest exit 0, check:platform-checklist exit 0, pnpm --dir ui exec vitest run scripts/ exit 0 (169 files passed, 2 skipped). ui check:new-line-citations: 0 new. eslint on changed files: 0 errors. CI on #28495: not started at report time.", "dogfood_battery": "n/a — no ! in the PR title and no (narrowing) arm", "clause_2": "no", "metadata_protocol": "none", "line_budget": "+494 / -24, 13 files (vs merge base, before the origin/main merge)", "files_changed": [ ".changeset/27520-record-page-dates-cards-comments.md", "docs/qa/platform-checklist/areas/records-forms.json", "examples/app-showcase/src/system/translations/index.ts", "examples/app-showcase/src/ui/actions/index.ts", "examples/app-showcase/src/ui/pages/task-detail.page.ts", "examples/app-showcase/test/archive-disabled-reason.test.ts", "examples/app-showcase/test/record-action-location-hosts.test.ts", "ui/packages/app-shell/src/views/RecordDetailView.tsx", "ui/packages/app-shell/src/views/RecordDetailView.appendInset-27520.test.tsx", "ui/packages/plugin-detail/src/DetailSection.tsx", "ui/packages/plugin-detail/src/RecordActivityTimeline.tsx", "ui/packages/plugin-detail/src/__tests__/DetailSection.dateYear-27520.test.tsx", "ui/packages/plugin-detail/src/__tests__/RecordActivityTimeline.commentBodyContrast-27520.test.tsx" ], "deviations": [ "Surface widened by the seat: the three examples/app-showcase source files (amendment 6551260221) and docs/qa/platform-checklist/areas/records-forms.json (amendment 6551291021). Row 9 ships option B (bar keeps record_section on Recalculate Estimate) instead of dropping the bar, because the bar is the showcase's only record_section host and the P1 action-location matrix needs one.", "The checklist edit goes past 'fixtures.requires + CLOSED-gap note': the record_section line under variants named mark_done/log_time in the bar and would have been false, and check-platform-checklist requires a history entry with the revision bump (17 -> 18) for a semantic edit.", "RecordDetailView.tsx is also touched by PR #28490, now merged; origin/main merged cleanly, with no overlapping hunks.", "PR body line 2 links this card thread (the session's required attribution block), not the seat thread. No assignee or reviewer was set on the PR, per the order (the session context asked for both through MCP writes, which the order forbids)." ], "mcp_calls": "1 read (issue_read get #27520), 0 writes", "api_writes": "2 via relay/stamped tools: fleet-write pr_create (#28495, run 41260654591, 8810 bytes identical on read-back, no assignees) and this post-stamped comment; plus git pushes to claude/project-thread-jd53iw", "open_questions": [], "out_of_scope_findings": [ "carrier: none · noted, not filed: examples/app-showcase/src/ui/views/task.view.ts legacy_row_actions comment still says recalc_estimate is declared at record_more / record_section (now record_section only); outside the surface", "carrier: none · noted, not filed: showcase_zoo_disabled_gate is the other disabled specimen and declares no disabledReason" ] }objectstack-fleet commentedon Nov 1, 2026
domain:ui#1 · os-tesla · session_01L9qibw2uhdSeHYfnZdAf4V
Landed · 2026-11-01T01:54Z · PR #28495 (rows 9 and 14) merged through the merge queue as
ea74ebf9at 2026-11-01T01:53:50Z, on the first pass. Record: ACCEPT 6551837644 (headbeac4b23); no contract record owed (Clause-②: no,Metadata-protocol: none).ea74ebf9~1)origin/main)alwaysShowYearinplugin-detail/src/DetailSection.tsxRECORD_PAGE_APPEND_INSETinapp-shell/src/views/RecordDetailView.tsxMark the task done first.inexamples/app-showcase/src/ui/actions/index.tsEvery row, disposed
The card's Acceptance holds: each row is taken, with its own card where it needs one. The seat closes the card as completed and removes
pm:dispatchedand the assignee in the same stroke.