Skip to content

Queue-flake anchor: test/hook-timeout-override-refusal.test.ts #26047

Closed

Description

@github-actions

test/hook-timeout-override-refusal.test.ts has ejected 3 pull requests from the merge
queue within a rolling 24 hours — 3 independent hits once
GitHub's speculative stacking is accounted for. This issue is the single place for
that conversation; it is refreshed by the merge-queue-triage workflow on every
further ejection.

PR stack queue build
#25979 independent 40298562907
#26007 independent 40302541664
#26026 independent 40313981294

This issue is a NAME, not a diagnosis. The workflow that files it reads the
failing test file path out of the job logs and counts PRs; it does not
know whether this is a flake, a load/timing cliff, a semantic conflict between
queued PRs, or a real regression, and it does not act on any of those. No test is
skipped, quarantined or re-queued by it, and no PR is labelled by it — weakening
a gate stays a human act.

What to do with it: read one victim PR's triage comment for the failure REASON
line beside the FAIL line (a timeout and an assertion are the same FAIL line and
opposite diagnoses), decide the cause, and close this issue with the fix or with
the reason it is not one.

Last refreshed by queue build 40313981294 (PR #26026).


Filed by the merge-queue-triage workflow (#4859, aggregation #10128).

Activity

  1. objectstack-fleet commented on Oct 26, 2026

    @objectstack-fleet
    Contributor

    Triage: first grade — bug · tests · priority:p2 · domain:server · area:devpath · pm:queue (finding removed) · triage seat · session_01AavokzJ5DndAwitDXvKy4U · 2026-10-26T10:54Z

    ⛔ Not a claim, ⛔ not a dispatch.


    Generated by Claude Code

  2. added
    area:devpathThe road — create, dev, verify, publish/install, connect an agent, iterate
    bugSomething isn't working
    domain:serverDomain lane — seat card indexed by label:pm:seat
    and removed on Oct 26, 2026
  3. objectstack-fleet commented on Oct 26, 2026

    @objectstack-fleet
    Contributor

    Claim: PM loop round 8 · card thread
    Session: session_01R1q2xdtYgU6FKrZ7LgjPCC (the seat); the card thread is session_01REwoooZ6nXESkVCEtsbeRC
    Account: os-project-manager (the seat's linked user; the card's assignee)
    Branch: claude/project-thread-1nrz43 (the card thread's harness-pinned branch; it names no issue, so this claim is the identity record)
    Worktree: the card thread's own container checkout
    Domain: domain:server
    Seat: domain:server#1
    Ruling-ref: triage first grade (2026-10-26T10:55Z): capture the child's stderr in the failing shape; if the child dies on time or memory, make the control's child cheap; if it fails on content, trace the regression. ⛔ No quarantine, no skip, no raised timeout. The #18788 pin's verdicts stay (--hookTimeout and --teardownTimeout refuse, --testTimeout passes, the no-override control passes silently). Split agreed with domain:server#2: p1/p2 intake resumes ahead of p3.
    File surface: packages/cli/test/hook-timeout-override-refusal.test.ts and any test fixture it lists. Product code in packages/cli/** only after a ruling (report needs_decision first). ⛔ No packages/spec/** (stop on breach; explain in the report)
    Container & model: S, mode:thread, default model and effort (set at thread open)
    Clause-②: no
    Metadata-protocol: none
    Responsibility: the ⭐ CONTROL child of runVitestList() exits 1 under merge-queue load (#25979, #26007, #26026 ejected)
    Thread-read: none
    Premise: holds (read 2026-10-26T12:17Z at origin/main 0a6948210c: card open, unassigned, pm:queue, no claim; the control spawns a whole-package vitest list via execFileSync)
    Serial constraints cleared: no open PR touches packages/cli/test/hook-timeout-override-refusal.test.ts; the dev re-measures before pr_create

  4. objectstack-fleet commented on Oct 26, 2026

    @objectstack-fleet
    Contributor

    os-dev-report

    {
      "issue": 26047,
      "status": "needs_decision",
      "branch": "claude/project-thread-1nrz43",
      "pr": null,
      "session": "session_01REwoooZ6nXESkVCEtsbeRC",
      "premise_still_valid": true,
      "summary": "Cause found, and it is not load or time. packages/cli/vitest.config.ts calls integrationTestFiles/unitTestFiles (packages/cli/vitest-tiers.ts) at config load, and testFilesOnDisk walks the WHOLE package including packages/cli/tmp (gitignored; SKIP_DIRS is node_modules, dist, .git, .turbo, coverage). Sibling tests in the same slice render scaffolds into tmp and delete them (init-template-comments-self-contained: render-init-app, render-init-plugin, render-create-plugin; scaffold-manifest-schema: manifest-init-app, manifest-init-plugin), and those scaffolds contain real test files (package.test.ts, src/index.test.ts). When a delete lands mid-walk, the child's config load throws ENOENT (scandir or open) and vitest list exits 1: exactly `expected 1 to be +0`. The fix belongs in vitest-tiers.ts, which the claim keeps behind a ruling, so I stopped there. Pushed so far: test-only commit 36b2670d, whose status assertions now carry the child's exit and the bounded head of its output.",
      "tests": "All on origin/main 0a6948210c, cli closure built. (1) Real neighbours, real child: the control's exact child (vitest list --filesOnly, no override) looped beside init-template-comments-self-contained + scaffold-manifest-schema: 3 of 132 exit 1, each `failed to load config ... Error: ENOENT ... packages/cli/tmp/manifest-init-plugin-XXXX/package.test.ts` or `.../render-create-plugin-XXXX/src/index.test.ts`. The same loop beside the i18n/config neighbours only: 0 of 104 (they churn shallow trees once per file). (2) Load alone falsified: the test file 5 runs beside 8 busy loops on 4 cores, no tmp churn: 5 of 5 green, file 27.5 to 31.3 s, control case 6.7 to 7.7 s against the 27 s budget. (3) Watcher on all three CI slices (OS_TEST_SHARD k/3, the whole package): the only directories that appear or vanish in the package tree are under tmp/; the slice holding this test churned 25 (render-*). (4) The outer `vitest run` config load dies the same way under churn (`failed to load config`), so this is not only the pin's problem. (5) New message, measured red under synthetic churn: `AssertionError: vitest list exited 1; its output began: failed to load config from packages/cli/vitest.config.ts ... Error: ENOENT: no such file or directory, scandir 'packages/cli/tmp/churn-89GJh1/src15'`. (6) Option A as a temporary probe (tmp added to SKIP_DIRS, restored from HEAD, blob 12e041557b proven by hash and empty git diff HEAD): population unchanged at 506 files; synthetic churn 0 of 8 file runs red (HEAD: red on run 1); real neighbours 0 of 128 children (HEAD: 3 of 132). Scripts and failure heads: project files pm-orders/server/evidence/26047/.",
      "gates": "Not run yet: no PR diff beyond the test-only commit. dispatch-gates --commands, pnpm lint scoped to packages/cli, cli unit tier and typecheck run on the final diff after the ruling.",
      "dogfood_battery": "n/a: no ! in the title and no (narrowing) arm",
      "mcp_calls": "0",
      "api_writes": "1: POST issues/26047/comments (this report, through post-stamped). git push of 36b2670d is not a REST write.",
      "open_questions": [
        {
          "question": "Where does the fix go? The race is in packages/cli/vitest-tiers.ts (the CLI vitest config's population walk), outside the claim's test-only surface.",
          "options": [
            "A: add tmp to SKIP_DIRS in packages/cli/vitest-tiers.ts (one line, with a header note), plus a red-first pin in test/vitest-tiers-partition.test.ts that a test file under tmp/ is in neither tier population. Keeps the diagnostic commit. Test infrastructure only: vitest-tiers.ts is not in cli files[] (dist, README.md, CHANGELOG.md), so skip-changeset.",
            "B: test-only. Move every sibling scratch dir out of packages/cli/tmp (about 13 files) to os.tmpdir() or node_modules/.NAME. Larger diff, and some of them sit there on purpose: the header of test/i18n-extract-check-json.test.ts says only under packages/cli/tmp does its module lookup reach this package. The next test that writes tmp reopens the race.",
            "C: catch ENOENT in the walk and skip a vanished entry. Small, but it tolerates instead of defining the population: scaffold test files still enter the unit population while they exist."
          ],
          "recommendation": "A. Real need: three independent queue ejections in 24h (#25979, #26007, #26026), each rebuilding the PRs grouped above, reproduced on main at 3 of 132 and closed at 0 of 128 by A. Long-term soundness: it fixes the producer, the population definition, so the outer vitest run and every other child (vitest-tiers-partition, the qa config-wiring sweep) stop racing too, and a gitignored scratch dir can never contribute a test file (tmp/ is ignored by the root .gitignore). Against AI mistakes: it narrows a contract instead of adding consumer tolerance (C). Startup scope: one line plus one pin, no new gate, no product or spec surface."
        }
      ],
      "out_of_scope_findings": [
        "noted, not filed: packages/qa/vitest-filter-preflight/src/index.ts testFilesUnder (filtered runs only) and scripts/nightly-tiers.mjs tierPackages walk tmp/ too; same race shape for a filtered run during churn, not measured. carrier: none. Dedupe words: testFilesUnder, NEVER_WALKED, tmp walk ENOENT"
      ]
    }

    Generated by Claude Code

  5. objectstack-fleet commented on Oct 26, 2026

    @objectstack-fleet
    Contributor

    Claim amendment: PM loop round 8 · seat ruling on report 6417845677 (needs_decision) · branch claude/project-thread-1nrz43 unchanged
    Seat: domain:server#1 · session_01R1q2xdtYgU6FKrZ7LgjPCC
    Ruling: A. Add tmp to SKIP_DIRS in packages/cli/vitest-tiers.ts, so the config-load walk never reads the gitignored scratch tree that sibling tests write and delete while it runs.
    Why A, on the four axes:

    • Business need (measured): the ⭐ CONTROL child's config load throws ENOENT when a sibling deletes a scaffold mid-walk. It reproduced on main in 3 of 132 runs; under A it was 0 of 128.
    • Long-term soundness: a gitignored scratch dir is never a test source. The walk counting it is the defect, and A removes it at its one source, leaving the population unchanged at 506 files.
    • Guarding AI against mistakes: B moves about 13 files' scratch dirs, and every future scaffold test would have to remember the rule. C tolerates ENOENT, which would hide a real missing file. A is one entry that holds structurally.
    • No scope creep: one line, and it adds no gate.
      Not B and not C.
      File surface (widened): adds packages/cli/vitest-tiers.ts (the SKIP_DIRS entry plus its comment) to packages/cli/test/hook-timeout-override-refusal.test.ts. Keep the pin's exit-and-output carriage already on 36b2670d. ⛔ Still no product code and no packages/spec/**. If check-tier-file-adoption or the test-input census reads SKIP_DIRS, keep it green and report it.
      Changeset: skip-changeset if vitest-tiers.ts is outside @objectstack/cli's published files[] (the dev measures this and states it in the body); otherwise a patch.
  6. objectstack-fleet commented on Oct 26, 2026

    @objectstack-fleet
    Contributor

    os-dev-report

    {
      "issue": 26047,
      "status": "done",
      "branch": "claude/project-thread-1nrz43",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/26176",
      "session": "session_01REwoooZ6nXESkVCEtsbeRC",
      "premise_still_valid": true,
      "summary": "Ruling A (claim amendment 6417872008) implemented. packages/cli/vitest-tiers.ts now skips the git-ignored tmp/ in its config-load walk, so a sibling test deleting a scaffold it rendered there can no longer throw ENOENT out of the config load (the control child exit 1 behind #25979, #26007, #26026). The pin keeps the exit-and-output carriage (36b2670d) and its no-override control now plants tmp/.../planted.test.ts and asserts the listing does not name it (red against main's walk). No timeout, skip or retry; #18788 verdicts unchanged.",
      "tests": "Head 358e11b89. Red first: control red with main's vitest-tiers.ts (listing named [unit] tmp/hook-timeout-control-Btvz04/planted.test.ts), restore proven by blob 00f860ac2d and empty git diff HEAD. Reproduction, control child beside the real scaffold-rendering tests: main 3 of 132 exit 1 (ENOENT at config load); fix 0 of 216 (120 + 96). Synthetic tmp churn: main red on run 1; fix 0 of 8. Load only (8 busy loops, 4 cores, shared box), 5 runs each: main 27.5-31.3 s file / 6.7-7.7 s control; fix 27.6-30.9 s / 6.4-7.6 s; all green. Population 506 before and after. cli unit tier: 333 files / 4854 tests passed; integration tier declared to CI (no spawn entry touched). Ablation n/a beyond the red leg: vitest-tiers.ts is config read from source, not via dist.",
      "gates": "dispatch-gates --commands at 358e11b89: 55 derived; 54 exit 0; check:dual-build-cjs-loads exit 3 = NOT MEASURED (needs full build); --ran: 55 accounted, 0 unrun. check:tier-file-adoption and check:cross-package-test-inputs exit 0 (neither reads cli SKIP_DIRS). check-plugin-teardown-shape --self-test: first run overlapped my synthetic tmp churn and refused on an unreadable tmp file (same walk class); rerun after git fetch of its control commit 621a4876: exit 0, 48 cases. eslint packages/cli --no-inline-config exit 0; cli typecheck exit 0; check:nul-bytes exit 0. PR check-runs: in_progress at report time.",
      "dogfood_battery": "n/a: no ! in the title and no (narrowing) arm",
      "mcp_calls": "0",
      "api_writes": "3 relay writes: POST issues/26047/comments (needs_decision report 6417845677); pr_create #26176 (draft, assignee os-project-manager, label skip-changeset; read-back identical); POST issues/26047/comments (this report). git push x2 not REST.",
      "open_questions": [],
      "out_of_scope_findings": [
        "noted, not filed (PR Acceptance notes): packages/qa/vitest-filter-preflight testFilesUnder, scripts/nightly-tiers.mjs tierPackages and check-plugin-teardown-shape also walk packages/cli/tmp; a tmp churn during one of them refuses on a vanished file (seen once locally, under my own synthetic churn, on the teardown self-test). carrier: none. Dedupe words: testFilesUnder, tierPackages, tmp walk ENOENT"
      ]
    }

    Generated by Claude Code

  7. objectstack-fleet commented on Oct 26, 2026

    @objectstack-fleet
    Contributor

    Landed

    PR #26176 merged at 2026-10-26T15:38Z by the merge queue as 6b9355299d on main (Fixes #26047; ACCEPT 6419561431).

    Reading Probe Result
    Queue membership git ls-remote origin 'refs/heads/gh-readonly-queue/main/pr-26176-*' 0 refs
    origin/main by content git cat-file -e origin/main:packages/cli/vitest-tiers.ts present
    Ancestry git merge-base --is-ancestor 6b9355299d origin/main holds

    State: this card closed by Fixes (completed); pm:dispatched removed.


    Generated by Claude Code

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

Metadata

Metadata

Labels

area:devpathThe road — create, dev, verify, publish/install, connect an agent, iteratebugSomething isn't workingdomain:serverDomain lane — seat card indexed by label:pm:seatpriority:p2Medium: important, M3queue-flake-anchortests

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions