Phases 1-5 + rooms/floors, accounts, custom types, users, notifications

Data model
- Properties, rooms (+optional floors), assets (typed custom fields + Zod
  runtime validator + move history), documents (polymorphic scope)
- Projects -> work packages -> tasks -> subtasks
- Decision events (scoped to project/property/asset/work_package)
- Checklist templates + instances, maintenance schedules (time + usage) with
  auto-materialized checklists on event recording
- Wiki (global + per-project) with revisions + tsvector FTS
- Property accounts (utility/meter numbers by kind)
- Notifications table + per-user channel prefs

Infra
- RBAC guards (requireCompany / requireAdmin)
- Storage abstraction: LocalDiskStorage (HMAC signed URLs) + S3Storage
  behind the same interface, switchable via STORAGE_BACKEND
- CSV export for assets / maintenance / decisions
- QR labels: /api/qr SVG endpoint + printable /assets/[id]/label
- Notifications: in-app + SMTP (own server via nodemailer) + Matrix
  (Client-Server API, per-company room) with opt-in per user
- Company switcher + auto-select first company on login

UI
- Topbar: bell with unread count, theme toggle, name, Sign Out (flat)
- Sidebar: main nav + dedicated Admin section (Asset types, Users, Company)
- Nested-route tabs on property / project / asset detail pages
- Admin UIs for users (invite, role, reset pw, deactivate) and company
  settings (default currency, Matrix room id)
- Custom asset type creation + field-def editor with immutable key/type
  guard and auto-deprecate when removing a field still referenced

