In the field

zzop over everything X open-sourced

Twelve repositories from X (formerly Twitter) and xAI — the For You feed, Grok's build system, the xAI SDK, community notes — analyzed in one run with zzop v0.33.0 on 2026-08-15. Below is the full dependency graph on one canvas, then the four other domain exports. Every cap and every blind spot is disclosed in the diagram itself.

4,457dep nodes (files)
10,614in-tree import edges
6import cycles
1,870,057LOC (dep nodes)
171findings (4 of 12 repos)
6 / 3mutating routes / no auth evidence

Why the shape is unlike a generic grapher's

A typical grapher draws "every file and every reference" as one hairball. zzop differs three ways. (1) an edge is an import resolved within the tree only — npm/pip package references and unresolved specifiers are dropped, so twelve repositories come out as twelve unconnected islands (the honest shape: the repos do not import each other). (2) the mermaid views are capped per domain, and whatever a cap drops is disclosed inside the document — the drawn/in-scope/total lines below are that census. (3) the join graph's node is not a file but a (source, side, kind, key) relation, so a picture whose nodes are HTTP routes and DB tables cannot share a shape with a file graph in the first place.

Full dependency graph — twelve islands

The whole cosmograph export drawn as-is: 4,457 files and all 10,614 in-tree import edges, no cap. Clustered by repository; nodes toward a cluster's centre have the most in-tree connections; dot size is LOC; red-outlined nodes sit in an import cycle. Hover for the file path.

repositoryfilesedgesin-cycleloc
grok-build2,5397,26301,577,731
the-algorithm1,2502,3616169,450
xai-sdk-python219440044,516
x-algorithm207305025,121
the-algorithm-ml91307,921
communitynotes72149029,214
xai-cookbook433806,151
grok-build-plugin-cc285006,136
grok-14502,300
plugin-marketplace4001,517

zzop's own disclosure, verbatim: this graph holds resolved in-tree edges only — a low number can mean "many imports the resolver could not map to a walked file", not "few imports".

join — the cross-layer join (nodes are io relations)

edges 2/2 · unconsumedProvides 17/17 · unprovidedConsumes 12/12 · unresolvedConsumes 25/27 · externalConsumes 1/1 — cap 25/bucket; the 2 dropped are disclosed by the document

