@pulse-compute/cli 1.0.0-beta.1 → 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.
Files changed (76) hide show
  1. package/API.md +37 -4
  2. package/CHANGELOG.md +24 -0
  3. package/README.md +4 -3
  4. package/cli-spec.json +1 -1
  5. package/docs/README.md +1 -1
  6. package/docs/architecture/current-contracts.md +96 -7
  7. package/docs/concepts/compilation-and-lowering.md +1 -1
  8. package/docs/concepts/contracts-and-providers.md +2 -2
  9. package/docs/concepts/effects-and-continuations.md +57 -0
  10. package/docs/concepts/package-owned-lowering.md +1 -1
  11. package/docs/concepts/targets-and-hosts.md +10 -2
  12. package/docs/contributing/adding-core-provider.md +1 -1
  13. package/docs/contributing/adding-first-party-lowerer.md +1 -1
  14. package/docs/contributing/package-lowerer-contract.md +2 -2
  15. package/docs/guides/migrating-from-express.md +3 -3
  16. package/docs/guides/routing.md +19 -1
  17. package/docs/maintainers/documentation-deployment.md +4 -4
  18. package/docs/maintainers/documentation-versioning.md +1 -1
  19. package/docs/maintainers/maintainer-charter.md +17 -1
  20. package/docs/maintainers/maintenance-policy.json +34 -3
  21. package/docs/maintainers/maintenance-policy.md +3 -3
  22. package/docs/maintainers/npm-publishing.md +2 -2
  23. package/docs/maintainers/plugin-readiness.json +1 -1
  24. package/docs/maintainers/plugin-readiness.md +1 -1
  25. package/docs/maintainers/release-acceptance.md +51 -8
  26. package/docs/maintainers/release-manifest.md +23 -22
  27. package/docs/maintainers/scope-policy.md +13 -1
  28. package/docs/maintainers/testing.md +47 -1
  29. package/docs/packages/README.md +25 -24
  30. package/docs/packages/assets.md +1 -1
  31. package/docs/packages/crypto.md +8 -1
  32. package/docs/packages/entities.md +1 -1
  33. package/docs/packages/grip.md +1 -1
  34. package/docs/packages/implementation-packages.md +10 -1
  35. package/docs/packages/jwt.md +1 -1
  36. package/docs/packages/provider-fastly.md +29 -3
  37. package/docs/packages/pulse.md +1 -1
  38. package/docs/packages/runtime.md +10 -1
  39. package/docs/packages/s3.md +101 -0
  40. package/docs/preview-scope.md +2 -2
  41. package/docs/reference/cli-spec.json +1 -1
  42. package/docs/reference/cli.md +1 -1
  43. package/docs/reference/compatibility-matrix.md +2 -2
  44. package/docs/reference/diagnostics.md +5 -5
  45. package/docs/reference/documentation-versions.json +11 -3
  46. package/docs/reference/handler-authoring.md +1 -1
  47. package/docs/reference/project-config.md +33 -5
  48. package/docs/reference/project-config.schema.json +70 -7
  49. package/docs/reference/release-manifest.json +36 -22
  50. package/documentation-site.json +8 -1
  51. package/documentation-versions.json +11 -3
  52. package/examples/01-hello-json/README.md +1 -1
  53. package/examples/01-hello-json/package.json +2 -2
  54. package/examples/02-request-schema/README.md +1 -1
  55. package/examples/02-request-schema/package.json +2 -2
  56. package/examples/03-fetch-composition/README.md +1 -1
  57. package/examples/03-fetch-composition/package.json +2 -2
  58. package/examples/05-fastly-capabilities/README.md +2 -2
  59. package/examples/05-fastly-capabilities/package.json +4 -4
  60. package/examples/07-opaque-proxy/README.md +2 -2
  61. package/examples/07-opaque-proxy/package.json +3 -3
  62. package/examples/09-router-lowering/README.md +1 -1
  63. package/examples/09-router-lowering/package.json +3 -3
  64. package/examples/10-entities-tools/package.json +3 -3
  65. package/examples/11-events/README.md +1 -1
  66. package/examples/11-events/package.json +2 -2
  67. package/examples/12-mcp-proxy/README.md +1 -1
  68. package/examples/12-mcp-proxy/package.json +2 -2
  69. package/examples/13-jwt-es256/README.md +1 -1
  70. package/examples/13-jwt-es256/package.json +3 -3
  71. package/package.json +7 -7
  72. package/project-config.schema.json +70 -7
  73. package/release-manifest.json +36 -22
  74. package/src/documentation.js +1 -1
  75. package/src/project-config-schema.js +3 -3
  76. package/src/project-execution.js +22 -6
