Repository navigation
Releases: rapiddweller/archkeel
Release list
ArchKeel 2.0.0 — ArchQ Explorer and exact permissions
Architecture checks for coding agents.
- ArchQ Explorer replaces the previous report navigation. The report opens
with the new Explorer embedded. Fullscreen expands the same view; Restore
preserves selection and zoom. Offline module and member pages share its controls. - Find and explore recorded evidence. Search components, modules and rules;
browse sortable Objects, inspect Health check, or highlight authorship, layer
and evidence perspectives. Pointer zoom, keyboard shortcuts and SVG, Mermaid
and link export support review. As-Is, Target and Diff retain the same recorded
verdicts, UNKNOWNs and source links. No new runtime dependency is required.
See the report guide and
Explorer work. - Exact native boundary permissions. Opt-in contract schemas 3.0–3.3
add source-and-body-bound alias permissions, heterogeneous typed-map unions
with exact key-alias proof, directly written literal map arms, and explicit
bare-map permissions at exact DTO fields or registry parameters. Separate
depth selectors accept only the supported native object leaves. Metadata
fields, sibling findings and UNKNOWNs remain independently checked.
See boundary rules. - Compatibility stays explicit. Supported 2.1–2.3 contract schemas and
serialization without the new bindings remain unchanged. Existing contracts
are not rewritten; older readers reject unsupported opt-in schemas. - Unproven alias bodies stay UNKNOWN. They do not justify body-dependent findings or
grants. Proven literal findings remain; ordinary permissions cannot bypass
uncertain alias proof by changing union order. - Explicit Callable signatures. Proven stdlib argument lists and results use
the existing boundary checks. SourceFacts 3.0.0 carries neutral TypeList
facts; versions 1/2 retain exact round trips and reject that new shape. - Direct stdlib TypedDict fields. Proven declarations check every key,
including underscore keys. Broad fields fail; unproven providers remain UNKNOWN.
Public model fields also retain proven type-name reach during validation. - Full reports retain every recorded UNKNOWN.
report --only architecture --full --jsonexports complete original records, including IDs, details and
evidence references, even with a component filter. Full architecture output uses schema
2.0.0, with command-result schema 7.0.0. Compact architecture output
remains 1.0.0; published legacy 6.0.0 result schemas are unchanged.
Empty and unavailable evidence remain distinct. See CLI reference. - Static proof fixes. Supported quoted builtin annotations retain their
original positions; proven stdlib overload re-exports expose all declared
signatures; property setters retain their own local binding scope. Safe
annotation carriers and nullable DTO paths preserve supported alias and field
proof. Unsupported or ambiguous forms retain UNKNOWN. - Review the exact permission. ArchQ Explorer distinguishes declared and applied
permissions and links evidence to members. Reset and fit controls are labelled
consistently; rejected offline routes retain the complete URL until explicit
recovery.
Accepted native values remain opaque. These checks certify neither serialization,
materialization, type closure nor runtime correctness. Product listings use
ArchKeel and “Architecture checks for coding agents”.
ArchKeel 1.1.2 — Bind native allowances to exact signatures
- Nested map allowances stay bound to the root annotation. An
Annotated
wrapper cannot reuse the inner-map or native-value permission for an unwrapped
Mapping[str, list[dict[str, object]]]signature. Outer-map permission remains
separate; aliases, DTO fields, unions and unproven bindings do not qualify.
See AD-217. - JSON Schema agrees with the parser. A selector with
mapping_depth
requires an emptyfield_path. Omittingfield_pathstill means the direct
signature; a nonempty DTO path is rejected. - Exact native Iterable elements. Direct and proven facade signatures can
permit oneobjectelement inIterable[object], optionally unioned with
None. Match the callable, parameter or return position, complete annotation,
emptyfield_pathandcontainer_depth: 1. Thetypingorcollections.abc
origin and builtinobjectmust be proven. Aliases, DTO fields, wrappers,
other collections, additional union arms and repeated opaque leaves do not
qualify. See AD-218.
Accepted native values remain opaque. These allowances prove neither
serialization nor materialization nor type closure. Contract and result schema
versions are unchanged.
Open gaps remain for contained maps in exact named aliases,
heterogeneous typed-map unions,
static overload re-exports,
quoted builtin annotations
and report-view traceability.
Known report-navigation issue: #447
records an ownership-invalid component/module route that becomes unscoped after
URL normalization and reload. Reproduced on this exact release source; evaluator
results are unchanged. The fix is separate from 1.1.2.
ArchKeel 1.1.1 — Exact native mapping allowances
ArchKeel 1.1.1 adds exact allowances for native mapping alternatives and for the inner map and value in a proven Mapping[str, list[dict[str, object]]] boundary. Outer map, inner map and native value remain separate decisions; ambiguous or unproven shapes remain denied.
The report timing guard now allows 120 seconds for measured runner variation. Successful package publication starts full Main verification before refreshing the report gallery, provided the tag still matches Main.
See release notes and AD-217.
ArchKeel 1.1.0 — SDK-free Dart UML and project-scale reports
Inspect Dart declarations and UML without a Dart SDK, and explore larger
architecture reports through components, modules and members.
Highlights
- SDK-free Dart UML. Observe classes, mixins, enums, members, signatures and bounded
source relationships through the Python installation. A pinned Tree-sitter grammar
replaces the SDK dependency; missing resolution and dynamic behavior remain UNKNOWN. - Complete-project demos. Explore pinned Flutter Compass (111 Dart files), Python
RealWorld (72 modules) and Nest RealWorld (41 prepared TypeScript inputs). Their Targets
define responsibilities, nested components, module relationships and principal UML
member scopes. Source-only variants demonstrate violations and analysis limits. - Readable architecture maps. Relationship-driven ELK layouts arrange components and
modules hierarchically. Nested ownership groups and colors help navigation; closing
Details releases the diagram space. Target navigation and asynchronous detail layout
retain the selected scope across views. - More precise evidence. TypeScript resolves supported package-export cases and retains
uncertainty for incomplete or ambiguous source facts. Native DTO value allowances can
select an exactfield_pathandcontainer_depthwithout permitting other positions. - Safer amendment output. Failed or colliding amendment destinations retain widening
findings. Baseline and graph outputs cannot silently overwrite amendment evidence. - Less repository churn. Generated self-observation snapshots no longer require
committed updates. Normal CI uses focused checks; exhaustive language, platform and
report verification runs nightly and before release publication. Report artifacts expire
after one day, with older retained report artifacts pruned by the cleanup workflow.
Upgrade from 1.0.0
uv tool upgrade archkeelPython, TypeScript and Dart analysis use the installed Python package. Dart no longer
needs an SDK, DART_EXECUTABLE or archkeel-dart-setup. Scans do not download packages
or modify the scanned project. Building or running a Flutter app still requires Flutter.
The Dart migration intentionally drops the legacy archkeel-dart-directives producer.
Re-observe both revisions with 1.1.0 before comparing Dart snapshots. This is an explicit
exception to the 1.x compatibility policy.
Schemas now accept Dart mixin entities and mixes_in relationships, while retaining
their existing version identifiers. Update strict enum consumers and pin the CLI,
collectors and bundled schemas together; do not mix the old and new Dart evidence.
Limits
Static analysis does not prove runtime dispatch, live object identity or complete call
coverage. Compass still has source-resolution gaps; Python RealWorld retains incomplete
class and inheritance evidence; Nest retains unresolved dynamic imports and framework
semantics. The demos show these limits, not compiler parity or verified Flutter execution.
See demo evidence and known limits.
ArchKeel 1.0.0 — Review architecture with evidence
Review observed code, your declared architecture and their differences in one report.
Follow a violation to its rule and source evidence, or inspect what is still UNKNOWN.
A completed scan can still leave rules undecided; filtering keeps the overall verdict visible.
What you can do in 1.0
- Explore from overview to source. Navigate components, modules and UML in As-Is,
Target and Diff. The dependency balance shows declared, used, unused and undeclared edges.
Fullscreen gives the Architecture Map room; pan, zoom and Fit support exploration.
Large UML views start with a list; Python member views retain enum values, static fields
and annotation references. Target references bind across nested contracts (#355, #373). - Give agents smaller, focused answers.
report --only architectureomits duplicated
source inventory. Scope filters and saved--inputqueries retrieve relevant findings
while preserving global verdicts, coverage and UNKNOWNs.--fullretrieves complete details. - Get actionable validation results. Findings include recorded paths and lines.
Coded diagnostics explain policy widenings, missing responsibilities and absent,
malformed or incompatible Python requirements. Aggregate findings do not invent a location. - Analyze TypeScript without Node. The Python package reads imports, lexical classes,
members, signatures and typed relationships. The separate Node collector is removed.
This is static evidence, not compiler type checking; unsupported resolution stays UNKNOWN (#382). - Start with observed crossings.
initgroups open decisions and reports exact totals
in compact output.init --fullreturns every pair. The draft still needs your decisions. - Share an offline report or open a demo. Detail pages share one evidence snapshot and
assets. GitHub Pages publishes the current Main report and 24 Python, Dart and TypeScript
demos, including PASS, FAIL and UNKNOWN examples.
Fixes since 0.9.0
Issue numbers refer to the issue tracker.
| Issues | What changes for you |
|---|---|
| #335 | Forbidden observed imports remain visible in Diff, including nested contracts and finding evidence. |
| #336 | Target shows declared intent. Observed status, findings and analysis limits belong to As-Is and Diff. |
| #382 | TypeScript keeps inherited TSConfig output paths and rejects malformed options. UTF-8 output and analyzer provenance are portable across Windows checkouts. |
| #338 | Providers reached through proven ancestor re-exports count as used. Ambiguous routes stay UNKNOWN. |
| #342 | Nullable allowances match the complete annotation. Incomplete union permissions and ambiguous declarations no longer allow the whole field. |
| #353 | Scoped opacity allowances cover exact native leaves inside map/list returns. Wrong-depth and unrelated positions stay rejected; opacity does not prove type closure. |
| #370, #374 | FAIL exposes scoped findings. Matrix cells use evaluator evidence; skipped or unevaluated imports cannot produce PASS. |
| #358, #372, #392 | Compact agent output retains excluded responsibilities, local findings, global verdicts and baseline comparisons. Omitted rows are marked. |
| #314, #395 | Filtered report JSON and validation diagnostics retain recorded source paths and lines. |
| #390, #391, #398 | Python requirement states, empty architect-owned responsibilities and policy widenings have distinct diagnostics. Rejected widening stays exit 1; invalid input stays exit 2. |
| #313, #318, #388, #389 | Setup remedies and baseline guidance name the next action, including whole-pair prohibitions that cannot be baselined. |
| #349, #393, #394, #397 | Counts distinguish contract violations from the current level. UNKNOWN links to evidence and next actions; component size remains a review question. |
| #319, #375, #376, #403 | Navigation, mobile paths, labels and themes are corrected. Architecture Map fills fullscreen and supports background panning, zoom and Fit. |
| #363, #371 | Offline detail pages stop duplicating full evidence. Repeated analysis work is reduced; runtime and size guards remain enforced. |
| #315, #316, #343, #350 | Policy runs before expensive checks. Self-scan, import-schema and collector timeout tests are corrected; wire-format consumers are updated (PR #404). |
| #317, #377, #396 | Documentation, dark screenshots and the first runnable forbidden-import example match the workflow. |
Upgrade from 0.9.0
- Remove
collector_argv = ["archkeel-typescript"]from TypeScript configuration.
Observe both revisions again: the native frontend has a different producer/runtime identity,
and old/new observations are not comparable (incomparable_runtime). - Pin collectors, CLI and schemas together. Fresh SourceFacts/protocol and ArchitectureIR use
2.0.0, Core observations 0.74.0, Delta 2.0.0 and command-result 6.0.0.
New readers retain supported legacy packets; old strict consumers must upgrade before
reading the new runtime state. Package and wire version numbers are independent. - Code consuming init decisions must inspect
open_decisions_complete; an omitted pair is
still undecided. Useinit --fullfor exhaustive output.validatestill returns the full list. - Review newly rejected incomplete nullable permissions and missing responsibilities.
Do not broaden contracts or baseline budgets merely to restore a passing command.
Published schema changes from 0.9.0:
| Format | 0.9.0 | 1.0.0 |
|---|---|---|
| Architecture contract | 2.2.0 | 2.3.0; 2.1/2.2 remain readable, layers require 2.3 |
| Architecture graph / report | 1.0.0 | 1.2.0 |
| ArchitectureIR | 1.3.0 | 2.0.0 |
| SourceFacts / collector protocol | 1.0.0 | 2.0.0 |
| Delta | 1.4.0 | 2.0.0 |
| Command result | 3.0.0 | 6.0.0 |
| Architecture projection / focused command / member inventory | Not published | 1.0.0 |
The documented CLI, configuration, external Python API and wire interfaces are stable for 1.x.
Read the compatibility policy before upgrading integrations.
Explicit limits
Stable means the documented interface, not complete language analysis. Missing or ambiguous
proof stays UNKNOWN. Layers assess declared permissions, not runtime behavior or structural
Protocol conformance. Dart inner UML facts (#347), complete independently authored own Target
intent (#340), and full per-language demo/acceptance coverage (#339/#348) remain open.
TypeScript package-based extends, exports/typesVersions and project references remain unsupported;
see the TypeScript evidence and limits.
Compact validation of an existing draft is separate follow-up work (#402).
Hints remain provisional (#384); structural port checks need a concrete use case (#356).
Human review effectiveness and public plugin-directory acceptance are not established (#236).
ArchKeel 0.9.0 — Explore architecture, keep the evidence
- One offline explorer shows observed code, declared Target and Diff, with source
locations, class members, relationship filters and local navigation. Filters retain
the full verdict and evidence. - Observed and Target graphs use one validated report format. Target stays declaration-derived;
missing or ambiguous evidence remains visible. - Python, Dart and TypeScript collectors use the source-facts process port; Core validates
evidence and owns architecture verdicts. - TypeScript checks import-graph boundaries, cycles, ownership and external packages.
Its catalog and revision demo keep unavailable
symbol, call, typing and private-use evidence explicit. - Unmeasured call totals are null; measured Python zero remains zero. Reports retain n/a.
- Proven inherited Python getter/setter signatures are checked in their defining scopes.
Missing proof, custom descriptors and mutations remain UNKNOWN (#290). - Unproven owned-property signatures retain individual source evidence and UNKNOWN (#306).
- Validation retains observed verdicts when diagnostics reject a contract. Reports show
the same declared-rule verdict; incomplete ownership names the module and remedy. - The main PR gate compares contracts and baseline policy with its pinned base before its tests.
Amendment v2 binds the policy actually written; stale records fail closed. - Construct rules use validated identities; report scope text describes selected roots.
Architecture contracts add UML intent in 2.2.0; graph, comparison and report formats use 1.0.0.
Command-result uses 3.0.0, accepted-lock uses 2.0.0 and fresh Delta uses 1.4.0. Pin CLI
and schema together: older consumers cannot read fresh null totals. New readers retain legacy
formats; re-observe evidence when its analyzer profile is incomparable
(compatibility).
TypeScript requires a separate adapter 1.0.0 build and a supported Node runtime;
the Python distribution does not bundle it. This is import-graph analysis, with no
full type/call analysis or cross-repository runtime observation claim.
Archkeel 0.8.6 — Local inherited methods
Check proven local inherited methods and overrides. Unproven creation, mutation and multiple inheritance remain UNKNOWN.
- Keep report navigation and tables usable on small screens.
- Show proposed interfaces in Target details.
- Measure rule decisions from scan evidence.
- Verify GitHub checks against the original pull-request head.
- Add compact plugin installation and improve listing links and contrast.
Unchanged CE replay preserves all 80 violations and 134 counted UNKNOWNs. This release does not establish CE boundary acceptance.
Install: uv tool install --upgrade archkeel==0.8.6
Archkeel 0.8.5 — Architecture checks for coding agents
Architecture checks and reports are easier to use with coding agents.
- Shorter README and onboarding; native Codex and Claude Code plugins share one skill.
- Findings and UNKNOWNs lead the report. Target names stay readable; rule details remain reachable.
- Exact boundary permissions preserve neighboring restrictions, including opaque map values. Proven datetime fields and inherited public fields are checked correctly.
- JSON command results have a published schema. GitHub publication reports retain UNKNOWN when host evidence is incomplete.
Human review pilot and complete GitHub publication-order proof remain open.
Archkeel 0.8.4 — Exact module ownership
What changed
exact_modulesassigns one module without claiming its children. A registry can now own its package entry point without owning every task. Recursivepackagesis unchanged. See AD-128.- Every exact module can be opened in Target. Missing responsibilities agree across the diagram, Details and summary. Declared file targets keep their paths and sentences.
- A Python package entry point with imports or a docstring still needs an owner. Only files with no Python statements are exempt (#232).
- Dotted filenames no longer make a full Python scan look incomplete. Partial scans remain UNKNOWN (#233).
Evidence and limits
LOCAL VERIFIED: independent QA and review; 2,332 tests passed (128 skipped), 138 native browser tests passed without skips, build and wheel/source-package smokes passed. No baseline or dependency was widened. Self-validation retains 40 UNKNOWN positions; zero violations is not complete proof.
On the frozen CE experiment, all 50 task-module identities remain. Only the initializer changes owner. Two rule assessments move UNKNOWN → PASS; 106 violations and 28 other UNKNOWN assessments remain. This is ownership proof, not CE runtime or refactoring completion.
The simpler README, current screenshots and explorer wording shipped in 0.8.3 and remain in this release.
Download the synthetic examples below and open positive.report.html, sibling.report.html or ambiguous.report.html. They show correct ownership, a forbidden sibling import, and competing owners—not DATAMIMIC data.
CI-ONLY VERIFICATION: PR checks, merged-main checks and PyPI publication passed. Tag target: 66aea560.
PACKAGE VERIFIED: fresh isolated archkeel==0.8.4 install and CLI smoke passed. Wheel and source-package hashes match PyPI; installed renderer files match the reviewed source. Independent native Linux acceptance passed 59 exact-ownership/Target tests without skips and all three catalog cases. Fresh positive, forbidden-sibling and ambiguous reports retain their expected results. The source package includes the shorter README (2,773 words).
Archkeel 0.8.3 — simpler README and report text
Archkeel 0.8.3
- Shorter README: about 46% fewer words; protocol details remain linked.
- Plain report labels: Component dependencies, Import locations, Complete scan inventory.
- Current report screenshots, including Target and deep navigation.
- Same checks and evidence. Local replay does not authenticate host records; a non-empty change declaration does not reject every undeclared change.
Download the synthetic report tour below and open tour.report.html. It contains deliberate violations and UNKNOWN evidence, not DATAMIMIC data.
LOCAL VERIFIED: full Linux gate (2,263 passed, 125 skipped), native Chromium acceptance (133 passed), demo replays and isolated wheel/sdist installs. Independent Luna QA and Astra review.
CI-ONLY VERIFICATION: PR gate, browser and Mermaid checks passed. Self-validation still records zero violations and 40 counted UNKNOWN positions; this is not architectural PASS.
Merged in PR #231. Tag points to d11d9e7831cb599b33afcdb42a253a0ecbf6f89c.
Official PyPI publication and main CI passed. Published version: archkeel 0.8.3.
Fresh official-PyPI install and installed-package smoke test passed. The report-code hash matches the reviewed source, and the published PyPI README contains the shorter text and technical limits.