code-foundry 1.20.1 → 1.20.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.
@@ -18,6 +18,11 @@ on:
18
18
  required: false
19
19
  type: string
20
20
  default: ubuntu-latest
21
+ artifact-prefix:
22
+ description: Prefix for task receipts; use a unique value when calling this workflow more than once.
23
+ required: false
24
+ type: string
25
+ default: task-result
21
26
  secrets:
22
27
  TURBO_TOKEN:
23
28
  required: false
@@ -86,8 +91,22 @@ jobs:
86
91
  cache-build: 'false'
87
92
  task: format
88
93
  - name: Format
94
+ id: execute
89
95
  if: steps.applicability.outputs.applicable == 'true'
90
96
  run: node "$RUNNER_TEMP/code-foundry/src/runtime.mjs" ci format
97
+ - name: Retain task receipt
98
+ if: >-
99
+ always() &&
100
+ (steps.execute.outcome == 'success' || steps.execute.outcome == 'failure' ||
101
+ steps.applicability.outputs.applicable == 'false') &&
102
+ hashFiles('.code-foundry/results/format.json') != ''
103
+ uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
104
+ with:
105
+ name: ${{ inputs.artifact-prefix }}-${{ github.run_id }}-${{ github.run_attempt }}-format
106
+ path: .code-foundry/results/format.json
107
+ include-hidden-files: true
108
+ if-no-files-found: error
109
+ retention-days: 14
91
110
 
92
111
  lint:
93
112
  name: Lint
@@ -126,8 +145,22 @@ jobs:
126
145
  cache-lint: 'true'
127
146
  task: lint
128
147
  - name: Lint
148
+ id: execute
129
149
  if: steps.applicability.outputs.applicable == 'true'
130
150
  run: node "$RUNNER_TEMP/code-foundry/src/runtime.mjs" ci lint
151
+ - name: Retain task receipt
152
+ if: >-
153
+ always() &&
154
+ (steps.execute.outcome == 'success' || steps.execute.outcome == 'failure' ||
155
+ steps.applicability.outputs.applicable == 'false') &&
156
+ hashFiles('.code-foundry/results/lint.json') != ''
157
+ uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
158
+ with:
159
+ name: ${{ inputs.artifact-prefix }}-${{ github.run_id }}-${{ github.run_attempt }}-lint
160
+ path: .code-foundry/results/lint.json
161
+ include-hidden-files: true
162
+ if-no-files-found: error
163
+ retention-days: 14
131
164
 
132
165
  type-check:
133
166
  name: Type-Check
@@ -166,8 +199,22 @@ jobs:
166
199
  cache-build: 'true'
167
200
  task: type_check
168
201
  - name: Type-Check
202
+ id: execute
169
203
  if: steps.applicability.outputs.applicable == 'true'
170
204
  run: node "$RUNNER_TEMP/code-foundry/src/runtime.mjs" ci type_check
205
+ - name: Retain task receipt
206
+ if: >-
207
+ always() &&
208
+ (steps.execute.outcome == 'success' || steps.execute.outcome == 'failure' ||
209
+ steps.applicability.outputs.applicable == 'false') &&
210
+ hashFiles('.code-foundry/results/type_check.json') != ''
211
+ uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
212
+ with:
213
+ name: ${{ inputs.artifact-prefix }}-${{ github.run_id }}-${{ github.run_attempt }}-type_check
214
+ path: .code-foundry/results/type_check.json
215
+ include-hidden-files: true
216
+ if-no-files-found: error
217
+ retention-days: 14
171
218
 
172
219
  build:
173
220
  name: Build
@@ -211,5 +258,19 @@ jobs:
211
258
  cache-build: 'true'
212
259
  task: build
213
260
  - name: Build
261
+ id: execute
214
262
  if: steps.applicability.outputs.applicable == 'true'
215
263
  run: node "$RUNNER_TEMP/code-foundry/src/runtime.mjs" ci build