@@ -10,7 +10,7 @@ Install it only in projects that select the Fastly provider.
10
10
  ## Install
11
11
 
12
12
  ```bash
13
- npm install @pulse-compute/provider-fastly@1.0.0-beta.1
13
+ npm install @pulse-compute/provider-fastly@1.0.0-beta.2
14
14
  ```
15
15
 
16
16
  ## Configure a project
@@ -105,8 +105,34 @@ pulse build ./my-app
105
105
 
106
106
  `target: 'native'` compiles the provider-neutral plan and emits generated
107
107
  `src/main.as.ts` plus compact `bin/main.wasm` importing the required `fastly_*`
108
- hostcalls directly. It contains no JavaScript runtime image, `pulse_host`, or
109
- WASI dependency.
108
+ hostcalls directly. It contains no JavaScript runtime image or `pulse_host`.
109
+ Clock-dependent capabilities import only WASI `clock_time_get`.
110
+
111
+ Conditional KV (`getVersioned`, `insertIfAbsent`, `compareAndSwap`) uses this
112
+ Native path and the existing logical KV bindings. It preserves generation tokens
113
+ without numeric narrowing, stages a bounded Pulse JSON envelope, and distinguishes
114
+ confirmed rejection from unconfirmed dispatch. Pending completion and body reads
115
+ use readiness selection with a monotonic deadline. Read bodies are closed; expired
116
+ pending operations remain owned by invocation teardown, with no rollback promise.
117
+ Fastly JavaScript remains explicitly incomplete for these operations. See
118
+ [conditional KV](../concepts/effects-and-continuations.md#conditional-kv) for the
119
+ portable contract. The generated-Wasm corpus is local evidence; it does not replace
120
+ deployed cross-location acceptance. The legacy JavaScript fixture runner does
121
+ not realize Native conditional KV; it reports a configuration failure. Exercise
122
+ these operations through generated Wasm or the Compute execution lane.
123
+
124
+ The required conditional KV acceptance task is `kv-conditional-acceptance`.
125
+ It builds and installs exact tarballs and executes their Native artifact through
126
+ Fastly CLI/Viceroy; an unavailable engine fails the task. Viceroy 0.21.0 currently
127
+ fails the missing-key CAS contract: it creates the key instead of returning
128
+ `conflict`. A September 12, 2026 standalone Rust SDK probe on deployed Fastly
129
+ rejected CAS on both never-created and deleted keys, which remained absent.
130
+ This resolves the live missing-key concern for those cases and distinguishes it
131
+ from the Viceroy defect. The required local gate still fails, and full Pulse
132
+ deployed cross-location acceptance remains pending the isolated development
133
+ environment. The [K4 acceptance record](https://github.com/pulse-compute/pulse/blob/latest/wasm/test/kv/K4.md)
134
+ retains both captures and their scope. Neither that standalone probe nor passing
135
+ injected-host or portable tests clears the full acceptance gates.
110
136
 
111
137
  ### Fastly JavaScript
112
138
 
@@ -8,7 +8,7 @@ provider-neutral runtime contract.
8
8
  ## Install
9
9
 
10
10
  ```bash
11
- npm install @pulse-compute/pulse@1.0.0-beta.1
11
+ npm install @pulse-compute/pulse@1.0.0-beta.2
12
12
  ```
13
13
 
14
14
  The package exposes two supported entry points:
@@ -5,7 +5,7 @@
5
5
  ## Install
6
6
 
7
7
  ```bash
8
- npm install @pulse-compute/runtime@1.0.0-beta.1
8
+ npm install @pulse-compute/runtime@1.0.0-beta.2
9
9
  ```
10
10
 
11
11
  A project created by `pulse init` depends on the public
@@ -212,6 +212,15 @@ const token = await ctx.secret.get('API_TOKEN')
212
212
  const session = await ctx.kv<{ userId: number }>('sessions').get('current')
213
213
  ```
214
214
 
215
+ Conditional KV extends the same namespace with `getVersioned`, `insertIfAbsent`,
216
+ and `compareAndSwap`. The Node reference realizes them through JavaScript and
217
+ compiled Native execution; Fastly Native uses direct conditional KV hostcalls. Reads pair a value with an opaque string generation;
218
+ writes distinguish `stored`, `conflict`, `not-stored`, and `unknown` (possibly
219
+ committed). Pulse snapshots candidates, preserves tokens without numeric
220
+ coercion, and performs no automatic retry. Fastly JavaScript remains incomplete;
221
+ K4 retains the deployed acceptance gate.
222
+ The detailed contract is in [Effects and continuations](../concepts/effects-and-continuations.md#conditional-kv).
223
+
215
224
  Those calls are compiled into explicit effects and validated against the selected provider. See [Compilation and lowering](../concepts/compilation-and-lowering.md).
216
225
 
217
226
  ## Structured and opaque fetch results
@@ -0,0 +1,101 @@
1
+ # `@pulse-compute/s3`
2
+
3
+ S3 provides bounded exact-key `head`, `getText` and `putText` effects. It is a
4
+ supported extension in the synchronized `1.0.0-beta.2` candidate. Candidate
5
+ preparation does not assert that the package has been published to npm. Consume
6
+ the exact compatible S3, Pulse, CLI and provider tarballs from one release pack.
7
+
8
+ ## Authoring and lowering
9
+
10
+ ```ts
11
+ import { s3 } from '@pulse-compute/s3'
12
+
13
+ const written = await s3.putText(ctx, 'objects', key, text, {
14
+ contentType: 'application/json',
15
+ })
16
+ const inspected = await ctx.parallel({
17
+ metadata: s3.head(ctx, 'objects', key),
18
+ object: s3.getText(ctx, 'objects', key),
19
+ })
20
+ ```
21
+
22
+ Use these expressions inside a Pulse handler. Await into a local variable or
23
+ use keyed `ctx.parallel`. The logical binding must be a string literal. Key and
24
+ text may be runtime strings; content type is optional literal metadata and does
25
+ not serialize the text. Strict JSON responses require a response schema.
26
+
27
+ S3 owns its facade, operation contract, compiler recognition, Native lowering,
28
+ key encoding, SigV4 protocol and result interpretation. Native targets compose
29
+ the packaged AssemblyScript implementation with Crypto's SHA-256 and HMAC-SHA256
30
+ primitives. Node JavaScript uses the package protocol and Crypto's bounded Web
31
+ Crypto realization. Providers own fixed authority, credential resolution,
32
+ deadlines, raw metadata and transport. Application imports use only the package
33
+ root; `/provider`, manifest, compiler and Native exports are toolchain integration.
34
+
35
+ ## Binding map
36
+
37
+ Declare `crypto: ['SHA-256', 'HMAC-SHA256']` in Pulse configuration. Map each
38
+ logical name under `<profile>.node.bindings.s3` or
39
+ `<profile>.fastly.bindings.s3`.
40
+
41
+ | Field | Contract |
42
+ | --- | --- |
43
+ | `endpoint` | Fixed HTTPS origin, without a path, query or credentials |
44
+ | `bucket`, `region` | Explicit bucket and signing region |
45
+ | `accessKeyIdSecret`, `secretAccessKeySecret` | Names of provider secrets |
46
+ | `sessionTokenSecret` | Optional provider secret name |
47
+ | `maxTextBytes` | 1–32768; default 32768 |
48
+ | `timeoutMs` | 1–30000; default 10000; includes credentials, signing and body completion |
49
+ | `backend` | Fastly requires a named static backend; configure its secret store in `fastly.bindings.secretStore` |
50
+
51
+ Runtime keys cannot select an origin, bucket, region, backend or credentials.
52
+ Keys are 1–1024 UTF-8 bytes, with no controls or `.`/`..` path segments. Slashes,
53
+ repeated slashes and Unicode normalization are preserved; encoding occurs once.
54
+
55
+ ## Results and bounds
56
+
57
+ | Operation | Successful result | Other results |
58
+ | --- | --- | --- |
59
+ | `head` | `found`: byte length, optional opaque ETag and content type | `not-found` or `failed` with bounded reason and observed HTTP status |
60
+ | `getText` | `found`: exact UTF-8 text, raw byte length and SHA-256, optional metadata | `not-found` or `failed`; malformed UTF-8 is rejected |
61
+ | `putText` | `stored`: sent byte length and SHA-256, optional opaque ETag | `not-stored` before dispatch or for complete explicit 4xx rejection except 408; `unknown` when dispatch may have stored bytes |
62
+
63
+ GET and PUT are bounded to 32768 UTF-8 bytes, or the lower binding limit. Empty
64
+ text is allowed and a BOM is preserved. HEAD requires a safe Content-Length and
65
+ can describe an object larger than the text limit. Metadata is bounded to 16384
66
+ aggregate bytes and 1024 bytes per selected value; duplicate selected headers,
67
+ malformed lengths, truncated bodies and compression fail closed.
68
+
69
+ PUT succeeds only on a complete 200 acknowledgement with an empty body. Its
70
+ digest identifies sent bytes, not origin durability. Cancellation terminates
71
+ the request lifecycle without a typed S3 result or a rollback promise. There
72
+ are no retries, redirects, decompression or caches. For a JSON request carrying
73
+ 32768 escaped control characters, configure `schemas.maxBytes: 262144`; the
74
+ object byte limit remains unchanged.
75
+
76
+ ## Target support and evidence
77
+
78
+ | Target | S3 support | Local acceptance |
79
+ | --- | --- | --- |
80
+ | Node Native | Supported | Compiled Wasm with the Node provider |
81
+ | Node JavaScript | Supported | Package runtime with bounded Web Crypto |
82
+ | Fastly Native | Supported | Compiled provider Wasm with host ABI fixtures |
83
+ | Fastly JavaScript | Ineligible | SDK header projection loses required raw metadata |
84
+
85
+ The read and write corpus is repeated from isolated exact-version tarball
86
+ installs, using installed compilers, package lowering and provider realizations.
87
+ It covers signatures, key encoding, malformed and truncated data, limits,
88
+ credentials, redaction, deadlines and ambiguous writes. Fastly JavaScript's
89
+ exclusion does not gate these supported targets.
90
+
91
+ Local fixtures do not establish live Fastly Object Storage semantics. Live
92
+ origin acceptance follows infrastructure setup (T2) and records endpoint,
93
+ region, target artifact, exact observed bytes and acknowledgement behavior.
94
+ There is no listing, multipart upload, copy, presigning, arbitrary bucket
95
+ selection or conditional creation. Assets alignment remains separate.
96
+
97
+ ## Related material
98
+
99
+ - [Project configuration](../reference/project-config.md)
100
+ - [Package-owned lowering](../concepts/package-owned-lowering.md)
101
+ - [Crypto](./crypto.md)
@@ -1,6 +1,6 @@
1
1
  # Beta scope
2
2
 
3
- Pulse `1.0.0-beta.1` is a Beta of one provider-neutral application contract
3
+ Pulse `1.0.0-beta.2` is a Beta of one provider-neutral application contract
4
4
  with explicit Native and JavaScript execution targets. The intended 1.0
5
5
  surface is present, but deliberate corrections may still occur before the
6
6
  stable `1.0.0` release.
@@ -15,7 +15,7 @@ targets.
15
15
  - Async-shaped provider-neutral TypeScript handlers; trusted Pulse awaits lower
16
16
  into explicit effects and continuations without a Promise runtime.
17
17
  - Static Router v2 with terminal middleware, route fallthrough, error
18
- middleware, GET/HEAD/POST routes, exact paths, named parameters, trailing
18
+ middleware, GET/HEAD/POST/PUT/PATCH/DELETE routes, exact paths, named parameters, trailing
19
19
  wildcards, and acyclic mounts.
20
20
  - Basic branching and structured object, array, and scalar manipulation.
21
21
  - Request method, URL, path, headers, text, and JSON access.
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "schemaVersion": "pulse.cli-command-spec.v5",
3
- "cliVersion": "1.0.0-beta.1",
3
+ "cliVersion": "1.0.0-beta.2",
4
4
  "completionShells": [
5
5
  "bash",
6
6
  "zsh",
@@ -2,7 +2,7 @@
2
2
 
3
3
  <!-- Generated by wasm/scripts/sync-reference-docs.cjs. Edit the source catalog, not this file. -->
4
4
 
5
- The `pulse` CLI in `@pulse-compute/cli@1.0.0-beta.1` is the supported project workflow. One command specification generates this page, installed help, and the shipped Bash, Zsh, and Fish completion scripts, so a public command or option cannot drift between those surfaces.
5
+ The `pulse` CLI in `@pulse-compute/cli@1.0.0-beta.2` is the supported project workflow. One command specification generates this page, installed help, and the shipped Bash, Zsh, and Fish completion scripts, so a public command or option cannot drift between those surfaces.
6
6
 
7
7
  ## Meta invocations
8
8
 
@@ -29,7 +29,7 @@ the Native build; it does not authorize automatic JavaScript fallback.
29
29
  | Source form | Node JS | Fastly JS | Node Native | Fastly Native | Notes |
30
30
  |---|---:|---:|---:|---:|---|
31
31
  | Async-shaped managed handler | Yes | Yes | Yes | Yes | Native erases the authoring wrapper; it does not link Promise, JSPI, or Asyncify semantics. |
32
- | Static `Router` topology and terminal `next()` | Yes | Yes | Yes | Yes | Covers static `get`, `head`, `post`, middleware, mounts, parameters, trailing wildcard, fallthrough, and the error lane. |
32
+ | Static `Router` topology and terminal `next()` | Yes | Yes | Yes | Yes | Covers static `get`, `head`, `post`, `put`, `patch`, `delete`, middleware, mounts, parameters, trailing wildcard, fallthrough, and the error lane. |
33
33
  | Root-only `Pulse.on` and non-HTTP event context | Yes | No | Yes | No | Node owns the bounded reference ingress. Fastly source remains inspectable but execution/build eligibility fails closed. |
34
34
  | Awaited one-way `ctx.emit` acceptance | Yes | No | Yes | No | Static schema-bound frames only; no delivery, loopback, public bus, call surface, or target fallback. |
35
35
  | Sequential awaits of trusted Pulse effects | Yes | Yes | Yes | Yes | JavaScript preserves source order. Native lowers effects and continuations and may group adjacent independent effects without changing results. |
@@ -86,7 +86,7 @@ separate ordinary-lifecycle and Fastly Native integration boundaries.
86
86
  ## JWT and crypto Beta packages
87
87
 
88
88
  This table records the sealed Phase D and E behavior of the synchronized
89
- `1.0.0-beta.1` JWT/crypto packages. Validation does not itself authorize npm
89
+ `1.0.0-beta.2` JWT/crypto packages. Validation does not itself authorize npm
90
90
  publication.
91
91
 
92
92
  | Candidate capability | Node JS | Fastly JS | Node Native | Fastly Native | Notes |
@@ -2,11 +2,11 @@
2
2
 
3
3
  <!-- Generated by wasm/scripts/sync-reference-docs.cjs. Edit the source catalog, not this file. -->
4
4
 
5
- Pulse 1.0.0-beta.1 treats the 114 codes on this page as the stable public CLI diagnostic catalog. Code, category, summary, remediation intent, exit class, and anchor are generated from the same source used by the CLI. Human wording may improve compatibly.
5
+ Pulse 1.0.0-beta.2 treats the 114 codes on this page as the stable public CLI diagnostic catalog. Code, category, summary, remediation intent, exit class, and anchor are generated from the same source used by the CLI. Human wording may improve compatibly.
6
6
 
7
7
  Every catalogued failure links to a versioned installed artifact under:
8
8
 
9
- `https://pulsecompute.io/v1.0.0-beta.1/reference/diagnostics/`
9
+ `https://pulsecompute.io/v1.0.0-beta.2/reference/diagnostics/`
10
10
 
11
11
  Uncatalogued/internal or forward-compatible codes link to that reference root instead of inventing a nonexistent anchor. Internal `PULSEWASM_*` proof/compiler tokens are not part of this public catalog.
12
12
 
@@ -22,7 +22,7 @@ A Native eligibility diagnostic never authorizes automatic JavaScript fallback.
22
22
  ```json
23
23
  {
24
24
  "status": "error",
25
- "version": "1.0.0-beta.1",
25
+ "version": "1.0.0-beta.2",
26
26
  "error": {
27
27
  "name": "PulseProjectError",
28
28
  "code": "PULSE_BUILD_OUT_UNSAFE",
@@ -35,7 +35,7 @@ A Native eligibility diagnostic never authorizes automatic JavaScript fallback.
35
35
  ],
36
36
  "stability": "preview-stable",
37
37
  "scope": "public",
38
- "docs": "https://pulsecompute.io/v1.0.0-beta.1/reference/diagnostics/#pulse-build-out-unsafe"
38
+ "docs": "https://pulsecompute.io/v1.0.0-beta.2/reference/diagnostics/#pulse-build-out-unsafe"
39
39
  }
40
40
  }
41
41
  ```
@@ -89,7 +89,7 @@ pulse test examples/02-request-schema --case invalid-user --json
89
89
  "expectedError": {
90
90
  "code": "PULSE_SCHEMA_DECODE",
91
91
  "category": "request",
92
- "docs": "https://pulsecompute.io/v1.0.0-beta.1/reference/diagnostics/#pulse-schema-decode"
92
+ "docs": "https://pulsecompute.io/v1.0.0-beta.2/reference/diagnostics/#pulse-schema-decode"
93
93
  }
94
94
  }
95
95
  ]
