{"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":"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 (never builds or runs the repo — no cargo, build.rs or proc-macro, a genuine Rust security guarantee). Rust's sound static types — field-level encapsulation, newtype ids, trait impls and #[derive]/ORM markers — resolve the domain-model-shape family deterministically (0 false positives across 92 repos + two blind holdouts). DM6 (domain↔persistence) reaches mainstream ORMs (diesel/sqlx/sea-orm/rusqlite) and is the demonstrated strength; the remaining DM/ED/ES surface is covered but rare.","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":"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."}]}