@forgeax/engine-rhi-debug 0.1.32 → 0.1.34

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@forgeax/engine-rhi-debug",
3
- "version": "0.1.32",
3
+ "version": "0.1.34",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "license": "Apache-2.0",
@@ -26,19 +26,19 @@
26
26
  "LICENSE"
27
27
  ],
28
28
  "dependencies": {
29
- "@forgeax/engine-rhi": "0.1.32",
30
- "@forgeax/engine-types": "0.1.32",
29
+ "@forgeax/engine-rhi": "0.1.34",
30
+ "@forgeax/engine-types": "0.1.34",
31
31
  "@noble/hashes": "^2.2.0",
32
32
  "pako": "^1.0.11"
33
33
  },
34
34
  "devDependencies": {
35
- "@forgeax/engine-rhi-null": "0.1.32",
35
+ "@forgeax/engine-rhi-null": "0.1.34",
36
36
  "@types/node": "^20.14.0",
37
37
  "@webgpu/types": "^0.1.71"
38
38
  },
39
39
  "peerDependencies": {
40
- "@forgeax/engine-rhi-webgpu": "0.1.32",
41
- "@forgeax/engine-rhi-wgpu": "0.1.32"
40
+ "@forgeax/engine-rhi-webgpu": "0.1.34",
41
+ "@forgeax/engine-rhi-wgpu": "0.1.34"
42
42
  },
43
43
  "forgeax": {
44
44
  "metrics": {
@@ -193,7 +193,7 @@ describe('AC-08 partial: import.meta.hot in rhiDebugFlag guard', () => {
193
193
  });
194
194
 
195
195
  describe('RHI-debug smoke roster gate', () => {
196
- it('resolves every declared hello and learn-render smoke at 300 frames', () => {
196
+ it('resolves every declared hello and learn-render smoke at 60 frames', () => {
197
197
  const rosterPath = path.resolve(ENGINE_ROOT, 'scripts', 'rhi-debug-smoke-roster.mjs');
198
198
  const result = spawnSync(
199
199
  process.execPath,
@@ -204,7 +204,7 @@ describe('RHI-debug smoke roster gate', () => {
204
204
  '--learn-root',
205
205
  'apps/learn-render',
206
206
  '--frames',
207
- '300',
207
+ '60',
208
208
  ],
209
209
  { cwd: ENGINE_ROOT, encoding: 'utf8' },
210
210
  );
@@ -223,12 +223,12 @@ describe('RHI-debug smoke roster gate', () => {
223
223
  };
224
224
  expect(roster.status).toBe('unavailable');
225
225
  expect(roster.execution).toMatchObject({ status: 'not-executed', mode: 'declaration-only' });
226
- expect(roster.frameCount).toBe(300);
226
+ expect(roster.frameCount).toBe(60);
227
227
  expect(roster.entries.length).toBeGreaterThan(0);
228
228
  expect(
229
229
  roster.entries.every(
230
230
  (entry) =>
231
- entry.frames === 300 &&
231
+ entry.frames === 60 &&
232
232
  entry.command === entry.invocation &&
233
233
  entry.tokens.join(' ') === entry.invocation &&
234
234
  entry.tokens[0] === 'pnpm' &&
@@ -285,7 +285,7 @@ describe('RHI-debug smoke roster gate', () => {
285
285
  '--cwd',
286
286
  fixture,
287
287
  '--frames',
288
- '300',
288
+ '60',
289
289
  '--execute',
290
290
  ],
291
291
  { cwd: ENGINE_ROOT, encoding: 'utf8' },
@@ -320,7 +320,7 @@ describe('RHI-debug smoke roster gate', () => {
320
320
  invocation: 'pnpm --filter @fake/smoke smoke:browser',
321
321
  tokens: ['pnpm', '--filter', '@fake/smoke', 'smoke:browser'],
322
322
  backend: 'browser',
323
- frames: 300,
323
+ frames: 60,
324
324
  });
325
325
  expect(passedEntry?.stdout).toContain('fake browser smoke');
326
326
 
@@ -330,7 +330,11 @@ describe('RHI-debug smoke roster gate', () => {
330
330
  name: '@fake/smoke',
331
331
  private: true,
332
332
  scripts: {
333
- 'smoke:browser': 'node -e "console.error(\'fake failure\'); process.exit(7)"',
333
+ // process managers may route a failing script's streams differently
334
+ // on each runner; write the diagnostic synchronously to both pipes
335
+ // so the fail-closed assertion always has portable evidence.
336
+ 'smoke:browser':
337
+ "node -e \"const fs = require('node:fs'); fs.writeSync(1, 'fake failure\\n'); fs.writeSync(2, 'fake failure\\n'); process.exit(7)\"",
334
338
  },
335
339
  forgeax: { smokeInvocation: 'pnpm --filter @fake/smoke smoke:browser' },
336
340
  }),
@@ -353,12 +357,31 @@ describe('RHI-debug smoke roster gate', () => {
353
357
  const failedRoster = JSON.parse(failed.stdout) as {
354
358
  status: string;
355
359
  execution: { status: string; failedCount: number };
356
- entries: readonly { status: string; returnCode: number | null; stderr: string }[];
360
+ entries: readonly {
361
+ status: string;
362
+ returnCode: number | null;
363
+ stdout: string;
364
+ stderr: string;
365
+ }[];
357
366
  };
358
367
  expect(failedRoster.status).toBe('failed');
359
368
  expect(failedRoster.execution).toMatchObject({ status: 'failed', failedCount: 1 });
360
- expect(failedRoster.entries[0]).toMatchObject({ status: 'failed', returnCode: 7 });
361
- expect(failedRoster.entries[0]?.stderr).toContain('fake failure');
369
+ // The roster records the declared pnpm command's status. pnpm 11 maps
370
+ // the inner script's exit 7 to 1; compare against that real boundary.
371
+ const directFailure = spawnSync('pnpm', ['--filter', '@fake/smoke', 'smoke:browser'], {
372
+ cwd: fixture,
373
+ encoding: 'utf8',
374
+ });
375
+ expect(directFailure.error).toBeUndefined();
376
+ expect(directFailure.status).not.toBeNull();
377
+ expect(directFailure.status).not.toBe(0);
378
+ expect(failedRoster.entries[0]).toMatchObject({
379
+ status: 'failed',
380
+ returnCode: directFailure.status,
381
+ });
382
+ expect(`${failedRoster.entries[0]?.stdout}\n${failedRoster.entries[0]?.stderr}`).toContain(
383
+ 'fake failure',
384
+ );
362
385
  } finally {
363
386
  rmSync(fixture, { recursive: true, force: true });
364
387
  }