Releases: alexei-led/archfit
Release list
v2.0.0
Archfit v2.0.0
Archfit v2 replaces the repository-level scalar score with a deterministic, evidence-aware architecture state and completes the capability-owned internal architecture migration.
Breaking changes
- Primary JSON is now
archfit.architecture-state.v1. - Configuration schema is now v2. Archfit rejects v1 configs with an exact migration hint.
archfit checkexits:0—healthy2—needs_attention1—blocked3— no valid report because of command/config/tool execution error
archfit analyzeremains report-only and exits0for every valid report.- Repository-level
score_overalland score bands no longer determine architecture health. legacy-jsonremains available for one compatibility release only.
Architecture state
The report exposes nine independent dimensions:
- intent
- structure
- modularity
- coupling
- change locality
- complexity
- testability
- operations
- drift
Each dimension reports measured, partial, or unmeasured evidence with confidence, denominators, provenance, findings, unknowns, and comparable deltas. Missing evidence is never treated as a healthy zero. Balanced Coupling remains available per edge/seam for ranking and explanation.
JSON, text, Markdown, SARIF, and scorecard now share canonical finding IDs, statuses, metrics, verdicts, and coverage semantics.
Upgrade
Preview the lossless config migration:
archfit config update --migration-only --json -c .archfit.yamlApply it after review:
archfit config update --migration-only --apply -c .archfit.yamlUpdate CI to handle exit 2 as needs_attention, migrate JSON consumers to archfit.architecture-state.v1, and regenerate baselines only after reviewing the new state.
Language and corpus validation
The release was validated with a strict 11-repository corpus across Go, Python, TypeScript/JavaScript, and Rust. The harness checked config migration/idempotence, repeated JSON byte identity, five-format finding parity, and exit behavior.
Rust validation used rustup toolchain 1.98.0, rust-analyzer 1.98.0, and cargo-modules 0.26.0 across yazi, herdr, ruff, and tokio.
Expected v1 evidence gaps remain explicit: runtime test coverage, cognitive complexity, runtime topology, SBOM, and vulnerability state are partial/unmeasured unless a future analyzer supplies them.
Install
- Homebrew:
brew install alexei-led/tap/archfit - Container:
ghcr.io/alexei-led/archfit:v2.0.0 - Standalone binaries and
SHA256SUMSare attached below.
The tag is signed and points to merge commit 5b9e1be057a43d1e0914d2445917edcc717972b1.
Full changelog: v1.7.1...v2.0.0
v1.7.1 — capability boundaries and stable report contract
v1.7.1 — capability boundaries and stable report contract
- Replace package-shaped self-dogfooding modules with capability-oriented boundaries.
- Add a stable data-only report contract for scoring, decisions, persistence, and renderers.
- Keep the engine on stage views instead of the full config model.
- Move scorecard synthesis to the CLI composition root.
- Add regression tests and update architecture documentation.
- Self-dogfood result: 0 blocking findings, 68 advisories, 40/100 coupling score.
v1.7.0 configuration confidence
v1.7.0 configuration confidence
New:
- git_finding_delta on analyze/check --base --json: sorts current
agent_tasks[] into introduced / pre_existing / unknown_origin. Report-only. - archfit config compare : measures one tree under two configs.
- archfit config update --json: archfit.config-review.v1.
Breaking:
- archfit baseline --base removed; returns unknown flag, exit 3.
Also: baseline score snapshot records rubric_version; --no-advisories has one
meaning across all output combinations; config update --apply no longer
deletes, comments out, or re-keys a configured module stanza.
v1.6.0
v1.6.0 — CLI redesign: archfit check, clean flag surface, honest diagnostics
- new check command replaces analyze --gate for CI/agent loops
- flag renames: --ai-summary/--ai-classify/--ai-provider/--ai-model,
--refresh, --min-severity, --no-advisories - config update survives flow-style paths and adjacent module removals
- root-aware health hints; grimp unresolved-import disclosure with top roots
- markdown noise caps: advisory-task top-25, grouped config warnings
- reusable evaluation workflow: skills/archfit-eval + corpus_sweep helper
v1.5.1
v1.5.1: architecture rebalance — frozen model kernel, stage-contract views, fitness gates (coupling_balance 40->71)
v1.5.0
This release improves balanced coupling evidence and report-only diagnostics, with safer Rust config updates and better config-update suggestions.
-
Cleaner dynamic connascence reporting
- Dynamic report-only "still unmeasured" lists now disclose only dynamic categories (execution, timing, value, identity) in deterministic order.
- Added regression coverage so static kinds like position cannot leak into the dynamic block.
-
Safer Rust config updates
- Rust deep-analysis config edits now ignore blank and comment lines when scanning YAML section boundaries.
- Explicit analyzer opt-outs (
cargo_modules.enabled: false,scip.enabled: false) are preserved. - Added regression tests for comment-heavy configs and explicit opt-outs.
-
Better config-update suggestions
- Deploy-unit suggestions now use the discovered/path-drifted module map, so newly discovered modules still receive deterministic hints.
-
No intentional CLI breaking changes.
-
No new manual release steps: tagging remains the only supported release trigger.
Verified before release:
go test ./...make lint- CI: lint, test, linux/darwin builds
v1.4.0
This release tightens how archfit gathers architecture evidence and makes TypeScript/JavaScript analysis more consistent across modern source-file variants.
-
Cleaner architecture evidence packs
- README, architecture docs, and repo doc maps are now prioritized more deliberately when building the off-gate evidence pack.
- Archived, completed, generated, and stale documentation paths are excluded more aggressively so prompts stay focused on current architecture intent.
-
Better TS/JS coverage across file variants
- Shared TypeScript/JavaScript source-extension handling is now applied consistently across graph conventions, dependency extraction, dynamic-import detection, LOC classification, runtime async detection, and clone filtering.
- Regression coverage was added for non-
.tsvariants including.mts,.cts, and.mjs, plus generated declaration files such as.d.mtsand.d.cts.
-
Book-alignment docs cleaned up
- Superseded design notes and completed planning artifacts were moved into archived/completed locations.
- Cross-references were updated so historical material remains available without polluting the active design surface.
-
Centralized dynamic-import kind constants to reduce string drift across extractors, reports, and evaluation tooling.
-
Removed dead evidence-pack scoring branches uncovered during PR review.
-
Added focused regression tests around file classification, runtime detection, clone filtering, and evidence-pack behavior.
-
No intentional CLI breaking changes in this release.
-
No new manual release steps: tagging remains the only supported release trigger.
Verified with the standard local gates before release:
make lintmake testmake buildmake archfit/arch-lint
v1.3.0
v1.3.0
- align balanced-coupling tooling, scoring, and validation across deterministic and semantic paths
- add structured LLM draft citations and evidence-pack review metadata
- improve dogfood config/update flows and fix review-followup issues
- clean up report/archive layout and current CLI/docs guidance
archfit v1.2.0
archfit v1.2.0
This release adds deterministic coupling gating, book-aligned coupling
classification updates, warm fact-cache reuse, and off-gate LLM review
workflows.
Breaking metric change: ScoreVersion is now bc_score.v4. v4 scores are NOT
comparable to bc_score.v3 scores — treat the first v4 run as a new
measurement, and re-baseline (archfit baseline) before relying on
coupling.gate.max_drop. score_version now appears at the top level of
--json output so consumers can key on it.
- New
coupling.gatecontrols let CI fail on a minimum coupling band and/or a
maximum score drop, separate from rule violations; verdict reporting now
keeps per-metric gate reasons explicit. - Three classification changes keep the book formula intact while fixing the
inputs: const/var reads score Model (not Functional), pure-data Go DTOs can
reach Contract across declared public boundaries, and declared
external_systemsenter scoring at D=10. - Warm runs now reuse unchanged extractor subprocess facts via the
content-addressed fact cache; use--no-cachefor a cold control run. archfit config enrich labelsandconfig enrich abstaineddraft review-only
LLM labels for weak or abstained edges, andconfig update --llmproposes
review material for subdomains, roles, and volatility. Approved labels stay
deterministic YAML; stale evidence is ignored; LLM output never decides the
gate.
archfit v1.1.2 — multi-language reliability fixes
archfit v1.1.2 — multi-language reliability fixes
Root-cause fixes across Go/Python/Rust/TypeScript coupling analysis, no CLI or
config interface changes:
- AugmentCargoCrateNodes gated to Rust-only (was leaking phantom modules into
any Go/Python repo using cargo_modules-style config) - ModuleForFile bridges file-path consumers (CODEOWNERS, clone-pairing,
dynamic imports) to per-language node-key matching - Synthetic module attribute inheritance now copies Volatility/Subdomain/
Layer/DeployUnit, not just Owner - Volatility cascade no longer triggers on clone-detected (accidental)
coupling - Deploy-unit detection requires a module-root main.go, not any nested one
- Clone-instance evidence (real file:line pairs) now reaches findings
instead of a generic Cargo.toml:0 - TypeScript extraction: per-extractor failure isolation, Src no longer
derived from module glob order, --ts-config resolves correctly in subtree
mode, dependency-cruiser's package name is pinned for npx/bunx - git-history owner resolution bounded by commit count with a distinct
timeout diagnostic (was silently timing out on large repos) - encapsulation's zero-contract evidence string clarified for repos with no
public: globs declared