blindspot

Knowledge resilience report

Repository: /private/tmp/cohort10/efcore
Generated 2026-05-20 15:43 UTC · window: last 90 days · blindspot v0.2.1

Executive brief

Critical Resilience 35/100 · F · team profile

Top 3 risks
  1. HIGH Diversify ownership of 'EFCore.Analyzers' (currently single-owner) EFCore.Analyzers
  2. HIGH Diversify ownership of 'EFCore.Tools' (currently single-owner) EFCore.Tools
  3. HIGH Diversify ownership of 'eng' (currently single-owner) eng

Business implication An unexpected departure of the top contributor would orphan 385 critical files and likely slow feature delivery by 3–5 weeks while the team learns the surface.

Executive summary

Pair Andriy Svyryd (andriysvyryd@github) on 'eng' — bus factor 1 across 26 files

Resilience is **Critical** (35/100). Weakest dimension: ownership concentration (F). This is a structural property — typical for founder-led or single-maintainer projects — not a verdict on project health.

Risk inventory: 5 service(s) rest on a single contributor; 385 file(s) would become orphans if the top contributor leaves; 7 file(s) carry high correction load (≥35% fix/revert); 26 service(s) lack AI-readable operational context.

Top recommended action: Pair Andriy Svyryd (andriysvyryd@github) on 'eng' — bus factor 1 across 26 files

💡 Want a richer, prose-style executive summary? Add a cloud LLM key (Anthropic or OpenAI) to your scan:
--api-key sk-ant-... --provider anthropic --model claude-sonnet-4-6
or set narrative.api_key in .blindspot.yaml. Without a key, this rule-based narrator is used — deterministic, in-process, no network.

Overview

Engineering Resilience Score

Overall
35/100 F
Critical

Critical resilience overall (score 35). Weakest dimension: AI operational readiness at 1.

Team-based Multiple maintainers without a single dominant contributor.

Key signals — the six questions

Six concrete questions, each with a one-number answer. This is the report. Each signal opens up below into the files, services and people behind its number — run with --detailed for the architecture deep-dive.

Ownership concentration F
5 services rest on a single owner
If that person is unavailable, no one else can confidently change these areas.
Single-engineer dependency
385 files orphan if the top contributor leaves
These files would have no confident owner the day that person walks out.
Knowledge decay
No file is critically decayed
Owners are still close to the code they own.
Review depth
Reviews carry substantive comments
Approvals reflect real scrutiny, not rubber-stamping.
Correction load C
7 files carry a heavy bugfix tail
After each feature these files get a stream of fix/revert commits — see the Correction load table (--detailed) for the exact surfaces; the top ones also appear in the actions list.
AI-readable context F
Repo lacks AI-readable operational context (1/5)
No specs, architecture notes / ADRs, prompts at the repo root — a new human or AI agent must reverse-engineer the codebase.

Recommended actions

Concrete next steps derived from the signals in this report. Each action is tied to a specific finding — treat them as conversation starters with the team, not directives.

