@pulse-compute/cli 0.0.0 → 1.0.0-beta.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.
- package/API.md +572 -0
- package/CHANGELOG.md +71 -0
- package/README.md +71 -1
- package/bin/pulse.js +15 -0
- package/bin/pulsewasm-extract.js +22 -0
- package/cli-spec.json +575 -0
- package/completions/_pulse +106 -0
- package/completions/pulse.bash +31 -0
- package/completions/pulse.fish +76 -0
- package/docs/README.md +77 -0
- package/docs/architecture/current-contracts.md +470 -0
- package/docs/architecture/overview.md +93 -0
- package/docs/architecture/vision.md +515 -0
- package/docs/concepts/bodies.md +186 -0
- package/docs/concepts/compilation-and-lowering.md +496 -0
- package/docs/concepts/contracts-and-providers.md +158 -0
- package/docs/concepts/effects-and-continuations.md +300 -0
- package/docs/concepts/entities-and-adapters.md +71 -0
- package/docs/concepts/package-owned-lowering.md +175 -0
- package/docs/concepts/targets-and-hosts.md +70 -0
- package/docs/contributing/README.md +38 -0
- package/docs/contributing/adding-core-provider.md +315 -0
- package/docs/contributing/adding-first-party-lowerer.md +327 -0
- package/docs/contributing/entities-lowering.md +91 -0
- package/docs/contributing/package-lowerer-contract.md +383 -0
- package/docs/contributing/pulse-aware-packages.md +149 -0
- package/docs/examples.md +112 -0
- package/docs/fixtures/inspect-fetch-composition.selected.json +181 -0
- package/docs/getting-started.md +128 -0
- package/docs/guides/compatibility-imports.md +60 -0
- package/docs/guides/deploying-fastly.md +188 -0
- package/docs/guides/deploying-node.md +143 -0
- package/docs/guides/events.md +233 -0
- package/docs/guides/fastly-capabilities.md +153 -0
- package/docs/guides/fetching-and-composition.md +101 -0
- package/docs/guides/grip.md +94 -0
- package/docs/guides/json-schemas.md +233 -0
- package/docs/guides/migrating-from-express.md +192 -0
- package/docs/guides/project-lifecycle.md +143 -0
- package/docs/guides/routing.md +202 -0
- package/docs/guides/troubleshooting.md +47 -0
- package/docs/maintainers/README.md +60 -0
- package/docs/maintainers/codex-maintainer.md +71 -0
- package/docs/maintainers/documentation-deployment.md +147 -0
- package/docs/maintainers/documentation-system.md +58 -0
- package/docs/maintainers/documentation-versioning.md +65 -0
- package/docs/maintainers/maintainer-charter.md +100 -0
- package/docs/maintainers/maintenance-policy.json +809 -0
- package/docs/maintainers/maintenance-policy.md +124 -0
- package/docs/maintainers/npm-publishing.md +154 -0
- package/docs/maintainers/plugin-readiness.json +19 -0
- package/docs/maintainers/plugin-readiness.md +31 -0
- package/docs/maintainers/public-site.md +158 -0
- package/docs/maintainers/release-acceptance.md +293 -0
- package/docs/maintainers/release-manifest.md +89 -0
- package/docs/maintainers/repository-setup.md +145 -0
- package/docs/maintainers/scope-policy.md +105 -0
- package/docs/maintainers/support-and-triage.md +74 -0
- package/docs/maintainers/testing.md +334 -0
- package/docs/packages/README.md +60 -0
- package/docs/packages/assets.md +85 -0
- package/docs/packages/cli.md +190 -0
- package/docs/packages/crypto.md +78 -0
- package/docs/packages/entities.md +129 -0
- package/docs/packages/grip.md +82 -0
- package/docs/packages/implementation-packages.md +122 -0
- package/docs/packages/jwt.md +55 -0
- package/docs/packages/provider-fastly.md +243 -0
- package/docs/packages/pulse.md +159 -0
- package/docs/packages/runtime.md +265 -0
- package/docs/packages/s3.md +101 -0
- package/docs/preview-scope.md +142 -0
- package/docs/reference/README.md +33 -0
- package/docs/reference/cli-spec.json +575 -0
- package/docs/reference/cli.md +457 -0
- package/docs/reference/compatibility-matrix.md +169 -0
- package/docs/reference/diagnostics.md +1872 -0
- package/docs/reference/documentation-versions.json +22 -0
- package/docs/reference/environment.md +347 -0
- package/docs/reference/handler-authoring.md +264 -0
- package/docs/reference/project-config.md +582 -0
- package/docs/reference/project-config.schema.json +981 -0
- package/docs/reference/release-manifest.json +441 -0
- package/docs/reference/shell-completion.md +23 -0
- package/documentation-site.json +668 -0
- package/documentation-versions.json +22 -0
- package/examples/01-hello-json/.pulse/.gitignore +3 -0
- package/examples/01-hello-json/.pulse/config.ts +16 -0
- package/examples/01-hello-json/README.md +119 -0
- package/examples/01-hello-json/package.json +20 -0
- package/examples/01-hello-json/src/index.ts +9 -0
- package/examples/01-hello-json/tests/pulse.harness.ts +22 -0
- package/examples/01-hello-json/tsconfig.json +14 -0
- package/examples/02-request-schema/.pulse/.gitignore +3 -0
- package/examples/02-request-schema/.pulse/config.ts +17 -0
- package/examples/02-request-schema/README.md +145 -0
- package/examples/02-request-schema/package.json +20 -0
- package/examples/02-request-schema/src/index.ts +18 -0
- package/examples/02-request-schema/src/schemas.ts +20 -0
- package/examples/02-request-schema/tests/pulse.harness.ts +37 -0
- package/examples/02-request-schema/tsconfig.json +14 -0
- package/examples/03-fetch-composition/.pulse/.gitignore +3 -0
- package/examples/03-fetch-composition/.pulse/config.ts +31 -0
- package/examples/03-fetch-composition/README.md +210 -0
- package/examples/03-fetch-composition/package.json +20 -0
- package/examples/03-fetch-composition/src/index.ts +60 -0
- package/examples/03-fetch-composition/tests/pulse.harness.ts +47 -0
- package/examples/03-fetch-composition/tsconfig.json +14 -0
- package/examples/05-fastly-capabilities/.pulse/.gitignore +3 -0
- package/examples/05-fastly-capabilities/.pulse/config.ts +57 -0
- package/examples/05-fastly-capabilities/README.md +257 -0
- package/examples/05-fastly-capabilities/package.json +22 -0
- package/examples/05-fastly-capabilities/src/index.ts +55 -0
- package/examples/05-fastly-capabilities/tests/pulse.harness.ts +66 -0
- package/examples/05-fastly-capabilities/tsconfig.json +14 -0
- package/examples/07-opaque-proxy/.pulse/.gitignore +3 -0
- package/examples/07-opaque-proxy/.pulse/config.ts +38 -0
- package/examples/07-opaque-proxy/README.md +150 -0
- package/examples/07-opaque-proxy/package.json +21 -0
- package/examples/07-opaque-proxy/src/index.ts +9 -0
- package/examples/07-opaque-proxy/tests/pulse.harness.ts +25 -0
- package/examples/07-opaque-proxy/tsconfig.json +14 -0
- package/examples/09-router-lowering/.pulse/.gitignore +3 -0
- package/examples/09-router-lowering/.pulse/config.ts +22 -0
- package/examples/09-router-lowering/README.md +287 -0
- package/examples/09-router-lowering/package.json +22 -0
- package/examples/09-router-lowering/src/index.ts +65 -0
- package/examples/09-router-lowering/tests/pulse.harness.ts +91 -0
- package/examples/09-router-lowering/tsconfig.json +14 -0
- package/examples/10-entities-tools/.pulse/.gitignore +4 -0
- package/examples/10-entities-tools/.pulse/config.ts +23 -0
- package/examples/10-entities-tools/README.md +165 -0
- package/examples/10-entities-tools/package.json +21 -0
- package/examples/10-entities-tools/src/handlers.ts +15 -0
- package/examples/10-entities-tools/src/index.ts +31 -0
- package/examples/10-entities-tools/src/schemas.ts +18 -0
- package/examples/10-entities-tools/tests/pulse.harness.ts +40 -0
- package/examples/10-entities-tools/tools-facade.cjs +158 -0
- package/examples/10-entities-tools/tsconfig.json +14 -0
- package/examples/11-events/.pulse/.gitignore +4 -0
- package/examples/11-events/.pulse/config.ts +24 -0
- package/examples/11-events/README.md +194 -0
- package/examples/11-events/package.json +20 -0
- package/examples/11-events/src/index.ts +27 -0
- package/examples/11-events/src/schemas.ts +19 -0
- package/examples/11-events/tests/pulse.harness.ts +34 -0
- package/examples/11-events/tsconfig.json +15 -0
- package/examples/12-mcp-proxy/.pulse/.gitignore +3 -0
- package/examples/12-mcp-proxy/.pulse/config.ts +25 -0
- package/examples/12-mcp-proxy/README.md +149 -0
- package/examples/12-mcp-proxy/package.json +20 -0
- package/examples/12-mcp-proxy/src/index.ts +17 -0
- package/examples/12-mcp-proxy/tests/pulse.harness.ts +29 -0
- package/examples/12-mcp-proxy/tsconfig.json +14 -0
- package/examples/13-jwt-es256/.pulse/config.ts +19 -0
- package/examples/13-jwt-es256/README.md +195 -0
- package/examples/13-jwt-es256/package.json +21 -0
- package/examples/13-jwt-es256/src/index.ts +21 -0
- package/examples/13-jwt-es256/tests/pulse.harness.ts +54 -0
- package/examples/13-jwt-es256/tsconfig.json +14 -0
- package/examples/README.md +36 -0
- package/package.json +66 -6
- package/project-config.schema.json +981 -0
- package/release-manifest.json +441 -0
- package/src/command-spec.js +279 -0
- package/src/completion.js +113 -0
- package/src/diagnostics.js +350 -0
- package/src/documentation.js +45 -0
- package/src/index.d.ts +133 -0
- package/src/index.js +15 -0
- package/src/internal/command-executor.d.ts +29 -0
- package/src/internal/command-executor.js +143 -0
- package/src/internal/command-plan.d.ts +9 -0
- package/src/internal/command-plan.js +73 -0
- package/src/internal/command-reporter.d.ts +15 -0
- package/src/internal/command-reporter.js +133 -0
- package/src/internal/command-request.d.ts +35 -0
- package/src/internal/command-request.js +154 -0
- package/src/internal/node-http.js +54 -0
- package/src/internal/project-context.d.ts +66 -0
- package/src/internal/project-context.js +175 -0
- package/src/project-config-reference.js +4 -0
- package/src/project-config-schema.d.ts +23 -0
- package/src/project-config-schema.js +271 -0
- package/src/project-config.js +724 -0
- package/src/project-execution.js +2946 -0
- package/src/provider-drivers.js +3 -0
- package/src/target-support.js +3 -0
- package/src/typescript-module-loader.js +269 -0
- package/src/workflow.js +78 -0
- package/src/workspace.js +82 -0
|
@@ -0,0 +1,293 @@
|
|
|
1
|
+
<!-- pulse-doc-meta:start
|
|
2
|
+
owner: maintainer-council
|
|
3
|
+
status: active
|
|
4
|
+
last-reviewed: 2026-07-16
|
|
5
|
+
review-by: 2027-01-16
|
|
6
|
+
pulse-doc-meta:end -->
|
|
7
|
+
|
|
8
|
+
# Release packages and clean-consumer acceptance
|
|
9
|
+
|
|
10
|
+
The current Beta candidate contains nineteen publishable packages
|
|
11
|
+
synchronized at version `1.0.0-beta.2`. The product-facing packages are:
|
|
12
|
+
|
|
13
|
+
```text
|
|
14
|
+
@pulse-compute/pulse
|
|
15
|
+
@pulse-compute/runtime
|
|
16
|
+
@pulse-compute/cli
|
|
17
|
+
@pulse-compute/provider-fastly
|
|
18
|
+
@pulse-compute/grip
|
|
19
|
+
@pulse-compute/assets
|
|
20
|
+
@pulse-compute/crypto
|
|
21
|
+
@pulse-compute/jwt
|
|
22
|
+
@pulse-compute/entities
|
|
23
|
+
@pulse-compute/s3
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
The CLI and providers depend on additional `@pulse-compute/wasm-*`
|
|
27
|
+
implementation packages. Those packages are installable transitive
|
|
28
|
+
dependencies, not the handler authoring surface. The generated
|
|
29
|
+
[package support policy](../packages/README.md) defines the tier, audience,
|
|
30
|
+
direct-install guidance, and supported entry points for all 19 artifacts.
|
|
31
|
+
|
|
32
|
+
## S3 candidate acceptance
|
|
33
|
+
|
|
34
|
+
The S3 package root supports bounded `head`, `getText` and `putText` on Node
|
|
35
|
+
Native, Node JavaScript and Fastly Native. The clean-consumer gate repeats the
|
|
36
|
+
same read and write failure corpus using installed package exports, packaged
|
|
37
|
+
lowering and provider builds. It type-checks the public declarations and
|
|
38
|
+
compares every installed Pulse package file against its exact tarball both
|
|
39
|
+
before and after execution. No workspace links or installed dependency edits
|
|
40
|
+
are permitted. The report `s3-packed-acceptance.json` includes all tarball
|
|
41
|
+
SHA-256 identities and target execution counts in the acceptance task directory.
|
|
42
|
+
|
|
43
|
+
Fastly's host ABI fixture supplies the platform to compiled Wasm; no workspace
|
|
44
|
+
product implementation is loaded by the packed consumer. Fastly JavaScript S3
|
|
45
|
+
remains ineligible for its documented raw-header limitation. Local acceptance
|
|
46
|
+
does not claim live Object Storage behavior. That separate evidence follows
|
|
47
|
+
infrastructure setup (T2); package promotion does not publish npm artifacts or
|
|
48
|
+
change the existing registry bootstrap and release approval gates.
|
|
49
|
+
|
|
50
|
+
## Conditional KV acceptance
|
|
51
|
+
|
|
52
|
+
Conditional KV has additional required acceptance beyond the aggregate release
|
|
53
|
+
profile and the generic Fastly Compute reality task:
|
|
54
|
+
|
|
55
|
+
- `node wasm/scripts/run-wasm-tests.cjs --task kv-conditional-acceptance --no-report`
|
|
56
|
+
installs exact candidate tarballs and executes the Native consumer through
|
|
57
|
+
Fastly CLI/Viceroy. An unavailable engine or semantic failure fails this gate.
|
|
58
|
+
- Full deployed Pulse cross-location acceptance uses the reviewed isolated
|
|
59
|
+
environment and probe driver described in the
|
|
60
|
+
[K4 acceptance record](https://github.com/pulse-compute/pulse/blob/latest/wasm/test/kv/K4.md).
|
|
61
|
+
|
|
62
|
+
The retained Viceroy 0.21.0 run fails missing-key CAS. The standalone deployed
|
|
63
|
+
Rust SDK probe confirms rejection for never-created and deleted keys in its
|
|
64
|
+
tested cases, but does not satisfy either required Pulse acceptance gate. Full
|
|
65
|
+
Pulse deployed cross-location evidence remains pending the isolated environment.
|
|
66
|
+
|
|
67
|
+
Report these gates separately even when `release:seal -- --require-fastly`
|
|
68
|
+
passes: that command does not include the dedicated K4 acceptance task or its
|
|
69
|
+
deployed runner. Preserve the local failure and pending deployed requirement as
|
|
70
|
+
release-readiness blockers. An explicit human-directed acceptance-policy change
|
|
71
|
+
must specify any replacement evidence and update the owning gates and current
|
|
72
|
+
contracts; a guidance update alone neither waives a gate nor changes CAS behavior.
|
|
73
|
+
|
|
74
|
+
## Event experimental candidate
|
|
75
|
+
|
|
76
|
+
Before changing release identity or package composition, the event surface has
|
|
77
|
+
its own evidence-only package and consumer seal:
|
|
78
|
+
|
|
79
|
+
```bash
|
|
80
|
+
node wasm/scripts/run-wasm-tests.cjs --task events-candidate-seal --no-report
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
That task packs `@pulse-compute/pulse`, `@pulse-compute/runtime`, and their
|
|
84
|
+
public contract dependency, installs the exact tarballs without network access,
|
|
85
|
+
type-checks both application and host-maintainer event consumers, checks legal
|
|
86
|
+
and dependency closure, and compares a second pack byte-for-byte. It also emits
|
|
87
|
+
the event candidate decision and a blocker ledger under `wasm/.test-results`.
|
|
88
|
+
|
|
89
|
+
Passing this focused seal means the event-facing package closure is internally
|
|
90
|
+
consistent. It does not authorize publication or claim Fastly/browser/ESP32
|
|
91
|
+
event support.
|
|
92
|
+
|
|
93
|
+
## Check documentation release integrity
|
|
94
|
+
|
|
95
|
+
```bash
|
|
96
|
+
pnpm docs:check
|
|
97
|
+
node scripts/documentation-release.cjs
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
The documentation checks verify:
|
|
101
|
+
|
|
102
|
+
- generated documentation/package files and source-bound Markdown blocks are synchronized;
|
|
103
|
+
- canonical repository, installed-package, and exact-version hosted links and anchors resolve;
|
|
104
|
+
- every package has one generated status block and required repository metadata derived from the release manifest;
|
|
105
|
+
- each advertised supported package entry point exists in `exports` or `bin`;
|
|
106
|
+
- every public diagnostic has one real anchor and an exact-version docs URL;
|
|
107
|
+
- installed help, the public reference, the machine-readable command specification, and three shell completions agree on the public command and option set;
|
|
108
|
+
- public project, schema, development, test, and Fastly configuration fields and runtime rules agree with the shared schema and runtime normalization;
|
|
109
|
+
- the Fastly provider schema agrees with provider defaults and the compiled package payload;
|
|
110
|
+
- recognized environment variables agree with their generated scope reference;
|
|
111
|
+
- public plugin claims remain blocked until all six trust, discovery, compatibility, loading, and security prerequisites are implemented;
|
|
112
|
+
- contributor and governance pages carry valid owner, status, review, and stale-date metadata;
|
|
113
|
+
- the exact-version documentation site contains release banners, local search, and version navigation.
|
|
114
|
+
|
|
115
|
+
Maintainer-only task and report controls remain available to repository truth suites but are absent from installed help and the public CLI reference.
|
|
116
|
+
|
|
117
|
+
## Pack a release candidate
|
|
118
|
+
|
|
119
|
+
From the source workspace:
|
|
120
|
+
|
|
121
|
+
```bash
|
|
122
|
+
pnpm release:pack
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
This builds the workspace and writes nineteen package tarballs plus `pulse-release-manifest.json` under `.pulse-release/`. It prepares release artifacts; it does not publish them to a registry.
|
|
126
|
+
|
|
127
|
+
Packing fails when:
|
|
128
|
+
|
|
129
|
+
- a package is private or versions diverge;
|
|
130
|
+
- a packed dependency retains `workspace:`;
|
|
131
|
+
- repository-only tests or internal documentation leak into a tarball;
|
|
132
|
+
- required API/CLI reference files are absent;
|
|
133
|
+
- a Markdown link or anchor is dead after extraction;
|
|
134
|
+
- a link escapes its package root;
|
|
135
|
+
- an exact-version Pulse documentation URL does not map to a real file and anchor in the packed release set.
|
|
136
|
+
|
|
137
|
+
`@pulse-compute/runtime` ships its canonical API and preview-scope references.
|
|
138
|
+
`@pulse-compute/cli` ships the public documentation hierarchy,
|
|
139
|
+
API/CLI/config/diagnostic/package references, bounded compatibility material,
|
|
140
|
+
and runnable example sources.
|
|
141
|
+
|
|
142
|
+
## Clean-consumer acceptance
|
|
143
|
+
|
|
144
|
+
```bash
|
|
145
|
+
node wasm/scripts/run-wasm-tests.cjs --task clean-machine-acceptance --no-report
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
The release task creates an isolated npm home and cache, installs exact packed candidates rather than workspace links, and validates:
|
|
149
|
+
|
|
150
|
+
```text
|
|
151
|
+
install
|
|
152
|
+
→ pulse init
|
|
153
|
+
→ npm install
|
|
154
|
+
→ pulse doctor
|
|
155
|
+
→ pulse inspect
|
|
156
|
+
→ pulse test
|
|
157
|
+
→ pulse dev --once
|
|
158
|
+
→ pulse build
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
It runs that workflow for new Native and JavaScript Node/Fastly projects,
|
|
162
|
+
verifies a real Fastly Native `bin/main.wasm`, and installs/builds the canonical
|
|
163
|
+
GRIP and Router examples from the packed package set. The two JavaScript
|
|
164
|
+
projects prove packed `inspect`, passing `doctor`, `test`, one-request `dev`,
|
|
165
|
+
provider-neutral `compile`, and deterministic `build`. Their executable source
|
|
166
|
+
packages contain exact reachable dependencies, no Native planning artifacts,
|
|
167
|
+
and `automaticFallback: false`. The Node target satisfies all 12 support gates;
|
|
168
|
+
the Fastly target satisfies all six support gates, emits source/deployment
|
|
169
|
+
manifests with provider reality and deployment still false, and does not install
|
|
170
|
+
the downstream Fastly compiler into an ordinary Pulse consumer.
|
|
171
|
+
|
|
172
|
+
## Offline deployment candidates
|
|
173
|
+
|
|
174
|
+
```bash
|
|
175
|
+
npm run release:candidates
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
This gate builds the representative Fastly Native and Fastly JavaScript targets
|
|
179
|
+
twice from the same output location. Native output, including `bin/main.wasm`,
|
|
180
|
+
must be byte-identical. Fastly JavaScript source, deployment metadata, and exact
|
|
181
|
+
toolchain closure must be byte-identical; one closure is then compiled by the
|
|
182
|
+
pinned `@fastly/js-compute` runtime compiler into `bin/main.wasm`.
|
|
183
|
+
|
|
184
|
+
The downstream Wizer snapshot is recorded by exact SHA-256 but is not presented
|
|
185
|
+
as byte-reproducible. The candidate report distinguishes that toolchain-owned
|
|
186
|
+
property from Pulse-owned deterministic input and metadata. It also records zero
|
|
187
|
+
provider-reality runs, zero deployments, and zero publications.
|
|
188
|
+
|
|
189
|
+
The task owns the nineteen publishable Pulse packages, not the packages in the
|
|
190
|
+
development installation. It installs every exact Pulse tarball into clean
|
|
191
|
+
consumer projects and verifies the installed name, version, and real path. An
|
|
192
|
+
ephemeral server bound to `127.0.0.1` is the fail-closed registry for the
|
|
193
|
+
`@pulse-compute` scope, so an undeclared or missing Pulse candidate cannot fall
|
|
194
|
+
through to a previously published package. Third-party dependencies resolve
|
|
195
|
+
from the canonical npm registry according to the packed manifests; the release
|
|
196
|
+
gate does not repack or assume ownership of `assemblyscript`, `long`, `esbuild`,
|
|
197
|
+
or other external packages. Lockfile and dependency evidence remain separate
|
|
198
|
+
workspace inputs.
|
|
199
|
+
|
|
200
|
+
External Fastly Compute execution is also separate:
|
|
201
|
+
|
|
202
|
+
```bash
|
|
203
|
+
PULSE_FASTLY_BIN=/path/to/fastly \
|
|
204
|
+
node wasm/scripts/run-wasm-tests.cjs --task provider-fastly-compute-reality --no-report
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
The task records the Fastly CLI version, invokes `fastly compute serve --file`, and lets the CLI own its local Compute engine. It then sends real HTTP requests through the generated native module. `PULSE_VICEROY_BIN` remains available only as an explicit lower-level reproduction override. The fixture covers schemas, configuration, secrets, KV persistence, named-backend fetch, opaque bytes, repeated headers, and GRIP hold/publish. It does not deploy or activate a Fastly service.
|
|
208
|
+
|
|
209
|
+
The aggregate candidate seal is:
|
|
210
|
+
|
|
211
|
+
```bash
|
|
212
|
+
npm run release:seal
|
|
213
|
+
```
|
|
214
|
+
|
|
215
|
+
It restores dependencies, validates the repository and generated documentation, runs the complete release profile, and adds the external Fastly task when the Fastly CLI can start its managed local Compute lifecycle. Use `--require-fastly` to make that host proof mandatory.
|
|
216
|
+
|
|
217
|
+
The seal also regenerates the production vulnerability and installed-platform
|
|
218
|
+
license closure. It does not depend on mutable npm trusted-publisher settings,
|
|
219
|
+
GitHub publication environments, public repository administration, or the
|
|
220
|
+
production documentation origin. Those remain blocking at publication or
|
|
221
|
+
documentation deployment, where the corresponding authority is actually used.
|
|
222
|
+
|
|
223
|
+
With a clean passing seal, create the release evidence delivery:
|
|
224
|
+
|
|
225
|
+
```bash
|
|
226
|
+
npm run release:evidence -- \
|
|
227
|
+
--base <accepted-source-ref> \
|
|
228
|
+
--head HEAD \
|
|
229
|
+
--label <delivery-name> \
|
|
230
|
+
--out <new-output-directory>
|
|
231
|
+
```
|
|
232
|
+
|
|
233
|
+
The evidence authority checks that all reports belong to the exact head
|
|
234
|
+
revision, aggregates sixteen passing shards, creates source and binary-patch
|
|
235
|
+
artifacts, independently applies the patch to the accepted source archive, and
|
|
236
|
+
compares path, mode, and bytes with the sealed head. The resulting bundle is
|
|
237
|
+
offline evidence only; merge, tagging, deployment, activation, and publication
|
|
238
|
+
remain human-authority operations.
|
|
239
|
+
|
|
240
|
+
## Publication workflow
|
|
241
|
+
|
|
242
|
+
After all dependency-bound acceptance passes, seal the exact tarballs:
|
|
243
|
+
|
|
244
|
+
```bash
|
|
245
|
+
npm run release:candidate
|
|
246
|
+
npm run release:verify-bundle
|
|
247
|
+
npm run publication:check
|
|
248
|
+
```
|
|
249
|
+
|
|
250
|
+
Production publication is performed only by the manually dispatched **npm
|
|
251
|
+
publication** workflow at the exact release tag. Its protected `npm-publish` job
|
|
252
|
+
uses npm trusted publishing through GitHub OIDC, publishes the tarballs from
|
|
253
|
+
`.pulse-publication` in dependency-safe order, accepts an already-published
|
|
254
|
+
version only when registry integrity matches, and verifies every configured
|
|
255
|
+
dist-tag. A separate job installs the published CLI in a clean prefix and
|
|
256
|
+
completes init, install, doctor, test, and build smoke checks.
|
|
257
|
+
|
|
258
|
+
Before the first trusted publication, every package name must exist and authorize the exact repository, `npm-publish.yml` workflow, and `npm-publish` environment. Use the package-name audit and a one-time human 2FA bootstrap for any missing names. No long-lived npm token is part of the normal workflow.
|
|
259
|
+
|
|
260
|
+
## Publication hold points
|
|
261
|
+
|
|
262
|
+
Before publication, confirm the repository, final documentation host/base path, package policy, and issue-tracker values centralized in `release/pulse-release-manifest.json`. Pulse is licensed under Apache-2.0: the release gate requires the exact root `LICENSE`, SPDX metadata in the workspace and all nineteen publishable packages, and the same license text in every npm tarball. A dependency-license audit and its dispositions remain separate release evidence.
|
|
263
|
+
|
|
264
|
+
A human release authority must approve `npm-publish`. Codex may diagnose or prepare a patch but cannot publish, approve the environment, bootstrap package names, or mutate dist-tags.
|
|
265
|
+
|
|
266
|
+
## Versioned documentation artifact
|
|
267
|
+
|
|
268
|
+
The release owns a versioned hosted-documentation gate:
|
|
269
|
+
|
|
270
|
+
```bash
|
|
271
|
+
pnpm docs:site:check
|
|
272
|
+
```
|
|
273
|
+
|
|
274
|
+
The check builds the exact `v1.0.0-beta.2` site and `latest` tree in a temporary directory, creates one search entry per public page, validates local hosted links, verifies release/version manifests, and requires the search, version, owner, and review UI on every page.
|
|
275
|
+
|
|
276
|
+
The **Documentation** workflow repeats those checks for pull requests and `main`, seals a preview deployment manifest, and uploads artifacts without production credentials. It does not deploy to GitHub Pages.
|
|
277
|
+
|
|
278
|
+
Production delivery uses the manually dispatched **Documentation deployment** workflow and Fastly Object Storage. The workflow:
|
|
279
|
+
|
|
280
|
+
```text
|
|
281
|
+
build and seal
|
|
282
|
+
→ upload/verify v1.0.0-beta.2 and its receipt immutably
|
|
283
|
+
→ verify all matching npm packages and configured dist-tags
|
|
284
|
+
→ promote root and latest
|
|
285
|
+
→ verify representative URLs through Fastly
|
|
286
|
+
```
|
|
287
|
+
|
|
288
|
+
The deployment never deletes bucket objects. A pre-existing immutable key with different SHA-256 fails before promotion. The `documentation-production` environment, Object Storage credentials, VCL service, final public origin, and service activation remain under human release/infrastructure authority.
|
|
289
|
+
|
|
290
|
+
Release packing also checks the installed CLI command specification,
|
|
291
|
+
configuration schema bundle, release/version manifests, shell completions,
|
|
292
|
+
current architecture and plugin-readiness records, maintenance policy, and
|
|
293
|
+
publication/deployment references.
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
# Release manifest and generated package policy
|
|
2
|
+
|
|
3
|
+
<!-- Generated by wasm/scripts/sync-reference-docs.cjs. Edit the source catalog, not this file. -->
|
|
4
|
+
|
|
5
|
+
`release/pulse-release-manifest.json` is the canonical owner of the synchronized release version, documentation origin and exact segment, repository metadata, support tiers, package roles, direct-install guidance, supported entry points, and stability promises.
|
|
6
|
+
|
|
7
|
+
## Beta candidate
|
|
8
|
+
|
|
9
|
+
- **Candidate:** Pulse 1.0.0-beta.2 — Beta
|
|
10
|
+
- **Version:** `1.0.0-beta.2`
|
|
11
|
+
- **Activation stage:** `documentation-release`
|
|
12
|
+
- **License:** `Apache-2.0`
|
|
13
|
+
- **Supported Node:** `^22.14.0 || ^24.0.0`
|
|
14
|
+
- **Minimum Node:** `22.14.0`
|
|
15
|
+
- **Release seal Node:** `^24.0.0`; the exact patch used is recorded in seal evidence
|
|
16
|
+
- **Reproducible publication toolchain:** Node `24.18.0` with npm `11.15.0`
|
|
17
|
+
- **Readiness register:** `release/release-preflight.json`
|
|
18
|
+
- **Documentation inventory:** `release/documentation-inventory.json`
|
|
19
|
+
- **Exact documentation:** `https://pulsecompute.io/v1.0.0-beta.2/`
|
|
20
|
+
- **Runtime targets:** 3
|
|
21
|
+
- **Packages:** 19
|
|
22
|
+
|
|
23
|
+
The installed CLI ships the same machine-readable data as
|
|
24
|
+
`release-manifest.json`. The atomic snapshot transaction aligns
|
|
25
|
+
the Beta label, `beta` channel,
|
|
26
|
+
release date, package metadata, and exact-version documentation inputs. Tooling
|
|
27
|
+
can read [the hosted JSON copy](../reference/release-manifest.json) without scraping
|
|
28
|
+
package READMEs.
|
|
29
|
+
|
|
30
|
+
## Generated consumers
|
|
31
|
+
|
|
32
|
+
The manifest drives:
|
|
33
|
+
|
|
34
|
+
- all package README status blocks;
|
|
35
|
+
- the [package support table](../packages/README.md) and tier pages;
|
|
36
|
+
- package repository, homepage, and bug metadata;
|
|
37
|
+
- supported-entry-point release checks;
|
|
38
|
+
- release prerequisites and documentation classification;
|
|
39
|
+
- exact-version documentation URLs;
|
|
40
|
+
- the homepage target pipeline and release badge;
|
|
41
|
+
- the hosted version banner and release search index.
|
|
42
|
+
|
|
43
|
+
## Runtime targets
|
|
44
|
+
|
|
45
|
+
| ID | Label | Mode | Contract |
|
|
46
|
+
|---|---|---|---|
|
|
47
|
+
| `node` | Node | `execute` | Explicit Native and generally available JavaScript execution over one canonical application contract. |
|
|
48
|
+
| `fastly` | Fastly Compute | `execute-and-build` | Explicit Native direct-host-ABI Wasm and generally available JavaScript source/deployment candidates. |
|
|
49
|
+
| `none` | Compile only | `compile` | Compilation and inspection without a runnable provider target. |
|
|
50
|
+
|
|
51
|
+
The target list is consumed by the public homepage and must stay aligned with
|
|
52
|
+
the built-in provider support catalog and project configuration schema.
|
|
53
|
+
Project-owned provider packages do not become official release targets merely
|
|
54
|
+
because a project selects them through the namespace convention or an exact
|
|
55
|
+
scoped package name.
|
|
56
|
+
|
|
57
|
+
## Support tiers
|
|
58
|
+
|
|
59
|
+
| ID | Label | Promise |
|
|
60
|
+
|---|---|---|
|
|
61
|
+
| `canonical-application` | Canonical application surface | Fully documented and supported as the Pulse application authoring or workflow contract. |
|
|
62
|
+
| `supported-extension` | Supported provider/extension surface | Documented entry points are supported; implementation and toolchain subpaths are explicitly excluded. |
|
|
63
|
+
| `implementation` | Implementation/transitive surface | Installable as part of the synchronized release set, without an application-author compatibility guarantee. |
|
|
64
|
+
|
|
65
|
+
## Synchronized packages
|
|
66
|
+
|
|
67
|
+
| Package | Support tier | Canonical guide | Direct installation |
|
|
68
|
+
|---|---|---|---|
|
|
69
|
+
| [`@pulse-compute/runtime`](https://www.npmjs.com/package/@pulse-compute/runtime) | Canonical application surface | [Guide](../packages/runtime.md) | Yes. Install it in every Pulse application. |
|
|
70
|
+
| [`@pulse-compute/pulse`](https://www.npmjs.com/package/@pulse-compute/pulse) | Canonical application surface | [Guide](../packages/pulse.md) | Yes. Install it in every conventional Pulse project. |
|
|
71
|
+
| [`@pulse-compute/cli`](https://www.npmjs.com/package/@pulse-compute/cli) | Canonical application surface | [Guide](../packages/cli.md) | Yes. Install the package globally or as a project development dependency. |
|
|
72
|
+
| [`@pulse-compute/provider-fastly`](https://www.npmjs.com/package/@pulse-compute/provider-fastly) | Supported provider/extension surface | [Guide](../packages/provider-fastly.md) | Yes, for Fastly projects. Node-only projects do not need to import it directly. |
|
|
73
|
+
| [`@pulse-compute/grip`](https://www.npmjs.com/package/@pulse-compute/grip) | Supported provider/extension surface | [Guide](../packages/grip.md) | Yes, only when the application uses GRIP/Fanout behavior. |
|
|
74
|
+
| [`@pulse-compute/assets`](https://www.npmjs.com/package/@pulse-compute/assets) | Supported provider/extension surface | [Guide](../packages/assets.md) | Yes, only when the application uses the assets capability. |
|
|
75
|
+
| [`@pulse-compute/crypto`](https://www.npmjs.com/package/@pulse-compute/crypto) | Supported provider/extension surface | [Guide](../packages/crypto.md) | Yes, when an application uses the crypto verification surface directly; JWT applications receive it transitively. |
|
|
76
|
+
| [`@pulse-compute/jwt`](https://www.npmjs.com/package/@pulse-compute/jwt) | Supported provider/extension surface | [Guide](../packages/jwt.md) | Yes, when an application verifies JWTs. |
|
|
77
|
+
| [`@pulse-compute/entities`](https://www.npmjs.com/package/@pulse-compute/entities) | Supported provider/extension surface | [Guide](../packages/entities.md) | Yes, when an application declares entity operations. |
|
|
78
|
+
| [`@pulse-compute/s3`](https://www.npmjs.com/package/@pulse-compute/s3) | Supported provider/extension surface | [Guide](../packages/s3.md) | Yes, when an application uses S3 object operations. |
|
|
79
|
+
| [`@pulse-compute/wasm-build-support`](https://www.npmjs.com/package/@pulse-compute/wasm-build-support) | Implementation/transitive surface | [Guide](../packages/implementation-packages.md) | No for application projects; it is installed transitively where required. |
|
|
80
|
+
| [`@pulse-compute/wasm-compiler`](https://www.npmjs.com/package/@pulse-compute/wasm-compiler) | Implementation/transitive surface | [Guide](../packages/implementation-packages.md) | No for application projects; use the pulse CLI. |
|
|
81
|
+
| [`@pulse-compute/wasm-guest-link`](https://www.npmjs.com/package/@pulse-compute/wasm-guest-link) | Implementation/transitive surface | [Guide](../packages/implementation-packages.md) | No for application projects; it is an internal synchronized compiler dependency. |
|
|
82
|
+
| [`@pulse-compute/wasm-contracts`](https://www.npmjs.com/package/@pulse-compute/wasm-contracts) | Implementation/transitive surface | [Guide](../packages/implementation-packages.md) | Provider toolchain authors may install it for the versioned bootstrap contract; application projects receive it transitively. |
|
|
83
|
+
| [`@pulse-compute/wasm-host-runtime`](https://www.npmjs.com/package/@pulse-compute/wasm-host-runtime) | Implementation/transitive surface | [Guide](../packages/implementation-packages.md) | No for application projects; it is installed transitively. |
|
|
84
|
+
| [`@pulse-compute/wasm-library-kit`](https://www.npmjs.com/package/@pulse-compute/wasm-library-kit) | Implementation/transitive surface | [Guide](../packages/implementation-packages.md) | No for application projects; it is installed transitively. |
|
|
85
|
+
| [`@pulse-compute/provider-node`](https://www.npmjs.com/package/@pulse-compute/provider-node) | Implementation/transitive surface | [Guide](../packages/implementation-packages.md) | No for application projects; select provider: node through the CLI. |
|
|
86
|
+
| [`@pulse-compute/wasm-runtime-core-as`](https://www.npmjs.com/package/@pulse-compute/wasm-runtime-core-as) | Implementation/transitive surface | [Guide](../packages/implementation-packages.md) | No for application projects; it is installed transitively. |
|
|
87
|
+
| [`@pulse-compute/wasm-schema-json`](https://www.npmjs.com/package/@pulse-compute/wasm-schema-json) | Implementation/transitive surface | [Guide](../packages/implementation-packages.md) | No for application projects; declare schemas in the selected .pulse/config.ts profile. |
|
|
88
|
+
|
|
89
|
+
A package export that is absent from its manifest entry is not promoted to a supported application-author API merely because Node or npm can resolve it.
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
<!-- pulse-doc-meta:start
|
|
2
|
+
owner: maintainer-council
|
|
3
|
+
status: active
|
|
4
|
+
last-reviewed: 2026-07-25
|
|
5
|
+
review-by: 2027-01-25
|
|
6
|
+
pulse-doc-meta:end -->
|
|
7
|
+
|
|
8
|
+
# Repository setup
|
|
9
|
+
|
|
10
|
+
Files in this repository define the desired control plane, but GitHub teams, rulesets, environments, secrets, connected services, security settings, and production delivery configuration live outside Git. A repository owner must apply these steps after cloning or transferring the repository.
|
|
11
|
+
|
|
12
|
+
## 1. Create the maintainer team
|
|
13
|
+
|
|
14
|
+
Create a visible organization team with the slug:
|
|
15
|
+
|
|
16
|
+
```text
|
|
17
|
+
pulse-compute/pulse-maintainers
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
Give the team write access to the repository and add the human architecture and release authority. The generated `.github/CODEOWNERS` file assigns protected areas to `@pulse-compute/pulse-maintainers`; GitHub cannot request that team until it exists, is visible, and has repository access.
|
|
21
|
+
|
|
22
|
+
## 2. Restrict Actions and synchronize labels
|
|
23
|
+
|
|
24
|
+
In the repository's Actions settings, allow only GitHub-authored actions and the explicitly required external action, or use an equivalent organization allowlist. Every checked-in action reference is pinned to a reviewed full commit SHA recorded in `release/maintenance-policy.json`.
|
|
25
|
+
|
|
26
|
+
Run the manual **Maintainer labels** workflow from the default branch. It creates or updates the labels generated in `.github/labels.yml` from `release/maintenance-policy.json`.
|
|
27
|
+
|
|
28
|
+
Labels classify intake and review state. They do not authorize implementation or merge.
|
|
29
|
+
|
|
30
|
+
## 3. Create a branch ruleset for `main`
|
|
31
|
+
|
|
32
|
+
Create a ruleset targeting the default branch and require pull requests. Recommended settings are:
|
|
33
|
+
|
|
34
|
+
- at least one approving review;
|
|
35
|
+
- approval from code owners;
|
|
36
|
+
- dismissal of stale approvals after new commits;
|
|
37
|
+
- conversation resolution;
|
|
38
|
+
- blocked force pushes and deletion;
|
|
39
|
+
- no Codex, Actions-token, or automation-account bypass; and
|
|
40
|
+
- these exact status checks from `release/maintenance-policy.json`:
|
|
41
|
+
- `Maintainer scope / scope`
|
|
42
|
+
- `Repository validation / maintenance`
|
|
43
|
+
- `Repository validation / node-floor`
|
|
44
|
+
- `Repository validation / portable`
|
|
45
|
+
- `Documentation / build`
|
|
46
|
+
|
|
47
|
+
Keep workflow, CODEOWNERS, `AGENTS.md`, release-policy, and governance changes under CODEOWNER review. The deterministic scope workflow executes the classifier from an archive of the pull request's trusted base commit rather than running the proposed classifier.
|
|
48
|
+
|
|
49
|
+
The portable validation job installs the lockfile-pinned workspace graph with lifecycle scripts disabled, builds the workspace outputs needed by tests, and runs the unit, native, JavaScript, and conformance profiles. It does not replace provider, CLI, package, clean-consumer, or external-host evidence in the aggregate release seal.
|
|
50
|
+
|
|
51
|
+
## 4. Create the protected Codex environment
|
|
52
|
+
|
|
53
|
+
Create a GitHub Actions environment named:
|
|
54
|
+
|
|
55
|
+
```text
|
|
56
|
+
codex-maintainer
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
Configure it to allow deployment only from the default branch. When supported by the repository plan and desired operating model, require a human reviewer before the job starts.
|
|
60
|
+
|
|
61
|
+
Add this environment secret:
|
|
62
|
+
|
|
63
|
+
```text
|
|
64
|
+
OPENAI_API_KEY
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
Do not add the key as a broadly available repository secret. GitHub releases an environment secret to a job only after the configured environment protection rules pass.
|
|
68
|
+
|
|
69
|
+
The manual **Codex maintainer review** workflow also checks that it was dispatched from the default branch. It checks out the pull-request merge ref only to obtain the Git objects, then runs Codex from a separate nested checkout fixed at the trusted base commit. The proposed head is available through local review refs and cannot replace the `AGENTS.md`, policy, prompt, schema, or classifier governing that run. Before Codex starts, the workflow removes the outer proposed working tree so only the trusted nested checkout remains in the Actions workspace.
|
|
70
|
+
|
|
71
|
+
## 5. Configure Codex
|
|
72
|
+
|
|
73
|
+
Connect the repository in Codex cloud. Enable native code review when useful and choose whether review should be automatic or explicitly requested. Native review remains advisory and does not replace the repository's required checks.
|
|
74
|
+
|
|
75
|
+
For the policy-specific review, manually dispatch **Codex maintainer review** from the default branch and supply a pull-request number. The workflow uses the `codex-maintainer` environment and the `OPENAI_API_KEY` environment secret. It does not run on `pull_request_target`, forks, issue comments, pushes, or arbitrary untrusted triggers.
|
|
76
|
+
|
|
77
|
+
## 6. Enable security intake
|
|
78
|
+
|
|
79
|
+
Enable private vulnerability reporting and GitHub security advisories. The public security page directs reporters to the repository's private advisory form rather than a normal issue.
|
|
80
|
+
|
|
81
|
+
## 7. Configure npm trusted publishing
|
|
82
|
+
|
|
83
|
+
Create a protected GitHub Actions environment named:
|
|
84
|
+
|
|
85
|
+
```text
|
|
86
|
+
npm-publish
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
Allow deployment only from release tags and require a human release-authority reviewer. Do not add `NPM_TOKEN` or `NODE_AUTH_TOKEN` to the repository or environment.
|
|
90
|
+
|
|
91
|
+
For every package in `release/pulse-release-manifest.json`, first confirm that the package name exists under the intended npm owner. Missing names need a one-time human 2FA-protected bootstrap publication. Then configure npm trusted publishing with the exact repository, `npm-publish.yml` workflow filename, and `npm-publish` environment.
|
|
92
|
+
|
|
93
|
+
Select the exact `v<releaseVersion>` tag as the workflow ref, then run **npm
|
|
94
|
+
publication** manually. Confirm that the protected job receives OIDC only after
|
|
95
|
+
approval, the registry integrity report covers every package in the sealed
|
|
96
|
+
release catalog, the configured dist-tags point to the synchronized version,
|
|
97
|
+
and the clean published-CLI smoke test passes.
|
|
98
|
+
|
|
99
|
+
## 8. Configure documentation delivery
|
|
100
|
+
|
|
101
|
+
Create a protected GitHub Actions environment named:
|
|
102
|
+
|
|
103
|
+
```text
|
|
104
|
+
documentation-production
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
Allow deployment only from release tags and require a human release/infrastructure reviewer. Add bucket-limited read/write Object Storage credentials as environment secrets:
|
|
108
|
+
|
|
109
|
+
```text
|
|
110
|
+
FASTLY_OBJECT_STORAGE_ACCESS_KEY_ID
|
|
111
|
+
FASTLY_OBJECT_STORAGE_SECRET_ACCESS_KEY
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
Add these environment variables:
|
|
115
|
+
|
|
116
|
+
```text
|
|
117
|
+
FASTLY_OBJECT_STORAGE_BUCKET
|
|
118
|
+
FASTLY_OBJECT_STORAGE_REGION
|
|
119
|
+
FASTLY_OBJECT_STORAGE_ENDPOINT
|
|
120
|
+
PULSE_DOCUMENTATION_ORIGIN
|
|
121
|
+
PULSE_DOCUMENTATION_BASE_PATH
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
Create a separate bucket-limited read-only key for the Fastly VCL private origin. Do not expose that key to GitHub Actions, and do not place the read/write deployment key in VCL.
|
|
125
|
+
|
|
126
|
+
Install the checked-in snippets under `infra/fastly/documentation/` in a non-production Fastly service version, configure the regional Object Storage backend and protected origin credentials, then verify GET, HEAD, directory indexes, exact-version caching, root/latest caching, branded 404s, and security headers before manual activation.
|
|
127
|
+
|
|
128
|
+
The **Documentation** workflow now validates pull requests and `main` and uploads preview artifacts only. Select the exact release tag as the workflow ref, then manually dispatch **Documentation deployment**. It uploads and verifies immutable exact-version objects, verifies the matching npm catalog, promotes root/latest, and verifies the final route through Fastly. Before activation, change the release-owned documentation origin from the old Pages hostname to the final Fastly-served origin; the workflow rejects a mismatch.
|
|
129
|
+
|
|
130
|
+
## 9. Verify the installation
|
|
131
|
+
|
|
132
|
+
Open a test pull request that changes one documentation file. Keep the declaration block and set:
|
|
133
|
+
|
|
134
|
+
```text
|
|
135
|
+
Change class: documentation
|
|
136
|
+
Scope: inside-developer-preview
|
|
137
|
+
Protected boundaries: none
|
|
138
|
+
Human decision: not-required
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
Confirm that all four required checks report. Then change a control-plane file and confirm that CODEOWNER review is requested and the scope report names `maintenance-control-plane`.
|
|
142
|
+
|
|
143
|
+
Finally, manually run the Codex maintainer review from the default branch against the test pull request. Confirm that the environment protection activates, that one marked structured comment is created or updated, and that no secret is exposed to the posting job.
|
|
144
|
+
|
|
145
|
+
Repository settings are not validated from a source archive. Record completion in the release checklist or repository administration log.
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
<!-- pulse-doc-meta:start
|
|
2
|
+
owner: maintainer-council
|
|
3
|
+
status: active
|
|
4
|
+
last-reviewed: 2026-07-25
|
|
5
|
+
review-by: 2027-01-25
|
|
6
|
+
pulse-doc-meta:end -->
|
|
7
|
+
|
|
8
|
+
# Scope policy
|
|
9
|
+
|
|
10
|
+
The maintenance control plane separates routine work from product decisions. The exact catalog is generated in the [maintenance policy reference](./maintenance-policy.md); this page explains how to use it.
|
|
11
|
+
|
|
12
|
+
## Classify the intent
|
|
13
|
+
|
|
14
|
+
Every issue and pull request begins with one change class:
|
|
15
|
+
|
|
16
|
+
- **Defect** — documented or tested supported behavior is broken.
|
|
17
|
+
- **Hardening** — reliability, security, performance, diagnostics, or evidence improves without widening behavior.
|
|
18
|
+
- **Documentation** — explanation, examples, generated references, or presentation changes only.
|
|
19
|
+
- **Evidence** — a reproduction, fixture, benchmark, or experiment records information without creating a promise.
|
|
20
|
+
- **Scope expansion** — new syntax, capability, provider, effect, public export, or compatibility promise.
|
|
21
|
+
- **Architecture** — a trust boundary, execution contract, ownership rule, or governance mechanism changes.
|
|
22
|
+
- **Release** — publication, package composition, version, channel, deployment, signing, or provenance changes.
|
|
23
|
+
|
|
24
|
+
The first four classes can normally move to implementation and human review. The last three require a separate human decision before implementation is treated as approved direction.
|
|
25
|
+
|
|
26
|
+
A direct human task can supply that decision. Record its scope in the PR and
|
|
27
|
+
continue the necessary implementation, tests, canonical documentation,
|
|
28
|
+
regeneration and PR preparation. Do not ask again for the same direction.
|
|
29
|
+
New semantics or authority outside that scope still require a new decision;
|
|
30
|
+
implementation approval does not authorize merge, publication or deployment.
|
|
31
|
+
|
|
32
|
+
## Declare affected boundaries
|
|
33
|
+
|
|
34
|
+
Path rules conservatively infer protected boundaries, including the public API, effects and capabilities, continuations, lowerer trust, provider registry, configuration contract, compatibility surface, package publication, maintenance control plane, and release authority.
|
|
35
|
+
|
|
36
|
+
A path match does not claim that every edit changes the contract. It requires the pull request to name the boundary so reviewers can distinguish a mechanical edit from a semantic one.
|
|
37
|
+
|
|
38
|
+
## Pull-request declaration
|
|
39
|
+
|
|
40
|
+
Every pull request keeps this comment in its body:
|
|
41
|
+
|
|
42
|
+
```text
|
|
43
|
+
<!-- pulse-maintainer-declaration:start -->
|
|
44
|
+
Change class: defect
|
|
45
|
+
Scope: inside-developer-preview
|
|
46
|
+
Protected boundaries: none
|
|
47
|
+
Human decision: not-required
|
|
48
|
+
<!-- pulse-maintainer-declaration:end -->
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
Use comma-separated boundary IDs, or `none`. Use `required` when scope, architecture, or release authority needs an explicit decision.
|
|
52
|
+
|
|
53
|
+
`Human decision: required` identifies the decision authority even when the human
|
|
54
|
+
has already supplied direction. Keep the field accurate and describe the supplied
|
|
55
|
+
direction and any outstanding question in prose. The classifier does not verify
|
|
56
|
+
or grant approval. A protected-path match alone does not require this field to be
|
|
57
|
+
`required` for a defect that preserves the existing contract.
|
|
58
|
+
|
|
59
|
+
The `Maintainer scope / scope` check compares the declaration with changed paths. It has three outcomes:
|
|
60
|
+
|
|
61
|
+
- **pass** — the declaration is present and consistent with the conservative path inference;
|
|
62
|
+
- **decision-required** — the declaration is consistent and a separate human decision is correctly exposed;
|
|
63
|
+
- **fail** — the declaration is missing, uses unknown values, omits inferred boundaries, or contradicts the required decision state.
|
|
64
|
+
|
|
65
|
+
A decision-required result is not an agent approval or denial. Branch rules and CODEOWNER review remain the authority gate.
|
|
66
|
+
|
|
67
|
+
## Update current contracts
|
|
68
|
+
|
|
69
|
+
For each protected boundary, the maintenance policy records whether an approved
|
|
70
|
+
architecture or release change requires a current contract update. When it
|
|
71
|
+
does, edit the canonical present-tense architecture, concept, contributor,
|
|
72
|
+
governance, or release owner and update its executable evidence. Do not add a
|
|
73
|
+
chronological decision file instead of repairing current truth.
|
|
74
|
+
|
|
75
|
+
The [current architecture contracts](../architecture/current-contracts.md)
|
|
76
|
+
provide the ownership map. Git history and sealed checkpoints preserve the
|
|
77
|
+
superseded state.
|
|
78
|
+
|
|
79
|
+
## Select validation
|
|
80
|
+
|
|
81
|
+
The classifier returns required checks from the path policy. Portable checks can run in a source snapshot without the complete release dependency bundle. Dependency-bound checks remain mandatory before publication when their affected contract is touched.
|
|
82
|
+
|
|
83
|
+
Run the classifier locally with a pull-request body saved to a file:
|
|
84
|
+
|
|
85
|
+
```bash
|
|
86
|
+
node scripts/maintainer-scope.cjs \
|
|
87
|
+
--base <actual-pr-base-ref> \
|
|
88
|
+
--head HEAD \
|
|
89
|
+
--declaration-file /tmp/pulse-pr-body.md \
|
|
90
|
+
--check
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
Run the control-plane validation independently:
|
|
94
|
+
|
|
95
|
+
```bash
|
|
96
|
+
npm run maintainer:check
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
## Scope requests are evidence first
|
|
100
|
+
|
|
101
|
+
A request for a new provider, npm compatibility, streaming primitive, lowerer
|
|
102
|
+
API, agent facility, or host capability is not rejected merely because it is
|
|
103
|
+
outside the Beta. It is labeled and retained as evidence.
|
|
104
|
+
Implementation begins only when the human authority chooses the product and
|
|
105
|
+
architectural direction.
|