Repository navigation
hourly full run: red on main (CI) #25131
Description
os-hourly-full-run-ci — machine-findable marker for this generated card. ⛔ Do not delete this line: it is how the hourly full run finds this card instead of filing a new one every hour.
hourly full run: red on main (CI)
Swept 2026-10-21T23:11:39.818Z · run log · commit abc25a3536e2f00cc55ee6745320cb8f7209c459 · conclusion failure.
CI runs the FULL battery on main every hour (#16467). 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 hourly 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 hourly run green.
Fix what it names and let the next 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 hourly run
Range: 03966ceae0 (run 39630936555, the last green CI schedule run) .. abc25a3536 — compare
5e9b100743feat(driver-sql,driver-turso)!: 18.x step 7 part 7b-0 — a table the driver creates carries its tenant column NOT NULL (feat(driver-sql,driver-turso)!: 18.x step 7 part 7b-0 — a table the driver creates carries its tenant column NOT NULL #24940)fccbd9d0d5feat(spec, plugin-email): IEmailService.isConfigured() answers whether mail is delivered (feat(spec, plugin-email): IEmailService.isConfigured() answers whether mail is delivered #25125)4e2c42f363fix(driver-sql): a refused SQLite connect() closes the connection it opened (fix(driver-sql): a refused SQLite connect() closes the connection it opened #25126)d5d8146012feat(driver-sql,driver-turso,driver-memory,objectql,cli,metadata-protocol): plain organization key part in new unique indexes; the differ reads COALESCE(tenant) as tenant on a certified database (18.x step 7b-1 + 7b-2) (feat(driver-sql,driver-turso,driver-memory,objectql,cli,metadata-protocol): plain organization key part in new unique indexes; the differ reads COALESCE(tenant) as tenant on a certified database (18.x step 7b-1 + 7b-2) #24893)1b3b65e643feat(rest)!: retire GET {base}/docs, the OpenAPI document's HTML viewer page; /openapi.json stays (feat(rest)!: retire GET {base}/docs, the OpenAPI document's HTML viewer page; /openapi.json stays #25124)863c580224docs(objectql,spec): the tenant column is stamped and never NULL on single-tenant stacks (C1) (docs(objectql,spec): the tenant column is stamped and never NULL on single-tenant stacks (C1) #25135)60b42cd0b7fix(spec,plugin-sharing,scripts): retire the organization-less text step 7 left behind; check-tenant-chokepoint accepts where(tenant, 'is not', null) (fix(spec,plugin-sharing,scripts): retire the organization-less text step 7 left behind; check-tenant-chokepoint accepts where(tenant, 'is not', null) #25140)abc25a3536fix(plugin-auth)!: the last-admin guard and the default-org bootstrap count only the Default Organization's admin_full_access grant (fix(plugin-auth)!: the last-admin guard and the default-org bootstrap count only the Default Organization's admin_full_access grant #25141)
Filed by.github/workflows/scheduled-full-run-card.yml. Generated by Claude Code
Activity
objectstack-fleet commentedon Oct 21, 2026
Triage: cause found · re-laned
domain:devx→domain:engine· p1 ·pm:queue· owner: the PR #24940 seat (epic #24583,os-steve)Triage seat (objectstack-wide, seat post #6015) ·
session_01AavokzJ5DndAwitDXvKy4U· 2026-10-21T17:53Z. ⛔ Not a claim.What is red:
Temporal Conformance (live PG + MySQL), step "Run driver-sql suite against both live servers". It failed on both the push run 39636655189 and the scheduled run 39640024387, atfccbd9d0d5. The suite reads 6 failed, 5657 passed and 2 skipped. All 6 failures are in the live MySQL cell. PostgreSQL and SQLite pass.packages/drivers/driver-sql/src/sql-driver-12998-shadow-null-safe-key.test.tssql-driver-13015-shadow-carried-index-drift.test.tsos migrate apply --allow-destructive…")sql-driver-15479-shadow-plain-unique-duplicates.test.tsThe error is in the fixtures' setup inserts, not their assertions:
Column 'organization_id' cannot be nullandField 'organization_id' doesn't have a default value, onos12998_*,os13015_applyandos15479_org.Cause: PR #24940 (
5e9b100743, 18.x step 7 part 7b-0). It makes a table the driver creates (initObjects) holdorganization_idNOT NULL.driver.initObjectsand then insert rows with no organization.asPre18TenantColumn(driver, table)(pre-18-tenant-column.testkit.ts) and wired it into about a dozen driver-sql suites, but not these three. They run only against live MySQL.a674501c47) showsTemporal Conformance (live PG + MySQL)=skipped, so its CI never ran them.fccbd9d0d5(feat(spec, plugin-email): IEmailService.isConfigured() answers whether mail is delivered #25125, spec / plugin-email) is unrelated.Fix direction (for the owning seat to confirm): call
asPre18TenantColumnafter eachinitObjectsin the three files. Where a test callsinitObjectsa second time, check whether that call restores NOT NULL. ⛔ Narrowing, skipping or deleting the live cell is not a remedy (this card's header).Owner: the seat that landed PR #24940 (epic #24583, assignee
os-steve). The lane isdomain:engine(packages/drivers/*). #25128 (the residue-narrowing of the same relax rigs) is adjacent; fold it in only if the seat judges the region is the same.objectstack-fleet commentedon Oct 21, 2026
Claim: PM loop round 28 · 2026-10-21T22:16Z · p1,
domain:engine(triage's grade and re-lane, 6322801126). The maintainer, in-session at 2026-10-21T22:16Z: 「engine 车道有任务为什么不派发」. Read as: whiledomain:engineseat 2 is vacant (it signed off at 2026-10-21T11:22Z), this seat takes the lane's p1 and p2 cards too, still one card at a time. Triage named the PR #24940 seat (epic #24583,os-steve) as owner. That epic closed at 2026-10-21T18:16Z with no claim or open PR on this card, so the lane seat takes it.What is red on
main: the hourly full run, at every commit sincefccbd9d0d5. The failing job isTemporal Conformance (live PG + MySQL), step "Run driver-sql suite against both live servers", with 6 failures, all in the live MySQL cell:sql-driver-12998-shadow-null-safe-key.test.ts(4);sql-driver-13015-shadow-carried-index-drift.test.ts(1);sql-driver-15479-shadow-plain-unique-duplicates.test.ts(1).The errors come from the fixtures' setup inserts:
Column 'organization_id' cannot be null/Field 'organization_id' doesn't have a default value. Since 7b-0 (PR #24940,5e9b100743), a tableinitObjectscreates carriesorganization_idNOT NULL. The PR wiredasPre18TenantColumninto about a dozen driver-sql suites, but not these three. They run only against live MySQL, and that job never runs on a PR or in the merge queue.Session:
session_01JtSQQ3EWsbNPzyYMug1tXy(the dispatching seat; the dev runs as its own cloud session, named in the dispatch comment)Account:
os-project-manager(the seat's linked user asGET /useranswers it; always the card's assignee)Branch:
claude/issue-25131-mysql-fixtures-pre18-tenant-columnWorktree:
objectstack-issue-25131Domain:
domain:engineSeat:
domain:engine#1(seat post #6367)File surface:
initObjectswhose table a fixture then fills with organization-less rows, callasPre18TenantColumn(driver, table)(packages/drivers/driver-sql/src/pre-18-tenant-column.testkit.ts), the way the suites 7b-0 already wired do. Where a test callsinitObjectsa second time on the same table, measure whether that call restores NOT NULL, and relax again only if it does.driver-sqlsuite gated to a live dialect (pg/mysql) that builds withinitObjectsand then inserts with no organization, so the next hourly run does not surface a fourth file. The PG cell passes today; say why.⛔ Not in scope:
plugin-security/plugin-auth/plugin-approvals,domain:services').Card lifecycle: this generated card closes on the next green hourly run, so the PR body says
Refs #25131, notFixes.Container & model:
S,mode:cloud(fixture setup in three test files, plus a census),model: TIER_DEFAULT(this run'sdispatch-gates.mjs --tier: "no path-derived mandate")Clause-②: no (test fixtures only: no response, status, error, outcome or export moves)
Responsibility: anyone reading the hourly full run, and the release gate that reads the full battery | three live-MySQL fixtures insert organization-less rows into tables 7b-0 now creates NOT NULL |
main's full battery, red at every commit sincefccbd9d0d5Thread-read: 6322801126
Serial constraints cleared: the 9 open PRs' file lists were read at this claim, on
origin/main60b42cd0b7. None touchespackages/drivers/driver-sqlor a pre-18 testkit.Generated by Claude Code
objectstack-fleet commentedon Oct 21, 2026
Dispatch ·
domain:engineseat 1 ·session_01JtSQQ3EWsbNPzyYMug1tXy· 2026-10-21T22:19Z:mode:cloud. The dev session issession_018gewcgUaNUX9hMkxeP2HE2. It builds at the default tier on branchclaude/issue-25131-mysql-fixtures-pre18-tenant-column, under claim 6327765912.temporal-conformancerecipe, in a container) before any edit;initObjectsrestores NOT NULL;asPre18TenantColumnafter eachinitObjectswhose table a fixture fills organization-less, as the suites 7b-0 already wired do;Refs #25131(the card closes on the next green hourly run), with theClause-②:andMetadata-protocol: nonelines.Generated by Claude Code
objectstack-fleet commentedon Oct 21, 2026
os-dev-report
{ "issue": 25131, "status": "done", "branch": "claude/issue-25131-mysql-fixtures-pre18-tenant-column", "pr": "https://github.com/objectstack-ai/objectstack/pull/25142", "session": "session_018gewcgUaNUX9hMkxeP2HE2 (dev cloud session; dispatched by domain:engine seat 1, session_01JtSQQ3EWsbNPzyYMug1tXy, seat post #6367)", "premise_still_valid": true, "summary": "Reproduced on live MySQL 8.0 and PostgreSQL 16 in local docker containers, with CI's recipe. There are 7 failures, not 6, at abc25a35; the hourly log at 60b42cd0b7 (job 119511306969) lists the same 7. The card's 6 was counted at fccbd9d0d5, before #24893 (7b-1 + 7b-2) landed. Five come from 7b-0's NOT NULL rejecting the NULL-organization seeds. Two (12998 'collides two NULL-organization rows…' and 13015 'reports and repairs a shadow that hashes the raw columns') come from 7b-2: a unique: 'organization' declaration now keys the plain tenant column. So asPre18TenantColumn alone cannot green them. The fixture-only edit, in the claim's three files: the org-scoped index these tests use is declared in its 18.0 form (fields [organization_id, v], unique: true, nullSafeColumns [organization_id]; honoured verbatim, the spelling #24893 adopted in the driver-turso suites), and asPre18TenantColumn follows each initObjects whose table then gets NULL-organization rows (7 call sites). No assertion or test was changed, skipped or deleted. Live driver-sql suite after the edit: 242/242 files, 5688 passed, 2 skipped. Default suite and typecheck are green.", "tests": "Live (CI env: TZ=America/New_York, OS_TEST_MYSQL_URL=mysql://root:root@127.0.0.1:3306/conformance with time_zone +08:00, OS_TEST_POSTGRES_URL=postgres://postgres:postgres@127.0.0.1:5432/postgres with timezone Asia/Shanghai, OS_EXPECT_LIVE_DIALECT_MATRIX=1). BEFORE, head abc25a35, the three files: 'Test Files 3 failed (3) · Tests 7 failed | 12 passed (19)', VERDICT command-exit 1. The 7, named: 12998 collides two NULL-organization rows under an org-scoped shadow unique (expected 'unhex(sha2(concat(`organization_id`,0…' to contain 'coalesce'); 12998 diagnoses existing NULL-org duplicates… (Column 'organization_id' cannot be null); 12998 names a NULL-organization duplicate in declared terms… (Field 'organization_id' doesn't have a default value); 12998 counts the sixth conflicting group… (cannot be null); 13015 survives 'os migrate apply --allow-destructive'… (cannot be null); 13015 reports and repairs a shadow that hashes the raw columns (a raw-column shadow is real drift and must be reported: expected undefined to be truthy); 15479 leaves the NULL-safe arm saying the NULL-safe thing (cannot be null). AFTER, head e4c6eaf7c: the three files 'Test Files 3 passed (3) · Tests 19 passed (19)', VERDICT command-exit 0. Full `pnpm --filter @objectstack/driver-sql test`, live PG + MySQL: 'Test Files 242 passed (242) · Tests 5688 passed | 2 skipped (5690)', VERDICT command-exit 0. Default run, no live servers: 'Test Files 230 passed | 12 skipped (242) · Tests 3742 passed | 212 skipped (3954)'; `pnpm --filter @objectstack/driver-sql typecheck` exit 0 in the same locked command, VERDICT command-exit 0; `tsc --listFiles` counts all 3 edited files. MEASUREMENT (scratch probe, built driver, live MySQL, IS_NULLABLE of organization_id): NO after initObjects; YES after asPre18TenantColumn; YES after a second initObjects on the same driver; YES after a second initObjects on a new driver; detectManagedDrift then reports [], and applyMigrationEntries with allowDestructive leaves it YES. So no second relax is needed. Ablation: n/a (no tested production behaviour changed; fixture-only).", "gates": "On e4c6eaf7c: `node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack` (no paths; change set 3 paths, +67/-8 vs merge base abc25a353) derived 54 commands. Each ran with its exit code captured before any pipe: 52 exit 0. `pnpm check:dual-build-cjs-loads` and `pnpm check:lean-entry-closure` exited 3 (PREREQUISITE NOT MET); after `pnpm exec turbo run build --concurrency=2` (Tasks 77 successful, 77 total, VERDICT command-exit 0), both re-ran to exit 0. `--ran` with 'COMMAND :: exit N' records: 'Run reconciliation — 54 derived, 54 run, 0 NOT-MEASURED, 0 UNRUN' and '✓ … a DERIVED zero'. The repo was deepened first (`git fetch --shallow-since=2026-07-13`). origin/main merged before pr_create: already up to date at abc25a35. NUL/control-byte self-scan of the 3 files: 0 hits. PR check-runs at report time (head e4c6eaf7c): Check Changeset = success; 'No other open PR may claim the same issue' = success; Lint · * (8 jobs), Type Check · * (4 jobs), Governed Surface Queue Guard, 'Part-of PR must not also close its card', 'The card this PR closes must claim this branch', single-writer path, Check PR Size, Check Documentation Links, docs-affected, filter = in_progress; opt-in jobs and Auto Label = skipped. Temporal Conformance (live PG + MySQL) does not run on PRs: its proof is the local live run above plus the next hourly full run.", "dogfood_battery": "n/a — no `!` in the PR title and no (narrowing) arm (Clause-②: no)", "mcp_calls": "8 — all reads: mcp__github__issue_read ×2 (get, get_comments on #25131), mcp__github__actions_list ×1 (list_workflow_jobs, run 39683348463), mcp__github__get_job_logs ×1 (job 119511306969), mcp__github__pull_request_read ×2 (get, get_check_runs on #25142), plus ToolSearch loads (not GitHub calls). No MCP write tool.", "api_writes": "3 — (1) `git push` of claude/issue-25131-mysql-fixtures-pre18-tenant-column (empty branch, then e4c6eaf7c; two pushes to the one branch); (2) relay pr_create, run 39689778307, request fw-20261021T225403Z-c011a5: POST /repos/objectstack-ai/objectstack/pulls (draft) + POST /issues/25142/assignees [os-project-manager] + POST /issues/25142/labels [skip-changeset], read back as 8202 bytes sent / 8202 stored, assignee os-project-manager, label skip-changeset, draft true; (3) relay comment: POST /repos/objectstack-ai/objectstack/issues/25131/comments (this report).", "files_changed": [ "packages/drivers/driver-sql/src/sql-driver-12998-shadow-null-safe-key.test.ts (+23/-4)", "packages/drivers/driver-sql/src/sql-driver-13015-shadow-carried-index-drift.test.ts (+25/-2)", "packages/drivers/driver-sql/src/sql-driver-15479-shadow-plain-unique-duplicates.test.ts (+19/-2)" ], "line_budget": "none set; diff +67/-8 over 3 files (per file above)", "deviations": [ "Beyond the claim's stated route: the claim named asPre18TenantColumn alone. Measured, that greens 5 of 7 at most: two failures assert the NULL-safe (COALESCE) shadow form, which since 7b-2 (#24893) a unique: 'organization' declaration no longer produces. Per the dispatch's 按实测修 clause, the fix also declares the org-scoped index in its 18.0 form (nullSafeColumns, honoured verbatim). It stays inside the same three files and inside fixture setup, with no assertion touched.", "Failure count: 7, not the 6 in the dispatch and the card; the extra one is 13015 'reports and repairs a shadow that hashes the raw columns'. Measured locally and in the hourly log at 60b42cd0b7.", "Base: today's origin/main was abc25a35, not the dispatch's 60b42cd0b7. The one intervening commit (#25141, plugin-auth) touches nothing in driver-sql.", "Commit trailers: the commit carries the model-free pair (Claude-Session + 'Co-authored-by: Claude'), per AGENTS.md and the pre-push hook. The harness's attribution reminder asked for a model-named Co-Authored-By; AGENTS.md wins, and that reminder itself yields to repo rules.", "PR body footer: the AGENTS.md session-URL footer form only. The harness's separate '🤖 Generated with' PR-body line was not added (os-dev 字节与 sanitizer 纪律 governs).", "Platform PR-subscription posture: per os-dev (本派发契约压过平台注入的 PR 订阅姿态), I did not subscribe to or watch #25142, and did not wait on CI.", "Infrastructure started in this container: dockerd (its PID recorded in the scratchpad) and two containers, os25131-mysql and os25131-pg; all three are torn down after this report." ], "open_questions": [ { "question": "How should the 7 live-MySQL tests that pin the NULL-safe hash-shadow arm model their store after 7b-0 + 7b-2? (Settled by me; recorded for the seat.)", "options": [ "A — the 18.0 store: index input carrying nullSafeColumns (honoured verbatim) + asPre18TenantColumn. Fixture-only; every assertion kept; this is #24893's own Turso spelling for the retained path.", "B — rewrite the assertions to the new plain semantics (NULL-organization rows do not collide). Changes assertions, which the card forbids, and drops the pins on a driver path (nullSafeColumns input, the COALESCE readers) that still exists.", "C — stamp an organization on the seeds. Removes the NULL-organization rows that are the subject of every one of these tests, so they would measure nothing." ], "recommendation": "A, taken, by the four axes. Real need: the NULL-safe arm is still live code, reached by any input carrying nullSafeColumns and by an 18.0-built store, so its pins guard real behaviour. Long-term soundness: it mirrors #24893's own precedent and needs no production change or workaround. Preventing AI mistakes: every assertion stays strict and nothing gets more lenient. Startup focus: no new surface or gate; +67/-8 in three test files. If the NULL-safe input path is ever retired, these suites retire with it." } ], "out_of_scope_findings": [ "carrier: none (承接者:无) — noted in the PR's Acceptance notes only. Card/triage arithmetic: #25131's body and triage count 6 failures, read at fccbd9d0d5; at 60b42cd0b7 and later it is 7. Not a defect class a/b/c; no card filed." ] }Generated by Claude Code