protocol-governed-computing 4.0.0__tar.gz → 5.0.0__tar.gz

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.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: protocol-governed-computing
3
- Version: 4.0.0
3
+ Version: 5.0.0
4
4
  Summary: Protocol-Governed Computing — installs the full toolchain and reports whether an environment is ready to compile, seal, and execute
5
5
  Author-email: Bhash Ganti <bachipeachy@gmail.com>
6
6
  License-Expression: Apache-2.0
@@ -15,16 +15,16 @@ Classifier: Operating System :: OS Independent
15
15
  Classifier: Topic :: Software Development :: Compilers
16
16
  Requires-Python: >=3.10
17
17
  Description-Content-Type: text/markdown
18
- Requires-Dist: pgc-compiler==4.0.0
19
- Requires-Dist: pgc-assembler==4.0.0
20
- Requires-Dist: pgc-runtime==4.0.0
21
- Requires-Dist: pgc-inspector==4.0.0
22
- Requires-Dist: pgc-transformation==4.0.0
23
- Requires-Dist: pgc-governance==4.0.0
24
- Requires-Dist: pgc-workloads==4.0.0
25
- Requires-Dist: pgc-domains==4.0.0
18
+ Requires-Dist: pgc-compiler==5.0.0
19
+ Requires-Dist: pgc-assembler==5.0.0
20
+ Requires-Dist: pgc-runtime==5.0.0
21
+ Requires-Dist: pgc-inspector==5.0.0
22
+ Requires-Dist: pgc-transformation==5.0.0
23
+ Requires-Dist: pgc-governance==5.0.0
24
+ Requires-Dist: pgc-workloads==5.0.0
25
+ Requires-Dist: pgc-domains==5.0.0
26
26
  Provides-Extra: blockchain
27
- Requires-Dist: pgc-domains[blockchain]==4.0.0; extra == "blockchain"
27
+ Requires-Dist: pgc-domains[blockchain]==5.0.0; extra == "blockchain"
28
28
 
29
29
  # pgc_install
30
30
 
@@ -107,16 +107,34 @@ git clone https://github.com/protocol-governed-computing/.github pgc_github
107
107
  `.github` carries the snapshot profiles, which are conformance contracts rather than
108
108
  code and are not published in any wheel.
109
109
 
110
+ A **fifth** clone is needed only to reach the platform over HTTP (§7), and only on
111
+ whichever node serves the boundary:
112
+
113
+ ```bash
114
+ git clone https://github.com/protocol-governed-computing/protocol_transport
115
+ ```
116
+
117
+ `protocol_transport` is deliberately not published. It provisions its import roots —
118
+ `adapters` and `resolver` — from its repository root rather than from an installed
119
+ package, so the boundary is composed by whoever deploys it rather than carried into
120
+ every install. Steps 4 through 6 need none of it.
121
+
122
+ **Pin what you clone.** These commands fetch the default branch, which moves. A wheel at
123
+ one version against declarations from a later branch is an incoherence nothing reports:
124
+ the implementations are one composition's and the declarations another's. Clone
125
+ `--branch <tag>` at the release matching your toolchain — `v5` for `5.0.0` — whenever the
126
+ build has to be reproducible.
127
+
110
128
  ### 3. The anchors
111
129
 
112
- Six environment variables govern where the toolchain reads and writes.
130
+ Five environment variables govern where the toolchain reads and writes. Where the compiler
131
+ writes is not one of them.
113
132
 
114
133
  | Anchor | Read by | Meaning |
115
134
  |---|---|---|
116
135
  | `PGC_PLATFORM_ROOT` | compiler | the governance repository — the directory containing `registry/` |
117
136
  | `PGC_DOMAIN_ROOTS` | compiler | the domain being compiled — the directory containing `registry/structures/` |
118
- | `PGC_SNAPSHOT_ROOT` | compiler | where compiled projections are written |
119
- | `PGC_SNAPSHOT_ROOT` | runtime | the assembled snapshot to execute — a different meaning; prefer `--snapshot` |
137
+ | `PGC_SNAPSHOT_ROOT` | runtime | the assembled snapshot to execute; prefer `--snapshot` |
120
138
  | `PGC_SNAPSHOT_PROFILES` | assembler | the directory holding snapshot profiles |
121
139
  | `PGC_DATA_ROOT` | runtime | side-effect state and traces — or pass `--data-root` |
122
140
 
@@ -125,9 +143,12 @@ the repository above it. For `conformance_workloads` that is the workload direct
125
143
  (`workloads/collatz`); for `snapshot_inspector` it is the repository root. Pointing it one
126
144
  level too high is silent — the build config is simply never found.
127
145
 
128
- `PGC_SNAPSHOT_ROOT` must differ for each domain build. Every layer's output consolidates
129
- into one snapshot root, and verification rejects any file in that root the current build
130
- did not declare. Two domains sharing a root cannot both verify.
146
+ **Where a build writes is declared, not supplied.** Each build configuration names its root in
147
+ `output_configuration.root`, resolved inside the repository that declares it, and every layer's
148
+ output consolidates there. Every shipped configuration declares `snapshot`, so each domain writes
149
+ into its own repository's `snapshot/`. Two in-force configurations of one repository naming the
150
+ same root are refused, and a configuration naming none cannot be built. The compiler does not read
151
+ `PGC_SNAPSHOT_ROOT`.
131
152
 
132
153
  ### 4. Compile each domain
133
154
 
@@ -136,21 +157,22 @@ read from `$PGC_PLATFORM_ROOT/snapshot` regardless of where output is being writ
136
157
 
137
158
  ```bash
138
159
  export PGC_PLATFORM_ROOT=$PWD/software_governance
139
- protocol_compiler compile --structure STRUCTURE_BUILD_PLATFORM_CONFIG_V1
160
+ protocol_compiler compile --structure STRUCTURE_BUILD_PLATFORM_CONFIG_V2
140
161
  ```
141
162
 
142
- Then each domain, into its own output root:
163
+ Then each domain, into the root its build configuration declares:
143
164
 
144
165
  ```bash
145
166
  PGC_DOMAIN_ROOTS=$PWD/conformance_workloads/workloads/collatz \
146
- PGC_SNAPSHOT_ROOT=$PWD/workload_snapshot \
147
167
  protocol_compiler compile --structure STRUCTURE_BUILD_WORKLOAD_CONFIG_V0
148
168
 
149
169
  PGC_DOMAIN_ROOTS=$PWD/snapshot_inspector \
150
- PGC_SNAPSHOT_ROOT=$PWD/inspection_snapshot \
151
170
  protocol_compiler compile --structure STRUCTURE_BUILD_INSPECTION_CONFIG_V0
152
171
  ```