join graph — mermaid source (paste into any mermaid viewer)
zzop graph --domain join
flowchart LR
%% zzop graph — the cross-layer join as a mermaid flowchart (paste into any mermaid viewer).
%% tool: zzop/0.32.0 zzop-parser-typescript=typescript/swc_core-71.0.5/0.22.0+resource-query-v1+trpc-leaf-procedure-v1+dispatch-branch-symbol-v1+exported-signature-names-v1+function-spans-v1+same-file-const-prepend-v1+raw-sql-db-table-v1+same-file-url-binding-v1+same-file-fn-url-v1+retry-wrapper-binding-v1+generated-verb-member-v1+dispatch-verb-order-v1/40a3929e327ed6c4 zzop-parser-prisma=prisma/0.22.0/e304ee9aa867fdc5 zzop-parser-python-3=python3/ruff-0.0.4/0.24.0/a4828a9b00410327 zzop-parser-java-21=java21/tree-sitter-java-0.23.5/0.21.0/136c757da5a9ad98 zzop-parser-rust=rust/syn-2/0.21.0/600b025b2c0669ea zzop-parser-go=go/tree-sitter-go-0.25.0/0.21.1/357aa9602d00bce8 zzop-parser-sql=sql/0.21.0+dml-table-refs-v1/6777e8cbc6882f6d zzop-parser-csharp=csharp/tree-sitter-c-sharp-0.23.5/0.21.0/ab82e240fbcdc44b zzop-engine=10e497a2fad7e151
%% scope: (none — every source)
%% top: 25 drawn relations per bucket
%% relations drawn/inScope/total (and the call sites they aggregate):
%%   edges: 2/2/2 from 8 site(s)
%%   unconsumedProvides: 17/17/17 from 19 site(s)
%%   unprovidedConsumes: 12/12/12 from 76 site(s)
%%   unresolvedConsumes: 25/27/27 from 40 site(s)
%%   externalConsumes: 1/1/1 from 3 site(s)
%%   ambiguousConsumes: 0/0/0 from 0 site(s)
%% a node is (source, side, kind, key): CALL SITES ARE AGGREGATED and no file/line appears here — use `zzop facts` or `zzop cross` for per-site detail.
%% NOT rendered by this surface: crossLayerFindings (the drift/near-miss VERDICTS — findings about the join, not members of it), hostRekeyCounts, wildcardRoutePartitions (a route lifted OUT of the join for being an ANT pattern — it is in no bucket, so it is in no node either), warnings/configWarnings/disclosure.
  subgraph s0["communitynotes"]
    n0(["unresolved · http chat_completions_url"]):::unresolved
  end
  subgraph s1["grok-1"]
    s1note["extracted no joinable io — invisible to the join (blindness, not an empty contract)"]:::note
  end
  subgraph s2["grok-build"]
    n1(["unprovided · db-table table:chunks"]):::unprovided
    n2(["unprovided · db-table table:chunks_fts"]):::unprovided
    n3(["unprovided · db-table table:chunks_vec"]):::unprovided
    n4(["unprovided · db-table table:chunks_vec_rowids"]):::unprovided
    n5(["unprovided · db-table table:meta"]):::unprovided
    n6(["unprovided · db-table table:session_docs"]):::unprovided
    n7(["unprovided · db-table table:session_docs_fts"]):::unprovided
    n8(["unprovided · db-table table:sqlite_schema"]):::unprovided
    n9(["unprovided · db-table table:threads"]):::unprovided
    n10(["unprovided · db-table table:worktrees"]):::unprovided
    n11(["unresolved · http #quot;x-grok-context-window#quot;"]):::unresolved
    n12(["unresolved · http #quot;x-grok-max-completion-tokens#quot;"]):::unresolved
    n13(["unresolved · http #quot;x-models-etag#quot;"]):::unresolved
    n14(["unresolved · http #quot;x-should-retry#quot;"]):::unresolved
    n15(["unresolved · http &download_resp.signed_url"]):::unresolved
    n16(["unresolved · http &poll_url"]):::unresolved
    n17(["unresolved · http &resp.download_url"]):::unresolved
    n18(["unresolved · http &start_url"]):::unresolved
    n19(["unresolved · http &url"]):::unresolved
    n20(["unresolved · http AUTHORIZATION"]):::unresolved
    n21(["unresolved · http HeaderName::from_static(#quot;x-api-key#quot;)"]):::unresolved
    n22(["unresolved · http current_url.as_str()"]):::unresolved
    n23(["unresolved · http format!(#quot;{url}/control/resize#quot;)"]):::unresolved
    n24(["unresolved · http format!(#quot;{url}/control/send#quot;)"]):::unresolved
    n25(["unresolved · http format!(#quot;{url}/control/stop#quot;)"]):::unresolved
    n26(["unresolved · http format!(#quot;{url}/query/cursor#quot;)"]):::unresolved
    n27(["unresolved · http format!(#quot;{url}/query/screen#quot;)"]):::unresolved
    n28(["unresolved · http format!(#quot;{url}/query/status#quot;)"]):::unresolved
    n29(["unresolved · http format!(#quot;{url}/wait#quot;)"]):::unresolved
    n30(["unresolved · http reqwest::header::RETRY_AFTER"]):::unresolved
    n31(["unresolved · http signed_url"]):::unresolved
    n32(["unresolved · http url"]):::unresolved
    n33["unconsumed · http GET /callback"]:::unconsumed
    n34["unconsumed · http GET /logs"]:::unconsumed
    n35["unconsumed · http GET /query/cursor"]:::unconsumed
    n36["unconsumed · http GET /query/screen"]:::unconsumed
    n37["unconsumed · http GET /query/scrollback"]:::unconsumed
    n38["unconsumed · http GET /query/status"]:::unconsumed
    n39["unconsumed · http GET /ready"]:::unconsumed
    n40["unconsumed · http GET /statusz"]:::unconsumed
    n41["unconsumed · http GET /wait"]:::unconsumed
    n42["unconsumed · http GET /ws"]:::unconsumed
    n43["unconsumed · http POST /control/resize"]:::unconsumed
    n44["unconsumed · http POST /control/send"]:::unconsumed
    n45["unconsumed · http POST /control/stop"]:::unconsumed
    n46["unconsumed · http POST /v1/storage"]:::unconsumed
  end
  subgraph s3["grok-build-plugin-cc"]
    s3note["extracted no joinable io — invisible to the join (blindness, not an empty contract)"]:::note
  end
  subgraph s4["grok-prompts"]
    s4note["extracted no joinable io — invisible to the join (blindness, not an empty contract)"]:::note
  end
  subgraph s5["plugin-marketplace"]
    s5note["extracted no joinable io — invisible to the join (blindness, not an empty contract)"]:::note
  end
  subgraph s6["the-algorithm"]
    n47["unconsumed · db-table table:twttr-recos-ml-prod.realgraph.candidates_sampled"]:::unconsumed
    n48["unconsumed · db-table table:twttr-recos-ml-prod.realgraph.labeled_candidates$table_suffix$"]:::unconsumed
  end
  subgraph s7["the-algorithm-ml"]
    s7note["extracted no joinable io — invisible to the join (blindness, not an empty contract)"]:::note
  end
  subgraph s8["x-algorithm"]
    s8note["extracted no joinable io — invisible to the join (blindness, not an empty contract)"]:::note
  end
  subgraph s9["xai-cookbook"]
    n49(["unprovided · http DELETE /sessions/{}"]):::unprovided
    n50(["linked · http GET /health"]):::linked
    n51(["linked · http POST /session"]):::linked
    n52(["unprovided · http POST /sessions"]):::unprovided
    n53(["external · http POST https://api.x.ai/v1/realtime/client_secrets"]):::external
    n54(["unresolved · http SESSION_REQUEST_URL"]):::unresolved
    n55["unconsumed · http GET /"]:::unconsumed
    n56["linked · http GET /health"]:::linked
    n57["linked · http POST /session"]:::linked
  end
  subgraph s10["xai-proto"]
    s10note["extracted no joinable io — invisible to the join (blindness, not an empty contract)"]:::note
  end
  subgraph s11["xai-sdk-python"]
    n58(["unresolved · http url"]):::unresolved
  end
  n50 -. "low confidence: generic path shared by many services (health/ping/metrics/status/login)" .-> n56
  n51 --> n57
  disclosure0["TRUNCATED — unresolvedConsumes 25/27 (drawn/inScope relations). Raise --top (now 25) or narrow --scope; `zzop facts` is uncapped."]:::note
  classDef linked fill:#e6f4ea,stroke:#1e7d32,color:#111
  classDef candidate fill:#f1f8e9,stroke:#558b2f,color:#111
  classDef unconsumed fill:#fff4e5,stroke:#b26a00,color:#111
  classDef unprovided fill:#fdecea,stroke:#c62828,color:#111
  classDef ambiguous fill:#f3e5f5,stroke:#7b1fa2,color:#111
  classDef unresolved fill:#eceff1,stroke:#546e7a,color:#111
  classDef external fill:#e8eaf6,stroke:#3949ab,color:#111
  classDef note fill:#ffffff,stroke:#111,color:#111,stroke-dasharray:4 3

