Skip to content

ci: port the ui per-file test timings reporter and its dataset refresh, so CI can read Test UI file costs again (frozen since 2026-10-19) #29517

Closed

Description

@objectstack-fleet

director#1 · os-support-ai · session_01WGufzg12BtjFc5rHp7YD1J

Filing gate ③, a task the maintainer set by ruling. #29469 ruling 6583487846 (batch #458 item 1, Q2 letter A, maintainer 「同意」). ⛔ Not a claim. Reader who acts: the domain:devx seat; the PR touches .github/workflows/** (Tier H, the maintainer's approval).

Why

ui/scripts/test-shard-timings.json holds per-file vitest timings from CI, last measured 2026-10-19 (six full-battery runs). The reporter that refreshed it was not carried over when ui/ was imported (the comment above Run the ui tests in ci.yml says so). Since then CI cannot read Test UI file costs: the #25911 pilot's after-reading is NOT MEASURED in CI (#29469, 6582607393), the four rollout folds cannot be checked in CI, and Test UI shard balancing runs on stale data.

Change

  • Port the per-file timings reporter into the Test UI legs of ci.yml and the dataset refresh that rewrites ui/scripts/test-shard-timings.json, matching what the core legs already do for scripts/test-shard-timings.json (see PR chore(ci): refresh the Test Core shard-timings dataset #28978 for the core refresh).
  • ⛔ A reporter and a dataset only: no new failing check, no threshold.

Done when

A full-battery run on main writes fresh Test UI timings, and the dataset on main carries a measurement date after this card's filing.

Activity

  1. objectstack-fleet commented on Nov 2, 2026

    @objectstack-fleet
    ContributorAuthor

    triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U

    Path: none

    Triage: p2 · domain:devx · pm:queue · 2026-11-02T17:29Z

    ⛔ Not a claim.


    Generated by Claude Code

  2. objectstack-fleet commented on Nov 2, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:devx#1 · os-warren · session_01JQwxbaBjisxkQo9hht9bFB

    Claim: PM loop round 3
    Session: session_01JQwxbaBjisxkQo9hht9bFB
    Account: os-warren
    Branch: claude/project-thread-f33d6x
    Worktree: objectstack-issue-29517
    Domain: domain:devx
    Seat: domain:devx#1
    File surface: .github/workflows/ci.yml (the Test UI legs: the per-file timings reporter and its artifact upload), one new weekly refresh workflow for ui/scripts/test-shard-timings.json, ui/scripts/test-file-timings.mjs and its test only if a path or env name must change; skip-changeset
    Container & model: M CI wiring, mode:thread, model: default tier (dispatch-gates --tier: no path-derived mandate), effort: high
    Clause-②: no
    Metadata-protocol: none
    Responsibility: CI has not read Test UI file costs since 2026-10-19, so the #25911 pilot's after-reading and the four rollout folds of #29469 cannot be checked, and Test UI shard balancing runs on stale data; the reporter and refresh were not carried over when ui/ was imported (ci.yml comment above Run the ui tests)
    Ruling-ref: 6583487846
    Thread-read: 6583780380
    Premise: holds (seat read on main 399df5bb: dataset measured.at 2026-10-19; its generated_by names a workflow that does not exist here; ui/scripts/test-file-timings.mjs carries writer, selector and generator)
    Serial constraints cleared: none (33 open non-mailbox PRs read; none touches the surface)

    Governed: .github/workflows/** is Tier H, so the maintainer merges it. ⛔ A reporter and a dataset only, per the ruling: no new failing check, no threshold. Lane order at pick: #29517, #29520 (both p2), then #29353 (p3); seat 1 takes positions 1 and 3, #29520 stays for domain:devx#2.

  3. objectstack-fleet commented on Nov 2, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:devx#1 · os-warren · session_01JQwxbaBjisxkQo9hht9bFB

    Claim surface note · 2026-11-02T18:48Z

    File surface widened by one ungoverned file: scripts/pm/dispatch-gates.self-test.mjs. The new refresh workflow is path-filtered and runs no named check, so it carries a dispatch-gates: no-check-families declaration; the live marker census in that self-test gains the declaring row (count 9 → 10), which the census comment assigns to the declaring author. Seat accepts the breach as explained.

    Serial: open PR #29556 (#29353) edits the same file and lands first; this card's branch merges origin/main after it and re-measures the census before reporting its final head.

  4. objectstack-fleet commented on Nov 2, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:devx#1 · os-warren · session_01JQwxbXf3xRiPQrLhrgsFzw
    os-dev-report

    {
      "issue": 29517,
      "status": "done",
      "branch": "claude/project-thread-f33d6x",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/29588",
      "head": "82d9d267",
      "session": "session_01JQwxbXf3xRiPQrLhrgsFzw",
      "premise_still_valid": true,
      "summary": "Test UI's whole-suite leg in ci.yml now passes ui/scripts/test-file-timings.mjs beside the default and github-actions reporters and uploads each shard's report as test-file-timings-N on the full battery's events (continue-on-error, if-no-files-found warn, retention 7 days on schedule and 2 otherwise). New .github/workflows/ui-test-timings-refresh.yml (weekly on Mondays, workflow_dispatch, pull_request on its own paths) runs select --shards 16 --limit 6, downloads the reports, merges them into ui/scripts/test-shard-timings.json and opens the PR as the fleet App with skip-changeset, dry-run on pull_request, NOT MEASURED and green when no run is eligible. The selector's shardJobName now spells Test UI (N/M) (it spelled objectui's Test (shard N/M), which no job here carries) and generated_by names the workflow that exists; the committed dataset's generated_by is generator output and is rewritten by the first refresh, never by hand. Report-only per ruling: no threshold, no new failing check.",
      "tests": "ui test-file-timings.test.ts plus select-affected-tests-wiring.test.ts: 2 files, 25 tests passed (4 new pins against the parsed root ci.yml and the refresh: shard job name, reporter on the whole suite and not on the affected speed, upload name/path/report-only shape, refresh --shards equal to the matrix width, download pattern, generated_by names an existing workflow). Live: the exact CI spelling (pnpm --dir ui run test --shard=1/1 with the three reporters, GITHUB_WORKSPACE set) under vitest 4.1.12 exited 0 and wrote a objectui.test-file-timings/1 report; that report through merge wrote a valid dataset with the new generated_by. No ablation: CI wiring and a name, no tested package behaviour.",
      "gates": "At head 82d9d267 (after merging origin/main once PR #29556 landed): dispatch-gates --commands derived 69; 68 exit 0 first pass; pnpm --dir ui exec vitest run scripts/ exit 1 on the first post-merge pass (5 cases in check-doc-json-fences.test.ts, zod TypeError, file not in this diff), exit 0 after re-running the seven-package build (turbo replay): Test Files 170 passed, 2 skipped. check:pm-dispatch-gates exit 0 (1945 cases, census of ten declarations). --ran: 69 derived, 69 run, 0 NOT-MEASURED, exit 0. Outside the derived set: pnpm --dir ui run type-check:scripts exit 0; eslint on the two ui files exit 0. PR check-runs: not yet concluded at report time (in_progress).",
      "dogfood_battery": "n/a — no ! in the PR title and no (narrowing) arm",
      "mcp_calls": "0",
      "api_writes": "2 relay writes plus git push: fleet-write pr_create (PR 29588, labels skip-changeset, read-back 9918 bytes identical) and this post-stamped comment",
      "file_surface": "As claimed, plus scripts/pm/dispatch-gates.self-test.mjs (6 lines, census row 9 to 10 for the refresh's dispatch-gates no-check-families declaration), accepted by the seat; not governed.",
      "deviations": [
        "The reporter is spelled from the workspace root, not as ./scripts/test-file-timings.mjs: check-self-test-wired keys a ./scripts/ path in a workflow to the ROOT scripts/ and its --self-test redded on the relative spelling.",
        "PR body footer uses the AGENTS.md session-URL form rather than the harness-suggested one."
      ],
      "body_amendments": [],
      "open_questions": [],
      "security_findings": "none",
      "out_of_scope_findings": [
        "carrier: none · noted, not filed: ui/scripts/dependabot-merge-gate.mjs still describes objectui's own test-shard-timings-refresh.yml in its OPTIONAL_CONTEXTS row (the job name now exists again under the root workflow); the file is legacy objectui text and was left alone."
      ]
    }
  5. objectstack-fleet commented on Nov 2, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:devx#1 · os-warren · session_01JQwxbaBjisxkQo9hht9bFB

    ACCEPT → PR #29588 comment 6588408085 · head 5f0c784fe6 · contract review PASS 6588359667 (after 6587756255; its four should-fixes taken). Tier H: approvers requested (2026-11-02T21:05Z), awaiting a human approval; the seat lands it on an authorised APPROVED review.

  6. objectstack-fleet commented on Nov 2, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:devx#1 · os-warren · session_01JQwxbaBjisxkQo9hht9bFB

    Landed · 2026-11-02T23:27Z · PR #29588 merged as 3bd4bf66b1 (reviewed head 5f0c784fe6, contract review PASS 6588359667 after 6587756255, seat record ACCEPT 6588408085; Tier H, the maintainer readied and queued it). Test UI's full-battery legs now pass the per-file timings reporter and upload each shard's report on push and schedule runs; ui-test-timings-refresh.yml merges them weekly (Mondays 05:47 UTC, or a manual run on main) into ui/scripts/test-shard-timings.json and opens a fleet PR. It is report-only per ruling 6583487846: no threshold and no new failing check. The first refresh PR needs one full battery on main first. pm:dispatched is removed in this stroke.

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

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions