{"note":"FIT is survey clarity — how clearly a language leads to a complete architecture survey. It is NOT a measure of language or code quality.","languages":[{"code":"csharp","displayName":"C#","applicability":10,"supportKind":"Deep","band":"FULL","bandLabel":"FULL","bandCss":"exemplary","summary":"Native Roslyn symbols resolve every lens — domain, event, correctness, DI and structural — with full fidelity.","coveredLenses":["DDD","Event sourcing","Event-driven","Vertical slice","Correctness","Structural"],"notApplicableLenses":[],"signedOffOn":null},{"code":"fsharp","displayName":"F#","applicability":9,"supportKind":"Deep","band":"VERY HIGH","bandLabel":"VERY HIGH","bandCss":"exemplary","summary":"FCS typed AST resolves fully; functional-DDD idiom (DU events, fold aggregates) maps one-to-one onto the domain lenses.","coveredLenses":["DDD","Event sourcing","Event-driven","Vertical slice","Structural"],"notApplicableLenses":["Syntax-level correctness","DI segregation","god-class/LCOM"],"signedOffOn":"2026-07-12"},{"code":"java","displayName":"Java","applicability":9,"supportKind":"Deep","band":"VERY HIGH","bandLabel":"VERY HIGH","bandCss":"exemplary","summary":"Spoon source-resolution is strong; the full domain survey fires, only field-based strongly-typed-ids abstains.","coveredLenses":["DDD","Event sourcing","Event-driven","Vertical slice","Structural"],"notApplicableLenses":["Syntax-level correctness","DI segregation","strongly-typed-id (field-based)"],"signedOffOn":"2026-07-12"},{"code":"kotlin","displayName":"Kotlin","applicability":9,"supportKind":"Deep","band":"VERY HIGH","bandLabel":"VERY HIGH","bandCss":"exemplary","summary":"K1 binding resolves sealed-class events and data-class value objects over the same JVM bridge as Java.","coveredLenses":["DDD","Event sourcing","Event-driven","Vertical slice","Structural"],"notApplicableLenses":["Syntax-level correctness","DI segregation","god-class"],"signedOffOn":"2026-07-12"},{"code":"vbnet","displayName":"VB.NET","applicability":9,"supportKind":"Deep","band":"VERY HIGH","bandLabel":"VERY HIGH","bandCss":"exemplary","summary":"Shares the same symbol layer, so the whole domain and architecture survey resolves; a few syntax-level correctness and DI dimensions are deferred.","coveredLenses":["DDD","Event sourcing","Event-driven","Vertical slice","Structural"],"notApplicableLenses":["Syntax-level correctness","DI segregation"],"signedOffOn":"2026-07-11"},{"code":"dart","displayName":"Dart","applicability":8,"supportKind":"Deep","band":"HIGH","bandLabel":"HIGH","bandCss":"healthy","summary":"Source-only (no build, never executes the repo), Dart's declarative type system — sound null-safety, @freezed/@JsonSerializable/ORM annotations, widget/bloc/ChangeNotifier supertypes, sealed unions and zero-cost extension-type ids — resolves the domain-model-shape family (rich-vs-anemic entity, encapsulated state, and above all the domain↔persistence boundary) DETERMINISTICALLY, with a perfect precision moat (0 false positives across 95 repositories and two blind holdouts) on the Flutter-widget / bloc-State / DTO / ORM-row shape collisions; DM6 spans both persistence families (SQL/table-mapped drift/floor/objectbox rows AND fused object-graph hive/isar active-records, on the fusion-vs-separation boundary) and is the demonstrated strength, WITNESSED on a real fused active-record, while DM4/DM5 and the ED/ES/AX9 defect surface are covered and precision-validated but ecosystem-rare (recall-unwitnessed after an exhausted hunt — Dart's immutability-first / clean-architecture idioms genuinely lack them); a single witnessed dim, four advisory dims and the source-only dynamic/inferred-receiver caps hold it a notch below the fully-bound tier.","coveredLenses":["DDD","Event sourcing","Event-driven","Vertical slice","Structural"],"notApplicableLenses":["Syntax-level correctness","DI segregation","Compiled-output efficiency"],"signedOffOn":"2026-07-17"},{"code":"elixir","displayName":"Elixir","applicability":8,"supportKind":"Deep","band":"HIGH","bandLabel":"HIGH","bandCss":"healthy","summary":"The apply/2 fold resolves cleanly (the cleanest precision in the program); several class-based lenses are inherently N/A on an immutable, inheritance-free language.","coveredLenses":["DDD (functional)","Event sourcing","Event-driven","Vertical slice"],"notApplicableLenses":["Anemic/mutable-setter (immutable)","inheritance & DU lenses","Syntax-level correctness","DI"],"signedOffOn":"2026-07-13"},{"code":"php","displayName":"PHP","applicability":8,"supportKind":"Deep","band":"HIGH","bandLabel":"HIGH","bandCss":"healthy","summary":"Modern declared types resolve source-only — real interfaces and typed call-owners — a stronger moat than the dynamic languages.","coveredLenses":["DDD","Event sourcing","Event-driven","Vertical slice","Structural"],"notApplicableLenses":["Syntax-level correctness","DI segregation","god-class/LCOM"],"signedOffOn":"2026-07-12"},{"code":"rust","displayName":"Rust","applicability":8,"supportKind":"Deep","band":"HIGH","bandLabel":"HIGH","bandCss":"healthy","summary":"Source-only (no build, never executes the repo — never runs cargo, a build.rs or a proc-macro, a genuine Rust security guarantee), Rust's sound static types — field-level pub-vs-private encapsulation, newtype ids, trait impls and #[derive]/ORM markers — resolve the domain-model-shape family (rich-vs-anemic entity, encapsulated state, and above all the domain↔persistence boundary) DETERMINISTICALLY, with a perfect precision moat (0 false positives across 92 repositories and two blind holdouts) on the thiserror-error-enum / clap-CLI / serde-DTO / ORM-row shape collisions; DM6 reaches across every mainstream ORM (diesel/sqlx/sea-orm/rusqlite) on the fused-vs-separated boundary and is the demonstrated strength, WITNESSED on four real fused active-records, with real ED4 and ES2 witnesses alongside, while DM4/DM5 and the rest of the ED/ES/AX9 surface are covered and precision-validated but ecosystem-rare (recall-unwitnessed after an exhausted hunt — Rust's encapsulation-first idioms genuinely lack them); recall-unwitnessed DM4/DM5, four advisory dims and the source-only inferred-receiver/cross-crate caps hold it a notch below the fully-bound tier.","coveredLenses":["DDD","Event sourcing","Event-driven","Vertical slice","Structural"],"notApplicableLenses":["Syntax-level correctness","DI segregation","Compiled-output efficiency"],"signedOffOn":"2026-07-17"},{"code":"scala","displayName":"Scala","applicability":8,"supportKind":"Deep","band":"HIGH","bandLabel":"HIGH","bandCss":"healthy","summary":"Source-only scalameta + an in-repo resolver (no build, never executes the repo) resolve the declarative domain surface — sealed/enum ADTs, match/fold replay, case-class value objects, best-in-class opaque/AnyVal typed-ids — and, unlike Go, the domain-model-shape family (anemic/mutable entity, domain↔infra boundary) DETERMINISTICALLY, disambiguated by Scala's derives-codec / ORM-row / actor-protocol markers; inferred-receiver call owners are the honest source-only cap.","coveredLenses":["DDD","Event sourcing","Event-driven","Vertical slice","Structural"],"notApplicableLenses":["Syntax-level correctness","DI segregation","Compiled-output efficiency"],"signedOffOn":"2026-07-16"},{"code":"swift","displayName":"Swift","applicability":8,"supportKind":"Deep","band":"HIGH","bandLabel":"HIGH","bandCss":"healthy","summary":"Source-only (no build, never executes the repo), Swift's rich static type system — the value(struct)/reference(class) axis, protocol conformance, property wrappers and ORM/framework markers — resolves the domain-model-shape family (rich-vs-anemic entity, encapsulated state, and above all the domain↔persistence boundary) DETERMINISTICALLY, with a perfect precision moat across four blind holdouts; DM6 reaches further than any prior language, spanning BOTH the SQL-active-record ORMs (Fluent/GRDB/StructuredQueries) AND fused object-graph managed objects (CoreData/Realm/SwiftData that carry domain rules on the entity); thin non-DM6 witnesses, four advisory dims and source-only receiver/macro caps hold it a notch below the fully-bound tier.","coveredLenses":["DDD","Event sourcing","Event-driven","Vertical slice","Structural"],"notApplicableLenses":["Syntax-level correctness","DI segregation","Compiled-output efficiency"],"signedOffOn":"2026-07-17"},{"code":"typescript","displayName":"TypeScript","applicability":8,"supportKind":"Deep","band":"HIGH","bandLabel":"HIGH","bandCss":"healthy","summary":"Source-only (never builds or runs the repo), the TypeScript compiler API resolves the domain-model-shape family DETERMINISTICALLY (union ADTs, class/interface/#private-readonly, decorator/ORM markers), with a perfect precision moat (0 FP over 62 calibration + 43 blind-holdout repos) on the crux — a Result/neverthrow union vs a domain-event union in the same files. DM6 (domain↔persistence) is the witnessed strength across five ORMs; the other domain dims are precision-clean but ecosystem-rare.","coveredLenses":["DDD","Event sourcing","Event-driven","Vertical slice","Structural"],"notApplicableLenses":["Syntax-level correctness","DI segregation","Compiled-output efficiency"],"signedOffOn":"2026-07-18"},{"code":"erlang","displayName":"Erlang","applicability":7,"supportKind":"Deep","band":"HIGH","bandLabel":"HIGH","bandCss":"healthy","summary":"Source-only escript on the BEAM's own parser (never runs erlc, applies no parse-transform, never executes the repo) resolves the OTP concurrency/consistency defect moat — blocking-in-a-handler (ED1), dual-write-without-an-outbox (ED4), query-that-writes (AX9), event naming (ED3) — deterministically with a perfect precision moat; the model-shape family is N/A by paradigm (immutable single-assignment, like Elixir), and the domain-infra boundary (DM6/DM7) is advisory because an Erlang record is byte-identical whether a domain entity or a persistence row.","coveredLenses":["DDD (functional)","Event sourcing","Event-driven","Vertical slice","Structural"],"notApplicableLenses":["Anemic/mutable-setter (immutable)","Inheritance & DU lenses","Syntax-level correctness","DI segregation"],"signedOffOn":"2026-07-16"},{"code":"go","displayName":"Go","applicability":7,"supportKind":"Deep","band":"HIGH","bandLabel":"HIGH","bandCss":"healthy","summary":"First-party go/types resolves the structural, event, fold and aggregate-reference lenses at static strength; the domain-model-shape lenses (anemic/mutable entity, domain-infra boundary) are advisory, because a Go struct is structurally identical whether a domain entity or an infra persistence row.","coveredLenses":["DDD (structural)","Event sourcing","Event-driven","Vertical slice","Structural"],"notApplicableLenses":["Inheritance & annotation lenses","Sealed/DU carrier","Syntax-level correctness","DI segregation"],"signedOffOn":"2026-07-15"},{"code":"python","displayName":"Python","applicability":7,"supportKind":"Deep","band":"HIGH","bandLabel":"HIGH","bandCss":"healthy","summary":"Marker lenses (value objects, ORM entities, events, rich aggregates) are strong and type-independent; call-owner-dependent lenses are partial on untyped code — declined, never guessed.","coveredLenses":["DDD","Event sourcing","Event-driven","Vertical slice"],"notApplicableLenses":["Sealed/DU lens","Syntax-level correctness","DI","god-class/LCOM"],"signedOffOn":"2026-07-12"},{"code":"ruby","displayName":"Ruby","applicability":6,"supportKind":"Deep","band":"MEDIUM","bandLabel":"MEDIUM","bandCss":"fair","summary":"The hardest static target — no types, no annotations, dynamic dispatch — so call-owner recall caps below Python; markers and block-fold DSLs still resolve.","coveredLenses":["DDD","Event sourcing","Event-driven","Vertical slice"],"notApplicableLenses":["Syntax-level correctness","DI","god-class/LCOM"],"signedOffOn":"2026-07-13"},{"code":"javascript","displayName":"JavaScript","applicability":4,"supportKind":"Structural","band":"LOW","bandLabel":"LOW","bandCss":"poor","summary":"Runs through the same TypeScript-compiler frontend (allowJs, source-only) — the module graph, complexity, dependency hygiene, class-shape and own-field mutation resolve — but with no types, interfaces, discriminated unions or decorators the deterministic domain-model-shape catalogue is advisory only (the honest TS-vs-JS split).","coveredLenses":["Structural","Module graph","Dependency hygiene","Complexity"],"notApplicableLenses":["Deterministic DDD/Event-sourcing model-shape lenses (advisory only — untyped)"],"signedOffOn":"2026-07-18"}],"bands":[{"band":"FULL","label":"FULL","cssKey":"exemplary","why":"Every applicable lens resolves and nothing is deferred — the assay can look through its DDD, event-sourcing, event-driven and vertical-slice lenses and report with the fullest confidence it offers. This is about survey clarity, not language quality."},{"band":"VERY HIGH","label":"VERY HIGH","cssKey":"exemplary","why":"Nearly every lens applies and resolves — a very clear survey. A named lens or two is deferred for this language, and its support statement says which. This is about survey clarity, not language quality."},{"band":"HIGH","label":"HIGH","cssKey":"healthy","why":"Most lenses apply and resolve — a clear, well-populated survey. A few lenses may be N/A for the language or resolve on a best-effort basis, but the architecture picture is strong. This is about survey clarity, not language quality."},{"band":"MEDIUM","label":"MEDIUM","cssKey":"fair","why":"A meaningful slice of the survey is populated. Some lenses are N/A for the language, or depend on type facts the language doesn't declare, so the assay reports what it can see and declines to guess the rest. This is about survey clarity, not language quality."},{"band":"LOW","label":"LOW","cssKey":"poor","why":"The survey is intentionally thin: the language exposes the structural lenses but not the deep domain-lens catalogue. What we report is real; there is simply less of it. This is about survey clarity, not language quality."}]}