code-foundry 1.45.2 → 1.46.2

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.
@@ -183,6 +183,72 @@ jobs:
183
183
  HEAD_SHA: ${{ github.event.pull_request.head.sha || github.sha }}
184
184
  BEFORE_SHA: ${{ github.event.before }}
185
185
  run: node "$RUNNER_TEMP/code-foundry/src/runtime.mjs" ci should_run format >> "$GITHUB_OUTPUT"
186
+ # --- Build lane (mirror of ci.yml build) ---
187
+ - name: Detect build
188
+ id: build_applicability
189
+ if: ${{ !cancelled() }}
190
+ env:
191
+ EVENT_NAME: ${{ github.event_name }}
192
+ BASE_REF: ${{ github.event.pull_request.base.ref }}
193
+ BASE_SHA: ${{ github.event.pull_request.base.sha }}
194
+ HEAD_SHA: ${{ github.event.pull_request.head.sha || github.sha }}
195
+ BEFORE_SHA: ${{ github.event.before }}
196
+ run: node "$RUNNER_TEMP/code-foundry/src/runtime.mjs" ci should_run build >> "$GITHUB_OUTPUT"
197
+ # --- Performance lane (mirror of test.yml performance; audit tier only) ---
198
+ - name: Detect performance
199
+ id: performance_applicability
200
+ if: ${{ !cancelled() && inputs.mode == 'audit' }}
201
+ env:
202
+ EVENT_NAME: ${{ github.event_name }}
203
+ BASE_REF: ${{ github.event.pull_request.base.ref }}
204
+ BASE_SHA: ${{ github.event.pull_request.base.sha }}
205
+ HEAD_SHA: ${{ github.event.pull_request.head.sha || github.sha }}
206
+ BEFORE_SHA: ${{ github.event.before }}
207
+ run: node "$RUNNER_TEMP/code-foundry/src/runtime.mjs" ci task_profile performance >> "$GITHUB_OUTPUT"
208
+ # --- Smoke lane (mirror of test.yml smoke; audit tier only) ---
209
+ - name: Detect smoke
210
+ id: smoke_applicability
211
+ if: ${{ !cancelled() && inputs.mode == 'audit' }}
212
+ env:
213
+ EVENT_NAME: ${{ github.event_name }}
214
+ BASE_REF: ${{ github.event.pull_request.base.ref }}
215
+ BASE_SHA: ${{ github.event.pull_request.base.sha }}
216
+ HEAD_SHA: ${{ github.event.pull_request.head.sha || github.sha }}
217
+ BEFORE_SHA: ${{ github.event.before }}
218
+ run: node "$RUNNER_TEMP/code-foundry/src/runtime.mjs" ci task_profile smoke >> "$GITHUB_OUTPUT"
219
+ # --- Eval lane (mirror of eval.yml; audit tier only) ---
220
+ - name: Detect eval
221
+ id: eval_applicability
222
+ if: ${{ !cancelled() && inputs.mode == 'audit' }}
223
+ env:
224
+ EVENT_NAME: ${{ github.event_name }}
225
+ BASE_REF: ${{ github.event.pull_request.base.ref }}
226
+ BASE_SHA: ${{ github.event.pull_request.base.sha }}
227
+ HEAD_SHA: ${{ github.event.pull_request.head.sha || github.sha }}
228
+ BEFORE_SHA: ${{ github.event.before }}
229
+ run: node "$RUNNER_TEMP/code-foundry/src/runtime.mjs" ci should_run eval >> "$GITHUB_OUTPUT"
230
+ # --- Lint lane (mirror of ci.yml lint) ---
231
+ - name: Detect lint
232
+ id: lint_applicability
233
+ if: ${{ !cancelled() }}
234
+ env:
235
+ EVENT_NAME: ${{ github.event_name }}
236
+ BASE_REF: ${{ github.event.pull_request.base.ref }}
237
+ BASE_SHA: ${{ github.event.pull_request.base.sha }}
238
+ HEAD_SHA: ${{ github.event.pull_request.head.sha || github.sha }}
239
+ BEFORE_SHA: ${{ github.event.before }}
240
+ run: node "$RUNNER_TEMP/code-foundry/src/runtime.mjs" ci should_run lint >> "$GITHUB_OUTPUT"
241
+ # --- Integration lane (mirror of test.yml integration; audit tier only) ---
242
+ - name: Detect integration
243
+ id: integration_applicability
244
+ if: ${{ !cancelled() && inputs.mode == 'audit' }}
245
+ env:
246
+ EVENT_NAME: ${{ github.event_name }}
247
+ BASE_REF: ${{ github.event.pull_request.base.ref }}
248
+ BASE_SHA: ${{ github.event.pull_request.base.sha }}
249
+ HEAD_SHA: ${{ github.event.pull_request.head.sha || github.sha }}
250
+ BEFORE_SHA: ${{ github.event.before }}
251
+ run: node "$RUNNER_TEMP/code-foundry/src/runtime.mjs" ci task_profile integration >> "$GITHUB_OUTPUT"
186
252
  - name: Setup format
187
253
  if: steps.format_applicability.outputs.applicable == 'true' && steps.format_applicability.outputs.affected != 'false'
188
254
  uses: ./.github/actions/setup
@@ -195,34 +261,6 @@ jobs:
195
261
  cache-lint: 'false'
196
262
  cache-build: 'false'
197
263
  task: format