Priority Confidence Category Title Target Evidence
High Medium Ownership Diversification Single-owner concentration Diversify ownership of 'EFCore.Analyzers' (currently single-owner)
Service 'EFCore.Analyzers' has bus factor 1 across 5 files; Maxwell (m-x-shokhzod@github) holds 100% of effective ownership. Pair them with at least two additional engineers and rotate code reviews for this area over the next 60 days.
▸ Bus factor 1 over 5 files — Maxwell (m-x-shokhzod@github) holds 100% of effective ownership.
EFCore.Analyzers bus_factor=1, top_owner_coverage=100%, files=5
High Medium Ownership Diversification Single-owner concentration Diversify ownership of 'EFCore.Tools' (currently single-owner)
Service 'EFCore.Tools' has bus factor 1 across 6 files; Andriy Svyryd (andriysvyryd@github) holds 100% of effective ownership. Pair them with at least two additional engineers and rotate code reviews for this area over the next 60 days.
▸ Bus factor 1 over 6 files — Andriy Svyryd (andriysvyryd@github) holds 100% of effective ownership.
EFCore.Tools bus_factor=1, top_owner_coverage=100%, files=6
High Medium Ownership Diversification Single-owner concentration Diversify ownership of 'eng' (currently single-owner)
Service 'eng' has bus factor 1 across 26 files; Andriy Svyryd (andriysvyryd@github) holds 91% of effective ownership. Pair them with at least two additional engineers and rotate code reviews for this area over the next 60 days. Cadence: aim to cover the top files this quarter.
▸ Bus factor 1 over 26 files — Andriy Svyryd (andriysvyryd@github) holds 91% of effective ownership.
eng bus_factor=1, top_owner_coverage=91%, files=26
Medium Medium Codeowners Update Update CODEOWNERS for NuGet.config
Declared owners (@AndriySvyryd) do not include the current top contributor. ProductConstructionServiceProd (productconstructionserviceprod) holds 69% of effective ownership. Either add them to the CODEOWNERS rule or assign explicit cross-coverage.
▸ Declared owner does not include the actual top contributor (ProductConstructionServiceProd (productconstructionserviceprod) at 69% coverage).
NuGet.config declared=@AndriySvyryd, actual_top=productconstructionserviceprod, coverage=69%, line=9
Medium Medium Codeowners Update Update CODEOWNERS for eng/Version.Details.xml
Declared owners (@AndriySvyryd) do not include the current top contributor. ProductConstructionServiceProd (productconstructionserviceprod) holds 100% of effective ownership. Either add them to the CODEOWNERS rule or assign explicit cross-coverage.
▸ Declared owner does not include the actual top contributor (ProductConstructionServiceProd (productconstructionserviceprod) at 100% coverage).
eng/Version.Details.xml declared=@AndriySvyryd, actual_top=productconstructionserviceprod, coverage=100%, line=12
Medium Medium Codeowners Update Update CODEOWNERS for eng/Versions.props
Declared owners (@AndriySvyryd) do not include the current top contributor. ProductConstructionServiceProd (productconstructionserviceprod) holds 41% of effective ownership. Either add them to the CODEOWNERS rule or assign explicit cross-coverage.
▸ Declared owner does not include the actual top contributor (ProductConstructionServiceProd (productconstructionserviceprod) at 41% coverage).
eng/Versions.props declared=@AndriySvyryd, actual_top=productconstructionserviceprod, coverage=41%, line=12
Medium Medium Ownership Diversification Single-owner concentration Diversify ownership of 'EFCore.Proxies' (currently single-owner)
Service 'EFCore.Proxies' has bus factor 1 across 3 files; Andriy Svyryd (andriysvyryd@github) holds 100% of effective ownership. Pair them with at least two additional engineers and rotate code reviews for this area over the next 60 days.
▸ Bus factor 1 over 3 files — Andriy Svyryd (andriysvyryd@github) holds 100% of effective ownership.
EFCore.Proxies bus_factor=1, top_owner_coverage=100%, files=3
Medium Medium Ownership Diversification Single-owner concentration Diversify ownership of 'EFCore.SqlServer.Abstractions' (currently single-owner)
Service 'EFCore.SqlServer.Abstractions' has bus factor 1 across 3 files; Andriy Svyryd (andriysvyryd@github) holds 100% of effective ownership. Pair them with at least two additional engineers and rotate code reviews for this area over the next 60 days.
▸ Bus factor 1 over 3 files — Andriy Svyryd (andriysvyryd@github) holds 100% of effective ownership.
EFCore.SqlServer.Abstractions bus_factor=1, top_owner_coverage=100%, files=3

Signal details

Each signal above, opened up — the files, services and people behind the headline number. Risk signals are expanded by default; healthy ones stay collapsed.

Ownership concentration — service risk map risk

Bus factor measures how many people would need to leave before knowledge of a service is critically lost. A bus factor of 1 means a single person carries the service.

ServiceFilesBus factor RiskTop ownerTheir coverage
eng 26 1 critical Andriy Svyryd (andriysvyryd@github) 91%
(config) 22 1 critical Andriy Svyryd (andriysvyryd@github) 95%
EFCore.Tools 6 1 critical Andriy Svyryd (andriysvyryd@github) 100%
EFCore.Analyzers 5 1 critical Maxwell (m-x-shokhzod@github) 100%
EFCore.Proxies 3 1 critical Andriy Svyryd (andriysvyryd@github) 100%
EFCore.SqlServer.Abstractions 3 1 critical Andriy Svyryd (andriysvyryd@github) 100%
tools 2 1 critical Andriy Svyryd (andriysvyryd@github) 100%
EFCore.Tasks 2 1 critical Andriy Svyryd (andriysvyryd@github) 100%
benchmark 1 1 critical Parker Bibus (parkerbibus@microsoft.com) 100%
EFCore.SqlServer.HierarchyId 1 1 critical Andriy Svyryd (andriysvyryd@github) 100%
EFCore.SqlServer.NTS 1 1 critical Andriy Svyryd (andriysvyryd@github) 100%
EFCore.Sqlite.NTS 1 1 critical Andriy Svyryd (andriysvyryd@github) 100%
Microsoft.Data.Sqlite.Core 1 1 critical Andriy Svyryd (andriysvyryd@github) 100%
stubs 1 1 critical Andriy Svyryd (andriysvyryd@github) 100%
test 506 2 high Shay Rojansky (roji@roji.org) 64%
EFCore 128 2 high Andriy Svyryd (andriysvyryd@github) 70%
EFCore.Relational 90 2 high Andriy Svyryd (andriysvyryd@github) 57%
EFCore.Cosmos 55 2 high JoasE (joase@github) 76%
EFCore.SqlServer 48 2 high Shay Rojansky (roji@roji.org) 70%
.github 12 2 high Shay Rojansky (roji@roji.org) 66%
(root) 9 2 high Andriy Svyryd (andriysvyryd@github) 77%
ef 7 2 high Andriy Svyryd (andriysvyryd@github) 62%
Shared 4 2 high Andriy Svyryd (andriysvyryd@github) 75%
EFCore.InMemory 3 2 high Andriy Svyryd (andriysvyryd@github) 67%
EFCore.Abstractions 2 2 high Shay Rojansky (roji@roji.org) 63%
EFCore.Design 16 3 medium Andriy Svyryd (andriysvyryd@github) 44%
EFCore.Sqlite.Core 11 3 medium Shay Rojansky (roji@roji.org) 36%
dotnet-ef 7 4 healthy ZèD (mofajjalrasul@gmail.com) 29%
Single-engineer dependency — departure scenarios risk

