Repository navigation
4-hourly full run: red on main (CI) #27076
Description
os-4-hourly-full-run-ci — machine-findable marker for this generated card. ⛔ Do not delete this line: it is how the 4-hourly full run finds this card instead of filing a new one every 4 hours.
4-hourly full run: red on main (CI)
Swept 2026-10-28T12:25:20.367Z · run log · commit d745bb5e5ff7ea034b77bae0f16fcdd4c8dd21d3 · conclusion failure.
CI runs the FULL battery on main every 4 hours (#16467, #25771). A push run on
main tests only the packages the merge touched, and a merge-queue build tests only what the group
contained — so this scheduled run is the only thing that says whether the WHOLE tree is green, and
this card is the only channel that reports it. Nothing is blocked by it.
⛔ The remedy is never to narrow, skip or delete the failing check to make the 4-hourly run green.
Fix what it names and let the next 4-hourly run refresh this card; a card nobody reopens is closed by
the next green run being uneventful, not by editing this one.
What landed since the last green 4-hourly run
Range: 3217fc5dcf (run 40606905083, the last green CI schedule run) .. d745bb5e5f — compare
49b505915afeat(ui): the rest of the Studio strings and the metadata preview panes move into the studio i18n namespace (app-shell: a published library that is 66% Console product surface — retire the 67 zero-reference exports now, decide the split, and fold the second i18n table into @object-ui/i18n #25922 slice S5) (feat(ui): the rest of the Studio strings and the metadata preview panes move into the studio i18n namespace (#25922 slice S5) #26942)5bd3d2f95efix(metadata-protocol): diagnostics stop flaggingpicklistandoptionson a field that declares onlypicklist(fix(metadata-protocol): diagnostics stop flaggingpicklistandoptionson a field that declares onlypicklist#26953)ee2aaf0f13feat(app-shell): a Studio rail search that matches nothing names the query and offers to clear it (feat(app-shell): a Studio rail search that matches nothing names the query and offers to clear it #26959)c6853b124ddocs(qa): retire the objectui-pin wording left in the checklist ledger (docs(qa): retire the objectui-pin wording left in the checklist ledger #26962)27e4d6564bfix(core): the console runs a stored action that leavestypeto its default as a script action (fix(core): the console runs a stored action that leavestypeto its default as a script action #26964)fd246c22c9docs(pm-dispatch): route any card that involves cloud to the cloud PM, by involvement rather than by where the code lands (docs(pm-dispatch): route any card that involves cloud to the cloud PM, by involvement rather than by where the code lands #26972)31a608eb58fix(app-shell): nav page picker offers a draft page only when its draft body can be a nav target (fix(app-shell): nav page picker offers a draft page only when its draft body can be a nav target #26968)1986d25598fix(app-shell): the dashboard's Add-widget menu and widget Type select offer every spec widget type, from one registry (fix(app-shell): the dashboard's Add-widget menu and widget Type select offer every spec widget type, from one registry #26967)b8f596cfdafix(app-shell): Studio Interfaces item header names a label-less object entry by its label, as the rail does (fix(app-shell): Studio Interfaces item header names a label-less object entry by its label, as the rail does #26974)1bd7574722docs(skills): objectstack-formula eval case 4 names the refused date forms without spelling its own must_not_contain strings (docs(skills): objectstack-formula eval case 4 names the refused date forms without spelling its own must_not_contain strings #26978)0b78a20be7docs(pm-dispatch): read a PR's live state before any report to the maintainer (docs(pm-dispatch): read a PR's live state before any report to the maintainer #26741)eae9a588e7ci: restore the Next.js cache on every run, save it on push and schedule only (ci: restore the Next.js cache on every run, save it on push and schedule only #26984)5e99bd936cdocs(adr): ADR-0097 "Upstream availability" states the mcp credential-rejection carve-out (fatal configuration fault, never retried) (docs(adr): ADR-0097 "Upstream availability" states the mcp credential-rejection carve-out (fatal configuration fault, never retried) #26985)403ca0194erefactor(metadata-protocol): move the code-datasource predicates out of protocol.ts into protocol-code-datasource-predicates.ts ([maintainer] refactor(metadata-protocol): splitsrc/protocol.ts(33,065 lines, +10,169 in 30 days) along itsObjectStackProtocolImplementationseams, one move-only slice per PR #25467 cut 28) (refactor(metadata-protocol): move the code-datasource predicates out of protocol.ts into protocol-code-datasource-predicates.ts (#25467 cut 28) #26980)e6e0faab9edocs(skills): the actions rule, its eval and the i18n skill teach an action'sdisabledReason(docs(skills): the actions rule, its eval and the i18n skill teach an action'sdisabledReason#26983)3271a0834cfix(console): a shared non-chat record renders as read-only rows, not raw JSON (fix(console): a shared non-chat record renders as read-only rows, not raw JSON #26989)6328a075f3fix(plugin-security): metadata-derived caches invalidate on a runtime metadata publish (fix(plugin-security): metadata-derived caches invalidate on a runtime metadata publish #26878)e6c4409000ci(ui-merge): port objectui's lockfile-integrity gate into Type Check UI and retire lockfile-dedupe and the shadcn-check report (ci(ui-merge): port objectui's lockfile-integrity gate into Type Check UI and retire lockfile-dedupe and the shadcn-check report #26995)e79be7db59docs(releases): point two release-owned north-star links at the published URL (docs(releases): point two release-owned north-star links at the published URL #26992)d7df63957dfix(app-shell): Studio's Automations, App and Data creates refuse an identifier a published or draft item already holds (fix(app-shell): Studio's Automations, App and Data creates refuse an identifier a published or draft item already holds #26987)a8ee8a229afix(studio): keep a refused publish on its Pending changes entry, and end "Show me" on the input (fix(studio): keep a refused publish on its Pending changes entry, and end "Show me" on the input #26994)9fab076fa8feat(spec,plugin-approvals,app-shell): the approvals get serves a request's own route, and both approval step lines draw it (feat(spec,plugin-approvals,app-shell): the approvals get serves a request's own route, and both approval step lines draw it #26976)7eb613c39ffeat(app-shell): author a nav entry's landing, badge, order and visible condition in the Studio inspector (feat(app-shell): author a nav entry's landing, badge, order and visible condition in the Studio inspector #26977)e46e25c0e1fix(runtime): a hook refused for a missing capability answers a coded 403 naming the hook and the capability, not a bare 500 (fix(runtime): a hook refused for a missing capability answers a coded 403 naming the hook and the capability, not a bare 500 #26963)5ad6f22ca3fix(app-shell): the delegated-admin scope facet shows the spec default for an unset key (fix(app-shell): the delegated-admin scope facet shows the spec default for an unset key #26990)0eb2d21d05fix(objectql): a predicate update or delete recomputes the parent roll-up summaries its matched rows name (objectql: a predicate update or delete (multi: truewith a filter) leaves parent roll-up summaries stale, becauserecomputeSummariessees no parent id on the predicate path #26950) (fix(objectql): a predicate update or delete recomputes the parent roll-up summaries its matched rows name (#26950) #27000)4eb11405f0ci(docs-deploy): deploy the Object UI docs site (www.objectui.org) from ui/apps/site (ci(docs-deploy): deploy the Object UI docs site (www.objectui.org) from ui/apps/site #27005)4daad78fb3docs: fold the ui/ top-level docs into the root README, ROADMAP and CONTRIBUTING ([Decision] ui/ merge leftovers that no aftercare card names: six nested top-level docs, a second copy of four .claude hooks, an independently numbered ui/docs/adr, and a dead ui/.github/dependabot.yml #26080 slice 1) (docs: fold the ui/ top-level docs into the root README, ROADMAP and CONTRIBUTING (#26080 slice 1) #27001)4bce21da81feat(adr-0087): retire a deleted published package whole (PACKAGE#*, D9 amendment) (feat(adr-0087): retire a deleted published package whole (PACKAGE#*, D9 amendment) #26766)acc9c57d0afix(app-shell): show the explain refusal's message instead of blanking the Access panel (fix(app-shell): show the explain refusal's message instead of blanking the Access panel #27012)4f93696375fix(metadata-protocol,runtime,app-shell)!: refuse a save or draft publish naming a package that is not installed (fix(metadata-protocol,runtime,app-shell)!: refuse a save or draft publish naming a package that is not installed #26920)25a697ec69docs: one North Star — docs/NORTH-STAR.md; the architecture page moves to concepts/architecture-overview (docs: one North Star — docs/NORTH-STAR.md; the architecture page moves to concepts/architecture-overview #26970)a90163d477fix(app-shell): the field-permission editor shows and writes exactly what the runtime enforces for a field with no explicit rule (fix(app-shell): the field-permission editor shows and writes exactly what the runtime enforces for a field with no explicit rule #27006)b3f73445f4feat(spec): a hook declares its refusal catalogue, and its body refuses by code, answered in the caller's language (feat(spec): a hook declares its refusal catalogue, and its body refuses by code, answered in the caller's language #26831)6d9e5a1874ci(test-core): build declarations on one CLI slice only — pin the CLI's declaration readers into slice 1/n (ci(test-core): build declarations on one CLI slice only — pin the CLI's declaration readers into slice 1/n #27018)c79eda5ed5fix(ui/scripts): check:node-esm-load and check:published-dist build modes run the release's build (fix(ui/scripts): check:node-esm-load and check:published-dist build modes run the release's build #27014)cb8988ee14fix(plugin-auth): store the session client address in RFC 5952 text and write last_activity_at at creation (fix(plugin-auth): store the session client address in RFC 5952 text and write last_activity_at at creation #27003)3230bdbf76fix(app-shell): keep the Tab visibility name input across keystrokes (fix(app-shell): keep the Tab visibility name input across keystrokes #27025)f708cf224afeat(ui): the flow designer and the rest of the Studio chrome move into the studio i18n namespace (app-shell: a published library that is 66% Console product surface — retire the 67 zero-reference exports now, decide the split, and fold the second i18n table into @object-ui/i18n #25922 slice S6) (feat(ui): the flow designer and the rest of the Studio chrome move into the studio i18n namespace (#25922 slice S6) #27023)5cba8fc2f1test(dogfood): packaged-action-disabled-dispatch-live picks a not-done task and reads its own ledger row (test(dogfood): packaged-action-disabled-dispatch-live picks a not-done task and reads its own ledger row #27066)7414fc8e75feat(app-shell,plugin-list,plugin-grid,i18n): the Display menu's Open records section writes the reader's drawer | split preference; the name cell's ↗ opens the record as the full page (feat(app-shell,plugin-list,plugin-grid,i18n): the Display menu's Open records section writes the reader's drawer | split preference; the name cell's ↗ opens the record as the full page #27031)cd609a4979docs(adr): ADR batch 2 of the stale Proposed records — 0038, 0046, 0051 Accepted, 0052 Accepted (narrowed to what landed) (docs(adr): ADR batch 2 of the stale Proposed records — 0038, 0046, 0051 Accepted, 0052 Accepted (narrowed to what landed) #27034)68748c39bcrefactor(metadata-protocol): move the legacy-organization row filters out of protocol.ts into protocol-legacy-organization-rows.ts ([maintainer] refactor(metadata-protocol): splitsrc/protocol.ts(33,065 lines, +10,169 in 30 days) along itsObjectStackProtocolImplementationseams, one move-only slice per PR #25467 cut 29) (refactor(metadata-protocol): move the legacy-organization row filters out of protocol.ts into protocol-legacy-organization-rows.ts (#25467 cut 29) #27029)6aba7cbc15fix(studio): Interfaces lists a package's pages, dashboards, reports and views no nav entry names (fix(studio): Interfaces lists a package's pages, dashboards, reports and views no nav entry names #26982)cbb3a1a1a5fix(console): the approvals inbox names the flow, the step and the object in the reader's language (fix(console): the approvals inbox names the flow, the step and the object in the reader's language #27040)693a729824fix(objectql): a predicate delete walks the rows it matches as one set, one probe per relation per 500 rows (objectql: since #26930 a predicate delete walks every matched row one by one; 1,001 rows cost ~1.7 s (18×), and rest's nested-object-door cap test now nears its 5 s budget in the merge queue #27004) (fix(objectql): a predicate delete walks the rows it matches as one set, one probe per relation per 500 rows (#27004) #27073)fbc16563a6fix(app-shell): show Studio nav entries in the menu's order, and let a canvas drag write order (fix(app-shell): show Studio nav entries in the menu's order, and let a canvas drag write order #27039)045cfa4aadfix(runtime): an action or job body refused for a missing capability answers the same coded 403 a hook body does, not a bare 500 (fix(runtime): an action or job body refused for a missing capability answers the same coded 403 a hook body does, not a bare 500 #27045)c6bc269c97docs(qa): wave-2 checklist-accuracy close-out, slice A — seven areas and three RUNNER facts (docs(qa): wave-2 checklist-accuracy close-out, slice A — seven areas and three RUNNER facts #26969)f86106b94ddocs(qa): wave-2 checklist-accuracy close-out, slice B — six areas (docs(qa): wave-2 checklist-accuracy close-out, slice B — six areas #27009)27133776d7fix(app-shell): a screen-flow result screen draws Done, and closing it completes the run (fix(app-shell): a screen-flow result screen draws Done, and closing it completes the run #27046)69df290ea5fix(app-shell): the permission matrix's object rows show exactly what the runtime enforces for every grant shape (fix(app-shell): the permission matrix's object rows show exactly what the runtime enforces for every grant shape #27051)e3470ed9f5feat(security)!: resolve current_user.queues kernel-side and reserve thequeuesmembership key (feat(security)!: resolve current_user.queues kernel-side and reserve thequeuesmembership key #27044)c8097a9000fix(app-shell): list a report in the index and ⌘K only when the navigation shows the member its entry (fix(app-shell): list a report in the index and ⌘K only when the navigation shows the member its entry #27060)76e90df613fix(app-shell): list a package's draft objects in the Access matrix, badged as drafts (fix(app-shell): list a package's draft objects in the Access matrix, badged as drafts #27064)19a2b61767chore(deps): take chore(deps)(deps-dev): bump the development-dependencies group across 1 directory with 22 updates #26556's dev-dependency bumps, minus focus-scope and playwright (chore(deps): take #26556's dev-dependency bumps, minus focus-scope and playwright #27072)dc87dfb5fffix(app-shell): a package-door permission save keeps the pending draft's values (fix(app-shell): a package-door permission save keeps the pending draft's values #27080)a26776da20ci: lint.yml's scheduled run skips the battery when a green push run already covers the sha (3 of 3) (ci: lint.yml's scheduled run skips the battery when a green push run already covers the sha (3 of 3) #27085)f2fdac5d7adocs(adr): ADR batch 3 of the stale Proposed records — 0063, 0064, 0071 Accepted, 0072 and 0073 Accepted (narrowed); batch 2 contract-review corrections (0038 L5, 0046 §5, 0052 P0b) (docs(adr): ADR batch 3 of the stale Proposed records — 0063, 0064, 0071 Accepted, 0072 and 0073 Accepted (narrowed); batch 2 contract-review corrections (0038 L5, 0046 §5, 0052 P0b) #27081)6e5f909a0ffeat(ui): the translation preview strings move into the studio i18n namespace (app-shell: a published library that is 66% Console product surface — retire the 67 zero-reference exports now, decide the split, and fold the second i18n table into @object-ui/i18n #25922 slice S6b) (feat(ui): the translation preview strings move into the studio i18n namespace (#25922 slice S6b) #27083)5fe0b96768skills(objectstack-data): an eval asks for a hook'srefusalscatalogue instead of a thrown English sentence (skills(objectstack-data): an eval asks for a hook'srefusalscatalogue instead of a thrown English sentence #27088)a27f889a05fix(spec): re-anchor the authorable-surface anchor so an offline, tagless spec build passes (spec build fails offline after dbf7e04adf: the deletion gate anchors on authorable-surface.base.json (baseRev 85c6d76ec4) and cannot date #26599 tombstones without the release tag, so every image build breaks #27015) (fix(spec): re-anchor the authorable-surface anchor so an offline, tagless spec build passes (#27015) #27020)d7f76b6d97refactor(driver-sql): move the declared column DEFAULT emission out of sql-driver.ts into sql-driver-schema-sync.ts ([maintainer] refactor(driver-sql): splitsrc/sql-driver.ts(22,096 lines, +2,533 in 30 days) along itsSqlDriverseams, one move-only slice per PR #25521 cut 19) (refactor(driver-sql): move the declared column DEFAULT emission out of sql-driver.ts into sql-driver-schema-sync.ts (#25521 cut 19) #26960)6845035c6bfix(metadata-protocol)!: refuse the per-item publish and a package-less save over a binding to an uninstalled package (fix(metadata-protocol)!: refuse the per-item publish and a package-less save over a binding to an uninstalled package #27084)49d652e9f6fix(spec)!: EngineQueryOptionsSchema.fields and the RPC request's select refuse an empty projection, as their transport siblings do (fix(spec)!: EngineQueryOptionsSchema.fields and the RPC request's select refuse an empty projection, as their transport siblings do #27007)58d4ee6be0fix(plugin-approvals): the data door serves an approval request's flow and step labels in the reader's language (fix(plugin-approvals): the data door serves an approval request's flow and step labels in the reader's language #27092)d8a9cc598frefactor(plugin-calendar,plugin-gantt)!: retire the flat fallback read; the calendar and gantt renderers read the block only (refactor(plugin-calendar,plugin-gantt)!: retire the flat fallback read; the calendar and gantt renderers read the block only #27026)d90657b2cadocs(spec): the TranslationDataSchema comment counts sixteen per-app groups, not fifteen (docs(spec): the TranslationDataSchema comment counts sixteen per-app groups, not fifteen #27033)f9f27a06f7feat(spec,plugin-security,rest,client): a record-scoped field projection judges awhenlock on the stored row (feat(spec,plugin-security,rest,client): a record-scoped field projection judges awhenlock on the stored row #27063)0fb0ddac5afeat(spec): PLATFORM_TOOLS_BY_PACKAGE['service-ai'] lists read_package_doc and search_package_docs (spec: PLATFORM_TOOLS_BY_PACKAGE['service-ai'] lists read_package_doc and search_package_docs, the two package-doc tools cloud#3335 adds to the Ask agent #27002) (feat(spec): PLATFORM_TOOLS_BY_PACKAGE['service-ai'] lists read_package_doc and search_package_docs (#27002) #27011)84e13701bdtest(app-shell): give the new package-door matrix doubles the draft-overlaid read (test(app-shell): give the new package-door matrix doubles the draft-overlaid read #27103)50b1b7d81edocs(adr): ADR batch 4 of the stale Proposed records — 0077, 0080, 0096 Accepted (narrowed to what landed); 0025 held (docs(adr): ADR batch 4 of the stale Proposed records — 0077, 0080, 0096 Accepted (narrowed to what landed); 0025 held #27105)b7433d917fci(docker-publish): a rebuild of an older version keeps latest, X.Y and X where they are (ci(docker-publish): a rebuild of an older version keeps latest, X.Y and X where they are #27102)a305b94e41docs(adr-0142): mark the D3 amendment on the status line; annotate plan item 1 as superseded (docs(adr-0142): mark the D3 amendment on the status line; annotate plan item 1 as superseded #27096)53e0663df4docs(AGENTS.md): the dev-server port is a default, not hard-wired, and the three contributor lines agree with the code (docs(AGENTS.md): the dev-server port is a default, not hard-wired, and the three contributor lines agree with the code #27094)5193634d4fdocs(ui): retire the CI/CD guide page and repoint its readers at the root workflows (docs(ui): retire the CI/CD guide page and repoint its readers at the root workflows #27071)6817bf1eaeci: prune the build-core, typecheck and pack-smoke Turbo seeds before saving them (ci: prune the build-core, typecheck and pack-smoke Turbo seeds before saving them #27067)685d9f3049fix(runtime, plugin-sharing): a share link's resolve answer describes the fields it returns, so the shared-record page can show authored labels (fix(runtime, plugin-sharing): a share link's resolve answer describes the fields it returns, so the shared-record page can show authored labels #27107)e68669a66adocs(qa): wave-2 accuracy slice C — approvals drawer items, queue leg, decision-only pin gap, record-edit-undo premise (docs(qa): wave-2 accuracy slice C — approvals drawer items, queue leg, decision-only pin gap, record-edit-undo premise #27112)14ab711714fix(service-analytics): a date-dimension series answers every bucket of its window, the empty ones included (fix(service-analytics): a date-dimension series answers every bucket of its window, the empty ones included #27109)64bc7fab63fix(ui): the phone record header title and path labels fit their row instead of running off the edge (fix(ui): the phone record header title and path labels fit their row instead of running off the edge #27093)a98daf75f4ci(lint): describe the query-options test ratchet as one-sided (ci(lint): describe the query-options test ratchet as one-sided #27115)34c2407b55feat(app-shell,components): the record drawer opens a related row or a lookup in place, one level at a time, and its bar names no object (feat(app-shell,components): the record drawer opens a related row or a lookup in place, one level at a time, and its bar names no object #27038)07d18e6927docs(adr): ADR-0025 v2 — correct §3.3/§3.4/§3.8/§3.10 to the code, record the Q1–Q8 decisions, split §3.5 into M1/M2, set the status line (M0 of [Epic] ADR-0025 plugin package distribution — the next development phase: M0 record v2, M1 local T0 install loop (first-party, self-signed), M2 cloud fetch + per-plugin permission enforcement, M3 third-party sandbox tier #27108) (docs(adr): ADR-0025 v2 — correct §3.3/§3.4/§3.8/§3.10 to the code, record the Q1–Q8 decisions, split §3.5 into M1/M2, set the status line (M0 of #27108) #27118)e6e41998a8fix(app-shell): an expression field shows the draft's server verdict at its own path (fix(app-shell): an expression field shows the draft's server verdict at its own path #26999)8be3b436f7ci(fleet-patrols): prose and comments stop naming the four retired patrol workflow files (ci(fleet-patrols): prose and comments stop naming the four retired patrol workflow files #27122)857cd3c702docs(skills): objectstack-i18n teaches thebookstranslation group, with an eval for a two-language doc book (docs(skills): objectstack-i18n teaches thebookstranslation group, with an eval for a two-language doc book #27024)06290712e9docs(pm-dispatch): a card that touches cloud goes whole to the cloud PM (docs(pm-dispatch): a card that touches cloud goes whole to the cloud PM #26749)753683ab65fix(cli): i18n coverage merges a locale's bundles with the runtime's deep merge (fix(cli): i18n coverage merges a locale's bundles with the runtime's deep merge #27126)24351cfe23test(app-shell): wait on the whole list in the report index suite's positive cases (test(app-shell): wait on the whole list in the report index suite's positive cases #27128)80064b2556refactor(driver-sql): move date bucketing out of sql-driver.ts into sql-driver-date-bucket.ts ([maintainer] refactor(driver-sql): splitsrc/sql-driver.ts(22,096 lines, +2,533 in 30 days) along itsSqlDriverseams, one move-only slice per PR #25521 cut 20) (refactor(driver-sql): move date bucketing out of sql-driver.ts into sql-driver-date-bucket.ts (#25521 cut 20) #27127)4db45988c2ci(release),ui: the publish-check texts say what the release does today — the dead ui changeset:publish alias goes, its wiring test pins the live path (ci(release),ui: the publish-check texts say what the release does today — the dead ui changeset:publish alias goes, its wiring test pins the live path #27131)17c34b8c69refactor(metadata-protocol): move the object-extender fold out of protocol.ts into protocol-object-extender-fold.ts ([maintainer] refactor(metadata-protocol): splitsrc/protocol.ts(33,065 lines, +10,169 in 30 days) along itsObjectStackProtocolImplementationseams, one move-only slice per PR #25467 cut 30) (refactor(metadata-protocol): move the object-extender fold out of protocol.ts into protocol-object-extender-fold.ts (#25467 cut 30) #27129)1900c02cbefix(console): a child written through an authored related list refreshes the record page's header (fix(console): a child written through an authored related list refreshes the record page's header #27106)5866877616fix(plugin-list): show list view sharing type and lock owner as read-only text, drop the dead Share button (fix(plugin-list): show list view sharing type and lock owner as read-only text, drop the dead Share button #27013)f558e1462bfix(app-shell): a locked metadata item's designer canvas is read-only (fix(app-shell): a locked metadata item's designer canvas is read-only #27035)6af79c14ebfix(console): every console form entry point renders the form view's buttons, layout and defaults, and a tabbed form with subforms opens on its defaultTab (fix(console): every console form entry point renders the form view's buttons, layout and defaults, and a tabbed form with subforms opens on its defaultTab #27027)85c40fdf2efix(app-shell): Home, the app switcher and launcher blocks offer only the apps /me/apps lists, so a tabPermissions-hidden app draws no tile (fix(app-shell): Home, the app switcher and launcher blocks offer only the apps /me/apps lists, so a tabPermissions-hidden app draws no tile #27021)08921566b1fix(react): mark the field a unique-index refusal names in create/edit forms (fix(react): mark the field a unique-index refusal names in create/edit forms #27043)c4ad55ca00fix(plugin-grid): keep a field-backed bulk lookup param's lookupFilters and picker settings (fix(plugin-grid): keep a field-backed bulk lookup param's lookupFilters and picker settings #27049)74133d980efix(plugin-grid): a grouped list on a phone draws group headers and cards instead of the desktop table (fix(plugin-grid): a grouped list on a phone draws group headers and cards instead of the desktop table #27078)3e195bef10feat(plugin-report): the report page reads dateRange — a period chip and one timeDimensions window (feat(plugin-report): the report page reads dateRange — a period chip and one timeDimensions window #27070)ec66ac0d49fix(plugin-kanban): a lane that refuses the dragged card says why (fix(plugin-kanban): a lane that refuses the dragged card says why #27133)4aeb054359fix(plugin-dashboard): leave a tile out when the server refuses its data to the viewer (fix(plugin-dashboard): leave a tile out when the server refuses its data to the viewer #27065)3346da26dfdocs(AGENTS.md): a table of contents; the mechanism prose of §Build & Test and §Multi-agent working discipline moves to docs/agents/ topic pages, every rule staying as one sentence plus a pointer (docs(AGENTS.md): a table of contents; the mechanism prose of §Build & Test and §Multi-agent working discipline moves to docs/agents/ topic pages, every rule staying as one sentence plus a pointer #27139)b15b2fcd02test(cli): migrate-meta e2e replays only the conversions step 17 still registers (test(cli): migrate-meta e2e replays only the conversions step 17 still registers #27132)38490dbda9fix(ui): Setup opens each email template locale as its own member (fix(ui): Setup opens each email template locale as its own member #27036)a31556011afix(service-datasource): Test on a datasource whose connect failed answers that failure, not "no registered driver" (fix(service-datasource): Test on a datasource whose connect failed answers that failure, not "no registered driver" #27144)ff648d7f88fix(app-shell): Studio Access pillar polish — plain-words draft race refusal, OWD banner clears on revert, live rail label, field table count and pinned name column (fix(app-shell): Studio Access pillar polish — plain-words draft race refusal, OWD banner clears on revert, live rail label, field table count and pinned name column #27148)0f1045bcc7fix(app-shell): permission-set editor header shows the served (translated) label (fix(app-shell): permission-set editor header shows the served (translated) label #27019)6866e2e7c5fix(ui): the record form's edit dialog reads the record's field projection (fix(ui): the record form's edit dialog reads the record's field projection #27137)65354572b9docs(qa): approvals checklist reads a paused run's variables; deep-link APP is com.objectstack.setup (docs(qa): approvals checklist reads a paused run's variables; deep-link APP is com.objectstack.setup #27164)b8615afabatest(ui-live-e2e): pin the live lane's backend to the published 18.2.0 (test(ui-live-e2e): pin the live lane's backend to the published 18.2.0 #27167)72629f38c2docs(ui-merge): merge the 46 objectui field, Console-behaviour and schema pages into the objectstack docs (K2) (docs(ui-merge): merge the 46 objectui field, Console-behaviour and schema pages into the objectstack docs (K2) #27170)edb72d92b1refactor(driver-sql): move the presumed-timestamp update out of sql-driver.ts into sql-driver-presumed-timestamp.ts ([maintainer] refactor(driver-sql): splitsrc/sql-driver.ts(22,096 lines, +2,533 in 30 days) along itsSqlDriverseams, one move-only slice per PR #25521 cut 21) (refactor(driver-sql): move the presumed-timestamp update out of sql-driver.ts into sql-driver-presumed-timestamp.ts (#25521 cut 21) #27162)2f96d874fatest(example-showcase): the related-heavy detail case pins the record page's tabbed tier (test(example-showcase): the related-heavy detail case pins the record page's tabbed tier #27174)e5b5c5b093fix(spec): a retired filter operator's refusal names every replacement inside the client message cap (fix(spec): a retired filter operator's refusal names every replacement inside the client message cap #27171)12b5aec9f7fix(service-analytics): a windowed dataset answer reports its window in drillRanges (fix(service-analytics): a windowed dataset answer reports its window in drillRanges #27169)2205863525feat(spec, formula, plugin-email, lint): a mail template formats an amount in the record's own currency with currency:@path (feat(spec, formula, plugin-email, lint): a mail template formats an amount in the record's own currency with currency:@path #26937)c26d643603feat(spec): a dataset measure declares its polarity, so a lower-is-better KPI draws a rising delta as bad news (feat(spec): a dataset measure declares its polarity, so a lower-is-better KPI draws a rising delta as bad news #26739)b322b5da62fix(console): a record page leaves out related lists and rail entries of an object the install does not hold (fix(console): a record page leaves out related lists and rail entries of an object the install does not hold #27180)c07f034756feat(plugin-report): the report page exports the drawn table as CSV / XLSX (exportOptions) (feat(plugin-report): the report page exports the drawn table as CSV / XLSX (exportOptions) #27089)9b242df34frefactor(metadata-protocol): move the by-name item read's disabled-package face out of protocol.ts into protocol-meta-item-face.ts ([maintainer] refactor(metadata-protocol): splitsrc/protocol.ts(33,065 lines, +10,169 in 30 days) along itsObjectStackProtocolImplementationseams, one move-only slice per PR #25467 cut 31) (refactor(metadata-protocol): move the by-name item read's disabled-package face out of protocol.ts into protocol-meta-item-face.ts (#25467 cut 31) #27181)9fa70b4a25fix(objectql)!: the in-process engine refuses an empty projection, as every published declaration does (fix(objectql)!: the in-process engine refuses an empty projection, as every published declaration does #27161)4265176cf3feat(console): the shared-record page shows authored field labels, picklist labels and currency from the resolve answer's fields (feat(console): the shared-record page shows authored field labels, picklist labels and currency from the resolve answer's fields #27199)9dacccf961feat(app-shell,plugin-detail,components,i18n): the record page's timeline and related columns are each reader's per-object switches, toggled from the crumb row (feat(app-shell,plugin-detail,components,i18n): the record page's timeline and related columns are each reader's per-object switches, toggled from the crumb row #27120)39fd5fbf7afeat(app-shell): a key-only record control, and the Studio hook form offers refusals with it (Studio hook form:refusalscannot be authored — the record editor stamps the key into a closed entry; needs a key-only record control (follow-up owed by #26170) #26835) (feat(app-shell): a key-only record control, and the Studio hook form offers refusals with it (#26835) #27160)91a4036a6afix(cli)!: docs/metadata-embed-ref judges a package doc against its package and declared dependencies (fix(cli)!: docs/metadata-embed-ref judges a package doc against its package and declared dependencies #27204)fd73f2b391feat(app-shell): Studio authors relatedList, the related-list block's columns/sort/filter, ordered highlight fields, and slotted-by-default record pages (feat(app-shell): Studio authors relatedList, the related-list block's columns/sort/filter, ordered highlight fields, and slotted-by-default record pages #27163)cdec7473effix(example-crm): the opportunity dataset's amount measures inherit the tenant currency (fix(example-crm): the opportunity dataset's amount measures inherit the tenant currency #27205)ae16687ad4fix(spec): translateObject serves validations[].message in the reader's language (fix(spec): translateObject serves validations[].message in the reader's language #27202)8b1740aa36feat(spec): a translation bundle may leave out apps.APP.label, so a module can translate only the navigation it contributes (feat(spec): a translation bundle may leave out apps.APP.label, so a module can translate only the navigation it contributes #27203)c5ee99df8dqa(checklist): studio-authoring accuracy fixes + 23 items from the Studio QA run (qa(checklist): studio-authoring accuracy fixes + 23 items from the Studio QA run #26848)cdb949a288fix(adr-0087): predicate 2 reads adefaultexport through its import, and a package name inside a path or URL (fix(adr-0087): predicate 2 reads adefaultexport through its import, and a package name inside a path or URL #27207)835b2d1cc9fix(service-analytics): a compareTo dataset answer fills the time buckets empty in both windows (fix(service-analytics): a compareTo dataset answer fills the time buckets empty in both windows #27213)48bffe389efix(studio): the dataset inspector stores no guessed measure currency (fix(studio): the dataset inspector stores no guessed measure currency #27208)2d05cd4758fix(ui): a form view's layout horizontal puts labels beside fields, and the form page draws tabbed views as tabs (fix(ui): a form view's layout horizontal puts labels beside fields, and the form page draws tabbed views as tabs #27222)dfe85c9a54ci(live-e2e): boot the workspace backend and run the live lane as the required Live E2E UI job (ci(live-e2e): boot the workspace backend and run the live lane as the required Live E2E UI job #27212)2594f5b2c8fix(plugin-detail): the record page's inline edit reads the stored row's field locks (fix(plugin-detail): the record page's inline edit reads the stored row's field locks #27226)d745bb5e5fdocs(adr): ADR-0143 accepted — the maintainer's Q1–Q4 decisions recorded; D2.1, D2.3, D3, D4 and D7 state what they settle (docs(adr): ADR-0143 accepted — the maintainer's Q1–Q4 decisions recorded; D2.1, D2.3, D3, D4 and D7 state what they settle #27231)
Filed by.github/workflows/scheduled-full-run-card.yml. Generated by Claude Code
Activity
objectstack-fleet commentedon Oct 28, 2026
Triage: p1 → p0 ·
domain:server·pm:blockedon #27004 · triage seat ·session_01AavokzJ5DndAwitDXvKy4U· 2026-10-28T04:26Z⛔ Not a claim.
CIrun (40630250714,f708cf22) is red on one test,Test Core (8/8), inpackages/rest/src/data-nested-object-door.test.ts: "the cap: a condition matching more related records than the cap is REFUSED…" →Test timed out in 5000ms. 330 of 331 files pass.scripts/ci/scheduled-full-run*.mjs), which pm-dispatch(p0): a lane's p0 card is dispatched at once — no batch, depth-wait or concurrency cap holds it, and lower-priority dev work pauses to make room; main or merge-queue red is graded p0 at first touch #27047 corrects. Lanedomain:server, where the fix lands (the generator'sdomain:devxis its default).showcase_task?$top=1; when that seed task is already done, acceptance[0] fails and acceptance[5] cascades (main push red 21:56Z and 22:08Z) #26952 (the Dogfood seed-order flake) was fixed by PR test(dogfood): packaged-action-disabled-dispatch-live picks a not-done task and reads its own ledger row #27066 (merged 04:19Z, after this run's head). Push runs since 02:25Z are green.Generated by Claude Code
objectstack-fleet commentedon Oct 28, 2026
triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U
Triage: the 08:05Z run is red on a different failure · p0 kept · 2026-10-28T08:57Z
⛔ Not a claim.
24351cfe, 08:05Z): onlyTest Core (6/8)failed, in step 11 "Run this shard's tests", which ended with exit code 1 (08:09–08:16Z).clisuite shows 130/130 files and 1,615/1,615 tests, and turbo shows62 successful, 62 total. objectql: since #26930 a predicate delete walks every matched row one by one; 1,001 rows cost ~1.7 s (18×), and rest's nested-object-door cap test now nears its 5 s budget in the merge queue #27004'sdata-nested-object-doortest is not in the tail. The failing package is earlier in the step's log, beyond the 5,000 lines triage's reader can fetch. The shard's uploadedtest-core.logartifact names it.pm:blockedwas already lifted.test-core.logartifact of run 40654333991 (shard 6/8) names the failing package and takes it, or hands it to that package's lane. Under pm-dispatch(p0): a lane's p0 card is dispatched at once — no batch, depth-wait or concurrency cap holds it, and lower-priority dev work pauses to make room; main or merge-queue red is graded p0 at first touch #27047 item 6, it is escalated by name at R727 if it is still unclaimed. ⛔ Never narrow or skip the shard.Generated by Claude Code
objectstack-fleet commentedon Oct 28, 2026
Claim: PM loop round 5 · card thread · p0 main-red · lane refill under the shared cap of 4
Session:
session_0186vfjHHMsRXC9EUT9hTFMo(the seat); the card thread issession_01FEkQ5oKUikM4XcQpd1HJ6UAccount:
os-project-manager(the seat's linked user; the card's assignee)Branch:
claude/project-thread-9j22mo(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:serverSeat:
domain:server#2Ruling-ref: triage
6460647889(p1 → p0 under main-red convention ①: "⛔ Never raise the 5 s budget, skip the case or shrink its rows"). Blocked-by #27004 is cleared: PR #27073 merged at 05:03Z (693a7298). The 08:05Z schedule run 40654333991 on24351cfe(a descendant) is red again, inTest Core (6/8),packages/drivers/driver-sqlite-wasmpnpm run testexited 1. The failing test is not yet read (the log blob answers 403; the MCP tail stops at the last 5,000 lines). The dev identifies it first and hands backneeds_decisionif it cannotFile surface: whatever file the identified red's root cause lives in, its tests, and changesets per package the diff publishes from. ⛔ No raised timeout,
skip, smaller fixture or retry wrapper on any testContainer & model:
M,mode:thread, default model and effort (set at thread open)Clause-②: no (expected; the dev measures and declares)
Metadata-protocol: none
Responsibility: the 4-hourly full run's red on
mainafter #27004Thread-read: 6460647889
Premise: holds (read 2026-10-28T09:11Z at
origin/main0f1045bc: card open, unassigned,pm:queue; the 08:05Z schedule run is red after #27073 landed); the dev re-measures it first, and a refutation is apremise_still_valid: falsehand-backResume-from: none — fresh from
origin/mainSerial constraints cleared: yes — the dev re-reads open PRs on the file it fixes before the first edit and before
pr_createState:
pm:queue→pm:dispatched, assigned toos-project-manager, in this act.Generated by Claude Code
objectstack-fleet commentedon Oct 28, 2026
os-dev-report
{
"issue": 27076,
"status": "needs_decision",
"branch": "claude/project-thread-9j22mo",
"pr": null,
"session": "session_01FEkQ5oKUikM4XcQpd1HJ6U",
"premise_still_valid": true,
"summary": "Not identified, not reproduced, so no fix (order step 3). The red of run 40654333991 (24351cf) is real: Test Core (6/8) turbo reports
driver-sqlite-wasm pnpm run test exited (1)(annotation at log line 25,901 of 55,143), but every readable channel stops short of the failing test, and the suite passes every local reproduction at 24351cf: alone x2, beside 3 CPU burners x8, and inside the shard's real whole-package leg (the 10 packages of Test Core 6/8, turbo --concurrency=4, OS_TEST_TIERS=queue) x3, 746/746 tests every time. Two facts narrow it without naming it: (1) the shard's check-test-completeness step printed OK (11 of 11 packages reported, 16621 tests declared and all accounted for), so the package printed its summary and no test went missing; exit 1 with a complete summary means either a failed case or a run-level vitest error (an unhandled error / worker RPC fault) after the cases, and the readable log cannot tell which; (2) the same signature happened once before: schedule run 39853791549 (49185cd, 2026-10-22), Test Core (6/6), where driver-sqlite-wasm#test AND runtime#test:repo both exited 1 in one turbo run. Of the 240 most recent failed CI runs (60 each of schedule, push, merge_group, pull_request) these two are the only driver-sqlite-wasm exits; no push, merge_group or PR run shows it. It is not the #27004 family: no wasm case is anywhere near the 5 s budget (slowest case 0.28 s alone, 0.57 s under load; slowest file 1.6 s inside the shard leg), and nothing in packages/drivers/driver-sqlite-wasm changed between the last green schedule run (3217fc5) and 24351cf except the version bump; its dependencies changed in driver-sql (#26960 cut 19, a move) and spec.","tests": "All at 24351cf in a detached worktree, closure built under os-verify-lock (driver-sqlite-wasm^... then the shard's 10-package ^... closure, VERDICT command-exit 0 both). (a)
vitest runalone x2: exit 0, Test Files 39 passed (39), Tests 746 passed (746). (b) 8 runs beside 3node -e for(;;){}burners on the 4-core box, one lock hold of 448 s: 8/8 exit 0, 746/746. (c) the shard's whole-package leg as ci.yml runs it:OS_TEST_TIERS=queue pnpm turbo run test test:repofiltered to plugin-auth, plugin-approvals, lint, service-datasource, driver-sqlite-wasm, service-queue, example-todo, service-job, service-cluster, connector-imap,--concurrency=4 --log-order=stream(reps 2-3 with--force --only): 3/3 exit 0, driver-sqlite-wasm 746/746 each (suite wall 94.9 s, 106.5 s, 87.8 s; Tasks 73/73, 10/10, 10/10). Slowest wasm cases by max over runs, alone: like-stored-nul grid 283 ms, reclaim-space 282 ms, autonumber-resync 279 ms, returning-persist 260 ms, driver-autonumber 239 ms; under burners: reclaim-space 574 ms, autonumber-batch-resync 520 ms, driver-autonumber 519 ms, date-bucket 480 ms, autonumber-resync 439 ms; slowest files inside the shard leg: tenant-scope 1,612 ms, 20024-like-stored-nul 1,408 ms, driver-advanced 1,358 ms. The CI-side difference I cannot reproduce here is the cli 4/4 slice that runs after the whole leg on the same runner (it does not overlap the wasm suite: the legs are sequential in ci.yml).","gates": "n/a: no diff, no PR. No dispatch-gates derivation run (there is no change set).",
"dogfood_battery": "n/a: no PR",
"mcp_calls": "11, all reads: issue_read x2 (card, comments), get_job_logs x4 (job 122702224962 tail: 4,999 lines, capped, all cli; aggregator job 122707051142: attestation and timing tables only; plan job 122701700200: shard 6 package list; 10-22 job 120086810803 tail: turbo Failed line only), actions_list x1 (run artifacts), actions_get x1 (artifact download url), get_check_run x1 (empty output), search_issues x2",
"api_writes": "1: this os-dev-report comment on #27076 through scripts/pm/post-stamped.mjs. REST reads only otherwise (gh api: check-run annotations, run jobs, schedule run list, failed-run lists, open pulls and their files). Read attempts that failed: the artifact zip test-core-run-summary-6-of-8 on productionresultssa11.blob.core.windows.net, curl exit 56, proxy CONNECT 403 (connect_rejected); the job-log redirect goes to the same blob host class.",
"open_questions": [
{
"question": "How do we get the failing test of Test Core (6/8) in run 40654333991 named, since this container cannot read past the last 5,000 log lines or download artifacts?",
"options": [
"A: someone with browser access to GitHub (the maintainer, or a seat whose host reaches the artifact blob) opens job 122702224962 at log line ~25,901 (search
driver-sqlite-wasm:testfor FAIL / Unhandled / Error) or downloads artifact test-core-run-summary-6-of-8, and pastes the failing test name and its error onto #27076; the seat then re-dispatches with that name. Cost: one manual read, about 5 minutes. Artifact retention ends 2026-11-01, log retention longer.","B: wait for the next 4-hourly schedule run. Green closes the card under its own rule, and the case reads as a rare load flake (2 hits among the 60 most recent failed schedule runs, both on the shard carrying driver-sqlite-wasm); red on wasm again gives a fresh run whose log has the same reach problem, so it needs A anyway.",
"C: a CI-side observability change so a failing package's own failure lines reach the readable tail of the shard log (for example, re-print the failing turbo task's FAIL and Errors blocks at the end of the test step). This is a new card in the CI lane, not this one; it fixes the reach problem for every future shard red, not this red."
],
"recommendation": "A, with B in parallel. Real business need: the card is p0 and closes only on a green full run; A is the only option that names the cause of a red that has now happened twice, while B only tells whether it recurs. Long-term soundness: guessing a fix without the failing test would be the workaround the order forbids; A keeps the fix contract-first. Preventing AI mistakes: A hands the next dev a named failing case, so the fix can be red-first instead of speculative. Startup focus: A and B add nothing to the product or the gate set; C is a new CI capability, so I do not recommend it here: it is a separate card only if the maintainer names it."
}
],
"out_of_scope_findings": [
"carrier: none · noted, not filed: the fleet's readers cannot see a Test Core shard failure that sits more than 5,000 lines before the end of the job log (get_job_logs tail cap; log and artifact blobs 403 through the card-thread proxy). Same reach problem triage hit on this card. Recorded for option C only."
]
}
Generated by Claude Code
objectstack-fleet commentedon Oct 28, 2026
Seat note · #27076 parked, waiting on a log read or the next schedule run
domain:serverseat 2 ·session_0186vfjHHMsRXC9EUT9hTFMo· 2026-10-28T10:23ZThe card thread handed back
needs_decisionwith no code (os-dev-report6466478513). The driver-sqlite-wasm red in schedule run 40654333991 (job 122702224962,Test Core (6/8), near log line 25,901) cannot be identified from this environment:Local reproduction at
24351cfestayed green in every configuration. The package passed 746 of 746 each time:This is not the #27004 budget family. The slowest wasm case takes 0.28 s alone and 0.57 s under load.
The shard counted every test. Its completeness step accounted for all 16,621, so the exit 1 is either a failed case or a run-level vitest error. The same signature appeared once before, in schedule run 39853791549 (
49185cdb).Next, both in parallel:
test-core-run-summary-6-of-8(retained to 11-01), and pastes the failing test and error here. The seat then re-dispatches with a named target.State:
pm:dispatched→pm:blocked. The assignee stays on the seat. ⛔ No budget raise, skip or retry wrapper in the meantime.Generated by Claude Code
hotlong commentedon Oct 28, 2026
Failing test named: read from the full job log, 2026-10-28
维护者速读
失败的用例是
SqliteWasmDriver (file persistence) > should persist data on-write,5000 ms 超时(实际跑了 5026 ms)。同一文件里它的兄弟用例on-disconnect也跑了 4236 ms,离预算只差一点。10-22 那次同样的红是 5 条 wasm 文件持久化用例一起超时。所以这和 #27004 是同一类:本地 0.3 s 的落盘用例在 CI 分片的负载下能慢到 5 s 以上。两次失败都发生在落盘路径上,不是某一条用例的逻辑错误。Readback
The full log of job 122702224962 was downloaded from a maintainer machine: 55,143 lines, the same count the seat saw. Excerpt, ANSI stripped:
The earlier occurrence, schedule run 39853791549, job 120086810803 (
49185cdb, 10-22), was read the same way. Five wasm cases timed out at 5000 ms, all of them on-write or flush paths:sqlite-wasm-background-flush-failure.test.ts: three cases, at 9879, 7792 and 6869 ms.sqlite-wasm-driver-returning-persist.test.ts:flushes an UPDATE … RETURNING under on-write, 5921 ms.sqlite-wasm-driver-durability.test.ts:writes the database file atomically, 5759 ms.In that run,
on-writeitself passed in 2751 ms. Theruntime#test:repored in the same run was a separate 60 s tree-walk timeout.What this changes in the 10:22Z report
The report's line "not the #27004 family … slowest case 0.28 s alone, 0.57 s under load" holds on a 4-core dev box. On the shard it does not hold: the persistence cases cost 2.7–9.9 s there. Note
import 143.94sfor a 66 s run, which means the runner was heavily oversubscribed. The target is now named, so the seat can re-dispatch. ⛔ No raised budget, skip or retry wrapper (the card's rule); the fix belongs in why a file flush costs seconds under load.objectstack-fleet commentedon Oct 28, 2026
os-dev-report
{
"issue": 27076,
"status": "done",
"branch": "claude/project-thread-9j22mo",
"pr": "#27245",
"session": "session_01FEkQ5oKUikM4XcQpd1HJ6U",
"premise_still_valid": true,
"summary": "Round 2, after the maintainer named the failing case on the card (comment 6468136240): sqlite-wasm-driver.test.ts 'should persist data on-write' timed out at 5,026 ms on Test Core 6/8; run 39853791549 timed out five on-write/flush cases. Root cause measured: each flush ends in atomicWriteFile's handle.sync(), and that fsync queues behind the other suites' disk I/O on the shard runner. The case is about 30 ms on an idle disk; with 4 dd conv=fsync writers on the same disk the same persistence cases (and only those) rise to 1.4-3.6 s, with 8 writers they time out (5 timeouts in 3 rounds, including on-write at 5,358 ms, the CI failure). CPU load alone does not do it. Fix (PR #27245, one file): packages/drivers/driver-sqlite-wasm/vitest.config.ts sets test.env TMPDIR to /dev/shm when writable (else unchanged) and restates the preset's disableConsoleIntercept; every test file already reaches its temp dir via os.tmpdir(). Product code, cases, assertions and the 5 s budget are unchanged; sync() and rename() still run. This replaces round 1's needs_decision (comment 6466478513): the case is identified, it IS a load-only timing red, but disk-load, not the #27004 per-row family.",
"tests": "Head 2c4bfce. Red-first A/B, one os-verify-lock hold (VERDICT command-exit 0, 236 s), 8 dd if=/dev/zero bs=1M count=512 conv=fsync writers on the same disk, the 4 persistence files (29 cases), base and head alternated x3. Base leg = scripts/ablation-replace.mjs replacing the env line with env: {} (anchor 1 -> 0, blob 08fbf987a6e2 -> ea1e118ddf13; a probe case printed TMPDIR_SEEN=/tmp under it, /dev/shm on head), restored after each round (ok restored: blob == HEAD, git diff HEAD empty). base-1: 2 failed (returning-persist UPDATE RETURNING 6061 ms, transaction 7227 ms timeouts); head-1: 29/29, slowest 178 ms; base-2: 2 failed (INSERT RETURNING 6641 ms; driver.test.ts should persist data on-write 5358 ms, Test timed out in 5000ms); head-2: 29/29, slowest 223 ms; base-3: 1 failed (UPDATE RETURNING 6223 ms); head-3: 29/29, slowest 217 ms. Mechanism readings without the config: 4 writers, TMPDIR on disk x3: on-write 1388-3630 ms, 7-11 cases over 1 s per run; same 4 writers, TMPDIR=/dev/shm x3: on-write 12-28 ms, slowest case 0.54 s. Step probe idle: create 3, insert 1, flush 4, reopen+find 3 ms, raw 8 KiB sync 1 ms; under 2 writers raw sync up to 575 ms. Whole package at head: pnpm --filter @objectstack/driver-sqlite-wasm test, VERDICT command-exit 0, Test Files 39 passed (39), Tests 746 passed (746); /dev/shm has no leftover after the run. No test file added; no ablation needed beyond the A/B (the change is a config).",
"gates": "Local at 2c4bfce, change set 1 path (vitest.config.ts). dispatch-gates --commands --repo objectstack-ai/objectstack: 42 commands, each exit captured before any pipe; --ran: 42 derived famil(ies) accounted for, 40 run, 2 NOT-MEASURED. NOT MEASURED: pnpm check:dual-build-cjs-loads and pnpm check:lean-entry-closure, exit 3 PREREQUISITE NOT MET (need a full workspace build; CI runs both). node scripts/check-plugin-teardown-shape.mjs --self-test exit 3 on the shallow clone, exit 0 after git fetch --depth=1 of 621a487 (48 cases). All other 37 derived commands exit 0. Hand gates: node scripts/check-console-intercept-disarm.mjs exit 0 (OK: 77 vitest-running packages); pnpm exec eslint --no-inline-config packages/drivers/driver-sqlite-wasm exit 0; pnpm --filter @objectstack/driver-sqlite-wasm typecheck exit 0; node scripts/check-commit-card-trailers.mjs --range origin/main..HEAD exit 0. (A first try of the disarm gate as a pnpm script exited 254: no such script, re-run by its node path.) CI check-runs on PR #27245: in_progress at report time, not waited on.",
"dogfood_battery": "n/a: no ! in the PR title and Clause-2 is no with no (narrowing) arm",
"mcp_calls": "0 this round (all GitHub reads this round through gh api REST). Round 1: 11, all reads (issue_read x2, get_job_logs x4, actions_list x1, actions_get x1, get_check_run x1, search_issues x2). No MCP write tool used.",
"api_writes": "3 in the card thread so far: round-1 os-dev-report comment 6466478513 (post-stamped); relay pr_create of PR #27245 (fleet-write run 40687896969, body read back identical 9405 bytes, assignee os-project-manager, label skip-changeset confirmed by REST read of the pull); this os-dev-report comment. Plus one git push (not a REST write).",
"open_questions": [],
"out_of_scope_findings": [
"carrier: none · noted, not filed: other packages' tests that fsync real files under os.tmpdir() could hit the same disk-queue stall on a shard; not surveyed (no red names one)."
]
}
Generated by Claude Code
objectstack-fleet commentedon Oct 28, 2026
Landing record · #27076 · PR #27245
domain:serverseat 2 ·session_0186vfjHHMsRXC9EUT9hTFMo· 2026-10-28T13:09Zgit ls-remote origin 'refs/heads/gh-readonly-queue/main/pr-27245-*'git merge-base --is-ancestor 4d3a077f origin/main4d3a077f)git grep -c MEMORY_BACKED_TMP origin/main -- packages/drivers/driver-sqlite-wasm/vitest.config.ts4d3a077f.driver-sqlite-wasm's vitest config now runs the persistence suites' temp files on/dev/shmwhen it is writable. An on-write flush's fsync stops queueing behind the other suites' disk I/O on a Test Core shard.sync(), and every assertion. A host without a writable/dev/shmkeeps its own temp directory.4d3a077f(expected ≈16:05Z). Ifdriver-sqlite-wasmreds there, this card reopens.40684983027(headd745bb5e, before this merge):Test Core (6/8), which carriesdriver-sqlite-wasm, passed.Test Core (5/8)increate-objectstack. That schedule-only family is create-objectstack#test failed in the 22:01Z schedule CI (job 120999879860) and passed live on push for the same commit 47af3dde42 — read the failing test from the job log and root-cause it #25715 (pm:on-hold), and the occurrence is noted there.Generated by Claude Code