153
172
 
173
+ Each domain writes into its own repository's `snapshot/`, which is where the platform
174
+ already wrote its own and which every one of these repositories gitignores.
175
+
154
176
  Each run reports its stages, artifact count, and whether the result verified and attested.
155
177
 
156
178
  ### 5. Assemble and seal
@@ -163,8 +185,8 @@ export PGC_SNAPSHOT_PROFILES=$PWD/pgc_github/snapshot_profiles
163
185
 
164
186
  snapshot_assembler assemble \
165
187
  --source $PWD/software_governance/snapshot/compiled \
166
- --source $PWD/workload_snapshot/compiled \
167
- --source $PWD/inspection_snapshot/compiled \
188
+ --source $PWD/conformance_workloads/workloads/collatz/snapshot/compiled \
189
+ --source $PWD/snapshot_inspector/snapshot/compiled \
168
190
  --out $PWD/snapshot \
169
191
  --profile GOVERNANCE_SURFACE_PROFILE_V0
170
192
  ```
@@ -187,6 +209,50 @@ protocol_runtime run \
187
209
  `boot` loads and hash-verifies every domain in the manifest before anything executes. The
188
210
  payloads are declarations and live in the cloned repository, not in a wheel.
189
211
 
212
+ `boot` also reads `PGC_SNAPSHOT_PROFILES`, exported in §5. A sealed snapshot's profile claim was
213
+ evaluated when it was sealed, so booting one should not need the profile root — today it does, and
214
+ reports an error before proceeding if the anchor is unset.
215
+
216
+ ### 7. Reach it over HTTP
217
+
218
+ Steps 1 through 6 execute through the CLI. The interaction boundary is a separate surface, and two
219
+ of the cloned repositories ship a client for it: `conformance_workloads/workloads/collatz/client`
220
+ submits work, and `snapshot_inspector/client` reads the snapshot. Each carries its own `web/`, a
221
+ `bindings/http.json` naming which operations are reachable at which route, and a `serve.sh`.
222
+
223
+ **Those `serve.sh` scripts assume a development checkout**, where `runtime`, `inspector` and
224
+ `assembler` are sibling repository roots on `PYTHONPATH`. Here they are installed packages, so the
225
+ roots point at site-packages instead. `protocol_transport` is the exception, and is genuinely a
226
+ repository root because it is unpublished.
227
+
228
+ ```bash
229
+ SP=$(python3 -c 'import site; print(site.getsitepackages()[0])')
230
+ CLIENT=$PWD/conformance_workloads/workloads/collatz/client
231
+
232
+ PGC_RUNTIME_ROOT=$SP PGC_INSPECTOR_ROOT=$SP PGC_ASSEMBLER_ROOT=$SP PGC_IMPL_ROOTS=$SP \
233
+ PGC_SNAPSHOT_ROOT=$PWD/snapshot \
234
+ PGC_DATA_ROOT=$PWD/data/collatz \
235
+ PGC_HTTP_BINDINGS=$CLIENT/bindings/http.json \
236
+ PGC_STATIC_MOUNTS="/=$CLIENT/web;/snapshot=$PWD/snapshot" \
237
+ PGC_HTTP_PORT=8000 \
238
+ $PWD/protocol_transport/run_http.sh
239
+ ```
240
+
241
+ Substitute `$PWD/snapshot_inspector/client` and another port for the read surface. Then:
242
+
243
+ ```bash
244
+ curl -s -X POST http://localhost:8000/collatz -d '{"number":27}'
245
+ curl -s -X POST http://localhost:8001/si -d '{"operation":"si.snapshot.validate"}'
246
+ ```
247
+
248
+ The read surface routes every `si.*` operation through one binding, named in the request body
249
+ rather than in the path. The boundary reads its bindings once, at startup: restart it after any
250
+ rebuild.
251
+
252
+ `run_http.sh` launches `python3`, which is the virtual environment's interpreter while §1's
253
+ environment is active. Set `PYTHON` to an absolute path if you invoke this without activating it —
254
+ not to `$(command -v python)`, which returns an alias rather than a path under some shells.
255
+
190
256
  ## Adding your own domain
191
257
 
192
258
  A domain is a directory the compiler is pointed at. It declares what it contributes, compiles against
@@ -239,6 +305,7 @@ artifact_discovery:
239
305
  domain: platform # compile against the platform's compiled surface
240
306
  artifact_types: [AC, IN, WF, CC, CT]
241
307
  output_configuration:
308
+ root: snapshot # where this build writes, inside your_domain
242
309
  artifacts:
243
310
  layer: PROTOCOL_BUILD_ROOT
244
311
  subpath: compiled/canonical
@@ -253,7 +320,8 @@ output_configuration:
253
320
  subpath: compiled/canonical
254
321
  ```
255
322
 
256
- **All five projection paths are required.** Omitting them does not fail early: the build passes
323
+ **`root` and all five projection paths are required.** A configuration without `root` is refused
324
+ before anything is compiled. Omitting them does not fail early: the build passes
257
325
  discovery, governance and construction and dies at S7 with five `E301_WRITE_FAILED` errors naming
258
326
  each missing path. It reads like a compiler fault and is a missing declaration.
259
327
 
@@ -265,7 +333,6 @@ succeeds, conformance passes, and the domain is simply wrongly named. Nothing ca
265
333
 
266
334
  ```bash
267
335
  PGC_DOMAIN_ROOTS=$PWD/your_domain \
268
- PGC_SNAPSHOT_ROOT=$PWD/your_domain/snapshot \
269
336
  protocol_compiler compile --structure STRUCTURE_BUILD_YOUR_DOMAIN_CONFIG_V0
270
337
  ```
271
338
 
@@ -292,17 +359,27 @@ violate the claimed profile: a snapshot may carry more than a profile requires a
292
359
 
293
360
  ## Known rough edges
294
361
 
