Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
106 commits
Select commit Hold shift + click to select a range
e303687
ci(te): also expose dva-processing
MYRhouma Jul 24, 2026
7ea0f74
feat(vc): remove the ACA-Py controller svc
MYRhouma Jul 24, 2026
368900b
feat(api): remove ACA-Py coupling from dva-api
MYRhouma Jul 26, 2026
7f05201
test(karate): temporarily disable attestation tests
bzp99 Jul 29, 2026
bd09c72
feat(proc): remove ACA-Py coupling from dva-processing
bzp99 Jul 29, 2026
d1ed0a4
feat(vc): add new service skeleton
MYRhouma Jul 24, 2026
22ed572
feat(vc): verify whitelist before payload decode and handle signature…
MYRhouma Jul 27, 2026
a6aaf07
docs(vc): improve VC Manager API spec
bzp99 Jul 31, 2026
c242236
chore(vc): add ruff config and apply mechanical formatting
bzp99 Jul 31, 2026
47bccce
feat(vc): remove auth for now
bzp99 Jul 31, 2026
80ed341
refactor(vc): improve OpenAPI spec serving
bzp99 Jul 31, 2026
8a3050f
refactor(vc): remove dead code
bzp99 Jul 31, 2026
dc2505a
refactor(vc): hoist deferred imports to module level
bzp99 Jul 31, 2026
e4f9c78
feat(vc): use structlog for logging
bzp99 Jul 31, 2026
2659685
refactor(vc): build whitelist repo during app startup
bzp99 Jul 31, 2026
9737699
refactor(vc): resolve the signing key store via Depends
bzp99 Jul 31, 2026
cc5b59b
refactor(vc): read settings via pydantic-settings
bzp99 Aug 3, 2026
a105a8f
docs(vc): remove remaining refs to Kotlin modules
bzp99 Aug 3, 2026
9ed42c0
refactor(vc): improve DTO handling
bzp99 Aug 3, 2026
27c961b
fix(vc): reject non-object JWS payloads
bzp99 Aug 3, 2026
d055f66
refactor(vc): use VerifyKey in the did:key codec
bzp99 Aug 3, 2026
b7b519b
ci(vc): improve docker build setup
bzp99 Aug 6, 2026
78e921f
ci: add global dockerignore file
bzp99 Aug 6, 2026
cdcb152
refactor(vc): delegate did:key encoding to multiformats
bzp99 Aug 6, 2026
64fc557
refactor(vc): switch out httpx for httpx2
bzp99 Aug 6, 2026
8a89cf4
refactor(vc): persist only the ed25519 seed
bzp99 Aug 6, 2026
498b5ab
refactor(vc)!: replace hand-rolled JWS with joserfc
bzp99 Aug 6, 2026
7ae8317
Persist VC issuance and verification audit records
MYRhouma Aug 10, 2026
2b94952
feat(vla): add separate VLA manager backend
MYRhouma Jul 24, 2026
7b341a7
chore(vla): add ruff config and apply mechanical formatting
bzp99 Aug 12, 2026
5d432cc
feat(vla): remove auth for now
bzp99 Aug 17, 2026
631c11d
refactor(vla): remove dead code
bzp99 Aug 17, 2026
3c9c7b2
refactor(vla): hoist deferred imports to module level
bzp99 Aug 17, 2026
c68e4b6
refactor(vla): improve OpenAPI spec serving
bzp99 Aug 17, 2026
9c06e39
feat(vla): use structlog for logging
bzp99 Aug 18, 2026
8d65063
refactor(vla): read settings via pydantic-settings
bzp99 Aug 18, 2026
2995a87
refactor(vla): build repositories during app startup
bzp99 Aug 19, 2026
7cda12d
refactor(vla): improve DTO handling
bzp99 Aug 19, 2026
b814367
refactor(vla): split the repository module
bzp99 Aug 19, 2026
1af25fd
fix(vla): return spec-conformant error bodies
bzp99 Aug 19, 2026
9f3567e
docs(vla): improve VLA Manager API spec
bzp99 Aug 19, 2026
8c3aaa3
docs(vla): refresh the README
bzp99 Aug 19, 2026
e9e4447
ci(vla): improve docker build setup
bzp99 Aug 19, 2026
5d4f123
ci(vla): add build and test workflow
bzp99 Aug 19, 2026
3e6d10b
docs(vla): rm code comments referencing deprecated module
bzp99 Aug 19, 2026
6648edd
test(vla): add template endpoint unit tests
bzp99 Aug 19, 2026
6d0009c
feat(api)!: remove RMQ and VLA mgmt endpoints
MYRhouma Jul 24, 2026
4aedc8a
feat(proc)!: remove rmq integration
bzp99 Aug 21, 2026
125c008
feat(api): add sync attest and verify endpoints
MYRhouma Jul 24, 2026
73109e4
docs(api): update openapi spec for attest endpoints
MYRhouma Jul 24, 2026
1668477
docs(api): align OpenAPI specs with code and share common schemata
bzp99 Sep 9, 2026
025bd5c
test(api): install the production plugins in tests
bzp99 Sep 9, 2026
1a25041
test(api): pin that an unissued JWS is omitted instead of null
bzp99 Sep 10, 2026
53948af
feat(api): serve the DVA API spec rather than the legacy aggregate
bzp99 Sep 10, 2026
66932a5
docs(api): refer to RFC 9457 rather than the obsoleted 7807
bzp99 Sep 10, 2026
889c9be
feat(vla,vc): also serve shared schemas
bzp99 Sep 11, 2026
61e5127
feat(api): answer malformed and unreadable bodies with problem details
bzp99 Sep 11, 2026
f07cb2c
chore(proc): add ruff config and apply mechanical formatting
bzp99 Sep 12, 2026
363e59c
refactor(proc): drop the AoV handler orphaned by the RMQ removal
bzp99 Sep 12, 2026
ab49821
feat(proc): return spec-conformant error bodies
bzp99 Sep 12, 2026
c62d4c0
fix(proc): repair the JQ and JSON schema engine result handling
bzp99 Sep 12, 2026
fe26070
feat(proc): express requirements as ODCS data quality entries
bzp99 Sep 12, 2026
891f4df
feat(proc): serve the DVA Processing API spec
bzp99 Sep 12, 2026
cbbf7d4
feat(proc): add the evaluate-batch endpoint
bzp99 Sep 12, 2026
9eee1f1
feat(proc): add the evaluate-from-template endpoint
bzp99 Sep 12, 2026
7628e3b
refactor(proc): read the new settings through the config object
bzp99 Sep 12, 2026
1161d6b
test(proc): add evaluation endpoint and spec-serving unit tests
bzp99 Sep 12, 2026
f929ee7
docs(proc): refresh the README
bzp99 Sep 12, 2026
a4b7871
chore(proc): upgrade locked dependencies
bzp99 Sep 13, 2026
e146cf9
feat(proc): add evaluation logic validation
bzp99 Sep 14, 2026
791dcd9
ci(proc): run ruff alongside the tests
bzp99 Sep 13, 2026
481bd90
feat(vla): validate rendered template requirements
bzp99 Sep 14, 2026
674098e
feat(vla): show requirement validation feedback on UI
MYRhouma Aug 29, 2026
9e28426
feat(vla): let author validate requirement manually
bzp99 Sep 13, 2026
d04dec8
docs(vla): correct the migration status note
bzp99 Sep 13, 2026
12cd441
feat(vla): modernize the frontend UI
MYRhouma Aug 3, 2026
689be52
feat(vla,dash): show VLA metadata across builder and dashboard
MYRhouma Aug 10, 2026
7c11c3e
feat(dash): align styling with the VLA manager
MYRhouma Aug 10, 2026
8631ab2
feat(vla): show sample submission feedback
MYRhouma Aug 10, 2026
5ffa56b
feat(vla): improve participant and tag inputs
MYRhouma Aug 10, 2026
ffc09cc
feat(dash): polish data views
MYRhouma Aug 17, 2026
540720f
fix(vla,dash): polish responsive layouts
MYRhouma Aug 22, 2026
e4f75fd
feat(dash,vla): add a failure vocabulary for records
MYRhouma Aug 23, 2026
a8a928f
test(dash,vla): add complete failure and template fixtures
MYRhouma Aug 23, 2026
a8dccd2
feat(dash): explain attestation and verification failures
MYRhouma Aug 23, 2026
49d7e22
feat(vla): add a template workspace
MYRhouma Aug 23, 2026
192a7a0
feat(vla): add guided template authoring and testing
MYRhouma Aug 24, 2026
70bb5dc
feat(vla): connect template tools to the VLA builder
MYRhouma Aug 24, 2026
00dd234
test(dash): verify failure-aware dashboard workflows
MYRhouma Aug 24, 2026
6fde2e8
fix(dash): make health states truthful
MYRhouma Aug 24, 2026
b135b34
test(dash,vla): move the new tests into their components
bzp99 Sep 14, 2026
d3ca94a
ci(dash): run the dashboard tests
bzp99 Sep 14, 2026
06a532a
fix(te): align the local environment with the refactored services
MYRhouma Aug 30, 2026
642dd67
chore(vla): strip trailing whitespace from the frontend sources
MYRhouma Aug 30, 2026
c962af5
fix(vla): drop the queued wording left behind by the RMQ removal
MYRhouma Aug 30, 2026
34a809d
feat(api): add the VLA template assistant endpoint
MYRhouma Sep 4, 2026
bc553a9
feat(vla): add the VLA template assistant drawer
MYRhouma Sep 5, 2026
02d5fea
chore(te): configure optional assistant settings
MYRhouma Sep 6, 2026
5d8084c
feat(vla): support Gemini and Anthropic assistants
MYRhouma Sep 8, 2026
720cec2
feat(vla): polish template assistant workspace
MYRhouma Sep 8, 2026
b917cf5
fix(vla): preserve variable editor focus
MYRhouma Sep 8, 2026
cc3f5e3
fix(vla): enforce executable drafts and reveal responses
MYRhouma Sep 8, 2026
7231dff
Add French Ministry of Education demo
nada-a1 Aug 26, 2026
d46add0
Add files via upload
nada-a1 Aug 26, 2026
0038245
docs: define DVA failure taxonomy
MYRhouma Aug 28, 2026
de01a37
docs: map feedback, recovery, and failure relationships
MYRhouma Aug 28, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 25 additions & 0 deletions .dockerignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
# Docker reads .dockerignore from the build-context root only. The service
# Dockerfiles reference ./<service>/... paths, so the context is this
# directory and per-service .dockerignore files have no effect.

