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-30T00:29:56.299Z · run log · commit f5dd057587953b455d85c2cd957f724bd0ac043d · 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: af515db8b5 (run 40945660381, the last green CI schedule run) .. f5dd057587 — compare
4c5023ac42fix(ui-core): read a bare-string predicate as CEL shorthand, as the spec and server do (fix(ui-core): read a bare-string predicate as CEL shorthand, as the spec and server do #27584)49896f784cdocs(changeset): declare the objectql: virtual-object correctness floor —applyDriverQueryInMemoryhelper, per-datasource row cap with a loud refusal,supportshonoured for plugin drivers, refusal-envelope mapping for driver failures (epic #27261 P1) #27277 and sharing: aprivateexternal object whose driver servesowner_idwithout declaring it infieldsgives every member every row —hasPhantomOwnerAnchorreadsfieldsonly, so the read filter goes unscoped (epic #27261, found by #27332's dev) #27425 changesets as Clause-② yes (narrowing) (docs(changeset): declare the #27277 and #27425 changesets as Clause-② yes (narrowing) #27671)eda55b9c21fix(app-shell): a full-page record form opened by direct URL returns inside the app after save or cancel (fix(app-shell): a full-page record form opened by direct URL returns inside the app after save or cancel #27558)c5d51f0303fix(studio): the Data pillar's Validations and Actions panels and ResourceEditPage keep a CEL hold with the draft (Studio Data pillar panels and ResourceEditPage: a CEL parse-fault hold still ends when the tab or selection changes; port the draft-stamped hold ruled on #27485 #27629) (fix(studio): the Data pillar's Validations and Actions panels and ResourceEditPage keep a CEL hold with the draft (#27629) #27697)2b4b970715docs: retire manifest-deps from the plugin-distribution note, re-point two stale plugin-build checklist negatives, correct the liveness manifest cell (docs: retire manifest-deps from the plugin-distribution note, re-point two stale plugin-build checklist negatives, correct the liveness manifest cell #27698)c47f5ebc9bfix(studio): an uncommitted nav rename raises the held-edit guard (fix(studio): an uncommitted nav rename raises the held-edit guard #27557)a5d70985acfix(app-shell): an approver chip that stands for several slots says so in words (fix(app-shell): an approver chip that stands for several slots says so in words #27699)2feee8371adocs(ui): ui/AGENTS.md becomes a normative core; local-dev and flaky-test narrative move to the contributor guides (docs(ui): ui/AGENTS.md becomes a normative core; local-dev and flaky-test narrative move to the contributor guides #27576)e793e9d328fix(lint): a validation rule's expression finding carries the slot's key path (fix(lint): a validation rule's expression finding carries the slot's key path #27675)c1ae3d123cci(live-e2e-ui): run on server-only diffs too (|| core), and pin the 2-minute spec budget (ci(live-e2e-ui): run on server-only diffs too (|| core), and pin the 2-minute spec budget #27619)86c9d536b4docs(adr): ADR-0066 D4 api clause — same-origintype: 'api'actions are dispatched by the platform action door (docs(adr): ADR-0066 D4 api clause — same-origintype: 'api'actions are dispatched by the platform action door #27664)04b14025d5harden(data): changing an API key through the data door requires a signed-in session (harden(data): changing an API key through the data door requires a signed-in session #27692)022e2d0b00fix(i18n): Studio trackHistory switch describes the v3 timeline, not a History tab (fix(i18n): Studio trackHistory switch describes the v3 timeline, not a History tab #27712)525ea36321docs(qa): re-point records-forms.crud-roundtrip and record-edit-undo from the removed History tab to the record page v3 audit read (docs(qa): re-point records-forms.crud-roundtrip and record-edit-undo from the removed History tab to the record page v3 audit read #27716)ecd944f598fix(objectql)!: a non-system write to a secret field may only seal a new value or keep its own record's ref (fix(objectql)!: a non-system write to a secret field may only seal a new value or keep its own record's ref #27695)eac6d969b8fix(rest)!: security/explain refuses an explicit empty userId with 400 instead of explaining the caller (fix(rest)!: security/explain refuses an explicit empty userId with 400 instead of explaining the caller #27714)d93d9be598qa(authz-conformance), docs(api): record that POST /api/v1/keys mints only for a signed-in session (qa(authz-conformance), docs(api): record that POST /api/v1/keys mints only for a signed-in session #27718)869fa76723fix(service-datasource): a plugin-driver datasource connected or reconnected through the connection service keeps the engine's floor (fix(service-datasource): a plugin-driver datasource connected or reconnected through the connection service keeps the engine's floor #27715)df0e1a0380feat(qa): retest-owed reader, touched:SHA selector and the standing regression cadence (feat(qa): retest-owed reader, touched:SHA selector and the standing regression cadence #27647)ef359b9512docs(design): plugin-distribution names esbuild, as os plugin build bundles (docs(design): plugin-distribution names esbuild, as os plugin build bundles #27723)481ade61c9fix(runtime)!: a same-origintype: 'api'action is dispatched through the action doors, so its packaged-action switch holds (Packaged action activation: switching off an api-type packaged action (Ban User) does not stop it, because the activation consult runs only at action dispatch #27506) (fix(runtime)!: a same-origintype: 'api'action is dispatched through the action doors, so its packaged-action switch holds (#27506) #27649)3702be4070fix(spec): the generated upgrade guide keeps a surface in one code span when it carries its own backticks (fix(spec): the generated upgrade guide keeps a surface in one code span when it carries its own backticks #27724)74aae1e093fix(spec)!: the published searchFields declarations refuse a value naming no field, as the Data API doors do (fix(spec)!: the published searchFields declarations refuse a value naming no field, as the Data API doors do #27725)81d00a4ed9fix(rest)!: an async import job for an unregistered object is refused with 404 OBJECT_NOT_FOUND before any job is created (fix(rest)!: an async import job for an unregistered object is refused with 404 OBJECT_NOT_FOUND before any job is created #27711)e0aed008e7fix(spec)!: analytics query doors refuse an empty cube name with 400 VALIDATION_FAILED, not 500 (fix(spec)!: analytics query doors refuse an empty cube name with 400 VALIDATION_FAILED, not 500 #27691)34dc09b68dfix(studio): hold a Rollup field until it is set up, and offer only the child fields the spec accepts for its function (fix(studio): hold a Rollup field until it is set up, and offer only the child fields the spec accepts for its function #27720)6d8372a8cdfix(console): a missing /forms/NAME renders the shared localized not-found state (fix(console): a missing /forms/NAME renders the shared localized not-found state #27739)d7625ea450fix(plugin-charts): a two-dimension pie, donut, funnel or treemap draws every group or refuses, never the first group alone (fix(plugin-charts): a two-dimension pie, donut, funnel or treemap draws every group or refuses, never the first group alone #27736)79d78b4ef7fix(automation): a map item or subflow child carries its refusal to the flow's caller (fix(automation): a map item or subflow child carries its refusal to the flow's caller #27740)6d9419bdb8fix(service-datasource): a runtime managed datasource syncs its bound objects' tables on create and after a restart (fix(service-datasource): a runtime managed datasource syncs its bound objects' tables on create and after a restart #27748)b2b4972f5afix(plugin-audit): match an @mention email case-insensitively (fix(plugin-audit): match an @mention email case-insensitively #27751)2dc69d7745fix(plugin-approvals): a user approver naming no account expands to nobody and takes onEmptyApprovers (fix(plugin-approvals): a user approver naming no account expands to nobody and takes onEmptyApprovers #27749)2cbe559de4test(ui): live master-detail spec asserts the server stored the parent and child, not only that the batch was sent (test(ui): live master-detail spec asserts the server stored the parent and child, not only that the batch was sent #27759)01eab23fccfix(rest): a refused json export answers the 400 envelope, not a truncated 200 stream (fix(rest): a refused json export answers the 400 envelope, not a truncated 200 stream #27753)a7af1c19bdfeat(console): report index groups reports by object, with All/Recent views and search (feat(console): report index groups reports by object, with All/Recent views and search #27622)968cacfd10fix(app-shell): the Studio canvas runs a report or widget over a draft dataset before the package publishes (fix(app-shell): the Studio canvas runs a report or widget over a draft dataset before the package publishes #27758)ca64f6f9eafix(platform-objects): API key Revoke and Restore toasts name the key (fix(platform-objects): API key Revoke and Restore toasts name the key #27757)64599ec574fix(plugin-sharing): a refused write on a federated object whose mapped owner column the driver did not serve is logged again (fix(plugin-sharing): a refused write on a federated object whose mapped owner column the driver did not serve is logged again #27760)a0413fc77cfix(service-storage): sys_file's storage-owned columns (key, mime_type, size, status, etag) are not writable outside the storage service (fix(service-storage): sys_file's storage-owned columns (key, mime_type, size, status, etag) are not writable outside the storage service #27765)8f25cee2a4fix(service-datasource)!: a datasource create may not name a stored credential reference; the settings handle door is pinned as it holds (fix(service-datasource)!: a datasource create may not name a stored credential reference; the settings handle door is pinned as it holds #27761)21c4bdd804fix(rest): an undeclared hook abort answers the data door with HOOK_ABORTED (fix(rest): an undeclared hook abort answers the data door with HOOK_ABORTED #27667)e5cce0961etest(ui): promote the Studio live specs into Live E2E UI, with a stored-state re-read each (test(ui): promote the Studio live specs into Live E2E UI, with a stored-state re-read each #27770)03cc871ad6fix(types): a write to a registered object whose table is missing answers 500 DATABASE_ERROR, as the read does, not 404 OBJECT_NOT_FOUND (fix(types): a write to a registered object whose table is missing answers 500 DATABASE_ERROR, as the read does, not 404 OBJECT_NOT_FOUND #27771)946395db23fix(app-shell): the bell header breakdown names its unit, unread topics (fix(app-shell): the bell header breakdown names its unit, unread topics #27775)e7dda2cc2cfix(plugin-dashboard): a viewer whose every tile is refused sees one no-access panel, not a blank canvas (fix(plugin-dashboard): a viewer whose every tile is refused sees one no-access panel, not a blank canvas #27777)2a0b37bb6ffix(console): a missing public /f/:slug form renders the shared localized not-found state (fix(console): a missing public /f/:slug form renders the shared localized not-found state #27782)561b7642e1fix(app-shell): a dynamic currency change in record History reads in the tenant currency (fix(app-shell): a dynamic currency change in record History reads in the tenant currency #27779)5c083e8758fix(ui-core): evaluatePlainCondition reads a bare-string predicate as CEL, as evaluateCondition does (fix(ui-core): evaluatePlainCondition reads a bare-string predicate as CEL, as evaluateCondition does #27773)86aaff326dfix(studio): an item just added to a dashboard list property is held until it is filled in, not autosaved and refused (Studio: "Add item" on a dashboard list property autosaves an empty item (422), and every later edit is refused and lost until reload #27459) (fix(studio): an item just added to a dashboard list property is held until it is filled in, not autosaved and refused (#27459) #27784)e00374a348fix(metadata-protocol): an object draft's verdict names the namespace-prefix refusal its publish gives (metadata: a draft save accepts an object name without the package namespace prefix; only publish-drafts refuses it (NAMESPACE_PREFIX) #27444) (fix(metadata-protocol): an object draft's verdict names the namespace-prefix refusal its publish gives (#27444) #27780)194e66c028feat(platform-objects): sys_exchange_rate — an organization's dated exchange rates, admin-written and audited, with a Setup list under Localization (feat(platform-objects): sys_exchange_rate — an organization's dated exchange rates, admin-written and audited, with a Setup list under Localization #27246)f5dd057587docs(service-messaging): name the sys_webhook edit check behind the redeliver door (docs(service-messaging): name the sys_webhook edit check behind the redeliver door #27776)
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