Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
20 commits
Select commit Hold shift + click to select a range
b019f80
fix(capture): scale the capture script's browser budget for CI runners
ScriptedAlchemy Aug 29, 2026
3dcee1c
test(workbench): scale the HMR e2e budget through the shared time scale
ScriptedAlchemy Aug 29, 2026
77e7723
fix(tests): stage atomic-write temp files outside the watched project…
ScriptedAlchemy Aug 29, 2026
6b8dca7
test(workbench): delete vacuous and duplicate tests across workbench …
ScriptedAlchemy Aug 29, 2026
0b835da
test(workbench): drop 390px mobile assertion tails from desktop-only …
ScriptedAlchemy Aug 29, 2026
b9de1ff
test(rsc): consolidate the four fifty-run eviction sessions into one
ScriptedAlchemy Aug 29, 2026
805fef4
test(rsc): fold stale-chunk and self-contained HTML checks into the p…
ScriptedAlchemy Aug 29, 2026
9a15b49
test(workbench): run the readFinalizedEvalRun fake-client tests on th…
ScriptedAlchemy Aug 29, 2026
295b833
test(agent-bundle): run pack-and-install suites through test:packed i…
ScriptedAlchemy Aug 29, 2026
7efd4bd
test(agent-bundle): delete vacuous export, doc-string, and duplicate-…
ScriptedAlchemy Aug 29, 2026
badb229
test(agent-bundle): drop schema hash tables duplicated by the adapter…
ScriptedAlchemy Aug 29, 2026
4b08167
test: derive integration worker count from cores and split shared-art…
ScriptedAlchemy Aug 29, 2026
e42702a
test: stop rebuilding shared artifacts inside the integration pool
ScriptedAlchemy Aug 29, 2026
6d2dab4
test(rsc-agent-runtime): inject the terminal-run retention window int…
ScriptedAlchemy Aug 29, 2026
076ff39
test: scale browser polling budgets when the integration pool runs pa…
ScriptedAlchemy Aug 29, 2026
bfed755
test: raise the default test timeout for the parallel integration pool
ScriptedAlchemy Aug 29, 2026
2fab263
Merge remote-tracking branch 'origin/main' into test/parallelize-inte…
ScriptedAlchemy Aug 29, 2026
8542a85
test: drop the deleted inspector-shell e2e file from the serial integ…
ScriptedAlchemy Aug 29, 2026
0a60bd3
Merge remote-tracking branch 'origin/main' into test/parallelize-inte…
ScriptedAlchemy Aug 29, 2026
353ef3c
test: pin the CI integration pool to one worker
ScriptedAlchemy Aug 29, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 3 additions & 5 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -14,10 +14,9 @@ concurrency:
cancel-in-progress: true

jobs:
# Fast end-to-end confidence gate: builds, validates, and deterministically evals the
# checked-in micro fixture through the real CLI. Never skip-gated and needs no native host.
spot-check:
name: Micro-eval spot-check (Node 22.19)
# Builds and checks every public example through its own toolchain.
examples-check:
name: Examples check (Node 22.19)
runs-on: ubuntu-latest
timeout-minutes: 25
steps:
Expand All @@ -29,7 +28,6 @@ jobs:
runtime: node@22.19.0
- run: pnpm install --frozen-lockfile
- run: pnpm examples:check
- run: pnpm test:spot-check

verify:
name: Verify (Node ${{ matrix.node-version }})
Expand Down
5 changes: 0 additions & 5 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -308,11 +308,6 @@ pnpm check && pnpm check:release
`pnpm check:release` is the release-only gate: it runs `pnpm pack:dry-run`,
`pnpm audit:release`, and `pnpm test:packed`; it does not replace `pnpm check`.

The micro-eval spot-check is the end-to-end CI confidence gate: `pnpm test:spot-check` builds,
validates, and runs one deterministic eval against the checked-in `fixtures/integration/micro-eval`
project through the real CLI. It also runs inside every default `pnpm test`, is never skip-gated,
and needs no Claude or Codex installation.

Native Claude/Codex host smokes are intentionally opt-in and stay skipped in CI. They run only on a
machine with that CLI installed and signed in — via `AGENT_BUNDLE_NATIVE_CLAUDE_SMOKE=1` /
`AGENT_BUNDLE_NATIVE_CODEX_SMOKE=1`, the packed variants `pnpm test:packed:native:claude` /
Expand Down
7 changes: 0 additions & 7 deletions examples/audiobook-curator/tests/cli.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -20,13 +20,6 @@ const operations = (): CuratorOperations => ({
});

