Network Matrices — Machine-Readable Graph Data

On this page

This page is the machine-readable layer of the network map. The Mermaid diagrams show the network visually. These matrices show it computationally — every relationship as a cell in a table, every money flow as a row in a ledger.

Download Formats

FormatURLUse Case
JSON Graph/graph.json37 nodes, 57 typed edges. For D3.js, NetworkX, Neo4j, AI agents.
CSV Edge List/graph.csvOne row per edge. For Excel, Gephi, pandas, R.
This PageYou’re hereHuman-readable matrices for visual inspection.

Board Membership Matrix Verified

Who governs what. Every cell is a public record. Blank = no documented role.

PersonPCAMacDowellPurpose FoundationAnchor RockBank on Banks PACOFA Michigan
Brian Roderick Banks SuperintendentSuperintendentPresident + Agent———
Joseph Holland Jr. ——Secretary + Treasurer—TreasurerOfficer
Judge Cylenthia Miller Board Chair——Board Chair (dissolved)——
Judge Tenisha Yancey —Board Chair————
Lamar Moreland (Asst. AG)Board Vice Chair—————
Latisha Johnson (City Council)Board Secretary—————

Pattern: Two convicted felons control the revenue entities (schools + CMO + foundation). Three judges + two government officials govern the boards. The felon and the judge sit on the same org chart.


Court Assignment Matrix Verified

Which judges sit where. The enterprise generates cases in Wayne County courts. These judges have documented connections to the enterprise.

JudgeCourtConnection to EnterpriseStatus
Judge Cylenthia MillerWayne 3rd CircuitPCA Board ChairActive — ballot Nov 2026
Judge Aliyah SabreeWayne 3rd Circuit (Family)MSU Law classmate · father = TreasurerActive — appointed May 2025
ramseyWayne 3rd Circuit (Criminal)2 family on MacDowell payrollActive
evansWayne 3rd Circuit21-year mentorRetired (JTC)
Judge Tenisha Yancey36th DistrictMacDowell Board Chair · paid $383.82Active
Judge Adam Sabree36th DistrictEric Sabree’s son · Metro Property RICOActive
Judge Sean Perkins36th DistrictBrother = Banks’ attorneyActive
Judge David PerkinsProbate CourtFamily donations · guardianship jurisdictionActive
Judge Denise Langford Morris (Retired)Oakland CountyWrote book foreword with fake J.D.Retired (JAMS)

Coverage: 4 judges in 3rd Circuit, 3 judges in 36th District, 1 in Probate, 1 in Oakland. Any case involving Banks’ network in Wayne County risks landing before a connected judge.


Money Flow Matrix Verified: All amounts from CFRS, TransparencyUSA, or audited financials

School Revenue Extraction

FromThroughToAmountRateSource
State of MichiganMacDowell PrepPurpose Group LLC → Banks$4,285,201/yr72.67%Audited financials
State of MichiganPurpose Charter AcademyPurpose Group LLC → BanksTBDTBDFirst year FY2026
Purpose Group LLCManagement fee gapUnaccounted$348,489/yr—Budget analysis

Campaign → Enterprise Payments

FromToAmountYearNoteSource
Yancey campaignBanks Strategy LLC$383.822024Sole contribution AND sole expenditureCFRS
Yancey campaignInner Link Graphics$8,025MultipleCampaign vendorTransparencyUSA
Miller campaignBanks Strategy LLCUnknown—Vendor relationship documentedCFRS
McKinney campaignDarryl Banks Jr.$2,2832024Extended Banks family memberTransparencyUSA
McKinney campaignDarryl Banks Jr.$4,483TotalCumulative across cyclesTransparencyUSA

Enterprise Self-Dealing Loop

State per-pupil funding
    → Schools (PCA + MacDowell)
        → Purpose Group LLC (72.67%)
            → Banks (sole member, salary + fees)
                → Banks Strategy LLC (consulting entity)
                    ← Judge campaign payments ($383.82+)
                        ← Judges who hear enterprise cases
                            ← Cases generated by enterprise schools

Family Matrix Verified

Person ARelationshipPerson BInstitutional Overlap
Eric SabreeFatherJudge Aliyah SabreeTreasurer → 3rd Circuit (Family Division)
Eric SabreeFatherJudge Adam SabreeTreasurer → 36th District Court
Todd PerkinsBrotherJudge Sean PerkinsBanks’ attorney → 36th District Court
OD BanksFatherBrian BanksBMF Defendant #22 → Enterprise leader
Kelly RamseyMother/family2 employeesJudge → MacDowell payroll

Institutional Conflict Matrix Verified

Where personal roles conflict with institutional duties.

PersonPersonal RoleInstitutional RoleConflict
Judge Cylenthia MillerPCA Board Chair3rd Circuit JudgeGoverns school · hears cases from school families
Lamar MorelandPCA Board Vice ChairAsst. Attorney GeneralAG has RICO/nonprofit fraud jurisdiction
Latisha JohnsonPCA Board SecretaryCity Council MemberCouncil oversees DPSCD (PCA’s authorizer)
Judge Tenisha YanceyMacDowell Board Chair36th District JudgeChairs school board · paid school’s owner
Sherry Gay-DagnogoBanks’ political allyCity OmbudsmanFormer charter authorizer now handles Detroit complaints
Eric SabreeFather of 2 judgesCounty TreasurerTax foreclosure pipeline intersects enterprise

For Analysts and AI Agents

Python (NetworkX)

import json, networkx as nx

with open('graph.json') as f:
    data = json.load(f)

G = nx.DiGraph()
for n in data['nodes']:
    G.add_node(n['id'], **n)
for e in data['edges']:
    G.add_edge(e['source'], e['target'], **e)

# Find all paths from state funding to Banks
for path in nx.all_simple_paths(G, 'macdowell', 'banks'):
    print(' → '.join(path))

# Centrality — who is the most connected?
cent = nx.degree_centrality(G)
for node, score in sorted(cent.items(), key=lambda x: -x[1])[:5]:
    print(f"{G.nodes[node].get('label', node)}: {score:.3f}")

R (igraph)

library(igraph)
edges <- read.csv("https://detroit.primals.eco/graph.csv")
g <- graph_from_data_frame(edges[, c("source_id", "target_id")], directed = TRUE)
plot(g, vertex.label = V(g)$name, vertex.size = degree(g) * 3)

Gephi

  1. Download graph.csv
  2. Import as Edge Table (source_id → target_id)
  3. Use edge_type for edge coloring, weight for thickness

All data derived from public records. Graph data is CC-BY-SA-4.0. Clone the repository for the full evidence package.