For each of the top contributors by aggregate ownership coverage, this is what would happen if they left tomorrow: how many files lose their primary expert, how many become unowned (orphan, top remaining coverage < 30%), and which services take the largest hit. Use this to prioritise pair-work and knowledge transfer.

CRITICAL If Shay Rojansky (roji@roji.org) leaves
Files affected
454 / 973
Orphan files
385 (40%)
Avg coverage loss
45%
Most-affected services
  • test 337/506 files, 286 orphan, 64% avg loss
  • EFCore.SqlServer 35/48 files, 29 orphan, 70% avg loss
  • EFCore.Relational 29/90 files, 28 orphan, 34% avg loss
CRITICAL If Andriy Svyryd (andriysvyryd@github) leaves
Files affected
418 / 973
Orphan files
339 (35%)
Avg coverage loss
39%
Most-affected services
  • test 150/506 files, 92 orphan, 25% avg loss
  • EFCore 94/128 files, 89 orphan, 70% avg loss
  • EFCore.Relational 54/90 files, 50 orphan, 57% avg loss
CRITICAL If JoasE (joase@github) leaves
Files affected
92 / 973
Orphan files
82 (8%)
Avg coverage loss
9%
Most-affected services
  • EFCore.Cosmos 42/55 files, 41 orphan, 76% avg loss
  • test 38/506 files, 29 orphan, 7% avg loss
  • EFCore 7/128 files, 7 orphan, 5% avg loss
Knowledge decay — top concerns healthy

Decay rises when an owner stops touching a file and others have been changing it. The 90-day projection shows the trajectory if nothing changes.

No file is critically decayed.
Review depth — review lineage healthy

Review data fetched from GitHub (50 PRs analyzed). A rubber-stamp ratio is the share of approvals on a file that arrived without a single review comment. Reviewer diversity measures whether several people share the review load.

Files with highest rubber-stamp ratio

No rubber-stamp patterns detected.

Files with lowest reviewer diversity

No low-diversity files detected.
Correction load — files with a bugfix tail risk

Share of recent commits to each file that are follow-up fixes or reverts. A high ratio is observable evidence of stability debt — work is shipping but corrections are paying for it. Look at the surface, not the person.

File Total commits Fixes Reverts Correction ratio Risk
src/EFCore/Query/Internal/ExpressionTreeFuncletizer.cs 5 3 0 60% critical
test/EFCore.Sqlite.FunctionalTests/BulkUpdates/NorthwindBulkUpdatesSqliteTest.cs 6 3 0 50% critical
test/EFCore.Specification.Tests/Query/AdHocComplexTypeQueryTestBase.cs 7 3 0 43% high
test/EFCore.Cosmos.FunctionalTests/Query/PrimitiveCollectionsQueryCosmosTest.cs 5 2 0 40% high
test/EFCore.SqlServer.FunctionalTests/Query/PrimitiveCollectionsQuerySqlServer160Test.cs 5 2 0 40% high
test/EFCore.SqlServer.FunctionalTests/Query/PrimitiveCollectionsQuerySqlServerTest.cs 5 2 0 40% high
.github/workflows/api-review-baselines.yml 8 3 0 38% high
src/EFCore/Properties/CoreStrings.Designer.cs 10 3 0 30% moderate
src/EFCore/Properties/CoreStrings.resx 10 3 0 30% moderate
test/EFCore.Cosmos.FunctionalTests/EmbeddedDocumentsTest.cs 7 2 0 29% moderate
src/EFCore.Relational/Metadata/Internal/RelationalModel.cs 5 0 1 20% moderate
test/EFCore.Cosmos.FunctionalTests/TestUtilities/CosmosTestStore.cs 5 1 0 20% moderate
.github/copilot-instructions.md 5 1 0 20% moderate
test/EFCore.Cosmos.FunctionalTests/Query/AdHocComplexTypeQueryCosmosTest.cs 6 1 0 17% healthy
src/EFCore.Relational/EFCore.Relational.baseline.json 7 1 0 14% healthy
AI-readable context — operational docs coverage risk

Coverage of AI-readable organizational memory — agent rules, specs, prompts, architecture decisions, skills. The repo-root row is what the signal grades; per-service rows are shown for context. This is not an AI-generated-code detector.

Surface Agent rules Specs Prompts Architecture Skills Coverage
(repo) 20%
.github 20%
EFCore 0%
EFCore.Abstractions 0%
EFCore.Analyzers 0%
EFCore.Cosmos 0%
EFCore.Design 0%
EFCore.InMemory 0%
EFCore.Proxies 0%
EFCore.Relational 0%
EFCore.SqlServer 0%