$ Metrics
Real code-metrics history for this site’s own source (web/, api/, pieces/).
## METRICS
Real scc (Sloc Cloc and Code) snapshots, taken right before archiving every OpenSpec change — the same running history logged internally in docs/metrics.md, mirrored here. Not curated highlights: every snapshot this project has ever taken is below.
Files
287
Code lines
18,345
+1907 vs. previous snapshot
Complexity
1,044
+67 vs. previous snapshot
DRYness
56%
-2pt vs. previous snapshot
Code lines
Complexity
DRYness
2026-08-01 · experiments-record-pages
Fixed the redundant 'Experiments > Experiments' nav node and gave each of Atlas/Dispatch/Pulse/Credential Flow its own six-page submenu (Tech Stack, Architecture, Object Model, Design Notes, AI Notes, Setup Gallery), mirroring Work's existing project-record shape -- 24 new page.tsx files, plus three new Setup Gallery components (farpost-dispatch, farpost-pulse, and a credential-flow one migrated off the shared portfolio/SetupGallery.tsx). DRYness dipped 2 points (58% -> 56%), still comfortably above the 55% flag threshold -- expected given a large amount of genuinely new case-study prose (AI Notes and Design Notes are new writing for all four pieces, not reorganized content) rather than duplicated logic. File count reconciles to +27 from this change's own new files; the remaining +1 (web/src/app/contact/page.tsx) landed in an intervening commit that didn't get its own snapshot. Numbers already reflect this entry's own append.
2026-07-26 · dev-log-topics
Added a topic field one level above category on every Dev Log entry (fixed 5-value taxonomy), grew CODE_SHOWCASE_ENTRIES from 12 to 23 with 11 new entries carrying real final copy (3 about this project's own AI-assisted process, 8 drawn from existing docs/lightbulbs/*-dev-log-entry.md files, each graduated with a pointer note), gave /dev-log a single-select topic pill filter (TopicFilter.tsx), and capped DrawerNav's Dev Log submenu at the 5 most recent entries plus a View All link (capRecentEntries.ts). DRYness held flat (58% -> 58%). This delta is not purely dev-log-topics' own work: the previous mobile-chrome-redesign snapshot was logged before a separate batch of live post-archive tweaks that session (scroll-margin fix, click glow, per-anchor color strip, cursor-pointer additions -- see docs/handoff-2026-07-26-post-mobile-chrome-tweaks.md), which only edited already-existing files (globals.css, PageOutline.tsx, SectionHeader.tsx, Header.tsx, PillBar.tsx) and so added lines without adding files -- dev-log-topics itself never touched any of those five. File count still reconciles exactly against dev-log-topics' own 6 new files (TopicFilter.tsx, filterByTopic.ts, DevLogEntryList.tsx, capRecentEntries.ts, filterByTopic.test.ts, capRecentEntries.test.ts). Numbers already reflect this entry's own append.
2026-07-26 · mobile-chrome-redesign
Consolidated the mobile top bar into brand pill (left) + one 3-icon cluster (Account-or-Sign-In, Menu, Settings, right), replacing the old split hamburger-left/cog-right layout. The mobile nav is now a full-viewport takeover (fixed inset-0, no backdrop) instead of a narrow w-72 slide-in drawer, sharing open/close state between RightRail (trigger) and DrawerNav (panel) via a new MobileNavContext.tsx. The desktop right rail widened from xl:w-16 to xl:w-64; PageOutline dropped its createPortal click-to-open modal for a persistent inline anchor list, hidden below xl. The Account/Sign-In icon is now genuinely session-conditional everywhere via a data-signed-in attribute on <html>, toggled directly by session.ts's storeSession()/clearSession() and read live by new globals.css rules -- the same DOM-attribute pattern theme/font-scale/reduced-motion already use, since RightRail mounts once and never remounts on client-side nav. /account gained a real Sign Out button (AccountSignOut.tsx). Header.tsx's photo moved back to the right of the contact-info block, restoring resume-homepage's already-shipped spec. DRYness held flat (58% -> 58%); complexity dropped slightly (971 -> 968) since PageOutline lost its open-state/Escape-listener logic. File count reconciles exactly: 4 new files in web/src (MobileNavContext.tsx, AccountSignOut.tsx, session.test.ts, Header.test.tsx), no deletions. Numbers already reflect this entry's own append.
2026-07-25 · restructure-left-nav
Restructured the left nav: Metrics moved from Writing/Dev Log to /metrics under Site; Sreditor moved from Writing to Work with a from-scratch 10-page project-record submenu (sreditor-status.json, new); Farpost's and Vocare's submenus grew from 6 to 10 pages each via three new shared components (BugListSection.tsx, LightbulbsList.tsx, GlossaryList.tsx); Atlas/Dispatch/Pulse moved from Farpost's own pill-tab bar (FarpostTabBar.tsx, deleted) to a promoted-to-top-level Experiments group at /techstacks/*, with permanent redirects from every old /farpost/farpost-* URL; Dev Log's Code Showcase flattened from /dev-log/code-showcase/<slug> to /dev-log/<slug>, with the site-wide Bug Log/Testing & Verification/Glossary/Lightbulbs pages retired in favor of per-project equivalents. DRYness held flat (58% -> 58%). File count reconciles exactly: 22 new files minus 9 deleted = +13. Numbers already reflect this entry's own append.
2026-07-25 · site-settings-page
Built a real /settings page (Theme, Font Size, Reduced Motion sections) replacing its stub, moving the theme toggle out of RightRail.tsx entirely. New fontScale.ts/reducedMotion.ts utilities mirror theme.ts's exact storage-key + pure-resolve-function shape; a new SettingsBootstrap.tsx (mounted once in the root layout) applies all three persisted settings on every page load, replacing RightRail's own theme-only bootstrap effect. Reduced motion actually gates the site's two real animated elements: RightRail's slide transition (a scoped CSS rule keyed off a `.reduce-motion` class, not a JS-conditional className) and PageOutline's scrollIntoView (behavior read fresh at each click, since an explicit JS behavior option can't be overridden by CSS). theme-toggle.spec.ts's scenarios moved into a new settings.spec.ts (old file deleted) targeting /settings instead of the now-removed rail button. DRYness held flat (58% -> 58%). File count reconciles exactly against the corrected baseline above: +9 new files, -1 deleted (theme-toggle.spec.ts) = +8. Numbers already reflect this entry's own append.
2026-07-25 · page-outline-nav-correction
Caught independently while preparing the next snapshot (site-settings-page): re-ran scc against the exact pre-change commit and got 228 files / 17,173 lines / 15,128 code / 906 complexity / 10,030 ULOC, not the 227 / 17,077 / 15,068 / 898 / 9,864 logged above. DRYness percentage happened to round to the same 58% either way, and file/line/code/complexity/ULOC are all consistently off by a small, uniform amount -- consistent with one missed file, not a scan-scope error. Root cause not tracked down (the page-outline-nav session's own working tree no longer exists to diff against); logged as a correction rather than editing the prior entry in place, per this project's existing convention for this exact class of mistake (see docs/issues.md's sreditor-page-content and farpost-atlas-build corrections). The site-settings-page entry below uses this corrected number as its own 'previous' baseline.
2026-07-25 · page-outline-nav
Added an 'on this page' outline flyout (PageOutline.tsx -- client-side DOM scan of main h2[id], IntersectionObserver active-section tracking, Escape/backdrop/close-button dismissal matching SetupGallery's modal convention), a slugify/resolveUniqueSlug utility giving every SectionHeader a stable, collision-safe anchor id, a reorganized RightRail (mobile top bar down to just the cog; the shared rail gained Account and the outline trigger, final order Account -> Sign In -> theme toggle -> outline trigger), and a minimal /account stub page. DRYness held flat (58% -> 58%). Numbers already reflect this entry's own append.
2026-07-25 · services-payments
Added the first accounts and first payment-collecting code in this codebase: a passwordless magic-link account-auth module (app/accounts/), a Stripe billing module (app/billing/ -- StripeGateway, SubscriptionService, FulfillmentFeeService, the checkout/webhook/portal/fulfillment-fee routes), a seventh /services section (Troubleshooting & Questions) with a real Subscribe control, understated pricing copy on the other six sections, and 36 new pytest tests (real SQLite-backed persistence tests for Account/SignInToken/Subscription/FulfillmentFee, pure-function refund-math tests, and mocked-Stripe-SDK webhook-handler tests). DRYness held flat (58% -> 58%). Numbers already reflect this entry's own append.
2026-07-24 · left-nav-restructure
Restructured the left nav into a recursive collapsible tree (Work > Farpost/Vocare project-record submenus, Writing > Dev Log > Code Showcase nested three deep), added twelve new Farpost/Vocare project-record pages backed by two new per-silo status-data files, split Dev Log into a hub plus six real routes (Code Showcase now one route per article with UTC/Eastern timestamps), added a public Lightbulbs page, and renamed Tech/Stacks to Experiments. Also fixed a desktop header-content bleed-through bug, widened the center column below the xl breakpoint, moved the header photo to the left of its text, and replaced the default browser scrollbar with a near-background-color one. DRYness dipped 1 point (59% -> 58%), still comfortably inside the healthy band -- consistent with a large amount of genuinely new page content and a recursive nav component rather than duplicated logic.
2026-07-24 · site-drawer-nav
Replaced the hamburger dropdown and stacked light/dark toggle with a real, site-wide DrawerNav/RightRail (sticky on desktop, sliding drawer on mobile), grouped nav surfacing /ops/deploy for the first time, and a simplified Header re-pinned at its own scroll offset. Unlike prior snapshots, this count also includes same-session uncommitted exploratory work (the isolated /prototype/homepage-drawer mock) that scc can't distinguish from the shipped change -- the delta isn't attributable to site-drawer-nav alone. DRYness dipped 1 point (60% -> 59%), still well inside the healthy band.
2026-07-15 · services-page
Added a new /services route (six sections -- Web Sites, Web Applications, Native Applications, Platform, Hourly, Field Documentation -- behind the existing SectionFilterBar/PillBar/filterSections stack, no new filter infrastructure) plus a Services entry in the hamburger menu. DRYness held flat (60% -> 60%). Numbers already reflect this entry's own append.
2026-07-15 · page-feedback
Extracted contact.py's rate-limiter and Resend-sending logic into shared rate_limit.py/notify.py (contact.py now calls both, behavior unchanged), then added a site-wide feedback widget: a new FeedbackSubmission table, POST /feedback endpoint, FeedbackWidget.tsx (rendered from layout.tsx after {children}, self-excluding on /) backed by a pure feedback.ts + its Vitest suite. DRYness dipped 1 point (61% -> 60%), still well inside the healthy band. Numbers already reflect this entry's own append.
2026-07-15 · site-theme-toggle
Added a site-wide light/dark theme toggle: a new .dark CSS override block in globals.css, a blocking FOUC-avoidance script in layout.tsx, and a new ThemeToggle.tsx (lucide-react's Lightbulb, this site's first icon-library dependency) rendered below MenuToggle in Header.tsx, backed by a pure theme.ts + its Vitest suite. DRYness held flat (61% -> 61%). Numbers already reflect this entry's own append.
2026-07-15 · farpost-section-filter
Relocated filterSections.ts + SectionFilterBar.tsx (renamed from DevLogSectionFilter.tsx) out of components/dev-log/ into a shared path, added /farpost's own section-filter bar, and extracted a shared PillBar presentational component now used by TechStacksBrowser, SectionFilterBar, and /farpost. DRYness held flat (61% -> 61%). Numbers already reflect this entry's own append.
2026-07-15 · dev-log-code-showcase
Added the Code Showcase section (10 real Farpost code entries) plus a five-pill section-filter bar to /dev-log, and relocated the shared CodeBlock component out of components/ops/. DRYness held flat (61% -> 61%) despite the content growth. Numbers already reflect this entry's own append, avoiding the self-referential correction prior snapshots needed.
2026-07-12 · farpost-dispatch-build
First snapshot with real Apex — pieces/farpost-dispatch-sf/, a Salesforce DX project (object/field metadata, three Apex services with test classes, a Named Credential, a permission set, two LWCs) plus the rewritten /farpost/farpost-dispatch case-study page. DRYness dipped 1 point (metadata-heavy new piece, not duplication) — still well inside the healthy band. None of this Apex has been deployed or run; that's Robin's own next step.
2026-07-11 · page-chrome-simplification
Removed every local per-page HamburgerMenu and SectionHeader's anchor-id mechanic sitewide, added a Farpost intro blurb, made the header sticky at the lg breakpoint. Zero file-count change, a small net line decrease — deletions outweighed the small amount of new copy/className added back.
2026-07-11 · farpost-hub-nav-restructure
Method/Narrative restructured into Farpost hub, Sreditor top-level page, and a new Tech/Stacks index. Mostly a routing/content-relocation change (Atlas, Pulse, Credential Flow, Sreditor pages moved wholesale, not copied) plus two small new nav components — DRYness held exactly flat.
2026-07-11 · farpost-atlas-build
A whole new Python service (farpost-atlas-geo) plus a real Leaflet map on the frontend — real new surface area, not duplication. Corrected during a later drift audit: the originally-logged snapshot (8,630 lines, 61% DRYness) was captured before this same entry's own append to this file was reflected on disk — the same self-referential gap as the sreditor-page-content correction, smaller this time (12 lines, one DRYness point) since it's a within-entry growth, not a missing file.
2026-07-11 · sreditor-page-content
Content-only page rewrite, no new logic — the one new file counted here is web/src/data/metrics.json itself, which entered the scc scan path for the first time in this same commit when it was relocated out of docs/. Corrected during a later drift audit; the originally-logged snapshot (76 files) was captured before that relocation was reflected on disk.
2026-07-11 · dev-log-content
Flat again — mostly genuine new content (glossary/bug-log prose, dashboard markup), not logic.
2026-07-11 · add-automated-test-suites
DRYness held flat despite +269 code lines — real test files, not duplicated boilerplate.
2026-07-10 · project-page-parent-links
Flat, as expected — a two-line "Narrative" link added to two existing menus.
2026-07-10 · farpost-pulse-build
First snapshot to include pieces/ — Farpost Pulse's full build landed. Almost entirely new surface area, not duplication.
2026-07-10 · method-narrative-navigation
Essentially flat — a routing/index-page restructure, not new logic.
2026-07-10 · project-navigation-restructure
First snapshot — no prior baseline to diff against.
