Architectural Decision Record framework with bi-temporal validity, AST checkers, and FastMCP integration
Project description
iil-adrfw
ADR Framework for the IIL Platform — schema validation, loader normalization, constitution graph, audit tooling.
What it does
- Schema v3 — strict JSON Schema for ADR frontmatter with
additionalProperties: false - Phase 1 Normalizer — 15+ field aliases, status normalization, type coercion, reference extraction
- Phase 2 Validator — jsonschema validation against
adr_frontmatter.schema.json - Phase 3 Domain — typed
ADRdataclass withStatusenum, temporal fields, relations - Constitution Graph — cross-ADR dependency/supersession graph with cycle detection
- Audit — staleness checks, implementation evidence verification, drift detection
- CLI + MCP Server —
iil-adrfwCLI andiil-adrfw-mcpFastMCP server
Real-world validation
Tested against 156 real platform ADRs:
| Mode | Result |
|---|---|
| Strict load (validate=True) | 152/156 (97.4%) |
| Unit tests | 22/22 green |
| Remaining failures | 4x broken YAML (unfixable) |
Installation
pip install -e .
# With dev dependencies:
pip install -e ".[dev]"
Usage
Python API
from pathlib import Path
from iil_adrfw.persistence import load_adr, load_adrs
# Load single ADR
adr = load_adr(Path("docs/adr/ADR-099.md"), Path("schemas/"))
# Load all ADRs in directory
adrs = load_adrs(Path("docs/adr/"), Path("schemas/"))
# Diagnosis mode (skip normalization)
raw_adr = load_adr(path, schemas, raw=True)
CLI
# Validate ADRs
iil-adrfw validate docs/adr/ --schemas schemas/
# Audit for staleness, missing evidence
iil-adrfw audit docs/adr/ --schemas schemas/
MCP Server
iil-adrfw-mcp
Schema v3 highlights
- 5 new fields:
updated,version,review_status,owner,implementation_done_when - 3 removed fields:
glossary,review_cadence,next_review_date - Status enum:
{draft, proposed, accepted, deprecated, superseded, rejected, experimental} - Implementation status:
{none, planned, in_progress, partial, implemented, complete, verified, rolled_back}
Loader normalizations (Phase 1)
| Step | What |
|---|---|
| C.1 | 12 field aliases (date→decision_date, author→owner, etc.) |
| C.2 | Status normalization (case, suffixes) |
| C.3 | Scalar-to-list auto-wrapping |
| C.4 | Reference field normalization (ADR-NNN extraction) |
| C.5 | ID inference, title inference, domains default, deciders default |
| C.6 | Amended-format normalization |
| C.7 | implemented field → implementation_status mapping |
| C.8 | Strip unknown properties |
See SCHEMA_V3_SPEC.md for full specification.
Running tests
python examples/test_e2e_schema_v3.py # Schema v3 tests (22 cases)
python examples/test_e2e.py # Core tests
python examples/test_e2e_v11.py # v1.1 format tests
Project structure
iil-adrfw/
├── schemas/ # JSON Schema files
│ ├── adr_frontmatter.schema.json
│ ├── adr_rules.schema.json
│ └── constitution.schema.json
├── src/iil_adrfw/
│ ├── persistence/ # Loader (normalize + validate + construct)
│ ├── domain/ # ADR dataclass, Status enum
│ ├── graph/ # Constitution graph
│ ├── audit/ # Staleness, evidence checks
│ ├── checkers/ # AST-based code checkers
│ ├── cli.py # CLI entry point
│ └── server.py # FastMCP server
├── examples/ # Example ADRs + test suites
├── SCHEMA_V3_SPEC.md # Full v3 specification
└── SCHEMA_V3_CHANGELOG.md # Changelog for downstream consumers
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
iil_adrfw-0.2.2.tar.gz
(120.4 kB
view details)
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
iil_adrfw-0.2.2-py3-none-any.whl
(67.2 kB
view details)
File details
Details for the file iil_adrfw-0.2.2.tar.gz.
File metadata
- Download URL: iil_adrfw-0.2.2.tar.gz
- Upload date:
- Size: 120.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c80b6e3e6fef2017c560f5acf7a3521f51689668040cde396bdb38eb5903b8cb
|
|
| MD5 |
0684193b4ae6ce2ba3cb2e1a0ade8b7a
|
|
| BLAKE2b-256 |
9736f2a0a61c78ee849e99d4e6723f41a080c785d2b3f4ac712e8c9917f54624
|
File details
Details for the file iil_adrfw-0.2.2-py3-none-any.whl.
File metadata
- Download URL: iil_adrfw-0.2.2-py3-none-any.whl
- Upload date:
- Size: 67.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
24dcac6aade152f456e4c5943938985b330984890bb3ce3f9fa91a6dca011504
|
|
| MD5 |
7dc7a5d7da2bad89ac3482981e64defe
|
|
| BLAKE2b-256 |
424cb07d381a2ad6cb1a6af115eae48c6c7b98f6ef9c5db1d2337b5b8af2b52d
|