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:
1 parent
e0ef610733
commit
1d2c9c4e6a
2 files changed
+109
-1040
No files matched your search
+40
-23
@@ -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,
|
||||
|
||||
Reference in new issue
Block a user