# Undrift — Changelog

> Complete record of all features, fixes, architecture decisions, and technical changes across the entire project lifecycle.
> 
> **Versioning:** [Semantic Versioning (SemVer)](https://semver.org/)
> - **v0.x.x (Alpha):** v0.1.0–v0.5.30 (complete, development phase)
> - **v1.x.x (Beta):** v1.0.0–v1.13.3 (complete, closed beta phase)
> - **v2.0.0+ (Production):** v2.0.0-beta onwards (open beta → production)

---

## v2.3.0-beta (2026-04-29) — FAQ Page & Scorecard Bug Fix

### Marketing & Documentation

- [v2.3.0-beta | 2026-04-29] — **FAQ page (`faq.html`)** — New standalone FAQ page at `https://undrift.io/faq`; two-level accordion (section headers collapse/expand sections, questions collapse/expand individually); single-open globally across all sections; all sections start collapsed; 7 sections, 29 questions with full content: General (4), Set Up & Onboarding (4), The Session (5), Report (4), Troubleshooting (4), How It Works (4), Under the Hood (4)
- [v2.3.0-beta | 2026-04-29] — **FAQ template download links** — `.md` and `.txt` agenda template download links in the FAQ page trigger the same `downloadTemplateMd()` / `downloadTemplate()` functions as the in-app Setup screen; functions mirrored inline in `faq.html` via a self-contained `<script>` block referencing `_safeBlobDownload()` and `_TPL_CONTENT`
- [v2.3.0-beta | 2026-04-29] — **Nav standardization** — All nav bars across `index.html` and `faq.html` are now identical: Logo → How it works → Features → Who it's for → FAQ → Start free; FAQ link uses absolute URL (`https://undrift.io/faq`); active state applied to FAQ link on `faq.html`; in-page anchor links on `faq.html` use root-relative cross-page format (`/#how`, `/#features`, `/#who`)
- [v2.3.0-beta | 2026-04-29] — **FAQ hero copy** — Hero heading updated to "Your questions, answered."; second paragraph added: "Organized by topic. Select any section to expand it."
- [v2.3.0-beta | 2026-04-29] — **QA sample agendas** — 8 varied agenda files produced for QA testing (`qa-dev-agenda-01` through `08`); covers short standup (15 min, Gentle), product planning (45 min, Balanced), executive strategy (60 min, Vigilant, includes Break item), design review (Workshop items), client kickoff (no objectives defined), incident retrospective (Vigilant, blameless framing), budget review (10 attendees, consecutive Decision items), sprint retrospective (all Discussion items); saved to `G:\My Drive\_undrift\qa\`

### Bug Fixes

- [v2.3.0-beta | 2026-04-29] — **Scorecard card colors restored** — `.sc-card.sc-ok`, `.sc-card.sc-warn`, `.sc-card.sc-over` CSS rules were missing from `undrift-styles.css`; color-coded top border (green/amber/red) was not rendering; rules added. Also fixed a mangled `.sc-card.sc-card.sc-card.sc-label` selector (invalid chained selector) that was preventing `.sc-label` from being styled correctly

---

## v2.2.0-beta (2026-04-28) — Mobile Responsive Layout

- [v2.2.0-beta | 2026-04-28] — **Mobile responsive layout** — Full accordion-based mobile UI with Now Bar, hamburger menu, live data mirroring, animated sections, and tap-to-capture transcript actions. Triggered at max-width 767px. Desktop layout completely unaffected.
- [v2.2.0-beta | 2026-04-28] — **Mobile mic toggle** — Explicit getUserMedia() permission request; single toggle button (mic icon → stop icon); STT interim text mirrors to mobile bar.
- [v2.2.0-beta | 2026-04-28] — **Setup flow mobile polish** — Drop zone hidden after file parsed on mobile; upload confirmation visible above the fold.
- [v2.2.0-beta | 2026-04-28] — **Report screen mobile** — Scorecard reflows to 2-column grid; tabs scroll horizontally; padding adjusted for small screens.
- [v2.2.0-beta | 2026-04-28] — **Dead code cleanup** — Removed 25 orphaned CSS classes, 5 orphaned JS functions, and stale comment placeholders. App size reduced ~6KB.
- [v2.2.0-beta | 2026-04-28] — **Accordion animation fix** — Removed min-height causing open animation jerk; added will-change for GPU compositing.
- [v2.2.0-beta | 2026-04-28] — **Action button icons removed** — All action bar and transcript capture buttons are text-only on both desktop and mobile.
- [v2.2.0-beta | 2026-04-28] — **CSS variable compliance** — All mobile colors use CSS custom properties; dark mode works throughout without hardcoded hex overrides.
## v2.1.0-beta (2026-04-23) — Social Preview Cards

### Marketing & Social

- [v2.1.0-beta | 2026-04-23] — **Open Graph and Twitter Card meta tags** — Added comprehensive social preview card meta tags to both landing page (index.html) and app shell template (undrift-shell.html); tags include og:type, og:url, og:title, og:description, og:image for Open Graph (Facebook, LinkedIn) and twitter:card, twitter:site, twitter:creator, twitter:title, twitter:description, twitter:image for Twitter/X; enables rich link previews when sharing undrift.io links on social platforms
- [v2.1.0-beta | 2026-04-23] — **Social card image** — Added undrift-social-card.png (1200×630px) to deployment; served from https://undrift.io/undrift-social-card.png; displays Undrift branding and tagline "Stay on point." with example session interface on gradient background
- [v2.1.0-beta | 2026-04-23] — **Meta description tags** — Added standard meta description tags to both index.html and undrift-shell.html for improved SEO and fallback preview text: "AI-powered meeting facilitation. Real-time drift detection keeps your agenda on track."

### Testing & Validation

- Post-deployment validation recommended via [Twitter Card Validator](https://cards-dev.twitter.com/validator), [Facebook Sharing Debugger](https://developers.facebook.com/tools/debug/), and [LinkedIn Post Inspector](https://www.linkedin.com/post-inspector/)

---

## v2.0.1-beta (2026-04-22) — Post-Launch Patch

### Visual Identity & Design

- [v2.0.1-beta | 2026-04-22] — **Co-Facilitator gradient identity system** — Implemented across all surfaces with consistent visual language; CF card backgrounds fixed (light mode: pink #fdf2f8 → purple #f5f3ff); 4px gradient left accent stripe standardized on all CF elements; gradient pill labels with white text for redirect cards; white sparkles icons (18×18px) consistent across both themes
- [v2.0.1-beta | 2026-04-22] — **CF redirect cards redesign** — Premium visual hierarchy with gradient system; white sparkles, purple backgrounds, gradient accent stripes
- [v2.0.1-beta | 2026-04-22] — **Feedback CTA normalization** — Brand blue treatment (#1A6BFF locked) applied consistently across all feedback surfaces
- [v2.0.1-beta | 2026-04-22] — **Card border radius standardization** — 12px border radius applied consistently across all card types
- [v2.0.1-beta | 2026-04-22] — **Visual hierarchy improvements** — Premium/standard tier separation enhanced with gradient treatments

### Features & Enhancements

- [v2.0.1-beta | 2026-04-22] — **Mobile warning banner** — Added for viewport < 1024px with localStorage persistence; dismissible with "Got it" button; warns desktop browsers recommended for optimal experience
- [v2.0.1-beta | 2026-04-22] — **Facilitator Coaching loading indicators** — Enhanced with multi-stage progress indicators during AI generation
- [v2.0.1-beta | 2026-04-22] — **Layout swap** — Sentiment and analysis indicator positions swapped (sentiment moved to statusbar for better visibility)

### Bug Fixes

- [v2.0.1-beta | 2026-04-22] — **Session end auto-complete bug fixed** — Agenda item status now preserved correctly when session ends; resolves issue where completed items reverted to incomplete
- [v2.0.1-beta | 2026-04-22] — **Sparkles icon color correction** — Fill set to white in both light and dark themes (was inconsistent)
- [v2.0.1-beta | 2026-04-22] — **CF background color reversion** — Fixed light mode background reverting to magenta instead of maintaining purple #f5f3ff

### Files Modified

- undrift-shell.html (mobile banner, layout swap)
- undrift-styles.css (CF gradient system, colors, animations, border radius)
- undrift-dashboard.js (session end logic, card types)
- undrift-report.js (loading indicators, feedback CTA)
- undrift-docs.html, undrift-docs.css (dark mode, CSS variables)
- undrift-terms.html, undrift-privacy.html (footer consistency)
- vercel.json (GA4 CSP headers)
- All feedback forms (theme toggle, GA4 tracking)

### Quality Assurance

- [v2.0.1-beta | 2026-04-22] — **QA checklist completion** — All 77 checklist items verified and passing

---

## v2.0.0-beta (2026-04-22) — Open Beta Launch

### Launch & Go-To-Market

- [v2.0.0-beta | 2026-04-22] — **Open Beta public launch** — Public open beta release on April 22, 2026; free access with no gate, no credit card required; targets Kit.com waitlist (200+ subscribers) + X/LinkedIn social channels; deployment via Vercel with auto-deployment on GitHub push; success metrics: 100+ users, 50+ sessions, NPS ≥40, 99%+ uptime measured over 4-week beta window
- [v2.0.0-beta | 2026-04-22] — **Version bump to semantic versioning (SemVer)** — Undrift now uses SemVer: v0.x.x = Alpha (complete), v1.x.x = Beta (complete), v2.0.0+ = Production. v2.0.0-beta signals production-ready code entering open beta; version updated across 9 locations: undrift-docs.js, undrift-shell.html, undrift-report.js (2 places), undrift-docs.html, undrift-feedback.html, README.md, CHANGELOG.md, build script
- [v2.0.0-beta | 2026-04-22] — **Analytics & feedback pipeline** — GA4 tracking added with custom events: beta_session_start, beta_report_generated, feedback_submitted; feedback form enhanced with NPS field (1–5 scale) and "How did you hear?" dropdown to track acquisition channels; feedback routed to Google Forms → Sheets for real-time analysis
- [v2.0.0-beta | 2026-04-22] — **Legal & compliance** — Privacy Policy updated with beta disclaimer (data handling, analytics, GDPR compliance notes); Terms of Service updated with beta clause (no SLA, data may be deleted, limited support); Beta Terms Addendum added to ToS acceptance flow
- [v2.0.0-beta | 2026-04-22] — **Kit email sequence drafted** — 4-email campaign: Day 0 (Launch announcement), Day 3 (How's your first session?), Day 7 (Feature spotlight), Day 14 (Help shape roadmap); emails scheduled in Kit platform for auto-dispatch
- [v2.0.0-beta | 2026-04-22] — **Social media campaign queued** — 3 X posts (6am, 12pm, 5pm launch day timing) + 1 LinkedIn long-form post queued in Buffer; cross-posted to Bluesky; handles: @getundrift (X), Undrift (LinkedIn)

### Product & QA

- [v2.0.0-beta | 2026-04-22] — **"Closed Beta" → "Open Beta" branding** — All UI references to "Closed Beta" replaced with "Open Beta"; topbar brand pill updated; welcome screen copy updated; footer version references standardized to v2.0.0-beta
- [v2.0.0-beta | 2026-04-22] — **Deployment checklist executed** — Pre-launch: security review (CSP/CORS/headers verified, no .env.local in deployment), smoke testing (landing pages, app load, feedback form, analytics events), final commit with message: "feat: open beta launch v2.0.0-beta"; deployment: GitHub push triggers Vercel auto-deploy; post-deploy: Vercel logs monitored for errors, GA4 dashboard checked for real-time events, Kit email activation triggered at 9am
- [v2.0.0-beta | 2026-04-22] — **Auto-end feature** — 55-minute warning toast with audio cue and 8-second auto-dismiss; 60-minute hard stop automatically ends session and transitions to report; implemented via `tick()` function in undrift-dashboard.js with `showTimeWarningToast()` and session flags (`_session5minWarningShown`, `_sessionAutoEnded`)
- [v2.0.0-beta | 2026-04-22] — **Session duration limit** — Maximum session duration set to 60 minutes with default value of 60; enforced in undrift-shell.html `<input max="60">`
- [v2.0.0-beta | 2026-04-22] — **Timecheck popup enhancements** — Repositioned to bottom-right above timecheck button (was bottom-center); toggle behavior: clicking timecheck button again hides popup; "Session total" label changed to "Session allocated"; dismiss button styled with proper hover states for both light and dark modes
- [v2.0.0-beta | 2026-04-22] — **Facilitator coaching rate limiting** — `buildFacilitatorCoaching()` in undrift-report.js now enforces 30-second cooldown to prevent API abuse; shows countdown message if triggered too soon
- [v2.0.0-beta | 2026-04-22] — **Session Health Score calculation** — Enhanced `calcScorecard()` with weighted Session Health Score (0–100); incorporates drift density, drift recovery rate, and objective completion signals

### Security Hardening

- [v2.0.0-beta | 2026-04-22] — **XSS protection** — `esc()` function added to undrift-report.js sanitizes 11 user input fields (agenda topics, facilitator name, action items, decisions, notes, transcript); escapes 5 HTML characters (&, <, >, ", ')
- [v2.0.0-beta | 2026-04-22] — **Rate limiting (coaching API)** — 30-second cooldown on `buildFacilitatorCoaching()` prevents abuse
- [v2.0.0-beta | 2026-04-22] — **localStorage error handling** — Theme toggle and restore functions in undrift-docs.js now log console warnings when localStorage unavailable; graceful degradation maintained for private browsing mode
- [v2.0.0-beta | 2026-04-22] — **Error sanitization** — api/analyze.js now hides internal error details in production mode (`process.env.NODE_ENV` check); development mode shows full error messages for debugging
- [v2.0.0-beta | 2026-04-22] — **Security audit completion** — Full audit documented 12 findings across 4 areas (TLS/HTTPS, API key & proxy, input validation, STT accuracy); all High and Medium findings resolved; audit report saved to `security/`

### UI/UX Polish

- [v2.0.0-beta | 2026-04-22] — **Logo standardization** — All logos set to 30px × 30px across undrift-feedback.html and undrift-docs.html
- [v2.0.0-beta | 2026-04-22] — **Wordmark standardization** — All wordmarks set to 1.75rem font-size; "Closed Beta" subtitles removed from all pages
- [v2.0.0-beta | 2026-04-22] — **Link styling** — No underlines on links sitewide (a and a:hover); dark mode color overrides added for text links across all pages
- [v2.0.0-beta | 2026-04-22] — **Dark mode fixes (undrift-docs.html)** — Tab bar readability fixed (removed opacity, adjusted colors); `.docs-tab`, `.docs-tab:hover`, `.docs-tab.active` all have proper dark mode overrides; `.docs-sidebar a:hover` matches `a.active` styling; brand/semantic CSS variables properly overridden
- [v2.0.0-beta | 2026-04-22] — **Copyright color standardization** — Copyright text set to `rgba(221,228,236,0.55)` on undrift-terms-landing.html and undrift-privacy-landing.html
- [v2.0.0-beta | 2026-04-22] — **Footer normalization** — Consistent footer across all pages: "v2.0.0-beta · © 2026 Undrift LLC. All Rights Reserved. · Terms · Privacy · Contact"
- [v2.0.0-beta | 2026-04-22] — **Left panel width increase** — Dashboard left panel width increased from 224px to 264px (+40px) for better readability
- [v2.0.0-beta | 2026-04-22] — **Timecheck dismiss button** — Styled with transition effects and proper hover states for both light (`var(--brand)`) and dark (`rgba(26,107,255,0.12)` background) modes

### Development & Infrastructure

- [v2.0.0-beta | 2026-04-22] — **Build system finalized** — undrift-build.py remains single source of truth; all version updates propagated through source files (not compiled HTML); no manual edits to undrift-app.html after build
- [v2.0.0-beta | 2026-04-22] — **Hotfix readiness** — v2.0.0-beta.1 reserved for critical bug fixes identified during first week of beta; same day deployment SLA for production issues
- [v2.0.0-beta | 2026-04-22] — **STT provider evaluation** — Deepgram recommended as primary STT provider; AssemblyAI identified as fallback; Gladia considered for EU expansion; evaluation documented in `research/`

### Documentation

- [v2.0.0-beta | 2026-04-22] — **Changelog updates** — User guide and dev docs changelog sections in undrift-docs.html updated with v2.0.0-beta and v1.13.3 entries; both sections link to CHANGELOG.md for full version history
- [v2.0.0-beta | 2026-04-22] — **Footer link corrections** — undrift-docs.html footer links point to `/terms` and `/privacy` (app versions) instead of `/terms/landing` and `/privacy/landing`
- [v2.0.0-beta | 2026-04-22] — **Technical architecture diagrams** — SVG diagrams added to `docs/` documenting system architecture

### Post-Launch Monitoring (Week 1)

- Daily feedback form review (Apr 23–26) to identify themes, bugs, feature requests
- Daily error log review (Vercel + console logs) to identify critical bugs
- 24-hour response SLA on support emails and feedback submissions
- Weekly summary (Sundays) documenting users, sessions, feedback themes, and roadmap decisions

---

## v1.13.3 (2026-04-18) — Report Polish & Quality Assurance

### Features

- [v1.13.3 Beta | 2026-04-18] — **Report page overhaul + polish** — Report topbar replaced with setup-topbar pattern (inline, flows with page); report content wrapped in rpt-wrapper (max-width 800px, centered, matching setup-screen pattern); theme toggle added to report; Session Health label moved above numerical score; grade label font increased to 14px/700; grade label color now matches score color coding (green/blue/amber/red via adjacent sibling selector); rp-tab badge text changed to white (#fff) for all four buckets in both light and dark; light mode QA pass: feedback.html and docs.html theme sync fixed, lp-head-agenda border improved, decisions teal contrast fixed, brand-sub purple contrast fixed; report footer version string corrected to v1.13.3 Beta
- [v1.13.2 Beta | 2026-04-17] — **Dashboard UI overhaul** — Major layout and style pass: status bar split into left/center/right (live pill moved to topbar-right, m5 indicator centered over feed column, elapsed/date pills in right); sentiment bar moved to transcript header with gradient fade and 3 states (Neutral/Positive/Adrift); scope slider moved to action bar right; elapsed/clock/date removed from topbar; .meeting-meta shows participants only; left panel renamed from .sidebar to .left-panel (lp- prefix); agenda on top, objectives collapse from bottom; bespoke check-icons replace native checkboxes; agenda items non-clickable (Mark Complete only); Objective Complete and Item Complete feed cards with green theme; Completed filter pill added; elapsed timer fixed via brute-force renderAgendaList tick; lp-footer redesigned with 2-row date/elapsed display then moved to statusbar; all pill styles normalized to rgba alpha (Live, elapsed, agenda timing); right panel widened to 420px; 4 color-coded tabs (Actions/blue, Decisions/teal, Parking/purple, Notes/gray) with per-bucket badges; tab centering fixed with display:none badge swap
- [v1.11 Beta | 2026-04-15] — **Report export to PDF** — `.pdf` download button enabled in report topbar; `downloadPDF()` function calls `window.print()`; `@media print` CSS block hides beta ribbon, topbar buttons, co-facilitator pill, nav bar, dashboard, welcome and setup screens; report body full-width on print; scorecard stays 4-column
- [v1.11 Beta | 2026-04-15] — **One-click transcript capture** — Inline hover-reveal pill buttons added to every live transcript line; buttons: Flag (red), Action item (blue), Decision (cyan), Parking lot (purple), Note (gray); each pre-fills the capture modal with the transcript line text; `CAPTURE_CONFIGS` lookup object centralises icon/title/placeholder data, eliminating SVG path injection in onclick attributes; transcript lines highlight with light blue bg + blue border on hover for visual context
- [v1.11 Beta | 2026-04-15] — **Action bar trimmed** — Reduced from 8 to 4 buttons: Mark complete, Time check, Suggest redirect, Add note; capture actions (Action item, Decision, Parking lot, Flag) moved to transcript line buttons
- [v1.11 Beta | 2026-04-15] — **Park it removed from flag/drift cards** — `actions: []` on both feed card types; parking lot now accessible via transcript capture buttons

### Security

- [v1.11 Beta | 2026-04-15] — **Security headers** — `vercel.json` updated with Content-Security-Policy, X-Frame-Options: DENY, X-Content-Type-Options: nosniff, Referrer-Policy: strict-origin-when-cross-origin, Permissions-Policy (microphone self-only)
- [v1.11 Beta | 2026-04-15] — **CORS restricted** — `api/analyze.js` CORS origin changed from wildcard `*` to `https://undrift.io` only; `Vary: Origin` header added
- [v1.11 Beta | 2026-04-15] — **Proxy body validation** — `api/analyze.js` validates `req.body` before forwarding: requires `messages` array, enforces max 50 messages and 8000 chars/message; strips disallowed fields via `safeBody` whitelist
- [v1.11 Beta | 2026-04-15] — **Input maxlength** — `maxlength` attributes added to `f-title` (120), `f-audience` (80), `f-facilitator` (80), and dynamic agenda topic inputs (120)
- [v1.11 Beta | 2026-04-15] — **Security audit report** — Full audit across 4 areas (TLS/HTTPS, API key & proxy, input validation, STT accuracy); 12 findings documented; all High and Medium findings addressed; `security-audit-report-v1.docx` produced and saved to `security/`

### Engineering & Infrastructure

- [v1.11 Beta | 2026-04-15] — **app.undrift.io routing fixed** — Host-based rewrite rules replaced with `redirects` entry; root cause: Vercel serves static files before evaluating rewrite rules; `app.undrift.io` now 302 redirects to `https://undrift.io/app`
- [v1.11 Beta | 2026-04-15] — **`openCapture()` prefill param** — Optional 6th parameter added; backward compatible with all existing call sites

### Documentation & Repo

- [v1.11 Beta | 2026-04-15] — **`CONTRIBUTING.md`** — Added to repo root; covers branch/PR workflow, commit message format, build/deploy steps (including 9-file version bump checklist), code style, file naming conventions, bug reporting, and GitHub Issues label reference

### Marketing & Social Media

- [v1.11 Beta | 2026-04-15] — **Social Media Strategy finalized** — Platforms: X, LinkedIn, YouTube; handle: @getundrift; content buckets: The Drift, On Point, The Tease, Social Proof, Founder POV; cadence: X 3–4/week, LinkedIn 1–2/week, YouTube 1/month; hashtag library established
- [v1.11 Beta | 2026-04-15] — **Social media assets produced** — Post library (7 X posts, 2 LinkedIn posts), content calendar (Apr 16–May 16), On Point LinkedIn graphic, YouTube Episode 001 production script (CSI-style observational format), brand & social reference one-pager; all saved to `marketing/` and `design/social/`
- [v1.11 Beta | 2026-04-15] — **Buffer.com setup card** — Notion card created for social media scheduling tool setup

---

## v1.10.0 (2026-04-14) — Kit Integration & Logo Standardization

### Marketing & Waitlist

- [v1.10 Beta | 2026-04-14] — **Kit.com waitlist integration** — Kit (formerly ConvertKit) account set up; inline form wired into `index.html` and `undrift-landing-launch.html`; field names updated from Mailchimp convention (`FNAME`, `LNAME`, `EMAIL`) to Kit convention (`fields[first_name]`, `fields[last_name]`, `email_address`); Mailchimp honeypot field removed; form action URL updated to live Kit endpoint
- [v1.10 Beta | 2026-04-14] — **Double opt-in flow** — Kit configured for double opt-in; subscribers receive a verification email before being confirmed; post-verification redirect points to `https://undrift.io/?confirmed=1`
- [v1.10 Beta | 2026-04-14] — **Email confirmation toast** — `?confirmed=1` URL param triggers a green glass-morphism toast on `index.html` and `undrift-landing-launch.html`; slides in from above nav with spring animation, auto-dismisses after 5 seconds, URL cleaned via `history.replaceState` on trigger so refresh does not re-show it; copy: "Your email is confirmed. You're on the list."
- [v1.10 Beta | 2026-04-14] — **Kit confirmation page** — `undrift-kit-confirmation.html` added; served at `/confirmed` via `vercel.json` route; nav and footer match `index.html` exactly (fixed frosted nav, same wordmark, same nav links, same footer copy and links); card shows checkmark, eyebrow, heading, sub, "What happens next" bullet list; `hello@` address entity-encoded
- [v1.10 Beta | 2026-04-14] — **Kit welcome email** — `marketing-kit-welcome-email-v1.html` produced; table-based HTML email for Kit Waitlist Welcome sequence (send immediately on signup); Outlook-safe logo fallback (MSO conditional comment renders solid blue square with "U" if PNG blocked); `{{subscriber.first_name}}` merge tag; `{{ unsubscribe_url }}` footer tag; saved to `marketing/`
- [v1.10 Beta | 2026-04-14] — **`vercel.json` updated** — `/confirmed` route added pointing to `undrift-kit-confirmation.html`

### Logo & Brand Standardization

- [v1.10 Beta | 2026-04-14] — **Logo standardized to `undrift_logo.png`** — all inline SVG logo marks and gradient div placeholders replaced with `<img src="https://undrift.io/undrift_logo.png">` across all HTML files: `undrift-app.html` (4 instances — welcome, setup topbar, dashboard topbar, report topbar), `index.html`, `undrift-landing-launch.html`, `undrift-docs.html`, `undrift-feedback.html`, `undrift-terms.html`, `undrift-privacy.html`, `undrift-privacy-landing.html`, `undrift-terms-landing.html`, `undrift-kit-confirmation.html`
- [v1.10 Beta | 2026-04-14] — **Dynamic logo injection fixed** — `undrift-report.js` template literal was injecting the sunburst SVG into the report topbar dynamically; replaced with `<img>` tag referencing `undrift_logo.png`
- [v1.10 Beta | 2026-04-14] — **Orphaned CSS removed** — `.brand-icon { background: var(--brand) }` gradient fill, `.welcome-brand-icon { background: linear-gradient(...) }`, `.brand-icon svg`, `.welcome-brand-icon svg`, and `.docs-header-icon svg` rules removed from `undrift-styles.css` and `undrift-docs.css` — all were targeting the now-replaced SVG logo elements
- [v1.10 Beta | 2026-04-14] — **Relative paths → absolute URL** — all occurrences of `src="/undrift_logo.png"` and `src="undrift_logo.png"` updated to `src="https://undrift.io/undrift_logo.png"` across `undrift-app.html`, `index.html`, `undrift-landing-launch.html`
- [v1.10 Beta | 2026-04-14] — **Email logo** — `marketing-kit-welcome-email-v1.html` logo replaced from gradient-div fallback to `<img src="https://undrift.io/undrift_logo.png">`; Outlook MSO conditional renders solid `#1A6BFF` square with "U" letterform

### hello@ Obfuscation

- [v1.10 Beta | 2026-04-14] — **`hello@undrift.io` entity-encoded** — address obfuscated using HTML entity encoding (`&#104;&#101;&#108;&#108;&#111;&#64;&#117;&#110;&#100;&#114;&#105;&#102;&#116;&#46;&#105;&#111;`) in `undrift-kit-confirmation.html`; renders correctly in browsers, invisible to most scrapers

---

## v1.9.0 (2026-04-13) — Legal Architecture & Legal Page Shells

### Bug Fixes

- [v1.9 Beta | 2026-04-13] — **Sensitivity migration completed** — `AGG_LABELS` renamed to `SENS_LABELS`; slider HTML IDs corrected from `f-aggression`/`agg-pill` to `f-sensitivity`/`sens-pill` in both HTML and all JS call sites; `SESSION_DATA` contract updated to carry `sensitivity`/`sensitivityLabel` exclusively (removed `aggression`/`aggressionLabel`); template parser map updated so both `SENSITIVITY` and `AGGRESSION_LEVEL` keys populate `d.sensitivity`; `applyData()` guard updated to check `d.sensitivity`; `initDashboard()` and `updateSens()` both updated to use `SENS_LABELS`; resolves silent crash in `initDashboard()` caused by `SENS_LABELS` being referenced but never declared
- [v1.9 Beta | 2026-04-13] — **Report footer standardized** — report page footer now matches the standard app footer format (`v1.9 Beta · © Undrift LLC 2026 · April 11, 2026 · Terms · Privacy`); "Generated by Undrift.io" added as bold centered line below; Terms and Privacy linked with brand-color hover
- [v1.9 Beta | 2026-04-13] — **Legal shell script paths fixed** — all four legal shell pages (`undrift-terms.html`, `undrift-privacy.html`, `undrift-terms-landing.html`, `undrift-privacy-landing.html`) updated to use absolute `/` paths for all `script src` and `link href` attributes; relative paths caused 404s under Vercel URL rewrites (e.g. `/terms/undrift-terms-content.js` instead of `/undrift-terms-content.js`)
- [v1.9 Beta | 2026-04-13] — **Landing page scroll reveal fixed** — `IntersectionObserver` script was missing from `index.html`; all sections below the hero were stuck at `opacity: 0` with no trigger to flip `.reveal` to `.on`

### Legal Architecture

- [v1.9 Beta | 2026-04-13] — **Content/skin separation** — legal text extracted from HTML shells into standalone content modules: `undrift-terms-content.js` (exposes `window.UNDRIFT_TERMS` — 18 ToS sections + 11-section Beta Addendum) and `undrift-privacy-content.js` (exposes `window.UNDRIFT_PRIVACY` — 13 sections); single edit point for all legal content regardless of which skin serves it
- [v1.9 Beta | 2026-04-13] — **Shared renderer** — `undrift-legal-render.js` added — plain IIFE exposing `window.renderLegal(data, targetId, config)`; loaded as a simple script tag by all four shell pages; no framework, no import/export
- [v1.9 Beta | 2026-04-13] — **Landing-skin legal pages** — `undrift-terms-landing.html` and `undrift-privacy-landing.html` added — dark landing aesthetic (DM Serif Display headlines, gradient logo, `#0d1d2c` bg) rendering the same content modules as the in-app shells; linked from both landing page footers
- [v1.9 Beta | 2026-04-13] — **Footer links updated** — both `index.html` and `undrift-landing-launch.html` footer Terms/Privacy links updated from `/terms` / `/privacy` (in-app light-mode shells) to `/terms/landing` / `/privacy/landing` (dark-mode shells matching landing aesthetic)

### Landing Pages

- [v1.9 Beta | 2026-04-13] — **Post-launch landing page** — `undrift-landing-launch.html` added as the post-launch marketing page; accessible at `/launch`; full feature disclosure with hero, ticker, problem stats, How It Works (6 cards), Features accordion (6 items each with unique interactive right-panel mockup), Who It's For, Privacy band, CTA
- [v1.9 Beta | 2026-04-13] — **Features accordion** — 6 items: Scored post-meeting report (report mockup panel), AI redirect scripts (redirect card panel), Real-time drift detection (live transcript + drift alert panel), Parking lot (3 parked items panel), Action item capture (3 action items panel), Time management controls (over-time timer panel); each panel is unique
- [v1.9 Beta | 2026-04-13] — **Problem section redesign** — problem stats displayed as single row of 4 rounded-corner cards (`stat-cell` sizing) with colorful brand-gradient eyebrow stripes; eyebrow colors flow blue→lavender across cards; full explanatory paragraph included in each card alongside the stat; section text (heading + subtext) above the card row
- [v1.9 Beta | 2026-04-13] — **Section order (index.html)** — NAV → HERO → TICKER → problem → `grad-rule-vivid` → quote → `grad-rule-vivid` → pov → `grad-rule` → who → `grad-rule` → beta/waitlist → FOOTER
- [v1.9 Beta | 2026-04-13] — **Section order (undrift-landing-launch.html)** — NAV → HERO → TICKER → problem → `grad-rule-vivid` → quote → `grad-rule-vivid` → how → `grad-rule` → features → `grad-rule` → who → `grad-rule-vivid` → privacy band → `grad-rule-vivid` → CTA → FOOTER
- [v1.9 Beta | 2026-04-13] — **Quote section** — moved between problem and how/pov on both pages; `background: #0d1d2c`; padding halved to `3.25rem 3rem`; flanked by `.grad-rule-vivid` (full-opacity brand gradient lines); `.quote-attr` updated to match body `<p>` styling; "The Undrift Promise" (capital P)
- [v1.9 Beta | 2026-04-13] — **Privacy band** — `background: #0d1d2c`; flanked by `.grad-rule-vivid`; border lines removed (vivid rules do the visual work)
- [v1.9 Beta | 2026-04-13] — **Ticker redesign (both pages)** — upgraded to vivid style: `border-image` brand gradient lines (`#A991F6 → #1A6BFF`); mixed-case text at `0.8125rem / font-weight: 500`; text opacity `0.7`; gradient dot separators; subtle gradient background wash; old dim uppercase all-caps style removed entirely; single `.ticker-strip` definition (no fallback version)
- [v1.9 Beta | 2026-04-13] — **`.grad-rule-vivid`** — new class added to both pages: full-opacity `transparent → #A991F6 → #1A6BFF → transparent` gradient line; used to frame dark-background sections (quote, privacy band); `.grad-rule` unchanged for standard inter-section dividers
- [v1.9 Beta | 2026-04-13] — **Nav updates (both pages)** — favicon added (`/undrift_logo.png`); SVG logo-mark replaced with `<img src="/undrift_logo.png">`; `overflow: hidden` removed; 2px padding so logo never clips; wordmark bumped to `1.1875rem / font-weight: 700`
- [v1.9 Beta | 2026-04-13] — **Typography pass (both pages)** — all body/paragraph elements bumped from `font-weight: 300` to `400`; opacity lifted to `0.6–0.7`; `.s-label` eyebrow tags bumped to `0.85rem / font-weight: 700`; `.pov-num` bumped to `0.85rem`; `.form-note` updated to match `.beta-sub` styles
- [v1.9 Beta | 2026-04-13] — **Problem stats sourced** — old unsourced stats (47% / 24 min / 71%) replaced with sourced figures: 72% (Atlassian) · 23 min (UC Irvine) · 54% (Atlassian); each card includes a small source attribution line
- [v1.9 Beta | 2026-04-13] — **How-it-works numbers** — `.how-num` updated to use brand gradient with `opacity: 0.35` (was near-invisible flat blue at `rgba(26,107,255,0.12)`)
- [v1.9 Beta | 2026-04-13] — **CTA note** — bumped from `0.8125rem` near-invisible gray to `1rem` brand blue (`var(--blue)`) at `font-weight: 500` — matches `cta-sub` size, reads as confident reassurance rather than fine print
- [v1.9 Beta | 2026-04-13] — **Features instruction** — "CLICK ANY FEATURE TO LEARN MORE →" added above accordion list in `var(--purple)` eyebrow style

### Routing

- [v1.9 Beta | 2026-04-13] — **`vercel.json` updated** — new routes added: `/launch` → `undrift-landing-launch.html`, `/terms/landing` → `undrift-terms-landing.html`, `/privacy/landing` → `undrift-privacy-landing.html`; subdomain routing from v1.8 preserved

### QA / Code Audit

- [v1.9 Beta | 2026-04-13] — **Stale `.t-sep` duplicate removed** — `index.html` had two back-to-back `.t-sep` definitions; old dim purple version (line 163) removed; vivid gradient dot version retained
- [v1.9 Beta | 2026-04-13] — **Orphaned CSS removed from `undrift-landing-launch.html`** — `.stat-n`, `.stat-l`, `.stat-src` (orphaned after stats-band redesign), `.problem-grid`, `.p-card` and all variants (orphaned after collapse to single stat-cell row) removed from stylesheet; no HTML references remained
- [v1.9 Beta | 2026-04-13] — **All remaining duplicate selectors confirmed** — verified as legitimate compound selectors or `@media` overrides; no true CSS duplicates remain on any page
- [v1.9 Beta | 2026-04-13] — **Zip manifest corrected** — Drive-only files (`pm-`, `qa-`, `uat-` prefix) excluded from source zip; rule established: any file with a Google Drive folder prefix belongs in `G-Drive-v[version]-[suffix].zip`, never in the source code zip

### Bug Fixes

- [v1.8 Beta | 2026-04-12] — **Onboarding gate restored** — `handleTosChange()`, `enterApp()`, `showWelcomeScreen()`, and `showSetupScreen()` functions were missing from compiled app; startup router replaced bare `initSetup()` call with `localStorage` check — first-time visitors see welcome/ToS screen, returning users go straight to setup
- [v1.8 Beta | 2026-04-12] — **Launch button null ref fixed** — slider ID mismatch (`f-sensitivity` / `sens-pill` in HTML vs. `f-aggression` / `agg-pill` in JS) was throwing uncaught TypeError and silently blocking `launchSession()` and `applyData()`; HTML IDs corrected to match JS
- [v1.8 Beta | 2026-04-12] — **Landing page scroll reveal fixed** — `IntersectionObserver` JS was missing entirely; all sections below the hero were stuck at `opacity: 0`; observer added to trigger `.reveal.on` on scroll

### UI & Branding

- [v1.8 Beta | 2026-04-12] — **Logo** — placeholder SVG icons replaced with `undrift_logo.png` at all 4 brand locations: welcome screen, setup topbar, dashboard topbar, report header; gradient/solid-blue container backgrounds removed
- [v1.8 Beta | 2026-04-12] — **Favicon** — `undrift_logo.png` added as browser favicon via `<link rel="icon">` in `<head>`
- [v1.8 Beta | 2026-04-12] — **Brand wordmark** — bumped to 18px, color set to `#0E1927` (navy) on light / `#E6EDF3` on dark via `--brand-name-color` CSS variable; `line-height` tightened on wordmark + subtitle lockup
- [v1.8 Beta | 2026-04-12] — **Version strings** — all v1.7 references updated to v1.8 Beta across app footer, dashboard topbar, welcome screen, HTML report footer, and markdown report footer; `AdamLeibler.com LLC` references replaced with `Undrift LLC`
- [v1.8 Beta | 2026-04-12] — **Date field layout** — `row-2` grid changed from `1fr 1fr` to `160px 1fr`; date column no longer stretches excessively
- [v1.8 Beta | 2026-04-12] — **App footer** — two-span layout collapsed to single span; gap between date and Terms separator dot removed

### Report — Download Buttons

- [v1.8 Beta | 2026-04-12] — Download .md button moved out of report topbar into co-facilitator pill
- [v1.8 Beta | 2026-04-12] — Co-facilitator pill restructured: `cf-voice-body` flex column wraps dynamic message and new footer row; 1px `var(--brand-border)` divider separates message from download affordance
- [v1.8 Beta | 2026-04-12] — Download footer: static CTA label ("Download this report in your preferred format.") + `.md` and `.pdf` buttons, left-aligned with `gap: 10px`; `.pdf` stubbed (disabled, "Coming soon" tooltip)
- [v1.8 Beta | 2026-04-12] — Report topbar now shows only "New session" button

### Infrastructure & Deployment

- [v1.8 Beta | 2026-04-12] — **Domain routing** — `vercel.json` updated with hostname-based routing: `undrift.io` → `index.html`, `app.undrift.io` → `undrift-app.html`, `www.undrift.io` → 301 redirect to apex; `/app` fallback route added
- [v1.8 Beta | 2026-04-12] — `undrift-landing.html` renamed to `index.html` — marketing landing page now served at repo root
- [v1.8 Beta | 2026-04-12] — Custom domains live: `undrift.io`, `www.undrift.io`, `app.undrift.io` added to Vercel project; DNS configured in DreamHost (A record + CNAME records); SSL certs issued
- [v1.8 Beta | 2026-04-12] — `DEPLOYMENT.md` updated — Part 4 added documenting routing architecture, DNS record table, Vercel dashboard steps, and verification commands; copyright footer fixed

### Docs

- [v1.8 Beta | 2026-04-12] — `undrift-docs.html` footer updated — version bumped to v1.8 Beta, date corrected to April 12, copyright fixed to Undrift LLC
- [v1.8 Beta | 2026-04-12] — `undrift-docs.html` Section 7 — stale `ac_theme` localStorage key corrected to `undrift_theme`

---

### Legal & Compliance

- [v1.8 Beta | 2026-04-11] — `undrift-terms.html` created — full Terms of Service page, linked from app footer
- [v1.8 Beta | 2026-04-11] — `undrift-privacy.html` created — full Privacy Policy page, linked from app footer
- [v1.8 Beta | 2026-04-11] — `legal-terms-of-service-v1.0.docx` produced — formal ToS document
- [v1.8 Beta | 2026-04-11] — `legal-beta-tos-addendum-v1.0.docx` produced — beta-specific ToS addendum covering data handling, service limitations, feedback expectations, and liability scope
- [v1.8 Beta | 2026-04-11] — `legal-privacy-policy-v1.0.docx` produced — formal Privacy Policy document

### Agenda Template Redesign

- [v1.8 Beta | 2026-04-11] — `undrift-agenda-template.md` redesigned — cleaner format, tagline intro block, inline hints for all header fields, realistic generic example agenda items replacing placeholder text
- [v1.8 Beta | 2026-04-11] — `undrift-test-session.md` rewritten — fully filled Weekly Team Check-In example replacing generic placeholder content
- [v1.8 Beta | 2026-04-11] — Parser aliases added in `undrift-setup.js` `parseTemplate()`: `MEETING_DURATION_MINUTES` accepted as alias for `TOTAL_DURATION_MINUTES`; `SENSITIVITY` accepted as alias for `AGGRESSION_LEVEL` — old keys still work, no breaking change
- [v1.8 Beta | 2026-04-11] — Template comments standardized to `#` style throughout (previously mixed `<!-- -->` and `#`)
- [v1.8 Beta | 2026-04-11] — `SENSITIVITY` description comment added to template (Gentle / Balanced / Vigilant)

### Documentation & Footers

- [v1.8 Beta | 2026-04-11] — Dynamic footer implemented across all HTML doc pages (`undrift-user-guide.html`, `undrift-dev-docs.html`, `undrift-update-cheatsheet.html`, `undrift-feedback.html`) — version and date update automatically from `UNDRIFT_VERSION` at runtime
- [v1.8 Beta | 2026-04-11] — `undrift-report.js` footer updated — HTML and Markdown report footers now use `UNDRIFT_VERSION` dynamically; copyright updated from AdamLeibler.com LLC to Undrift
- [v1.8 Beta | 2026-04-11] — GitHub Issues label taxonomy added to `undrift-docs.html` (dev docs Section 9) and `README.md` — 11 labels with colors and descriptions
- [v1.8 Beta | 2026-04-11] — Audio compatibility note added to user guide Section 5 — documents virtual audio device workaround for Zoom/Teams/Skype remote meetings (Loopback on Mac, VB-Audio on Windows)
- [v1.8 Beta | 2026-04-11] — `qa-dev-test-runbook-v1.0.md` and `qa-beta-tester-session-guide-v1.0.md` added to repo

### QA & Admin

- [v1.8 Beta | 2026-04-11] — `qa-beta-testing-plan-v1.1.docx` updated — comprehensive 9-section beta testing plan covering participant segments, 40 test cases, P0–P4 bug priority framework, scalability risk register, and participant brief template
- [v1.8 Beta | 2026-04-11] — Undrift LLC established as legal entity (Louisville, KY)
- [v1.8 Beta | 2026-04-11] — Email infrastructure established: adam@undrift.io (primary), hello@undrift.io, support@undrift.io

---

---

## v1.7.0 (2026-04-10) — Co-facilitator Voice & Onboarding Redesign

### Onboarding & UX

- [v1.7 Beta | 2026-04-10] — Welcome / ToS screen added: first-visit gating via `localStorage` key `undrift_tos_accepted`; co-facilitator greeting; three orientation bullets; clickwrap checkbox linking to undrift.io/terms, /terms#beta, /privacy; "Let's go" button disabled until ToS accepted; `enterApp()` stores acceptance timestamp and advances to setup
- [v1.7 Beta | 2026-04-10] — `initSetup()` refactored: checks `undrift_tos_accepted` in localStorage; routes to `showWelcomeScreen()` or `showSetupScreen()` accordingly; setup init split into `showSetupScreen()` for clean separation
- [v1.7 Beta | 2026-04-10] — Success card renamed to **Preflight check**: heading updated, `.success-badge` element removed, `preflight-cf` div added for co-facilitator preflight message injection

### Co-facilitator Voice System

- [v1.7 Beta | 2026-04-10] — `.cf-voice` CSS component introduced as the unified visual identity for all Undrift-generated messages: logo mark, italic text, brand-blue-sub background, left accent border; synced into both `undrift-styles.css` and app inline style block
- [v1.7 Beta | 2026-04-10] — `cfVoiceMsg(text)` helper added to `undrift-setup.js` — renders the `.cf-voice` HTML component from a string
- [v1.7 Beta | 2026-04-10] — `cfParseResponse(data, source)` added to `undrift-setup.js` — generates contextual co-facilitator message from parsed agenda data; 6 message variants based on item count, timing tightness (total > duration × 0.95), missing fields (title, facilitator, duration), and outcomes presence
- [v1.7 Beta | 2026-04-10] — Upload tab: `renderUploadPreview()` now renders co-facilitator voice response instead of bare status text; `upload-status` element innerHTML replaced with `cfVoiceMsg()` output
- [v1.7 Beta | 2026-04-10] — Paste & Parse tab: success path, basic parse fallback, and error path all now render co-facilitator voice responses; `paste-status` element innerHTML replaced with `cfVoiceMsg()` output
- [v1.7 Beta | 2026-04-10] — Preflight card: `showSuccessCard()` updated to inject contextual co-facilitator preflight message into `preflight-cf` div; 5 message variants based on timing tightness, outcomes presence, and agenda size
- [v1.7 Beta | 2026-04-10] — Report offboarding: `cfReportMsg(sc, s)` added to `undrift-report.js` — generates score-tier co-facilitator message (4 tiers: ≥90 excellent, ≥75 good, ≥60 fair, <60 tough); personalizes with facilitator first name where available; message injected at top of live report body; export-invisible (not included in `downloadReport()` markdown output)

### CSS & Build

- [v1.7 Beta | 2026-04-10] — Orphaned `.success-badge` CSS removed from `undrift-styles.css` and app inline style block; comment updated to "Preflight card"
- [v1.7 Beta | 2026-04-10] — Welcome screen and co-facilitator styles added to app inline style block to ensure correct rendering (styles in `undrift-styles.css` are a sync reference; app is self-contained)
- [v1.7 Beta | 2026-04-10] — `undrift-build.py` updated: welcome screen HTML added before setup screen, preflight card replaces old success card, version strings bumped to v1.7, `ac_theme` → `undrift_theme` localStorage key throughout
- [v1.7 Beta | 2026-04-10] — `localStorage` theme key updated from `ac_theme` to `undrift_theme` in `undrift-build.py` and `undrift-docs.js`

### QA & Documentation

- [v1.7 Beta | 2026-04-10] — `qa-dev-test-runbook-v1.0.md` added to repo root — 10-block pre-deploy checklist covering all critical paths: welcome/ToS gate, all three agenda entry modes, preflight card, live dashboard (STT, drift, all action buttons), report with export verification, back-to-back session isolation, feedback form, edge cases; sign-off table included
- [v1.7 Beta | 2026-04-10] — `qa-beta-tester-session-guide-v1.0.md` added to repo root — participant-facing session guide; 5 focus areas, bug report guidance, out-of-scope notes, co-facilitator tone; not prescriptive
- [v1.7 Beta | 2026-04-10] — `undrift-test-session.md` renamed to `undrift-sample-agenda.md`
- [v1.7 Beta | 2026-04-10] — `README.md` updated: version bumped to v1.7, file structure updated, Quick Start steps reflect new onboarding flow, localStorage key corrected, v1.7 changelog entry added, duplicate v1.3/v1.4 entries removed

### Infrastructure

- [v1.7 Beta | 2026-04-10] — Repo migrated from `adamleibler/agenda-commander-beta` to `getundrift/Undrift` under the `getundrift` GitHub org
- [v1.7 Beta | 2026-04-10] — Vercel project recreated under `getundrift` team (`team_GIjmitaEkF0cXQ3Uiq8yU1na`) at vercel.com/getundrift
- [v1.7 Beta | 2026-04-10] — GitHub Issues label taxonomy established: `beta-feedback` (green), `bug` (red), `docs` (gray), `duplicate` (slate), `enhancement` (purple), `feature` (blue), `performance` (orange), `question` (yellow), `security` (dark red), `ux` (teal), `wontfix` (slate)
- [v1.7 Beta | 2026-04-10] — Undrift Google Workspace configured under undrift.io domain; feedback form and Google Sheet migrated from personal account to undrift.io workspace; `undrift-feedback.html` updated with new `FORM_ID` and all 9 entry IDs

---

---

## v1.6.0 (2026-04-10) — Rebrand to Undrift (Alpha → Beta Transition)

### Rebrand & Rename

- [v1.6 Beta | 2026-04-10] — Product renamed from **Agenda Commander** to **Undrift** across all files, UI, footers, reports, AI system prompts, and documentation
- [v1.6 Beta | 2026-04-10] — All source files renamed using `undrift-[subject].[ext]` convention: `agenda-commander.html` → `undrift-app.html`, `ac-styles.css` → `undrift-styles.css`, `ac-dashboard.js` → `undrift-dashboard.js`, `ac-setup.js` → `undrift-setup.js`, `ac-report.js` → `undrift-report.js`, `ac-docs.css` → `undrift-docs.css`, `ac-docs.js` → `undrift-docs.js`, `ac-docs.html` → `undrift-docs.html`, `ac-feedback.html` → `undrift-feedback.html`, `ac-dev-docs.html` → `undrift-dev-docs.html`, `ac-user-guide.html` → `undrift-user-guide.html`, `ac-update-cheatsheet.html` → `undrift-update-cheatsheet.html`, `agenda-commander-template.md` → `undrift-agenda-template.md`, `agenda-test-session.md` → `undrift-test-session.md`, `build.py` → `undrift-build.py`
- [v1.6 Beta | 2026-04-10] — `ac-build-session.docx` renamed to `ops-build-session-notes-v1.5.docx` per Undrift file naming convention (category prefix `ops-`, destination `_admin/ops/`)
- [v1.6 Beta | 2026-04-10] — `api/analyze.js` and `proxy.py` filenames unchanged — Vercel serverless convention and internal dev tool respectively
- [v1.6 Beta | 2026-04-10] — All internal cross-references (href, src, open(), read(), download attributes, code examples in docs) updated to new filenames across every file
- [v1.6 Beta | 2026-04-10] — AI system prompt identity updated in `undrift-app.html` and `undrift-dashboard.js`: `"You are Agenda Commander,"` → `"You are Undrift,"`
- [v1.6 Beta | 2026-04-10] — `AC_VERSION` constant renamed to `UNDRIFT_VERSION` in `undrift-docs.js`; all references updated in `undrift-feedback.html` and `undrift-update-cheatsheet.html`
- [v1.6 Beta | 2026-04-10] — No functional changes in this release; all `act*` function names (e.g. `actComplete`, `actFlag`) confirmed as semantic shorthand for "action", not AC-heritage prefixes — retained as-is

---

## v0.1.0–v0.5.30 & v1.0.0–v1.5.30 (2026-04-07 to 2026-04-09) — Initial Build & Alpha Development

### Architecture & Build Pipeline

- [v1.0 Alpha | 2026-04-07] — Project scaffold created: `undrift-app.html`, `undrift-styles.css`, `undrift-setup.js`, `undrift-dashboard.js`, `undrift-report.js`, `undrift-build.py`
- [v1.0 Alpha | 2026-04-07] — Modular build pipeline: `undrift-build.py` reads four source files and assembles them into a single compiled `undrift-app.html` via Python f-string templating; `{{double-brace}}` escaping used for literal curly braces in the HTML template
- [v1.0 Alpha | 2026-04-07] — `undrift-build.py` reports output file path and size in bytes and KB on each run
- [v1.1 Alpha | 2026-04-07] — Vercel serverless proxy created: `api/analyze.js` — all Anthropic API calls route through this function; API key stored in Vercel environment variable `ANTHROPIC_API_KEY`, never exposed to the browser
- [v1.1 Alpha | 2026-04-07] — `vercel.json` routing config created — maps `/api/analyze` to `api/analyze.js`
- [v1.1 Alpha | 2026-04-07] — `.gitignore` created — excludes `.env.local`, `node_modules`, `.vercel`
- [v1.1 Alpha | 2026-04-07] — `.env.example` created — safe-to-commit template for `.env.local`
- [v1.1 Alpha | 2026-04-07] — `proxy.py` created — local Python HTTP proxy (port 3747) for testing without Vercel; accepts API key as CLI arg, adds CORS headers, forwards to Anthropic
- [v1.1 Alpha | 2026-04-07] — `DEPLOYMENT.md` created — step-by-step guide covering local testing with `vercel dev`, GitHub repo setup, Vercel environment variable configuration, and auto-deploy workflow
- [v1.2 Alpha | 2026-04-07] — GitHub repo created and connected to Vercel; auto-deploy on push to `main` enabled
- [v1.4 Alpha | 2026-04-07] — `undrift-build.py` `UnicodeDecodeError` on Windows fixed — all `open()` calls now explicitly use `encoding='utf-8'`
- [v1.5 Alpha | 2026-04-08] — JS obfuscation step added to `undrift-build.py`: `javascript-obfuscator` npm package runs on concatenated JS before injection; install with `npm install -g javascript-obfuscator`; graceful fallback if not installed; added to `DEPLOYMENT.md` prerequisites
- [v1.5 Alpha | 2026-04-08] — All JS concatenated as one unit before obfuscation so cross-file function references mangle consistently
- [v1.5 Alpha | 2026-04-08] — `_ENTRY_POINTS` list: all HTML-facing functions protected via `--reserved-names` flag — obfuscation never breaks `onclick`, `onkeydown`, or bare init calls
- [v1.5 Alpha | 2026-04-08] — Obfuscation config: compact output, no control flow flattening, no dead code injection, no string array encoding (stability), hexadecimal identifier names; ~111% of raw JS size

### M1 — Session Setup

- [v1.0 Alpha | 2026-04-07] — Setup screen with three agenda entry methods: Build form, Upload agenda, Paste & parse
- [v1.0 Alpha | 2026-04-07] — Build form: meeting title, date, total duration, audience, facilitator name, aggression slider (Gentle/Balanced/Vigilant), agenda rows (topic/minutes/type), desired outcome rows
- [v1.0 Alpha | 2026-04-07] — Agenda item types: Discussion, Decision, Info share, Workshop, Q&A, Break
- [v1.0 Alpha | 2026-04-07] — `launchSession()` validates required fields (title + at least one agenda item), builds `window.SESSION_DATA`, shows success/review card
- [v1.0 Alpha | 2026-04-07] — Success card: meeting summary grid, agenda table, goals table, "Edit setup" and "Enter meeting room" buttons
- [v1.0 Alpha | 2026-04-07] — `goToDashboard()`: sets `body[data-mode="dashboard"]`, calls `initDashboard()`
- [v1.0 Alpha | 2026-04-07] — Upload tab: drag-and-drop zone + click-to-browse; accepts `.md`, `.txt`, `.csv`, `.json`; `.docx` explicitly excluded (browsers cannot parse binary Word files without external libraries)
- [v1.0 Alpha | 2026-04-07] — `parseTemplate()`: reads `KEY: VALUE` pairs and `AGENDA_ITEMS:` / `DESIRED_OUTCOMES:` sections; skips lines starting with `#`
- [v1.0 Alpha | 2026-04-07] — Upload preview: renders parsed agenda and meeting info in tables before applying; "Apply & review form" populates build form
- [v1.0 Alpha | 2026-04-07] — Paste & parse tab: free-text → AI extracts structured agenda via Anthropic API; `simpleParse()` regex fallback if API unavailable
- [v1.0 Alpha | 2026-04-07] — Template downloads: `.md` and `.txt` versions with commented instructions; `.md` format recommended
- [v1.0 Alpha | 2026-04-07] — `SESSION_DATA` contract: `{ title, date, duration, audience, facilitator, aggression, aggressionLabel, agenda[], outcomes[], startedAt, endedAt, actionItems[], parkingLot[], decisions[], notes[], flags[] }`
- [v1.1 Alpha | 2026-04-07] — Date picker: hidden `<input type="date">` drives native browser picker; display field shows DD-MMM-YYYY; calendar icon button calls `hidden.showPicker()`; defaults to today
- [v1.1 Alpha | 2026-04-07] — `parseToISO(raw)`: normalizes any date string to YYYY-MM-DD; strips ordinal suffixes (1st→1, 7th→7); passes through `new Date()` for format flexibility; falls back to today if invalid
- [v1.1 Alpha | 2026-04-07] — `fmtDateDisplay(iso)`: converts YYYY-MM-DD to DD-MMM-YYYY (e.g. `07-Apr-2026`) for display
- [v1.1 Alpha | 2026-04-07] — `applyData(d)`: populates all form fields including date picker from parsed upload/paste data; imported dates always normalized
- [v1.1 Alpha | 2026-04-07] — `parseTemplate()` fix: now skips `<!-- HTML comment -->` lines in addition to `#` comments; previously caused parse errors on `.md` template upload
- [v1.1 Alpha | 2026-04-07] — Slider labels (Gentle/Balanced/Vigilant) scoped inside slider flex wrapper to prevent layout bleed
- [v1.1 Alpha | 2026-04-07] — Setup form bottom button layout: template downloads on top row (equal width), Launch session centered at 60% on bottom row
- [v1.1 Alpha | 2026-04-07] — Help button pill added to setup topbar, covering both form and success card screens

### M2 — Dashboard Shell

- [v1.0 Alpha | 2026-04-07] — Dashboard: three-panel fixed layout — left agenda sidebar, center feed + input, right buckets panel
- [v1.0 Alpha | 2026-04-07] — All panels use `position: fixed` with `top/left/right/bottom` anchoring — eliminates height-calculation bugs and content clipping
- [v1.0 Alpha | 2026-04-07] — Topbar: brand, meeting title/audience, status pill (Live → Wrapping up → Over time), scope slider, elapsed badge, wall clock, Help link, End session button
- [v1.0 Alpha | 2026-04-07] — Status bar: color-coded agenda track (proportional widths), item name chip, counter chip, on-track status chip, type chip, live countdown timer chip
- [v1.0 Alpha | 2026-04-07] — Countdown timer states: green "On track", amber "Wrapping up" at 80% of allocation, red "Over time" at 100%
- [v1.0 Alpha | 2026-04-07] — `observeStatusbar()`: `ResizeObserver` keeps `--statusbar-h` accurate for fixed layout anchoring
- [v1.0 Alpha | 2026-04-07] — `startClock()`: wall clock updates every second; elapsed badge shows `M:SS elapsed`
- [v1.0 Alpha | 2026-04-07] — `startItemTimer()`: per-item countdown with color state changes; live-ticks sidebar elapsed display for active item
- [v1.0 Alpha | 2026-04-07] — Agenda sidebar: pending = gray allocated time; active = live elapsed in blue→amber→red; done = actual vs allocated in green or red
- [v1.0 Alpha | 2026-04-07] — `jumpToItem(idx)`: stamps `startedAt`/`endedAt`, advances agenda state; clicking any sidebar item navigates to it
- [v1.0 Alpha | 2026-04-07] — `markNextDone()`: completes active item with timestamp, starts next with fresh timestamp
- [v1.1 Alpha | 2026-04-07] — Scroll fix: `min-height: 0` added to panel flex children so they scroll within their own columns correctly
- [v1.1 Alpha | 2026-04-07] — `.agg-control` fixed width (`180px`) and `.agg-value` fixed width (`56px`) prevent layout shift when sensitivity label changes
- [v1.1 Alpha | 2026-04-07] — Help button added to dashboard topbar
- [v1.5 Alpha | 2026-04-08] — v1.5 Beta version label added to topbar brand area directly under "Undrift"; removed from sidebar footer

### M3 — Action Buttons

- [v1.0 Alpha | 2026-04-07] — Action bar scrolls horizontally — prevents button wrap from stealing feed height on narrow windows
- [v1.0 Alpha | 2026-04-07] — Original seven buttons: Mark complete, Flag topic, Parking lot, Log action, Time check, Suggest redirect, Add note
- [v1.0 Alpha | 2026-04-07] — `flashBtn(el)`: adds `.pressed` class for 120ms — subtle animation confirms button registered
- [v1.0 Alpha | 2026-04-07] — `actComplete()`: marks item done with timestamp, adds feed card noting completed and next item
- [v1.0 Alpha | 2026-04-07] — `actFlag()`: pushes manual flag to `SESSION_DATA.flags`, adds amber flag card to feed
- [v1.0 Alpha | 2026-04-07] — `actParking()`, `actLogAction()`, `actNote()`: open capture sheet targeting respective bucket
- [v1.0 Alpha | 2026-04-07] — `actTimeCheck()`: populates and shows time check toast with current item, item elapsed vs allocated (color-coded), session elapsed vs total (color-coded), items remaining
- [v1.0 Alpha | 2026-04-07] — `actRedirect()`: calls `M5.requestRedirect()` — triggers on-demand redirect suggestion regardless of debounce/cooldown
- [v1.0 Alpha | 2026-04-07] — Capture sheet: modal bottom sheet with icon, title, textarea, cancel/confirm; `Cmd/Ctrl+Enter` saves without mouse
- [v1.0 Alpha | 2026-04-07] — `confirmCapture()`: pushes item to bucket with timestamp and active agenda item context; updates feed, badge, right panel
- [v1.5 Alpha | 2026-04-08] — Decision button added (keyboard shortcut `D`): opens capture sheet targeting `decisions` bucket; teal color scheme (`#0891b2`)
- [v1.5 Alpha | 2026-04-08] — Buttons reordered: Mark complete → Action item → Decision → Parking lot → Flag topic → Suggest redirect → Time check → Add note
- [v1.5 Alpha | 2026-04-08] — "Log action" renamed to "Action item"
- [v1.5 Alpha | 2026-04-08] — Flag topic hover: red (`#dc2626`); Time check hover: amber (swapped from flag); both now distinct from Parking lot purple
- [v1.5 Alpha | 2026-04-08] — Time check toast "Current item" row stacks vertically — long titles wrap cleanly instead of overflowing into label

### M4 — STT + Transcript

- [v1.0 Alpha | 2026-04-07] — Web Speech API: `SpeechRecognition` / `webkitSpeechRecognition` with continuous recognition and auto-restart
- [v1.0 Alpha | 2026-04-07] — `STT_SUPPORTED` flag: graceful degradation if browser lacks Web Speech API; informational feed card directs user to text input
- [v1.0 Alpha | 2026-04-07] — `toggleMic()` / `startMic()` / `stopMic()`: mic state management; pulsing red bar when active; `M` keyboard shortcut toggles (not in input fields)
- [v1.0 Alpha | 2026-04-07] — `window.STT_BUFFER`: running transcript string fed to M5; `window.STT_LATEST`: most recent utterance; updated on each `result` event
- [v1.0 Alpha | 2026-04-07] — Transcript panel: opens on first mic activation; timestamped utterances; running word count badge; `clearTranscript()` resets buffer
- [v1.0 Alpha | 2026-04-07] — Language switching: `changeLang()` mid-session; EN, ES, FR, DE, PT, ZH, JA supported
- [v1.0 Alpha | 2026-04-07] — Manual text input: `sendManualInput()` appends to `STT_BUFFER`; routes through same M5 pipeline; `Enter` submits
- [v1.0 Alpha | 2026-04-07] — Only text sent to AI — never audio; last ~600 characters of buffer used per analysis request

### M5 — AI Analysis Engine

- [v1.0 Alpha | 2026-04-07] — Debounced scope analysis: per-sensitivity debounce (Gentle: 6s, Balanced: 4s, Vigilant: 2s)
- [v1.0 Alpha | 2026-04-07] — Per-sensitivity cooldown after each analysis: Gentle: 12s, Balanced: 8s, Vigilant: 5s
- [v1.0 Alpha | 2026-04-07] — `MIN_WORDS` threshold: Gentle: 10, Balanced: 6, Vigilant: 4 new words since last analysis required to trigger
- [v1.0 Alpha | 2026-04-07] — `lastBufferLen` tracks analysis position — measures new words since last analysis, not total buffer length
- [v1.0 Alpha | 2026-04-07] — `buildSystem()`: dynamic system prompt includes agenda, current item, time elapsed, sensitivity, outcomes, and strict JSON response rules
- [v1.0 Alpha | 2026-04-07] — `buildUser(transcript)`: separates RECENT SPEECH (new since last analysis) from EARLIER CONTEXT (previous buffer) — prevents re-flagging already-analyzed content
- [v1.0 Alpha | 2026-04-07] — Model: `claude-sonnet-4-20250514`
- [v1.0 Alpha | 2026-04-07] — Structured JSON response: `{ onTrack, driftDetected, driftSeverity, driftReason, suggestRedirect, redirectScript, flagType, flagNote, timeRisk, timeRiskNote }`
- [v1.0 Alpha | 2026-04-07] — `flagNote` REQUIRED when `driftDetected: true`; `driftSeverity` must be `mild`/`moderate`/`severe` when drift detected — enforced in system prompt
- [v1.0 Alpha | 2026-04-07] — Feed card routing: mild/moderate → amber flag; severe → red drift card; time risk → purple; redirect → blue
- [v1.0 Alpha | 2026-04-07] — `M5.requestRedirect()`: on-demand analysis bypassing debounce/cooldown

### M6 — Feed, Flags & Redirects

- [v1.0 Alpha | 2026-04-07] — `addFeedCard(type, label, text, opts)`: timestamped cards; types: `flag` (amber), `drift` (red), `time` (purple), `redirect` (blue), `note` (gray)
- [v1.0 Alpha | 2026-04-07] — Feed card actions: dismiss (×) on all; Park it on flag/drift; Copy on redirect
- [v1.0 Alpha | 2026-04-07] — Filter pills: All, Flags, Redirects — `setFilter()` shows/hides by type
- [v1.0 Alpha | 2026-04-07] — Web Audio API tones on flag/drift events: `AudioContext` with oscillator — no external audio files
- [v1.0 Alpha | 2026-04-07] — `flagCount` tracks both manual and AI flags; displayed in topbar
- [v1.0 Alpha | 2026-04-07] — Right panel tabs: Actions, Parking, Notes (keyboard shortcuts: A, P, N implicitly via capture sheets)
- [v1.0 Alpha | 2026-04-07] — Bucket items stored as `{ text, ts, agendaItem }` — agenda context captured at time of logging
- [v1.0 Alpha | 2026-04-07] — Direct bucket input: type in right panel footer + Enter to add without capture sheet
- [v1.5 Alpha | 2026-04-08] — Decisions bucket added as fourth right panel tab (Actions / Decisions / Parking / Notes); `dot-decision` = teal; `D` keyboard shortcut
- [v1.5 Alpha | 2026-04-08] — `SESSION_DATA.decisions` harvested on `endSession()` alongside actions, parking, notes

### M7 — Report

- [v1.0 Alpha | 2026-04-07] — `endSession()`: stops timers, harvests all bucket data into `SESSION_DATA`, transitions to report screen
- [v1.0 Alpha | 2026-04-07] — Score formula: `(completionPct × 0.4) + (onTimePct × 0.4) + (max(0, 100 − totalFlags × 8) × 0.2)`
- [v1.0 Alpha | 2026-04-07] — On-time threshold: item finishing within 110% of allocation counted as on time
- [v1.0 Alpha | 2026-04-07] — Grade thresholds: ≥90 = Excellent (A), ≥75 = Good (B), ≥60 = Fair (C), <60 = Needs work (D)
- [v1.0 Alpha | 2026-04-07] — Report sections: score badge + grade, scorecard (4 metrics), agenda recap table, desired outcomes, action items, parking lot, facilitator notes
- [v1.0 Alpha | 2026-04-07] — Scorecard: Items completed, Time on-agenda %, Session duration vs planned, Flags raised (AI + manual breakdown)
- [v1.0 Alpha | 2026-04-07] — Agenda recap table: #, topic, type, allocated minutes, actual minutes, completion status
- [v1.0 Alpha | 2026-04-07] — Markdown download: `downloadReport()` generates clean `.md` with full session data — pastes directly into Notion, Slack, email
- [v1.5 Alpha | 2026-04-08] — Decisions section added to HTML report and markdown download — appears between Action Items and Parking Lot
- [v1.5 Alpha | 2026-04-08] — `AdamLeibler.com` in report footer hyperlinked to `https://adamleibler.com/`
- [v1.5 Alpha | 2026-04-08] — Report footer version bumped to v1.5 Beta

### Design System & CSS

- [v1.0 Alpha | 2026-04-07] — CSS custom properties: `--brand`, `--bg`, `--surface`, `--surface-2`, `--surface-3`, `--border`, `--border-2`, `--text-1` through `--text-4`, `--success`, `--warning`, `--danger`, `--purple` and `*-subtle` / `*-border` variants
- [v1.0 Alpha | 2026-04-07] — Light/dark theme: toggled via `data-theme` on `<html>`; persisted in `localStorage` under `ac_theme`
- [v1.0 Alpha | 2026-04-07] — Beta ribbon: fixed diagonal red `BETA` label in top-left corner of all pages
- [v1.3 Alpha | 2026-04-07] — `undrift-styles.css` and `undrift-docs.css` separated: main app styles vs. doc/feedback page styles
- [v1.5 Alpha | 2026-04-08] — `theme-btn` hover: blue outline + subtle blue background; `theme-btn` active: solid blue + white text — applied across all pages
- [v1.5 Alpha | 2026-04-08] — `feedback-link` modifier class for targeted feedback button styling on main app
- [v1.5 Alpha | 2026-04-08] — App footer (`.app-footer`): fixed 36px bar at bottom of setup and launch screens; centered muted copyright text
- [v1.5 Alpha | 2026-04-08] — `AdamLeibler.com` hyperlinked in all footers (setup, launch, report, docs, feedback) — inherits muted color, underlines on hover
- [v1.5 Alpha | 2026-04-08] — Docs sidebar: `--surface-3` background; `--text-2` body text; `--text-3` section labels; hover = brand blue + `--brand-subtle` background; active = bold brand blue
- [v1.5 Alpha | 2026-04-08] — Docs content area: white (`--surface`) background — aligns visually with active tab

### Documentation

- [v1.2 Alpha | 2026-04-07] — `undrift-user-guide.html` created — end-user documentation: setup, dashboard, action buttons, mic/transcript, AI analysis, report, tips, changelog
- [v1.2 Alpha | 2026-04-07] — `undrift-dev-docs.html` created — developer reference: module breakdown, SESSION_DATA contract, API schema, date handling, theme/layout, build process, changelog
- [v1.3 Alpha | 2026-04-07] — `undrift-docs.css` extracted as shared stylesheet; `undrift-docs.js` extracted as shared JS (`AC_VERSION` constant, theme toggle, nav highlighting)
- [v1.3 Alpha | 2026-04-07] — `undrift-feedback.html` created — beta feedback form → Google Forms → Google Sheets pipeline
- [v1.3 Alpha | 2026-04-07] — `undrift-update-cheatsheet.html` created — dev workflow reference and branch strategy guide
- [v1.3 Alpha | 2026-04-07] — Beta ribbon and feedback button added to all pages
- [v1.4 Alpha | 2026-04-07] — `AC_VERSION` constant in `undrift-docs.js` drives version display in sidebar and feedback form version field
- [v1.5 Alpha | 2026-04-08] — `undrift-user-guide.html` and `undrift-dev-docs.html` merged into single `undrift-docs.html` with tabbed layout
- [v1.5 Alpha | 2026-04-08] — `undrift-docs.html` layout: fixed header (brand + Feedback + theme toggle), fixed blue tab bar (User Guide | Developer Docs), scrollable content area (independent sidebar + body per tab), fixed footer (copyright bar)
- [v1.5 Alpha | 2026-04-08] — Tab bar: brand blue background; inactive tabs = frosted white; active tab = white with brand text, breaks bottom border; raised browser-tab aesthetic with rounded top corners
- [v1.5 Alpha | 2026-04-08] — Tab bar positioned starting at sidebar width (280px) — tabs float only above content, not sidebar
- [v1.5 Alpha | 2026-04-08] — Anchor routing: deep links auto-select correct tab on load; `IntersectionObserver` per panel tracks active sidebar link
- [v1.5 Alpha | 2026-04-08] — Download template button moved to docs header right-aligned next to Feedback button
- [v1.5 Alpha | 2026-04-08] — All internal links updated across `undrift-build.py`, `README.md`, `undrift-update-cheatsheet.html`, `undrift-docs.js`, `undrift-docs.css`, `ops-build-session-notes-v1.5.docx` to point to `undrift-docs.html`
- [v1.5 Alpha | 2026-04-08] — Version number removed from docs sidebar — footer is the canonical version location
- [v1.5 Alpha | 2026-04-08] — `undrift-feedback.html` footer updated to match app footer style and content
- [v1.5 Alpha | 2026-04-08] — `CHANGELOG.md` expanded from stub to comprehensive full-history log

### Security

- [v1.5 Alpha | 2026-04-08] — IP-based rate limiting on `api/analyze.js`: 20 req/IP/15 min; in-memory `Map`; `x-forwarded-for` for real IP behind Vercel edge; `429` + `Retry-After` on breach
- [v1.5 Alpha | 2026-04-08] — IP-based rate limiting on `proxy.py`: 60 req/IP/min; `threading.Lock()` for thread safety; `429` + `Retry-After` on breach
- [v1.5 Alpha | 2026-04-08] — Stale rate limit entries pruned on each request; upgrade path: Upstash Redis for global cross-instance limiting at scale

### Bug Fixes

- [v1.1 Alpha | 2026-04-07] — CORS errors from `file://` origin fixed — fetch target changed from `api.anthropic.com` to relative `/api/analyze`
- [v1.3 Alpha | 2026-04-07] — `undrift-docs.css` class name mismatch fixed — full rewrite to match actual HTML class names; previous version broke doc page layout
- [v1.3 Alpha | 2026-04-07] — Feedback topbar alignment fixed — padding mirrors `.wrapper` max-width constraint
- [v1.4 Alpha | 2026-04-07] — `<w:pgNum/>` in Word doc footers replaced with correct OOXML `fldChar/instrText PAGE` field sequence
- [v1.4 Alpha | 2026-04-07] — `undrift-build.py` Windows `UnicodeDecodeError` fixed — all file I/O explicitly uses `encoding='utf-8'`
- [v1.5 Alpha | 2026-04-08] — `javascript-obfuscator` `--output` flag fix: requires full `.js` file path, not a directory — was causing silent no-output failures
- [v1.5 Alpha | 2026-04-08] — Obfuscator flag name fix: replaced broken dynamic camelCase→kebab-case conversion with explicit hardcoded flag list
- [v1.5 Alpha | 2026-04-08] — Time check toast overflow fix: "Current item" row now stacks vertically so long agenda item names wrap cleanly

---

*Add new entries above the Bug Fixes section. Format: `[vX.X | YYYY-MM-DD] — Description`*

