March 2026 Changes
March 31, 2026
Features
- AI/Taxonomy: Add
answer_isolationto taxonomy content rules — per-topic high-leak keys, paraphrase maps, and isolation guidance injected into challenge generation prompts for domain-aware leak prevention (9 depth-0 + 23 depth-1 categories) - AI/CQ-012: Reduce false positives — expand
COMMON_CONTEXT_WORDS(+24 words), adddomain_common_wordstoAnswerIsolationfor taxonomy-aware severity scoring, improve flash-lite adapter with worked failure examples andthinkingConfig - AI/Model Routing: Promote gemini-3.1-flash-lite-preview to default tier fallback — 4x cheaper than gpt-5.4-nano with better CQ-012 compliance (96.8% T2 PASS)
- AI/Challenge Voice: Ban meta-language in challenge text — "fill in the blank", "based on these clues", "what is being described" replaced with natural conversational phrasing across style rules, voices, and prompt examples
- Entity-Aware FCGs: Cross-FCG title leak detection —
validateEntityTitleIsolation()prevents one FCG's title from revealing another FCG's challenge answers within the same entity - Entity-Aware FCGs: Sibling context injection in FCG generation — AI receives existing sibling titles and answers as "avoid" constraints, with up to 2 retries on leak detection failure
- Entity-Aware FCGs: Post-hoc entity title sweep script (
scripts/seed/sweep-entity-title-leaks.ts) — batch scans all entities with 2+ FCGs, flags leaks in content_operations_log - Entity Pages: Entity detail page (
/entity/[id]) — header with name/topic/aliases, FCG grid with challenge cards, linked entities section - Entity Pages: Entity explore page (
/explore) — search with debounced input, infinite scroll, topic filtering - Entity Pages: Entity search API (
GET /api/entities) — text search on name/aliases, topic filter, pagination, ordered by fact count - DB Queries:
getEntityById,getEntityFCGs,getSiblingFCGTitlesAndAnswers,searchEntitiesquery functions - AI/Model Adapters: Add gemini-3.1-flash-lite-preview adapter — Google's cheapest model ($0.25/$1.50 MTok), T2 PASS 7/7 at 25 entities (95.8% validation), $0.0026/FCG (4.6x cheaper than Gemini 3 Flash, 1.9x cheaper than nano)
March 30, 2026
Features
- FCG Testing: Add parent fact
contextfield to markdown report output - AI/Model Routing: Add
scienceto gpt-5.4-nano topic exclusions — routes to gemini-3-flash-preview
Bug Fixes
- AI/Fact Engine: Ban dry-report title pattern ("X's Y from the Z Study") in news and evergreen prompts
- AI/GPT-5.4 Nano: Generalize cross-challenge isolation rules from science-only to all topics
- AI/Gemini 3 Flash: Add cross-challenge isolation rules for sports entities (team names, venues, dates)
- AI/Challenge Content: Add single retry on schema conformance errors in FCG generation
- AI/CQ-012 Detector: Add severity-based contextual scoring (high/medium/low) — entity surnames, common context words (round, field, stadium, steps), and short generic tokens scored as low and filtered from validation; same-challenge checks report high+medium, cross-challenge checks report high only; validation rate 82.9% → 94.0%
- AI/Gemini 3 Flash + Nano: Add targeted same-challenge leak prevention — ban entity surname in reverse_lookup titles, ban venue/location names in location-answer titles; fixes "Bolt", "Lusail" title leaks
- AI/Challenge Content: Add post-generation date scrubber — deterministically replaces bare years and month names in setup_text/context when the answer contains that date component; eliminates "1981", "1998", "June" leaks
March 29, 2026
Features
- Follow-Up Challenges: Add mid-group bonus challenge system replacing Super Facts — hybrid content model with reuse + AI-enriched high-value pairings, ~5% trigger rate on correct answers, risk-free streak behavior
- Follow-Up Cron: Two-phase daily cron pipeline for computing knowledge graph pairings (zero AI cost) and dispatching AI enrichment for high-value connections (bounded cost)
- Follow-Up Submission: New
/api/cards/[slug]/follow-upendpoint for follow-up challenge answer recording with X.5 position tracking - Runtime Delivery: Server-side dice roll and follow-up offer in challenge group progress response with weighted candidate selection
Refactoring
- Super Facts: Deprecate Super Facts pipeline — remove handler, consumer loop, and mutation query exports; keep schemas for type compatibility
Bug Fixes
- Feed API: Fix leaked Promise.race in
/api/feedroute — add AbortController to cancel the losing branch, preventing accumulated orphan promises under Fluid Compute that caused cascading 504s - Home Page: Remove root redirect to
/feed— display a stub home page instead so app.eko.day and preview domains default to/
March 28, 2026
Documentation
- Projects: Overhaul
docs/projects/— archive 18 completed/outdated projects to_archive/completed/and_archive/outdated/, consolidaterailway-migration+railway-worker-deployintorailway/, addlaunch_gatefrontmatter labels (3 pre-launch, 8 post-launch), rewrite README as v2 launch status dashboard
March 27, 2026
Features
- Admin Dashboard: Add Points & Rewards section with Tiers configuration (gate editing, prestige display), Rewards management (CRUD, toggle, credit summary), Tuning (impact simulator, user lookup, bulk recalculation via queue), and Analytics (tier distribution, advancement velocity, bottleneck detection, credit redemption, topic heatmap)
- Queue: Add
BULK_RECALCULATE_PROGRESSIONmessage type for admin-triggered progression recalculation - Admin MCP Server: Add
eko-adminMCP server (packages/mcp-admin) with 6 progression management tools (status, simulate, lookup, recalculate, list_tiers, list_rewards) — Claude Code acts as the AI admin assistant via structured MCP tool calls - Skills: Add
/manage-progressionskill for MCP-based progression administration
March 26, 2026
Features
- Progression System: Add Pac-Man-inspired 12-tier progression with multi-gate scorecard (points, quality grade, topics, active days, C5 completions), subscription credits, two-phase prestige system, and database-driven tier/reward configuration
- Progression Engine: Add tier evaluation, prestige scaling, scorecard computation, and
evaluateAndAdvanceorchestrator triggered after challenge interactions - Progression API: Add 5 GET endpoints —
/api/user/progression(tier + scorecard),/topic(per-topic tiers),/history(advancement log),/rewards(unlocks + credit meter),/prestige(key collection) - Progression DB: Add migration 0175 with 10 tables, 3 enums, RLS policies, and seed data for 12 tiers with subscription credit, feature, and cosmetic rewards
- Points: Export
GRADE_SCALEarray and addgradeToMinScore()helper for grade-to-numeric lookups - Progression UI: Add FruitBadge, GlobalTierIndicator, ScoreCardPanel, and ChallengeResultTierProgress components with progression API integration; add tier indicator to authenticated layout header and tier progress to challenge card detail
Bug Fixes
- CI: Exclude ephemeral directories (
docs/_internal/,docs/test-results/,.superpowers/) from frontmatter validation - CI: Exempt
scripts/*fix*.tsandscripts/*index*.tsfrom changelog requirement (internal tooling) - Dev Tooling: Add
effortfrontmatter to all active agents and skills for Claude Code effort level optimization - Dev Tooling: Add
initialPromptto background agents (docs-librarian, observability-analyst) for auto-start behavior - Dev Tooling: Add
isolation: worktreeto queue-sre agent for safe parallel execution - Dev Tooling: Add PostCompact hook to reinject TODO.md state and GTD context after compaction
- Dev Tooling: Add FileChanged hook to detect external dependency/env/migration changes and suggest actions
- Dev Tooling: Add TaskCreated hook to remind about TODO.md creation for GTD compliance
- Dev Tooling: Add HTML comments to CLAUDE.md providing internal context for human readers (hidden from Claude)
- Skills: Add
/fcg-testskill for guided FCG quality testing with model selection, entity sets, eligibility scoring, failure diagnosis, cost tracking, and recycle loop - FCG Testing: Add
--dry-run,--entity-set,--exclude-topicsflags totest-fcg-diversity.ts - FCG Testing: Add cost tracking and machine-readable failure JSON to SUMMARY.md output
- FCG Testing: Add entity set schema, cost estimation, and random entity query to test harness
March 25, 2026
Features
- AI/Challenge Quality (CQ-012): Add programmatic answer leak detection —
extractAnswer(),tokenizeForLeakCheck(),checkAnswerLeak()detect when setup_text/context/challenge_title reveals the correct answer; integrated intovalidateChallengeContent() - AI/Challenge Quality (CQ-012): Add cross-challenge answer isolation —
validateGroupAnswerIsolation()detects when one challenge's text leaks another challenge's answer within the same group - AI/Challenge Quality: Filter null-valued fact keys from challenge generation — prevents challenges targeting meaningless null keys (e.g.,
platform: null,year: null) - AI/Challenge Quality: Add field-specific banned pattern support —
BANNED_PATTERNS_DATAnow supports optionalfieldsproperty to restrict patterns to specific text fields - AI/Challenge Quality: Add title-specific
\bWrong\bbanned pattern — catches "Wrong" in challenge titles without false-positiving on prose - AI/Challenge Quality: Expand CQ-002 prefix pools from 3 to 8+ per style and style voice phrasing pools from 4 to 8+ per style for greater text variety
- AI/Challenge Prompts: Add negative examples to ANSWER ISOLATION and CONTENT-AWARENESS prompt blocks showing common leak patterns
Bug Fixes (earlier)
- AI/Challenge Groups: Fix fact-key repetition in FCG generation — strengthen prompt to require minimum 3-4 unique keys across 5 challenges (scaled by available key count), add
validateGroupDiversity()post-generation check, and retry with explicit round-robin key assignments on failure - AI/Challenge Groups: Fix FCG path missing
patchCq002andpatchPassiveVoiceforchallenge_text— align with single-challenge pipeline - AI/Challenge Content: Restore
patchCq002()prefix-prepending (was no-op since March 18) — deterministic CQ-002 compliance for challenges missing "you/your" - AI/Challenge Content: Add
patchBannedPhrases()for post-generation AI-ism replacement — deterministic regex replacement of "a testament to", "delve into", "in many ways", "at its core", "in essence" with natural alternatives
Features
- Test Harness: Parallelize FCG test script with
pMap+ provider-aware concurrency caps; add--concurrency,--output-dirflags - Test Harness: Add 7-dimension eligibility scorecard (structural, completeness, validation, key diversity, style adherence, CQ-002, schema) with T1/T2/T3 thresholds to FCG test summary
- Test Harness: Export
pMapfrom harness, dedup fromllm-fact-quality-testing.ts - Test Harness: Add 4 sports entities (Muhammad Ali, Babe Ruth, Wayne Gretzky, Usain Bolt) to curated test set for T2 handoff coverage testing
- Test Harness: Add
--topicsCLI flag for topic-based entity filtering (e.g.,--topics sportsruns only sports entities) - AI/GPT-5.4 Nano Adapter: Add
musicto excluded topics after T2 testing showed 50% validation failure rate (Beethoven); model router falls back to gemini-3-flash-preview for music entities - Model Testing Docs: Update all 7 model testing prompt docs to v1.3.0 — add GPT-5.4 models, update adapter counts (11→13), fix signoff model default, document
getExcludedTopics()and provider concurrency caps
Improvements
- AI/GPT-5.4 Nano Adapter: Address 8 challenge quality issues from v4 canary — answer leaking in setup_text (10%), target_fact_key monoculture (40% of facts), correct_answer repetition, date format (natural prose dates, ISO banned), AI-ism phrases, choppy challenge_text flow, setup text monoculture (100% identical "In [YEAR]..." openers), title voice overhaul (editorial register: Verge/Wired/VF for evergreen, NYT/WaPo/qz for news), add signoff_review task with Nano-specific checks, bump challenge temperature from 0.6 to 0.7
- AI/Gemini 3 Flash Preview Adapter: Cross-pollinate 6 quality rules from Nano — answer isolation, setup text variety with per-difficulty angle strategy, target fact key diversity, correct answer variety, title voice (publication registers), reveal_wrong tone, date format in prose, challenge text self-containment
- AI/Shared Layer: Promote universal rules — answer isolation and challenge_text self-containment to shared guardrails (challenge-content.ts), date format and reveal_wrong tone to voice constitution (challenge-voice.ts), 5 AI-ism phrases to banned patterns (challenge-banned-patterns.ts)
Maintenance
- Dependencies: Update all project dependencies across 5 tiers — low-risk patches (vitest, shadcn, yaml, etc.), tooling (biome 2.4.9, turbo 2.8.20), runtime (next 16.2.1, sentry 10.46.0, supabase-js 2.100.0), TypeScript 6.0.2, and lucide-react 1.6.0
- TypeScript 6.0: Add explicit
types: ["node", "bun"]to tsconfig.base.json (TS 6 defaults to empty), remove deprecatedesModuleInteropoption - Biome 2.4.9: Update schema version, apply new export sorting rules
March 24, 2026
Features
- Points System: Replace continuous 0.0-1.0 scoring with difficulty-based points (C1-C5 award 1-5 pts correct, deduct half for incorrect)
- Quality Grading: Add attempt-based quality scoring (A+ on 1st attempt, B+ on 2nd, C- on 3rd, F on 3 failures) with difficulty-weighted aggregate grade
- Retry Lockout: Add 48-hour cooldown after wrong challenge answers (attempts 1-2) before retry is allowed
- User Stats API: Add
/api/user/statsendpoint with per-taxonomy-category points and quality grade aggregation - Quality Grade API: Add
/api/user/quality-gradeendpoint, activates at 100 cumulative points - Group Progress: Show per-position points earned, quality grade letters, and retry lockout countdown in challenge group indicator
Bug Fixes
- Admin Env Vars: Fix edit/save/delete not working —
AlertDialogActionauto-closed dialogs before async server actions could execute; replaced withDialog+useTransitionfor edit, andButton+useTransitionfor delete - Admin Env Vars: Sync edit dialog state from props on open so values reflect latest revalidated data
Features
- AI Model Router: Switch all three tiers (default/mid/high) to
gpt-5.4-nanoin both DB and hardcoded fallback; sports topic override togemini-3-flash-previewnow active (was previously a no-op when all tiers were gemini) - Admin Env Vars: Add key name editing and renaming in edit dialog
- Admin Env Vars: Add category assignment — vars can be moved to any group via the edit dialog, with auto-detect fallback
- Admin Env Vars: Add custom group creation and deletion — groups stored in
.env-meta.jsonand inserted before "Other" in the category list - Admin Env Vars: Custom categories show a delete button in the section header
- AI Model Router: Add topic-based model overrides — routes sports entities to gemini-3-flash-preview when default model has excluded topics
- AI Adapters: Tune gpt-5.4-nano adapter across 6 canary iterations: injection-trigger prevention, CQ-002 compliance (58%→78%), verbosity override in prefix position, 5-step self-contradiction check, worked failure examples for outdated science data, temperature reduction for challenge/evergreen tasks
- AI Adapters: Add
getExcludedTopics()to ModelAdapter interface — models self-declare domains they cannot handle (gpt-5.4-nano excludes sports) - Test Harness: Add entity filtering by model topic exclusions in LLM quality testing pipeline — sports entities automatically skipped for models that declare sports exclusion
- AI Model Router: Derive topic overrides dynamically from adapter
getExcludedTopics()— single source of truth replaces three separate static maps - Test Harness: Add Section F "Topic Weakness Analysis" to LLM test reports — per-topic scorecards with automatic handoff recommendations to
gemini-3-flash-previewwhen combined validation+challenge score falls below 85%
Documentation
- Architecture: Rewrite architecture overview and tools reference for V2 fact engine as primary system; remove dropped V1 tables and URL tracking tools
- Architecture: Mark ADRs 001-012 with V1/vNext legacy status; add ADR-017 (Challenge Answer Isolation); reorder summary V2-first
- Dev Guides: Rewrite testing guide with V2 E2E verification checklist replacing V1 URL tracking checklist
- Dev Guides: Rewrite deployments guide removing Fly.io references, adding Vercel/Bun worker deployment
- Dev Guides: Rewrite observability guide with Sentry, AI cost tracking, and pipeline monitoring
- Dev Guides: Update database guide — remove dropped V1/vNext tables, fix migration count to 174, add missing V2 tables
- Dev Guides: Update Drizzle guide — replace V1 examples and query listings with V2 fact engine queries
- Deprecation: Mark global-url-library contract and brand-library-schema as deprecated V1 artifacts
- Indexes: Update docs/README.md, dev/README.md, architecture/README.md, and contracts/README.md for completeness
March 23, 2026
Features
- AI Models: Add
gpt-5.4-mini($0.75/$4.50/MTok) andgpt-5.4-nano($0.20/$1.25/MTok) to model registry with adapters for fact validation, extraction, and challenge generation - AI Models: Deprecate
gpt-5-miniandgpt-5-nanoin favor of 5.4 series - AI Models: Replace v1 URL-tracking escalation (
ComplexitySignals, page-type rules) with v2FactEscalationSignals— dynamic model tier escalation based on validation confidence, cross-model disagreement, schema conformance difficulty, multi-claim complexity, and voice/tone alignment - AI Models: Remove dead code:
generateSummaryWithDiffs(), Opus daily call counter, v1 complexity thresholds - AI Models: Set high tier fallback to
gpt-5.4-minifor superior challenge content quality (voice 98, schema 100, style 93); default and mid tiers remaingemini-3-flash-previewfor accuracy and cost - AI Models: Tune
gpt-5.4-miniadapter with factual accuracy guardrails (anti-sports-fabrication), self-audit checklists, and content richness requirements — validation improved 80→90, evidence 0→50, style 86→93, token efficiency 81→94 across 4 iteration rounds - MusicBrainz: Expand client from artist-only to full entity coverage — add discography (release groups with album/single/EP counts), recording search (song title, duration, artist credits), and label search (name, type, country, founding date)
- OMDb: Add OMDb (IMDb) client for film/TV fact verification — title lookup, IMDb ID lookup, keyword search. Returns release dates, directors, cast, awards, box office, ratings, runtime, and season counts
- Open Library: Add
getAuthorWorks()for author bibliography — total work count and up to 50 works with titles and publish years. Verifies claims like "Agatha Christie wrote 66 novels" - REST Countries: Add country data client — lookup by name, code, or capital. Returns population, area, capital, languages, currencies, borders, region, timezones, UN membership. Free, no auth
- USDA FoodData Central: Add food/nutrition client — search foods, get nutrient profiles (calories, protein, fat, carbs). Free, 1K req/hour
- Met Museum: Add artwork client — search 470K+ artworks, get artist, date, medium, dimensions, department. Free, no auth
- RAWG: Add video game client — search 500K+ games, get release dates, Metacritic scores, genres, platforms, developers. Free, 20K req/month
- IUCN Red List: Add species conservation client — search species, get conservation status (LC/VU/EN/CR/EX), population trend, taxonomy. Free with token
- Open-Meteo: Add historical weather client — get daily temp, precipitation, wind for any location back to 1940. Free, no auth
- TheMealDB + TheCocktailDB: Add combined meal/cocktail client — search dishes by name (cuisine origin, category, ingredients) and cocktails (ingredients, glass type, alcoholic/non). Free, no auth
- Art Institute of Chicago: Add artwork client — search 120K+ works, get artist, date, medium, dimensions, style. Strong on American art and Impressionism. Free, no auth
- Smithsonian Open Access: Add cross-museum client — search 11M+ objects across 19 museums (art, history, science, design, space). Requires free api.data.gov key
- Evidence Pipeline: Wire 10 new API sources into Phase 4b domain routing — OMDb (entertainment/tv), REST Countries (geography), USDA + TheMealDB + TheCocktailDB (food-beverage/cooking), Met Museum + Art Institute of Chicago + Smithsonian (art/architecture/design), RAWG (games), IUCN Red List (animals), MusicBrainz discography (music). Add wiring convention docs for future API additions
- Wikidata: Expand property extraction from 10 to 60 properties covering sports (team, position, league), music (label, genre), film/TV (director, cast, box office, seasons), geography (capital, population, area, language), architecture (architect, style, height), organizations (founded, employees, revenue, HQ), science (field of work, discoverer), history (start/end time, casualties), and food (country of origin). Multi-value extraction for awards, teams, cast, genres (up to 5 values)
Bug Fixes
- Web: Replace
Promise.racewithAbortController-backed fetch in proxy to properly cancel hangingsupabase.auth.getUser()calls and prevent Fluid Compute instance exhaustion - Web: Add
maxDuration=30to/api/feedroute to cap function billing on hanging requests - Public: Mark homepage as
force-dynamicwith 5s abort timeout for feed fetch to prevent SSR cascade failures
March 21, 2026
Features
- Claude Code: Add
StopFailurehook to capture API errors with timestamped logs and uncommitted work warnings - Claude Code: Configure
worktree.sparsePathsto limit worktree agents to essential monorepo paths (packages, apps, config)
Bug Fixes
- Web: Exclude
/api/healthfrom proxy matcher and add 5s timeout tosupabase.auth.getUser()in proxy to prevent hanging auth calls from blocking all requests - Web: Add
.catch()to proxy auth promise race to prevent unhandled rejections from crashing function runtime - Public: Add 5s AbortController timeout to homepage feed fetch to prevent cascading 504 when app.eko.day is unreachable
March 20, 2026
Bug Fixes
- DB: Add 15s Postgres statement timeout and 20s route-level timeout to
/api/feedto prevent hanging queries from burning Fluid Provisioned Memory
March 18, 2026
Features
- Challenge Voice: Overhaul challenge content voice across all 5 styles — add tone-matching principle (match emotional register to subject gravity), replace REWARD/DISCOVERY techniques with matter-of-fact VERIFICATION/CLARIFICATION techniques, ban hokey salutations in reveals (UI provides labels), add setup integration rule (explicit subject naming on first reference)
- Challenge Voice: Relax CQ-002 "you/your" enforcement — second-person address is now PREFERRED instead of MUST, patchCq002() becomes a no-op, AI prompt encourages natural conversational framing
- Challenge Voice: Update reveal rewrite pools — CORRECT_REWRITE_POOL uses factual-connection templates instead of praise-oriented openings, WRONG_REWRITE_POOL uses direct answer statements instead of discovery-framed openings
- Challenge Voice: Update Zod schema descriptions for challenge_title (book-title style), context (tandem relationship with challenge text), and reveal fields (verification/clarification voice)
- Challenge Voice: Update evergreen fact generation prompts — title guidance emphasizes versatility for downstream challenges, challenge_title guidance matches book-title voice, context adds tone-matching guidance
- FCG: Add Fact Challenge Groups — each fact's 5 challenges grouped C1→C5 with increasing difficulty (2 MC + 3 AI-selected styles)
- FCG: Add challenge_group_id to fact_records, group_position to fact_challenge_content (migration 0172)
- FCG: Add challenge_group_progress table for per-user group advancement with attempt tracking and position locking
- FCG: Add generateGroupChallenges() — single AI call generates all 5 group challenges with content-awareness between them
- FCG: Add group progression API (GET/POST /api/cards/[slug]/group-progress) — lazy init, 3 failed attempts auto-advance, group completion tracking
- FCG: Add GroupProgressIndicator component — C1→C5 visual progression with check/x/lock icons
- Images: Update anti-spoiler image search to use context/setup/title (not challenge_text) as source content, exclude secondary subjects mentioned only in challenge_text
- Images: Extend needsImageOverride() to detect answer leaks in direct_question (expected_answer) and multiple_choice (correct option text) in addition to existing fill_the_gap and reverse_lookup checks
- Images: Add challenge_context, challenge_title, challenge_text to RESOLVE_CHALLENGE_IMAGE queue message for richer anti-spoiler query building
- Taxonomy: Add voice and content rules for all active depth-1 and depth-2 categories (464 new entries), giving every category at depth 0-2 its own specialized AI extraction and challenge generation guidance
- Taxonomy: Add depth-2 resolution tests (voice atomic return, depth-3 fallback, three-layer rules merge, vocabulary merge)
- Taxonomy: Update completeness check to query DB directly for category coverage instead of stale CSV export
March 17, 2026
Features
- Admin: Add Ingestion Controls section with three sub-pages — News, Evergreen, and Seeding pipeline runtime configuration
- Admin: Add
/ingestion/newspage — provider toggle cards, threshold form, selective ingest trigger, recent runs table - Admin: Add
/ingestion/evergreenpage — master on/off switch, daily/per-topic quotas, manual trigger, generation history - Admin: Add
/ingestion/seedingpage — richness tier config, challenge settings, active run management, failed entry retry - Admin: Add sidebar Ingestion nav group with Rss/Leaf/Sprout icons between Overview and Content
- DB: Add typed config interfaces (
NewsIngestionConfig,EvergreenConfig,SeedingConfig) with merge-over-defaults accessors - DB: Add
getNewsProviderHealth()query — per-provider article counts (24h/7d) and last fetch time - DB: Add
getRecentIngestionRunsByType(),getActiveSeedRuns(),cancelSeedEntry()queries - Pipeline: Update
triggerIngestNews()to respect provider enabled flags and per-provider maxResults from feature config - Pipeline: Update
triggerGenerateEvergreen()to read quotas from evergreen feature flag config - Workers: Add feature flag checks to
processIngestNews()andprocessGenerateEvergreen()(fail-open) - Admin: Redirect
/pipeline/seedto/ingestion/seeding - Migration: Seed
news_ingestion_config,evergreen_config,seeding_configfeature flag rows with defaults - Challenges: Add hybrid fuzzy answer matching — case-insensitive exact match, acceptable_answers array lookup, Levenshtein distance tolerance (max 2 for short answers); AI fallback reserved for
free_textonly (dq/ftg/rl return 0 on no-match without AI); eliminates unnecessary AI calls for obviously wrong answers - Challenges: Consolidate all text-input challenge types (fill_the_gap, direct_question, reverse_lookup, free_text) into unified TextInputChallenge component; single-line input for short answers, multi-line for free_text; shows gapped sentence for fill_the_gap style; removes separate Recall tab
- Shared: Add
matchAnswer()utility withlevenshteinDistance(),normalizeAnswer(), andsimilarityRatio()helpers
Documentation
- Seeding: Sync SEED.md with codebase — fix category hierarchy (3-level→4-level, depths 0–3), fix challenge styles (6→5, drop statement_blank), update category counts (44 roots, 162 subcategories), add 2 news providers (newsdata, event_registry), add 3 new scripts (cleanup-seed-queue, deepen-topic-paths, remap-topic-paths), update model eligibility status
- Product: Add fact-ingestion-sot.md — Source of Truth map for all three fact pipelines (news ingestion, curated seeding, evergreen) with per-component SOT files, shared spine, key thresholds, and env vars
March 13, 2026
Documentation
- Docs: Comprehensive docs folder audit — fix broken links in README.md (dead Design/Specs sections, stale agent table)
- Docs: Merge product bible v2 draft into active file (expanded validation, challenge voice stack, 6 AI providers, model adapters, glossary)
- Docs: Delete 4 timestamped backup files and 1 redundant PDF
- Docs: Relocate misplaced files — move 2 plans to docs/plans/, CSV to seeding/, rename brand deck
- Docs: Create 3 runbook stubs (ingestion, fact-extraction, validation) for agent-declared ownership
- Docs: Remove empty directories (specs/, ingestion-runs/)
- Docs: Unify status taxonomy in CONVENTIONS.md — 6 statuses (draft/active/stable/locked/deprecated/archived) resolving conflict between CONVENTIONS.md and plan-governance.md
- Docs: Consolidate template directories — move docs/_templates/ into docs/templates/doc-creation/
- Docs: Add missing READMEs (test-results), fix press-releases README typo, add convention exemptions
- Docs: Add design-system/README.md placeholder, move design-system/TODO.md to projects/
- Docs: Add header comment to claude-project-instructions.md explaining its purpose
March 9, 2026
Features
- Security: Add SEC-006 rule preventing challenge answer leakage in URLs (INV-008)
- Admin: Add dark mode support —
.darkCSS token overrides for full light/dark toggle; sidebar collapsible groups for Content and Operations sections; expandable sub-menus for Pipeline (Runs/Seed) and Billing (Overview/Customers) - Admin: Add pipeline trigger controls — fire-and-forget buttons for ingest news, cluster sweep, generate evergreen, validation retry, archive content, and topic quotas with toast feedback
- Admin: Add queue management actions — per-queue Clear (with AlertDialog confirmation) and Recover Stale buttons; DLQ retry/clear with toast feedback and pending states
- Admin: Add taxonomy CRUD — collapsible topic tree view with search/filter, add subcategory dialog, inline topic editing (quota/target), deprecate/reactivate flows with replacement picker
- Admin: Add quality dashboard — fact status distribution, challenge content coverage, topic quota achievement with color-coded health indicators, today's AI spend
- Admin: Add content operations page — fire-and-forget buttons for regenerate challenges, archive expired, promote engagement with operations audit log (new
content_operations_logtable, migration 0170) - Admin: Add content rules viewer — read-only reference for voice constitution, style rules, banned patterns, difficulty levels, and taxonomy rules from
@eko/aiconfig - Database: Add quality query functions —
getFactStatusDistribution,getChallengeContentCoverage,getTopicQuotaAchievement,getStuckValidationCount, content operations log CRUD - Taxonomy: Bulk seed 273 topic category aliases covering universal synonyms, abbreviations, NewsAPI/GNews/TheNewsAPI/NewsData.io provider slugs, depth-1 subcategory terms, and cross-cultural sport names (migration 0166)
- AI: Add path-aware taxonomy rules/voice resolution —
resolveContentRules('sports/basketball')now walks the path and merges depth-specific overrides with root rules; voice resolution returns the most-specific match atomically - AI: Add 23 depth-1 content rule overrides and 12 depth-1 voice overrides for high-impact subcategories (basketball, soccer, football, baseball, physics-space, biology-medicine, chemistry-materials, philosophy-ethics, festivals, ancient-civilizations, modern-history, ai-ml, startups, celebrity, countries, natural-wonders, mammals, world-cuisines, everyday-technology, video-games, famous-authors, minerals-gems, extreme-weather)
- AI: Expand depth-1 taxonomy coverage — add 20 content rule overrides (hockey, cricket-rugby, individual-sports, nobel-prize, world-religions, mythology-folklore, medieval-renaissance, post-war-contemporary, cybersecurity, computing-software, marketing-advertising, film-cinema, comedy-standup, architectural-styles, mental-health, diseases-conditions, world-leaders, destinations-tourism, famous-problems-theorems, motorsports) and 10 voice overrides (baseball, modern-history, chemistry-materials, mental-health, world-religions, film-cinema, cybersecurity, hockey, architectural-styles, famous-problems-theorems)
- Taxonomy: Seed 43 additional topic category aliases covering COVID/pandemic, music genres, environment/climate, current events, people types, and geography features (migration 0169)
Bug Fixes
- Database: Fix
fn_inherit_parent_schema_and_formatstrigger referencing droppedchallenge_format_topicstable — rename tofn_inherit_parent_schemawith only schema inheritance logic (migration 0168) - Database: Clean up orphaned
finance_factschema remnant on inactivefinanceroot category — update tobusiness_finance_fact(migration 0167)
Documentation
- Prompts: Audit prompt library for v2 fact engine — archive 5 brand/ prompts, remove
challenge_formats/challenge_sessions/challenge_format_topicsreferences from 11 files across taxonomy, database, quality, config, and seeding domains
Cleanup
- Fact Engine: Remove release groups and challenge formats features (out of v2 scope) — drop
release_groups,release_group_challenges,challenge_formats,challenge_format_styles,challenge_format_topics,challenge_sessionstables; remove 9 API routes, admin pages, feed interleaving, conversational challenge AI, and all related UI; restorecard_interactions.fact_record_idto NOT NULL; keepchallenge_styleenum (core infrastructure)
March 8, 2026
Features
- Taxonomy: Expand depth-0 holdout subcategories — add migration 0162 with 39 new depth-1/2 categories under entertainment (music, film, books), sports (multi-sport events, venues, media, horse racing), business (marketing, accounting, HR, industries), architecture (interior design, urban planning, preservation), and technology (hardware, cloud, energy/materials); reclassify 10K+ depth-0 entries via AI third pass; delete 2,556 junk/low-confidence entries; reduce depth-0 from 11,505 to 2,676
- Card Detail: Add SEC-007 answer leak prevention — gate related entities behind
hasAnsweredcheck, add topic safety filtering, add related entities API endpoint
Bug Fixes
- Public Site: Mark homepage as dynamic to prevent static build timeout in CI
March 7, 2026
Features
- Knowledge Graph: Wire read-side APIs for entity graph — add GET
/api/entities/[id]/links,/api/entities/[a]/paths/[b],/api/entities/[id]/factsendpoints exposing existing graph queries; add related entities section to card detail page; inject graph data into Degrees of Separation challenge sessions; addgetRandomEntityPair()for challenge entity selection - Knowledge Graph: Connect news pipeline to entity graph — resolve extracted entity names against
seed_entry_queueviafindEntryByNameOrAlias()during news fact extraction; setseed_entry_idon news-sourcedfact_records - Knowledge Graph: Add alias population during seed explosion — AI generates alternative names/nicknames/abbreviations for entities; aliases stored in
seed_entry_queue.aliasesarray; enables fuzzy entity matching viafindEntryByNameOrAlias() - Knowledge Graph: Add graph density metrics to
getSeedStats()— total entity links, average links per entity, connection type distribution - Seed Pipeline: Add entity linking layer — many-to-many
seed_entry_linksjunction table with canonical UUID ordering; directseed_entry_idFK fromfact_recordstoseed_entry_queue;linked_entry_idFK onsuper_fact_links; bidirectional entity queries;findEntryByNameOrAliaswith alias fallback; spinoff and super fact discovery now create entity links; backfill migration for existing relationships - Seed Pipeline: Add seed entry queue cleanup and hardening — garbage deletion script for HTML/label/sentence entries; topic path normalizer converting arrow/pipe/GT separators to valid slugs; fuzzy topic path matcher with prefix and root fallback; shared validation module rejecting invalid names and paths; guards at CSV parser, AI spinoff prompt, explode-entry handler, and bulk insert; batch remap script for existing malformed entries
- Seed Pipeline: Add AI-assisted topic depth optimization script —
deepen-topic-paths.tswith audit, classify, and apply modes; reclassifies depth-0/1 entries into depth-2/3 subcategories using full taxonomy tree; JSONL output with resume support; bounded concurrency; confidence-based filtering; collision deduplication; supports--root,--min-depth,--min-confidenceflags
March 4, 2026
Features
- Fact Engine: Add Event Registry (NewsAPI.ai) and Newsdata.io as full-text news providers, replacing truncated-content APIs (NewsAPI.org, GNews, TheNewsAPI) — Event Registry returns full article bodies on free tier (2000+ chars vs old APIs' 200-char stubs); add DB migration for new provider enum values and full_content column; implement fetch clients in production handler and test pipeline; update cron route, config, shared schemas, and queue types
- Fact Engine: Fix LLM date hallucination from thin article content — raise article quality threshold to 400 chars with headline-content ratio check; add publishedAt temporal grounding to extraction prompts; tighten evidence validation recency penalty for uncertain verdicts with zero Wikipedia grounding
March 1, 2026
Features
- Fact Engine: Add content hash deduplication for fact records — SHA-256 hash from title + schemaId + facts with deterministic key sorting; silent skip on duplicate insert; backfill migration with collision resolution; partial unique index excluding archived records
- Taxonomy: Expand taxonomy with depth-3 subcategories — add 10 migrations (0139-0148) for full taxonomy expansion including depth-2 subcategories, business/finance merge, new root categories, and depth-3 categories; update category config, DB queries, and category mapper to support expanded hierarchy
- Taxonomy: Add voice and content rules for 8 uncovered root categories (countries, nature, human-achievement, events, records, health-medicine, language-linguistics, space-astronomy) with slug alias resolver for sport-specific and legacy slugs
- Taxonomy: Add category deprecation tracking with deprecated_at, replaced_by, and deprecation_reason columns; resolveActiveCategory follows replacement chains for audit trail; wire into resolveTopicCategory as inactive-category fallback
- Taxonomy: Replace hardcoded depth ceilings with MAX_TAXONOMY_DEPTH constant; extend getActiveTopicCategories to depth-5, getDescendantCategoriesForParent to 3 levels, and formatSubcategoryHierarchy to recursive nesting
- Taxonomy: Expand depth-3 categories with ~14 new subcategories across science, history, geography, and architecture domains
- Taxonomy: Expand depth-3 categories wave 2 with 22 new subcategories across sports, culture, science, people, and places domains
- Taxonomy: Expand depth-3 categories wave 3 with 17 new subcategories across technology, entertainment, games, and business domains
- Taxonomy: Backfill deprecation metadata for 5 inactive root categories (accounting, marketing, spelling-grammar, statistical-records, things) with replaced_by successors
- Taxonomy: Backfill 18 depth-3 children for 9 culture depth-2 parents that had zero children (movements, festivals, languages, movies, music)
Documentation
-
Glossary: Add 12 fact-engine terms (topic category, taxonomy depth, category deprecation, active category resolution, fact record, fact record schema, evergreen fact, taxonomy voice, taxonomy content rules, challenge content, challenge image, notability score)
-
Schema Map: Add deprecation columns, challenge_title, depth-level explanation, MAX_TAXONOMY_DEPTH, resolveActiveCategory, getDescendantCategoriesForParent, RESOLVE_CHALLENGE_IMAGE handler
-
Database Guide: Add V2 fact-engine tables section (taxonomy, fact storage, challenge system, ingestion), update migration references to point to migrations index
-
Architecture Overview: Add V2 fact-engine architecture section with data flow diagram, key tables, and worker summary alongside V1 content
-
Product Bible: Update category counts from 33+/76+ to 20/1,200+, add RESOLVE_CHALLENGE_IMAGE to pipeline diagram and queue table
-
Challenge Content Rules: Promote from draft to stable, add depth-3 impact notes to CC-007 and CC-008
-
Account: Simplify account pages to 3-page layout
-
Admin Dashboard: Build complete admin dashboard with 22 pages — self-contained UI with forked design tokens, 22 shadcn/ui components, layout shell (sidebar, page header, theme toggle), and full page implementations across 5 waves: core monitoring (dashboard home, queue management, AI costs), content management (facts browser/detail, stories browser/detail), taxonomy and pipeline (topics, pipeline runs, seed pipeline), and platform pages (feature flags, source trust, users, billing, media, feeder sources)
-
Queue: Extend getQueueStats from SMS-only to all 12 queue types
Internal
- Docs: Reorganize February session summaries into monthly folder and refresh prompt documentation
March 28, 2026
Documentation
- MCP: Add
docs/mcp/with user guides for eko-admin and docs-reel MCP servers