describe('audiobook-curator CLI', () => {
it('emits one JSON receipt for each exact subcommand', async () => {
const output: string[] = [];
await expect(runCli(['inspect', '/library'], { operations: operations(), write: (value) => output.push(value) }))
.resolves.toBe(0);
expect(JSON.parse(output[0]!)).toEqual({ files: [], operation: 'inspect', root: '/library', totalBytes: 0 });
});

it('enables application only through the typed flag', async () => {
let applied = false;
const fixture = operations();
Expand Down
22 changes: 0 additions & 22 deletions examples/audiobook-curator/tests/mcp-tools.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ import { describe, expect, it } from '@rstest/core';

import {
createCuratorTools,
curatorToolNames,
type CuratorToolOperations,
} from '../src/mcp-tools.js';

Expand Down Expand Up @@ -34,27 +33,6 @@ const operations = (): CuratorToolOperations => ({
});

describe('audiobook curator MCP tools', () => {
it('derives the current tool catalog from the shared application', () => {
expect(curatorToolNames).toEqual([
'verify_audible_sample',
'identify_audible_sample',
'verify_with_whisper',
'apply_audiobook_metadata',
'apply_audiobook_chapters',
'search_audible',
'select_audible_edition',
'cache_audible_edition',
'inspect_sources',
'inventory_sources',
'audit_library',
'select_sources',
'convert_audiobook',
'prepare_audiobook',
'audit_audiobook',
]);
expect(createCuratorTools({ operations: operations() }).map(({ name }) => name)).toEqual(curatorToolNames);
});

it('renders text and detached structured receipts through the public RSC lowerer', async () => {
const tools = createCuratorTools({ operations: operations() });
const inspect = tools.find(({ name }) => name === 'inspect_sources')!;
Expand Down
1 change: 0 additions & 1 deletion examples/rsc-agent-runtime/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,6 @@ the published package:
```bash
node packages/workbench/scripts/capture-runtime-playground.mjs \
--desktop "$PWD/docs/assets/rsc-runtime-workbench/desktop.png" \
--mobile "$PWD/docs/assets/rsc-runtime-workbench/mobile.png" \
--hmr-before "$PWD/docs/assets/rsc-runtime-workbench/hmr-before.png" \
--hmr-after "$PWD/docs/assets/rsc-runtime-workbench/hmr-after.png" \
--compile-error "$PWD/docs/assets/rsc-runtime-workbench/compile-error.png" \
Expand Down
17 changes: 13 additions & 4 deletions examples/rsc-agent-runtime/src/dev/rsbuild-runtime-session.ts
Original file line number Diff line number Diff line change
Expand Up @@ -93,7 +93,8 @@ const maximumInvocationWorkers = 4;
const maximumInvocationStdoutBytes = 4 * 1024 * 1024;
const maximumInvocationFlightBytes = 4 * 1024 * 1024;
const maximumInvocationStderrBytes = 256 * 1024;
const maximumRunHistory = 50;
/** Production terminal-run retention window; tests may shrink it through the start testing seam. */
export const defaultMaximumRunHistory = 50;
const invocationTimeoutMs = 10_000;
const invocationTerminationGraceMs = 100;
const flightPreviewBytes = 32 * 1024;
Expand Down Expand Up @@ -603,6 +604,12 @@ export interface RsbuildRuntimeSessionStartTesting {
}>) => Promise<void> | void;
/** Windows-only Job owner fault injection; never used by the public provider. */
readonly windowsJobOwnerMode?: 'close-control' | 'hang-ready' | 'ignore-stop' | 'nonzero-after-drain' | 'normal';
/**
* Test-only terminal-run retention override so eviction suites do not need
* fifty real invocations; the public provider always keeps
* `defaultMaximumRunHistory` runs.
*/
readonly maximumRunHistory?: number;
}

/**
Expand Down Expand Up @@ -633,6 +640,7 @@ export class RsbuildRuntimeSession implements DevRuntimeSession {
readonly #surfaceAssetApps = new Map<string, DevRuntimePreparedProject['apps'][number]>();
readonly #surfaces = new Map<string, DevRuntimeSurface>();
readonly #testing: RsbuildRuntimeSessionStartTesting;
readonly #maximumRunHistory: number;
readonly #attempts = new Map<string, AttemptBarrier>();
readonly #workers = new Map<string, InvocationWorker>();
readonly #failedAttempts = new Set<string>();
Expand Down Expand Up @@ -669,6 +677,7 @@ export class RsbuildRuntimeSession implements DevRuntimeSession {
this.#mcpRegistry = input.mcpRegistry;
this.#latestPreparedRuntime = input.preparedRuntime;
this.#testing = input.testing;
this.#maximumRunHistory = input.testing.maximumRunHistory ?? defaultMaximumRunHistory;
this.#ownedRunsRoot = input.ownedRunsRoot;
this.#runRoot = input.ownedRunsRoot.root;
this.#stateFile = join(resolve(input.context.storageRoot), 'state', `${stateStoreId}.jsonl`);
Expand Down Expand Up @@ -1035,8 +1044,8 @@ export class RsbuildRuntimeSession implements DevRuntimeSession {

runs(limit: number): readonly DevRuntimeRun[] {
if (this.#closed) return Object.freeze([]);
if (!Number.isSafeInteger(limit) || limit < 1 || limit > maximumRunHistory) {
throw new RangeError(`Runtime run history limit must be an integer from 1 through ${maximumRunHistory}.`);
if (!Number.isSafeInteger(limit) || limit < 1 || limit > this.#maximumRunHistory) {
throw new RangeError(`Runtime run history limit must be an integer from 1 through ${String(this.#maximumRunHistory)}.`);
}
return Object.freeze([...this.#terminalRuns.values()].reverse().slice(0, limit));
}
Expand Down Expand Up @@ -1333,7 +1342,7 @@ export class RsbuildRuntimeSession implements DevRuntimeSession {
}

async #evictTerminalRuns(): Promise<void> {
while (this.#terminalRuns.size > maximumRunHistory) {
while (this.#terminalRuns.size > this.#maximumRunHistory) {
const oldestId = this.#terminalRuns.keys().next().value as string | undefined;
if (oldestId === undefined) return;
this.#evictingTerminalRuns.add(oldestId);
Expand Down
Loading
Loading