Core System Architecture Part 73 — Anonymous Network Supply-Chain Transparency, Dependency Provenance, Reproducible Builds, SBOM, Artifact Trust & Compromise Recovery Architecture
SIAR — Secure, Local-First, Multi-Transport Communication Platform
Series: Core System Architecture
Part: 73
Status: Architecture specification
Primary language: Rust
Builds on: Core System Architecture Parts 49, 52–53, 61–66, 71–72
Primary purpose: define SIAR's complete software supply-chain trust architecture from source input to production artifact, including dependency provenance, registry/mirror trust, vendoring, build isolation, reproducibility, SBOM, attestations, artifact transparency, signing, release promotion, compromise detection, artifact revocation, dependency incident response, and compromise recovery.
1. Purpose
A secure application can still be compromised before it runs.
Attack paths include:
malicious dependency
compromised package registry
poisoned Git dependency
compromised CI runner
tampered build toolchain
malicious build script
artifact substitution
stolen signing key
poisoned binary cache
The governing principle is:
A production artifact should be explainable, reproducible, attributable, verifiable, and revocable from its final binary all the way back to its declared source and dependency inputs.
2. Architectural Position
Source
│
▼
Dependency Resolution
│
▼
Verified Inputs
│
▼
Hermetic Build
│
▼
Reproducibility Check
│
▼
SBOM + Provenance
│
▼
Signing + Transparency
│
▼
Promotion
│
▼
Production Verification
3. Core Separation
Keep distinct:
source provenance
dependency provenance
toolchain provenance
build provenance
artifact identity
signing authority
release approval
runtime trust
4. Non-Goals
Part 73 does not assume:
package registries are inherently trustworthy
a signature proves source correctness
SBOM alone equals supply-chain security
one CI provider is a complete root of trust
5. Supply-Chain Trust Domains
#![allow(unused)] fn main() { pub enum SupplyChainDomain { Source, Dependency, Toolchain, BuildEnvironment, BuildOutput, ArtifactRegistry, Signing, Promotion, } }
6. Source Provenance
Every release source has:
repository
commit
tree digest
tag/release ref
review status
7. Source Revision
#![allow(unused)] fn main() { pub struct SourceRevision { pub repository: RepositoryId, pub commit: GitCommitHash, pub tree_digest: ContentDigest, } }
8. No Branch Name As Release Identity
Hard rule.
9. Release Source
Exact commit/tree.
10. Git Tag
Convenience only unless signed/verified.
11. Protected Branches
Recommended.
12. Mandatory Review
Critical code paths.
13. Code Ownership
Useful.
14. Source Signature
Optional but valuable.
15. Signed Commit/Tag
Not sufficient alone.
16. Dependency Classes
#![allow(unused)] fn main() { pub enum DependencySource { Registry, Git, Vendored, LocalWorkspace, SystemPackage, } }
17. Preferred Dependency Order
workspace
vendor/pinned registry
pinned git
system package only when necessary
18. Registry Dependency
Must include:
name
version
checksum
source registry
19. Cargo.lock
Required.
20. Lockfile Integrity
CI verifies no unexpected mutation.
21. No Unlocked Production Build
Hard rule.
22. Git Dependency
Must pin exact commit.
23. No Floating Branch/Tag
Hard rule.
24. Git Dependency Record
#![allow(unused)] fn main() { pub struct GitDependencyRef { pub repository: RepositoryId, pub commit: GitCommitHash, pub tree_digest: ContentDigest, } }
25. Vendoring
Recommended for high-assurance releases.
26. Vendor Snapshot
Content-addressed.
27. Vendor Manifest
#![allow(unused)] fn main() { pub struct VendorManifest { pub dependencies: Vec<VendoredDependency>, pub digest: ContentDigest, } }
28. No Manual Vendor Mutation
Hard rule.
29. Dependency Mirrors
Useful for availability.
30. Mirror Trust
Mirror is cache, not authority.
31. Verify Checksums Against Approved Metadata
Required.
32. No Trust In Mirror TLS Alone
Hard rule.
33. Registry Compromise Model
Assume:
malicious package version
metadata substitution
account takeover
34. Defense
checksums
lockfile
review
vendor snapshot
provenance
35. Dependency Provenance
Track origin.
36. Provenance Record
#![allow(unused)] fn main() { pub struct DependencyProvenance { pub package: PackageId, pub source: DependencySource, pub source_digest: ContentDigest, pub publisher: Option<PublisherIdentity>, } }
37. Publisher Identity
Informational unless independently verified.
38. No "Trusted Maintainer" Shortcut
Hard rule.
39. Build Script Risk
Rust crates may include:
build.rs
proc macros
native compilation
40. Build Script Inventory
Required.
41. Procedural Macro Inventory
Required.
42. Native Code Inventory
Required.
43. High-Risk Dependency Types
#![allow(unused)] fn main() { pub enum DependencyRiskClass { PureLibrary, ProcMacro, BuildScript, NativeFfi, CodeGenerator, } }
44. Risk Policy
Higher scrutiny for executable build-time code.
45. No Unreviewed New Build Script In Critical Release
Hard rule.
46. Dependency Review
For new/updated crate:
license
maintenance
security history
build scripts
unsafe use
network behavior
47. Unsafe Inventory
Track.
48. cargo deny
Recommended.
49. cargo audit
Recommended.
50. Advisory Intake
Automated.
51. Vulnerability Severity
#![allow(unused)] fn main() { pub enum SupplyChainSeverity { Informational, Low, Medium, High, Critical, } }
52. Critical Dependency Advisory
Release block unless explicitly not reachable/affected with evidence.
53. Reachability
Useful but not sole criterion.
54. Toolchain Provenance
Pin:
Rust version
rustup channel/date
LLVM where relevant
linker
native tools
55. rust-toolchain.toml
Required.
56. Toolchain Digest
Prefer verified installer/archive checksum.
57. No Auto-Latest Toolchain
Hard rule.
58. Toolchain Mirror
Can be internal.
59. Mirror Verification
Checksum/signature.
60. Build Environment
Hermetic.
61. Inputs Must Be Declared
Hard rule.
62. Build Environment Types
#![allow(unused)] fn main() { pub enum BuildEnvironmentKind { Nix, Container, Vm, DedicatedHost, } }
63. Nix/Flake
Strong candidate.
64. Container
Useful but does not alone guarantee hermeticity.
65. Dedicated Host
Useful for high-assurance signing/build.
66. Build Network Access
Disable where feasible.
67. No Network During Final Build
Preferred hard rule.
68. Why
Prevents undeclared dependency fetch.
69. Build Input Store
Pre-populated verified inputs.
70. Build User
Unprivileged.
71. Ephemeral Build Worker
Preferred.
72. No Production Credentials
Hard rule.
73. No Signing Key In Build Environment
Hard rule.
74. Build Isolation
Separate from release signing.
75. Build Provenance
#![allow(unused)] fn main() { pub struct BuildProvenance { pub source: SourceRevision, pub lockfile_digest: ContentDigest, pub vendor_digest: Option<ContentDigest>, pub toolchain_digest: ContentDigest, pub environment_digest: ContentDigest, pub output_digest: ContentDigest, } }
76. Provenance Signed
By build attestation identity.
77. Build Attestation Identity
Separate from release signer.
78. No Same Key For Build And Release Signing
Hard rule.
79. Build Attestation
Means:
this builder claims these inputs produced this output
80. Not:
this artifact is approved for production
81. Reproducible Builds
Goal:
same declared inputs
→ same output digest
82. Reproducibility Level
#![allow(unused)] fn main() { pub enum ReproducibilityLevel { BestEffort, Deterministic, IndependentlyReproduced, } }
83. BestEffort
Some nondeterminism remains.
84. Deterministic
Same controlled environment gives same output.
85. IndependentlyReproduced
Different trusted builders match.
86. High-Assurance Goal
IndependentlyReproduced.
87. Determinism Hazards
timestamps
absolute paths
filesystem order
hostnames
locale
random build IDs
88. Normalize Inputs
Where possible.
89. SOURCE_DATE_EPOCH
Useful concept.
90. No Build Timestamp In Critical Binary Unless Reproducible
Hard rule.
91. Reproducibility Manifest
#![allow(unused)] fn main() { pub struct ReproducibilityReport { pub builders: Vec<BuilderIdentity>, pub output_digests: Vec<ContentDigest>, pub level: ReproducibilityLevel, } }
92. Mismatch
Release blocker until explained.
93. Independent Builder
Different trust domain preferred.
94. Same CI Provider Twice
Weaker evidence.
95. Independent Environment
Better.
96. Binary Reproducibility
Per target.
97. Package Reproducibility
Separate from binary.
98. OCI Image Reproducibility
Separate.
99. VM Image Reproducibility
Separate.
100. SBOM
Mandatory.
101. SBOM Includes
package name
version
source
checksum
license
dependency relationships
native components
102. SBOM Formats
Possible:
CycloneDX
SPDX
103. Canonical Internal Model
Recommended.
104. SBOM Type
#![allow(unused)] fn main() { pub struct Sbom { pub artifact: ContentDigest, pub components: Vec<SbomComponent>, } }
105. SBOM Generated From Resolved Build Graph
Preferred.
106. No Handwritten SBOM
Hard rule.
107. SBOM Digest
Linked to release manifest.
108. License Metadata
Included.
109. Unknown License
Release policy decision.
110. Denied License
Release block.
111. Transitive Dependency Visibility
Required.
112. Native System Libraries
Included where linked/runtime required.
113. Container Base Image
Included.
114. Build Tool Dependencies
Separate build SBOM useful.
115. Runtime SBOM
Production-facing.
116. Build SBOM
Build-chain facing.
117. Artifact Identity
Content digest.
118. No Mutable Tag As Authority
Hard rule.
119. Artifact Descriptor
#![allow(unused)] fn main() { pub struct TrustedArtifact { pub digest: ContentDigest, pub provenance: BuildProvenanceRef, pub sbom: SbomRef, pub signatures: Vec<ArtifactSignature>, } }
120. Artifact Registry
Immutable objects.
121. Registry Metadata
Versioned.
122. Registry Compromise
Must not allow undetected substitution.
123. Node Verifies
digest
signature
provenance policy
security epoch
124. No Registry Trust Without Verification
Hard rule.
125. Artifact Transparency
Append-only release log.
126. Transparency Entry
#![allow(unused)] fn main() { pub struct ArtifactTransparencyEntry { pub artifact: ContentDigest, pub release: SoftwareVersion, pub provenance_digest: ContentDigest, pub sbom_digest: ContentDigest, pub signatures: Vec<ArtifactSignature>, } }
127. Transparency Log
Can be:
internal append-only
public
federated mirrors
128. Goal
Detect:
equivocation
hidden release
artifact substitution
129. No User Data In Transparency
Hard rule.
130. Release Signing
Part 72.
131. Signing Flow
build
→ reproduce
→ verify SBOM
→ verify provenance
→ qualify tests
→ approve
→ sign release manifest
132. HSM Signer
Signs approved digest/manifest.
133. No Direct Artifact Signing Without Qualification
Hard rule.
134. Release Manifest
#![allow(unused)] fn main() { pub struct SupplyChainReleaseManifest { pub version: SoftwareVersion, pub artifact: ContentDigest, pub provenance: ContentDigest, pub sbom: ContentDigest, pub verification: ContentDigest, pub signatures: Vec<ArtifactSignature>, } }
135. Exact Promotion
Same artifact hash from candidate to production.
136. No Rebuild For Production
Hard rule.
137. Promotion State
#![allow(unused)] fn main() { pub enum ArtifactPromotionState { Built, Verified, Reproduced, Qualified, Signed, Candidate, Production, Revoked, } }
138. State Transitions
Monotonic except revocation.
139. No Skip Verification Stage
Hard rule.
140. Artifact Revocation
Needed.
141. Revocation Record
#![allow(unused)] fn main() { pub struct ArtifactRevocation { pub artifact: ContentDigest, pub reason: ArtifactRevocationReason, pub effective_at: Timestamp, } }
142. Revocation Reasons
#![allow(unused)] fn main() { pub enum ArtifactRevocationReason { DependencyCompromise, BuildCompromise, SigningCompromise, CriticalVulnerability, ProvenanceFailure, } }
143. Revoked Artifact
Cannot be newly deployed.
144. Existing Deployment
Policy determines:
quarantine
drain
repair-forward
145. No Silent Continued Trust
Hard rule.
146. Dependency Compromise
Example:
maintainer account compromise
malicious crate version
147. Response
identify affected versions
map artifacts via SBOM
revoke affected artifacts if necessary
rebuild from safe dependency
rotate credentials if exposure occurred
148. SBOM Enables Blast-Radius Analysis
Critical.
149. Dependency Reachability
Optional optimization.
150. But
Known malicious build-time code may compromise build even if runtime unreachable.
151. Build-Time Compromise
Treat more seriously.
152. Poisoned Proc Macro
Can alter generated code.
153. Poisoned build.rs
Can alter build output.
154. Therefore
Build-time dependency compromise may invalidate artifacts broadly.
155. Registry Poisoning Incident
Scenario.
156. Response
Use:
lockfile
vendor snapshot
trusted mirror
157. No Emergency Update From Unverified Alternate Registry
Hard rule.
158. Build Runner Compromise
Severe.
159. Response
revoke builder identity
invalidate provenance
independently reproduce artifact
rotate build credentials
160. If Reproduction Differs
Treat artifact as suspect.
161. Build Attestation Compromise
Does not automatically compromise release signer.
162. Separation benefit.
163. Release Signing Key Compromise
Part 72.
164. Severe response.
165. Artifact Registry Compromise
If signatures/digests intact:
availability issue
more than trust issue.
166. If transparency log compromised
Use mirrors/witnesses.
167. Transparency Witness
Optional.
168. Multi-Witness
Better for critical releases.
169. Supply-Chain Root Of Trust
Not one thing.
170. It is distributed across:
source review
dependency verification
build environment
reproduction
release approval
HSM signing
runtime verification
171. Defense In Depth
Mandatory.
172. Dependency Update Workflow
proposal
→ review
→ sandbox build
→ tests
→ diff SBOM
→ merge
173. SBOM Diff
Critical.
174. Shows:
added components
removed components
version changes
license changes
175. New Native Dependency
High-risk review.
176. New Build Script
High-risk review.
177. New Proc Macro
High-risk review.
178. Dependency Pinning
Exact resolved version.
179. Semver Range
Allowed in Cargo.toml for developer convenience.
180. Lockfile defines release.
181. No cargo update In Release Job
Hard rule.
182. Dependency Refresh
Separate reviewed operation.
183. Vendor Refresh
Separate reviewed operation.
184. Toolchain Update Workflow
proposal
→ reproducibility test
→ security review
→ benchmark
→ rollout
185. Compiler Update
Can change binary significantly.
186. Treat as supply-chain change.
187. Build Cache
Useful.
188. Cache Key
Includes full declared inputs.
189. Cached Output
Still verified.
190. No Trust In Cache Hit Alone
Hard rule.
191. Remote Cache
Signed.
192. Cache Poisoning
Detected via digest mismatch.
193. Base Images
Pinned by digest.
194. No latest
Hard rule.
195. Base Image SBOM
Included.
196. VM Base Image
Pinned/checksummed.
197. Host Packages
Declarative.
198. Nix Store Paths
Strong provenance signal.
199. But
Still need upstream trust/review.
200. Offline Build
High assurance.
201. Air-Gapped Build
Possible for release candidate.
202. Need imported verified source/vendor/toolchain bundle.
203. Offline Build Bundle
#![allow(unused)] fn main() { pub struct OfflineBuildBundle { pub source: SourceRevision, pub vendor_manifest: VendorManifest, pub toolchain_digest: ContentDigest, pub environment_digest: ContentDigest, } }
204. Bundle Signed.
205. No Network Dependency.
206. Build Reproduction Service
#![allow(unused)] fn main() { pub trait ReproducibilityVerifier { fn reproduce( &self, provenance: &BuildProvenance, ) -> Result<ReproducibilityReport, SupplyChainError>; } }
207. Supply-Chain Policy
#![allow(unused)] fn main() { pub struct SupplyChainPolicy { pub required_reproducibility: ReproducibilityLevel, pub require_sbom: bool, pub require_signed_provenance: bool, pub allowed_dependency_sources: BTreeSet<DependencySource>, } }
208. Critical Production Policy
Could require:
SBOM
signed provenance
locked dependencies
independent reproduction
209. Small Self-Hosted
May use weaker profile.
210. Assurance Disclosure
Explicit.
211. Supply-Chain Assurance Level
#![allow(unused)] fn main() { pub enum SupplyChainAssurance { Development, Verified, Reproducible, HighAssurance, } }
212. No False High-Assurance Claim
Hard rule.
213. CI Trust Model
Untrusted pull request code cannot access:
release secrets
signing proposal authority
production credentials
214. Fork PR
Fully isolated.
215. Protected Release Workflow
Separate.
216. Runner Ephemerality
Recommended.
217. Reuse
Avoid for high-assurance builds.
218. Runner Image
Pinned.
219. Runner Attestation
Part 71.
220. Builder Attestation
Optional but useful.
221. Build Worker Identity
#![allow(unused)] fn main() { pub struct BuilderIdentity(pub [u8; 32]); }
222. Builder Trust
Scoped.
223. Compromised Builder
Revocable.
224. Provenance Must Record Builder.
225. Signing Service Trust
Part 72.
226. Promotion Service
Separate identity.
227. Separation Of Duties
Recommended:
developer
builder
approver
signer
promoter
228. No Single Credential For All Stages
Hard rule.
229. Supply-Chain Transparency Dashboard
Shows:
artifact digest
source commit
SBOM status
reproducibility
signatures
revocation status
230. No User Data.
231. Runtime Verification
Part 71.
232. Node startup verifies release manifest.
233. Artifact Digest Must Match.
234. SBOM Verification
Optional at node startup.
235. Better at release qualification.
236. Runtime Trust
At minimum:
signed manifest
artifact digest
security epoch
237. Revocation Feed
Nodes receive signed revocations.
238. Anti-Rollback
Old revocation state cannot disappear.
239. Hard rule.
240. Compromise Recovery
Supply-chain compromise requires structured recovery.
241. Recovery Phases
#![allow(unused)] fn main() { pub enum SupplyChainRecoveryPhase { Detect, Contain, Assess, RebuildTrust, RebuildArtifacts, Revoke, Redeploy, Validate, } }
242. Detect
Identify:
dependency
builder
registry
signer
artifact
243. Contain
Freeze:
releases
promotion
affected registry path
244. Assess
Map affected artifacts.
245. SBOM Query
Critical.
246. Rebuild Trust
Rotate compromised credentials/keys.
247. Rebuild Artifacts
From known-good inputs.
248. Revoke
Affected artifacts/signers/builders.
249. Redeploy
Repair forward.
250. Validate
Independent reproduction + runtime attestation.
251. No Blind Rollback To Older Vulnerable Artifact
Hard rule.
252. Repair Forward
Preferred.
253. Rollback
Only if older artifact is known-safe and security epoch allows.
254. Source Compromise
Example malicious commit merged.
255. Response
Revert + audit review chain.
256. Repository Credential Compromise
Rotate.
257. Re-signing Safe Artifact
May be necessary.
258. But
Only after trust chain restored.
259. Dependency Source Disappearance
Availability event.
260. Vendor snapshot prevents urgent fetch.
261. No Supply-Chain Availability Panic
Goal.
262. Dependency License Change
SBOM/license diff catches.
263. Policy Can Block.
264. Dependency Abandonment
Risk register.
265. Forking
Possible.
266. Fork Must receive new provenance identity.
267. No Pretend Original Upstream.
268. Crate Fork Policy
#![allow(unused)] fn main() { pub struct ForkedDependencyRecord { pub original: PackageId, pub fork_repository: RepositoryId, pub fork_commit: GitCommitHash, } }
269. Fork Maintenance
Explicit owner.
270. Supply-Chain Risk Register
#![allow(unused)] fn main() { pub struct SupplyChainRiskEntry { pub component: PackageId, pub severity: SupplyChainSeverity, pub owner: OwnershipRef, pub mitigation: RiskMitigation, } }
271. Orphan Critical Dependency
High risk.
272. Dependency Health
Useful signal.
273. But
Not sole security metric.
274. SBOM Retention
Keep per release.
275. Provenance Retention
Keep per release.
276. Transparency Retention
Long-term.
277. Why
Historical incident analysis.
278. Artifact Retention
Keep supported/forensic releases as policy dictates.
279. Revoked Artifact
May retain in quarantined archive for analysis.
280. Never serve accidentally.
281. Quarantine Namespace
Separate.
282. No Production Pull Access.
283. Provenance Verification API
#![allow(unused)] fn main() { pub trait ProvenanceVerifier { fn verify( &self, provenance: &BuildProvenance, policy: &SupplyChainPolicy, ) -> Result<VerifiedProvenance, SupplyChainError>; } }
284. Artifact Trust Evaluator
#![allow(unused)] fn main() { pub trait ArtifactTrustEvaluator { fn evaluate( &self, artifact: &TrustedArtifact, ) -> ArtifactTrustDecision; } }
285. Trust Decision
#![allow(unused)] fn main() { pub enum ArtifactTrustDecision { Trusted, Untrusted, Revoked, InsufficientEvidence, } }
286. Promotion Gate
#![allow(unused)] fn main() { pub trait ArtifactPromotionGate { fn approve( &self, artifact: &TrustedArtifact, ) -> Result<(), SupplyChainError>; } }
287. Promotion Requires All Mandatory Evidence.
288. No Manual Override For Critical Missing Evidence
Hard rule.
289. Emergency Release
May reduce nonessential test breadth.
290. But still requires:
verified source
locked dependencies
artifact digest
signing
critical security gates
291. No Unsigned Emergency Binary
Hard rule.
292. Dependency Transparency
Can publish high-level SBOM.
293. Sensitive Infrastructure Details
May be excluded.
294. Public Release SBOM
Recommended.
295. Internal Build SBOM
More detailed.
296. Supply-Chain Observability
Safe metrics:
artifacts reproduced
dependency advisories
revoked artifacts
builder health
297. Forbidden Metrics
No user data.
298. Supply-Chain SLOs
Examples:
100% production artifacts signed
100% production releases have SBOM
0 blocked dependency versions
reproducibility coverage target
299. Reproduction Lag SLO
Independent build completes before production promotion for critical releases.
300. Vulnerability Response SLO
Critical advisory triaged quickly.
301. Supply-Chain Incident Playbooks
Part 65.
302. Mandatory Playbooks
registry compromise
dependency compromise
CI compromise
signing-key compromise
artifact-registry compromise
303. Disaster Exercises
Part 70.
304. Exercise registry compromise.
305. Exercise build-runner compromise.
306. Exercise revoked release rollout.
307. Testing
Need supply-chain testkit.
308. Test Scenarios
wrong checksum
lockfile drift
poisoned mirror
tampered artifact
mismatched provenance
stolen signer
309. Checksum Test
Wrong dependency rejected.
310. Lockfile Test
Release job refuses uncommitted lock change.
311. Git Pin Test
Floating ref rejected.
312. Offline Build Test
Build succeeds with declared inputs only.
313. Repro Test
Independent outputs match.
314. SBOM Test
All runtime components represented.
315. Signature Test
Tampered artifact rejected.
316. Registry Substitution Test
Digest mismatch rejected.
317. Revocation Test
Revoked artifact not deployed.
318. Builder Compromise Test
Bad provenance invalidates trust.
319. Signing Compromise Test
New trust chain/rotation works.
320. Base Image Test
Tag mutation has no effect because digest pinned.
321. Cache Poisoning Test
Bad cache object rejected.
322. Dependency Removal Test
Vendored build still works.
323. Fuzzing
Fuzz:
SBOM parser
provenance envelope
release manifest
revocation record
324. Property Tests
Properties:
production promotion never accepts unsigned artifact
revoked artifact never transitions back to trusted without new digest/new release
dependency input digest change always changes provenance
candidate→production preserves exact artifact digest
325. Formal Verification Targets
Strong candidates:
artifact promotion state machine
revocation precedence
supply-chain policy evaluation
compromise recovery state
326. Kani Candidate
policy gate logic.
327. TLA+ Candidate
multi-builder reproducibility + signer compromise transition.
328. Loom Candidate
concurrent promotion + revocation.
329. Performance
Supply-chain verification is not hot path.
330. Node Startup
Artifact verification must remain fast enough.
331. Repro Builds
Can be expensive.
332. Acceptable.
333. Storage
SBOM/provenance small compared to artifacts.
334. Crate Layout
Recommended:
crates/
├── siar-supply-chain-core/
├── siar-dependency-provenance/
├── siar-build-provenance/
├── siar-reproducibility/
├── siar-sbom/
├── siar-artifact-trust/
├── siar-artifact-transparency/
├── siar-artifact-revocation/
├── siar-supply-chain-recovery/
└── siar-supply-chain-testkit/
335. siar-supply-chain-core
Owns:
trust levels
states
errors
336. siar-dependency-provenance
Registry/git/vendor input records.
337. siar-build-provenance
Build environment/input/output attestations.
338. siar-reproducibility
Independent rebuild reports.
339. siar-sbom
Canonical internal SBOM + exporters.
340. siar-artifact-trust
Trust evaluation/promotion gates.
341. siar-artifact-transparency
Append-only artifact log.
342. siar-artifact-revocation
Artifact revocation state/feed.
343. siar-supply-chain-recovery
Compromise recovery orchestration.
344. siar-supply-chain-testkit
Registry/cache/builder/signer attack simulation.
345. Error Taxonomy
#![allow(unused)] fn main() { pub enum SupplyChainError { SourceUnverified, LockfileMismatch, DependencyChecksumMismatch, DependencySourceDenied, ToolchainUnverified, BuildEnvironmentMismatch, ReproducibilityMismatch, SbomMissing, ProvenanceMissing, SignatureInvalid, ArtifactRevoked, PromotionDenied, Internal, } }
346. Security & Operational Invariants
Mandatory:
1. Every production artifact is bound to an exact source revision, locked dependency graph, toolchain, and build environment.
2. Floating Git refs, mutable tags, and unlocked dependency resolution are forbidden for production releases.
3. Build workers have no production credentials or release-signing keys.
4. High-assurance releases include machine-generated SBOM and signed build provenance.
5. Candidate and production promotion use the exact same artifact digest; production is never rebuilt separately.
6. Artifact registries and mirrors are treated as distribution channels, not roots of trust; nodes verify signatures and digests independently.
7. Revoked artifacts, builders, and signing authorities cannot regain trust through stale metadata or rollback.
8. Build-time executable dependencies such as proc macros, build scripts, and native code receive higher review scrutiny.
9. Supply-chain compromise recovery maps affected artifacts through SBOM/provenance before redeployment.
10. Emergency releases still require verified source, locked dependencies, integrity, signing, and critical security gates.
11. Supply-chain transparency, SBOMs, and provenance contain no user data.
12. Independent reproducibility is the preferred high-assurance evidence that declared source/input state corresponds to the released binary.
347. Initial Production Scope
Implement first:
locked Cargo dependencies
exact Git commit pinning
dependency checksums
vendor snapshot option
build/proc-macro/native dependency inventory
pinned Rust/toolchain
hermetic build environment
network-disabled final release build
machine-generated SBOM
signed build provenance
artifact transparency entry
exact artifact promotion
artifact revocation
independent reproduction for critical releases
supply-chain incident playbooks
Then add:
multi-builder reproducibility witnesses
public transparency mirrors
automated SBOM blast-radius queries
signed dependency mirror metadata
formal promotion/revocation verification
advanced source provenance
348. Definition of Done
Part 73 is complete when:
- source, dependency, toolchain, build, artifact, signing, and promotion trust domains are explicit
- every production build uses exact source revision and locked dependencies
- build scripts/proc macros/native dependencies are inventoried
- release builds are isolated and preferably network-free
- build workers do not possess release-signing authority
- SBOM and provenance are generated automatically
- reproducibility levels are recorded
- independent reproduction exists for high-assurance releases
- candidate→production preserves exact artifact digest
- artifact transparency and revocation are available
- node/runtime verification does not trust registry location alone
- supply-chain compromise can be mapped to affected artifacts
- repair-forward/revocation procedures are defined
- registry, mirror, cache, builder, dependency, signer, and provenance attack tests are specified
349. Final Architecture
SOURCE REVISION
│
▼
VERIFIED DEPENDENCIES
│
▼
HERMETIC BUILD INPUTS
│
▼
BUILD ARTIFACT
│
┌─────────────┼─────────────┐
│ │ │
Provenance SBOM Reproduction
│ │ │
└─────────────┼─────────────┘
▼
RELEASE QUALIFICATION
│
▼
HSM SIGNING
│
▼
TRANSPARENCY + PROMOTION
│
▼
PRODUCTION VERIFICATION
Supply-chain trust model:
exact source
+
verified dependencies
+
pinned toolchain
+
hermetic build
+
reproducibility
+
SBOM/provenance
+
HSM signing
+
artifact transparency
+
revocation
not:
CI produced a binary, so we assume it is trustworthy
350. Final Principle
Software supply-chain trust is not established by one signature or one CI pipeline.
The correct model is:
trace every input
+
control the build
+
reproduce independently
+
record provenance
+
sign narrowly
+
verify everywhere
+
recover explicitly from compromise
This architecture gives SIAR an end-to-end software supply-chain trust system capable of explaining and verifying how each production artifact was created, identifying the blast radius of dependency/build/signing compromise, and recovering without weakening the anonymous-network security guarantees established across Parts 34–72.