295
- - **`--all-structures` and `STRUCTURE_BUILD_PLATFORM_CONFIG_V0` do not build.** The `_V0`
296
- config requires a layer the resolver does not map, and `--all-structures` additionally
297
- names domain structures that are not part of the governance surface. Compile
298
- `STRUCTURE_BUILD_PLATFORM_CONFIG_V1` by name.
362
+ - **A successful compile may end with `⚠ Machine-block health: N candidate unconsumed key(s)`.**
363
+ It is expected, and it is not a failure: the build has already verified and attested by the
364
+ time it prints. It is a heuristic run after the build. For each artifact kind that no schema
365
+ closes, it looks for machine-block keys whose names appear nowhere in the compiler's source. A
366
+ key it lists is a *candidate* for a declaration nothing reads, not proof of one. `--verbose`
367
+ shows the keys.
299
368
  - **`PGC_BUILD_ROOT` is inert.** It is accepted and reported, and nothing reads it.
300
- `PGC_SNAPSHOT_ROOT` is the anchor that controls compiled output.
301
- - **`PGC_SNAPSHOT_ROOT` carries two meanings** — compiled output to the compiler, assembled
302
- snapshot to the runtime. Pass `--snapshot` to the runtime rather than relying on it.
303
369
  - **`pgc` reports readiness for the platform compile only.** It reads three anchors and
304
370
  reports "Ready" once the governance surface resolves; assembly and execution need the
305
371
  other three.
372
+ - **`protocol_runtime boot` requires `PGC_SNAPSHOT_PROFILES`.** A sealed snapshot carries its
373
+ profile claim, and that claim was evaluated when the snapshot was sealed, so booting it should
374
+ not need the profile root. Unset, `boot` prints an error and then proceeds and succeeds. The
375
+ sequence above exports it in §5, so §6 inherits it — which makes the ordering load-bearing
376
+ rather than incidental.
377
+ - **`--data-root` rejects a relative path.** `$PWD/data` above is absolute and passes. A bare
378
+ `data` does not, which will surface first in whatever script wraps this.
379
+ - **No serving path is published for an installed platform.** Both clients' `serve.sh` resolve
380
+ `runtime`, `inspector` and `assembler` from sibling repository roots, which exist in a
381
+ development checkout and not in an install. §7 gives the equivalent invocation; nothing in any
382
+ repository does.
306
383
 
307
384
  ## The family
308
385
 
@@ -319,9 +396,9 @@ violate the claimed profile: a snapshot may carry more than a profile requires a
319
396
 
320
397
  **Versioning.** Two schemes. Each repository's `VERSION` is a monotonic composition ordinal —
321
398
  internal build accounting, tagged `release-<N>`, never published. `PUBLIC_VERSION` is the platform's
322
- public identity, tagged on every component repository; the platform is at **`v4`**.
399
+ public identity, tagged on every component repository; the platform is at **`v5`**.
323
400
 
324
- **The published version follows the public one: `v4` opens at `4.0.0`.** The family releases in
401
+ **The published version follows the public one: `v5` opens at `5.0.0`.** The family releases in
325
402
  lockstep, so the composition pins exact versions rather than ranges.
326
403
 
327
404
  A public identity may carry more than one published version. A packaging or distribution defect can
@@ -329,10 +406,10 @@ be corrected in a patch release within the same identity, because such a fix cha
329
406
  contains and not what the composition determines. A change to what the composition determines takes
330
407
  the next public identity, and only that mints a new DOI.
331
408
 
332
- `v4` is the second kind. The wheels stopped shipping declarations, which is the first; but an
333
- identity published by more than one domain now resolves to its authoring copy rather than to
334
- whichever sorted last, and that changes what the composition answers. A patch release would have
335
- said otherwise.
409
+ `v5` is the second kind. The snapshot identity now covers the claimed profile's content, so
410
+ acceptance refuses a profile changed after sealing, and refuses every snapshot sealed before `v5`.
411
+ A superseded artifact no longer confers effect. Both change what the composition admits, and a patch
412
+ release would have said otherwise.
336
413
 
337
414
  The standard these packages implement is a separate artifact on its own track, is not this number,
338
415
  and is published separately: https://doi.org/10.5281/zenodo.22150616
@@ -79,16 +79,34 @@ git clone https://github.com/protocol-governed-computing/.github pgc_github
79
79
  `.github` carries the snapshot profiles, which are conformance contracts rather than
80
80
  code and are not published in any wheel.
81
81
 
82
+ A **fifth** clone is needed only to reach the platform over HTTP (§7), and only on
83
+ whichever node serves the boundary:
84
+
85
+ ```bash
86
+ git clone https://github.com/protocol-governed-computing/protocol_transport
87
+ ```
88
+
89
+ `protocol_transport` is deliberately not published. It provisions its import roots —
90
+ `adapters` and `resolver` — from its repository root rather than from an installed
91
+ package, so the boundary is composed by whoever deploys it rather than carried into
92
+ every install. Steps 4 through 6 need none of it.
93
+
94
+ **Pin what you clone.** These commands fetch the default branch, which moves. A wheel at
95
+ one version against declarations from a later branch is an incoherence nothing reports:
96
+ the implementations are one composition's and the declarations another's. Clone
97
+ `--branch <tag>` at the release matching your toolchain — `v5` for `5.0.0` — whenever the
98
+ build has to be reproducible.
99
+
82
100
  ### 3. The anchors
83
101
 
84
- Six environment variables govern where the toolchain reads and writes.
102
+ Five environment variables govern where the toolchain reads and writes. Where the compiler
103
+ writes is not one of them.
85
104
 
86
105
  | Anchor | Read by | Meaning |
87
106
  |---|---|---|
88
107
  | `PGC_PLATFORM_ROOT` | compiler | the governance repository — the directory containing `registry/` |
89
108
  | `PGC_DOMAIN_ROOTS` | compiler | the domain being compiled — the directory containing `registry/structures/` |
90
- | `PGC_SNAPSHOT_ROOT` | compiler | where compiled projections are written |
91
- | `PGC_SNAPSHOT_ROOT` | runtime | the assembled snapshot to execute — a different meaning; prefer `--snapshot` |
109
+ | `PGC_SNAPSHOT_ROOT` | runtime | the assembled snapshot to execute; prefer `--snapshot` |
92
110
  | `PGC_SNAPSHOT_PROFILES` | assembler | the directory holding snapshot profiles |
93
111
  | `PGC_DATA_ROOT` | runtime | side-effect state and traces — or pass `--data-root` |
94
112
 
