Skip to content

hourly full run: red on main (CI) #24645

Closed

Description

@github-actions

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

Activity

  1. objectstack-fleet commented on Oct 19, 2026

    @objectstack-fleet
    Contributor

    Triage: p1 (kept) · bug · lane domain:devx → domain:cli · area:devpath · pm:queue · triage seat · session_01AavokzJ5DndAwitDXvKy4U · 2026-10-19T21:01Z

    Triage 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 in ui/app.zod.ts. They are NavigationContributionSchema.history / .items, AppBrandingSchema.history, NavigationAreaSchema.history / .navigation, AppContextSelectorSchema.history, and AppSchema.history / .navigation / .apis.
    • :518 (key collision): AppContextSelectorSchema.history has three positions, at :1466, :1494 and :1522.

    Cause: a false red on correct source. The trigger is 35450f0732 (#24628), the only commit in the range that touches ui/app.zod.ts. It adds a module-private helper. At ui/app.zod.ts:1027 on origin/main 7c7741dcb4, the helper's body is const parsed = EvaluatedExpressionInputSchema.safeParse(source);.

    The scan's LOCAL_BINDING (expression-conformance.test.ts:154) matches a const at any indentation, so it registers parsed as an alias of a roster schema. From then on, every later line in the file containing the word parsed counts as a hit. These are the describe lines that say "…still parsed, so…": :1185, :1213, :1357, :1466, :1494, :1522 and :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):

    • Fix the scan, not the spec. A binding whose initializer calls a parse method on a roster member (.parse( / .safeParse( / …Async() is a value, not a schema, so it registers no alias. Pin it with a control on SCAN_CONTROLS that holds this exact spelling.
    • ⛔ Adding nine ledger rows would classify slots nobody declared.
    • Renaming the spec local only hides the trap for the next helper.

    Lane. The fix is in packages/qa, which is domain:cli by the lane table (SKILL.md:166), so the lane moves off the generator's domain:devx. It enters pm:queue through 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 reads packages/spec/src as 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

  2. objectstack-fleet commented on Oct 19, 2026

    @objectstack-fleet
    Contributor

    Claim: PM loop round 6 · domain:cli seat 1 · p1 (the hourly full run is red on main; triage notes it holds 18.0 GA's release gate) · 2026-10-19T22:23Z
    Session: session_01SYEJqDL3NXxrJRBVqaMu9T
    Account: zhuangjianguo (the seat's linked user as GET /user answers it; always the card's assignee)
    Branch: claude/issue-24645-expression-scan-value-binding
    Worktree: objectstack-issue-24645
    Domain: domain:cli
    Seat: domain:cli#1 (seat post #6024)
    File surface (read on origin/main bfc1539fe; stop on a breach and explain it in the report):


    Generated by Claude Code

  3. objectstack-fleet commented on Oct 19, 2026

    @objectstack-fleet
    Contributor

    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."
      ]
    }
  4. objectstack-fleet commented on Oct 19, 2026

    @objectstack-fleet
    Contributor

    ACCEPT → PR #24680 comment 6279447833 · domain:cli seat 1 · session session_01SYEJqDL3NXxrJRBVqaMu9T · 2026-10-19T23:15Z · head 2c5a411ba. Landing waits on that head's checks. The dogfood shards do not run on pull_request or merge_group, so main's push run after the merge is the first CI reading of the fix.


    Generated by Claude Code

  5. objectstack-fleet commented on Oct 19, 2026

    @objectstack-fleet
    Contributor

    Landed: PR #24680 → 486745ec7 · domain:cli seat 1 · zhuangjianguo · session session_01SYEJqDL3NXxrJRBVqaMu9T · 2026-10-19T23:47Z

    Reading Result
    PR #24680 object merged: true, merge commit 486745ec7, merged 2026-10-19T23:47Z through the merge queue
    origin/main 486745ec7 is an ancestor of origin/main, with a single parent (squash). 1 file, +138 / −7, matches what was reviewed at 2c5a411ba
    queue branch no gh-readonly-queue/main/*pr-24680* head remains
    • Review chain: claim 6278684496 → report (PR fix(dogfood): the expression scan registers no alias for a value parsed by a roster schema #24680) → ACCEPT 6279447833 → ready and auto-merge.
    • What landed: the expression-conformance scan (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 false UNCLASSIFIED keys and the 3-position AppContextSelectorSchema.history collision from ui/app.zod.ts:1027 leave. 4 spelling controls pin both directions.
    • Still owed by the seat: the dogfood shards do not run on pull_request or merge_group, so main's next push or hourly CI run is the first CI reading of this fix. The seat reads it and records it here.
    • State: the card closed completed on the merge. pm:dispatched is removed in the stroke after this comment.

    Generated by Claude Code

  6. objectstack-fleet commented on Oct 19, 2026

    @objectstack-fleet
    Contributor

    First CI reading of the fix on main · domain:cli seat 1 · session session_01SYEJqDL3NXxrJRBVqaMu9T · 2026-10-19T23:57Z

    main's push run 39343692438 on 486745ec7 ran Dogfood Regression Gate (3/3), job 118371797555: success. The shard holds test/expression-conformance.test.ts, which passed all 8 tests, and the shard passed 92 files with 2 skipped. On bfc1539fe the same shard failed this file (job 118336465533). Shards 1/3 and 2/3 of this run were cancelled, 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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

area:devpathThe road — create, dev, verify, publish/install, connect an agent, iteratebugSomething isn't workingdomain:clipriority:p1High: required for production / M2

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions