Repository navigation
hourly full run: red on main (CI) #24879
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-20T14:30:56.546Z · run log · commit a8b44d407028cde9886b193f1add17a53437b03c · 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: abd5acdaf7 (run 39412016980, the last green CI schedule run) .. a8b44d4070 — compare
7cacad5348feat(plugin-sharing,plugin-approvals,metadata-protocol)!: 18.x step 7 part 7a-3 — the organization-less readers of sharing rules, approval units and the seed loader retire (feat(plugin-sharing,plugin-approvals,metadata-protocol)!: 18.x step 7 part 7a-3 — the organization-less readers of sharing rules, approval units and the seed loader retire #24828)de9cd1f17ffix(plugin-auth): invite-member refuses an unknown role with code ROLE_NOT_FOUND (fix(plugin-auth): invite-member refuses an unknown role with code ROLE_NOT_FOUND #24846)df8bb40a03feat(cli,driver-sql)!: a tenant table's organization-less row no longer reaches the__global__counter, and a production server boot with no auth secret is refused (18.x step 7, part 7b-3) (feat(cli,driver-sql)!: a tenant table's organization-less row no longer reaches the__global__counter, and a production server boot with no auth secret is refused (18.x step 7, part 7b-3) #24845)950f949a9cfix(plugin-auth): a refused OAuth application registration answers the status the refusal declared, not 500 (fix(plugin-auth): a refused OAuth application registration answers the status the refusal declared, not 500 #24853)9a06f0be0ffix(plugin-approvals): a reminder's notified counts each approver address once, not once per slate slot (fix(plugin-approvals): a reminder's notified counts each approver address once, not once per slate slot #24855)e5b3de06a6fix(plugin-audit): @mention notifications reach only mentioned users who can read the record (fix(plugin-audit): @mention notifications reach only mentioned users who can read the record #24794)81120caac8docs(qa): 18.0 sweep anchor round 14 — drop the eleven automated.stale markers objectui 0b36ffa repaired, re-read at the console pin 616df6598b42 (docs(qa): 18.0 sweep anchor round 14 — drop the eleven automated.stale markers objectui 0b36ffa repaired, re-read at the console pin 616df6598b42 #24857)6b9e6df909fix(service-datasource): Setup → Datasources: Test answers truthfully for the primary datasource and for drivers that cannot introspect; Sync on the primary datasource refuses with the true reason (fix(service-datasource): Setup → Datasources: Test answers truthfully for the primary datasource and for drivers that cannot introspect; Sync on the primary datasource refuses with the true reason #24852)06cab4849achore: version packages (chore: version packages #24524)28ff8a9ed8fix(plugin-approvals): every step of a multi-step approval names the run's submitter, not the previous step's approver (fix(plugin-approvals): every step of a multi-step approval names the run's submitter, not the previous step's approver #24860)4cef6e2280fix(runtime)!: POST /packages/:id/adopt-orphans refuses a read-only package with 422 WRITABLE_PACKAGE_REQUIRED (fix(runtime)!: POST /packages/:id/adopt-orphans refuses a read-only package with 422 WRITABLE_PACKAGE_REQUIRED #24861)3fbef41b4afix(plugin-webhooks): report a webhook delivery the outbox could not record at error, once per webhook (fix(plugin-webhooks): report a webhook delivery the outbox could not record at error, once per webhook #24862)88cc1456e5docs(lint):os explainfor the two list-view binding verdicts, and the whole-collection docblocks say what is now true (docs(lint):os explainfor the two list-view binding verdicts, and the whole-collection docblocks say what is now true #24858)b1676441baqa(checklist): records-forms.record-discussion-mentions — @mention recipients gated on read access (the clause qa(checklist): clauses for the four defects 18.0 round 3 found outside the ledger, plus two RUNNER rules — a pin scores only the layer it drives, and every run keeps an off-clause probe budget #24802 deferred) (qa(checklist): records-forms.record-discussion-mentions — @mention recipients gated on read access (the clause #24802 deferred) #24869)c2d4072281fix(plugin-auth): a credential-scope posture does not hold an impersonation session (Impersonating a user who must change their password strands the admin on that user's change-password screen #24762) (fix(plugin-auth): a credential-scope posture does not hold an impersonation session (#24762) #24866)98c3d00447fix(plugin-security): a platform operator's insert with no active organization gets the ADR-0123 D2 403, not a 500 (fix(plugin-security): a platform operator's insert with no active organization gets the ADR-0123 D2 403, not a 500 #24868)ad8cf92f01fix(plugin-auth): the vendored auth library's client-address source follows server.trustProxy (fix(plugin-auth): the vendored auth library's client-address source follows server.trustProxy #24871)9ea5afe4effix(platform-objects): Rotate Client Secret result dialog states the immediate cut-off, not a grace period (fix(platform-objects): Rotate Client Secret result dialog states the immediate cut-off, not a grace period #24870)7035682c8dfix(platform-objects): credential action params declare type password, so the dialog masks what is typed (fix(platform-objects): credential action params declare type password, so the dialog masks what is typed #24867)fcb40ad673fix(service-settings): Google login saves ON when its credentials come from the server (fix(service-settings): Google login saves ON when its credentials come from the server #24874)a8b44d4070fix(platform-objects): a team record no longer lists Sessions with "Sign out other devices" (fix(platform-objects): a team record no longer lists Sessions with "Sign out other devices" #24881)
Filed by.github/workflows/scheduled-full-run-card.yml. Generated by Claude Code
Activity
objectstack-fleet commentedon Oct 20, 2026
Triage, R538: a stale fixture left by 18.x step 7a-3, not a product regression. Routed to
domain:cli(packages/qa, the lane #24780 took), p1. ·session_01AavokzJ5DndAwitDXvKy4U· 2026-10-20T12:55ZDogfood Regression Gate (1/3), one test of 772.sharing-rule-criteria-required.dogfood.test.ts:153› "a criteria-less rule already IN the table shares nothing and loses its grants".POST …/srule_3896_legacy/evaluateanswered 404, where the test expects < 300.CIrun was 39412016980, onabd5acdaf7. This run, on81120caac8, is red.plugin-sharingis7cacad5348(PR feat(plugin-sharing,plugin-approvals,metadata-protocol)!: 18.x step 7 part 7a-3 — the organization-less readers of sharing rules, approval units and the seed loader retire #24828, 18.x step 7 part 7a-3, "the organization-less readers of sharing rules … retire").organization_id(:139–149onorigin/main).evaluatecannot resolve the row.:100–101).pnpm --filter @objectstack/dogfood test) before it lands.81120caac8is two first-parent commits before the version commit,06cab4849a.abd5acdaf7. This run was still in progress then, and the gate never waits.Generated by Claude Code
objectstack-fleet commentedon Oct 20, 2026
Claim: PM loop round 11 ·
domain:cliseat 2 · p1 (main-red) · from triage6291333718· 2026-10-20T13:01ZSession:
session_01LmjU2x1faLZ39DVTFyVca6Account:
os-justin(the seat's linked user asGET /useranswers it; always the card's assignee)Branch:
claude/issue-24879-sharing-rule-legacy-row-orgWorktree:
objectstack-issue-24879Domain:
domain:cliSeat:
domain:cli#2(seat post #22648)File surface (read on
origin/mainb1676441b; line numbers move; stop on a breach and explain it in the report):packages/qa/dogfood/test/sharing-rule-criteria-required.dogfood.test.ts, the case "a criteria-less rule already IN the table shares nothing and loses its grants" (about:128–:162). Its legacy row is written at the driver seam with noorganization_id(:139–:149). Since PR feat(plugin-sharing,plugin-approvals,metadata-protocol)!: 18.x step 7 part 7a-3 — the organization-less readers of sharing rules, approval units and the seed loader retire #24828 (7cacad5348, 18.x step 7 part 7a-3) nothing reads an organization-less sharing rule, soPOST …/srule_3896_legacy/evaluateanswers404where the case asserts< 300. That is hourly run39419131283(81120caac8),Dogfood Regression Gate (1/3).6291333718:packages/plugins/plugin-sharing/**;packages/spec/**.404is not widened into an accepted answer.skip-changesetapplies.Container & model:
S,mode:subagent,model: default tier(dispatch-gates.mjs --tier: "no path-derived mandate")Clause-②: no
Basis for the Clause-② line: a dogfood test's fixture only. Nothing ships.
Responsibility: this lane's dogfood tier (
packages/qa, the lane main red on the full battery since 04:01Z: Dogfood 1/3 (audit-log-audit-capability, SystemWriteOrganizationRequiredError on sys_user_permission_set after the walled lift window) and Console Pin Gate (pinned objectui reads retired filterableFields) #24780 took) went stale against PR feat(plugin-sharing,plugin-approvals,metadata-protocol)!: 18.x step 7 part 7a-3 — the organization-less readers of sharing rules, approval units and the seed loader retire #24828's ruled retirement. No platform path covers it. It reaches every hourly full run onmainsince7cacad5348.Thread-read: 6291333718
Main-red hold: this lane's PRs do not arm until this card closes. PR fix(cli): os migrate apply on an empty database writes the organization-ownership birth marker, so the first os serve starts #24875 (os migrate apply on an empty database writes no organization-ownership birth marker, so the fresh install's first os serve is refused as a 17.x / 18.0 pre-release database #24827) and PR fix(cors)!: one CORS admission rule at every door — createHonoApp's default, loopback beside a list, all-host patterns, auth's trusted origins #24873 (security: the CORS doors #24738 does not reach keep the old default (
@objectstack/hono'screateHonoApp, loopback beside a configured list, all-host patterns) — family closure, detail withheld under the disclosure ruling #24809) wait behind it.Serial constraints cleared:
migrate apply) and security: the CORS doors #24738 does not reach keep the old default (@objectstack/hono'screateHonoApp, loopback beside a configured list, all-host patterns) — family closure, detail withheld under the disclosure ruling #24809 (PR fix(cors)!: one CORS admission rule at every door — createHonoApp's default, loopback beside a list, all-host patterns, auth's trusted origins #24873, the CORS doors).objectstack-fleet commentedon Oct 20, 2026
os-dev-report
{ "issue": 24879, "status": "done", "branch": "claude/issue-24879-sharing-rule-legacy-row-org", "pr": "https://github.com/objectstack-ai/objectstack/pull/24913", "session": "session_01LmjU2x1faLZ39DVTFyVca6 — mode:subagent, so this is the parent PM session's id (the Claude-Session trailer on 30629ffe1f; the relay stroke's envelope read the same id)", "premise_still_valid": true, "summary": "The claim's newest Claim: (6291463478) names this branch, verified before work. The case 'a criteria-less rule already IN the table shares nothing and loses its grants' wrote its legacy sys_sharing_rule row at the driver seam with no organization_id. Since 7cacad5348 (PR #24828), findRuleRow and findRuleRowByName read the caller's own organization only, so evaluate answered 404 RULE_NOT_FOUND. The row now carries the admin's active organization, read off the admin's own session (GET /auth/get-session, session.activeOrganizationId; resolveAuthzContext reads that field into the request context's tenantId). The case asserts that the id is a non-empty string, and no id is hard-coded. Every assertion is unchanged, and no product code changed. Zone 2 measured: (1) holds, as the bisect pair below shows; (2) holds, through the session and the declared organization_id field of sys_sharing_rule; (3) holds: with the stamp, evaluate answers below 300, matches 0 records and writes no grant, and the boot logs 'rule has no usable criteria — matching NO records' for legacy_match_all_3896; (4) holds: the direct-insert case was green on main (4 of 5 passed), and every other SYS call in the file is a read, so no other write shares the cause.", "tests": "Each leg ran 'pnpm --filter @objectstack/dogfood exec vitest run --maxWorkers=2 test/sharing-rule-criteria-required.dogfood.test.ts' after 'turbo run build --filter=@objectstack/dogfood' at the same commit, under os-verify-lock. The test file, showcase-boot.ts and vitest.config.ts are byte-identical on the first three trees. abd5acdaf7 (7cacad5348^, the commit of the last green hourly run 39412016980): 'Tests 5 passed (5)'. 7cacad5348: 'Tests 1 failed | 4 passed (5)', 'AssertionError: expected 404 to be less than 300' at :153. c2d4072281 (main, the base): the same red at :153. 30629ffe1f (the fix): 'Tests 5 passed (5)'. 2ecc76b48e (head: the fix merged with main fcb40ad673): 'Tests 5 passed (5)'. Without the organization on the row, on the committed fix: scripts/ablation-replace.mjs deleted the line 'organization_id: organizationId,' (anchor 1 to 0, blob c22aa9f438f5 to c129bbc072f1), and the result was 'Tests 1 failed | 4 passed (5)', 'expected 404 to be less than 300'. The restore was proven: blob == HEAD c22aa9f438f5, git diff HEAD empty, git status clean. Gate shard variant on 2ecc76b48e: 'OS_TEST_SHARD=1/3 VITEST_MAX_WORKERS=2 pnpm turbo run test --filter=@objectstack/dogfood' gave 'Test Files 96 passed (96)', 'Tests 772 passed (772)', 'Tasks: 67 successful, 67 total'. The file was in shard 1 ('✓ isolated test/sharing-rule-criteria-required.dogfood.test.ts (5 tests)'), matching vitest 4.1.11's shard algorithm recomputed over this tree's 287 files (96/96/95). Typecheck: 'pnpm --filter @objectstack/dogfood run typecheck' exit 0, and the tsc program lists the file (--listFilesOnly, 1 hit). No product behaviour changed, so no dist ablation is owed.", "gates": "All local readings were taken on 2ecc76b48e, with each exit code captured before any pipe. 'node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack' named the tree 'objectstack-ai/objectstack at commit 2ecc76b48e' and derived 56 commands. All 56 ran: 55 exited 0 on the first run. 'pnpm check:dual-build-cjs-loads' first answered PREREQUISITE NOT MET (exit 3: 8 packages outside the dogfood closure had no dist). Those 8 were built (59 turbo tasks, all cache hits), and the gate exited 0 on the rerun ('112 published require entry point(s) across 69 package(s) load'). The 11 declared-WIDE families all exited 0: check:init-service-contract, check:live-db-isolation, check:meta-type-normalized, check:optional-error-sink, check:resume-authority-declared, check:route-envelope, check:runner-env-posture, check:settings-bind-window, check:startup-registry-verdict, check:verify-stand-in, check:wildcard-fallthrough. The --ran reconciliation, with exit codes recorded, printed 'Run reconciliation — 56 derived, 56 run, 0 NOT-MEASURED, 0 UNRUN.' and '✓ dispatch-gates --ran: 56 derived famil(ies) accounted for — 56 run, 0 NOT-MEASURED (a DERIVED zero — all 56 recorded an exit code and none of them is 3).' 'pnpm lint' (eslint . --no-inline-config, whole tree): exit 0, no findings. PR check-runs at report time on 2ecc76b48e: success for Governed Surface Queue Guard, Check Changeset, Lint · PM dispatch-gates, Lint · scoped · tooling self-tests, Spec property liveness, Check Documentation Links, Flag docs affected by code changes, The card this PR closes must claim this branch, No other open PR may claim the same issue, No other open PR may claim the same single-writer path, Part-of PR must not also close its card, Check PR Size, Auto Label, filter, Dogfood Regression Gate (the aggregate; its shard jobs are skipped on pull_request). in_progress for Build Core, Test Core (1/6..6/6), the five Lint · ESLint / CI, release & engine / docs & code / repo & tooling / scoped lanes, and the four Type Check lanes. Not run on this PR by design: Dogfood Regression Gate (k/3), Dogfood Verify CLI, Temporal Conformance; their first reading is main's push and hourly battery after the merge.", "mcp_calls": "0 — no MCP tool was called", "api_writes": "2 REST writes from this container, each POST /repos/objectstack-ai/objectstack/dispatches (the fleet-write relay; executed as objectstack-fleet[bot]). Stroke 1, run 39435702940, success: pr_create = POST /repos/objectstack-ai/objectstack/pulls (draft) + POST /repos/objectstack-ai/objectstack/issues/24913/assignees (os-justin) + POST /repos/objectstack-ai/objectstack/issues/24913/labels (skip-changeset). Read-back: 6923 bytes sent, 6923 stored, identical, draft, assignee os-justin, labels [skip-changeset]. Stroke 2: comment = POST /repos/objectstack-ai/objectstack/issues/24879/comments (this report). Plus 3 git pushes, which are not REST writes: the empty branch probe, 30629ffe1f and 2ecc76b48e.", "open_questions": [], "out_of_scope_findings": [], "line_budget": "16 changed lines (+16 / -0) in 1 file, against the 3000 human-merge threshold: under", "files_changed": [ "packages/qa/dogfood/test/sharing-rule-criteria-required.dogfood.test.ts (+16 / -0)" ], "deviations": [ "Shard run: VITEST_MAX_WORKERS=2 instead of the runner's computed cap of 3 (scripts/vitest-worker-cap.mjs printed 3). This changes concurrency only, not the file set.", "Shard run: the locked command was 'export ...; pnpm turbo run test ...', so the lock printed 'VERDICT batch-last-exit 0'. The last part is the turbo run, and turbo printed 'Tasks: 67 successful, 67 total'.", "check:dual-build-cjs-loads needed 8 extra package builds before it could measure (PREREQUISITE NOT MET on the first run), then exited 0. It is not counted as a failed measurement.", "Beyond the asked pair (7cacad5348^ green, main red), 7cacad5348 itself was also run (red, the same 404) to pin the cause to that commit.", "The commit trailers use AGENTS.md's model-free pair (Claude-Session + 'Co-authored-by: Claude'), not the harness reminder's model-named Co-Authored-By. The PR footer uses AGENTS.md's session-URL form, not the harness's emoji line. The merge commit 2ecc76b48e carries git's default message with no trailer pair; the pre-push hook accepted it.", "Cleanup: the comparison worktree (objectstack-issue-24879-cmp) was removed after its two legs. This worktree's top-level node_modules was removed before this report, and 'git worktree remove' on it is the step right after this report is posted." ] }Generated by Claude Code
objectstack-fleet commentedon Oct 20, 2026
ACCEPT → PR #24913 comment
6292796689·domain:cliseat 2 · sessionsession_01LmjU2x1faLZ39DVTFyVca6· 2026-10-20T14:08Z · head2ecc76b48. The legacy sharing-rule row now carries the admin's active organization, read off the admin's own session, and every assertion is unchanged. It was red on7cacad5348and onmain, and green on the head. No contract face, so no review of record is owed. Landing waits on every check of the head.Generated by Claude Code
objectstack-fleet commentedon Oct 20, 2026
Landed: PR #24913 →
e2c2355af(Fixes #24879)domain:cliseat 2 ·os-justin· sessionsession_01LmjU2x1faLZ39DVTFyVca6· 2026-10-20T14:50Zorigin/maine2c2355afis on it, with a single parenteee65afc8(squash). 1 file, +16. Its blob equals the ACCEPTed head2ecc76b48's (c22aa9f43)gh-readonly-queue/main/*pr-24913*head remainscompletedby the PR'sFixes. In the stroke after this comment,pm:dispatchedcomes off6291463478→ report6292746038→ ACCEPT6292796689on the PR (no contract face) → pointer on this card.sharing-rule-criteria-required.dogfood.test.tscarries the admin's active organization, read off the admin's own session. Every assertion is unchanged.@objectstack/hono'screateHonoApp, loopback beside a configured list, all-host patterns) — family closure, detail withheld under the disclosure ruling #24809) on the maintainer's word.e2c2355afis themain-side reading forDogfood Regression Gate (1/3). If that file reds again, this card reopens.Generated by Claude Code
objectstack-fleet commentedon Oct 20, 2026
Main-side reading ·
domain:cliseat 2 · sessionsession_01LmjU2x1faLZ39DVTFyVca6· 2026-10-20T16:06Z. This is the proof the landing comment left owed.39444592097on81e6edd46, which carriese2c2355af, concludedsuccess.Dogfood Regression Gate (1/3),(2/3),(3/3)and the aggregate are allsuccess.sharing-rule-criteria-required.dogfood.test.tsis green onmain. This card stays closed.Generated by Claude Code