@@ -97,9 +115,12 @@ the repository above it. For `conformance_workloads` that is the workload direct
97
115
  (`workloads/collatz`); for `snapshot_inspector` it is the repository root. Pointing it one
98
116
  level too high is silent — the build config is simply never found.
99
117
 
100
- `PGC_SNAPSHOT_ROOT` must differ for each domain build. Every layer's output consolidates
101
- into one snapshot root, and verification rejects any file in that root the current build
102
- did not declare. Two domains sharing a root cannot both verify.
118
+ **Where a build writes is declared, not supplied.** Each build configuration names its root in
119
+ `output_configuration.root`, resolved inside the repository that declares it, and every layer's
120
+ output consolidates there. Every shipped configuration declares `snapshot`, so each domain writes
121
+ into its own repository's `snapshot/`. Two in-force configurations of one repository naming the
122
+ same root are refused, and a configuration naming none cannot be built. The compiler does not read
123
+ `PGC_SNAPSHOT_ROOT`.
103
124
 
104
125
  ### 4. Compile each domain
105
126
 
@@ -108,21 +129,22 @@ read from `$PGC_PLATFORM_ROOT/snapshot` regardless of where output is being writ
108
129
 
109
130
  ```bash
110
131
  export PGC_PLATFORM_ROOT=$PWD/software_governance
111
- protocol_compiler compile --structure STRUCTURE_BUILD_PLATFORM_CONFIG_V1
132
+ protocol_compiler compile --structure STRUCTURE_BUILD_PLATFORM_CONFIG_V2
112
133
  ```
113
134
 
114
- Then each domain, into its own output root:
135
+ Then each domain, into the root its build configuration declares:
115
136
 
116
137
  ```bash
117
138
  PGC_DOMAIN_ROOTS=$PWD/conformance_workloads/workloads/collatz \
118
- PGC_SNAPSHOT_ROOT=$PWD/workload_snapshot \
119
139
  protocol_compiler compile --structure STRUCTURE_BUILD_WORKLOAD_CONFIG_V0
120
140
 
121
141
  PGC_DOMAIN_ROOTS=$PWD/snapshot_inspector \
122
- PGC_SNAPSHOT_ROOT=$PWD/inspection_snapshot \
123
142
  protocol_compiler compile --structure STRUCTURE_BUILD_INSPECTION_CONFIG_V0
124
143
  ```
125
144
 
145
+ Each domain writes into its own repository's `snapshot/`, which is where the platform
146
+ already wrote its own and which every one of these repositories gitignores.
147
+
126
148
  Each run reports its stages, artifact count, and whether the result verified and attested.
127
149
 
128
150
  ### 5. Assemble and seal
@@ -135,8 +157,8 @@ export PGC_SNAPSHOT_PROFILES=$PWD/pgc_github/snapshot_profiles
135
157
 
136
158
  snapshot_assembler assemble \
137
159
  --source $PWD/software_governance/snapshot/compiled \
138
- --source $PWD/workload_snapshot/compiled \
139
- --source $PWD/inspection_snapshot/compiled \
160
+ --source $PWD/conformance_workloads/workloads/collatz/snapshot/compiled \
161
+ --source $PWD/snapshot_inspector/snapshot/compiled \
140
162
  --out $PWD/snapshot \
141
163
  --profile GOVERNANCE_SURFACE_PROFILE_V0
142
164
  ```
@@ -159,6 +181,50 @@ protocol_runtime run \
159
181
  `boot` loads and hash-verifies every domain in the manifest before anything executes. The
160
182
  payloads are declarations and live in the cloned repository, not in a wheel.
161
183
 
184
+ `boot` also reads `PGC_SNAPSHOT_PROFILES`, exported in §5. A sealed snapshot's profile claim was
185
+ evaluated when it was sealed, so booting one should not need the profile root — today it does, and
186
+ reports an error before proceeding if the anchor is unset.
187
+
188
+ ### 7. Reach it over HTTP
189
+
190
+ Steps 1 through 6 execute through the CLI. The interaction boundary is a separate surface, and two
191
+ of the cloned repositories ship a client for it: `conformance_workloads/workloads/collatz/client`
192
+ submits work, and `snapshot_inspector/client` reads the snapshot. Each carries its own `web/`, a
193
+ `bindings/http.json` naming which operations are reachable at which route, and a `serve.sh`.
194
+
195
+ **Those `serve.sh` scripts assume a development checkout**, where `runtime`, `inspector` and
196
+ `assembler` are sibling repository roots on `PYTHONPATH`. Here they are installed packages, so the
197
+ roots point at site-packages instead. `protocol_transport` is the exception, and is genuinely a
198
+ repository root because it is unpublished.
199
+
200
+ ```bash
201
+ SP=$(python3 -c 'import site; print(site.getsitepackages()[0])')
202
+ CLIENT=$PWD/conformance_workloads/workloads/collatz/client
203
+
204
+ PGC_RUNTIME_ROOT=$SP PGC_INSPECTOR_ROOT=$SP PGC_ASSEMBLER_ROOT=$SP PGC_IMPL_ROOTS=$SP \
205
+ PGC_SNAPSHOT_ROOT=$PWD/snapshot \
206
+ PGC_DATA_ROOT=$PWD/data/collatz \
207
+ PGC_HTTP_BINDINGS=$CLIENT/bindings/http.json \
208
+ PGC_STATIC_MOUNTS="/=$CLIENT/web;/snapshot=$PWD/snapshot" \
209
+ PGC_HTTP_PORT=8000 \
210
+ $PWD/protocol_transport/run_http.sh
211
+ ```
212
+
213
+ Substitute `$PWD/snapshot_inspector/client` and another port for the read surface. Then:
214
+
215
+ ```bash
216
+ curl -s -X POST http://localhost:8000/collatz -d '{"number":27}'
217
+ curl -s -X POST http://localhost:8001/si -d '{"operation":"si.snapshot.validate"}'
218
+ ```
219
+
220
+ The read surface routes every `si.*` operation through one binding, named in the request body
221
+ rather than in the path. The boundary reads its bindings once, at startup: restart it after any
222
+ rebuild.
223
+
224
+ `run_http.sh` launches `python3`, which is the virtual environment's interpreter while §1's
225
+ environment is active. Set `PYTHON` to an absolute path if you invoke this without activating it —
226
+ not to `$(command -v python)`, which returns an alias rather than a path under some shells.
227
+
162
228
  ## Adding your own domain
163
229
 
164
230
  A domain is a directory the compiler is pointed at. It declares what it contributes, compiles against
@@ -211,6 +277,7 @@ artifact_discovery:
211
277
  domain: platform # compile against the platform's compiled surface
212
278
  artifact_types: [AC, IN, WF, CC, CT]
213
279
  output_configuration:
280
+ root: snapshot # where this build writes, inside your_domain
214
281
  artifacts:
215
282
  layer: PROTOCOL_BUILD_ROOT
216
283
  subpath: compiled/canonical
@@ -225,7 +292,8 @@ output_configuration:
225
292
  subpath: compiled/canonical
226
293
  ```
