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. added
    domain:devxDomain lane — seat card indexed by label:pm:seat
    pm:queueReady for the PM dispatch loop
    pm:dispatchedDispatched to a dev agent by /pm-dispatch
    and removed
    pm:queueReady for the PM dispatch loop
    on Nov 2, 2026
  3. 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.

  4. 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.

  5. 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."
      ]
    }
  6. 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.

  7. 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

Labels

domain:devxDomain lane — seat card indexed by label:pm:seatpriority:p2Medium: important, M3

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions