code-foundry 1.45.2 → 1.46.1

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,10 +289,118 @@ 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
292
+ - name: Setup smoke
293
+ if: ${{ !cancelled() && inputs.mode == 'audit' && steps.smoke_applicability.outputs.applicable == 'true' && steps.smoke_applicability.outputs.affected != 'false' }}
294
+ uses: ./.github/actions/setup
295
+ with:
296
+ install: true
297
+ install-javascript: ${{ steps.smoke_applicability.outputs.javascript == 'true' }}
298
+ install-python: ${{ steps.smoke_applicability.outputs.python == 'true' }}
299
+ install-rust: ${{ steps.smoke_applicability.outputs.rust == 'true' }}
300
+ cache-build: false
301
+ cache-environment: false
302
+ cache-save: ${{ github.event_name == 'push' }}
303
+ cache-packages: ${{ vars.REPO_FOUNDRY_CACHE_PACKAGES || 'auto' }}
304
+ task: smoke
305
+ task-javascript: ${{ steps.smoke_applicability.outputs.javascript }}
306
+ task-python: ${{ steps.smoke_applicability.outputs.python }}
307
+ task-rust: ${{ steps.smoke_applicability.outputs.rust }}
308
+ - name: Setup eval
309
+ if: ${{ !cancelled() && inputs.mode == 'audit' && steps.eval_applicability.outputs.applicable == 'true' && steps.eval_applicability.outputs.affected != 'false' }}
310
+ uses: ./.github/actions/setup
311
+ with:
312
+ # Eval harnesses run through the repository's own package scripts and
313
+ # need their dependencies installed before the task executes.
314
+ install: 'true'
315
+ cache-build: 'true'
316
+ task: eval
317
+ - name: Setup lint
318
+ if: ${{ !cancelled() && steps.lint_applicability.outputs.applicable == 'true' && steps.lint_applicability.outputs.affected != 'false' }}
319
+ uses: ./.github/actions/setup
320
+ with:
321
+ install: 'true'
322
+ cache-lint: 'true'
323
+ task: lint
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
327
+ with:
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
+ - name: Retain format task receipt
379
+ if: >-
380
+ always() &&
381
+ (steps.format_execute.outcome == 'success' || steps.format_execute.outcome == 'failure' ||
382
+ steps.format_applicability.outputs.applicable == 'false' || steps.format_applicability.outputs.affected == 'false') &&
383
+ hashFiles('.code-foundry/results/format.json') != ''
384
+ uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
385
+ with:
386
+ name: ${{ inputs.artifact-prefix }}-${{ github.run_id }}-${{ github.run_attempt }}-format
387
+ path: .code-foundry/results/format.json
388
+ include-hidden-files: true
389
+ if-no-files-found: error
390
+ retention-days: 14
391
+ - name: Retain build task receipt
392
+ if: >-
393
+ always() &&
394
+ (steps.build_execute.outcome == 'success' || steps.build_execute.outcome == 'failure' ||
395
+ steps.build_applicability.outputs.applicable == 'false' || steps.build_applicability.outputs.affected == 'false') &&
396
+ hashFiles('.code-foundry/results/build.json') != ''
397
+ uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
398
+ with:
399
+ name: ${{ inputs.artifact-prefix }}-${{ github.run_id }}-${{ github.run_attempt }}-build
400
+ path: .code-foundry/results/build.json
401
+ include-hidden-files: true
402
+ if-no-files-found: error
403
+ retention-days: 14
288
404
  - name: Retain performance task receipt
289
405
  if: >-
290
406
  always() &&
@@ -315,37 +431,6 @@ jobs:
315
431
  compression-level: 1
316
432
  if-no-files-found: ignore
317
433
  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
- - name: Setup smoke
330
- if: ${{ !cancelled() && inputs.mode == 'audit' && steps.smoke_applicability.outputs.applicable == 'true' && steps.smoke_applicability.outputs.affected != 'false' }}
331
- uses: ./.github/actions/setup
332
- with:
333
- install: true
334
- install-javascript: ${{ steps.smoke_applicability.outputs.javascript == 'true' }}
335
- install-python: ${{ steps.smoke_applicability.outputs.python == 'true' }}
336
- install-rust: ${{ steps.smoke_applicability.outputs.rust == 'true' }}
337
- cache-build: false
338
- cache-environment: false
339
- cache-save: ${{ github.event_name == 'push' }}
340
- cache-packages: ${{ vars.REPO_FOUNDRY_CACHE_PACKAGES || 'auto' }}
341
- task: smoke
342
- task-javascript: ${{ steps.smoke_applicability.outputs.javascript }}
343
- task-python: ${{ steps.smoke_applicability.outputs.python }}
344
- 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
434
  - name: Retain smoke task receipt
350
435
  if: >-
351
436
  always() &&
@@ -360,30 +445,6 @@ jobs:
360
445
  include-hidden-files: true
361
446
  if-no-files-found: error
362
447
  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
- - name: Setup eval
375
- if: ${{ !cancelled() && inputs.mode == 'audit' && steps.eval_applicability.outputs.applicable == 'true' && steps.eval_applicability.outputs.affected != 'false' }}
376
- uses: ./.github/actions/setup
377
- with:
378
- # Eval harnesses run through the repository's own package scripts and
379
- # need their dependencies installed before the task executes.
380
- install: 'true'
381
- cache-build: 'true'
382
- 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
448
  - name: Retain eval task receipt