227
294
 
228
- **All five projection paths are required.** Omitting them does not fail early: the build passes
295
+ **`root` and all five projection paths are required.** A configuration without `root` is refused
296
+ before anything is compiled. Omitting them does not fail early: the build passes
229
297
  discovery, governance and construction and dies at S7 with five `E301_WRITE_FAILED` errors naming
230
298
  each missing path. It reads like a compiler fault and is a missing declaration.
231
299
 
@@ -237,7 +305,6 @@ succeeds, conformance passes, and the domain is simply wrongly named. Nothing ca
237
305
 
238
306
  ```bash
239
307
  PGC_DOMAIN_ROOTS=$PWD/your_domain \
240
- PGC_SNAPSHOT_ROOT=$PWD/your_domain/snapshot \
241
308
  protocol_compiler compile --structure STRUCTURE_BUILD_YOUR_DOMAIN_CONFIG_V0
242
309
  ```
243
310
 
@@ -264,17 +331,27 @@ violate the claimed profile: a snapshot may carry more than a profile requires a
264
331
 
265
332
  ## Known rough edges
266
333
 
267
- - **`--all-structures` and `STRUCTURE_BUILD_PLATFORM_CONFIG_V0` do not build.** The `_V0`
268
- config requires a layer the resolver does not map, and `--all-structures` additionally
269
- names domain structures that are not part of the governance surface. Compile
270
- `STRUCTURE_BUILD_PLATFORM_CONFIG_V1` by name.
334
+ - **A successful compile may end with `⚠ Machine-block health: N candidate unconsumed key(s)`.**
335
+ It is expected, and it is not a failure: the build has already verified and attested by the
336
+ time it prints. It is a heuristic run after the build. For each artifact kind that no schema
337
+ closes, it looks for machine-block keys whose names appear nowhere in the compiler's source. A
338
+ key it lists is a *candidate* for a declaration nothing reads, not proof of one. `--verbose`
339
+ shows the keys.
271
340
  - **`PGC_BUILD_ROOT` is inert.** It is accepted and reported, and nothing reads it.
272
- `PGC_SNAPSHOT_ROOT` is the anchor that controls compiled output.
273
- - **`PGC_SNAPSHOT_ROOT` carries two meanings** — compiled output to the compiler, assembled
274
- snapshot to the runtime. Pass `--snapshot` to the runtime rather than relying on it.
275
341
  - **`pgc` reports readiness for the platform compile only.** It reads three anchors and
276
342
  reports "Ready" once the governance surface resolves; assembly and execution need the
277
343
  other three.
344
+ - **`protocol_runtime boot` requires `PGC_SNAPSHOT_PROFILES`.** A sealed snapshot carries its
345
+ profile claim, and that claim was evaluated when the snapshot was sealed, so booting it should
346
+ not need the profile root. Unset, `boot` prints an error and then proceeds and succeeds. The
347
+ sequence above exports it in §5, so §6 inherits it — which makes the ordering load-bearing
348
+ rather than incidental.
349
+ - **`--data-root` rejects a relative path.** `$PWD/data` above is absolute and passes. A bare
350
+ `data` does not, which will surface first in whatever script wraps this.
351
+ - **No serving path is published for an installed platform.** Both clients' `serve.sh` resolve
352
+ `runtime`, `inspector` and `assembler` from sibling repository roots, which exist in a
353
+ development checkout and not in an install. §7 gives the equivalent invocation; nothing in any
354
+ repository does.
278
355
 
279
356
  ## The family
280
357
 
@@ -291,9 +368,9 @@ violate the claimed profile: a snapshot may carry more than a profile requires a
291
368
 
292
369
  **Versioning.** Two schemes. Each repository's `VERSION` is a monotonic composition ordinal —
293
370
  internal build accounting, tagged `release-<N>`, never published. `PUBLIC_VERSION` is the platform's
294
- public identity, tagged on every component repository; the platform is at **`v4`**.
371
+ public identity, tagged on every component repository; the platform is at **`v5`**.
295
372
 
296
- **The published version follows the public one: `v4` opens at `4.0.0`.** The family releases in
373
+ **The published version follows the public one: `v5` opens at `5.0.0`.** The family releases in
297
374
  lockstep, so the composition pins exact versions rather than ranges.
298
375
 
299
376
  A public identity may carry more than one published version. A packaging or distribution defect can
@@ -301,10 +378,10 @@ be corrected in a patch release within the same identity, because such a fix cha
301
378
  contains and not what the composition determines. A change to what the composition determines takes
302
379
  the next public identity, and only that mints a new DOI.
303
380
 
304
- `v4` is the second kind. The wheels stopped shipping declarations, which is the first; but an
305
- identity published by more than one domain now resolves to its authoring copy rather than to
306
- whichever sorted last, and that changes what the composition answers. A patch release would have
307
- said otherwise.
381
+ `v5` is the second kind. The snapshot identity now covers the claimed profile's content, so
382
+ acceptance refuses a profile changed after sealing, and refuses every snapshot sealed before `v5`.
383
+ A superseded artifact no longer confers effect. Both change what the composition admits, and a patch
384
+ release would have said otherwise.
308
385
 
309
386
  The standard these packages implement is a separate artifact on its own track, is not this number,
310
387
  and is published separately: https://doi.org/10.5281/zenodo.22150616
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: protocol-governed-computing
3
- Version: 4.0.0
3
+ Version: 5.0.0
4
4
  Summary: Protocol-Governed Computing — installs the full toolchain and reports whether an environment is ready to compile, seal, and execute
5
5
  Author-email: Bhash Ganti <bachipeachy@gmail.com>
6
6
  License-Expression: Apache-2.0
@@ -15,16 +15,16 @@ Classifier: Operating System :: OS Independent
15
15
  Classifier: Topic :: Software Development :: Compilers