198
- - name: Format
199
- id: format_execute
200
- if: steps.format_applicability.outputs.applicable == 'true' && steps.format_applicability.outputs.affected != 'false'
201
- run: node "$RUNNER_TEMP/code-foundry/src/runtime.mjs" ci format
202
- - name: Retain format task receipt
203
- if: >-
204
- always() &&
205
- (steps.format_execute.outcome == 'success' || steps.format_execute.outcome == 'failure' ||
206
- steps.format_applicability.outputs.applicable == 'false' || steps.format_applicability.outputs.affected == 'false') &&
207
- hashFiles('.code-foundry/results/format.json') != ''
208
- uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
209
- with:
210
- name: ${{ inputs.artifact-prefix }}-${{ github.run_id }}-${{ github.run_attempt }}-format
211
- path: .code-foundry/results/format.json
212
- include-hidden-files: true
213
- if-no-files-found: error
214
- retention-days: 14
215
- # --- Build lane (mirror of ci.yml build) ---
216
- - name: Detect build
217
- id: build_applicability
218
- if: ${{ !cancelled() }}
219
- env:
220
- EVENT_NAME: ${{ github.event_name }}
221
- BASE_REF: ${{ github.event.pull_request.base.ref }}
222
- BASE_SHA: ${{ github.event.pull_request.base.sha }}
223
- HEAD_SHA: ${{ github.event.pull_request.head.sha || github.sha }}
224
- BEFORE_SHA: ${{ github.event.before }}
225
- run: node "$RUNNER_TEMP/code-foundry/src/runtime.mjs" ci should_run build >> "$GITHUB_OUTPUT"
226
264
  - name: Setup build
227
265
  if: ${{ !cancelled() && steps.build_applicability.outputs.applicable == 'true' && steps.build_applicability.outputs.affected != 'false' }}
228
266
  uses: ./.github/actions/setup
@@ -235,36 +273,6 @@ jobs:
235
273
  # time. Consumers can provide the real value; the fallback is
236
274
  # intentionally CI-only and must never be used at runtime.
237
275
  NEXTAUTH_SECRET: ${{ secrets.NEXTAUTH_SECRET || 'code-foundry-ci-placeholder-0123456789' }}
238
- - name: Build
239
- id: build_execute
240
- if: ${{ !cancelled() && steps.build_applicability.outputs.applicable == 'true' && steps.build_applicability.outputs.affected != 'false' }}
241
- env:
242
- NEXTAUTH_SECRET: ${{ secrets.NEXTAUTH_SECRET || 'code-foundry-ci-placeholder-0123456789' }}
243
- run: node "$RUNNER_TEMP/code-foundry/src/runtime.mjs" ci build
244
- - name: Retain build task receipt
245
- if: >-
246
- always() &&
247
- (steps.build_execute.outcome == 'success' || steps.build_execute.outcome == 'failure' ||
248
- steps.build_applicability.outputs.applicable == 'false' || steps.build_applicability.outputs.affected == 'false') &&
249
- hashFiles('.code-foundry/results/build.json') != ''
250
- uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
251
- with:
252
- name: ${{ inputs.artifact-prefix }}-${{ github.run_id }}-${{ github.run_attempt }}-build
253
- path: .code-foundry/results/build.json
254
- include-hidden-files: true
255
- if-no-files-found: error
256
- retention-days: 14
257
- # --- Performance lane (mirror of test.yml performance; audit tier only) ---
258
- - name: Detect performance
259
- id: performance_applicability
260
- if: ${{ !cancelled() && inputs.mode == 'audit' }}
261
- env:
262
- EVENT_NAME: ${{ github.event_name }}
263
- BASE_REF: ${{ github.event.pull_request.base.ref }}
264
- BASE_SHA: ${{ github.event.pull_request.base.sha }}
265
- HEAD_SHA: ${{ github.event.pull_request.head.sha || github.sha }}
266
- BEFORE_SHA: ${{ github.event.before }}
267
- run: node "$RUNNER_TEMP/code-foundry/src/runtime.mjs" ci task_profile performance >> "$GITHUB_OUTPUT"
268
276
  - name: Setup performance
269
277
  if: ${{ !cancelled() && inputs.mode == 'audit' && steps.performance_applicability.outputs.applicable == 'true' && steps.performance_applicability.outputs.affected != 'false' }}
270
278
  uses: ./.github/actions/setup
@@ -281,51 +289,6 @@ jobs:
281
289
  task-javascript: ${{ steps.performance_applicability.outputs.javascript }}
282
290
  task-python: ${{ steps.performance_applicability.outputs.python }}
283
291
  task-rust: ${{ steps.performance_applicability.outputs.rust }}
