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.3.0.tar.gz
(120.8 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.3.0-py3-none-any.whl
(67.6 kB
view details)
File details
Details for the file iil_adrfw-0.3.0.tar.gz.
File metadata
- Download URL: iil_adrfw-0.3.0.tar.gz
- Upload date:
- Size: 120.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
dc03aabe8cc5b85b74407908f0ed0a038bc2f74807067a07f3cd41b117805eb4
|
|
| MD5 |
82bad93a33675cc128098ee8bde484c8
|
|
| BLAKE2b-256 |
ceee47618b812d4ab5691e72c5bbc7617f42bdb5d0d9c45e3ba7760d5e707309
|
File details
Details for the file iil_adrfw-0.3.0-py3-none-any.whl.
File metadata
- Download URL: iil_adrfw-0.3.0-py3-none-any.whl
- Upload date:
- Size: 67.6 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 |
9330a7d6bddd284f10d0c639d3dcb654c038171ed127f81dab611dd96e24c7cd
|
|
| MD5 |
d08a22f2e8449a16e44e974132013cc7
|
|
| BLAKE2b-256 |
d451e238d319e0dde70893b59487b38b4c74b0adc8f9228ec8c2b2e1fc873aa7
|