16
16
  Requires-Python: >=3.10
17
17
  Description-Content-Type: text/markdown
18
- Requires-Dist: pgc-compiler==4.0.0
19
- Requires-Dist: pgc-assembler==4.0.0
20
- Requires-Dist: pgc-runtime==4.0.0
21
- Requires-Dist: pgc-inspector==4.0.0
22
- Requires-Dist: pgc-transformation==4.0.0
23
- Requires-Dist: pgc-governance==4.0.0
24
- Requires-Dist: pgc-workloads==4.0.0
25
- Requires-Dist: pgc-domains==4.0.0
18
+ Requires-Dist: pgc-compiler==5.0.0
19
+ Requires-Dist: pgc-assembler==5.0.0
20
+ Requires-Dist: pgc-runtime==5.0.0
21
+ Requires-Dist: pgc-inspector==5.0.0
22
+ Requires-Dist: pgc-transformation==5.0.0
23
+ Requires-Dist: pgc-governance==5.0.0
24
+ Requires-Dist: pgc-workloads==5.0.0
25
+ Requires-Dist: pgc-domains==5.0.0
26
26
  Provides-Extra: blockchain
27
- Requires-Dist: pgc-domains[blockchain]==4.0.0; extra == "blockchain"
27
+ Requires-Dist: pgc-domains[blockchain]==5.0.0; extra == "blockchain"
28
28
 
29
29
  # pgc_install
30
30
 
@@ -107,16 +107,34 @@ git clone https://github.com/protocol-governed-computing/.github pgc_github
107
107
  `.github` carries the snapshot profiles, which are conformance contracts rather than
108
108
  code and are not published in any wheel.
109
109
 
110
+ A **fifth** clone is needed only to reach the platform over HTTP (§7), and only on
111
+ whichever node serves the boundary:
112
+
113
+ ```bash
114
+ git clone https://github.com/protocol-governed-computing/protocol_transport
115
+ ```
116
+
117
+ `protocol_transport` is deliberately not published. It provisions its import roots —
118
+ `adapters` and `resolver` — from its repository root rather than from an installed
119
+ package, so the boundary is composed by whoever deploys it rather than carried into
120
+ every install. Steps 4 through 6 need none of it.
121
+
122
+ **Pin what you clone.** These commands fetch the default branch, which moves. A wheel at
123
+ one version against declarations from a later branch is an incoherence nothing reports:
124
+ the implementations are one composition's and the declarations another's. Clone
125
+ `--branch <tag>` at the release matching your toolchain — `v5` for `5.0.0` — whenever the
126
+ build has to be reproducible.
127
+
110
128
  ### 3. The anchors
111
129
 
112
- Six environment variables govern where the toolchain reads and writes.
130
+ Five environment variables govern where the toolchain reads and writes. Where the compiler
131
+ writes is not one of them.
113
132
 
114
133
  | Anchor | Read by | Meaning |
115
134
  |---|---|---|
116
135
  | `PGC_PLATFORM_ROOT` | compiler | the governance repository — the directory containing `registry/` |
117
136
  | `PGC_DOMAIN_ROOTS` | compiler | the domain being compiled — the directory containing `registry/structures/` |
118
- | `PGC_SNAPSHOT_ROOT` | compiler | where compiled projections are written |
119
- | `PGC_SNAPSHOT_ROOT` | runtime | the assembled snapshot to execute — a different meaning; prefer `--snapshot` |
137
+ | `PGC_SNAPSHOT_ROOT` | runtime | the assembled snapshot to execute; prefer `--snapshot` |
120
138
  | `PGC_SNAPSHOT_PROFILES` | assembler | the directory holding snapshot profiles |
121
139
  | `PGC_DATA_ROOT` | runtime | side-effect state and traces — or pass `--data-root` |
122
140
 
@@ -125,9 +143,12 @@ the repository above it. For `conformance_workloads` that is the workload direct
125
143
  (`workloads/collatz`); for `snapshot_inspector` it is the repository root. Pointing it one
126
144
  level too high is silent — the build config is simply never found.
127
145
 
128
- `PGC_SNAPSHOT_ROOT` must differ for each domain build. Every layer's output consolidates
129
- into one snapshot root, and verification rejects any file in that root the current build
130
- did not declare. Two domains sharing a root cannot both verify.
146
+ **Where a build writes is declared, not supplied.** Each build configuration names its root in
147
+ `output_configuration.root`, resolved inside the repository that declares it, and every layer's
148
+ output consolidates there. Every shipped configuration declares `snapshot`, so each domain writes
149
+ into its own repository's `snapshot/`. Two in-force configurations of one repository naming the
150
+ same root are refused, and a configuration naming none cannot be built. The compiler does not read
151
+ `PGC_SNAPSHOT_ROOT`.
131
152
 
132
153
  ### 4. Compile each domain
133
154
 
@@ -136,21 +157,22 @@ read from `$PGC_PLATFORM_ROOT/snapshot` regardless of where output is being writ
136
157
 
137
158
  ```bash
138
159
  export PGC_PLATFORM_ROOT=$PWD/software_governance
139
- protocol_compiler compile --structure STRUCTURE_BUILD_PLATFORM_CONFIG_V1
160
+ protocol_compiler compile --structure STRUCTURE_BUILD_PLATFORM_CONFIG_V2
140
161
  ```
141
162
 
142
- Then each domain, into its own output root:
163
+ Then each domain, into the root its build configuration declares:
143
164
 
144
165
  ```bash
145
166
  PGC_DOMAIN_ROOTS=$PWD/conformance_workloads/workloads/collatz \
146
- PGC_SNAPSHOT_ROOT=$PWD/workload_snapshot \
147
167
  protocol_compiler compile --structure STRUCTURE_BUILD_WORKLOAD_CONFIG_V0
148
168
 
149
169
  PGC_DOMAIN_ROOTS=$PWD/snapshot_inspector \
150
- PGC_SNAPSHOT_ROOT=$PWD/inspection_snapshot \
151
170
  protocol_compiler compile --structure STRUCTURE_BUILD_INSPECTION_CONFIG_V0
152
171
  ```
153
172
 
173
+ Each domain writes into its own repository's `snapshot/`, which is where the platform
174
+ already wrote its own and which every one of these repositories gitignores.
175
+
154
176
  Each run reports its stages, artifact count, and whether the result verified and attested.
