This commit is contained in:
2026-08-10 21:15:19 +01:00
parent d7ca591b76
commit 4da942786e
97 changed files with 105039 additions and 3370 deletions
+72 -1
View File
@@ -1 +1,72 @@
{"0": "TOTP & Web Token Auth", "1": "ACME/JWS Client", "2": "CalDAV/CardDAV Handlers", "3": "IMAP Command Parser", "4": "Mail Provider Abstraction", "5": "Server Config & Bootstrap", "6": "Sieve Filter Interpreter", "7": "DB Mutation Queries", "8": "IMAP Server Loop", "9": "POP3 Server Loop", "10": "JMAP Auth & Sessions", "11": "SMTP Session Header Parsing", "12": "Admin API Handlers", "13": "IMAP Client", "14": "DKIM Key Signing", "15": "Outbound Delivery Queue", "16": "SMTP Server Networking", "17": "Linked Account & Alias Queries", "18": "TCP Server Lifecycle", "19": "Calendar/Contact/TLS Queries", "20": "OAuth2 Config", "21": "Go-No-Deps Web App Pattern", "22": "GoMail Build Phases Overview", "23": "Quarantine & Message Queries", "24": "iCal Parsing & Fuzzing", "25": "LLM Spam Stage", "26": "vCard Parsing & Fuzzing", "27": "Admin Portal Bugs & CRUD", "28": "Spam Pipeline Orchestrator", "29": "SPF Stage", "30": "TCP Boundary & Rate-Limit Findings", "31": "Domain/Tenant Queries", "32": "Rspamd Stage", "33": "Per-IP Rate Limiter", "34": "ClamAV Stage", "35": "DMARC Stage", "36": "Spam Header Injection Stage", "37": "Iterative Build Discipline Skill", "38": "Deployment & DNS Setup", "39": "HTTP Middleware", "40": "URL Extraction Stage", "41": "SQLite Deadlock Findings", "42": "List Rule Queries", "43": "Sieve Script Queries", "44": "Mail Context Domain Helpers", "45": "Calendar Object Queries", "46": "Contact Queries", "47": "Shared api() Fetch Convention", "48": "Session Continuity Practices", "49": "Scope Prioritization Practices", "50": "DB Migrations", "51": "Shared esc() Helper", "52": "SPA Login/Logout", "53": "SPA App Boot/Routing", "54": "Graphify Project Rules", "55": "Embedded Assets (admin)", "56": "Admin Handlers Entry", "57": "Admin Dashboard Loader", "58": "Admin SPA Router", "59": "Webmail Bootstrap", "60": "Embedded Assets (webmail)", "61": "Raw MIME Body Extractor", "62": "Webmail Message Actions", "63": "Go Module Root"}
{
"0": "User",
"1": "Client",
"2": "webauthn.go",
"3": "session",
"4": "GmailAPIProvider",
"5": "config.go",
"6": "parser",
"7": "DB",
"8": "session",
"9": "session",
"10": "Handler",
"11": "session",
"12": "writeErr",
"13": "Client",
"14": "Sign",
"15": "Worker",
"16": "session",
"17": "models.go",
"18": "Store",
"19": "uuidNew",
"20": "oauth2.go",
"21": "Go Web App No-Deps Pattern (skill)",
"22": "GoMail Action Plan v4 Overview",
"23": "QuarantineEntry",
"24": "ical.go",
"25": ".Run",
"26": "vcard.go",
"27": "Phase 11: Admin Portal",
"28": "app.js",
"29": "Server",
"30": "Suggested Next Session Scope",
"31": "Domain",
"32": "checkSPF",
"33": "Limiter",
"34": ".Run",
"35": ".Run",
"36": ".Run",
"37": "Core Principle: Compiles is Not Correct",
"38": "Phase 13: TLS + ACME + DANE/MTA-STS",
"39": "GraphAPIProvider",
"40": ".Run",
"41": "Phase 12: Auth Hardening (TOTP/App Passwords/Reset)",
"42": "gomail",
"43": "SieveScript",
"44": "MailContext",
"45": "CalendarObject",
"46": "OutboundQueueEntry",
"47": "Shared api() Fetch Helper Convention",
"48": "Checkpoint Working State as Durable Artifact",
"49": "Prioritize by Risk Reduction Over Task Order",
"50": "migration",
"51": "esc() HTML-escape helper (admin)",
"52": "login() (admin)",
"53": "showApp()/showLogin() (admin)",
"54": "graphify Project Rules",
"55": "admin/embed.go",
"56": "handlers.go",
"57": "loadDashboard",
"58": "showPage() router (admin)",
"59": "bootstrap.go",
"60": "webmail/embed.go",
"61": "bodyOf() raw MIME body extractor",
"62": "loadMessages()/viewMessage()/deleteMessage",
"63": "ListRule",
"64": ".GetContact",
"65": "dnssec.go",
"66": "totp.go",
"67": "StageResult",
"68": "pipeline.go",
"70": ".GetTLSCert"
}
+1
View File
@@ -0,0 +1 @@
{"0": "0601ba4c5ef570af", "1": "5563ceee816586bc", "2": "0065d9d7243491e5", "3": "5a4df2f471849b12", "4": "6b4a79ebdda6140e", "5": "398e7091e6710da5", "6": "43a892bf7f0137c1", "7": "9283dc7e174690b2", "8": "d19e0c173fbbd4cf", "9": "3aa8996b24118c33", "10": "c8f99b1d2797f728", "11": "743c756b0b4bdd9f", "12": "97a2f0692d97dc15", "13": "96bddd22ac12459b", "14": "ed1a75d8c2b19f50", "15": "5262c99718288789", "16": "fa3d5f16594f61cb", "17": "9f781490485c0586", "18": "8f35d32c03fe029b", "19": "c6941ea4d56538e3", "20": "1b0277c6dd12c83d", "21": "235c5b1d72f73e69", "22": "8299b1df0460d7a7", "23": "3468ea389b4941d0", "24": "ef3ef42ae2afbb2a", "25": "7489b031b1317de1", "26": "beb24c4d9ea79e3a", "27": "77bf2d2bfc22381b", "28": "b44f08f7bce825f4", "29": "b646f402108351cc", "30": "75e7934ab0b830de", "31": "b262509efd80d18b", "32": "5c44e1875cf3126a", "33": "67463d38582b6682", "34": "c6f4ee03c5881a2a", "35": "e04cacd1ed78efd5", "36": "6e9034dba552d1f5", "37": "57923a62fb5c83d6", "38": "2df20c00f5d849c4", "39": "9dd21636e0545a77", "40": "de7344ceee589455", "41": "fac8947f14f3076b", "42": "c6fbcadd0820177d", "43": "62afd540692951ef", "44": "4641c95c0f510d93", "45": "2a0d6510b94d201c", "46": "3b4aae9299fc2f7b", "47": "d0591e2bdecf97f9", "48": "279552eb69e8368b", "49": "75b9dab7ee74ca0c", "50": "3bad9ca60eedcd79", "51": "f9086d8302936834", "52": "63e3d2ab37f32156", "53": "302d78947e3d3db7", "54": "9b40c2d1b4a4feb2", "55": "ba1fd9dfea0b4665", "56": "0aea46458306bbdc", "57": "6148e60f6e7a4cef", "58": "91aebaec8cfa4ba0", "59": "89e311c1f6a17b74", "60": "a6635b6fb2421b76", "61": "237ba03f8b2be5a5", "62": "7594a8e28f35b921", "63": "c2f1ef3116de9154", "64": "1fdb13184fd71fdf", "65": "c5492aaa900554f3", "66": "9766cf03802f7b1b", "67": "2d28c20804038a71", "68": "2bd2f5cacb74baa4", "70": "e351c7db6c083440"}
+1 -1
View File
@@ -1 +1 @@
/home/haku/projects/webmail
.
@@ -0,0 +1,73 @@
{
"0": "User",
"1": "Client",
"2": "webauthn.go",
"3": "session",
"4": "GoMailProvider",
"5": "config.go",
"6": "parser",
"7": "DB",
"8": "session",
"9": "session",
"10": "Handler",
"11": "session",
"12": "writeErr",
"13": "Client",
"14": "Sign",
"15": "Worker",
"16": "Server",
"17": "models.go",
"18": "Store",
"19": "uuidNew",
"20": "oauth2.go",
"21": "Go Web App No-Deps Pattern (skill)",
"22": "GoMail Action Plan v4 Overview",
"23": "QuarantineEntry",
"24": "ical.go",
"25": ".Run",
"26": "vcard.go",
"27": "Phase 11: Admin Portal",
"28": "app.js",
"29": "dnsutil.go",
"30": "Suggested Next Session Scope",
"31": "Domain",
"32": "checkSPF",
"33": "Limiter",
"34": ".Run",
"35": ".Run",
"36": "StageResult",
"37": "Core Principle: Compiles is Not Correct",
"38": "Phase 13: TLS + ACME + DANE/MTA-STS",
"39": "Server",
"40": ".Run",
"41": "Phase 12: Auth Hardening (TOTP/App Passwords/Reset)",
"42": "gomail",
"43": "SieveScript",
"44": "MailContext",
"45": "CalendarObject",
"46": "OutboundQueueEntry",
"47": "Shared api() Fetch Helper Convention",
"48": "Checkpoint Working State as Durable Artifact",
"49": "Prioritize by Risk Reduction Over Task Order",
"50": "migration",
"51": "esc() HTML-escape helper (admin)",
"52": "login() (admin)",
"53": "showApp()/showLogin() (admin)",
"54": "graphify Project Rules",
"55": "admin/embed.go",
"56": "handlers.go",
"57": "loadDashboard",
"58": "showPage() router (admin)",
"59": "bootstrap.go",
"60": "webmail/embed.go",
"61": "bodyOf() raw MIME body extractor",
"62": "loadMessages()/viewMessage()/deleteMessage",
"63": "ListRule",
"64": "Contact",
"65": "session",
"66": "MailboxEntry",
"67": "Server",
"68": "pipeline.go",
"69": "expandFetchItems",
"70": ".GetTLSCert"
}
+337
View File
@@ -0,0 +1,337 @@
# Graph Report - webmail (2026-08-09)
## Corpus Check
- 85 files · ~80,564 words
- Verdict: corpus is large enough that graph structure adds value.
## Summary
- 1144 nodes · 2550 edges · 71 communities (53 shown, 18 thin omitted)
- Extraction: 92% EXTRACTED · 8% INFERRED · 0% AMBIGUOUS · INFERRED: 205 edges (avg confidence: 0.81)
- Token cost: 0 input · 0 output
## Graph Freshness
- Built from commit: `d7ca591b`
- Run `git rev-parse HEAD` and compare to check if the graph is stale.
- Run `graphify update .` after code changes (no API cost).
## Community Hubs (Navigation)
- User
- Client
- webauthn.go
- session
- GoMailProvider
- config.go
- parser
- DB
- session
- session
- Handler
- session
- writeErr
- Client
- Sign
- Worker
- Server
- models.go
- Store
- uuidNew
- oauth2.go
- Go Web App No-Deps Pattern (skill)
- GoMail Action Plan v4 Overview
- QuarantineEntry
- ical.go
- .Run
- vcard.go
- Phase 11: Admin Portal
- app.js
- dnsutil.go
- Suggested Next Session Scope
- Domain
- checkSPF
- Limiter
- .Run
- .Run
- StageResult
- Core Principle: Compiles is Not Correct
- Phase 13: TLS + ACME + DANE/MTA-STS
- Server
- .Run
- Phase 12: Auth Hardening (TOTP/App Passwords/Reset)
- gomail
- SieveScript
- MailContext
- CalendarObject
- OutboundQueueEntry
- Shared api() Fetch Helper Convention
- Checkpoint Working State as Durable Artifact
- Prioritize by Risk Reduction Over Task Order
- migration
- esc() HTML-escape helper (admin)
- login() (admin)
- showApp()/showLogin() (admin)
- graphify Project Rules
- showPage() router (admin)
- bodyOf() raw MIME body extractor
- ListRule
- Contact
- session
- MailboxEntry
- Server
- pipeline.go
- expandFetchItems
- .GetTLSCert
## God Nodes (most connected - your core abstractions)
1. `DB` - 81 edges
2. `User` - 64 edges
3. `Handler` - 47 edges
4. `writeErr()` - 34 edges
5. `writeJSON()` - 33 edges
6. `Store` - 28 edges
7. `api()` - 28 edges
8. `MasterKey` - 27 edges
9. `session` - 25 edges
10. `session` - 25 edges
## Surprising Connections (you probably didn't know these)
- `base.html Flask-style Block Layout` --conceptually_related_to--> `GoMail Webmail SPA (index.html)` [AMBIGUOUS]
.claude/go-web-app-no-deps-SKILL.md → internal/webmail/static/index.html
- `Dark Tailwind CSS Custom-Property Palette` --semantically_similar_to--> `GoMail Admin SPA (index.html)` [INFERRED] [semantically similar]
.claude/go-web-app-no-deps-SKILL.md → internal/admin/static/index.html
- `Dark Tailwind CSS Custom-Property Palette` --semantically_similar_to--> `GoMail Webmail SPA (index.html)` [INFERRED] [semantically similar]
.claude/go-web-app-no-deps-SKILL.md → internal/webmail/static/index.html
- `Shared api() Fetch Helper Convention` --semantically_similar_to--> `api() fetch helper (admin)` [INFERRED] [semantically similar]
.claude/go-web-app-no-deps-SKILL.md → internal/admin/static/index.html
- `Shared api() Fetch Helper Convention` --semantically_similar_to--> `api() fetch helper (webmail)` [INFERRED] [semantically similar]
.claude/go-web-app-no-deps-SKILL.md → internal/webmail/static/index.html
## Import Cycles
- None detected.
## Hyperedges (group relationships)
- **GoMail Project Documentation Set** — gomail_handover_overview, readme_gomail, gomail_action_plan_v4_overview, _claude_iterative_build_discipline_skill_gomail_project [INFERRED 0.85]
- **Admin Portal CRUD Feature Set** — internal_admin_static_index_domains_crud, internal_admin_static_index_users_crud, internal_admin_static_index_rules_crud, internal_admin_static_index_queue_crud, internal_admin_static_index_quarantine [EXTRACTED 1.00]
- **Recurring Bug-Pattern Documentation Across GoMail Docs** — _claude_iterative_build_discipline_skill_sqlite_single_conn, gomail_handover_sqlite_deadlock_bug, gomail_action_plan_v4_sqlite_deadlock_bug, _claude_iterative_build_discipline_skill_tcp_read_pattern, gomail_handover_tcp_bug, gomail_action_plan_v4_tcp_bug [INFERRED 0.85]
## Communities (71 total, 18 thin omitted)
### Community 0 - "User"
Cohesion: 0.09
Nodes (42): User, NewGoMailProvider(), decodeSecret(), Generate(), GenerateSecret(), Time, hotp(), ProvisioningURI() (+34 more)
### Community 1 - "Client"
Cohesion: 0.06
Nodes (30): AccountKey, Authorization, Challenge, ChallengeResponder, Client, directory, jwk, Order (+22 more)
### Community 2 - "webauthn.go"
Cohesion: 0.17
Nodes (16): cborDecode(), cborDecodeWithLength(), DecodePublicKey(), EncodePublicKey(), Time, ParseAttestationObject(), ParseAuthData(), parseCOSEKey() (+8 more)
### Community 3 - "session"
Cohesion: 0.19
Nodes (8): state, Config, Conn, Context, session, ReadWriter, Server, newSession()
### Community 4 - "GoMailProvider"
Cohesion: 0.06
Nodes (38): Folder, FullMessage, GmailAPIProvider, gmailLabel, GoMailProvider, GraphAPIProvider, graphFolder, graphMessage (+30 more)
### Community 5 - "config.go"
Cohesion: 0.07
Nodes (36): buildOAuthConfigs(), Config, Handler, ipAllowlistMiddleware(), main(), Config, DatabaseConfig, JMAPConfig (+28 more)
### Community 6 - "parser"
Cohesion: 0.13
Nodes (19): evalTest(), execStatements(), Execute(), lookupHeader(), newLexer(), Parse(), FuzzParse(), F (+11 more)
### Community 8 - "session"
Cohesion: 0.14
Nodes (15): Scope, Authenticate(), checkAppPassword(), DB, escapeQuoted(), Conn, Context, ReadWriter (+7 more)
### Community 9 - "session"
Cohesion: 0.13
Nodes (16): connHost(), Addr, Config, Conn, Context, DB, Duration, Limiter (+8 more)
### Community 10 - "Handler"
Cohesion: 0.19
Nodes (14): Context, DB, Request, ResponseWriter, ServeMux, jmapRole(), NewHandler(), splitCompositeID() (+6 more)
### Community 11 - "session"
Cohesion: 0.15
Nodes (16): applySieve(), extractHeader(), extractHeaderMap(), extractMessageID(), extractSubject(), Conn, Context, IP (+8 more)
### Community 12 - "writeErr"
Cohesion: 0.20
Nodes (14): filterDomainsByTenant(), Handler, DB, HandlerFunc, Request, ResponseWriter, ServeMux, NewHandler() (+6 more)
### Community 13 - "Client"
Cohesion: 0.15
Nodes (12): Client, FetchedMessage, FolderInfo, SelectedInfo, Dial(), Config, Conn, Duration (+4 more)
### Community 14 - "Sign"
Cohesion: 0.14
Nodes (20): KeyPair, ExtractSignatureInfo(), GenerateKeyPair(), PrivateKey, ParseDNSPublicKey(), ParsePrivateKey(), buildDKIMHeader(), canonicalizeBodyRelaxed() (+12 more)
### Community 15 - "Worker"
Cohesion: 0.12
Nodes (20): Discover(), Context, Duration, Matches(), parsePolicy(), backoffDuration(), domainOf(), Config (+12 more)
### Community 16 - "Server"
Cohesion: 0.19
Nodes (14): connHost(), Addr, Config, Conn, Context, DB, Duration, Limiter (+6 more)
### Community 17 - "models.go"
Cohesion: 0.17
Nodes (12): Addressbook, Alias, AppPassword, Calendar, CheckResult, MessageCheck, MFABackupCode, OwnerType (+4 more)
### Community 18 - "Store"
Cohesion: 0.06
Nodes (46): IMAPCredential, MailProvider, OAuth2Credential, keyCacheKey, MasterKey, Handler, multistatusResponse, propSet (+38 more)
### Community 19 - "uuidNew"
Cohesion: 0.25
Nodes (3): MTASTSPolicy, Stats, uuidNew()
### Community 20 - "oauth2.go"
Cohesion: 0.18
Nodes (11): Context, Reader, Request, Time, NewAuthedRequest(), truncate(), WellKnownEndpoints(), Config (+3 more)
### Community 21 - "Go Web App No-Deps Pattern (skill)"
Cohesion: 0.21
Nodes (13): go-web-app-no-deps Packaged Skill (.skill zip), base.html Flask-style Block Layout, Template Block Bleeding Bug (ParseGlob shared namespace), Static Asset Cache-Busting via Version Query Param, Dark Tailwind CSS Custom-Property Palette, JS Function-in-Conditional Scoping Bug, No-Third-Party-Dependencies Principle, Go Web App No-Deps Pattern (skill) (+5 more)
### Community 22 - "GoMail Action Plan v4 Overview"
Cohesion: 0.21
Nodes (12): GoMail (referenced project), Wire-Format Structs Need Explicit Serialization Tags, cmd/e2etestN Disposable Test Pattern, GoMail Action Plan v4 Overview, Phase 5: IMAP/POP3/Auth, Phase 7: CalDAV/CardDAV, Phase 8: Webmail (JWT + REST API + SPA), Phase 9: JMAP Core/Mail Subset (+4 more)
### Community 23 - "QuarantineEntry"
Cohesion: 0.22
Nodes (3): QuarantineEntry, QuarantineStatus, Time
### Community 24 - "ical.go"
Cohesion: 0.24
Nodes (9): Event, escape(), FuzzParse(), F, Time, Parse(), splitProperty(), unescape() (+1 more)
### Community 25 - ".Run"
Cohesion: 0.29
Nodes (7): extractLeadingDigits(), Context, Duration, chatCompletionRequest, chatCompletionResponse, chatMessage, LLMStage
### Community 26 - "vcard.go"
Cohesion: 0.27
Nodes (8): escape(), FuzzParse(), F, Parse(), splitProperty(), unescape(), unfold(), Card
### Community 27 - "Phase 11: Admin Portal"
Cohesion: 0.29
Nodes (10): Admin Domain Creation Missing Tenant Fallback Bug, Admin User Creation Missing domain_id Bug, Phase 11: Admin Portal, Quarantine: Admin Global Discard vs Webmail Per-User Release, Domains CRUD (loadDomains/createDomain/rotateDkim/deleteDomain), Quarantine Discard (admin), Outbound Queue Actions (retry/cancel), List Rules CRUD (+2 more)
### Community 28 - "app.js"
Cohesion: 0.10
Nodes (56): accounts, acctQuery(), addPasskey(), api(), b64urlToBuf(), bodyOf(), boot(), bufToB64url() (+48 more)
### Community 29 - "dnsutil.go"
Cohesion: 0.20
Nodes (18): TLSARecord, Response, RR, Certificate, Context, Lookup(), VerifyPeerCertificate(), buildQuery() (+10 more)
### Community 30 - "Suggested Next Session Scope"
Cohesion: 0.25
Nodes (9): bufio.Reader + io.ReadFull for TCP Protocol Boundaries, Genuine EICAR Byte-Level ClamAV Verification, Phase 10: OAuth2 + Gmail/M365 Multi-Account, Phase 14: Optional External Services (ClamAV/Rspamd/LLM), Phase 15: Hardening + Deploy, Token-Bucket Per-IP Rate Limiter, Fake clamd Server TCP Over-Read Bug, Suggested Next Session Scope (+1 more)
### Community 32 - "checkSPF"
Cohesion: 0.40
Nodes (7): checkSPF(), evaluateSPF(), Context, IP, matchCIDR(), spfOutcome, SPFStage
### Community 33 - "Limiter"
Cohesion: 0.33
Nodes (5): Mutex, Limiter, Time, New(), bucket
### Community 34 - ".Run"
Cohesion: 0.36
Nodes (5): Context, Duration, rspamdResponse, RspamdStage, rspamdSymbol
### Community 35 - ".Run"
Cohesion: 0.39
Nodes (4): Context, Duration, parseClamAddr(), ClamAVStage
### Community 36 - "StageResult"
Cohesion: 0.19
Nodes (9): dmarcTag(), extractDomainFromHeader(), Context, orgDomain(), Context, injectSpamHeaders(), DMARCStage, HeaderStage (+1 more)
### Community 37 - "Core Principle: Compiles is Not Correct"
Cohesion: 0.33
Nodes (6): iterative-build-discipline Packaged Skill (.skill zip), Core Principle: Compiles is Not Correct, Disposable Real End-to-End Test Pattern, Genuinely-Enforcing Fake Protocol Server Pattern, Negative-Path Tests as Non-Optional, Verify Against Published Test Vectors (RFC 6238)
### Community 38 - "Phase 13: TLS + ACME + DANE/MTA-STS"
Cohesion: 0.47
Nodes (6): Phase 13: TLS + ACME + DANE/MTA-STS, Sandbox Network/Toolchain Constraints, Immediate First Steps Setup, DNS Setup (MX/SPF/DKIM/DMARC), GoMail (Self-Hosted Email Server), TLS / ACME Quick Setup
### Community 39 - "Server"
Cohesion: 0.18
Nodes (11): Server, connHost(), Addr, Config, Context, DB, Duration, Limiter (+3 more)
### Community 40 - ".Run"
Cohesion: 0.47
Nodes (3): dedupe(), Context, URLStage
### Community 41 - "Phase 12: Auth Hardening (TOTP/App Passwords/Reset)"
Cohesion: 0.50
Nodes (5): SQLite Single-Connection-Pool Query/Exec Deadlock Pattern, Phase 12: Auth Hardening (TOTP/App Passwords/Reset), Rationale: Phase 13 Pulled Forward, ConsumeBackupCode SQLite Deadlock Bug, SQLite Query+Exec Deadlock Bug (documented)
### Community 44 - "MailContext"
Cohesion: 0.31
Nodes (5): Message, MessageVerdict, domainOf(), IP, MailContext
### Community 47 - "Shared api() Fetch Helper Convention"
Cohesion: 1.00
Nodes (3): Shared api() Fetch Helper Convention, api() fetch helper (admin), api() fetch helper (webmail)
### Community 65 - "session"
Cohesion: 0.20
Nodes (3): session, matchesSearch(), quoteIfNeeded()
### Community 66 - "MailboxEntry"
Cohesion: 0.26
Nodes (7): MailboxEntry, addFlag(), extractHeaders(), flagsToIMAP(), indexOf(), parseSeqNum(), removeFlag()
### Community 67 - "Server"
Cohesion: 0.26
Nodes (8): Config, Context, DB, Duration, Listener, WaitGroup, NewServer(), Server
### Community 68 - "pipeline.go"
Cohesion: 0.40
Nodes (8): DefaultStages(), Config, Context, NewOrchestrator(), StagesFromConfig(), verdictFor(), Orchestrator, Stage
### Community 69 - "expandFetchItems"
Cohesion: 0.32
Nodes (6): expandFetchItems(), isList(), splitList(), tokenize(), FuzzTokenize(), F
## Ambiguous Edges - Review These
- `Template Renderer (fresh-instance-per-page)``GoMail Admin SPA (index.html)` [AMBIGUOUS]
.claude/go-web-app-no-deps-SKILL.md · relation: conceptually_related_to
- `base.html Flask-style Block Layout``GoMail Webmail SPA (index.html)` [AMBIGUOUS]
.claude/go-web-app-no-deps-SKILL.md · relation: conceptually_related_to
- `Security Basics: CSRF/Path-Traversal/Atomic-Write/CSP``GoMail Admin SPA (index.html)` [AMBIGUOUS]
.claude/go-web-app-no-deps-SKILL.md · relation: conceptually_related_to
- `Security Basics: CSRF/Path-Traversal/Atomic-Write/CSP``GoMail Webmail SPA (index.html)` [AMBIGUOUS]
.claude/go-web-app-no-deps-SKILL.md · relation: conceptually_related_to
## Knowledge Gaps
- **29 isolated node(s):** `gomail`, `gmailLabel`, `graphFolder`, `IMAPCredential`, `keyCacheKey` (+24 more)
These have ≤1 connection - possible missing edges or undocumented components.
- **18 thin communities (<3 nodes) omitted from report** — run `graphify query` to explore isolated nodes.
## Suggested Questions
_Questions this graph is uniquely positioned to answer:_
- **What is the exact relationship between `Template Renderer (fresh-instance-per-page)` and `GoMail Admin SPA (index.html)`?**
_Edge tagged AMBIGUOUS (relation: conceptually_related_to) - confidence is low._
- **What is the exact relationship between `base.html Flask-style Block Layout` and `GoMail Webmail SPA (index.html)`?**
_Edge tagged AMBIGUOUS (relation: conceptually_related_to) - confidence is low._
- **What is the exact relationship between `Security Basics: CSRF/Path-Traversal/Atomic-Write/CSP` and `GoMail Admin SPA (index.html)`?**
_Edge tagged AMBIGUOUS (relation: conceptually_related_to) - confidence is low._
- **What is the exact relationship between `Security Basics: CSRF/Path-Traversal/Atomic-Write/CSP` and `GoMail Webmail SPA (index.html)`?**
_Edge tagged AMBIGUOUS (relation: conceptually_related_to) - confidence is low._
- **Why does `User` connect `User` to `session`, `GoMailProvider`, `DB`, `session`, `session`, `Handler`, `session`, `writeErr`, `models.go`, `Store`?**
_High betweenness centrality (0.297) - this node is a cross-community bridge._
- **Why does `Store` connect `Store` to `User`, `GoMailProvider`, `Server`, `session`, `Handler`, `Worker`, `Server`?**
_High betweenness centrality (0.150) - this node is a cross-community bridge._
- **Why does `DB` connect `DB` to `Contact`, `MailboxEntry`, `.GetTLSCert`, `SieveScript`, `MailContext`, `CalendarObject`, `OutboundQueueEntry`, `models.go`, `Store`, `uuidNew`, `QuarantineEntry`, `Domain`, `ListRule`?**
_High betweenness centrality (0.095) - this node is a cross-community bridge._
+12
View File
@@ -0,0 +1,12 @@
{
"runs": [
{
"date": "2026-08-09T13:36:33.949106+00:00",
"input_tokens": 134823,
"output_tokens": 0,
"files": 78
}
],
"total_input_tokens": 134823,
"total_output_tokens": 0
}
File diff suppressed because it is too large Load Diff
+432
View File
@@ -0,0 +1,432 @@
{
".claude/settings.json": {
"mtime": 1786281487.088728,
"ast_hash": "",
"semantic_hash": ""
},
"cmd/gomail/main.go": {
"mtime": 1786301328.7600007,
"ast_hash": "9bc7ad461922c990788c456f84817a9f",
"semantic_hash": ""
},
"go.mod": {
"mtime": 1786283185.2691686,
"ast_hash": "93100fd0185e78288141d5ed0b2c8b19",
"semantic_hash": ""
},
"internal/accounts/link.go": {
"mtime": 1786299069.1242821,
"ast_hash": "5eed8ecb5be6a1c35c6591dedad976d1",
"semantic_hash": ""
},
"internal/accounts/provider.go": {
"mtime": 1786168320.0,
"ast_hash": "4a180151e798601f43bda25bd1a80410",
"semantic_hash": "4a180151e798601f43bda25bd1a80410"
},
"internal/accounts/provider_gomail.go": {
"mtime": 1786297740.5829873,
"ast_hash": "ac0d507cba9953d85a44ce0506217587",
"semantic_hash": ""
},
"internal/accounts/provider_imap.go": {
"mtime": 1786298998.877657,
"ast_hash": "4825cd303e132e3179500afe0e9098bd",
"semantic_hash": ""
},
"internal/accounts/provider_smtp_helper.go": {
"mtime": 1786289886.1606128,
"ast_hash": "4fec96778cdaa94b1ab2264236af8b48",
"semantic_hash": ""
},
"internal/acme/challenge.go": {
"mtime": 1786189310.0,
"ast_hash": "ec3bcb998b34bc2c8a43cb8f3880e112",
"semantic_hash": "ec3bcb998b34bc2c8a43cb8f3880e112"
},
"internal/acme/client.go": {
"mtime": 1786189290.0,
"ast_hash": "830b78389d159a75e48f1a0076b6275b",
"semantic_hash": "830b78389d159a75e48f1a0076b6275b"
},
"internal/acme/jws.go": {
"mtime": 1786189220.0,
"ast_hash": "e5aa7cbbea33d9971f1577e4c976cb8c",
"semantic_hash": "e5aa7cbbea33d9971f1577e4c976cb8c"
},
"internal/acme/obtain.go": {
"mtime": 1786189332.0,
"ast_hash": "d2f78794831ad67ba64fb79cb7eb1c00",
"semantic_hash": "d2f78794831ad67ba64fb79cb7eb1c00"
},
"internal/admin/api.go": {
"mtime": 1786281901.2009063,
"ast_hash": "14fbb199cccd839edb6cf98392226b03",
"semantic_hash": "14fbb199cccd839edb6cf98392226b03"
},
"internal/admin/embed.go": {
"mtime": 1786188384.0,
"ast_hash": "55b64461208f9449c417bddf49e686cc",
"semantic_hash": "55b64461208f9449c417bddf49e686cc"
},
"internal/admin/handlers.go": {
"mtime": 1786281901.8545587,
"ast_hash": "06aad8456678b41905ac6787e50fb15a",
"semantic_hash": "06aad8456678b41905ac6787e50fb15a"
},
"internal/auth/auth.go": {
"mtime": 1786281903.3781548,
"ast_hash": "c74ed7b257b2272dcfb860b8a60746a0",
"semantic_hash": "c74ed7b257b2272dcfb860b8a60746a0"
},
"internal/config/config.go": {
"mtime": 1786289818.8781466,
"ast_hash": "68fd6f093c4ba00106bdbbe59786a269",
"semantic_hash": ""
},
"internal/crypto/crypto.go": {
"mtime": 1786297602.7221303,
"ast_hash": "8de4f9714d1c3e73a4322080d6b1a2ca",
"semantic_hash": ""
},
"internal/dav/dav.go": {
"mtime": 1786281900.5555487,
"ast_hash": "9dc713615ff99b713ad2879fca2b28dd",
"semantic_hash": "9dc713615ff99b713ad2879fca2b28dd"
},
"internal/db/bootstrap.go": {
"mtime": 1786281902.3275623,
"ast_hash": "922a08de72be0ef63409ed402d01e098",
"semantic_hash": "922a08de72be0ef63409ed402d01e098"
},
"internal/db/db.go": {
"mtime": 1786297548.1684437,
"ast_hash": "aed0290af4025c8c84089356f8746f08",
"semantic_hash": ""
},
"internal/db/migrations.go": {
"mtime": 1786300065.1340663,
"ast_hash": "2eb17b13bdc6bd5a954c82b4503aa8f9",
"semantic_hash": ""
},
"internal/db/models.go": {
"mtime": 1786300091.6301413,
"ast_hash": "12f132efac1ac74ab13ce8bfce0bfc69",
"semantic_hash": ""
},
"internal/db/queries.go": {
"mtime": 1786301261.1620972,
"ast_hash": "684ba8ac79df6845b0f0571ee6ff67a3",
"semantic_hash": ""
},
"internal/dkim/keys.go": {
"mtime": 1785566243.0,
"ast_hash": "e8d336df9cba3a8f69c70962f8a75579",
"semantic_hash": "e8d336df9cba3a8f69c70962f8a75579"
},
"internal/dkim/sign.go": {
"mtime": 1785472923.0,
"ast_hash": "ba6dd425f253aac61b386a8aea0d2061",
"semantic_hash": "ba6dd425f253aac61b386a8aea0d2061"
},
"internal/dkim/verify.go": {
"mtime": 1785472944.0,
"ast_hash": "4e58aca20a4874dac789bc0a844bfba6",
"semantic_hash": "4e58aca20a4874dac789bc0a844bfba6"
},
"internal/ical/ical.go": {
"mtime": 1785905665.0,
"ast_hash": "2de79f76c377508c20caa2e8683e920a",
"semantic_hash": "2de79f76c377508c20caa2e8683e920a"
},
"internal/ical/ical_fuzz_test.go": {
"mtime": 1786207598.0,
"ast_hash": "5518fd86059d729048685e2bc39c24b2",
"semantic_hash": "5518fd86059d729048685e2bc39c24b2"
},
"internal/imap/commands.go": {
"mtime": 1786294683.3800013,
"ast_hash": "584a4c4fa7ad664aaec36bc404825512",
"semantic_hash": ""
},
"internal/imap/parser.go": {
"mtime": 1785638411.0,
"ast_hash": "687b7788b077688b9081f958b669a0e6",
"semantic_hash": "687b7788b077688b9081f958b669a0e6"
},
"internal/imap/server.go": {
"mtime": 1786289824.8942587,
"ast_hash": "50a8a0f58edd9d9bb6cafa385f3c97b2",
"semantic_hash": ""
},
"internal/imap/session.go": {
"mtime": 1786281910.5246246,
"ast_hash": "f06bd7a253f498fbe197951537bc589e",
"semantic_hash": "f06bd7a253f498fbe197951537bc589e"
},
"internal/imap/tokenize_fuzz_test.go": {
"mtime": 1786207631.0,
"ast_hash": "4920db9f0c2beaa06a7393ab027d3c2b",
"semantic_hash": "4920db9f0c2beaa06a7393ab027d3c2b"
},
"internal/imapclient/client.go": {
"mtime": 1786169633.0,
"ast_hash": "f9671c971ff9f39a2ed82af7ed3e87df",
"semantic_hash": "f9671c971ff9f39a2ed82af7ed3e87df"
},
"internal/jmap/jmap.go": {
"mtime": 1786281904.3499777,
"ast_hash": "2484a0bccd56908627cee4c769b689e5",
"semantic_hash": "2484a0bccd56908627cee4c769b689e5"
},
"internal/mailstore/maildir.go": {
"mtime": 1786297713.2183998,
"ast_hash": "ca8749979e4a1ca9ada23c072945189c",
"semantic_hash": ""
},
"internal/managesieve/server.go": {
"mtime": 1786281899.3706038,
"ast_hash": "4ebc166b83227affe5171026b8012876",
"semantic_hash": "4ebc166b83227affe5171026b8012876"
},
"internal/managesieve/session.go": {
"mtime": 1786281899.9771776,
"ast_hash": "ab69e22b6add70fdb6c18f056c474e8d",
"semantic_hash": "ab69e22b6add70fdb6c18f056c474e8d"
},
"internal/oauth2/oauth2.go": {
"mtime": 1786298531.0961437,
"ast_hash": "4e1c7abbe92feb151acecfec03229c50",
"semantic_hash": ""
},
"internal/pipeline/pipeline.go": {
"mtime": 1786281906.8561504,
"ast_hash": "2b0b026fc13ce700c083960df7bc7857",
"semantic_hash": "2b0b026fc13ce700c083960df7bc7857"
},
"internal/pipeline/stage_clamav.go": {
"mtime": 1786281905.5831316,
"ast_hash": "6a5c073d349a49e2cbe75863945a663b",
"semantic_hash": "6a5c073d349a49e2cbe75863945a663b"
},
"internal/pipeline/stage_dkim.go": {
"mtime": 1786281908.573951,
"ast_hash": "3f92da867d5b128398a8ffc70b6fa475",
"semantic_hash": "3f92da867d5b128398a8ffc70b6fa475"
},
"internal/pipeline/stage_dmarc.go": {
"mtime": 1786294688.9970334,
"ast_hash": "fc9ece401684fb950771b70db7a54d9d",
"semantic_hash": ""
},
"internal/pipeline/stage_headers.go": {
"mtime": 1786281909.176789,
"ast_hash": "e7777ff0afde0baa97bd458060e7c002",
"semantic_hash": "e7777ff0afde0baa97bd458060e7c002"
},
"internal/pipeline/stage_llm.go": {
"mtime": 1786281906.2809672,
"ast_hash": "c0a1d11888d0f32083b0e90d32018ec1",
"semantic_hash": "c0a1d11888d0f32083b0e90d32018ec1"
},
"internal/pipeline/stage_rspamd.go": {
"mtime": 1786281907.8549173,
"ast_hash": "6b7c65df77472ef32c96782db5d98d07",
"semantic_hash": "6b7c65df77472ef32c96782db5d98d07"
},
"internal/pipeline/stage_spf.go": {
"mtime": 1786281916.382805,
"ast_hash": "7e1eda77e5ba190bc50dda977b0c3723",
"semantic_hash": "7e1eda77e5ba190bc50dda977b0c3723"
},
"internal/pipeline/stage_url.go": {
"mtime": 1786281905.1305835,
"ast_hash": "f954d508ac085f560928c06171779db5",
"semantic_hash": "f954d508ac085f560928c06171779db5"
},
"internal/pop3/pop3.go": {
"mtime": 1786289853.1900737,
"ast_hash": "e4756d72c5bc2bd89fd41a2205ca3d14",
"semantic_hash": ""
},
"internal/queue/queue.go": {
"mtime": 1786300256.943359,
"ast_hash": "5e9631b0601474ed28f3626a293e8e08",
"semantic_hash": ""
},
"internal/ratelimit/http.go": {
"mtime": 1786289690.9789355,
"ast_hash": "039681ec4aef1340ab4ba8bf83baa679",
"semantic_hash": ""
},
"internal/ratelimit/ratelimit.go": {
"mtime": 1786207185.0,
"ast_hash": "4d5bf0b77d390cf3e71abb4d022cf0aa",
"semantic_hash": "4d5bf0b77d390cf3e71abb4d022cf0aa"
},
"internal/sieve/interp.go": {
"mtime": 1786169049.0,
"ast_hash": "6f13e1891ef551ffebba37e759742aca",
"semantic_hash": "6f13e1891ef551ffebba37e759742aca"
},
"internal/sieve/lexer.go": {
"mtime": 1786168959.0,
"ast_hash": "3d8d9f9f203855eaf8d638935f65f7bb",
"semantic_hash": "3d8d9f9f203855eaf8d638935f65f7bb"
},
"internal/sieve/parser.go": {
"mtime": 1786168977.0,
"ast_hash": "cbcd550894b5c473a160481098151605",
"semantic_hash": "cbcd550894b5c473a160481098151605"
},
"internal/sieve/sieve_fuzz_test.go": {
"mtime": 1786207613.0,
"ast_hash": "fa017deb29e67fa5264e3ecc59ede127",
"semantic_hash": "fa017deb29e67fa5264e3ecc59ede127"
},
"internal/smtp/auth.go": {
"mtime": 1786281931.1489654,
"ast_hash": "9220929f9afd4b5b8c39ee7401ea3ecd",
"semantic_hash": "9220929f9afd4b5b8c39ee7401ea3ecd"
},
"internal/smtp/server.go": {
"mtime": 1786281931.153782,
"ast_hash": "30d88aa535f6ee39072f35fa6c1fd108",
"semantic_hash": "30d88aa535f6ee39072f35fa6c1fd108"
},
"internal/smtp/session.go": {
"mtime": 1786281931.1489654,
"ast_hash": "41aae3368dc4be4eba559f0d732e9a37",
"semantic_hash": "41aae3368dc4be4eba559f0d732e9a37"
},
"internal/tlsutil/acme_manager.go": {
"mtime": 1786281902.8497763,
"ast_hash": "5e7aa10c39162f5d95f927ba4efc30fb",
"semantic_hash": "5e7aa10c39162f5d95f927ba4efc30fb"
},
"internal/tlsutil/selfsigned.go": {
"mtime": 1786193053.0,
"ast_hash": "9c58f78ed11e4c7bf208306285f0b32e",
"semantic_hash": "9c58f78ed11e4c7bf208306285f0b32e"
},
"internal/totp/totp.go": {
"mtime": 1786193280.0,
"ast_hash": "48f2c9db1c1307f13d78726aa3b24f6a",
"semantic_hash": "48f2c9db1c1307f13d78726aa3b24f6a"
},
"internal/vcard/vcard.go": {
"mtime": 1785905650.0,
"ast_hash": "8b0043626bac3cacc11b6ce76259445b",
"semantic_hash": "8b0043626bac3cacc11b6ce76259445b"
},
"internal/vcard/vcard_fuzz_test.go": {
"mtime": 1786207583.0,
"ast_hash": "5aeab637a3c3357bb2c13cacc21508c6",
"semantic_hash": "5aeab637a3c3357bb2c13cacc21508c6"
},
"internal/webmail/api.go": {
"mtime": 1786302351.1001678,
"ast_hash": "08cd2e43bf56f9b24d49fb5c75dfe90f",
"semantic_hash": ""
},
"internal/webmail/embed.go": {
"mtime": 1786295803.857812,
"ast_hash": "78663d0210a610d1777c4b4151390cf1",
"semantic_hash": ""
},
"internal/webtoken/webtoken.go": {
"mtime": 1786289648.699828,
"ast_hash": "b9be7cc5ea74ce6b82de79ef3644cb52",
"semantic_hash": ""
},
".claude/go-web-app-no-deps-SKILL.md": {
"mtime": 1786206554.0,
"ast_hash": "eb54ace954e819a069a9f1284485d213",
"semantic_hash": "eb54ace954e819a069a9f1284485d213"
},
".claude/go-web-app-no-deps.skill": {
"mtime": 1786206554.0,
"ast_hash": "de820100f8ad2da76d57884262c9f5f0",
"semantic_hash": "de820100f8ad2da76d57884262c9f5f0"
},
".claude/iterative-build-discipline-SKILL.md": {
"mtime": 1786206504.0,
"ast_hash": "d0e94862b77af5f6ac99c3f2668db3c9",
"semantic_hash": "d0e94862b77af5f6ac99c3f2668db3c9"
},
".claude/iterative-build-discipline.skill": {
"mtime": 1786206504.0,
"ast_hash": "87a25b626d37a9dfe5c037ae409fecad",
"semantic_hash": "87a25b626d37a9dfe5c037ae409fecad"
},
"CLAUDE.md": {
"mtime": 1786281487.0884602,
"ast_hash": "82efb97a359f5c7290bf2513d14686be",
"semantic_hash": "82efb97a359f5c7290bf2513d14686be"
},
"GOMAIL_HANDOVER.md": {
"mtime": 1786206496.0,
"ast_hash": "81fbcb0478fce27c6b6e8c6646eed44a",
"semantic_hash": "81fbcb0478fce27c6b6e8c6646eed44a"
},
"README.md": {
"mtime": 1786208021.0,
"ast_hash": "257dbe428b6a41b51d4d8efcd2431615",
"semantic_hash": "257dbe428b6a41b51d4d8efcd2431615"
},
"gomail-action-plan-v4.md": {
"mtime": 1786206496.0,
"ast_hash": "203046a9566fb3c392ed2e51aa178805",
"semantic_hash": "203046a9566fb3c392ed2e51aa178805"
},
"internal/admin/static/index.html": {
"mtime": 1786188708.0,
"ast_hash": "77b0b0e42cf45a961571ee5e3a3a219a",
"semantic_hash": "77b0b0e42cf45a961571ee5e3a3a219a"
},
"internal/webmail/static/index.html": {
"mtime": 1786302422.3206468,
"ast_hash": "240f0802126ee6142b639b0c3d1fd749",
"semantic_hash": ""
},
"internal/webmail/static/app.js": {
"mtime": 1786302477.0202506,
"ast_hash": "8b8643e290174bcaab0192971680383d",
"semantic_hash": ""
},
"internal/accounts/provider_gmailapi.go": {
"mtime": 1786298739.5325413,
"ast_hash": "a80e81ac8b519d6512decda32e7a7708",
"semantic_hash": ""
},
"internal/accounts/provider_graphapi.go": {
"mtime": 1786298907.5633397,
"ast_hash": "2780f65f9cfd9dda29fdfcdb6286c6b8",
"semantic_hash": ""
},
"internal/dane/dane.go": {
"mtime": 1786299961.3714652,
"ast_hash": "3ef099496960a4e2be04aae071be357c",
"semantic_hash": ""
},
"internal/dnsutil/dnsutil.go": {
"mtime": 1786300340.0186586,
"ast_hash": "6433e7754901f5eeb8e12d88342265b1",
"semantic_hash": ""
},
"internal/mtasts/mtasts.go": {
"mtime": 1786300014.9348822,
"ast_hash": "832952ea8843b31f4f8a01ffa3cfeb7f",
"semantic_hash": ""
},
"internal/webauthn/cbor.go": {
"mtime": 1786301093.0761018,
"ast_hash": "79612ad8167cf6a9e6e18977f1d90f0f",
"semantic_hash": ""
},
"internal/webauthn/webauthn.go": {
"mtime": 1786301194.5917418,
"ast_hash": "f9abf441c2637cdb4bdfd28b358417a3",
"semantic_hash": ""
}
}
@@ -0,0 +1,72 @@
{
"0": "User",
"1": "Client",
"2": "webauthn.go",
"3": "session",
"4": "GmailAPIProvider",
"5": "config.go",
"6": "parser",
"7": "DB",
"8": "session",
"9": "session",
"10": "Handler",
"11": "session",
"12": "writeErr",
"13": "Client",
"14": "Sign",
"15": "Worker",
"16": "session",
"17": "models.go",
"18": "Store",
"19": "uuidNew",
"20": "oauth2.go",
"21": "Go Web App No-Deps Pattern (skill)",
"22": "GoMail Action Plan v4 Overview",
"23": "QuarantineEntry",
"24": "ical.go",
"25": ".Run",
"26": "vcard.go",
"27": "Phase 11: Admin Portal",
"28": "app.js",
"29": "Server",
"30": "Suggested Next Session Scope",
"31": "Domain",
"32": "checkSPF",
"33": "Limiter",
"34": ".Run",
"35": ".Run",
"36": ".Run",
"37": "Core Principle: Compiles is Not Correct",
"38": "Phase 13: TLS + ACME + DANE/MTA-STS",
"39": "GraphAPIProvider",
"40": ".Run",
"41": "Phase 12: Auth Hardening (TOTP/App Passwords/Reset)",
"42": "gomail",
"43": "SieveScript",
"44": "MailContext",
"45": "CalendarObject",
"46": "OutboundQueueEntry",
"47": "Shared api() Fetch Helper Convention",
"48": "Checkpoint Working State as Durable Artifact",
"49": "Prioritize by Risk Reduction Over Task Order",
"50": "migration",
"51": "esc() HTML-escape helper (admin)",
"52": "login() (admin)",
"53": "showApp()/showLogin() (admin)",
"54": "graphify Project Rules",
"55": "admin/embed.go",
"56": "handlers.go",
"57": "loadDashboard",
"58": "showPage() router (admin)",
"59": "bootstrap.go",
"60": "webmail/embed.go",
"61": "bodyOf() raw MIME body extractor",
"62": "loadMessages()/viewMessage()/deleteMessage",
"63": "ListRule",
"64": ".GetContact",
"65": "dnssec.go",
"66": "totp.go",
"67": "StageResult",
"68": "pipeline.go",
"70": ".GetTLSCert"
}
+332
View File
@@ -0,0 +1,332 @@
# Graph Report - webmail (2026-08-10)
## Corpus Check
- 85 files · ~82,056 words
- Verdict: corpus is large enough that graph structure adds value.
## Summary
- 1169 nodes · 2612 edges · 70 communities (52 shown, 18 thin omitted)
- Extraction: 92% EXTRACTED · 8% INFERRED · 0% AMBIGUOUS · INFERRED: 201 edges (avg confidence: 0.81)
- Token cost: 0 input · 0 output
## Graph Freshness
- Built from commit: `d7ca591b`
- Run `git rev-parse HEAD` and compare to check if the graph is stale.
- Run `graphify update .` after code changes (no API cost).
## Community Hubs (Navigation)
- User
- Client
- webauthn.go
- session
- GmailAPIProvider
- config.go
- parser
- DB
- session
- session
- Handler
- session
- writeErr
- Client
- Sign
- Worker
- session
- models.go
- Store
- uuidNew
- oauth2.go
- Go Web App No-Deps Pattern (skill)
- GoMail Action Plan v4 Overview
- QuarantineEntry
- ical.go
- .Run
- vcard.go
- Phase 11: Admin Portal
- app.js
- Server
- Suggested Next Session Scope
- Domain
- checkSPF
- Limiter
- .Run
- .Run
- .Run
- Core Principle: Compiles is Not Correct
- Phase 13: TLS + ACME + DANE/MTA-STS
- GraphAPIProvider
- .Run
- Phase 12: Auth Hardening (TOTP/App Passwords/Reset)
- gomail
- SieveScript
- MailContext
- CalendarObject
- OutboundQueueEntry
- Shared api() Fetch Helper Convention
- Checkpoint Working State as Durable Artifact
- Prioritize by Risk Reduction Over Task Order
- migration
- esc() HTML-escape helper (admin)
- login() (admin)
- showApp()/showLogin() (admin)
- graphify Project Rules
- showPage() router (admin)
- bodyOf() raw MIME body extractor
- ListRule
- .GetContact
- dnssec.go
- totp.go
- StageResult
- pipeline.go
- .GetTLSCert
## God Nodes (most connected - your core abstractions)
1. `DB` - 81 edges
2. `User` - 67 edges
3. `Handler` - 50 edges
4. `writeErr()` - 36 edges
5. `writeJSON()` - 35 edges
6. `Store` - 28 edges
7. `api()` - 28 edges
8. `MasterKey` - 27 edges
9. `session` - 25 edges
10. `session` - 25 edges
## Surprising Connections (you probably didn't know these)
- `base.html Flask-style Block Layout` --conceptually_related_to--> `GoMail Webmail SPA (index.html)` [AMBIGUOUS]
.claude/go-web-app-no-deps-SKILL.md → internal/webmail/static/index.html
- `Dark Tailwind CSS Custom-Property Palette` --semantically_similar_to--> `GoMail Admin SPA (index.html)` [INFERRED] [semantically similar]
.claude/go-web-app-no-deps-SKILL.md → internal/admin/static/index.html
- `Dark Tailwind CSS Custom-Property Palette` --semantically_similar_to--> `GoMail Webmail SPA (index.html)` [INFERRED] [semantically similar]
.claude/go-web-app-no-deps-SKILL.md → internal/webmail/static/index.html
- `Shared api() Fetch Helper Convention` --semantically_similar_to--> `api() fetch helper (admin)` [INFERRED] [semantically similar]
.claude/go-web-app-no-deps-SKILL.md → internal/admin/static/index.html
- `Shared api() Fetch Helper Convention` --semantically_similar_to--> `api() fetch helper (webmail)` [INFERRED] [semantically similar]
.claude/go-web-app-no-deps-SKILL.md → internal/webmail/static/index.html
## Import Cycles
- None detected.
## Hyperedges (group relationships)
- **GoMail Project Documentation Set** — gomail_handover_overview, readme_gomail, gomail_action_plan_v4_overview, _claude_iterative_build_discipline_skill_gomail_project [INFERRED 0.85]
- **Admin Portal CRUD Feature Set** — internal_admin_static_index_domains_crud, internal_admin_static_index_users_crud, internal_admin_static_index_rules_crud, internal_admin_static_index_queue_crud, internal_admin_static_index_quarantine [EXTRACTED 1.00]
- **Recurring Bug-Pattern Documentation Across GoMail Docs** — _claude_iterative_build_discipline_skill_sqlite_single_conn, gomail_handover_sqlite_deadlock_bug, gomail_action_plan_v4_sqlite_deadlock_bug, _claude_iterative_build_discipline_skill_tcp_read_pattern, gomail_handover_tcp_bug, gomail_action_plan_v4_tcp_bug [INFERRED 0.85]
## Communities (70 total, 18 thin omitted)
### Community 0 - "User"
Cohesion: 0.10
Nodes (36): MailProvider, User, GenerateSecret(), NewChallenge(), Config, DB, Duration, HandlerFunc (+28 more)
### Community 1 - "Client"
Cohesion: 0.06
Nodes (31): AccountKey, Authorization, Challenge, ChallengeResponder, Client, directory, jwk, Order (+23 more)
### Community 2 - "webauthn.go"
Cohesion: 0.17
Nodes (16): cborDecode(), cborDecodeWithLength(), DecodePublicKey(), EncodePublicKey(), Time, ParseAttestationObject(), ParseAuthData(), parseCOSEKey() (+8 more)
### Community 3 - "session"
Cohesion: 0.11
Nodes (15): addFlag(), expandFetchItems(), extractHeaders(), flagsToIMAP(), session, indexOf(), matchesSearch(), parseSeqNum() (+7 more)
### Community 4 - "GmailAPIProvider"
Cohesion: 0.07
Nodes (36): CalendarEvent, CalendarProvider, Contact, ContactProvider, Folder, FullMessage, GmailAPIProvider, gmailDateTime (+28 more)
### Community 5 - "config.go"
Cohesion: 0.07
Nodes (36): buildOAuthConfigs(), Config, Handler, ipAllowlistMiddleware(), main(), Config, DatabaseConfig, JMAPConfig (+28 more)
### Community 6 - "parser"
Cohesion: 0.12
Nodes (21): evalTest(), execStatements(), Execute(), lookupHeader(), newLexer(), Parse(), FuzzParse(), F (+13 more)
### Community 8 - "session"
Cohesion: 0.12
Nodes (17): Config, Context, DB, Duration, Listener, WaitGroup, NewServer(), escapeQuoted() (+9 more)
### Community 9 - "session"
Cohesion: 0.13
Nodes (16): connHost(), Addr, Config, Conn, Context, DB, Duration, Limiter (+8 more)
### Community 10 - "Handler"
Cohesion: 0.19
Nodes (14): Context, DB, Request, ResponseWriter, ServeMux, jmapRole(), NewHandler(), splitCompositeID() (+6 more)
### Community 11 - "session"
Cohesion: 0.09
Nodes (28): connHost(), Addr, Config, Conn, Context, DB, Duration, Limiter (+20 more)
### Community 12 - "writeErr"
Cohesion: 0.20
Nodes (14): filterDomainsByTenant(), Handler, DB, HandlerFunc, Request, ResponseWriter, ServeMux, NewHandler() (+6 more)
### Community 13 - "Client"
Cohesion: 0.15
Nodes (12): Client, FetchedMessage, FolderInfo, SelectedInfo, Dial(), Config, Conn, Duration (+4 more)
### Community 14 - "Sign"
Cohesion: 0.14
Nodes (20): KeyPair, ExtractSignatureInfo(), GenerateKeyPair(), PrivateKey, ParseDNSPublicKey(), ParsePrivateKey(), buildDKIMHeader(), canonicalizeBodyRelaxed() (+12 more)
### Community 15 - "Worker"
Cohesion: 0.10
Nodes (25): TLSARecord, Certificate, Context, Lookup(), VerifyPeerCertificate(), Discover(), Context, Duration (+17 more)
### Community 16 - "session"
Cohesion: 0.12
Nodes (14): Scope, state, Authenticate(), checkAppPassword(), DB, Config, Conn, Context (+6 more)
### Community 17 - "models.go"
Cohesion: 0.15
Nodes (13): Addressbook, Alias, AppPassword, Calendar, Contact, LinkedAccountAuthType, MailboxEntry, MFABackupCode (+5 more)
### Community 18 - "Store"
Cohesion: 0.07
Nodes (46): IMAPCredential, OAuth2Credential, keyCacheKey, MasterKey, Handler, multistatusResponse, propSet, LinkedAccount (+38 more)
### Community 19 - "uuidNew"
Cohesion: 0.25
Nodes (3): MTASTSPolicy, Stats, uuidNew()
### Community 20 - "oauth2.go"
Cohesion: 0.20
Nodes (10): Context, Reader, Request, Time, NewAuthedRequest(), truncate(), Config, Token (+2 more)
### Community 21 - "Go Web App No-Deps Pattern (skill)"
Cohesion: 0.21
Nodes (13): go-web-app-no-deps Packaged Skill (.skill zip), base.html Flask-style Block Layout, Template Block Bleeding Bug (ParseGlob shared namespace), Static Asset Cache-Busting via Version Query Param, Dark Tailwind CSS Custom-Property Palette, JS Function-in-Conditional Scoping Bug, No-Third-Party-Dependencies Principle, Go Web App No-Deps Pattern (skill) (+5 more)
### Community 22 - "GoMail Action Plan v4 Overview"
Cohesion: 0.21
Nodes (12): GoMail (referenced project), Wire-Format Structs Need Explicit Serialization Tags, cmd/e2etestN Disposable Test Pattern, GoMail Action Plan v4 Overview, Phase 5: IMAP/POP3/Auth, Phase 7: CalDAV/CardDAV, Phase 8: Webmail (JWT + REST API + SPA), Phase 9: JMAP Core/Mail Subset (+4 more)
### Community 23 - "QuarantineEntry"
Cohesion: 0.22
Nodes (3): QuarantineEntry, QuarantineStatus, Time
### Community 24 - "ical.go"
Cohesion: 0.24
Nodes (9): Event, escape(), FuzzParse(), F, Time, Parse(), splitProperty(), unescape() (+1 more)
### Community 25 - ".Run"
Cohesion: 0.29
Nodes (7): extractLeadingDigits(), Context, Duration, chatCompletionRequest, chatCompletionResponse, chatMessage, LLMStage
### Community 26 - "vcard.go"
Cohesion: 0.27
Nodes (8): escape(), FuzzParse(), F, Parse(), splitProperty(), unescape(), unfold(), Card
### Community 27 - "Phase 11: Admin Portal"
Cohesion: 0.29
Nodes (10): Admin Domain Creation Missing Tenant Fallback Bug, Admin User Creation Missing domain_id Bug, Phase 11: Admin Portal, Quarantine: Admin Global Discard vs Webmail Per-User Release, Domains CRUD (loadDomains/createDomain/rotateDkim/deleteDomain), Quarantine Discard (admin), Outbound Queue Actions (retry/cancel), List Rules CRUD (+2 more)
### Community 28 - "app.js"
Cohesion: 0.10
Nodes (56): accounts, acctQuery(), addPasskey(), api(), b64urlToBuf(), bodyOf(), boot(), bufToB64url() (+48 more)
### Community 29 - "Server"
Cohesion: 0.18
Nodes (11): Server, connHost(), Addr, Config, Context, DB, Duration, Limiter (+3 more)
### Community 30 - "Suggested Next Session Scope"
Cohesion: 0.25
Nodes (9): bufio.Reader + io.ReadFull for TCP Protocol Boundaries, Genuine EICAR Byte-Level ClamAV Verification, Phase 10: OAuth2 + Gmail/M365 Multi-Account, Phase 14: Optional External Services (ClamAV/Rspamd/LLM), Phase 15: Hardening + Deploy, Token-Bucket Per-IP Rate Limiter, Fake clamd Server TCP Over-Read Bug, Suggested Next Session Scope (+1 more)
### Community 32 - "checkSPF"
Cohesion: 0.40
Nodes (7): checkSPF(), evaluateSPF(), Context, IP, matchCIDR(), spfOutcome, SPFStage
### Community 33 - "Limiter"
Cohesion: 0.33
Nodes (5): Mutex, Limiter, Time, New(), bucket
### Community 34 - ".Run"
Cohesion: 0.36
Nodes (5): Context, Duration, rspamdResponse, RspamdStage, rspamdSymbol
### Community 35 - ".Run"
Cohesion: 0.39
Nodes (4): Context, Duration, parseClamAddr(), ClamAVStage
### Community 36 - ".Run"
Cohesion: 0.22
Nodes (7): dmarcTag(), extractDomainFromHeader(), Context, orgDomain(), Context, DMARCStage, HeaderStage
### Community 37 - "Core Principle: Compiles is Not Correct"
Cohesion: 0.33
Nodes (6): iterative-build-discipline Packaged Skill (.skill zip), Core Principle: Compiles is Not Correct, Disposable Real End-to-End Test Pattern, Genuinely-Enforcing Fake Protocol Server Pattern, Negative-Path Tests as Non-Optional, Verify Against Published Test Vectors (RFC 6238)
### Community 38 - "Phase 13: TLS + ACME + DANE/MTA-STS"
Cohesion: 0.47
Nodes (6): Phase 13: TLS + ACME + DANE/MTA-STS, Sandbox Network/Toolchain Constraints, Immediate First Steps Setup, DNS Setup (MX/SPF/DKIM/DMARC), GoMail (Self-Hosted Email Server), TLS / ACME Quick Setup
### Community 39 - "GraphAPIProvider"
Cohesion: 0.17
Nodes (14): GraphAPIProvider, graphDateTimeTZ, graphFolder, graphMessage, graphRecipient, Config, Contact, Context (+6 more)
### Community 40 - ".Run"
Cohesion: 0.47
Nodes (3): dedupe(), Context, URLStage
### Community 41 - "Phase 12: Auth Hardening (TOTP/App Passwords/Reset)"
Cohesion: 0.50
Nodes (5): SQLite Single-Connection-Pool Query/Exec Deadlock Pattern, Phase 12: Auth Hardening (TOTP/App Passwords/Reset), Rationale: Phase 13 Pulled Forward, ConsumeBackupCode SQLite Deadlock Bug, SQLite Query+Exec Deadlock Bug (documented)
### Community 44 - "MailContext"
Cohesion: 0.31
Nodes (5): Message, MessageVerdict, domainOf(), IP, MailContext
### Community 47 - "Shared api() Fetch Helper Convention"
Cohesion: 1.00
Nodes (3): Shared api() Fetch Helper Convention, api() fetch helper (admin), api() fetch helper (webmail)
### Community 65 - "dnssec.go"
Cohesion: 0.38
Nodes (15): DNSKEY, DS, Context, query(), resolvers(), rrsetOf(), rrsigsOf(), Validate() (+7 more)
### Community 66 - "totp.go"
Cohesion: 0.48
Nodes (6): decodeSecret(), Generate(), Time, hotp(), ProvisioningURI(), Validate()
### Community 67 - "StageResult"
Cohesion: 0.40
Nodes (4): CheckResult, MessageCheck, injectSpamHeaders(), StageResult
### Community 68 - "pipeline.go"
Cohesion: 0.40
Nodes (8): DefaultStages(), Config, Context, NewOrchestrator(), StagesFromConfig(), verdictFor(), Orchestrator, Stage
## Ambiguous Edges - Review These
- `Template Renderer (fresh-instance-per-page)``GoMail Admin SPA (index.html)` [AMBIGUOUS]
.claude/go-web-app-no-deps-SKILL.md · relation: conceptually_related_to
- `base.html Flask-style Block Layout``GoMail Webmail SPA (index.html)` [AMBIGUOUS]
.claude/go-web-app-no-deps-SKILL.md · relation: conceptually_related_to
- `Security Basics: CSRF/Path-Traversal/Atomic-Write/CSP``GoMail Admin SPA (index.html)` [AMBIGUOUS]
.claude/go-web-app-no-deps-SKILL.md · relation: conceptually_related_to
- `Security Basics: CSRF/Path-Traversal/Atomic-Write/CSP``GoMail Webmail SPA (index.html)` [AMBIGUOUS]
.claude/go-web-app-no-deps-SKILL.md · relation: conceptually_related_to
## Knowledge Gaps
- **33 isolated node(s):** `gomail`, `Contact`, `CalendarProvider`, `ContactProvider`, `gmailLabel` (+28 more)
These have ≤1 connection - possible missing edges or undocumented components.
- **18 thin communities (<3 nodes) omitted from report** — run `graphify query` to explore isolated nodes.
## Suggested Questions
_Questions this graph is uniquely positioned to answer:_
- **What is the exact relationship between `Template Renderer (fresh-instance-per-page)` and `GoMail Admin SPA (index.html)`?**
_Edge tagged AMBIGUOUS (relation: conceptually_related_to) - confidence is low._
- **What is the exact relationship between `base.html Flask-style Block Layout` and `GoMail Webmail SPA (index.html)`?**
_Edge tagged AMBIGUOUS (relation: conceptually_related_to) - confidence is low._
- **What is the exact relationship between `Security Basics: CSRF/Path-Traversal/Atomic-Write/CSP` and `GoMail Admin SPA (index.html)`?**
_Edge tagged AMBIGUOUS (relation: conceptually_related_to) - confidence is low._
- **What is the exact relationship between `Security Basics: CSRF/Path-Traversal/Atomic-Write/CSP` and `GoMail Webmail SPA (index.html)`?**
_Edge tagged AMBIGUOUS (relation: conceptually_related_to) - confidence is low._
- **Why does `User` connect `User` to `GmailAPIProvider`, `DB`, `session`, `session`, `Handler`, `session`, `writeErr`, `session`, `models.go`, `Store`?**
_High betweenness centrality (0.297) - this node is a cross-community bridge._
- **Why does `Store` connect `Store` to `User`, `GmailAPIProvider`, `session`, `Handler`, `session`, `Worker`, `Server`?**
_High betweenness centrality (0.105) - this node is a cross-community bridge._
- **Why does `DB` connect `DB` to `.GetContact`, `StageResult`, `.GetTLSCert`, `SieveScript`, `MailContext`, `CalendarObject`, `OutboundQueueEntry`, `models.go`, `uuidNew`, `QuarantineEntry`, `Domain`, `ListRule`?**
_High betweenness centrality (0.085) - this node is a cross-community bridge._
+12
View File
@@ -0,0 +1,12 @@
{
"runs": [
{
"date": "2026-08-09T13:36:33.949106+00:00",
"input_tokens": 134823,
"output_tokens": 0,
"files": 78
}
],
"total_input_tokens": 134823,
"total_output_tokens": 0
}
File diff suppressed because it is too large Load Diff
+432
View File
@@ -0,0 +1,432 @@
{
".claude/settings.json": {
"mtime": 1786281487.088728,
"ast_hash": "",
"semantic_hash": ""
},
"cmd/gomail/main.go": {
"mtime": 1786303371.9406705,
"ast_hash": "32c3d08429cc99b216f59edf3e0e4caa",
"semantic_hash": ""
},
"go.mod": {
"mtime": 1786304427.3009958,
"ast_hash": "4bbf418e44c141deba9e99f9d780ed9b",
"semantic_hash": ""
},
"internal/accounts/link.go": {
"mtime": 1786299069.1242821,
"ast_hash": "5eed8ecb5be6a1c35c6591dedad976d1",
"semantic_hash": ""
},
"internal/accounts/provider.go": {
"mtime": 1786303040.5896587,
"ast_hash": "7b4ccfea1a6fbad3e8b519a295cb520b",
"semantic_hash": ""
},
"internal/accounts/provider_gomail.go": {
"mtime": 1786297740.5829873,
"ast_hash": "ac0d507cba9953d85a44ce0506217587",
"semantic_hash": ""
},
"internal/accounts/provider_imap.go": {
"mtime": 1786298998.877657,
"ast_hash": "4825cd303e132e3179500afe0e9098bd",
"semantic_hash": ""
},
"internal/accounts/provider_smtp_helper.go": {
"mtime": 1786289886.1606128,
"ast_hash": "4fec96778cdaa94b1ab2264236af8b48",
"semantic_hash": ""
},
"internal/acme/challenge.go": {
"mtime": 1786189310.0,
"ast_hash": "ec3bcb998b34bc2c8a43cb8f3880e112",
"semantic_hash": "ec3bcb998b34bc2c8a43cb8f3880e112"
},
"internal/acme/client.go": {
"mtime": 1786189290.0,
"ast_hash": "830b78389d159a75e48f1a0076b6275b",
"semantic_hash": "830b78389d159a75e48f1a0076b6275b"
},
"internal/acme/jws.go": {
"mtime": 1786189220.0,
"ast_hash": "e5aa7cbbea33d9971f1577e4c976cb8c",
"semantic_hash": "e5aa7cbbea33d9971f1577e4c976cb8c"
},
"internal/acme/obtain.go": {
"mtime": 1786189332.0,
"ast_hash": "d2f78794831ad67ba64fb79cb7eb1c00",
"semantic_hash": "d2f78794831ad67ba64fb79cb7eb1c00"
},
"internal/admin/api.go": {
"mtime": 1786281901.2009063,
"ast_hash": "14fbb199cccd839edb6cf98392226b03",
"semantic_hash": "14fbb199cccd839edb6cf98392226b03"
},
"internal/admin/embed.go": {
"mtime": 1786188384.0,
"ast_hash": "55b64461208f9449c417bddf49e686cc",
"semantic_hash": "55b64461208f9449c417bddf49e686cc"
},
"internal/admin/handlers.go": {
"mtime": 1786281901.8545587,
"ast_hash": "06aad8456678b41905ac6787e50fb15a",
"semantic_hash": "06aad8456678b41905ac6787e50fb15a"
},
"internal/auth/auth.go": {
"mtime": 1786281903.3781548,
"ast_hash": "c74ed7b257b2272dcfb860b8a60746a0",
"semantic_hash": "c74ed7b257b2272dcfb860b8a60746a0"
},
"internal/config/config.go": {
"mtime": 1786289818.8781466,
"ast_hash": "68fd6f093c4ba00106bdbbe59786a269",
"semantic_hash": ""
},
"internal/crypto/crypto.go": {
"mtime": 1786297602.7221303,
"ast_hash": "8de4f9714d1c3e73a4322080d6b1a2ca",
"semantic_hash": ""
},
"internal/dav/dav.go": {
"mtime": 1786281900.5555487,
"ast_hash": "9dc713615ff99b713ad2879fca2b28dd",
"semantic_hash": "9dc713615ff99b713ad2879fca2b28dd"
},
"internal/db/bootstrap.go": {
"mtime": 1786281902.3275623,
"ast_hash": "922a08de72be0ef63409ed402d01e098",
"semantic_hash": "922a08de72be0ef63409ed402d01e098"
},
"internal/db/db.go": {
"mtime": 1786297548.1684437,
"ast_hash": "aed0290af4025c8c84089356f8746f08",
"semantic_hash": ""
},
"internal/db/migrations.go": {
"mtime": 1786300065.1340663,
"ast_hash": "2eb17b13bdc6bd5a954c82b4503aa8f9",
"semantic_hash": ""
},
"internal/db/models.go": {
"mtime": 1786300091.6301413,
"ast_hash": "12f132efac1ac74ab13ce8bfce0bfc69",
"semantic_hash": ""
},
"internal/db/queries.go": {
"mtime": 1786301261.1620972,
"ast_hash": "684ba8ac79df6845b0f0571ee6ff67a3",
"semantic_hash": ""
},
"internal/dkim/keys.go": {
"mtime": 1785566243.0,
"ast_hash": "e8d336df9cba3a8f69c70962f8a75579",
"semantic_hash": "e8d336df9cba3a8f69c70962f8a75579"
},
"internal/dkim/sign.go": {
"mtime": 1785472923.0,
"ast_hash": "ba6dd425f253aac61b386a8aea0d2061",
"semantic_hash": "ba6dd425f253aac61b386a8aea0d2061"
},
"internal/dkim/verify.go": {
"mtime": 1785472944.0,
"ast_hash": "4e58aca20a4874dac789bc0a844bfba6",
"semantic_hash": "4e58aca20a4874dac789bc0a844bfba6"
},
"internal/ical/ical.go": {
"mtime": 1785905665.0,
"ast_hash": "2de79f76c377508c20caa2e8683e920a",
"semantic_hash": "2de79f76c377508c20caa2e8683e920a"
},
"internal/ical/ical_fuzz_test.go": {
"mtime": 1786207598.0,
"ast_hash": "5518fd86059d729048685e2bc39c24b2",
"semantic_hash": "5518fd86059d729048685e2bc39c24b2"
},
"internal/imap/commands.go": {
"mtime": 1786294683.3800013,
"ast_hash": "584a4c4fa7ad664aaec36bc404825512",
"semantic_hash": ""
},
"internal/imap/parser.go": {
"mtime": 1785638411.0,
"ast_hash": "687b7788b077688b9081f958b669a0e6",
"semantic_hash": "687b7788b077688b9081f958b669a0e6"
},
"internal/imap/server.go": {
"mtime": 1786289824.8942587,
"ast_hash": "50a8a0f58edd9d9bb6cafa385f3c97b2",
"semantic_hash": ""
},
"internal/imap/session.go": {
"mtime": 1786281910.5246246,
"ast_hash": "f06bd7a253f498fbe197951537bc589e",
"semantic_hash": "f06bd7a253f498fbe197951537bc589e"
},
"internal/imap/tokenize_fuzz_test.go": {
"mtime": 1786207631.0,
"ast_hash": "4920db9f0c2beaa06a7393ab027d3c2b",
"semantic_hash": "4920db9f0c2beaa06a7393ab027d3c2b"
},
"internal/imapclient/client.go": {
"mtime": 1786169633.0,
"ast_hash": "f9671c971ff9f39a2ed82af7ed3e87df",
"semantic_hash": "f9671c971ff9f39a2ed82af7ed3e87df"
},
"internal/jmap/jmap.go": {
"mtime": 1786281904.3499777,
"ast_hash": "2484a0bccd56908627cee4c769b689e5",
"semantic_hash": "2484a0bccd56908627cee4c769b689e5"
},
"internal/mailstore/maildir.go": {
"mtime": 1786297713.2183998,
"ast_hash": "ca8749979e4a1ca9ada23c072945189c",
"semantic_hash": ""
},
"internal/managesieve/server.go": {
"mtime": 1786281899.3706038,
"ast_hash": "4ebc166b83227affe5171026b8012876",
"semantic_hash": "4ebc166b83227affe5171026b8012876"
},
"internal/managesieve/session.go": {
"mtime": 1786281899.9771776,
"ast_hash": "ab69e22b6add70fdb6c18f056c474e8d",
"semantic_hash": "ab69e22b6add70fdb6c18f056c474e8d"
},
"internal/oauth2/oauth2.go": {
"mtime": 1786298531.0961437,
"ast_hash": "4e1c7abbe92feb151acecfec03229c50",
"semantic_hash": ""
},
"internal/pipeline/pipeline.go": {
"mtime": 1786281906.8561504,
"ast_hash": "2b0b026fc13ce700c083960df7bc7857",
"semantic_hash": "2b0b026fc13ce700c083960df7bc7857"
},
"internal/pipeline/stage_clamav.go": {
"mtime": 1786281905.5831316,
"ast_hash": "6a5c073d349a49e2cbe75863945a663b",
"semantic_hash": "6a5c073d349a49e2cbe75863945a663b"
},
"internal/pipeline/stage_dkim.go": {
"mtime": 1786281908.573951,
"ast_hash": "3f92da867d5b128398a8ffc70b6fa475",
"semantic_hash": "3f92da867d5b128398a8ffc70b6fa475"
},
"internal/pipeline/stage_dmarc.go": {
"mtime": 1786294688.9970334,
"ast_hash": "fc9ece401684fb950771b70db7a54d9d",
"semantic_hash": ""
},
"internal/pipeline/stage_headers.go": {
"mtime": 1786281909.176789,
"ast_hash": "e7777ff0afde0baa97bd458060e7c002",
"semantic_hash": "e7777ff0afde0baa97bd458060e7c002"
},
"internal/pipeline/stage_llm.go": {
"mtime": 1786281906.2809672,
"ast_hash": "c0a1d11888d0f32083b0e90d32018ec1",
"semantic_hash": "c0a1d11888d0f32083b0e90d32018ec1"
},
"internal/pipeline/stage_rspamd.go": {
"mtime": 1786281907.8549173,
"ast_hash": "6b7c65df77472ef32c96782db5d98d07",
"semantic_hash": "6b7c65df77472ef32c96782db5d98d07"
},
"internal/pipeline/stage_spf.go": {
"mtime": 1786281916.382805,
"ast_hash": "7e1eda77e5ba190bc50dda977b0c3723",
"semantic_hash": "7e1eda77e5ba190bc50dda977b0c3723"
},
"internal/pipeline/stage_url.go": {
"mtime": 1786281905.1305835,
"ast_hash": "f954d508ac085f560928c06171779db5",
"semantic_hash": "f954d508ac085f560928c06171779db5"
},
"internal/pop3/pop3.go": {
"mtime": 1786289853.1900737,
"ast_hash": "e4756d72c5bc2bd89fd41a2205ca3d14",
"semantic_hash": ""
},
"internal/queue/queue.go": {
"mtime": 1786300256.943359,
"ast_hash": "5e9631b0601474ed28f3626a293e8e08",
"semantic_hash": ""
},
"internal/ratelimit/http.go": {
"mtime": 1786289690.9789355,
"ast_hash": "039681ec4aef1340ab4ba8bf83baa679",
"semantic_hash": ""
},
"internal/ratelimit/ratelimit.go": {
"mtime": 1786207185.0,
"ast_hash": "4d5bf0b77d390cf3e71abb4d022cf0aa",
"semantic_hash": "4d5bf0b77d390cf3e71abb4d022cf0aa"
},
"internal/sieve/interp.go": {
"mtime": 1786169049.0,
"ast_hash": "6f13e1891ef551ffebba37e759742aca",
"semantic_hash": "6f13e1891ef551ffebba37e759742aca"
},
"internal/sieve/lexer.go": {
"mtime": 1786168959.0,
"ast_hash": "3d8d9f9f203855eaf8d638935f65f7bb",
"semantic_hash": "3d8d9f9f203855eaf8d638935f65f7bb"
},
"internal/sieve/parser.go": {
"mtime": 1786168977.0,
"ast_hash": "cbcd550894b5c473a160481098151605",
"semantic_hash": "cbcd550894b5c473a160481098151605"
},
"internal/sieve/sieve_fuzz_test.go": {
"mtime": 1786207613.0,
"ast_hash": "fa017deb29e67fa5264e3ecc59ede127",
"semantic_hash": "fa017deb29e67fa5264e3ecc59ede127"
},
"internal/smtp/auth.go": {
"mtime": 1786281931.1489654,
"ast_hash": "9220929f9afd4b5b8c39ee7401ea3ecd",
"semantic_hash": "9220929f9afd4b5b8c39ee7401ea3ecd"
},
"internal/smtp/server.go": {
"mtime": 1786281931.153782,
"ast_hash": "30d88aa535f6ee39072f35fa6c1fd108",
"semantic_hash": "30d88aa535f6ee39072f35fa6c1fd108"
},
"internal/smtp/session.go": {
"mtime": 1786281931.1489654,
"ast_hash": "41aae3368dc4be4eba559f0d732e9a37",
"semantic_hash": "41aae3368dc4be4eba559f0d732e9a37"
},
"internal/tlsutil/acme_manager.go": {
"mtime": 1786281902.8497763,
"ast_hash": "5e7aa10c39162f5d95f927ba4efc30fb",
"semantic_hash": "5e7aa10c39162f5d95f927ba4efc30fb"
},
"internal/tlsutil/selfsigned.go": {
"mtime": 1786193053.0,
"ast_hash": "9c58f78ed11e4c7bf208306285f0b32e",
"semantic_hash": "9c58f78ed11e4c7bf208306285f0b32e"
},
"internal/totp/totp.go": {
"mtime": 1786193280.0,
"ast_hash": "48f2c9db1c1307f13d78726aa3b24f6a",
"semantic_hash": "48f2c9db1c1307f13d78726aa3b24f6a"
},
"internal/vcard/vcard.go": {
"mtime": 1785905650.0,
"ast_hash": "8b0043626bac3cacc11b6ce76259445b",
"semantic_hash": "8b0043626bac3cacc11b6ce76259445b"
},
"internal/vcard/vcard_fuzz_test.go": {
"mtime": 1786207583.0,
"ast_hash": "5aeab637a3c3357bb2c13cacc21508c6",
"semantic_hash": "5aeab637a3c3357bb2c13cacc21508c6"
},
"internal/webmail/api.go": {
"mtime": 1786303416.0629382,
"ast_hash": "c3894a16e34ac088b8e9922fa14c91c5",
"semantic_hash": ""
},
"internal/webmail/embed.go": {
"mtime": 1786295803.857812,
"ast_hash": "78663d0210a610d1777c4b4151390cf1",
"semantic_hash": ""
},
"internal/webtoken/webtoken.go": {
"mtime": 1786289648.699828,
"ast_hash": "b9be7cc5ea74ce6b82de79ef3644cb52",
"semantic_hash": ""
},
".claude/go-web-app-no-deps-SKILL.md": {
"mtime": 1786206554.0,
"ast_hash": "eb54ace954e819a069a9f1284485d213",
"semantic_hash": "eb54ace954e819a069a9f1284485d213"
},
".claude/go-web-app-no-deps.skill": {
"mtime": 1786206554.0,
"ast_hash": "de820100f8ad2da76d57884262c9f5f0",
"semantic_hash": "de820100f8ad2da76d57884262c9f5f0"
},
".claude/iterative-build-discipline-SKILL.md": {
"mtime": 1786206504.0,
"ast_hash": "d0e94862b77af5f6ac99c3f2668db3c9",
"semantic_hash": "d0e94862b77af5f6ac99c3f2668db3c9"
},
".claude/iterative-build-discipline.skill": {
"mtime": 1786206504.0,
"ast_hash": "87a25b626d37a9dfe5c037ae409fecad",
"semantic_hash": "87a25b626d37a9dfe5c037ae409fecad"
},
"CLAUDE.md": {
"mtime": 1786281487.0884602,
"ast_hash": "82efb97a359f5c7290bf2513d14686be",
"semantic_hash": "82efb97a359f5c7290bf2513d14686be"
},
"GOMAIL_HANDOVER.md": {
"mtime": 1786206496.0,
"ast_hash": "81fbcb0478fce27c6b6e8c6646eed44a",
"semantic_hash": "81fbcb0478fce27c6b6e8c6646eed44a"
},
"README.md": {
"mtime": 1786208021.0,
"ast_hash": "257dbe428b6a41b51d4d8efcd2431615",
"semantic_hash": "257dbe428b6a41b51d4d8efcd2431615"
},
"gomail-action-plan-v4.md": {
"mtime": 1786206496.0,
"ast_hash": "203046a9566fb3c392ed2e51aa178805",
"semantic_hash": "203046a9566fb3c392ed2e51aa178805"
},
"internal/admin/static/index.html": {
"mtime": 1786188708.0,
"ast_hash": "77b0b0e42cf45a961571ee5e3a3a219a",
"semantic_hash": "77b0b0e42cf45a961571ee5e3a3a219a"
},
"internal/webmail/static/index.html": {
"mtime": 1786302422.3206468,
"ast_hash": "240f0802126ee6142b639b0c3d1fd749",
"semantic_hash": ""
},
"internal/webmail/static/app.js": {
"mtime": 1786302477.0202506,
"ast_hash": "8b8643e290174bcaab0192971680383d",
"semantic_hash": ""
},
"internal/accounts/provider_gmailapi.go": {
"mtime": 1786303230.0544362,
"ast_hash": "991624e71e139cb871a1c549e7b2583a",
"semantic_hash": ""
},
"internal/accounts/provider_graphapi.go": {
"mtime": 1786303329.356412,
"ast_hash": "4c7aca4b1ab67e5629fdd094e59caae4",
"semantic_hash": ""
},
"internal/dane/dane.go": {
"mtime": 1786304412.353843,
"ast_hash": "077c045db0d9c08bcb1c91fda5f095ce",
"semantic_hash": ""
},
"internal/mtasts/mtasts.go": {
"mtime": 1786300014.9348822,
"ast_hash": "832952ea8843b31f4f8a01ffa3cfeb7f",
"semantic_hash": ""
},
"internal/webauthn/cbor.go": {
"mtime": 1786301093.0761018,
"ast_hash": "79612ad8167cf6a9e6e18977f1d90f0f",
"semantic_hash": ""
},
"internal/webauthn/webauthn.go": {
"mtime": 1786301194.5917418,
"ast_hash": "f9abf441c2637cdb4bdfd28b358417a3",
"semantic_hash": ""
},
"internal/dnssec/dnssec.go": {
"mtime": 1786338656.3355203,
"ast_hash": "0041911983b254c6ba9b78906f3055c3",
"semantic_hash": ""
}
}
+197 -170
View File
@@ -1,85 +1,96 @@
# Graph Report - . (2026-08-09)
# Graph Report - webmail (2026-08-10)
## Corpus Check
- 78 files · ~64,934 words
- 85 files · ~82,339 words
- Verdict: corpus is large enough that graph structure adds value.
## Summary
- 953 nodes · 2017 edges · 64 communities (48 shown, 16 thin omitted)
- Extraction: 91% EXTRACTED · 8% INFERRED · 0% AMBIGUOUS · INFERRED: 170 edges (avg confidence: 0.82)
- Token cost: 134,823 input · 0 output
- 1169 nodes · 2614 edges · 70 communities (52 shown, 18 thin omitted)
- Extraction: 92% EXTRACTED · 8% INFERRED · 0% AMBIGUOUS · INFERRED: 203 edges (avg confidence: 0.81)
- Token cost: 0 input · 0 output
## Graph Freshness
- Built from commit: `d7ca591b`
- Run `git rev-parse HEAD` and compare to check if the graph is stale.
- Run `graphify update .` after code changes (no API cost).
## Community Hubs (Navigation)
- TOTP & Web Token Auth
- ACME/JWS Client
- CalDAV/CardDAV Handlers
- IMAP Command Parser
- Mail Provider Abstraction
- Server Config & Bootstrap
- Sieve Filter Interpreter
- DB Mutation Queries
- IMAP Server Loop
- POP3 Server Loop
- JMAP Auth & Sessions
- SMTP Session Header Parsing
- Admin API Handlers
- IMAP Client
- DKIM Key Signing
- Outbound Delivery Queue
- SMTP Server Networking
- Linked Account & Alias Queries
- TCP Server Lifecycle
- Calendar/Contact/TLS Queries
- OAuth2 Config
- Go-No-Deps Web App Pattern
- GoMail Build Phases Overview
- Quarantine & Message Queries
- iCal Parsing & Fuzzing
- LLM Spam Stage
- vCard Parsing & Fuzzing
- Admin Portal Bugs & CRUD
- Spam Pipeline Orchestrator
- SPF Stage
- TCP Boundary & Rate-Limit Findings
- Domain/Tenant Queries
- Rspamd Stage
- Per-IP Rate Limiter
- ClamAV Stage
- DMARC Stage
- Spam Header Injection Stage
- Iterative Build Discipline Skill
- Deployment & DNS Setup
- HTTP Middleware
- URL Extraction Stage
- SQLite Deadlock Findings
- List Rule Queries
- Sieve Script Queries
- Mail Context Domain Helpers
- Calendar Object Queries
- Contact Queries
- Shared api() Fetch Convention
- Session Continuity Practices
- Scope Prioritization Practices
- DB Migrations
- Shared esc() Helper
- SPA Login/Logout
- SPA App Boot/Routing
- Graphify Project Rules
- Admin SPA Router
- Raw MIME Body Extractor
- Go Module Root
- User
- Client
- webauthn.go
- session
- GmailAPIProvider
- config.go
- parser
- DB
- session
- session
- Handler
- session
- writeErr
- Client
- Sign
- Worker
- session
- models.go
- Store
- uuidNew
- oauth2.go
- Go Web App No-Deps Pattern (skill)
- GoMail Action Plan v4 Overview
- QuarantineEntry
- ical.go
- .Run
- vcard.go
- Phase 11: Admin Portal
- app.js
- Server
- Suggested Next Session Scope
- Domain
- checkSPF
- Limiter
- .Run
- .Run
- .Run
- Core Principle: Compiles is Not Correct
- Phase 13: TLS + ACME + DANE/MTA-STS
- GraphAPIProvider
- .Run
- Phase 12: Auth Hardening (TOTP/App Passwords/Reset)
- gomail
- SieveScript
- MailContext
- CalendarObject
- OutboundQueueEntry
- Shared api() Fetch Helper Convention
- Checkpoint Working State as Durable Artifact
- Prioritize by Risk Reduction Over Task Order
- migration
- esc() HTML-escape helper (admin)
- login() (admin)
- showApp()/showLogin() (admin)
- graphify Project Rules
- showPage() router (admin)
- bodyOf() raw MIME body extractor
- ListRule
- .GetContact
- dnssec.go
- totp.go
- StageResult
- pipeline.go
- .GetTLSCert
## God Nodes (most connected - your core abstractions)
1. `DB` - 77 edges
2. `User` - 56 edges
3. `Handler` - 35 edges
4. `Store` - 27 edges
5. `session` - 25 edges
6. `session` - 25 edges
7. `writeJSON()` - 24 edges
8. `writeErr()` - 24 edges
9. `MasterKey` - 23 edges
10. `session` - 20 edges
1. `DB` - 81 edges
2. `User` - 67 edges
3. `Handler` - 50 edges
4. `writeErr()` - 36 edges
5. `writeJSON()` - 35 edges
6. `Store` - 28 edges
7. `api()` - 28 edges
8. `MasterKey` - 27 edges
9. `session` - 25 edges
10. `session` - 25 edges
## Surprising Connections (you probably didn't know these)
- `base.html Flask-style Block Layout` --conceptually_related_to--> `GoMail Webmail SPA (index.html)` [AMBIGUOUS]
@@ -101,176 +112,192 @@
- **Admin Portal CRUD Feature Set** — internal_admin_static_index_domains_crud, internal_admin_static_index_users_crud, internal_admin_static_index_rules_crud, internal_admin_static_index_queue_crud, internal_admin_static_index_quarantine [EXTRACTED 1.00]
- **Recurring Bug-Pattern Documentation Across GoMail Docs** — _claude_iterative_build_discipline_skill_sqlite_single_conn, gomail_handover_sqlite_deadlock_bug, gomail_action_plan_v4_sqlite_deadlock_bug, _claude_iterative_build_discipline_skill_tcp_read_pattern, gomail_handover_tcp_bug, gomail_action_plan_v4_tcp_bug [INFERRED 0.85]
## Communities (64 total, 16 thin omitted)
## Communities (70 total, 18 thin omitted)
### Community 0 - "TOTP & Web Token Auth"
### Community 0 - "User"
Cohesion: 0.10
Nodes (34): User, decodeSecret(), Generate(), GenerateSecret(), Time, hotp(), ProvisioningURI(), Validate() (+26 more)
Nodes (37): MailProvider, User, NewGoMailProvider(), GenerateSecret(), NewChallenge(), Config, DB, Duration (+29 more)
### Community 1 - "ACME/JWS Client"
### Community 1 - "Client"
Cohesion: 0.06
Nodes (31): AccountKey, Authorization, Challenge, ChallengeResponder, Client, directory, jwk, Order (+23 more)
### Community 2 - "CalDAV/CardDAV Handlers"
Cohesion: 0.08
Nodes (34): MailProvider, MasterKey, Handler, multistatusResponse, propSet, LinkedAccountProvider, Config, DB (+26 more)
### Community 2 - "webauthn.go"
Cohesion: 0.17
Nodes (16): cborDecode(), cborDecodeWithLength(), DecodePublicKey(), EncodePublicKey(), Time, ParseAttestationObject(), ParseAuthData(), parseCOSEKey() (+8 more)
### Community 3 - "IMAP Command Parser"
Cohesion: 0.06
Nodes (24): MailboxEntry, state, addFlag(), expandFetchItems(), extractHeaders(), flagsToIMAP(), session, indexOf() (+16 more)
### Community 3 - "session"
Cohesion: 0.11
Nodes (15): addFlag(), expandFetchItems(), extractHeaders(), flagsToIMAP(), session, indexOf(), matchesSearch(), parseSeqNum() (+7 more)
### Community 4 - "Mail Provider Abstraction"
Cohesion: 0.09
Nodes (25): Folder, FullMessage, GoMailProvider, IMAPCredential, IMAPProvider, ListOpts, MessageHeader, OAuth2Credential (+17 more)
### Community 4 - "GmailAPIProvider"
Cohesion: 0.07
Nodes (35): CalendarEvent, CalendarProvider, Contact, ContactProvider, Folder, FullMessage, GmailAPIProvider, gmailDateTime (+27 more)
### Community 5 - "Server Config & Bootstrap"
Cohesion: 0.09
Nodes (30): buildOAuthConfigs(), Config, main(), Config, DatabaseConfig, JMAPConfig, LinkedAccountsConfig, NotifyConfig (+22 more)
### Community 5 - "config.go"
Cohesion: 0.07
Nodes (36): buildOAuthConfigs(), Config, Handler, ipAllowlistMiddleware(), main(), Config, DatabaseConfig, JMAPConfig (+28 more)
### Community 6 - "Sieve Filter Interpreter"
### Community 6 - "parser"
Cohesion: 0.12
Nodes (20): evalTest(), execStatements(), Execute(), lookupHeader(), newLexer(), Parse(), FuzzParse(), F (+12 more)
Nodes (21): evalTest(), execStatements(), Execute(), lookupHeader(), newLexer(), Parse(), FuzzParse(), F (+13 more)
### Community 8 - "IMAP Server Loop"
### Community 8 - "session"
Cohesion: 0.12
Nodes (17): Config, Context, DB, Duration, Listener, WaitGroup, NewServer(), escapeQuoted() (+9 more)
### Community 9 - "POP3 Server Loop"
Cohesion: 0.15
Nodes (13): Config, Conn, Context, DB, Duration, Listener, ReadWriter, WaitGroup (+5 more)
### Community 9 - "session"
Cohesion: 0.13
Nodes (16): connHost(), Addr, Config, Conn, Context, DB, Duration, Limiter (+8 more)
### Community 10 - "JMAP Auth & Sessions"
Cohesion: 0.12
Nodes (20): Scope, Authenticate(), checkAppPassword(), DB, Context, DB, Request, ResponseWriter (+12 more)
### Community 10 - "Handler"
Cohesion: 0.19
Nodes (14): Context, DB, Request, ResponseWriter, ServeMux, jmapRole(), NewHandler(), splitCompositeID() (+6 more)
### Community 11 - "SMTP Session Header Parsing"
Cohesion: 0.16
Nodes (15): extractHeader(), extractHeaderMap(), extractMessageID(), extractSubject(), Conn, Context, IP, ReadWriter (+7 more)
### Community 11 - "session"
Cohesion: 0.09
Nodes (28): connHost(), Addr, Config, Conn, Context, DB, Duration, Limiter (+20 more)
### Community 12 - "Admin API Handlers"
### Community 12 - "writeErr"
Cohesion: 0.20
Nodes (14): filterDomainsByTenant(), Handler, DB, HandlerFunc, Request, ResponseWriter, ServeMux, NewHandler() (+6 more)
### Community 13 - "IMAP Client"
### Community 13 - "Client"
Cohesion: 0.15
Nodes (12): Client, FetchedMessage, FolderInfo, SelectedInfo, Dial(), Config, Conn, Duration (+4 more)
### Community 14 - "DKIM Key Signing"
### Community 14 - "Sign"
Cohesion: 0.14
Nodes (20): KeyPair, ExtractSignatureInfo(), GenerateKeyPair(), PrivateKey, ParseDNSPublicKey(), ParsePrivateKey(), buildDKIMHeader(), canonicalizeBodyRelaxed() (+12 more)
### Community 15 - "Outbound Delivery Queue"
Cohesion: 0.18
Nodes (11): backoffDuration(), domainOf(), DB, Duration, isPermanentError(), lookupMXHosts(), NewWorker(), Deliverer (+3 more)
### Community 15 - "Worker"
Cohesion: 0.10
Nodes (25): TLSARecord, Certificate, Context, Lookup(), VerifyPeerCertificate(), Discover(), Context, Duration (+17 more)
### Community 16 - "SMTP Server Networking"
Cohesion: 0.19
Nodes (14): connHost(), Addr, Config, Conn, Context, DB, Duration, Limiter (+6 more)
### Community 16 - "session"
Cohesion: 0.12
Nodes (14): Scope, state, Authenticate(), checkAppPassword(), DB, Config, Conn, Context (+6 more)
### Community 17 - "Linked Account & Alias Queries"
Cohesion: 0.14
Nodes (11): Alias, AppPassword, CheckResult, LinkedAccount, LinkedAccountAuthType, MessageCheck, MFABackupCode, ReleaseToken (+3 more)
### Community 17 - "models.go"
Cohesion: 0.15
Nodes (13): Addressbook, Alias, AppPassword, Calendar, Contact, LinkedAccountAuthType, MailboxEntry, MFABackupCode (+5 more)
### Community 18 - "TCP Server Lifecycle"
### Community 18 - "Store"
Cohesion: 0.07
Nodes (46): IMAPCredential, OAuth2Credential, keyCacheKey, MasterKey, Handler, multistatusResponse, propSet, LinkedAccount (+38 more)
### Community 19 - "uuidNew"
Cohesion: 0.25
Nodes (3): MTASTSPolicy, Stats, uuidNew()
### Community 20 - "oauth2.go"
Cohesion: 0.20
Nodes (11): Server, connHost(), Addr, Config, Context, DB, Duration, Limiter (+3 more)
Nodes (10): Context, Reader, Request, Time, NewAuthedRequest(), truncate(), Config, Token (+2 more)
### Community 19 - "Calendar/Contact/TLS Queries"
Cohesion: 0.19
Nodes (6): Addressbook, Calendar, OwnerType, Stats, TLSCert, uuidNew()
### Community 20 - "OAuth2 Config"
Cohesion: 0.23
Nodes (9): Context, Time, truncate(), WellKnownEndpoints(), XOAUTH2SASLString(), Config, Token, tokenResponse (+1 more)
### Community 21 - "Go-No-Deps Web App Pattern"
### Community 21 - "Go Web App No-Deps Pattern (skill)"
Cohesion: 0.21
Nodes (13): go-web-app-no-deps Packaged Skill (.skill zip), base.html Flask-style Block Layout, Template Block Bleeding Bug (ParseGlob shared namespace), Static Asset Cache-Busting via Version Query Param, Dark Tailwind CSS Custom-Property Palette, JS Function-in-Conditional Scoping Bug, No-Third-Party-Dependencies Principle, Go Web App No-Deps Pattern (skill) (+5 more)
### Community 22 - "GoMail Build Phases Overview"
### Community 22 - "GoMail Action Plan v4 Overview"
Cohesion: 0.21
Nodes (12): GoMail (referenced project), Wire-Format Structs Need Explicit Serialization Tags, cmd/e2etestN Disposable Test Pattern, GoMail Action Plan v4 Overview, Phase 5: IMAP/POP3/Auth, Phase 7: CalDAV/CardDAV, Phase 8: Webmail (JWT + REST API + SPA), Phase 9: JMAP Core/Mail Subset (+4 more)
### Community 23 - "Quarantine & Message Queries"
Cohesion: 0.15
Nodes (5): Message, MessageVerdict, QuarantineEntry, QuarantineStatus, Time
### Community 23 - "QuarantineEntry"
Cohesion: 0.22
Nodes (3): QuarantineEntry, QuarantineStatus, Time
### Community 24 - "iCal Parsing & Fuzzing"
### Community 24 - "ical.go"
Cohesion: 0.24
Nodes (9): Event, escape(), FuzzParse(), F, Time, Parse(), splitProperty(), unescape() (+1 more)
### Community 25 - "LLM Spam Stage"
### Community 25 - ".Run"
Cohesion: 0.29
Nodes (7): extractLeadingDigits(), Context, Duration, chatCompletionRequest, chatCompletionResponse, chatMessage, LLMStage
### Community 26 - "vCard Parsing & Fuzzing"
### Community 26 - "vcard.go"
Cohesion: 0.27
Nodes (8): escape(), FuzzParse(), F, Parse(), splitProperty(), unescape(), unfold(), Card
### Community 27 - "Admin Portal Bugs & CRUD"
### Community 27 - "Phase 11: Admin Portal"
Cohesion: 0.29
Nodes (10): Admin Domain Creation Missing Tenant Fallback Bug, Admin User Creation Missing domain_id Bug, Phase 11: Admin Portal, Quarantine: Admin Global Discard vs Webmail Per-User Release, Domains CRUD (loadDomains/createDomain/rotateDkim/deleteDomain), Quarantine Discard (admin), Outbound Queue Actions (retry/cancel), List Rules CRUD (+2 more)
### Community 28 - "Spam Pipeline Orchestrator"
Cohesion: 0.40
Nodes (8): DefaultStages(), Config, Context, NewOrchestrator(), StagesFromConfig(), verdictFor(), Orchestrator, Stage
### Community 28 - "app.js"
Cohesion: 0.10
Nodes (56): accounts, acctQuery(), addPasskey(), api(), b64urlToBuf(), bodyOf(), boot(), bufToB64url() (+48 more)
### Community 29 - "SPF Stage"
Cohesion: 0.40
Nodes (7): checkSPF(), evaluateSPF(), Context, IP, matchCIDR(), spfOutcome, SPFStage
### Community 29 - "Server"
Cohesion: 0.18
Nodes (11): Server, connHost(), Addr, Config, Context, DB, Duration, Limiter (+3 more)
### Community 30 - "TCP Boundary & Rate-Limit Findings"
### Community 30 - "Suggested Next Session Scope"
Cohesion: 0.25
Nodes (9): bufio.Reader + io.ReadFull for TCP Protocol Boundaries, Genuine EICAR Byte-Level ClamAV Verification, Phase 10: OAuth2 + Gmail/M365 Multi-Account, Phase 14: Optional External Services (ClamAV/Rspamd/LLM), Phase 15: Hardening + Deploy, Token-Bucket Per-IP Rate Limiter, Fake clamd Server TCP Over-Read Bug, Suggested Next Session Scope (+1 more)
### Community 32 - "Rspamd Stage"
Cohesion: 0.36
Nodes (5): Context, Duration, rspamdResponse, RspamdStage, rspamdSymbol
### Community 32 - "checkSPF"
Cohesion: 0.40
Nodes (7): checkSPF(), evaluateSPF(), Context, IP, matchCIDR(), spfOutcome, SPFStage
### Community 33 - "Per-IP Rate Limiter"
### Community 33 - "Limiter"
Cohesion: 0.33
Nodes (5): Mutex, Limiter, Time, New(), bucket
### Community 34 - "ClamAV Stage"
### Community 34 - ".Run"
Cohesion: 0.36
Nodes (5): Context, Duration, rspamdResponse, RspamdStage, rspamdSymbol
### Community 35 - ".Run"
Cohesion: 0.39
Nodes (4): Context, Duration, parseClamAddr(), ClamAVStage
### Community 35 - "DMARC Stage"
Cohesion: 0.39
Nodes (5): dmarcTag(), extractDomainFromHeader(), Context, orgDomain(), DMARCStage
### Community 36 - ".Run"
Cohesion: 0.22
Nodes (7): dmarcTag(), extractDomainFromHeader(), Context, orgDomain(), Context, DMARCStage, HeaderStage
### Community 36 - "Spam Header Injection Stage"
Cohesion: 0.33
Nodes (4): Context, injectSpamHeaders(), HeaderStage, StageResult
### Community 37 - "Iterative Build Discipline Skill"
### Community 37 - "Core Principle: Compiles is Not Correct"
Cohesion: 0.33
Nodes (6): iterative-build-discipline Packaged Skill (.skill zip), Core Principle: Compiles is Not Correct, Disposable Real End-to-End Test Pattern, Genuinely-Enforcing Fake Protocol Server Pattern, Negative-Path Tests as Non-Optional, Verify Against Published Test Vectors (RFC 6238)
### Community 38 - "Deployment & DNS Setup"
### Community 38 - "Phase 13: TLS + ACME + DANE/MTA-STS"
Cohesion: 0.47
Nodes (6): Phase 13: TLS + ACME + DANE/MTA-STS, Sandbox Network/Toolchain Constraints, Immediate First Steps Setup, DNS Setup (MX/SPF/DKIM/DMARC), GoMail (Self-Hosted Email Server), TLS / ACME Quick Setup
### Community 39 - "HTTP Middleware"
Cohesion: 0.33
Nodes (4): Handler, clientIP(), Limiter, Request
### Community 39 - "GraphAPIProvider"
Cohesion: 0.17
Nodes (14): GraphAPIProvider, graphDateTimeTZ, graphFolder, graphMessage, graphRecipient, Config, Contact, Context (+6 more)
### Community 40 - "URL Extraction Stage"
### Community 40 - ".Run"
Cohesion: 0.47
Nodes (3): dedupe(), Context, URLStage
### Community 41 - "SQLite Deadlock Findings"
### Community 41 - "Phase 12: Auth Hardening (TOTP/App Passwords/Reset)"
Cohesion: 0.50
Nodes (5): SQLite Single-Connection-Pool Query/Exec Deadlock Pattern, Phase 12: Auth Hardening (TOTP/App Passwords/Reset), Rationale: Phase 13 Pulled Forward, ConsumeBackupCode SQLite Deadlock Bug, SQLite Query+Exec Deadlock Bug (documented)
### Community 44 - "Mail Context Domain Helpers"
Cohesion: 0.50
Nodes (3): domainOf(), IP, MailContext
### Community 44 - "MailContext"
Cohesion: 0.31
Nodes (5): Message, MessageVerdict, domainOf(), IP, MailContext
### Community 47 - "Shared api() Fetch Convention"
### Community 47 - "Shared api() Fetch Helper Convention"
Cohesion: 1.00
Nodes (3): Shared api() Fetch Helper Convention, api() fetch helper (admin), api() fetch helper (webmail)
### Community 65 - "dnssec.go"
Cohesion: 0.38
Nodes (15): DNSKEY, DS, Context, query(), resolvers(), rrsetOf(), rrsigsOf(), Validate() (+7 more)
### Community 66 - "totp.go"
Cohesion: 0.48
Nodes (6): decodeSecret(), Generate(), Time, hotp(), ProvisioningURI(), Validate()
### Community 67 - "StageResult"
Cohesion: 0.40
Nodes (4): CheckResult, MessageCheck, injectSpamHeaders(), StageResult
### Community 68 - "pipeline.go"
Cohesion: 0.40
Nodes (8): DefaultStages(), Config, Context, NewOrchestrator(), StagesFromConfig(), verdictFor(), Orchestrator, Stage
## Ambiguous Edges - Review These
- `Template Renderer (fresh-instance-per-page)``GoMail Admin SPA (index.html)` [AMBIGUOUS]
.claude/go-web-app-no-deps-SKILL.md · relation: conceptually_related_to
@@ -282,9 +309,9 @@ Nodes (3): Shared api() Fetch Helper Convention, api() fetch helper (admin), api
.claude/go-web-app-no-deps-SKILL.md · relation: conceptually_related_to
## Knowledge Gaps
- **23 isolated node(s):** `webmail`, `IMAPCredential`, `DB`, `migration`, `response` (+18 more)
- **33 isolated node(s):** `gomail`, `Contact`, `CalendarProvider`, `ContactProvider`, `gmailLabel` (+28 more)
These have ≤1 connection - possible missing edges or undocumented components.
- **16 thin communities (<3 nodes) omitted from report** — run `graphify query` to explore isolated nodes.
- **18 thin communities (<3 nodes) omitted from report** — run `graphify query` to explore isolated nodes.
## Suggested Questions
_Questions this graph is uniquely positioned to answer:_
@@ -297,9 +324,9 @@ _Questions this graph is uniquely positioned to answer:_
_Edge tagged AMBIGUOUS (relation: conceptually_related_to) - confidence is low._
- **What is the exact relationship between `Security Basics: CSRF/Path-Traversal/Atomic-Write/CSP` and `GoMail Webmail SPA (index.html)`?**
_Edge tagged AMBIGUOUS (relation: conceptually_related_to) - confidence is low._
- **Why does `User` connect `TOTP & Web Token Auth` to `CalDAV/CardDAV Handlers`, `IMAP Command Parser`, `Mail Provider Abstraction`, `DB Mutation Queries`, `IMAP Server Loop`, `POP3 Server Loop`, `JMAP Auth & Sessions`, `SMTP Session Header Parsing`, `Admin API Handlers`, `Linked Account & Alias Queries`?**
_High betweenness centrality (0.323) - this node is a cross-community bridge._
- **Why does `Store` connect `CalDAV/CardDAV Handlers` to `TOTP & Web Token Auth`, `Mail Provider Abstraction`, `POP3 Server Loop`, `JMAP Auth & Sessions`, `Outbound Delivery Queue`, `SMTP Server Networking`, `TCP Server Lifecycle`?**
_High betweenness centrality (0.109) - this node is a cross-community bridge._
- **Why does `DB` connect `DB Mutation Queries` to `IMAP Command Parser`, `List Rule Queries`, `Sieve Script Queries`, `Calendar Object Queries`, `Contact Queries`, `Linked Account & Alias Queries`, `Calendar/Contact/TLS Queries`, `Quarantine & Message Queries`, `Domain/Tenant Queries`?**
_High betweenness centrality (0.098) - this node is a cross-community bridge._
- **Why does `User` connect `User` to `GmailAPIProvider`, `DB`, `session`, `session`, `Handler`, `session`, `writeErr`, `session`, `models.go`, `Store`?**
_High betweenness centrality (0.297) - this node is a cross-community bridge._
- **Why does `Store` connect `Store` to `User`, `GmailAPIProvider`, `session`, `Handler`, `session`, `Worker`, `Server`?**
_High betweenness centrality (0.104) - this node is a cross-community bridge._
- **Why does `DB` connect `DB` to `.GetContact`, `StageResult`, `.GetTLSCert`, `SieveScript`, `MailContext`, `CalendarObject`, `OutboundQueueEntry`, `models.go`, `uuidNew`, `QuarantineEntry`, `Domain`, `ListRule`?**
_High betweenness centrality (0.085) - this node is a cross-community bridge._
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
{"nodes": [{"id": "$graphify-root$_internal_webmail_embed_go", "label": "embed.go", "file_type": "code", "source_file": "internal/webmail/embed.go", "source_location": "L1"}], "edges": [{"source": "$graphify-root$_internal_webmail_embed_go", "target": "go_pkg_embed", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "internal/webmail/embed.go", "source_location": "L3", "weight": 1.0, "context": "import"}], "raw_calls": []}
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
{"nodes": [{"id": "$graphify-root$_internal_db_migrations_go", "label": "migrations.go", "file_type": "code", "source_file": "internal/db/migrations.go", "source_location": "L1"}, {"id": "db_migration", "label": "migration", "file_type": "code", "source_file": "internal/db/migrations.go", "source_location": "L7"}], "edges": [{"source": "$graphify-root$_internal_db_migrations_go", "target": "db_migration", "relation": "contains", "confidence": "EXTRACTED", "source_file": "internal/db/migrations.go", "source_location": "L7", "weight": 1.0}], "raw_calls": []}
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
{"nodes": [{"id": "pkg_gomail", "label": "gomail", "file_type": "code", "type": "package", "ecosystem": "go", "source_file": "go.mod", "source_location": "L1"}], "edges": [{"source": "pkg_gomail", "target": "pkg_github_com_google_uuid", "relation": "depends_on", "context": "dependency", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "go.mod", "source_location": "L1", "weight": 1.0}, {"source": "pkg_gomail", "target": "pkg_github_com_mattn_go_sqlite3", "relation": "depends_on", "context": "dependency", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "go.mod", "source_location": "L1", "weight": 1.0}, {"source": "pkg_gomail", "target": "pkg_golang_org_x_crypto", "relation": "depends_on", "context": "dependency", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "go.mod", "source_location": "L1", "weight": 1.0}, {"source": "pkg_gomail", "target": "pkg_gopkg_in_yaml_v3", "relation": "depends_on", "context": "dependency", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "go.mod", "source_location": "L1", "weight": 1.0}]}
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
{"nodes": [{"id": "$graphify-root$_internal_db_migrations_go", "label": "migrations.go", "file_type": "code", "source_file": "internal/db/migrations.go", "source_location": "L1"}, {"id": "db_migration", "label": "migration", "file_type": "code", "source_file": "internal/db/migrations.go", "source_location": "L7"}], "edges": [{"source": "$graphify-root$_internal_db_migrations_go", "target": "db_migration", "relation": "contains", "confidence": "EXTRACTED", "source_file": "internal/db/migrations.go", "source_location": "L7", "weight": 1.0}], "raw_calls": []}
@@ -0,0 +1 @@
{"nodes": [{"id": "pkg_gomail", "label": "gomail", "file_type": "code", "type": "package", "ecosystem": "go", "source_file": "go.mod", "source_location": "L1"}], "edges": [{"source": "pkg_gomail", "target": "pkg_github_com_google_uuid", "relation": "depends_on", "context": "dependency", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "go.mod", "source_location": "L1", "weight": 1.0}, {"source": "pkg_gomail", "target": "pkg_github_com_mattn_go_sqlite3", "relation": "depends_on", "context": "dependency", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "go.mod", "source_location": "L1", "weight": 1.0}, {"source": "pkg_gomail", "target": "pkg_github_com_miekg_dns", "relation": "depends_on", "context": "dependency", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "go.mod", "source_location": "L1", "weight": 1.0}, {"source": "pkg_gomail", "target": "pkg_golang_org_x_crypto", "relation": "depends_on", "context": "dependency", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "go.mod", "source_location": "L1", "weight": 1.0}, {"source": "pkg_gomail", "target": "pkg_gopkg_in_yaml_v3", "relation": "depends_on", "context": "dependency", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "go.mod", "source_location": "L1", "weight": 1.0}, {"source": "pkg_gomail", "target": "pkg_golang_org_x_mod", "relation": "depends_on", "context": "dependency", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "go.mod", "source_location": "L1", "weight": 1.0}, {"source": "pkg_gomail", "target": "pkg_golang_org_x_net", "relation": "depends_on", "context": "dependency", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "go.mod", "source_location": "L1", "weight": 1.0}, {"source": "pkg_gomail", "target": "pkg_golang_org_x_sync", "relation": "depends_on", "context": "dependency", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "go.mod", "source_location": "L1", "weight": 1.0}, {"source": "pkg_gomail", "target": "pkg_golang_org_x_sys", "relation": "depends_on", "context": "dependency", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "go.mod", "source_location": "L1", "weight": 1.0}, {"source": "pkg_gomail", "target": "pkg_golang_org_x_tools", "relation": "depends_on", "context": "dependency", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "go.mod", "source_location": "L1", "weight": 1.0}]}
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
{"nodes": [{"id": "$graphify-root$_internal_ratelimit_http_go", "label": "http.go", "file_type": "code", "source_file": "internal/ratelimit/http.go", "source_location": "L1"}, {"id": "ratelimit_limiter", "label": "Limiter", "file_type": "code", "source_file": "internal/ratelimit/http.go", "source_location": "L14"}, {"id": "ratelimit_limiter_httpmiddleware", "label": ".HTTPMiddleware()", "file_type": "code", "source_file": "internal/ratelimit/http.go", "source_location": "L14"}, {"id": "handler", "label": "Handler", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "$graphify-root$/internal/ratelimit/http.go"}, {"id": "$graphify-root$_internal_ratelimit_http_clientip", "label": "ClientIP()", "file_type": "code", "source_file": "internal/ratelimit/http.go", "source_location": "L30"}, {"id": "request", "label": "Request", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "$graphify-root$/internal/ratelimit/http.go"}], "edges": [{"source": "$graphify-root$_internal_ratelimit_http_go", "target": "go_pkg_net", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "internal/ratelimit/http.go", "source_location": "L4", "weight": 1.0, "context": "import"}, {"source": "$graphify-root$_internal_ratelimit_http_go", "target": "go_pkg_net_http", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "internal/ratelimit/http.go", "source_location": "L5", "weight": 1.0, "context": "import"}, {"source": "$graphify-root$_internal_ratelimit_http_go", "target": "go_pkg_strings", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "internal/ratelimit/http.go", "source_location": "L6", "weight": 1.0, "context": "import"}, {"source": "ratelimit_limiter", "target": "ratelimit_limiter_httpmiddleware", "relation": "method", "confidence": "EXTRACTED", "source_file": "internal/ratelimit/http.go", "source_location": "L14", "weight": 1.0}, {"source": "ratelimit_limiter_httpmiddleware", "target": "handler", "relation": "references", "confidence": "EXTRACTED", "source_file": "internal/ratelimit/http.go", "source_location": "L14", "weight": 1.0, "context": "parameter_type"}, {"source": "ratelimit_limiter_httpmiddleware", "target": "handler", "relation": "references", "confidence": "EXTRACTED", "source_file": "internal/ratelimit/http.go", "source_location": "L14", "weight": 1.0, "context": "return_type"}, {"source": "$graphify-root$_internal_ratelimit_http_go", "target": "$graphify-root$_internal_ratelimit_http_clientip", "relation": "contains", "confidence": "EXTRACTED", "source_file": "internal/ratelimit/http.go", "source_location": "L30", "weight": 1.0}, {"source": "$graphify-root$_internal_ratelimit_http_clientip", "target": "request", "relation": "references", "confidence": "EXTRACTED", "source_file": "internal/ratelimit/http.go", "source_location": "L30", "weight": 1.0, "context": "parameter_type"}, {"source": "ratelimit_limiter_httpmiddleware", "target": "$graphify-root$_internal_ratelimit_http_clientip", "relation": "calls", "context": "call", "confidence": "EXTRACTED", "source_file": "internal/ratelimit/http.go", "source_location": "L16", "weight": 1.0}], "raw_calls": [{"caller_nid": "ratelimit_limiter_httpmiddleware", "callee": "HandlerFunc", "is_member_call": false, "language": "go", "source_file": "internal/ratelimit/http.go", "source_location": "L15"}, {"caller_nid": "ratelimit_limiter_httpmiddleware", "callee": "Allow", "is_member_call": true, "language": "go", "source_file": "internal/ratelimit/http.go", "source_location": "L17"}, {"caller_nid": "ratelimit_limiter_httpmiddleware", "callee": "Header", "is_member_call": true, "language": "go", "source_file": "internal/ratelimit/http.go", "source_location": "L18"}, {"caller_nid": "ratelimit_limiter_httpmiddleware", "callee": "ServeHTTP", "is_member_call": true, "language": "go", "source_file": "internal/ratelimit/http.go", "source_location": "L22"}, {"caller_nid": "$graphify-root$_internal_ratelimit_http_clientip", "callee": "Get", "is_member_call": true, "language": "go", "source_file": "internal/ratelimit/http.go", "source_location": "L32"}, {"caller_nid": "$graphify-root$_internal_ratelimit_http_clientip", "callee": "Split", "is_member_call": false, "language": "go", "source_file": "internal/ratelimit/http.go", "source_location": "L33"}, {"caller_nid": "$graphify-root$_internal_ratelimit_http_clientip", "callee": "TrimSpace", "is_member_call": false, "language": "go", "source_file": "internal/ratelimit/http.go", "source_location": "L34"}, {"caller_nid": "$graphify-root$_internal_ratelimit_http_clientip", "callee": "SplitHostPort", "is_member_call": false, "language": "go", "source_file": "internal/ratelimit/http.go", "source_location": "L37"}]}
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+1 -1
View File
@@ -1 +1 @@
1786283404.4033368
1786338980.5170527
+1 -1
View File
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+12425 -2829
View File
File diff suppressed because it is too large Load Diff
+117 -77
View File
@@ -1,43 +1,43 @@
{
".claude/settings.json": {
"mtime": 1786281487.088728,
"ast_hash": "22d1c817e36c7eccf36bf30ee13299cc",
"semantic_hash": "22d1c817e36c7eccf36bf30ee13299cc"
"ast_hash": "",
"semantic_hash": ""
},
"cmd/gomail/main.go": {
"mtime": 1786281911.6889164,
"ast_hash": "6a50dc1a9b0161c4c030b51307ff92cf",
"semantic_hash": "6a50dc1a9b0161c4c030b51307ff92cf"
"mtime": 1786303371.9406705,
"ast_hash": "32c3d08429cc99b216f59edf3e0e4caa",
"semantic_hash": ""
},
"go.mod": {
"mtime": 1786281935.7638168,
"ast_hash": "38e6ab128168a0a88095fec4523f2992",
"semantic_hash": "38e6ab128168a0a88095fec4523f2992"
"mtime": 1786304427.3009958,
"ast_hash": "4bbf418e44c141deba9e99f9d780ed9b",
"semantic_hash": ""
},
"internal/accounts/link.go": {
"mtime": 1786281887.2038412,
"ast_hash": "4ffb8f5d3a6ac987d960c702f00f4e07",
"semantic_hash": "4ffb8f5d3a6ac987d960c702f00f4e07"
"mtime": 1786299069.1242821,
"ast_hash": "5eed8ecb5be6a1c35c6591dedad976d1",
"semantic_hash": ""
},
"internal/accounts/provider.go": {
"mtime": 1786168320.0,
"ast_hash": "4a180151e798601f43bda25bd1a80410",
"semantic_hash": "4a180151e798601f43bda25bd1a80410"
"mtime": 1786303040.5896587,
"ast_hash": "7b4ccfea1a6fbad3e8b519a295cb520b",
"semantic_hash": ""
},
"internal/accounts/provider_gomail.go": {
"mtime": 1786281891.3509514,
"ast_hash": "f0dd245cb144dca3f03520e632c1d5f5",
"semantic_hash": "f0dd245cb144dca3f03520e632c1d5f5"
"mtime": 1786297740.5829873,
"ast_hash": "ac0d507cba9953d85a44ce0506217587",
"semantic_hash": ""
},
"internal/accounts/provider_imap.go": {
"mtime": 1786281893.9837677,
"ast_hash": "99587258525acd5ab4b20398a2d0d400",
"semantic_hash": "99587258525acd5ab4b20398a2d0d400"
"mtime": 1786298998.877657,
"ast_hash": "4825cd303e132e3179500afe0e9098bd",
"semantic_hash": ""
},
"internal/accounts/provider_smtp_helper.go": {
"mtime": 1786281896.5890837,
"ast_hash": "188d01aeb8fe3fb73cb76a25ffda71b4",
"semantic_hash": "188d01aeb8fe3fb73cb76a25ffda71b4"
"mtime": 1786289886.1606128,
"ast_hash": "4fec96778cdaa94b1ab2264236af8b48",
"semantic_hash": ""
},
"internal/acme/challenge.go": {
"mtime": 1786189310.0,
@@ -80,14 +80,14 @@
"semantic_hash": "c74ed7b257b2272dcfb860b8a60746a0"
},
"internal/config/config.go": {
"mtime": 1786189702.0,
"ast_hash": "12cee16f6dcfa6971217dd104e86f4d6",
"semantic_hash": "12cee16f6dcfa6971217dd104e86f4d6"
"mtime": 1786289818.8781466,
"ast_hash": "68fd6f093c4ba00106bdbbe59786a269",
"semantic_hash": ""
},
"internal/crypto/crypto.go": {
"mtime": 1784360971.0,
"ast_hash": "4567100200969235fd1559ad9be6f1b1",
"semantic_hash": "4567100200969235fd1559ad9be6f1b1"
"mtime": 1786297602.7221303,
"ast_hash": "8de4f9714d1c3e73a4322080d6b1a2ca",
"semantic_hash": ""
},
"internal/dav/dav.go": {
"mtime": 1786281900.5555487,
@@ -100,24 +100,24 @@
"semantic_hash": "922a08de72be0ef63409ed402d01e098"
},
"internal/db/db.go": {
"mtime": 1784361005.0,
"ast_hash": "64d527aad454dab7867ffd51aa3d72ca",
"semantic_hash": "64d527aad454dab7867ffd51aa3d72ca"
"mtime": 1786297548.1684437,
"ast_hash": "aed0290af4025c8c84089356f8746f08",
"semantic_hash": ""
},
"internal/db/migrations.go": {
"mtime": 1786193366.0,
"ast_hash": "d67ddd29ab706ae5ce670da624e30b2c",
"semantic_hash": "d67ddd29ab706ae5ce670da624e30b2c"
"mtime": 1786300065.1340663,
"ast_hash": "2eb17b13bdc6bd5a954c82b4503aa8f9",
"semantic_hash": ""
},
"internal/db/models.go": {
"mtime": 1786193384.0,
"ast_hash": "cf35e391db47a84bd0b4e05ba77b9a95",
"semantic_hash": "cf35e391db47a84bd0b4e05ba77b9a95"
"mtime": 1786300091.6301413,
"ast_hash": "12f132efac1ac74ab13ce8bfce0bfc69",
"semantic_hash": ""
},
"internal/db/queries.go": {
"mtime": 1786193758.0,
"ast_hash": "c5f7a40030988031163220e54051b93d",
"semantic_hash": "c5f7a40030988031163220e54051b93d"
"mtime": 1786301261.1620972,
"ast_hash": "684ba8ac79df6845b0f0571ee6ff67a3",
"semantic_hash": ""
},
"internal/dkim/keys.go": {
"mtime": 1785566243.0,
@@ -145,9 +145,9 @@
"semantic_hash": "5518fd86059d729048685e2bc39c24b2"
},
"internal/imap/commands.go": {
"mtime": 1786281888.6448092,
"ast_hash": "e0a26bce9488a5d0bc680d5b11d15610",
"semantic_hash": "e0a26bce9488a5d0bc680d5b11d15610"
"mtime": 1786294683.3800013,
"ast_hash": "584a4c4fa7ad664aaec36bc404825512",
"semantic_hash": ""
},
"internal/imap/parser.go": {
"mtime": 1785638411.0,
@@ -155,9 +155,9 @@
"semantic_hash": "687b7788b077688b9081f958b669a0e6"
},
"internal/imap/server.go": {
"mtime": 1786281911.0781865,
"ast_hash": "13154da7fca4635077e377476aef64c8",
"semantic_hash": "13154da7fca4635077e377476aef64c8"
"mtime": 1786289824.8942587,
"ast_hash": "50a8a0f58edd9d9bb6cafa385f3c97b2",
"semantic_hash": ""
},
"internal/imap/session.go": {
"mtime": 1786281910.5246246,
@@ -180,9 +180,9 @@
"semantic_hash": "2484a0bccd56908627cee4c769b689e5"
},
"internal/mailstore/maildir.go": {
"mtime": 1786281898.3165317,
"ast_hash": "7224a5c029cdcdc63c0de93cb8a8eb51",
"semantic_hash": "7224a5c029cdcdc63c0de93cb8a8eb51"
"mtime": 1786297713.2183998,
"ast_hash": "ca8749979e4a1ca9ada23c072945189c",
"semantic_hash": ""
},
"internal/managesieve/server.go": {
"mtime": 1786281899.3706038,
@@ -195,9 +195,9 @@
"semantic_hash": "ab69e22b6add70fdb6c18f056c474e8d"
},
"internal/oauth2/oauth2.go": {
"mtime": 1786169607.0,
"ast_hash": "5ab8fd85a331f7f82470ee354e309ec4",
"semantic_hash": "5ab8fd85a331f7f82470ee354e309ec4"
"mtime": 1786298531.0961437,
"ast_hash": "4e1c7abbe92feb151acecfec03229c50",
"semantic_hash": ""
},
"internal/pipeline/pipeline.go": {
"mtime": 1786281906.8561504,
@@ -215,9 +215,9 @@
"semantic_hash": "3f92da867d5b128398a8ffc70b6fa475"
},
"internal/pipeline/stage_dmarc.go": {
"mtime": 1786281917.6531692,
"ast_hash": "2d73846ca47178c53a0ffb341b7d754e",
"semantic_hash": "2d73846ca47178c53a0ffb341b7d754e"
"mtime": 1786294688.9970334,
"ast_hash": "fc9ece401684fb950771b70db7a54d9d",
"semantic_hash": ""
},
"internal/pipeline/stage_headers.go": {
"mtime": 1786281909.176789,
@@ -245,19 +245,19 @@
"semantic_hash": "f954d508ac085f560928c06171779db5"
},
"internal/pop3/pop3.go": {
"mtime": 1786281909.7660527,
"ast_hash": "0e3685f20c9ca05d3a28729c8ad7a29f",
"semantic_hash": "0e3685f20c9ca05d3a28729c8ad7a29f"
"mtime": 1786289853.1900737,
"ast_hash": "e4756d72c5bc2bd89fd41a2205ca3d14",
"semantic_hash": ""
},
"internal/queue/queue.go": {
"mtime": 1786281808.0265675,
"ast_hash": "71c0ce0211d61d37f51f19678dbcdeb4",
"semantic_hash": "71c0ce0211d61d37f51f19678dbcdeb4"
"mtime": 1786300256.943359,
"ast_hash": "5e9631b0601474ed28f3626a293e8e08",
"semantic_hash": ""
},
"internal/ratelimit/http.go": {
"mtime": 1786207203.0,
"ast_hash": "c06b19193ad3c3159551966c05f48ea5",
"semantic_hash": "c06b19193ad3c3159551966c05f48ea5"
"mtime": 1786289690.9789355,
"ast_hash": "039681ec4aef1340ab4ba8bf83baa679",
"semantic_hash": ""
},
"internal/ratelimit/ratelimit.go": {
"mtime": 1786207185.0,
@@ -325,19 +325,19 @@
"semantic_hash": "5aeab637a3c3357bb2c13cacc21508c6"
},
"internal/webmail/api.go": {
"mtime": 1786281903.8315737,
"ast_hash": "3ccccaaef2a926a90919805f67173db2",
"semantic_hash": "3ccccaaef2a926a90919805f67173db2"
"mtime": 1786339172.9744284,
"ast_hash": "fcc1ddeb2d5f749bee23623529d76b73",
"semantic_hash": ""
},
"internal/webmail/embed.go": {
"mtime": 1786132251.0,
"ast_hash": "441b827ff1643c3807b6efb92119a721",
"semantic_hash": "441b827ff1643c3807b6efb92119a721"
"mtime": 1786295803.857812,
"ast_hash": "78663d0210a610d1777c4b4151390cf1",
"semantic_hash": ""
},
"internal/webtoken/webtoken.go": {
"mtime": 1786193462.0,
"ast_hash": "d94a2b905b20ccbd8a83e258245ba375",
"semantic_hash": "d94a2b905b20ccbd8a83e258245ba375"
"mtime": 1786289648.699828,
"ast_hash": "b9be7cc5ea74ce6b82de79ef3644cb52",
"semantic_hash": ""
},
".claude/go-web-app-no-deps-SKILL.md": {
"mtime": 1786206554.0,
@@ -385,8 +385,48 @@
"semantic_hash": "77b0b0e42cf45a961571ee5e3a3a219a"
},
"internal/webmail/static/index.html": {
"mtime": 1786132285.0,
"ast_hash": "3b77272b21933601eed33f3441d386cc",
"semantic_hash": "3b77272b21933601eed33f3441d386cc"
"mtime": 1786302422.3206468,
"ast_hash": "240f0802126ee6142b639b0c3d1fd749",
"semantic_hash": ""
},
"internal/webmail/static/app.js": {
"mtime": 1786338964.959641,
"ast_hash": "7905c891f2865aa88d99774efbad8c1d",
"semantic_hash": ""
},
"internal/accounts/provider_gmailapi.go": {
"mtime": 1786303230.0544362,
"ast_hash": "991624e71e139cb871a1c549e7b2583a",
"semantic_hash": ""
},
"internal/accounts/provider_graphapi.go": {
"mtime": 1786303329.356412,
"ast_hash": "4c7aca4b1ab67e5629fdd094e59caae4",
"semantic_hash": ""
},
"internal/dane/dane.go": {
"mtime": 1786304412.353843,
"ast_hash": "077c045db0d9c08bcb1c91fda5f095ce",
"semantic_hash": ""
},
"internal/mtasts/mtasts.go": {
"mtime": 1786300014.9348822,
"ast_hash": "832952ea8843b31f4f8a01ffa3cfeb7f",
"semantic_hash": ""
},
"internal/webauthn/cbor.go": {
"mtime": 1786301093.0761018,
"ast_hash": "79612ad8167cf6a9e6e18977f1d90f0f",
"semantic_hash": ""
},
"internal/webauthn/webauthn.go": {
"mtime": 1786301194.5917418,
"ast_hash": "f9abf441c2637cdb4bdfd28b358417a3",
"semantic_hash": ""
},
"internal/dnssec/dnssec.go": {
"mtime": 1786338656.3355203,
"ast_hash": "0041911983b254c6ba9b78906f3055c3",
"semantic_hash": ""
}
}