284
- - name: Performance
285
- id: performance_execute
286
- if: ${{ !cancelled() && inputs.mode == 'audit' && steps.performance_applicability.outputs.applicable == 'true' && steps.performance_applicability.outputs.affected != 'false' }}
287
- run: node "$RUNNER_TEMP/code-foundry/src/runtime.mjs" ci performance
288
- - name: Retain performance task receipt
289
- if: >-
290
- always() &&
291
- inputs.mode == 'audit' &&
292
- (steps.performance_execute.outcome == 'success' || steps.performance_execute.outcome == 'failure' ||
293
- steps.performance_applicability.outputs.applicable == 'false' || steps.performance_applicability.outputs.affected == 'false') &&
294
- hashFiles('.code-foundry/results/performance.json') != ''
295
- uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
296
- with:
297
- name: ${{ inputs.artifact-prefix }}-${{ github.run_id }}-${{ github.run_attempt }}-performance
298
- path: .code-foundry/results/performance.json
299
- include-hidden-files: true
300
- if-no-files-found: error
301
- retention-days: 14
302
- - name: Upload performance results
303
- if: >-
304
- always() &&
305
- inputs.mode == 'audit' &&
306
- steps.performance_applicability.outputs.applicable == 'true' &&
307
- hashFiles('artifacts/performance/**', 'performance-results.json', 'performance-results/**') != ''
308
- uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
309
- with:
310
- name: performance-${{ github.run_id }}
311
- path: |
312
- artifacts/performance/**
313
- performance-results.json
314
- performance-results/**
315
- compression-level: 1
316
- if-no-files-found: ignore
317
- retention-days: 14
318
- # --- Smoke lane (mirror of test.yml smoke; audit tier only) ---
319
- - name: Detect smoke
320
- id: smoke_applicability
321
- if: ${{ !cancelled() && inputs.mode == 'audit' }}
322
- env:
323
- EVENT_NAME: ${{ github.event_name }}
324
- BASE_REF: ${{ github.event.pull_request.base.ref }}
325
- BASE_SHA: ${{ github.event.pull_request.base.sha }}
326
- HEAD_SHA: ${{ github.event.pull_request.head.sha || github.sha }}
327
- BEFORE_SHA: ${{ github.event.before }}
328
- run: node "$RUNNER_TEMP/code-foundry/src/runtime.mjs" ci task_profile smoke >> "$GITHUB_OUTPUT"
329
292
  - name: Setup smoke
330
293
  if: ${{ !cancelled() && inputs.mode == 'audit' && steps.smoke_applicability.outputs.applicable == 'true' && steps.smoke_applicability.outputs.affected != 'false' }}
331
294
  uses: ./.github/actions/setup
@@ -342,35 +305,6 @@ jobs:
342
305
  task-javascript: ${{ steps.smoke_applicability.outputs.javascript }}
343
306
  task-python: ${{ steps.smoke_applicability.outputs.python }}
344
307
  task-rust: ${{ steps.smoke_applicability.outputs.rust }}
345
- - name: Smoke
346
- id: smoke_execute
347
- if: ${{ !cancelled() && inputs.mode == 'audit' && steps.smoke_applicability.outputs.applicable == 'true' && steps.smoke_applicability.outputs.affected != 'false' }}
348
- run: node "$RUNNER_TEMP/code-foundry/src/runtime.mjs" ci smoke
349
- - name: Retain smoke task receipt
350
- if: >-
351
- always() &&
352
- inputs.mode == 'audit' &&
353
- (steps.smoke_execute.outcome == 'success' || steps.smoke_execute.outcome == 'failure' ||
354
- steps.smoke_applicability.outputs.applicable == 'false' || steps.smoke_applicability.outputs.affected == 'false') &&
355
- hashFiles('.code-foundry/results/smoke.json') != ''
356
- uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
357
- with:
358
- name: ${{ inputs.artifact-prefix }}-${{ github.run_id }}-${{ github.run_attempt }}-smoke
359
- path: .code-foundry/results/smoke.json
360
- include-hidden-files: true
361
- if-no-files-found: error
362
- retention-days: 14
363
- # --- Eval lane (mirror of eval.yml; audit tier only) ---
364
- - name: Detect eval
365
- id: eval_applicability
366
- if: ${{ !cancelled() && inputs.mode == 'audit' }}
367
- env:
368
- EVENT_NAME: ${{ github.event_name }}
369
- BASE_REF: ${{ github.event.pull_request.base.ref }}
370
- BASE_SHA: ${{ github.event.pull_request.base.sha }}
371
- HEAD_SHA: ${{ github.event.pull_request.head.sha || github.sha }}
372
- BEFORE_SHA: ${{ github.event.before }}
373
- run: node "$RUNNER_TEMP/code-foundry/src/runtime.mjs" ci should_run eval >> "$GITHUB_OUTPUT"
374
308
  - name: Setup eval
375
309
  if: ${{ !cancelled() && inputs.mode == 'audit' && steps.eval_applicability.outputs.applicable == 'true' && steps.eval_applicability.outputs.affected != 'false' }}
376
310
  uses: ./.github/actions/setup
@@ -380,99 +314,196 @@ jobs:
380
314
  install: 'true'
381
315
  cache-build: 'true'
382
316
  task: eval
383
- - name: Eval
384
- id: eval_execute
385
- if: ${{ !cancelled() && inputs.mode == 'audit' && steps.eval_applicability.outputs.applicable == 'true' && steps.eval_applicability.outputs.affected != 'false' }}
386
- run: node "$RUNNER_TEMP/code-foundry/src/runtime.mjs" ci eval
387
- - name: Retain eval task receipt
388
- if: >-
389
- always() &&
390
- inputs.mode == 'audit' &&
391
- (steps.eval_execute.outcome == 'success' || steps.eval_execute.outcome == 'failure' ||
392
- steps.eval_applicability.outputs.applicable == 'false' || steps.eval_applicability.outputs.affected == 'false') &&
393
- hashFiles('.code-foundry/results/eval.json') != ''
394
- uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
395
- with:
396
- name: ${{ inputs.artifact-prefix }}-${{ github.run_id }}-${{ github.run_attempt }}-eval
397
- path: .code-foundry/results/eval.json
398
- include-hidden-files: true
399
- if-no-files-found: error
400
- retention-days: 14
401
- - name: Retain eval report
402
- if: >-
403
- always() &&
404
- inputs.mode == 'audit' &&
405
- steps.eval_execute.outcome == 'failure' &&
406
- hashFiles('eval-results/result.json') != ''
407
- uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
408
- with:
409
- name: ${{ inputs.artifact-prefix }}-${{ github.run_id }}-${{ github.run_attempt }}-eval-report
410
- path: |
411
- eval-results/result.json
412
- eval-results/summary.json
413
- if-no-files-found: error
414
- retention-days: 14
415
-
416
- lint:
417
- name: Lint
418
- if: vars.CI_BILLING_PAUSED != 'true'
419
- runs-on: ${{ inputs.ci-runner }}
420
- timeout-minutes: 30
421
- steps:
422
- - name: Checkout
423
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
424
- with:
425
- persist-credentials: false
426
- - name: Runtime
427
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
428
- with:
429
- persist-credentials: false
430
- repository: ${{ inputs.runtime-repository }}
431
- ref: ${{ inputs.runtime-ref }}
432
- path: .github/.code-foundry
433
- sparse-checkout: |
434
- .github/actions
435
- src/lib
436
- src/runtime-core.mjs
437
- src/runtime.mjs
438
- - name: Install runtime
439
- run: |
440
- mkdir -p .github/actions
441
- mv .github/.code-foundry "$RUNNER_TEMP/code-foundry"
442
- cp -R "$RUNNER_TEMP/code-foundry/.github/actions/." .github/actions/
443
- - name: Detect
444
- id: applicability
445
- env:
446
- EVENT_NAME: ${{ github.event_name }}
447
- BASE_REF: ${{ github.event.pull_request.base.ref }}
448
- BASE_SHA: ${{ github.event.pull_request.base.sha }}
449
- HEAD_SHA: ${{ github.event.pull_request.head.sha || github.sha }}
450
- BEFORE_SHA: ${{ github.event.before }}
451
- run: node "$RUNNER_TEMP/code-foundry/src/runtime.mjs" ci should_run lint >> "$GITHUB_OUTPUT"
452
- - name: Setup
453
- if: steps.applicability.outputs.applicable == 'true' && steps.applicability.outputs.affected != 'false'
317
+ - name: Setup lint
318
+ if: ${{ !cancelled() && steps.lint_applicability.outputs.applicable == 'true' && steps.lint_applicability.outputs.affected != 'false' }}
454
319
  uses: ./.github/actions/setup
455
320
  with:
456
321
  install: 'true'
457
322
  cache-lint: 'true'
458
323
  task: lint
459
- - name: Lint
460
- id: execute
461
- if: steps.applicability.outputs.applicable == 'true' && steps.applicability.outputs.affected != 'false'
462
- run: node "$RUNNER_TEMP/code-foundry/src/runtime.mjs" ci lint
463
- - name: Retain task receipt
464
- if: >-
465
- always() &&
466
- (steps.execute.outcome == 'success' || steps.execute.outcome == 'failure' ||
467
- steps.applicability.outputs.applicable == 'false' || steps.applicability.outputs.affected == 'false') &&
468
- hashFiles('.code-foundry/results/lint.json') != ''
469
- uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
324
+ - name: Setup integration
325
+ if: ${{ !cancelled() && inputs.mode == 'audit' && steps.integration_applicability.outputs.applicable == 'true' && steps.integration_applicability.outputs.affected != 'false' }}
326
+ uses: ./.github/actions/setup
470
327
  with:
471
- name: ${{ inputs.artifact-prefix }}-${{ github.run_id }}-${{ github.run_attempt }}-lint
472
- path: .code-foundry/results/lint.json
473
- include-hidden-files: true
474
- if-no-files-found: error
475
- retention-days: 14
328
+ install: true
329
+ install-javascript: ${{ steps.integration_applicability.outputs.javascript == 'true' }}
330
+ install-python: ${{ steps.integration_applicability.outputs.python == 'true' }}
331
+ install-rust: ${{ steps.integration_applicability.outputs.rust == 'true' }}
332
+ cache-build: ${{ steps.integration_applicability.outputs.rust == 'true' }}
333
+ cache-environment: false
334
+ cache-save: ${{ github.event_name == 'push' }}
335
+ cache-packages: ${{ vars.REPO_FOUNDRY_CACHE_PACKAGES || 'auto' }}
336
+ task: integration
337
+ task-javascript: ${{ steps.integration_applicability.outputs.javascript }}
338
+ task-python: ${{ steps.integration_applicability.outputs.python }}
339
+ task-rust: ${{ steps.integration_applicability.outputs.rust }}
340
+ - parallel:
341
+ # --- Format execute ---
342
+ - name: Format
343
+ id: format_execute
344
+ if: steps.format_applicability.outputs.applicable == 'true' && steps.format_applicability.outputs.affected != 'false'
345
+ run: node "$RUNNER_TEMP/code-foundry/src/runtime.mjs" ci format
346
+ # --- Build execute ---
347
+ - name: Build
348
+ id: build_execute
349
+ if: ${{ !cancelled() && steps.build_applicability.outputs.applicable == 'true' && steps.build_applicability.outputs.affected != 'false' }}
350
+ env:
351
+ NEXTAUTH_SECRET: ${{ secrets.NEXTAUTH_SECRET || 'code-foundry-ci-placeholder-0123456789' }}
352
+ run: node "$RUNNER_TEMP/code-foundry/src/runtime.mjs" ci build
353
+ # --- Performance execute ---
354
+ - name: Performance
355
+ id: performance_execute
356
+ if: ${{ !cancelled() && inputs.mode == 'audit' && steps.performance_applicability.outputs.applicable == 'true' && steps.performance_applicability.outputs.affected != 'false' }}
357
+ run: node "$RUNNER_TEMP/code-foundry/src/runtime.mjs" ci performance
358
+ # --- Smoke execute ---
359
+ - name: Smoke
360
+ id: smoke_execute
361
+ if: ${{ !cancelled() && inputs.mode == 'audit' && steps.smoke_applicability.outputs.applicable == 'true' && steps.smoke_applicability.outputs.affected != 'false' }}
362
+ run: node "$RUNNER_TEMP/code-foundry/src/runtime.mjs" ci smoke
363
+ # --- Eval execute ---
364
+ - name: Eval
365
+ id: eval_execute
366
+ if: ${{ !cancelled() && inputs.mode == 'audit' && steps.eval_applicability.outputs.applicable == 'true' && steps.eval_applicability.outputs.affected != 'false' }}
367
+ run: node "$RUNNER_TEMP/code-foundry/src/runtime.mjs" ci eval
368
+ # --- Lint execute ---
369
+ - name: Lint
370
+ id: lint_execute
371
+ if: ${{ !cancelled() && steps.lint_applicability.outputs.applicable == 'true' && steps.lint_applicability.outputs.affected != 'false' }}
372
+ run: node "$RUNNER_TEMP/code-foundry/src/runtime.mjs" ci lint
373
+ # --- Integration execute ---
374
+ - name: Integration
375
+ id: integration_execute
376
+ if: ${{ !cancelled() && inputs.mode == 'audit' && steps.integration_applicability.outputs.applicable == 'true' && steps.integration_applicability.outputs.affected != 'false' }}
377
+ run: node "$RUNNER_TEMP/code-foundry/src/runtime.mjs" ci integration
378
+ # Receipts are independent artifact uploads; a second parallel
379
+ # group joins them instead of serializing 8+ uploads after the
380
+ # executes.
381
+ - parallel:
382
+ - name: Retain format task receipt
383
+ if: >-
384
+ always() &&
385
+ (steps.format_execute.outcome == 'success' || steps.format_execute.outcome == 'failure' ||
386
+ steps.format_applicability.outputs.applicable == 'false' || steps.format_applicability.outputs.affected == 'false') &&
387
+ hashFiles('.code-foundry/results/format.json') != ''
388
+ uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
389
+ with:
390
+ name: ${{ inputs.artifact-prefix }}-${{ github.run_id }}-${{ github.run_attempt }}-format
391
+ path: .code-foundry/results/format.json
392
+ include-hidden-files: true
393
+ if-no-files-found: error
394
+ retention-days: 14
395
+ - name: Retain build task receipt
396
+ if: >-
397
+ always() &&
398
+ (steps.build_execute.outcome == 'success' || steps.build_execute.outcome == 'failure' ||
399
+ steps.build_applicability.outputs.applicable == 'false' || steps.build_applicability.outputs.affected == 'false') &&
400
+ hashFiles('.code-foundry/results/build.json') != ''
401
+ uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
402
+ with:
403
+ name: ${{ inputs.artifact-prefix }}-${{ github.run_id }}-${{ github.run_attempt }}-build
404
+ path: .code-foundry/results/build.json
405
+ include-hidden-files: true
406
+ if-no-files-found: error
407
+ retention-days: 14
408
+ - name: Retain performance task receipt
409
+ if: >-
410
+ always() &&
411
+ inputs.mode == 'audit' &&
412
+ (steps.performance_execute.outcome == 'success' || steps.performance_execute.outcome == 'failure' ||
413
+ steps.performance_applicability.outputs.applicable == 'false' || steps.performance_applicability.outputs.affected == 'false') &&
414
+ hashFiles('.code-foundry/results/performance.json') != ''
415
+ uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
416
+ with:
417
+ name: ${{ inputs.artifact-prefix }}-${{ github.run_id }}-${{ github.run_attempt }}-performance
418
+ path: .code-foundry/results/performance.json
419
+ include-hidden-files: true
420
+ if-no-files-found: error
421
+ retention-days: 14
422
+ - name: Upload performance results
423
+ if: >-
424
+ always() &&
425
+ inputs.mode == 'audit' &&
426
+ steps.performance_applicability.outputs.applicable == 'true' &&
427
+ hashFiles('artifacts/performance/**', 'performance-results.json', 'performance-results/**') != ''
428
+ uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
429
+ with:
430
+ name: performance-${{ github.run_id }}
431
+ path: |
432
+ artifacts/performance/**
433
+ performance-results.json
434
+ performance-results/**
435
+ compression-level: 1
436
+ if-no-files-found: ignore
437
+ retention-days: 14
438
+ - name: Retain smoke task receipt
439
+ if: >-
440
+ always() &&
441
+ inputs.mode == 'audit' &&
442
+ (steps.smoke_execute.outcome == 'success' || steps.smoke_execute.outcome == 'failure' ||
443
+ steps.smoke_applicability.outputs.applicable == 'false' || steps.smoke_applicability.outputs.affected == 'false') &&
444
+ hashFiles('.code-foundry/results/smoke.json') != ''
445
+ uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
446
+ with:
447
+ name: ${{ inputs.artifact-prefix }}-${{ github.run_id }}-${{ github.run_attempt }}-smoke
448
+ path: .code-foundry/results/smoke.json
449
+ include-hidden-files: true
450
+ if-no-files-found: error
451
+ retention-days: 14
452
+ - name: Retain eval task receipt
453
+ if: >-
454
+ always() &&
455
+ inputs.mode == 'audit' &&
456
+ (steps.eval_execute.outcome == 'success' || steps.eval_execute.outcome == 'failure' ||
457
+ steps.eval_applicability.outputs.applicable == 'false' || steps.eval_applicability.outputs.affected == 'false') &&
458
+ hashFiles('.code-foundry/results/eval.json') != ''
459
+ uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
460
+ with:
461
+ name: ${{ inputs.artifact-prefix }}-${{ github.run_id }}-${{ github.run_attempt }}-eval
462
+ path: .code-foundry/results/eval.json
463
+ include-hidden-files: true
464
+ if-no-files-found: error
465
+ retention-days: 14
466
+ - name: Retain eval report
467
+ if: >-
468
+ always() &&
469
+ inputs.mode == 'audit' &&
470
+ steps.eval_execute.outcome == 'failure' &&
471
+ hashFiles('eval-results/result.json') != ''
472
+ uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
473
+ with:
474
+ name: ${{ inputs.artifact-prefix }}-${{ github.run_id }}-${{ github.run_attempt }}-eval-report
475
+ path: |
476
+ eval-results/result.json
477
+ eval-results/summary.json
478
+ if-no-files-found: error
479
+ retention-days: 14
480
+ - name: Retain lint task receipt
481
+ if: >-
482
+ always() &&
483
+ (steps.lint_execute.outcome == 'success' || steps.lint_execute.outcome == 'failure' ||
484
+ steps.lint_applicability.outputs.applicable == 'false' || steps.lint_applicability.outputs.affected == 'false') &&
485
+ hashFiles('.code-foundry/results/lint.json') != ''
486
+ uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
487
+ with:
488
+ name: ${{ inputs.artifact-prefix }}-${{ github.run_id }}-${{ github.run_attempt }}-lint
489
+ path: .code-foundry/results/lint.json
490
+ include-hidden-files: true
491
+ if-no-files-found: error
492
+ retention-days: 14
493
+ - name: Retain integration task receipt
494
+ if: >-
495
+ always() &&
496
+ inputs.mode == 'audit' &&
497
+ (steps.integration_execute.outcome == 'success' || steps.integration_execute.outcome == 'failure' ||
498
+ steps.integration_applicability.outputs.applicable == 'false' || steps.integration_applicability.outputs.affected == 'false') &&
499
+ hashFiles('.code-foundry/results/integration.json') != ''
500
+ uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
501
+ with:
502
+ name: ${{ inputs.artifact-prefix }}-${{ github.run_id }}-${{ github.run_attempt }}-integration
503
+ path: .code-foundry/results/integration.json
504
+ include-hidden-files: true
505
+ if-no-files-found: error
506
+ retention-days: 14
476
507
 
477
508
  type-check:
478
509
  name: Type-Check
@@ -621,76 +652,6 @@ jobs:
621
652
  if-no-files-found: ignore
622
653
  retention-days: 14
623
654
 
624
- integration:
625
- name: Integration
626
- if: vars.CI_BILLING_PAUSED != 'true' && inputs.mode == 'audit'
627
- runs-on: ${{ inputs.test-runner }}
628
- timeout-minutes: 30
629
- steps:
630
- - name: Checkout
631
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
632
- with:
633
- persist-credentials: false
634
- fetch-depth: 2
635
- - name: Runtime
636
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
637
- with:
638
- persist-credentials: false
639
- repository: ${{ inputs.runtime-repository }}
640
- ref: ${{ inputs.runtime-ref }}
641
- path: .github/.code-foundry
642
- sparse-checkout: |
643
- .github/actions
644
- src/lib
645
- src/runtime-core.mjs
646
- src/runtime.mjs
647
- - name: Install runtime
648
- run: |
649
- mkdir -p .github/actions
650
- mv .github/.code-foundry "$RUNNER_TEMP/code-foundry"
651
- cp -R "$RUNNER_TEMP/code-foundry/.github/actions/." .github/actions/
652
- - name: Detect
653
- id: applicability
654
- env:
655
- EVENT_NAME: ${{ github.event_name }}
656
- BASE_REF: ${{ github.event.pull_request.base.ref }}
657
- BASE_SHA: ${{ github.event.pull_request.base.sha }}
658
- HEAD_SHA: ${{ github.event.pull_request.head.sha || github.sha }}
659
- BEFORE_SHA: ${{ github.event.before }}
660
- run: node "$RUNNER_TEMP/code-foundry/src/runtime.mjs" ci task_profile integration >> "$GITHUB_OUTPUT"
661
- - name: Setup
662
- if: steps.applicability.outputs.applicable == 'true' && steps.applicability.outputs.affected != 'false'
663
- uses: ./.github/actions/setup
664
- with:
665
- install: true
666
- install-javascript: ${{ steps.applicability.outputs.javascript == 'true' }}
667
- install-python: ${{ steps.applicability.outputs.python == 'true' }}
668
- install-rust: ${{ steps.applicability.outputs.rust == 'true' }}
669
- cache-build: ${{ steps.applicability.outputs.rust == 'true' }}
670
- cache-environment: false
671
- cache-save: ${{ github.event_name == 'push' }}
672
- task: integration
673
- task-javascript: ${{ steps.applicability.outputs.javascript }}
674
- task-python: ${{ steps.applicability.outputs.python }}
675
- task-rust: ${{ steps.applicability.outputs.rust }}
676
- - name: Integration
677
- id: execute
678
- if: steps.applicability.outputs.applicable == 'true' && steps.applicability.outputs.affected != 'false'
679
- run: node "$RUNNER_TEMP/code-foundry/src/runtime.mjs" ci integration
680
- - name: Retain task receipt
681
- if: >-
682
- always() &&
683
- (steps.execute.outcome == 'success' || steps.execute.outcome == 'failure' ||
684
- steps.applicability.outputs.applicable == 'false' || steps.applicability.outputs.affected == 'false') &&
685
- hashFiles('.code-foundry/results/integration.json') != ''
686
- uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
687
- with:
688
- name: ${{ inputs.artifact-prefix }}-${{ github.run_id }}-${{ github.run_attempt }}-integration
689
- path: .code-foundry/results/integration.json
690
- include-hidden-files: true
691
- if-no-files-found: error
692
- retention-days: 14
693
-
694
655
  e2e:
695
656
  name: E2E
696
657
  if: vars.CI_BILLING_PAUSED != 'true' && inputs.mode == 'audit'
@@ -1113,7 +1074,7 @@ jobs:
1113
1074
  # evaluateValidationGate's mode truth table is reused unchanged.
1114
1075
  gate:
1115
1076
  name: Gate
1116
- needs: [fast-lanes, lint, type-check, unit, integration, e2e, audit, codeql]
1077
+ needs: [fast-lanes, type-check, unit, e2e, audit, codeql]
1117
1078
  if: vars.CI_BILLING_PAUSED != 'true' && always()
1118
1079
  runs-on: ubuntu-slim
1119
1080
  timeout-minutes: 10
@@ -1121,12 +1082,12 @@ jobs:
1121
1082
  FOUNDRY_MODE: ${{ inputs.mode }}
1122
1083
  # CI category: lint and type-check always run; the merged fast-lanes job
1123
1084
  # carries the format and build lanes.
1124
- FOUNDRY_CI: ${{ (needs.lint.result != 'success' && needs.lint.result) || (needs.type-check.result != 'success' && needs.type-check.result) || (needs.fast-lanes.result != 'success' && needs.fast-lanes.result) || 'success' }}
1085
+ FOUNDRY_CI: ${{ (needs.type-check.result != 'success' && needs.type-check.result) || (needs.fast-lanes.result != 'success' && needs.fast-lanes.result) || 'success' }}
1125
1086
  # Test category: unit always runs and must succeed; integration and e2e
1126
1087
  # are audit-tier jobs whose expected skip on fast/release is not a
1127
1088
  # failure; the merged fast-lanes job carries performance, smoke, and
1128
1089
  # eval-mode lanes, so its result joins the category too.
1129
- FOUNDRY_TEST: ${{ needs.unit.result == 'success' && needs.fast-lanes.result == 'success' && (needs.integration.result == 'success' || needs.integration.result == 'skipped') && (needs.e2e.result == 'success' || needs.e2e.result == 'skipped') && 'success' || ((needs.integration.result != 'success' && needs.integration.result != 'skipped' && needs.integration.result) || (needs.e2e.result != 'success' && needs.e2e.result != 'skipped' && needs.e2e.result) || (needs.unit.result != 'success' && needs.unit.result) || (needs.fast-lanes.result != 'success' && needs.fast-lanes.result) || 'failure') }}
1090
+ FOUNDRY_TEST: ${{ needs.unit.result == 'success' && needs.fast-lanes.result == 'success' && (needs.e2e.result == 'success' || needs.e2e.result == 'skipped') && 'success' || ((needs.e2e.result != 'success' && needs.e2e.result != 'skipped' && needs.e2e.result) || (needs.unit.result != 'success' && needs.unit.result) || (needs.fast-lanes.result != 'success' && needs.fast-lanes.result) || 'failure') }}
1130
1091
  FOUNDRY_SECURITY: ${{ needs.audit.result }}
1131
1092
  # This orchestrator runs CodeQL only when the consumer's canonical
1132
1093
  # configuration enables it; otherwise the unavailability decision is
package/CHANGELOG.md CHANGED
@@ -1,5 +1,26 @@
1
1
  # Changelog
2
2
 
3
+ ## [1.46.2](https://github.com/0xPlayerOne/code-foundry/compare/v1.46.1...v1.46.2) (2026-10-07)
4
+
5
+
6
+ ### Bug Fixes
7
+
8
+ * **billing:** join fast-lane receipts in a second parallel group ([#742](https://github.com/0xPlayerOne/code-foundry/issues/742)) ([c63a39c](https://github.com/0xPlayerOne/code-foundry/commit/c63a39cf5e236d6747bd85cf10b04bd10f690b11))
9
+
10
+ ## [1.46.1](https://github.com/0xPlayerOne/code-foundry/compare/v1.46.0...v1.46.1) (2026-10-07)
11
+
12
+
13
+ ### Bug Fixes
14
+
15
+ * **qualification:** skip parallel-syntax files until actionlint supports them ([#740](https://github.com/0xPlayerOne/code-foundry/issues/740)) ([db98c7f](https://github.com/0xPlayerOne/code-foundry/commit/db98c7f40cae080cdc9dcab7baac4976e5e0656e))
16
+
17
+ ## [1.46.0](https://github.com/0xPlayerOne/code-foundry/compare/v1.45.2...v1.46.0) (2026-10-07)
18
+
19
+
20
+ ### Features
21
+
22
+ * **billing:** run fast-lane executes concurrently ([#738](https://github.com/0xPlayerOne/code-foundry/issues/738)) ([b40e82a](https://github.com/0xPlayerOne/code-foundry/commit/b40e82a0709b288a8be46998cfdc8b909f92c23c))
23
+
3
24
  ## [1.45.2](https://github.com/0xPlayerOne/code-foundry/compare/v1.45.1...v1.45.2) (2026-10-06)
4
25
 
5
26
 
@@ -119,35 +140,9 @@
119
140
 
120
141
  * **release:** make batched publication and stable promotion reliable ([#703](https://github.com/0xPlayerOne/code-foundry/issues/703)) ([271731d](https://github.com/0xPlayerOne/code-foundry/commit/271731d8fac3bff42a99b3d5f4a774eccc0a7788))
121
142
 
122
- ## [1.43.0](https://github.com/0xPlayerOne/code-foundry/compare/v1.42.0...v1.43.0) (2026-10-03)
123
-
124
-
125
- ### Features
126
-
127
- * release-batching ([#700](https://github.com/0xPlayerOne/code-foundry/issues/700)) ([3dd5c5f](https://github.com/0xPlayerOne/code-foundry/commit/3dd5c5fd50883608baa3e2f9daef6b8aa83f269f))
128
-
129
- ## [1.42.0](https://github.com/0xPlayerOne/code-foundry/compare/v1.41.0...v1.42.0) (2026-10-02)
130
-
131
-
132
- ### Features
133
-
134
- * **validation:** shard the managed E2E lane via e2e_shards ([#697](https://github.com/0xPlayerOne/code-foundry/issues/697)) ([edb20b4](https://github.com/0xPlayerOne/code-foundry/commit/edb20b4e32e2055bf22e6f6f94b51f234a24687d))
135
-
136
- ## [1.41.0](https://github.com/0xPlayerOne/code-foundry/compare/v1.40.0...v1.41.0) (2026-10-02)
137
-
138
-
139
- ### Features
140
-
141
- * **validation:** skip default-branch CodeQL on release-please merges ([#694](https://github.com/0xPlayerOne/code-foundry/issues/694)) ([25fc22e](https://github.com/0xPlayerOne/code-foundry/commit/25fc22e6d4b76f0b7e06601f6dc420085949f127))
142
-
143
-
144
- ### Bug Fixes
145
-
146
- * give the release artifact budgets several releases of headroom ([#696](https://github.com/0xPlayerOne/code-foundry/issues/696)) ([a504607](https://github.com/0xPlayerOne/code-foundry/commit/a504607e16f097a5075191fd24cb26953b06a340))
147
-
148
143
  <!-- code-foundry: packaged changelog -->
149
144
 
150
145
  ---
151
146
 
152
- This packaged changelog lists the 20 most recent releases; 234 older releases are omitted to keep the package small.
147
+ This packaged changelog lists the 20 most recent releases; 237 older releases are omitted to keep the package small.
153
148
  See the [full changelog](https://github.com/0xPlayerOne/code-foundry/blob/main/CHANGELOG.md) for the complete history.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "code-foundry",
3
- "version": "1.45.2",
3
+ "version": "1.46.2",
4
4
  "description": "A fast, language-aware repository factory for agent-ready workflows, testing, security, and release automation.",
5
5
  "homepage": "https://github.com/0xPlayerOne/code-foundry#readme",
6
6
  "bugs": {
@@ -157,8 +157,16 @@ function lintContracts(consumer, candidate, destination, actionlint, version) {
157
157
  paths.push(target)
158
158
  }
159
159
  // Check all candidate callees as well as rendered callers, without executing them.
160
- const workflows = readdirSync(join(destination, '.github/workflows')).filter((name) =>
161
- /\.ya?ml$/.test(name)
160
+ // actionlint v1.7.12 (still the latest release as of 2026-10-07) predates
161
+ // the June 2026 step parallelism keywords (background/wait/wait-all/
162
+ // cancel/parallel), so files using them are excluded from this pass until
163
+ // actionlint ships support — GitHub's own loader accepts the syntax, which
164
+ // is verified by live runs and pinned in test/billing-lanes.test.mjs.
165
+ // Restore the removal of this exclusion when rhysd/actionlint releases
166
+ // post-parallel support.
167
+ const actionlintPendingParallelSyntax = new Set(['validation-billing.yml'])
168
+ const workflows = readdirSync(join(destination, '.github/workflows')).filter(
169
+ (name) => /\.ya?ml$/.test(name) && !actionlintPendingParallelSyntax.has(name)
162
170
  )
163
171
  run(
164
172
  actionlint,