satroot 1.4.0__py3-none-any.whl

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 (174) hide show
  1. satroot-1.4.0.dist-info/METADATA +3013 -0
  2. satroot-1.4.0.dist-info/RECORD +174 -0
  3. satroot-1.4.0.dist-info/WHEEL +5 -0
  4. satroot-1.4.0.dist-info/entry_points.txt +41 -0
  5. satroot-1.4.0.dist-info/licenses/LICENSE +13 -0
  6. satroot-1.4.0.dist-info/licenses/NOTICE +9 -0
  7. satroot-1.4.0.dist-info/top_level.txt +44 -0
  8. satroot1.py +36811 -0
  9. satroot_anchored_demo_smoke.py +171 -0
  10. satroot_anchored_publication_smoke.py +181 -0
  11. satroot_collection_lint.py +136 -0
  12. satroot_demo_bundle_index_matrix_smoke.py +101 -0
  13. satroot_demo_release_catalog_index_matrix_smoke.py +108 -0
  14. satroot_demo_release_catalog_matrix_smoke.py +98 -0
  15. satroot_envelope_verification_smoke.py +210 -0
  16. satroot_event_profile_smoke.py +286 -0
  17. satroot_examples/README.md +519 -0
  18. satroot_examples/__init__.py +3 -0
  19. satroot_examples/bundle_index_presets/ai_compute_bundle_index.json +13 -0
  20. satroot_examples/bundle_index_presets/ai_compute_bundle_index_collection_backed.json +10 -0
  21. satroot_examples/bundle_index_presets/machine_compute_bundle_index.json +13 -0
  22. satroot_examples/bundle_index_presets/machine_compute_bundle_index_collection_backed.json +10 -0
  23. satroot_examples/bundle_index_presets/stable_reference_bundle_index.json +13 -0
  24. satroot_examples/bundle_index_presets/stable_reference_bundle_index_collection_backed.json +10 -0
  25. satroot_examples/catalog_presets/ai_compute_catalog.json +54 -0
  26. satroot_examples/catalog_presets/ai_compute_catalog_collection_backed.json +5 -0
  27. satroot_examples/catalog_presets/event_stream_catalog.json +34 -0
  28. satroot_examples/catalog_presets/identity_authority_catalog.json +34 -0
  29. satroot_examples/catalog_presets/identity_authority_catalog_collection_backed.json +5 -0
  30. satroot_examples/catalog_presets/license_usage_catalog.json +35 -0
  31. satroot_examples/catalog_presets/license_usage_catalog_collection_backed.json +5 -0
  32. satroot_examples/catalog_presets/machine_compute_catalog.json +35 -0
  33. satroot_examples/catalog_presets/machine_compute_catalog_collection_backed.json +5 -0
  34. satroot_examples/catalog_presets/receipt_invoice_catalog.json +35 -0
  35. satroot_examples/catalog_presets/receipt_invoice_catalog_collection_backed.json +5 -0
  36. satroot_examples/catalog_presets/stable_reference_catalog.json +32 -0
  37. satroot_examples/catalog_presets/stable_reference_catalog_collection_backed.json +5 -0
  38. satroot_examples/events_apicredit1.json +64 -0
  39. satroot_examples/events_event1.json +53 -0
  40. satroot_examples/events_floor1.json +58 -0
  41. satroot_examples/events_identity1.json +65 -0
  42. satroot_examples/events_license1.json +66 -0
  43. satroot_examples/events_receipt1.json +66 -0
  44. satroot_examples/events_usdroot1.json +64 -0
  45. satroot_examples/genesis_apicredit1.json +24 -0
  46. satroot_examples/genesis_event1.json +25 -0
  47. satroot_examples/genesis_floor1.json +18 -0
  48. satroot_examples/genesis_identity1.json +25 -0
  49. satroot_examples/genesis_license1.json +26 -0
  50. satroot_examples/genesis_receipt1.json +26 -0
  51. satroot_examples/genesis_usdroot1.json +24 -0
  52. satroot_examples/network_presets/ai_compute_publication_network.json +12 -0
  53. satroot_examples/network_presets/ai_compute_publication_network_collection_backed.json +10 -0
  54. satroot_examples/network_presets/ai_compute_publication_network_publish.json +13 -0
  55. satroot_examples/network_presets/machine_compute_publication_network.json +12 -0
  56. satroot_examples/network_presets/machine_compute_publication_network_collection_backed.json +10 -0
  57. satroot_examples/network_presets/machine_compute_publication_network_publish.json +13 -0
  58. satroot_examples/network_presets/stable_reference_publication_network.json +12 -0
  59. satroot_examples/network_presets/stable_reference_publication_network_collection_backed.json +10 -0
  60. satroot_examples/publication_catalog_workspace_presets/ai_compute_publication_catalog_workspace.json +19 -0
  61. satroot_examples/publication_catalog_workspace_presets/ai_compute_publication_catalog_workspace_collection_backed.json +17 -0
  62. satroot_examples/publication_catalog_workspace_presets/machine_compute_publication_catalog_workspace.json +19 -0
  63. satroot_examples/publication_catalog_workspace_presets/machine_compute_publication_catalog_workspace_collection_backed.json +17 -0
  64. satroot_examples/publication_catalog_workspace_presets/stable_reference_publication_catalog_workspace.json +19 -0
  65. satroot_examples/publication_catalog_workspace_presets/stable_reference_publication_catalog_workspace_collection_backed.json +17 -0
  66. satroot_examples/publication_descriptor_index_presets/ai_compute_publication_descriptor_index.json +12 -0
  67. satroot_examples/publication_descriptor_index_presets/machine_compute_publication_descriptor_index.json +12 -0
  68. satroot_examples/publication_descriptor_index_presets/stable_reference_publication_descriptor_index.json +12 -0
  69. satroot_examples/publication_metadata_catalog_presets/ai_compute_publication_metadata_catalog.json +12 -0
  70. satroot_examples/publication_metadata_catalog_presets/ai_compute_publication_metadata_catalog_collection_backed.json +10 -0
  71. satroot_examples/publication_metadata_catalog_presets/machine_compute_publication_metadata_catalog.json +12 -0
  72. satroot_examples/publication_metadata_catalog_presets/machine_compute_publication_metadata_catalog_collection_backed.json +10 -0
  73. satroot_examples/publication_metadata_catalog_presets/stable_reference_publication_metadata_catalog.json +12 -0
  74. satroot_examples/publication_metadata_catalog_presets/stable_reference_publication_metadata_catalog_collection_backed.json +10 -0
  75. satroot_examples/registry_presets/ai_compute_publication_registry.json +12 -0
  76. satroot_examples/registry_presets/ai_compute_publication_registry_collection_backed.json +10 -0
  77. satroot_examples/registry_presets/ai_compute_publication_registry_workspace_backed.json +10 -0
  78. satroot_examples/registry_presets/ai_compute_publication_registry_workspace_catalog_release_collection_backed.json +10 -0
  79. satroot_examples/registry_presets/identity_authority_publication_registry_workspace_catalog_release_collection_backed.json +10 -0
  80. satroot_examples/registry_presets/license_usage_publication_registry_workspace_catalog_release_collection_backed.json +10 -0
  81. satroot_examples/registry_presets/machine_compute_publication_registry.json +12 -0
  82. satroot_examples/registry_presets/machine_compute_publication_registry_collection_backed.json +10 -0
  83. satroot_examples/registry_presets/machine_compute_publication_registry_workspace_backed.json +10 -0
  84. satroot_examples/registry_presets/machine_compute_publication_registry_workspace_catalog_release_collection_backed.json +10 -0
  85. satroot_examples/registry_presets/receipt_invoice_publication_registry_workspace_catalog_release_collection_backed.json +10 -0
  86. satroot_examples/registry_presets/stable_reference_publication_registry.json +12 -0
  87. satroot_examples/registry_presets/stable_reference_publication_registry_collection_backed.json +10 -0
  88. satroot_examples/registry_presets/stable_reference_publication_registry_workspace_backed.json +10 -0
  89. satroot_examples/registry_presets/stable_reference_publication_registry_workspace_catalog_release_collection_backed.json +10 -0
  90. satroot_examples/registry_workspace_presets/ai_compute_publication_registry_workspace.json +22 -0
  91. satroot_examples/registry_workspace_presets/ai_compute_publication_registry_workspace_catalog_release_collection_backed.json +21 -0
  92. satroot_examples/registry_workspace_presets/ai_compute_publication_registry_workspace_collection_backed.json +11 -0
  93. satroot_examples/registry_workspace_presets/identity_authority_publication_registry_workspace_catalog_release_collection_backed.json +21 -0
  94. satroot_examples/registry_workspace_presets/license_usage_publication_registry_workspace_catalog_release_collection_backed.json +21 -0
  95. satroot_examples/registry_workspace_presets/machine_compute_publication_registry_workspace.json +22 -0
  96. satroot_examples/registry_workspace_presets/machine_compute_publication_registry_workspace_catalog_release_collection_backed.json +21 -0
  97. satroot_examples/registry_workspace_presets/machine_compute_publication_registry_workspace_collection_backed.json +11 -0
  98. satroot_examples/registry_workspace_presets/receipt_invoice_publication_registry_workspace_catalog_release_collection_backed.json +21 -0
  99. satroot_examples/registry_workspace_presets/stable_reference_publication_registry_workspace.json +22 -0
  100. satroot_examples/registry_workspace_presets/stable_reference_publication_registry_workspace_catalog_release_collection_backed.json +21 -0
  101. satroot_examples/registry_workspace_presets/stable_reference_publication_registry_workspace_collection_backed.json +11 -0
  102. satroot_examples/release_catalog_index_presets/ai_compute_catalog_network.json +16 -0
  103. satroot_examples/release_catalog_index_presets/ai_compute_catalog_network_collection_backed.json +10 -0
  104. satroot_examples/release_catalog_index_presets/machine_compute_catalog_network.json +16 -0
  105. satroot_examples/release_catalog_index_presets/machine_compute_catalog_network_collection_backed.json +10 -0
  106. satroot_examples/release_catalog_index_presets/stable_reference_catalog_network.json +16 -0
  107. satroot_examples/release_catalog_index_presets/stable_reference_catalog_network_collection_backed.json +10 -0
  108. satroot_examples/release_catalog_presets/ai_compute_release_stack.json +16 -0
  109. satroot_examples/release_catalog_presets/ai_compute_release_stack_collection_backed.json +10 -0
  110. satroot_examples/release_catalog_presets/machine_compute_release_stack.json +16 -0
  111. satroot_examples/release_catalog_presets/machine_compute_release_stack_collection_backed.json +10 -0
  112. satroot_examples/release_catalog_presets/stable_reference_release_stack.json +16 -0
  113. satroot_examples/release_catalog_presets/stable_reference_release_stack_collection_backed.json +10 -0
  114. satroot_examples/stack_presets/ai_compute_publication_stack.json +12 -0
  115. satroot_examples/stack_presets/ai_compute_publication_stack_collection_backed.json +10 -0
  116. satroot_examples/stack_presets/ai_compute_publication_stack_publish.json +13 -0
  117. satroot_examples/stack_presets/machine_compute_publication_stack.json +12 -0
  118. satroot_examples/stack_presets/machine_compute_publication_stack_collection_backed.json +10 -0
  119. satroot_examples/stack_presets/machine_compute_publication_stack_publish.json +13 -0
  120. satroot_examples/stack_presets/stable_reference_publication_stack.json +12 -0
  121. satroot_examples/stack_presets/stable_reference_publication_stack_collection_backed.json +10 -0
  122. satroot_federated_registry_collection_smoke.py +253 -0
  123. satroot_identity_demo_bundle_index_smoke.py +264 -0
  124. satroot_identity_demo_release_catalog_index_smoke.py +144 -0
  125. satroot_identity_demo_release_catalog_smoke.py +131 -0
  126. satroot_identity_profile_smoke.py +286 -0
  127. satroot_license_demo_bundle_index_smoke.py +266 -0
  128. satroot_license_demo_release_catalog_index_smoke.py +146 -0
  129. satroot_license_demo_release_catalog_smoke.py +133 -0
  130. satroot_license_profile_smoke.py +286 -0
  131. satroot_machine_demo_bundle_index_smoke.py +240 -0
  132. satroot_machine_demo_release_catalog_index_smoke.py +354 -0
  133. satroot_machine_demo_release_catalog_smoke.py +284 -0
  134. satroot_machine_profile_smoke.py +316 -0
  135. satroot_onchain_envelope_smoke.py +189 -0
  136. satroot_operator_proof_smoke.py +173 -0
  137. satroot_profile_federation_smoke.py +626 -0
  138. satroot_profile_matrix_smoke.py +100 -0
  139. satroot_protocol/__init__.py +3 -0
  140. satroot_protocol/satroot1.bundle-index.schema.json +84 -0
  141. satroot_protocol/satroot1.bundle-manifest.schema.json +200 -0
  142. satroot_protocol/satroot1.demo-catalog-summary.schema.json +66 -0
  143. satroot_protocol/satroot1.profile-registry.json +78 -0
  144. satroot_protocol/satroot1.publication-descriptor-index-manifest.schema.json +65 -0
  145. satroot_protocol/satroot1.publication-descriptor-index.schema.json +104 -0
  146. satroot_protocol/satroot1.publication-metadata-catalog-manifest.schema.json +65 -0
  147. satroot_protocol/satroot1.publication-metadata-catalog.schema.json +124 -0
  148. satroot_protocol/satroot1.publication-metadata-manifest.schema.json +76 -0
  149. satroot_protocol/satroot1.publication-network-summary.schema.json +76 -0
  150. satroot_protocol/satroot1.publication-registry-manifest.schema.json +65 -0
  151. satroot_protocol/satroot1.publication-registry.schema.json +150 -0
  152. satroot_protocol/satroot1.publication-stack-summary.schema.json +75 -0
  153. satroot_protocol/satroot1.release-catalog-index-manifest.schema.json +65 -0
  154. satroot_protocol/satroot1.release-catalog-index.schema.json +86 -0
  155. satroot_protocol/satroot1.release-catalog-manifest.schema.json +65 -0
  156. satroot_protocol/satroot1.release-catalog.schema.json +81 -0
  157. satroot_protocol/satroot1.release-manifest.schema.json +65 -0
  158. satroot_protocol/satroot1.schema.json +221 -0
  159. satroot_publication_ladder_smoke.py +107 -0
  160. satroot_receipt_demo_bundle_index_smoke.py +266 -0
  161. satroot_receipt_demo_release_catalog_index_smoke.py +146 -0
  162. satroot_receipt_demo_release_catalog_smoke.py +133 -0
  163. satroot_receipt_profile_smoke.py +286 -0
  164. satroot_release_gate_smoke.py +289 -0
  165. satroot_singleton_demo_bundle_index_matrix_smoke.py +106 -0
  166. satroot_singleton_demo_release_catalog_index_matrix_smoke.py +114 -0
  167. satroot_singleton_demo_release_catalog_matrix_smoke.py +106 -0
  168. satroot_singleton_demo_release_smoke_support.py +364 -0
  169. satroot_singleton_publication_ladder_smoke.py +112 -0
  170. satroot_stable_demo_bundle_index_smoke.py +236 -0
  171. satroot_stable_demo_release_catalog_index_smoke.py +350 -0
  172. satroot_stable_demo_release_catalog_smoke.py +280 -0
  173. satroot_stable_profile_smoke.py +308 -0
  174. satroot_test.py +113 -0