@@ -1,14 +1,22 @@
1
1
  {
2
2
  "schemaVersion": "pulse.documentation-versions.v1",
3
- "latest": "1.0.0-beta.1",
3
+ "latest": "1.0.0-beta.2",
4
4
  "versions": [
5
+ {
6
+ "version": "1.0.0-beta.2",
7
+ "segment": "v1.0.0-beta.2",
8
+ "channel": "beta",
9
+ "releasedAt": "2026-09-13",
10
+ "status": "current",
11
+ "sourceManifest": "release/pulse-release-manifest.json"
12
+ },
5
13
  {
6
14
  "version": "1.0.0-beta.1",
7
15
  "segment": "v1.0.0-beta.1",
8
16
  "channel": "beta",
9
17
  "releasedAt": "2026-08-01",
10
- "status": "current",
11
- "sourceManifest": "release/pulse-release-manifest.json"
18
+ "status": "archived",
19
+ "sourceManifest": "release/documentation-site-archives/v1.0.0-beta.1/release-manifest.json"
12
20
  }
13
21
  ]
14
22
  }
@@ -189,7 +189,7 @@ compatible merely because both targets are JavaScript.
189
189
  ## Router topology and terminal transfer
190
190
 
191
191
  `Router` is a compile-time authoring marker. The v2 surface supports static
