code-foundry 1.28.12 → 1.28.14

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/CHANGELOG.md CHANGED
@@ -1,5 +1,19 @@
1
1
  # Changelog
2
2
 
3
+ ## [1.28.14](https://github.com/0xPlayerOne/code-foundry/compare/v1.28.13...v1.28.14) (2026-09-11)
4
+
5
+
6
+ ### Bug Fixes
7
+
8
+ * **sync:** accept mixed broad and scoped CodeQL Rust shards ([#621](https://github.com/0xPlayerOne/code-foundry/issues/621)) ([f13c5a7](https://github.com/0xPlayerOne/code-foundry/commit/f13c5a734a1b24ee75566bab3b778052a28ada99))
9
+
10
+ ## [1.28.13](https://github.com/0xPlayerOne/code-foundry/compare/v1.28.12...v1.28.13) (2026-09-11)
11
+
12
+
13
+ ### Bug Fixes
14
+
15
+ * **fleet:** accept base-config evidence for merged rollouts ([#620](https://github.com/0xPlayerOne/code-foundry/issues/620)) ([394c528](https://github.com/0xPlayerOne/code-foundry/commit/394c528a137617ce2c4464436dbc6068349a0c54))
16
+
3
17
  ## [1.28.12](https://github.com/0xPlayerOne/code-foundry/compare/v1.28.11...v1.28.12) (2026-09-11)
4
18
 
5
19
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "code-foundry",
3
- "version": "1.28.12",
3
+ "version": "1.28.14",
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": {
@@ -1017,9 +1017,10 @@ function validateRustCodeqlConfig(config) {
1017
1017
  }
1018
1018
  }
1019
1019
  }
1020
- if (seen.has('all') && shards.length !== 1) {
1021
- throw new Error('Invalid codeql_rust_shards; "all" cannot be combined with scoped shards.')
1022
- }
1020
+ // "all" combined with scoped shards is a deliberate consumer strategy: the
1021
+ // broad pass keeps the workspace-level SARIF category reporting while the
1022
+ // scoped shards add per-manifest detail. The renderer forwards the same
1023
+ // list to every lane, so lane parity holds regardless of the combination.
1023
1024
  return { shards: JSON.stringify(shards), threads, maxParallel }
1024
1025
  }
1025
1026
 
@@ -286,6 +286,21 @@ export function verifiedPullRequest(pr, required) {
286
286
  )
287
287
  }
288
288
 
289
+ /**
290
+ * Evidence that a merged rollout actually landed. Gate rollup evidence is the
291
+ * normal path, but repositories without a required-check policy can merge
292
+ * through auto-merge before their checks complete, so a merged PR whose base
293
+ * configuration already matches the declared rollout is accepted with weaker
294
+ * `base-config` evidence instead of deadlocking the cohort forever.
295
+ * @param {any} pr @param {string[]} required @param {boolean} baseConfigMatches
296
+ * @returns {'gates'|'base-config'|null}
297
+ */
298
+ export function rolloutEvidence(pr, required, baseConfigMatches) {
299
+ if (!pr || pr.state !== 'MERGED') return null
300
+ if (verifiedPullRequest(pr, required)) return 'gates'
301
+ return baseConfigMatches ? 'base-config' : null
302
+ }
303
+
289
304
  /** @param {any} check */
290
305
  function checkState(check) {
291
306
  return check.status === 'COMPLETED' ? check.conclusion : (check.state ?? check.status)
@@ -339,8 +354,9 @@ function inspectRollout(run, path, entry, version, base) {
339
354
  if (!remoteHead || pr.headRefOid !== remoteHead)
340
355
  throw new Error('Existing pull request head no longer matches its remote branch')
341
356
  }
342
- let complete = verifiedPullRequest(pr, entry.requiredChecks)
343
- if (complete) {
357
+ let complete = false
358
+ let evidence = null
359
+ if (pr?.state === 'MERGED') {
344
360
  const response = JSON.parse(
345
361
  checked(run, path, [
346
362
  'gh',
@@ -351,9 +367,11 @@ function inspectRollout(run, path, entry, version, base) {
351
367
  if (response.encoding !== 'base64' || typeof response.content !== 'string')
352
368
  throw new Error('Unable to verify merged runtime configuration')
353
369
  const config = scalarConfig(Buffer.from(response.content, 'base64').toString('utf8'))
354
- complete = config.runtime_ref === version && configDrift(config, entry).length === 0
370
+ const configMatches = config.runtime_ref === version && configDrift(config, entry).length === 0
371
+ evidence = rolloutEvidence(pr, entry.requiredChecks, configMatches)
372
+ complete = evidence !== null
355
373
  }
356
- return { ...identity, pr, complete }
374
+ return { ...identity, pr, complete, evidence }
357
375
  }
358
376
 
359
377
  /** @param {Runner} run @param {string} path @param {string[]} files */
@@ -606,7 +624,12 @@ export function upgradeManifestFleet(root, source, options, sync, run = executeF
606
624
  const rollout = inspectRollout(run, item.path, entry, options.version, base)
607
625
  if (rollout.complete) {
608
626
  completed += 1
609
- report.push({ ...record, status: 'verified-merged', pullRequest: rollout.pr.url })
627
+ report.push({
628
+ ...record,
629
+ status: 'verified-merged',
630
+ evidence: rollout.evidence,
631
+ pullRequest: rollout.pr.url,
632
+ })
610
633
  continue
611
634
  }
612
635
  if (rollout.pr) {
@@ -96,10 +96,10 @@ export function renderMergeQueueCaller(config, ref) {
96
96
  )
97
97
  }
98
98
  }
99
- ensure(
100
- !(seen.has('all') && shards.length !== 1),
101
- 'Invalid codeql_rust_shards; "all" cannot be combined with scoped shards.'
102
- )
99
+ // "all" combined with scoped shards is a deliberate consumer strategy: the
100
+ // broad pass keeps the workspace-level SARIF category reporting while the
101
+ // scoped shards add per-manifest detail. The renderer forwards the same
102
+ // list to every lane, so lane parity holds regardless of the combination.
103
103
  return `${QUEUE_MARKER}name: Merge Queue
104
104
 
105
105
  on: