Repository navigation
hourly full run: red on main (CI) #24645
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-19T23:28:42.698Z · run log · commit 7c509c286ff234d4dcbb69b63d8e74e5e03d7ec9 · 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: b12e16a561 (run 39307446721, the last green CI schedule run) .. 7c509c286f — compare
4ff18d3f0bfix(metadata-protocol): a batch row answers a sandboxed hook's refusal in the hook's words (fix(metadata-protocol): a batch row answers a sandboxed hook's refusal in the hook's words #24631)af1b3f822cdocs(qa): 18.0 sweep anchor round 2 — expression-editors' RLS clauses to the engine's error tier, a consumed-changeset citation, and §3 accuracy corrections in five areas (docs(qa): 18.0 sweep anchor round 2 — expression-editors' RLS clauses to the engine's error tier, a consumed-changeset citation, and §3 accuracy corrections in five areas #24632)b61353ffa0fix(plugin-approvals): an approval's status write-back runs its automation as the person who acted, in the record's organisation (fix(plugin-approvals): an approval's status write-back runs its automation as the person who acted, in the record's organisation #24634)9a7838edf5perf(core): read the Default Organization once per engine, not on every authenticated request (perf(core): read the Default Organization once per engine, not on every authenticated request #24627)1e8b6284c0fix(spec,metadata-protocol)!: the /meta door no longer authors sharing rules; Setup lists declared sharing rules (fix(spec,metadata-protocol)!: the /meta door no longer authors sharing rules; Setup lists declared sharing rules #24599)35450f0732feat(spec/ui): export navItemVisibleDataNeedsDataSource, so a mirror of NavigationItemSchema attaches it by identifier (feat(spec/ui): export navItemVisibleDataNeedsDataSource, so a mirror of NavigationItemSchema attaches it by identifier #24628)14ccb1da98fix(service-automation): a runAs:'user' flow carries its user's email, so an email-keyed row policy admits the run as it admits the user's own request (fix(service-automation): a runAs:'user' flow carries its user's email, so an email-keyed row policy admits the run as it admits the user's own request #24636)787939130cfix(objectql): bucket a declared Field.date by its calendar day under every timezone (analytics: the in-memory date bucket shifts a timezone-naiveField.dateone day EARLIER under any negative-offsettimezone(America/New_York → 2026-10-01 buckets as 2026-09-30), so it disagrees with the SQL pushdown path #24618) (fix(objectql): bucket a declared Field.date by its calendar day under every timezone (#24618) #24642)7c7741dcb4fix(service-storage,plugin-audit): the attachment and comment parent gates give the answer a by-id update of the parent gets (fix(service-storage,plugin-audit): the attachment and comment parent gates give the answer a by-id update of the parent gets #24641)4840720d4eperf(formula): reuse one CEL environment per entry point instead of building the stdlib on every compile and evaluate (perf(formula): reuse one CEL environment per entry point instead of building the stdlib on every compile and evaluate #24629)f89d29e382fix(cli): the organization-ownership drop refusal says what 18.0 supports for a v17 database (fix(cli): the organization-ownership drop refusal says what 18.0 supports for a v17 database #24635)29527f2561fix(service-storage): the upload commit door refuses a file whose bytes the storage backend does not hold (fix(service-storage): the upload commit door refuses a file whose bytes the storage backend does not hold #24643)cc95f5e63edocs(qa): 18.0 sweep anchor round 3 — the approvals token door after the reminder link removal, a consumed-changeset citation, and §3 accuracy corrections in six areas (docs(qa): 18.0 sweep anchor round 3 — the approvals token door after the reminder link removal, a consumed-changeset citation, and §3 accuracy corrections in six areas #24649)31e0735b3bfix(service-automation): try_catch Error Variable help describes the caught error in words (fix(service-automation): try_catch Error Variable help describes the caught error in words #24655)bfc1539fe0fix(plugin-approvals): the status mirror writes only a value the field declares (fix(plugin-approvals): the status mirror writes only a value the field declares #24656)191e0430effeat(plugin-webhooks,runtime)!: declared webhooks are read from the registry, the seeder retires, and the activation ledger switches them (18.x step 1, 8b-0g′) (feat(plugin-webhooks,runtime)!: declared webhooks are read from the registry, the seeder retires, and the activation ledger switches them (18.x step 1, 8b-0g′) #24588)7c509c286fchore(console): move the objectui pin 4016370af3c9 → 12dc7b47c340, regime C for sharing rules (objectui#13050) (chore(console): move the objectui pin 4016370af3c9 → 12dc7b47c340, regime C for sharing rules (objectui#13050) #24660)
Filed by.github/workflows/scheduled-full-run-card.yml. Generated by Claude Code
Activity
objectstack-fleet commentedon Oct 19, 2026
Triage: p1 (kept) ·
bug· lanedomain:devx→domain:cli·area:devpath·pm:queue· triage seat ·session_01AavokzJ5DndAwitDXvKy4U· 2026-10-19T21:01ZTriage seat (objectstack-wide, seat post #6015). ⛔ Not a claim, ⛔ not a dispatch.
What is red. Run 39315781843, job "Dogfood Regression Gate (3/3)",
packages/qa/dogfood/test/expression-conformance.test.ts. Two tests fail::426(checkLedger): 9 UNCLASSIFIED surfaces, all inui/app.zod.ts. They areNavigationContributionSchema.history/.items,AppBrandingSchema.history,NavigationAreaSchema.history/.navigation,AppContextSelectorSchema.history, andAppSchema.history/.navigation/.apis.:518(key collision):AppContextSelectorSchema.historyhas three positions, at:1466,:1494and:1522.Cause: a false red on correct source. The trigger is
35450f0732(#24628), the only commit in the range that touchesui/app.zod.ts. It adds a module-private helper. Atui/app.zod.ts:1027onorigin/main7c7741dcb4, the helper's body isconst parsed = EvaluatedExpressionInputSchema.safeParse(source);.The scan's
LOCAL_BINDING(expression-conformance.test.ts:154) matches aconstat any indentation, so it registersparsedas an alias of a roster schema. From then on, every later line in the file containing the wordparsedcounts as a hit. These are the describe lines that say "…still parsed, so…"::1185,:1213,:1357,:1466,:1494,:1522and:1709. They account for 5 of the 9 keys and for the whole collision. I expect the other four keys to come from aliases chained off the same registration, because the helper's own top-level name is registered by the multi-line branch. The dev confirms this by running the scan. None of the nine is an expression surface.Shape (lane's call, the triage lean):
.parse(/.safeParse(/…Async() is a value, not a schema, so it registers no alias. Pin it with a control onSCAN_CONTROLSthat holds this exact spelling.Lane. The fix is in
packages/qa, which isdomain:cliby the lane table (SKILL.md:166), so the lane moves off the generator'sdomain:devx. It enterspm:queuethrough the tooling gate's "false red on correct source" (triage-duties.md:37), named instance above.Why the PR was green. On PR #24628's head (
e058ce508e), the dogfood matrix shards were skipped, and the aggregate "Dogfood Regression Gate" passed. The scan readspackages/spec/srcas text, so no package edge marks dogfood affected by a spec-only change. The hourly run is the backstop that caught it. This is noted for the lane, and ⛔ it is not a separate card.Release. The release gate reads CI at the version commit, so 18.0 GA (#24524) cannot clear while this is red.
Generated by Claude Code
objectstack-fleet commentedon Oct 19, 2026
Claim: PM loop round 6 ·
domain:cliseat 1 · p1 (the hourly full run is red onmain; triage notes it holds 18.0 GA's release gate) · 2026-10-19T22:23ZSession:
session_01SYEJqDL3NXxrJRBVqaMu9TAccount:
zhuangjianguo(the seat's linked user asGET /useranswers it; always the card's assignee)Branch:
claude/issue-24645-expression-scan-value-bindingWorktree:
objectstack-issue-24645Domain:
domain:cliSeat:
domain:cli#1(seat post #6024)File surface (read on
origin/mainbfc1539fe; stop on a breach and explain it in the report):packages/qa/dogfood/test/expression-conformance.test.ts: the scan's alias registration.LOCAL_BINDING(:154) registers anyconstat any indentation as an alias of a roster schema. It should not register a binding whose initializer calls a parse method on a roster member (.parse(/.safeParse(/…Async(), because that is a value, not a schema. Also a control onSCAN_CONTROLSthat holds the exact spelling atpackages/spec/src/ui/app.zod.ts(about:1027,const parsed = EvaluatedExpressionInputSchema.safeParse(source);), as triage6277240093leans.packages/spec/**(the spec local is correct source; renaming it only hides the trap); no ledger rows for the nine UNCLASSIFIED keys; no other dogfood file.Container & model:
S,mode:subagent,model: default tier(no path-derived mandate)Clause-②: no
Basis for the Clause-② line: a test file's scan only. Nothing ships.
Responsibility: this lane's own test produces the false red (
packages/qa). No platform path covers it. It reaches every hourly full run onmainsince35450f0732(feat(spec/ui): export navItemVisibleDataNeedsDataSource, so a mirror of NavigationItemSchema attaches it by identifier #24628), and the release gate at the version commit.Thread-read: 6277240093
Serial constraints cleared:
expression-conformance.test.ts, and nopm:dispatchedclaim names it (read in this act).packages/qa/dogfood/test/files are other files in the same package.--out PLAN/--apply --plan-file PLAN, which 18.0 refuses on every database (#24637, domain:cli row) #24651 (packages/runtime/src/organization-ownership-boot-guard.ts) and runtime: two hand-built 400 refusals put off-catalog codes ondetails.fields[].code(unrecognized_keys,invalid_string), which ADR-0114's closedFieldErrorCodecatalog forbids #24597 (packages/runtime/src/domains/automation.ts,permission-set-clone.ts), and rest: every GET /api/v1/data/OBJECT still runs a full zod safeParse of the object's definition (the API-exposure gate's by-name read is decorated with diagnostics) — 11.8% of a HotCRM read's CPU #24535 (PR perf(rest): GET /data/OBJECT no longer computes metadata diagnostics; the exposure gate reads getMetaItemForExecution #24666, awaiting CI) are disjoint.Generated by Claude Code
objectstack-fleet commentedon Oct 19, 2026
os-dev-report
{ "issue": 24645, "status": "done", "branch": "claude/issue-24645-expression-scan-value-binding", "pr": "https://github.com/objectstack-ai/objectstack/pull/24680", "session": "session_01SYEJqDL3NXxrJRBVqaMu9T — subagent run, so this is the parent seat's id (the commits' Claude-Session trailer carries the same)", "premise_still_valid": true, "summary": "Triage's diagnosis holds, as measured by running the real scan code over packages/spec/src. At ui/app.zod.ts:1027, LOCAL_BINDING registered `parsed` (from `const parsed = EvaluatedExpressionInputSchema.safeParse(source)`) as an alias. The multi-line branch then chained authoredVisibleEnvelope (1028), navItemVisibleDataNeedsDataSource (1082) and NavigationItemSchema (1145) onto the alias table. That gave 11 false positions under 9 keys, among them the 3-position AppContextSelectorSchema.history collision. Fix: scanSource blanks every roster or alias name that is the receiver of a .parse( / .safeParse( / .parseAsync( / .safeParseAsync( call, once per line, before the hit test. So one rule covers the LOCAL_BINDING branch, the multi-line branch and field attribution. scanFile is now a wrapper over scanSource(text, file). SCAN_CONTROLS gains 4 spelling controls, checked by a new test: the exact authoredVisibleEnvelope spelling and its local-free return-expression variant register nothing; the real single-line ActionConditionInputSchema alias and the real multi-line actionCondition alias still register. Measured base vs head over the whole spec: the alias table goes 7 to 3 (only the 4 false aliases leave); declarations go 66 to 55 (only the 11 ui/app.zod.ts positions leave, 0 are added); head/inline/manual counts are unchanged; unattributed stays 0. The ledger diff is empty, and packages/spec is untouched. Notes: the dispatch named `@objectstack/qa`, but no such package exists. packages/qa has no package.json, and the touched package is @objectstack/dogfood (private: true, no files[]), which is the basis for skip-changeset. The PR body's note on why the PR was green corrects triage's mechanism. The dogfood shards are excluded from pull_request and merge_group runs by ci.yml's TWO SPEEDS event if:. They are not skipped by affected-package detection. On e058ce508e the shards read skipped and the aggregate read success. So this PR's own CI will not run the changed test either; the first CI reading is main's push/hourly battery after merge.", "tests": "All runs are from packages/qa/dogfood under scripts/pm/os-verify-lock.sh, after `pnpm turbo run build --filter='@objectstack/dogfood^...' --concurrency=2` (66/66 tasks, VERDICT command-exit 0). REPRO at origin/main bfc1539fe (`pnpm exec vitest run --maxWorkers=2 test/expression-conformance.test.ts`): `Tests 2 failed | 5 passed (7)`. :426 failed with 9x `UNCLASSIFIED surface — add a ledger row (ADR-0060): ui/app.zod.ts:...` (NavigationContributionSchema.history/.items, AppBrandingSchema.history, NavigationAreaSchema.history/.navigation, AppContextSelectorSchema.history, AppSchema.history/.navigation/.apis). :518 failed with `ui/app.zod.ts:AppContextSelectorSchema.history: 3 declaring positions share ONE ratchet key ... ui/app.zod.ts:1466, ui/app.zod.ts:1494, ui/app.zod.ts:1522`. AFTER, at final head 2c5a411ba: `Tests 8 passed (8)` (verbose: all 8 tests listed passing, including the new `alias registration tells a schema from a value parsed by one`), VERDICT command-exit 0. `pnpm --filter @objectstack/dogfood typecheck` echoed `tsc --noEmit`; tsconfig include is test/**/*; exit 0. ABLATIONS, run after the fix was committed (deaebded2), each through `node scripts/ablation-replace.mjs` wrap mode on the single `const referencing = line.replace(parseCallsOf(...), ' ');` line. Each one proved the landing (anchor x1 to x0, blob 88aa5562c726 to new, marker grep -c = 1 inside the locked run) and the restore (`blob == HEAD (88aa5562c726) and git diff HEAD is empty`). (1) Pre-fix raw-line hit test: `Tests 3 failed | 5 passed (8)`. The new control is red with `registered [parsed, authoredVisibleEnvelope (multi-line)] where [] was expected`, and both original failures are back, identical (9 UNCLASSIFIED; the collision at 1466/1494/1522). (2) Screen limited to LOCAL_BINDING lines: `1 failed | 7 passed`. Only control 2 is red, with `registered [authoredVisibleEnvelope (multi-line)]`, so the multi-line control is the only guard on that branch. (3) Over-broad screen that blanks every binding: `2 failed | 6 passed`. Control 3 is red with `registered [] where [ActionConditionInputSchema] was expected`, plus `STALE covers ... ui/action.zod.ts:actionObject.visible`, while the alias floor (min 2) stays green. This is a dogfood test with no dist resolution of its subject (it reads packages/spec/src as text), so ablation-dist-preflight does not apply. The scan output against origin/main eadea5720's packages/spec/src (git archive) is identical to the base-tree output (3 aliases, 55 declarations, 0 unattributed), so main's webhook.zod.ts change does not move it.", "gates": "Local, at head 2c5a411ba, derived by `node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack` (stderr: tree objectstack-ai/objectstack at 2c5a411ba; 1 path; 143 changed lines): 55 commands. Each was run byte-for-byte with its exit code captured before any pipe. 53 exited 0 on the first pass. 2 exited 3 (PREREQUISITE NOT MET). check:dual-build-cjs-loads had no dist for 8 packages outside the dogfood closure. check:type-check-debt hit a queue-timeout on the shared lock for its own closure build. Both were re-run inside one locked hold after building those 8 closures (build exit 0): check:dual-build-cjs-loads exit 0; check:type-check-debt exit 0, `--re-measure: OK — 1 ledger entr(ies) re-measured ... none above its recorded number`. `--ran` reconciliation: `55 derived, 55 run, 0 NOT-MEASURED, 0 UNRUN` (EXIT=0). Declared-wide families, all exit 0: check:init-service-contract, live-db-isolation, meta-type-normalized, optional-error-sink, resume-authority-declared, route-envelope, runner-env-posture, settings-bind-window, startup-registry-verdict, verify-stand-in, wildcard-fallthrough. `pnpm lint` (eslint . --no-inline-config): exit 0, no findings. os-dev.md classes pnpm lint as CI-owned; it was run because the dispatch asked for it. check-platform-checklist --changed-from does not apply, because no exported symbol was renamed or removed. CI on PR #24680 at 2c5a411ba, snapshot at report time: completed = filter success, Check Changeset success, Check Documentation Links success, the claim/single-writer/Part-of/branch-claim checks success, and the Dogfood shards, Dogfood Verify CLI, Temporal Conformance and Console Pin Gate skipped by design (full battery only). in_progress = Lint (all lanes), Type Check (all lanes), Test Core 1-6/6, Build Core, Governed Surface Queue Guard, Dogfood Regression Gate aggregate, Spec property liveness. Deviation: origin/main (eadea5720, 7 commits past base) was not merged before opening. No conflict, and the only main-side input the changed test reads (packages/spec/src) was measured jointly instead, with an identical scan output.", "mcp_calls": "0 — no MCP GitHub tool was called", "api_writes": "2 — (1) one fleet-write relay stroke, POST /repos/objectstack-ai/objectstack/dispatches (request fw-20261019T231032Z-886404, run 39339899209, success). It executed pr_create: POST /repos/objectstack-ai/objectstack/pulls (draft, #24680), POST /repos/objectstack-ai/objectstack/issues/24680/assignees [zhuangjianguo], and POST /repos/objectstack-ai/objectstack/issues/24680/labels [skip-changeset]. The relay's read-back line named the body bytes (9328 sent = stored) and the assignees but not the label; the label was confirmed present by a REST read of issues/24680. (2) This os-dev-report comment, POST /repos/objectstack-ai/objectstack/issues/24645/comments, via scripts/pm/post-stamped.mjs. The git pushes (empty-branch probe plus 2 commits) are not REST writes.", "open_questions": [], "out_of_scope_findings": [ "carrier: 承接者:无 · noted, not filed (Acceptance notes of #24680): the parse-call screen is line-based, so a receiver split from its `.safeParse(` across two lines still registers an alias. That is the loud direction (UNCLASSIFIED), and no such spelling exists in packages/spec/src today. Zod's decode/encode method family is also outside the screen, with zero receivers in the spec today.", "carrier: 承接者:无 · noted, not filed (PR #24680 body, why-green note): triage 6277240093 attributes the PR-time skip to affected-package detection. The measured mechanism is ci.yml THE TWO SPEEDS: the dogfood job's `if:` excludes pull_request and merge_group, so no PR runs dogfood before merge. On e058ce508e the shard check-run is `Dogfood Regression Gate (${{ matrix.shard }}/3) | skipped` and the aggregate is `success`. This is by design (ruling record 6120820653), so it is no defect." ] }objectstack-fleet commentedon Oct 19, 2026
ACCEPT → PR #24680 comment
6279447833·domain:cliseat 1 · sessionsession_01SYEJqDL3NXxrJRBVqaMu9T· 2026-10-19T23:15Z · head2c5a411ba. Landing waits on that head's checks. The dogfood shards do not run onpull_requestormerge_group, somain's push run after the merge is the first CI reading of the fix.Generated by Claude Code
objectstack-fleet commentedon Oct 19, 2026
Landed: PR #24680 →
486745ec7·domain:cliseat 1 ·zhuangjianguo· sessionsession_01SYEJqDL3NXxrJRBVqaMu9T· 2026-10-19T23:47Zmerged: true, merge commit486745ec7, merged 2026-10-19T23:47Z through the merge queueorigin/main486745ec7is an ancestor oforigin/main, with a single parent (squash). 1 file, +138 / −7, matches what was reviewed at2c5a411bagh-readonly-queue/main/*pr-24680*head remains6278684496→ report (PR fix(dogfood): the expression scan registers no alias for a value parsed by a roster schema #24680) → ACCEPT6279447833→ ready and auto-merge.packages/qa/dogfood/test/expression-conformance.test.ts) registers no alias for a value bound from a parse call on a roster schema. The 9 falseUNCLASSIFIEDkeys and the 3-positionAppContextSelectorSchema.historycollision fromui/app.zod.ts:1027leave. 4 spelling controls pin both directions.pull_requestormerge_group, somain's next push or hourly CI run is the first CI reading of this fix. The seat reads it and records it here.completedon the merge.pm:dispatchedis removed in the stroke after this comment.Generated by Claude Code
objectstack-fleet commentedon Oct 19, 2026
First CI reading of the fix on
main·domain:cliseat 1 · sessionsession_01SYEJqDL3NXxrJRBVqaMu9T· 2026-10-19T23:57Zmain's push run39343692438on486745ec7ranDogfood Regression Gate (3/3), job118371797555:success. The shard holdstest/expression-conformance.test.ts, which passed all 8 tests, and the shard passed 92 files with 2 skipped. Onbfc1539fethe same shard failed this file (job118336465533). Shards 1/3 and 2/3 of this run werecancelled, superseded by a newer push, so the hourly run is the next whole-battery reading. The seat's owed item from the landing record is done.Generated by Claude Code