Canonical numbers — re-verified from source 2026-08-29, repo pinned 347329a
Seven lanes and the main agent produced conflicting counts. These are the resolved figures, each re-derived immediately before writing. The site and all future agents use these. Where a lane file disagrees, the lane file is wrong.
| Fact | Canonical | How derived | Wrong values seen | ||
|---|---|---|---|---|---|
| Schema tables | 56 | grep -cE '^ [a-z]+: defineTable' convex/schema.ts | 57 — counts the line-1 import { defineSchema, defineTable } | ||
| Pages | 39 | `find src/pages -name '*.tsx' \ | wc -l (38 flat + 1 in CreatorOnboarding/`) | 38 | |
| Convex modules | 36 | `ls convex/*.ts \ | grep -v tsconfig \ | wc -l, excludes _generated/` | 35, 37 |
| Gamification tables | 14 | grep -cE '^ gamification[A-Za-z]*: defineTable' | 13 (01-domains), 17 (04-lovable) | ||
Supabase importers in src/ | 39 | `grep -rl 'integrations/supabase/client' src/ \ | wc -l` | 43 (01-domains), ~70 (his CLAUDE.md) | |
…of those, in components/payroll/ | 15 | same grep scoped to that dir | 12 | ||
api.payroll.* consumers | 0 | grep -rn 'api\.payroll' src/ | — (payroll backend is a genuine orphan) | ||
| Public Convex functions | 221 | `^export const X = query\ | mutation\ | action(` → 73+132+16 | 456 — counted substring query(, matching ctx.db.query( |
| Internal Convex functions | 22 | same, `internalQuery\ | internalMutation\ | internalAction` → 8+9+5 | — |
ctx.auth/getUserIdentity in convex/ | 0 | grep -rc across all modules | — | ||
src/ LOC | 68,706 | `find src -name '.ts' \ | xargs wc -l` | — | |
convex/ LOC | 11,274 | same for convex/ | — | ||
| Tracked files | 622 | `git ls-files \ | wc -l` | — | |
.collect() calls | 166 | `grep -o '\.collect()' convex/*.ts \ | wc -l` | 165 | |
Rounding calls in convex/ | 2 | `grep -c 'Math.round\ | toFixed' — one in referralDemo.ts, one in paymentLog.ts` | — |
Settled contradictions
Contract token generation is CORRECT, not broken. 01-domains.md §4 called it broken; 03-security.md and the main agent both read convex/contracts.ts:6-10 and found crypto.getRandomValues over new Uint8Array(20) = 160 bits, unguessable. The security lane is right. Domain #8 maturity is real-and-working, not real, weak crypto.
Plaintext password line reference is convex/socialMediaLogins.ts:13, not :12 (:12 is username). The public query exposing it is :20; the schema field is convex/schema.ts:502. All three are correct as cited in 03-security.md and VERIFIED.
Scope caveat — the 17 domains are ~90% of the app, not 100%
Four clusters (~6.4k LOC) are named by no domain and must be flagged on the hub:
| Cluster | Paths | LOC |
|---|---|---|
| Creator directory/profile — the root entity of the CRM | Creators.tsx, CreatorProfile.tsx, components/creators/, convex/creators.ts | ~2.4k |
| Creators data | CreatorsData.tsx, components/creators-data/, convex/creatorData.ts | ~3.0k |
| Account settings | AccountSettings.tsx (413) | ~0.4k |
| Shared profile | components/profile/ | ~1.2k |
Recommendation: promote the creator directory to domain #18. It is the root entity every other domain hangs off, and it currently has the highest raw-LOC-per-unit-of-research in the repo.
Also confirmed absent
repo/.claude/skills/frontend-design — referenced at repo/CLAUDE.md:122 but never committed and not gitignored, so it lived only on Camron's machine. His aesthetic direction is not recoverable from the repo. Reconstructable proxies: the hand-appended brand (banana yellow hsl(54 100% 60%), tied to the gamification currency) and premium (dark purple-blue) palettes at repo/tailwind.config.ts:63-84, plus the four restyled UI primitives (button.tsx, toggle.tsx, LetsPlayButton.tsx, premium-button.tsx) — 15px radii, lift-on-hover, 300ms transitions.