@@ -0,0 +1,3013 @@
1
+ Metadata-Version: 2.4
2
+ Name: satroot
3
+ Version: 1.4.0
4
+ Summary: SATROOT-1: one native satoshi as root witness for unbounded semantic token state.
5
+ Author-email: PARTH MAURIA SAXENA <parthms.id@gmail.com>
6
+ License: Apache-2.0
7
+ Project-URL: Homepage, https://github.com/parthod0x/satroot
8
+ Project-URL: Repository, https://github.com/parthod0x/satroot
9
+ Project-URL: Changelog, https://github.com/parthod0x/satroot/blob/main/CHANGELOG.md
10
+ Keywords: bsv,bitcoin,satoshi,tokens,semantic-ledger,machine-native
11
+ Classifier: Development Status :: 3 - Alpha
12
+ Classifier: Intended Audience :: Developers
13
+ Classifier: License :: OSI Approved :: Apache Software License
14
+ Classifier: Programming Language :: Python :: 3
15
+ Classifier: Topic :: Software Development :: Libraries :: Python Modules
16
+ Requires-Python: >=3.10
17
+ Description-Content-Type: text/markdown
18
+ License-File: LICENSE
19
+ License-File: NOTICE
20
+ Provides-Extra: crypto
21
+ Requires-Dist: cryptography>=42; extra == "crypto"
22
+ Provides-Extra: validation
23
+ Requires-Dist: jsonschema>=4.23; extra == "validation"
24
+ Dynamic: license-file
25
+
26
+ # SATROOT
27
+
28
+ **SATROOT** is a one-satoshi-rooted semantic asset protocol.
29
+
30
+ Its base primitive, **SATROOT-1**, treats one native BSV satoshi UTXO as the irreducible accounting floor and uses that UTXO as a root witness, authority handle, and namespace anchor for deterministic protocol state.
31
+
32
+ The core rule is simple:
33
+
34
+ > The satoshi is not subdivided. The satoshi anchors a protocol-defined state space.
35
+
36
+ ## Project thesis
37
+
38
+ SATROOT starts from one idea:
39
+
40
+ > A satoshi is the floor of value; it is not the ceiling of meaning.
41
+
42
+ That means one satoshi can anchor a replayable semantic ledger without pretending to create sub-satoshis. Token units, credits, receipts, rights, and other objects live as protocol-defined state above the native chain unit.
43
+
44
+ ## Quickstart
45
+
46
+ Requires Python 3.10 or newer. From a clone of this repo:
47
+
48
+ ```bash
49
+ pip install -e .
50
+ satroot1 replay examples/events_floor1.json
51
+ ```
52
+
53
+ That replays the checked-in `FLOOR1` demo ledger and prints its deterministic balances and state hash. Add the extras for the full surface: `pip install -e ".[crypto,validation]"` enables ed25519 signing (used by the anchored lanes) and JSON-schema validation (used by the publication workspace generators). Every checked-in example runs on placeholder roots — see `ANCHORS.md` for the real testnet anchoring record, and `SPEC.md` for the protocol itself. Licensed Apache-2.0.
54
+
55
+ ## What this repo delivers
56
+
57
+ This repository ships the `SATROOT-1` kernel, six registered profiles, the publication ladder, and the anchored proof loop:
58
+
59
+ - `SPEC.md` - human-readable protocol specification.
60
+ - `ARCHITECTURE.md` - top-level model, layer boundaries, and deliverable framing.
61
+ - `BOUNDARIES.md` - claim discipline, non-goals, and legal boundary language.
62
+ - `ROADMAP.md` - project scope, deliverables, and released plus planned protocol profiles.
63
+ - `ANCHORS.md` - the only checked-in record of real on-chain outpoints and transaction ids.
64
+ - `KEY_MANAGEMENT.md` - operational guidance for composing the frozen signature schemes: custody separation, verifier-only distribution, rotation, and the lint-versus-verify trust model (`*-lint` is structural; `verify-*` is the cryptographic gate).
65
+ - `CHANGELOG.md`, `RELEASE_CHECKLIST.md`, `CITATION.cff` - release history, pre-tag gates, and citation metadata.
66
+ - `protocol/satroot1.schema.json` - JSON schema for genesis and event records.
67
+ - `protocol/satroot1.bundle-manifest.schema.json` - JSON schema for signed bundle manifests.
68
+ - `protocol/satroot1.bundle-index.schema.json` - JSON schema for bundle index catalogs.
69
+ - `protocol/satroot1.release-manifest.schema.json` - JSON schema for signed release manifests.
70
+ - `protocol/satroot1.release-catalog.schema.json` - JSON schema for multi-release catalogs.
71
+ - `protocol/satroot1.release-catalog-manifest.schema.json` - JSON schema for signed multi-release catalog manifests.
72
+ - `protocol/satroot1.release-catalog-index.schema.json` - JSON schema for multi-catalog release index exports.
73
+ - `protocol/satroot1.release-catalog-index-manifest.schema.json` - JSON schema for signed multi-catalog release index manifests.
74
+ - `protocol/satroot1.demo-catalog-summary.schema.json` - JSON schema for demo catalog workspace summaries.
75
+ - `protocol/satroot1.publication-stack-summary.schema.json` - JSON schema for publication-stack workspace summaries.
76
+ - `protocol/satroot1.publication-network-summary.schema.json` - JSON schema for publication-network workspace summaries.
77
+ - `protocol/satroot1.publication-descriptor-index.schema.json` - JSON schema for publication descriptor indexes.
78
+ - `protocol/satroot1.publication-descriptor-index-manifest.schema.json` - JSON schema for signed publication descriptor index manifests.
79
+ - `protocol/satroot1.publication-metadata-manifest.schema.json` - JSON schema for signed publication metadata bundles.
80
+ - `protocol/satroot1.publication-metadata-catalog.schema.json` - JSON schema for multi-bundle publication metadata catalogs.
81
+ - `protocol/satroot1.publication-metadata-catalog-manifest.schema.json` - JSON schema for signed publication metadata catalog manifests.
82
+ - `protocol/satroot1.publication-registry.schema.json` - JSON schema for top-level publication registries.
83
+ - `protocol/satroot1.publication-registry-manifest.schema.json` - JSON schema for signed publication registry manifests.
84
+ - `protocol/satroot1.profile-registry.json` - explicit compatibility registry for supported profiles.
85
+ - `src/satroot1.py` - reference parser, deterministic replay engine, and signing utility CLI.
86
+ - `src/satroot_*_smoke.py` and `scripts/run_*.py` - the packaged smoke-lane modules and repo-local entrypoints, from per-profile lanes up through the operator proof, release gate, and the four anchored lanes.
87
+ - `examples/` - seven runnable demo ledgers (`FLOOR1`, `USDROOT1`, `APICREDIT1`, `RECEIPT1`, `IDENTITY1`, `LICENSE1`, `EVENT1`) and the reusable preset trees.
88
+ - `examples/README.md` - guide to the reusable example preset trees, including collection-backed companions.
89
+ - `examples/catalog_presets/` - reusable SATROOT demo catalog scenario presets.
90
+ - `examples/bundle_index_presets/` - reusable SATROOT bundle-index presets.
91
+ - `examples/release_catalog_presets/` - reusable SATROOT release-catalog publication presets.
92
+ - `examples/release_catalog_index_presets/` - reusable SATROOT release-catalog-index publication presets.
93
+ - `examples/publication_descriptor_index_presets/` - reusable SATROOT publication-descriptor-index presets.
94
+ - `examples/publication_metadata_catalog_presets/` - reusable SATROOT publication-metadata-catalog presets.
95
+ - `examples/publication_catalog_workspace_presets/` - reusable SATROOT publication-catalog-workspace presets.
96
+ - `examples/registry_presets/` - reusable SATROOT publication-registry presets.
97
+ - `examples/registry_workspace_presets/` - reusable SATROOT publication-registry-workspace presets.
98
+ - `examples/network_presets/` - reusable SATROOT publication-network presets.
99
+ - `examples/stack_presets/` - reusable SATROOT end-to-end publication-stack presets.
100
+ - `tests/` - test modules covering the kernel plus every packaged smoke lane.
101
+ - `profiles/stable/SATROOT-STABLE-1.md` - reference-only stable-value profile draft.
102
+ - `profiles/machine/SATROOT-MACHINE-1.md` - prepaid machine-credit profile draft.
103
+ - `profiles/receipt/SATROOT-RECEIPT-1.md` - receipt and invoice object profile draft.
104
+ - `profiles/identity/SATROOT-IDENTITY-1.md` - identity and authority object profile draft.
105
+ - `profiles/license/SATROOT-LICENSE-1.md` - license and usage-right object profile draft.
106
+ - `profiles/event/SATROOT-EVENT-1.md` - event-stream head object profile draft.
107
+
108
+ ## SATROOT-1 in one sentence
109
+
110
+ `SATROOT-1` turns one satoshi into a root-bound namespace for deterministic semantic token state.
111
+
112
+ For the higher-level framing of how BSV, the SATROOT kernel, and the profile system fit together, see `ARCHITECTURE.md`.
113
+
114
+ The `SATROOT-1` kernel defines:
115
+
116
+ - a `root_id` bound to a one-satoshi UTXO,
117
+ - a genesis record,
118
+ - `mint`, `transfer`, `burn`, `freeze`, and `rotate-authority` events,
119
+ - strict sequencing with `prev_event_id`,
120
+ - deterministic replay and balance computation,
121
+ - a supply invariant,
122
+ - explicit root authority rotation for mint-control handoff,
123
+ - explicit freeze / unfreeze controls for account-level balance locks,
124
+ - registry-backed profile compatibility checks,
125
+ - runtime guardrails for stable reference-only profile metadata,
126
+ - runtime guardrails for machine and singleton-object profile metadata,
127
+ - a canonical signing payload model,
128
+ - a built-in `hmac-sha256` reference verifier path for shared-secret environments,
129
+ - an optional `ed25519` verifier path behind the `crypto` extra,
130
+ - explicit `signature_scheme` and `signature_key_id` protocol metadata,
131
+ - optional `event_id` and `state_hash` verification,
132
+ - reference helpers for signing a single event or a whole ledger,
133
+ - profile-aware genesis scaffolding for base and draft SATROOT profiles,
134
+ - event scaffolding for valid non-genesis SATROOT records from an existing ledger or explicit references,
135
+ - append-and-sign event workflows for extending existing demo or signed ledgers,
136
+ - profile-aware lifecycle helpers for common machine-credit consumption flows,
137
+ - a one-shot SATROOT-MACHINE-1 machine-credit demo bootstrap for runnable machine-profile artifact generation,
138
+ - a one-shot SATROOT-MACHINE-1 signed demo-bundle bootstrap for release-ready machine-profile artifacts,
139
+ - a one-shot SATROOT-MACHINE-1 demo-release bootstrap for bundle plus release publication generation,
140
+ - a one-shot SATROOT-MACHINE-1 demo-catalog bootstrap for workspace-ready machine-profile release lanes,
141
+ - a one-shot SATROOT-MACHINE-1 publication-catalog-workspace bootstrap for machine-profile descriptor and metadata publication lanes,
142
+ - a one-shot SATROOT-MACHINE-1 publication-registry-workspace bootstrap for machine-profile descriptor, metadata, and registry publication lanes,
143
+ - profile-aware lifecycle helpers for singleton receipt, identity, and license transfer, archival, and retirement flows,
144
+ - a one-shot singleton receipt/identity/license demo bootstrap for runnable object-profile lifecycle artifacts,
145
+ - a one-shot singleton receipt/identity/license signed demo-bundle bootstrap for verifiable object-profile artifacts,
146
+ - a one-shot singleton receipt/identity/license demo-release bootstrap for bundle plus release publication generation,
147
+ - a one-shot SATROOT-STABLE-1 reference-demo bootstrap for runnable stable-profile artifact generation,
148
+ - a one-shot SATROOT-STABLE-1 signed demo-bundle bootstrap for release-ready stable-profile artifacts,
149
+ - a one-shot SATROOT-STABLE-1 demo-release bootstrap for bundle plus release publication generation,
150
+ - a one-shot multi-profile demo catalog workspace bootstrap for bundles plus signed catalog release generation,
151
+ - repeated-preset multi-profile demo release collection bootstraps for packaging mixed generated releases into reusable release collections,
152
+ - repeated-preset multi-profile demo release catalog publication bootstraps for turning mixed generated releases into signed release catalogs in one step,
153
+ - repeated-preset multi-profile demo release catalog index publication bootstraps for turning mixed generated releases into signed release-catalog index publications in one step,
154
+ - a `satroot1` CLI entry point for replay and signing workflows,
155
+ - verifier-aware CLI replay for `demo`, `hmac-sha256`, and `ed25519` ledgers,
156
+ - schema-aware CLI validation for raw SATROOT-1 JSON files,
157
+ - commitment-aware CLI annotation for adding deterministic `event_id` and `state_hash` fields,
158
+ - signer-map bootstrapping helpers for deriving `signer -> key_id` mappings from ledgers,
159
+ - HMAC secret generation helpers for controlled shared-secret workflows,
160
+ - Ed25519 private-key generation helpers for bootstrapping SATROOT signing workflows,
161
+ - one-shot HMAC workflow bootstrapping for signer maps plus shared-secret material,
162
+ - Ed25519 key-derivation helpers for producing replay-ready public key maps from private key maps,
163
+ - one-shot Ed25519 workflow bootstrapping for signer maps plus private/public key material,
164
+ - one-shot signed-ledger bundle generation for HMAC and Ed25519 workflows,
165
+ - machine-readable signed bundle manifests describing artifacts, verifier-material scope, per-file hashes, and the full final replay snapshot,
166
+ - manifest-only bundle inspection via `bundle-summary` when replay is unnecessary,
167
+ - structural bundle linting via `bundle-lint` for missing files and manifest layout drift,
168
+ - unsigned multi-bundle inspection via `bundle-index-summary` before release signing,
169
+ - structural bundle-index linting via `bundle-index-lint` for nested bundle manifest drift,
170
+ - release-level inspection via `release-summary` when signature verification is unnecessary,
171
+ - structural release linting via `release-lint` for bundle-index and manifest drift,
172
+ - deterministic bundle-index generation for release catalogs spanning multiple bundles,
173
+ - discovery-based bundle catalog packaging from parent artifact directories,
174
+ - optional release metadata on bundle indexes for channel, label, and published-at packaging context,
175
+ - signed release-manifest generation for authenticating distributable bundle-index publications,
176
+ - release-key bootstrap helpers for HMAC and Ed25519 publication signing workflows,
177
+ - one-shot `publish-release` orchestration for ready-to-verify release directories,
178
+ - preset export commands for deriving reusable bundle-index presets back from generated signed release inputs,
179
+ - deterministic release-catalog generation for aggregating multiple signed release publications,
180
+ - catalog-level inspection via `release-catalog-summary` when signature verification is unnecessary,
181
+ - structural release-catalog linting via `release-catalog-lint` for catalog and nested release drift,
182
+ - signed release-catalog-manifest generation for authenticating multi-release catalogs,
183
+ - one-shot `publish-release-catalog` orchestration for ready-to-verify release-catalog directories,
184
+ - deterministic release-catalog-index generation for aggregating multiple signed release-catalog publications,
185
+ - index-level inspection via `release-catalog-index-summary` when signature verification is unnecessary,
186
+ - structural release-catalog-index linting via `release-catalog-index-lint` for index and nested catalog drift,
187
+ - signed release-catalog-index-manifest generation for authenticating multi-catalog release indexes,
188
+ - one-shot `publish-release-catalog-index` orchestration for ready-to-verify release-catalog-index directories,
189
+ - preset export commands for deriving reusable release-catalog and release-catalog-index presets back from generated signed artifact layers,
190
+ - one-shot `bootstrap-genesis-bundle` scaffolding for signed starter bundles from profile-aware genesis defaults,
191
+ - one-shot `bootstrap-release-publication` orchestration for release material plus signed publication outputs,
192
+ - one-shot `bootstrap-release-catalog-publication` orchestration for release-catalog material plus signed publication outputs,
193
+ - one-shot `bootstrap-release-catalog-index-publication` orchestration for release-catalog-index material plus signed publication outputs,
194
+ - demo-catalog inspection via `demo-catalog-summary` and structural linting via `demo-catalog-lint`,
195
+ - one-shot `bootstrap-publication-stack` orchestration for preset-driven bundles, releases, and release-catalog outputs in one workspace,
196
+ - `publish-publication-stack` for consolidating existing demo catalog workspaces into one signed release-catalog stack,
197
+ - `publish-machine-publication-stack` for consolidating existing SATROOT-MACHINE-1 demo catalog workspaces into one machine-only signed release-catalog stack,
198
+ - publication-stack inspection via `publication-stack-summary` and structural linting via `publication-stack-lint`,
199
+ - `bootstrap-publication-stack-collection` for copying existing publication stack workspaces into reusable higher-level collections,
200
+ - one-shot `bootstrap-publication-network` orchestration for preset-driven stacks plus a top-level release-catalog-index output in one workspace,
201
+ - `publish-publication-network` for consolidating existing publication stack workspaces into one signed release-catalog-index network,
202
+ - `publish-machine-publication-network` for consolidating existing SATROOT-MACHINE-1 publication stack workspaces into one machine-only signed release-catalog-index network,
203
+ - publication-network inspection via `publication-network-summary` and structural linting via `publication-network-lint`,
204
+ - one-shot `bootstrap-publication-catalog-workspace` orchestration for generating reusable descriptor-index and metadata-catalog lanes from arbitrary SATROOT artifacts,
205
+ - `publish-publication-catalog-workspace` for consolidating an existing publication descriptor index plus publication metadata catalog into one reusable publication-catalog workspace,
206
+ - publication-catalog-workspace inspection via `publication-catalog-workspace-summary` and structural linting via `publication-catalog-workspace-lint`,
207
+ - one-shot `bootstrap-publication-registry-workspace` orchestration for copying a release-catalog-index publication, generating descriptor and metadata publication lanes, and emitting a top-level signed registry workspace,
208
+ - `publish-publication-registry-workspace` for consolidating an existing publication-catalog workspace plus release-catalog-index source into one signed publication-registry workspace,
209
+ - publication-registry-workspace inspection via `publication-registry-workspace-summary` and structural linting via `publication-registry-workspace-lint`,
210
+ - publication-registry inspection via `publication-registry-summary` and structural linting via `publication-registry-lint`,
211
+ - `inventory-artifacts` for scanning a directory tree and summarizing discovered SATROOT artifacts across bundle, release, catalog, index, registry, and workspace layers,
212
+ - preset export commands for deriving reusable demo-catalog, publication-stack, publication-network, publication-catalog-workspace, and publication-registry-workspace presets back from generated workspaces,
213
+ - `render-publication-report` for turning detected SATROOT artifacts or workspaces into human-readable markdown reports,
214
+ - `export-publication-descriptor` for emitting normalized JSON descriptors from detected SATROOT artifacts or workspaces,
215
+ - `build-publication-descriptor-index` for aggregating many detected SATROOT descriptors into one machine-readable registry,
216
+ - signed publication-descriptor-index-manifest generation for authenticating descriptor registries,
217
+ - `build-machine-publication-descriptor-index` and `build-stable-publication-descriptor-index` for enforcing machine-only or stable-only validation before descriptor-index generation,
218
+ - `build-machine-publication-descriptor-index-manifest` and `build-stable-publication-descriptor-index-manifest` for signing only machine-validated or stable-validated descriptor indexes,
219
+ - `publish-publication-descriptor-index`, `publish-machine-publication-descriptor-index`, and `publish-stable-publication-descriptor-index` for writing signed descriptor-index publication directories from existing signer material,
220
+ - one-shot `bootstrap-publication-descriptor-index-publication` orchestration for descriptor indexes plus signing material,
221
+ - publication-descriptor-index inspection via `publication-descriptor-index-summary` and structural linting via `publication-descriptor-index-lint`,
222
+ - preset export commands for deriving reusable publication-descriptor-index presets back from generated descriptor index publications,
223
+ - signed publication-metadata-manifest generation for authenticating one artifact's rendered report plus normalized descriptor,
224
+ - `build-machine-publication-metadata-manifest` for signing only machine-validated publication report and descriptor pairs,
225
+ - `build-stable-publication-metadata-manifest` for signing only stable-validated publication report and descriptor pairs,
226
+ - `publish-publication-metadata-bundle`, `publish-machine-publication-metadata-bundle`, and `publish-stable-publication-metadata-bundle` for writing signed publication metadata bundles from existing signer material,
227
+ - publication-metadata-bundle inspection via `publication-metadata-bundle-summary` and structural linting via `publication-metadata-bundle-lint`,
228
+ - `bootstrap-machine-publication-metadata-bundle` for generating machine-only publication metadata bundles with SATROOT-MACHINE-1 artifact validation before signing,
229
+ - `bootstrap-stable-publication-metadata-bundle` for generating stable-only publication metadata bundles with SATROOT-STABLE-1 artifact validation before signing,
230
+ - `build-publication-metadata-catalog` for aggregating many publication metadata bundles into one machine-readable registry,
231
+ - `build-machine-publication-metadata-catalog` and `build-stable-publication-metadata-catalog` for enforcing machine-only or stable-only validation before catalog generation,
232
+ - signed publication-metadata-catalog-manifest generation for authenticating publication metadata catalogs,
233
+ - `build-machine-publication-metadata-catalog-manifest` and `build-stable-publication-metadata-catalog-manifest` for signing only machine-validated or stable-validated publication metadata catalogs,
234
+ - `publish-publication-metadata-catalog`, `publish-machine-publication-metadata-catalog`, and `publish-stable-publication-metadata-catalog` for writing signed metadata-catalog publication directories from existing signer material,
235
+ - one-shot `bootstrap-publication-metadata-catalog-publication` orchestration for metadata catalogs plus signing material,
236
+ - publication-metadata-catalog inspection via `publication-metadata-catalog-summary` and structural linting via `publication-metadata-catalog-lint`,
237
+ - preset export commands for deriving reusable publication-metadata-catalog presets back from generated metadata catalog publications,
238
+ - `build-publication-registry` for binding descriptor, metadata, and release-catalog-index publications into one top-level signed namespace artifact,
239
+ - `build-machine-publication-registry` and `build-stable-publication-registry` for enforcing machine-only or stable-only validation before registry generation,
240
+ - signed publication-registry-manifest generation for authenticating top-level publication registries,
241
+ - `build-machine-publication-registry-manifest` and `build-stable-publication-registry-manifest` for signing only machine-validated or stable-validated publication registries,
242
+ - `publish-publication-registry`, `publish-machine-publication-registry`, and `publish-stable-publication-registry` for writing signed registry publication directories from existing signer material,
243
+ - one-shot `bootstrap-publication-registry-publication` orchestration for registry publications plus signing material,
244
+ - preset export commands for deriving reusable publication-registry presets back from generated registry publications,
245
+ - demo-catalog, publication-stack, and publication-network summary schema validation for exported workspace summaries,
246
+ - signed bundle verification against manifest and verifier material,
247
+ - bundle-manifest, bundle-index, release-manifest, release-catalog, release-catalog-manifest, release-catalog-index, release-catalog-index-manifest, publication-descriptor-index, publication-descriptor-index-manifest, publication-metadata-manifest, publication-metadata-catalog, publication-metadata-catalog-manifest, publication-registry, publication-registry-manifest, demo-catalog-summary, publication-stack-summary, and publication-network-summary schema validation for exported signed artifacts,
248
+ - replay snapshots that preserve profile/genesis metadata for higher-layer namespace use cases.
249
+
250
+ ## Current demo
251
+
252
+ `FLOOR1` is the proof token in this repo.
253
+
254
+ It demonstrates:
255
+
256
+ - one root satoshi,
257
+ - `1,000,000,000` semantic units,
258
+ - deterministic balance updates through signed protocol events,
259
+ - no claim that the satoshi itself has been subdivided.
260
+
261
+ ## Intended use
262
+
263
+ SATROOT-1 is meant for prototypes, timestamped proof-of-concept work, and machine-native ledgers where balances are semantic protocol state anchored to a satoshi rather than native chain assets.
264
+
265
+ ## Non-goals
266
+
267
+ SATROOT-1 does not claim to be:
268
+
269
+ - a new blockchain,
270
+ - a BSV consensus change,
271
+ - a sub-satoshi mechanism,
272
+ - a stablecoin by default,
273
+ - a redemption or reserve framework,
274
+ - a security token framework,
275
+ - an exchange-listing or universal wallet standard.
276
+
277
+ ## Profile lanes and preset tree
278
+
279
+ The base protocol stays intentionally small. Expansion belongs in separate profiles, and the released profile lanes below all follow that rule.
280
+
281
+ This repo includes the stable-value profile:
282
+
283
+ - `SATROOT-STABLE-1` for reference-value accounting units,
284
+ - `examples/genesis_usdroot1.json` for a `USDROOT1` genesis record,
285
+ - `examples/events_usdroot1.json` for a runnable reference-only ledger flow,
286
+ - `satroot1 bootstrap-stable-demo` for generating new reference-only demo ledgers on demand, with optional stable-only preset defaults,
287
+ - `satroot1 bootstrap-stable-demo-bundle` for generating signed stable demo bundles directly from profile parameters or a stable-only preset,
288
+ - `satroot1 bootstrap-stable-demo-release` for generating signed stable demo bundles plus release directories in one step, with optional stable-only preset defaults,
289
+ - `satroot1 bootstrap-stable-demo-release-collection` for generating multiple stable-only demo release workspaces from repeated stable presets and packaging them into one reusable release collection,
290
+ - `satroot1 bootstrap-stable-demo-release-catalog-publication` for generating multiple stable-only demo release workspaces from repeated stable presets, snapshotting them into a release collection, and bootstrapping a signed stable release catalog publication in one step,
291
+ - `satroot1 bootstrap-stable-demo-release-catalog-index-publication` for generating multiple stable-only demo release workspaces from repeated stable presets, bootstrapping a stable release catalog publication, and then bootstrapping a signed stable release catalog index publication in one step,
292
+ - `satroot1 bootstrap-stable-demo-catalog` for generating a reusable single-stable demo catalog workspace that can feed the broader catalog and publication flows, with optional stable-only preset support,
293
+ - `satroot1 bootstrap-demo-publication-stack` for generating one or more mixed-profile demo catalog workspaces from repeated generic presets and publishing them as a signed release-catalog stack in one step,
294
+ - `satroot1 bootstrap-demo-publication-network` for generating one or more mixed-profile demo catalog workspaces from repeated generic presets, bootstrapping a publication stack, and then publishing that stack as a signed release-catalog index in one step,
295
+ - `satroot1 bootstrap-demo-publication-catalog-workspace` for generating multiple mixed-profile demo catalog workspaces from repeated generic presets and deriving shared descriptor-index and metadata publication lanes in one reusable publication catalog workspace,
296
+ - `satroot1 bootstrap-demo-publication-registry-workspace` for generating multiple mixed-profile demo catalog workspaces from repeated generic presets, deriving shared publication lanes, and binding them to a generated publication network in one signed registry workspace,
297
+ - `satroot1 bootstrap-stable-demo-publication-stack` for generating multiple stable-only demo catalog workspaces from repeated stable presets and publishing them as a signed release-catalog stack in one step,
298
+ - `satroot1 bootstrap-stable-demo-publication-network` for generating multiple stable-only demo catalog workspaces from repeated stable presets, bootstrapping a stable publication stack, and then publishing that stack as a signed release-catalog index in one step,
299
+ - `satroot1 bootstrap-stable-demo-publication-catalog-workspace` for generating multiple stable-only demo catalog workspaces from repeated stable presets and deriving shared descriptor-index and metadata publication lanes in one reusable publication catalog workspace,
300
+ - `satroot1 bootstrap-stable-demo-publication-registry-workspace` for generating multiple stable-only demo catalog workspaces from repeated stable presets, deriving shared publication lanes, and binding them to a generated stable publication network in one signed registry workspace,
301
+ - `satroot1 bootstrap-stable-publication-stack` for generating one or more stable-only demo catalog workspaces and publishing them as a release-catalog stack,
302
+ - `satroot1 bootstrap-stable-publication-network` for generating one or more stable-only publication stacks and publishing them as a release-catalog index,
303
+ - `satroot1 bootstrap-stable-publication-catalog-workspace` for generating a stable demo catalog workspace plus descriptor-index and metadata publication lanes in one step, with optional nested demo-catalog and publication-catalog-workspace presets,
304
+ - `satroot1 publish-stable-publication-catalog-workspace` for re-wrapping existing stable descriptor and metadata lanes back into a stable-validated publication catalog workspace,
305
+ - `satroot1 export-stable-publication-catalog-workspace-preset` for exporting that stable publication catalog workspace shape back into a validated reusable preset,
306
+ - `satroot1 bootstrap-stable-publication-registry-workspace` for generating a stable publication catalog workspace and binding it to a stable release-catalog-index source in one signed registry workspace, with optional nested demo-catalog, publication-catalog-workspace, and publication-registry-workspace presets, including frozen `release_collection_dir`-backed nested catalog presets where `--release-key-id` is only needed when a nested publication-network preset is being generated,
307
+ - `satroot1 publish-stable-publication-registry-workspace` for binding an existing stable publication catalog workspace to a stable release-catalog-index source while preserving stable provenance,
308
+ - `satroot1 export-stable-publication-registry-workspace-preset` for exporting that stable publication registry workspace shape back into a validated reusable preset,
309
+ - `satroot1 export-stable-publication-descriptor-index-preset`, `satroot1 export-stable-publication-metadata-catalog-preset`, and `satroot1 export-stable-publication-registry-preset` for exporting stable component publications back into validated reusable presets.
310
+ - checked-in example presets now cover generic, machine-only, and stable-only component publication layers across `examples/bundle_index_presets/`, `examples/release_catalog_presets/`, `examples/release_catalog_index_presets/`, `examples/publication_descriptor_index_presets/`, `examples/publication_metadata_catalog_presets/`, `examples/publication_catalog_workspace_presets/`, `examples/registry_workspace_presets/`, and `examples/registry_presets/`.
311
+ - `examples/bundle_index_presets/`, `examples/release_catalog_presets/`, and `examples/release_catalog_index_presets/` now also include collection-backed companion presets for frozen generated bundle, release, and release-catalog sets.
312
+ - `examples/stack_presets/`, `examples/network_presets/`, `examples/publication_metadata_catalog_presets/`, `examples/publication_catalog_workspace_presets/`, `examples/registry_workspace_presets/`, and `examples/registry_presets/` now also include collection-backed companion presets for frozen demo-catalog, publication-stack, publication-network, publication-metadata-bundle, publication-catalog-workspace, and publication-registry inputs.
313
+ - `examples/README.md` maps the generic, machine, stable, and collection-backed preset trees if you want one entry point into the full example set.
314
+
315
+ If you want the shortest path into the checked-in reusable SATROOT preset tree, start here:
316
+
317
+ - Generic lower release layers:
318
+ `examples/catalog_presets/ai_compute_catalog.json`
319
+ `examples/bundle_index_presets/ai_compute_bundle_index.json`
320
+ `examples/release_catalog_presets/ai_compute_release_stack.json`
321
+ `examples/release_catalog_index_presets/ai_compute_catalog_network.json`
322
+ - Generic publication metadata/catalog/stack/network/registry-workspace:
323
+ `examples/publication_metadata_catalog_presets/ai_compute_publication_metadata_catalog.json`
324
+ `examples/publication_catalog_workspace_presets/ai_compute_publication_catalog_workspace.json`
325
+ `examples/stack_presets/ai_compute_publication_stack.json`
326
+ `examples/network_presets/ai_compute_publication_network.json`
327
+ `examples/registry_workspace_presets/ai_compute_publication_registry_workspace.json`
328
+ - Generic collection-backed lower release layers:
329
+ `examples/catalog_presets/ai_compute_catalog_collection_backed.json`
330
+ `examples/bundle_index_presets/ai_compute_bundle_index_collection_backed.json`
331
+ `examples/release_catalog_presets/ai_compute_release_stack_collection_backed.json`
332
+ `examples/release_catalog_index_presets/ai_compute_catalog_network_collection_backed.json`
333
+ - Generic collection-backed publication metadata/catalog/stack/network/registry-workspace:
334
+ `examples/publication_metadata_catalog_presets/ai_compute_publication_metadata_catalog_collection_backed.json`
335
+ `examples/publication_catalog_workspace_presets/ai_compute_publication_catalog_workspace_collection_backed.json`
336
+ `examples/stack_presets/ai_compute_publication_stack_collection_backed.json`
337
+ `examples/network_presets/ai_compute_publication_network_collection_backed.json`
338
+ `examples/registry_workspace_presets/ai_compute_publication_registry_workspace_collection_backed.json`
339
+ `examples/registry_workspace_presets/ai_compute_publication_registry_workspace_catalog_release_collection_backed.json`
340
+ - Machine lower release layers:
341
+ `examples/catalog_presets/machine_compute_catalog.json`
342
+ `examples/bundle_index_presets/machine_compute_bundle_index.json`
343
+ `examples/release_catalog_presets/machine_compute_release_stack.json`
344
+ `examples/release_catalog_index_presets/machine_compute_catalog_network.json`
345
+ - Machine publication metadata/catalog/stack/network/registry-workspace:
346
+ `examples/publication_metadata_catalog_presets/machine_compute_publication_metadata_catalog.json`
347
+ `examples/publication_catalog_workspace_presets/machine_compute_publication_catalog_workspace.json`
348
+ `examples/stack_presets/machine_compute_publication_stack.json`
349
+ `examples/network_presets/machine_compute_publication_network.json`
350
+ `examples/registry_workspace_presets/machine_compute_publication_registry_workspace.json`
351
+ - Machine collection-backed lower release layers:
352
+ `examples/catalog_presets/machine_compute_catalog_collection_backed.json`
353
+ `examples/bundle_index_presets/machine_compute_bundle_index_collection_backed.json`
354
+ `examples/release_catalog_presets/machine_compute_release_stack_collection_backed.json`
355
+ `examples/release_catalog_index_presets/machine_compute_catalog_network_collection_backed.json`
356
+ - Machine collection-backed publication metadata/catalog/stack/network/registry-workspace:
357
+ `examples/publication_metadata_catalog_presets/machine_compute_publication_metadata_catalog_collection_backed.json`
358
+ `examples/publication_catalog_workspace_presets/machine_compute_publication_catalog_workspace_collection_backed.json`
359
+ `examples/stack_presets/machine_compute_publication_stack_collection_backed.json`
360
+ `examples/network_presets/machine_compute_publication_network_collection_backed.json`
361
+ `examples/registry_workspace_presets/machine_compute_publication_registry_workspace_collection_backed.json`
362
+ `examples/registry_workspace_presets/machine_compute_publication_registry_workspace_catalog_release_collection_backed.json`
363
+ - Stable lower release layers:
364
+ `examples/catalog_presets/stable_reference_catalog.json`
365
+ `examples/bundle_index_presets/stable_reference_bundle_index.json`
366
+ `examples/release_catalog_presets/stable_reference_release_stack.json`
367
+ `examples/release_catalog_index_presets/stable_reference_catalog_network.json`
368
+ - Stable publication metadata/catalog/stack/network/registry-workspace:
369
+ `examples/publication_metadata_catalog_presets/stable_reference_publication_metadata_catalog.json`
370
+ `examples/publication_catalog_workspace_presets/stable_reference_publication_catalog_workspace.json`
371
+ `examples/stack_presets/stable_reference_publication_stack.json`
372
+ `examples/network_presets/stable_reference_publication_network.json`
373
+ `examples/registry_workspace_presets/stable_reference_publication_registry_workspace.json`
374
+ - Stable collection-backed lower release layers:
375
+ `examples/catalog_presets/stable_reference_catalog_collection_backed.json`
376
+ `examples/bundle_index_presets/stable_reference_bundle_index_collection_backed.json`
377
+ `examples/release_catalog_presets/stable_reference_release_stack_collection_backed.json`
378
+ `examples/release_catalog_index_presets/stable_reference_catalog_network_collection_backed.json`
379
+ - Stable collection-backed publication metadata/catalog/stack/network/registry-workspace:
380
+ `examples/publication_metadata_catalog_presets/stable_reference_publication_metadata_catalog_collection_backed.json`
381
+ `examples/publication_catalog_workspace_presets/stable_reference_publication_catalog_workspace_collection_backed.json`
382
+ `examples/stack_presets/stable_reference_publication_stack_collection_backed.json`
383
+ `examples/network_presets/stable_reference_publication_network_collection_backed.json`
384
+ `examples/registry_workspace_presets/stable_reference_publication_registry_workspace_collection_backed.json`
385
+ `examples/registry_workspace_presets/stable_reference_publication_registry_workspace_catalog_release_collection_backed.json`
386
+ - Collection-backed top-level registry publications:
387
+ `examples/registry_presets/ai_compute_publication_registry_collection_backed.json`
388
+ `examples/registry_presets/machine_compute_publication_registry_collection_backed.json`
389
+ `examples/registry_presets/stable_reference_publication_registry_collection_backed.json`
390
+ - Frozen-release self-contained top-level registry publications:
391
+ `examples/registry_presets/ai_compute_publication_registry_workspace_catalog_release_collection_backed.json`
392
+ `examples/registry_presets/machine_compute_publication_registry_workspace_catalog_release_collection_backed.json`
393
+ `examples/registry_presets/stable_reference_publication_registry_workspace_catalog_release_collection_backed.json`
394
+ - Workspace-backed top-level registry publications:
395
+ `examples/registry_presets/ai_compute_publication_registry_workspace_backed.json`
396
+ `examples/registry_presets/machine_compute_publication_registry_workspace_backed.json`
397
+ `examples/registry_presets/stable_reference_publication_registry_workspace_backed.json`
398
+
399
+ This repo also now includes the first machine-credit profile draft:
400
+
401
+ - `SATROOT-MACHINE-1` for prepaid machine-native service credits,
402
+ - `examples/genesis_apicredit1.json` for an `APICREDIT1` genesis record,
403
+ - `examples/events_apicredit1.json` for a runnable machine-credit ledger flow,
404
+ - `satroot1 bootstrap-machine-demo` for generating new machine-credit demo ledgers on demand, with optional machine-only preset defaults,
405
+ - `satroot1 bootstrap-machine-demo-bundle` for generating signed machine-credit demo bundles directly from profile parameters or a machine-only preset,
406
+ - `satroot1 bootstrap-machine-demo-release` for generating signed machine-credit demo bundles plus release directories in one step, with optional machine-only preset defaults,
407
+ - `satroot1 bootstrap-machine-demo-release-collection` for generating multiple machine-only demo release workspaces from repeated machine presets and packaging them into one reusable release collection,
408
+ - `satroot1 bootstrap-machine-demo-release-catalog-publication` for generating multiple machine-only demo release workspaces from repeated machine presets, snapshotting them into a release collection, and bootstrapping a signed machine release catalog publication in one step,
409
+ - `satroot1 bootstrap-machine-demo-release-catalog-index-publication` for generating multiple machine-only demo release workspaces from repeated machine presets, bootstrapping a machine release catalog publication, and then bootstrapping a signed machine release catalog index publication in one step,
410
+ - `satroot1 bootstrap-machine-demo-catalog` for generating a reusable single-machine demo catalog workspace that can feed the stack, network, and publication flows, now with optional generic demo-catalog preset support,
411
+ - `satroot1 bootstrap-machine-demo-publication-stack` for generating multiple machine-only demo catalog workspaces from repeated machine presets and publishing them as a signed release-catalog stack in one step,
412
+ - `satroot1 bootstrap-machine-demo-publication-network` for generating multiple machine-only demo catalog workspaces from repeated machine presets, bootstrapping a machine publication stack, and then publishing that stack as a signed release-catalog index in one step,
413
+ - `satroot1 bootstrap-machine-demo-publication-catalog-workspace` for generating multiple machine-only demo catalog workspaces from repeated machine presets and deriving shared descriptor-index and metadata publication lanes in one reusable publication catalog workspace,
414
+ - `satroot1 bootstrap-machine-demo-publication-registry-workspace` for generating multiple machine-only demo catalog workspaces from repeated machine presets, deriving shared publication lanes, and binding them to a generated machine publication network in one signed registry workspace,
415
+ - `satroot1 bootstrap-machine-publication-stack` for generating one or more machine-only demo catalog workspaces and publishing them as a release-catalog stack,
416
+ - `satroot1 publish-machine-publication-stack` for consolidating existing machine-only demo catalog workspaces into the same SATROOT-MACHINE-1 publication stack shape,
417
+ - `satroot1 bootstrap-machine-publication-network` for generating one or more machine-only publication stacks and publishing them as a release-catalog index,
418
+ - `satroot1 publish-machine-publication-network` for consolidating existing machine-only publication stack workspaces into the same SATROOT-MACHINE-1 publication network shape,
419
+ - `satroot1 bootstrap-machine-publication-catalog-workspace` for generating a machine demo catalog workspace plus descriptor-index and metadata publication lanes in one step, now with optional nested demo-catalog and publication-catalog-workspace presets,
420
+ - `satroot1 publish-machine-publication-catalog-workspace` for re-wrapping existing publication descriptor and metadata lanes back into a machine-validated publication catalog workspace,
421
+ - `satroot1 export-machine-publication-catalog-workspace-preset` for exporting that machine publication catalog workspace shape back into a validated reusable preset,
422
+ - `satroot1 bootstrap-machine-publication-registry-workspace` for generating a machine publication catalog workspace and binding it to a release-catalog-index source in one signed registry workspace, now with optional nested demo-catalog, publication-catalog-workspace, and publication-registry-workspace presets, including frozen `release_collection_dir`-backed nested catalog presets where `--release-key-id` is only needed when a nested publication-network preset is being generated,
423
+ - `satroot1 publish-machine-publication-registry-workspace` for binding an existing machine publication catalog workspace to a release-catalog-index source while preserving machine provenance,
424
+ - `satroot1 export-machine-publication-registry-workspace-preset` for exporting that machine publication registry workspace shape back into a validated reusable preset.
425
+
426
+ This repo also now includes the first receipt-object profile draft:
427
+
428
+ - `SATROOT-RECEIPT-1` for invoice and receipt state objects,
429
+ - `examples/genesis_receipt1.json` for a `RECEIPT1` genesis record,
430
+ - `examples/events_receipt1.json` for a runnable receipt lifecycle ledger flow,
431
+ - `satroot1 bootstrap-singleton-demo --profile SATROOT-RECEIPT-1` for generating new receipt/identity/license singleton demo ledgers on demand,
432
+ - `satroot1 bootstrap-singleton-demo-bundle --profile SATROOT-RECEIPT-1` for generating signed receipt/identity/license demo bundles on demand,
433
+ - `satroot1 bootstrap-singleton-demo-release --profile SATROOT-RECEIPT-1` for generating signed receipt/identity/license demo bundles plus release directories in one step,
434
+ - `satroot1 bootstrap-singleton-demo-bundle-index --profile SATROOT-RECEIPT-1` for generating repeated receipt/identity/license demo bundles from presets and packaging them into a reusable bundle index,
435
+ - `satroot1 bootstrap-singleton-demo-release-collection --profile SATROOT-RECEIPT-1` for generating repeated receipt/identity/license demo releases from presets and packaging them into a reusable release collection,
436
+ - `satroot1 bootstrap-singleton-demo-release-catalog-publication --profile SATROOT-RECEIPT-1` for generating repeated receipt/identity/license demo releases from presets and bootstrapping a signed release catalog publication in one step,
437
+ - `satroot1 bootstrap-singleton-demo-release-catalog-index-publication --profile SATROOT-RECEIPT-1` for generating repeated receipt/identity/license demo releases from presets and bootstrapping a signed release-catalog index publication in one step,
438
+ - `satroot1 bootstrap-singleton-demo-publication-stack --profile SATROOT-RECEIPT-1` for generating repeated receipt/identity/license singleton demo catalog workspaces from presets and publishing them as a signed release-catalog stack in one step,
439
+ - `satroot1 bootstrap-singleton-demo-publication-network --profile SATROOT-RECEIPT-1` for generating repeated receipt/identity/license singleton demo catalog workspaces from presets, bootstrapping a singleton publication stack, and then publishing that stack as a signed release-catalog index in one step,
440
+ - `satroot1 bootstrap-singleton-demo-publication-catalog-workspace --profile SATROOT-RECEIPT-1` for generating repeated receipt/identity/license singleton demo catalog workspaces from presets and deriving shared descriptor and metadata publication lanes in one reusable publication catalog workspace,
441
+ - `satroot1 bootstrap-singleton-demo-publication-registry-workspace --profile SATROOT-RECEIPT-1` for generating repeated receipt/identity/license singleton demo catalog workspaces from presets, deriving shared publication lanes, and binding them to a generated singleton publication network in one signed registry workspace.
442
+
443
+ This repo also now includes the first identity-object profile draft:
444
+
445
+ - `SATROOT-IDENTITY-1` for identity and authority state objects,
446
+ - `examples/genesis_identity1.json` for an `IDENTITY1` genesis record,
447
+ - `examples/events_identity1.json` for a runnable identity lifecycle ledger flow.
448
+
449
+ This repo also now includes the first license-object profile draft:
450
+
451
+ - `SATROOT-LICENSE-1` for license and usage-right state objects,
452
+ - `examples/genesis_license1.json` for a `LICENSE1` genesis record,
453
+ - `examples/events_license1.json` for a runnable license lifecycle ledger flow.
454
+
455
+ The sixth registered profile extends the singleton family to event streams:
456
+
457
+ - `SATROOT-EVENT-1` for append-only event-stream head objects with deterministic publisher handoff,
458
+ - `examples/genesis_event1.json` for an `EVENT1` genesis record,
459
+ - `examples/events_event1.json` for a runnable stream-custody handoff ledger flow,
460
+ - `python scripts/run_event_profile_smoke.py` (or `python -m satroot_event_profile_smoke` / `satroot-event-profile-smoke`) for its dedicated verification lane.
461
+
462
+ The event lane is a full member of the demo catalog matrix, the profile-matrix smoke, and the federation surface, alongside the five original profiles.
463
+
464
+ Further profile work can extend that pattern beyond the six registered profiles for:
465
+
466
+ - additional authority object profiles,
467
+ - additional rights profiles.
468
+
469
+ ## Run tests
470
+
471
+ For a quick local smoke run, pick one lane:
472
+
473
+ ```bash
474
+ python -m pytest tests/test_stable_profile_smoke.py
475
+ ```
476
+
477
+ Running bare `python -m pytest` collects the entire suite (1,600+ tests generating full publication workspaces) and is slow; prefer the chunked helper below for full runs.
478
+
479
+ For the full suite, prefer the chunked helper:
480
+
481
+ ```bash
482
+ python scripts/run_pytest_chunked.py
483
+ ```
484
+
485
+ For a stable-profile end-to-end smoke pass that replays the checked-in `USDROOT1` example and generates a full `SATROOT-STABLE-1` publication registry workspace:
486
+
487
+ ```bash
488
+ python scripts/run_stable_profile_smoke.py
489
+ ```
490
+
491
+ By default that writes into `.tmp_stable_profile_smoke_run/` so the generated workspace stays clearly disposable.
492
+
493
+ For the matching machine-credit lane, there is now an end-to-end smoke pass that replays `APICREDIT1` and generates a full `SATROOT-MACHINE-1` publication registry workspace:
494
+
495
+ ```bash
496
+ python scripts/run_machine_profile_smoke.py
497
+ ```
498
+
499
+ That one writes into `.tmp_machine_profile_smoke_run/` by default.
500
+
501
+ For the lower operator layer above individual bundles, there are now stable and machine bundle-index smoke passes that stage two checked-in presets, generate reusable signed bundle collections, and build one bundle index above each lane:
502
+
503
+ ```bash
504
+ python scripts/run_machine_demo_bundle_index_smoke.py
505
+ python scripts/run_stable_demo_bundle_index_smoke.py
506
+ ```
507
+
508
+ Those write into `.tmp_machine_demo_bundle_index_smoke_run/` and `.tmp_stable_demo_bundle_index_smoke_run/` by default.
509
+
510
+ For the higher-level machine release-catalog operator lane, there is also a smoke pass that stages two machine-only catalog presets from the checked-in compute example, generates a signed multi-release collection, and bootstraps a signed machine release catalog publication:
511
+
512
+ ```bash
513
+ python scripts/run_machine_demo_release_catalog_smoke.py
514
+ ```
515
+
516
+ That one writes into `.tmp_machine_demo_release_catalog_smoke_run/` by default.
517
+
518
+ For the matching stable release-catalog operator lane, there is a parallel smoke pass built from the checked-in stable reference catalog preset:
519
+
520
+ ```bash
521
+ python scripts/run_stable_demo_release_catalog_smoke.py
522
+ ```
523
+
524
+ That one writes into `.tmp_stable_demo_release_catalog_smoke_run/` by default.
525
+
526
+ For the release-catalog index layer above those same stable and machine operator lanes, there are matching smokes that stage two checked-in presets, generate signed collections, bootstrap release catalog publications, and then bootstrap signed release catalog index publications:
527
+
528
+ ```bash
529
+ python scripts/run_machine_demo_release_catalog_index_smoke.py
530
+ python scripts/run_stable_demo_release_catalog_index_smoke.py
531
+ ```
532
+
533
+ Those write into `.tmp_machine_demo_release_catalog_index_smoke_run/` and `.tmp_stable_demo_release_catalog_index_smoke_run/` by default.
534
+
535
+ For the receipt-object lane, there is now a matching end-to-end smoke pass that replays `RECEIPT1` and materializes a full `SATROOT-RECEIPT-1` singleton publication registry workspace from the checked-in receipt preset:
536
+
537
+ ```bash
538
+ python scripts/run_receipt_profile_smoke.py
539
+ ```
540
+
541
+ That one writes into `.tmp_receipt_profile_smoke_run/` by default.
542
+
543
+ For the lower singleton operator layer above individual receipt, identity, and license bundles, there are now matching bundle-index smoke passes that stage two checked-in presets, generate reusable signed bundle collections, and build one bundle index above each lane:
544
+
545
+ ```bash
546
+ python scripts/run_receipt_demo_bundle_index_smoke.py
547
+ python scripts/run_identity_demo_bundle_index_smoke.py
548
+ python scripts/run_license_demo_bundle_index_smoke.py
549
+ ```
550
+
551
+ Those write into `.tmp_receipt_demo_bundle_index_smoke_run/`, `.tmp_identity_demo_bundle_index_smoke_run/`, and `.tmp_license_demo_bundle_index_smoke_run/` by default.
552
+
553
+ For the identity-object lane, there is now a matching end-to-end smoke pass that replays `IDENTITY1` and materializes a full `SATROOT-IDENTITY-1` singleton publication registry workspace from the checked-in identity preset:
554
+
555
+ ```bash
556
+ python scripts/run_identity_profile_smoke.py
557
+ ```
558
+
559
+ That one writes into `.tmp_identity_profile_smoke_run/` by default.
560
+
561
+ For the license-object lane, there is now a matching end-to-end smoke pass that replays `LICENSE1` and materializes a full `SATROOT-LICENSE-1` singleton publication registry workspace from the checked-in license preset:
562
+
563
+ ```bash
564
+ python scripts/run_license_profile_smoke.py
565
+ ```
566
+
567
+ That one writes into `.tmp_license_profile_smoke_run/` by default.
568
+
569
+ After `pip install -e .`, the packaged entrypoints are available too:
570
+
571
+ ```bash
572
+ python -m satroot_test
573
+ ```
574
+
575
+ or:
576
+
577
+ ```bash
578
+ satroot-test
579
+ ```
580
+
581
+ For the preferred local pre-tag release gate above the individual verification surfaces, use:
582
+
583
+ ```bash
584
+ python -m satroot_release_gate_smoke
585
+ ```
586
+
587
+ or:
588
+
589
+ ```bash
590
+ satroot-release-gate-smoke
591
+ ```
592
+
593
+ That one writes into `.tmp_release_gate_smoke_run/` by default and runs installed-module import smoke, the top-level operator proof, and chunked pytest together into one consolidated release-gate report.
594
+
595
+ The GitHub Actions test workflow now uses this same release-gate wrapper as its single umbrella check after installed-module import smoke: the operator proof inside the gate re-runs the ladder, federation, registry, and anchored surfaces, and chunked pytest covers every per-lane smoke test, so CI does not repeat the narrower smoke workflows as separate steps.
596
+
597
+ The preferred top-level verification for the currently released operator surface is:
598
+
599
+ ```bash
600
+ python -m satroot_operator_proof_smoke
601
+ ```
602
+
603
+ or:
604
+
605
+ ```bash
606
+ satroot-operator-proof-smoke
607
+ ```
608
+
609
+ That one writes into `.tmp_operator_proof_smoke_run/` by default and runs the stable/machine publication ladder, the singleton publication ladder, the mixed-profile federation smoke, and the collection-backed federated registry publication round trip, plus the four anchored surfaces — anchored demo, anchored publication, on-chain envelope, and envelope verification — for eight surfaces total in one consolidated proof report, with the two ed25519 surfaces skipping gracefully without the `[crypto]` extra.
610
+
611
+ If you only want the released per-profile verification surface beneath that top-level proof, use:
612
+
613
+ ```bash
614
+ python -m satroot_profile_matrix_smoke
615
+ ```
616
+
617
+ or:
618
+
619
+ ```bash
620
+ satroot-profile-matrix-smoke
621
+ ```
622
+
623
+ That one writes into `.tmp_profile_matrix_smoke_run/` by default and runs the stable, machine, receipt, identity, and license profile smoke workflows into one consolidated report.
624
+
625
+ For the matching lower singleton operator layer, there is also:
626
+
627
+ ```bash
628
+ python -m satroot_singleton_demo_bundle_index_matrix_smoke
629
+ ```
630
+
631
+ or:
632
+
633
+ ```bash
634
+ satroot-singleton-demo-bundle-index-matrix-smoke
635
+ ```
636
+
637
+ That one writes into `.tmp_singleton_demo_bundle_index_matrix_smoke_run/` by default and runs the receipt, identity, and license singleton demo bundle-index smoke workflows into one consolidated report.
638
+
639
+ For the next singleton operator layer above those bundle indexes, there is also:
640
+
641
+ ```bash
642
+ python -m satroot_singleton_demo_release_catalog_matrix_smoke
643
+ ```
644
+
645
+ or:
646
+
647
+ ```bash
648
+ satroot-singleton-demo-release-catalog-matrix-smoke
649
+ ```
650
+
651
+ That one writes into `.tmp_singleton_demo_release_catalog_matrix_smoke_run/` by default and runs the receipt, identity, and license singleton demo release-catalog smoke workflows into one consolidated report.
652
+
653
+ For the next singleton operator layer above those per-profile catalogs, there is also:
654
+
655
+ ```bash
656
+ python -m satroot_singleton_demo_release_catalog_index_matrix_smoke
657
+ ```
658
+
659
+ or:
660
+
661
+ ```bash
662
+ satroot-singleton-demo-release-catalog-index-matrix-smoke
663
+ ```
664
+
665
+ That one writes into `.tmp_singleton_demo_release_catalog_index_matrix_smoke_run/` by default and runs the receipt, identity, and license singleton demo release-catalog-index smoke workflows into one consolidated report.
666
+
667
+ If you want the full singleton operator ladder in one pass, there is also:
668
+
669
+ ```bash
670
+ python -m satroot_singleton_publication_ladder_smoke
671
+ ```
672
+
673
+ or:
674
+
675
+ ```bash
676
+ satroot-singleton-publication-ladder-smoke
677
+ ```
678
+
679
+ That one writes into `.tmp_singleton_publication_ladder_smoke_run/` by default and runs the singleton bundle-index, release-catalog, and release-catalog-index matrix smokes together into one consolidated ladder report.
680
+
681
+ For the lowest multi-bundle operator layer above those direct profile smokes, there is also:
682
+
683
+ ```bash
684
+ python -m satroot_demo_bundle_index_matrix_smoke
685
+ ```
686
+
687
+ or:
688
+
689
+ ```bash
690
+ satroot-demo-bundle-index-matrix-smoke
691
+ ```
692
+
693
+ That one writes into `.tmp_demo_bundle_index_matrix_smoke_run/` by default and runs the stable and machine demo bundle-index smoke workflows into one consolidated report.
694
+
695
+ For the lower operator layer above single releases but beneath the profile federation proof, there is also:
696
+
697
+ ```bash
698
+ python -m satroot_demo_release_catalog_matrix_smoke
699
+ ```
700
+
701
+ or:
702
+
703
+ ```bash
704
+ satroot-demo-release-catalog-matrix-smoke
705
+ ```
706
+
707
+ That one writes into `.tmp_demo_release_catalog_matrix_smoke_run/` by default and runs the stable and machine demo release-catalog smoke workflows into one consolidated report.
708
+
709
+ For the next layer up in that same operator ladder, there is also:
710
+
711
+ ```bash
712
+ python -m satroot_demo_release_catalog_index_matrix_smoke
713
+ ```
714
+
715
+ or:
716
+
717
+ ```bash
718
+ satroot-demo-release-catalog-index-matrix-smoke
719
+ ```
720
+
721
+ That one writes into `.tmp_demo_release_catalog_index_matrix_smoke_run/` by default and runs the stable and machine demo release-catalog-index smoke workflows into one consolidated report.
722
+
723
+ If you want that full stable/machine operator ladder in one pass, there is also:
724
+
725
+ ```bash
726
+ python -m satroot_publication_ladder_smoke
727
+ ```
728
+
729
+ or:
730
+
731
+ ```bash
732
+ satroot-publication-ladder-smoke
733
+ ```
734
+
735
+ That one writes into `.tmp_publication_ladder_smoke_run/` by default and runs the stable/machine bundle-index, release-catalog, and release-catalog-index matrix smokes together into one consolidated ladder report.
736
+
737
+ For the first operator-facing federation check above those released lanes, there is also:
738
+
739
+ ```bash
740
+ python -m satroot_profile_federation_smoke
741
+ ```
742
+
743
+ or:
744
+
745
+ ```bash
746
+ satroot-profile-federation-smoke
747
+ ```
748
+
749
+ That one writes into `.tmp_profile_federation_smoke_run/` by default, reuses the released profile matrix, freezes the resulting per-profile demo-catalog, publication-stack, publication-network, publication-catalog-workspace, and publication-registry-workspace outputs into explicit collections, builds one shared mixed-profile publication catalog workspace plus publication registry workspace above the federated network, snapshots those mixed top-level workspaces into their own explicit collections too, and round-trips the federated catalog workspace, stack, network, and top-level registry workspace back through exported nested presets.
750
+
751
+ If you want the next higher proof layer above that federated workspace surface, there is also:
752
+
753
+ ```bash
754
+ python -m satroot_federated_registry_collection_smoke
755
+ ```
756
+
757
+ or:
758
+
759
+ ```bash
760
+ satroot-federated-registry-collection-smoke
761
+ ```
762
+
763
+ That one writes into `.tmp_federated_registry_collection_smoke_run/` by default, reruns the mixed-profile federation smoke, reuses the generated top-level `publication_registry_workspace_collection`, bootstraps a top-level publication-registry publication from that collection-backed preset, exports the generated publication back into a preset, and bootstraps the publication again to prove the collection-backed registry publication round trip.
764
+
765
+ There is also a packaged stable-profile smoke entrypoint:
766
+
767
+ ```bash
768
+ python -m satroot_stable_profile_smoke
769
+ ```
770
+
771
+ or:
772
+
773
+ ```bash
774
+ satroot-stable-profile-smoke
775
+ ```
776
+
777
+ And the machine-credit lane has the same packaged entrypoints:
778
+
779
+ ```bash
780
+ python -m satroot_machine_profile_smoke
781
+ ```
782
+
783
+ or:
784
+
785
+ ```bash
786
+ satroot-machine-profile-smoke
787
+ ```
788
+
789
+ The singleton receipt lane also has lower publication-ladder wrappers:
790
+
791
+ ```bash
792
+ python scripts/run_receipt_demo_release_catalog_smoke.py
793
+ python scripts/run_receipt_demo_release_catalog_index_smoke.py
794
+ ```
795
+
796
+ or:
797
+
798
+ ```bash
799
+ python -m satroot_receipt_demo_release_catalog_smoke
800
+ python -m satroot_receipt_demo_release_catalog_index_smoke
801
+ ```
802
+
803
+ The singleton identity lane exposes the same local and packaged flows:
804
+
805
+ ```bash
806
+ python scripts/run_identity_demo_release_catalog_smoke.py
807
+ python scripts/run_identity_demo_release_catalog_index_smoke.py
808
+ ```
809
+
810
+ or:
811
+
812
+ ```bash
813
+ python -m satroot_identity_demo_release_catalog_smoke
814
+ python -m satroot_identity_demo_release_catalog_index_smoke
815
+ ```
816
+
817
+ The singleton license lane exposes the same local and packaged flows:
818
+
819
+ ```bash
820
+ python scripts/run_license_demo_release_catalog_smoke.py
821
+ python scripts/run_license_demo_release_catalog_index_smoke.py
822
+ ```
823
+
824
+ or:
825
+
826
+ ```bash
827
+ python -m satroot_license_demo_release_catalog_smoke
828
+ python -m satroot_license_demo_release_catalog_index_smoke
829
+ ```
830
+
831
+ And the stable and machine demo release-catalog operator lanes have packaged entrypoints too:
832
+
833
+ ```bash
834
+ python -m satroot_stable_demo_release_catalog_smoke
835
+ python -m satroot_machine_demo_release_catalog_smoke
836
+ ```
837
+
838
+ or:
839
+
840
+ ```bash
841
+ satroot-stable-demo-release-catalog-smoke
842
+ satroot-machine-demo-release-catalog-smoke
843
+ ```
844
+
845
+ And the matching index-layer operator lanes have packaged entrypoints too:
846
+
847
+ ```bash
848
+ python -m satroot_stable_demo_release_catalog_index_smoke
849
+ python -m satroot_machine_demo_release_catalog_index_smoke
850
+ ```
851
+
852
+ or:
853
+
854
+ ```bash
855
+ satroot-stable-demo-release-catalog-index-smoke
856
+ satroot-machine-demo-release-catalog-index-smoke
857
+ ```
858
+
859
+ The receipt lane has the same packaged entrypoints:
860
+
861
+ ```bash
862
+ python -m satroot_receipt_profile_smoke
863
+ ```
864
+
865
+ or:
866
+
867
+ ```bash
868
+ satroot-receipt-profile-smoke
869
+ ```
870
+
871
+ The identity lane has the same packaged entrypoints:
872
+
873
+ ```bash
874
+ python -m satroot_identity_profile_smoke
875
+ ```
876
+
877
+ or:
878
+
879
+ ```bash
880
+ satroot-identity-profile-smoke
881
+ ```
882
+
883
+ The license lane has the same packaged entrypoints:
884
+
885
+ ```bash
886
+ python -m satroot_license_profile_smoke
887
+ ```
888
+
889
+ or:
890
+
891
+ ```bash
892
+ satroot-license-profile-smoke
893
+ ```
894
+
895
+ The three chunked-runner forms (`scripts/run_pytest_chunked.py`, `python -m satroot_test`, `satroot-test`) collect from the full `tests/` tree by default.
896
+
897
+ You can also resume from a later point or reduce chunk size:
898
+
899
+ ```bash
900
+ python scripts/run_pytest_chunked.py --chunk-size 50 --start 1001
901
+ ```
902
+
903
+ or:
904
+
905
+ ```bash
906
+ python -m satroot_test --chunk-size 50 --start 1001
907
+ ```
908
+
909
+ or:
910
+
911
+ ```bash
912
+ satroot-test --chunk-size 50 --start 1001
913
+ ```
914
+
915
+ Current suite note:
916
+
917
+ ```text
918
+ the tests/ tree is large enough that chunked execution is the preferred full-suite path
919
+ ```
920
+
921
+ ## Signing utilities
922
+
923
+ Install the package in editable mode to expose the `satroot1` command:
924
+
925
+ ```bash
926
+ pip install -e .
927
+ ```
928
+
929
+ Install the optional crypto path when you want Ed25519 support:
930
+
931
+ ```bash
932
+ pip install -e .[crypto]
933
+ ```
934
+
935
+ Install the optional schema-validation path when you want `satroot1 validate`:
936
+
937
+ ```bash
938
+ pip install -e .[validation]
939
+ ```
940
+
941
+ Install both optional paths together:
942
+
943
+ ```bash
944
+ pip install -e .[crypto,validation]
945
+ ```
946
+
947
+ Replay a ledger:
948
+
949
+ ```bash
950
+ satroot1 replay examples/events_floor1.json
951
+ ```
952
+
953
+ Replay an HMAC-signed ledger with verifier material:
954
+
955
+ ```bash
956
+ satroot1 replay signed_events.json --scheme hmac-sha256 --secrets-json secrets.json
957
+ ```
958
+
959
+ Validate a raw SATROOT event file against the protocol schema:
960
+
961
+ ```bash
962
+ satroot1 validate examples/events_floor1.json
963
+ ```
964
+
965
+ Annotate a ledger with deterministic event commitments:
966
+
967
+ ```bash
968
+ satroot1 annotate-ledger examples/events_floor1.json --output annotated_events.json
969
+ ```
970
+
971
+ Build a signer-to-key map directly from a ledger:
972
+
973
+ ```bash
974
+ satroot1 init-signer-key-map examples/events_floor1.json --output signer_keys.json
975
+ ```
976
+
977
+ Scaffold a profile-aware genesis record with valid defaults:
978
+
979
+ ```bash
980
+ satroot1 init-genesis --symbol USDCLI1 --name "SATROOT CLI Dollar" --profile SATROOT-STABLE-1 --profile-field reference_unit=EUR --profile-field intended_use=cli-reference-ledger --output genesis.json
981
+ ```
982
+
983
+ Scaffold the next event directly from an existing ledger:
984
+
985
+ ```bash
986
+ satroot1 init-event --action transfer --events-json examples/events_floor1.json --signer bob --from bob --to issuer --amount 1000 --output next_event.json
987
+ ```
988
+
989
+ Append and sign the next event directly onto an existing ledger:
990
+
991
+ ```bash
992
+ satroot1 append-event signed_events.json --action transfer --signer bob --from bob --to issuer --amount 1000 --scheme hmac-sha256 --signer-key-map-json signer_key_map.json --secrets-json secrets.json --include-state-hash --output appended_events.json
993
+ ```
994
+
995
+ Generate a runnable SATROOT-STABLE-1 reference-only demo ledger:
996
+
997
+ ```bash
998
+ satroot1 bootstrap-stable-demo --symbol USDCLI2 --name "Stable CLI Demo" --reference-unit EUR --output-dir stable_demo
999
+ ```
1000
+
1001
+ That stable demo bootstrap can also resolve its symbol, name, and profile defaults from a stable-only preset:
1002
+
1003
+ ```bash
1004
+ satroot1 bootstrap-stable-demo --preset-json examples/catalog_presets/stable_reference_catalog.json --output-dir stable_demo_preset
1005
+ ```
1006
+
1007
+ Generate a runnable SATROOT-MACHINE-1 machine-credit demo ledger:
1008
+
1009
+ ```bash
1010
+ satroot1 bootstrap-machine-demo --symbol APIDEMO2 --name "Machine CLI Demo" --service-scope inference-api --billing-unit token --output-dir machine_demo
1011
+ ```
1012
+
1013
+ That machine demo bootstrap can also resolve its symbol, name, and profile defaults from a machine-only preset:
1014
+
1015
+ ```bash
1016
+ satroot1 bootstrap-machine-demo --preset-json examples/catalog_presets/machine_compute_catalog.json --output-dir machine_demo_preset
1017
+ ```
1018
+
1019
+ Generate a runnable receipt, identity, or license singleton demo ledger:
1020
+
1021
+ ```bash
1022
+ satroot1 bootstrap-singleton-demo --profile SATROOT-IDENTITY-1 --symbol IDDEMO2 --name "Identity CLI Demo" --next-holder controller_v2 --no-archive --no-retire --output-dir singleton_identity
1023
+ ```
1024
+
1025
+ Generate a signed receipt, identity, or license singleton demo bundle:
1026
+
1027
+ ```bash
1028
+ satroot1 bootstrap-singleton-demo-bundle --profile SATROOT-RECEIPT-1 --symbol RECBUNDLE2 --name "Receipt Bundle CLI" --scheme hmac-sha256 --output-dir singleton_bundle
1029
+ ```
1030
+
1031
+ Generate a signed receipt, identity, or license singleton demo bundle plus release directory:
1032
+
1033
+ ```bash
1034
+ satroot1 bootstrap-singleton-demo-release --profile SATROOT-LICENSE-1 --symbol LICRELCLI1 --name "License Release CLI" --scheme hmac-sha256 --release-key-id release-key --channel stable --label "SATROOT License Release" --published-at 2026-06-28T12:00:00Z --output-dir singleton_release
1035
+ ```
1036
+
1037
+ If you want the reusable packaging layer just below releases for a single receipt, identity, or license profile, there is now a singleton wrapper that filters repeated demo presets down to one singleton profile, snapshots the generated bundles into a bundle collection, and writes a reusable bundle index in one step:
1038
+
1039
+ ```bash
1040
+ satroot1 bootstrap-singleton-demo-bundle-index --profile SATROOT-RECEIPT-1 --preset-json singleton_alpha.json --preset-json singleton_beta.json --scheme hmac-sha256 --label "Receipt Bundle Index" --output-dir singleton_bundle_index
1041
+ ```
1042
+
1043
+ If you want the next packaging layer up, there is also a singleton release-collection wrapper that keeps one singleton profile from repeated presets and packages the generated releases into a reusable collection:
1044
+
1045
+ ```bash
1046
+ satroot1 bootstrap-singleton-demo-release-collection --profile SATROOT-LICENSE-1 --preset-json singleton_alpha.json --preset-json singleton_beta.json --scheme hmac-sha256 --release-key-id release-key --label "License Release Collection" --output-dir singleton_release_collection
1047
+ ```
1048
+
1049
+ And if you want a signed catalog on top of those repeated singleton releases, the singleton release-catalog wrapper bootstraps the collection workspace and catalog publication together:
1050
+
1051
+ ```bash
1052
+ satroot1 bootstrap-singleton-demo-release-catalog-publication --profile SATROOT-IDENTITY-1 --preset-json singleton_alpha.json --preset-json singleton_beta.json --bundle-scheme hmac-sha256 --release-key-id release-key --scheme hmac-sha256 --key-id catalog-key --label "Identity Release Catalog" --output-dir singleton_release_catalog
1053
+ ```
1054
+
1055
+ And if you want the singleton lane all the way up at the top publication index layer, there is now a singleton release-catalog-index wrapper too:
1056
+
1057
+ ```bash
1058
+ satroot1 bootstrap-singleton-demo-release-catalog-index-publication --profile SATROOT-RECEIPT-1 --preset-json singleton_alpha.json --preset-json singleton_beta.json --bundle-scheme hmac-sha256 --release-key-id release-key --catalog-scheme hmac-sha256 --catalog-key-id catalog-key --scheme hmac-sha256 --key-id index-key --label "Receipt Release Catalog Index" --output-dir singleton_release_catalog_index
1059
+ ```
1060
+
1061
+ And if you want those repeated singleton presets to continue upward into the publication workspace lanes, there are now singleton publication-stack and publication-network wrappers as well:
1062
+
1063
+ ```bash
1064
+ satroot1 bootstrap-singleton-demo-publication-stack --profile SATROOT-RECEIPT-1 --preset-json singleton_alpha.json --preset-json singleton_beta.json --scheme hmac-sha256 --release-key-id release-key --release-catalog-key-id catalog-key --label "Receipt Publication Stack" --output-dir singleton_publication_stack
1065
+ satroot1 bootstrap-singleton-demo-publication-network --profile SATROOT-IDENTITY-1 --preset-json singleton_alpha.json --preset-json singleton_beta.json --scheme hmac-sha256 --release-key-id release-key --release-catalog-key-id catalog-key --release-catalog-index-key-id index-key --catalog-label "Identity Publication Stack" --label "Identity Publication Network" --output-dir singleton_publication_network
1066
+ ```
1067
+
1068
+ And if you want the singleton lane to keep going through descriptor/metadata and top-level registry packaging, there are matching workspace wrappers there too:
1069
+
1070
+ ```bash
1071
+ satroot1 bootstrap-singleton-demo-publication-catalog-workspace --profile SATROOT-LICENSE-1 --preset-json singleton_alpha.json --preset-json singleton_beta.json --scheme hmac-sha256 --release-key-id release-key --publication-descriptor-index-key-id descriptor-key --publication-metadata-key-id metadata-key --publication-metadata-catalog-key-id catalog-key --descriptor-index-label "License Workspace Descriptor Index" --publication-metadata-catalog-label "License Workspace Metadata Catalog" --output-dir singleton_publication_catalog_workspace
1072
+ satroot1 bootstrap-singleton-demo-publication-registry-workspace --profile SATROOT-RECEIPT-1 --preset-json singleton_alpha.json --preset-json singleton_beta.json --scheme hmac-sha256 --release-key-id release-key --release-catalog-key-id catalog-key --release-catalog-index-key-id index-key --publication-descriptor-index-key-id descriptor-key --publication-metadata-key-id metadata-key --publication-metadata-catalog-key-id catalog-key --publication-registry-key-id registry-key --publication-registry-label "Receipt Publication Registry" --output-dir singleton_publication_registry_workspace
1073
+ ```
1074
+
1075
+ Once you have frozen one of those singleton release collections, the checked-in singleton registry-workspace and top-level registry presets in `examples/registry_workspace_presets/` and `examples/registry_presets/` can also be reused directly:
1076
+
1077
+ ```bash
1078
+ satroot1 bootstrap-singleton-demo-release-collection --profile SATROOT-RECEIPT-1 --preset-json examples/catalog_presets/receipt_invoice_catalog.json --scheme hmac-sha256 --release-key-id release-key --output-dir examples/generated_receipt_release_collection_workspace
1079
+ cp -r examples/generated_receipt_release_collection_workspace/release_collection examples/generated_receipt_release_collection
1080
+ satroot1 bootstrap-demo-publication-network --preset-json examples/catalog_presets/ai_compute_catalog.json --preset-json examples/catalog_presets/machine_compute_catalog.json --scheme hmac-sha256 --release-key-id release-key --release-catalog-key-id catalog-key --release-catalog-index-key-id index-key --output-dir generated_publication_network
1081
+ satroot1 bootstrap-publication-network-collection generated_publication_network --output-dir generated_publication_network_collection
1082
+ satroot1 bootstrap-publication-registry-workspace --preset-json examples/registry_workspace_presets/receipt_invoice_publication_registry_workspace_catalog_release_collection_backed.json --scheme hmac-sha256 --publication-descriptor-index-key-id descriptor-key --publication-metadata-key-id metadata-key --publication-metadata-catalog-key-id catalog-key --publication-registry-key-id registry-key --output-dir receipt_frozen_registry_workspace
1083
+ satroot1 bootstrap-publication-registry-publication --preset-json examples/registry_presets/receipt_invoice_publication_registry_workspace_catalog_release_collection_backed.json --scheme hmac-sha256 --key-id registry-key --output-dir receipt_frozen_registry
1084
+ ```
1085
+
1086
+ Generate a signed SATROOT-STABLE-1 reference-only demo bundle:
1087
+
1088
+ ```bash
1089
+ satroot1 bootstrap-stable-demo-bundle --symbol USDBUNDLE2 --name "Stable Bundle CLI" --scheme hmac-sha256 --reference-unit CHF --output-dir stable_bundle
1090
+ ```
1091
+
1092
+ That stable bundle bootstrap can also resolve its stable symbol, name, and profile defaults from a stable-only preset:
1093
+
1094
+ ```bash
1095
+ satroot1 bootstrap-stable-demo-bundle --preset-json examples/catalog_presets/stable_reference_catalog.json --scheme hmac-sha256 --output-dir stable_bundle_preset
1096
+ ```
1097
+
1098
+ For Ed25519 stable bundles, you can also emit a verifier-only variant that excludes `private_keys.json`:
1099
+
1100
+ ```bash
1101
+ satroot1 bootstrap-stable-demo-bundle --symbol USDEDCLI1 --name "Stable Bundle Ed25519" --scheme ed25519 --reference-unit AUD --output-dir stable_bundle_ed25519 --verifier-only
1102
+ ```
1103
+
1104
+ Generate a signed SATROOT-STABLE-1 demo bundle plus release directory:
1105
+
1106
+ ```bash
1107
+ satroot1 bootstrap-stable-demo-release --symbol USDRELCLI1 --name "Stable Release CLI" --scheme hmac-sha256 --release-key-id release-key --reference-unit JPY --channel stable --label "SATROOT Stable Release" --published-at 2026-06-27T12:00:00Z --output-dir stable_release
1108
+ ```
1109
+
1110
+ That stable release bootstrap can also inherit release metadata defaults from the same stable-only preset:
1111
+
1112
+ ```bash
1113
+ satroot1 bootstrap-stable-demo-release --preset-json examples/catalog_presets/stable_reference_catalog.json --scheme hmac-sha256 --release-key-id release-key --output-dir stable_release_preset
1114
+ ```
1115
+
1116
+ If you want to generate multiple stable demo releases from one or more stable preset files and package them straight into a reusable release collection, repeat `--preset-json` for each member you want to generate:
1117
+
1118
+ ```bash
1119
+ satroot1 bootstrap-stable-demo-release-collection --preset-json examples/catalog_presets/stable_reference_catalog.json --preset-json examples/catalog_presets/stable_reference_catalog.json --scheme hmac-sha256 --release-key-id release-key --output-dir stable_release_collection_workspace --label "SATROOT Stable Collection Override"
1120
+ ```
1121
+
1122
+ If you want the reusable packaging layer just below releases, there is also a stable wrapper that generates repeated bundles, snapshots them into a stable bundle collection, and writes a reusable bundle index in one step:
1123
+
1124
+ ```bash
1125
+ satroot1 bootstrap-stable-demo-bundle-index --preset-json examples/catalog_presets/stable_reference_catalog.json --preset-json examples/catalog_presets/stable_reference_catalog.json --scheme hmac-sha256 --label "Stable Demo Bundle Index" --output-dir stable_bundle_index_workspace
1126
+ ```
1127
+
1128
+ And if you want the next layer up in the same shot, there is a stable wrapper that generates those releases, snapshots the release collection, and bootstraps a signed release catalog publication:
1129
+
1130
+ ```bash
1131
+ satroot1 bootstrap-stable-demo-release-catalog-publication --preset-json examples/catalog_presets/stable_reference_catalog.json --preset-json examples/catalog_presets/stable_reference_catalog.json --bundle-scheme hmac-sha256 --release-key-id release-key --scheme hmac-sha256 --key-id catalog-key --release-label "Stable Collection Override" --label "Stable Demo Release Catalog" --output-dir stable_demo_release_catalog_publication
1132
+ ```
1133
+
1134
+ And if you want the next publication layer above that as well, there is a stable wrapper that continues on to a signed release catalog index publication:
1135
+
1136
+ ```bash
1137
+ satroot1 bootstrap-stable-demo-release-catalog-index-publication --preset-json examples/catalog_presets/stable_reference_catalog.json --preset-json examples/catalog_presets/stable_reference_catalog.json --bundle-scheme hmac-sha256 --release-key-id release-key --catalog-scheme hmac-sha256 --catalog-key-id catalog-key --scheme hmac-sha256 --key-id index-key --catalog-label "Stable Demo Release Catalog" --label "Stable Demo Release Catalog Index" --output-dir stable_demo_release_catalog_index_publication
1138
+ ```
1139
+
1140
+ Generate a reusable SATROOT-STABLE-1 reference-only demo catalog workspace:
1141
+
1142
+ ```bash
1143
+ satroot1 bootstrap-stable-demo-catalog --symbol USDCATST1 --name "Stable Catalog CLI" --scheme hmac-sha256 --release-key-id release-key --reference-unit CHF --profile-field intended_use=treasury-credit --channel stable --label "SATROOT Stable Catalog" --published-at 2026-07-04T04:00:00Z --output-dir stable_catalog_workspace
1144
+ ```
1145
+
1146
+ That stable catalog bootstrap can also resolve its symbol, name, stable fields, and release metadata from a stable-only SATROOT demo-catalog preset:
1147
+
1148
+ ```bash
1149
+ satroot1 bootstrap-stable-demo-catalog --preset-json examples/catalog_presets/stable_reference_catalog.json --scheme hmac-sha256 --release-key-id release-key --output-dir stable_catalog_workspace_preset --label "SATROOT Stable Catalog Override"
1150
+ ```
1151
+
1152
+ Generate a signed SATROOT-MACHINE-1 machine-credit demo bundle:
1153
+
1154
+ ```bash
1155
+ satroot1 bootstrap-machine-demo-bundle --symbol APIBUNDLE2 --name "Machine Bundle CLI" --scheme hmac-sha256 --service-scope batch-jobs --output-dir machine_bundle
1156
+ ```
1157
+
1158
+ That bundle bootstrap can also resolve its machine symbol, name, and profile defaults from a machine-only preset:
1159
+
1160
+ ```bash
1161
+ satroot1 bootstrap-machine-demo-bundle --preset-json examples/catalog_presets/machine_compute_catalog.json --scheme hmac-sha256 --output-dir machine_bundle_preset
1162
+ ```
1163
+
1164
+ Generate a signed SATROOT-MACHINE-1 machine-credit demo bundle plus release directory:
1165
+
1166
+ ```bash
1167
+ satroot1 bootstrap-machine-demo-release --symbol APIRELCLI1 --name "Machine Release CLI" --scheme hmac-sha256 --release-key-id release-key --service-scope render-farm --channel stable --label "SATROOT Machine Release" --published-at 2026-06-28T06:00:00Z --output-dir machine_release
1168
+ ```
1169
+
1170
+ The release bootstrap can also merge machine ledger defaults and release metadata from the same machine-only preset:
1171
+
1172
+ ```bash
1173
+ satroot1 bootstrap-machine-demo-release --preset-json examples/catalog_presets/machine_compute_catalog.json --scheme hmac-sha256 --release-key-id release-key --output-dir machine_release_preset --label "SATROOT Machine Release Override"
1174
+ ```
1175
+
1176
+ If you want to generate multiple machine demo releases from one or more machine preset files and package them straight into a reusable release collection, repeat `--preset-json` for each member you want to generate:
1177
+
1178
+ ```bash
1179
+ satroot1 bootstrap-machine-demo-release-collection --preset-json examples/catalog_presets/machine_compute_catalog.json --preset-json examples/catalog_presets/machine_compute_catalog.json --scheme hmac-sha256 --release-key-id release-key --output-dir machine_release_collection_workspace --label "SATROOT Machine Collection Override"
1180
+ ```
1181
+
1182
+ If you want the reusable packaging layer just below releases, there is also a machine wrapper that generates repeated bundles, snapshots them into a machine bundle collection, and writes a reusable bundle index in one step:
1183
+
1184
+ ```bash
1185
+ satroot1 bootstrap-machine-demo-bundle-index --preset-json examples/catalog_presets/machine_compute_catalog.json --preset-json examples/catalog_presets/machine_compute_catalog.json --scheme hmac-sha256 --label "Machine Demo Bundle Index" --output-dir machine_bundle_index_workspace
1186
+ ```
1187
+
1188
+ And if you want the next layer up in the same shot, there is a machine wrapper that generates those releases, snapshots the release collection, and bootstraps a signed release catalog publication:
1189
+
1190
+ ```bash
1191
+ satroot1 bootstrap-machine-demo-release-catalog-publication --preset-json examples/catalog_presets/machine_compute_catalog.json --preset-json examples/catalog_presets/machine_compute_catalog.json --bundle-scheme hmac-sha256 --release-key-id release-key --scheme hmac-sha256 --key-id catalog-key --release-label "Machine Collection Override" --label "Machine Demo Release Catalog" --output-dir machine_demo_release_catalog_publication
1192
+ ```
1193
+
1194
+ And if you want the next publication layer above that as well, there is a machine wrapper that continues on to a signed release catalog index publication:
1195
+
1196
+ ```bash
1197
+ satroot1 bootstrap-machine-demo-release-catalog-index-publication --preset-json examples/catalog_presets/machine_compute_catalog.json --preset-json examples/catalog_presets/machine_compute_catalog.json --bundle-scheme hmac-sha256 --release-key-id release-key --catalog-scheme hmac-sha256 --catalog-key-id catalog-key --scheme hmac-sha256 --key-id index-key --catalog-label "Machine Demo Release Catalog" --label "Machine Demo Release Catalog Index" --output-dir machine_demo_release_catalog_index_publication
1198
+ ```
1199
+
1200
+ If you want the reusable packaging layer directly at the mixed-profile bundle level, there is also a generic wrapper that generates repeated preset-based bundles, snapshots them into one bundle collection, and writes a reusable top-level bundle index:
1201
+
1202
+ ```bash
1203
+ satroot1 bootstrap-demo-bundle-index --preset-json examples/catalog_presets/ai_compute_catalog.json --preset-json examples/catalog_presets/ai_compute_catalog.json --scheme hmac-sha256 --label "SATROOT Demo Bundle Index" --output-dir demo_bundle_index_workspace
1204
+ ```
1205
+
1206
+ Generate a reusable SATROOT-MACHINE-1 machine-credit demo catalog workspace:
1207
+
1208
+ ```bash
1209
+ satroot1 bootstrap-machine-demo-catalog --symbol APICAT1 --name "Machine Catalog CLI" --scheme hmac-sha256 --release-key-id release-key --service-scope batch-inference --billing-unit job --profile-field intended_use=cluster-credit --channel stable --label "SATROOT Machine Catalog" --published-at 2026-07-03T04:00:00Z --output-dir machine_catalog_workspace
1210
+ ```
1211
+
1212
+ That machine catalog bootstrap can also resolve its symbol, name, machine fields, and release metadata from a machine-only SATROOT demo-catalog preset:
1213
+
1214
+ ```bash
1215
+ satroot1 bootstrap-machine-demo-catalog --preset-json examples/catalog_presets/machine_compute_catalog.json --scheme hmac-sha256 --release-key-id release-key --output-dir machine_catalog_workspace_preset --label "SATROOT Machine Catalog Override"
1216
+ ```
1217
+
1218
+ If you already have multiple machine-credit release directories and want a machine-validated signed catalog without stepping up into the publication stack yet:
1219
+
1220
+ ```bash
1221
+ satroot1 bootstrap-machine-release-catalog-publication machine_release_alpha/release_manifest.json machine_release_beta/bundle_index.json --output-dir machine_release_catalog --channel machine --label "SATROOT Machine Release Catalog" --published-at 2026-07-04T03:00:00Z --scheme hmac-sha256 --key-id catalog-key
1222
+ ```
1223
+
1224
+ For the stable-only lane, there is now a matching SATROOT-STABLE-1 wrapper:
1225
+
1226
+ ```bash
1227
+ satroot1 bootstrap-stable-release-catalog-publication stable_release_alpha/release_manifest.json stable_release_beta/bundle_index.json --output-dir stable_release_catalog --channel stable --label "SATROOT Stable Release Catalog" --published-at 2026-07-15T03:00:00Z --scheme hmac-sha256 --key-id catalog-key
1228
+ ```
1229
+
1230
+ And if you already manage signing material yourself, there is a matching publish wrapper that rejects any non-machine release inputs:
1231
+
1232
+ ```bash
1233
+ satroot1 publish-machine-release-catalog machine_release_alpha machine_release_beta --output-dir machine_release_catalog --channel machine --label "SATROOT Machine Release Catalog" --published-at 2026-07-04T03:00:00Z --scheme hmac-sha256 --key-id catalog-key --secrets-json release_hmac/release_secrets.json
1234
+ ```
1235
+
1236
+ The stable-only lane now has the same publish wrapper with SATROOT-STABLE-1 validation:
1237
+
1238
+ ```bash
1239
+ satroot1 publish-stable-release-catalog stable_release_alpha stable_release_beta --output-dir stable_release_catalog --channel stable --label "SATROOT Stable Release Catalog" --published-at 2026-07-15T03:00:00Z --scheme hmac-sha256 --key-id catalog-key --secret catalog-secret
1240
+ ```
1241
+
1242
+ If you only want the unsigned JSON catalog first, there is also a machine-validated build-only variant:
1243
+
1244
+ ```bash
1245
+ satroot1 build-machine-release-catalog machine_release_alpha machine_release_beta/release_manifest.json --channel machine --label "SATROOT Machine Release Catalog" --published-at 2026-07-04T03:00:00Z --output machine_release_catalog.json
1246
+ ```
1247
+
1248
+ ```bash
1249
+ satroot1 build-stable-release-catalog stable_release_alpha stable_release_beta/release_manifest.json --channel stable --label "SATROOT Stable Release Catalog" --published-at 2026-07-15T03:45:00Z --output stable_release_catalog.json
1250
+ ```
1251
+
1252
+ And if you want to sign that unsigned machine catalog separately, the manifest step has a matching machine-only guard as well:
1253
+
1254
+ ```bash
1255
+ satroot1 build-machine-release-catalog-manifest machine_release_catalog.json --scheme hmac-sha256 --key-id catalog-key --secret catalog-secret --output machine_release_catalog_manifest.json
1256
+ ```
1257
+
1258
+ ```bash
1259
+ satroot1 build-stable-release-catalog-manifest stable_release_catalog.json --scheme hmac-sha256 --key-id catalog-key --secret catalog-secret --output stable_release_catalog_manifest.json
1260
+ ```
1261
+
1262
+ To publish a higher-level machine-only index across multiple machine release catalogs, there is now a matching machine wrapper at the release-catalog-index layer:
1263
+
1264
+ ```bash
1265
+ satroot1 bootstrap-machine-release-catalog-index-publication machine_release_catalog_alpha/release_catalog.json machine_release_catalog_beta/release_catalog_manifest.json --output-dir machine_release_catalog_index --channel machine --label "SATROOT Machine Catalog Network" --published-at 2026-07-04T06:00:00Z --scheme hmac-sha256 --key-id index-key
1266
+ ```
1267
+
1268
+ The stable-only lane has the same convenience wrapper for SATROOT-STABLE-1 release catalogs:
1269
+
1270
+ ```bash
1271
+ satroot1 bootstrap-stable-release-catalog-index-publication stable_release_catalog_alpha/release_catalog.json stable_release_catalog_beta/release_catalog_manifest.json --output-dir stable_release_catalog_index --channel stable --label "SATROOT Stable Catalog Network" --published-at 2026-07-15T06:00:00Z --scheme hmac-sha256 --key-id index-key
1272
+ ```
1273
+
1274
+ And the publish variant likewise rejects any non-machine release catalog inputs:
1275
+
1276
+ ```bash
1277
+ satroot1 publish-machine-release-catalog-index machine_release_catalog_alpha machine_release_catalog_beta --output-dir machine_release_catalog_index --channel machine --label "SATROOT Machine Catalog Network" --published-at 2026-07-04T06:00:00Z --scheme hmac-sha256 --key-id index-key --secrets-json release_hmac/release_secrets.json
1278
+ ```
1279
+
1280
+ ```bash
1281
+ satroot1 publish-stable-release-catalog-index stable_release_catalog_alpha stable_release_catalog_beta --output-dir stable_release_catalog_index --channel stable --label "SATROOT Stable Catalog Network" --published-at 2026-07-15T06:00:00Z --scheme hmac-sha256 --key-id index-key --secret index-secret
1282
+ ```
1283
+
1284
+ There is also a matching unsigned machine-only builder for the index JSON:
1285
+
1286
+ ```bash
1287
+ satroot1 build-machine-release-catalog-index machine_release_catalog_alpha machine_release_catalog_beta/release_catalog_manifest.json --channel machine --label "SATROOT Machine Catalog Network" --published-at 2026-07-04T06:00:00Z --output machine_release_catalog_index.json
1288
+ ```
1289
+
1290
+ ```bash
1291
+ satroot1 build-stable-release-catalog-index stable_release_catalog_alpha stable_release_catalog_beta/release_catalog_manifest.json --channel stable --label "SATROOT Stable Catalog Network" --published-at 2026-07-15T06:45:00Z --output stable_release_catalog_index.json
1292
+ ```
1293
+
1294
+ And the top-level machine catalog index can be signed the same way with machine-only validation preserved:
1295
+
1296
+ ```bash
1297
+ satroot1 build-machine-release-catalog-index-manifest machine_release_catalog_index.json --scheme hmac-sha256 --key-id index-key --secret index-secret --output machine_release_catalog_index_manifest.json
1298
+ ```
1299
+
1300
+ ```bash
1301
+ satroot1 build-stable-release-catalog-index-manifest stable_release_catalog_index.json --scheme hmac-sha256 --key-id index-key --secret index-secret --output stable_release_catalog_index_manifest.json
1302
+ ```
1303
+
1304
+ Generate a reusable SATROOT-STABLE-1 publication catalog workspace directly from stable-profile inputs:
1305
+
1306
+ ```bash
1307
+ satroot1 bootstrap-stable-publication-catalog-workspace --symbol STBPUBCAT1 --name "Stable Publication Catalog CLI" --scheme hmac-sha256 --release-key-id release-key --publication-descriptor-index-key-id descriptor-key --publication-metadata-key-id metadata-key --publication-metadata-catalog-key-id catalog-key --intended-use merchant-clearing --channel stable --label "SATROOT Stable Catalog" --descriptor-index-label "Stable Descriptor Index" --publication-metadata-catalog-label "Stable Metadata Catalog" --output-dir stable_publication_catalog_workspace
1308
+ ```
1309
+
1310
+ The same wrapper can also layer a stable-only demo-catalog preset with a generic publication-catalog-workspace preset:
1311
+
1312
+ ```bash
1313
+ satroot1 bootstrap-stable-publication-catalog-workspace --catalog-preset-json examples/catalog_presets/stable_reference_catalog.json --preset-json examples/publication_catalog_workspace_presets/stable_reference_publication_catalog_workspace.json --scheme hmac-sha256 --release-key-id release-key --publication-descriptor-index-key-id descriptor-key --publication-metadata-key-id metadata-key --publication-metadata-catalog-key-id catalog-key --output-dir stable_publication_catalog_workspace_preset --publication-metadata-catalog-label "SATROOT Stable Metadata Catalog Override"
1314
+ ```
1315
+
1316
+ Generate a reusable SATROOT-STABLE-1 publication registry workspace directly from stable-profile inputs plus a stable publication network source:
1317
+
1318
+ ```bash
1319
+ satroot1 bootstrap-stable-publication-registry-workspace --publication-network-dir stable_publication_network --symbol STBPUBREG1 --name "Stable Publication Registry CLI" --scheme hmac-sha256 --release-key-id release-key --publication-descriptor-index-key-id descriptor-key --publication-metadata-key-id metadata-key --publication-metadata-catalog-key-id catalog-key --publication-registry-key-id registry-key --intended-use merchant-clearing --channel stable --label "SATROOT Stable Catalog" --descriptor-index-label "Stable Descriptor Index" --publication-metadata-catalog-label "Stable Metadata Catalog" --publication-registry-label "Stable Publication Registry" --output-dir stable_publication_registry_workspace
1320
+ ```
1321
+
1322
+ That registry wrapper can also compose the stable catalog preset, a publication-catalog-workspace preset, and a publication-registry-workspace preset:
1323
+
1324
+ ```bash
1325
+ satroot1 bootstrap-stable-publication-registry-workspace --catalog-preset-json examples/catalog_presets/stable_reference_catalog.json --publication-catalog-workspace-preset-json examples/publication_catalog_workspace_presets/stable_reference_publication_catalog_workspace.json --preset-json examples/registry_workspace_presets/stable_reference_publication_registry_workspace.json --scheme hmac-sha256 --release-key-id release-key --release-catalog-key-id catalog-key --release-catalog-index-key-id index-key --publication-descriptor-index-key-id descriptor-key --publication-metadata-key-id metadata-key --publication-metadata-catalog-key-id catalog-key --publication-registry-key-id registry-key --output-dir stable_publication_registry_workspace_preset --publication-registry-label "SATROOT Stable Registry Override"
1326
+ ```
1327
+
1328
+ If the nested stable catalog comes from a frozen one-release collection, that same command can skip `--release-key-id` unless `--publication-network-preset-json` is generating a nested network. A self-contained registry-workspace preset can now carry that nested stable catalog preset for you:
1329
+
1330
+ ```bash
1331
+ satroot1 bootstrap-stable-publication-registry-workspace --preset-json examples/registry_workspace_presets/stable_reference_publication_registry_workspace_catalog_release_collection_backed.json --scheme hmac-sha256 --publication-descriptor-index-key-id descriptor-key --publication-metadata-key-id metadata-key --publication-metadata-catalog-key-id catalog-key --publication-registry-key-id registry-key --output-dir stable_publication_registry_workspace_frozen_catalog
1332
+ ```
1333
+
1334
+ Generate a reusable SATROOT-MACHINE-1 publication catalog workspace directly from machine-profile inputs:
1335
+
1336
+ ```bash
1337
+ satroot1 bootstrap-machine-publication-catalog-workspace --symbol APIPUBCAT1 --name "Machine Publication Catalog CLI" --scheme hmac-sha256 --release-key-id release-key --publication-descriptor-index-key-id descriptor-key --publication-metadata-key-id metadata-key --publication-metadata-catalog-key-id catalog-key --service-scope batch-inference --billing-unit job --profile-field intended_use=cluster-credit --channel stable --label "SATROOT Machine Catalog" --descriptor-index-label "Machine Descriptor Index" --publication-metadata-catalog-label "Machine Metadata Catalog" --output-dir machine_publication_catalog_workspace
1338
+ ```
1339
+
1340
+ The same wrapper can also layer a machine-only demo-catalog preset with a generic publication-catalog-workspace preset:
1341
+
1342
+ ```bash
1343
+ satroot1 bootstrap-machine-publication-catalog-workspace --catalog-preset-json examples/catalog_presets/machine_compute_catalog.json --preset-json examples/publication_catalog_workspace_presets/machine_compute_publication_catalog_workspace.json --scheme hmac-sha256 --release-key-id release-key --publication-descriptor-index-key-id descriptor-key --publication-metadata-key-id metadata-key --publication-metadata-catalog-key-id catalog-key --output-dir machine_publication_catalog_workspace_preset --publication-metadata-catalog-label "SATROOT Machine Metadata Catalog Override"
1344
+ ```
1345
+
1346
+ Generate a reusable SATROOT-MACHINE-1 publication registry workspace directly from machine-profile inputs plus a publication network source:
1347
+
1348
+ ```bash
1349
+ satroot1 bootstrap-machine-publication-registry-workspace --publication-network-dir publication_network --symbol APIPUBREG1 --name "Machine Publication Registry CLI" --scheme hmac-sha256 --release-key-id release-key --publication-descriptor-index-key-id descriptor-key --publication-metadata-key-id metadata-key --publication-metadata-catalog-key-id catalog-key --publication-registry-key-id registry-key --service-scope batch-inference --billing-unit job --profile-field intended_use=cluster-credit --channel stable --label "SATROOT Machine Catalog" --descriptor-index-label "Machine Descriptor Index" --publication-metadata-catalog-label "Machine Metadata Catalog" --publication-registry-label "Machine Publication Registry" --output-dir machine_publication_registry_workspace
1350
+ ```
1351
+
1352
+ That registry wrapper can also compose the machine catalog preset, a publication-catalog-workspace preset, and a publication-registry-workspace preset:
1353
+
1354
+ ```bash
1355
+ satroot1 bootstrap-machine-publication-registry-workspace --catalog-preset-json examples/catalog_presets/machine_compute_catalog.json --publication-catalog-workspace-preset-json examples/publication_catalog_workspace_presets/machine_compute_publication_catalog_workspace.json --preset-json examples/registry_workspace_presets/machine_compute_publication_registry_workspace.json --scheme hmac-sha256 --release-key-id release-key --release-catalog-key-id catalog-key --release-catalog-index-key-id index-key --publication-descriptor-index-key-id descriptor-key --publication-metadata-key-id metadata-key --publication-metadata-catalog-key-id catalog-key --publication-registry-key-id registry-key --output-dir machine_publication_registry_workspace_preset --publication-registry-label "SATROOT Machine Registry Override"
1356
+ ```
1357
+
1358
+ If the nested machine catalog comes from a frozen one-release collection, that same command can skip `--release-key-id` unless `--publication-network-preset-json` is generating a nested network. A self-contained registry-workspace preset can now carry that nested machine catalog preset for you:
1359
+
1360
+ ```bash
1361
+ satroot1 bootstrap-machine-publication-registry-workspace --preset-json examples/registry_workspace_presets/machine_compute_publication_registry_workspace_catalog_release_collection_backed.json --scheme hmac-sha256 --publication-descriptor-index-key-id descriptor-key --publication-metadata-key-id metadata-key --publication-metadata-catalog-key-id catalog-key --publication-registry-key-id registry-key --output-dir machine_publication_registry_workspace_frozen_catalog
1362
+ ```
1363
+
1364
+ Generate a full multi-profile demo catalog workspace with `bundles/`, `release/`, and a root `summary.json` in one step:
1365
+
1366
+ ```bash
1367
+ satroot1 bootstrap-demo-catalog --scheme hmac-sha256 --release-key-id release-key --output-dir catalog_workspace --channel stable --label "SATROOT Demo Catalog" --published-at 2026-06-28T22:00:00Z
1368
+ ```
1369
+
1370
+ That workspace bootstrap can also be narrowed to selected profiles with per-profile symbol and name overrides:
1371
+
1372
+ ```bash
1373
+ satroot1 bootstrap-demo-catalog --scheme hmac-sha256 --release-key-id release-key --output-dir catalog_workspace_subset --profile SATROOT-MACHINE-1 --profile SATROOT-IDENTITY-1 --symbol-override SATROOT-MACHINE-1=APISET2 --name-override "SATROOT-IDENTITY-1=SATROOT Identity Subset" --channel stable --label "SATROOT Subset Catalog" --published-at 2026-06-28T22:30:00Z
1374
+ ```
1375
+
1376
+ Per-profile metadata can also be overridden inside the catalog bootstrap with `PROFILE:field=value` entries:
1377
+
1378
+ ```bash
1379
+ satroot1 bootstrap-demo-catalog --scheme hmac-sha256 --release-key-id release-key --output-dir catalog_workspace_fields --profile SATROOT-STABLE-1 --profile SATROOT-MACHINE-1 --profile-field-override SATROOT-STABLE-1:reference_unit=EUR --profile-field-override SATROOT-STABLE-1:intended_use=treasury-ledger --profile-field-override SATROOT-MACHINE-1:service_scope=batch-inference --profile-field-override SATROOT-MACHINE-1:billing_unit=job --profile-field-override SATROOT-MACHINE-1:intended_use=compute-credit --channel stable --label "SATROOT Field Override Catalog" --published-at 2026-06-28T23:00:00Z
1380
+ ```
1381
+
1382
+ Per-profile structural demo parameters can be overridden too, so the catalog can generate different ledger shapes and singleton lifecycles from one command:
1383
+
1384
+ ```bash
1385
+ satroot1 bootstrap-demo-catalog --scheme hmac-sha256 --release-key-id release-key --output-dir catalog_workspace_structure --profile SATROOT-STABLE-1 --profile SATROOT-MACHINE-1 --profile SATROOT-IDENTITY-1 --profile-structure-override SATROOT-STABLE-1:merchant_account=merchant_beta --profile-structure-override SATROOT-STABLE-1:service_account=settlement_node --profile-structure-override SATROOT-STABLE-1:merchant_burn_amount=0 --profile-structure-override SATROOT-MACHINE-1:tenant_account=tenant_b --profile-structure-override SATROOT-MACHINE-1:worker_account=worker_beta --profile-structure-override SATROOT-MACHINE-1:worker_burn_amount=0 --profile-structure-override SATROOT-IDENTITY-1:holder_account=controller_a --profile-structure-override SATROOT-IDENTITY-1:next_holder=none --profile-structure-override SATROOT-IDENTITY-1:retire=false --channel stable --label "SATROOT Structure Override Catalog" --published-at 2026-06-29T00:00:00Z
1386
+ ```
1387
+
1388
+ For repeatable scenario generation, `bootstrap-demo-catalog` can also load a checked-in preset file and still accept CLI overrides on top:
1389
+
1390
+ ```bash
1391
+ satroot1 bootstrap-demo-catalog --scheme hmac-sha256 --release-key-id release-key --output-dir catalog_workspace_preset --preset-json examples/catalog_presets/ai_compute_catalog.json --label "SATROOT AI Compute Catalog Override"
1392
+ ```
1393
+
1394
+ For higher-level mixed-profile release packaging, the generic lane can also generate repeated releases directly from repeated demo-catalog presets and snapshot them into one reusable release collection:
1395
+
1396
+ ```bash
1397
+ satroot1 bootstrap-demo-release-collection --preset-json examples/catalog_presets/ai_compute_catalog.json --preset-json examples/catalog_presets/ai_compute_catalog.json --scheme hmac-sha256 --release-key-id release-key --output-dir demo_release_collection_workspace --label "SATROOT Demo Collection Override"
1398
+ ```
1399
+
1400
+ That same repeated-preset mixed-profile lane can bootstrap a signed release catalog publication in one step:
1401
+
1402
+ ```bash
1403
+ satroot1 bootstrap-demo-release-catalog-publication --preset-json examples/catalog_presets/ai_compute_catalog.json --preset-json examples/catalog_presets/ai_compute_catalog.json --bundle-scheme hmac-sha256 --release-key-id release-key --scheme hmac-sha256 --key-id catalog-key --release-label "SATROOT Demo Collection Override" --label "SATROOT Demo Release Catalog" --output-dir demo_release_catalog_publication
1404
+ ```
1405
+
1406
+ And one layer higher, it can bootstrap a signed release catalog index publication without separately invoking the collection or catalog steps:
1407
+
1408
+ ```bash
1409
+ satroot1 bootstrap-demo-release-catalog-index-publication --preset-json examples/catalog_presets/ai_compute_catalog.json --preset-json examples/catalog_presets/ai_compute_catalog.json --bundle-scheme hmac-sha256 --release-key-id release-key --catalog-scheme hmac-sha256 --catalog-key-id catalog-key --scheme hmac-sha256 --key-id index-key --catalog-label "SATROOT Demo Release Catalog" --label "SATROOT Demo Release Catalog Index" --output-dir demo_release_catalog_index_publication
1410
+ ```
1411
+
1412
+ Consume burn-on-use machine credit from a `SATROOT-MACHINE-1` ledger:
1413
+
1414
+ ```bash
1415
+ satroot1 consume-machine-credit signed_machine_events.json --signer worker_node --amount 1000 --scheme hmac-sha256 --signer-key-map-json signer_key_map.json --secrets-json secrets.json --include-state-hash --output consumed_machine_events.json
1416
+ ```
1417
+
1418
+ Archive a singleton receipt, identity, or license object into an archive account:
1419
+
1420
+ ```bash
1421
+ satroot1 archive-singleton-object signed_receipt_events.json --signer buyer --scheme hmac-sha256 --signer-key-map-json signer_key_map.json --secrets-json secrets.json --include-state-hash --output archived_receipt_events.json
1422
+ ```
1423
+
1424
+ Transfer a singleton receipt, identity, or license object to its next active holder:
1425
+
1426
+ ```bash
1427
+ satroot1 transfer-singleton-object signed_identity_events.json --signer node_alpha --to rotated_controller --scheme hmac-sha256 --signer-key-map-json signer_key_map.json --secrets-json secrets.json --include-state-hash --output transferred_identity_events.json
1428
+ ```
1429
+
1430
+ Retire an already archived singleton receipt, identity, or license object:
1431
+
1432
+ ```bash
1433
+ satroot1 retire-singleton-object archived_receipt_events.json --signer archive --scheme hmac-sha256 --signer-key-map-json signer_key_map.json --secrets-json secrets.json --include-state-hash --output retired_receipt_events.json
1434
+ ```
1435
+
1436
+ Scaffold a genesis record and emit a signed starter bundle in one step:
1437
+
1438
+ ```bash
1439
+ satroot1 bootstrap-genesis-bundle --symbol BUNDLE1 --name "SATROOT Bundle Asset" --scheme hmac-sha256 --profile SATROOT-MACHINE-1 --output-dir starter_bundle
1440
+ ```
1441
+
1442
+ Bootstrap the full Ed25519 workflow from a ledger in one step:
1443
+
1444
+ ```bash
1445
+ satroot1 bootstrap-ed25519-workflow examples/events_floor1.json --output-dir ed25519_bootstrap
1446
+ ```
1447
+
1448
+ Bootstrap the full HMAC workflow from a ledger in one step:
1449
+
1450
+ ```bash
1451
+ satroot1 bootstrap-hmac-workflow examples/events_floor1.json --output-dir hmac_bootstrap
1452
+ ```
1453
+
1454
+ Bootstrap and emit a full signed HMAC ledger bundle in one step:
1455
+
1456
+ ```bash
1457
+ satroot1 bootstrap-signed-ledger examples/events_floor1.json --scheme hmac-sha256 --output-dir signed_hmac_bundle
1458
+ ```
1459
+
1460
+ That bundle now includes `bundle_manifest.json` alongside the emitted signer/key material and ledger files, with per-file SHA-256 hashes for the exported artifacts and the full final SATROOT replay snapshot for downstream inspection.
1461
+
1462
+ For Ed25519 workflows, you can also emit a verifier-only bundle that excludes `private_keys.json` and records `verification_material_scope="public-only"` in the manifest:
1463
+
1464
+ ```bash
1465
+ satroot1 bootstrap-signed-ledger examples/events_floor1.json --scheme ed25519 --output-dir signed_ed25519_bundle --verifier-only
1466
+ ```
1467
+
1468
+ Verify a signed bundle directory end to end:
1469
+
1470
+ ```bash
1471
+ satroot1 verify-bundle signed_hmac_bundle
1472
+ ```
1473
+
1474
+ Read a bundle manifest summary without replaying the ledger:
1475
+
1476
+ ```bash
1477
+ satroot1 bundle-summary signed_hmac_bundle
1478
+ ```
1479
+
1480
+ Lint bundle structure without replaying the ledger:
1481
+
1482
+ ```bash
1483
+ satroot1 bundle-lint signed_hmac_bundle
1484
+ ```
1485
+
1486
+ Read a release publication summary without signature verification:
1487
+
1488
+ ```bash
1489
+ satroot1 release-summary stable_release
1490
+ ```
1491
+
1492
+ Lint release structure and referenced bundle manifests without signature verification:
1493
+
1494
+ ```bash
1495
+ satroot1 release-lint stable_release
1496
+ ```
1497
+
1498
+ Build a bundle index catalog from one or more bundle directories:
1499
+
1500
+ ```bash
1501
+ satroot1 build-bundle-index signed_hmac_bundle --output bundle_index.json
1502
+ ```
1503
+
1504
+ If the source bundles should remain strictly inside the SATROOT-MACHINE-1 lane, the machine-only wrapper rejects any non-machine bundle before writing the unsigned index:
1505
+
1506
+ ```bash
1507
+ satroot1 build-machine-bundle-index machine_bundle_alpha machine_bundle_beta --channel machine --label "SATROOT Machine Bundle Index" --published-at 2026-07-14T02:00:00Z --output machine_bundle_index.json
1508
+ ```
1509
+
1510
+ The stable-only lane now has the same guard for SATROOT-STABLE-1 bundle collections:
1511
+
1512
+ ```bash
1513
+ satroot1 build-stable-bundle-index stable_bundle_alpha stable_bundle_beta --channel stable --label "SATROOT Stable Bundle Index" --published-at 2026-07-15T02:00:00Z --output stable_bundle_index.json
1514
+ ```
1515
+
1516
+ Or drive the same bundle discovery and release metadata defaults from a preset:
1517
+
1518
+ ```bash
1519
+ satroot1 build-bundle-index --preset-json examples/bundle_index_presets/ai_compute_bundle_index.json --output bundle_index.json
1520
+ ```
1521
+
1522
+ Or discover bundle directories recursively under a parent artifacts folder:
1523
+
1524
+ ```bash
1525
+ satroot1 build-bundle-index --discover-under generated_artifacts --output bundle_index.json
1526
+ ```
1527
+
1528
+ If you want to scan first and then reuse the discovered bundle set deterministically, `inventory-artifacts` output can also feed that same build step:
1529
+
1530
+ ```bash
1531
+ satroot1 inventory-artifacts generated_artifacts > artifact_inventory.json
1532
+ satroot1 build-bundle-index --inventory-json artifact_inventory.json --output bundle_index.json
1533
+ ```
1534
+
1535
+ For a reusable lower-layer capture, you can also copy signed bundles into a checked-in collection and then point bundle-index or release commands at that collection directly:
1536
+
1537
+ ```bash
1538
+ satroot1 bootstrap-bundle-collection signed_hmac_bundle machine_bundle --output-dir bundle_collection
1539
+ satroot1 build-bundle-index --bundle-collection-dir bundle_collection --channel stable --label "Collection Bundle Index" --output bundle_index.json
1540
+ ```
1541
+
1542
+ Attach lightweight release metadata to a bundle index:
1543
+
1544
+ ```bash
1545
+ satroot1 build-bundle-index signed_hmac_bundle --channel stable --label "SATROOT FLOOR1 Demo" --published-at 2026-06-22T12:00:00Z --output bundle_index.json
1546
+ ```
1547
+
1548
+ Inspect that unsigned bundle index before signing it into a release:
1549
+
1550
+ ```bash
1551
+ satroot1 bundle-index-summary bundle_index.json
1552
+ ```
1553
+
1554
+ Lint the unsigned bundle index and its referenced nested manifests without needing a release manifest first:
1555
+
1556
+ ```bash
1557
+ satroot1 bundle-index-lint bundle_index.json
1558
+ ```
1559
+
1560
+ Build a signed release manifest from a bundle index:
1561
+
1562
+ ```bash
1563
+ satroot1 build-release-manifest bundle_index.json --scheme hmac-sha256 --key-id release-key --secret release-secret --output release_manifest.json
1564
+ ```
1565
+
1566
+ If that unsigned bundle index should remain machine-only, the matching manifest wrapper validates every referenced nested bundle before signing:
1567
+
1568
+ ```bash
1569
+ satroot1 build-machine-release-manifest machine_bundle_index.json --scheme hmac-sha256 --key-id release-key --secret release-secret --output machine_release_manifest.json
1570
+ ```
1571
+
1572
+ The stable-only lane now has a matching manifest wrapper that rejects any non-stable nested bundle:
1573
+
1574
+ ```bash
1575
+ satroot1 build-stable-release-manifest stable_bundle_index.json --scheme hmac-sha256 --key-id release-key --secret release-secret --output stable_release_manifest.json
1576
+ ```
1577
+
1578
+ Bootstrap reusable HMAC release-signing material:
1579
+
1580
+ ```bash
1581
+ satroot1 bootstrap-release-hmac --key-id release-key --output-dir release_hmac
1582
+ ```
1583
+
1584
+ Build a release manifest from generated HMAC release material:
1585
+
1586
+ ```bash
1587
+ satroot1 build-release-manifest bundle_index.json --scheme hmac-sha256 --key-id release-key --secrets-json release_hmac/release_secrets.json --output release_manifest.json
1588
+ ```
1589
+
1590
+ Publish a release directory with both `bundle_index.json` and `release_manifest.json` in one step:
1591
+
1592
+ ```bash
1593
+ satroot1 publish-release signed_hmac_bundle --output-dir stable_release --channel stable --label "SATROOT FLOOR1 Demo" --published-at 2026-06-26T12:00:00Z --scheme hmac-sha256 --key-id release-key --secrets-json release_hmac/release_secrets.json
1594
+ ```
1595
+
1596
+ For the machine-only release lane, `publish-machine-release` and `bootstrap-machine-release-publication` give the same convenience flow while enforcing SATROOT-MACHINE-1 bundle inputs:
1597
+
1598
+ ```bash
1599
+ satroot1 publish-machine-release machine_bundle_alpha machine_bundle_beta --output-dir machine_release --channel machine --label "SATROOT Machine Release" --published-at 2026-07-14T03:00:00Z --scheme hmac-sha256 --key-id release-key --secrets-json release_hmac/release_secrets.json
1600
+ ```
1601
+
1602
+ Those bundle-index and release commands can also take the root directory produced by `bootstrap-machine-demo-release` or `bootstrap-stable-demo-release`; SATROOT will automatically reuse the nested `bundle/` directory.
1603
+
1604
+ ```bash
1605
+ satroot1 bootstrap-machine-release-publication machine_bundle_alpha machine_bundle_beta --output-dir machine_release_bootstrap --channel machine --label "SATROOT Machine Release" --published-at 2026-07-14T03:00:00Z --scheme hmac-sha256 --key-id release-key
1606
+ ```
1607
+
1608
+ The stable-only lane now has matching release wrappers with SATROOT-STABLE-1 bundle validation preserved:
1609
+
1610
+ ```bash
1611
+ satroot1 publish-stable-release stable_bundle_alpha stable_bundle_beta --output-dir stable_release --channel stable --label "SATROOT Stable Release" --published-at 2026-07-15T03:00:00Z --scheme hmac-sha256 --key-id release-key --secret release-secret
1612
+ ```
1613
+
1614
+ ```bash
1615
+ satroot1 bootstrap-stable-release-publication stable_bundle_alpha stable_bundle_beta --output-dir stable_release_bootstrap --channel stable --label "SATROOT Stable Release" --published-at 2026-07-15T03:00:00Z --scheme hmac-sha256 --key-id release-key
1616
+ ```
1617
+
1618
+ That same release flow can also discover multiple bundle directories under a parent workspace:
1619
+
1620
+ ```bash
1621
+ satroot1 publish-release --discover-under generated_artifacts --output-dir catalog_release --channel stable --label "SATROOT Multi Bundle Demo" --published-at 2026-06-28T18:00:00Z --scheme hmac-sha256 --key-id release-key --secrets-json release_hmac/release_secrets.json
1622
+ ```
1623
+
1624
+ Or reuse a previously saved inventory report instead of repeating the directory scan:
1625
+
1626
+ ```bash
1627
+ satroot1 publish-release --inventory-json artifact_inventory.json --output-dir catalog_release --channel stable --label "SATROOT Multi Bundle Demo" --published-at 2026-06-28T18:00:00Z --scheme hmac-sha256 --key-id release-key --secrets-json release_hmac/release_secrets.json
1628
+ ```
1629
+
1630
+ And that same bundle discovery plus release metadata can come from the bundle-index preset:
1631
+
1632
+ ```bash
1633
+ satroot1 publish-release --preset-json examples/bundle_index_presets/ai_compute_bundle_index.json --output-dir catalog_release --scheme hmac-sha256 --key-id release-key --secrets-json release_hmac/release_secrets.json
1634
+ ```
1635
+
1636
+ Bootstrap release signing material and publish a ready-to-verify release directory in one step:
1637
+
1638
+ ```bash
1639
+ satroot1 bootstrap-release-publication starter_bundle --output-dir release_bootstrap --channel stable --label "SATROOT Starter Release" --published-at 2026-06-26T12:00:00Z --scheme hmac-sha256 --key-id release-key
1640
+ ```
1641
+
1642
+ For catalog-style packaging, you can point that bootstrap flow at a parent directory and let it discover nested bundles automatically:
1643
+
1644
+ ```bash
1645
+ satroot1 bootstrap-release-publication --discover-under generated_artifacts --output-dir catalog_bootstrap --channel stable --label "SATROOT Catalog Release" --published-at 2026-06-28T19:00:00Z --scheme hmac-sha256 --key-id release-key
1646
+ ```
1647
+
1648
+ That bootstrap path also accepts the same bundle-index preset:
1649
+
1650
+ ```bash
1651
+ satroot1 bootstrap-release-publication --preset-json examples/bundle_index_presets/ai_compute_bundle_index.json --output-dir catalog_bootstrap --scheme hmac-sha256 --key-id release-key
1652
+ ```
1653
+
1654
+ Build a higher-level release catalog from multiple signed release directories:
1655
+
1656
+ ```bash
1657
+ satroot1 build-release-catalog stable_release machine_release --channel stable --label "SATROOT Release Catalog" --published-at 2026-06-30T05:00:00Z --output release_catalog.json
1658
+ ```
1659
+
1660
+ That catalog build can also harvest the `release_dir` entries from a saved inventory report:
1661
+
1662
+ ```bash
1663
+ satroot1 build-release-catalog --inventory-json artifact_inventory.json --channel stable --label "SATROOT Release Catalog" --published-at 2026-06-30T05:00:00Z --output release_catalog.json
1664
+ ```
1665
+
1666
+ For reusable multi-release packaging, you can snapshot signed releases into a release collection and point the catalog layer at that saved set:
1667
+
1668
+ ```bash
1669
+ satroot1 bootstrap-release-collection stable_release machine_release --output-dir release_collection
1670
+ satroot1 build-release-catalog --release-collection-dir release_collection --channel stable --label "Collection Release Catalog" --output release_catalog.json
1671
+ ```
1672
+
1673
+ The stable and machine lanes now also have one-shot wrappers that generate multiple preset-backed demo release workspaces and then snapshot them into the same reusable release-collection shape:
1674
+
1675
+ ```bash
1676
+ satroot1 bootstrap-stable-demo-release-collection --preset-json examples/catalog_presets/stable_reference_catalog.json --preset-json examples/catalog_presets/stable_reference_catalog.json --scheme hmac-sha256 --release-key-id release-key --output-dir stable_release_collection_workspace --label "SATROOT Stable Collection Override"
1677
+ satroot1 bootstrap-machine-demo-release-collection --preset-json examples/catalog_presets/machine_compute_catalog.json --preset-json examples/catalog_presets/machine_compute_catalog.json --scheme hmac-sha256 --release-key-id release-key --output-dir machine_release_collection_workspace --label "SATROOT Machine Collection Override"
1678
+ ```
1679
+
1680
+ If you also want to bootstrap the signed release catalog publication immediately on top of those generated release collections, there are matching one-shot wrappers for that layer too:
1681
+
1682
+ ```bash
1683
+ satroot1 bootstrap-stable-demo-release-catalog-publication --preset-json examples/catalog_presets/stable_reference_catalog.json --preset-json examples/catalog_presets/stable_reference_catalog.json --bundle-scheme hmac-sha256 --release-key-id release-key --scheme hmac-sha256 --key-id catalog-key --release-label "Stable Collection Override" --label "Stable Demo Release Catalog" --output-dir stable_demo_release_catalog_publication
1684
+ satroot1 bootstrap-machine-demo-release-catalog-publication --preset-json examples/catalog_presets/machine_compute_catalog.json --preset-json examples/catalog_presets/machine_compute_catalog.json --bundle-scheme hmac-sha256 --release-key-id release-key --scheme hmac-sha256 --key-id catalog-key --release-label "Machine Collection Override" --label "Machine Demo Release Catalog" --output-dir machine_demo_release_catalog_publication
1685
+ ```
1686
+
1687
+ There are now matching one-shot wrappers for the next layer as well, so the same repeated demo presets can flow all the way up into a signed release catalog index publication:
1688
+
1689
+ ```bash
1690
+ satroot1 bootstrap-stable-demo-release-catalog-index-publication --preset-json examples/catalog_presets/stable_reference_catalog.json --preset-json examples/catalog_presets/stable_reference_catalog.json --bundle-scheme hmac-sha256 --release-key-id release-key --catalog-scheme hmac-sha256 --catalog-key-id catalog-key --scheme hmac-sha256 --key-id index-key --catalog-label "Stable Demo Release Catalog" --label "Stable Demo Release Catalog Index" --output-dir stable_demo_release_catalog_index_publication
1691
+ satroot1 bootstrap-machine-demo-release-catalog-index-publication --preset-json examples/catalog_presets/machine_compute_catalog.json --preset-json examples/catalog_presets/machine_compute_catalog.json --bundle-scheme hmac-sha256 --release-key-id release-key --catalog-scheme hmac-sha256 --catalog-key-id catalog-key --scheme hmac-sha256 --key-id index-key --catalog-label "Machine Demo Release Catalog" --label "Machine Demo Release Catalog Index" --output-dir machine_demo_release_catalog_index_publication
1692
+ ```
1693
+
1694
+ That same repeated-preset pattern now extends through the publication stack and publication network layers too:
1695
+
1696
+ ```bash
1697
+ satroot1 bootstrap-demo-publication-stack --preset-json examples/catalog_presets/ai_compute_catalog.json --preset-json examples/catalog_presets/machine_compute_catalog.json --scheme hmac-sha256 --release-key-id release-key --release-catalog-key-id catalog-key --label "SATROOT Demo Publication Stack" --output-dir demo_publication_stack
1698
+ satroot1 bootstrap-demo-publication-network --preset-json examples/catalog_presets/ai_compute_catalog.json --preset-json examples/catalog_presets/machine_compute_catalog.json --scheme hmac-sha256 --release-key-id release-key --release-catalog-key-id catalog-key --release-catalog-index-key-id index-key --catalog-label "SATROOT Demo Publication Stack" --label "SATROOT Demo Publication Network" --output-dir demo_publication_network
1699
+ satroot1 bootstrap-singleton-demo-publication-stack --profile SATROOT-RECEIPT-1 --preset-json singleton_alpha.json --preset-json singleton_beta.json --scheme hmac-sha256 --release-key-id release-key --release-catalog-key-id catalog-key --label "Singleton Receipt Publication Stack" --output-dir singleton_demo_publication_stack
1700
+ satroot1 bootstrap-singleton-demo-publication-network --profile SATROOT-IDENTITY-1 --preset-json singleton_alpha.json --preset-json singleton_beta.json --scheme hmac-sha256 --release-key-id release-key --release-catalog-key-id catalog-key --release-catalog-index-key-id index-key --catalog-label "Singleton Identity Publication Stack" --label "Singleton Identity Publication Network" --output-dir singleton_demo_publication_network
1701
+ satroot1 bootstrap-singleton-demo-publication-catalog-workspace --profile SATROOT-LICENSE-1 --preset-json singleton_alpha.json --preset-json singleton_beta.json --scheme hmac-sha256 --release-key-id release-key --publication-descriptor-index-key-id descriptor-key --publication-metadata-key-id metadata-key --publication-metadata-catalog-key-id catalog-key --descriptor-index-label "Singleton License Workspace Descriptor Index" --publication-metadata-catalog-label "Singleton License Workspace Metadata Catalog" --output-dir singleton_demo_publication_catalog_workspace
1702
+ satroot1 bootstrap-singleton-demo-publication-registry-workspace --profile SATROOT-RECEIPT-1 --preset-json singleton_alpha.json --preset-json singleton_beta.json --scheme hmac-sha256 --release-key-id release-key --release-catalog-key-id catalog-key --release-catalog-index-key-id index-key --publication-descriptor-index-key-id descriptor-key --publication-metadata-key-id metadata-key --publication-metadata-catalog-key-id catalog-key --publication-registry-key-id registry-key --publication-registry-label "Singleton Receipt Publication Registry" --output-dir singleton_demo_publication_registry_workspace
1703
+ satroot1 bootstrap-stable-demo-publication-stack --preset-json examples/catalog_presets/stable_reference_catalog.json --preset-json examples/catalog_presets/stable_reference_catalog.json --scheme hmac-sha256 --release-key-id release-key --release-catalog-key-id catalog-key --label "Stable Demo Publication Stack" --output-dir stable_demo_publication_stack
1704
+ satroot1 bootstrap-machine-demo-publication-stack --preset-json examples/catalog_presets/machine_compute_catalog.json --preset-json examples/catalog_presets/machine_compute_catalog.json --scheme hmac-sha256 --release-key-id release-key --release-catalog-key-id catalog-key --label "Machine Demo Publication Stack" --output-dir machine_demo_publication_stack
1705
+ satroot1 bootstrap-stable-demo-publication-network --preset-json examples/catalog_presets/stable_reference_catalog.json --preset-json examples/catalog_presets/stable_reference_catalog.json --scheme hmac-sha256 --release-key-id release-key --release-catalog-key-id catalog-key --release-catalog-index-key-id index-key --catalog-label "Stable Demo Publication Stack" --label "Stable Demo Publication Network" --output-dir stable_demo_publication_network
1706
+ satroot1 bootstrap-machine-demo-publication-network --preset-json examples/catalog_presets/machine_compute_catalog.json --preset-json examples/catalog_presets/machine_compute_catalog.json --scheme hmac-sha256 --release-key-id release-key --release-catalog-key-id catalog-key --release-catalog-index-key-id index-key --catalog-label "Machine Demo Publication Stack" --label "Machine Demo Publication Network" --output-dir machine_demo_publication_network
1707
+ ```
1708
+
1709
+ And the same repeated demo presets can now feed directly into reusable publication catalog workspaces as well:
1710
+
1711
+ ```bash
1712
+ satroot1 bootstrap-demo-publication-catalog-workspace --preset-json examples/catalog_presets/ai_compute_catalog.json --preset-json examples/catalog_presets/machine_compute_catalog.json --scheme hmac-sha256 --release-key-id release-key --publication-descriptor-index-key-id descriptor-key --publication-metadata-key-id metadata-key --publication-metadata-catalog-key-id catalog-key --release-label "SATROOT Demo Catalog Release Override" --descriptor-index-label "SATROOT Demo Workspace Descriptor Index" --publication-metadata-catalog-label "SATROOT Demo Workspace Metadata Catalog" --output-dir demo_publication_catalog_workspace
1713
+ satroot1 bootstrap-stable-demo-publication-catalog-workspace --preset-json examples/catalog_presets/stable_reference_catalog.json --preset-json examples/catalog_presets/stable_reference_catalog.json --scheme hmac-sha256 --release-key-id release-key --publication-descriptor-index-key-id descriptor-key --publication-metadata-key-id metadata-key --publication-metadata-catalog-key-id catalog-key --release-label "Stable Demo Catalog Release Override" --descriptor-index-label "Stable Demo Workspace Descriptor Index" --publication-metadata-catalog-label "Stable Demo Workspace Metadata Catalog" --output-dir stable_demo_publication_catalog_workspace
1714
+ satroot1 bootstrap-machine-demo-publication-catalog-workspace --preset-json examples/catalog_presets/machine_compute_catalog.json --preset-json examples/catalog_presets/machine_compute_catalog.json --scheme hmac-sha256 --release-key-id release-key --publication-descriptor-index-key-id descriptor-key --publication-metadata-key-id metadata-key --publication-metadata-catalog-key-id catalog-key --release-label "Machine Demo Catalog Release Override" --descriptor-index-label "Machine Demo Workspace Descriptor Index" --publication-metadata-catalog-label "Machine Demo Workspace Metadata Catalog" --output-dir machine_demo_publication_catalog_workspace
1715
+ ```
1716
+
1717
+ And that same repeated-preset path now reaches the registry workspace layer too:
1718
+
1719
+ ```bash
1720
+ satroot1 bootstrap-demo-publication-registry-workspace --preset-json examples/catalog_presets/ai_compute_catalog.json --preset-json examples/catalog_presets/machine_compute_catalog.json --scheme hmac-sha256 --release-key-id release-key --release-catalog-key-id catalog-key --release-catalog-index-key-id index-key --publication-descriptor-index-key-id descriptor-key --publication-metadata-key-id metadata-key --publication-metadata-catalog-key-id catalog-key --publication-registry-key-id registry-key --release-label "SATROOT Demo Registry Release Override" --release-catalog-label "SATROOT Demo Registry Publication Stack" --release-catalog-index-label "SATROOT Demo Registry Publication Network" --descriptor-index-label "SATROOT Demo Registry Descriptor Index" --publication-metadata-catalog-label "SATROOT Demo Registry Metadata Catalog" --publication-registry-label "SATROOT Demo Publication Registry" --output-dir demo_publication_registry_workspace
1721
+ satroot1 bootstrap-stable-demo-publication-registry-workspace --preset-json examples/catalog_presets/stable_reference_catalog.json --preset-json examples/catalog_presets/stable_reference_catalog.json --scheme hmac-sha256 --release-key-id release-key --release-catalog-key-id catalog-key --release-catalog-index-key-id index-key --publication-descriptor-index-key-id descriptor-key --publication-metadata-key-id metadata-key --publication-metadata-catalog-key-id catalog-key --publication-registry-key-id registry-key --release-label "Stable Demo Registry Release Override" --release-catalog-label "Stable Demo Registry Publication Stack" --release-catalog-index-label "Stable Demo Registry Publication Network" --descriptor-index-label "Stable Demo Registry Descriptor Index" --publication-metadata-catalog-label "Stable Demo Registry Metadata Catalog" --publication-registry-label "Stable Demo Publication Registry" --output-dir stable_demo_publication_registry_workspace
1722
+ satroot1 bootstrap-machine-demo-publication-registry-workspace --preset-json examples/catalog_presets/machine_compute_catalog.json --preset-json examples/catalog_presets/machine_compute_catalog.json --scheme hmac-sha256 --release-key-id release-key --release-catalog-key-id catalog-key --release-catalog-index-key-id index-key --publication-descriptor-index-key-id descriptor-key --publication-metadata-key-id metadata-key --publication-metadata-catalog-key-id catalog-key --publication-registry-key-id registry-key --release-label "Machine Demo Registry Release Override" --release-catalog-label "Machine Demo Registry Publication Stack" --release-catalog-index-label "Machine Demo Registry Publication Network" --descriptor-index-label "Machine Demo Registry Descriptor Index" --publication-metadata-catalog-label "Machine Demo Registry Metadata Catalog" --publication-registry-label "Machine Demo Publication Registry" --output-dir machine_demo_publication_registry_workspace
1723
+ ```
1724
+
1725
+ Those release-catalog flows also accept the generated release files directly, so you can mix `release_manifest.json` and `bundle_index.json` inputs when that is what you already have on hand:
1726
+
1727
+ ```bash
1728
+ satroot1 bootstrap-release-catalog-publication stable_release/bundle_index.json machine_release/release_manifest.json --output-dir release_catalog_bootstrap --channel stable --label "SATROOT Release Catalog" --published-at 2026-06-30T05:00:00Z --scheme hmac-sha256 --key-id catalog-key
1729
+ ```
1730
+
1731
+ Publish a signed release catalog directory in one step:
1732
+
1733
+ ```bash
1734
+ satroot1 publish-release-catalog stable_release machine_release --output-dir release_catalog_pub --channel stable --label "SATROOT Release Catalog" --published-at 2026-06-30T05:00:00Z --scheme hmac-sha256 --key-id catalog-key --secrets-json release_hmac/release_secrets.json
1735
+ ```
1736
+
1737
+ Or bootstrap fresh signing material for that release catalog publication:
1738
+
1739
+ ```bash
1740
+ satroot1 bootstrap-release-catalog-publication stable_release machine_release --output-dir release_catalog_bootstrap --channel stable --label "SATROOT Release Catalog" --published-at 2026-06-30T05:00:00Z --scheme hmac-sha256 --key-id catalog-key
1741
+ ```
1742
+
1743
+ Those lower release commands also accept `--bundle-collection-dir`, so the same saved bundle set can drive both `publish-release` and `bootstrap-release-publication` without repeating discovery flags or long bundle lists.
1744
+
1745
+ At the next layer up, `build-release-catalog`, `publish-release-catalog`, and `bootstrap-release-catalog-publication` also accept `--release-collection-dir`, including the machine and stable wrappers, so the same saved release set can be reused without repeating release discovery or long release lists.
1746
+
1747
+ They also accept generated demo-catalog workspace roots, or a workspace `summary.json`, and automatically reuse the nested `release/` directory when you point them at those generated artifacts directly.
1748
+
1749
+ For repeatable multi-release packaging, the release-catalog commands can also load a checked-in preset file and still accept CLI overrides on top:
1750
+
1751
+ ```bash
1752
+ satroot1 bootstrap-release-catalog-publication --preset-json examples/release_catalog_presets/ai_compute_release_stack.json --output-dir release_catalog_bootstrap --label "SATROOT AI Compute Release Stack Override" --scheme hmac-sha256 --key-id catalog-key
1753
+ ```
1754
+
1755
+ For a higher-level network of signed release catalogs, you can build and publish a release-catalog index the same way:
1756
+
1757
+ ```bash
1758
+ satroot1 build-release-catalog-index release_catalog_bootstrap another_release_catalog --channel network --label "SATROOT Catalog Network" --published-at 2026-07-02T05:00:00Z --output release_catalog_index.json
1759
+ satroot1 bootstrap-release-catalog-index-publication --preset-json examples/release_catalog_index_presets/ai_compute_catalog_network.json --output-dir release_catalog_index_bootstrap --label "SATROOT AI Compute Catalog Network Override" --scheme hmac-sha256 --key-id index-key
1760
+ ```
1761
+
1762
+ Saved inventory reports work at that layer too, using the discovered `release_catalog_dir` entries:
1763
+
1764
+ ```bash
1765
+ satroot1 build-release-catalog-index --inventory-json artifact_inventory.json --channel network --label "SATROOT Catalog Network" --published-at 2026-07-02T05:00:00Z --output release_catalog_index.json
1766
+ ```
1767
+
1768
+ For reusable higher-level packaging, you can also snapshot signed release catalogs into a release-catalog collection and point the index layer at that saved set:
1769
+
1770
+ ```bash
1771
+ satroot1 bootstrap-release-catalog-collection release_catalog_bootstrap another_release_catalog --output-dir release_catalog_collection
1772
+ satroot1 build-release-catalog-index --release-catalog-collection-dir release_catalog_collection --channel network --label "Collection Catalog Network" --output release_catalog_index.json
1773
+ ```
1774
+
1775
+ That higher-level index lane likewise accepts either the signed catalog directory or the generated `release_catalog.json` / `release_catalog_manifest.json` files:
1776
+
1777
+ ```bash
1778
+ satroot1 bootstrap-release-catalog-index-publication release_catalog_bootstrap/release_catalog.json another_release_catalog/release_catalog_manifest.json --output-dir release_catalog_index_bootstrap --channel network --label "SATROOT Catalog Network" --published-at 2026-07-02T05:00:00Z --scheme hmac-sha256 --key-id index-key
1779
+ ```
1780
+
1781
+ Those release-catalog-index commands also accept `--release-catalog-collection-dir`, including the machine and stable wrappers, so the same saved catalog set can drive `build-release-catalog-index`, `publish-release-catalog-index`, and `bootstrap-release-catalog-index-publication` without repeating catalog discovery or long catalog lists.
1782
+
1783
+ They likewise accept publication-stack workspace roots, or a stack `summary.json`, and automatically reuse the nested `release_catalog/` directory.
1784
+
1785
+ For a single end-to-end workspace, `bootstrap-publication-stack` can take multiple demo-catalog presets plus an optional release-catalog preset and emit catalog workspaces and a top-level release catalog in one shot:
1786
+
1787
+ ```bash
1788
+ satroot1 bootstrap-publication-stack --catalog-preset-json examples/catalog_presets/ai_compute_catalog.json --scheme hmac-sha256 --release-key-id release-key --release-catalog-preset-json examples/release_catalog_presets/ai_compute_release_stack.json --release-catalog-key-id catalog-key --output-dir publication_stack --label "SATROOT Stack Override"
1789
+ ```
1790
+
1791
+ If you want the whole stack described in one checked-in file, `bootstrap-publication-stack` also accepts a dedicated stack preset:
1792
+
1793
+ ```bash
1794
+ satroot1 bootstrap-publication-stack --stack-preset-json examples/stack_presets/ai_compute_publication_stack.json --scheme hmac-sha256 --release-key-id release-key --release-catalog-key-id catalog-key --output-dir publication_stack --label "SATROOT Stack Override"
1795
+ ```
1796
+
1797
+ For a machine-only lane on the same preset format, `bootstrap-machine-publication-stack` validates that every nested catalog preset resolves to `SATROOT-MACHINE-1` only:
1798
+
1799
+ ```bash
1800
+ satroot1 bootstrap-machine-publication-stack --stack-preset-json examples/stack_presets/machine_compute_publication_stack.json --scheme hmac-sha256 --release-key-id release-key --release-catalog-key-id catalog-key --output-dir machine_publication_stack --label "Machine Stack Override"
1801
+ ```
1802
+
1803
+ There is now a matching stable-only lane that validates every nested catalog preset resolves to `SATROOT-STABLE-1` only:
1804
+
1805
+ ```bash
1806
+ satroot1 bootstrap-stable-publication-stack --stack-preset-json examples/stack_presets/stable_reference_publication_stack.json --scheme hmac-sha256 --release-key-id release-key --release-catalog-key-id catalog-key --output-dir stable_publication_stack --label "Stable Stack Override"
1807
+ ```
1808
+
1809
+ That same stack preset shape can also point at a previously copied `catalog_workspace_collection_dir` when you want to reuse an already-frozen set of generated demo catalog workspaces. Exported stack presets preserve that collection reference even when they also emit nested catalog presets, so round-tripped preset trees keep provenance without making the collection itself the execution input.
1810
+
1811
+ There is now a checked-in collection-backed companion preset for that flow too:
1812
+
1813
+ ```bash
1814
+ satroot1 bootstrap-publication-stack --stack-preset-json examples/stack_presets/ai_compute_publication_stack_collection_backed.json --scheme hmac-sha256 --release-key-id release-key --release-catalog-key-id catalog-key --output-dir publication_stack_collection_backed --label "SATROOT Collection-Backed Stack Override"
1815
+ ```
1816
+
1817
+ To generate multiple stack workspaces and a top-level signed release-catalog index in one pass, use `bootstrap-publication-network` with one or more stack presets:
1818
+
1819
+ ```bash
1820
+ satroot1 bootstrap-publication-network --stack-preset-json examples/stack_presets/ai_compute_publication_stack.json --scheme hmac-sha256 --release-key-id release-key --release-catalog-key-id catalog-key --release-catalog-index-preset-json examples/release_catalog_index_presets/ai_compute_catalog_network.json --release-catalog-index-key-id index-key --output-dir publication_network --label "SATROOT Network Override"
1821
+ ```
1822
+
1823
+ If you want the whole network described in one checked-in file, `bootstrap-publication-network` also accepts a dedicated network preset:
1824
+
1825
+ ```bash
1826
+ satroot1 bootstrap-publication-network --network-preset-json examples/network_presets/ai_compute_publication_network.json --scheme hmac-sha256 --release-key-id release-key --release-catalog-key-id catalog-key --release-catalog-index-key-id index-key --output-dir publication_network --label "SATROOT Network Override"
1827
+ ```
1828
+
1829
+ That same network preset shape can also point at a previously copied `publication_stack_collection_dir` when you want to reuse an already-frozen set of generated stack workspaces. Exported network presets preserve that collection reference even when they also emit nested stack presets, so round-tripped preset trees keep provenance without making the collection itself the execution input.
1830
+
1831
+ There is now a checked-in collection-backed companion preset for that flow too:
1832
+
1833
+ ```bash
1834
+ satroot1 bootstrap-publication-network --network-preset-json examples/network_presets/ai_compute_publication_network_collection_backed.json --scheme hmac-sha256 --release-key-id release-key --release-catalog-key-id catalog-key --release-catalog-index-key-id index-key --output-dir publication_network_collection_backed --label "SATROOT Collection-Backed Network Override"
1835
+ ```
1836
+
1837
+ If you want to freeze already-generated publication networks for reuse one layer higher, there are matching collection commands there too:
1838
+
1839
+ ```bash
1840
+ satroot1 bootstrap-publication-network-collection publication_network_alpha publication_network_beta --output-dir publication_network_collection
1841
+ ```
1842
+
1843
+ There is also a machine-only convenience wrapper that validates every nested stack preset stays on the machine lane:
1844
+
1845
+ ```bash
1846
+ satroot1 bootstrap-machine-publication-network --network-preset-json examples/network_presets/machine_compute_publication_network.json --scheme hmac-sha256 --release-key-id release-key --release-catalog-key-id catalog-key --release-catalog-index-key-id index-key --output-dir machine_publication_network --label "Machine Network Override"
1847
+ ```
1848
+
1849
+ And there is a stable-only wrapper that does the same for `SATROOT-STABLE-1` stack presets:
1850
+
1851
+ ```bash
1852
+ satroot1 bootstrap-stable-publication-network --network-preset-json examples/network_presets/stable_reference_publication_network.json --scheme hmac-sha256 --release-key-id release-key --release-catalog-key-id catalog-key --release-catalog-index-key-id index-key --output-dir stable_publication_network --label "Stable Network Override"
1853
+ ```
1854
+
1855
+ If you already have generated demo catalog workspaces and just want to consolidate them into one signed publication stack, use `publish-publication-stack`:
1856
+
1857
+ ```bash
1858
+ satroot1 publish-publication-stack generated_catalogs/stable_workspace generated_catalogs/machine_workspace --scheme hmac-sha256 --release-catalog-key-id catalog-key --output-dir publication_stack_from_existing --label "Published Existing Stack"
1859
+ ```
1860
+
1861
+ ```bash
1862
+ satroot1 publish-publication-stack --inventory-json artifact_inventory.json --scheme hmac-sha256 --release-catalog-key-id catalog-key --output-dir publication_stack_from_existing --label "Inventory Published Stack"
1863
+ ```
1864
+
1865
+ ```bash
1866
+ satroot1 publish-publication-stack --catalog-workspace-collection-dir generated_catalog_workspace_collection --scheme hmac-sha256 --release-catalog-key-id catalog-key --output-dir publication_stack_from_collection --label "Collection Published Stack"
1867
+ ```
1868
+
1869
+ That collection flag also accepts `generated_catalog_workspace_collection/summary.json` directly, and exported stack presets normalize the preserved provenance back to the collection root.
1870
+
1871
+ That same publish lane can now also load a stack preset that preserves source `catalog_workspace_dirs`, which makes exported stack presets reusable for both bootstrap and publish workflows:
1872
+
1873
+ ```bash
1874
+ satroot1 publish-publication-stack --preset-json exported_stack.json --scheme hmac-sha256 --release-catalog-key-id catalog-key --output-dir publication_stack_from_preset --label "Published Stack From Preset"
1875
+ ```
1876
+
1877
+ A checked-in example of that publish-oriented preset shape lives at `examples/stack_presets/ai_compute_publication_stack_publish.json`.
1878
+
1879
+ For existing machine-only catalog workspaces, `publish-machine-publication-stack` applies the same publish flow but rejects any nested bundle set that is not purely `SATROOT-MACHINE-1`:
1880
+
1881
+ ```bash
1882
+ satroot1 publish-machine-publication-stack generated_machine_catalogs/catalog_alpha generated_machine_catalogs/catalog_beta --scheme hmac-sha256 --release-catalog-key-id catalog-key --output-dir machine_publication_stack_from_existing --label "Published Machine Stack"
1883
+ ```
1884
+
1885
+ There is now a matching stable-only wrapper for existing `SATROOT-STABLE-1` catalog workspaces:
1886
+
1887
+ ```bash
1888
+ satroot1 publish-stable-publication-stack generated_stable_catalogs/catalog_alpha generated_stable_catalogs/catalog_beta --scheme hmac-sha256 --release-catalog-key-id catalog-key --output-dir stable_publication_stack_from_existing --label "Published Stable Stack"
1889
+ ```
1890
+
1891
+ If you want to freeze a reusable set of generated stack workspaces for later network assembly, use `bootstrap-publication-stack-collection`:
1892
+
1893
+ ```bash
1894
+ satroot1 bootstrap-publication-stack-collection generated_stacks/stack_alpha generated_stacks/stack_beta --output-dir publication_stack_collection
1895
+ ```
1896
+
1897
+ One layer lower, if you want to freeze a reusable set of generated demo catalog workspaces for later stack assembly, use `bootstrap-demo-catalog-workspace-collection`:
1898
+
1899
+ ```bash
1900
+ satroot1 bootstrap-demo-catalog-workspace-collection generated_catalogs/stable_workspace generated_catalogs/machine_workspace --output-dir generated_catalog_workspace_collection
1901
+ ```
1902
+
1903
+ Once you start deriving publication catalog workspaces themselves, you can freeze those higher-level descriptor-plus-metadata assemblies for later reuse with `bootstrap-publication-catalog-workspace-collection`:
1904
+
1905
+ ```bash
1906
+ satroot1 bootstrap-publication-catalog-workspace-collection generated_publication_catalogs/catalog_alpha generated_publication_catalogs/catalog_beta --output-dir publication_catalog_workspace_collection
1907
+ ```
1908
+
1909
+ At the top workspace layer, `bootstrap-publication-registry-workspace-collection` does the same for fully assembled registry workspaces when you want to preserve reusable end-to-end publication roots:
1910
+
1911
+ ```bash
1912
+ satroot1 bootstrap-publication-registry-workspace-collection generated_publication_registries/registry_alpha generated_publication_registries/registry_beta --output-dir publication_registry_workspace_collection
1913
+ ```
1914
+
1915
+ If you already have generated publication stack workspaces and want a top-level signed network without regenerating the nested stacks, use `publish-publication-network`:
1916
+
1917
+ ```bash
1918
+ satroot1 publish-publication-network generated_stacks/stack_alpha generated_stacks/stack_beta --scheme hmac-sha256 --release-catalog-index-key-id index-key --output-dir publication_network_from_existing --label "Published Existing Network"
1919
+ ```
1920
+
1921
+ ```bash
1922
+ satroot1 publish-publication-network --inventory-json artifact_inventory.json --scheme hmac-sha256 --release-catalog-index-key-id index-key --output-dir publication_network_from_existing --label "Inventory Published Network"
1923
+ ```
1924
+
1925
+ ```bash
1926
+ satroot1 publish-publication-network --publication-stack-collection-dir publication_stack_collection --scheme hmac-sha256 --release-catalog-index-key-id index-key --output-dir publication_network_from_collection --label "Collection Published Network"
1927
+ ```
1928
+
1929
+ The `--publication-stack-collection-dir` flag likewise accepts `publication_stack_collection/summary.json`, while exported network presets continue to preserve the collection root rather than the summary file path.
1930
+
1931
+ And because exported network presets now preserve source `publication_stack_dirs`, the same checked-in preset can also drive a publish-only consolidation flow:
1932
+
1933
+ ```bash
1934
+ satroot1 publish-publication-network --preset-json exported_network.json --scheme hmac-sha256 --release-catalog-index-key-id index-key --output-dir publication_network_from_preset --label "Published Network From Preset"
1935
+ ```
1936
+
1937
+ There is a matching checked-in example at `examples/network_presets/ai_compute_publication_network_publish.json`.
1938
+
1939
+ For existing machine-only stack workspaces, `publish-machine-publication-network` enforces the same SATROOT-MACHINE-1-only constraint across every nested catalog workspace:
1940
+
1941
+ ```bash
1942
+ satroot1 publish-machine-publication-network generated_machine_stacks/stack_alpha generated_machine_stacks/stack_beta --scheme hmac-sha256 --release-catalog-index-key-id index-key --output-dir machine_publication_network_from_existing --label "Published Machine Network"
1943
+ ```
1944
+
1945
+ And there is now a stable-only wrapper for existing `SATROOT-STABLE-1` publication stack workspaces:
1946
+
1947
+ ```bash
1948
+ satroot1 publish-stable-publication-network generated_stable_stacks/stack_alpha generated_stable_stacks/stack_beta --scheme hmac-sha256 --release-catalog-index-key-id index-key --output-dir stable_publication_network_from_existing --label "Published Stable Network"
1949
+ ```
1950
+
1951
+ If you already have a publication descriptor index and matching publication metadata catalog publication, you can wrap them back into a reusable catalog workspace with `publish-publication-catalog-workspace`:
1952
+
1953
+ ```bash
1954
+ satroot1 publish-publication-catalog-workspace publication_descriptor_index publication_metadata_catalog --output-dir publication_catalog_workspace_from_existing
1955
+ ```
1956
+
1957
+ ```bash
1958
+ satroot1 publish-publication-catalog-workspace --inventory-json artifact_inventory.json --output-dir publication_catalog_workspace_from_existing
1959
+ ```
1960
+
1961
+ If those source publication directories already live in an exported publication-registry preset, the same command can load them directly:
1962
+
1963
+ ```bash
1964
+ satroot1 publish-publication-catalog-workspace --preset-json exported_registry.json --output-dir publication_catalog_workspace_from_preset
1965
+ ```
1966
+
1967
+ For a machine-only publication lane, `publish-machine-publication-catalog-workspace` looks for at least one nested demo-catalog descriptor whose `bundle_profiles` are entirely `SATROOT-MACHINE-1` and preserves that source machine workspace provenance in the published summary:
1968
+
1969
+ ```bash
1970
+ satroot1 publish-machine-publication-catalog-workspace machine_publication_descriptor_index machine_publication_metadata_catalog --output-dir machine_publication_catalog_workspace_from_existing
1971
+ ```
1972
+
1973
+ There is now a matching stable-only catalog wrapper that requires the descriptor and metadata lanes to resolve back to `SATROOT-STABLE-1` sources:
1974
+
1975
+ ```bash
1976
+ satroot1 publish-stable-publication-catalog-workspace stable_publication_descriptor_index stable_publication_metadata_catalog --output-dir stable_publication_catalog_workspace_from_existing
1977
+ ```
1978
+
1979
+ If you already have a publication catalog workspace and just want to bind it to a release-catalog-index source without regenerating the descriptor or metadata lanes, use `publish-publication-registry-workspace`:
1980
+
1981
+ ```bash
1982
+ satroot1 publish-publication-registry-workspace publication_catalog_workspace --publication-network-dir publication_network --scheme hmac-sha256 --publication-registry-key-id registry-key --output-dir publication_registry_workspace_from_existing --label "Published Existing Registry Workspace"
1983
+ ```
1984
+
1985
+ ```bash
1986
+ satroot1 publish-publication-registry-workspace --inventory-json artifact_inventory.json --scheme hmac-sha256 --publication-registry-key-id registry-key --output-dir publication_registry_workspace_from_existing --label "Inventory Published Registry Workspace"
1987
+ ```
1988
+
1989
+ ```bash
1990
+ satroot1 publish-publication-registry-workspace --publication-catalog-workspace-collection-dir publication_catalog_workspace_collection/summary.json --publication-network-collection-dir publication_network_collection/summary.json --scheme hmac-sha256 --publication-registry-key-id registry-key --output-dir publication_registry_workspace_from_collection --label "Collection Published Registry Workspace"
1991
+ ```
1992
+
1993
+ Both collection flags also accept the collection directory itself, and any later exported registry-workspace preset preserves the collection root rather than the nested `summary.json` path.
1994
+
1995
+ That publish wrapper can also load an exported registry-workspace preset for the source catalog workspace, optional network/index source, and publication-registry metadata defaults:
1996
+
1997
+ ```bash
1998
+ satroot1 publish-publication-registry-workspace --preset-json exported_registry_workspace.json --scheme hmac-sha256 --publication-registry-key-id registry-key --output-dir publication_registry_workspace_from_preset --label "Published Registry Workspace From Preset"
1999
+ ```
2000
+
2001
+ If that exported preset carries a nested `publication_network_preset` instead of a direct `publication_network_dir`, the publish wrapper can materialize the copied `publication_network/` for you as long as you also provide the nested release signing key ids:
2002
+
2003
+ ```bash
2004
+ satroot1 publish-publication-registry-workspace --preset-json exported_registry_workspace_with_network.json --scheme hmac-sha256 --release-key-id release-key --release-catalog-key-id catalog-key --release-catalog-index-key-id index-key --publication-registry-key-id registry-key --output-dir publication_registry_workspace_from_nested_preset --label "Published Registry Workspace From Nested Preset"
2005
+ ```
2006
+
2007
+ If that source catalog workspace is machine-validated, `publish-machine-publication-registry-workspace` carries forward the machine publication catalog provenance as well:
2008
+
2009
+ ```bash
2010
+ satroot1 publish-machine-publication-registry-workspace machine_publication_catalog_workspace --publication-network-dir publication_network --scheme hmac-sha256 --publication-registry-key-id registry-key --output-dir machine_publication_registry_workspace_from_existing --label "Published Machine Registry Workspace"
2011
+ ```
2012
+
2013
+ And there is a stable-only companion that enforces stable catalog and release-catalog-index provenance before signing the top-level registry:
2014
+
2015
+ ```bash
2016
+ satroot1 publish-stable-publication-registry-workspace stable_publication_catalog_workspace --publication-network-dir stable_publication_network --scheme hmac-sha256 --publication-registry-key-id registry-key --output-dir stable_publication_registry_workspace_from_existing --label "Published Stable Registry Workspace"
2017
+ ```
2018
+
2019
+ To scan a generated tree and see which SATROOT bundles, releases, catalogs, indexes, registries, and workspaces are present, use `inventory-artifacts`:
2020
+
2021
+ ```bash
2022
+ satroot1 inventory-artifacts publication_network
2023
+ ```
2024
+
2025
+ If you only want to report artifacts rooted directly at the given path and skip nested directories, add `--non-recursive`:
2026
+
2027
+ ```bash
2028
+ satroot1 inventory-artifacts publication_network --non-recursive
2029
+ ```
2030
+
2031
+ Those saved inventory reports can be reused directly by `build-bundle-index`, `publish-release`, `bootstrap-release-publication`, `build-release-catalog`, `publish-release-catalog`, `bootstrap-release-catalog-publication`, `build-release-catalog-index`, `publish-release-catalog-index`, `bootstrap-release-catalog-index-publication`, `publish-publication-stack`, `publish-publication-network`, `publish-publication-catalog-workspace`, `publish-publication-registry-workspace`, `build-publication-descriptor-index`, `bootstrap-publication-descriptor-index-publication`, `build-publication-metadata-catalog`, `bootstrap-publication-metadata-catalog-publication`, `build-publication-registry`, `bootstrap-publication-registry-publication`, `bootstrap-publication-catalog-workspace`, and `bootstrap-publication-registry-workspace` via `--inventory-json`.
2032
+
2033
+ To derive a reusable preset back from a generated demo catalog workspace:
2034
+
2035
+ ```bash
2036
+ satroot1 export-demo-catalog-preset catalog_workspace --output exported_catalog.json
2037
+ ```
2038
+
2039
+ This export also accepts `catalog_workspace/summary.json` directly.
2040
+
2041
+ To derive a reusable bundle-index preset back from either a release directory or an existing `bundle_index.json`:
2042
+
2043
+ ```bash
2044
+ satroot1 export-bundle-index-preset release_bootstrap --output exported_bundle_index.json
2045
+ ```
2046
+
2047
+ That export also accepts `release_manifest.json` directly.
2048
+
2049
+ If that bundle index was originally built from `--bundle-collection-dir`, the exported preset now preserves that `bundle_collection_dir` reference instead of expanding back to explicit `bundle_dirs`.
2050
+
2051
+ To derive reusable presets back from higher-level signed catalog artifacts, either from the directory or the underlying JSON payload:
2052
+
2053
+ ```bash
2054
+ satroot1 export-release-catalog-preset publication_stack/release_catalog --output exported_release_catalog.json
2055
+ satroot1 export-release-catalog-index-preset publication_network/release_catalog_index/release_catalog_index.json --output exported_release_catalog_index.json
2056
+ ```
2057
+
2058
+ The release catalog and release catalog index preset exports also accept their matching `*_manifest.json` files directly.
2059
+
2060
+ The machine-only release lanes have matching preset-export wrappers:
2061
+
2062
+ ```bash
2063
+ satroot1 export-machine-bundle-index-preset machine_release_bootstrap --output exported_machine_bundle_index.json
2064
+ satroot1 export-machine-release-catalog-preset machine_release_catalog_alpha/release_catalog.json --output exported_machine_release_catalog.json
2065
+ ```
2066
+
2067
+ Those machine-only bundle-index exports also accept `release_manifest.json` directly, and the machine release-catalog export accepts `release_catalog_manifest.json`.
2068
+
2069
+ The stable-only release lanes now have matching preset-export wrappers too:
2070
+
2071
+ ```bash
2072
+ satroot1 export-stable-bundle-index-preset stable_release_bootstrap --output exported_stable_bundle_index.json
2073
+ satroot1 export-stable-release-catalog-preset stable_release_catalog_alpha/release_catalog.json --output exported_stable_release_catalog.json
2074
+ satroot1 export-stable-release-catalog-index-preset stable_release_catalog_index_publication --output exported_stable_release_catalog_index.json
2075
+ ```
2076
+
2077
+ The same manifest-backed shortcut works for the stable wrappers: `release_manifest.json`, `release_catalog_manifest.json`, and `release_catalog_index_manifest.json`.
2078
+
2079
+ The publication-registry and publication-index exports follow the same pattern, so you can point them at either the publication directory or the generated JSON payload:
2080
+
2081
+ ```bash
2082
+ satroot1 export-publication-registry-preset publication_registry_publication/publication_registry.json --output exported_registry.json
2083
+ satroot1 export-publication-metadata-catalog-preset publication_metadata_catalog_publication --output exported_publication_metadata_catalog.json
2084
+ satroot1 export-publication-descriptor-index-preset publication_descriptor_index_publication/publication_descriptor_index.json --output exported_publication_descriptor_index.json
2085
+ ```
2086
+
2087
+ Those publication-layer export commands also accept their matching manifest files directly: `publication_registry_manifest.json`, `publication_metadata_catalog_manifest.json`, and `publication_descriptor_index_manifest.json`.
2088
+
2089
+ To derive a publication stack preset and also emit nested demo catalog preset files alongside it:
2090
+
2091
+ ```bash
2092
+ satroot1 export-publication-stack-preset publication_stack --catalog-preset-dir exported_catalog_presets --output exported_stack.json
2093
+ ```
2094
+
2095
+ Every workspace-backed export command in this lane also accepts the workspace `summary.json` path instead of the workspace directory itself, so `publication_stack/summary.json` works here too.
2096
+
2097
+ Exported stack presets now also preserve source `catalog_workspace_dirs`, so the same preset can be fed back into `publish-publication-stack` without needing the nested demo-catalog preset files at runtime.
2098
+
2099
+ For a machine-only stack, there is a matching export wrapper that validates nested exported catalog presets stay on `SATROOT-MACHINE-1`:
2100
+
2101
+ ```bash
2102
+ satroot1 export-machine-publication-stack-preset machine_publication_stack --catalog-preset-dir exported_machine_catalog_presets --output exported_machine_stack.json
2103
+ ```
2104
+
2105
+ The stable-only stack lane now has the same export wrapper with `SATROOT-STABLE-1` validation:
2106
+
2107
+ ```bash
2108
+ satroot1 export-stable-publication-stack-preset stable_publication_stack --catalog-preset-dir exported_stable_catalog_presets --output exported_stable_stack.json
2109
+ ```
2110
+
2111
+ To derive a publication network preset and recursively emit nested stack and catalog preset files:
2112
+
2113
+ ```bash
2114
+ satroot1 export-publication-network-preset publication_network --stack-preset-dir exported_stack_presets --catalog-preset-dir exported_catalog_presets --output exported_network.json
2115
+ ```
2116
+
2117
+ The same export command also accepts `publication_network/summary.json` directly.
2118
+
2119
+ Those exported network presets also preserve source `publication_stack_dirs`, which makes them reusable for `publish-publication-network` in addition to the bootstrap lane.
2120
+
2121
+ And the machine-only network lane can be exported the same way while validating nested stack and catalog presets remain machine-only:
2122
+
2123
+ ```bash
2124
+ satroot1 export-machine-publication-network-preset machine_publication_network --stack-preset-dir exported_machine_stack_presets --catalog-preset-dir exported_machine_catalog_presets --output exported_machine_network.json
2125
+ ```
2126
+
2127
+ The stable-only network lane now has the same export wrapper for nested stable stack and catalog presets:
2128
+
2129
+ ```bash
2130
+ satroot1 export-stable-publication-network-preset stable_publication_network --stack-preset-dir exported_stable_stack_presets --catalog-preset-dir exported_stable_catalog_presets --output exported_stable_network.json
2131
+ ```
2132
+
2133
+ At the lower release layers, release catalog preset export can now also emit nested bundle-index presets while still preserving source `release_dirs` for publish/bootstrap reuse. When the signed catalog came from `--release-collection-dir`, the exported preset keeps that `release_collection_dir` provenance even if nested bundle-index presets are also emitted:
2134
+
2135
+ ```bash
2136
+ satroot1 export-release-catalog-preset release_catalog --bundle-index-preset-dir exported_bundle_index_presets --output exported_release_catalog.json
2137
+ ```
2138
+
2139
+ The machine-only and stable-only wrappers validate those nested bundle-index presets against `SATROOT-MACHINE-1` and `SATROOT-STABLE-1` respectively:
2140
+
2141
+ ```bash
2142
+ satroot1 export-machine-release-catalog-preset machine_release_catalog --bundle-index-preset-dir exported_machine_bundle_index_presets --output exported_machine_release_catalog.json
2143
+ satroot1 export-stable-release-catalog-preset stable_release_catalog --bundle-index-preset-dir exported_stable_bundle_index_presets --output exported_stable_release_catalog.json
2144
+ ```
2145
+
2146
+ Release catalog index preset export can likewise emit nested release-catalog presets and, beneath those, nested bundle-index presets:
2147
+
2148
+ ```bash
2149
+ satroot1 export-release-catalog-index-preset release_catalog_index --release-catalog-preset-dir exported_release_catalog_presets --bundle-index-preset-dir exported_bundle_index_presets --output exported_release_catalog_index.json
2150
+ ```
2151
+
2152
+ Those top-level release catalog index presets still preserve source `release_catalog_dirs`, and collection-backed exports keep `release_catalog_collection_dir` even when nested release-catalog presets are emitted, so the nested preset tree remains an export-time convenience while the original collection provenance survives round-trip export.
2153
+
2154
+ To render a human-readable markdown report for a generated SATROOT artifact or workspace:
2155
+
2156
+ ```bash
2157
+ satroot1 render-publication-report publication_network
2158
+ ```
2159
+
2160
+ The report renderer auto-detects bundle, bundle-index, publication-metadata-bundle, release, release-catalog, release-catalog-index, publication-descriptor-index, publication-metadata-catalog, demo-catalog, publication-stack, publication-network, publication-catalog-workspace, publication-registry-workspace, and publication-registry inputs, and it can also write to a file:
2161
+
2162
+ ```bash
2163
+ satroot1 render-publication-report stable_release --output stable_release_report.md
2164
+ ```
2165
+
2166
+ For a normalized machine-readable export of the same detected artifact metadata, use `export-publication-descriptor`:
2167
+
2168
+ ```bash
2169
+ satroot1 export-publication-descriptor publication_network --output publication_network_descriptor.json
2170
+ ```
2171
+
2172
+ That same descriptor export path also accepts raw `bundle_index.json` inputs or directories that contain them:
2173
+
2174
+ ```bash
2175
+ satroot1 export-publication-descriptor bundle_index.json --output bundle_index_descriptor.json
2176
+ ```
2177
+
2178
+ Bootstrapped publication metadata bundles can also be inspected the same way:
2179
+
2180
+ ```bash
2181
+ satroot1 render-publication-report publication_metadata_bundle
2182
+ ```
2183
+
2184
+ To aggregate many detected artifacts into one descriptor registry, use `build-publication-descriptor-index`:
2185
+
2186
+ ```bash
2187
+ satroot1 build-publication-descriptor-index --discover-under publication_network --channel network --label "SATROOT Descriptor Index" --output publication_descriptor_index.json
2188
+ ```
2189
+
2190
+ If those discovered artifacts must stay fully inside the SATROOT-MACHINE-1 lane, the machine-only wrapper validates each nested artifact before writing the unsigned index:
2191
+
2192
+ ```bash
2193
+ satroot1 build-machine-publication-descriptor-index machine_publication_catalog_workspace machine_release_catalog_alpha --channel machine --label "Machine Descriptor Index" --published-at 2026-07-14T04:00:00Z --output machine_publication_descriptor_index.json
2194
+ ```
2195
+
2196
+ ```bash
2197
+ satroot1 build-stable-publication-descriptor-index stable_publication_catalog_workspace stable_release_catalog_alpha --channel stable --label "Stable Descriptor Index" --published-at 2026-07-15T04:00:00Z --output stable_publication_descriptor_index.json
2198
+ ```
2199
+
2200
+ If you already captured a deterministic artifact scan, that same descriptor-index build can replay it directly:
2201
+
2202
+ ```bash
2203
+ satroot1 build-publication-descriptor-index --inventory-json artifact_inventory.json --channel network --label "Inventory Descriptor Index" --published-at 2026-07-08T02:30:00Z --output publication_descriptor_index.json
2204
+ ```
2205
+
2206
+ To bootstrap signing material plus a ready-to-verify signed publication descriptor index:
2207
+
2208
+ ```bash
2209
+ satroot1 bootstrap-publication-descriptor-index-publication --discover-under publication_network --output-dir publication_descriptor_index_publication --channel network --label "SATROOT Descriptor Publication" --scheme hmac-sha256 --key-id descriptor-key
2210
+ ```
2211
+
2212
+ If you already have signer material and just want the signed publication directory, the publish convenience path writes the same `publication_descriptor_index.json` plus `publication_descriptor_index_manifest.json` layout without generating fresh secrets or keys:
2213
+
2214
+ ```bash
2215
+ satroot1 publish-publication-descriptor-index --discover-under publication_network --output-dir publication_descriptor_index_publication --channel network --label "SATROOT Descriptor Publication" --published-at 2026-07-09T02:00:00Z --scheme hmac-sha256 --key-id descriptor-key --secret descriptor-secret
2216
+ ```
2217
+
2218
+ That descriptor-index lane now also has matching machine-only manifest and bootstrap wrappers:
2219
+
2220
+ ```bash
2221
+ satroot1 build-machine-publication-descriptor-index-manifest machine_publication_descriptor_index.json --scheme hmac-sha256 --key-id descriptor-key --secret descriptor-secret --output machine_publication_descriptor_index_manifest.json
2222
+ ```
2223
+
2224
+ ```bash
2225
+ satroot1 build-stable-publication-descriptor-index-manifest stable_publication_descriptor_index.json --scheme hmac-sha256 --key-id descriptor-key --secret descriptor-secret --output stable_publication_descriptor_index_manifest.json
2226
+ ```
2227
+
2228
+ ```bash
2229
+ satroot1 bootstrap-machine-publication-descriptor-index-publication machine_publication_catalog_workspace --output-dir machine_publication_descriptor_index_publication --channel machine --label "Machine Descriptor Publication" --published-at 2026-07-14T04:30:00Z --scheme hmac-sha256 --key-id descriptor-key
2230
+ ```
2231
+
2232
+ ```bash
2233
+ satroot1 bootstrap-stable-publication-descriptor-index-publication stable_publication_catalog_workspace --output-dir stable_publication_descriptor_index_publication --channel stable --label "Stable Descriptor Publication" --published-at 2026-07-15T04:30:00Z --scheme hmac-sha256 --key-id descriptor-key
2234
+ ```
2235
+
2236
+ For repeatable descriptor-index packaging, that same command can also load a preset:
2237
+
2238
+ ```bash
2239
+ satroot1 bootstrap-publication-descriptor-index-publication --preset-json examples/publication_descriptor_index_presets/ai_compute_publication_descriptor_index.json --output-dir publication_descriptor_index_publication --label "SATROOT Descriptor Publication Override" --scheme hmac-sha256 --key-id descriptor-key
2240
+ ```
2241
+
2242
+ ```bash
2243
+ satroot1 bootstrap-machine-publication-descriptor-index-publication --preset-json examples/publication_descriptor_index_presets/ai_compute_publication_descriptor_index.json --output-dir machine_publication_descriptor_index_publication --label "SATROOT Machine Descriptor Publication Override" --scheme hmac-sha256 --key-id descriptor-key
2244
+ ```
2245
+
2246
+ Saved inventory reports can also drive the signed descriptor-index bootstrap directly:
2247
+
2248
+ ```bash
2249
+ satroot1 bootstrap-publication-descriptor-index-publication --inventory-json artifact_inventory.json --output-dir publication_descriptor_index_publication --channel network --label "Inventory Descriptor Publication" --published-at 2026-07-08T02:45:00Z --scheme hmac-sha256 --key-id descriptor-key
2250
+ ```
2251
+
2252
+ To bootstrap a signed publication report plus descriptor bundle for one artifact:
2253
+
2254
+ ```bash
2255
+ satroot1 bootstrap-publication-metadata-bundle publication_network --output-dir publication_metadata_bundle --scheme hmac-sha256 --key-id metadata-key
2256
+ ```
2257
+
2258
+ ```bash
2259
+ satroot1 publish-publication-metadata-bundle publication_network --output-dir publication_metadata_bundle --scheme hmac-sha256 --key-id metadata-key --secret metadata-secret
2260
+ ```
2261
+
2262
+ ```bash
2263
+ satroot1 build-publication-metadata-manifest publication_metadata_bundle/publication_report.md publication_metadata_bundle/publication_descriptor.json --scheme hmac-sha256 --key-id metadata-key --secret metadata-secret --output publication_metadata_manifest.json
2264
+ ```
2265
+
2266
+ To verify that bundle later:
2267
+
2268
+ ```bash
2269
+ satroot1 verify-publication-metadata-manifest publication_metadata_bundle/publication_metadata_manifest.json --secrets-json publication_metadata_bundle/publication_metadata_secrets.json
2270
+ ```
2271
+
2272
+ To aggregate multiple publication metadata bundles into one signed catalog:
2273
+
2274
+ ```bash
2275
+ satroot1 bootstrap-publication-metadata-catalog-publication --discover-under publication_metadata_root --output-dir publication_metadata_catalog_publication --channel network --label "SATROOT Metadata Catalog" --scheme hmac-sha256 --key-id catalog-key
2276
+ ```
2277
+
2278
+ ```bash
2279
+ satroot1 build-publication-metadata-catalog publication_metadata_bundle_alpha publication_metadata_bundle_beta --channel network --label "SATROOT Metadata Catalog" --published-at 2026-07-08T04:00:00Z --output publication_metadata_catalog.json
2280
+ ```
2281
+
2282
+ ```bash
2283
+ satroot1 build-publication-metadata-catalog --inventory-json artifact_inventory.json --channel network --label "Inventory Metadata Catalog" --published-at 2026-07-08T03:30:00Z --output publication_metadata_catalog.json
2284
+ ```
2285
+
2286
+ ```bash
2287
+ satroot1 build-publication-metadata-catalog-manifest publication_metadata_catalog.json --scheme hmac-sha256 --key-id catalog-key --secret catalog-secret --output publication_metadata_catalog_manifest.json
2288
+ ```
2289
+
2290
+ ```bash
2291
+ satroot1 publish-publication-metadata-catalog publication_metadata_bundle_alpha publication_metadata_bundle_beta --output-dir publication_metadata_catalog_publication --channel network --label "SATROOT Metadata Catalog" --published-at 2026-07-09T04:00:00Z --scheme hmac-sha256 --key-id catalog-key --secret catalog-secret
2292
+ ```
2293
+
2294
+ Those metadata-catalog publish commands can also take a generated `publication_catalog_workspace` or `publication_registry_workspace` root, or the matching `summary.json`, and will expand the nested `publication_metadata_bundles/` lane automatically.
2295
+
2296
+ They can also take `--publication-metadata-bundle-collection-dir` when the bundle set was already captured in a reusable collection summary, and exported metadata-catalog presets preserve that collection reference instead of flattening back to explicit bundle paths.
2297
+
2298
+ If those publication metadata bundles must stay entirely inside the SATROOT-MACHINE-1 lane, the machine-only wrappers validate each nested artifact before building, signing, or bootstrapping the catalog:
2299
+
2300
+ ```bash
2301
+ satroot1 bootstrap-machine-publication-metadata-bundle machine_publication_catalog_workspace --output-dir machine_publication_metadata_bundle --scheme hmac-sha256 --key-id metadata-key
2302
+ ```
2303
+
2304
+ ```bash
2305
+ satroot1 bootstrap-stable-publication-metadata-bundle stable_publication_catalog_workspace --output-dir stable_publication_metadata_bundle --scheme hmac-sha256 --key-id metadata-key
2306
+ ```
2307
+
2308
+ ```bash
2309
+ satroot1 build-machine-publication-metadata-manifest machine_publication_metadata_bundle/publication_report.md machine_publication_metadata_bundle/publication_descriptor.json --scheme hmac-sha256 --key-id metadata-key --secret metadata-secret --output machine_publication_metadata_manifest.json
2310
+ ```
2311
+
2312
+ ```bash
2313
+ satroot1 build-stable-publication-metadata-manifest stable_publication_metadata_bundle/publication_report.md stable_publication_metadata_bundle/publication_descriptor.json --scheme hmac-sha256 --key-id metadata-key --secret metadata-secret --output stable_publication_metadata_manifest.json
2314
+ ```
2315
+
2316
+ ```bash
2317
+ satroot1 build-machine-publication-metadata-catalog machine_publication_metadata_workspace machine_publication_metadata_catalog --channel machine --label "Machine Metadata Catalog" --published-at 2026-07-14T05:00:00Z --output machine_publication_metadata_catalog.json
2318
+ ```
2319
+
2320
+ ```bash
2321
+ satroot1 build-stable-publication-metadata-catalog stable_publication_metadata_workspace stable_publication_metadata_catalog --channel stable --label "Stable Metadata Catalog" --published-at 2026-07-15T05:00:00Z --output stable_publication_metadata_catalog.json
2322
+ ```
2323
+
2324
+ ```bash
2325
+ satroot1 build-machine-publication-metadata-catalog-manifest machine_publication_metadata_catalog.json --scheme hmac-sha256 --key-id catalog-key --secret catalog-secret --output machine_publication_metadata_catalog_manifest.json
2326
+ ```
2327
+
2328
+ ```bash
2329
+ satroot1 build-stable-publication-metadata-catalog-manifest stable_publication_metadata_catalog.json --scheme hmac-sha256 --key-id catalog-key --secret catalog-secret --output stable_publication_metadata_catalog_manifest.json
2330
+ ```
2331
+
2332
+ ```bash
2333
+ satroot1 bootstrap-machine-publication-metadata-catalog-publication machine_publication_metadata_workspace machine_publication_metadata_catalog --output-dir machine_publication_metadata_catalog_publication --channel machine --label "Machine Metadata Catalog Publication" --published-at 2026-07-14T05:30:00Z --scheme hmac-sha256 --key-id catalog-key
2334
+ ```
2335
+
2336
+ ```bash
2337
+ satroot1 bootstrap-stable-publication-metadata-catalog-publication stable_publication_metadata_workspace stable_publication_metadata_catalog --output-dir stable_publication_metadata_catalog_publication --channel stable --label "Stable Metadata Catalog Publication" --published-at 2026-07-15T05:30:00Z --scheme hmac-sha256 --key-id catalog-key
2338
+ ```
2339
+
2340
+ For repeatable metadata-catalog packaging, that same command can also load a preset:
2341
+
2342
+ ```bash
2343
+ satroot1 bootstrap-publication-metadata-catalog-publication --preset-json examples/publication_metadata_catalog_presets/ai_compute_publication_metadata_catalog.json --output-dir publication_metadata_catalog_publication --label "SATROOT Metadata Catalog Override" --scheme hmac-sha256 --key-id catalog-key
2344
+ ```
2345
+
2346
+ ```bash
2347
+ satroot1 bootstrap-machine-publication-metadata-catalog-publication --preset-json examples/publication_metadata_catalog_presets/ai_compute_publication_metadata_catalog.json --output-dir machine_publication_metadata_catalog_publication --label "SATROOT Machine Metadata Catalog Override" --scheme hmac-sha256 --key-id catalog-key
2348
+ ```
2349
+
2350
+ If the publication metadata bundle set was already captured by `inventory-artifacts`, the signed bootstrap can consume that saved inventory directly:
2351
+
2352
+ ```bash
2353
+ satroot1 bootstrap-publication-metadata-catalog-publication --inventory-json artifact_inventory.json --output-dir publication_metadata_catalog_publication --channel network --label "Inventory Metadata Catalog Publication" --published-at 2026-07-08T04:15:00Z --scheme hmac-sha256 --key-id catalog-key
2354
+ ```
2355
+
2356
+ To verify that catalog later:
2357
+
2358
+ ```bash
2359
+ satroot1 verify-publication-metadata-catalog-manifest publication_metadata_catalog_publication/publication_metadata_catalog_manifest.json --secrets-json publication_metadata_catalog_publication/publication_metadata_catalog_secrets.json
2360
+ ```
2361
+
2362
+ To bind the release-catalog-index, descriptor-index, and metadata-catalog lanes into one signed publication registry:
2363
+
2364
+ ```bash
2365
+ satroot1 bootstrap-publication-registry-publication --release-catalog-index-dir publication_network/release_catalog_index --publication-descriptor-index-dir publication_descriptor_index_publication --publication-metadata-catalog-dir publication_metadata_catalog_publication --output-dir publication_registry_publication --channel network --label "SATROOT Publication Registry" --scheme hmac-sha256 --key-id registry-key
2366
+ ```
2367
+
2368
+ ```bash
2369
+ satroot1 build-publication-registry --release-catalog-index-dir publication_network/release_catalog_index --publication-descriptor-index-dir publication_descriptor_index_publication --publication-metadata-catalog-dir publication_metadata_catalog_publication --channel network --label "SATROOT Publication Registry" --published-at 2026-07-08T05:00:00Z --output publication_registry.json
2370
+ ```
2371
+
2372
+ ```bash
2373
+ satroot1 build-publication-registry --inventory-json artifact_inventory.json --channel network --label "Inventory Publication Registry" --published-at 2026-07-09T02:30:00Z --output publication_registry.json
2374
+ ```
2375
+
2376
+ ```bash
2377
+ satroot1 build-publication-registry-manifest publication_registry.json --scheme hmac-sha256 --key-id registry-key --secret registry-secret --output publication_registry_manifest.json
2378
+ ```
2379
+
2380
+ ```bash
2381
+ satroot1 publish-publication-registry --release-catalog-index-dir publication_network/release_catalog_index --publication-descriptor-index-dir publication_descriptor_index_publication --publication-metadata-catalog-dir publication_metadata_catalog_publication --output-dir publication_registry_publication --channel network --label "SATROOT Publication Registry" --published-at 2026-07-09T05:00:00Z --scheme hmac-sha256 --key-id registry-key --secret registry-secret
2382
+ ```
2383
+
2384
+ At that top publication layer, the `--release-catalog-index-dir`, `--publication-descriptor-index-dir`, and `--publication-metadata-catalog-dir` flags can also point at generated `publication_network`, `publication_catalog_workspace`, or `publication_registry_workspace` roots, or their `summary.json` files, and SATROOT will resolve the nested publication component directories for you.
2385
+
2386
+ If all three registry components come from the same `publication_registry_workspace` root or `summary.json`, exported publication-registry presets preserve that higher-level source as `publication_registry_workspace_dir` instead of flattening back to the three nested publication directories.
2387
+
2388
+ If all three component lanes must remain SATROOT-MACHINE-1 validated, the machine-only wrappers enforce that before building, signing, or bootstrapping the top-level registry:
2389
+
2390
+ ```bash
2391
+ satroot1 build-machine-publication-registry --release-catalog-index-dir machine_release_catalog_index_publication --publication-descriptor-index-dir machine_publication_descriptor_index_publication --publication-metadata-catalog-dir machine_publication_metadata_catalog_publication --channel machine --label "Machine Publication Registry" --published-at 2026-07-14T06:00:00Z --output machine_publication_registry.json
2392
+ ```
2393
+
2394
+ ```bash
2395
+ satroot1 build-stable-publication-registry --release-catalog-index-dir stable_release_catalog_index_publication --publication-descriptor-index-dir stable_publication_descriptor_index_publication --publication-metadata-catalog-dir stable_publication_metadata_catalog_publication --channel stable --label "Stable Publication Registry" --published-at 2026-07-15T06:00:00Z --output stable_publication_registry.json
2396
+ ```
2397
+
2398
+ ```bash
2399
+ satroot1 build-machine-publication-registry-manifest machine_publication_registry.json --scheme hmac-sha256 --key-id registry-key --secret registry-secret --output machine_publication_registry_manifest.json
2400
+ ```
2401
+
2402
+ ```bash
2403
+ satroot1 build-stable-publication-registry-manifest stable_publication_registry.json --scheme hmac-sha256 --key-id registry-key --secret registry-secret --output stable_publication_registry_manifest.json
2404
+ ```
2405
+
2406
+ ```bash
2407
+ satroot1 bootstrap-machine-publication-registry-publication --release-catalog-index-dir machine_release_catalog_index_publication --publication-descriptor-index-dir machine_publication_descriptor_index_publication --publication-metadata-catalog-dir machine_publication_metadata_catalog_publication --output-dir machine_publication_registry_publication --channel machine --label "Machine Publication Registry" --published-at 2026-07-14T06:30:00Z --scheme hmac-sha256 --key-id registry-key
2408
+ ```
2409
+
2410
+ ```bash
2411
+ satroot1 bootstrap-stable-publication-registry-publication --release-catalog-index-dir stable_release_catalog_index_publication --publication-descriptor-index-dir stable_publication_descriptor_index_publication --publication-metadata-catalog-dir stable_publication_metadata_catalog_publication --output-dir stable_publication_registry_publication --channel stable --label "Stable Publication Registry" --published-at 2026-07-15T06:30:00Z --scheme hmac-sha256 --key-id registry-key
2412
+ ```
2413
+
2414
+ ```bash
2415
+ satroot1 bootstrap-publication-registry-publication --inventory-json artifact_inventory.json --output-dir publication_registry_publication --channel network --label "Inventory Publication Registry" --published-at 2026-07-09T03:00:00Z --scheme hmac-sha256 --key-id registry-key
2416
+ ```
2417
+
2418
+ To generate that whole registry workspace from an existing publication network in one shot:
2419
+
2420
+ ```bash
2421
+ satroot1 bootstrap-publication-registry-workspace --publication-network-dir publication_network --scheme hmac-sha256 --publication-descriptor-index-key-id descriptor-key --publication-metadata-key-id metadata-key --publication-metadata-catalog-key-id catalog-key --publication-registry-key-id registry-key --output-dir publication_registry_workspace --descriptor-index-label "Workspace Descriptor Index" --publication-metadata-catalog-label "Workspace Metadata Catalog" --publication-registry-label "Workspace Publication Registry"
2422
+ ```
2423
+
2424
+ ```bash
2425
+ satroot1 bootstrap-publication-registry-workspace --inventory-json artifact_inventory.json --scheme hmac-sha256 --publication-descriptor-index-key-id descriptor-key --publication-metadata-key-id metadata-key --publication-metadata-catalog-key-id catalog-key --publication-registry-key-id registry-key --output-dir publication_registry_workspace --descriptor-index-label "Inventory Workspace Descriptor Index" --publication-metadata-catalog-label "Inventory Workspace Metadata Catalog" --publication-registry-label "Inventory Workspace Publication Registry"
2426
+ ```
2427
+
2428
+ If you already have a reusable publication catalog workspace, the registry workspace bootstrap can copy that lane instead of regenerating descriptor and metadata publications:
2429
+
2430
+ ```bash
2431
+ satroot1 bootstrap-publication-registry-workspace --publication-network-dir publication_network --publication-catalog-workspace-dir publication_catalog_workspace --scheme hmac-sha256 --publication-descriptor-index-key-id descriptor-key --publication-metadata-key-id metadata-key --publication-metadata-catalog-key-id catalog-key --publication-registry-key-id registry-key --output-dir publication_registry_workspace --publication-registry-label "Workspace Publication Registry"
2432
+ ```
2433
+
2434
+ That same registry-workspace layer can also consume a previously frozen `publication_network_collection_dir` as long as it contains exactly one publication network workspace. If you also freeze a reusable publication catalog workspace collection, the registry-workspace preset layer can now preserve `publication_catalog_workspace_collection_dir` alongside the network collection provenance, and generated nested network presets can in turn preserve their underlying `publication_stack_collection_dir` provenance too:
2435
+
2436
+ ```bash
2437
+ satroot1 bootstrap-publication-registry-workspace --publication-network-collection-dir publication_network_collection --publication-catalog-workspace-dir publication_catalog_workspace --scheme hmac-sha256 --publication-descriptor-index-key-id descriptor-key --publication-metadata-key-id metadata-key --publication-metadata-catalog-key-id catalog-key --publication-registry-key-id registry-key --output-dir publication_registry_workspace --publication-registry-label "Workspace Publication Registry"
2438
+ ```
2439
+
2440
+ Those collection flags also accept `publication_network_collection/summary.json` and `publication_catalog_workspace_collection/summary.json` directly when you want to point at the frozen collection summaries instead of the collection roots.
2441
+
2442
+ There is also a checked-in collection-backed companion preset for the same registry-workspace shape. That checked-in example now resolves both a frozen `publication_network_collection_dir` and a frozen `publication_catalog_workspace_collection_dir` directly from the preset:
2443
+
2444
+ ```bash
2445
+ satroot1 bootstrap-publication-registry-workspace --preset-json examples/registry_workspace_presets/ai_compute_publication_registry_workspace_collection_backed.json --scheme hmac-sha256 --publication-descriptor-index-key-id descriptor-key --publication-metadata-key-id metadata-key --publication-metadata-catalog-key-id catalog-key --publication-registry-key-id registry-key --output-dir publication_registry_workspace_collection_backed
2446
+ ```
2447
+
2448
+ If the nested generic demo catalog comes from a frozen one-release collection, the same top-level registry workspace can now round-trip from a self-contained preset that carries both the nested catalog preset and the frozen publication network collection reference:
2449
+
2450
+ ```bash
2451
+ satroot1 bootstrap-publication-registry-workspace --preset-json examples/registry_workspace_presets/ai_compute_publication_registry_workspace_catalog_release_collection_backed.json --scheme hmac-sha256 --publication-descriptor-index-key-id descriptor-key --publication-metadata-key-id metadata-key --publication-metadata-catalog-key-id catalog-key --publication-registry-key-id registry-key --output-dir publication_registry_workspace_frozen_catalog
2452
+ ```
2453
+
2454
+ To generate just the reusable descriptor-index plus metadata-catalog workspace without the top-level registry lane:
2455
+
2456
+ ```bash
2457
+ satroot1 bootstrap-publication-catalog-workspace --discover-under publication_network --scheme hmac-sha256 --publication-descriptor-index-key-id descriptor-key --publication-metadata-key-id metadata-key --publication-metadata-catalog-key-id catalog-key --output-dir publication_catalog_workspace --descriptor-index-label "Workspace Descriptor Index" --publication-metadata-catalog-label "Workspace Metadata Catalog"
2458
+ ```
2459
+
2460
+ ```bash
2461
+ satroot1 bootstrap-publication-catalog-workspace --inventory-json artifact_inventory.json --scheme hmac-sha256 --publication-descriptor-index-key-id descriptor-key --publication-metadata-key-id metadata-key --publication-metadata-catalog-key-id catalog-key --output-dir publication_catalog_workspace --descriptor-index-label "Inventory Workspace Descriptor Index" --publication-metadata-catalog-label "Inventory Workspace Metadata Catalog"
2462
+ ```
2463
+
2464
+ For a checked-in repeatable publication-catalog-workspace composition, the same command can also load a preset:
2465
+
2466
+ ```bash
2467
+ satroot1 bootstrap-publication-catalog-workspace --preset-json examples/publication_catalog_workspace_presets/ai_compute_publication_catalog_workspace.json --scheme hmac-sha256 --publication-descriptor-index-key-id descriptor-key --publication-metadata-key-id metadata-key --publication-metadata-catalog-key-id catalog-key --output-dir publication_catalog_workspace --descriptor-index-label "SATROOT Workspace Descriptor Index Override"
2468
+ ```
2469
+
2470
+ For a checked-in repeatable registry-workspace composition, the same command can also load a preset:
2471
+
2472
+ ```bash
2473
+ satroot1 bootstrap-publication-registry-workspace --preset-json examples/registry_workspace_presets/ai_compute_publication_registry_workspace.json --scheme hmac-sha256 --release-key-id release-key --release-catalog-key-id catalog-key --release-catalog-index-key-id index-key --publication-descriptor-index-key-id descriptor-key --publication-metadata-key-id metadata-key --publication-metadata-catalog-key-id catalog-key --publication-registry-key-id registry-key --output-dir publication_registry_workspace --publication-registry-label "SATROOT Workspace Registry Override"
2474
+ ```
2475
+
2476
+ For a checked-in repeatable top-level registry publication, use the publication preset:
2477
+
2478
+ ```bash
2479
+ satroot1 bootstrap-publication-registry-publication --preset-json examples/registry_presets/ai_compute_publication_registry.json --output-dir publication_registry_publication --label "SATROOT Publication Registry Override" --scheme hmac-sha256 --key-id registry-key
2480
+ ```
2481
+
2482
+ ```bash
2483
+ satroot1 bootstrap-machine-publication-registry-publication --preset-json examples/registry_presets/ai_compute_publication_registry.json --output-dir machine_publication_registry_publication --label "SATROOT Machine Registry Override" --scheme hmac-sha256 --key-id registry-key
2484
+ ```
2485
+
2486
+ If you want the top-level registry publication preset itself to point at one generated `publication_registry_workspace` root instead of three separate nested publication component directories, there are checked-in workspace-backed companions for that too:
2487
+
2488
+ ```bash
2489
+ satroot1 bootstrap-publication-registry-publication --preset-json examples/registry_presets/ai_compute_publication_registry_workspace_backed.json --output-dir publication_registry_publication_workspace_backed --label "SATROOT Workspace-Backed Publication Registry Override" --scheme hmac-sha256 --key-id registry-key
2490
+ satroot1 bootstrap-machine-publication-registry-publication --preset-json examples/registry_presets/machine_compute_publication_registry_workspace_backed.json --output-dir machine_publication_registry_publication_workspace_backed --label "SATROOT Machine Workspace-Backed Registry Override" --scheme hmac-sha256 --key-id registry-key
2491
+ satroot1 bootstrap-stable-publication-registry-publication --preset-json examples/registry_presets/stable_reference_publication_registry_workspace_backed.json --output-dir stable_publication_registry_publication_workspace_backed --label "SATROOT Stable Workspace-Backed Registry Override" --scheme hmac-sha256 --key-id registry-key
2492
+ ```
2493
+
2494
+ There are matching collection-backed companions when you want the top-level registry publication preset to preserve lineage to one generated `publication_registry_workspace_collection_dir`, with the nested workspace member resolved automatically at load time:
2495
+
2496
+ ```bash
2497
+ satroot1 bootstrap-publication-registry-publication --preset-json examples/registry_presets/ai_compute_publication_registry_collection_backed.json --output-dir publication_registry_publication_collection_backed --label "SATROOT Collection-Backed Publication Registry Override" --scheme hmac-sha256 --key-id registry-key
2498
+ satroot1 bootstrap-machine-publication-registry-publication --preset-json examples/registry_presets/machine_compute_publication_registry_collection_backed.json --output-dir machine_publication_registry_publication_collection_backed --label "SATROOT Machine Collection-Backed Registry Override" --scheme hmac-sha256 --key-id registry-key
2499
+ satroot1 bootstrap-stable-publication-registry-publication --preset-json examples/registry_presets/stable_reference_publication_registry_collection_backed.json --output-dir stable_publication_registry_publication_collection_backed --label "SATROOT Stable Collection-Backed Registry Override" --scheme hmac-sha256 --key-id registry-key
2500
+ ```
2501
+
2502
+ If you want that top-level registry publication preset to be fully self-contained for the frozen one-release catalog path, there are checked-in companions that point at a nested `publication_registry_workspace_preset`, which in turn carries a nested collection-backed catalog preset and a single-member publication-network collection reference:
2503
+
2504
+ ```bash
2505
+ satroot1 bootstrap-publication-registry-publication --preset-json examples/registry_presets/ai_compute_publication_registry_workspace_catalog_release_collection_backed.json --output-dir publication_registry_publication_frozen_catalog --label "SATROOT Frozen Catalog Publication Registry Override" --scheme hmac-sha256 --key-id registry-key
2506
+ satroot1 bootstrap-machine-publication-registry-publication --preset-json examples/registry_presets/machine_compute_publication_registry_workspace_catalog_release_collection_backed.json --output-dir machine_publication_registry_publication_frozen_catalog --label "SATROOT Machine Frozen Catalog Registry Override" --scheme hmac-sha256 --key-id registry-key
2507
+ satroot1 bootstrap-stable-publication-registry-publication --preset-json examples/registry_presets/stable_reference_publication_registry_workspace_catalog_release_collection_backed.json --output-dir stable_publication_registry_publication_frozen_catalog --label "SATROOT Stable Frozen Catalog Registry Override" --scheme hmac-sha256 --key-id registry-key
2508
+ ```
2509
+
2510
+ To verify that registry later:
2511
+
2512
+ ```bash
2513
+ satroot1 verify-publication-registry-manifest publication_registry_publication/publication_registry_manifest.json --secrets-json publication_registry_publication/publication_registry_secrets.json
2514
+ ```
2515
+
2516
+ To derive a reusable preset back from a generated registry publication:
2517
+
2518
+ ```bash
2519
+ satroot1 export-publication-registry-preset publication_registry_publication --output exported_registry.json
2520
+ ```
2521
+
2522
+ If that registry was built from one `publication_registry_workspace` root or `summary.json`, the exported preset keeps that workspace reference so later bootstrap and publish flows can resolve the nested component publications automatically.
2523
+
2524
+ If you want that exported top-level registry preset to be self-contained for the frozen one-release catalog flow, the export command can also emit a nested registry-workspace preset and nested catalog preset in one pass:
2525
+
2526
+ ```bash
2527
+ satroot1 export-publication-registry-preset publication_registry_publication_frozen_catalog --publication-registry-workspace-preset-path exported_registry_workspace.json --catalog-preset-path exported_catalog.json --output exported_registry.json
2528
+ ```
2529
+
2530
+ The machine and stable wrappers expose the same nested export flags on `export-machine-publication-registry-preset` and `export-stable-publication-registry-preset`.
2531
+
2532
+ The checked-in `examples/registry_presets/` directory now includes companion workspace-backed registry presets for the generic, machine, and stable lanes when you want a reusable registry preset to point at one generated `publication_registry_workspace` root instead of three separate publication component directories.
2533
+
2534
+ Machine-only publication lanes now have matching preset-export wrappers too:
2535
+
2536
+ ```bash
2537
+ satroot1 export-machine-release-catalog-index-preset machine_release_catalog_index_publication --output exported_machine_release_catalog_index.json
2538
+ ```
2539
+
2540
+ ```bash
2541
+ satroot1 export-machine-publication-descriptor-index-preset machine_publication_descriptor_index_publication --output exported_machine_publication_descriptor_index.json
2542
+ ```
2543
+
2544
+ ```bash
2545
+ satroot1 export-machine-publication-metadata-catalog-preset machine_publication_metadata_catalog_publication --output exported_machine_publication_metadata_catalog.json
2546
+ ```
2547
+
2548
+ ```bash
2549
+ satroot1 export-machine-publication-registry-preset machine_publication_registry_publication --output exported_machine_registry.json
2550
+ ```
2551
+
2552
+ The stable-only publication component lane now has matching validated export wrappers too:
2553
+
2554
+ ```bash
2555
+ satroot1 export-stable-publication-descriptor-index-preset stable_publication_descriptor_index_publication --output exported_stable_publication_descriptor_index.json
2556
+ ```
2557
+
2558
+ ```bash
2559
+ satroot1 export-stable-publication-metadata-catalog-preset stable_publication_metadata_catalog_publication --output exported_stable_publication_metadata_catalog.json
2560
+ ```
2561
+
2562
+ ```bash
2563
+ satroot1 export-stable-publication-registry-preset stable_publication_registry_publication --output exported_stable_registry.json
2564
+ ```
2565
+
2566
+ To derive a reusable preset back from a generated registry workspace:
2567
+
2568
+ ```bash
2569
+ satroot1 export-publication-registry-workspace-preset publication_registry_workspace --output exported_registry_workspace.json
2570
+ ```
2571
+
2572
+ That export also accepts `publication_registry_workspace/summary.json` directly, and the same summary-path shortcut works for the machine-only and stable-only registry workspace export wrappers.
2573
+
2574
+ That registry-workspace export can also emit nested publication-catalog-workspace and publication-registry preset files, and the nested catalog preset can in turn emit descriptor-index and metadata-catalog presets:
2575
+
2576
+ ```bash
2577
+ satroot1 export-publication-registry-workspace-preset publication_registry_workspace --publication-catalog-workspace-preset-path exported_catalog_workspace.json --publication-descriptor-index-preset-path exported_descriptor_index.json --publication-metadata-catalog-preset-path exported_metadata_catalog.json --publication-registry-preset-path exported_registry.json --output exported_registry_workspace.json
2578
+ ```
2579
+
2580
+ If that nested generic catalog came from a frozen one-release collection, `--catalog-preset-path` can also emit the nested SATROOT demo catalog preset so the exported registry-workspace preset can rebuild its nested catalog lane from `--preset-json` alone:
2581
+
2582
+ ```bash
2583
+ satroot1 export-publication-registry-workspace-preset publication_registry_workspace --catalog-preset-path exported_catalog.json --publication-catalog-workspace-preset-path exported_catalog_workspace.json --output exported_registry_workspace.json
2584
+ ```
2585
+
2586
+ Published machine registry-workspace exports are a little stricter: when the original source network is not SATROOT-MACHINE-1-only, the exported machine preset falls back to `release_catalog_index_dir` instead of preserving a generic `publication_network_dir`, so the preset stays reusable by machine-only publish/bootstrap flows.
2587
+
2588
+ For the machine-only registry lane, the matching export wrapper validates that the workspace still carries machine provenance. If the nested machine catalog came from a frozen one-release collection, `--catalog-preset-path` can also emit that nested machine catalog preset for a self-contained round-trip:
2589
+
2590
+ ```bash
2591
+ satroot1 export-machine-publication-registry-workspace-preset machine_publication_registry_workspace --catalog-preset-path exported_machine_catalog.json --publication-catalog-workspace-preset-path exported_machine_catalog_workspace.json --output exported_machine_registry_workspace.json
2592
+ ```
2593
+
2594
+ The stable-only registry lane has the same provenance guard, but validates `SATROOT-STABLE-1` sources instead. The same `--catalog-preset-path` flow works there for frozen one-release stable catalogs:
2595
+
2596
+ ```bash
2597
+ satroot1 export-stable-publication-registry-workspace-preset stable_publication_registry_workspace --catalog-preset-path exported_stable_catalog.json --publication-catalog-workspace-preset-path exported_stable_catalog_workspace.json --output exported_stable_registry_workspace.json
2598
+ ```
2599
+
2600
+ To derive a reusable preset back from a generated publication catalog workspace:
2601
+
2602
+ ```bash
2603
+ satroot1 export-publication-catalog-workspace-preset publication_catalog_workspace --output exported_catalog_workspace.json
2604
+ ```
2605
+
2606
+ Like the stack, network, and registry-workspace exports, this command also accepts `publication_catalog_workspace/summary.json` instead of the workspace directory.
2607
+
2608
+ If you want the component publications captured as reusable presets at the same time, the catalog-workspace export can also emit nested descriptor-index and metadata-catalog preset files:
2609
+
2610
+ ```bash
2611
+ satroot1 export-publication-catalog-workspace-preset publication_catalog_workspace --publication-descriptor-index-preset-path exported_descriptor_index.json --publication-metadata-catalog-preset-path exported_metadata_catalog.json --output exported_catalog_workspace.json
2612
+ ```
2613
+
2614
+ And the machine-only publication catalog lane can be exported with the same validation guard:
2615
+
2616
+ ```bash
2617
+ satroot1 export-machine-publication-catalog-workspace-preset machine_publication_catalog_workspace --output exported_machine_catalog_workspace.json
2618
+ ```
2619
+
2620
+ There is a matching stable-only catalog export wrapper for `SATROOT-STABLE-1` publication catalog workspaces:
2621
+
2622
+ ```bash
2623
+ satroot1 export-stable-publication-catalog-workspace-preset stable_publication_catalog_workspace --output exported_stable_catalog_workspace.json
2624
+ ```
2625
+
2626
+ To derive a reusable preset back from a generated metadata catalog publication:
2627
+
2628
+ ```bash
2629
+ satroot1 export-publication-metadata-catalog-preset publication_metadata_catalog_publication --output exported_publication_metadata_catalog.json
2630
+ ```
2631
+
2632
+ If that catalog was built from `--publication-metadata-bundle-collection-dir`, the exported preset keeps the same collection reference so a later bootstrap or publish round-trip can reuse it directly.
2633
+
2634
+ To derive a reusable preset back from a generated descriptor index publication:
2635
+
2636
+ ```bash
2637
+ satroot1 export-publication-descriptor-index-preset publication_descriptor_index_publication --output exported_publication_descriptor_index.json
2638
+ ```
2639
+
2640
+ Inspect a publication descriptor index without signature verification:
2641
+
2642
+ ```bash
2643
+ satroot1 publication-descriptor-index-summary publication_descriptor_index_publication
2644
+ ```
2645
+
2646
+ Lint a publication descriptor index and its referenced SATROOT artifacts:
2647
+
2648
+ ```bash
2649
+ satroot1 publication-descriptor-index-lint publication_descriptor_index_publication
2650
+ ```
2651
+
2652
+ Those publication descriptor and registry inspection commands also accept the generated manifest or payload file directly:
2653
+
2654
+ ```bash
2655
+ satroot1 publication-descriptor-index-summary publication_descriptor_index_publication/publication_descriptor_index_manifest.json
2656
+ satroot1 publication-registry-lint publication_registry_publication/publication_registry.json
2657
+ ```
2658
+
2659
+ Inspect a publication metadata catalog without signature verification:
2660
+
2661
+ ```bash
2662
+ satroot1 publication-metadata-catalog-summary publication_metadata_catalog_publication
2663
+ ```
2664
+
2665
+ Lint a publication metadata catalog and its referenced publication metadata bundles:
2666
+
2667
+ ```bash
2668
+ satroot1 publication-metadata-catalog-lint publication_metadata_catalog_publication
2669
+ ```
2670
+
2671
+ Those publication metadata catalog inspection commands also accept the generated manifest or payload file directly:
2672
+
2673
+ ```bash
2674
+ satroot1 publication-metadata-catalog-summary publication_metadata_catalog_publication/publication_metadata_catalog_manifest.json
2675
+ ```
2676
+
2677
+ Inspect a bootstrapped publication metadata bundle without signature verification:
2678
+
2679
+ ```bash
2680
+ satroot1 publication-metadata-bundle-summary publication_metadata_bundle
2681
+ ```
2682
+
2683
+ Lint a publication metadata bundle, its stored report/descriptor files, and the currently referenced packaged SATROOT artifact:
2684
+
2685
+ ```bash
2686
+ satroot1 publication-metadata-bundle-lint publication_metadata_bundle
2687
+ ```
2688
+
2689
+ Inspect a release catalog publication without signature verification:
2690
+
2691
+ ```bash
2692
+ satroot1 release-catalog-summary release_catalog_bootstrap
2693
+ ```
2694
+
2695
+ Those read-only release inspection commands also accept the generated manifest or payload file directly when you are already focused on one artifact:
2696
+
2697
+ ```bash
2698
+ satroot1 release-summary stable_release/release_manifest.json
2699
+ satroot1 release-catalog-lint release_catalog_bootstrap/release_catalog.json
2700
+ satroot1 release-catalog-index-summary release_catalog_index_bootstrap/release_catalog_index_manifest.json
2701
+ ```
2702
+
2703
+ Lint a release catalog publication and all referenced release directories:
2704
+
2705
+ ```bash
2706
+ satroot1 release-catalog-lint release_catalog_bootstrap
2707
+ ```
2708
+
2709
+ Inspect a release-catalog index publication without signature verification:
2710
+
2711
+ ```bash
2712
+ satroot1 release-catalog-index-summary release_catalog_index_bootstrap
2713
+ ```
2714
+
2715
+ Lint a release-catalog index publication and all referenced release-catalog directories:
2716
+
2717
+ ```bash
2718
+ satroot1 release-catalog-index-lint release_catalog_index_bootstrap
2719
+ ```
2720
+
2721
+ Inspect a demo catalog workspace without signature verification:
2722
+
2723
+ ```bash
2724
+ satroot1 demo-catalog-summary catalog_workspace
2725
+ ```
2726
+
2727
+ Lint a demo catalog workspace, its nested release, and all referenced bundle directories:
2728
+
2729
+ ```bash
2730
+ satroot1 demo-catalog-lint catalog_workspace
2731
+ ```
2732
+
2733
+ Those workspace inspection commands also accept the generated `summary.json` directly when you already have the summary file open:
2734
+
2735
+ ```bash
2736
+ satroot1 demo-catalog-summary catalog_workspace/summary.json
2737
+ satroot1 publication-stack-lint publication_stack/summary.json
2738
+ satroot1 publication-network-summary publication_network/summary.json
2739
+ satroot1 publication-catalog-workspace-lint publication_catalog_workspace/summary.json
2740
+ satroot1 publication-registry-workspace-summary publication_registry_workspace/summary.json
2741
+ ```
2742
+
2743
+ The reusable collection layers now have matching summary commands too, so frozen bundle/release/workspace sets can be inspected without manually opening `summary.json`:
2744
+
2745
+ ```bash
2746
+ satroot1 bundle-collection-summary bundle_collection
2747
+ satroot1 release-collection-summary release_collection/summary.json
2748
+ satroot1 release-catalog-collection-summary release_catalog_collection
2749
+ satroot1 demo-catalog-workspace-collection-summary catalog_workspace_collection
2750
+ satroot1 publication-stack-collection-summary publication_stack_collection
2751
+ satroot1 publication-network-collection-summary publication_network_collection/summary.json
2752
+ satroot1 publication-metadata-bundle-collection-summary publication_metadata_bundle_collection
2753
+ satroot1 publication-catalog-workspace-collection-summary publication_catalog_workspace_collection
2754
+ satroot1 publication-registry-workspace-collection-summary publication_registry_workspace_collection/summary.json
2755
+ ```
2756
+
2757
+ Those same reusable collection layers now expose matching lint commands too, so copied collection members can be checked in place without dropping down into each directory one-by-one:
2758
+
2759
+ ```bash
2760
+ satroot1 bundle-collection-lint bundle_collection
2761
+ satroot1 release-collection-lint release_collection/summary.json
2762
+ satroot1 release-catalog-collection-lint release_catalog_collection
2763
+ satroot1 demo-catalog-workspace-collection-lint catalog_workspace_collection
2764
+ satroot1 publication-stack-collection-lint publication_stack_collection
2765
+ satroot1 publication-network-collection-lint publication_network_collection/summary.json
2766
+ satroot1 publication-metadata-bundle-collection-lint publication_metadata_bundle_collection
2767
+ satroot1 publication-catalog-workspace-collection-lint publication_catalog_workspace_collection
2768
+ satroot1 publication-registry-workspace-collection-lint publication_registry_workspace_collection/summary.json
2769
+ ```
2770
+
2771
+ Inspect a publication stack workspace without signature verification:
2772
+
2773
+ ```bash
2774
+ satroot1 publication-stack-summary publication_stack
2775
+ ```
2776
+
2777
+ Lint a publication stack workspace, its nested release catalog, and all referenced catalog workspaces:
2778
+
2779
+ ```bash
2780
+ satroot1 publication-stack-lint publication_stack
2781
+ ```
2782
+
2783
+ Inspect a publication network workspace without signature verification:
2784
+
2785
+ ```bash
2786
+ satroot1 publication-network-summary publication_network
2787
+ ```
2788
+
2789
+ Lint a publication network workspace, its nested release-catalog index, and all referenced stack summaries:
2790
+
2791
+ ```bash
2792
+ satroot1 publication-network-lint publication_network
2793
+ ```
2794
+
2795
+ Inspect a publication catalog workspace without signature verification:
2796
+
2797
+ ```bash
2798
+ satroot1 publication-catalog-workspace-summary publication_catalog_workspace
2799
+ ```
2800
+
2801
+ Lint a publication catalog workspace, its generated publication components, and all referenced publication metadata bundles:
2802
+
2803
+ ```bash
2804
+ satroot1 publication-catalog-workspace-lint publication_catalog_workspace
2805
+ ```
2806
+
2807
+ Inspect a publication registry workspace without signature verification:
2808
+
2809
+ ```bash
2810
+ satroot1 publication-registry-workspace-summary publication_registry_workspace
2811
+ ```
2812
+
2813
+ Lint a publication registry workspace, its copied/generated publication components, and all referenced publication metadata bundles:
2814
+
2815
+ ```bash
2816
+ satroot1 publication-registry-workspace-lint publication_registry_workspace
2817
+ ```
2818
+
2819
+ Inspect a publication registry without signature verification:
2820
+
2821
+ ```bash
2822
+ satroot1 publication-registry-summary publication_registry_publication
2823
+ ```
2824
+
2825
+ Lint a publication registry and its referenced descriptor, metadata, and release-catalog-index components:
2826
+
2827
+ ```bash
2828
+ satroot1 publication-registry-lint publication_registry_publication
2829
+ ```
2830
+
2831
+ Validate a bundle manifest directly against the SATROOT manifest schema:
2832
+
2833
+ ```bash
2834
+ satroot1 validate-bundle-manifest signed_hmac_bundle/bundle_manifest.json
2835
+ ```
2836
+
2837
+ Validate a bundle index directly against the SATROOT bundle-index schema:
2838
+
2839
+ ```bash
2840
+ satroot1 validate-bundle-index bundle_index.json
2841
+ ```
2842
+
2843
+ Validate a signed release manifest directly against the SATROOT release-manifest schema:
2844
+
2845
+ ```bash
2846
+ satroot1 validate-release-manifest release_manifest.json
2847
+ ```
2848
+
2849
+ Validate a release catalog, release-catalog index, publication workspace summaries, and their signed manifests directly against the SATROOT schemas:
2850
+
2851
+ ```bash
2852
+ satroot1 validate-release-catalog release_catalog.json
2853
+ satroot1 validate-release-catalog-manifest release_catalog_manifest.json
2854
+ satroot1 validate-release-catalog-index release_catalog_index.json
2855
+ satroot1 validate-release-catalog-index-manifest release_catalog_index_manifest.json
2856
+ satroot1 validate-demo-catalog-summary catalog_workspace/summary.json
2857
+ satroot1 validate-publication-stack-summary publication_stack/summary.json
2858
+ satroot1 validate-publication-network-summary publication_network/summary.json
2859
+ ```
2860
+
2861
+ Verify a signed release manifest against its bundle index:
2862
+
2863
+ ```bash
2864
+ satroot1 verify-release-manifest release_manifest.json --secrets-json release_secrets.json
2865
+ ```
2866
+
2867
+ Verify a signed release catalog manifest against its release catalog:
2868
+
2869
+ ```bash
2870
+ satroot1 verify-release-catalog-manifest release_catalog_manifest.json --secrets-json release_catalog_secrets.json
2871
+ ```
2872
+
2873
+ Verify a signed release-catalog index manifest against its release-catalog index:
2874
+
2875
+ ```bash
2876
+ satroot1 verify-release-catalog-index-manifest release_catalog_index_manifest.json --secrets-json release_catalog_index_secrets.json
2877
+ ```
2878
+
2879
+ Sign a full demo ledger with the built-in demo signature mode:
2880
+
2881
+ ```bash
2882
+ satroot1 sign-ledger examples/events_floor1.json --scheme demo
2883
+ ```
2884
+
2885
+ Sign a ledger with shared-secret HMAC verification metadata:
2886
+
2887
+ ```bash
2888
+ satroot1 sign-ledger examples/events_floor1.json --scheme hmac-sha256 --signer-key-map-json signer_keys.json --secrets-json secrets.json --include-state-hash --output signed_events.json
2889
+ ```
2890
+
2891
+ Replay an Ed25519-signed ledger with public keys:
2892
+
2893
+ ```bash
2894
+ satroot1 replay signed_events.json --scheme ed25519 --public-keys-json public_keys.json
2895
+ ```
2896
+
2897
+ Generate an Ed25519 private-key map for SATROOT key IDs:
2898
+
2899
+ ```bash
2900
+ satroot1 generate-ed25519-private-keys --key-id issuer-key --key-id alice-key --output private_keys.json
2901
+ ```
2902
+
2903
+ Generate HMAC shared secrets for SATROOT key IDs:
2904
+
2905
+ ```bash
2906
+ satroot1 generate-hmac-secrets --key-id issuer-key --key-id alice-key --output secrets.json
2907
+ ```
2908
+
2909
+ Derive an Ed25519 public-key map from SATROOT private keys:
2910
+
2911
+ ```bash
2912
+ satroot1 derive-ed25519-public-keys private_keys.json --output public_keys.json
2913
+ ```
2914
+
2915
+ Annotate a signed HMAC ledger without changing its signed payload:
2916
+
2917
+ ```bash
2918
+ satroot1 annotate-ledger signed_events.json --scheme hmac-sha256 --secrets-json secrets.json --output annotated_signed_events.json
2919
+ ```
2920
+
2921
+ Sign a single event record:
2922
+
2923
+ ```bash
2924
+ satroot1 sign-event event.json --scheme hmac-sha256 --key-id issuer-key --secret issuer-secret
2925
+ ```
2926
+
2927
+ The same CLI also runs directly from the source tree without installing:
2928
+
2929
+ ```bash
2930
+ python src/satroot1.py replay examples/events_floor1.json
2931
+ ```
2932
+
2933
+ ## Run the demo ledgers
2934
+
2935
+ ```bash
2936
+ satroot1 replay examples/events_floor1.json
2937
+ ```
2938
+
2939
+ Reference-only stable profile demo:
2940
+
2941
+ ```bash
2942
+ satroot1 replay examples/events_usdroot1.json
2943
+ ```
2944
+
2945
+ Machine-credit profile demo:
2946
+
2947
+ ```bash
2948
+ satroot1 replay examples/events_apicredit1.json
2949
+ ```
2950
+
2951
+ Receipt profile demo:
2952
+
2953
+ ```bash
2954
+ satroot1 replay examples/events_receipt1.json
2955
+ ```
2956
+
2957
+ Identity profile demo:
2958
+
2959
+ ```bash
2960
+ satroot1 replay examples/events_identity1.json
2961
+ ```
2962
+
2963
+ License profile demo:
2964
+
2965
+ ```bash
2966
+ satroot1 replay examples/events_license1.json
2967
+ ```
2968
+
2969
+ ## Important demo note
2970
+
2971
+ The example `root_id` values in `examples/` are placeholders:
2972
+
2973
+ ```text
2974
+ 0000000000000000000000000000000000000000000000000000000000000000:0
2975
+ ```
2976
+
2977
+ Replace it only when intentionally anchoring to a real one-satoshi UTXO.
2978
+
2979
+ ## Anchored lanes
2980
+
2981
+ The anchored demo lane is the designated entry point for that intentional replacement. It is the first of the four anchored lanes — anchored demo, anchored publication, on-chain envelope, and envelope verification — which are the only lanes ever meant to carry a real outpoint or transaction id, and always only via run-time flags:
2982
+
2983
+ ```bash
2984
+ python scripts/run_anchored_demo_smoke.py
2985
+ python -m satroot_anchored_demo_smoke --root-id <txid>:<vout>
2986
+ ```
2987
+
2988
+ It binds one dedicated identity demo namespace to a `root_id` that defaults to its own distinct placeholder (`6666...6666:0`), signs the namespace lifecycle with the `ed25519` scheme instead of the demo or hmac schemes, and emits a report proving five things: the semantic state hash binds the `root_id`, the ed25519 bundle verifies against its generated key material, replay is deterministic, events carrying a foreign root are rejected with `root_id mismatch`, and no ledger event kind models root custody.
2989
+
2990
+ That last check is the root lifecycle rule made concrete: moving the root satoshi on-chain never appears in the ledger and cannot alter the semantic state hash. Binding a real one-satoshi outpoint (testnet first) only changes the `root_id` string passed at run time — never the event rules, and never a checked-in file. The lane requires the `[crypto]` extra (`pip install -e ".[crypto]"`).
2991
+
2992
+ The companion anchored publication lane pushes the same anchored namespace through the full publication ladder — signed bundles, release, catalog, network, and registry workspace — with ed25519 signing end to end, and verifies the root binding in every generated bundle genesis:
2993
+
2994
+ ```bash
2995
+ python scripts/run_anchored_publication_smoke.py
2996
+ python -m satroot_anchored_publication_smoke --root-id <txid>:<vout>
2997
+ ```
2998
+
2999
+ The on-chain envelope lane completes the loop, building the SPEC section 4 commitment script (`OP_FALSE OP_RETURN "SATROOT1" <content-type> <payload>`) for a namespace's root and state hash — deterministically and fully offline; the operator broadcasts the result out-of-band:
3000
+
3001
+ ```bash
3002
+ python scripts/run_onchain_envelope_smoke.py
3003
+ python -m satroot_onchain_envelope_smoke --root-id <txid>:<vout> --state-hash sha256:<hex>
3004
+ ```
3005
+
3006
+ The envelope verification lane closes the read side: given a serialized transaction's raw bytes (fetched out-of-band), it confirms — fully offline — that the bytes hash to the expected transaction id and carry exactly one `SATROOT1` envelope output matching the rebuilt commitment byte for byte:
3007
+
3008
+ ```bash
3009
+ python scripts/run_envelope_verification_smoke.py
3010
+ python -m satroot_envelope_verification_smoke --raw-tx-hex-file <path> --root-id <txid>:<vout> --state-hash sha256:<hex> --expected-txid <txid>
3011
+ ```
3012
+
3013
+ Intentional anchored runs against real outpoints are recorded in `ANCHORS.md`, the only place in the repository where a real outpoint may appear.