This is zzop's --domain join output verbatim; its own header says to paste it into a mermaid renderer.

Twelve repos joined under one config. Two cross-layer edges land (inside the grok-build family); the rest are classified by bucket — grok-build's ten SQLite tables have no provider in this corpus (unprovided), dynamic URLs stay unresolved. grok-1 gets a "not visible to the join (disclosed blindness)" node rather than a silent absence.

dep — import graph (mermaid view, --top 40 nodes)

nodes 40/4457 · edges 63/10614 · cycles 6 — 40 is the readability cap; the full set is the canvas above

dep graph — mermaid source (paste into any mermaid viewer)
zzop graph --domain dep
%% zzop graph --domain dep — file import graph
%% nodes: drawn 40 / in-scope 4457 / total 4457 | edges: drawn 63 / total 10614 | cycles reported: 6
%% node cap --top 40
flowchart LR
  f0["crates/codegen/xai-acp-lib/src/lib.rs"]
  f1["crates/codegen/xai-grok-pager-pty-harness/src/lib.rs"]
  f2["crates/codegen/xai-grok-pager/src/app/actions.rs"]
  f3["crates/codegen/xai-grok-pager/src/app/agent.rs"]
  f4["crates/codegen/xai-grok-pager/src/app/agent_view/mod.rs"]
  f5["crates/codegen/xai-grok-pager/src/app/app_view.rs"]
  f6["crates/codegen/xai-grok-pager/src/app/mod.rs"]
  f7["crates/codegen/xai-grok-pager/src/lib.rs"]
  f8["crates/codegen/xai-grok-pager/src/scrollback/block.rs"]
  f9["crates/codegen/xai-grok-pager/src/slash/command.rs"]
  f10["crates/codegen/xai-grok-pager/src/slash/commands/mod.rs"]
  f11["crates/codegen/xai-grok-pager/src/views/mod.rs"]
  f12["crates/codegen/xai-grok-pager/tests/pty_e2e/common.rs"]
  f13["crates/codegen/xai-grok-sampling-types/src/lib.rs"]
  f14["crates/codegen/xai-grok-shell/src/agent/config.rs"]
  f15["crates/codegen/xai-grok-shell/src/agent/mod.rs"]
  f16["crates/codegen/xai-grok-shell/src/agent/mvp_agent/mod.rs"]
  f17["crates/codegen/xai-grok-shell/src/auth/mod.rs"]
  f18["crates/codegen/xai-grok-shell/src/extensions/mod.rs"]
  f19["crates/codegen/xai-grok-shell/src/lib.rs"]
  f20["crates/codegen/xai-grok-shell/src/session/acp_session.rs"]
  f21["crates/codegen/xai-grok-shell/src/session/mod.rs"]
  f22["crates/codegen/xai-grok-shell/src/session/persistence.rs"]
  f23["crates/codegen/xai-grok-shell/src/session/storage/mod.rs"]
  f24["crates/codegen/xai-grok-test-support/src/lib.rs"]
  f25["crates/codegen/xai-grok-tools/src/types/output.rs"]
  f26["crates/codegen/xai-grok-tools/src/types/resources.rs"]
  f27["crates/codegen/xai-grok-tools/src/types/tool.rs"]
  f28["crates/common/xai-tool-protocol/src/lib.rs"]
  f29["src/java/com/twitter/search/common/schema/base/ImmutableSchemaInterface.java"]
  f30["src/java/com/twitter/search/common/schema/base/Schema.java"]
  f31["src/java/com/twitter/search/common/schema/earlybird/EarlybirdCluster.java"]
  f32["src/java/com/twitter/search/common/schema/earlybird/EarlybirdFieldConstants.java"]
  f33["src/java/com/twitter/search/core/earlybird/index/EarlybirdIndexSegmentAtomicReader.java"]
  f34{{"src/java/com/twitter/search/earlybird/EarlybirdSearcher.java"}}
  f35["src/java/com/twitter/search/earlybird/common/config/EarlybirdConfig.java"]
  f36["src/java/com/twitter/search/earlybird/factory/EarlybirdWireModule.java"]
  f37["src/java/com/twitter/search/earlybird_root/common/EarlybirdRequestContext.java"]
  f38["src/xai_sdk/__init__.py"]
  f39["src/xai_sdk/proto/__init__.py"]
  f2 --> f3
  f3 --> f0
  f4 --> f2
  f4 --> f3
  f4 --> f5
  f4 --> f7
  f5 --> f0
  f5 --> f2
  f5 --> f3
  f5 --> f4
  f5 --> f6
  f5 --> f7
  f6 --> f2
  f6 --> f3
  f6 --> f4
  f6 --> f5
  f6 --> f7
  f7 --> f6
  f7 --> f11
  f9 --> f2
  f10 --> f9
  f12 --> f1
  f14 --> f13
  f14 --> f17
  f15 --> f14
  f15 --> f16
  f16 --> f0
  f16 --> f13
  f16 --> f14
  f16 --> f17
  f16 --> f21
  f16 --> f22
  f18 --> f21
  f19 --> f15
  f19 --> f17
  f19 --> f18
  f19 --> f21
  f20 --> f0
  f20 --> f13
  f20 --> f17
  f20 --> f21
  f20 --> f22
  f20 --> f23
  f20 --> f25
  f21 --> f20
  f21 --> f22
  f21 --> f23
  f22 --> f0
  f22 --> f13
  f22 --> f23
  f23 --> f13
  f23 --> f22
  f27 --> f25
  f27 --> f26
  f33 --> f30
  f34 --> f29
  f34 --> f30
  f34 --> f31
  f34 --> f32
  f34 --> f35
  f36 --> f31
  f36 --> f32
  f36 --> f35
  zzopNote["PARTIAL VIEW: 40 of 4457 files drawn (4417 dropped by --top 40), 63 of 10614 edges. An edge whose other end was dropped is not drawn. Use zzop facts for the uncapped graph."]
  zzopCycles["6 circular finding(s) — files in a cycle are drawn as hexagons with thick arrows"]

