WEB / WEB-21.S02
Dependencies, CI/CD integrity and safe deployment
Evaluate artifact equality, provenance and configuration gates separately.
1. Core · Mechanism
Read every scenario without motion
Review allowed
- Source fixture ready
The source fixture holds the public Atlas Notes and Tea & Bread text, expected manifest and source-revision alias. The builder has not produced a digest; the review gate has not decided hash, config or provenance conditions.
- Source fixture
- Fixed public source/manifest ready
- Local builder
- Local bytes pending; actual CI=false
- Review gate
- Gate waiting; candidate not accepted
- Local candidate list
- Local review list unchanged; deployment=false
- Source reached builder
The builder receives the completed input; this actor performs no actual CI runner operation or dependency package installation.
- Source fixture
- Fixed public source/manifest ready
- Local builder
- Fixed public input received; byte preparation pending
- Review gate
- Gate waiting; candidate not accepted
- Local candidate list
- Local review list unchanged; deployment=false
- Digest candidate ready
The builder locally prepares fixed bytes and SHA metadata; provenance verification is not this step’s cryptographic result.
- Source fixture
- Fixed public source/manifest ready
- Local builder
- Public artifact and declared manifest ready
- Review gate
- Gate waiting; candidate not accepted
- Local candidate list
- Local review list unchanged; deployment=false
- Candidate reached gate
The gate sees completed artifact arrival; hash, provenance and configuration await separate local checks.
- Source fixture
- Fixed public source/manifest ready
- Local builder
- Public artifact and declared manifest ready
- Review gate
- Candidate received; hash/provenance/config pending
- Local candidate list
- Local review list unchanged; deployment=false
- Review gate decision
Each gate is evaluated for the same candidate; a matching digest alone proves neither a trusted builder nor safe configuration.
- Source fixture
- Fixed public source/manifest ready
- Local builder
- Public artifact and declared manifest ready
- Review gate
- Hash/provenance/config/review allow
- Local candidate list
- Local review list unchanged; deployment=false
- Review dispatch ready
The approved candidate is prepared only for the owned local review list; no release/deployment permission exists.
- Source fixture
- Fixed public source/manifest ready
- Local builder
- Public artifact and declared manifest ready
- Review gate
- Approved local-review candidate ready; deploy=false
- Local candidate list
- Local review list unchanged; deployment=false
- Local review delivery
The candidate reaches the local review list at completed arrival; no public publishing or infrastructure write occurs.
- Source fixture
- Fixed public source/manifest ready
- Local builder
- Public artifact and declared manifest ready
- Review gate
- Approved local-review candidate ready; deploy=false
- Local candidate list
- Candidate received for review; no deployment/write
- Eligible review outcome
The terminal state is only eligible-for-review; actual CI, runtime configuration enforcement and rollout are not established.
- Source fixture
- Fixed public source/manifest ready
- Local builder
- Public artifact and declared manifest ready
- Review gate
- Approved local-review candidate ready; deploy=false
- Local candidate list
- Eligible-for-review; published=false; deployed=false
Hash mismatch
- Source fixture ready
The source fixture holds the public Atlas Notes and Tea & Bread text, expected manifest and source-revision alias. The builder has not produced a digest; the review gate has not decided hash, config or provenance conditions.
- Source fixture
- Fixed public source/manifest ready
- Local builder
- Local bytes pending; actual CI=false
- Review gate
- Gate waiting; candidate not accepted
- Local candidate list
- Local review list unchanged; deployment=false
- Source reached builder
The builder receives the completed input; this actor performs no actual CI runner operation or dependency package installation.
- Source fixture
- Fixed public source/manifest ready
- Local builder
- Fixed public input received; byte preparation pending
- Review gate
- Gate waiting; candidate not accepted
- Local candidate list
- Local review list unchanged; deployment=false
- Digest candidate ready
The builder locally prepares fixed bytes and SHA metadata; provenance verification is not this step’s cryptographic result.
- Source fixture
- Fixed public source/manifest ready
- Local builder
- Public artifact and declared manifest ready
- Review gate
- Gate waiting; candidate not accepted
- Local candidate list
- Local review list unchanged; deployment=false
- Candidate reached gate
The gate sees completed artifact arrival; hash, provenance and configuration await separate local checks.
- Source fixture
- Fixed public source/manifest ready
- Local builder
- Public artifact and declared manifest ready
- Review gate
- Candidate received; hash/provenance/config pending
- Local candidate list
- Local review list unchanged; deployment=false
- Review gate decision
Each gate is evaluated for the same candidate; a matching digest alone proves neither a trusted builder nor safe configuration.
- Source fixture
- Fixed public source/manifest ready
- Local builder
- Public artifact and declared manifest ready
- Review gate
- Known public-byte mismatch; no approval
- Local candidate list
- Local review list unchanged; deployment=false
- Candidate withheld
A required hash/config/provenance condition was not accepted; no candidate is dispatched to the local list.
- Source fixture
- Fixed public source/manifest ready
- Local builder
- Public artifact and declared manifest ready
- Review gate
- Review delivery=0; approved body absent; write=false
- Local candidate list
- Local review list unchanged; deployment=false
- Diagnostic distinction
The local reason separates a known mismatch from unknown provenance; a negative gate reaches neither production nor the review list.
- Source fixture
- Fixed public source/manifest ready
- Local builder
- Public artifact and declared manifest ready
- Review gate
- Known config/hash denial
- Local candidate list
- Local review list unchanged; deployment=false
Debug enabled
- Source fixture ready
The source fixture holds the public Atlas Notes and Tea & Bread text, expected manifest and source-revision alias. The builder has not produced a digest; the review gate has not decided hash, config or provenance conditions.
- Source fixture
- Fixed public source/manifest ready
- Local builder
- Local bytes pending; actual CI=false
- Review gate
- Gate waiting; candidate not accepted
- Local candidate list
- Local review list unchanged; deployment=false
- Source reached builder
The builder receives the completed input; this actor performs no actual CI runner operation or dependency package installation.
- Source fixture
- Fixed public source/manifest ready
- Local builder
- Fixed public input received; byte preparation pending
- Review gate
- Gate waiting; candidate not accepted
- Local candidate list
- Local review list unchanged; deployment=false
- Digest candidate ready
The builder locally prepares fixed bytes and SHA metadata; provenance verification is not this step’s cryptographic result.
- Source fixture
- Fixed public source/manifest ready
- Local builder
- Public artifact and declared manifest ready
- Review gate
- Gate waiting; candidate not accepted
- Local candidate list
- Local review list unchanged; deployment=false
- Candidate reached gate
The gate sees completed artifact arrival; hash, provenance and configuration await separate local checks.
- Source fixture
- Fixed public source/manifest ready
- Local builder
- Public artifact and declared manifest ready
- Review gate
- Candidate received; hash/provenance/config pending
- Local candidate list
- Local review list unchanged; deployment=false
- Review gate decision
Each gate is evaluated for the same candidate; a matching digest alone proves neither a trusted builder nor safe configuration.
- Source fixture
- Fixed public source/manifest ready
- Local builder
- Public artifact and declared manifest ready
- Review gate
- Hash matches; debug policy denied
- Local candidate list
- Local review list unchanged; deployment=false
- Candidate withheld
A required hash/config/provenance condition was not accepted; no candidate is dispatched to the local list.
- Source fixture
- Fixed public source/manifest ready
- Local builder
- Public artifact and declared manifest ready
- Review gate
- Review delivery=0; approved body absent; write=false
- Local candidate list
- Local review list unchanged; deployment=false
- Diagnostic distinction
The local reason separates a known mismatch from unknown provenance; a negative gate reaches neither production nor the review list.
- Source fixture
- Fixed public source/manifest ready
- Local builder
- Public artifact and declared manifest ready
- Review gate
- Known config/hash denial
- Local candidate list
- Local review list unchanged; deployment=false
Missing provenance
- Source fixture ready
The source fixture holds the public Atlas Notes and Tea & Bread text, expected manifest and source-revision alias. The builder has not produced a digest; the review gate has not decided hash, config or provenance conditions.
- Source fixture
- Fixed public source/manifest ready
- Local builder
- Local bytes pending; actual CI=false
- Review gate
- Gate waiting; candidate not accepted
- Local candidate list
- Local review list unchanged; deployment=false
- Source reached builder
The builder receives the completed input; this actor performs no actual CI runner operation or dependency package installation.
- Source fixture
- Fixed public source/manifest ready
- Local builder
- Fixed public input received; byte preparation pending
- Review gate
- Gate waiting; candidate not accepted
- Local candidate list
- Local review list unchanged; deployment=false
- Digest candidate ready
The builder locally prepares fixed bytes and SHA metadata; provenance verification is not this step’s cryptographic result.
- Source fixture
- Fixed public source/manifest ready
- Local builder
- Public artifact and declared manifest ready
- Review gate
- Gate waiting; candidate not accepted
- Local candidate list
- Local review list unchanged; deployment=false
- Candidate reached gate
The gate sees completed artifact arrival; hash, provenance and configuration await separate local checks.
- Source fixture
- Fixed public source/manifest ready
- Local builder
- Public artifact and declared manifest ready
- Review gate
- Candidate received; hash/provenance/config pending
- Local candidate list
- Local review list unchanged; deployment=false
- Review gate decision
Each gate is evaluated for the same candidate; a matching digest alone proves neither a trusted builder nor safe configuration.
- Source fixture
- Fixed public source/manifest ready
- Local builder
- Public artifact and declared manifest ready
- Review gate
- Hash matches; provenance evidence unknown
- Local candidate list
- Local review list unchanged; deployment=false
- Candidate withheld
A required hash/config/provenance condition was not accepted; no candidate is dispatched to the local list.
- Source fixture
- Fixed public source/manifest ready
- Local builder
- Public artifact and declared manifest ready
- Review gate
- Review delivery=0; approved body absent; write=false
- Local candidate list
- Local review list unchanged; deployment=false
- Diagnostic distinction
The local reason separates a known mismatch from unknown provenance; a negative gate reaches neither production nor the review list.
- Source fixture
- Fixed public source/manifest ready
- Local builder
- Public artifact and declared manifest ready
- Review gate
- Unknown provenance; safely withheld
- Local candidate list
- Local review list unchanged; deployment=false
ACTORS · STATE · DATA FLOW
Environment configuration is also a release input
The same artifact can create different exposure under different runtime configuration. Document debug output, admin-access policy, accepted-host profile, secret injection and storage connections per environment. Atlas Notes selects a release-review profile requiring debug=false, owner-only admin policy and configured host rules. These are this fixture’s policy values. Django 5.2’s deployment checklist explains disabling production DEBUG, but this lesson runs no Django and does not claim that one flag secures a system. An obscure admin URL does not replace authentication/authorization; network isolation and application permission are different layers. Configuration review is separate from the build hash: correct bytes can still run with inappropriate exposure. No deployment happens here; the profile only selects candidates for an approved local review list.
Dependencies extend beyond direct packages
A dependency inventory includes direct and transitive packages, build tooling and pipeline integrations/actions. A lockfile stabilizes selected resolution and integrity metadata; it does not certify every package as trustworthy or free of vulnerabilities. Consider pinning alongside acquisition provenance and maintained-version review. Third-party JavaScript running in a browser document’s context can also change data-access boundaries; CDN hosting does not make it isolated. SRI compares particular resource bytes against expected hashes. It proves neither the trustworthiness of the HTML selecting those hashes nor the business safety of the code. Cross-origin SRI depends on the browser’s CORS requirements. The artifact’s dep-A is only a synthetic inventory alias, not a registry package or installed dependency. No new package, action or remote script is fetched.
Hashes and provenance answer complementary questions
Comparing an artifact’s SHA-256 is useful for byte equality; the trusted manifest supplying the expected digest is a separate question. Provenance connects an artifact to source revision, builder and build profile. SLSA v1.2 verification guidance distinguishes trusted builders/roots, provenance signatures and expected build types/parameters. This ledger is not a complete SLSA attestation: signature validation and builder trust are declared inputs only. The fixed public text’s digest is actually calculated locally. With missing provenance, even a correct digest leaves builder evidence unknown and closes review delivery. Build provenance does not replace code review or deployment authorization. If artifact and metadata come from the same untrusted source, their agreement creates no new trust. Record hash results and the approval gate’s reason separately.
Which evidence supports promotion and rollback?
A safe deployment design aims to promote a reviewed artifact with the same identity/digest rather than rebuilding it, validate environment configuration and release permission, and define health and rollback conditions in advance. A tag resolving to different bytes or a rollback incompatible with a data migration raises separate concerns; possession of an old artifact does not guarantee recovery. Here source-rev-A and builder-A are descriptive aliases, not actual Git commits or runners. The scene follows source → builder → review gate → local candidate list. Its terminal state is eligible-for-review, never published or deployed. Even with declared review permission, actualDeployment remains false. This boundary states what actually completed: a finite gate was evaluated; infrastructure, a public endpoint and rollout were not verified.
2. Red · Trust & Impact
Read every scenario without motion
Hash and config
- Exact public bytes
Expected text contains Atlas Notes and Tea & Bread lines. SHA-256 binds byte equality, while source-rev-A and builder-A are separate declared identity aliases.
- Candidate input ledger
- Candidate-A / exact expected text
- Review conjunction
- Not yet evaluated
- Local-candidate outcome
- Not yet evaluated
- Hash-different decision
The ordinary Bread & Tea change misses the expected digest and closes review. This denial is not an executable payload or detected supply-chain compromise.
- Candidate input ledger
- Candidate-A / exact expected text
- Review conjunction
- Different bytes / local review denied
- Local-candidate outcome
- Not yet evaluated
- No approved body
hash-different has null approved body, no write and no deployment. Its normal candidate ID/digest is not delivered as approved.
- Candidate input ledger
- Candidate-A / exact expected text
- Review conjunction
- Different bytes / local review denied
- Local-candidate outcome
- No approved body / no write or deploy
- Debug-on keeps bytes
debug-on has the same artifact text and can pass digest checking. debugEnabled true independently closes configuration gating; byte identity does not establish hardening.
- Candidate input ledger
- Same digest / debug true / review denied
- Review conjunction
- Different bytes / local review denied
- Local-candidate outcome
- No approved body / no write or deploy
- Admin and host configuration
Owner-only admin and hostProfileConfigured are separate declarations, not results of actual server-access or public-exposure tests.
- Candidate input ledger
- Same digest / debug true / review denied
- Review conjunction
- Config declarations / live enforcement unmeasured
- Local-candidate outcome
- No approved body / no write or deploy
- Release authority is separate
Even normal review delivery has deploymentPermission false. Test/digest success grants no deployment authority; local approval is not publication.
- Candidate input ledger
- Same digest / debug true / review denied
- Review conjunction
- Config declarations / live enforcement unmeasured
- Local-candidate outcome
- Local approval ≠ deployment permission
Provenance gate
- Right hash, missing binding
provenance-missing retains normal bytes with null provenance, builder trust and signature evidence. Missing evidence is not labelled a false digest.
- Candidate input ledger
- Digest equal / provenance evidence null
- Review conjunction
- Not yet evaluated
- Local-candidate outcome
- Not yet evaluated
- Unknown versus approval
The gate requires source, builder, dependency review and review permission beyond hashing. Unknown provenance is not completed into approval, so review delivery is false.
- Candidate input ledger
- Digest equal / provenance evidence null
- Review conjunction
- Required provenance unknown / gate closed
- Local-candidate outcome
- Not yet evaluated
- Not a signed attestation
completeSLSAAttestation is false; sourceRevision is not an actual Git commit and builder is not a runner. Alias ledgers do not certify signed provenance or trusted pipelines.
- Candidate input ledger
- Digest equal / provenance evidence null
- Review conjunction
- Required provenance unknown / gate closed
- Local-candidate outcome
- Declared aliases / no complete attestation
- Dependency-pin scope
Dep-A at fixture-rev-1 is supplied inventory with actualPackage false. Pinning narrows resolution, not code data-use or transitive approval.
- Candidate input ledger
- Declared locked revision ≠ code safety
- Review conjunction
- Required provenance unknown / gate closed
- Local-candidate outcome
- Declared aliases / no complete attestation
- SRI trust scope
SRI needs trusted expected hashes and is not code safety. Cross-origin SRI requires CORS compatibility; code in the host Document needs separate admission review.
- Candidate input ledger
- Declared locked revision ≠ code safety
- Review conjunction
- Integrity/trust/code admission distinct
- Local-candidate outcome
- Declared aliases / no complete attestation
- Keep impact bounded
This example runs no registry installation, package scan or browser SRI. The broken assumption is incomplete local-gate input binding, not proven vendor compromise.
- Candidate input ledger
- Declared locked revision ≠ code safety
- Review conjunction
- Integrity/trust/code admission distinct
- Local-candidate outcome
- Local gate reasoning / no supply-chain incident claim
ASSUMPTION · BOUNDARY · CONTROL
Mistaking a green build for a trusted release
The assumption is that a successful build or matching digest also settles provenance, configuration and release approval. Conflating those gates can give unreviewed source, a different builder or debug-on configuration the same promotion result. The hash-different row contains another harmless public title; it is no attack payload or package-substitution attempt. The gate only determines that expected bytes differ. In the provenance-missing row the bytes match but builder evidence is absent; labeling that a failed hash would also be wrong. Ask whether every gate is bound to its intended input. Passing a test grants neither deployment privileges to a builder nor permission to expose administration. No actual runner, registry or production configuration was examined, so these rows claim neither a supply-chain compromise nor successful safe deployment.
The scope of dependency and browser trust
The second assumption treats a pinned dependency or SRI hash as proof that third-party code is harmless. Those controls concern selected resolution or expected bytes; data use, transitive behavior and publisher provenance still need review. A runtime script executing in a document’s context does not become origin-isolated simply because its network host differs. Integrity success does not change secret classification either. This lesson scans no source map, bundle or package contents; inventory fields are supplied teaching data. Relate dependency, revision, permission and build input questions to the same candidate. Missing review evidence remains unknown and closes review delivery. Package installation, remote script invocation or exploitation workflows against a vendor or organization are outside the example.
3. Blue · Secure development & defense
Read every scenario without motion
Review controls
- Normal candidate binding
Candidate-A binds source-rev-A, builder-A and expected digest. With normal declared review/config predicates, the approved body carries only candidate ID and digest.
- Bytes and declarations
- Normal local review / ID + digest
- Gate comparison
- Not yet evaluated
- Evidence outcome
- Not yet evaluated
- Three independent denies
hash-different tests byte equality, debug-on configuration, and missing provenance the evidence binding. All retain null body with distinct coverage.
- Bytes and declarations
- Normal local review / ID + digest
- Gate comparison
- Hash/config/provenance denials separate
- Evidence outcome
- Not yet evaluated
- Actual digest control
SHA can actually be computed for public artifactText. That calculation does not execute builder identity or declared signature checks; observed and supplied fields remain separate.
- Bytes and declarations
- Normal local review / ID + digest
- Gate comparison
- Hash/config/provenance denials separate
- Evidence outcome
- Computed SHA / supplied provenance predicates
- Immutable-candidate review
Approval binds to a reviewed digest rather than a mutable branch name. Changed source/config/builder needs new binding; names cannot substitute for exact bytes.
- Bytes and declarations
- Exact reviewed candidate / no mutable-name substitute
- Gate comparison
- Hash/config/provenance denials separate
- Evidence outcome
- Computed SHA / supplied provenance predicates
- Boundary-check record
Review permission, admin policy and host configuration enter the conjunction. Browser SRI and rollback health remain unverified rather than being marked executed.
- Bytes and declarations
- Exact reviewed candidate / no mutable-name substitute
- Gate comparison
- Permission/config required / browser/rollback unmeasured
- Evidence outcome
- Computed SHA / supplied provenance predicates
- Local-delivery receipt
Passing yields local review delivery; failure yields null approved body. Every row retains no write/deployment; finite policy results are not actual CI or publication.
- Bytes and declarations
- Exact reviewed candidate / no mutable-name substitute
- Gate comparison
- Permission/config required / browser/rollback unmeasured
- Evidence outcome
- Bounded review result / no deployment
Approval gap
- Digest-message-only view
Only expected hash equality is known while provenance/config/permission evidence is missing. The same hash can occur in debug-on or missing-provenance cases.
- Bytes and declarations
- Digest equal / other required gates missing
- Gate comparison
- Not yet evaluated
- Evidence outcome
- Not yet evaluated
- Do not copy normal booleans
Normal builderTrustedDeclared true is an expectation, not missing-event builder evidence. Adding it would turn unknown provenance into approval.
- Bytes and declarations
- Digest equal / other required gates missing
- Gate comparison
- Expected trusted builder ≠ event proof
- Evidence outcome
- Not yet evaluated
- Delivery uncertainty
Approval and configuration validity remain UNKNOWN. Deployment permission remains false; hash equality yields no publication or safe-production conclusion.
- Bytes and declarations
- Digest equal / other required gates missing
- Gate comparison
- Expected trusted builder ≠ event proof
- Evidence outcome
- Approval/config UNKNOWN / deployment closed
- Required review bindings
Source revision, builder evidence, dependency review, target configuration and permission must bind to the same candidate. Actual digest is only one part of the relation.
- Bytes and declarations
- Needed: source/builder/deps/config/permission
- Gate comparison
- Expected trusted builder ≠ event proof
- Evidence outcome
- Approval/config UNKNOWN / deployment closed
- Attestation-scope question
Signed provenance needs trusted roots and artifact-subject binding. This alias profile has no complete attestation; a signature field does not imply native verification.
- Bytes and declarations
- Needed: source/builder/deps/config/permission
- Gate comparison
- Named signature field ≠ verified attestation
- Evidence outcome
- Approval/config UNKNOWN / deployment closed
- Outcome for new evidence
New evidence must show all required gates decided on the same digest. This event retains equality without closing missing provenance or configuration through guesswork.
- Bytes and declarations
- Needed: source/builder/deps/config/permission
- Gate comparison
- Named signature field ≠ verified attestation
- Evidence outcome
- Retain digest / collect scoped gate evidence
IMPLEMENTATION · SECURITY CONTROL · VERIFICATION
Keep candidate identity stable across gates
The defensive pipeline binds source revision, dependency-resolution profile, trusted builder evidence, artifact digest and target configuration to the same candidate ID. Approval applies to the reviewed artifact rather than only a branch name or mutable tag. Give the builder minimal identity privileges and require separate authority at the release gate. The candidate list here accepts only local review delivery; it has no publication permission. Debug and admin-policy checks remain independent from the hash check. Review dependency changes like contracts, documenting direct/transitive scope and runtime browser-script access. If using SRI, protect the expected hash’s provenance and cross-origin CORS compatibility separately. Applying these profiles to an actual platform requires integration evidence for signed provenance and trusted roots; those fields are declarative here.
A negative gate must send no candidate
The native check only calculates SHA-256 for fixed Atlas Notes texts and evaluates the supplied gate conjunction. Hash-different, debug-on and missing-provenance rows require expectedReviewDelivery=false, write=false and approvedBody=null. Absent provenance is not hidden as a known false assertion; unknown evidence has its own field. The last actor in the normal branch receives a candidate for approved local review. No deployment, DNS change, public distribution or CI workflow is triggered. Debug flags and admin policy are configuration declarations in this model, not settings actually applied to a server. A fixture rejecting inappropriate configuration even for a matching digest separates two distinct questions. Local evidence covers artifact equality and finite policy. Actual supply-chain acquisition, browser SRI enforcement, reproducible builds and rollback health need separate execution.
NOW APPLY IT TO THE CASE
Does artifact equality alone open local review?
Candidate-A expects Atlas Notes and Tea & Bread bytes. Bread & Tea changes the digest, while debug-on retains bytes but closes review. Missing provenance retains the digest while builder evidence is unknown. These outcomes are local review, not deployment.
Evaluate the case data journey together with environment, dependency and telemetry context. Does an operational-success label establish every application outcome?
Open the related case file ↗READ THE EXAMPLE TOGETHER
Atlas Notes — boundary ledger
Select a field and examine what it supports and where the evidence ends.
Read the raw artifact and field explanations
{
"profile": {
"candidateId": "candidate-A",
"sourceRevision": "source-rev-A",
"builder": "builder-A",
"artifactText": "Atlas Notes\nTea & Bread\n",
"expectedSha256": "33712b8230bab40dfec44a3f5d732760810e62715641864fdd8c8b43e9563129",
"target": "owned-local-review",
"actualCI": false,
"actualDeployment": false
},
"rows": [
{
"case": "normal",
"artifactText": "Atlas Notes\nTea & Bread\n",
"sourceRevision": "source-rev-A",
"builder": "builder-A",
"provenancePresent": true,
"builderTrustedDeclared": true,
"signatureVerifiedDeclared": true,
"dependencyReviewDeclared": true,
"reviewPermissionDeclared": true,
"debugEnabled": false,
"adminPolicy": "owner-only",
"hostProfileConfigured": true,
"expectedReviewDelivery": true,
"expectedApprovedBody": {
"candidateId": "candidate-A",
"sha256": "33712b8230bab40dfec44a3f5d732760810e62715641864fdd8c8b43e9563129"
},
"expectedWrite": false,
"actualDeployment": false
},
{
"case": "hash-different",
"artifactText": "Atlas Notes\nBread & Tea\n",
"sourceRevision": "source-rev-A",
"builder": "builder-A",
"provenancePresent": true,
"builderTrustedDeclared": true,
"signatureVerifiedDeclared": true,
"dependencyReviewDeclared": true,
"reviewPermissionDeclared": true,
"debugEnabled": false,
"adminPolicy": "owner-only",
"hostProfileConfigured": true,
"expectedReviewDelivery": false,
"expectedApprovedBody": null,
"expectedWrite": false,
"actualDeployment": false
},
{
"case": "debug-on",
"artifactText": "Atlas Notes\nTea & Bread\n",
"sourceRevision": "source-rev-A",
"builder": "builder-A",
"provenancePresent": true,
"builderTrustedDeclared": true,
"signatureVerifiedDeclared": true,
"dependencyReviewDeclared": true,
"reviewPermissionDeclared": true,
"debugEnabled": true,
"adminPolicy": "owner-only",
"hostProfileConfigured": true,
"expectedReviewDelivery": false,
"expectedApprovedBody": null,
"expectedWrite": false,
"actualDeployment": false
},
{
"case": "provenance-missing",
"artifactText": "Atlas Notes\nTea & Bread\n",
"sourceRevision": "source-rev-A",
"builder": "builder-A",
"provenancePresent": null,
"builderTrustedDeclared": null,
"signatureVerifiedDeclared": null,
"dependencyReviewDeclared": true,
"reviewPermissionDeclared": true,
"debugEnabled": false,
"adminPolicy": "owner-only",
"hostProfileConfigured": true,
"expectedReviewDelivery": false,
"expectedApprovedBody": null,
"expectedWrite": false,
"actualDeployment": false
}
],
"dependencyInventory": [
{
"alias": "dep-A",
"scope": "runtime",
"lockedRevision": "fixture-rev-1",
"integrityEvidence": "declared",
"review": "accepted-declared",
"actualPackage": false
}
],
"browserBoundary": {
"SRIIsCodeSafety": false,
"expectedHashNeedsTrust": true,
"crossOriginSRIRequiresCORS": true,
"actualBrowserCheck": false
},
"provenanceProfile": {
"completeSLSAAttestation": false,
"sourceRevisionIsActualGitCommit": false,
"builderIsActualRunner": false
},
"promotionBoundary": {
"localReviewOnly": true,
"deploymentPermission": false,
"actualPublish": false,
"rollbackHealthVerified": false
}
}- rows
- Local review gate: hash, declared provenance and configuration are distinct conditions.
- dependencyInventory
- Synthetic alias; not installed-package inventory or registry evidence.
- browserBoundary
- SRI integrity scope is neither code safety nor an actual browser result.
- promotionBoundary
- Review delivery is not publication or deployment.
SHA can actually be calculated for public text; provenance/config are supplied. No actual CI, dependency installation, browser SRI check or deployment.
Two reality checks
A matching hash makes a release trustworthy.
Expected-hash provenance, builder/config and release authority need separate checks.
Pinned code or SRI proves code safety.
Byte/resolution equality does not prove behavior or business safety.
YOUR TURN
Work through this story.
Predict the outcome, find the evidence boundary, and explain it in your own words.
The artifact bytes match the expected hash, but debugEnabled=true. Is local-review delivery approved?
- Yes. A matching hash proves every config and access policy.
- No. debug-on has expectedReviewDelivery=false.
Read the explained answer
No. debug-on has expectedReviewDelivery=false. — The hash condition passes, but this candidate fails config policy. No approved body is produced.
Provenance fields are null. Do source-revision and builder labels count as a verified attestation?
Selected lesson artifact fields; teaching example
- rows[3].provenancePresent
- null
- rows[3].builderTrustedDeclared
- null
- rows[3].signatureVerifiedDeclared
- null
- rows[3].expectedReviewDelivery
- false
- provenanceProfile
- {"completeSLSAAttestation":false,"sourceRevisionIsActualGitCommit":false,"builderIsActualRunner":false}
- No. Review delivery is withheld; no complete attestation is present.
- Yes. Any builder name guarantees its own authenticity.
Read the explained answer
No. Review delivery is withheld; no complete attestation is present. — Builder/source aliases are not verification of an actual Git commit or runner. provenancePresent=null is missing acceptance evidence.
Why are local approved-review data, SRI and a locked dependency neither a real deployment nor a code-safety guarantee?
Read the explained answer
SRI checks expected bytes, not code safety. The expected hash itself needs a trusted source, and cross-origin SRI also has CORS conditions. A locked dependency revision does not remove update/review policy. This output is local review only, with deploymentPermission=false and actualPublish=false. No actual CI, package, browser SRI or rollback-health test is performed.
□ I did not treat hash/SRI success as code safety.
□ I did not treat local review as deployment permission or publication.
Open the application console · request / response / browser
Also open request, URL, cookie and DOM examples
Sources and scope
- OWASP CI/CD Security Cheat SheetManaging Third-Party Code / Dependency Management · Plug-In and Integration Management
- SLSA v1.2 Verifying artifactsHow to verify: builder identity, signature and expected buildType/parameters · Step1: artifact/provenance/root of trust binding
- Django5.2 Deployment checklistCritical settings: DEBUG · Environment-specific settings: ALLOWED_HOSTS / caches / databases
- MDN Subresource IntegrityHow browsers handle Subresource Integrity · Subresource Integrity and CORS / crossorigin
- Node.js v24.13.0 Cryptocrypto.createHash / hash.update / hash.digest on fixed public data