Archkeel – coding agents declare architecture changes before they submit Archkeel, a tool from rapiddweller, checks architecture boundaries and declared changes in AI-assisted code by comparing an accepted commit with a candidate and verifying the candidate matches an expectation published before its first submission. The tool catches two failure modes that finding-only diffs miss: architecture changed without being declared, and a scanner seeing less of the program so results look clean only because the graph became blinder. In Fixture A, a refactor introduced no new forbidden import, cycle, or private crossing, but resolved calls fell from 2 of 2 to 0 of 1 and unresolved calls rose from 0 to 1, producing an Archkeel verdict of FAIL with no new finding fingerprints. The agent declares before it submits. The check is deterministic. Archkeel checks architecture boundaries and declared changes in AI-assisted code. It compares an accepted commit with a candidate, checks their scans against the configured contract, and verifies that the candidate matches an expectation published before its first submission. It catches two failure modes that finding-only diffs miss: - the architecture changed without being declared; - the scanner saw less of the program, so the result looks clean only because the graph became blinder. Try the demo try-the-demo · Onboard your project onboard-your-project · How it works how-it-works · Reference https://github.com/rapiddweller/archkeel/blob/main/docs/reference.md · Roadmap https://github.com/rapiddweller/archkeel/blob/main/docs/roadmap.md Implemented and planned work is tracked in the roadmap https://github.com/rapiddweller/archkeel/blob/main/docs/roadmap.md . An agent can keep tests green and introduce no new architecture finding while making the code harder to analyze. If the gate compares finding identities only, that change passes. Fixture A is the smallest example: php def run key: str - int: - return first + second + handlers = {"first": first, "second": second} + return handlers key The refactor introduces no new forbidden import, cycle, or private crossing. But static call resolution gets worse: | Observation | Accepted | Candidate | |---|---|---| | Resolved calls | 2 of 2 | 0 of 1 | | Unresolved calls | 0 | 1 | | New finding fingerprints | 0 | 0 | | Archkeel verdict | baseline | FAIL | php expectation fulfilled: FAIL regression check failed in calls unresolved: 0- 1 regression check failed in unresolved ratio: 0/2- 1/1 Archkeel compares raw measurements as well as finding counts and fingerprints. The ratio check uses integer cross-multiplication, never rounded percentages: U candidate × T accepted <= U accepted × T candidate when both T 0 - Precommitment with evidence. The agent publishes the intended change before it submits the candidate. Git ancestry and host records prove the order; author timestamps do not. - Coverage-aware regression checks. A disappearing edge is not mistaken for an improvement just because a finding disappeared with it. - Explicit uncertainty. An incomplete scan, broken lock, empty scope, or runtime mismatch returns exit 2 with a diagnostic. Unknown never becomes green. Archkeel complements tests, linters, and human review. It does not replace any of them. Its job is narrower: keep architecture changes declared, observable, and mechanically checkable. The HTML report is designed for a reviewer making a merge decision: - Decision first. PASS , REJECT , or UNVERIFIABLE and one sentence explaining it are visible before details, in the HTML report and in the terminal. - No blended score. Scan completeness, contract compliance, expectation matching, Git order and publication order remain separate verdicts. - Unknown stays visible. Missing or invalid evidence includes the affected subject, unknown claim, and remedy. - Evidence stays inspectable. Exact counts, fingerprints, source locations, digests, and runtime provenance remain available beside the verdict. The demo builds three small Git repositories and runs the real checks. Fixture A is rejected because the call graph got blinder, Fixture B because its expectation was published too late, and Fixture C passes. git clone https://github.com/rapiddweller/archkeel.git cd archkeel make demo make demo-screenshots OUTPUT=