155
177
 
156
178
  ### 5. Assemble and seal
@@ -163,8 +185,8 @@ export PGC_SNAPSHOT_PROFILES=$PWD/pgc_github/snapshot_profiles
163
185
 
164
186
  snapshot_assembler assemble \
165
187
  --source $PWD/software_governance/snapshot/compiled \
166
- --source $PWD/workload_snapshot/compiled \
167
- --source $PWD/inspection_snapshot/compiled \
188
+ --source $PWD/conformance_workloads/workloads/collatz/snapshot/compiled \
189
+ --source $PWD/snapshot_inspector/snapshot/compiled \
168
190
  --out $PWD/snapshot \
169
191
  --profile GOVERNANCE_SURFACE_PROFILE_V0
170
192
  ```
@@ -187,6 +209,50 @@ protocol_runtime run \
187
209
  `boot` loads and hash-verifies every domain in the manifest before anything executes. The
188
210
  payloads are declarations and live in the cloned repository, not in a wheel.
189
211
 
212
+ `boot` also reads `PGC_SNAPSHOT_PROFILES`, exported in §5. A sealed snapshot's profile claim was
213
+ evaluated when it was sealed, so booting one should not need the profile root — today it does, and
214
+ reports an error before proceeding if the anchor is unset.
215
+
216
+ ### 7. Reach it over HTTP
217
+
218
+ Steps 1 through 6 execute through the CLI. The interaction boundary is a separate surface, and two
219
+ of the cloned repositories ship a client for it: `conformance_workloads/workloads/collatz/client`
220
+ submits work, and `snapshot_inspector/client` reads the snapshot. Each carries its own `web/`, a
221
+ `bindings/http.json` naming which operations are reachable at which route, and a `serve.sh`.
222
+
223
+ **Those `serve.sh` scripts assume a development checkout**, where `runtime`, `inspector` and
224
+ `assembler` are sibling repository roots on `PYTHONPATH`. Here they are installed packages, so the
225
+ roots point at site-packages instead. `protocol_transport` is the exception, and is genuinely a
226
+ repository root because it is unpublished.
227
+
228
+ ```bash
229
+ SP=$(python3 -c 'import site; print(site.getsitepackages()[0])')
230
+ CLIENT=$PWD/conformance_workloads/workloads/collatz/client
231
+
232
+ PGC_RUNTIME_ROOT=$SP PGC_INSPECTOR_ROOT=$SP PGC_ASSEMBLER_ROOT=$SP PGC_IMPL_ROOTS=$SP \
233
+ PGC_SNAPSHOT_ROOT=$PWD/snapshot \
234
+ PGC_DATA_ROOT=$PWD/data/collatz \
235
+ PGC_HTTP_BINDINGS=$CLIENT/bindings/http.json \
236
+ PGC_STATIC_MOUNTS="/=$CLIENT/web;/snapshot=$PWD/snapshot" \
237
+ PGC_HTTP_PORT=8000 \
238
+ $PWD/protocol_transport/run_http.sh
239
+ ```
240
+
241
+ Substitute `$PWD/snapshot_inspector/client` and another port for the read surface. Then:
242
+
243
+ ```bash
244
+ curl -s -X POST http://localhost:8000/collatz -d '{"number":27}'
245
+ curl -s -X POST http://localhost:8001/si -d '{"operation":"si.snapshot.validate"}'
246
+ ```
247
+
248
+ The read surface routes every `si.*` operation through one binding, named in the request body
249
+ rather than in the path. The boundary reads its bindings once, at startup: restart it after any
250
+ rebuild.
251
+
252
+ `run_http.sh` launches `python3`, which is the virtual environment's interpreter while §1's
253
+ environment is active. Set `PYTHON` to an absolute path if you invoke this without activating it —
254
+ not to `$(command -v python)`, which returns an alias rather than a path under some shells.
255
+
190
256
  ## Adding your own domain
191
257
 
192
258
  A domain is a directory the compiler is pointed at. It declares what it contributes, compiles against
@@ -239,6 +305,7 @@ artifact_discovery:
239
305
  domain: platform # compile against the platform's compiled surface
240
306
  artifact_types: [AC, IN, WF, CC, CT]
241
307
  output_configuration:
308
+ root: snapshot # where this build writes, inside your_domain
242
309
  artifacts:
243
310
  layer: PROTOCOL_BUILD_ROOT
244
311
  subpath: compiled/canonical
@@ -253,7 +320,8 @@ output_configuration:
253
320
  subpath: compiled/canonical
254
321
  ```
255
322
 
256
- **All five projection paths are required.** Omitting them does not fail early: the build passes
323
+ **`root` and all five projection paths are required.** A configuration without `root` is refused
324
+ before anything is compiled. Omitting them does not fail early: the build passes
257
325
  discovery, governance and construction and dies at S7 with five `E301_WRITE_FAILED` errors naming
258
326
  each missing path. It reads like a compiler fault and is a missing declaration.
259
327
 
@@ -265,7 +333,6 @@ succeeds, conformance passes, and the domain is simply wrongly named. Nothing ca
265
333
 
266
334
  ```bash
267
335
  PGC_DOMAIN_ROOTS=$PWD/your_domain \
268
- PGC_SNAPSHOT_ROOT=$PWD/your_domain/snapshot \
269
336
  protocol_compiler compile --structure STRUCTURE_BUILD_YOUR_DOMAIN_CONFIG_V0
270
337
  ```
271
338
 
@@ -292,17 +359,27 @@ violate the claimed profile: a snapshot may carry more than a profile requires a
292
359
 
293
360
  ## Known rough edges
294
361
 
295
- - **`--all-structures` and `STRUCTURE_BUILD_PLATFORM_CONFIG_V0` do not build.** The `_V0`
296
- config requires a layer the resolver does not map, and `--all-structures` additionally
297
- names domain structures that are not part of the governance surface. Compile
298
- `STRUCTURE_BUILD_PLATFORM_CONFIG_V1` by name.
362
+ - **A successful compile may end with `⚠ Machine-block health: N candidate unconsumed key(s)`.**
363
+ It is expected, and it is not a failure: the build has already verified and attested by the
364
+ time it prints. It is a heuristic run after the build. For each artifact kind that no schema
365
+ closes, it looks for machine-block keys whose names appear nowhere in the compiler's source. A
366
+ key it lists is a *candidate* for a declaration nothing reads, not proof of one. `--verbose`
367
+ shows the keys.
299
368
  - **`PGC_BUILD_ROOT` is inert.** It is accepted and reported, and nothing reads it.