388
449
  if: >-
389
450
  always() &&
@@ -412,59 +473,11 @@ jobs:
412
473
  eval-results/summary.json
413
474
  if-no-files-found: error
414
475
  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'
454
- uses: ./.github/actions/setup
455
- with:
456
- install: 'true'
457
- cache-lint: 'true'
458
- 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
476
+ - name: Retain lint task receipt
464
477
  if: >-
465
478
  always() &&
466
- (steps.execute.outcome == 'success' || steps.execute.outcome == 'failure' ||
467
- steps.applicability.outputs.applicable == 'false' || steps.applicability.outputs.affected == 'false') &&
479
+ (steps.lint_execute.outcome == 'success' || steps.lint_execute.outcome == 'failure' ||
480
+ steps.lint_applicability.outputs.applicable == 'false' || steps.lint_applicability.outputs.affected == 'false') &&
468
481
  hashFiles('.code-foundry/results/lint.json') != ''
469
482
  uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
470
483
  with:
@@ -473,7 +486,20 @@ jobs:
473
486
  include-hidden-files: true
474
487
  if-no-files-found: error
475
488
  retention-days: 14
476
-
489
+ - name: Retain integration task receipt
490
+ if: >-
491
+ always() &&
492
+ inputs.mode == 'audit' &&
493
+ (steps.integration_execute.outcome == 'success' || steps.integration_execute.outcome == 'failure' ||
494
+ steps.integration_applicability.outputs.applicable == 'false' || steps.integration_applicability.outputs.affected == 'false') &&
495
+ hashFiles('.code-foundry/results/integration.json') != ''
496
+ uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
497
+ with:
498
+ name: ${{ inputs.artifact-prefix }}-${{ github.run_id }}-${{ github.run_attempt }}-integration
499
+ path: .code-foundry/results/integration.json
500
+ include-hidden-files: true
501
+ if-no-files-found: error
502
+ retention-days: 14
477
503
  type-check:
478
504
  name: Type-Check
479
505
  if: vars.CI_BILLING_PAUSED != 'true'
@@ -621,76 +647,6 @@ jobs:
621
647
  if-no-files-found: ignore
622
648
  retention-days: 14
623
649
 
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
650
  e2e:
695
651
  name: E2E
696
652
  if: vars.CI_BILLING_PAUSED != 'true' && inputs.mode == 'audit'
@@ -1113,7 +1069,7 @@ jobs:
1113
1069
  # evaluateValidationGate's mode truth table is reused unchanged.
1114
1070
  gate:
1115
1071
  name: Gate
1116
- needs: [fast-lanes, lint, type-check, unit, integration, e2e, audit, codeql]
1072
+ needs: [fast-lanes, type-check, unit, e2e, audit, codeql]
1117
1073
  if: vars.CI_BILLING_PAUSED != 'true' && always()
1118
1074
  runs-on: ubuntu-slim
1119
1075
  timeout-minutes: 10
@@ -1121,12 +1077,12 @@ jobs:
1121
1077
  FOUNDRY_MODE: ${{ inputs.mode }}
1122
1078
  # CI category: lint and type-check always run; the merged fast-lanes job
1123
1079
  # 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' }}
1080
+ FOUNDRY_CI: ${{ (needs.type-check.result != 'success' && needs.type-check.result) || (needs.fast-lanes.result != 'success' && needs.fast-lanes.result) || 'success' }}
1125
1081
  # Test category: unit always runs and must succeed; integration and e2e
1126
1082
  # are audit-tier jobs whose expected skip on fast/release is not a
1127
1083
  # failure; the merged fast-lanes job carries performance, smoke, and
1128
1084
  # 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') }}
1085
+ 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
1086
  FOUNDRY_SECURITY: ${{ needs.audit.result }}
1131
1087
  # This orchestrator runs CodeQL only when the consumer's canonical
1132
1088
  # configuration enables it; otherwise the unavailability decision is
package/CHANGELOG.md CHANGED
@@ -1,5 +1,19 @@
1
1
  # Changelog
2
2
 
3
+ ## [1.46.1](https://github.com/0xPlayerOne/code-foundry/compare/v1.46.0...v1.46.1) (2026-10-07)
4
+
5
+
6
+ ### Bug Fixes
7
+
8
+ * **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))
9
+
10
+ ## [1.46.0](https://github.com/0xPlayerOne/code-foundry/compare/v1.45.2...v1.46.0) (2026-10-07)
11
+
12
+
13
+ ### Features
14
+
15
+ * **billing:** run fast-lane executes concurrently ([#738](https://github.com/0xPlayerOne/code-foundry/issues/738)) ([b40e82a](https://github.com/0xPlayerOne/code-foundry/commit/b40e82a0709b288a8be46998cfdc8b909f92c23c))
16
+
3
17
  ## [1.45.2](https://github.com/0xPlayerOne/code-foundry/compare/v1.45.1...v1.45.2) (2026-10-06)
4
18
 
5
19
 
@@ -126,28 +140,9 @@
126
140
 
127
141
  * release-batching ([#700](https://github.com/0xPlayerOne/code-foundry/issues/700)) ([3dd5c5f](https://github.com/0xPlayerOne/code-foundry/commit/3dd5c5fd50883608baa3e2f9daef6b8aa83f269f))
128
142
 
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; 236 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.1",
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,