192
- `get`, `head`, and `post` routes; exact, named-parameter, and trailing-wildcard
192
+ `get`, `head`, `post`, `put`, `patch`, and `delete` routes; exact, named-parameter, and trailing-wildcard
193
193
  paths; global and path-scoped middleware; acyclic mounts; fallthrough; and
194
194
  error middleware.
195
195
 
@@ -94,15 +94,15 @@ Resolved synchronous logging threshold after the flat profile override is applie
94
94
 
95
95
  ## Cryptographic requirements
96
96
 
97
- Declare exact algorithms for the global or selected profile and resolve one target realization without fallback. This surface is part of the synchronized 1.0.0-beta.1 package set.
97
+ Declare exact algorithms for the global or selected profile and resolve one target realization without fallback. This surface is part of the synchronized 1.0.0-beta.2 package set.
98
98
 
99
99
  ### `pulse.crypto`
100
100
 
101
101
  Declares the complete global algorithm set. Array entries are canonical algorithm names; object entries may pin one exact known realization.
102
102
 
103
- - **Type:** readonly ('HS256' | 'ES256')[] | { readonly HS256?: { readonly realization?: PulseCryptoRealization }; readonly ES256?: { readonly realization?: PulseCryptoRealization } }
103
+ - **Type:** readonly PulseCryptoAlgorithm[] | Readonly<Partial<Record<PulseCryptoAlgorithm, { readonly realization?: PulseCryptoRealization }>>>
104
104
  - **Required/default:** Optional; default implicit no-crypto declaration.
