AEP-013 / PRE-VALIDATION PRIMITIVESlint a draft report · against a source-bound profile · before verificationbounded claim: pre-validation only · not legal advice · not certification
Pre-validation layer / draft reports / before verification

Check a draft report before it is filed.

Pre-validation lints a draft incident report against a source-bound profile and tells you what is missing, what is unexpected, and which present fields still carry interpretive or evidence risk.

It does not verify report bytes, signatures, timestamps or anchors — that is downstream verification in actproof-py. Pre-validation answers an earlier, cheaper question: is this draft shaped and evidenced well enough to proceed?

In plain words

Before a company submits a regulatory incident report, someone has to ask: have we actually filled in everything the rule asks for? Are there fields we invented that the rule never mentioned? And are the hard, judgement-heavy fields backed by the evidence a supervisor would expect to see?

Pre-validation does that read-through automatically, against the same source-bound profile the rule was mapped into. It returns a plain status — blocked, attention required, or ready for pre-verification — with the specific fields behind each. It is a readiness check, not a verdict on compliance.

Statusblocked · attention required · ready
SurfaceCLI · REST · MCP
Boundaryreadiness, not compliance
Next layeractproof-py verification
01 / What it checks

Structural completeness and evidence readiness.

Pre-validation reads a draft report payload as field_id → value and checks it against the source-bound profile. It surfaces five signals, each pointing at specific fields.

PV-01Missing required

Required fields absent or empty.

Any required profile field with no value. These block readiness.

PV-03High interpretive load

Judgement-heavy fields present.

Fields the profile marks as interpretive, where a supervisor looks first.

PV-04Evidence-grade fields

Committee-record evidence expected.

Present fields whose evidence labels call for committee-grade records.

PV-05Disclosure tier

Non-public fields present.

Fields carrying a non-public disclosure tier, flagged so they are handled accordingly.

PV-06Readiness status

One deterministic verdict.

blocked, attention_required, or ready_for_preverification — computed, never asserted.

02 / Readiness states

Three states, computed from the checks.

The status is derived, not stored: it follows directly from the signals above, so it can never disagree with them.

The ladder
  • blocked — required fields missing or empty
  • attention_required — high-interpretive or unknown fields present
  • ready_for_preverification — clears structural and evidence-readiness checks
What ready does not mean
  • not "compliant" — readiness is not a legal verdict
  • not "verified" — no bytes, hashes or signatures checked yet
  • not "accepted" — no supervisory acceptance is implied
  • only: the draft is shaped and evidenced well enough to proceed
03 / Surfaces

The same check, three ways.

Pre-validation is exposed identically across the command line, the REST API and the MCP server, so a person, a CI pipeline and a compliance agent all read the same result.

CLIlint-reportterminal · CI
CLIsource-coverageprecision tiers
REST/prevalidate-reportservices
REST/compare-schemavendor gap
MCPprevalidate_reportagents
MCPexplain_field_sourcegrounding
MCP toolPurposeMarket utility
explain_field_sourceExplain why a DORA field exists and which source atoms support it.Grounds agent answers and human review.
source_coverageReport required, optional, template-field and contextual coverage.Prevents overclaiming and exposes review state.
lint_reportDetect missing fields, unknown fields and high-attention fields.Useful before internal review or submission preparation.
prevalidate_reportReturn a deterministic prevalidation status with the fields behind it.Creates a bridge toward future pre-verification packaging.
04 / Example

A draft report, linted.

A partial DORA initial-notification draft, checked against the source-bound profile.

The output names the missing required fields and the present fields that still warrant attention, then returns one status.

$ actproof-events lint-report \
    op:eu.dora.ict_incident_notification_initial.v1 \
    draft-report.json

lint-report for op:eu.dora.ict_incident_notification_initial.v1
  status                 : blocked
  prevalidation_status   : blocked
  required present       : 3 / 15
  missing required       : affected_member_states, business_continuity_plan_activated, ...
  high interpretive load : classification_criteria_triggered
  ready_for_preverification : false

  boundary: pre-validation only; not legal advice, not certification.
  next: actproof-py performs canonicalisation, timestamping and anchoring.
Why this matters

It catches the cheap problems before the expensive ones.

Structural and evidence gaps are caught at draft time, against the source-bound profile — long before anyone canonicalises bytes or requests a timestamp. The hard verification layer only runs on drafts that are already shaped right.

05 / Boundary

Pre-validation is a readiness check, not a compliance verdict.

The boundary is the same discipline as the rest of ActProof: it states plainly what the layer can and cannot establish.

Pre-validation can show
  • which required profile fields are missing or empty
  • which submitted fields the profile does not define
  • which present fields are interpretive or evidence-grade
  • a deterministic readiness status with the fields behind it
Pre-validation cannot show
  • that a report is legally compliant or accepted
  • that report bytes, hashes or signatures are valid
  • that field values are factually correct
  • that pinned sources are the latest legal state

Lint the draft, then verify the final.

Pre-validation makes a draft report inspectable against a source-bound profile before any cryptographic commitment. The verification layer comes after.