Graph
- graphify-out/ committed: GRAPH_REPORT.md, graph.html, graph.json
This commit is contained in:
2026-04-23 15:18:11 +07:00
parent ad155d6344
commit b59904fdae
387 changed files with 70371 additions and 82 deletions
+936
View File
@@ -0,0 +1,936 @@
# Graph Report - C:/dev/build_for_life_project (2026-04-23)
## Corpus Check
- 189 files · ~54,875 words
- Verdict: corpus is large enough that graph structure adds value.
## Summary
- 453 nodes · 486 edges · 131 communities detected
- Extraction: 80% EXTRACTED · 20% INFERRED · 0% AMBIGUOUS · INFERRED: 97 edges (avg confidence: 0.8)
- Token cost: 0 input · 0 output
## Community Hubs (Navigation)
- [[_COMMUNITY_Auth & Load Helpers|Auth & Load Helpers]]
- [[_COMMUNITY_Documents Service|Documents Service]]
- [[_COMMUNITY_Assets Service & CSV|Assets Service & CSV]]
- [[_COMMUNITY_Email & Markdown|Email & Markdown]]
- [[_COMMUNITY_Property Accounts|Property Accounts]]
- [[_COMMUNITY_Projects Service|Projects Service]]
- [[_COMMUNITY_App Shell & Theme|App Shell & Theme]]
- [[_COMMUNITY_Asset Core|Asset Core]]
- [[_COMMUNITY_Maintenance Core|Maintenance Core]]
- [[_COMMUNITY_Checklists|Checklists]]
- [[_COMMUNITY_Admin Scripts|Admin Scripts]]
- [[_COMMUNITY_Asset Types Editor|Asset Types Editor]]
- [[_COMMUNITY_Rooms & Floors|Rooms & Floors]]
- [[_COMMUNITY_Tasks|Tasks]]
- [[_COMMUNITY_User Management|User Management]]
- [[_COMMUNITY_DB Schema Helpers|DB Schema Helpers]]
- [[_COMMUNITY_Work Packages|Work Packages]]
- [[_COMMUNITY_Storage Layer|Storage Layer]]
- [[_COMMUNITY_Migration Workflow|Migration Workflow]]
- [[_COMMUNITY_Session Auth|Session Auth]]
- [[_COMMUNITY_Companies Service|Companies Service]]
- [[_COMMUNITY_Form Utilities|Form Utilities]]
- [[_COMMUNITY_Custom Fields Design|Custom Fields Design]]
- [[_COMMUNITY_Field Types|Field Types]]
- [[_COMMUNITY_Form Helper|Form Helper]]
- [[_COMMUNITY_Env Config|Env Config]]
- [[_COMMUNITY_Seed Script|Seed Script]]
- [[_COMMUNITY_Asset Location Design|Asset Location Design]]
- [[_COMMUNITY_Decision Design|Decision Design]]
- [[_COMMUNITY_Drizzle Config|Drizzle Config]]
- [[_COMMUNITY_Cluster 30|Cluster 30]]
- [[_COMMUNITY_Cluster 31|Cluster 31]]
- [[_COMMUNITY_Cluster 32|Cluster 32]]
- [[_COMMUNITY_Cluster 33|Cluster 33]]
- [[_COMMUNITY_Cluster 34|Cluster 34]]
- [[_COMMUNITY_Cluster 35|Cluster 35]]
- [[_COMMUNITY_Cluster 36|Cluster 36]]
- [[_COMMUNITY_Cluster 37|Cluster 37]]
- [[_COMMUNITY_Cluster 38|Cluster 38]]
- [[_COMMUNITY_Cluster 39|Cluster 39]]
- [[_COMMUNITY_Cluster 40|Cluster 40]]
- [[_COMMUNITY_Cluster 41|Cluster 41]]
- [[_COMMUNITY_Cluster 42|Cluster 42]]
- [[_COMMUNITY_Cluster 43|Cluster 43]]
- [[_COMMUNITY_Cluster 44|Cluster 44]]
- [[_COMMUNITY_Cluster 45|Cluster 45]]
- [[_COMMUNITY_Cluster 46|Cluster 46]]
- [[_COMMUNITY_Cluster 47|Cluster 47]]
- [[_COMMUNITY_Cluster 48|Cluster 48]]
- [[_COMMUNITY_Cluster 49|Cluster 49]]
- [[_COMMUNITY_Cluster 50|Cluster 50]]
- [[_COMMUNITY_Cluster 51|Cluster 51]]
- [[_COMMUNITY_Cluster 52|Cluster 52]]
- [[_COMMUNITY_Cluster 53|Cluster 53]]
- [[_COMMUNITY_Cluster 54|Cluster 54]]
- [[_COMMUNITY_Cluster 55|Cluster 55]]
- [[_COMMUNITY_Cluster 56|Cluster 56]]
- [[_COMMUNITY_Cluster 57|Cluster 57]]
- [[_COMMUNITY_Cluster 58|Cluster 58]]
- [[_COMMUNITY_Cluster 59|Cluster 59]]
- [[_COMMUNITY_Cluster 60|Cluster 60]]
- [[_COMMUNITY_Cluster 61|Cluster 61]]
- [[_COMMUNITY_Cluster 62|Cluster 62]]
- [[_COMMUNITY_Cluster 63|Cluster 63]]
- [[_COMMUNITY_Cluster 64|Cluster 64]]
- [[_COMMUNITY_Cluster 65|Cluster 65]]
- [[_COMMUNITY_Cluster 66|Cluster 66]]
- [[_COMMUNITY_Cluster 67|Cluster 67]]
- [[_COMMUNITY_Cluster 68|Cluster 68]]
- [[_COMMUNITY_Cluster 69|Cluster 69]]
- [[_COMMUNITY_Cluster 70|Cluster 70]]
- [[_COMMUNITY_Cluster 71|Cluster 71]]
- [[_COMMUNITY_Cluster 72|Cluster 72]]
- [[_COMMUNITY_Cluster 73|Cluster 73]]
- [[_COMMUNITY_Cluster 74|Cluster 74]]
- [[_COMMUNITY_Cluster 75|Cluster 75]]
- [[_COMMUNITY_Cluster 76|Cluster 76]]
- [[_COMMUNITY_Cluster 77|Cluster 77]]
- [[_COMMUNITY_Cluster 78|Cluster 78]]
- [[_COMMUNITY_Cluster 79|Cluster 79]]
- [[_COMMUNITY_Cluster 80|Cluster 80]]
- [[_COMMUNITY_Cluster 81|Cluster 81]]
- [[_COMMUNITY_Cluster 82|Cluster 82]]
- [[_COMMUNITY_Cluster 83|Cluster 83]]
- [[_COMMUNITY_Cluster 84|Cluster 84]]
- [[_COMMUNITY_Cluster 85|Cluster 85]]
- [[_COMMUNITY_Cluster 86|Cluster 86]]
- [[_COMMUNITY_Cluster 87|Cluster 87]]
- [[_COMMUNITY_Cluster 88|Cluster 88]]
- [[_COMMUNITY_Cluster 89|Cluster 89]]
- [[_COMMUNITY_Cluster 90|Cluster 90]]
- [[_COMMUNITY_Cluster 91|Cluster 91]]
- [[_COMMUNITY_Cluster 92|Cluster 92]]
- [[_COMMUNITY_Cluster 93|Cluster 93]]
- [[_COMMUNITY_Cluster 94|Cluster 94]]
- [[_COMMUNITY_Cluster 95|Cluster 95]]
- [[_COMMUNITY_Cluster 96|Cluster 96]]
- [[_COMMUNITY_Cluster 97|Cluster 97]]
- [[_COMMUNITY_Cluster 98|Cluster 98]]
- [[_COMMUNITY_Cluster 99|Cluster 99]]
- [[_COMMUNITY_Cluster 100|Cluster 100]]
- [[_COMMUNITY_Cluster 101|Cluster 101]]
- [[_COMMUNITY_Cluster 102|Cluster 102]]
- [[_COMMUNITY_Cluster 103|Cluster 103]]
- [[_COMMUNITY_Cluster 104|Cluster 104]]
- [[_COMMUNITY_Cluster 105|Cluster 105]]
- [[_COMMUNITY_Cluster 106|Cluster 106]]
- [[_COMMUNITY_Cluster 107|Cluster 107]]
- [[_COMMUNITY_Cluster 108|Cluster 108]]
- [[_COMMUNITY_Cluster 109|Cluster 109]]
- [[_COMMUNITY_Cluster 110|Cluster 110]]
- [[_COMMUNITY_Cluster 111|Cluster 111]]
- [[_COMMUNITY_Cluster 112|Cluster 112]]
- [[_COMMUNITY_Cluster 113|Cluster 113]]
- [[_COMMUNITY_Cluster 114|Cluster 114]]
- [[_COMMUNITY_Cluster 115|Cluster 115]]
- [[_COMMUNITY_Cluster 116|Cluster 116]]
- [[_COMMUNITY_Cluster 117|Cluster 117]]
- [[_COMMUNITY_Cluster 118|Cluster 118]]
- [[_COMMUNITY_Cluster 119|Cluster 119]]
- [[_COMMUNITY_Cluster 120|Cluster 120]]
- [[_COMMUNITY_Cluster 121|Cluster 121]]
- [[_COMMUNITY_Cluster 122|Cluster 122]]
- [[_COMMUNITY_Cluster 123|Cluster 123]]
- [[_COMMUNITY_Cluster 124|Cluster 124]]
- [[_COMMUNITY_Cluster 125|Cluster 125]]
- [[_COMMUNITY_Cluster 126|Cluster 126]]
- [[_COMMUNITY_Cluster 127|Cluster 127]]
- [[_COMMUNITY_Cluster 128|Cluster 128]]
- [[_COMMUNITY_Cluster 129|Cluster 129]]
- [[_COMMUNITY_Cluster 130|Cluster 130]]
## God Nodes (most connected - your core abstractions)
1. `load()` - 79 edges
2. `GET()` - 20 edges
3. `LocalDiskStorage` - 10 edges
4. `load()` - 9 edges
5. `S3Storage` - 8 edges
6. `buildfor_life_ops` - 8 edges
7. `fanOutExternal()` - 7 edges
8. `getTaskWithSubtasks()` - 7 edges
9. `handle()` - 6 edges
10. `uploadDocument()` - 6 edges
## Surprising Connections (you probably didn't know these)
- `load()` --calls--> `renderMarkdown()` [INFERRED]
src\routes\(auth)\login\+page.server.ts → src\lib\server\markdown.ts
- `load()` --calls--> `listTemplates()` [INFERRED]
src\routes\(auth)\login\+page.server.ts → src\lib\server\services\checklists.ts
- `load()` --calls--> `getCompany()` [INFERRED]
src\routes\(auth)\login\+page.server.ts → src\lib\server\services\companies.ts
- `load()` --calls--> `listDocumentsForScope()` [INFERRED]
src\routes\(auth)\login\+page.server.ts → src\lib\server\services\documents.ts
- `load()` --calls--> `countOverdueForCompany()` [INFERRED]
src\routes\(auth)\login\+page.server.ts → src\lib\server\services\maintenance.ts
## Hyperedges (group relationships)
- **Session auth flow (cookie, hash, hook, gate)** — readme_auth_model, readme_sha256_cookie_hash, readme_sliding_renewal, readme_hooks_server, readme_layout_app_group [EXTRACTED 0.95]
- **Storage abstraction (adapter, local impl, signed URLs, file route)** — readme_storage_adapter, readme_local_disk_storage, readme_hmac_signed_urls, readme_api_files_route, readme_storage_model [EXTRACTED 0.95]
- **Cross-sibling theme propagation via localStorage** — readme_decision_theme_key, apphtml_theme_bootstrap, readme_buildfor_life_budget, readme_buildfor_life_repair [INFERRED 0.80]
## Communities
### Community 0 - "Auth & Load Helpers"
Cohesion: 0.04
Nodes (12): requireAdmin(), requireCompany(), load(), parseSettings(), getPageWithCurrentRevision(), getRevision(), listPagesForScope(), listRevisions() (+4 more)
### Community 1 - "Documents Service"
Cohesion: 0.07
Nodes (13): assertScope(), deleteDocument(), getDocument(), listDocumentsForScope(), signedUrlForDocument(), uploadDocument(), getStorage(), LocalDiskStorage (+5 more)
### Community 2 - "Assets Service & CSV"
Cohesion: 0.11
Nodes (13): listAssets(), csvResponse(), toCsv(), gatherCustomFieldsFromForm(), createDecision(), decisionScopeLink(), listDecisionsForScope(), clamp() (+5 more)
### Community 3 - "Email & Markdown"
Cohesion: 0.13
Nodes (15): getTransport(), isEmailConfigured(), sendEmail(), escapeHtml(), html(), renderMarkdown(), buildBodies(), isMatrixConfigured() (+7 more)
### Community 4 - "Property Accounts"
Cohesion: 0.15
Nodes (12): assertProperty(), createAccount(), deleteAccount(), listAccounts(), handle(), deleteFloor(), handleLogout(), createSession() (+4 more)
### Community 5 - "Projects Service"
Cohesion: 0.11
Nodes (6): load(), unreadCountForUser(), getProject(), listProjects(), getProperty(), listProperties()
### Community 6 - "App Shell & Theme"
Cohesion: 0.13
Nodes (16): data-sveltekit-preload-data=hover, app.html root document, %sveltekit.head% / %sveltekit.body% placeholders, Tailwind body classes with dark: variants, Dark-mode bootstrap inline script (localStorage['theme']), Argon2id sessions (@node-rs/argon2 + @oslojs/crypto), buildfor_life_budget (sibling), buildfor_life_ops (+8 more)
### Community 7 - "Asset Core"
Cohesion: 0.22
Nodes (10): assertContainer(), createAsset(), loadTypeWithFields(), moveAsset(), updateAsset(), validateCustomFields(), buildCustomFieldsSchema(), getCachedCustomFieldsSchema() (+2 more)
### Community 8 - "Maintenance Core"
Cohesion: 0.22
Nodes (13): addInterval(), assertAsset(), countOverdueForCompany(), createSchedule(), deleteSchedule(), getSchedule(), listDueAndOverdue(), listEventsForAsset() (+5 more)
### Community 9 - "Checklists"
Cohesion: 0.19
Nodes (7): addTemplateItem(), deleteTemplate(), getInstance(), getTemplate(), listTemplates(), removeTemplateItem(), setItemDone()
### Community 10 - "Admin Scripts"
Cohesion: 0.24
Nodes (9): main(), readArg(), slugify(), stripSurroundingQuotes(), main(), readArg(), stripSurroundingQuotes(), normalizeEmail() (+1 more)
### Community 11 - "Asset Types Editor"
Cohesion: 0.31
Nodes (8): addFieldDef(), createCompanyAssetType(), deleteCompanyAssetType(), loadEditableType(), normalizeFieldKey(), removeFieldDef(), slugifyTypeSlug(), updateCompanyAssetType()
### Community 12 - "Rooms & Floors"
Cohesion: 0.33
Nodes (8): assertProperty(), createFloor(), createRoom(), getRoom(), listFloors(), listRoomsWithCounts(), softDeleteRoom(), updateRoom()
### Community 13 - "Tasks"
Cohesion: 0.36
Nodes (9): addSubtask(), assertWorkPackage(), createTask(), getTaskWithSubtasks(), listTasksForWorkPackage(), removeSubtask(), softDeleteTask(), toggleSubtask() (+1 more)
### Community 14 - "User Management"
Cohesion: 0.38
Nodes (8): assertMembership(), countAdmins(), listCompanyUsers(), removeUserFromCompany(), resetUserPassword(), setUserActive(), setUserRoleInCompany(), updateDisplayName()
### Community 15 - "DB Schema Helpers"
Cohesion: 0.29
Nodes (0):
### Community 16 - "Work Packages"
Cohesion: 0.48
Nodes (6): assertProject(), createWorkPackage(), getWorkPackage(), listWorkPackagesForProject(), softDeleteWorkPackage(), updateWorkPackage()
### Community 17 - "Storage Layer"
Cohesion: 0.38
Nodes (7): /api/files route (signature verification + streaming), HMAC-signed short-lived file URLs, LocalDiskStorage, Phase 5: QR, notifications, S3, S3Storage (future), StorageAdapter interface, Storage model (opaque storage_key)
### Community 18 - "Migration Workflow"
Cohesion: 0.29
Nodes (7): Use CONCURRENTLY on large-table index changes, Drizzle migrations directory, Review SQL after generate: enum/index/custom_fields, npm run db:generate, npm run db:migrate, npm run db:push (dev only), npm run db:studio (Drizzle Studio)
### Community 19 - "Session Auth"
Cohesion: 0.33
Nodes (6): Auth model (sessions + hashed cookies), company_users role mapping, hooks.server.ts (session validation), (app) route group (authed shell), SHA-256 cookie hashing before DB lookup, Sliding session renewal (30d/15d)
### Community 20 - "Companies Service"
Cohesion: 0.6
Nodes (4): createCompanyWithAdmin(), getCompany(), slugify(), updateCompany()
### Community 21 - "Form Utilities"
Cohesion: 0.4
Nodes (1): e2n()
### Community 22 - "Custom Fields Design"
Cohesion: 0.5
Nodes (4): Immutable-key policy reference, Decision: immutable custom-field keys, Decision: JSONB custom fields + asset_field_defs, Phase 1: Properties + Assets
### Community 23 - "Field Types"
Cohesion: 1.0
Nodes (0):
### Community 24 - "Form Helper"
Cohesion: 1.0
Nodes (0):
### Community 25 - "Env Config"
Cohesion: 1.0
Nodes (2): .env configuration, env.ts (Zod-validated process.env)
### Community 26 - "Seed Script"
Cohesion: 1.0
Nodes (2): npm run create-user script, src/lib/server/db/schema/
### Community 27 - "Asset Location Design"
Cohesion: 1.0
Nodes (2): Decision: asset_location_history (movable assets), Decision: XOR asset location (project XOR property)
### Community 28 - "Decision Design"
Cohesion: 1.0
Nodes (2): Decision: decisions scoped to project/property/asset/work_package, Phase 3: Projects + structured decisions
### Community 29 - "Drizzle Config"
Cohesion: 1.0
Nodes (0):
### Community 30 - "Cluster 30"
Cohesion: 1.0
Nodes (0):
### Community 31 - "Cluster 31"
Cohesion: 1.0
Nodes (0):
### Community 32 - "Cluster 32"
Cohesion: 1.0
Nodes (0):
### Community 33 - "Cluster 33"
Cohesion: 1.0
Nodes (0):
### Community 34 - "Cluster 34"
Cohesion: 1.0
Nodes (0):
### Community 35 - "Cluster 35"
Cohesion: 1.0
Nodes (0):
### Community 36 - "Cluster 36"
Cohesion: 1.0
Nodes (0):
### Community 37 - "Cluster 37"
Cohesion: 1.0
Nodes (0):
### Community 38 - "Cluster 38"
Cohesion: 1.0
Nodes (0):
### Community 39 - "Cluster 39"
Cohesion: 1.0
Nodes (0):
### Community 40 - "Cluster 40"
Cohesion: 1.0
Nodes (0):
### Community 41 - "Cluster 41"
Cohesion: 1.0
Nodes (0):
### Community 42 - "Cluster 42"
Cohesion: 1.0
Nodes (0):
### Community 43 - "Cluster 43"
Cohesion: 1.0
Nodes (0):
### Community 44 - "Cluster 44"
Cohesion: 1.0
Nodes (0):
### Community 45 - "Cluster 45"
Cohesion: 1.0
Nodes (0):
### Community 46 - "Cluster 46"
Cohesion: 1.0
Nodes (0):
### Community 47 - "Cluster 47"
Cohesion: 1.0
Nodes (0):
### Community 48 - "Cluster 48"
Cohesion: 1.0
Nodes (0):
### Community 49 - "Cluster 49"
Cohesion: 1.0
Nodes (0):
### Community 50 - "Cluster 50"
Cohesion: 1.0
Nodes (0):
### Community 51 - "Cluster 51"
Cohesion: 1.0
Nodes (0):
### Community 52 - "Cluster 52"
Cohesion: 1.0
Nodes (0):
### Community 53 - "Cluster 53"
Cohesion: 1.0
Nodes (0):
### Community 54 - "Cluster 54"
Cohesion: 1.0
Nodes (0):
### Community 55 - "Cluster 55"
Cohesion: 1.0
Nodes (0):
### Community 56 - "Cluster 56"
Cohesion: 1.0
Nodes (0):
### Community 57 - "Cluster 57"
Cohesion: 1.0
Nodes (0):
### Community 58 - "Cluster 58"
Cohesion: 1.0
Nodes (0):
### Community 59 - "Cluster 59"
Cohesion: 1.0
Nodes (0):
### Community 60 - "Cluster 60"
Cohesion: 1.0
Nodes (0):
### Community 61 - "Cluster 61"
Cohesion: 1.0
Nodes (0):
### Community 62 - "Cluster 62"
Cohesion: 1.0
Nodes (0):
### Community 63 - "Cluster 63"
Cohesion: 1.0
Nodes (0):
### Community 64 - "Cluster 64"
Cohesion: 1.0
Nodes (0):
### Community 65 - "Cluster 65"
Cohesion: 1.0
Nodes (0):
### Community 66 - "Cluster 66"
Cohesion: 1.0
Nodes (0):
### Community 67 - "Cluster 67"
Cohesion: 1.0
Nodes (0):
### Community 68 - "Cluster 68"
Cohesion: 1.0
Nodes (0):
### Community 69 - "Cluster 69"
Cohesion: 1.0
Nodes (0):
### Community 70 - "Cluster 70"
Cohesion: 1.0
Nodes (0):
### Community 71 - "Cluster 71"
Cohesion: 1.0
Nodes (0):
### Community 72 - "Cluster 72"
Cohesion: 1.0
Nodes (0):
### Community 73 - "Cluster 73"
Cohesion: 1.0
Nodes (0):
### Community 74 - "Cluster 74"
Cohesion: 1.0
Nodes (0):
### Community 75 - "Cluster 75"
Cohesion: 1.0
Nodes (0):
### Community 76 - "Cluster 76"
Cohesion: 1.0
Nodes (0):
### Community 77 - "Cluster 77"
Cohesion: 1.0
Nodes (0):
### Community 78 - "Cluster 78"
Cohesion: 1.0
Nodes (0):
### Community 79 - "Cluster 79"
Cohesion: 1.0
Nodes (0):
### Community 80 - "Cluster 80"
Cohesion: 1.0
Nodes (0):
### Community 81 - "Cluster 81"
Cohesion: 1.0
Nodes (0):
### Community 82 - "Cluster 82"
Cohesion: 1.0
Nodes (0):
### Community 83 - "Cluster 83"
Cohesion: 1.0
Nodes (0):
### Community 84 - "Cluster 84"
Cohesion: 1.0
Nodes (0):
### Community 85 - "Cluster 85"
Cohesion: 1.0
Nodes (0):
### Community 86 - "Cluster 86"
Cohesion: 1.0
Nodes (0):
### Community 87 - "Cluster 87"
Cohesion: 1.0
Nodes (0):
### Community 88 - "Cluster 88"
Cohesion: 1.0
Nodes (0):
### Community 89 - "Cluster 89"
Cohesion: 1.0
Nodes (0):
### Community 90 - "Cluster 90"
Cohesion: 1.0
Nodes (0):
### Community 91 - "Cluster 91"
Cohesion: 1.0
Nodes (0):
### Community 92 - "Cluster 92"
Cohesion: 1.0
Nodes (0):
### Community 93 - "Cluster 93"
Cohesion: 1.0
Nodes (0):
### Community 94 - "Cluster 94"
Cohesion: 1.0
Nodes (0):
### Community 95 - "Cluster 95"
Cohesion: 1.0
Nodes (0):
### Community 96 - "Cluster 96"
Cohesion: 1.0
Nodes (0):
### Community 97 - "Cluster 97"
Cohesion: 1.0
Nodes (0):
### Community 98 - "Cluster 98"
Cohesion: 1.0
Nodes (0):
### Community 99 - "Cluster 99"
Cohesion: 1.0
Nodes (0):
### Community 100 - "Cluster 100"
Cohesion: 1.0
Nodes (0):
### Community 101 - "Cluster 101"
Cohesion: 1.0
Nodes (0):
### Community 102 - "Cluster 102"
Cohesion: 1.0
Nodes (0):
### Community 103 - "Cluster 103"
Cohesion: 1.0
Nodes (0):
### Community 104 - "Cluster 104"
Cohesion: 1.0
Nodes (0):
### Community 105 - "Cluster 105"
Cohesion: 1.0
Nodes (0):
### Community 106 - "Cluster 106"
Cohesion: 1.0
Nodes (0):
### Community 107 - "Cluster 107"
Cohesion: 1.0
Nodes (0):
### Community 108 - "Cluster 108"
Cohesion: 1.0
Nodes (0):
### Community 109 - "Cluster 109"
Cohesion: 1.0
Nodes (0):
### Community 110 - "Cluster 110"
Cohesion: 1.0
Nodes (0):
### Community 111 - "Cluster 111"
Cohesion: 1.0
Nodes (0):
### Community 112 - "Cluster 112"
Cohesion: 1.0
Nodes (0):
### Community 113 - "Cluster 113"
Cohesion: 1.0
Nodes (0):
### Community 114 - "Cluster 114"
Cohesion: 1.0
Nodes (0):
### Community 115 - "Cluster 115"
Cohesion: 1.0
Nodes (0):
### Community 116 - "Cluster 116"
Cohesion: 1.0
Nodes (0):
### Community 117 - "Cluster 117"
Cohesion: 1.0
Nodes (0):
### Community 118 - "Cluster 118"
Cohesion: 1.0
Nodes (0):
### Community 119 - "Cluster 119"
Cohesion: 1.0
Nodes (0):
### Community 120 - "Cluster 120"
Cohesion: 1.0
Nodes (1): npm run db:seed
### Community 121 - "Cluster 121"
Cohesion: 1.0
Nodes (1): npm run validate (check + build)
### Community 122 - "Cluster 122"
Cohesion: 1.0
Nodes (1): (auth) route group (login shell)
### Community 123 - "Cluster 123"
Cohesion: 1.0
Nodes (1): Phase 0: scaffold (shipped)
### Community 124 - "Cluster 124"
Cohesion: 1.0
Nodes (1): Phase 2: Checklists + maintenance
### Community 125 - "Cluster 125"
Cohesion: 1.0
Nodes (1): Decision: UUID v7 primary keys
### Community 126 - "Cluster 126"
Cohesion: 1.0
Nodes (1): Decision: timestamptz UTC everywhere
### Community 127 - "Cluster 127"
Cohesion: 1.0
Nodes (1): Decision: soft delete (deleted_at)
### Community 128 - "Cluster 128"
Cohesion: 1.0
Nodes (1): Decision: numeric(18,4) + char(3) currency
### Community 129 - "Cluster 129"
Cohesion: 1.0
Nodes (1): Decision: company default currency in settings_json
### Community 130 - "Cluster 130"
Cohesion: 1.0
Nodes (1): Decision: tabs = nested routes (not query-string)
## Knowledge Gaps
- **42 isolated node(s):** `buildfor_life_budget (sibling)`, `buildfor_life_repair (sibling)`, `PostgreSQL 16+ via Drizzle ORM + Zod`, `Argon2id sessions (@node-rs/argon2 + @oslojs/crypto)`, `Sharp image thumbnails` (+37 more)
These have ≤1 connection - possible missing edges or undocumented components.
- **Thin community `Field Types`** (2 nodes): `needsEnumValues()`, `field-types.ts`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
- **Thin community `Form Helper`** (2 nodes): `emptyToNull()`, `+page.server.ts`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
- **Thin community `Env Config`** (2 nodes): `.env configuration`, `env.ts (Zod-validated process.env)`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
- **Thin community `Seed Script`** (2 nodes): `npm run create-user script`, `src/lib/server/db/schema/`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
- **Thin community `Asset Location Design`** (2 nodes): `Decision: asset_location_history (movable assets)`, `Decision: XOR asset location (project XOR property)`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
- **Thin community `Decision Design`** (2 nodes): `Decision: decisions scoped to project/property/asset/work_package`, `Phase 3: Projects + structured decisions`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
- **Thin community `Drizzle Config`** (1 nodes): `drizzle.config.ts`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
- **Thin community `Cluster 30`** (1 nodes): `svelte.config.js`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
- **Thin community `Cluster 31`** (1 nodes): `vite.config.ts`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
- **Thin community `Cluster 32`** (1 nodes): `app.d.ts`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
- **Thin community `Cluster 33`** (1 nodes): `accounts.ts`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
- **Thin community `Cluster 34`** (1 nodes): `notifications.ts`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
- **Thin community `Cluster 35`** (1 nodes): `roles.ts`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
- **Thin community `Cluster 36`** (1 nodes): `CustomFieldsForm.svelte`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
- **Thin community `Cluster 37`** (1 nodes): `Sidebar.svelte`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
- **Thin community `Cluster 38`** (1 nodes): `TabNav.svelte`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
- **Thin community `Cluster 39`** (1 nodes): `ThemeToggle.svelte`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
- **Thin community `Cluster 40`** (1 nodes): `TopBar.svelte`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
- **Thin community `Cluster 41`** (1 nodes): `env.ts`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
- **Thin community `Cluster 42`** (1 nodes): `types.ts`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
- **Thin community `Cluster 43`** (1 nodes): `client.ts`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
- **Thin community `Cluster 44`** (1 nodes): `accounts.ts`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
- **Thin community `Cluster 45`** (1 nodes): `assets.ts`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
- **Thin community `Cluster 46`** (1 nodes): `checklists.ts`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
- **Thin community `Cluster 47`** (1 nodes): `decisions.ts`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
- **Thin community `Cluster 48`** (1 nodes): `documents.ts`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
- **Thin community `Cluster 49`** (1 nodes): `index.ts`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
- **Thin community `Cluster 50`** (1 nodes): `maintenance.ts`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
- **Thin community `Cluster 51`** (1 nodes): `notifications.ts`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
- **Thin community `Cluster 52`** (1 nodes): `projects.ts`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
- **Thin community `Cluster 53`** (1 nodes): `properties.ts`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
- **Thin community `Cluster 54`** (1 nodes): `rooms.ts`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
- **Thin community `Cluster 55`** (1 nodes): `tenancy.ts`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
- **Thin community `Cluster 56`** (1 nodes): `wiki.ts`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
- **Thin community `Cluster 57`** (1 nodes): `+error.svelte`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
- **Thin community `Cluster 58`** (1 nodes): `+layout.svelte`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
- **Thin community `Cluster 59`** (1 nodes): `+layout.svelte`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
- **Thin community `Cluster 60`** (1 nodes): `+page.svelte`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
- **Thin community `Cluster 61`** (1 nodes): `+page.svelte`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
- **Thin community `Cluster 62`** (1 nodes): `+page.server.ts`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
- **Thin community `Cluster 63`** (1 nodes): `+page.svelte`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
- **Thin community `Cluster 64`** (1 nodes): `+page.svelte`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
- **Thin community `Cluster 65`** (1 nodes): `+page.svelte`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
- **Thin community `Cluster 66`** (1 nodes): `+page.server.ts`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
- **Thin community `Cluster 67`** (1 nodes): `+page.svelte`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
- **Thin community `Cluster 68`** (1 nodes): `+page.svelte`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
- **Thin community `Cluster 69`** (1 nodes): `+page.svelte`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
- **Thin community `Cluster 70`** (1 nodes): `+page.svelte`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
- **Thin community `Cluster 71`** (1 nodes): `+page.svelte`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
- **Thin community `Cluster 72`** (1 nodes): `+layout.svelte`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
- **Thin community `Cluster 73`** (1 nodes): `+page.svelte`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
- **Thin community `Cluster 74`** (1 nodes): `+page.svelte`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
- **Thin community `Cluster 75`** (1 nodes): `+page.svelte`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
- **Thin community `Cluster 76`** (1 nodes): `+page.svelte`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
- **Thin community `Cluster 77`** (1 nodes): `+page.svelte`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
- **Thin community `Cluster 78`** (1 nodes): `+page.svelte`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
- **Thin community `Cluster 79`** (1 nodes): `+page.svelte`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
- **Thin community `Cluster 80`** (1 nodes): `+page.svelte`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
- **Thin community `Cluster 81`** (1 nodes): `+page.svelte`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
- **Thin community `Cluster 82`** (1 nodes): `+page.svelte`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
- **Thin community `Cluster 83`** (1 nodes): `+page.svelte`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
- **Thin community `Cluster 84`** (1 nodes): `+page.svelte`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
- **Thin community `Cluster 85`** (1 nodes): `+page.svelte`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
- **Thin community `Cluster 86`** (1 nodes): `+page.svelte`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
- **Thin community `Cluster 87`** (1 nodes): `+layout.svelte`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
- **Thin community `Cluster 88`** (1 nodes): `+page.svelte`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
- **Thin community `Cluster 89`** (1 nodes): `+page.svelte`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
- **Thin community `Cluster 90`** (1 nodes): `+page.svelte`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
- **Thin community `Cluster 91`** (1 nodes): `+page.svelte`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
- **Thin community `Cluster 92`** (1 nodes): `+page.svelte`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
- **Thin community `Cluster 93`** (1 nodes): `+page.server.ts`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
- **Thin community `Cluster 94`** (1 nodes): `+page.svelte`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
- **Thin community `Cluster 95`** (1 nodes): `+page.svelte`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
- **Thin community `Cluster 96`** (1 nodes): `+page.svelte`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
- **Thin community `Cluster 97`** (1 nodes): `+page.svelte`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
- **Thin community `Cluster 98`** (1 nodes): `+page.svelte`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
- **Thin community `Cluster 99`** (1 nodes): `+page.svelte`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
- **Thin community `Cluster 100`** (1 nodes): `+page.svelte`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
- **Thin community `Cluster 101`** (1 nodes): `+page.svelte`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
- **Thin community `Cluster 102`** (1 nodes): `+page.svelte`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
- **Thin community `Cluster 103`** (1 nodes): `+page.svelte`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
- **Thin community `Cluster 104`** (1 nodes): `+layout.svelte`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
- **Thin community `Cluster 105`** (1 nodes): `+page.svelte`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
- **Thin community `Cluster 106`** (1 nodes): `+page.svelte`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
- **Thin community `Cluster 107`** (1 nodes): `+page.svelte`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
- **Thin community `Cluster 108`** (1 nodes): `+page.svelte`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
- **Thin community `Cluster 109`** (1 nodes): `+page.svelte`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
- **Thin community `Cluster 110`** (1 nodes): `+page.svelte`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
- **Thin community `Cluster 111`** (1 nodes): `+page.svelte`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
- **Thin community `Cluster 112`** (1 nodes): `+page.server.ts`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
- **Thin community `Cluster 113`** (1 nodes): `+page.svelte`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
- **Thin community `Cluster 114`** (1 nodes): `+page.svelte`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
- **Thin community `Cluster 115`** (1 nodes): `+page.svelte`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
- **Thin community `Cluster 116`** (1 nodes): `+page.svelte`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
- **Thin community `Cluster 117`** (1 nodes): `+page.svelte`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
- **Thin community `Cluster 118`** (1 nodes): `+layout.svelte`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
- **Thin community `Cluster 119`** (1 nodes): `+page.svelte`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
- **Thin community `Cluster 120`** (1 nodes): `npm run db:seed`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
- **Thin community `Cluster 121`** (1 nodes): `npm run validate (check + build)`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
- **Thin community `Cluster 122`** (1 nodes): `(auth) route group (login shell)`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
- **Thin community `Cluster 123`** (1 nodes): `Phase 0: scaffold (shipped)`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
- **Thin community `Cluster 124`** (1 nodes): `Phase 2: Checklists + maintenance`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
- **Thin community `Cluster 125`** (1 nodes): `Decision: UUID v7 primary keys`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
- **Thin community `Cluster 126`** (1 nodes): `Decision: timestamptz UTC everywhere`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
- **Thin community `Cluster 127`** (1 nodes): `Decision: soft delete (deleted_at)`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
- **Thin community `Cluster 128`** (1 nodes): `Decision: numeric(18,4) + char(3) currency`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
- **Thin community `Cluster 129`** (1 nodes): `Decision: company default currency in settings_json`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
- **Thin community `Cluster 130`** (1 nodes): `Decision: tabs = nested routes (not query-string)`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
## Suggested Questions
_Questions this graph is uniquely positioned to answer:_
- **Why does `load()` connect `Auth & Load Helpers` to `Documents Service`, `Assets Service & CSV`, `Email & Markdown`, `Property Accounts`, `Projects Service`, `Asset Core`, `Maintenance Core`, `Checklists`, `Rooms & Floors`, `Tasks`, `User Management`, `Work Packages`, `Companies Service`, `Form Utilities`?**
_High betweenness centrality (0.298) - this node is a cross-community bridge._
- **Why does `GET()` connect `Assets Service & CSV` to `Auth & Load Helpers`, `Documents Service`, `Property Accounts`, `Asset Core`, `Maintenance Core`?**
_High betweenness centrality (0.120) - this node is a cross-community bridge._
- **Why does `listCompanyUsers()` connect `User Management` to `Auth & Load Helpers`?**
_High betweenness centrality (0.040) - this node is a cross-community bridge._
- **Are the 34 inferred relationships involving `load()` (e.g. with `countOverdueForCompany()` and `listDueAndOverdue()`) actually correct?**
_`load()` has 34 INFERRED edges - model-reasoned connections that need verification._
- **Are the 13 inferred relationships involving `GET()` (e.g. with `syncFieldDefs()` and `handle()`) actually correct?**
_`GET()` has 13 INFERRED edges - model-reasoned connections that need verification._
- **Are the 5 inferred relationships involving `load()` (e.g. with `setActiveCompany()` and `unreadCountForUser()`) actually correct?**
_`load()` has 5 INFERRED edges - model-reasoned connections that need verification._
- **What connects `buildfor_life_budget (sibling)`, `buildfor_life_repair (sibling)`, `PostgreSQL 16+ via Drizzle ORM + Zod` to the rest of the system?**
_42 weakly-connected nodes found - possible documentation gaps or missing edges._