105
- - **Allowed values or constraints:** `HS256`, `ES256`; exact pins `runtime-builtin`, `guest-source:pulse-hmac-as`, and `guest-linked:pulse-es256-rustcrypto-p256`
105
+ - **Allowed values or constraints:** `HS256`, `ES256`, `SHA-256`, `HMAC-SHA256`; exact pins `runtime-builtin`, `guest-source:pulse-hmac-as`, and `guest-linked:pulse-es256-rustcrypto-p256`
106
106
  - **Scope:** global crypto requirement default
107
107
  - **Precedence:** Used only when the selected profile omits `crypto`.
108
108
  - **Security and safety:** Keys and verification bytes are not configuration values. Target selection is deterministic and never probes or falls back.
@@ -112,9 +112,9 @@ Declares the complete global algorithm set. Array entries are canonical algorith
112
112
 
113
113
  Replaces the complete global crypto declaration for the selected profile. Arrays and objects never merge with `pulse.crypto`.
114
114
 
115
- - **Type:** readonly ('HS256' | 'ES256')[] | { readonly HS256?: { readonly realization?: PulseCryptoRealization }; readonly ES256?: { readonly realization?: PulseCryptoRealization } }
115
+ - **Type:** readonly PulseCryptoAlgorithm[] | Readonly<Partial<Record<PulseCryptoAlgorithm, { readonly realization?: PulseCryptoRealization }>>>
116
116
  - **Required/default:** Optional; default inherit `pulse.crypto` when absent.
