blindspot

Knowledge resilience report

Repository: /private/tmp/cohort10/pydantic-ai
Generated 2026-05-20 16:22 UTC · window: last 90 days · blindspot v0.2.1

Executive brief

Moderate Resilience 65/100 · D · team profile

Top 3 risks
  1. HIGH Diversify ownership of 'pydantic_graph' (currently single-owner) pydantic_graph
  2. MEDIUM Diversify ownership of 'agent_docs' (currently single-owner) agent_docs
  3. MEDIUM Knowledge transfer for pydantic_ai_slim/pydantic_ai/agent/__init__.py pydantic_ai_slim/pydantic_ai/agent/__init__.py

Patterns detected Fragile Velocity

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

Executive summary

Pair David Montague (dmontagu@github) on 'pydantic_graph' — bus factor 1 across 35 files

Resilience is **Moderate** (65/100). Weakest dimension: ownership concentration (D).

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

Top recommended action: Pair David Montague (dmontagu@github) on 'pydantic_graph' — bus factor 1 across 35 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
65/100 D
Moderate

Moderate resilience overall (score 65). Weakest dimension: AI operational readiness at 4.

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 D
3 services rest on a single owner
If that person is unavailable, no one else can confidently change these areas.
Single-engineer dependency
598 files orphan if the top contributor leaves
These files would have no confident owner the day that person walks out.
Knowledge decay
3 files have drifted from their owner
The owner stopped touching these while others kept changing them — the knowledge is going stale.
Review depth
No review data (local git only)
Connect a GitHub/Bitbucket remote to measure review depth.
Correction load
Correction load is low across the codebase
A handful of files (21) run a high fix/revert ratio, but repo-wide rework pressure stays low.
AI-readable context
Repo carries AI-readable operational context (2/5)
A new contributor or AI agent has docs to load at the repo root before touching code.

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 High Ownership Diversification Single-owner concentration Diversify ownership of 'pydantic_graph' (currently single-owner)
Service 'pydantic_graph' has bus factor 1 across 35 files; David Montague (dmontagu@github) holds 94% of effective ownership. Pair them with at least two additional engineers and rotate code reviews for this area over the next 60 days. Start with these 2 files: pydantic_graph/pydantic_graph/basenode.py, pydantic_graph/pydantic_graph/__init__.py. Cadence: aim to cover the top files this quarter.
▸ Bus factor 1 over 35 files — David Montague (dmontagu@github) holds 94% of effective ownership.
pydantic_graph bus_factor=1, top_owner_coverage=94%, files=35, top_files=pydantic_graph/pydantic_graph/basenode.py+1
Medium High Knowledge Transfer Knowledge transfer for pydantic_ai_slim/pydantic_ai/agent/__init__.py
Decay is elevated (56%). Douwe Maan (douwe@pydantic.dev) last touched this file 7 days ago, and 406 lines have been changed since by others. Schedule a transfer session and designate a secondary owner before the next non-trivial change.
▸ Decay 56% — owner last touched 7 days ago, 406 lines changed by others since.
pydantic_ai_slim/pydantic_ai/agent/__init__.py decay=56%, days_since_touch=7, lines_after=406
Medium High Knowledge Transfer Knowledge transfer for pydantic_ai_slim/pydantic_ai/messages.py
Decay is elevated (50%). Douwe Maan (douwe@pydantic.dev) last touched this file 8 days ago, and 248 lines have been changed since by others. Schedule a transfer session and designate a secondary owner before the next non-trivial change.
▸ Decay 50% — owner last touched 8 days ago, 248 lines changed by others since.
pydantic_ai_slim/pydantic_ai/messages.py decay=50%, days_since_touch=8, lines_after=248
Medium High Knowledge Transfer Knowledge transfer for pydantic_ai_slim/pydantic_ai/models/instrumented.py
Decay is elevated (54%). Douwe Maan (douwe@pydantic.dev) last touched this file 7 days ago, and 344 lines have been changed since by others. Schedule a transfer session and designate a secondary owner before the next non-trivial change.
▸ Decay 54% — owner last touched 7 days ago, 344 lines changed by others since.
pydantic_ai_slim/pydantic_ai/models/instrumented.py decay=54%, days_since_touch=7, lines_after=344
Medium High Ownership Diversification Single-owner concentration Diversify ownership of 'agent_docs' (currently single-owner)
Service 'agent_docs' has bus factor 1 across 4 files; Douwe Maan (douwe@pydantic.dev) holds 88% 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 4 files — Douwe Maan (douwe@pydantic.dev) holds 88% of effective ownership.
agent_docs bus_factor=1, top_owner_coverage=88%, files=4

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
pydantic_graph 35 1 critical David Montague (dmontagu@github) 94%
scripts 8 1 critical David SF (dsfaccini@github) 88%
agent_docs 4 1 critical Douwe Maan (douwe@pydantic.dev) 88%
examples 18 2 high David SF (dsfaccini@github) 72%
(config) 2 2 high Miguel Miranda Dias (pandego@github) 50%
clai 1 2 high David Montague (dmontagu@github) 62%
tests 724 3 medium David SF (dsfaccini@github) 69%
docs 122 4 healthy Douwe Maan (douwe@pydantic.dev) 30%
pydantic_evals 19 4 healthy David Montague (dmontagu@github) 45%
.github 13 4 healthy David Montague (dmontagu@github) 25%
(root) 8 4 healthy David SF (dsfaccini@github) 31%
pydantic_ai_slim 227 7 healthy Douwe Maan (douwe@pydantic.dev) 43%