264
+ - name: Retain task receipt
265
+ if: >-
266
+ always() &&
267
+ (steps.execute.outcome == 'success' || steps.execute.outcome == 'failure' ||
268
+ steps.applicability.outputs.applicable == 'false') &&
269
+ hashFiles('.code-foundry/results/build.json') != ''
270
+ uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
271
+ with:
272
+ name: ${{ inputs.artifact-prefix }}-${{ github.run_id }}-${{ github.run_attempt }}-build
273
+ path: .code-foundry/results/build.json
274
+ include-hidden-files: true
275
+ if-no-files-found: error
276
+ retention-days: 14
@@ -33,6 +33,11 @@ on:
33
33
  required: false
34
34
  type: boolean
35
35
  default: false
36
+ artifact-prefix:
37
+ description: Prefix for task receipts; use a unique value when calling this workflow more than once.
38
+ required: false
39
+ type: string
40
+ default: task-result
36
41
  secrets:
37
42
  TURBO_TOKEN:
38
43
  required: false
@@ -104,8 +109,22 @@ jobs:
104
109
  task-python: ${{ steps.applicability.outputs.python }}
105
110
  task-rust: ${{ steps.applicability.outputs.rust }}
106
111
  - name: Unit
112
+ id: execute
107
113
  if: steps.applicability.outputs.applicable == 'true'
108
114
  run: node "$RUNNER_TEMP/code-foundry/src/runtime.mjs" ci unit
115
+ - name: Retain task receipt
116
+ if: >-
117
+ always() &&
118
+ (steps.execute.outcome == 'success' || steps.execute.outcome == 'failure' ||
119
+ steps.applicability.outputs.applicable == 'false') &&
120
+ hashFiles('.code-foundry/results/unit.json') != ''
121
+ uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
122
+ with:
123
+ name: ${{ inputs.artifact-prefix }}-${{ github.run_id }}-${{ github.run_attempt }}-unit
124
+ path: .code-foundry/results/unit.json
125
+ include-hidden-files: true
126
+ if-no-files-found: error
127
+ retention-days: 14
109
128
  - name: Upload coverage
110
129
  if: >-
111
130
  always() &&
@@ -171,8 +190,22 @@ jobs:
171
190
  task-python: ${{ steps.applicability.outputs.python }}
172
191
  task-rust: ${{ steps.applicability.outputs.rust }}
173
192
  - name: Performance
193
+ id: execute
174
194
  if: steps.applicability.outputs.applicable == 'true'
175
195
  run: node "$RUNNER_TEMP/code-foundry/src/runtime.mjs" ci performance
196
+ - name: Retain task receipt
197
+ if: >-
198
+ always() &&
199
+ (steps.execute.outcome == 'success' || steps.execute.outcome == 'failure' ||
200
+ steps.applicability.outputs.applicable == 'false') &&
201
+ hashFiles('.code-foundry/results/performance.json') != ''
202
+ uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
203
+ with:
204
+ name: ${{ inputs.artifact-prefix }}-${{ github.run_id }}-${{ github.run_attempt }}-performance
205
+ path: .code-foundry/results/performance.json
206
+ include-hidden-files: true
207
+ if-no-files-found: error
208
+ retention-days: 14
176
209
  - name: Upload performance results
177
210
  if: >-
178
211
  always() &&
@@ -236,8 +269,22 @@ jobs:
236
269
  task-python: ${{ steps.applicability.outputs.python }}
237
270
  task-rust: ${{ steps.applicability.outputs.rust }}
238
271
  - name: Integration
272
+ id: execute
239
273
  if: steps.applicability.outputs.applicable == 'true'
240
274
  run: node "$RUNNER_TEMP/code-foundry/src/runtime.mjs" ci integration
275
+ - name: Retain task receipt
276
+ if: >-
277
+ always() &&
278
+ (steps.execute.outcome == 'success' || steps.execute.outcome == 'failure' ||
279
+ steps.applicability.outputs.applicable == 'false') &&
280
+ hashFiles('.code-foundry/results/integration.json') != ''
281
+ uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
282
+ with:
283
+ name: ${{ inputs.artifact-prefix }}-${{ github.run_id }}-${{ github.run_attempt }}-integration
284
+ path: .code-foundry/results/integration.json
285
+ include-hidden-files: true
286
+ if-no-files-found: error
287
+ retention-days: 14
241
288
 
