code-foundry 1.20.1 → 1.22.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.
- package/.github/CONTRIBUTING.md +5 -2
- package/.github/code-foundry.yml +1 -0
- package/.github/release-please-foundry.json +56 -0
- package/.github/workflows/ci.yml +61 -0
- package/.github/workflows/cloudflare-delivery.yml +9 -0
- package/.github/workflows/cloudflare-deploy.yml +8 -1
- package/.github/workflows/opencode-security_self-ci.yml +1 -1
- package/.github/workflows/qualified-foundry-publish.yml +6 -7
- package/.github/workflows/release.yml +58 -10
- package/.github/workflows/release_self-ci.yml +211 -8
- package/.github/workflows/test.yml +75 -0
- package/.github/workflows/validation-no-codeql.yml +7 -0
- package/.github/workflows/validation.yml +7 -0
- package/.gitignore +1 -1
- package/AGENTS.md +4 -1
- package/CHANGELOG.md +60 -0
- package/README.md +20 -17
- package/docs/CONFIGURATION.md +182 -152
- package/docs/EXTENSIONS.md +28 -7
- package/docs/INITIALIZATION.md +13 -9
- package/docs/PERFORMANCE.md +67 -59
- package/docs/PUBLISHING.md +39 -14
- package/docs/README.md +37 -22
- package/docs/RELEASES.md +18 -9
- package/docs/WORKFLOWS.md +11 -0
- package/docs/agent-validation.md +6 -5
- package/docs/cloudflare-delivery.md +20 -8
- package/docs/consumer-qualification.md +11 -9
- package/docs/fleet-release-eligibility.md +14 -15
- package/docs/fleet-rollouts.md +3 -3
- package/docs/merge-queues.md +21 -21
- package/docs/product-quality.md +9 -10
- package/docs/qualified-publication.md +166 -93
- package/docs/release-integrity.md +7 -6
- package/docs/required-capabilities.md +42 -15
- package/package.json +1 -1
- package/src/commands/cloudflare-delivery.mjs +6 -1
- package/src/commands/qualified-publication.mjs +23 -10
- package/src/commands/release-integrity.mjs +9 -0
- package/src/commands/sync.mjs +29 -24
- package/src/lib/product-quality.mjs +220 -16
- package/src/runtime-core.mjs +12 -8
- package/src/runtime.mjs +1 -1
- package/src/templates/gitignore +1 -1
package/docs/PERFORMANCE.md
CHANGED
|
@@ -1,66 +1,74 @@
|
|
|
1
1
|
# Performance budgets and baselines
|
|
2
2
|
|
|
3
|
-
Code Foundry measures its
|
|
4
|
-
check writes `performance-results.json` for
|
|
5
|
-
budget is exceeded.
|
|
6
|
-
belong to the run that produced them, not the source tree.
|
|
3
|
+
Code Foundry measures its own runtime with `bun run performance:check`. The
|
|
4
|
+
check writes `performance-results.json` for artifact upload and fails when a
|
|
5
|
+
budget is exceeded. Reports are generated-run evidence and are ignored by Git.
|
|
7
6
|
|
|
8
7
|
## Enforced budgets
|
|
9
8
|
|
|
10
|
-
| Metric |
|
|
11
|
-
| ----------------------------------- |
|
|
12
|
-
| CLI help startup p95 |
|
|
13
|
-
| Runtime mode startup p95 |
|
|
14
|
-
| Focused runtime tests |
|
|
15
|
-
| Format, lint, type-check, and build |
|
|
16
|
-
| Runtime dependencies |
|
|
17
|
-
| Development dependencies |
|
|
18
|
-
| Packed artifact |
|
|
19
|
-
| Unpacked artifact |
|
|
20
|
-
| Packed files |
|
|
9
|
+
| Metric | Budget | Why it is bounded |
|
|
10
|
+
| ----------------------------------- | -------: | ---------------------------------------------------- |
|
|
11
|
+
| CLI help startup p95 | 250 ms | Detect eager imports and startup regressions |
|
|
12
|
+
| Runtime mode startup p95 | 250 ms | Detect baseline runtime initialization regressions |
|
|
13
|
+
| Focused runtime tests | 10 s | Keep the representative runtime contract inexpensive |
|
|
14
|
+
| Format, lint, type-check, and build | 15 s | Bound the local CI feedback loop |
|
|
15
|
+
| Runtime dependencies | 0 | Keep the installed CLI dependency-free |
|
|
16
|
+
| Development dependencies | 4 | Prevent unreviewed toolchain growth |
|
|
17
|
+
| Packed artifact | 260 kB | Bound registry transfer and install cost |
|
|
18
|
+
| Unpacked artifact | 1,000 kB | Bound installed footprint |
|
|
19
|
+
| Packed files | 115 | Detect accidental release contents |
|
|
20
|
+
|
|
21
|
+
The source-of-truth budgets live in `scripts/performance-check.mjs`. When those
|
|
22
|
+
limits change, update this table and include before/after measurements in the
|
|
23
|
+
same change. The Cloudflare delivery and qualified-publication changes in this release
|
|
24
|
+
moved the measured artifact from 990,481 to 994,555 unpacked bytes (257,384 to
|
|
25
|
+
258,647 packed bytes, with 112 files in both measurements). Draft protection
|
|
26
|
+
configuration, reusable-workflow inputs, documentation, and regression tests
|
|
27
|
+
increased the measured artifact to 998,348 unpacked bytes (259,532 packed bytes,
|
|
28
|
+
with 112 files). The unpacked budget is therefore 1,000 kB; the packed and
|
|
29
|
+
file-count budgets remain unchanged.
|
|
21
30
|
|
|
22
31
|
The performance workflow disables build-cache reads and writes for this task.
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
package footprint described above.
|
|
32
|
+
Timing comparisons therefore do not depend on a warm protected-branch cache, and
|
|
33
|
+
benchmark code cannot populate shared cache entries.
|
|
34
|
+
|
|
35
|
+
## Package profile
|
|
36
|
+
|
|
37
|
+
The reusable performance job also supports the opt-in `node-package` profile.
|
|
38
|
+
Configure it in `.github/code-foundry.yml`:
|
|
39
|
+
|
|
40
|
+
```yaml
|
|
41
|
+
performance: true
|
|
42
|
+
performance_profile: node-package
|
|
43
|
+
performance_budget_file: performance-package-budgets.json
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
The profile measures cold imports, memory, package size, file counts, and
|
|
47
|
+
production dependency count according to a repository-owned JSON budget file.
|
|
48
|
+
It writes `performance-results/node-package.json`. Every run also writes
|
|
49
|
+
`performance-results/summary.json`, which records repository-owned commands and
|
|
50
|
+
configured performance commands under one stable artifact contract.
|
|
51
|
+
|
|
52
|
+
## Native Rust test batching
|
|
53
|
+
|
|
54
|
+
Each Rust test category invokes Cargo once with tracked targets: unit tests use
|
|
55
|
+
`--lib`/`--bin <package>`, while integration, E2E, and smoke tests use repeated
|
|
56
|
+
`--test <target>` arguments. Cargo shares setup without competing processes.
|
|
57
|
+
|
|
58
|
+
Discovery, category boundaries, fallback behavior, scripts, Python checks, flags,
|
|
59
|
+
and receipts remain unchanged. `--tests` and `--all-targets` stay avoided to
|
|
60
|
+
prevent broader or repeated coverage. Measure cold and warm runs, including
|
|
61
|
+
compilation and cache transfer, before claiming a speedup.
|
|
62
|
+
|
|
63
|
+
## Changing a budget
|
|
64
|
+
|
|
65
|
+
Treat budget changes like source changes:
|
|
66
|
+
|
|
67
|
+
1. capture before/after measurements;
|
|
68
|
+
2. explain the effect on local feedback, runner time, package transfer, or
|
|
69
|
+
installed footprint;
|
|
70
|
+
3. run the complete validation gate; and
|
|
71
|
+
4. inspect the resulting performance artifact.
|
|
72
|
+
|
|
73
|
+
Never raise a limit solely to clear CI. Keep network-dependent checks, live
|
|
74
|
+
endpoints, and post-deployment probes in separate repository-owned workflows.
|
package/docs/PUBLISHING.md
CHANGED
|
@@ -1,13 +1,21 @@
|
|
|
1
1
|
# Publishing packages
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Code Foundry separates versioning, GitHub Releases, and registry publication.
|
|
4
|
+
Choose the release path that matches the repository:
|
|
5
|
+
|
|
6
|
+
- **Generated consumer caller:** Release Please creates the GitHub Release and
|
|
7
|
+
the standard `release.yml` job can publish npm when `npm_publish: true`.
|
|
8
|
+
- **Code Foundry itself:** `release_self-ci.yml` qualifies the package, stages
|
|
9
|
+
the exact archive on an immutable draft release, and delegates final npm
|
|
10
|
+
publication to `qualified-foundry-publish.yml`.
|
|
11
|
+
|
|
12
|
+
## npm publication for consumer repositories
|
|
4
13
|
|
|
5
14
|
Set `npm_publish: true` only when the repository owns an npm package. Configure
|
|
6
|
-
npm trusted publishing for the
|
|
7
|
-
possible.
|
|
8
|
-
that cannot use trusted publishing.
|
|
15
|
+
npm trusted publishing for the generated `release.yml` workflow whenever
|
|
16
|
+
possible. Use an `NPM_TOKEN` secret only when trusted publishing is unavailable.
|
|
9
17
|
|
|
10
|
-
|
|
18
|
+
Declare the package's intended visibility explicitly:
|
|
11
19
|
|
|
12
20
|
```json
|
|
13
21
|
{
|
|
@@ -22,26 +30,43 @@ publish. The release workflow fails clearly when npm publication is enabled but
|
|
|
22
30
|
neither trusted publishing nor a token is configured.
|
|
23
31
|
|
|
24
32
|
After enabling publication, make one controlled release and verify both the
|
|
25
|
-
registry version and
|
|
26
|
-
|
|
33
|
+
registry version and its provenance link before treating the setup as complete.
|
|
34
|
+
|
|
35
|
+
## Code Foundry's qualified publication
|
|
36
|
+
|
|
37
|
+
The self-hosted package follows a stricter contract than generated consumer
|
|
38
|
+
callers:
|
|
39
|
+
|
|
40
|
+
1. Pack the candidate once and qualify that archive across Node 20, 22, and 24.
|
|
41
|
+
2. Create a draft GitHub Release and attach the exact qualified archive plus its
|
|
42
|
+
qualification receipt.
|
|
43
|
+
3. Publish the immutable GitHub Release after verifying the tag, source commit,
|
|
44
|
+
archive digest, immutable-release setting, and qualification reports.
|
|
45
|
+
4. Publish the already-qualified archive through the qualified publisher using npm
|
|
46
|
+
trusted publishing or the optional token fallback.
|
|
47
|
+
|
|
48
|
+
The final publisher does not rebuild or reinstall the package. It publishes only
|
|
49
|
+
the bytes selected from the same workflow run and attempt. See [Consumer
|
|
50
|
+
qualification](consumer-qualification.md) and [Qualified publication](qualified-publication.md)
|
|
51
|
+
for the complete contract, retries, and recovery rules.
|
|
27
52
|
|
|
28
53
|
## GitHub Releases and GitHub Packages
|
|
29
54
|
|
|
30
|
-
A GitHub Release is
|
|
31
|
-
of
|
|
55
|
+
A GitHub Release is metadata attached to a Git tag. It is independent of npm and
|
|
56
|
+
of GitHub Packages.
|
|
32
57
|
|
|
33
|
-
Publishing to npm does not populate the repository's GitHub Packages section.
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
that is an optional extension rather than part of the universal baseline.
|
|
58
|
+
Publishing to npm does not populate the repository's GitHub Packages section. If
|
|
59
|
+
a repository also needs GitHub Container Registry or an npm-compatible GitHub
|
|
60
|
+
Package, add a repository-owned publishing workflow and credentials.
|
|
37
61
|
|
|
38
62
|
## Provenance and verification
|
|
39
63
|
|
|
40
64
|
Prefer trusted publishing because it provides short-lived credentials and
|
|
41
65
|
provenance. After a release, verify:
|
|
42
66
|
|
|
43
|
-
```
|
|
67
|
+
```sh
|
|
44
68
|
npm view PACKAGE_NAME version dist-tags
|
|
69
|
+
# Replace VERSION with the published tag.
|
|
45
70
|
gh release view vVERSION
|
|
46
71
|
```
|
|
47
72
|
|
package/docs/README.md
CHANGED
|
@@ -1,27 +1,42 @@
|
|
|
1
1
|
# Documentation
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
- [
|
|
11
|
-
- [
|
|
12
|
-
- [
|
|
13
|
-
- [
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
- [
|
|
18
|
-
- [
|
|
19
|
-
- [
|
|
20
|
-
- [
|
|
3
|
+
Code Foundry's documentation is organized by the job you are trying to do. Most
|
|
4
|
+
guides describe the reusable baseline; platform-specific guides call out their
|
|
5
|
+
provider assumptions. Adapt repository names, environments, and deployment
|
|
6
|
+
details before copying any guide elsewhere.
|
|
7
|
+
|
|
8
|
+
## Start here
|
|
9
|
+
|
|
10
|
+
- [Initialization and synchronization](INITIALIZATION.md) — install, update, and diagnose a baseline.
|
|
11
|
+
- [Configuration reference](CONFIGURATION.md) — choose workflows, runtimes, validation, and release policy.
|
|
12
|
+
- [Workflow and CI conventions](WORKFLOWS.md) — understand triggers, checks, runners, caching, and branch protection.
|
|
13
|
+
- [Extension points](EXTENSIONS.md) — keep custom workflows and post-release delivery alongside the baseline.
|
|
14
|
+
|
|
15
|
+
## Validation and quality
|
|
16
|
+
|
|
17
|
+
- [Agent-facing validation](agent-validation.md) — run local plans and checks with machine-readable evidence.
|
|
18
|
+
- [Required capabilities and task evidence](required-capabilities.md) — require tasks, coverage, and retained receipts.
|
|
19
|
+
- [Performance budgets](PERFORMANCE.md) — maintain runtime, CI, and package-size budgets.
|
|
20
|
+
- [Product quality profiles](product-quality.md) — add acceptance checks for sites, apps, Workers, and packages.
|
|
21
|
+
- [Merge queue validation](merge-queues.md) — validate GitHub merge-group commits.
|
|
22
|
+
|
|
23
|
+
## Releases and publishing
|
|
24
|
+
|
|
25
|
+
- [Release management](RELEASES.md) — branch topologies, Release Please, and release permissions.
|
|
26
|
+
- [Publishing packages](PUBLISHING.md) — npm, GitHub Releases, and provenance guidance.
|
|
27
|
+
- [Release integrity and build provenance](release-integrity.md) — immutable releases, verification, and attestations.
|
|
28
|
+
- [Consumer qualification](consumer-qualification.md) — test the packaged release across consumer fixtures.
|
|
29
|
+
- [Qualified publication](qualified-publication.md) — publish the exact qualified Code Foundry archive.
|
|
30
|
+
|
|
31
|
+
## Fleet and deployment operations
|
|
32
|
+
|
|
33
|
+
- [Declarative fleet rollouts](fleet-rollouts.md) — inventory, canaries, staged upgrades, and recovery.
|
|
34
|
+
- [Fleet release eligibility](fleet-release-eligibility.md) — require verified release evidence before upgrades.
|
|
35
|
+
- [Verified Cloudflare delivery](cloudflare-delivery.md) — build, verify, canary, and promote Worker versions.
|
|
36
|
+
- [Caching and remote caching](CACHING.md) — configure package, build, and Turborepo caching.
|
|
21
37
|
|
|
22
38
|
## Repository-specific documentation
|
|
23
39
|
|
|
24
|
-
Add
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
new documents from this index when they become part of the supported workflow.
|
|
40
|
+
Add architecture notes, runbooks, and deployment instructions to this directory.
|
|
41
|
+
The initializer preserves `docs/` during synchronization. Link supported guides
|
|
42
|
+
from this index and prefer task-oriented filenames.
|
package/docs/RELEASES.md
CHANGED
|
@@ -25,13 +25,17 @@ the `staging` → `main` promotion PR merges with **rebase** (`merge_strategy:
|
|
|
25
25
|
rebase`), and Release Please version PRs merge with **rebase**
|
|
26
26
|
(`release_merge_strategy: rebase`). In the `direct` topology, feature and fix
|
|
27
27
|
branches squash straight into `main` and Release Please version PRs squash into
|
|
28
|
-
`main` (`release_merge_strategy: squash`). `
|
|
29
|
-
|
|
30
|
-
|
|
28
|
+
`main` (`release_merge_strategy: squash`). `sync`, `doctor`, and release
|
|
29
|
+
automation reject any other strategy. Release automation never defaults to a
|
|
30
|
+
merge method and never merges with `--admin`.
|
|
31
31
|
|
|
32
32
|
The release workflow opens or updates a versioned PR after changes reach
|
|
33
|
-
`main`.
|
|
34
|
-
Release, and
|
|
33
|
+
`main`. For generated consumer callers, merging that PR updates the changelog,
|
|
34
|
+
creates the Git tag and GitHub Release, and can trigger npm publication. Code
|
|
35
|
+
Foundry's own caller uses the qualified path: it qualifies the package first,
|
|
36
|
+
creates a draft release, stages the exact qualified archive, then publishes the
|
|
37
|
+
immutable release and package through the verified publisher. See [Qualified
|
|
38
|
+
publication](qualified-publication.md).
|
|
35
39
|
|
|
36
40
|
For an explicit version, put `Release-As: 2.0.0` in a commit or pull request
|
|
37
41
|
body. Existing `CHANGELOG.md` history remains repository-owned.
|
|
@@ -134,7 +138,12 @@ already passed).
|
|
|
134
138
|
## Operational checklist
|
|
135
139
|
|
|
136
140
|
1. Merge tested changes into `main` (direct: feature PRs; staging-release: promote `staging` into `main`).
|
|
137
|
-
2. Review the generated Release Please PR and changelog.
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
+
2. Review the generated Release Please PR and changelog. A validated
|
|
142
|
+
`CODE_FOUNDRY_TOKEN` lets the release workflow merge it automatically after
|
|
143
|
+
required checks; without that token, merge it manually with the configured
|
|
144
|
+
topology method: squash for `direct`, rebase for `staging-release`.
|
|
145
|
+
3. For a generated consumer caller, confirm the GitHub Release and any package
|
|
146
|
+
publication.
|
|
147
|
+
4. For Code Foundry itself, confirm qualification, draft staging, immutable
|
|
148
|
+
publication, and the retained identity receipts.
|
|
149
|
+
5. In `staging-release`, synchronize `staging` with the new `main` release commit.
|
package/docs/WORKFLOWS.md
CHANGED
|
@@ -52,6 +52,12 @@ opens those PRs as drafts. Promotion automation listens to `staging` pushes
|
|
|
52
52
|
automation and default-branch CodeQL listen to `main` pushes.
|
|
53
53
|
Custom deployment, indexing, search, Slither, or other workflows are
|
|
54
54
|
repository-owned extensions and should use the same ready-transition policy.
|
|
55
|
+
Code Foundry's runner-heavy validation, security, qualification, and Cloudflare
|
|
56
|
+
reusable workflows also enforce draft protection at the job boundary. Generated
|
|
57
|
+
callers default to the `draft_protection: true` configuration; set it to `false`
|
|
58
|
+
to run generated gates for drafts. Cloudflare callers use their equivalent
|
|
59
|
+
`draft-protection: false` input. These opt-outs do not remove Draft Guard or
|
|
60
|
+
draft-PR automation; they only allow the protected gates to run for drafts.
|
|
55
61
|
|
|
56
62
|
## Billing pause
|
|
57
63
|
|
|
@@ -112,6 +118,11 @@ opt in or out without a code change.
|
|
|
112
118
|
| Release PR | Promote `staging` into `main` (staging-release topology only) |
|
|
113
119
|
| Release | Release Please, GitHub release, and optional npm publication |
|
|
114
120
|
|
|
121
|
+
Generated consumer callers use the standard Release workflow. Code Foundry's
|
|
122
|
+
own `release_self-ci.yml` adds consumer qualification, draft-release staging,
|
|
123
|
+
immutable-release verification, and qualified npm publication; see [Qualified
|
|
124
|
+
publication](qualified-publication.md).
|
|
125
|
+
|
|
115
126
|
Use concise job names such as `CI / Format`, `Test / Unit`, and
|
|
116
127
|
`CodeQL / Analyze (Python)`. Per-language CodeQL analyzers (Rust shards
|
|
117
128
|
included) and security audits run through a detection-built matrix, so a
|
package/docs/agent-validation.md
CHANGED
|
@@ -1,16 +1,17 @@
|
|
|
1
1
|
# Agent-facing validation commands
|
|
2
2
|
|
|
3
|
-
The public CLI
|
|
3
|
+
The public CLI exposes a stable plan/check interface using the same discovery,
|
|
4
4
|
required-capability policy, ecosystem executor, and task receipts as reusable CI.
|
|
5
5
|
|
|
6
6
|
```sh
|
|
7
|
-
code-foundry plan --changed --base origin/main --json
|
|
8
|
-
code-foundry check --tier fast --json
|
|
9
|
-
code-foundry check --tier audit --json
|
|
7
|
+
npx code-foundry plan --changed --base origin/main --json
|
|
8
|
+
npx code-foundry check --tier fast --json
|
|
9
|
+
npx code-foundry check --tier audit --json
|
|
10
10
|
```
|
|
11
11
|
|
|
12
12
|
Both commands accept `--target PATH`. Use the Code Foundry version pinned by the
|
|
13
|
-
repository, not an unreviewed floating installation
|
|
13
|
+
repository, not an unreviewed floating installation; use your package manager's
|
|
14
|
+
local binary when the package is installed as a dependency. `plan` executes discovery
|
|
14
15
|
only: it does not install dependencies, run project checks, modify source files,
|
|
15
16
|
or emit skip-receipt files. Required entrypoints are validated across the complete
|
|
16
17
|
task set, including tasks deferred from the selected local tier.
|
|
@@ -50,7 +50,11 @@ Wrangler version supporting `WRANGLER_OUTPUT_FILE_PATH` and version-1
|
|
|
50
50
|
Bun remains the installation path, consistent with the existing deploy workflow.
|
|
51
51
|
|
|
52
52
|
The repository verification command receives `BASE_URL` and
|
|
53
|
-
`FOUNDRY_DEPLOYMENT_PHASE` (`candidate`, `canary`, or `production`).
|
|
53
|
+
`FOUNDRY_DEPLOYMENT_PHASE` (`candidate`, `canary`, or `production`). Preview
|
|
54
|
+
candidate jobs skip draft pull requests by default. To intentionally deploy
|
|
55
|
+
from drafts, pass `draft-protection: false` in the reusable-workflow call; this
|
|
56
|
+
changes only the CI/deployment gate, not Draft Guard or draft-PR automation. It
|
|
57
|
+
must check
|
|
54
58
|
critical journeys, redirects, assets, and application-specific behavior. The
|
|
55
59
|
built-in smoke probe requires a successful 2xx response and does not follow
|
|
56
60
|
redirects. Deploy credentials are not supplied to verification steps and are
|
|
@@ -85,7 +89,10 @@ and new production workflows active.
|
|
|
85
89
|
Outputs include preview URL, exact version ID, source SHA, declared build-tree
|
|
86
90
|
SHA-256 digest, Cloudflare deployment ID, and GitHub application deployment ID.
|
|
87
91
|
Explicit application deployment records receive in-progress and success/failure
|
|
88
|
-
statuses, in addition to GitHub's environment-job records.
|
|
92
|
+
statuses, in addition to GitHub's environment-job records. For pull requests,
|
|
93
|
+
the deployment record is associated with `github.event.pull_request.head.sha`,
|
|
94
|
+
not GitHub Actions' merge commit, so GitHub can display the preview in the PR's
|
|
95
|
+
Deployments section. Direct pushes use `github.sha`. Sanitized candidate and
|
|
89
96
|
production JSON evidence is uploaded even on failure. Binding values, API bodies,
|
|
90
97
|
and credentials are not copied into those reports. Forced runner termination may
|
|
91
98
|
prevent final status steps; the GitHub job still reflects cancellation/failure.
|
|
@@ -164,13 +171,18 @@ the deployment API intentionally changes version routing only.
|
|
|
164
171
|
|
|
165
172
|
## Legacy workflow hardening
|
|
166
173
|
|
|
167
|
-
`cloudflare-deploy.yml`
|
|
174
|
+
`cloudflare-deploy.yml` uses real job environments, non-cancelling concurrency,
|
|
168
175
|
structured Wrangler output, exact/local Wrangler selection, reusable outputs, and
|
|
169
|
-
in-progress/failure deployment records. Its
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
176
|
+
in-progress/failure deployment records. Its preview deployment records use the
|
|
177
|
+
pull request head SHA when called from a PR, so completed previews appear in that
|
|
178
|
+
PR's Deployments section; direct pushes use the workflow SHA. Its compatibility
|
|
179
|
+
default remains `latest`; callers should prefer `local` or an exact version for
|
|
180
|
+
reproducibility. A production URL can be supplied with `deployment-url` when API
|
|
181
|
+
output contains only route patterns. It is still a **direct, unverified deployment**;
|
|
182
|
+
adopt `cloudflare-delivery.yml` for candidate verification and
|
|
183
|
+
guarded promotion. Consumers pinned to an older Code Foundry release must update
|
|
184
|
+
their reusable workflow reference; existing deployments are not retroactively
|
|
185
|
+
re-associated with the PR head commit.
|
|
174
186
|
|
|
175
187
|
## References and testing
|
|
176
188
|
|
|
@@ -5,8 +5,9 @@ Release-candidate compatibility checks against the distributable package.
|
|
|
5
5
|
**Status:** Opt-in reusable workflow; required by Code Foundry's own release caller.
|
|
6
6
|
**Scope:** Package installation, CLI initialization/synchronization, generated workflow contracts.
|
|
7
7
|
|
|
8
|
-
`consumer-qualification.yml` packs the checked-out candidate once, shares that
|
|
9
|
-
Node
|
|
8
|
+
`consumer-qualification.yml` packs the checked-out candidate once, shares that
|
|
9
|
+
archive across Node 20, 22, and 24 using an artifact scoped to the same workflow
|
|
10
|
+
run **and attempt**, and installs it offline with lifecycle scripts disabled,
|
|
10
11
|
and executes its public CLI from the installed package. The harness does not
|
|
11
12
|
import the source checkout's initializer as a substitute for package testing.
|
|
12
13
|
|
|
@@ -39,13 +40,14 @@ member. Reports are evidence, not signatures or a substitute for release identit
|
|
|
39
40
|
verification.
|
|
40
41
|
|
|
41
42
|
The self release caller cannot start Release Please or npm publication until all
|
|
42
|
-
qualification jobs and the aggregate `Gate` succeed. An explicit
|
|
43
|
-
through to the reusable workflow;
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
43
|
+
qualification jobs and the aggregate `Gate` succeed. An explicit
|
|
44
|
+
`release-while-paused` dispatch is passed through to the reusable workflow;
|
|
45
|
+
ordinary calls remain blocked by the billing pause. Consumer-generated release
|
|
46
|
+
callers do not inherit this Code Foundry-specific qualification job. Code
|
|
47
|
+
Foundry's self caller passes the qualified archive to the verified publication
|
|
48
|
+
workflow, which independently rechecks the same bytes before publishing. No
|
|
49
|
+
branch protections, repository settings, credentials, or consumer runtimes are
|
|
50
|
+
changed by this workflow.
|
|
49
51
|
|
|
50
52
|
## Verified handoff and reruns
|
|
51
53
|
|
|
@@ -2,14 +2,12 @@
|
|
|
2
2
|
|
|
3
3
|
Require a verified, qualified runtime before any fleet upgrade mutates repositories.
|
|
4
4
|
|
|
5
|
-
**
|
|
6
|
-
|
|
5
|
+
**Activation:** Add a consumer-owned `.code-foundry-release-policy.json` at the
|
|
6
|
+
fleet root.
|
|
7
7
|
|
|
8
|
-
The public
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
existing callers retain their interface. No policy file means existing behavior.
|
|
12
|
-
A malformed or symlinked policy is an error, not an opt-out. Dry runs use the same
|
|
8
|
+
The public fleet upgrade command applies an optional release-eligibility guard
|
|
9
|
+
before it mutates repositories. No policy file means existing fleet behavior. A
|
|
10
|
+
malformed or symlinked policy is an error, not an opt-out. Dry runs use the same
|
|
13
11
|
guard, and `--force` cannot bypass source identity or qualification.
|
|
14
12
|
|
|
15
13
|
```json
|
|
@@ -30,8 +28,8 @@ This is a shape example, not a completed fleet policy. Populate canonical reposi
|
|
|
30
28
|
identity, actual workflow path, and exact job names from the qualified release
|
|
31
29
|
caller's Actions API results. Include the publication job when successful registry
|
|
32
30
|
publication is required before adoption. Require every relevant job: a workflow's
|
|
33
|
-
aggregate success alone can conceal skipped jobs. The qualification
|
|
34
|
-
and verified
|
|
31
|
+
aggregate success alone can conceal skipped jobs. The producer-side qualification
|
|
32
|
+
and verified-publication workflows provide the evidence this policy consumes.
|
|
35
33
|
|
|
36
34
|
Keep the policy alongside the **consumer workspace's** fleet inventory. Do not put
|
|
37
35
|
private repository names, local layouts, or deployment credentials into this
|
|
@@ -69,12 +67,13 @@ First release and validate the qualification/verification producer and confirm
|
|
|
69
67
|
real workflow/job identities. Then opt a consumer workspace into this policy and
|
|
70
68
|
exercise `fleet upgrade --dry-run --root <fleet-root> --source <clean-release-checkout>`.
|
|
71
69
|
When `--source` is omitted, the installed package is used and an enabled policy
|
|
72
|
-
will reject it unless that installation is itself a clean Git checkout. Older
|
|
73
|
-
releases or unavailable permissions should fail; do not weaken the policy
|
|
74
|
-
make an old release eligible. No real fleet inventory is
|
|
70
|
+
will reject it unless that installation is itself a clean Git checkout. Older
|
|
71
|
+
mutable releases or unavailable permissions should fail; do not weaken the policy
|
|
72
|
+
just to make an old release eligible. No real fleet inventory is created by the
|
|
73
|
+
eligibility guard.
|
|
75
74
|
|
|
76
75
|
The focused suite verifies guard ordering and failure propagation with GitHub/CLI
|
|
77
76
|
fixtures. Live authenticated verification, exact production job naming, and the
|
|
78
|
-
full
|
|
79
|
-
|
|
80
|
-
|
|
77
|
+
full fleet-engine suite should pass before activation. The guard is not a
|
|
78
|
+
substitute for repository import, type-check, packaging, or deployment
|
|
79
|
+
validation.
|
package/docs/fleet-rollouts.md
CHANGED
|
@@ -54,9 +54,9 @@ Adopt those requirements in consumer repositories before requiring them here.
|
|
|
54
54
|
## Commands
|
|
55
55
|
|
|
56
56
|
```sh
|
|
57
|
-
code-foundry fleet status --root /path/to/fleet
|
|
58
|
-
code-foundry fleet upgrade --root /path/to/fleet --source /path/to/release-checkout --dry-run
|
|
59
|
-
code-foundry fleet upgrade --root /path/to/fleet --source /path/to/release-checkout --create-pr
|
|
57
|
+
npx code-foundry fleet status --root /path/to/fleet
|
|
58
|
+
npx code-foundry fleet upgrade --root /path/to/fleet --source /path/to/release-checkout --dry-run
|
|
59
|
+
npx code-foundry fleet upgrade --root /path/to/fleet --source /path/to/release-checkout --create-pr
|
|
60
60
|
```
|
|
61
61
|
|
|
62
62
|
Use `--source` to provide the clean Code Foundry release checkout used for the
|
package/docs/merge-queues.md
CHANGED
|
@@ -2,25 +2,25 @@
|
|
|
2
2
|
|
|
3
3
|
Opt-in validation of the combined commit produced by GitHub's merge queue.
|
|
4
4
|
|
|
5
|
-
**Activation:** `merge_queue: true` in the consumer's
|
|
6
|
-
|
|
5
|
+
**Activation:** Set `merge_queue: true` in the consumer's
|
|
6
|
+
`.github/code-foundry.yml`, then run `sync`.
|
|
7
|
+
**Required check:** The canonical `Validation / Gate` aggregate check.
|
|
7
8
|
|
|
8
9
|
The synchronizer adds `.github/workflows/validation-merge-queue.yml` only when
|
|
9
|
-
explicitly enabled.
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
treated as a generated version-only diff.
|
|
10
|
+
explicitly enabled. Queue validation does not turn draft pushes into CI, mark
|
|
11
|
+
pull requests ready, enqueue pull requests, or change release behavior. Queue
|
|
12
|
+
events receive the full audit even when staging pull requests normally use fast
|
|
13
|
+
validation. Release Please branch detection is not reused for a merge group
|
|
14
|
+
containing several pull requests; the combined tree is audited as submitted.
|
|
15
15
|
|
|
16
16
|
```yaml
|
|
17
17
|
merge_queue: true
|
|
18
18
|
```
|
|
19
19
|
|
|
20
|
-
Normal `code-foundry sync` updates the generated queue caller alongside the
|
|
21
|
-
runtime pins. Explicit fleet runtime overrides are honored. The installed
|
|
22
|
-
must contain this feature, and queues require an exact commit or released
|
|
23
|
-
pin rather than a moving branch. Direct topology enables main; staging-release
|
|
20
|
+
Normal `npx code-foundry sync` updates the generated queue caller alongside the
|
|
21
|
+
other runtime pins. Explicit fleet runtime overrides are honored. The installed
|
|
22
|
+
runtime must contain this feature, and queues require an exact commit or released
|
|
23
|
+
version pin rather than a moving branch. Direct topology enables main; staging-release
|
|
24
24
|
enables main and staging. Existing runner choices, Rust CodeQL sharding, and an
|
|
25
25
|
explicit `codeql: false` policy select the same appropriate validation orchestrator
|
|
26
26
|
as ordinary PRs. No CodeQL policy or runtime default is relaxed.
|
|
@@ -60,8 +60,7 @@ Setting `merge_queue: false` or removing the key removes only a caller bearing t
|
|
|
60
60
|
exact Foundry management marker. A custom file at that path is preserved when
|
|
61
61
|
disabled; enabling over it fails before synchronization writes, even with force.
|
|
62
62
|
Symlinked workflow paths are rejected. Dry runs report changes without creating,
|
|
63
|
-
updating, or deleting the caller.
|
|
64
|
-
in `sync-core.mjs`; its public exports are preserved through the thin wrapper.
|
|
63
|
+
updating, or deleting the caller.
|
|
65
64
|
|
|
66
65
|
Disable the repository's queue rule before removing its required queue workflow.
|
|
67
66
|
Otherwise queued PRs will correctly wait for checks that no longer run.
|
|
@@ -74,16 +73,17 @@ configure required checks. Register the aggregate check, not PR-only mode or
|
|
|
74
73
|
readiness checks that have no merge-group equivalent. An existing rule requiring
|
|
75
74
|
individual checks needs those exact contexts reviewed as well. Do not enable the
|
|
76
75
|
queue rule before the workflow is merged and a disposable queue exercise passes.
|
|
77
|
-
|
|
78
|
-
|
|
76
|
+
Enabling this workflow does not change repository rules, branch protection,
|
|
77
|
+
secrets, merge settings, or the queue itself.
|
|
79
78
|
|
|
80
79
|
Focused tests cover event identity and rejection, generated audit wiring,
|
|
81
80
|
configured CodeQL policy, pin evolution, idempotence, dry runs, and ownership
|
|
82
|
-
preservation. They do not establish a live merge-group run or full sync
|
|
83
|
-
Before
|
|
84
|
-
linter,
|
|
85
|
-
and their pinned/local reusable workflow contracts. Exercise two
|
|
86
|
-
one deliberately failing check in an eligible
|
|
81
|
+
preservation. They do not establish a live merge-group run or full sync
|
|
82
|
+
integration. Before enabling the queue rule, run the complete sync/fleet tests,
|
|
83
|
+
locked formatter, linter, type check, package budgets, and Actionlint against
|
|
84
|
+
rendered callers and their pinned/local reusable workflow contracts. Exercise two
|
|
85
|
+
queued pull requests and one deliberately failing check in an eligible
|
|
86
|
+
disposable repository.
|
|
87
87
|
|
|
88
88
|
References: [GitHub merge-queue CI configuration](https://docs.github.com/en/repositories/configuring-branches-and-merges-in-your-repository/configuring-pull-request-merges/managing-a-merge-queue),
|
|
89
89
|
[merge-group event](https://docs.github.com/en/actions/reference/workflows-and-actions/events-that-trigger-workflows#merge_group).
|