This is zzop's --domain dep output verbatim; its own header says to paste it into a mermaid renderer.

risk — hubs and extraction seams

hubs 12/119 · seams 12/30 — per-kind cap 12

risk graph — mermaid source (paste into any mermaid viewer)
zzop graph --domain risk
%% zzop graph --domain risk — blast-radius hubs and extraction seams
%% hubs: drawn 12 / in-scope 119 / total 119 | seams: drawn 12 / in-scope 30 / total 30
%% per-kind cap --top 12
%% NOT drawn: the 15 structural health scores (12 tree(s) computed them). They are a table of numbers, not a graph; a flowchart of them would be worse than the table. The composite rides `zzop analyze`'s architecture.pain (with painMeasuredWeight/painTotalWeight); the full table rides the direct zzop-facade output and no CLI or MCP reply.
flowchart TD
  s0[["communitynotes::scoring<br/>52 files, 0 boundary edges"]]
  s1[["communitynotes::collaborative-note-generator<br/>6 files, 0 boundary edges"]]
  s2[["communitynotes::template-api-note-writer<br/>11 files, 0 boundary edges"]]
  s3[["grok-1::(root)<br/>4 files, 0 boundary edges"]]
  s4[["grok-build::crates<br/>2462 files, 12 boundary edges"]]
  s5[["grok-build::third_party<br/>66 files, 1 boundary edges"]]
  s6[["grok-build::prod<br/>11 files, 11 boundary edges"]]
  s7[["grok-build-plugin-cc::plugins<br/>14 files, 0 boundary edges"]]
  s8[["plugin-marketplace::scripts<br/>4 files, 0 boundary edges"]]
  s9[["the-algorithm-ml::metrics<br/>4 files, 0 boundary edges"]]
  s10[["the-algorithm-ml::common<br/>16 files, 0 boundary edges"]]
  s11[["the-algorithm-ml::core<br/>16 files, 0 boundary edges"]]
  h0[["communitynotes::scoring/src/scoring/constants.py<br/>blast 42 · 1330 loc"]]
  h1[["communitynotes::scoring/src/scoring/pflip_plus_model.py<br/>blast 23 · 1965 loc"]]
  h2[["communitynotes::scoring/src/scoring/pandas_utils.py<br/>blast 26 · 734 loc"]]
  h3[["communitynotes::scoring/src/scoring/scoring_rules.py<br/>blast 22 · 1764 loc"]]
  h4[["communitynotes::scoring/src/scoring/process_data.py<br/>blast 17 · 1063 loc"]]
  h5[["communitynotes::scoring/src/scoring/matrix_factorization/matrix_factorization.py<br/>blast 18 · 719 loc"]]
  h6[["communitynotes::scoring/src/scoring/explanation_tags.py<br/>blast 23 · 152 loc"]]
  h7[["communitynotes::scoring/src/scoring/note_ratings.py<br/>blast 17 · 902 loc"]]
  h8[["communitynotes::scoring/src/scoring/reputation_matrix_factorization/reputation_matrix_factorization.py<br/>blast 18 · 535 loc"]]
  h9[["communitynotes::scoring/src/scoring/mf_base_scorer.py<br/>blast 15 · 1556 loc"]]
  h10[["communitynotes::scoring/src/scoring/note_status_history.py<br/>blast 18 · 362 loc"]]
  h11[["communitynotes::scoring/src/scoring/enums.py<br/>blast 26 · 54 loc"]]
  s0 --> h0
  s0 --> h1
  s0 --> h2
  s0 --> h3
  s0 --> h4
  s0 --> h5
  s0 --> h6
  s0 --> h7
  s0 --> h8
  s0 --> h9
  s0 --> h10
  s0 --> h11
  zzopNote["PARTIAL VIEW: 12 of 119 hubs and 12 of 30 seams drawn (125 dropped by --top 12). Arrows mean CONTAINMENT, not imports — use --domain dep for import direction."]

