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:materializenow 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
- topic-orchestrated
- Added support-profile reporting to brief retrieval/materialization outputs:
supportProfile.uniqueEvidenceCountsupportProfile.questionCountsupportProfile.recommendationCountsupportProfile.painPointCountsupportProfile.supportConfidencesupportProfile.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
3040run now skips9weak 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
- a non-persisted heuristic batch over the current 10-entry
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:materializetopic 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/blogso 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 Draftlanguage
- the primary CTA is now
- 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
- new detail route:
- 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_postsdraft - advances the linked review decision into
in_reviewwhen 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
- heuristic fallback brief titles no longer hard-code
- 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.tsschema 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
- broadened
- Improved operator visibility around AI-vs-heuristic outcomes:
- per-brief
synthesisFallbackReason - summary counts for
aiDraftCount,heuristicDraftCount, andaiFallbackCount - stricter “no drafts generated” failures now include the underlying skipped-draft reason instead of hiding it behind a generic error
- per-brief
- 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.tsand reused it from both:scripts/editorial/query-editorial-evidence-pack.tsscripts/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
- drops generic weak-signal topic tokens like
- Added a new model-assisted brief-synthesis layer:
lib/editorial/brief-synthesis.tseditorial:briefs:materializenow 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.tstests/editorial-brief-synthesis.test.ts
- Current runtime caveat:
- the live brief-regeneration probe on Neon is hanging in this shell, and no
OPENAI_API_KEYorANTHROPIC_API_KEYis 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
- the live brief-regeneration probe on Neon is hanging in this shell, and no
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/reviewssodraft_intake_pendingrows 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 Draftas 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(...)aroundbuildEditorialDraftArtifact(...)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_pendingnow reportscreate_draftas the top recommended action instead ofassign_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/reviewswith the next practical reviewer-ops improvement:- open queue rows now support multi-select for unassigned
draft_intake_pendingitems - 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 intoin_reviewwithout opening ten separate dialogs
- open queue rows now support multi-select for unassigned
- 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
ClaimsandEdit proposalsonto 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-phase1artifact set:- materialized
10live draft artifacts - inserted
10newdraft_intake_pendingeditorial_review_decisions - current queue state for
whatsapp-whatsapp-chat-exportsis now11total decisions with10active queue items and1completed approved decision
- materialized
- 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
- Source file:
CHANGELOG.md - Source URL: https://github.com/maggielerman/smc-directory/blob/main/CHANGELOG.md