Note

    CHANGELOG

    Chronological list of notable changes

    Document Metadata

    • title: Changelog
    • description: Chronological list of notable changes
    • status: stable
    • lastUpdated: "2026-03-25 12:39 ET (America/New_York)"
    • owner: Engineering

    Changelog All notable changes to this project will be documented in this file. <!

    Changelog

    All notable changes to this project will be documented in this file.

    <!-- NEW CHANGELOG ENTRIES START BELOW -->

    2026-03-25 12:39 ET (America/New_York) - [3035][3039][Quality][WhatsApp] Skip Weak Topic Angles And Clean Brief Evidence Packs

    • Tightened topic-brief gating so weak WhatsApp angles are now skipped instead of forced into thin briefs:
      • topic-orchestrated editorial:briefs:materialize now computes a support profile for each angle
      • non-exploratory runs reject weak angles when they do not have enough distinct grounded evidence or enough planning-grade topic signals
    • Added support-profile reporting to brief retrieval/materialization outputs:
      • supportProfile.uniqueEvidenceCount
      • supportProfile.questionCount
      • supportProfile.recommendationCount
      • supportProfile.painPointCount
      • supportProfile.supportConfidence
      • supportProfile.constraintsFailed
    • Cleaned topic-brief evidence assembly so brief packs stop carrying obviously low-value rows:
      • removed warning-type rows from brief evidence refs
      • removed low-signal labels like birthday/generic encouragement chatter from brief evidence refs
      • deduped brief evidence down to planning-grade question/recommendation/pain-point rows before building brief artifacts
    • Tightened single-keyword topic retrieval for question rows so labels now have to be visibly topic-grounded instead of matching only because the raw evidence text mentioned the keyword once.
    • Live validation on the persisted WhatsApp corpus confirmed the effect:
      • a non-persisted heuristic batch over the current 10-entry 3040 run now skips 9 weak angles instead of generating weak briefs for them
      • a focused strict-AI rerun on the surviving “doctors” angle still succeeds and produces a materially stronger brief than the heuristic fallback, which confirms the better evidence pack is usable by the synthesis layer

    2026-03-25 11:18 ET (America/New_York) - [3035][3039][3041][Quality][Admin] Rework Brief Review Flow And Tighten Weak-Signal WhatsApp Evidence

    • Tightened weak-signal topic retrieval so topic-specific brief assembly no longer pads missing evidence with unrelated rows:
      • selectTopicEvidenceRows(...) now returns no topic rows when none are grounded enough instead of falling back to broad source noise
      • direct label/evidence matches now outrank chunk-summary-only overlaps much more aggressively
    • Relaxed AI brief-synthesis minimums so the model can return narrow but honest briefs instead of padding weak topics with filler recommendations and outline sections.
    • Removed broad source-label fallback from editorial:briefs:materialize topic variants so topic-specific briefs stop inheriting irrelevant recommendation lanes from the full source set.
    • Reworked the manual admin fallback flow:
      • /admin/blog/new?reviewDecisionId=... now opens with an empty post body plus read-only structured draft notes
      • the fallback seed explicitly explains that the notes are reference material, not publishable copy
      • this avoids treating the scaffold/evidence checklist as if it were an article draft
    • Tightened the admin brief-review lifecycle:
      • the primary CTA is now Approve Brief & Queue AI Draft
      • successful AI generation returns operators to /admin/blog so the resulting piece is reviewed as a blog draft rather than inside the brief screen
      • linked-post actions now use clearer Review Draft / Open Generated Draft language
    • Fixed duplicate React key warnings on the brief-review detail page and saved a fresh manual verification set in output/manual-review-2026-03-25/.
    • Manual browser recheck on the fresh dev server confirmed:
      • the queue/detail/fallback flow is structurally much clearer
      • the duplicate-key runtime errors are gone
      • the biggest remaining quality blocker is still upstream evidence contamination on some WhatsApp-derived briefs

    2026-03-25 09:36 ET (America/New_York) - [3035][3041][Admin][Workflow] Add Brief Review Detail Step And AI Draft Generation Handoff

    • Added the missing admin workflow step between queue intake and blog-post editing:
      • new detail route: /admin/blog/reviews/[id]
      • queue rows now link into a dedicated brief review screen instead of dumping operators straight into the post editor
    • The new brief review surface shows:
      • cleaned display title
      • brief status + review status
      • core problem statement
      • recommendations
      • outline points
      • draft scaffold preview
      • grounding evidence refs
    • Added a new server action createAdminEditorialDraftPost(reviewDecisionId) that:
      • marks the brief approved
      • generates a real AI-written markdown draft from the reviewed brief using the grounded evidence/scaffold
      • creates a linked blog_posts draft
      • advances the linked review decision into in_review when appropriate
    • Improved brief-title behavior:
      • heuristic fallback brief titles no longer hard-code What Single Moms by Choice in NYC Should Know About ...
      • admin surfaces now strip that legacy prefix from older persisted briefs for cleaner display
    • Kept the manual /admin/blog/new?reviewDecisionId=... seed path as a secondary fallback, but it is no longer the primary review-queue handoff.

    2026-03-25 09:06 ET (America/New_York) - [3035][3039][3040][AI][Quality] Verify Live Model-Backed Brief Synthesis And Harden Fallback Reporting

    • Hardened the model-assisted brief path so valid GPT-generated outputs are no longer discarded just for being slightly too verbose:
      • broadened lib/editorial/brief-synthesis.ts schema acceptance for synthesis-time object generation
      • normalized/truncated synthesized titles, problem statements, recommendations, outline points, and reasoning summaries to repo-safe lengths inside scripts/editorial/materialize-editorial-briefs.ts
    • Improved operator visibility around AI-vs-heuristic outcomes:
      • per-brief synthesisFallbackReason
      • summary counts for aiDraftCount, heuristicDraftCount, and aiFallbackCount
      • stricter “no drafts generated” failures now include the underlying skipped-draft reason instead of hiding it behind a generic error
    • Re-ran a live strict-AI brief-materialization probe on the persisted WhatsApp source:
      • pnpm editorial:briefs:materialize -- --source-key whatsapp-whatsapp-chat-exports --run-key 3040-calendar-2026-03-23-phase1 --topic-from-angle-label --include-existing-briefs --limit 1 --synthesis ai --write tmp/editorial-briefs-quality-sample-ai.json
      • result: aiDraftCount=1, heuristicDraftCount=0, aiFallbackCount=0
    • The regenerated sample is materially stronger than the heuristic brief it replaced conceptually:
      • coherent working title
      • grounded problem statement
      • article-usable recommendations and section structure
    • Remaining quality gap:
      • the upstream evidence set for the “doctors in this group” angle still contains some noisy retrieval refs, so the next improvement target remains better evidence-pack precision, not more admin workflow expansion

    2026-03-25 08:50 ET (America/New_York) - [3035][3039][3040][AI][Quality] Tighten WhatsApp Topic Retrieval And Add Model-Assisted Brief Synthesis Hooks

    • Tightened weak-signal WhatsApp topic retrieval in lib/editorial/retrieval-query.ts and reused it from both:
      • scripts/editorial/query-editorial-evidence-pack.ts
      • scripts/editorial/materialize-editorial-briefs.ts
    • The shared selector now:
      • drops generic weak-signal topic tokens like group / some
      • scores evidence rows by direct phrase match plus keyword coverage across labels, evidence text, and chunk summaries
      • prefers topic-grounded evidence instead of falling back too quickly to generic parenting/support chatter
    • Added a new model-assisted brief-synthesis layer:
      • lib/editorial/brief-synthesis.ts
      • editorial:briefs:materialize now supports --synthesis heuristic|ai|auto, optional provider/model selection, and --replace-existing
      • when a provider key is available, the brief materializer can synthesize stronger problem statements, recommendations, and outline points from grounded evidence rather than relying only on label heuristics
    • Added focused regression coverage:
      • tests/editorial-retrieval-query.test.ts
      • tests/editorial-brief-synthesis.test.ts
    • Current runtime caveat:
      • the live brief-regeneration probe on Neon is hanging in this shell, and no OPENAI_API_KEY or ANTHROPIC_API_KEY is present here yet, so code/test coverage is complete but live model-backed regeneration still needs one follow-up execution pass in a keyed environment

    2026-03-25 08:27 ET (America/New_York) - [3035][3041][Admin][Workflow] Shift Editorial Intake To A Draft-First Admin Flow

    • Reframed /admin/blog/reviews so draft_intake_pending rows now behave like drafting intake rather than pretending they are waiting on a human reviewer first:
      • the page now presents a draft-first workflow
      • intake rows use Start Draft as the primary action
      • the queue copy now distinguishes AI-assisted draft creation from later human review ownership
    • Enriched admin queue rows with brief-detail metadata so the intake list is less opaque:
      • core_problem_statement
      • recommendation count
      • outline-point count
      • evidence-reference count
    • Rebuilt getAdminEditorialReviewDraftSeed(...) around buildEditorialDraftArtifact(...) so seeded blog drafts now come from the richer draft-artifact structure instead of the earlier one-line brief summary format.
    • Updated queue helper semantics so draft_intake_pending now reports create_draft as the top recommended action instead of assign_reviewer.
    • Added focused regression coverage for:
      • richer admin queue row metadata
      • draft-first intake seed generation
      • updated queue top-action recommendations

    2026-03-25 07:58 ET (America/New_York) - [3035][3041][Admin][Workflow] Add Batch Reviewer Assignment And Remove Admin Footer Noise

    • Extended /admin/blog/reviews with the next practical reviewer-ops improvement:
      • open queue rows now support multi-select for unassigned draft_intake_pending items
      • added a batch assignment panel + dialog so operators can assign a reviewer to the whole current intake set at once
      • added assignAdminEditorialReviewsBatch(...) to move selected rows into in_review without opening ten separate dialogs
    • Added focused regression coverage for the new batch path in tests/blog-review-admin-actions.test.ts.
    • Cleaned the admin shell further by removing the shared public footer from /admin/* routes, leaving the sidebar as the only persistent navigation system inside admin.
    • Brought Claims and Edit proposals onto the same page-header/layout pattern as the rest of admin moderation pages so the resources moderation area reads as one system instead of a mix of old and new utilities.
    • Re-verified the reviewer queue in-browser:
      • select-all and batch-selection summary both work on the live 10-row intake queue
      • the batch assignment dialog opens correctly
      • no live assignment write was performed during this verification pass

    2026-03-25 07:33 ET (America/New_York) - [3035][3041][Admin][Workflow] Seed Live Review Queue And Add Approved-Review Draft Handoff

    • Seeded the live editorial review queue from the current 3040-calendar-2026-03-23-phase1 artifact set:
      • materialized 10 live draft artifacts
      • inserted 10 new draft_intake_pending editorial_review_decisions
      • current queue state for whatsapp-whatsapp-chat-exports is now 11 total decisions with 10 active queue items and 1 completed approved decision
    • Added an approved-review to blog-draft handoff path instead of leaving completed decisions stranded as audit-only rows:
      • new server action: `getAdminEditorialReviewDraftSeed(reviewD

    ...[truncated for intake]

    Provenance