117
- - **Allowed values or constraints:** `[]` and `{}` explicitly select no crypto; otherwise `HS256` and/or `ES256`
117
+ - **Allowed values or constraints:** `[]` and `{}` explicitly select no crypto; otherwise `HS256`, `ES256`, `SHA-256`, `HMAC-SHA256`
118
118
  - **Scope:** selected profile
119
119
  - **Precedence:** Selected-profile declaration replaces `pulse.crypto`; absence inherits it.
120
120
  - **Security and safety:** Every declared algorithm must resolve for the selected target before lowering. A failed exact realization cannot select another backend.
@@ -284,10 +284,38 @@ Deterministic fetch fixtures resolved before optional live network fetch.
284
284
  - **Security and safety:** Prefer fixtures for deterministic tests and offline development.
285
285
  - **Related diagnostics:** None specific.
286
286
 
287
+ ## Node provider options
288
+
289
+ Provider-owned Node profile configuration.
290
+
291
+ ### `node.bindings.s3`
292
+
293
+ Maps literal logical names to fixed HTTPS endpoint, bucket, region, accessKeyIdSecret, secretAccessKeySecret, optional sessionTokenSecret, maxTextBytes (1–32768, default 32768) and timeoutMs (1–30000, default 10000).
294
+
295
+ - **Type:** Readonly<Record<string, S3Binding>>
296
+ - **Required/default:** Optional; default `{}`.
297
+ - **Allowed values or constraints:** —
298
+ - **Scope:** Node Native and JavaScript S3
299
+ - **Precedence:** Configuration value.
300
+ - **Security and safety:** Only named credential references are configuration. Runtime keys cannot override authority.
301
+ - **Related diagnostics:** None specific.
302
+
287
303
  ## Fastly provider options
