v1.3.4 feature guide. All commands use
ainl(orpython -m cli.main).
Two new flags make it much easier to understand why a graph fails strict validation:
| Flag | Command | What it does |
|---|---|---|
--enhanced-diagnostics |
ainl check, ainl validate, scripts/validate_ainl.py |
Attaches graph_context (human description of where the error sits) and mermaid_snippet (1-hop Mermaid fragment) to each diagnostic |
--highlight-errors |
ainl visualize |
Post-processes Mermaid output to style error nodes in red |
Both are additive and default-off. --enhanced-diagnostics auto-enables when --strict is set.
Create a file with an unreachable node:
# bad_graph.ainl
S app core noop
L1:
R core.ADD 2 3 ->result
J result
R core.SUB 9 1 ->dead # unreachable after J
Run strict validation:
ainl check bad_graph.ainl --strictYou'll see a structured error. The exit code will be 1.
ainl check bad_graph.ainl --strict --enhanced-diagnosticsThe JSON output now includes two new fields in each diagnostic object:
{
"kind": "unreachable_node",
"message": "...",
"label_id": "L1",
"node_id": "n3",
"graph_context": "unreachable node 'n3' in label 'L1' (node appears after a terminal join — dead code path)",
"mermaid_snippet": "graph TD\n L1_n2[...] --> L1_n3[...]\n"
}For machine-readable output, add --diagnostics-format json:
ainl check bad_graph.ainl --strict --enhanced-diagnostics --diagnostics-format json \
| python3 -m json.toolVia scripts/validate_ainl.py directly (same behavior):
python scripts/validate_ainl.py bad_graph.ainl --strict --enhanced-diagnostics \
--diagnostics-format json--highlight-errors only applies when the compiled IR includes structured_diagnostics (the visualizer reads them from the IR and then post-processes the Mermaid).
Important caveat: if the file fails strict compilation (for example, a missing include), ainl visualize exits non-zero and prints structured diagnostics instead of Mermaid. That is correct behavior.
ainl visualize bad_graph.ainl --highlight-errors --output - > /tmp/bad_graph.mmdThe generated Mermaid file will contain lines like:
classDef errorstyle fill:#ffcccc,stroke:#f00
class L1_n3 errorstyle
If you have the mmdc CLI from @mermaid-js/mermaid-cli:
mmdc -i /tmp/bad_graph.mmd -o /tmp/bad_graph.pngOr render directly via AINL’s built-in image export (requires the local renderer dependencies used by ainl visualize in your environment):
ainl visualize bad_graph.ainl --output /tmp/bad_graph.pngOr paste the Mermaid output into mermaid.live to view it interactively. Error nodes will be highlighted in pink/red.
--enhanced-diagnosticsis automatically active when--strictor--strict-reachabilityis used, so you get graph context by default in strict mode.- The
mermaid_snippetfield is a self-containedgraph TDblock showing the failing node plus its immediate predecessors/successors — paste it into any Mermaid renderer. - For CI, combine with
--diagnostics-format jsonto parsegraph_contextin your error reporter. - If the secondary non-strict compile also fails (e.g. deeply broken source),
graph_contextandmermaid_snippetstaynull— the primary diagnostic is still complete.
- Production: Estimates & Audit Trail
- AINL visualize command —
ainl visualize <file> --output -for Mermaid stdout ainl check --helpfor all flags