242
289
  e2e:
243
290
  name: E2E
@@ -298,8 +345,22 @@ jobs:
298
345
  task-python: ${{ steps.applicability.outputs.python }}
299
346
  task-rust: ${{ steps.applicability.outputs.rust }}
300
347
  - name: E2E
348
+ id: execute
301
349
  if: steps.applicability.outputs.applicable == 'true'
302
350
  run: node "$RUNNER_TEMP/code-foundry/src/runtime.mjs" ci e2e
351
+ - name: Retain task receipt
352
+ if: >-
353
+ always() &&
354
+ (steps.execute.outcome == 'success' || steps.execute.outcome == 'failure' ||
355
+ steps.applicability.outputs.applicable == 'false') &&
356
+ hashFiles('.code-foundry/results/e2e.json') != ''
357
+ uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
358
+ with:
359
+ name: ${{ inputs.artifact-prefix }}-${{ github.run_id }}-${{ github.run_attempt }}-e2e
360
+ path: .code-foundry/results/e2e.json
361
+ include-hidden-files: true
362
+ if-no-files-found: error
363
+ retention-days: 14
303
364
 
304
365
  smoke:
305
366
  name: Smoke
@@ -348,5 +409,19 @@ jobs:
348
409
  task-python: ${{ steps.applicability.outputs.python }}
349
410
  task-rust: ${{ steps.applicability.outputs.rust }}
350
411
  - name: Smoke
412
+ id: execute
351
413
  if: steps.applicability.outputs.applicable == 'true'
352
414
  run: node "$RUNNER_TEMP/code-foundry/src/runtime.mjs" ci smoke
415
+ - name: Retain task receipt
416
+ if: >-
417
+ always() &&
418
+ (steps.execute.outcome == 'success' || steps.execute.outcome == 'failure' ||
419
+ steps.applicability.outputs.applicable == 'false') &&
420
+ hashFiles('.code-foundry/results/smoke.json') != ''
421
+ uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
422
+ with:
423
+ name: ${{ inputs.artifact-prefix }}-${{ github.run_id }}-${{ github.run_attempt }}-smoke
424
+ path: .code-foundry/results/smoke.json
425
+ include-hidden-files: true
426
+ if-no-files-found: error
427
+ retention-days: 14
@@ -62,6 +62,11 @@ on:
62
62
  required: false
63
63
  type: number
64
64
  default: 1
65
+ artifact-prefix:
66
+ description: Prefix for task receipts; use a unique value when calling this workflow more than once.
67
+ required: false
68
+ type: string
69
+ default: task-result
65
70
  secrets:
66
71
  TURBO_TOKEN:
67
72
  required: false
@@ -86,6 +91,7 @@ jobs:
86
91
  runtime-repository: ${{ inputs.runtime-repository }}
87
92
  runtime-ref: ${{ inputs.runtime-ref }}
88
93
  runner: ${{ inputs.ci-runner }}
94
+ artifact-prefix: ${{ inputs.artifact-prefix }}
89
95
  secrets:
90
96
  TURBO_TOKEN: ${{ secrets.TURBO_TOKEN }}
91
97
  NEXTAUTH_SECRET: ${{ secrets.NEXTAUTH_SECRET }}
@@ -101,6 +107,7 @@ jobs:
101
107
  unit-runner: ${{ inputs.unit-runner }}
102
108
  performance-runner: ${{ inputs.performance-runner }}
103
109
  unit-only: ${{ inputs.mode == 'fast' }}
110
+ artifact-prefix: ${{ inputs.artifact-prefix }}
104
111
  secrets:
105
112
  TURBO_TOKEN: ${{ secrets.TURBO_TOKEN }}
106
113
 
@@ -62,6 +62,11 @@ on:
62
62
  required: false
63
63
  type: number
64
64
  default: 1
65
+ artifact-prefix:
66
+ description: Prefix for task receipts; use a unique value when calling this workflow more than once.
67
+ required: false
68
+ type: string
69
+ default: task-result
65
70
  secrets:
66
71
  TURBO_TOKEN:
67
72
  required: false
@@ -86,6 +91,7 @@ jobs:
86
91
  runtime-repository: ${{ inputs.runtime-repository }}