# Generic
.git/
**/.gitignore
**/Dockerfile

# JVM projects
**/.gradle/
**/.idea/
**/.kotlin/
**/build/


# Python projects
**/.venv/
**/__pycache__/
**/*.pyc
**/.pytest_cache/
**/*.egg-info/

# Node projects
**/node_modules/
4 changes: 4 additions & 0 deletions .github/workflows/build-dva-dashboard.yml
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ on:
- dva-dashboard/**/*.js
- dva-dashboard/**/*.html
- dva-dashboard/src/**
- dva-dashboard/test/**
- dva-dashboard/package.json
- dva-dashboard/pnpm-lock.yaml
- dva-dashboard/public/**
Expand All @@ -17,6 +18,7 @@ on:
- dva-dashboard/**/*.js
- dva-dashboard/**/*.html
- dva-dashboard/src/**
- dva-dashboard/test/**
- dva-dashboard/package.json
- dva-dashboard/pnpm-lock.yaml
- dva-dashboard/public/**
Expand Down Expand Up @@ -53,5 +55,7 @@ jobs:
cache-dependency-path: dva-dashboard/pnpm-lock.yaml
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Run tests
run: pnpm run test
- name: Build project
run: pnpm run build
4 changes: 4 additions & 0 deletions .github/workflows/build-dva-processing.yml
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,10 @@ jobs:
working-directory: ./dva-processing
- name: Install dependencies
run: uv sync --locked
- name: Check formatting
run: uv run --no-sync ruff format --check src tests
- name: Lint
run: uv run --no-sync ruff check src tests
- name: Run Pytest
run: uv run --no-sync pytest --junitxml=junit.xml
- name: Upload test artefacts
Expand Down
60 changes: 60 additions & 0 deletions .github/workflows/build-vla-manager-api.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
---
name: Build and Test VLA Manager API


on:
push:
paths:
- vla-manager-api/src/**
- vla-manager-api/tests/**
- vla-manager-api/pyproject.toml
- vla-manager-api/uv.lock
- .github/workflows/build-vla-manager-api.yml
pull_request:
paths:
- vla-manager-api/src/**
- vla-manager-api/tests/**
- vla-manager-api/pyproject.toml
- vla-manager-api/uv.lock
- .github/workflows/build-vla-manager-api.yml


permissions:
contents: read


concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: ${{ github.event_name == 'pull_request' }}


defaults:
run:
working-directory: ./vla-manager-api


jobs:
build-and-test:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v7
- name: Install uv
uses: astral-sh/setup-uv@v9.0.0
with:
enable-cache: true
working-directory: ./vla-manager-api
- name: Install dependencies
run: uv sync --locked
- name: Check formatting
run: uv run --no-sync ruff format --check src tests
- name: Lint
run: uv run --no-sync ruff check src tests
- name: Run Pytest
run: uv run --no-sync pytest --junitxml=junit.xml
- name: Upload test artefacts
if: ${{ !cancelled() }}
uses: actions/upload-artifact@v7
with:
name: pytest-results
path: vla-manager-api/junit.xml
4 changes: 4 additions & 0 deletions .github/workflows/build-vla-manager.yml
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ on:
- vla-manager/**/*.js
- vla-manager/**/*.html
- vla-manager/src/**
- vla-manager/test/**
- vla-manager/package.json
- vla-manager/pnpm-lock.yaml
- vla-manager/public/**
Expand All @@ -17,6 +18,7 @@ on:
- vla-manager/**/*.js
- vla-manager/**/*.html
- vla-manager/src/**
- vla-manager/test/**
- vla-manager/package.json
- vla-manager/pnpm-lock.yaml
- vla-manager/public/**
Expand Down Expand Up @@ -53,5 +55,7 @@ jobs:
cache-dependency-path: vla-manager/pnpm-lock.yaml
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Run tests
run: pnpm run test
- name: Build project
run: pnpm run build
4 changes: 4 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,2 +1,6 @@
# commitlint
node_modules/
__pycache__/
*.pyc
.DS_Store
*.egg-info/
46 changes: 2 additions & 44 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,6 @@ At the moment, DVA has several subcomponents:
* **API server** in [`dva-api/`](dva-api/) – gateway / entry point / connector integration
* **Processing** in [`dva-processing/`](dva-processing/) – evaluates veracity requirements
* **RabbitMQ** from [`rabbitmq`](https://hub.docker.com/_/rabbitmq) – message queue facilitating communication between the API server and the processing module
* **ACA-Py Controller** in [`dva-acapy-controller/`](dva-acapy-controller/) – contains SSI/VC-related logic
* **ACA-Py Agent** from [`ghcr.io/hyperledger/aries-cloudagent-python`](https://github.com/orgs/hyperledger/packages/container/package/aries-cloudagent-python) – an SSI cloud agent (~ wallet)
* **PostgreSQL** from [`postgres`](https://hub.docker.com/_/postgres) – stores application state, events, and _logs_
* **Dashboard** in [`dva-dashboard/`](dva-dashboard/) – frontend application that displays database contents on a dashboard interface
* **VLA Manager** in [`vla-manager`](vla-manager/) – frontend application for VLAs management (creation, display, etc)
Expand All @@ -28,15 +26,13 @@ You can use the following commands to build / pull the images (from the reposito
docker buildx build -t dva-api:latest -f dva-api/Dockerfile ./
docker buildx build -t dva-processing:latest -f dva-processing/Dockerfile ./
docker pull rabbitmq:4-management-alpine
docker buildx build -t dva-aca-py-controller:latest -f dva-acapy-controller/Dockerfile ./
docker pull ghcr.io/hyperledger/aries-cloudagent-python:py3.9-0.12.6
docker pull postgres:17-alpine
docker buildx build -t dva-dashboard:latest ./dva-dashboard/
docker buildx build -t vla-manager:latest ./vla-manager/
```

> [!NOTE]
> Check the currently used RabbitMQ, PostgreSQL, and ACA-Py versions in [`test-env/common-services.yml`](test-env/common-services.yml).
> Check the currently used RabbitMQ and PostgreSQL versions in [`test-env/common-services.yml`](test-env/common-services.yml).

You normally do not have to do this however as you should be using Docker Compose to set up your DVA instance (see the [_test environment_](test-env/)).

Expand Down Expand Up @@ -88,7 +84,7 @@ Example requests to test functionality manually (non-exhaustive):
| `/vla/from-templates` | `POST` | *nothing* | a [VLA request using templates](test-env/test-data/vla-request/request-from-templates.json) | `201 CREATED` and [an ID](test-env/example-outputs/id.json) |
| `/vla/{id}` | `GET` | `id`: a VLA ID (eg `570b22e0-2e90-4e02-8c7b-1d6d274629f3`) | *empty* | `200 OK` and the VLA template ([example](test-env/example-outputs/vla-id-get.json)) |
| `/attestation` | `POST` | *nothing* | an [AoV request](test-env/test-data/aov/timestamp-in-range/request-good.json) | `200 OK` and [an ID](test-env/example-outputs/id.json) |
| `/attestation/verify` | `POST` | *nothing* | an [AoV verification request](test-env/test-data/aov/verif-req.json) | `200 OK` and an AoV JSON object from ACA-Py |
| `/attestation/verify` | `POST` | *nothing* | an [AoV verification request](test-env/test-data/aov/verif-req.json) | `200 OK` and an AoV JSON object |

> [!NOTE]
> AoV requests (`POST /attestation`) are processed asynchronously.
Expand Down Expand Up @@ -172,44 +168,6 @@ In the test output, you should see all PyTest tests passing.
```
</details>

### DVA ACA-Py Controller Module ([`dva-acapy-controller`](dva-acapy-controller/))

> [!NOTE]
> A nice way to run the tests from the repository root using Docker without having to touch your local environment:
> ```console
> docker run --rm -it -v ./dva-acapy-controller:/app ghcr.io/astral-sh/uv:debian-slim uv --directory /app/ run pytest
> ```

#### Setup test environment

Find a way to run [uv](https://docs.astral.sh/uv) → [installation instructions](https://docs.astral.sh/uv/getting-started/installation/)

#### Run tests

Set your working directory to `dva-acapy-controller/` and execute:
```console
uv run pytest
```

#### Expected results

In the test output, you should see all PyTest tests passing.

<details>
<summary>Example output segment (click to open)</summary>

```
============================================================ test session starts ============================================================
platform linux -- Python 3.12.8, pytest-8.4.1, pluggy-1.6.0
rootdir: /projects/uni/edge/data-veracity/dva-processing
configfile: pyproject.toml
plugins: anyio-4.9.0
collected 3 items

tests/test_controller.py .. [100%]
```
</details>


## Component-level testing

Expand Down
156 changes: 156 additions & 0 deletions docs/attestation-verification-failures.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,156 @@
# Attestation and verification failures

This is the short reference for incomplete attestations, failed evaluations, and
verification results that need attention.
The dashboard shows the same code and next action on the record card, table, and overview.

## How to read a record

* **Passed** means the evaluation or verification finished successfully.
* **Pending** means the operation was accepted but has no final result yet.
* **Failed** means a check finished and did not pass.
* **Needs correction** means the request is missing valid input.
* **Unavailable** means the selected service or template could not be reached.
* **Error** means the service could not complete or save the operation.

Every incomplete record should contain:

* `code` – stable failure identifier
* `title` – short explanation for the user
* `summary` – what the result means
* `evidence` – returned error, failed check, or missing field
* `next action` – the most useful correction or retry step
* `retryable` – whether trying again can reasonably help

## Attestation and evaluation failures

### `EVALUATION_PENDING`

The request was accepted, but the processor has not written a result.
Check the request again after processing.
Retrying immediately can create a duplicate request.

### `SCHEMA_VALIDATION_FAILED`

The data does not match the selected schema.
A required field can be absent, or a value can have the wrong type or format.
Compare the payload with the schema, correct it, then submit again.

### `JQ_CHECK_FAILED`

The JQ expression returned a failed result.
The referenced property may be missing, empty, or outside the condition in the expression.
Inspect the expression and the values used by it before retrying.

### `GREAT_EXPECTATIONS_FAILED`

The tabular expectation did not pass.
Common causes are null values, a bad column name, an invalid type, or a value outside the configured expectation.
Review the expectation details and the mapping from the payload to columns.

### `TEMPLATE_RENDER_FAILED`

The template could not be turned into an implementation.
A variable may be missing, incorrectly named, or incompatible with the template.
Check the template variables and render the requirement again.

### `INVALID_TEMPLATE_INPUT`

The template model is incomplete or has a wrong value type.
This is an input error, not a failure in the evaluation engine.
Fill in each required variable using the type shown by the template.

### `UNKNOWN_TEMPLATE`

The selected template is not available in the current gateway.
It may have been deleted, belong to another environment, or have become unavailable.
Refresh the template list and choose an available template.

### `MISSING_REQUIRED_DATA`

The request does not contain all data required by the contract.
Add the missing field or select a contract that matches the data being sent.

### `FRESHNESS_FAILED`

The timestamp is older or newer than the allowed freshness window.
Send a current observation or review the freshness rule in the contract.

### `RANGE_FAILED`

A measured value is below the minimum or above the maximum allowed value.
Correct the value or review the configured range before submitting again.

### `GATEWAY_UNAVAILABLE`

The dashboard could not reach the DVA gateway.
No conclusion about the data should be drawn from this result.
Check gateway health and try again when the service is available.

### `PROCESSING_TIMEOUT`

The evaluation did not return within the expected time.
The final state may be unknown, so keep the request ID when contacting support.
Retry after checking processor health.
Avoid repeated retries while the first operation may still be running.

### `QUEUE_FAILURE`

The gateway accepted the request but could not hand it to the processing service or message transport.
Retry when the gateway and transport are healthy.

### `PERSISTENCE_FAILURE`

The evaluation completed, but its result could not be written to storage.
Do not assume the result was recorded.
Retry once the storage service is healthy and keep the request ID.

### `UNKNOWN_FAILURE`

The service returned an error without a more specific reason.
Read the evidence, check gateway health, and retry only when the input is known to be valid.

## Verification failures

### `VERIFICATION_PENDING`

The presentation exchange started but no final verification result exists.
Wait for the exchange to finish and refresh the record.
Do not treat pending as verified.

### `VERIFICATION_REJECTED`

The verifier received the presentation but could not accept its claims.
The requested attribute may be absent, incorrect, expired, or not trusted.
Compare the requested attributes with the presentation and request a current credential when needed.

### `CREDENTIAL_REVOKED`

The credential was found, but its issuer no longer considers it valid.
Do not use it for a new verification.
Request a replacement credential.

## Common check order

1. Confirm that the request reached the gateway.
2. Confirm that the selected template and variables are available.
3. Confirm that required data and timestamps are present.
4. Read the engine evidence for the failed field or expectation.
5. Correct the data or contract rule before retrying.
6. For transport, timeout, or storage errors, check service health first.
7. For verification rejection, inspect the credential status and claims.

## Example evaluation result

```json
{
"engine": "SCHEMA",
"timestamp": "2026-08-23T10:15:00Z",
"success": false,
"details": "required field customer_id is missing",
"error": null
}
```

The dashboard maps this to `SCHEMA_VALIDATION_FAILED`, keeps the engine detail as evidence,
and tells the user to add `customer_id` before submitting again.
Loading
Loading