This is zzop's --domain risk output verbatim; its own header says to paste it into a mermaid renderer.

posture — mutating attack surface and its guard status

mutating routes 6/6 · reported no-auth-evidence 3 — a flag shape is unguarded; a box is "guarded-or-exempt", NOT proven guarded (the rule stays silent on what it cannot judge)

posture graph — mermaid source (paste into any mermaid viewer)
zzop graph --domain posture
%% zzop graph --domain posture — mutating attack surface and its guard status
%% mutating routes: drawn 6 / total 6 | reported unguarded: 3 | per-tree cap --top 20
%% NOT drawn: read routes (a GET is not unguarded, it is a read) and non-http io. Guard status is this run's `mutating-route-no-auth` verdict, never re-derived here.
flowchart LR
  subgraph grok_build
    r0>"POST /control/resize<br/>crates/codegen/ptyctl/src/server.rs"]
    r1>"POST /control/send<br/>crates/codegen/ptyctl/src/server.rs"]
    r2>"POST /control/stop<br/>crates/codegen/ptyctl/src/server.rs"]
    r3["POST /v1/storage<br/>crates/codegen/xai-grok-shell/src/agent/storage_client_tests.rs"]
  end
  subgraph xai_cookbook
    r4["POST /session<br/>voice-examples/agent/web/openai/backend-python/main.py"]
    r5["POST /session<br/>voice-examples/agent/web/xai/backend-python/main.py"]
  end
  zzopLegend["flag shape = reported unguarded (3). box = GUARDED-OR-EXEMPT, not proven guarded: the rule also stays silent on routes it cannot judge (uncovered language, unresolved handler, test file, auth-acquisition path). Absence of a finding is not proof of a guard."]

