Skip to main content

Unit testing for business documents — validate structured Markdown docs against a configurable audit standard.

Project description

docassert

PyPI Python License

docassert demo — a weak charter is blocked, fixed, and cleared

Unit testing for business documents. Validate structured Markdown documents (charters, BRDs, PRDs, risk registers, …) against a configurable audit standard: deterministic structural checks that gate a merge, plus optional AI-graded semantic checks that advise. Requirements trace end to end, and project status is derived from the documents rather than self-reported.

docassert is the reference implementation of PMO as Code — a vendor-neutral standard for running a PMO from version-controlled, declarative files. It implements the PMO as Code specification v0.3 and passes its conformance suite in CI.

Install

pipx install docassert          # recommended — installs the CLI in its own isolated env
# or:
pip install docassert
# with the AI advisory extra:
pip install "docassert[ai]"

Quickstart

docassert new project --code AUR --name "Aurora"   # anchor a project (auto-numbered id)
docassert new charter --project PRJ-001-AUR        # scaffold a charter into it
docassert validate documents/**/*.md  # unit-test your documents
docassert consistency                 # cross-document traceability + profile completeness
docassert status --index              # derived RAG per project
docassert pages --out _site           # a portfolio dashboard + a page per project

Config resolves local override → packaged default: docassert ships sensible defaults, and your repo's own criteria/ (or schema/, profiles/, consistency.yaml) wins when present. docassert init copies the defaults in so you can customize them — including the doc-to-pmo Claude skill into .claude/skills/, so Claude Code in your repo knows how to convert existing Word/PDF documents into testable docassert documents (faithfully — gaps are flagged as TODOs, never invented). The skill's source is skills/doc-to-pmo/SKILL.md.

Commands

Command What it does
docassert validate <globs> Validate documents against their kind's criteria. Exit code = number of blocking failures (capped at 125). Reports: --junit / --markdown / --json.
docassert consistency Cross-document checks: referential integrity, coverage, required links, profile completeness. Reports: --junit / --markdown / --json.
docassert rtm [--project ID] Requirements traceability matrix (Markdown or CSV).
docassert status [--project ID] [--index] Derived project status (md / json / html).
docassert pages --out DIR Build the portfolio site (index + a page per project + shields.io badge endpoints badge.json / badges/<ID>.json).
docassert projects [--out] [--check] Generate / verify the project registry.
docassert new <kind> --project ID Scaffold a document from its template with identity filled in (new project --code XYZ auto-numbers the id); suggests the next free item ids.
docassert init [DIR] Scaffold the default config into a repo.
docassert bridge <action> --repo O/N Execution bridge: scaffold Features/Stories from approved user stories, reconcile (police the board against the docs), status (delivery figures). Needs the GitHub CLI.
docassert extract <file> Extract plain text from a source .docx / .pdf / .md / .txt (the first step of doc-to-pmo conversion). Needs the convert extra: pip install "docassert[convert]".

Every document-reading command accepts --documents-dir (default documents/). AI alignment grades at most alignment_limit links per run (default 25; set it in consistency.yaml, 0 = no cap) so API cost stays bounded on large graphs.

Document kinds

Twenty kinds, each a templates/<kind>.template.md + schema/<kind>.schema.json

  • criteria/<kind>.criteria.yaml trio: project, charter, business-case, brd, prd, frnfr, user-story, test-cases, adr, risk-register, raci-stakeholder, qa-test-plan, data-migration-plan, release-cutover-plan, rollback-plan, hypercare-plan, runbook, status-report, post-implementation-review, benefits-realization. Adding a kind is adding a trio — no code for the common cases.

Two tiers of checks

  • Structural — deterministic, blocking. Required fields and sections, measurable success criteria, risks with owner + mitigation, resolving references, unique ids. Plain Python, reliable enough to gate a merge. Within this tier, integrity checks (malformed items, bad types, duplicate ids) block at any status, while completeness checks relax to advisory on status: draft and gate once a document is proposed — WIP is never punished.
  • Semantic — AI-graded, advisory. Scored via the Anthropic API and posted to the PR — never blocking. Set ANTHROPIC_API_KEY to enable; skipped otherwise.

Privacy

Structural checks run entirely locally — no document content leaves your machine or CI runner. Semantic checks are the one exception: when ANTHROPIC_API_KEY is set, the graded excerpts (section text, linked item text) are sent to the Anthropic API for scoring. Without the key, semantic checks are skipped and nothing is sent anywhere. Alignment grading is capped at alignment_limit links per run (default 25). If your documents are confidential, run without the key or review Anthropic's data-usage policies first.

Development

python3 -m venv .venv && source .venv/bin/activate
pip install -e ".[dev]"
pytest
ruff check .

This repo ships example documents/ (four sample projects) that the test suite validates against.

The reference deployment

pmo-as-code-pipeline is a living example — sample projects, the gate on every pull request, and a published dashboard at c4g-john.github.io/pmo-as-code-pipeline. The standard's site is c4g-john.github.io/pmo-as-code.

License

Apache-2.0 — see LICENSE and NOTICE. © 2026 C4G Enterprises Inc.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

docassert-0.12.1.tar.gz (88.5 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

docassert-0.12.1-py3-none-any.whl (104.3 kB view details)

Uploaded Python 3

File details

Details for the file docassert-0.12.1.tar.gz.

File metadata

  • Download URL: docassert-0.12.1.tar.gz
  • Upload date:
  • Size: 88.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.12.9

File hashes

Hashes for docassert-0.12.1.tar.gz
Algorithm Hash digest
SHA256 12bcfeb79a56ffe31717f7eee2581ff17c30db615e5ec1352689d156b27e1961
MD5 7b2ead23c12dc4006cae69fff19fa5fa
BLAKE2b-256 784ff45a63abb8d16afe2ad18627c9a822009e555225c2aea6e82b022e1ae175

See more details on using hashes here.

Provenance

The following attestation bundles were made for docassert-0.12.1.tar.gz:

Publisher: release.yml on c4g-john/docassert

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file docassert-0.12.1-py3-none-any.whl.

File metadata

  • Download URL: docassert-0.12.1-py3-none-any.whl
  • Upload date:
  • Size: 104.3 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.12.9

File hashes

Hashes for docassert-0.12.1-py3-none-any.whl
Algorithm Hash digest
SHA256 1f23aed5a8f8e35c0f25e747357de43eb8dae1e0334426be85fab7fbc3965e79
MD5 f65c34905959ccfacd844aab5ee3f7ef
BLAKE2b-256 b2320dca17bc4ad080e70e8a88df8475c0a32cb700e0bbe8c1050758d2ce0f29

See more details on using hashes here.

Provenance

The following attestation bundles were made for docassert-0.12.1-py3-none-any.whl:

Publisher: release.yml on c4g-john/docassert

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page