87
92
  runtime-ref: ${{ inputs.runtime-ref }}
88
93
  runner: ${{ inputs.ci-runner }}
94
+ artifact-prefix: ${{ inputs.artifact-prefix }}
89
95
  secrets:
90
96
  TURBO_TOKEN: ${{ secrets.TURBO_TOKEN }}
91
97
  NEXTAUTH_SECRET: ${{ secrets.NEXTAUTH_SECRET }}
@@ -101,6 +107,7 @@ jobs:
101
107
  unit-runner: ${{ inputs.unit-runner }}
102
108
  performance-runner: ${{ inputs.performance-runner }}
103
109
  unit-only: ${{ inputs.mode == 'fast' }}
110
+ artifact-prefix: ${{ inputs.artifact-prefix }}
104
111
  secrets:
105
112
  TURBO_TOKEN: ${{ secrets.TURBO_TOKEN }}
106
113
 
package/CHANGELOG.md CHANGED
@@ -1,5 +1,12 @@
1
1
  # Changelog
2
2
 
3
+ ## [1.20.2](https://github.com/0xPlayerOne/code-foundry/compare/v1.20.1...v1.20.2) (2026-09-09)
4
+
5
+
6
+ ### Bug Fixes
7
+
8
+ * **ci:** retain scoped task receipts across success and failure ([#557](https://github.com/0xPlayerOne/code-foundry/issues/557)) ([ee0fe45](https://github.com/0xPlayerOne/code-foundry/commit/ee0fe45e821621e3193831d70a533077b7bcf8a9))
9
+
3
10
  ## [1.20.1](https://github.com/0xPlayerOne/code-foundry/compare/v1.20.0...v1.20.1) (2026-09-09)
4
11
 
5
12
 
@@ -60,9 +60,29 @@ appear in the GitHub job summary when `GITHUB_STEP_SUMMARY` is available.
60
60
  The recorded command is the delegated executor invocation, not a transcript of
61
61
  all nested package scripts. No environment variables or captured command output
62
62
  are copied into the report. Repository scripts remain responsible for sanitizing
63
- their own logs. Upload `.code-foundry/results/*.json` with `if: always()` and
64
- `include-hidden-files: true` to retain downloadable reports; only upload this
65
- specific directory, not arbitrary hidden files or the entire checkout.
63
+ their own logs and command arguments. Receipts are diagnostics, not signatures,
64
+ attestations, or authorization to publish or merge.
65
+
66
+ The shared CI and Test workflows retain each executed task's receipt, including
67
+ failure, and discovery receipts for explicitly skipped optional tasks. Each upload
68
+ selects exactly `.code-foundry/results/<task>.json`, not the broader hidden
69
+ directory. The artifact name is `task-result-RUN_ID-ATTEMPT-TASK` and retention is
70
+ 14 days. The optional `artifact-prefix` input is exposed by CI, Test, and both
71
+ validation orchestrators; it disambiguates multiple invocations in the same run
72
+ when forwarded to the leaf workflows. Use a different prefix for each such
73
+ invocation. Existing coverage/performance artifact uploads are unchanged.
74
+
75
+ Missing receipts from an older runtime, a discovery/setup failure, or termination
76
+ before the runtime writes its report do not create an artifact. Missing evidence
77
+ is not success: inspect the task's actual outcome and the validation gate. Uploads
78
+ run after success or failure and do not suppress a failing task exit. When an
79
+ existing receipt disappears during upload, the upload itself fails. A job skipped
80
+ by the workflow's tier or billing policy cannot create a receipt.
81
+
82
+ These files describe repository-controlled execution and can include paths and
83
+ script-derived reasons. Do not put credentials in command arguments. Artifact
84
+ access follows repository/Actions visibility; receipt retention does not provide
85
+ a sandbox or independently validate repository-authored evidence.
66
86
 
67
87
  `node src/runtime.mjs ci plan` prints a JSON discovery plan without executing
68
88
  checks. Discovery validates every required task before reusable workflows select
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "code-foundry",
3
- "version": "1.20.1",
3
+ "version": "1.20.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": {