Files with single ownership

Entirely owned by one person — the most acute knowledge risk.

FileOwnerCoverage
pydantic_graph/pydantic_graph/__init__.py David Montague (dmontagu@github) 100%
pydantic_graph/pydantic_graph/basenode.py David Montague (dmontagu@github) 100%
pydantic_ai_slim/pydantic_ai/_run_context.py Douwe Maan (douwe@pydantic.dev) 100%
pydantic_ai_slim/pydantic_ai/capabilities/native_or_local.py Douwe Maan (douwe@pydantic.dev) 100%
pydantic_ai_slim/pydantic_ai/_tool_search.py Douwe Maan (douwe@pydantic.dev) 100%
pydantic_ai_slim/pydantic_ai/native_tools/__init__.py Douwe Maan (douwe@pydantic.dev) 100%
pydantic_ai_slim/pydantic_ai/native_tools/_tool_search.py Douwe Maan (douwe@pydantic.dev) 100%
pydantic_ai_slim/pydantic_ai/_warnings.py Douwe Maan (douwe@pydantic.dev) 100%
pydantic_ai_slim/pydantic_ai/capabilities/wrapper.py Douwe Maan (douwe@pydantic.dev) 100%
pydantic_ai_slim/pydantic_ai/profiles/__init__.py Douwe Maan (douwe@pydantic.dev) 100%
pydantic_ai_slim/pydantic_ai/_json_schema.py Dharit Shah (dharits3@gmail.com) 100%
pydantic_ai_slim/pydantic_ai/durable_exec/temporal/_run_context.py Douwe Maan (douwe@pydantic.dev) 100%
pydantic_ai_slim/pydantic_ai/capabilities/prefix_tools.py Douwe Maan (douwe@pydantic.dev) 100%
pydantic_ai_slim/pydantic_ai/capabilities/__init__.py Douwe Maan (douwe@pydantic.dev) 86%
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 David SF (dsfaccini@github) leaves
Files affected
586 / 1181
Orphan files
598 (51%)
Avg coverage loss
50%
Most-affected services
  • tests 498/724 files, 511 orphan, 69% avg loss
  • pydantic_ai_slim 49/227 files, 48 orphan, 21% avg loss
  • docs 12/122 files, 16 orphan, 12% avg loss
CRITICAL If Douwe Maan (douwe@pydantic.dev) leaves
Files affected
235 / 1181
Orphan files
250 (21%)
Avg coverage loss
19%
Most-affected services
  • pydantic_ai_slim 106/227 files, 117 orphan, 43% avg loss
  • tests 78/724 files, 86 orphan, 11% avg loss
  • docs 37/122 files, 33 orphan, 30% avg loss
CRITICAL If David Montague (dmontagu@github) leaves
Files affected
113 / 1181
Orphan files
164 (14%)
Avg coverage loss
9%
Most-affected services
  • tests 30/724 files, 51 orphan, 4% avg loss
  • docs 35/122 files, 40 orphan, 28% avg loss
  • pydantic_graph 34/35 files, 32 orphan, 94% avg loss
Knowledge decay — top concerns risk

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.

