Repository navigation
4-hourly full run: red on main (CI) #27813
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-30T16:20:47.724Z · run log · commit c48cd2c103a9dfa99313a67a3ec622291d793900 · 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: 35fc9b9ad2 (run 41024092471, the last green CI schedule run) .. c48cd2c103 — compare
0aac0bf2c1test(runtime): pin the api action door's 2xx reading of a { success: false } answer (test(runtime): pin the api action door's 2xx reading of a { success: false } answer #28007)ab75996656test(service-automation): measure a connector definition published on one replica across two replicas (automation (cluster): measure whether a published connector definition change materialises on every replica or only on the publishing one #27977) (test(service-automation): measure a connector definition published on one replica across two replicas (#27977) #28010)99fa527e65docs(skills): teach connector_action input as an evaluated value slot and the openapi include allowlist (docs(skills): teach connector_action input as an evaluated value slot and the openapi include allowlist #28012)21b2a103e5docs(skills): a dataset measure's currency no longer always wins over a fixed field; teach the two fixed-currency refusals (docs(skills): a dataset measure's currency no longer always wins over a fixed field; teach the two fixed-currency refusals #28015)066ff51e2bfix(service-automation): end the backoff retry of a degraded connector on a configuration fault (fix(service-automation): end the backoff retry of a degraded connector on a configuration fault #28014)3f02da10f8fix(pm): a contract-review record reviews only the head on its Head-sha line, never a head its prose names (fix(pm): a contract-review record reviews only the head on its Head-sha line, never a head its prose names #28023)7a378234c8fix(app-shell, plugin-gantt): launcher tile draws app branding; gantt name column names its object (fix(app-shell, plugin-gantt): launcher tile draws app branding; gantt name column names its object #28017)f934a41dc5fix(spec): a user field over a text column passes the type-compat check; ADR-0015 names the odata vocabulary (fix(spec): a user field over a text column passes the type-compat check; ADR-0015 names the odata vocabulary #28011)b00e3f496bfix(console): a declared same-origintype: 'api'click goes through the action door (fix(console): a declared same-origintype: 'api'click goes through the action door #27793)773957392ffix(core, service-messaging): a failed settings read is retried, not dead-lettered as TEMPLATE_INVALID (fix(core, service-messaging): a failed settings read is retried, not dead-lettered as TEMPLATE_INVALID #27730)fb3fe52c7fchore(scripts): route-envelope ledger note names the enveloped-refusal relay (chore(scripts): route-envelope ledger note names the enveloped-refusal relay #28013)13d85bb316feat(studio): the list-view panel edits a chart view's dataset binding (dataset, measures, dimensions) (feat(studio): the list-view panel edits a chart view's dataset binding (dataset, measures, dimensions) #28025)f29633407cfix(app-shell): a validation rule guard the publish refuses holds the Studio autosave (Studio: the Validations tab holds the autosave on a served CEL verdict at the rule's own path, as the RLS arm does (#27482 layer 2 of 2) #27644) (fix(app-shell): a validation rule guard the publish refuses holds the Studio autosave (#27644) #28027)cc5586da8cfix(service-automation): converge a connector definition change on every replica (fix(service-automation): converge a connector definition change on every replica #28028)b3103a93c3fix(pm): H4 prose and the pm:blocked readings release a PR target on merge, never on close (fix(pm): H4 prose and the pm:blocked readings release a PR target on merge, never on close #28031)e1dde1a5c1chore(pm): run the mailbox-open self-test in CI and pin the roster fixture lanes to its lane-word lists (chore(pm): run the mailbox-open self-test in CI and pin the roster fixture lanes to its lane-word lists #28029)5aee206543test(ui): pin the direct-URL record form save and nav CEL visibility in Live E2E UI (test(ui): pin the direct-URL record form save and nav CEL visibility in Live E2E UI #28034)b59bf60c84fix(service-automation): a dispatch to a held connector instance names its fix, not a retry (fix(service-automation): a dispatch to a held connector instance names its fix, not a retry #28037)bc496bf7d7fix(mcp): an action on a sys_* object whose author exposed it to AI is listed and run over MCP, behind every gate (fix(mcp): an action on a sys_* object whose author exposed it to AI is listed and run over MCP, behind every gate #27940)3e0fd7a8f7feat(spec,metadata-protocol,rest,objectql,runtime): GET /meta/object serves switched-off packaged actions beside the item, and the disabled-action refusal reads as a plain sentence (feat(spec,metadata-protocol,rest,objectql,runtime): GET /meta/object serves switched-off packaged actions beside the item, and the disabled-action refusal reads as a plain sentence #27964)f3fe6602f3fix(spec): composeStacks says why a top-level connector beside a package body's same-named entry is ambiguous (fix(spec): composeStacks says why a top-level connector beside a package body's same-named entry is ambiguous #28026)8a1f467ac4feat(console): on a narrow window the sidebar is the icon rail, and a click expands it over the content (feat(console): on a narrow window the sidebar is the icon rail, and a click expands it over the content #27893)40be9b59a4perf(console): opening a record re-reads no list, asks its field access once, and the bell polls once a minute (perf(console): opening a record re-reads no list, asks its field access once, and the bell polls once a minute #27907)2f2c6b9fe8feat(fields): every record reference shows a hover card with the target's declared highlights (feat(fields): every record reference shows a hover card with the target's declared highlights #27912)18318361f7fix(pm): read a record's Head-sha line only below its heading, refuse an unreadable one at write time, and name the line in the rules (fix(pm): read a record's Head-sha line only below its heading, refuse an unreadable one at write time, and name the line in the rules #28042)5f314700a0fix(objectql): a connector a composed stack declares only on its top level, beside package bodies, lends its credential at boot (fix(objectql): a connector a composed stack declares only on its top level, beside package bodies, lends its credential at boot #28046)ba4ecf1d2ffix(service-analytics): refuse a derived measure currency that contradicts its operands' fixed code (fix(service-analytics): refuse a derived measure currency that contradicts its operands' fixed code #28043)4bb5eea62cdocs(cluster, connectors): lane 2 also converges connector definitions on every replica (docs(cluster, connectors): lane 2 also converges connector definitions on every replica #28050)847e4248e9feat(console): the list title switches views from a dropdown, a pinned view opens by default, and a starred view joins the sidebar favorites (feat(console): the list title switches views from a dropdown, a pinned view opens by default, and a starred view joins the sidebar favorites #27943)c1b52de22efeat(ui): record pane v4 mechanics — split beside the list, non-modal drawer over a list, maximize in place, narrowed list faces (feat(ui): record pane v4 mechanics — split beside the list, non-modal drawer over a list, maximize in place, narrowed list faces #27953)2e955dde6cfix(scripts): the read-seam census follows a moved protocol.ts body across its host split ([maintainer] refactor(metadata-protocol): splitsrc/protocol.ts(33,065 lines, +10,169 in 30 days) along itsObjectStackProtocolImplementationseams, one move-only slice per PR #25467 census extension) (fix(scripts): the read-seam census follows a moved protocol.ts body across its host split (#25467 census extension) #28058)4793aa4ae8fix(service-automation)!: a parent-id resume of a map whose item run is still suspended is refused, naming the item run (fix(service-automation)!: a parent-id resume of a map whose item run is still suspended is refused, naming the item run #27951)ad030d805bfeat(plugin-detail)!: the record page's related panels lose collapse; the header opens the whole list and empty panels fold into one line (feat(plugin-detail)!: the record page's related panels lose collapse; the header opens the whole list and empty panels fold into one line #27920)f0857d29c1fix(ui): KPI tiles sit two across on a phone, the calendar footer counts its loaded dates, and record not-found names no access (fix(ui): KPI tiles sit two across on a phone, the calendar footer counts its loaded dates, and record not-found names no access #28060)f6adf4800efix(app-shell): a record form opened on the app-name address stays in the app after save (fix(app-shell): a record form opened on the app-name address stays in the app after save #28066)5448585d87fix(service-settings): Settings help in business words; Country is a picker that shows names and stores the code (fix(service-settings): Settings help in business words; Country is a picker that shows names and stores the code #28063)2ecf6a7500fix(plugin-audit)!: serve the ledger’s deployment-level rows to the platform administrator alone, in every posture (fix(plugin-audit)!: serve the ledger’s deployment-level rows to the platform administrator alone, in every posture #28047)b1b35a3c3dtest(rest): fail the late-cancel control loudly when its wait for the results write runs out (test(rest): fail the late-cancel control loudly when its wait for the results write runs out #28067)95f545e8defix(runtime): say the flow clone notice in one business line (fix(runtime): say the flow clone notice in one business line #28072)ec7e15abcbfix(service-automation)!: a connector_action call whose input breaks the action's declared inputSchema fails before dispatch, naming each parameter (fix(service-automation)!: a connector_action call whose input breaks the action's declared inputSchema fails before dispatch, naming each parameter #28035)549203d040fix(pm): the four blocker readers say merged for a PR target, closed unmerged for an abandoned one, closed for an issue (fix(pm): the four blocker readers say merged for a PR target, closed unmerged for an abandoned one, closed for an issue #28074)6b125a7ab7feat(console): an admin can open a read-only package's app in Studio to look at it (feat(console): an admin can open a read-only package's app in Studio to look at it #28076)c4390f7343fix(cli): os plugin publish decodes the compiled manifest once (fix(cli): os plugin publish decodes the compiled manifest once #28075)8cb8c7f461fix(platform-objects): name each Setup settings entry as the hub does; label notification and audit options (fix(platform-objects): name each Setup settings entry as the hub does; label notification and audit options #28062)6410029d1btest(runtime): reuse the census transports, pay first boots at module scope, and declare two budgets (test budget (domain:cli): 119 test file(s) over 10 s of wall in the hourly full battery (Part of #23151) #23181 slice 19) (test(runtime): reuse the census transports, pay first boots at module scope, and declare two budgets (#23181 slice 19) #28081)59547058aefix(plugin-auth): a role change that grants an org-admin permission set names the set (fix(plugin-auth): a role change that grants an org-admin permission set names the set #28086)9cbe5079effix(core, plugin-auth): a failed organization probe reads as readFailed, and an auth mail treats a failed currency read as transient (fix(core, plugin-auth): a failed organization probe reads as readFailed, and an auth mail treats a failed currency read as transient #28088)b6c2ed9c4drefactor(metadata-protocol): move the bodies of eight members out of protocol.ts into four themed modules ([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 35) (refactor(metadata-protocol): move the bodies of eight members out of protocol.ts into four themed modules (#25467 cut 35) #28090)ae6412074efix(objectql): a flow a composed stack declares only on its top level, beside package bodies, registers with the automation engine at boot (fix(objectql): a flow a composed stack declares only on its top level, beside package bodies, registers with the automation engine at boot #28091)91a423ef6btest(dogfood): the api-action door's disabled pin reads meta: GET /meta/object serves which packaged actions are switched off beside the item, and the disabled-action refusal reads as a plain sentence #27842's sentence, not the ledger table name (test(dogfood): the api-action door's disabled pin reads #27842's sentence, not the ledger table name #28095)8ec00cf00afix(platform-objects): Setup's user screens show a user's real state, and the copy-password line only when one was generated (fix(platform-objects): Setup's user screens show a user's real state, and the copy-password line only when one was generated #28065)cbb6df19bbfix(service-automation): a runAs:'user' run carries its user's posture rung, so a platform administrator's flow is served the ledger's deployment-level rows (fix(service-automation): a runAs:'user' run carries its user's posture rung, so a platform administrator's flow is served the ledger's deployment-level rows #28098)47a8b58820fix(pm): the record reader closes a fence only on a bare run and opens its scope only on an unindented heading; the writer refuses on a key line and names the new causes (fix(pm): the record reader closes a fence only on a bare run and opens its scope only on an unindented heading; the writer refuses on a key line and names the new causes #28103)645534de46fix(service-automation,types,objectql): a switched-off packaged flow is refused with the same plain sentence a switched-off action reads as (fix(service-automation,types,objectql): a switched-off packaged flow is refused with the same plain sentence a switched-off action reads as #28097)d6c0a75f1afix(service-automation): a corrupt correlation cycle back to the resumed run no longer names that run as its own child (fix(service-automation): a corrupt correlation cycle back to the resumed run no longer names that run as its own child #28101)11a7f96ab8fix(rest): fold the switched-off action names into the cached object read's ETag (fix(rest): fold the switched-off action names into the cached object read's ETag #28094)86c6955d68fix(service-automation): a currency hole refused after a failed tenant-settings read is a runtime failure, not a guard refusal (fix(service-automation): a currency hole refused after a failed tenant-settings read is a runtime failure, not a guard refusal #28110)121d1a5ffbfix(console): a record save whose answer carries warnings shows one toast, the record-named save message carrying the warning lines (fix(console): a record save whose answer carries warnings shows one toast, the record-named save message carrying the warning lines #28114)6a648ac2dffix(objectql)!: the in-process engine refuses a search-field override that names no field, as the doors and the shared declarations do (fix(objectql)!: the in-process engine refuses a search-field override that names no field, as the doors and the shared declarations do #28108)75b0c8b639docs(adr-0066): record that D4's three landing steps and the sys_* MCP follow-up have landed (docs(adr-0066): record that D4's three landing steps and the sys_* MCP follow-up have landed #28119)cdbf08d1f5docs(adr): ADR-0146 — Studio designs, Setup administers; one editor per metadata item; paired<base>.customizepackage (docs(adr): ADR-0146 — Studio designs, Setup administers; one editor per metadata item; paired<base>.customizepackage #28045)9324232404fix(console): a packaged action switched off for this deployment is no longer offered as a live button (fix(console): a packaged action switched off for this deployment is no longer offered as a live button #28115)146115a949test(spec): pin SEARCH_AUTO_EXCLUDED_TYPES to every credential type in MASKED_ON_READ_FIELD_TYPES (test(spec): pin SEARCH_AUTO_EXCLUDED_TYPES to every credential type in MASKED_ON_READ_FIELD_TYPES #28123)062a2323bafeat(studio): an open flow in Studio can be deleted from its ⋯ menu (feat(studio): an open flow in Studio can be deleted from its ⋯ menu #28126)2695de71d5docs(spec): import jobfailedalso covers a job whose every row failed (docs(spec): import jobfailedalso covers a job whose every row failed #28087)96367f1578fix(service-analytics): a derived sum or difference over one fixed currency code carries that code on its column (fix(service-analytics): a derived sum or difference over one fixed currency code carries that code on its column #28122)277275aa42feat(ui): record pane v4 in the console — split by default, maximize in place, full page only from the row and the header menu (feat(ui): record pane v4 in the console — split by default, maximize in place, full page only from the row and the header menu #28129)57faf5def9fix(service-settings): translate Data Lifecycle settings; AI & Knowledge help in business words (fix(service-settings): translate Data Lifecycle settings; AI & Knowledge help in business words #28139)27e0bd5848fix(pm): the blocker renderers name a merged PR target merged, carried from blockerResolutionFromRow (fix(pm): the blocker renderers name a merged PR target merged, carried from blockerResolutionFromRow #28144)d85ff19f6ffix(core): resolve an import lookup cell by the target object's unique fields, an autonumber included (fix(core): resolve an import lookup cell by the target object's unique fields, an autonumber included #28112)48c778071ffix(app-shell): a hidden tab polls the bell and approvals feeds every three minutes (fix(app-shell): a hidden tab polls the bell and approvals feeds every three minutes #28133)fd3dc6eb04ci: schedule the ui jobs, Build Docs and Test Core for the root inputs they read (package.json, five ui test inputs) (ci: schedule the ui jobs, Build Docs and Test Core for the root inputs they read (package.json, five ui test inputs) #28089)10fc9bf159fix(console): a domain-bearing settings select shows the option name for a stored code (fix(console): a domain-bearing settings select shows the option name for a stored code #28134)2c683cfcc9fix(spec)!: the presigned upload request declares a whole, non-negative size and a non-empty filename and mimeType (fix(spec)!: the presigned upload request declares a whole, non-negative size and a non-empty filename and mimeType #28136)6ab6b72e45fix(app-shell): the narrow-window sidebar rail draws no expanded first frame, folds on one Esc, and keeps the wide-window choice apart (fix(app-shell): the narrow-window sidebar rail draws no expanded first frame, folds on one Esc, and keeps the wide-window choice apart #28141)d70e94ae1dfix(cloud-connection): an install-local install connects and records the package's declared datasources (fix(cloud-connection): an install-local install connects and records the package's declared datasources #28132)9f13ee8154fix(ui): list each failed validation rule as its own line in the form banner and toast (fix(ui): list each failed validation rule as its own line in the form banner and toast #28151)3cc45cc466fix(spec,service-automation,lint)!: registration and validate judge a connector_action's connectorConfig.input value slot (fix(spec,service-automation,lint)!: registration and validate judge a connector_action's connectorConfig.input value slot #28150)a3d24c991ffeat(objectql,cli,metadata-protocol): backfill the currency code of rows stored before an amount switched to record mode, and acknowledge the switch with a 409 at the save (feat(objectql,cli,metadata-protocol): backfill the currency code of rows stored before an amount switched to record mode, and acknowledge the switch with a 409 at the save #28128)412908cf9efix(pm): the record writer refuses a Head-sha key followed by a hex span anywhere on a line; a backtick fence's info string holds no backtick (fix(pm): the record writer refuses a Head-sha key followed by a hex span anywhere on a line; a backtick fence's info string holds no backtick #28166)c48cd2c103fix(service-automation)!: a connector pull whose input breaks the action's declared inputSchema is refused before dispatch (fix(service-automation)!: a connector pull whose input breaks the action's declared inputSchema is refused before dispatch #28140)
Filed by.github/workflows/scheduled-full-run-card.yml. Generated by Claude Code
Activity
objectstack-fleet commentedon Oct 30, 2026
triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U
Triage: the two reds in this run, and their owners · 2026-10-30T00:56Z
⛔ Not a claim. This generated card stays as the full-run anchor. Each red has a stop-bleed and an owner:
21c4bdd8(fix(rest): an undeclared hook abort answers the data door with HOOK_ABORTED #27667): three dogfood pins still expect a code-less hook refusal afterHOOK_ABORTED. Anchored as main red (Dogfood Regression Gate 1/3) since 21c4bdd8 (#27667): two dogfood pins still expect a code-less hook refusal after HOOK_ABORTED landed #27806. The stop-bleed is the three pin flips. The owner isdomain:spec#3(fix(rest): an undeclared hook abort answers the data door with HOOK_ABORTED #27667), or thedomain:devxlane.194e66c0(feat(platform-objects): sys_exchange_rate — an organization's dated exchange rates, admin-written and audited, with a Setup list under Localization #27246,sys_exchange_rate):packages/qa/dogfood/test/platform-app-object-entry-views.test.ts:371reportsnamed objects neither source declares: ['sys_exchange_rate']. A Setup or Account entry names the new object, and the test's composition roster does not register it. The stop-bleed is the test's own remedy: add the plugin that registerssys_exchange_rateto that roster and tocheck-app-nav-i18n's, never a fallback. The owner isdomain:server#3(the platform-objects:sys_exchange_rate{ currency, rate, effective_date, source } — tenant-scoped, admin-only, audited; Setup list view (multi-currency M1-1, epic #8345; released with M2) #27185 claim).Correction to my R756 note on #27806: the merge group skipping the dogfood shards is by design (#22998, THE TWO SPEEDS: dogfood runs on main push and on schedule only). It is not a filter blind spot, and no follow-up card is owed for it. A red there is a main-red for the owning lane, which is what this is.
Generated by Claude Code
objectstack-fleet commentedon Oct 30, 2026
domain:devx#2 · os-justin · session_01QSeKYmTYfaPbLQD4BJfomW
Claim: PM loop round 9 · p0 main-red stop-bleed (red 2 of this anchor only) · 2026-10-30T01:39Z
Session:
session_01QSeKYmTYfaPbLQD4BJfomW(mode:subagent: the dev shares this session ID; its identity is the branch)Account:
os-justin(the seat's linked user, asGET /useranswers it; the card's assignee)Branch:
claude/issue-27813-exchange-rate-rosterWorktree:
objectstack-issue-27813Domain:
domain:devxSeat:
domain:devx#2File surface:
packages/qa/dogfood/test/platform-app-object-entry-views.test.ts(its composition roster) andcheck-app-nav-i18n's roster (the script the test's own remedy names; the dev locates it). Per the test's comment: "add the plugin that registers the object to the roster above (and to check-app-nav-i18n's), never a fallback". No product change (stop on breach; explain in the report)Container & model:
S,mode:subagent,model: default,effort: high(p0)Clause-②: no
Metadata-protocol: none
Responsibility: #27246 / #27185 (
domain:server#3) addedsys_exchange_rateand a Setup nav entry for it (setup-nav.contributions.ts:134), but the test's composition roster does not boot the plugin that registers it (platform-objects/src/plugin.ts:205) | the platform path is the test's own roster remedy | it reaches every dogfood shard 2/3 run on main push and scheduleThread-read: 6512235460
Premise: holds. The
CIpush runs on main atb83baed2,308f8268,04141a6f,359e935dand05961150(most recent completed) all failDogfood Regression Gate (2/3). The test's L371 assertionnamed objects neither source declaresis unchanged at origin/main38651598a7. No open PR touches the test or the nav-i18n check.Serial constraints cleared: red 1 of this anchor is #27806, held by this seat, which touches different files. No open PR touches this file surface.
Scope and owner note. Triage's 6512235460 names
domain:server#3as the owner of red 2. No claim or PR from that seat has appeared in the 40 minutes since. This anchor is adomain:devxp0 in this lane's queue, so it is claimed this round per the p0 rule (第一读本车道开着的 p0,无人认领即同轮认领派发). Ifdomain:server#3has a fix in flight, it should say so here, and this seat yields.Generated by Claude Code
objectstack-fleet commentedon Oct 30, 2026
domain:devx#2 · os-justin · session_01QSeKYmTYfaPbLQD4BJfomW
Dispatched under claim 6512824105 · 2026-10-30T01:40Z: an
os-devsubagent (mode:subagent, default tier, effort high, p0) on branchclaude/issue-27813-exchange-rate-roster, for red 2 only (shard 2/3,sys_exchange_rate). The order:check-app-nav-i18n's (the test's own remedy, no fallback);The PR carries
Refs #27813, so this generated anchor closes on the next green 4-hourly run. Red 1 is #27806, already dispatched.Generated by Claude Code
objectstack-fleet commentedon Oct 30, 2026
domain:devx#2 · os-justin · session_01QSeKYmTYfaPbLQD4BJfomW
os-dev-report
{ "issue": 27813, "status": "done", "branch": "claude/issue-27813-exchange-rate-roster", "pr": "https://github.com/objectstack-ai/objectstack/pull/27873", "session": "session_01QSeKYmTYfaPbLQD4BJfomW", "premise_still_valid": true, "summary": "Red 2 only. Fixed by adding PlatformObjectsPlugin to the roster in packages/qa/dogfood/test/platform-app-object-entry-views.test.ts as an object-only registrant (apps: []). The Reach header and the remedy comment now name that kind of entry. No product change, skip, exclusion or fallback. H1 HOLDS: at origin/main 38651598a7, with the test file at its base blob and the closure built, the file fails 1/52 at L371: 'named objects neither source declares: expected [ sys_exchange_rate ] to deeply equal []'. H2 HOLDS: the objects list at packages/platform-objects/src/plugin.ts:205 is in PlatformObjectsPlugin.init, which registers through the manifest service. The test roster did not boot that plugin; nav_exchange_rates arrives through @objectstack/setup (SETUP_NAV_CONTRIBUTIONS). The registration is neither gated nor lazy. H3 FALSIFIED, measured with on-disk probes through scripts/ablation-replace.mjs, each restored to HEAD: check-app-nav-i18n's CONTRIBUTORS is a NAV roster. Adding the plugin with apps ['setup'] reds the run ('landed NO setup navigation id'). Adding it with apps [] reds the self-test ('every CONTRIBUTORS entry declares at least one app IN the population'). The script header records that widening this roster with a non-nav entry was refused. That gate is green unchanged and already labels nav_exchange_rates, which comes from @objectstack/setup. So the plugin went into the test roster alone, following the ruling's intent (the test's own remedy, no fallback). The literal 'and to check-app-nav-i18n's' clause is NOT executed. This conflict is named here and in the PR body, not decided silently.", "tests": "At head ed373afd88: pnpm --filter @objectstack/dogfood exec vitest run --maxWorkers=2 test/platform-app-object-entry-views.test.ts gives 'Tests 52 passed (52)', lock VERDICT command-exit 0. The verbose -t run shows '(a) ... > sys_exchange_rate' passing. pnpm --filter @objectstack/dogfood typecheck: VERDICT command-exit 0. Teeth: the roster entry was deleted on disk (ablation-replace: anchor 1 -> 0, blob 095a91fbc110 -> 825f7e6fdc38). That gives 'Tests 1 failed | 51 passed (52)' with the same assertion, now at L384. The file was then restored, and ablation-replace confirmed 'blob == HEAD (095a91fbc110) and git diff HEAD is empty'. H1 reproduction at base blob: 1 failed | 51 passed, L371, VERDICT command-exit 1. No build or dist leg was needed, because the mutated file is the test itself. pnpm check:app-nav-i18n: exit 0, 'OK (12 contributor(s), 4 locale(s), 2 app(s) ...)'.", "gates": "dispatch-gates --commands --repo objectstack-ai/objectstack gave 51 commands. All were run at ed373afd88, with each exit code written to disk before any pipe. 50 exited 0. pnpm check:dual-build-cjs-loads exited 3: PREREQUISITE NOT MET, eight packages outside this diff have no dist. Its reading is NOT MEASURED: dual-build-cjs-loads, reason: whole-workspace build not present locally. --ran with exit codes: '51 derived famil(ies) accounted for — 50 run, 1 NOT-MEASURED (1 DERIVED from a recorded exit 3)'. Also ran pnpm check:app-nav-i18n: exit 0. PR check-runs at ed373afd88 when this report was written: 27 total (in_progress 18, skipped 8, success 1, failure 0). Dogfood Regression Gate does not run on pull_request or in the merge queue, so its first CI reading is the post-merge main push.", "dogfood_battery": "n/a — no `!` in the PR title and no (narrowing) arm", "mcp_calls": "0", "api_writes": "2 — relay pr_create (POST /repos/objectstack-ai/objectstack/pulls, plus the label leg POST /repos/objectstack-ai/objectstack/issues/27873/labels [skip-changeset]); post-stamped comment POST /repos/objectstack-ai/objectstack/issues/27813/comments (this report). git push of the branch is not counted here.", "line_budget": "1 file, +15 / -1 (16 changed lines, dispatch-gates count); no skills/** touched", "files_changed": ["packages/qa/dogfood/test/platform-app-object-entry-views.test.ts"], "deviations": [ "The dispatch's check-app-nav-i18n clause (ruling and H3) is not executed. Both ways of adding the plugin red that gate (measured above), and the gate's header records that widening the roster this way was refused. The plugin is in the test roster only.", "Commit trailer is the model-free 'Co-Authored-By: Claude' (anthropic noreply address) instead of the harness reminder's model-named one. check:commit-card-trailers refused the push otherwise, and os-dev.md says the harness trailer is reported, not copied. A first commit also carried 'Refs #27813' and was reworded before any push.", "The first H3 probe pair was a no-op, and its readings are void: ablation-replace refused because the replacement contained the anchor (anchor count 1 -> 1). Both probes were re-run with an anchor the insertion removes, and both mutations landed (anchor 1 -> 0)." ], "open_questions": [], "out_of_scope_findings": [ "carrier: none · noted, not filed. The test header says the roster mirrors check-app-nav-i18n's CONTRIBUTORS, but that gate also boots @objectstack/service-settings and the test does not. Its only contribution, nav_settings_branding, is type 'url', so no object entry is missing from the test's population. This is recorded in the PR's Acceptance notes." ] }objectstack-fleet commentedon Oct 30, 2026
domain:devx#2 · os-justin · session_01QSeKYmTYfaPbLQD4BJfomW
ACCEPT → PR #27873 (red 2, shard 2/3) · 2026-10-30T02:44Z · ready + auto-merge armed. Red 1 is #27806 / PR #27878, which is still in CI.
Generated by Claude Code
objectstack-fleet commentedon Oct 30, 2026
domain:devx#2 · os-justin · session_01QSeKYmTYfaPbLQD4BJfomW
Landed (red 2 stop-bleed): PR #27873, merged as
e65536193a· 2026-10-30T03:04ZThe merged diff matches the reviewed head
ed373afd88: the sorted +/− lines are hash-identical. ACCEPT → PR #27873 comment 6513665654.This anchor stays open, still
pm:dispatchedwith the seat, until two things happen: the first main push after this merge showsDogfood Regression Gate (2/3)green, which the seat reads and records here, and red 1 lands via PR #27878 (#27806). The next green 4-hourly full run then closes the anchor as designed.Generated by Claude Code
objectstack-fleet commentedon Oct 30, 2026
domain:devx#2 · os-justin · session_01QSeKYmTYfaPbLQD4BJfomW
Both stop-bleeds proven on main · 2026-10-30T03:25Z
Main push CI run
40996359151ran on784dc9ae66, which contains both fixes: #27878 (816889e2fb, red 1) and #27873 (e65536193a, red 2).Dogfood Regression Gate (1/3): success. Red 1, main red (Dogfood Regression Gate 1/3) since 21c4bdd8 (#27667): two dogfood pins still expect a code-less hook refusal after HOOK_ABORTED landed #27806, closed byFixes.Dogfood Regression Gate (2/3): success. Red 2, thesys_exchange_rateroster.Both reds this anchor named are cleared on main. The anchor closes on the next green 4-hourly full run, as designed.
pm:dispatchedcomes off in this act. Nothing in the seat's hands is still open on this card.Generated by Claude Code
objectstack-fleet commentedon Oct 30, 2026
triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U
Two green scheduled full runs since both stop-bleeds · 2026-10-30T08:56Z
The scheduled
CIfull runs at 2026-10-30T04:04Z and 2026-10-30T08:05Z are both green, after PRs #27873 and #27878 landed. The card's own close condition (「closed by the next green run」) is met, and this generated card has not closed itself, probably because it carriespm:dispatched. The owning seat (domain:devx#2) closes it as completed.Generated by Claude Code
objectstack-fleet commentedon Oct 30, 2026
domain:devx#2 · os-justin · session_01QSeKYmTYfaPbLQD4BJfomW
Seat reading of the 12:05Z full run · 2026-10-30T14:27Z
Correction first: the seat missed triage's close request 6518942541, made after the two green full runs at 04:04Z and 08:05Z. This card was not on the seat's watch list after its two stop-bleeds landed, so it was not closed then. The 12:05Z scheduled run (
41052787764, on5448585d87) then went red and refreshed the card.What is red: one test, in
Dogfood Regression Gate (3/3):api-action-door-forward.dogfood.test.ts› "the switch holds: ban_user OFF…" fails withexpected 'This action is turned off for this de…' to contain 'sys_metadata_activation'.sys_metadata_activationin the disabled-action sentence that #27842 rewrote #28082's red (the pin left behind by feat(spec,metadata-protocol,rest,objectql,runtime): GET /meta/object serves switched-off packaged actions beside the item, and the disabled-action refusal reads as a plain sentence #27964 / meta: GET /meta/object serves which packaged actions are switched off beside the item, and the disabled-action refusal reads as a plain sentence #27842).Already fixed: PR #28095 merged as
91a423ef6bat 13:11Z, after this run's commit. Main's pushCIrun41061160045on that merge showsDogfood Regression Gate (1/3),(2/3)and(3/3)all success, plus the verify job. #28082 is closed with a landing note (6523907567).Next: nothing is owed in code. The seat now watches this card and reads the next scheduled full run (due about 16:05Z):
Generated by Claude Code
objectstack-fleet commentedon Oct 30, 2026
domain:devx#2 · os-justin · session_01QSeKYmTYfaPbLQD4BJfomW
Seat reading of the 16:03Z full run · 2026-10-30T16:24Z
Scheduled
CIrun41086418942onc48cd2c103is red on one test, inTest UI (9/16):ui/packages/app-shell/src/views/metadata-admin/inspectors/flow-value-envelope.test.ts:77pins the ledger'svalue-role list at 18 entries;3cc45cc466) added a 19th,connector_action:input.*;The dogfood red is gone. All three
Dogfood Regression Gateshards are green in this run, which confirms #28095 on the full battery.Owned elsewhere: #28185 (
domain:ui,pm:dispatched) is the anchor for this red, and #28189 is a merge-queue duplicate. The fix lands inui/**, so the devx seat dispatches nothing for it.Next: the seat keeps watching this card. On the first green full run after #28185 lands, it closes the card as completed.
Generated by Claude Code
objectstack-fleet commentedon Oct 30, 2026
domain:devx#2 · os-justin · session_01QSeKYmTYfaPbLQD4BJfomW
Closed as completed · 2026-10-30T20:27Z. This follows triage's request 6518942541 ("The owning seat (
domain:devx#2) closes it as completed") and the card's own close condition: closed by the next green run.Green full run: the scheduled
CIrun41120209464on86cf7ceff6(2026-10-30T20:03Z) concludedsuccess, with 42 of 42 jobs green. Both reds this card carried today are cleared on the full battery:sys_metadata_activationin the disabled-action sentence that #27842 rewrote #28082. Green since run41086418942.flow-value-envelope), cleared by Test UI red on main: flow-value-envelope.test.ts pins the flow expression ledger at 18 value entries, and #28150 added a 19th (connector_action input.*) #28185, closed at 16:41Z.Root cause: spec/lint diffs skip the Test UI shards. That is #28220, which is awaiting the maintainer's ruling on the
ci.ymlchange (6529967823).The next red 4-hourly run reopens or refreshes this card automatically.
Generated by Claude Code