This is zzop's --domain posture output verbatim; its own header says to paste it into a mermaid renderer.

The three flagged routes are grok-build's ptyctl — a local PTY-control dev server. "No auth evidence" is what zzop reports, not "vulnerable".

cochange — files that change together in git history

edges 30/275 — only commits touching 2 to 25 files form a pair, and each file keeps its strongest partners; a sample, never a repository total

cochange graph — mermaid source (paste into any mermaid viewer)
zzop graph --domain cochange
%% zzop graph --domain cochange — files that change together in git history
%% edges: drawn 30 / in-scope 275 / total 275 | cap --top 30
%% A SAMPLE, never a repository total: commits touching fewer than 2 or more than 25 files form no pair at all, and each file keeps only its strongest partners — the tail is dropped, not summed. Read an edge as "among the strongest measured ties", never as "they always change together".
%% Edges are UNDIRECTED and are NOT imports. An import edge is read from source; this one is read from history and says nothing about why. For imports use --domain dep.
flowchart LR
  cc_grok_1___gitignore["grok-1::.gitignore"] --- |1| cc_grok_1__CODE_OF_CONDUCT_md["grok-1::CODE_OF_CONDUCT.md"]
  cc_grok_1___gitignore["grok-1::.gitignore"] --- |1| cc_grok_1__LICENSE_txt["grok-1::LICENSE.txt"]
  cc_grok_1___gitignore["grok-1::.gitignore"] --- |1| cc_grok_1__README_md["grok-1::README.md"]
  cc_grok_1___gitignore["grok-1::.gitignore"] --- |1| cc_grok_1__checkpoint_py["grok-1::checkpoint.py"]
  cc_grok_1___gitignore["grok-1::.gitignore"] --- |1| cc_grok_1__checkpoints_README_md["grok-1::checkpoints/README.md"]
  cc_grok_1___gitignore["grok-1::.gitignore"] --- |1| cc_grok_1__model_py["grok-1::model.py"]
  cc_grok_1___gitignore["grok-1::.gitignore"] --- |1| cc_grok_1__pyproject_toml["grok-1::pyproject.toml"]
  cc_grok_1___gitignore["grok-1::.gitignore"] --- |1| cc_grok_1__requirements_txt["grok-1::requirements.txt"]
  cc_grok_1___gitignore["grok-1::.gitignore"] --- |1| cc_grok_1__run_py["grok-1::run.py"]
  cc_grok_1___gitignore["grok-1::.gitignore"] --- |1| cc_grok_1__runners_py["grok-1::runners.py"]
  cc_grok_1__CODE_OF_CONDUCT_md["grok-1::CODE_OF_CONDUCT.md"] --- |1| cc_grok_1__LICENSE_txt["grok-1::LICENSE.txt"]
  cc_grok_1__CODE_OF_CONDUCT_md["grok-1::CODE_OF_CONDUCT.md"] --- |1| cc_grok_1__README_md["grok-1::README.md"]
  cc_grok_1__CODE_OF_CONDUCT_md["grok-1::CODE_OF_CONDUCT.md"] --- |1| cc_grok_1__checkpoint_py["grok-1::checkpoint.py"]
  cc_grok_1__CODE_OF_CONDUCT_md["grok-1::CODE_OF_CONDUCT.md"] --- |1| cc_grok_1__checkpoints_README_md["grok-1::checkpoints/README.md"]
  cc_grok_1__CODE_OF_CONDUCT_md["grok-1::CODE_OF_CONDUCT.md"] --- |1| cc_grok_1__model_py["grok-1::model.py"]
  cc_grok_1__CODE_OF_CONDUCT_md["grok-1::CODE_OF_CONDUCT.md"] --- |1| cc_grok_1__pyproject_toml["grok-1::pyproject.toml"]
  cc_grok_1__CODE_OF_CONDUCT_md["grok-1::CODE_OF_CONDUCT.md"] --- |1| cc_grok_1__requirements_txt["grok-1::requirements.txt"]
  cc_grok_1__CODE_OF_CONDUCT_md["grok-1::CODE_OF_CONDUCT.md"] --- |1| cc_grok_1__run_py["grok-1::run.py"]
  cc_grok_1__CODE_OF_CONDUCT_md["grok-1::CODE_OF_CONDUCT.md"] --- |1| cc_grok_1__runners_py["grok-1::runners.py"]
  cc_grok_1__LICENSE_txt["grok-1::LICENSE.txt"] --- |1| cc_grok_1__README_md["grok-1::README.md"]
  cc_grok_1__LICENSE_txt["grok-1::LICENSE.txt"] --- |1| cc_grok_1__checkpoint_py["grok-1::checkpoint.py"]
  cc_grok_1__LICENSE_txt["grok-1::LICENSE.txt"] --- |1| cc_grok_1__checkpoints_README_md["grok-1::checkpoints/README.md"]
  cc_grok_1__LICENSE_txt["grok-1::LICENSE.txt"] --- |1| cc_grok_1__model_py["grok-1::model.py"]
  cc_grok_1__LICENSE_txt["grok-1::LICENSE.txt"] --- |1| cc_grok_1__pyproject_toml["grok-1::pyproject.toml"]
  cc_grok_1__LICENSE_txt["grok-1::LICENSE.txt"] --- |1| cc_grok_1__requirements_txt["grok-1::requirements.txt"]
  cc_grok_1__LICENSE_txt["grok-1::LICENSE.txt"] --- |1| cc_grok_1__run_py["grok-1::run.py"]
  cc_grok_1__LICENSE_txt["grok-1::LICENSE.txt"] --- |1| cc_grok_1__runners_py["grok-1::runners.py"]
  cc_grok_1__README_md["grok-1::README.md"] --- |1| cc_grok_1__checkpoint_py["grok-1::checkpoint.py"]
  cc_grok_1__README_md["grok-1::README.md"] --- |1| cc_grok_1__checkpoints_README_md["grok-1::checkpoints/README.md"]
  cc_grok_1__README_md["grok-1::README.md"] --- |1| cc_grok_1__model_py["grok-1::model.py"]
  zzopNote["PARTIAL VIEW: 30 of 275 co-change pair(s) drawn (245 dropped by --top 30). Raise --top for the rest — this picture and a direct zzop-facade embedding are the only surfaces that carry these pairs."]

This is zzop's --domain cochange output verbatim; its own header says to paste it into a mermaid renderer.

Reproduce

Clone the twelve repositories, then one command per domain: zzop graph --config <config> --domain join|dep|risk|posture|cochange. The full graph is the cosmograph lane: zzop graph --domain dep --format cosmograph-nodes and --format cosmograph-links, which emit the two NDJSON tables this canvas reads. The findings census (171 across four repos) comes from zzop cross --config <config>; its honest-disclosure framing is on the overview.