Use the OpenConstructionERP validation engine: rule packs (BOQ quality, DIN 276, NRM, GAEB, MasterFormat, DPGF) that check estimates at import time and on demand. Use when verifying BOQ correctness or writing custom validation rules.
Scanned 9/5/2026
Install to Claude Code
npx -y skills add datadrivenconstruction/DDC_Skills_for_AI_Agents_in_Construction --skill oce-validation-engine --agent claude-codeInstalls into .claude/skills of the current project.
Are you the author of Oce Validation Engine?
Add the live security badge to your README — it updates automatically with every re-scan.
[](https://www.skillsdirectory.com/skills/datadrivenconstruction-oce-validation-engine)More formats (shields.io, HTML) on the badges page.
---
name: oce-validation-engine
description: "Use the OpenConstructionERP validation engine: rule packs (BOQ quality, DIN 276, NRM, GAEB, MasterFormat, DPGF) that check estimates at import time and on demand. Use when verifying BOQ correctness or writing custom validation rules."
---
# Validation Engine in OpenConstructionERP
## Philosophy
"Validation is a first-class citizen." Every BOQ import (Excel/CSV/GAEB X83/X84) runs the configured rule packs **at import time**, so violations surface immediately — not when a user is staring at row 452.
## Built-in rule packs
| Pack | Checks |
|---|---|
| `boq_quality` | required fields, unit consistency, duplicate codes, quantity sanity |
| DIN 276 | cost-group codes valid, hierarchy consistent |
| NRM | element codes, measurement rules |
| GAEB | X83/X84 structure, item references |
| MasterFormat / DPGF | classification codes |
Configure the default set via `OE_DEFAULT_VALIDATION_RULE_SETS` (default `["boq_quality"]`); run on demand with `POST /api/v1/boqs/{id}/validate/`.
## Writing custom rules
A rule is: **condition + severity + message**. Example patterns:
```python
# pseudo-rule: labour share sanity on a BOQ line
def rule_labour_share(line):
labour = line.components_labour_cost
total = line.rate
if total > 0 and labour / total > 0.95:
return {"severity": "warning",
"message": f"Line {line.code}: labour is {labour/total:.0%} of rate"}
```
Reconciliation rules (the ones that actually catch data problems):
- `qty × unit_price = cost` per component line (tolerance ±0.01 or rounding-aware).
- `Σ components = total_resource_cost_per_position` (markup applied on top).
- classification non-empty at every tree level.
- no negative quantities outside documented deduction lines.
## Where validation plugs in
1. **Import gate** — `import_inline_validation` (env) runs packs during upload.
2. **On demand** — `/boqs/{id}/validate/` returns violations with severity.
3. **Continuous** — the BOQ quality score updates live as the editor changes lines.
## Best practices
1. Fail imports on `error`-severity, warn on `warning` — never block a user silently.
2. Keep rule messages actionable: name the row, the expected value, the found value.
3. Version rule packs with the standards they encode (DIN 276:2018-12, NRM2, …).
4. Use validation as the QA agent's deterministic backbone (see `ai-agent-orchestration`).
Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.
No comments yet. Be the first to comment!