Validation Guide¶
Validation is deterministic and phase-based. It returns a ValidationReport
and does not panic on invalid contracts. Phases always complete and findings are
accumulated, then sorted deterministically.
Deep reference resolution (SPEC Ch 7) is separate from the phase list and runs
via validate_resolved / plan / CLI document roots — see
PLANNING.md. Full ID inventory:
diagnostics.catalog.json.
Performance (0.12.0)¶
validatebuilds an [AnalysisContext] once (step ids, endpoints, dependency graph) and reuses it across phases.- With the
parallelfeature (included infull/dpcs-cli), independent phases run concurrently via rayon; diagnostics are then merged and sorted.validate_sequentialalways runs phases in order (same final report). validate_cached+ValidationCachefingerprint contract sections and reuse clean phase diagnostics across incremental edits.- Large-graph hot paths use shared indexes (
data_flow_step_dependency_with_indexes, multi-source unreachable BFS). Synthetic helpers live indpcs::synth.
Phases (0.9.0)¶
- Document — unsupported
dpcsVersionwarnings (DPCS-DOC-002) - Canonical Object Model — identity, uniqueness, interface completeness, reserved extension keys, SemVer version syntax (
DPCS-VER-*) - Structural — empty step
type(DPCS-STR-003), empty step port ids (DPCS-STR-001) - Graph — edges, cycles, duplicate edges, unreachable steps, entry/exit integrity
- References — declared-id / path-like contract / transform / port references
(deep load of nested DPCS uses
dpcs::resolve;DPCS-REF-007/DPCS-REF-008) - Data Flow — endpoints, dataset identity, wiring, unreachable datasets
- Control Flow — step endpoints, conflicting deps, duplicate control edges
- Execution — capability/dependency/resource completeness (
DPCS-EXE-*) - Scheduling — modes, events, timing consistency (
DPCS-SCH-*) - Quality — criteria, outcomes, placement, contract refs (
DPCS-QG-*) - Failure — scope, triggers, responses, retry (
DPCS-FS-*) - Lineage — dataset/step/contract provenance refs (
DPCS-LIN-*) - Security — secret refs / integrity refs (
DPCS-SEC-*) when present - Governance — owner/authority/publication (
DPCS-GOV-*) when present - Extensions — namespace syntax + informational preserve (
DPCS-EXT-*); reserved collisions remain COM-012
Quality/failure identity (empty/duplicate ids) remains COM-owned
(DPCS-COM-004 / DPCS-COM-005).
Capability matching is separate from contract validation: after a successful
plan(), call evaluate / evaluate_requirements against a CapabilityProfile
(DPCS-CAP-* at CapabilityEvaluation). Profile-only consistency uses
validate_profile. Matching demand is requiredCapabilities plus
externalDependencies[].capability (not environment software packages or isolation).
Important validations today¶
- required root identity (
dpcsVersion,id,version) - unique identifiers within each addressable object kind
- unique interface port ids across inputs and outputs
- complete interface ports (
name,contractRef,purpose) when ports are present - valid graph edges and no prohibited cycles
- graph entry and exit points reference declared steps (
DPCS-GRP-007,DPCS-GRP-008) - no duplicate graph edges for identical
(from, to, kind)(DPCS-GRP-005) - no unreachable steps from declared entry points or indegree-zero roots (
DPCS-GRP-006) - resolvable
contractRef/transformRef(including data-flow and step-port refs) - every
dataFlowentry declares a non-emptydataset(DPCS-DF-004) - declared step inputs and interface outputs have incoming data flows (
DPCS-DF-006) - datasets are reachable from interface inputs (
DPCS-DF-005) - data-flow sources are interface inputs or step outputs (
DPCS-DF-007) - data-flow destinations are step inputs or interface outputs (
DPCS-DF-008) - valid control-flow step dependencies; no opposite-direction conflicts with graph/data flow (
DPCS-CF-004) - no duplicate control-flow edges (
DPCS-CF-005) - execution capabilities, isolation entries, and external dependency identity/capability
- scheduled mode requires
frequencyorcron; event-driven mode requires events - quality gates require purpose, criteria, and resolvable placement/refs
- failure semantics require scope, triggers, responses; retry response needs retry policy
- lineage dataset/step/contract references resolve against the contract
Selected diagnostic IDs (0.7 capability matching)¶
| ID | Meaning |
|---|---|
DPCS-CAP-001 |
Empty capability id in profile |
DPCS-CAP-002 |
Duplicate capability id in profile |
DPCS-CAP-003 |
Empty profile identity (missing field is parse DPCS-PARSE-002) |
DPCS-CAP-004 |
Empty profile dpcsVersion (omitted/"" after defaulting; missing-required parse when stricter schemas apply) |
DPCS-CAP-005 |
Unsupported mandatory capability vs plan/requirements |
DPCS-CAP-006 |
Profile dpcsVersion mismatch warning (vs toolkit and/or plan) |
Selected diagnostic IDs (0.8 binding)¶
| ID | Meaning |
|---|---|
DPCS-BIND-001 |
Capability gate failed before orchestrator translation |
DPCS-BIND-002 |
Unknown binding target |
DPCS-BIND-003 |
Translation incomplete (for example empty artifact list) |
DPCS-BIND-004 |
Artifact write failure or unsafe relative path |
Selected diagnostic IDs (0.6 additions)¶
| ID | Meaning |
|---|---|
DPCS-EXE-001 |
Empty required capability |
DPCS-EXE-003 |
Empty external dependency id |
DPCS-EXE-004 |
Empty external dependency capability |
DPCS-EXE-006 |
Empty environment values |
DPCS-SCH-002 |
Scheduled mode missing frequency/cron |
DPCS-SCH-003 |
Event-driven mode missing events |
DPCS-SCH-006 |
Comparable ISO-8601 earliest > latest |
DPCS-SCH-007 |
Free-form earliest/latest not comparable |
DPCS-QG-002 |
Missing quality criteria |
DPCS-QG-004 |
Unresolved quality criterion contractRef |
DPCS-QG-007 |
Unknown step in quality gate placement |
DPCS-QG-008 |
Empty gate outcome |
DPCS-QG-009 |
Legacy scope/rule fields |
DPCS-FS-003 |
Unknown step in failure scope |
DPCS-FS-007 |
Retry response without meaningful retry semantics |
DPCS-FS-008 |
Legacy onFailure field |
DPCS-LIN-002 |
Dataset not present in dataFlow |
DPCS-LIN-004 |
Unknown producedBy step |
DPCS-LIN-010 |
Unknown step lineage stepId |
DPCS-LIN-016 |
Legacy upstream/downstream fields |
DPCS-PLN-001 |
Plan refused due to validation errors |
DPCS-REF-007 |
Nested DPCS reference content missing locally |
DPCS-REF-008 |
Nested DPCS reference content failed to parse |
DPCS-REG-016 |
Registry artifact content rewrite rejected |
Selected diagnostic IDs (0.9 additions)¶
| ID | Meaning |
|---|---|
DPCS-VER-001 |
Invalid SemVer-compatible contract version |
DPCS-VER-002 |
Invalid SemVer-compatible dpcsVersion |
DPCS-VER-003 |
Invalid SemVer-compatible capability profile dpcsVersion |
DPCS-EXT-001 |
Invalid extension namespace |
DPCS-EXT-002 |
Forbidden extension namespace (profile) |
DPCS-EXT-010 |
Unrecognized extension preserved (Information) |
DPCS-COMPAT-* |
Compatibility analysis findings |
DPCS-SEC-* |
Security metadata findings |
DPCS-GOV-* |
Governance metadata findings |
DPCS-REG-* |
Registry document findings |
DPCS-CONF-* |
Conformance claim/profile findings |
Invalid contracts produce diagnostics instead of hard failures where possible. Planning refuses invalid contracts and emits planning-stage diagnostics.