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
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
Stage 1
Register artefact
Identity and source context
Stage 2
Record revision
Append-only history and lineage
Stage 3
Verify evidence
Checksums and signed receipts
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
Entity
Artefact version or generated evidence
Activity
Revision, backup or recovery event
Agent
Human operator or software identity
Version history
Original artefact
Initial identity and digest
New version
Recorded relationship to prior state
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
Revision / evidence history
Source identity and expected digest
ProtectedBackupStore
Abstraction for protected object storage
VerifiedRecoveryCoordinator
Checks metadata and controls recovery output
Provider-specific implementations
AWS S3 adapter
Object version and retention information
Azure Blob adapter
Blob identity and immutability metadata
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
Source revision
Stable identity and SHA-256 digest
Versioned backup object
Provider identity and object version
Ed25519 receipt
Signed identity, digest and retention claims
Independent checker
Signature, claims, checksum and content length
Recovery exercise
Request known version
Do not silently fetch an unrelated latest object
Restore to test output
Keep the recovery separate from live data
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.
