Site analytics live
Connecting to GA4...
Could not reach GA4. Showing cached data.
AI Lab depth
Which pages actually hold attention, ranked by views · last 30 days
Page
Views
Avg. time on page
Sessions
Login Attempts — Security Watch
Every login attempt against Live Demo and Stats, logged server-side · last 30 days
Live Demo login
Loading…
Stats login
Loading…
Failed attempts (Stats passwords & rejected Live Demo emails)
Loading…
Business signal — identified visitor organizations
Resolved from the visitor's IP address, not from GA4 (Google strips IPs from its own API) · last 30 days
Works best for visitors on a corporate network. Someone browsing from home Wi-Fi or mobile data will usually resolve to their ISP, not their employer — greyed-out rows below are that case, read them as location only, not company identity.
Likely bot/crawler traffic (cloud/hosting/carrier ASNs — AWS, Google LLC, China Mobile, Level 3, etc.) is filtered out of this table entirely, not just greyed out.
Organization
Location
Pages
Days
Last visit
Signal
Loading…
Business email signups
Everyone who picked "business email (Live Demo)" on the login popup. Auto-granted full-tier access the instant they confirm, but only if their domain is on the approved list (.com / .com.br / .net / .us, excluding free/consumer webmail) — 2026-07-30. Anything else lands in the yellow "Needs review" state below until you approve it by hand.
Legit % is a heuristic (domain, name/company text, signup IP) flagging signups worth a second look — not a verdict, hover a badge for why it scored that way.
Name
Company
Email
Signed up
State
Legit %
Lang
Loading…
Free-email demo signups
Everyone who typed a free/consumer email (gmail, yahoo, etc.) into the Live Demo login — these are auto-granted the simulated tier the moment they confirm, so there's nothing to approve, just visibility into who confirmed vs. who dropped off.
Legit % here is the same heuristic as the business card, minus the checks that only make sense for a business signup — mostly catches fake-looking local-parts and lookalike domains (e.g. yahoo.net instead of yahoo.com).
Email
Signed up
State
Legit %
Lang
Loading…
More access requests
Whitelisted emails that ran out of Live Demo uses or budget, and clicked "request more access" on the exhausted-access message instead of just being turned away. Tier/uses shown are a snapshot from the moment they asked, so you can see how much they'd already used without opening the whitelist CSV.
Email
Requested
Tier
Uses at request
Loading…
Moderation flags
Every request the guardrails flagged, with the exact text that triggered it, next to the email that sent it. RED is profanity, hate speech or a system-manipulation attempt: blocked permanently and immediately, one strike out. AMBER is a yellow strike (rude or nonsense without profanity), which blocks that one request and becomes a permanent block on the 5th. Use the Unblock button on a blocked row to restore access in one click: it clears the block and resets that email's yellow strikes, but deliberately leaves their spend and remaining uses alone (those stay a manual edit in api/leads/access-whitelist.csv). Unblocks are logged here too, in teal.
Email
Flagged
Severity
What they typed
Loading…
Claude Change Log
Every badge bump, handoff note, GitHub commit, and new chat session Claude has logged for this project · newest first
Date
Event
Badge
Notes
2026-08-11
Format-limitation warning notice added to Obfuscation modal
v2.66→v2.67
Added an exclamation-mark forewarning notice right at the top of the Obfuscation modal, EN+PT, bulleted. Explains that in this version Glossary Ingestion only reads formats interpretable without an LLM call (no internet traffic, no Claude token cost) and that a future local-LLM version will widen this, then lists what is included (.mmd/.mermaid/.md/.markdown) versus what is not (images, .pdf, .drawio/.xml/.svg/.bpmn/.html, Office/other formats), noting the excluded formats still work normally in Production.
2026-08-11
Folder Ingestion built ($0 scope)
v2.65→v2.66
New Open Folder button next to Open File, enabled only in Ingestion mode, uses the browser's native folder picker to recursively scan for .mmd/.mermaid/.md/.markdown files (the same extensions the single-file upload path already treats as free), reusing the existing extraction and auto-detect logic. Deliberately excludes images, PDFs, drawio/svg/bpmn, and Office files since those require a real per-file Claude conversion call, keeping the $0 promise genuinely true.
2026-08-11
Reset Glossary control added
v2.64→v2.65
New Reset Glossary button inside the Glossary table modal, per Harding asking if he can reset it himself at any time: confirms, wipes the pairs array and localStorage, resets the code counter to 1, leaves one empty row. Also answered (not yet built) Harding's folder-ingestion agent idea: text-based diagram formats can be scanned at genuine no cost, but images, PDFs, and Office files would need a real per-file Claude conversion call first, which breaks the $0 framing, so his scope decision is needed before writing any code.
2026-08-11
Obfuscation modal copy corrected for honesty + readability
v2.63→v2.64
Four corrections from Harding's read-through: added a tagline right under the title explaining the word Obfuscation immediately, converted the Two modes paragraph into two labeled bullets, fixed a real honesty problem where the copy implied the app has LLM-level judgment about what is confidential (it doesn't, detection is a plain client-side pattern scan and the Glossary is user-curated), and added a concrete before/after example ("Acme Partner" becomes "C0035") plus a line clarifying the substitution is invisible to the user.
2026-08-11
Obfuscation modal reordered + new Ingestion flow diagram
v2.62→v2.63
Moved the Two modes explanation and the View/edit Glossary link to the top of the Obfuscation modal, ahead of the mechanics explanation, with a new lead-in downplaying setup time and previewing a planned folder-level auto-scan, plus a one-line segue into the section below. Delivered a new standalone SVG flowchart (images/2026/gs4d-ingestion-flow.svg) showing the Ingestion-to-Production loop with a decision diamond and a callout noting the Glossary never leaves the browser.
2026-08-11
Real Apply-lock bug fixed + hide-vs-dim policy corrected
v2.61→v2.62
Apply was still firing in Ingestion mode because other code re-enabled it after a file loaded, producing an actual charge. Fixed with a 400ms safety-net re-lock plus an immediate re-lock right after every diagram render, and fixed a related bug where repeated lock calls were overwriting the saved pre-lock state. Per Harding's correction ("never deface the app, only inactivate"), the cache pill, cost readout, and Claude response/summary block no longer hide via display:none in Ingestion mode, they now gray out with a new .gs4d-inactive class instead, same as every other locked control, also applied to the Lo-Fi/Hi-Fi toggle.
2026-08-11
Ingestion-mode locking fixed + Glossary table split into its own modal
v2.60→v2.61
Zoom, Node IDs, and both Copy to Clipboard buttons now stay usable in Ingestion mode since they don't touch Claude or cost anything; Apply, exports, saves, pan, fullscreen, and Lo-Fi/Hi-Fi stay locked. Cache pill, cost readout, and the whole Claude response/summary block now hide entirely in Ingestion mode rather than just disabling, since there is no real API call to describe. The Glossary pairs table moved out of the Obfuscation modal into its own dedicated modal with real column headers, reached via a new link/icon button, with a small plus icon at the end of the list instead of the old full-width Add pair button.
2026-08-11
Ingestao Glossario / Producao two-mode system replaces obfuscation ON/OFF
v2.59→v2.60
New "Glossary Ingestion ($0)" training mode locks the Apply prompt and every business-action button, and client-side scans opened diagrams (no LLM call, no cost) to propose candidate confidential terms for review. "Production" is normal working mode where the trained Glossary applies silently. Glossary, its code counter, and the last-chosen mode now persist to this browser's localStorage per Harding's instruction, replacing the prior session-only design. Obfuscation modal subtitle extended to explain the two modes, no em dashes.
2026-08-11
Copy rewrite: Obfuscation modal + softer Lo-Fi/Hi-Fi/cache explainers
v2.58→v2.59
Redaction Glossary modal retitled "Obfuscation" and rewritten from Harding's own PT-BR draft (translated to EN, both languages stored in PDC_PT_STRINGS). Lo-Fi/Hi-Fi and Cache Warm/Cold explainer modals softened to lead with the outcome instead of the mechanism, per Harding's request for less-technical, more value-focused copy. No em dashes anywhere in the new EN or PT text, per Harding's standing rule, caught mid-edit and fixed across the dictionary, the render functions, and the HTML's own English defaults.
2026-08-11
Deploy confirmed — cPanel AND git, v2.53→v2.58 batch
v2.53→v2.58
Commit 6393ba2, 10 files (367 insertions, 67 deletions), pushed clean to origin/main (b41a0b8..6393ba2). Swept in the entire uncommitted v2.53→v2.58 batch in one go, closing the git gap flagged across the last several handoffs. Four old-gold-* files deliberately left untracked (legacy backups). The obfuscation-toggle rendering as bare unstyled radios right after upload was traced to a stale Cloudflare cache, not a code defect — fixed by purging Cloudflare's cache, not by any file change.
2026-08-11
Feature added — obfuscation ON/OFF radio toggle, copy button repositioned
v2.57→v2.58
Replaced the eye/eye-off Redaction Glossary icon pair with a real enable/disable control: two mutually-exclusive radio pills ("obfuscation ON"/"obfuscation OFF", sunglasses icon) next to Open File, default ON. New obfuscationEnabled flag gates applyRedaction()/reverseRedaction() directly, so every existing call site in demo-editing.js/file-handling.js needed no changes. Editing the glossary's real→placeholder pairs moved to a small pencil-icon corner button on the toggle. Also moved the Mermaid copy-to-clipboard button out of the panel-header row into a floating overlay in the code editor's top-right corner, per Harding's screenshot -- zero header-row width now, same as the two info-button fixes below.
2026-08-11
Fix applied — icon size parity + corner-positioned info buttons
v2.56→v2.57
Open File/Log out icon glyphs bumped 15px→19px to visually match the Fullscreen button's 16px SVG (same 30px box, Tabler webfont ink coverage was the gap). The two "?" info buttons (Lo-Fi/Hi-Fi toggle, cache pill) no longer cost any row width -- each now lives in a new .info-btn-anchor wrapper and is position:absolute on the wrapper's corner instead of its own flex item. Note: this card's v2.51→v2.56 entries were never backfilled by the prior session (last row here was still v2.50) -- flagged to Harding, not backfilled in this pass since that history lives in CLAUDE.md's own Prior Status log already.
2026-08-10
Session closed — bare-minimum handoff note written
HANDOFF-2026-08-10-v2.50-session-close.md. Deliberately short per Harding's request: next session should only need to read CLAUDE.md (already current at v2.50), not this note. Lists just the genuinely open items -- sidebar nav GS4D rename decision, server-side PT-BR error-string gap, benchmark run not yet executed, Redaction Glossary backlog -- plus the still-unconfirmed git commit/push status.
2026-08-09
Bug found & fixed — four live-site PT-BR/UX fixes (footer, Apply button, placeholder, breadcrumb)
v2.49→v2.50
Four fixes from Harding's live-site review. (1) "Last Updated" footer wasn't translating to PT-BR and never re-rendered on language toggle -- fixed with a self-contained language check in sidebar.js plus a chain-safe hook into window.onCgLangChange. (2) The Apply button kept reverting to English: 6 separate call sites across ui-handlers.js, demo-editing.js, and api-client.js hardcoded the English literal whenever re-enabling it, including on ordinary page load -- all now route through pdcText('Apply ▶'). (3) The "tap LOAD to try the pre-set example" placeholder now only shows for guest/simulated-tier visitors; owner/business (full-tier) visitors see a different hint, since they can open a real file instead. (4) Breadcrumb renamed from "Talk to your Diagram (GS4D)" to "GS4D - Governance System for BPM Diagrams" (both EN and PT-BR), suffix (Live Demo / Pre-Scripted Demo) kept intact. Sidebar nav link text left unchanged -- flagged as an open question for Harding.
2026-08-09
Bug found & fixed — "Last Updated" footer overlapped content when sidebar collapsed
Root cause: .site-last-updated is intentionally position: fixed against the viewport (not .sidebar's own box), so collapsing the sidebar's width via the rail-toggle button (.sidebar.collapsed) had no effect on it -- the text kept floating in the same screen corner, now over whatever content had taken its place. Fixed with one rule: .sidebar.collapsed .site-last-updated { display: none; }. style.css only -- no version badge involved.
2026-08-09
Feature added — cache warm/cold + ingest mode + diagram ID now logged
v2.48→v2.49
Harding asked whether cache-warm-vs-cold cost, Lo-Fi/Hi-Fi mode, and diagram identity were being logged per call, for a benchmark matrix. Audit found no: real cache_creation_input_tokens/cache_read_input_tokens were computed for cost math in both proxies then merged away before reaching any log; knowledge-base.csv didn't exist on disk yet; ingest mode was only a success_bare suffix hack on imports, missing from Apply entirely; filename was never logged. Added 5 real columns (cache_write_tokens, cache_read_tokens, cache_status, ingest_mode, diagram_id) to the schema, updated all 15 knowledge_log_append() call sites across both proxies, and added ingest_mode/diagram_id to the Apply request (new for that endpoint). Logs going forward only -- the actual benchmark run across all 9 sample-diagrams/ files x 2 modes still needs to happen once this ships.
2026-08-09
Feature added — "Last Updated" footer made site-wide
v2.47→v2.48
Harding: "It is site-wide information" -- not analytics.html-specific. Moved the CSS from a page-local rule into style.css (loaded on every page) and the date logic from a page-local script reading analytics.html's own Change Log DOM into sidebar.js (also loaded everywhere), now fetching a single shared api/last-updated.txt. Added the #siteLastUpdated div to every page's sidebar (14 pages plus this one, process-diagram-converter.html, and the diagrams-as-code.html partial). Any future page just needs that one div to opt in.
2026-08-09
Bug found & fixed — "Last Updated" footer wasn't visible
Harding reported still not seeing it. Root cause: it was position: absolute against .sidebar, assuming .sidebar always has a fixed full-height box -- true on desktop, but style.css has a third .sidebar rule inside @media (max-width: 768px) that drops position to relative and height to auto, collapsing the containing block to just the menu list's height. Below that breakpoint bottom: 14px no longer anchored to the screen bottom at all. Fixed by switching to position: fixed against the viewport instead, so it's pinned to the actual bottom-left corner regardless of .sidebar's box model; hidden below 768px since the mobile sidebar has no stable "lower left" to pin it to there.
2026-08-09
Design iteration — pan button icon, second pass
v2.46→v2.47
v2.46's corner badge chip next to a default-size hand read as "noisy" per Harding. Presented two redesign directions; Harding picked "larger hand, arrows centered inside." Hand bumped to 19px, ti-arrows-move badge moved from the corner to a small centered circle sitting directly on the palm. Same active-state color swap as v2.46.
2026-08-09
Feature added — pan button icon upgraded (hand + move arrows)
v2.45→v2.46
Per Harding's follow-up ask for "graphic options for panning instead of a hand." Presented 4 directions; Harding picked a custom combo — keep the hand, add small move arrows. Kept the emoji and added a small ti-arrows-move badge chip in the button's corner (white-on-orange, flips orange-on-white when active). Chose this over a hand-drawn custom SVG or bumping the site's Tabler icon CDN from 2.47.0 to 3.x — confirmed hand-move/hand-grab aren't in the pinned 2.47.0 build, and a major CDN bump would touch every icon sitewide for one button.
2026-08-09
Feature added — language (BR/EN) registered alongside signup email
v2.44→v2.45
Per Harding: "they all must comply to the presumed language now... we should register language 'BR' or 'EN' next to the email that was used to REGISTER." api-client.js now sends language: 'BR'|'EN' with every signup, demo-gate.php/demo-gate-helpers.php store it (refreshed on resubmit, blank for legacy rows), leads-pending.php/leads-free-domain.php expose it, and both signup tables here now show it as a blue EN / teal BR / grey unknown badge in a new Lang column. Same capture-on-submit pattern already used for account_type/first_name/company_name.
2026-08-09
Bug found & fixed — remaining 4 popups now PT-BR aware
v2.43→v2.44
Fixed the same translate.js-unreachable-overlay gap on #optInfoOverlay, #aiNoticeOverlay (EU AI Act disclosure, translated faithfully), #vsdxNoticeOverlay, and the guardrail popup's OK button + all 9 title strings. Per Harding: "they all must comply to the presumed language now." Still open: the guardrail popup's message body text comes from PHP with no language awareness at all -- separate, bigger gap.
2026-08-09
Bug found & fixed — Business Signal stuck on "Not yet resolved"
Root cause: ipapi.co's free tier throttled this site's shared-hosting IP (their own FAQ confirms free-tier calls get heuristically restricted), so every live lookup since ~Aug 4 failed outright with nothing to cache, unlike the pre-existing 15-per-load cap which would still trickle results through. Added geojs.io as an automatic fallback in ip_org_fetch_live() — already trusted elsewhere on the site (api/geo.php). Per Harding's choice among switch-provider / pay-for-ipapi / diagnose-further.
2026-08-09
Feature added — sitewide "Last Updated" footer
New #siteLastUpdated in the Stats sidebar, lower-left, well below the Stats nav item per Harding's placement request. Self-maintaining: reads the date off the newest row in this very Change Log card rather than being hand-updated in a second place, so it reflects the latest change anywhere on callgenix.com (including GS4D), not just this page's data.
2026-08-09
Bug found & fixed — PT-BR gap on cache popup
v2.42→v2.43
Root cause: #cacheInfoOverlay (and 4 other popups) sit outside both of translate.js's translation regions, so switching to PT-BR never reached them. Fixed with a new applyCacheInfoOverlayLang() render function hooked into the existing PDC_PT_STRINGS translation chain. The other 4 overlays have the same gap, not yet fixed.
2026-08-09
Content rewrite — Cache Warm/Cache Cold popup
v2.41→v2.42
Rewrote #cacheInfoOverlay from a neutral explanation into direct, results-oriented coaching per Harding's request: three imperative headings telling the visitor exactly what to do to pay less (group imports inside the 60-minute window, run a warm-up import before a batch, avoid spreading single imports across the day). HTML content only, no JS/CSS touched. Not yet uploaded to cPanel or committed.
2026-08-07
Session closed — final handoff note written
HANDOFF-2026-08-07-v2.41-final-session-close.md written as the true end-of-day state (supersedes the earlier v2.40 note, written before the popup split and GitHub commit happened). Confirms no open deploy/commit gaps — cPanel and GitHub both current as of this entry. Next session is a genuine clean-slate checkpoint.
2026-08-07
GitHub commit — v2.28→v2.41 batch pushed live
Commit abac904 (10 files, 666 insertions, 42 deletions), pushed clean to origin/main. Covers everything from the original prompt-caching/Bare-Rich work through this session's popup split — the whole arc was sitting uncommitted until this push. Server's git status confirmed clean afterward except the four intentional, untracked old-gold-* backup files.
2026-08-07
Feature — explainer popup split in two + simplified
v2.40→v2.41
Per Harding: the shared #optInfoOverlay mixed two different topics (Lo-Fi/Hi-Fi mode choice, and prompt caching) under one popup, and its "⚡ Time" section specifically belonged with caching, not the mode toggle. Split into two: #optInfoOverlay now covers only Lo-Fi/Hi-Fi, and a new #cacheInfoOverlay (wired to cacheStatusInfoBtn) covers only what "Cache Warm"/"Cache Cold" means. Both rewritten in plain, non-technical language for a Finance/Business reader — the original longer technical text is preserved permanently at kb/optInfoOverlay-full-text-archive-2026-08-07.html, archived BEFORE any rewrite per Harding's explicit request. Both popups also dropped their "Got it" button — clicking anywhere outside the modal box now closes it instead.
2026-08-07
Session closed — handoff note created
Full v2.29→v2.40 batch confirmed uploaded to cPanel by Harding. HANDOFF-2026-08-07-v2.40-session-close.md written as the single source of truth for the 11 fixes/features this session. GitHub commit + push for the whole batch scheduled as the first task next session; PENDING-DEPLOY.md updated to reflect the confirmed cPanel upload.
2026-08-07
Bug fixed — "Show original" + Log out wrapping after Apply
v2.39→v2.40
Harding caught it live after running an Apply: the panel-header row wrapped, dropping "Show original" and Log out to a second line. Root cause: enforcePanelHeaderMinWidth() only ever runs once, at login — but #versionToggleContainer ("Show original") only becomes visible after a successful Apply, and the cache-warmth pill only appears after a successful import, both well after that one-time measurement already ran. Same underlying class of bug as the v2.31/v2.38 header-wrap fixes, just triggered by a different pair of late-appearing elements. Fixed by re-calling enforcePanelHeaderMinWidth() from showVersionToggle() and updateCacheStatusPill() themselves, right when each one's content actually changes, instead of relying on the single login-time call to have anticipated everything that could ever show up in that row.
2026-08-07
Bug fixed — cache pill's bold colors were never actually applying
v2.38→v2.39
Harding repeated the same color-visibility feedback after v2.38's supposed fix, which was the tell: the v2.38 edit added the new bold .cache-status-pill.warm/.cache-status-pill.cold rules but never deleted the OLD low-opacity versions of those same selectors sitting right below them in app.css. Equal specificity, later in the cascade — the old faded teal/amber rules were winning and silently overriding the new orange-red/white-blue ones the entire time. Not a deploy or cache issue this time; deleted the leftover duplicate block.
2026-08-07
Feature — cache pill visibility + info-icon placement
v2.37→v2.38
Per Harding: (1) the ⓘ must sit OUTSIDE the cache-status pill as its own separate button, matching the Lo-Fi/Hi-Fi toggle's existing pattern (control + separate ⓘ) rather than being embedded in the pill's own text/click target — new #cacheStatusInfoBtn, and the pill itself is back to a pure status display, not a click target. (2) Both ⓘ buttons (toggle's and the new one) gained a real visible circular background (rgba(255,255,255,0.14)) — the old transparent glyph read as invisible against the dark header. (3) Cache pill colors made bold and saturated instead of a barely-visible low-opacity tint: warm is now solid orange-red (#C1440E, white text), cold is a pale white/blue mix (#DCEBFA, dark navy text) — both clearly pop against the dark panel instead of blending into it.
2026-08-07
Bug fixed — cache-warmth pill's "?" cursor wasn't clickable
v2.36→v2.37
Harding caught it live: hovering #cacheStatusPill correctly showed the "?" cursor (cursor:help) but clicking did nothing — its explanation only lived in the native title attribute (hover-and-wait, unreachable on touch at all). Made the pill genuinely clickable (and keyboard-operable: role="button" tabindex="0", Enter/Space), wired to the same openIngestModeInfo() splash modal the toggle's own ⓘ button opens, since caching is already explained there (Cost Savings section, v2.33). Cursor swapped to pointer to match the real behavior.
2026-08-07
Bug fixed — Apply/Reset row jumping from left to right
v2.35→v2.36
Harding caught it live, called it "disgruntled" UI: the Apply/Reset buttons sat flush-left while idle, then visibly jumped to flush-right the moment a prompt started Processing. Root cause: .prompt-footer used justify-content: space-between, and #statusIndicator toggles display:none/flex — with it hidden, the actions row was the only flex child (space-between collapses to flex-start for a single item); once the indicator appears, space-between shoves the two items to opposite edges. Fixed by anchoring the new .prompt-footer-actions wrapper to the right with its own margin-left:auto instead of relying on sibling count, so Apply/Reset now sit in the same flush-right spot whether the status indicator is showing or not — no more jump.
2026-08-07
Feature — Hi-Fi (Pro) toggle state redesigned
v2.34→v2.35
Per Harding: the default/unchecked Hi-Fi (Pro) state (gray outline, empty checkbox) read as "off"/disabled rather than as the deliberately-chosen default mode it actually is. Redesigned the toggle so both states are solid and affirmative and always show a ✓ — Hi-Fi (Pro) now solid brand blue, Lo-Fi (Saver) keeps its existing teal. The real checkbox stays in the DOM for keyboard/screen-reader support, just visually hidden via the standard accessible-custom-checkbox CSS technique; no JS or click-handling changes needed.
2026-08-07
Bug fixed — logged-in email rendering in ALL CAPS and truncated
v2.33→v2.34
Harding caught it live right after the email moved into the "User:" role-label (v2.32): .role-label sets text-transform: uppercase for its own label text, and text-transform is an inherited CSS property, so the email inherited it too and rendered the whole address in ugly, semantically-wrong caps. Added an explicit text-transform: none reset on .logged-in-email. Also widened its max-width 220px → 380px in the same fix — that cap was sized for the old, crowded panel-header row and was truncating addresses far earlier than the roomier .prompt-area row actually needs.
2026-08-07
Feature — cache-warmth pill + splash-modal clarifications
v2.32→v2.33
Per Harding, two clarifications after the Lo-Fi/Hi-Fi cost A/B: (1) new 🔥/❄️ #cacheStatusPill next to the toggle, a client-side estimate (session-scoped, via cg_last_import_call_ts) of whether the next import lands inside the import endpoint's 1-hour prompt-cache window or not, with the full explanation in its title tooltip (EN/PT-BR both via PDC_PT_STRINGS) — deliberately kept separate from the Lo-Fi/Hi-Fi toggle itself, since which mode is picked and whether the cache is warm are independent variables and folding them together would misattribute cache timing to the mode choice. (2) Splash modal (#optInfoOverlay) gained a new "Your diagram is never taken apart" section addressing a real integrity question Harding raised: both modes always produce structured Mermaid code, so .drawio/Visio/BPMN export and re-import work identically either way — Lo-Fi can only affect how precisely a label is read off a busy SVG, never whether the result reassembles into a real diagram. Cost Savings section also now states the caching discount is time-window-dependent, not toggle-dependent.
2026-08-07
Feature — toggle renamed, email relocated, language-dot shrunk
v2.31→v2.32
Batch of live feedback fixes. (1) Bare/Rich toggle renamed to Lo-Fi (Saver) / Hi-Fi (Pro) everywhere — label, tooltip, splash modal copy, PT-BR strings (Lo-Fi (Econômico) / Hi-Fi (Completo)), cost tooltip. (2) The logged-in email moved out of .panel-header entirely and into the "User:" role-label in .prompt-area — the header row was the recurring root cause of "Log out" wrapping (worse with each thing added to that row: Bare/Rich toggle, ⓘ button, longer PT-BR labels), and the role-label row has headroom the header never did. (3) The green PT-BR active-language dot (site-wide, style.css) shrunk from 12px to 6px with a smaller glow, both the live-state and the pre-JS/pending-state copies kept in sync per the file's own comment.
2026-08-07
Bug fixed — "Log out" wrapping off the panel-header row
v2.30→v2.31
Harding caught it live: as soon as a file loaded, the .panel-header row (Open File / Bare toggle / ⓘ / email / Log out) wrapped, dropping Log out out of view. Root cause: enforcePanelHeaderMinWidth() in js/api-client.js only ever measured header.scrollWidth, which suffers the exact same flaw the response-footer row had before its 2026-08-05 fix — once a flex-wrap row is already wrapped, scrollWidth just reports the wrapped box's width, not the width needed to fit on one line, so leftPanel's min-width could never grow past whatever caused the wrap. Adding the Bare/Rich toggle + ⓘ button (v2.28/v2.29) was enough to tip the row into wrapping. Fixed by summing each header child's own rendered width + gap (same wrap-independent technique already used for the footer), flattening the one #panelHeaderRightGroup wrapper div (version-toggle + Log out) by id rather than a generic flex check, since other header children like .ingest-mode-toggle are also display:flex but must stay measured as one intact control.
2026-08-07
Bug fixed — Bare-mode XML/BPMN import crash ("verdict is not defined")
v2.29→v2.30
Live-tested regression on v2.29: importing a .bpmn file with Bare mode on threw ReferenceError: verdict is not defined and failed the import. Root cause: js/file-handling.js declared const verdict inside the if (kind === 'xml') block in handleRealDiagramUpload(), but the Bare-mode SVG-rasterization check added in v2.28 reads verdict.kind further down in the same function, outside that block's scope. Fixed by hoisting let verdict = null; to the top of the function (same pattern already used for kind) and assigning it inside the block instead of re-declaring it. Rich mode was never affected (that branch never reads verdict outside the block).
2026-08-07
Feature added — Bare/Rich explainer splash modal
v2.28→v2.29
New #optInfoOverlay popup explaining prompt caching, SVG rasterization, and terser output in plain language, grouped under Security / Cost Savings / Time. Auto-opens the first time Bare is switched on each session (not on every click), reachable anytime after via a new ⓘ button next to the toggle. Includes an explicit "not a free lunch" caveat about the accuracy tradeoff, same honesty standard as the rest of this feature. Also logged the Redaction Glossary (obfuscating sensitive content before it reaches Claude) as the next major privacy backlog item in TODO.md — not built this session, just tracked.
2026-08-07
GitHub commit — v2.27 pushed live
Commit cc36e29 (10 files, 249 insertions, 24 deletions), pushed clean to origin/main. Landed the v2.27 batch below.
2026-08-07
Feature added + cost-ledger fix — prompt caching + Bare/Rich ingestion toggle
v2.27→v2.28
Finance-driven pass, triggered by Harding asking why one SVG ingestion cost $0.1316. Prompt caching turned on for both Claude endpoints (real Anthropic API feature, 1-hour TTL chosen since GS4D's real call volume is low/spaced-out and a 5-minute cache would mostly expire between calls) — paired with a cost-ledger fix so cache_creation/cache_read tokens are actually billed in the cost log instead of silently under-counted. New Bare/Rich ingestion toggle (default Rich): Bare mode asks Claude for a one-line summary instead of the itemized shape-count explanation (cuts output tokens, works for every format, no accuracy tradeoff) and, for SVG uploads specifically, rasterizes to a JPEG client-side before Claude ever sees the raw XML (image tokens are a fixed pixel-area cost regardless of diagram complexity) — flagged to Harding as a real accuracy-for-cost tradeoff (loses the "exact text labels" guarantee vector sources have), not a free win, and opt-in only. Also fixed a pre-existing stale "$2/$10 per M" cost tooltip (actual rate is $5/$25) found while touching this code.
2026-08-07
Bug batch fixed — fullscreen icon, PT-BR gaps, ROLES drag, GitHub save, BPMN/vsdx clarified
v2.26→v2.27
Five items from Harding's overnight testing pass. New feature: fullscreen toggle icon (real Fullscreen API on #appViewport, not a simulated F11 keypress — browsers block JS from firing hardware/chrome keys). Bug fixed: several JS-written strings (diagram placeholder, prompt placeholder, code-editor placeholder, "Waiting for prompt…") never got PT-BR translated — they're attribute values or get re-written by JS after translate.js's one-time snapshot, so the walker never reaches them; fixed with a small PDC_PT_STRINGS dictionary applied at each write site, re-run on translate.js's onCgLangChange hook. New feature: ROLES legend now has a drag handle (top grip bar) so it can be moved off the diagram it was blocking; position persists across re-renders in a module-level variable. Bug fixed — root cause of "Save to GitHub" failing: the SEED/Live-Demo diagram sets currentFormat = 'mermaid', but github-proxy.php's format map never had a MERMAID key — every SEED-path save 400'd as "Unknown format" before reaching GitHub, surfacing as a bare "❌ Save failed". Added the missing key + a proper CUSTM division prefix. Investigated, not changed: .vsdx/.bpmn staying disabled after pasting the pre-canned "sap-purchase-order.bpmn" sample into SEED — confirmed that demo file is itself authored as a Mermaid sequenceDiagram, not a flowchart, so the flowchart-only guardrail is correctly disabling both buttons, not a bug. Per Harding: left the guardrail as-is, reworded the disabled-button tooltip to explain why instead of rewriting the demo content or teaching the exporters to parse sequence diagrams. Documented in kb/formats-gs4d-can-ingest-and-transform.md.
2026-08-06
GitHub commit — catch-up commit landing full backlog
Commit f97fcb6 (31 files, 5526 insertions, 6402 deletions), pushed clean 3249bd9→f97fcb6 main. Landed the css/js modularization, api/email-share-proxy.php, and the backlog of page-level fixes (canonical tags, translate.js, sidebar.js, etc.) that had been live but uncommitted for several sessions. Also resolved the api/claude-proxy.php git-status mystery from the prior handoff (confirmed as the documented flowchart-elk duplicate-declaration fix + CREATION MODE addition, not suspicious).
2026-08-06
Handoff note created
HANDOFF-2026-08-06-cost-tally-anatomy-study-session-close.md — documented the git catch-up above, the unit-economics cost tally (avg $0.0655 real Claude cost per successful Apply vs. the proposed $6/50-ticket price, ~45% gross margin before Hotmart/Kiwify fees), and an anatomy→cost/BYOK/privacy-objection study, delivered as two standalone HTML reports (not saved into C:\CLAUDELAB).
2026-08-06
Handoff note updated
HANDOFF-2026-08-06-v2.26-vsdx-notice-and-session-close.md updated to mark both of its open items (the claude-proxy.php mystery, the v2.09→v2.26 GitHub commit) resolved, same session as the commit above.
2026-08-05
Handoff note created
HANDOFF-2026-08-05-v2.18-exporters-and-button-standardization.md — documented the full v2.11→v2.18 exporters-and-button-standardization arc for a fresh chat window. Flagged: btn-home removal left no working link back to callgenix.com from this page; nothing from this session uploaded to cPanel or committed yet.
2026-08-05
Feature completed + bug fixed — full button standardization sweep
v2.17→v2.18
Every action button now shares Apply's exact blue/height/font via one UNIFORM BUTTON SYSTEM CSS block, replacing amber/green/navy/light-gray/transparent drift. Read Aloud hidden (kept in DOM). Compare renamed “Diff” with a new icon. btn-home (house-icon link to callgenix.com) removed and replaced with a persistent copy-code button; a second persistent copy-diagram button added next to the Hand icon. Real pre-existing bug found and fixed: copyCodeBtn/copyDiagramBtn (added v2.13) started disabled in the HTML and were never enabled anywhere in the code — non-functional in production the whole time.
2026-08-05
Design iteration (superseded same session)
v2.15→v2.17
v2.16 amber pass and v2.17 white-outline pass on Export/Share/GitHub/Slack buttons, both superseded by v2.18's single uniform system before the session ended.
2026-08-05
Bug found + fixed — icon rendering root-caused
v2.13→v2.15
v2.14's icon-only markup never actually reached the page: every state-reset function (resetPanelForNewFile(), load-file reset, resetDemo()) hardcoded the old “Save to GitHub” text label, silently overwriting the new markup on every file load. Separately, ti-floppy-disk isn't a real Tabler icon name (correct: device-floppy). Fixed by centralizing every button's idle markup as shared constants in app-core.js and switching to inline SVG for guaranteed rendering regardless of the pinned Tabler CDN version. Slack now uses its real 4-color brand mark as inline SVG, since a webfont glyph can only ever be one color via currentColor.
2026-08-05
Feature added — icon-only redesign, first pass
v2.12→v2.13
Export buttons shortened to icon + extension (.drawio/.vsdx/.bpmn), GitHub/Slack shortened to arrow + logo, two new copy-to-clipboard buttons added above the code and diagram panels.
2026-08-05
Feature added — js-exporters.js rebuilt from scratch
v2.11→v2.12
Download for Visio and Export BPMN 2.0 had been dead buttons all session (deferred during the v2.09 modularization, never rebuilt). New standalone module has three real functions: downloadDrawio(), exportBpmn(), exportVsdx(), reusing diagramSourceMap + resolveMappingKeyToElements() from app-core.js/diagram-engine.js.
2026-08-04
Regression Testing Session 2 - H1 Auth & Cancel Button
v2.88
H1-AUTH-001: PASS — Free email login works correctly. Entered regression.test.user@gmail.com, clicked Continue, app progressed to email confirmation screen. H1-AUTH-002: PASS — Cancel button correctly navigates to /diagrams-as-code.html (home page) as intended behavior. Current live site still v2.88 (old monolithic version); modularized v2.09 files (7 JS modules + CSS) not yet deployed to cPanel. This testing is baseline verification on current production version. Full H1-H7 suite execution deferred pending deployment of v2.09 modularization and cache purge.
2026-08-04
Handoff note created (retroactive)
HANDOFF-2026-08-02-evening.md — backfilled the full 2026-08-02 evening thread (ROLES/NodeID fix, Tier 0.7, HTTP-500 outage/fix, Business Signal cleanup, BYOK/infra decisions, Tier 1 BPMN exporter) ahead of a fresh chat window. Also delivered a step-by-step BPMN testing tutorial in-chat.
2026-08-02
Real feature — Tier 1 client-side BPMN 2.0 XML exporter
v2.07→v2.08
New "Export BPMN 2.0" button. A fresh source-text parser reverse-walks the shape/edge vocabulary into real BPMN elements (task/gateway/start-end event/lane/data object/text annotation), reusing Tier 0.7's coordinate math. Documented simplification: message-flow edges export as plain sequence flows rather than a full multi-pool collaboration structure. Unverified against real BPMN tooling (Bizagi/Camunda) yet.
2026-08-02
Strategic decisions — BYOK deferred, infra migration declined
Resolved two open questions: (1) BYOK stays off until Claude token spend becomes a "good problem" — treated as marketing spend until then, since DGS has no commercial prospects yet; (2) staying on KnownHost rather than migrating to a VPS — current architecture doesn't block integrations (Claude/GitHub/Slack/geo-IP/translation/Aspose-GroupDocs all work via plain HTTPS from PHP), only self-hosting tools like bpmn-js or LibreOffice, which aren't worth the added sysadmin burden pre-PMF.
2026-08-02
CRITICAL bug fix — live HTTP 500
v2.07
The v2.07 upload broke the live page (PHP parse error, confirmed via error_log) because .html files here are PHP-processed and a literal XML-declaration string in the new .vsdx exporter was misread as a broken PHP tag. Fixed by splitting the string so it never appears intact in the raw file. Needs urgent re-upload to restore the live site.
2026-08-02
Real feature — Business Signal cleanup
cg_admin_exclude extended to the visitor-log/Business-Signal system (was GA4-only before) so Harding's own test visits stop showing as false "Buyer-lean" signals. New bot/datacenter-ASN filter (Amazon, Google LLC, China Mobile, Level 3, etc.) removes likely bot/crawler traffic from the Business Signal table entirely — display-only, not an edge block.
2026-08-02
Real feature — Tier 0.7 client-side .vsdx (Visio) exporter
v2.06→v2.07
New "Download for Visio" button, built entirely client-side with JSZip (no PHP proxy) reusing the same rendered-SVG coordinate math as the ROLES/NodeID tags. Generic rectangle/diamond shapes and straight connector lines only, not true BPMN typing. Unverified against real Visio — Harding has no Visio/M365 access yet to test with.
2026-08-02
Real feature — ROLES/NodeID visual-collision fix
v2.05→v2.06
Role code now bold/blue at 9px, node ID bold/teal at a smaller 7px, so the node ID no longer reads as part of the ROLES system. Added a "Node IDs" checkbox toggle next to the zoom controls, default checked. Confirmed the design with Harding before building.
2026-08-02
Handoff note created (mid-afternoon)
HANDOFF-2026-08-02-midafternoon.md — Tier 1 BPMN roadmap/market research, pivot toward a cheaper .vsdx path, SaaS architecture PDF review, and the full tier/redirect bug-fixing saga. Next up: Visio/.vsdx architecture, plus a new open question on BYOK vs. absorbing Claude cost for the first paying customer.
2026-08-02
Git push confirmed
verify-email.php (?mode=signin fix) and analytics.html's Change Log rows for today's tier-upgrade saga, confirmed uploaded and committed directly by Harding. Exact hash not pasted this session.
2026-08-02
Standing rule: chained git command
Harding asked for the upload+commit ritual as one single &&-chained copy-pasteable command from now on, instead of separate line-by-line steps. Same full detail every time, just the presentation changed.
2026-08-02
Fact confirmed: dashboard miscategorization
Tier fix worked, but harding.leite@callgenix.com still showed under Free-email signups here. Root cause: once whitelisted, demo-gate.php never touches mailing-list.csv again, so only a direct CSV edit (account_type column) fixes this card. Documented in kb/user-guide.md.
2026-08-02
Bug fix: verify-email.php redirect mode
Confirming an email link always redirected to Register mode (full tier+name+company form) instead of the lean Sign In form, even for an already-granted visitor. Fixed by appending ?mode=signin to both auto-grant redirect targets.
2026-08-02
GitHub/DevTools consultation
Diagnosed harding.leite@callgenix.com stuck on simulated/free tier despite a valid business domain — a wrong radio-button pick at signup, not a code bug. Walked Harding through api/admin-approve.php via a DevTools console fetch() to upgrade the whitelist row to full tier in place. New kb/user-guide.md entry added.
2026-08-02
New chat window
Session opened with READY TO BEGIN? for the Tier 1 BPMN spec.
2026-08-01
Handoff note created
End of session. Next: Tier 1 BPMN 2.0 XML exporter spec (Bizagi/Visio bridge), then Mermaid formatting for ROLES/vertex-ID legibility.
2026-08-01
Diagram Format Compendium built
New DIAGRAM-FORMAT-COMPENDIUM.md (Claude-guidance only): container vs. rendering formats, full format reference including HEIC, market-tool matrix (draw.io/Lucidchart/Bizagi/Visio), Tier 0/Tier 1 roadmap.
2026-08-01
Tier 0 draw.io bridge verified
v2.05
Harding round-tripped a real diagram (hexagon checkpoint, dashed retry loops, classDef style) through the new Copy button into draw.io desktop app. Rendered correctly on first real try.
2026-08-01
Copy for draw.io/Lucid button
v2.04→v2.05
Both tools read raw Mermaid natively, so this is a zero-cost clipboard copy. Wired through renderDiagram() so it stays in sync across every code-render path.
2026-08-01
Research: Visio/Bizagi/draw.io compatibility
draw.io/Lucidchart read Mermaid natively already. Visio has no native BPMN support at all. Bizagi natively imports BPMN 2.0 XML. Recommended Tier 0 (shipped) + Tier 1 (BPMN exporter, planned).
2026-08-11
Site-wide PT-text sweep
Closed the gap flagged in the previous row: the BR-flag-to-'PT'-text swap was only on process-diagram-converter.html. Swept all 14 remaining static pages + the shared partials/head-nav.php template so nothing shows a blank language button. No badge change.
2026-08-11
Single-file Ingestion + header rebrand + lang toggle standardized
v2.73→v2.74
Open File now feeds Glossary Ingestion directly for locally-readable formats (restores the original single-file workflow, folder scan was a later addition). Header title changed to fixed 'Diagram Studio - GS4D' (matches sidebar, no longer localized). Language toggle: BR flag icon replaced with plain 'PT' text; fixed the active pill visibly shifting up a few px (margin-bottom moved off the button onto the shared container). Gotcha: the PT-text fix only touched this page's markup -- other pages sharing style.css will show a blank BR button until updated the same way.
2026-08-11
Ingestion/Production toggle redesigned
v2.72→v2.73
Split the double-decker Glossary Ingestion / Production pill into two full stacked buttons (green/black), removed the tiny 11px glasses icon per Harding's follow-up -- color + text alone now carries the meaning.
2026-08-11
ZIP .vsdx gap closed
v2.71→v2.72
Glossary Ingestion can now read .vsdx (Visio) files locally -- unzips the OPC package with JSZip (already loaded for exportVsdx()), reads visio/pages/pageN.xml, pulls each Shape's <Text> label. Same $0/no-LLM guarantee as the .bpmn/.drawio/.svg path.
2026-08-11
Login overlay privacy fix
v2.70→v2.71
Unauthenticated visitors hitting process-diagram-converter.html?mode=signin (even in Private/Incognito) could see the full toolbar, feature set, and version badge behind the login modal. Replaced the shared 52%-black modal backdrop with a near-opaque, blurred backdrop scoped to #loginOverlay only.
2026-08-11
.mmd export + BPMN/drawio/SVG Ingestion parser
v2.69→v2.70
Added a "Download .mmd" export button and widened Glossary Ingestion's local, $0, no-LLM DOMParser-based parser to read .bpmn/.drawio/.svg shape labels, not just Mermaid source — closes the gap where sample-diagrams/ scanned to 0 new terms.
2026-08-11
Gotcha-marker + Ingestion diagnostics
v2.68→v2.69
Introduced the # "gotcha marker" convention for technically-correct-but-easy-to-misread messages. Folder-scan popup now separately reports files that matched by extension but had no usable content (filesNoContent), instead of silently lumping them into "0 new terms."
2026-08-01
Git push confirmed
312db86
.htaccess origin lock + Open File modal v1.99→v2.04 committed together (2 files, 122 insertions, 13 deletions). git status clean.
2026-08-01
Cloudflare-only origin lock
Apache Require ip / Allow-Deny block in .htaccess restricts public_html to Cloudflare's published IP ranges — chosen over CSF since Harding has cPanel admin only, not WHM/root, on this shared VPS. Verified: site loaded fine after upload.
2026-08-01
Open File modal: formats list + redesign
v1.99→v2.04
Added a visible accepted-formats list (ending several wording/color iterations per Harding's exact spec) and restructured the modal into two labeled sections: upload-your-own vs. pre-scripted demo.
2026-08-01
Cloudflare cutover verified + client-IP helper deployed
07a8661
Verification checklist passed (site load, showroom subdomain, email round-trip, live diagram conversion). Caught and fixed a real gap: analytics.html's org-name-from-IP table was stuck on "Not yet resolved" since the client-IP helper batch hadn't shipped yet.
2026-08-01
New chat window
Session opened with READY TO BEGIN?; ingested BPM Diagram-as-Code project knowledge and the 2026-08-01 Cloudflare-cutover handoff.
2026-07-31
Handoff note (evening)
End of a long session. Harding flagged Cloudflare (a new layer in front of the current frontend stack) as the next topic. Nothing scoped yet, see HANDOFF-2026-07-31-evening.md.
2026-07-31
Git push confirmed
c736fab
All GA opt-out files uploaded, committed, and pushed to origin/main (17 files, 219 insertions, 122 deletions). git status clean. Harding then completed the one-time opt-out visit himself.
2026-07-31
Correction: ai-transparency.html
ai-transparency.html was wrongly reported as edited for ga-loader.js. That edit silently failed (no gtag snippet exists in the file). Caught by Harding checking the file timestamp in Windows Explorer. No upload needed for this file, PENDING-DEPLOY.md corrected.
2026-07-31
GA opt-out (ga-loader.js)
v1.99
Harding's home-office visits (dynamic Telefonica Brasil IP) were counted in Stats. Added ga-loader.js, a site-wide GA loader with a permanent per-browser opt-out (Google's ga-disable flag). Real feature change, not internal, so this reset the third badge segment.
2026-07-31
Card improved + relocated
v1.98.02
Harding asked for a monospace Date/Badge column (arrows like v1.98→v1.91 were clipping) and for this card to move to the end of the page instead of the top. Both done.
2026-07-31
Badge bump (internal)
v1.98.01
Harding introduced a third badge segment for internal/governance-only changes so they're distinguishable from real feature bumps. This is the first use of it.
2026-07-31
Change log on Stats page
Added this card — Harding clarified "documented at the end of STATs" meant this live dashboard, not just CLAUDE.md/CSV. Moved to the end of the page and restyled with a monospace Date/Badge column, per Harding.
2026-07-31
Standing rule added
Harding asked for an end-of-response bulleted file list (framed as "needs cPanel upload"). Added to CLAUDE.md and propagated into the ready-to-begin skill.
2026-07-31
Fact confirmed
Harding confirmed the "High-Fidelity Pre-Scripted Demo" vs "Live Demo" header difference is an existing tier-conditional feature (free-email vs business-email), not a bug. Confirms live badge is genuinely still v1.91.
2026-07-31
Discrepancy found
v1.98→v1.91
Live badge still read v1.91 in a screenshot despite a local-mirror bump to v1.98 — root cause: the badge fix was never uploaded to cPanel.
2026-07-31
CLAUDE.md updated
Added HEIC client-side conversion section; corrected Versioning section.
2026-07-31
Handoff note created
HANDOFF-2026-07-31.md — documented HEIC feature already shipped + badge reconciliation.
2026-07-31
Badge bump
v1.91→v1.98
Local mirror only, corrected a missed bump from a prior session (HEIC feature was already coded). Not deployed this session.
2026-07-31
New chat window
Session opened with READY TO BEGIN?; ingested BPM Diagram-as-Code project knowledge and the 2026-07-30 end-of-day handoff.