|
1 | | -# Graph Report - . (2026-08-17) |
| 1 | +# Graph Report - msk-paste (2026-08-17) |
2 | 2 |
|
3 | 3 | ## Corpus Check |
4 | | -- cluster-only mode — file stats not available |
| 4 | +- Corpus is ~32,954 words - fits in a single context window. You may not need a graph. |
5 | 5 |
|
6 | 6 | ## Summary |
7 | | -- 343 nodes · 579 edges · 29 communities (19 shown, 10 thin omitted) |
8 | | -- Extraction: 99% EXTRACTED · 1% INFERRED · 0% AMBIGUOUS · INFERRED: 5 edges (avg confidence: 0.82) |
9 | | -- Token cost: 0 input · 0 output |
10 | | - |
11 | | -## Graph Freshness |
12 | | -- Built from commit: `2ffdb912` |
13 | | -- Run `git rev-parse HEAD` and compare to check if the graph is stale. |
14 | | -- Run `graphify update .` after code changes (no API cost). |
| 7 | +- 400 nodes · 662 edges · 27 communities (23 shown, 4 thin omitted) |
| 8 | +- Extraction: 96% EXTRACTED · 4% INFERRED · 0% AMBIGUOUS · INFERRED: 27 edges (avg confidence: 0.81) |
| 9 | +- Token cost: 450,193 input · 0 output |
15 | 10 |
|
16 | 11 | ## Community Hubs (Navigation) |
17 | | -- paste.ts |
18 | | -- pastes/route.ts |
19 | | -- password/page.tsx |
20 | | -- compilerOptions |
21 | | -- index.ts |
22 | | -- Production Dependencies |
23 | | -- Database Migrations and Stats |
24 | | -- Development Dependencies |
25 | | -- Project Metadata |
26 | | -- config.ts |
27 | | -- Project Documentation |
28 | | -- install.sh |
29 | | -- npm Ecosystem |
| 12 | +- Repo Governance and CI |
| 13 | +- Paste API Routes |
| 14 | +- Interactive Paste Components |
| 15 | +- App Pages and Metadata |
| 16 | +- TypeScript Compiler Config |
| 17 | +- Database Layer and Scripts |
| 18 | +- Runtime Dependencies |
| 19 | +- Paste Business Logic |
| 20 | +- Dev Tooling Dependencies |
| 21 | +- Package Manifest |
| 22 | +- Locale and i18n |
| 23 | +- Server Install Script |
| 24 | +- Paste UI Screenshot |
| 25 | +- Syntax Highlighting |
30 | 26 | - Root Layout and Fonts |
31 | | -- ESLint Configuration |
32 | | -- Backup Scripts |
33 | | -- Next.js Configuration |
34 | | -- Update Scripts |
35 | | -- Funding Configuration |
36 | | -- Issue Template Configuration |
37 | | -- 001_create_pastes.sql |
38 | | -- tailwind.config.ts |
39 | | -- Bug Report Template |
40 | | -- Feature Request Template |
41 | | -- Mirror Workflow |
42 | | -- Release Workflow |
43 | | -- MSK Scripts Logo |
| 27 | +- Shortener Reference UI |
| 28 | +- ESLint Flat Config |
| 29 | +- MSK Logo Branding |
| 30 | +- Codeberg Mirror Workflow |
| 31 | +- Backup Script |
| 32 | +- Next Config and CSP |
| 33 | +- Release Automation |
| 34 | +- Update Script |
| 35 | +- Pastes Table Migration |
| 36 | +- Tailwind Config |
44 | 37 |
|
45 | 38 | ## God Nodes (most connected - your core abstractions) |
46 | 39 | 1. `compilerOptions` - 20 edges |
47 | 40 | 2. `getPasteRow()` - 14 edges |
48 | | -3. `isPasteExpired()` - 13 edges |
49 | | -4. `pasteHasPassword()` - 13 edges |
50 | | -5. `consumeView()` - 12 edges |
51 | | -6. `POST()` - 11 edges |
| 41 | +3. `MSK Paste (project)` - 14 edges |
| 42 | +4. `isPasteExpired()` - 13 edges |
| 43 | +5. `pasteHasPassword()` - 13 edges |
| 44 | +6. `consumeView()` - 12 edges |
52 | 45 | 7. `POST()` - 11 edges |
53 | | -8. `jsonError()` - 10 edges |
54 | | -9. `execute()` - 10 edges |
55 | | -10. `PastePage()` - 8 edges |
| 46 | +8. `POST()` - 11 edges |
| 47 | +9. `jsonError()` - 10 edges |
| 48 | +10. `execute()` - 10 edges |
56 | 49 |
|
57 | 50 | ## Surprising Connections (you probably didn't know these) |
58 | | -- `MSK Paste UI Screenshot` --references--> `MSK Paste README` [INFERRED] |
59 | | - public/msk_paste.png → README.md |
60 | | -- `MSK Shortener UI Screenshot` --references--> `MSK Paste README` [INFERRED] |
61 | | - public/msk_shortener.png → README.md |
62 | | -- `StatsPage()` --calls--> `getGlobalStats()` [EXTRACTED] |
63 | | - app/stats/page.tsx → src/lib/stats.ts |
64 | | -- `PasswordPage()` --calls--> `getPasteRow()` [EXTRACTED] |
65 | | - app/[id]/password/page.tsx → src/lib/paste.ts |
66 | | -- `PasswordPage()` --calls--> `isPasteExpired()` [EXTRACTED] |
67 | | - app/[id]/password/page.tsx → src/lib/paste.ts |
| 51 | +- `Burn After Read` --semantically_similar_to--> `Cleanup Cron (expired paste deletion)` [INFERRED] [semantically similar] |
| 52 | + README.md → deployment/README.md |
| 53 | +- `GitHub Sponsors Funding Config` --references--> `MSK Paste (project)` [INFERRED] |
| 54 | + .github/FUNDING.yml → README.md |
| 55 | +- `Deny GPL-2.0 / GPL-3.0 Dependencies` --conceptually_related_to--> `AGPL-3.0-or-later License` [AMBIGUOUS] |
| 56 | + .github/workflows/dependency-review.yml → LICENSE.md |
| 57 | +- `CodeQL Advanced Workflow` --conceptually_related_to--> `Defensive Measures in Place` [INFERRED] |
| 58 | + .github/workflows/codeql.yml → SECURITY.md |
| 59 | +- `PastePage()` --calls--> `renderHighlightedHtml()` [EXTRACTED] |
| 60 | + app/[id]/page.tsx → src/lib/highlight.ts |
68 | 61 |
|
69 | 62 | ## Import Cycles |
70 | 63 | - None detected. |
71 | 64 |
|
72 | 65 | ## Hyperedges (group relationships) |
73 | | -- **CI/CD Pipeline** — github_workflows_codeql, github_workflows_dependency_review, github_workflows_eslint [EXTRACTED 1.00] |
74 | | -- **Project Governance & Contribution** — github_funding, github_pull_request_template, github_issue_template_bug_report, github_issue_template_feature_request, github_issue_template_config [INFERRED 0.90] |
| 66 | +- **Privacy-preserving paste lifecycle** — readme_privacy_by_default, readme_ip_hmac_hashing, readme_expiration_policy, readme_burn_after_read, deployment_readme_cleanup_cron [INFERRED 0.85] |
| 67 | +- **CI security and quality gate suite** — _github_workflows_codeql_codeql_workflow, _github_workflows_eslint_eslint_workflow, _github_workflows_dependency_review_dependency_review_workflow, _github_dependabot_dependabot_config, contributing_pr_quality_gate [INFERRED 0.85] |
| 68 | +- **Push-to-production pipeline** — _github_workflows_deploy_deploy_workflow, _github_workflows_deploy_scp_ssh_deploy, deployment_readme_github_secrets, deployment_readme_systemd_unit, deployment_readme_apache_reverse_proxy, deployment_readme_install_sh [EXTRACTED 1.00] |
75 | 69 |
|
76 | | -## Communities (29 total, 10 thin omitted) |
| 70 | +## Communities (27 total, 4 thin omitted) |
77 | 71 |
|
78 | | -### Community 0 - "paste.ts" |
79 | | -Cohesion: 0.13 |
80 | | -Nodes (33): DELETE(), GET(), RouteContext, POST(), RouteContext, GET(), RouteContext, sanitizeFilename() (+25 more) |
| 72 | +### Community 0 - "Repo Governance and CI" |
| 73 | +Cohesion: 0.06 |
| 74 | +Nodes (48): Dependabot Configuration, Group Minor and Patch Updates, Ignore Major Version Bumps, GitHub Sponsors Funding Config, Bug Report Template, Issue Template Config (blank issues disabled), Feature Request Template, Pull Request Template (+40 more) |
81 | 75 |
|
82 | | -### Community 1 - "pastes/route.ts" |
83 | | -Cohesion: 0.09 |
84 | | -Nodes (29): MAX_PASTE_SIZE_BYTES, POST(), buildPasteUrl(), buildRawUrl(), envInt(), createPaste(), generateUniquePasteId(), PasteError (+21 more) |
| 76 | +### Community 1 - "Paste API Routes" |
| 77 | +Cohesion: 0.12 |
| 78 | +Nodes (36): DELETE(), GET(), RouteContext, POST(), RouteContext, MAX_PASTE_SIZE_BYTES, POST(), GET() (+28 more) |
85 | 79 |
|
86 | | -### Community 2 - "password/page.tsx" |
87 | | -Cohesion: 0.10 |
88 | | -Nodes (17): getOrigin(), PageProps, PasswordPage(), SECTIONS, dynamic, StatsPage(), Footer(), Header() (+9 more) |
| 80 | +### Community 2 - "Interactive Paste Components" |
| 81 | +Cohesion: 0.08 |
| 82 | +Nodes (22): CopyButton(), CopyButtonProps, CreatePasteForm(), EXPIRES_IN_OPTIONS, DeletePasteButton(), DeletePasteButtonProps, PasswordPrompt(), PasswordPromptProps (+14 more) |
| 83 | + |
| 84 | +### Community 3 - "App Pages and Metadata" |
| 85 | +Cohesion: 0.09 |
| 86 | +Nodes (14): getOrigin(), PageProps, SECTIONS, dynamic, Footer(), Header(), HeaderProps, Logo() (+6 more) |
89 | 87 |
|
90 | | -### Community 3 - "compilerOptions" |
| 88 | +### Community 4 - "TypeScript Compiler Config" |
91 | 89 | Cohesion: 0.06 |
92 | 90 | Nodes (32): ./app/*, dom, dom.iterable, esnext, next-env.d.ts, .next/types/**/*.ts, node_modules, **/*.ts (+24 more) |
93 | 91 |
|
94 | | -### Community 4 - "index.ts" |
95 | | -Cohesion: 0.11 |
96 | | -Nodes (21): CopyButton(), CopyButtonProps, CreatePasteForm(), EXPIRES_IN_OPTIONS, DeletePasteButton(), DeletePasteButtonProps, PasswordPrompt(), PasswordPromptProps (+13 more) |
| 92 | +### Community 5 - "Database Layer and Scripts" |
| 93 | +Cohesion: 0.16 |
| 94 | +Nodes (20): GET(), StatsPage(), main(), ensureMigrationsTable(), getExecutedMigrations(), main(), MIGRATIONS_DIR, IMPORTANT: dotenv MUST be loaded before anything else so that ENV variables (+12 more) |
97 | 95 |
|
98 | | -### Community 5 - "Production Dependencies" |
| 96 | +### Community 6 - "Runtime Dependencies" |
99 | 97 | Cohesion: 0.08 |
100 | 98 | Nodes (25): bcryptjs, dotenv, mysql2, nanoid, next, next-intl, dependencies, bcryptjs (+17 more) |
101 | 99 |
|
102 | | -### Community 6 - "Database Migrations and Stats" |
103 | | -Cohesion: 0.19 |
104 | | -Nodes (18): GET(), main(), ensureMigrationsTable(), getExecutedMigrations(), main(), MIGRATIONS_DIR, IMPORTANT: dotenv MUST be loaded before anything else so that ENV variables, runMigration() (+10 more) |
| 100 | +### Community 7 - "Paste Business Logic" |
| 101 | +Cohesion: 0.12 |
| 102 | +Nodes (20): CreatedPaste, createPaste(), CreatePasteParams, generateUniquePasteId(), PasteError, isReservedId(), RESERVED_PASTE_IDS, CUSTOM_ID_MAX (+12 more) |
105 | 103 |
|
106 | | -### Community 7 - "Development Dependencies" |
| 104 | +### Community 8 - "Dev Tooling Dependencies" |
107 | 105 | Cohesion: 0.10 |
108 | 106 | Nodes (21): autoprefixer, eslint, eslint-config-next, devDependencies, autoprefixer, eslint, eslint-config-next, postcss (+13 more) |
109 | 107 |
|
110 | | -### Community 8 - "Project Metadata" |
| 108 | +### Community 9 - "Package Manifest" |
111 | 109 | Cohesion: 0.10 |
112 | 110 | Nodes (19): description, engines, node, license, name, overrides, eslint, postcss (+11 more) |
113 | 111 |
|
114 | | -### Community 9 - "config.ts" |
115 | | -Cohesion: 0.26 |
| 112 | +### Community 10 - "Locale and i18n" |
| 113 | +Cohesion: 0.21 |
116 | 114 | Nodes (10): POST(), LanguageSwitcher(), DEFAULT_LOCALE, isLocale(), Locale, LOCALE_COOKIE, LOCALE_FLAGS, LOCALE_LABELS (+2 more) |
117 | 115 |
|
118 | | -### Community 10 - "Project Documentation" |
119 | | -Cohesion: 0.22 |
120 | | -Nodes (9): Code of Conduct, Contributing Guide, Deployment Guide, Deployment Workflow, GNU Affero General Public License v3, MSK Paste UI Screenshot, MSK Shortener UI Screenshot, MSK Paste README (+1 more) |
121 | | - |
122 | | -### Community 11 - "install.sh" |
| 116 | +### Community 11 - "Server Install Script" |
123 | 117 | Cohesion: 0.43 |
124 | 118 | Nodes (7): DEBIAN_FRONTEND, log_err(), log_info(), log_ok(), log_step(), log_warn(), install.sh script |
125 | 119 |
|
126 | | -### Community 12 - "npm Ecosystem" |
127 | | -Cohesion: 0.29 |
128 | | -Nodes (7): GitHub Actions Ecosystem, Dependabot Configuration, Pull Request Template, CodeQL Workflow, Dependency Review Workflow, ESLint Workflow, npm Ecosystem |
| 120 | +### Community 12 - "Paste UI Screenshot" |
| 121 | +Cohesion: 0.36 |
| 122 | +Nodes (8): MSK Paste Wordmark and Tagline, Content Textarea With Byte Counter, Create Paste Form, MSK Dark Theme With Green Accent, MSK Paste Landing Page Screenshot, 1 MB Paste Size Limit (1048576 bytes), Syntax Highlighting Promise, Optional Title Field |
129 | 123 |
|
130 | | -### Community 13 - "Root Layout and Fonts" |
| 124 | +### Community 13 - "Syntax Highlighting" |
| 125 | +Cohesion: 0.43 |
| 126 | +Nodes (6): getHighlighter(), renderHighlightedHtml(), isSupportedLanguage(), LANGUAGE_EXTENSIONS, SUPPORTED_LANGUAGES, SupportedLanguage |
| 127 | + |
| 128 | +### Community 14 - "Root Layout and Fonts" |
131 | 129 | Cohesion: 0.33 |
132 | 130 | Nodes (4): inter, jetbrainsMono, metadata, viewport |
133 | 131 |
|
134 | | -### Community 14 - "ESLint Configuration" |
| 132 | +### Community 15 - "Shortener Reference UI" |
| 133 | +Cohesion: 0.53 |
| 134 | +Nodes (6): Hero Headline: 'Long URLs? Make them short.', MSK Dark Design Language (dark surface, green accent), Privacy Tagline: no cookies, no trackers, no signup, MSK Shortener as UI Reference Implementation for MSK Paste, MSK Shortener Landing Page Screenshot, Long URL Input Card with Placeholder |
| 135 | + |
| 136 | +### Community 16 - "ESLint Flat Config" |
135 | 137 | Cohesion: 0.40 |
136 | 138 | Nodes (4): compat, __dirname, eslintConfig, __filename |
137 | 139 |
|
138 | | -### Community 15 - "Backup Scripts" |
| 140 | +### Community 17 - "MSK Logo Branding" |
| 141 | +Cohesion: 0.60 |
| 142 | +Nodes (5): Site Favicon / Header Logo Asset, Stylized Letter M Wordmark, MSK Brand Identity, MSK Green Accent Color, MSK Logo (public/logo.png) |
| 143 | + |
| 144 | +### Community 18 - "Codeberg Mirror Workflow" |
| 145 | +Cohesion: 0.50 |
| 146 | +Nodes (4): Mirror to Codeberg Workflow, Exact Mirror with --prune, origin/HEAD Deletion Before Push, Codeberg Config Stored as Secrets, not Variables |
| 147 | + |
| 148 | +### Community 19 - "Backup Script" |
139 | 149 | Cohesion: 0.83 |
140 | 150 | Nodes (3): log_err(), log_ok(), backup.sh script |
141 | 151 |
|
142 | | -### Community 16 - "Next.js Configuration" |
| 152 | +### Community 20 - "Next Config and CSP" |
143 | 153 | Cohesion: 0.50 |
144 | 154 | Nodes (3): csp, nextConfig, withNextIntl |
145 | 155 |
|
| 156 | +## Ambiguous Edges - Review These |
| 157 | +- `AGPL-3.0-or-later License` → `Deny GPL-2.0 / GPL-3.0 Dependencies` [AMBIGUOUS] |
| 158 | + .github/workflows/dependency-review.yml · relation: conceptually_related_to |
| 159 | + |
146 | 160 | ## Knowledge Gaps |
147 | | -- **131 isolated node(s):** `PageProps`, `PageProps`, `RouteContext`, `RouteContext`, `MAX_PASTE_SIZE_BYTES` (+126 more) |
| 161 | +- **125 isolated node(s):** `PageProps`, `PageProps`, `RouteContext`, `RouteContext`, `MAX_PASTE_SIZE_BYTES` (+120 more) |
148 | 162 | These have ≤1 connection - possible missing edges or undocumented components. |
149 | | -- **10 thin communities (<3 nodes) omitted from report** — run `graphify query` to explore isolated nodes. |
| 163 | +- **4 thin communities (<3 nodes) omitted from report** — run `graphify query` to explore isolated nodes. |
150 | 164 |
|
151 | 165 | ## Suggested Questions |
152 | 166 | _Questions this graph is uniquely positioned to answer:_ |
153 | 167 |
|
154 | | -- **Why does `dependencies` connect `Production Dependencies` to `Project Metadata`?** |
155 | | - _High betweenness centrality (0.021) - this node is a cross-community bridge._ |
156 | | -- **Why does `devDependencies` connect `Development Dependencies` to `Project Metadata`?** |
157 | | - _High betweenness centrality (0.019) - this node is a cross-community bridge._ |
158 | | -- **Why does `execute()` connect `Database Migrations and Stats` to `paste.ts`, `pastes/route.ts`?** |
159 | | - _High betweenness centrality (0.015) - this node is a cross-community bridge._ |
| 168 | +- **What is the exact relationship between `AGPL-3.0-or-later License` and `Deny GPL-2.0 / GPL-3.0 Dependencies`?** |
| 169 | + _Edge tagged AMBIGUOUS (relation: conceptually_related_to) - confidence is low._ |
| 170 | +- **Why does `dependencies` connect `Runtime Dependencies` to `Package Manifest`?** |
| 171 | + _High betweenness centrality (0.016) - this node is a cross-community bridge._ |
| 172 | +- **Why does `devDependencies` connect `Dev Tooling Dependencies` to `Package Manifest`?** |
| 173 | + _High betweenness centrality (0.014) - this node is a cross-community bridge._ |
| 174 | +- **Why does `execute()` connect `Database Layer and Scripts` to `Paste API Routes`, `Paste Business Logic`?** |
| 175 | + _High betweenness centrality (0.011) - this node is a cross-community bridge._ |
160 | 176 | - **What connects `PageProps`, `PageProps`, `RouteContext` to the rest of the system?** |
161 | | - _131 weakly-connected nodes found - possible documentation gaps or missing edges._ |
162 | | -- **Should `paste.ts` be split into smaller, more focused modules?** |
163 | | - _Cohesion score 0.12896405919661733 - nodes in this community are weakly interconnected._ |
164 | | -- **Should `pastes/route.ts` be split into smaller, more focused modules?** |
165 | | - _Cohesion score 0.09206349206349207 - nodes in this community are weakly interconnected._ |
166 | | -- **Should `password/page.tsx` be split into smaller, more focused modules?** |
167 | | - _Cohesion score 0.0957983193277311 - nodes in this community are weakly interconnected._ |
| 177 | + _125 weakly-connected nodes found - possible documentation gaps or missing edges._ |
| 178 | +- **Should `Repo Governance and CI` be split into smaller, more focused modules?** |
| 179 | + _Cohesion score 0.05585106382978723 - nodes in this community are weakly interconnected._ |
| 180 | +- **Should `Paste API Routes` be split into smaller, more focused modules?** |
| 181 | + _Cohesion score 0.11818181818181818 - nodes in this community are weakly interconnected._ |
0 commit comments