300
- `PGC_SNAPSHOT_ROOT` is the anchor that controls compiled output.
301
- - **`PGC_SNAPSHOT_ROOT` carries two meanings** — compiled output to the compiler, assembled
302
- snapshot to the runtime. Pass `--snapshot` to the runtime rather than relying on it.
303
369
  - **`pgc` reports readiness for the platform compile only.** It reads three anchors and
304
370
  reports "Ready" once the governance surface resolves; assembly and execution need the
305
371
  other three.
372
+ - **`protocol_runtime boot` requires `PGC_SNAPSHOT_PROFILES`.** A sealed snapshot carries its
373
+ profile claim, and that claim was evaluated when the snapshot was sealed, so booting it should
374
+ not need the profile root. Unset, `boot` prints an error and then proceeds and succeeds. The
375
+ sequence above exports it in §5, so §6 inherits it — which makes the ordering load-bearing
376
+ rather than incidental.
377
+ - **`--data-root` rejects a relative path.** `$PWD/data` above is absolute and passes. A bare
378
+ `data` does not, which will surface first in whatever script wraps this.
379
+ - **No serving path is published for an installed platform.** Both clients' `serve.sh` resolve
380
+ `runtime`, `inspector` and `assembler` from sibling repository roots, which exist in a
381
+ development checkout and not in an install. §7 gives the equivalent invocation; nothing in any
382
+ repository does.
306
383
 
307
384
  ## The family
308
385
 
@@ -319,9 +396,9 @@ violate the claimed profile: a snapshot may carry more than a profile requires a
319
396
 
320
397
  **Versioning.** Two schemes. Each repository's `VERSION` is a monotonic composition ordinal —
321
398
  internal build accounting, tagged `release-<N>`, never published. `PUBLIC_VERSION` is the platform's
322
- public identity, tagged on every component repository; the platform is at **`v4`**.
399
+ public identity, tagged on every component repository; the platform is at **`v5`**.
323
400
 
324
- **The published version follows the public one: `v4` opens at `4.0.0`.** The family releases in
401
+ **The published version follows the public one: `v5` opens at `5.0.0`.** The family releases in
325
402
  lockstep, so the composition pins exact versions rather than ranges.
326
403
 
327
404
  A public identity may carry more than one published version. A packaging or distribution defect can
@@ -329,10 +406,10 @@ be corrected in a patch release within the same identity, because such a fix cha
329
406
  contains and not what the composition determines. A change to what the composition determines takes
330
407
  the next public identity, and only that mints a new DOI.
331
408
 
332
- `v4` is the second kind. The wheels stopped shipping declarations, which is the first; but an
333
- identity published by more than one domain now resolves to its authoring copy rather than to
334
- whichever sorted last, and that changes what the composition answers. A patch release would have
335
- said otherwise.
409
+ `v5` is the second kind. The snapshot identity now covers the claimed profile's content, so
410
+ acceptance refuses a profile changed after sealing, and refuses every snapshot sealed before `v5`.
411
+ A superseded artifact no longer confers effect. Both change what the composition admits, and a patch
412
+ release would have said otherwise.
336
413
 
337
414
  The standard these packages implement is a separate artifact on its own track, is not this number,
338
415
  and is published separately: https://doi.org/10.5281/zenodo.22150616
@@ -0,0 +1,11 @@
1
+ pgc-compiler==5.0.0
2
+ pgc-assembler==5.0.0
3
+ pgc-runtime==5.0.0
4
+ pgc-inspector==5.0.0
5
+ pgc-transformation==5.0.0
6
+ pgc-governance==5.0.0
7
+ pgc-workloads==5.0.0
8
+ pgc-domains==5.0.0
9
+
10
+ [blockchain]
11
+ pgc-domains[blockchain]==5.0.0
@@ -7,7 +7,7 @@ build-backend = "setuptools.build_meta"
7
7
  # composition takes the full project name. The import package and the console script are unaffected:
8
8
  # a user still runs `pgc`.
9
9
  name = "protocol-governed-computing"
10
- version = "4.0.0"
10
+ version = "5.0.0"
11
11
  description = "Protocol-Governed Computing — installs the full toolchain and reports whether an environment is ready to compile, seal, and execute"
12
12
  readme = "README.md"
13
13
  requires-python = ">=3.10"
@@ -28,20 +28,20 @@ classifiers = [
28
28
  # the repos release together and the governance closure forces lockstep, so a
29
29
  # mixed-version install is not a supported configuration.
30
30
  dependencies = [
31
- "pgc-compiler==4.0.0",
32
- "pgc-assembler==4.0.0",
33
- "pgc-runtime==4.0.0",
34
- "pgc-inspector==4.0.0",
35
- "pgc-transformation==4.0.0",
36
- "pgc-governance==4.0.0",
37
- "pgc-workloads==4.0.0",
38
- "pgc-domains==4.0.0",
31
+ "pgc-compiler==5.0.0",
32
+ "pgc-assembler==5.0.0",
33
+ "pgc-runtime==5.0.0",
34
+ "pgc-inspector==5.0.0",
35
+ "pgc-transformation==5.0.0",
36
+ "pgc-governance==5.0.0",
37
+ "pgc-workloads==5.0.0",
38
+ "pgc-domains==5.0.0",
39
39
  ]
40
40
 
41
41
  # The blockchain domain's capability transforms need Keccak-256, which is optional in pgc-domains
42
42
  # for the same reason it is optional there: the core compile path imports none of it.
43
43
  [project.optional-dependencies]
44
- blockchain = ["pgc-domains[blockchain]==4.0.0"]
44
+ blockchain = ["pgc-domains[blockchain]==5.0.0"]
45
45
 
46
46
  [project.scripts]
47
47
  pgc = "pgc.cli:main"
@@ -1,11 +0,0 @@
1
- pgc-compiler==4.0.0
2
- pgc-assembler==4.0.0
3
- pgc-runtime==4.0.0
4
- pgc-inspector==4.0.0
5
- pgc-transformation==4.0.0
6
- pgc-governance==4.0.0
7
- pgc-workloads==4.0.0
8
- pgc-domains==4.0.0
9
-
10
- [blockchain]
11
- pgc-domains[blockchain]==4.0.0