288
304
 
289
305
  Options passed to fastly(...) from @pulse-compute/provider-fastly.
290
306
 
307
+ ### `fastly.bindings.s3`
308
+
309
+ Maps logical names to fixed HTTPS endpoint, bucket, region, named static backend, accessKeyIdSecret, secretAccessKeySecret, optional sessionTokenSecret, maxTextBytes (1–32768, default 32768) and timeoutMs (1–30000, default 10000).
310
+
311
+ - **Type:** Readonly<Record<string, S3Binding & { backend: string }>>
312
+ - **Required/default:** Optional; default `{}`.
313
+ - **Allowed values or constraints:** —
314
+ - **Scope:** Fastly Native S3
315
+ - **Precedence:** Configuration value.
316
+ - **Security and safety:** Credentials resolve through the configured Secret Store at execution. Dynamic backend authority and guest endpoint overrides are forbidden.
317
+ - **Related diagnostics:** None specific.
318
+
291
319
  ### `fastly.configStore`
292
320
 
293
321
  Fastly Config Store resource name.
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "schemaVersion": "pulse.project-config-schema-bundle.v1",
3
- "releaseVersion": "1.0.0-beta.1",
3
+ "releaseVersion": "1.0.0-beta.2",
4
4
  "project": {
5
5
  "schemaVersion": "pulse.project-config-schema.v1",
6
6
  "discovery": [
@@ -23,7 +23,7 @@
23
23
  {
24
24
  "id": "crypto",
25
25
  "title": "Cryptographic requirements",
26
- "description": "Declare exact algorithms for the global or selected profile and resolve one target realization without fallback. This surface is part of the synchronized 1.0.0-beta.1 package set."
26
+ "description": "Declare exact algorithms for the global or selected profile and resolve one target realization without fallback. This surface is part of the synchronized 1.0.0-beta.2 package set."
27
27
  },
28
28
  {
29
29
  "id": "schemas",
@@ -35,6 +35,11 @@
35
35
  "title": "Local development",
36
36
  "description": "Configure the foreground local server and local-only provider inputs."
37
37
  },
38
+ {
39
+ "description": "Provider-owned Node profile configuration.",
40
+ "id": "node",
41
+ "title": "Node provider options"
42
+ },
38
43
  {
39
44
  "description": "Options passed to fastly(...) from @pulse-compute/provider-fastly.",
40
45
  "id": "fastly",
@@ -111,7 +116,7 @@
111
116
  {
112
117
  "required": false,
113
118
  "default": "implicit no-crypto declaration",
114
- "allowed": "`HS256`, `ES256`; exact pins `runtime-builtin`, `guest-source:pulse-hmac-as`, and `guest-linked:pulse-es256-rustcrypto-p256`",
119
+ "allowed": "`HS256`, `ES256`, `SHA-256`, `HMAC-SHA256`; exact pins `runtime-builtin`, `guest-source:pulse-hmac-as`, and `guest-linked:pulse-es256-rustcrypto-p256`",
115
120
  "precedence": "Used only when the selected profile omits `crypto`.",
116
121
  "security": "Keys and verification bytes are not configuration values. Target selection is deterministic and never probes or falls back.",
117
122
  "diagnostics": [
@@ -122,14 +127,14 @@
122
127
  ],
123
128
  "section": "crypto",
124
129
  "path": "pulse.crypto",
125
- "type": "readonly ('HS256' | 'ES256')[] | { readonly HS256?: { readonly realization?: PulseCryptoRealization }; readonly ES256?: { readonly realization?: PulseCryptoRealization } }",
130
+ "type": "readonly PulseCryptoAlgorithm[] | Readonly<Partial<Record<PulseCryptoAlgorithm, { readonly realization?: PulseCryptoRealization }>>>",
126
131
  "scope": "global crypto requirement default",
127
132
  "description": "Declares the complete global algorithm set. Array entries are canonical algorithm names; object entries may pin one exact known realization."
128
133
  },
129
134
  {
130
135
  "required": false,
131
136
  "default": "inherit `pulse.crypto` when absent",
132
- "allowed": "`[]` and `{}` explicitly select no crypto; otherwise `HS256` and/or `ES256`",
137
+ "allowed": "`[]` and `{}` explicitly select no crypto; otherwise `HS256`, `ES256`, `SHA-256`, `HMAC-SHA256`",
133
138
  "precedence": "Selected-profile declaration replaces `pulse.crypto`; absence inherits it.",
134
139
  "security": "Every declared algorithm must resolve for the selected target before lowering. A failed exact realization cannot select another backend.",
135
140
  "diagnostics": [
@@ -139,7 +144,7 @@
139
144
  ],
140
145
  "section": "crypto",
141
146
  "path": "<profile>.crypto",
142
- "type": "readonly ('HS256' | 'ES256')[] | { readonly HS256?: { readonly realization?: PulseCryptoRealization }; readonly ES256?: { readonly realization?: PulseCryptoRealization } }",
147
+ "type": "readonly PulseCryptoAlgorithm[] | Readonly<Partial<Record<PulseCryptoAlgorithm, { readonly realization?: PulseCryptoRealization }>>>",
143
148
  "scope": "selected profile",
144
149
  "description": "Replaces the complete global crypto declaration for the selected profile. Arrays and objects never merge with `pulse.crypto`."
145
150
  },
@@ -330,6 +335,32 @@
330
335
  "scope": "local fetch capability",
331
336
  "description": "Deterministic fetch fixtures resolved before optional live network fetch."
332
337
  },
338
+ {
339
+ "required": false,
340
+ "default": "`{}`",
341
+ "allowed": "—",
342
+ "precedence": "Configuration value.",
343
+ "security": "Only named credential references are configuration. Runtime keys cannot override authority.",
344
+ "diagnostics": [],
345
+ "description": "Maps literal logical names to fixed HTTPS endpoint, bucket, region, accessKeyIdSecret, secretAccessKeySecret, optional sessionTokenSecret, maxTextBytes (1–32768, default 32768) and timeoutMs (1–30000, default 10000).",
346
+ "path": "node.bindings.s3",
347
+ "scope": "Node Native and JavaScript S3",
348
+ "section": "node",
349
+ "type": "Readonly<Record<string, S3Binding>>"
350
+ },
351
+ {
352
+ "required": false,
353
+ "default": "`{}`",
354
+ "allowed": "—",
355
+ "precedence": "Configuration value.",
356
+ "security": "Credentials resolve through the configured Secret Store at execution. Dynamic backend authority and guest endpoint overrides are forbidden.",
357
+ "diagnostics": [],
358
+ "description": "Maps logical names to fixed HTTPS endpoint, bucket, region, named static backend, accessKeyIdSecret, secretAccessKeySecret, optional sessionTokenSecret, maxTextBytes (1–32768, default 32768) and timeoutMs (1–30000, default 10000).",
359
+ "path": "fastly.bindings.s3",
360
+ "scope": "Fastly Native S3",
361
+ "section": "fastly",
362
+ "type": "Readonly<Record<string, S3Binding & { backend: string }>>"
363
+ },
333
364
  {
334
365
  "required": false,
335
366
  "default": "`pulse_config`",
@@ -729,7 +760,9 @@
729
760
  "items": {
730
761
  "enum": [
731
762
  "HS256",
732
- "ES256"
763
+ "ES256",
764
+ "SHA-256",
765
+ "HMAC-SHA256"
733
766
  ]
734
767
  }
735
768
  },
@@ -762,6 +795,32 @@
762
795
  ]
763
796
  }
764
797
  }
798
+ },
799
+ "SHA-256": {
800
+ "type": "object",
801
+ "additionalProperties": false,
802
+ "properties": {
803
+ "realization": {
804
+ "enum": [
805
+ "runtime-builtin",
806
+ "guest-source:pulse-hmac-as",
807
+ "guest-linked:pulse-es256-rustcrypto-p256"
808
+ ]
809
+ }
810
+ }
811
+ },
812
+ "HMAC-SHA256": {
813
+ "type": "object",
814
+ "additionalProperties": false,
815
+ "properties": {
816
+ "realization": {
817
+ "enum": [
818
+ "runtime-builtin",
819
+ "guest-source:pulse-hmac-as",
820
+ "guest-linked:pulse-es256-rustcrypto-p256"
821
+ ]
822
+ }
823
+ }
765
824
  }
766
825
  }
767
826
  }
@@ -844,6 +903,10 @@
844
903
  "fastly": {
845
904
  "schemaVersion": "pulse.provider-fastly-config-schema.v1",
846
905
  "fields": {
906
+ "fastly.bindings.s3": {
907
+ "kind": "object",
908
+ "default": {}
909
+ },
847
910
  "fastly.configStore": {
848
911
  "kind": "string",
849
912
  "default": "pulse_config"