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 atPOST /api/stripe/portalwith frontend proxy. Free tier removed —_check_free_limitdeleted,past_duereturnsaction: "update_payment". - Branding — Amber “Room” Split — “Room” now renders in amber (
#f59e0b) across all footer instances inlayout.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.tsmeta description. - Meta Description Rewritten —
APP_CONFIG.descriptionrewritten without em dashes for professional rendering across all pages that consume it. - Calendar — Save Fixed —
ContentCalendarEntry.createcorrected to useuser: {connect: {id}}relational syntax and ISO datetime strings withZsuffix. 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 fromCardto slimdiv.
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
generationrequestmodel. Now falls back toGeneratedContent(byrequestId) thenGenerationQueue(byid). 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:progressnormalized to0.0–1.0float, status values mapped to allowed enum (running → processing, etc.). - Evidence Gate Fixed — Generation engine was calling
extract_sources_from_langgraph_resultwhich always returned[]because it searched wrong keys in the LangGraph state dict. Now reads directly fromresearch_findings.sources, correctly passing the minimum evidence threshold. - Content Calendar — Date Filter Fixed —
GET /api/calendar?month=YYYY-MMwas returning 500. Prisma Python client requiresdatetimeobjects forDateTime @db.Datefields; filter was passingdateobjects. - Frontend Build — Jest Types Removed —
"jest"removed fromtypesarray infrontend/tsconfig.json. Was causingCannot find type definition file for 'jest'TypeScript error in Next.js production builds. - Frontend Tests — Node 18 Compatibility —
jest.setup.jsupdated withglobal.Responsepolyfill and correctedPromise/Errorcapitalization.useEnhancedGeneration.test.tsxadvanceTimersByTimecalls wrapped inact().tests/tsconfig.jsonupdated tomoduleResolution: 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 inglobals.css.proseutility classes applied toGeneratedContentDisplaycontent container. - Build Pipeline Stabilized — Dockerfile switched from
npm citonpm install --legacy-peer-deps --include=dev.framer-motion,react-markdown, andremark-gfmmoved fromdevDependenciestodependencies.qrcodedynamic import cast resolved with local type declaration. - TOTP 2FA Fixed — All Prisma field references in
totp.pycorrected from snake_case to camelCase. 2FA setup, verify, validate, and disable endpoints now functional end-to-end. - Google Avatar Fixed —
unoptimizedprop added toNextImageinNavigationClient.tsxandprofile/page.tsxfor Google OAuth avatar URLs. - Toast Width Fixed —
expand={true}removed fromToastProvider.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.useEnhancedGenerationhook: 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_generationFix — Returns a LangChainChatAnthropicinstance instead of a plain model name string. PreventsAttributeErrorin 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/nextjsinstalled and wired with conditional activation onNEXT_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-contentAPI route deleted. Copy files removed.
May 7, 2026
- Security Headers —
X-Frame-Options,X-Content-Type-Options,Referrer-Policy,HSTS,Permissions-Policy, andContent-Security-Policyadded 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 Tightened —
allow_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.pyRenamed — Typo corrected torequest_queue.py.style_profiles copy/Deleted — Duplicate directory removed. Was causing double-registration of every style profile.- Cloud Monitoring Alerts —
alerts.yamlrebuilt 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
userIdtoX-User-IDheader to match backendrequire_user_iddependency. - Annual Billing Architecture —
checkout.pyrestructured with separateSUBSCRIPTION_PRICES,ANNUAL_PRICES, andONETIME_PRICESmaps. Annual plans now usemode="subscription"with yearly interval.webhook.pycredit provisioning unified — annual subscriptions detected byraw_plan_tiermembership and provisioned atmonthly_credits × 12. - Frontend Cloud Run —
--timeout=900sand--min-instances=1added to frontend deploy incloudbuild.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 onprofileDataand missinguser: {connect}relation. Save header corrected fromuserIdtoX-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
TONEandVOICEbadges. Profiles list capped at 20, scroll container added. - Quality Gate Fixes — Citation check corrected to read
state.research_findings.sources. Disclaimer check now readsfinal_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_styleexpanded to all 70+ style profiles. - Pipeline Fixes —
quality_gatewired 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_overrideswrapper removed from frontend generation payload.
April 2026
April 30, 2026
- Quality Gate Wired —
quality_gatenode 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_TIERSTier 1 insource_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 Expanded —
political.yamlpreferred 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 toexclude_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, andmin_peer_reviewed_percentageinto 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.pyandlanggraph_app/core/model_registry.py. Active pipeline now routes toclaude-sonnet-4-6(Standard writer/editor),claude-opus-4-6(Premium writer/editor),claude-haiku-4-5-20251001(all other agents). Removed staleclaude-sonnet-4-20250514,claude-3-5-sonnet-20241022,claude-3-haiku-20240307references. Image agent updated togpt-image-2. OpenAI planner fallback updated togpt-5.4-mini.get_optimal_model_for_styleexpanded to cover all 70+ style profiles across three model tiers. - Duplicate
gpt-5Spec Removed —core/model_registry.pyhad a secondgpt-5entry under OpenAI Legacy with wrong capabilities and$0.005/1kpricing, silently overwriting the correct$2.50/1kentry. Removed. await get_compiled_graph()Fixed —run_generation_workflowwas 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_overridesWrapper Removed — Frontendroute.tswas wrapping all dynamic parameters in adynamic_overridessub-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_narrativestyle profile added todata/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 verticalallowed_styles. - Entertainment Vertical Styles Expanded — Entertainment vertical
allowed_stylesexpanded 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-voiceroute added to authenticated top navigation.NavigationClientisAppPagedetection changed from exact-match tostartsWithto 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/profilesandDELETE /api/brand-voice/profiles/[profileId]. Both auth-gated via NextAuth session, injectX-User-ID, forward to backend viagetBackendUrl(). - Brand Voice Delete Fix —
handleDeletein brand-voice page previously called the backend directly usingNEXT_PUBLIC_API_BASE_URLwith no auth headers. Now routes through the Next.js proxy. - User Deletion Security Fix —
delete.pynow fails closed whenINTERNAL_API_SECRETis unset. PreviouslyNone == Noneallowed 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-urlinstead of hardcodedprocess.env.BACKEND_URL || 'http://localhost:8000'. Fixes silent routing-to-localhost failures in environments that only setNEXT_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/profileswith inline delete. Links to/brand-voicefor new profile creation. - Settings — Style Profile Default — Style Profiles section fetches the full profile list from
/api/configuration/style-profilesand saves a default profile preference to the account.defaultStyleProfilefield added toGenerationSettingsinterface insettings-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/insightswith 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
Selectdropdown for section navigation instead of the sidebar. - Analytics Proxy Route —
GET /api/analytics/insightsNext.js proxy route added. Auth-gated, passesX-User-Idheader, forwards range query param to backend. - Profile and Settings Docs —
product/profile-and-settings.mdxfully 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_KEYenv var) and returns provisioning URI for authenticator apps (Google Authenticator, Authy, 1Password). QR code rendered client-side viaqrcodelibrary. Verification enables 2FA and persiststotp_enabled+totp_verified_atto database. Disable flow requires valid TOTP code. Login challenge page (/auth/2fa) intercepts sessions wheretotpEnabled=trueandtotpVerified=false. Middleware gates all protected page and API routes on TOTP verification state.totpEnabled/totpVerifiedadded to JWT and session types. Security tab added to Settings with enable/disable UI. - Schema — TOTP Fields —
totp_secret,totp_enabled,totp_verified_atadded toUsermodel inlanggraph_app/prisma/schema.prisma. - Vertical Context Badge — Emoji Removed — Vertical context banner in
TemplateStyleDrillDownnow renders Lucide icons instead of emoji strings from backend YAML metadata.VERTICAL_ICON_MAPadded matchingVerticalSelectoricon set. - Duplicate Schema Fixed —
langgraph_app/prisma/schema.prismahad 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 toTemplateStyleDrillDown. Compliance badge rendered below grid. TemplateStyleDrillDownVertical Filtering —allowedTemplateIdsandallowedStyleIdsfetched from/api/verticals/{id}/templatesand/api/verticals/{id}/styles.verticalFetchFailedsentinel 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 → generationstep machine. Back buttons havetype="button"to prevent form submission. Form state clears on back navigation.AbortControllercancel pattern added touseEnhancedGeneration. [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 15paramsawaited correctly asPromise<{verticalId: string}>.- Templates Page Category Filter —
/templatespage category filter derived from real template data viaCATEGORY_DISPLAYmap instead of hardcoded list. - LinkedIn SVG Path Fix — Invalid SVG path in
layout.tsxcorrected. - App Icon —
frontend/app/icon.pngreplaced with W mark converted fromfavicon.ico. - Mintlify Docs Logo —
logo/light.pngandlogo/dark.pngplaced. SVG wordmark created (Writerzwhite/dark +Roomgold).docs.jsonupdated.
April 18, 2026
- Session expiry — JWT
maxAge30 days → 8 hours, 2-hour idle timeout, 30-minute rotation - Route protection —
authorizedcallback added toauth.config.ts; middleware now enforces auth - Auth hardening — session endpoints secured, Stripe checkout uses
require_user_id, OAuth endpoints requireX-Internal-Secret, login rate-limited (5/min), register rate-limited (3/min) - Fail-fast —
BACKEND_URL,STRIPE_SECRET_KEY,LANGGRAPH_API_KEYall throw at startup if unset - Bug fixes —
sync_user.pyrate limiter crash fixed, bcrypt offloaded to executor, registration timing oracle fixed,MODE_ALIASESpopulated, duplicate/api/user/meroute removed - Generation unblocked —
mcp_availableguard removed; was blocking every generation - MCP removed — all
mcp_*.pyfiles and stale backups deleted - Bug fixes — config cache mutation fixed, duplicate
/api/generaterouter removed, HITL interrupt wired,time.sleepreplaced withasyncio.sleepin planner/writer/editor,PostgresStoreconnection 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 tocredit_service.py.CreditLedgerschema extended withquantityandunit_costcolumns for full audit trail. - Screenplay Tier Page Caps Enforced — Feature Screenplay
page_count_targetis 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.yamlupdated withtier_limitsandtier_notefields. 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 viaCITATION_TEMPLATE_TYPESfrozenset. Previous substring check ("research" in template_type) missedwhite_paperentirely. - Reference Injection Idempotency —
_inject_references_from_statenow 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: failedtoGeneratedContentin Cloud SQL before returning. Resolves stalerunningstatus 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 inuseEnhancedGeneration.tsand 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 Fixed —
check_generation_limitin thegenerate()endpoint now uses the fully resolvedGenerationTiervalue rather than the raw pre-normalization string. Prevents tier mismatch between credit check and generation execution. generationTierExposed from Hook —useEnhancedGenerationnow returnsgenerationTierso 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 Rewrite —
portfolios.pyrewritten to bypass in-memoryPortfolioEngineand write directly to Prisma. Portfolio state now survives Cloud Run instance restarts.PortfolioManager.tsxupdated to require authenticateduserId. GenerationTestRunSchema 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.pyRefactored — Extracts new metrics fromfinal_stateincluding 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/feedbackwhich fires a formatted Resend email tosupport@writerzroom.comand 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 Templates —
file_uploadparameter 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. DynamicParametersFile 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_formatsfrom YAML drives the browser file pickeracceptattribute 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, .jsonto include.pdf, .docx, .doc, .xlsx. Backend parsing handled byfile_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 Truecheck — 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.
SourceQualityScorerscores each source batch on relevance (TF-IDF weighted), authority (domain tier map), recency (exponential decay), and density. Batches below composite threshold triggerAdaptiveQueryReformulatorto 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
changesobject with real deltas. “No prior data” shown in gray for new users with no comparison window. include_statisticsDefault Fix —blog_article_generator.yamldefault changed fromtruetofalse. Matches unchecked UI state.- Dead Code Removal —
frontend/lib/analytics.tsxdeleted (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 torole == admin. Ownership checks added to content and accounts endpoints.INTERNAL_API_SECRETserver-to-server auth added to/api/user/ensureand/api/user/me. - CORS Lockdown —
allow_headers: ["*"]replaced with explicit allowlist. No-op rate limiter middleware removed. Request ID no longer embeds client IP address. - Console Log Removal — All
console.logandconsole.warnstatements 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 Store —
research_corpustable 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_evidenceandexpert_quotesfields now populated (previously always empty). - Citation Density Metric —
verified_claims / total_claimsratio computed per generation and persisted toGeneratedContent.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 Dependency —
require_admin_usergate added to corpus management routes. Hardcoded admin ID + role-based fallback. - Writer Research Format Update — Writer prompt builder updated to consume validated stat
claimkeys and quotespeakerattribution 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 Persistence —
run_generation_workflowerror handler now writesstatus: "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, andstrategic_brief_template. Addedgeneral_blogas recommended forblog_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, andstyle_contractfields. - 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.