Skip to main content

Documentation Index

Fetch the complete documentation index at: https://docs.writerzroom.com/llms.txt

Use this file to discover all available pages before exploring further.

May 2026

May 11, 2026

  • Stripe Billing Hardening — Handlers added for invoice.payment_failed (blocks access, payment failed email with portal link), invoice.payment_action_required (3DS), charge.refunded (revokes access + claws back credits), charge.dispute.created (internal alert email). Checkout sessions expire after 2 hours. Billing portal endpoint added at POST /api/stripe/portal with frontend proxy. Free tier removed — _check_free_limit deleted, past_due returns action: "update_payment".
  • Branding — Amber “Room” Split — “Room” now renders in amber (#f59e0b) across all footer instances in layout.tsx. Consistent with nav logo and hero treatment.
  • Agent Count Corrected — All user-facing copy updated from “7-agent” to “8-agent” pipeline. Affected: homepage, app-config.ts meta description.
  • Meta Description RewrittenAPP_CONFIG.description rewritten without em dashes for professional rendering across all pages that consume it.
  • Calendar — Save FixedContentCalendarEntry.create corrected to use user: {connect: {id}} relational syntax and ISO datetime strings with Z suffix. Resolves 500 on calendar entry creation.
  • Edit Page — Layout — Editor column widened to lg:col-span-3 (was 2). Sidebar cards collapsed to compact strip. Status bar converted from Card to slim div.

May 10, 2026

  • Research Quality — Academic Source Routing — Multi-source academic retrieval added per vertical. PubMed for Healthcare/Medical AI, arXiv for SaaS/Tech, CrossRef for Fintech/Legal/Political, Semantic Scholar as baseline across all verticals. Academic sources run in parallel with Tavily, fused via RRF and scored through the existing source quality pipeline. New module: langgraph_app/core/academic_sources.py.
  • Research Quality — Garbage Query Fix — Researcher was converting required template parameter names (e.g. client_name, project_type) into literal Tavily search queries, returning irrelevant results. Parameter-to-query conversion removed.
  • Research Quality — Domain Exclusion — Global low-quality domain blocklist enforced on all Tavily calls regardless of vertical: Pinterest, Quora, Reddit, Medium, Blogspot, Wix, Weebly, BuzzFeed, and others.
  • Generation Status — DB Fallback Fixed — Status endpoint was querying non-existent generationrequest model. Now falls back to GeneratedContent (by requestId) then GenerationQueue (by id). Resolves “No content returned” errors on long-running generations after Cloud Run instance recycling.
  • Generation Status — Schema Validation Fixed — DB fallback was setting progress=100 (integer) and forwarding raw DB status values. Both corrected: progress normalized to 0.0–1.0 float, status values mapped to allowed enum (running → processing, etc.).
  • Evidence Gate Fixed — Generation engine was calling extract_sources_from_langgraph_result which always returned [] because it searched wrong keys in the LangGraph state dict. Now reads directly from research_findings.sources, correctly passing the minimum evidence threshold.
  • Content Calendar — Date Filter FixedGET /api/calendar?month=YYYY-MM was returning 500. Prisma Python client requires datetime objects for DateTime @db.Date fields; filter was passing date objects.
  • Frontend Build — Jest Types Removed"jest" removed from types array in frontend/tsconfig.json. Was causing Cannot find type definition file for 'jest' TypeScript error in Next.js production builds.
  • Frontend Tests — Node 18 Compatibilityjest.setup.js updated with global.Response polyfill and corrected Promise/Error capitalization. useEnhancedGeneration.test.tsx advanceTimersByTime calls wrapped in act(). tests/tsconfig.json updated to moduleResolution: node16.

May 9, 2026

  • Markdown Rendering Fixed — Generated content display now renders full heading hierarchy, bold, lists, and inline code correctly. @plugin "@tailwindcss/typography" activated in globals.css. prose utility classes applied to GeneratedContentDisplay content container.
  • Build Pipeline Stabilized — Dockerfile switched from npm ci to npm install --legacy-peer-deps --include=dev. framer-motion, react-markdown, and remark-gfm moved from devDependencies to dependencies. qrcode dynamic import cast resolved with local type declaration.
  • TOTP 2FA Fixed — All Prisma field references in totp.py corrected from snake_case to camelCase. 2FA setup, verify, validate, and disable endpoints now functional end-to-end.
  • Google Avatar Fixedunoptimized prop added to NextImage in NavigationClient.tsx and profile/page.tsx for Google OAuth avatar URLs.
  • Toast Width Fixedexpand={true} removed from ToastProvider.tsx. Toasts no longer stretch to full container width.
  • Content Calendar — Full content calendar shipped. Users can create content slots before generation begins, assigning template, style profile, vertical, scheduled date, and notes. Status pipeline: Planned → In Progress → Generated → Published. Generate Now button pre-fills the generation workspace.
  • Test Suite — Frontend — Jest unit test suite added. GeneratingDialog: 27 tests. useEnhancedGeneration hook: 9 tests covering error classification, tier defaults, and idle state. Jest config migrated to ESM.
  • Test Suite — Backend — 235 unit tests added across core backend modules. Generation matrix regression suite: 7 template × style × tier combinations.
  • get_model_for_generation Fix — Returns a LangChain ChatAnthropic instance instead of a plain model name string. Prevents AttributeError in code-generation agent flows.

May 8, 2026

  • Homepage Rebuilt — Marketing homepage fully rewritten as a conversion-optimized landing page. Outcome-first headline, pipeline description, verified-stats and AI-tell enforcement called out, pricing section with money-back guarantee language, dual CTA.
  • Legal Complete — Cookie consent banner added. DMCA policy added to Terms of Service. AI-generated content disclosure added to footer. Data Processing Agreement published covering sub-processors, SCCs, HIPAA BAA availability, and breach notification.
  • Sentry Frontend Error Tracking@sentry/nextjs installed and wired with conditional activation on NEXT_PUBLIC_SENTRY_DSN.
  • Onboarding Email Drip — 3-email onboarding sequence implemented. Day 2: first generation best practices. Day 5: Brand Voice fingerprinting. Scheduled on email verification.
  • Subscription Renewal Reminders — 30-day, 7-day, and 1-day renewal reminder emails implemented.
  • AI-Tell Regression Suite — 44 AI-tell patterns enforced. Hard limit of 5 tells per generation. Failures logged and persisted to GeneratedContent.metadata.
  • Dead Code Removed — Unreachable generate-content API route deleted. Copy files removed.

May 7, 2026

  • Security HeadersX-Frame-Options, X-Content-Type-Options, Referrer-Policy, HSTS, Permissions-Policy, and Content-Security-Policy added to all Next.js routes.
  • Rate Limiter — User-Keyed — Backend rate limiter re-keyed from IP to authenticated user ID. Prevents shared-NAT users from sharing one rate limit bucket.
  • CORS Headers Tightenedallow_headers: ["*"] replaced with explicit allowlist.
  • Middleware — Admin + TOTP Guards — Admin route protection and TOTP enforcement redirect added to middleware.ts.
  • Alembic Removed — Orphaned Alembic migration directory removed. Prisma is the sole migration system.
  • reuqest_queue.py Renamed — Typo corrected to request_queue.py.
  • style_profiles copy/ Deleted — Duplicate directory removed. Was causing double-registration of every style profile.
  • Cloud Monitoring Alertsalerts.yaml rebuilt with 10 production alert policies deployed.

May 3, 2026

May 3, 2026

  • Stripe Live Mode — Platform switched to Stripe live mode. All 10 products and prices recreated in live mode (7 core + 3 annual). Live webhook endpoint active. Annual plans changed from one-time payments to recurring annual subscriptions. Annual credit provisioning grants full-year credits upfront (6,000 / 14,400 / 24,000 for Starter / Professional / Enterprise Annual). Live Secret Key and Webhook Secret rotated into Secret Manager.
  • Checkout Header Fix — Frontend Stripe checkout and pack checkout proxy routes corrected from userId to X-User-ID header to match backend require_user_id dependency.
  • Annual Billing Architecturecheckout.py restructured with separate SUBSCRIPTION_PRICES, ANNUAL_PRICES, and ONETIME_PRICES maps. Annual plans now use mode="subscription" with yearly interval. webhook.py credit provisioning unified — annual subscriptions detected by raw_plan_tier membership and provisioned at monthly_credits × 12.
  • Frontend Cloud Run--timeout=900s and --min-instances=1 added to frontend deploy in cloudbuild.yaml. Prevents SSE streaming timeouts and cold starts on the frontend service.

May 1, 2026

  • Brand Voice Generation Integration — Saved brand voice profiles now selectable in the generation workspace. Dropdown appears in Step 3 when profiles exist. Selected profile injects full voice fingerprint (tone, sentence patterns, vocabulary, rhetorical devices, forbidden/required patterns) into Planner and Writer prompts, overriding generic style profile voice instructions.
  • Brand Voice Save Fixed — 500 on save resolved: missing Json() wrapper on profileData and missing user: {connect} relation. Save header corrected from userId to X-User-ID — profiles were saving under "default_user" and not appearing in the list for the authenticated user.
  • Brand Voice Profile Cards — Saved profiles now show labeled TONE and VOICE badges. Profiles list capped at 20, scroll container added.
  • Quality Gate Fixes — Citation check corrected to read state.research_findings.sources. Disclaimer check now reads final_content or content. Citation and readability enforcement skipped on Quick tier.
  • Model Registry Sync — All stale model strings replaced: claude-sonnet-4-6 (Standard), claude-opus-4-6 (Premium), claude-haiku-4-5-20251001 (support agents), gpt-image-2 (image), gpt-5.4-mini (OpenAI planner fallback). get_optimal_model_for_style expanded to all 70+ style profiles.
  • Pipeline Fixesquality_gate wired as final node (Publisher → quality_gate → END). Vertical mandatory disclaimers deterministically injected by Formatter. SEO routing expanded to blog, research, and white paper templates. Canonical AI-tell pattern list unified across Writer, Editor, and Formatter. Vertical search filters now applied to Tavily calls. await get_compiled_graph() corrected to sync call. dynamic_overrides wrapper removed from frontend generation payload.

April 2026

April 30, 2026

  • Quality Gate Wiredquality_gate node added to LangGraph pipeline between SEO/Formatter and Publisher. Enforces vertical compliance (mandatory disclaimers present), citation minimums, and readability thresholds. Quick tier bypasses score-based checks.
  • Disclaimer Injection — Vertical mandatory disclaimers now deterministically appended by the Formatter agent for all vertical-scoped generations (Political, Healthcare, Fintech, Legal, SaaS). Previously injected as LLM instructions only — now enforced in code regardless of LLM compliance.
  • SEO Routing Expanded — Blog articles, research papers, and white papers now always route through the SEO agent on Standard and Premium tiers. Previously only templates with "seo" in strategy string or "web" in distribution channels were routed to SEO, causing most blog and research content to skip optimization entirely.
  • Canonical AI-Tell List — Single shared AI-tell pattern list now used across Writer, Editor, and Formatter. Added: utilize, game-changer, it's worth noting that, a deep dive into, cutting-edge, state-of-the-art, at the end of the day.
  • Political Vertical Source Authority — 20 government and policy domains added to DOMAIN_TIERS Tier 1 in source_quality.py: congress.gov, gao.gov, cbo.gov, supremecourt.gov, govinfo.gov, federalregister.gov, whitehouse.gov, bls.gov, uscode.house.gov, archives.gov, oyez.org, law.cornell.edu, electionlab.mit.edu, brookings.edu, nih.gov, cms.gov, fda.gov, finra.org. Previously scored as unknown-domain (0.4 authority). Now score 1.0.
  • Political Vertical Sources Expandedpolitical.yaml preferred sources expanded from 5 to 25 domains covering all three branches of federal government, major statistical agencies, and nonpartisan research organizations. Social media domains (facebook.com, twitter.com, x.com, reddit.com, instagram.com, tiktok.com, youtube.com, linkedin.com) added to exclude_domains.
  • Vertical Search Filter Merging — Researcher now merges vertical search_filters (prefer/exclude domains), blocked_sources, preferred_sources, recency_bias_months, required_sources, coverage_requirements, and min_peer_reviewed_percentage into the active search context before every Tavily call. Previously vertical source constraints existed in YAML but were never applied to searches.
  • Model Registry Sync — All model strings updated across enhanced_model_registry.py and langgraph_app/core/model_registry.py. Active pipeline now routes to claude-sonnet-4-6 (Standard writer/editor), claude-opus-4-6 (Premium writer/editor), claude-haiku-4-5-20251001 (all other agents). Removed stale claude-sonnet-4-20250514, claude-3-5-sonnet-20241022, claude-3-haiku-20240307 references. Image agent updated to gpt-image-2. OpenAI planner fallback updated to gpt-5.4-mini. get_optimal_model_for_style expanded to cover all 70+ style profiles across three model tiers.
  • Duplicate gpt-5 Spec Removedcore/model_registry.py had a second gpt-5 entry under OpenAI Legacy with wrong capabilities and $0.005/1k pricing, silently overwriting the correct $2.50/1k entry. Removed.
  • await get_compiled_graph() Fixedrun_generation_workflow was awaiting a synchronous function. Corrected to synchronous call. No behavioral change but prevents breakage on future refactors.
  • Frontend Token Selector — Max output token selector (8K/16K/24K/32K) now visible before generation, not only after a result or error. Users can set token limits prior to first generation.
  • dynamic_overrides Wrapper Removed — Frontend route.ts was wrapping all dynamic parameters in a dynamic_overrides sub-object with hardcoded API-doc defaults (e.g. api_name, auth_type) sent on every generation regardless of template. Parameters now passed flat as the backend expects.

April 26, 2026

  • Vertical Alignment Fix — All 7 vertical YAML files audited and corrected. Ghost template IDs (white_paper_generator, newsletter_generator, case_study_generator, ai_news_brief, phd_dissertation_template) replaced with real IDs or removed. Ghost style IDs (technical_deep_dive, professional_report, casual_professional, narrative_storytelling, developer_tutorial, product_announcement) replaced with real IDs or removed. Every vertical now has a complete, validated set of allowed templates and style profiles that resolve correctly against the loader cache.
  • Clinical Narrative Style Profile — New clinical_narrative style profile added to data/style_profiles/. Targets clinical practitioners authoring case reports, treatment pathway documentation, and clinical research summaries. Vancouver citation style, MeSH/SNOMED-CT terminology enforcement, patient privacy compliance, mandatory statistical reporting (CI, p-values, effect sizes). Added to Healthcare vertical allowed_styles.
  • Entertainment Vertical Styles Expanded — Entertainment vertical allowed_styles expanded from 1 working profile (tv_premium_sci_fi) to 17, covering the full TV/cinematic suite: TV Premium Drama, Comedy, Horror, Romance, Sci-Fi; TV Drama/Comedy/Romance Writing; Action Visual Writing; Cinematic Dialogue; plus blog and social profiles for entertainment content.
  • Settings — Style Profiles Tab Removed — Style Profiles section removed from Settings sidebar. Style profile selection belongs to the generation flow, not account settings.
  • Settings Sidebar Visibility — Sidebar nav text updated to text-gray-500 dark:text-[#b0bdd4] for improved legibility in light mode.
  • Sign Out Button — Removed red destructive styling from Sign Out button in top nav. Now matches muted nav text style.
  • Page Title Treatment — All page titles updated to amber (#f59e0b) on the key word, replacing indigo/teal gradient. Consistent across Settings, Dashboard, Templates, Generate, Content, Brand Voice, Publishing, Profile, About, Analytics, Contact, Docs, Help, Press, Solutions, Support, Status, Terms, Privacy, and Pricing pages.
  • Secondary Button Treatment — “Contact Sales”, “Contact Support”, “View Pricing”, “Get in Touch”, and similar secondary outline buttons updated to amber border and text to reinforce brand color hierarchy.
  • “Start Free Trial” Removed — Solutions page CTA updated to “Start Now”. No free trial exists; Demo plan is the entry point at $9.99.
  • Popular Categories Formatting — Template page Popular Categories now capitalize each word and strip underscores from category display names.
  • View System Status Link Fixed — Docs page linked to /system-status (blank page). Corrected to /status.
  • Content Page Subtitle Updated — “Access, review, and publish your saved AI-generated drafts” replaced with actionable description covering view, edit, and delete workflows.

April 25, 2026

  • Brand Voice Wired/brand-voice route added to authenticated top navigation. NavigationClient isAppPage detection changed from exact-match to startsWith to correctly activate app nav on all protected sub-routes.
  • Brand Voice Proxy Routes — Two new Next.js API proxy routes added: GET /api/brand-voice/profiles and DELETE /api/brand-voice/profiles/[profileId]. Both auth-gated via NextAuth session, inject X-User-ID, forward to backend via getBackendUrl().
  • Brand Voice Delete FixhandleDelete in brand-voice page previously called the backend directly using NEXT_PUBLIC_API_BASE_URL with no auth headers. Now routes through the Next.js proxy.
  • User Deletion Security Fixdelete.py now fails closed when INTERNAL_API_SECRET is unset. Previously None == None allowed unauthenticated deletions in misconfigured environments.
  • User Deletion Integrity Fix — Stripe cancellation failures now abort the deletion flow with HTTP 502 instead of being swallowed. Prevents active subscriptions from continuing to bill against a deleted account.
  • Backend URL Consistency — Brand-voice proxy routes now use getBackendUrl() from @/lib/backend-url instead of hardcoded process.env.BACKEND_URL || 'http://localhost:8000'. Fixes silent routing-to-localhost failures in environments that only set NEXT_PUBLIC_BACKEND_URL.
  • Dashboard Docs — Analytics section added documenting the four analytics endpoints: Insights, Template Usage, Performance, and Usage Distribution.
  • Templates Docs — Blog Article added to the File Upload Support table.
  • Brand Voice Docs — Navigation reference corrected from “left sidebar” to “top navigation bar”.
  • Settings Page Redesign — Full settings page rebuilt as a sidebar-nav layout with 13 sections across five groups: Workspace (Profile, Notifications, Appearance), Content (Generation, Brand Voice, Style Profiles, Corpus & Verticals), Developer (API Access), Account (Billing, Analytics, Publishing, Security, Account), and Team. Replaces the previous cramped 8-tab grid layout.
  • Settings — Brand Voice Management — Brand Voice section in Settings displays live saved voice profiles fetched from /api/brand-voice/profiles with inline delete. Links to /brand-voice for new profile creation.
  • Settings — Style Profile Default — Style Profiles section fetches the full profile list from /api/configuration/style-profiles and saves a default profile preference to the account. defaultStyleProfile field added to GenerationSettings interface in settings-context.tsx.
  • Settings — Corpus & Verticals — Corpus section fetches live vertical list from /api/verticals. Preferred verticals toggled and saved to both backend and localStorage. Selection biases RAG retrieval pipeline toward preferred domains.
  • Settings — API Access — New Developer section surfaces the platform base URL, a ready-to-run curl example for the generate endpoint, and one-click account ID copy.
  • Settings — Analytics — Analytics section fetches live generation insights from /api/analytics/insights with 7d/30d/90d range selector and manual refresh. Surfaces total generations, words produced, success rate, average generation time, period-over-period deltas, and most-used template.
  • Settings — Team Placeholder — Team & Workspace section added as a coming-soon state with feature badges: member invites, shared brand voice, role permissions, shared corpus, usage allocation, audit logs.
  • Settings — Mobile Nav — Mobile viewport uses a Select dropdown for section navigation instead of the sidebar.
  • Analytics Proxy RouteGET /api/analytics/insights Next.js proxy route added. Auth-gated, passes X-User-Id header, forwards range query param to backend.
  • Profile and Settings Docsproduct/profile-and-settings.mdx fully rewritten to reflect the new sidebar-nav layout and all 13 sections.

April 24, 2026

  • Two-Factor Authentication (TOTP) — Full TOTP-based 2FA implemented end-to-end. Setup flow generates encrypted TOTP secret (AES-256 via Fernet, TOTP_ENCRYPTION_KEY env var) and returns provisioning URI for authenticator apps (Google Authenticator, Authy, 1Password). QR code rendered client-side via qrcode library. Verification enables 2FA and persists totp_enabled + totp_verified_at to database. Disable flow requires valid TOTP code. Login challenge page (/auth/2fa) intercepts sessions where totpEnabled=true and totpVerified=false. Middleware gates all protected page and API routes on TOTP verification state. totpEnabled/totpVerified added to JWT and session types. Security tab added to Settings with enable/disable UI.
  • Schema — TOTP Fieldstotp_secret, totp_enabled, totp_verified_at added to User model in langgraph_app/prisma/schema.prisma.
  • Vertical Context Badge — Emoji Removed — Vertical context banner in TemplateStyleDrillDown now renders Lucide icons instead of emoji strings from backend YAML metadata. VERTICAL_ICON_MAP added matching VerticalSelector icon set.
  • Duplicate Schema Fixedlanggraph_app/prisma/schema.prisma had entire file duplicated. Second copy removed.
  • Vertical Selector — Generate Page — Industry vertical selection added as Step 1 of the generation flow. Fetches live vertical list from backend. General sentinel (__general__) handles unscoped access. Vertical constraints (allowed templates, allowed styles) fetched per vertical and applied to TemplateStyleDrillDown. Compliance badge rendered below grid.
  • TemplateStyleDrillDown Vertical FilteringallowedTemplateIds and allowedStyleIds fetched from /api/verticals/{id}/templates and /api/verticals/{id}/styles. verticalFetchFailed sentinel prevents blocking user on backend failure. Category filter bar derived from real template data. Vertical context badge shows scoped template count.
  • Generate Page 3-Step Flow — Generation workspace refactored into vertical → selection → generation step machine. Back buttons have type="button" to prevent form submission. Form state clears on back navigation. AbortController cancel pattern added to useEnhancedGeneration.
  • [verticalId] Proxy Routes — Four Next.js proxy routes created: /api/verticals/[verticalId]/route.ts, /templates/route.ts, /styles/route.ts, /defaults/route.ts. Next.js 15 params awaited correctly as Promise<{verticalId: string}>.
  • Templates Page Category Filter/templates page category filter derived from real template data via CATEGORY_DISPLAY map instead of hardcoded list.
  • LinkedIn SVG Path Fix — Invalid SVG path in layout.tsx corrected.
  • App Iconfrontend/app/icon.png replaced with W mark converted from favicon.ico.
  • Mintlify Docs Logologo/light.png and logo/dark.png placed. SVG wordmark created (Writerz white/dark + Room gold). docs.json updated.

April 18, 2026

  • Session expiry — JWT maxAge 30 days → 8 hours, 2-hour idle timeout, 30-minute rotation
  • Route protectionauthorized callback added to auth.config.ts; middleware now enforces auth
  • Auth hardening — session endpoints secured, Stripe checkout uses require_user_id, OAuth endpoints require X-Internal-Secret, login rate-limited (5/min), register rate-limited (3/min)
  • Fail-fastBACKEND_URL, STRIPE_SECRET_KEY, LANGGRAPH_API_KEY all throw at startup if unset
  • Bug fixessync_user.py rate limiter crash fixed, bcrypt offloaded to executor, registration timing oracle fixed, MODE_ALIASES populated, duplicate /api/user/me route removed
  • Generation unblockedmcp_available guard removed; was blocking every generation
  • MCP removed — all mcp_*.py files and stale backups deleted
  • Bug fixes — config cache mutation fixed, duplicate /api/generate router removed, HITL interrupt wired, time.sleep replaced with asyncio.sleep in planner/writer/editor, PostgresStore connection leak fixed, sync checkpointer replaced with async

April 12, 2026

  • Screenplay Page-Based Credit Scaling — Feature Screenplay generations now charge credits proportional to page count rather than a flat tier rate. Credits scale in 15-page blocks at the base tier rate (Quick: 1 credit/block, Standard: 4 credits/block, Premium: 5 credits/block). A 35-page Standard screenplay costs 12 credits; a 70-page Premium screenplay costs 25 credits. compute_screenplay_credit_cost() added to credit_service.py. CreditLedger schema extended with quantity and unit_cost columns for full audit trail.
  • Screenplay Tier Page Caps Enforced — Feature Screenplay page_count_target is now clamped server-side in the writer agent per tier (Quick: 15 pages, Standard: 35 pages, Premium: 70 pages). UI warning surfaces when requested page count exceeds the active tier ceiling, with a one-click upgrade prompt. feature_screenplay.yaml updated with tier_limits and tier_note fields. Docs updated with per-tier page ceilings and multi-act segmentation workflow for full-length features.
  • Formatter Passthrough Architecture — Format-strict templates (Feature Screenplay, TV Pilot, Press Release, Social Media, Email Newsletter, Landing Page) now bypass the LLM formatting pass entirely and run only regex-based AI-tell removal. Eliminates the formatter as a timeout vector for long-form screenplay content. LLM formatter execution time logged for observability. Content size gate added: non-citation templates exceeding 12,000 characters fall back to passthrough automatically to prevent context window truncation.
  • Citation Template Detection Fixed — Formatter citation validation now correctly matches white_paper, phd_dissertation, literature_review, and all academic variants via CITATION_TEMPLATE_TYPES frozenset. Previous substring check ("research" in template_type) missed white_paper entirely.
  • Reference Injection Idempotency_inject_references_from_state now checks for an existing References section before appending. Safe on generation retry — no duplicate reference blocks.
  • Timeout DB Persistence Fixed — Generation timeout branch now writes status: failed to GeneratedContent in Cloud SQL before returning. Resolves stale running status visible on multi-instance Cloud Run deployments where the polling request hits a different instance than the one that ran the job. Timeout error message now reflects actual tier ceiling (120s/420s/900s) rather than hardcoded “5-minute” string.
  • Contextual Error UI — Generation errors now surface with specific titles, explanations, and actions rather than a generic “Generation did not complete” message. Error codes (insufficient_credits, timeout, token_limit, auth_required, rate_limited, generation_failed) classified in useEnhancedGeneration.ts and mapped to contextual UI in the generate page. Timeout errors show tier name and ceiling. Credit errors link directly to the checkout page. Timeout errors show a one-click tier upgrade button.
  • Credit Pre-Flight Check Fixedcheck_generation_limit in the generate() endpoint now uses the fully resolved GenerationTier value rather than the raw pre-normalization string. Prevents tier mismatch between credit check and generation execution.
  • generationTier Exposed from HookuseEnhancedGeneration now returns generationTier so consuming components can reference the active tier without internal ref access.

April 11, 2026

  • Database Persistence — 17 Tables Wired — All previously empty tables now have active write paths: Subscription (Stripe webhook upsert on checkout + update on subscription changes), RevenueEvent (mirrors every Stripe payment), ContentVersion (initial version written on every generation), ContentView + ContentMetrics (track-view endpoint rewritten to DB), ApiUsage (HTTP middleware logging every non-polling request), ContentExport (record written on every export), ContentFeedback (new endpoint /api/content/{id}/feedback), DashboardMetrics (admin aggregation endpoint), PublishingJob + PublishingCredential (already wired via publishing routes), Portfolio (full in-memory engine replaced with Prisma-direct routes).
  • Portfolio Engine Rewriteportfolios.py rewritten to bypass in-memory PortfolioEngine and write directly to Prisma. Portfolio state now survives Cloud Run instance restarts. PortfolioManager.tsx updated to require authenticated userId.
  • GenerationTestRun Schema Expanded — 16 new observability fields added: wordCount, targetWordCount, wordCountDelta, aiTellCount, citationCount, seoScore, per-agent latency breakdown (plannerLatencyMs, researchLatencyMs, writerLatencyMs, editorLatencyMs), RAG signals (corpusHits, tavilyHits, researchConfidence), verticalId, userId, generationSource.
  • generation_test_logger.py Refactored — Extracts new metrics from final_state including word count delta, AI tell count, citation count, agent timings, corpus/Tavily hit counts, and research confidence. Failure call site updated with user and vertical context.
  • Beta Feedback Form — Standalone HTML form (writerzroom_beta_feedback_final.html) covering 10 sections across all platform surfaces. Submissions POST to /api/beta/feedback which fires a formatted Resend email to support@writerzroom.com and downloads a local JSON backup.

April 8, 2026

  • Billing Tab — Full billing management added to Settings. Shows current plan, credit usage, upgrade options, and credit pack purchases inline without leaving the app.
  • Demo Plan Updated — Demo now includes 6 credits (5 Quick + 1 Standard) so users can experience publish-ready quality before committing.
  • Credit Provisioning Fixed — Webhook now correctly provisions credits on checkout completion with idempotency guard against duplicate Stripe event delivery.
  • Billing Cycle Fix — Credit reset date now reflects actual subscription anniversary date rather than calendar month boundary.
  • Admin System Status Restored — Full telemetry view (circuit breakers, provider pools, platform metrics) restored for admin users on the System Status page.
  • Model Names Removed from UI — Pipeline tiers now described by outcome rather than underlying model names across all user-facing pages and docs.

April 4, 2026

  • File Upload for Templatesfile_upload parameter type now fully wired end-to-end. Upload PDFs, DOCX, XLSX, CSV, JSON, and TXT files directly in the generation workspace. Files are parsed server-side (/api/parse-file) and extracted text is injected into the writer prompt as grounding context. No file storage — content is extracted in-memory and discarded after generation. Supported across 10 templates: Data-Driven Report, Market Analysis, Research Paper, Business Proposal, White Paper, Technical Documentation, Strategic Brief, API Documentation, Feature Screenplay, and TV Pilot Script.
  • DynamicParameters File Upload Rewrite — Replaced client-side CSV/JSON-only parser with server-side multipart pre-upload flow. Upload state machine: idle → uploading → parsed (filename, type, char count, summary) → error. accepted_formats from YAML drives the browser file picker accept attribute per template.
  • file_processor.py — New backend service with format-aware parsers: CSV (schema + row preview), JSON (key extraction + array preview), XLSX (multi-sheet with openpyxl), PDF (page-by-page text via pypdf), DOCX (paragraph extraction via python-docx), TXT/MD (passthrough). 80,000 char extraction cap per file.
  • Brand Voice Uploader — Expanded accepted file types from .txt, .md, .html, .csv, .json to include .pdf, .docx, .doc, .xlsx. Backend parsing handled by file_processor.py.

April 3, 2026

  • 4-Zone Writer Prompt Architecture — Collapsed 10-layer instruction system into 4 priority zones (Contract, Structure, Voice, Materials). Citation contract now fires first, before any structural or style instructions, with a concrete enumerable source cap. Audience directive normalized to lowercase and elevated to Zone A. Statistics gate uses strict is True check — suppression directive injected when disabled.
  • Editor Citation Audit — Deterministic post-generation citation enforcement added to editor pipeline. Out-of-range markers (any [N] beyond verified source count) stripped from inline content and references section. Snippet-overlap misattribution detection flags citations where surrounding context shares zero content terms with the source snippet. Orphaned reference entries pruned via _prune_orphaned_references.
  • ASTA — Adaptive Source Retry — Agent-Supervised Tool Adaptation deployed in the researcher. SourceQualityScorer scores each source batch on relevance (TF-IDF weighted), authority (domain tier map), recency (exponential decay), and density. Batches below composite threshold trigger AdaptiveQueryReformulator to generate a broader and a reframed query. Retry results fused with attempt 1 via RRF — quality can only improve or stay equal.
  • Stat Validator Hardened — Proximity scoring added to validate_stat_against_sources. Number matching normalized (comma stripping). Context scoring now uses content-term filtering with stopword and stat-unit exclusion. Three-component score: number match (0.35) + context match (0.25) + proximity match (0.40).
  • Analytics Period Comparison — Dashboard percentage change indicators now computed against the equal-length prior period per selected range (7d, 30d, 90d). Backend returns changes object with real deltas. “No prior data” shown in gray for new users with no comparison window.
  • include_statistics Default Fixblog_article_generator.yaml default changed from true to false. Matches unchecked UI state.
  • Dead Code Removalfrontend/lib/analytics.tsx deleted (stub file with hardcoded data, unused).

March 2026

March 29, 2026

  • Security Hardening — Removed hardcoded API key from client bundle. Six unprotected backend routes gated with require_user_id. Admin routes (/api/status/admin, /api/admin/backfill-titles) locked to role == admin. Ownership checks added to content and accounts endpoints. INTERNAL_API_SECRET server-to-server auth added to /api/user/ensure and /api/user/me.
  • CORS Lockdownallow_headers: ["*"] replaced with explicit allowlist. No-op rate limiter middleware removed. Request ID no longer embeds client IP address.
  • Console Log Removal — All console.log and console.warn statements removed from the frontend bundle across 18 files.
  • Password Reset Flow — Full password reset implemented: request endpoint, confirmation endpoint, email delivery via Resend, request page, and confirm page with token validation and 1-hour expiry.
  • Auth Cleanup — OAuth access token removed from generation request headers. user_id: "anonymous" fallback replaced with hard fail. Auth callbacks stripped of verbose logging.
  • Docs — Legal & Policy — Privacy, data handling, abuse prevention, billing management, usage and limits, plans and pricing, FAQ, security overview, reliability, and profile/settings docs updated with subprocessors, GDPR/CCPA rights, refund conditions, credit protection statement, account deletion instructions, and password reset guidance.
  • Status Page — Webhooks button routes to /coming-soon. Email Updates and SMS Notifications buttons show coming soon toast.
  • UI Fixes — Tag underscores replaced with hyphens across template and style profile badges. Parameter Summary removed from DynamicParameters component.

March 28, 2026

  • RAG Research Stack — Dual-source retrieval pipeline deployed: pgvector corpus (voyage-large-2 embeddings, 1536d) + Tavily live web search, fused via Reciprocal Rank Fusion, reranked with voyage-rerank-2.5. Replaces single-source Tavily-only retrieval.
  • pgvector Corpus Storeresearch_corpus table on Cloud SQL (Postgres 17) with HNSW indexing. Semantic search with cosine similarity. Per-vertical corpus isolation.
  • Stat Validation Layer — Numeric claims and expert quotes extracted from research results and cross-validated against source URLs before reaching the writer. Unverified statistics are dropped at the retrieval boundary. statistical_evidence and expert_quotes fields now populated (previously always empty).
  • Citation Density Metricverified_claims / total_claims ratio computed per generation and persisted to GeneratedContent.contentIntelligence.citation_density.
  • Corpus Ingestion Pipeline — Multi-source ingestion: Tavily seed queries with domain biasing, FEC API (OpenFEC), web scraping (Pew, Brookings, Census). 4 verticals seeded: political, saas_tech, healthcare, fintech. Admin-only API endpoints for ingestion, search, and corpus management.
  • Admin Auth Dependencyrequire_admin_user gate added to corpus management routes. Hardcoded admin ID + role-based fallback.
  • Writer Research Format Update — Writer prompt builder updated to consume validated stat claim keys and quote speaker attribution from the new stat validator output format.

March 27, 2026

  • AI-Tell Suppression Refactor — Writer agent now runs regex-based AI-tell removal on its own output before passing to the editor. Banned words list elevated to position 2 in the system prompt for higher enforcement priority. Editor threshold set to 5 (from 1). Banned words list added to editor and formatter LLM prompts to prevent reintroduction during editing and formatting passes.
  • Writer Agent Refactored — Removed 3 duplicate method definitions, 4 blocks of unreachable dead code in _resolve_word_limits, fixed structure variable scoping bug. File reduced from 1891 to 1652 lines with zero logic loss.
  • Generation Failure DB Persistencerun_generation_workflow error handler now writes status: "failed" to the database, preventing infinite status polling on Cloud Run multi-instance deployments.
  • Call Writer Async Fix — Call Writer agent corrected from async to sync execution, preventing a TypeError in the agent pipeline.

March 26, 2026

  • Template-Style Mapping Expansion — Added matrix entries for data_driven_template, market_analysis_template, and strategic_brief_template. Added general_blog as recommended for blog_article_generator. Added vertical profiles as compatible across relevant templates.
  • 75 Style Profiles Deployed — Full rewrite of all style profile YAML files with opening_guidance, forbidden_patterns, required_elements, content_structure, language_requirements, and style_contract fields.
  • Quality Scores Complete — All 15 templates now have quality score entries in the template-style mapping.

March 2026 (Earlier)

  • Stripe Integration — Checkout-to-webhook-to-credit-grant flow verified end-to-end in test mode. Credit-based billing with per-tier costs (Quick=1, Standard=3, Premium=5).
  • Researcher Async Refactor — Serial Tavily loop replaced with asyncio.gather + ThreadPoolExecutor(max_workers=8). Tier-aware priority caps (Standard=3, Premium=5).
  • Beta Launch — Platform shared with initial group of users via direct URL sharing.

February 2026

February 29, 2026

  • Multi-Agent Pipeline — Full 8-agent LangGraph pipeline deployed: Planner → Researcher → Call Writer → Writer → Editor → Formatter → SEO → Publisher.
  • 15 Content Templates — Blog Article, Email Newsletter, Social Media Campaign, Press Release, Landing Page, Market Analysis, Business Proposal, Strategic Brief, White Paper, Research Paper, Data-Driven Report, Technical Documentation, API Documentation, Feature Screenplay, TV Pilot Script.
  • Tier-Aware Model Routing — Quick (fast), Standard (fast + standard quality), Premium (fast + maximum quality) with circuit breaker failover.
  • Content Intelligence — SEO scoring, readability analysis, and content quality metrics computed on every generation.
  • Knowledge Graph — Entity extraction and relationship mapping from generated content.
  • Publishing Integrations — WordPress, Ghost, Dev.to, Hashnode, LinkedIn, Beehiiv.
Last modified on May 11, 2026