Recued
Menu
← Back to recipes

Verify an inbound artifact

by recued-core v2 12 views

Use “Verify an inbound artifact” in Recued. Run every applicable check against a file on disk — version fingerprint against the sender's published checksum, a detached Minisign signature against a public key you already hold, archive integrity, and a member listing — and record each result separately.

Complete workflow

Use Inbound Artifact Verification in Recued for signature, checksum, minisign, and integrity. It includes 8 built-in actions and 3 ready-to-run workflows. Actions that change data use Recued's approval controls.

You are viewing one recipe in this workflow. Installing it opens the complete pack so its other recipes and background automations arrive together.

Use “Verify an inbound artifact” in Recued. Run every applicable check against a file on disk — version fingerprint against the sender's published checksum, a detached Minisign signature against a public key you already hold, archive integrity, and a member listing — and record each result separately.

pack:inbound-artifact-verificationverificationsignaturechecksum
by recued-core pinned v2

Use “Register an inbound artifact” in Recued. Record a file you have received so it can be verified. Keyed on its path, so re-registering the same file converges on the same row instead of creating a second one.

pack:inbound-artifact-verificationverificationrecordsv2
by recued-core pinned v2

Use “Show artifact verifications” in Recued. List received artifacts with each check's result shown separately. It reads information without changing data in the connected service.

pack:inbound-artifact-verificationverificationboardrecords
by recued-core pinned v2
View pack details, dependencies, and permissions →

Why the checks are PREFETCH steps

⛔⛔ This is the whole design, and it is not stylistic. Every one of these tools reports failure the same way: a non-zero exit. signature.verify, file.test_gzip and archive.list_tar are all exit_code_handling: zero_is_success with no captured output — so a failed check is a failed step. And a failed sequential step ends the run (errors.push(log.error); break;), which would mean a recipe whose entire job is to record a failure could never record one.

optional: true — the flag that turns a step failure into a null result and lets the run continue — is honoured only in prefetch (prefetch.ts:232; the sequential runner has no equivalent). So the checks run as optional prefetch steps, and the sequential half reads which ones survived.

Prefetch steps run in PARALLEL and cannot read each other, so every check takes its inputs from {{config.*}} — never from another step. That is why you pass the path, the signature and the key here rather than having the recipe read them off the artifact row.

Reading the result

A skipped check and a failed check both land as null. They are told apart by whether the check was APPLICABLE, which is computed from your config: Archive kind decides whether the listing and integrity checks apply, and a blank Signature file means no signature check was asked for. A check that was applicable and came back null is a failure; one that was never applicable is reported as not-run. The card shows both counts separately.

verified requires every applicable check to pass AND at least one to have run. An artifact with no checksum, no signature and no archive kind runs zero checks and is recorded failed with a note — because "nothing was checked" must never read as "nothing was wrong".

Digests are compared case-insensitively but exactly. Paste the sender's checksum whole; a truncated prefix will not match and is not treated as a partial pass.

This reads a path on your disk that you name. The ops are read-only — digest, verify, test, list — and none of them extracts, writes or executes anything. Nothing is uploaded.

How it works 56 steps

Inspect the data fetches, transforms, gates, and output this recipe runs.

Data fetch
digest ?
signature ?
skip: config.signature_path is_empty
listing ?
skip: config.kind equal file
integrity ?
skip: config.kind not_equal tar.gz
Process (52 steps)
artifact_id trim
Trim whitespace from setting artifact id
id_present compare
Check if artifact id has data
id_guard guard
Stop if id present equals
artifact ?
artifact_found compare
Check if artifact record id has data
artifact_guard guard
Stop if artifact found equals
path_matches compare
Check if artifact record path equals setting path
path_guard guard
Stop if path matches equals
digest_ref default
Apply default
digest_produced compare
Check if digest ref has data
digest_persist ?
skip: step.digest_produced equal false
digest_record_id default
Apply default
digest_read ?
skip: step.digest_record_id is_empty
digest_text decode_base64
Apply decode_base64
digest_trimmed trim
Trim whitespace from digest text
digest_parts split
Split digest trimmed into parts
computed_raw default
Apply default
computed_sha256 lowercase
Convert computed raw to lowercase
expected_trimmed trim
Trim whitespace from setting expected sha256
expected_sha256 lowercase
Convert expected trimmed to lowercase
digest_applicable compare
Check if expected sha256 has data
digest_matches compare
Check if computed sha256 equals expected sha256
digest_ok all
Check if all conditions are true
signature_applicable all
Check if all conditions are true
signature_ran compare
Check if signature exists
signature_ok all
Check if all conditions are true
integrity_applicable compare
Check if setting kind equals tar.gz
integrity_ran compare
Check if integrity exists
integrity_ok all
Check if all conditions are true
listing_applicable compare
Check if setting kind does not equal file
listing_text default
Apply default
listing_trimmed trim
Trim whitespace from listing text
listing_lines split
Split listing trimmed into parts
listing_line_count count
Count items in listing lines
member_count ternary
Apply ternary
listing_ok all
Check if all conditions are true
n_digest ternary
Apply ternary
n_signature ternary
Apply ternary
n_integrity ternary
Apply ternary
n_listing ternary
Apply ternary
checks_run math
Calculate: {{step.n_digest}} + {{step.n_signature}} + {{step.n_integrity}} + {{step.n_listing}}
any_check_ran compare
Check if checks run is greater than 0
digest_verdict ternary
Apply ternary
signature_verdict ternary
Apply ternary
integrity_verdict ternary
Apply ternary
listing_verdict ternary
Apply ternary
all_passed all
Check if all conditions are true
status ternary
Apply ternary
no_checks_note ternary
Apply ternary
verified_at date_add
Add 0 seconds to
artifact_update ?
card to_summary
Format results as a summary card
Settings 6 configurable

Configurable at install. Defaults shown — change them anytime in Recued.

kind setting = file
path setting =
public key setting =
artifact id setting = [object Object]
signature path setting =
expected sha256 setting =

About

Tags

pack:inbound-artifact-verificationverificationsignaturechecksumminisignrecordsv2

Details

56 steps 6 configurable settings recipe_id: verify-inbound-artifact