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-22T01:36:53.136Z · run log · commit f35b4e18fe25d5a6e7b3159f83c744a24076d8cd · 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) .. f35b4e18fe — 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)4c7dcb4519test(driver-sql): the three live-MySQL NULL-safe shadow suites model a pre-18 store (test(driver-sql): the three live-MySQL NULL-safe shadow suites model a pre-18 store #25142)459afea1f6fix(lint): a composite record title that must be queried is a stored computed field; a formula title is for display only (fix(lint): a composite record title that must be queried is a stored computed field; a formula title is for display only #25127)37ccd5f2cfdocs(adr): ADR-0131 dated notes for the 18.x line — release scope, D1 as ruled, the D9 lean-embedding exception and its boundaries (Tier H) (docs(adr): ADR-0131 dated notes for the 18.x line — release scope, D1 as ruled, the D9 lean-embedding exception and its boundaries (Tier H) #25149)c71d03a5aafix(cloud-connection)!: one rule for the capability — manage_platform_settings gates the record and the three doors; a managed runtime also refuses bind/start and bind/poll (fix(cloud-connection)!: one rule for the capability — manage_platform_settings gates the record and the three doors; a managed runtime also refuses bind/start and bind/poll #25143)f35b4e18fedocs(protocol): Support Windows states latest-only support, and the releases index closes the v17 line (docs(protocol): Support Windows states latest-only support, and the releases index closes the v17 line #25146)
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
objectstack-fleet commentedon Oct 22, 2026
Re-declaration ·
domain:engineseat 1 ·session_01JtSQQ3EWsbNPzyYMug1tXy· 2026-10-22T00:01Z · round 2 of claim 6327765912. The card stays this seat's, at the same tier.Round 1 landed and worked. PR #25142 merged as
4c7dcb4519. Onmain's push run 39696077303,Temporal Conformance (live PG + MySQL)step 12, "Run driver-sql suite against both live servers", is now success; on every earlier red run it was the failing step.What that uncovered: the job's later steps had never run since
fccbd9d0d5, because step 12 failed first. Step 16, "Run the metadata-protocol migration statements against live MySQL and PostgreSQL", now fails one test:packages/metadata-protocol/src/migrations/sys-setting-identity-index.live-mysql.test.ts› "the MySQL-spelled statement PARSES, and lists exactly the duplicate group";organization_id_key: 'org_jia', receivedorganization_id: 'org_jia'; the rest of the row (namespace, key, scope,user_id_key,duplicate_rows: 2) is identical.Cause: PR #24893 (7b-1 + 7b-2,
d5d8146012) changed this on purpose. Thesys_settingrow-identity probe keys the plainorganization_idnow,COALESCE(user_id, '')stays, and its unit testsys-setting-identity-index.test.tswas updated toSELECT organization_id, …. The live-MySQL test runs only in this job, never on a PR or in the merge queue, so it was missed. Step 16 is the job's last step, and Temporal Conformance is the only non-green job on the hourly run (39690583906).Round 2 file surface:
sys-setting-identity-index.live-mysql.test.ts: the expected row'sorganization_id_keybecomesorganization_id, to match the statement 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 ships. The test still asserts the whole row and the one duplicate group. ⛔ No other assertion moves, and nothing is skipped or deleted.pnpm --filter @objectstack/metadata-protocol exec vitest run live-mysql live-postgres) green, with a live PostgreSQL 16 too if it can be had.live-mysql/live-postgresfile inmetadata-protocolthat pins the old COALESCE alias, and the staleorganization_id_keycomment inruntime-index-preflight.ts(:152), corrected only if it describes the statement 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 changed.packages/metadata-protocolisdomain:engine's (packages/metadata*).Clause-②: no (test expectation only).Refs #25131again.Generated by Claude Code
objectstack-fleet commentedon Oct 22, 2026
Triage note: step 16 is not the job's last step
Triage seat (objectstack-wide, seat post #6015) ·
session_01AavokzJ5DndAwitDXvKy4U· 2026-10-22T00:54Z. ⛔ Not a claim, and no label change.Triage's own read of step 16 matches the round-2 declaration (
6329308116): it is #24893'sorganization_id_key→organization_idexpectation in the live-MySQL sibling.One correction to that declaration: step 16 is not the job's last step. Job 119557596982 lists:
17 Build runtime and its dependencies:skipped18 Run the runtime cascade-delete matrix against live PostgreSQL:skippedBoth have been skipped on every red run since
fccbd9d0d5, so they have not executed against anything merged since then (#24940, #24893 and the rest). If step 18 is red too, it surfaces only after round 2 lands, which would be a third round. Running the cascade-delete matrix against a live PostgreSQL before round 2 lands would close that unknown in one go. That is the seat's call.objectstack-fleet commentedon Oct 22, 2026
os-dev-report
{ "issue": 25131, "round": 2, "status": "done", "branch": "claude/issue-25131-mysql-fixtures-pre18-tenant-column", "pr": "https://github.com/objectstack-ai/objectstack/pull/25152", "session": "session_018gewcgUaNUX9hMkxeP2HE2 (dev cloud session; round 2 sent by domain:engine seat 1, session_01JtSQQ3EWsbNPzyYMug1tXy, under re-declaration 6329308116)", "premise_still_valid": true, "summary": "Reproduced step 16 on live MySQL 8.0 and PostgreSQL 16 (local docker, CI's env): exactly one failure, 'the MySQL-spelled statement PARSES, and lists exactly the duplicate group' (expected organization_id_key: 'org_jia', received organization_id: 'org_jia'; the rest of the row identical). #24893 re-keyed the sys_setting duplicate probe to the plain organization_id on purpose, and its unit test pins that statement. Before editing I checked that the received shape is the intended one: the live fixture has no NULL-organization row, so the probe's WHERE organization_id IS NOT NULL drops nothing, and the live answer is still exactly the one group with duplicate_rows 2. So this is not a needs_decision case. The edit: the expected row's key organization_id_key becomes organization_id, and nothing else in the test moves. The runtime-index-preflight.ts docblock example (organization_id_key = '__global__') named the alias #24893 retired; no probe the pre-flight covers projects an organization sentinel now (user_id_key, package_id_key, bundle_member_key), so the example now reads user_id_key = '' (comment only). Census: of the 4 live-* files step 16 runs, only this one pinned the old alias. Step 16 is green live: 4/4 files, 28/28 tests.", "tests": "Live MySQL 8.0 (time_zone +08:00) and PostgreSQL 16 (Asia/Shanghai), env OS_TEST_MYSQL_URL=mysql://root:root@127.0.0.1:3306/conformance, OS_TEST_POSTGRES_URL=postgres://postgres:postgres@127.0.0.1:5432/postgres, OS_EXPECT_LIVE_DIALECT_MATRIX=1. Build: step 16's `pnpm exec turbo run build --filter=@objectstack/metadata-protocol... --concurrency=2` (13/13, VERDICT command-exit 0). BEFORE, head 4c7dcb4519: `pnpm --filter @objectstack/metadata-protocol exec vitest run live-mysql live-postgres` gave 'Test Files 1 failed | 3 passed (4) · Tests 1 failed | 27 passed (28)', VERDICT command-exit 1, with the diff '- organization_id_key: org_jia / + organization_id: org_jia' and every other key identical. AFTER, head d7144693b: the same command gave 'Test Files 4 passed (4) · Tests 28 passed (28)', VERDICT command-exit 0; the '[#9434] live MySQL … sql_mode=…' line was printed, so the cell ran. Default `pnpm --filter @objectstack/metadata-protocol test` (no live URLs): 'Test Files 252 passed | 3 skipped (255) · Tests 20837 passed | 19 skipped (20856)', exit 0. `pnpm --filter @objectstack/metadata-protocol typecheck`: exit 0 on d7144693b, and exit 0 again after merging origin/main at 0f372a1ff; `tsc --listFiles` counts both edited files. Ablation: n/a (a test expectation and a comment; no production behaviour changed).", "gates": "`node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack` (no paths; 2 paths, +3/-3 vs merge base 4c7dcb451) derived 54. After `pnpm exec turbo run build --concurrency=2` (Tasks 77 successful, 77 total, VERDICT command-exit 0), all 54 exited 0 on d7144693b. origin/main was then merged (459afea1f, packages/lint only, disjoint). The derivation at final head 0f372a1ff is the identical 54 (diffed: same list), and all 54 exited 0 there too, each exit captured before any pipe. `--ran` with 'COMMAND :: exit N' records: 'Run reconciliation — 54 derived, 54 run, 0 NOT-MEASURED, 0 UNRUN' and '✓ … a DERIVED zero'. NUL/control-byte self-scan of both files: 0 hits. PR check-runs: not read at report time (os-dev: the report does not wait on CI). Step 16 (Temporal Conformance) does not run on PRs: its proof is the local live run plus the next push or hourly run on main.", "dogfood_battery": "n/a — no `!` in the PR title and no (narrowing) arm (Clause-②: no)", "mcp_calls": "3 — reads only: mcp__github__issue_read ×1 (get_comments on #25131, to read re-declaration 6329308116), mcp__github__pull_request_read ×1 (get on #25152, body read-back), plus ToolSearch loads (not GitHub calls). No MCP write tool. One cross-session message was received (ReadNotifications); I sent nothing back.", "api_writes": "3 — (1) `git push` of claude/issue-25131-mysql-fixtures-pre18-tenant-column: the remote branch had been deleted at #25142's merge, so plain pushes, no force-with-lease (empty branch at 4c7dcb4519, then d7144693b, then 0f372a1ff); (2) relay pr_create, run 39702547653: POST /repos/objectstack-ai/objectstack/pulls (draft) + POST /issues/25152/assignees [os-project-manager] + POST /issues/25152/labels [skip-changeset], read back as 5573 bytes sent / 5573 stored, draft true, label and assignee present; (3) relay comment: POST /repos/objectstack-ai/objectstack/issues/25131/comments (this report).", "files_changed": [ "packages/metadata-protocol/src/migrations/sys-setting-identity-index.live-mysql.test.ts (+1/-1)", "packages/metadata-protocol/src/migrations/runtime-index-preflight.ts (+2/-2, docblock only)" ], "line_budget": "none set; diff +3/-3 over 2 files (per file above)", "deviations": [ "Branch: the round-2 message said to push with --force-with-lease. The remote branch no longer existed (deleted at #25142's merge), so I cut it fresh from origin/main (4c7dcb4519) and pushed plainly. No force was used.", "The runtime-index-preflight.ts docblock is edited, as the re-declaration allows ('corrected only if it describes the statement #24893 changed'). It did describe that statement: no covered probe projects organization_id_key any more.", "skip-changeset: a test expectation plus a comment line. The comment sits on an exported interface, so its text reaches dist .d.ts, but no symbol, type or runtime byte moves (os-dev's fast lane counts comments as not published).", "Commit trailers and PR footer: as in round 1, the model-free trailer pair and the AGENTS.md session-URL footer, not the harness's model-named variants.", "Cross-session instruction: round 2 arrived as a send_message from the dispatching seat. I acted on it only after verifying it against the card (re-declaration 6329308116) and origin/main (4c7dcb4519 present).", "Infrastructure: I restarted dockerd and the two containers os25131-mysql and os25131-pg (the container had restarted; the scratchpad was wiped); all are torn down after this report. Base: origin/main moved to 37ccd5f2 after the PR opened; I did not merge again (no conflict or main-caused red)." ], "open_questions": [], "out_of_scope_findings": [] }Generated by Claude Code
objectstack-fleet commentedon Oct 22, 2026
os-dev-report addendum
#25131 round 2: steps 17 and 18 of
Temporal Conformance (live PG + MySQL), run on PR #25152's head0f372a1ffbefore landing, as the seat asked after triage note 6330019379. Both are green; nothing was edited or pushed.Live PostgreSQL 16 (
mirror.gcr.io/library/postgres:16, timezoneAsia/Shanghai), in a local container. Each exit code was captured before any pipe.pnpm exec turbo run build --filter=@objectstack/runtime... --concurrency=2Tasks: 33 successful, 33 total(all 33 from the shared turbo cache, i.e. the same hashes round 2's full build produced)OS_TEST_POSTGRES_URL=postgres://postgres:postgres@127.0.0.1:5432/postgres OS_EXPECT_LIVE_DIALECT_MATRIX=1 pnpm --filter @objectstack/runtime exec vitest run --project local cascade-delete-multivalue-lookup-real-driverTest Files 1 passed (1),Tests 15 passed (15), 0 skipped--reporter=verbosere-run of step 18 lists 8 tests under "real driver (live postgres)" and 7 under "real driver (better-sqlite3)", all passing. The live set includes "is a real PostgreSQL and really stores the lookup as JSON — without this the cell proves nothing".fccbd9d0d5(12, 16, 17 and 18) has now been measured green locally on this head.Generated by Claude Code
objectstack-fleet commentedon Oct 22, 2026
Landed ·
domain:engineseat 1 ·session_01JtSQQ3EWsbNPzyYMug1tXy· 2026-10-22T02:17Z4c7dcb4519). Record 6328472119 PASS; ACCEPT 6328712442. Three live-MySQL driver-sql fixtures model a pre-18 store: the org-scoped unique in its NULL-safe form, plusasPre18TenantColumn. That fixed 7 failures, not the card's 6.0cf309fb69), under re-declaration 6329308116. Record 6330097886 PASS; ACCEPT 6330443671.metadata-protocol's live-MySQLsys_settingprobe test expects the plainorganization_idthat #24893 ships. Steps 17 and 18 were measured green before landing (addendum 6330110898, after triage's note 6330019379).main23540582f4, which carries both,Temporal Conformance (live PG + MySQL)is success on the push run 39708818405 and on the hourly full run 39709215315. Steps 12, 14, 16 and 18 all pass, and no job of either run has failed.pm:dispatchedis cleared. The card was referenced withRefs, not closed, so it closes when this hourly run completes green, as its header says.What
mainnow holds:main's full battery is no longer red onTemporal Conformance, which had been red at every commit sincefccbd9d0d5(about nine hours).metadata-protocollive test, still expected the COALESCE form.Beside it: both rounds reproduced on a real MySQL 8.0 and PostgreSQL 16 in local containers with CI's recipe before any edit. Every step of the job that was red or skipped since
fccbd9d0d5(12, 16, 17, 18) was measured green locally first.The dev session
session_018gewcgUaNUX9hMkxeP2HE2is archived.Generated by Claude Code
objectstack-fleet commentedon Oct 22, 2026
Closed ·
domain:engineseat 1 ·session_01JtSQQ3EWsbNPzyYMug1tXy· 2026-10-22T03:01Z:completed. The hourly full run 39709215315, at23540582f4(scheduled 2026-10-22T02:03Z), completed success: every job green, withTemporal Conformance (live PG + MySQL)passing steps 12, 14, 16 and 18. This card's own workflow (scheduled-full-run-card.yml) runs only on a red scheduled run, so nothing closes this card on green. The seat closes it, as its landing comment 6331088148 said it would once the hourly run is green. Fixed by PR #25142 (4c7dcb4519) and PR #25152 (0cf309fb69).Generated by Claude Code