FileTop owner Days since touch Decay score Risk 90-day projection
pydantic_ai_slim/pydantic_ai/agent/__init__.py Douwe Maan (douwe@pydantic.dev) 7 56% high 86%
pydantic_ai_slim/pydantic_ai/models/instrumented.py Douwe Maan (douwe@pydantic.dev) 7 54% high 85%
pydantic_ai_slim/pydantic_ai/messages.py Douwe Maan (douwe@pydantic.dev) 8 50% high 80%
pydantic_ai_slim/pydantic_ai/models/__init__.py Douwe Maan (douwe@pydantic.dev) 8 46% medium 76%
pydantic_ai_slim/pydantic_ai/_utils.py Douwe Maan (douwe@pydantic.dev) 8 42% medium 71%
pydantic_ai_slim/pydantic_ai/exceptions.py Douwe Maan (douwe@pydantic.dev) 55 26% medium 41%
pydantic_ai_slim/pydantic_ai/capabilities/prefix_tools.py Douwe Maan (douwe@pydantic.dev) 55 25% medium 40%
pydantic_ai_slim/pydantic_ai/durable_exec/temporal/_run_context.py Douwe Maan (douwe@pydantic.dev) 49 23% low 39%
pydantic_ai_slim/pydantic_ai/toolsets/abstract.py Douwe Maan (douwe@pydantic.dev) 42 21% low 39%
pydantic_ai_slim/pydantic_ai/_json_schema.py Dharit Shah (dharits3@gmail.com) 37 19% low 38%
pydantic_ai_slim/pydantic_ai/_instrumentation.py Douwe Maan (douwe@pydantic.dev) 7 18% low 48%
pydantic_ai_slim/pydantic_ai/_otel_messages.py Douwe Maan (douwe@pydantic.dev) 16 9% low 36%
pydantic_ai_slim/pydantic_ai/output.py Douwe Maan (douwe@pydantic.dev) 8 6% low 36%
pydantic_ai_slim/pydantic_ai/tools.py Douwe Maan (douwe@pydantic.dev) 8 6% low 36%
pydantic_ai_slim/pydantic_ai/__init__.py Douwe Maan (douwe@pydantic.dev) 8 6% low 35%
pydantic_ai_slim/pydantic_ai/capabilities/abstract.py Douwe Maan (douwe@pydantic.dev) 8 6% low 35%
pydantic_ai_slim/pydantic_ai/_warnings.py Douwe Maan (douwe@pydantic.dev) 8 5% low 35%
pydantic_ai_slim/pydantic_ai/capabilities/wrapper.py Douwe Maan (douwe@pydantic.dev) 8 5% low 35%
pydantic_ai_slim/pydantic_ai/profiles/__init__.py Douwe Maan (douwe@pydantic.dev) 8 5% low 35%
pydantic_ai_slim/pydantic_ai/_tool_search.py Douwe Maan (douwe@pydantic.dev) 8 5% low 35%
Review depth — review lineage healthy
🔌 Review metrics unavailable for this scan. A GitHub remote was detected, but no credentials were available. Enable it once and re-run the scan to unlock rubber-stamp ratio, reviewer diversity, fast-approval detection, and the PR activity mix:
gh auth login                          # uses gh CLI (recommended)
or pass a token directly:
--github-token ghp_...
or add it to .blindspot.yaml:
github:
  token: ghp_...
Correction load — files with a bugfix tail healthy

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
pydantic_ai_slim/pydantic_ai/providers/ollama.py 5 3 0 60% critical
pydantic_ai_slim/pydantic_ai/providers/anthropic.py 6 3 0 50% critical
pydantic_ai_slim/pydantic_ai/providers/openrouter.py 6 3 0 50% critical
tests/test_embeddings.py 7 2 1 43% high
pydantic_ai_slim/pydantic_ai/providers/bedrock.py 7 3 0 43% high
tests/evals/test_dataset.py 7 3 0 43% high
docs/logfire.md 5 1 1 40% high
tests/test_vercel_ai.py 25 10 0 40% high
pydantic_ai_slim/pydantic_ai/providers/google.py 5 2 0 40% high
tests/test_usage_limits.py 5 2 0 40% high
pydantic_ai_slim/pydantic_ai/models/openrouter.py 10 4 0 40% high
pydantic_ai_slim/pydantic_ai/toolsets/_dynamic.py 5 2 0 40% high
tests/test_python_signature.py 5 1 1 40% high
tests/test_messages.py 13 5 0 38% high
pydantic_ai_slim/pydantic_ai/_output.py 13 5 0 38% high
AI-readable context — operational docs coverage healthy

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) 40%
docs 20%
tests 20%
.github 0%
agent_docs 0%
clai 0%
examples 0%
pydantic_ai_slim 0%
pydantic_evals 0%
pydantic_graph 0%
scripts 0%