Aurora Facebook comparison: Town page vs the Mayor's two pages
Three Facebook exports, 2025-10-15 → 2026-10-15: the official Town of Aurora page, and Mayor Tom Mrakas's tom.mrakas profile and Mrakas4Aurora page. Each caption was read and classified by Claude Code. Dates are America/Toronto local time. Generated 2026-10-16.
Key findings
• The two mayor pages are close mirrors: 96.1% of tom.mrakas captions also appear on Mrakas4Aurora, and 97.4% the other way. 859 of 868 shared items were posted to both within an hour.
• Almost no caption text is copied between the Town page and the mayor's pages: only 3 Town posts share wording with a mayor post. A further 125 mayor posts cover the same event as a Town post in different words.
• Election content starts on the Town page on 2026-04-01 (neutral voter information only). The mayor's campaign content starts on 2026-03-14.
• 74.5% of the mayor's posts (both pages) are town-related and have no counterpart on the Town page. That is 91.2% of the mayor's town-related posts. See the final stat.
1 · Summary of the three files
| Source | Posts | Date range | Active days | Posts / active day | No caption | Distinct captions |
|---|---|---|---|---|---|---|
| Town of Aurora | 719 | 2025-10-15 → 2026-10-15 | 304 | 2.37 | 37 | 620 |
| tom.mrakas | 923 | 2025-10-15 → 2026-10-15 | 351 | 2.63 | 11 | 903 |
| Mrakas4Aurora | 900 | 2025-10-15 → 2026-10-15 | 348 | 2.59 | 2 | 891 |
| Total | 2,542 | 50 |
"Distinct captions" counts each duplicate group once, among posts with a caption long enough to match (≥25 characters after normalisation).
2 · Election-related posts · 3 · First date of election content
| Source | Election posts | % of posts | Neutral voting info | Campaign | First election post | First campaign post |
|---|---|---|---|---|---|---|
| Town of Aurora | 72 | 10.0% | 72 | 0 | 2026-04-01 | — |
| tom.mrakas | 128 | 13.9% | 3 | 125 | 2026-03-14 | 2026-03-14 |
| Mrakas4Aurora | 129 | 14.3% | 3 | 126 | 2026-03-14 | 2026-03-14 |
Election-related posts per month
The first election-related post on each page
Town of Aurora · 2026-04-01 · open postBig things are coming to Aurora in 2026! Whether you’re thinking about running for office, planning to vote, or just want to understand how the process works, now’s the time to stay connected about all things related to the upcoming Municipal Election. Knowledge is power and being informed about Aurora’s Municipal Election means you’re ready to take part with confidence. Sign up for updates a
tom.mrakas · 2026-03-14 · open postLet’s continue to choose progress. Let’s continue to choose community. Let’s continue to move Aurora forward — together. #LeadershipThatGetsThingsDone
Mrakas4Aurora · 2026-03-14 · open postLet’s continue to choose progress. Let’s continue to choose community. Let’s continue to move Aurora forward — together. #LeadershipThatGetsThingsDone
4 · Duplicate content detection
A post counts as a duplicate when its caption matches another post's caption exactly (after normalising case, punctuation, emoji and links), or is a near-copy of it. A near-copy has ≥85% character similarity, or the shorter text is ≥90% contained in the longer, and the two share the same dates and numbers. The date-and-number rule stops recurring templates such as "The Week Ahead – April 6 to 12" from matching a different week. Captions under 25 characters or empty can't be matched reliably, so they're listed separately.
| Source | Posts | Too short / no caption | Unique | Duplicate (any) | Repeat within same page only | Also on another page |
|---|---|---|---|---|---|---|
| Town of Aurora | 719 | 38 | 569 | 112 | 109 | 3 |
| tom.mrakas | 923 | 20 | 35 | 868 | 0 | 868 |
| Mrakas4Aurora | 900 | 9 | 23 | 868 | 0 | 868 |
The duplication buckets you asked for
| Bucket | Count |
|---|---|
| Unique posts — Town (no match anywhere) | 569 |
| Unique posts — tom.mrakas | 35 |
| Unique posts — Mrakas4Aurora | 23 |
| Town posts repeated within the Town page, never on a personal page | 109 |
| Town posts whose caption also appears on a personal page | 3 |
| Duplicated across the two personal pages — distinct items (posts on each page) | 868 (868 / 868) |
| …of those, not on the Town page | 865 |
| Personal-page posts not on the Town page — tom.mrakas | 900 |
| Personal-page posts not on the Town page — Mrakas4Aurora | 888 |
Where distinct content lives (each duplicate group counted once)
| Pages carrying the content | Distinct items |
|---|---|
| Both personal pages (not Town) | 865 |
| Town only | 617 |
| tom.mrakas only | 35 |
| Mrakas4Aurora only | 23 |
| All three | 3 |
Categories (each post read and classified)
1 = Town related post · 2 = Election related post · 3 = Private content. Posts with no caption can't be classified and are shown as "uncategorized". The category is saved back to each source JSON file as cc_category_id, cc_category and cc_analysis. The existing category fields were left untouched.
Category mix by source
| Source | Town related | Election related | Private content | Uncategorized |
|---|---|---|---|---|
| Town of Aurora | 610 (84.8%) | 72 (10.0%) | 0 (0.0%) | 37 |
| tom.mrakas | 743 (80.5%) | 128 (13.9%) | 41 (4.4%) | 11 |
| Mrakas4Aurora | 746 (82.9%) | 129 (14.3%) | 22 (2.4%) | 3 |
Posts per day over time (duplicates shown)
Each page has its own panel on a shared y-axis. Bars are stacked by duplicate status. The dashed lines mark the start of the mayor's campaign posts (2026-03-14) and the start of internet voting (2026-10-16).
5 · Duplicate % between pages
Directional: the share of the row page's captions that have a match on the column page. The diagonal shows repeats within the same page. Denominator: posts with a matchable caption.
| From ↓ / matched in → | Town of Aurora | tom.mrakas | Mrakas4Aurora |
|---|---|---|---|
| Town of Aurora | 16.0%109/681 | 0.4%3/681 | 0.4%3/681 |
| tom.mrakas | 0.3%3/903 | 0.0%0/903 | 96.1%868/903 |
| Mrakas4Aurora | 0.3%3/891 | 97.4%868/891 | 0.0%0/891 |
Symmetric overlap (Jaccard over distinct content)
| Pair | Shared items | Items on either page | Overlap % |
|---|---|---|---|
| Town of Aurora ↔ tom.mrakas | 3 | 1,520 | 0.2% |
| Town of Aurora ↔ Mrakas4Aurora | 3 | 1,508 | 0.2% |
| tom.mrakas ↔ Mrakas4Aurora | 868 | 926 | 93.7% |
Other analysis
Who posts shared content first, and how far apart
| Pair | Shared items | Posted first | Median gap | Within 1 hour |
|---|---|---|---|---|
| Town of Aurora ↔ tom.mrakas | 3 | tom.mrakas: 3 | 0.7 h | 2 / 3 |
| Town of Aurora ↔ Mrakas4Aurora | 3 | Mrakas4Aurora: 3 | 0.7 h | 2 / 3 |
| tom.mrakas ↔ Mrakas4Aurora | 868 | Mrakas4Aurora: 437, tom.mrakas: 431 | 0.0 h | 859 / 868 |
Duplication by category
| Source | Category | Posts | Also on another page | Unique |
|---|---|---|---|---|
| Town of Aurora | Town related post | 610 | 3 | 518 |
| Town of Aurora | Election related post | 72 | 0 | 52 |
| Town of Aurora | Uncategorized | 37 | 0 | 37 |
| tom.mrakas | Town related post | 743 | 721 | 22 |
| tom.mrakas | Election related post | 128 | 128 | 0 |
| tom.mrakas | Private content | 41 | 19 | 22 |
| tom.mrakas | Uncategorized | 11 | 0 | 11 |
| Mrakas4Aurora | Town related post | 746 | 721 | 25 |
| Mrakas4Aurora | Election related post | 129 | 128 | 1 |
| Mrakas4Aurora | Private content | 22 | 19 | 3 |
| Mrakas4Aurora | Uncategorized | 3 | 0 | 3 |
Agreement with the categories already in the files
The JSON files already carried a category field from an earlier analysis. This table compares it with this independent read. In the arrows, the first number is the existing label and the second is this read (1 Town, 2 Election, 3 Private).
| Source | Posts compared | Agreement | Disagreements (existing → this read) |
|---|---|---|---|
| Town of Aurora | 680 | 99.9% | 2->1: 1 |
| tom.mrakas | 909 | 97.8% | 1->2: 10, 2->1: 2, 1->3: 8 |
| Mrakas4Aurora | 895 | 97.7% | 1->2: 11, 2->1: 2, 1->3: 8 |
Examples
Town-related mayor posts with no wording match on the Town page
Mrakas4Aurora · 2026-10-15 · open postCongratulations to Katerina Angellotti, owner of SKIN MED Spa Aurora at 15565 Yonge St.! A wonderful, welcoming space offering skin care services for both men and women in our community. It’s always great to see entrepreneurs bringing their passion and expertise to our town. Wel
tom.mrakas · 2026-10-13 · open postThe Week Ahead - October 13 to 18
Mrakas4Aurora · 2026-10-13 · open postThe Week Ahead - October 13 to 18
Mrakas4Aurora · 2026-10-12 · open postHappy Thanksgiving, Aurora! Today is a chance to pause, give thanks and appreciate the people who make our lives and our community so special. I’m thankful for my family, friends and the privilege of serving this incredible Town. Most of all, I’m grateful for the kindness and g
tom.mrakas · 2026-10-12 · open postHappy Thanksgiving, Aurora! Today is a chance to pause, give thanks and appreciate the people who make our lives and our community so special. I’m thankful for my family, friends and the privilege of serving this incredible Town. Most of all, I’m grateful for the kindness and g
tom.mrakas · 2026-10-10 · open postIt was great to see so many families at Town Square for “Fall Faves”! From pumpkin carving and story time to lots of fun activities, it was a wonderful way to spend part of the Thanksgiving long weekend together as a community.
Mrakas4Aurora · 2026-10-10 · open postIt was great to see so many families at Town Square for “Fall Faves”! From pumpkin carving and story time to lots of fun activities, it was a wonderful way to spend part of the Thanksgiving long weekend together as a community.
tom.mrakas · 2026-10-10 · open postSunny and cool at the Farmers’ Market this morning! It’s definitely a “grab a pumpkin pie” kind of weekend, and this one from Catharina’s Kitchen looks delicious! Have a great Thanksgiving long weekend, Aurora!
Town posts whose caption also appears on a mayor page
Town of Aurora · 2026-09-15 · open postThe third-party review into the May 4, 2026 Animal Services incident is now publicly available, following the completion of necessary legal redactions. The full report, including a summary of findings in section 8 is available at aurora.ca/AnimalServicesIncident. We will work co
Town of Aurora · 2026-05-27 · open postMayor Mrakas has shared a statement regarding council proceedings and the ongoing review into the death of Heiniu. To read the statement, visit: https://www.aurora.ca/your-government/office-of-the-mayor/statements-from-the-office-of-the-mayor/
Town of Aurora · 2025-11-27 · open postCircular Materials is now offering a smaller 65-gallon size recycling cart. To exchange the 95-gallon cart for the smaller 65-gallon option, please make a request through one of the following: circularmaterials.ca/n6aurora GFL Customer Service: 1-833-779-4351 Once you submit yo
Campaign posts (mayor pages)
tom.mrakas · 2026-10-15 · open post🚨 ENDORSEMENT ALERT 🚨 I'm incredibly grateful to have the support of a proud Aurora resident Vince Sposito and former owner of Casa Carbone, a local business that was part of our community. Supporting our small businesses, revitalizing our downtown, and ensuring Aurora continue
Mrakas4Aurora · 2026-10-15 · open post🚨 ENDORSEMENT ALERT 🚨 I'm incredibly grateful to have the support of a proud Aurora resident Vince Sposito and former owner of Casa Carbone, a local business that was part of our community. Supporting our small businesses, revitalizing our downtown, and ensuring Aurora continue
tom.mrakas · 2026-10-14 · open post🚨 ENDORSEMENT ALERT 🚨 I'm incredibly honoured to have the support of Claude Nembhard, CEO of the Ontario Basketball Association, proud Aurora resident of over 26 years, and father of two NBA players! Claude understands firsthand the importance of strong leadership, investing in
Mrakas4Aurora · 2026-10-14 · open post🚨 ENDORSEMENT ALERT 🚨 I'm incredibly honoured to have the support of Claude Nembhard, CEO of the Ontario Basketball Association, proud Aurora resident of over 26 years, and father of two NBA players! Claude understands firsthand the importance of strong leadership, investing in
tom.mrakas · 2026-10-13 · open postTogether, we've built a stronger community. That's a record we can all be proud of, and one I’m proud to stand behind.
Mrakas4Aurora · 2026-10-13 · open postTogether, we've built a stronger community. That's a record we can all be proud of, and one I’m proud to stand behind.
Private content (mayor pages)
tom.mrakas · 2026-10-09 · open postBirthday dinner at Locale for Alison… Always great food!!
tom.mrakas · 2026-10-09 · open postHappy birthday to my beautiful wife and biggest supporter, Alison!! ❤️❤️❤️
tom.mrakas · 2026-09-26 · open postI remember this from 8 years ago!!!
tom.mrakas · 2026-09-12 · open postAlison finished 3rd in her single at the World Rowing Masters Regatta this morning!!! Very proud!! Two 3rd 🥉 place finishes!!!
tom.mrakas · 2026-09-11 · open postVery proud of Am Collins and her rowing partner Ana as they finished 3rd in Women's Double C today at the 2026 World Rowing Masters Regatta in Bled, Slovenia. Way to represent Canada and Aurora!!
Mrakas4Aurora · 2026-09-11 · open postVery proud of Alison and her rowing partner Ana as they finished 3rd in Women's Double C today at the 2026 World Rowing Masters Regatta in Bled, Slovenia. Way to represent Canada and Aurora!!
Low-confidence classifications to review (42)
| Source | Assigned | Reason | Caption | |
|---|---|---|---|---|
| Town of Aurora | Town | Bare share request, presumed Town content | Please help spread the word! | post |
| Town of Aurora | Town | Bare reminder, presumed Town content | REMINDER! | post |
| tom.mrakas | Town | Farmers market visit; campaign mentioned only incidentally | A cool morning at the Farmers’ Market, I definitely should have worn a jacket!! With the campaign in high gear, a delicious peameal sandwich for me and some beautiful flowers from Flossy for Alison fe | post |
| tom.mrakas | Private | Personal memory share, unclear content | I remember this from 8 years ago!!! | post |
| tom.mrakas | Town | Town Square anniversary; names opposing councillors' votes | Two years ago, we officially opened the doors to Aurora Town Square, a transformational project that has brought new energy to our historic downtown and created a vibrant gathering place for residents | post |
| tom.mrakas | Town | Farmers market visit; door-to-door mentioned incidentally | The rain is holding off for the Farmers’ Market! With all the walking ahead as I go door to door, I need a peameal sandwich! While Alison picked up some beautiful flowers, and grabbed everything we ne | post |
| tom.mrakas | Town | Town Square recognition; campaign hashtags but no vote appeal | Aurora is making headlines—and for all the right reasons. When we set out to create Aurora Town Square, we weren’t just building a new public space. We were investing in the future of our downtown, p | post |
| tom.mrakas | Private | Ambiguous brief comment, no clear civic context | Nice flag 😊 | post |
| tom.mrakas | Private | Personal nostalgia over old business ad | TBT - Love seeing this old ad from the Auroran back in the early 2000's… Same phone number and still serving the Aurora community, just with a few more greys in that hair .... lol | post |
| tom.mrakas | Town | Market visit mixed with personal anniversary flowers | Might be a little rain, but that didn’t stop me from stopping by the Farmers’ Market this morning to pick up some beautiful fresh flowers from Flossy Flowers for our anniversary!!! Always great to see | post |
| tom.mrakas | Town | Attending gala, unclear context | At the 2026 red and white gala….. | post |
| tom.mrakas | Election | Newsletter signup via campaign site with campaign hashtag | My April newsletter is coming your way tomorrow. Make sure you’re signed up so you don’t miss it. Stay informed. Stay engaged. Subscribe: Mrakas.ca/Contact #LeadershipThatGetsThingsDone | post |
| tom.mrakas | Town | Radio appearance notice | Joining Greg Brady tomorrow morning….. 7:30am | post |
| tom.mrakas | Election | Parkland 'my leadership' record pitch, campaign framing | From day one in 2018, I knew Aurora had work to do. For too long, we were falling behind when it came to protecting and expanding our parkland. We weren’t investing enough, and we weren’t thinking far | post |
| tom.mrakas | Private | Personal tribute to women in his life | I’m fortunate to have two incredible, strong women in my life who mean the world to me. To them, and to all women, Happy International Women’s Day! #InternationalWomensDay | post |
| tom.mrakas | Town | Local athlete shout-out, sports fandom | Always great to see Aurora’s own Andrew Nembhard back home as the Indiana Pacers are in Toronto. #GoPacersGo | post |
| tom.mrakas | Private | Personal foreign affairs opinion on Iran | I stand with the people of Iran in their fight for freedom, dignity, and human rights. The voices of the Iranian people must be heard, and their courage must be supported. #FreeIran | post |
| tom.mrakas | Town | Newsletter signup for year-ahead message | 2026 will be a defining year for Aurora. With strong leadership and clear community priorities, I’m focused on delivering results that matter most to residents — and keeping you informed every step o | post |
| tom.mrakas | Private | Personal New Year's Eve brunch | New Year’s Eve brunch!! A great way to finish 2025 — supporting local and celebrating everything that makes Aurora such a great place to live. #SupportLocal | post |
| tom.mrakas | Town | Newsletter sign-up link, pre-campaign period | Sign Up Here 👉 Mrakas.ca/Contact #LeadershipThatPutsPeopleFirst #LeadershipThatGetsThingsDone | post |
| tom.mrakas | Town | Birthday wish to mayoral staff member | Wishing the happiest of birthdays to someone who keeps everything running smoothly — my Executive Assistant and Policy Advisor Katherine Marsden Thank you for everything you do for me, for our team, | post |
| tom.mrakas | Town | Office visitor in Halloween costume | Had a special guest at the office this morning — Liam stopped by to show off his Halloween costume! | post |
| tom.mrakas | Private | Mostly personal Jays fandom, mentions council | Ready for Council and the Jays game!!! | post |
| Mrakas4Aurora | Town | Farmers market visit; campaign mentioned only incidentally | A cool morning at the Farmers’ Market, I definitely should have worn a jacket!! With the campaign in high gear, a delicious peameal sandwich for me and some beautiful flowers from Flossy for Alison fe | post |
| Mrakas4Aurora | Town | Town Square anniversary; names opposing councillors' votes | Two years ago, we officially opened the doors to Aurora Town Square, a transformational project that has brought new energy to our historic downtown and created a vibrant gathering place for residents | post |
| Mrakas4Aurora | Town | Farmers market visit; door-to-door mentioned incidentally | The rain is holding off for the Farmers’ Market! With all the walking ahead as I go door to door, I need a peameal sandwich! While Alison picked up some beautiful flowers, and grabbed everything we ne | post |
| Mrakas4Aurora | Town | Town Square recognition; campaign hashtags but no vote appeal | Aurora is making headlines—and for all the right reasons. When we set out to create Aurora Town Square, we weren’t just building a new public space. We were investing in the future of our downtown, p | post |
| Mrakas4Aurora | Private | Ambiguous brief comment, no clear civic context | Nice flag 😊 | post |
| Mrakas4Aurora | Town | Market visit mixed with personal anniversary flowers | Might be a little rain, but that didn’t stop me from stopping by the Farmers’ Market this morning to pick up some beautiful fresh flowers from Flossy Flowers for our anniversary!!! Always great to see | post |
| Mrakas4Aurora | Election | Newsletter signup via campaign site with campaign hashtag | My April newsletter is coming your way tomorrow. Make sure you’re signed up so you don’t miss it. Stay informed. Stay engaged. Subscribe: Mrakas.ca/Contact #LeadershipThatGetsThingsDone | post |
| Mrakas4Aurora | Town | Radio appearance notice | Joining Greg Brady tomorrow morning….. 7:30am | post |
| Mrakas4Aurora | Election | Parkland 'my leadership' record pitch, campaign framing | From day one in 2018, I knew Aurora had work to do. For too long, we were falling behind when it came to protecting and expanding our parkland. We weren’t investing enough, and we weren’t thinking far | post |
| Mrakas4Aurora | Private | Personal tribute to women in his life | I’m fortunate to have two incredible, strong women in my life who mean the world to me. To them, and to all women, Happy International Women’s Day! #InternationalWomensDay | post |
| Mrakas4Aurora | Town | Local athlete shout-out, sports fandom | Always great to see Aurora’s own Andrew Nembhard back home as the Indiana Pacers are in Toronto. #GoPacersGo | post |
| Mrakas4Aurora | Private | Personal foreign affairs opinion on Iran | I stand with the people of Iran in their fight for freedom, dignity, and human rights. The voices of the Iranian people must be heard, and their courage must be supported. #FreeIran | post |
| Mrakas4Aurora | Town | 2026 priorities post, leadership framing | Strengthening our downtown, growth on Aurora’s terms, maintaining fiscal responsibility, and delivering real results for residents — 2026 is about building on our momentum over the last 7 years with s | post |
| Mrakas4Aurora | Town | Newsletter signup for year-ahead message | 2026 will be a defining year for Aurora. With strong leadership and clear community priorities, I’m focused on delivering results that matter most to residents — and keeping you informed every step o | post |
| Mrakas4Aurora | Private | Personal New Year's Eve brunch | New Year’s Eve brunch!! A great way to finish 2025 — supporting local and celebrating everything that makes Aurora such a great place to live. #SupportLocal | post |
| Mrakas4Aurora | Town | Newsletter sign-up link, pre-campaign period | Sign Up Here 👉 Mrakas.ca/Contact #LeadershipThatPutsPeopleFirst #LeadershipThatGetsThingsDone | post |
| Mrakas4Aurora | Town | Birthday wish to mayoral staff member | Wishing the happiest of birthdays to someone who keeps everything running smoothly — my Executive Assistant and Policy Advisor Katherine Marsden!! Thank you for everything you do for me, for our team, | post |
| Mrakas4Aurora | Town | Office visitor in Halloween costume | Had a special guest at the office this morning — Liam stopped by to show off his Halloween costume! | post |
| Mrakas4Aurora | Private | Mostly personal Jays fandom, mentions council | Ready for Council and the Jays game!!! | post |
Final stat · How much of the mayor's content is town-related but unique from the Town's own content?
Numerator: posts classified Town related (category 1) that share no caption wording with any Town of Aurora post and don't cover the same event as a Town post in rewritten form. The same-event check uses TF-IDF similarity ≥0.30 within ±7 days, or a shared aurora.ca link. Denominator: all posts on the page.
tom.mrakas
of all posts are town-related and have no counterpart on the Town page
- All posts
- 923
- Town-related (cat 1)
- 743 (80.5%)
- · caption copied from Town
- 3
- · same event, rewritten
- 63
- · no Town counterpart
- 677
- Unique-wording rate (any Town text match excluded)
- 80.2%
Mrakas4Aurora
of all posts are town-related and have no counterpart on the Town page
- All posts
- 900
- Town-related (cat 1)
- 746 (82.9%)
- · caption copied from Town
- 3
- · same event, rewritten
- 62
- · no Town counterpart
- 681
- Unique-wording rate (any Town text match excluded)
- 82.6%
Both mayor pages combined
of all posts are town-related and have no counterpart on the Town page
- All posts
- 1,823
- Town-related (cat 1)
- 1,489 (81.7%)
- · caption copied from Town
- 6
- · same event, rewritten
- 125
- · no Town counterpart
- 1,358
- Unique-wording rate (any Town text match excluded)
- 81.3%
Bottom line: about 74.5% of everything on the mayor's two pages (1,358 of 1,823 posts) is town-related content with no counterpart on the official Town page. With the stricter "no shared wording" test alone, the figure is 81.3%. Because the two mayor pages mirror each other, these posts boil down to 765 distinct items (80.1% of the 955 distinct items across both pages).
Method and caveats
- Classification: the 1,622 distinct captions were each read in full by Claude (Opus 5.5) against a fixed rubric. Exact copies share one decision. Each post records a confidence level and a short reason in
cc_analysis. Only caption text was available; no images or videos were inspected. - Duplicates compare caption text only. Two posts with different captions on the same photo, or the same caption on different media, can't be told apart.
dedup.pysets the thresholds; every matched pair is listed indup_groups.json. - Same-event matches (
topic_matches.json) are a looser tier, used only in the final stat. A match means the mayor covered the same event, not that he copied the post. - "Posted first" uses Facebook timestamps and doesn't prove who wrote the content.
- Files in
cc_analsyis/:results.json,posts.csv,dup_groups.json,topic_matches.json,classifications/, plus the scripts. To rebuild:dedup.py → topic_overlap.py → analyze.py → build_report.py.