Directory grows 143→144. Full recompute of all six Study charts and
affected prose. LEHMANN + PARTNER is a transportation-infrastructure
surveying firm (Erfurt), not photonics/research-related, so classified
as Other named company with industryOther text from a verified web
lookup rather than left blank.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
The "campaign-end" dropdown option existed but was a placeholder ("not
built yet") in the live tab and explicitly blocked in the download
callback. Built it out properly, same condensed Executive Summary
philosophy as the monthly reports, not a merge of all three:
- report.py: "campaign-end" is now a real timeframe_value throughout
_filtered/_period_label/compute_period_stats, scoped to the fixed
campaign window (CAMPAIGN_START/CAMPAIGN_END, 2026-07-01 to
2026-09-30) rather than "all" (which would pull in pre-campaign
June data). Its Posts Published excludes the repost and the one
non-campaign post, unlike a single month's own count, since a
capstone number should mean genuine campaign content. Monthly
Growth Rate anchors to the campaign's own start instead of a
calendar month's.
- monthly_report_notes.py: new NOTES["campaign-end"] executive_summary
synthesizing all three months — what each stage actually proved
(Carousel wins, a stable Academia/Research/Germany audience, one
real trigger found but not repeated), the campaign-wide best-posting
-day finding, and a new "recommendations" field: concrete, data-
grounded ideas for October and beyond (bring Carousel back, lead
with named pain points, move asks into direct outreach using the
21 already-engaged non-followers sitting in outreach_contacts.py,
track conversion as its own funnel, properly separate the day/
format confound next time).
- build_report_docx() renders "recommendations" as a new section when
present. app.py's download callback no longer blocks campaign-end,
and the live Reports tab gets a real (if intentionally simple)
preview via a new _render_campaign_end_summary(), built as its own
self-contained renderer rather than stretching the 7 per-month
insights pages (built around a single YYYY-MM, not a 3-month span)
to fit.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Grounded in the actual per-post data (Real Eng % by post/format/
weekday) and post titles, not just the abstract pros/cons July
started with:
August (Find the Audience, Goal Met: Yes) — audience composition
answer (Academia/Research-heavy, Germany-heavy, Researcher/Scientist
seniority), the TXServices launch arc across 6 posts, Carousel
repeating July's win but a plain value-prop post (13/08) nearly
matching it, and the Tuesday/Thursday day-vs-format confound still
unresolved.
September (Find the Trigger, Goal Met: Partial) — 08/09's pain-point
post was the only one with real discussion and the month's best Real
Eng %, but that ceiling (18.75%) is the campaign's lowest yet, no
Carousel was tried all month, growth decelerated to the slowest pace
of the campaign (+11.1%), and the direct pilot-partner ask (17/09)
underperformed. Honest "Partial" verdict rather than forcing a Yes:
one trigger instance was found but not turned into a repeatable
pattern, and the numbers moved the wrong direction.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
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>
A summary page that leaves out the actual numbers isn't a summary —
moved the Key Metrics table (and its Monthly Growth Rate note) up
onto the same page as the Executive Summary's goal/verdict/pros/cons,
ahead of the page break. A reader who only reads page 1 now gets
both the verdict and the real numbers behind it; everything else
(Core Message, Roadmap, Follower Growth, All Posts, deep dives) stays
as the optional detail past the break for whoever wants more than
one page.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Directory grows 142→143. Full recompute of all six Study charts and
affected prose. Also traced and fixed a long-opaque figure: the
"students or trainees" count in Key Findings is Seniority Student/
Trainee + Postdoc/PhD Researcher combined, not Student/Trainee alone -
relabeled now that the derivation is confirmed, not just approximated.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Real Eng % is Mckinley's own per-post hand audit (name-level Likes/
Comments/Reposts, Team excluded one person at a time). Avg. Eng. Rate
is LinkedIn's own daily page-level aggregate with no name-level
breakdown at all, so there's nothing to audit it against and no way
to exclude Team from a single blended daily number the way it can be
excluded from one post's own Reactions list. That's not a pending
methodology question, it's just two genuinely different metrics, so
every "Avg. Eng. Rate" label (Overview, Roadmap insights, Reports tab
KPI row, PDF/docx tables) now reads "raw, unaudited" instead of
leaving the distinction implicit. Removes the now-resolved item from
July's Executive Summary cons and August's outstanding list.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
A standalone first page ahead of any detailed numbers: the month's
goal (from the Roadmap), a Yes/No/Partial verdict on whether it was
met, and a Pros/Cons list, color-coded (green/red/amber). Hand-
authored per month in monthly_report_notes.py's new
"executive_summary" key, same pattern as the other narrative
sections, since "did we meet our goal" is a judgment call, not
something computed from the export data. Renders only when present,
so August/September are unaffected until written up. A page break
separates it from the rest of the report so it stands alone as
page 1.
Drafted July's as a first pass grounded in facts already established
in this report (the emotional-vs-rational engagement gap, the poll's
zero engagement, the 27/08 audit gap) — needs Mckinley's review since
the goal-met verdict is inherently a judgment call, not something to
assert unilaterally.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Mckinley's PDFs kept cutting off content mid-page with no way to fix
it short of regenerating the whole report — a fixed-layout PDF isn't
the right format for something meant to be edited. Adds
report.build_report_docx(), a python-docx equivalent of
build_report_pdf() sharing the exact same compute_period_stats() data
and section order (KPI table, section abstracts, weekly pace,
audience composition, follower growth chart, all posts table with
the same excluded-post strikethrough treatment, format performance,
competitor snapshot, and the full Section Deep Dives for a monthly
campaign report), so the two can never silently drift apart on
numbers even though the rendering layer is completely different.
Word reflows content automatically, so there's no more fixed page
grid to fight when editing.
The Reports tab's download button now produces .docx instead of PDF.
Verified via python-docx re-read (KPI values, the 10/07 repost row's
strikethrough, embedded chart images) and strict OOXML schema
validation (including fixing a `w:zoom` attribute python-docx's own
default template omits). build_report_pdf() is left in place, only
report.py's ctx docstring rewritten since the doubly-stale "sidebar's
generic PDF control" no longer exists as an actual call site.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
The Reports > July landing page's own "All Posts, July 2026" card
(_reports_posts_table, fed by report.compute_period_stats()'s simple
date-range filter, not app.py's REPOST_DATES/NON_CAMPAIGN_DATES-
excluding _reports_posts_f()) showed the 10/07 repost as a plain,
unmarked row with "Pending audit" — inconsistent with the dedicated
All Posts insights page one click away (struck through, "Excluded")
and confusing on its own, since "Pending audit" reads as an
unfinished job rather than a deliberate, permanent exclusion.
Fixed in both places this table renders: the live Reports tab
(app.py's _reports_posts_table) and its PDF equivalent (report.py's
"All Posts" table), both now applying the same pale-red/strikethrough
"Excluded" treatment already used by the register table and the
dedicated All Posts insights page. Added non_campaign_dates to
_build_report_ctx() so the PDF can apply the same exclusion set, not
just repost_dates.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
The Overview/Content tab's Posts table labeled every unaudited Real
Eng % as "Pending audit", including the 10/07 repost and other
REPOST_DATES/NON_CAMPAIGN_DATES posts that are deliberately never
audited (see engagement_audit.py) rather than simply not gotten to
yet. That read as an incomplete job rather than an intentional
exclusion. Those dates now show "Excluded" instead, matching the
wording already used in the Reports tab's All Posts and Core Message
treatment of the same dates. Fixed in both the initial table render
and the month-dropdown callback path.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Month Start and New Followers already existed, but neither answers
"how many followers do we actually have as of this month" without
the reader doing the addition themselves. Adds a third tile, Total
Followers (month end) = Month Start + New Followers, placed between
them so the row reads Start -> New -> End as one story. Pinned to
that specific reporting period like Month Start already is, so it
never drifts with "today" the way the tile removed earlier did.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Track #6's a677056 removed 5 non-follower records (Philipp Brandt,
Arunangshu Debnath, Simon Sebold, Chen Shen, Martin Uhlig) that had
contaminated the 147-record set my previous recompute (572887b) was
built against. Namrata Sharma and Renske M. van der Veen are confirmed
genuine followers and were unaffected by the removal.
Full recompute of all six charts and all affected prose against the
corrected 142-record dataset, verified via script. Re-checked the two
figures flagged as drifted/unreconcilable in the prior commit:
1st-degree connections correctly returns to 6%/94% at 142 (the 5%/95%
was an artifact of the contaminated 147 count); "Research/Engineering
readers 38%" still can't be reconciled against any live field
combination and stays flagged as a pre-existing stale figure.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Mckinley checked LinkedIn directly and confirmed Arunangshu Debnath
does not follow the Page, despite being added to the Follower
Directory. Root cause: this session added 15 people to the Directory
straight from post-engagement audits (08/09, 15/09, 22/09) without
verifying follow status — the exact mistake outreach_contacts.py's
own docstring warns against ("assumed every remaining entry was a
real follower"). A separate session (Demographics, which owns the
Directory) picked up 5 of these placeholders this morning, enriched
them further, and recomputed Follower Study's charts against the
resulting inflated 147-record dataset.
Moves all 15 people (Arunangshu Debnath, Simon Sebold, Martin Uhlig,
Chen Shen, Philipp Brandt, Dr. Sonia Utermann, Dr. Jefferson do
Rosario Stelzer, Sani Harouna-Mayer, Shrouk Ehab, Harish
Purushothaman, Mallika K., Sebastian Sell, Azat Khadiev, Ali A.,
Maximilian Harr) from the Directory to outreach_contacts.py, where
engaged-non-follower records belong. Directory count: 156 -> 142
(140 baseline + 2 legitimate new followers the Demographics session
added this morning, Namrata Sharma and Renske M. van der Veen, not
yet reflected in the Sep 26 export). Follower Study's charts/prose
in assets/follower_study.html are now stale against the corrected
dataset — that file belongs to the Demographics session, flagging
rather than editing it here.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Adds the 4 missing sections (features_shipped, data_quality,
follower_study, outstanding) for August's End of Month report,
sourced from August's actual commit history (Reports tab build-out,
GOTO Messaging Handbook, Engagement Composition polish, Real Eng %/
CTR % formula callouts, follow-date corrections, the Mihail Petev
repost correction, git-tracking the Follower Directory for the first
time, and the 107-to-126 follower growth). August's audit data was
already complete; this was the only piece blocking its report.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Real Eng % audit for September's final post, 22/09: 24 total
reactions (likes A20/T3, TXproducts Page like excluded entirely),
no comments, reposts A0/T3 (Mckinley Black, Peter Gaal, Aleksandra
Kotenko, all internal). Adds 10 new Follower Directory entries
surfaced by this post (Dr. Sonia Utermann, Dr. Jefferson do Rosario
Stelzer, Sani Harouna-Mayer, Shrouk Ehab, Harish Purushothaman,
Mallika K., Sebastian Sell, Azat Khadiev, Ali A., Maximilian Harr)
and extends engagement_notes for 7 existing repeat engagers.
Every September campaign post (03/09, 08/09, 15/09, 17/09, 22/09)
is now audited — September's Real Eng % / Follower Study data is
complete, unblocking that month's outstanding narrative sections.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Real Eng % audit for September's 17/09 post: likes A1/T2 (Johannes
Blum, shown as "Johannes Tenten" on this post but the same Hi-Acts/
DESY Innovation Manager as every other audited post, is Audience;
Aleksandra Kotenko and Mckinley Black are Team), no comments, and
reposts A0/T3 (Peter Gaal, Aleksandra Kotenko, Mckinley Black, all
internal). Extends Johannes Blum's Follower Directory engagement_notes
to include this post. Only 22/09 remains unaudited for September.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Directory grows 145→147 (2 new: Namrata Sharma, Renske M. van der Veen,
both Helmholtz-Zentrum Berlin) plus classification completed for 5
followers the End of Month Report session (track #6) added directly
via post-engagement audit but correctly left flagged as pending
(Philipp Brandt, Arunangshu Debnath, Simon Sebold, Chen Shen — all
DESY/academia-affiliated researchers; Martin Uhlig left unclassified,
two real candidates found, couldn't confirm which without a screenshot).
Full recompute of all six Study charts and all affected prose against
the live 147-record dataset. Caught and fixed two long-stale figures
along the way: the "1st-degree connections" stat had drifted to 7%/93%
across several past additions when the data actually rounds to 5%/95%;
flagged a separate "Research/Engineering readers 38%" figure as
unreconcilable against any live field combination, left un-recomputed
rather than guessed.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
"Total Followers (as of today)" was confusing on a monthly report
read days or weeks after the month closed, since the live/global
follower count keeps drifting past whatever month is being reported
on. Month Start already gives the one followers figure that's
actually pinned to that specific reporting period, so the redundant
tile is dropped entirely rather than repurposed. Live dashboard tabs
outside Reports are unaffected and keep showing the live total.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Real Eng % audit for two more September campaign posts: 08/09
(likes A3/T3, comments A2/T1, reposts A0/T3 - Arunangshu Debnath's
reply thread was the standout) and 15/09 (likes A9/T3, no comments,
reposts A0/T4). Extends engagement_notes for five repeat engagers
(Johannes Blum, Marc Thiry, Dr. Palvan Seyidov, Katrin Schmidt,
Sabine Brock) and adds five placeholder entries (Arunangshu Debnath,
Simon Sebold, Martin Uhlig, Chen Shen, Philipp Brandt) pending full
profile details.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
LinkedIn's export has no caption text for this post, so it fell back to
"(no text — image/video-only post)" instead of its actual content, "Come
meet us at SNIB2026" — looked like a missing/unaudited post even though
it was already fully audited underneath.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Sabine Brock is the only audience like; the rest (likes and all 3 reposts)
are internal (Daniel Schmidt, Aleksandra Kotenko, Mckinley Black). Page's
own link-drop comment excluded as usual. This closes out August's
post-level auditing entirely, 4 real gaps remain campaign-wide, all in
September (08/09, 15/09, 17/09, 22/09).
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Directory grows 139→140. Full recompute of all six Study charts and
Key Findings/limitation/messaging-takeaway prose. HZB already
established as a Research & Collaborations partner via the Simone
Vadilonga precedent, applied consistently here.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Web lookup confirmed INFOMOTION GmbH is HQ'd in Frankfurt am Main;
Berlin was his personal location, not the employer's HQ. Same
personal-location-vs-employer-HQ split already documented for
Rajkumar Rengaraj and Maximilian F. Company City field corrected,
Personal Location stays Berlin, confidence on the country/city
assignment downgraded from High to Medium (101/18 split, was 102/17).
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Directory grows 138→139. Full recompute of all six Study charts and
Key Findings/limitation/messaging-takeaway prose. INFOMOTION is a
German data/AI consultancy, no fit for the more specific sector
categories, so classified as Other named company.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Directory grows 137→138. Full recompute of all six Study charts,
Key Findings/limitation/messaging-takeaway prose, and the Notable
Clusters table (University of Hamburg row 4→5, Hamburg/DESY cluster
distinct headcount 29→30). Classified as a plain-university case
(Academia industry value), consistent with other Uni Hamburg students.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Directory grows 136→137. Full recompute of all six Study charts,
Key Findings/limitation prose, and the methodology log. No company
listed on his profile, so Sector/Industry stay blank/Unknown per the
established no-guessing rule.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Mckinley provided the remaining 8 URLs directly (9 records, since the
two Mckinley Black entries needed separate URLs for their two real
LinkedIn identities), closing out the gap the web research pass
couldn't resolve on its own (namesake collisions, internal accounts).
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Web-searched each of the 26 followers with a blank linkedin_url (mostly
the batch added via individual screenshots rather than a bulk export,
which never captured the profile URL). Applied 17 confirmed matches
(verified against name + company + role, not guessed from name alone).
Sabine Brock's URL was derived from her public post slug (linkedin.com/
posts/sabinebrock_...), not a directly-confirmed profile link - flagged
as slightly lower confidence than the rest.
9 remain unresolved: too many namesakes with no way to confirm
(Iryna Platonova, Almira Tolstova, Francesco Marzari, Kilian Frank,
Rishabh Moolya, Dr. Ravinder Reddy Mogulla, Sourav Kumar - blank
profile to begin with), plus 2 internal TXproducts people (Mckinley
Black, Niklas Meidow) better sourced directly than via web search.
Side finding, not yet acted on: search results show Bernhard H. is
CEO of XPLORAYTION GmbH, not an unspecified individual contributor as
currently classified (no title was visible on his original screenshot).
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Outreach researched all 39 blank-Industry "Other named company" records
against Twenty's closed Industry enum. 2 genuine enum hits (Stuart Hayes/
European XFEL -> Research & Collaborations, Eleni Mumtsidu/SGS -> Device
Testing), 35 correctly stay Other with a researched industryOther value,
2 left blank as genuinely inconclusive (Muhammad Yousaf/Vital Group,
Iryna Platonova/UMeter - couldn't confirm actual company affiliation).
3 of the 35 flagged as domain-adjacent worth a second look: Bernhard H./
XPLORAYTION GmbH, Alice Autuori/Cycle GmbH, Valentina Shumakova/UltraFast
Innovations GmbH - all synchrotron/ultrafast-laser-adjacent businesses,
potential peers or competitors, not routine "Other" cases.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
CRM Research/Outreach caught this in review: the guidebook §8 spec says
notes should be "just the original bucket label, no explanation," but my
last edit put verbose reasoning in these 4 notes, including one that
claimed a specific Mckinley confirmation inline. Fixed to the terse
"LinkedIn Seniority: <bucket>" format the guidebook itself examples.
The reasoning for each call stays in git history, not in CRM-facing data.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Confirmed by Mckinley 2026-09-20: when a title has a "Senior"/"Sr." qualifier
AND an unambiguous higher-authority base role (Manager, named Group/Ecosystem
Leader), resolve to the highest authority implied by the full title, not
mechanically to IC-Senior/Lead/Principal. Corrected: Dr. Eleni Mumtsidu
(Sr. Business Development Manager), Veronika Reichboth (Innovation Ecosystem
Leader), Bridget Murphy (two named Group Leader titles outrank her secondary
"Senior Research Scientist" credential), Dr. Ravinder Reddy Mogulla (Sr. Dy.
General Manager — confirmed correct, was flagged as a possible rule conflict,
Mckinley confirmed Director is right).
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Additive only, per Mckinley's direction not to disturb the Study page's
existing Seniority/Function/Sector taxonomy. New fields prep a clean
Twenty migration export per the CRM Research data model guidebook §8:
- roleLevel: derived from each person's raw job title text via the
guidebook's §1 decision-order rules (not copied from the Seniority
bucket, since it's coarser than Twenty's 9 tiers). Ambiguous cases
left blank or fallback-mapped with a roleLevelNote explaining why.
- department: direct copy of Function, except Admin/Assistant and
Executive/Management (Role Level signals, not department names).
- industry / industryOther: Sector reclassified per-record against
Twenty's Industry enum (Academia/Research Institute split into
Research & Collaborations vs Academia vs blank; Semiconductor/
Aerospace/Defense split per-company; Photonics/Laser/Optics direct;
TXproducts internal routes to Category=Internal, not Industry).
Medical/Life Sciences (not covered by §8) mapped to Other with
industryOther text, flagged back to CRM Research as a spec gap.
"Other named company"/Unknown/no-company buckets left blank per
§8's own no-guessing default.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Directory grows 134→136. Full recompute of all six Study charts,
Key Findings/limitation/messaging-takeaway prose, and the Notable
Clusters DESY row/footnote (10→11 linked entries, 28→29 distinct
Hamburg/DESY cluster headcount).
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Notable match for TXproducts' own space: XPLORAYTION provides synchrotron-
based analyses as a service to industry and academia, same business
model category. No explicit personal title stated, so Seniority stays
Other Individual Contributor rather than assuming a founder/executive
role from tagline alone. Full chart/prose recompute across all six
charts, sums verified.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Kilian Frank: PhD physicist (X-ray scattering), no current employer named,
classified as research-adjacent per the Marc Thiry precedent. Rishabh
Moolya: Master's student, University of Hamburg. Artem Zaidman: Research
Assistant at DESY (tagline-over-logo precedent), 12th DESY-linked entry.
Also fixed a pre-existing drift in the Notable Clusters table found while
auditing it for this batch: DESY row's count was correct but Cecilia
Farias Marchant's role was never added to its note text, and the row-sum/
distinct-headcount footnote had accumulated a real error (claimed two
cross-row dual-affiliations, only one exists). Rewrote the DESY row from
the underlying data directly and corrected the footnote (29 row-sum, one
dual-affiliation, 28 distinct headcount, was incorrectly stated as 26).
Full chart/prose recompute across all six charts, sums verified.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
10/07 was fully filtered out of the Engagement Composition table by
_reports_posts_f() (correct for calculations, but invisible to a reader).
Now it appears struck through with a pale-red background and "Excluded"
written next to it, same transparency treatment Core Message's register
table already gives it — visible and clearly marked, not hidden.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Was framed as a big "backfill full history or accept the gap" decision;
now that pre/non-campaign posts are properly excluded, the real remaining
gap is just one missed post (27/08) plus the newest post not yet sent over
(08/09) — never a large historical question.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
The branding campaign only runs July-September; 19/06 and 24/06 predate it
entirely, same treatment as 02/09. Added to NON_CAMPAIGN_DATES.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Decided against the 3-7 day match-window/weekly-bucket idea for now: at
current follow/visit volumes, a week can have as few as 1-3 real follows,
too small for weekly aggregation to meaningfully reduce noise over daily
data. Moved from "outstanding" to "data_quality" as a recorded decision,
not silently dropped. Revisit if monthly volumes grow enough for the
technique to pay off.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Added NON_CAMPAIGN_DATES (starting with 02/09), excluded the same way
REPOST_DATES already is — a real TXproducts post, but not part of the
24-post branding campaign, so it shouldn't skew "what worked" findings
that are specifically about the campaign's own content.
Also closed out July's "end-of-week boss report" outstanding item per
Mckinley: discarded, no longer tracked.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Full profile card confirms Germany/Hamburg, merging him back into the
Geography chart (Germany 69->70, Hamburg 39->40) and restoring Geography's
population to match Sector's exactly (112, both up from 111). No open
items remaining in the follower dataset.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Cross-checked today's additions against LinkedIn's own New Followers list:
"Joo William" corrected to William Joo (name order), fuller title added
(Chairman of KAMUG, Professor at Inha University). Added Davood Momeni
(Founder, XDefine, semiconductor reliability/SiC/WBG) - C-Level/Founder,
Executive/Management, Semiconductor/Aerospace/Defense. His location wasn't
shown on the profile card, so he's included in Sector's 112-person
population but explicitly excluded from Geography's 111-person population
until confirmed, flagged in the report rather than guessed.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Niklas Meidow: confirmed internal TXproducts employee (Product Engineer),
5th internal follower. Joo William: Inha University Professor, South Korea
(first SK follower), Director/Head/Principal per the Professor precedent.
Francesco Marzari: PhD Student at Università di Trento, Italy (crosses
2-follower threshold, own Geography row), Postdoc/PhD Researcher per the
PhD-candidate precedent. Full chart/prose recompute across all six charts,
sums verified.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Hand-audited against LinkedIn's own Reactions/Comments/Reposts lists.
Denny Droßmann is a new engaged non-follower; Marc Thiry's repeat-engager
streak extends to 3 posts (16/07, 28/07, 03/09).
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Ablimit Ablez: Los Angeles, no current employer named (Chiba University
is his PhD alma mater, not current company), classified Unknown/Engineering-
Technical/no-company-listed. Cecilia Farias Marchant: DESY (11th DESY-
linked entry, 27th Hamburg/DESY cluster member), Senior IC/Lead, Marketing/
Comms/Ops. Full chart/prose recompute across all six charts, sums verified.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Fixes "no centroid for X" console warning surfaced on the Aug 31 export
that closes out August (a new US-metro follower without a country suffix
in their location string, same pattern as San Francisco Bay Area and
Greater Madison Area).
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This was the long-standing unnamed "specific gap" flagged earlier — now
resolved and recorded in features_shipped, since it was never actually
written down as an outstanding item in the first place (tracked only in
conversation until now).
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Per feedback: a monthly report showing the same near-identical cumulative
tables every month, marginally bigger each time, isn't earning its keep.
Fixed by making the cumulative views themselves show where this month's
people landed, instead of adding that only as a separate summary:
- Account Clusters now annotates each company's growth inline (e.g. "DESY:
5 (+3 this month)") instead of a flat all-time count with no monthly
story.
- Notable Contacts highlights rows added this month in place, in context
with everyone else at that seniority level, instead of only being named
in a separate bullet list above.
- Dropped the cumulative Sector/Function/Seniority/Country table entirely —
Audience Composition already owns that exact breakdown for the month,
so repeating the all-time version here was pure duplication with no
monthly-specific value.
- Kept the Sector x Seniority crosstab as pure cumulative reference (still
needs the full ~100+ scale to mean anything, no individual-level "new"
story to tell).
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Feedback: showing "102 followers to date" as the headline of a monthly
report answers the wrong question — a reader wants to know what happened
in the month the report covers, with the cumulative numbers as supporting
context, not the other way around. Audience Composition already did this
correctly (month-scoped "22 new followers" by design); Follower Study now
leads the same way: which new Notable Contacts joined this specific month,
and which Account Clusters grew, computed live for whatever month is
selected. The existing cumulative "bimodal seniority"/"shallow-network"
findings stay, just demoted to a clearly-labeled "full picture, to date"
section beneath.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>