How to Run Installed Output Validation with self_check.py
Run installed output validation by executing python3 skills/diagram-design/scripts/self_check.py path/to/diagram.html from the repository root; the script checks SVG accessibility, motion markup, and security constraints without any third-party dependencies.
The self_check.py validator is a lightweight, zero-dependency tool shipped with the Diagram-Design skill in the cathrynlavery/diagram-design repository. It ensures that generated diagram HTML files conform to strict accessibility, security, and motion contracts before they reach production or CI pipelines.
What self_check.py Validates
The validator performs five distinct inspection passes on any single-file HTML diagram:
- SVG accessibility – Every visible SVG must carry
role="img", a non-empty<title>, and<desc>elements referenced viaaria-labelledby - Script integrity – Only one
<script>is permitted, and its body must exactly match the canonical controller fromassets/template-motion.html - Motion markup structure – Validates
data-motion-root,data-motion-modevalues, step counts, semantic item numbering, and the "two items per step" limit - Resource safety – Flags unsafe URLs in
<link>,<img>, and<script src="...">references - CSS fallbacks – Ensures reduced-motion and print media queries are present for controlled modes
The core parser class DiagramParser lives at [self_check.py](https://github.com/cathrynlavery/diagram-design/blob/main/skills/diagram-design/scripts/self_check.py#L34-L45) lines 34–45, using only Python's built-in html.parser.HTMLParser.
Prerequisites and Setup
Install or clone the repository first:
git clone https://github.com/cathrynlavery/diagram-design.git
cd diagram-design
Generate a diagram using any skill that outputs single-file HTML (e.g., drawio_import, mermaid_import). The file must contain embedded SVG and optional motion markup—no external dependencies are loaded.
Running the Validator
Single file validation
python3 skills/diagram-design/scripts/self_check.py path/to/my-diagram.html
Multiple files at once
python3 skills/diagram-design/scripts/self_check.py diagrams/*.html
Expected output
Passing:
$ python3 skills/diagram-design/scripts/self_check.py examples/diagram.html
OK examples/diagram.html
Failing:
$ python3 skills/diagram-design/scripts/self_check.py bad/diagram.html
FAIL bad/diagram.html
- at most one script is allowed; found 2
- script 1 must exactly match the controller in template-motion.html
The script exits with status 0 on success and 1 on failure, making it suitable for CI integration.
Validating Motion Markup Specifically
When your diagram includes animated elements, self_check.py runs additional checks via the check_motion function at lines 69–143. These rules enforce:
- Exactly one
data-motion-rootattribute in the document data-motion-moderestricted tonone,reveal,step, orloop- Step counts as decimal integers within documented limits
- Semantic items (
data-item-*) numbered sequentially with accessible labels - Controlled modes (
step/reveal) providing playback controls, status announcements, and both reduced-motion and print CSS fallbacks
The canonical motion controller reference is extracted from [assets/template-motion.html](https://github.com/cathrynlavery/diagram-design/blob/main/skills/diagram-design/assets/template-motion.html) at validator initialization (lines 64–72).
Automating Validation in CI
Add to your GitHub Actions workflow:
- name: Validate diagrams
run: |
python3 skills/diagram-design/scripts/self_check.py output/*.html
Or GitLab CI:
validate:
script:
- python3 skills/diagram-design/scripts/self_check.py build/**/*.html
The exit code mechanism guarantees pipeline failure on any validation error.
Key Source Files
| File | Purpose |
|---|---|
[skills/diagram-design/scripts/self_check.py](https://github.com/cathrynlavery/diagram-design/blob/main/skills/diagram-design/scripts/self_check.py) |
Main validator; contains DiagramParser, check_svgs, check_motion |
[skills/diagram-design/assets/template-motion.html](https://github.com/cathrynlavery/diagram-design/blob/main/skills/diagram-design/assets/template-motion.html) |
Canonical motion controller reference |
scripts/verify-motion.py |
Full repository gate that self_check.py mirrors in distilled form |
scripts/test-self-check.py |
Test suite exercising validator against known-good/bad diagrams |
Summary
- Run installed output validation with
python3 skills/diagram-design/scripts/self_check.py <file.html> - The tool requires zero dependencies beyond Python's standard library
- Validates SVG accessibility, script integrity, motion markup, resource safety, and CSS fallbacks
- Returns exit code 0 for success, 1 for failure—CI-ready by design
- Source lives in the Diagram-Design skill under
cathrynlavery/diagram-design
Frequently Asked Questions
Does self_check.py require any pip-installed packages?
No. The validator uses only Python's built-in html.parser.HTMLParser and standard library modules. This design ensures it runs in any environment without dependency resolution overhead.
Can I validate diagrams that don't use motion features?
Yes. The motion checks in check_motion are conditional—if no data-motion-* attributes are present, the validator skips those rules and only enforces SVG accessibility and script constraints.
Why does my script fail the "canonical controller" check?
The validator extracts the expected controller body from assets/template-motion.html at lines 64–72. Any deviation—including whitespace changes, comments, or additional logic—triggers a failure. Copy the exact script block from the template to pass.
How do I test the validator itself?
Run python3 scripts/test-self-check.py, which exercises self_check.py against curated passing and failing diagram files. This ensures your local copy of the validator behaves correctly before you integrate it into production workflows.
Have a question about this repo?
These articles cover the highlights, but your codebase questions are specific. Give your agent direct access to the source. Share this with your agent to get started:
curl -s "https://instagit.com/install.md" Maintain an open-source project? Get it listed too →