Skip to content

Software engineering · Research prototype · In development

ProvenanceGraph

An experiment in traceable artefact histories, verifiable evidence, signed receipts and independent recovery.

  • Java 21
  • Gradle
  • SHA-256
  • Ed25519
Explore the technical deep dive

The question

How can software demonstrate where an artefact came from, what changed, what evidence supports it and whether a recovery copy is trustworthy?

The approach

ProvenanceGraph studies append-only revision histories and explicit links between artefacts, changes and evidence. It also explores protecting backups and creating independently verifiable receipts. The data relationships draw on W3C PROV concepts.

Architecture at a glance

ProvenanceGraph evidence and recovery model

  1. Stage 1

    Register artefact

    Identity and source context

  2. Stage 2

    Record revision

    Append-only history and lineage

  3. Stage 3

    Verify evidence

    Checksums and signed receipts

  4. Stage 4

    Test recovery

    Isolated, independently checked copies

This shows prototype responsibilities, not proven cloud-provider enforcement or independent production recovery.

Work so far

  • Implemented append-only revision history with file-backed persistence and integrity checks.
  • Implemented cloud-provider adapter prototypes for S3, Azure Blob and Google Cloud; tests use mocked provider behaviour.
  • Tested Ed25519-signed verification receipts that bind identity, version and checksum metadata.

What comes next

  • Validate cloud retention and access controls against real provider environments.
  • Strengthen persistent recovery evidence, replay protection and independent key custody.
  • Test fuller W3C PROV interoperability and validate cloud adapters in controlled live environments.

Research and development note

ProvenanceGraph is experimental software. W3C PROV-inspired design does not establish formal interoperability, regulatory compliance or proven cloud immutability.

For developers and researchers

Technical deep dive

ProvenanceGraph explores how an artefact can carry a readable history of changes and independently checked backup evidence. A checksum can detect changed bytes, but it cannot by itself prove who signed a claim, which object version was stored or whether a cloud provider enforced retention.

Three diagrams show the provenance vocabulary, the storage-adapter boundary and a verification-and-recovery journey. Provider integration results described here are from development tests, not an independent live-cloud security audit.

Provenance model: what changed, when, and by whom?

The design favours append-only revision records over silently overwriting an artefact. A new revision should refer to its predecessor and preserve evidence of the change. This makes a history auditable: an investigator can ask not only what the latest artefact contains, but how it came to exist and which inputs and actions contributed.

W3C PROV provides a useful conceptual vocabulary: an Entity represents a thing such as an artefact version; an Activity represents processing, revision or recovery; an Agent represents a person or software service with responsibility for an activity. Keeping these concepts separate is useful when the same file passes through several services. The design is PROV-informed; formal interchange conformance is a future validation goal.

Data / provenance view

A simplified W3C PROV relationship

Distinguish the thing being tracked, the action performed and the actor responsible.

Conceptual PROV vocabulary
  1. Entity

    Artefact version or generated evidence

  2. Activity

    Revision, backup or recovery event

  3. Agent

    Human operator or software identity

Version history
  1. Original artefact

    Initial identity and digest

  2. New version

    Recorded relationship to prior state

  3. Audit trail

    Source and checks available for later review

These are conceptual PROV relationships. The diagram is not a claim that the implementation currently exports a fully validated W3C PROV serialisation.

Storage adapters and cloud-provider boundaries

The backup architecture uses a protected-store abstraction so the core recovery rules do not need to know the details of every cloud SDK. An adapter must map provider-specific object versions, retention settings, checksum and content-length evidence into a common verification contract. This allows the core workflow to ask whether a backup is recoverable while still retaining the provider-specific metadata that makes a claim testable.

Development work includes adapters for AWS S3, Azure Blob Storage and Google Cloud Storage. Their SDK-facing behaviour has been exercised with mocked provider responses, including mismatched content, altered receipts and interrupted transfers. The difficult trade-off is avoiding a lowest-common-denominator interface that conceals different provider guarantees: a retention flag returned by an API is not automatically proof that an independent administrator could not remove the data.

System / component view

One recovery contract, several provider adapters

Separate common verification logic from storage-specific implementation details.

Core verification and recovery
  1. Revision / evidence history

    Source identity and expected digest

  2. ProtectedBackupStore

    Abstraction for protected object storage

  3. VerifiedRecoveryCoordinator

    Checks metadata and controls recovery output

Provider-specific implementations
  1. AWS S3 adapter

    Object version and retention information

  2. Azure Blob adapter

    Blob identity and immutability metadata

  3. Google Cloud adapter

    Object generation and hold/retention details

The second row lists alternative adapters, not a sequential data path. Provider-specific mocked tests do not establish live IAM, write-once enforcement or actual recovery performance.

Integrity and cryptographically signed receipts

SHA-256 is useful for comparing expected and recovered bytes, but a hash stored alongside an artefact can be modified by someone who can edit both values. The receipt design uses Ed25519 signatures to bind claims such as backup identity, storage version, checksum, retention metadata, issuing key identifier and time. A verifier checks the signature and compares the claims with the actual retrieved content and provider metadata.

A signature answers a narrower question than people sometimes expect: did an authorised signing key attest to these exact receipt fields? It does not prove the original data was truthful, the signer was not compromised, the storage provider honoured retention, or that data can be restored quickly. Those need independent controls and operational tests.

Verification / sequence view

Evidence-backed recovery rather than trust by assertion

A recovery receipt is useful only when its identity and bytes can be checked independently.

Backup to verification
  1. Source revision

    Stable identity and SHA-256 digest

  2. Versioned backup object

    Provider identity and object version

  3. Ed25519 receipt

    Signed identity, digest and retention claims

  4. Independent checker

    Signature, claims, checksum and content length

Recovery exercise
  1. Request known version

    Do not silently fetch an unrelated latest object

  2. Restore to test output

    Keep the recovery separate from live data

  3. Verification result

    Reject changed bytes, replay or incomplete output

This is the intended verification chain exercised with mocked storage providers. It does not show a completed disaster recovery against a live cloud tenancy.

Testing, threat boundaries and unresolved work

The Java 21 and Gradle prototype has test work around signed receipts, content-length and checksum mismatches, source-version reuse, interrupted recovery and empty backups across provider adapters. These cases matter because a backup can appear present and still be unsafe: it might be truncated, linked to the wrong revision or paired with a tampered receipt.

The remaining security questions are as important as the code. Production claims require independently controlled signing keys, trustworthy storage identity, narrowly scoped credentials, persistent verification receipts, durable replay protection and a reproducible recovery drill. Those guarantees cannot be established purely by mocking SDK responses, and no live-provider immutability certification is claimed.

  • Keep version identity and provenance alongside every integrity check; never assume a matching filename denotes matching bytes.
  • Reject a recovery when the receipt, stored object version or measured content does not match the expected source revision.
  • Exercise real provider IAM and retention controls separately, with cost limits and non-sensitive test data, before describing any provider as independently hardened.

Evidence and current limits

The described Java prototype and mocked adapter scenarios are from the project development work. The ProvenanceGraph implementation repository is not currently linked publicly from this site, so the page deliberately avoids presenting a source-code link or unverified performance figures.

W3C PROV alignment is conceptual at this stage. No production-grade durability, live cloud IAM/retention enforcement, independent key custody, compliance certification or disaster-recovery time is asserted.