Rebuild EOM report as one condensed page, matching Mckinley's edit

Mckinley hand-edited July's report down to a single page and showed
exactly what an Executive Summary should look like: the deep dive's
actual findings pulled straight into prose (which post drove
engagement, the 14/07-28/07-30/07 trilogy story, best posting day and
its format confound, audience composition's three dimensions), the
Key Metrics table flowing right after the goal/verdict with no extra
heading, one chart (Follower Growth), and nothing else. Confirmed
directly: this is the whole report now, not a summary page ahead of
a longer appendix — readers go to the live dashboard for every other
table/chart/register the old 8-page version duplicated.

report.build_report_docx() rewritten from scratch to this shape, now
reading everything from an expanded "executive_summary" dict in
monthly_report_notes.py (goal_line, goal_met, growth_note, engagement
findings, the trilogy, best-posting-day note + caveat, the validation
gap, audience composition line + dimensions) instead of the old
pros/cons list — the function itself is now a pure renderer, every
month-specific fact lives in monthly_report_notes.py same as every
other narrative section.

build_report_pdf() and its reportlab machinery deleted entirely
(genuinely dead code — the only call site switched to docx already),
along with every helper that existed only to serve it. report.py
drops from ~1260 lines to ~300. August and September don't have an
executive_summary yet, so their reports fall back to Key Metrics +
Follower Growth + a note that the summary isn't written up, rather
than silently reusing July's content or crashing.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
beantownbabeandClaude Sonnet 5 committed 2026-10-01 10:19:54 +02:00
1 parent e0ef610733
commit 1d2c9c4e6a
2 files changed
+109 -1040

No files matched your search

+40 -23
View File
@@ -22,33 +22,50 @@ _CORE_MESSAGE_ABSTRACT = [
NOTES = {
"2026-07": {
"executive_summary": {
"goal": "Find the Voice — establish a consistent brand voice and discover "
"which posts and formats drove the most engagement.",
"goal_line": "July's Campaign: Stage One: Find the Voice - Establish a "
"consistent brand voice and discover which posts and formats "
"drove the most engagement.",
"goal_met": "Yes",
"goal_met_note": "A clear format/tone winner emerged: Carousels and a "
"personal, emotional-register story (the 14/07-28/07-30/07 "
"trilogy) outperformed everything else, giving a concrete, "
"audited answer to what resonates with this audience.",
"pros": [
"growth_note": "Page grew from 85 to 107 followers (+22, +25.9%).",
"engagement_question": "Which post drove most engagement?",
"engagement_findings": [
"Traction by Format: Carousels and a personal, emotional-register story "
"outperformed everything else.",
"Emotional/personal-voice posts averaged 21.8% Real Eng % vs. Rational "
"posts' 8.1%, a wide, decisive gap.",
"Page grew from 85 to 107 followers (+22, +25.9%).",
"posts' 8.1%.",
"Best single post hit 45.0% Real Eng %, the clear #1 all month.",
"Real Eng % audit methodology (Audience-only, hand-verified, Team "
"excluded) built and rolled out, replacing LinkedIn's raw/Team-inflated "
"numbers with a trustworthy figure everything else in this report reads "
"from.",
],
"cons": [
"The one validation attempt (21/07 poll) got zero responses — whether "
"this audience engages with interactive formats at all is still "
"unanswered.",
"10/07 was a repost, not original content, requiring exclusion logic to "
"keep every number honest — a reminder to plan the full month's content "
"in advance.",
"Audit coverage had a real gap (27/08) that wasn't caught until "
"September — the hand-audit process needs to stay current within the "
"month it covers, not catch up later.",
"trilogy_intro": "The 14/07-28/07-30/07 trilogy outperformed everything "
"else, giving a concrete, audited answer to what resonates "
"with this audience.",
"trilogy_posts": [
"14/07 — introduces the problem (operation modes, frustration of waiting)",
"28/07 — deepens it with the Ferris wheel analogy, ends on a cliffhanger CTA",
"30/07 — delivers the solution, in Daniel's own voice, closing the loop",
],
"trilogy_closing": "The trilogy of three posts brings in honesty in a way "
"that matters for credibility, further underlined by "
"technical substance delivered through a personal-voice "
"format.",
"best_posting_day_note": "Best Posting Day: Thursday shows the highest "
"average engagement this month.",
"best_posting_day_caveat": "Note: Every single Carousel was posted on a "
"Thursday, and every Video/Poll was posted on a "
"Tuesday, so this month's data can't isolate a "
"real day-of-week effect from a format effect.",
"validation_gap": "The one validation attempt (21/07 poll) got zero "
"responses. Whether this audience engages with "
"interactive formats at all is still unanswered.",
"audience_composition_line": "AUDIENCE COMPOSITION: Academia/Research "
"Institute is the largest single sector this "
"month.",
"audience_dimensions": [
("Prior Knowledge and Language", "This cohort is mostly Academic and "
"Engineering/Technical and understands the underlying science."),
("Decision Context", "Most of this cohort do not have a budget-holding "
"role, so they're not positioned to act on a rational business case."),
("Trust and Reservations", "Emotional posts outperformed the rational "
"ones. Leading with a human touch to a skeptical audience wins."),
],
},
"core_message_abstract": _CORE_MESSAGE_ABSTRACT,
+69 -1017
View File
File diff suppressed because it is too large. Load diff