Skip to content

Record what a sector or age group used to be called - #2691

Merged
maebeale merged 5 commits into
mainfrom
maebeale/tag-aliases
Oct 15, 2026
Merged

maebeale merged 5 commits into
mainfrom
maebeale/tag-aliases

Conversation

@maebeale

@maebeale maebeale commented Oct 15, 2026 •

Copy link
Copy Markdown
Collaborator

🤖 suggested review level: 3 Read 📖 one new table and lookup, plus a seeder carrying the translation tables; no existing behavior changes

Four systems asked facilitators who they serve, each with its own wording — FileMaker, the older registration and scholarship forms, Story Share, and the portal's earlier sector list. The portal settled on one vocabulary, but nothing recorded how an old word becomes one of today's tags, so every import had to guess.

What is the goal of this PR and why is this important?

  • The Rolodex import (Import people from the FileMaker Rolodex archive #2630) needs it first; a forms backfill and a Story Share migration will need the same answers.
  • The renames and merges already ran, so the old names are gone from the data. This is what's left of them.
  • Measured against the real archive: 17,734 of its 17,757 mentions are now translated, deliberately untranslated, or proposed. The 23 that remain all name an organization or a facilitator's own circumstances.

How did you approach the change?

  • docs/adr/0007 — the translation tables, from the mapping spreadsheet plus the decisions AWBW made on the terms the spreadsheet didn't cover.
  • TagAlias — one row per legacy term: the tag it resolves to (a Sector or an AgeRange Category), the system it came from, who recorded it, and whether it's ignored or proposed.
  • TagTranslation#resolve — the lookup. Answers with both the sector ids and the age-group ids a term means.
  • TagAliasSeeder / data:seed_tag_aliases — the tables as rows, idempotent, part of db:seed.

Five decisions worth a look

  • Data, not a constant. The archive's free text keeps producing new spellings, so an admin should be able to record one without a deploy — and the rows outlive the imports as the record of what a tag used to be called.
  • A name resolves only while the tag is published; an alias may point at a retired one. Sector.all would have resolved Poverty — a retired row — and handed it to 634 more people by accident. A recorded alias is the opposite of an accident, so Poverty still reaches the sector that already carries its older taggings.
  • The vocabularies cross. Elder Abuse is a life experience that means the Elders age range; Children's Services is a service area that means Children. So #resolve answers with both kinds, and primacy stays the caller's call since it follows from the field, not the term.
  • A term can name several tags — C & T, Families (every age), and the compound cells like Sexual Assault & Domestic Violence.
  • A term can name nothing on purpose (ignored): the Settings that say where someone works, Other, n/a, and People Who Have Experienced War, which AWBW chose to leave untagged rather than file under a sector it doesn't mean.

What's proposed rather than decided

About 90 readings of hand-typed free text are marked proposed — Immigration Clinic, Grief support group, Supervised visitation sessions for foster youth…. They resolve, so no import waits on a review, and TagAlias.proposed is the list to walk with staff. Anything naming an organization, a place that identifies one, or a facilitator's own circumstances is deliberately not read — that text stays in the archive.

Anything else to add?

  • Splitting is on line breaks and semicolons, not commas — the archive's own wording contains commas inside parentheticals ("Community violence (gang violence, mass shootings, etc.)").
  • Nothing consumes the lookup yet — Import people from the FileMaker Rolodex archive #2630 switches the import over to it.

🤖 Generated with Claude Code

@maebeale
maebeale marked this pull request as ready for review October 15, 2026 01:47
@maebeale
maebeale requested a review from jmilljr24 October 15, 2026 02:20
@maebeale maebeale changed the title Record what a sector or age group used to be called JM: Record what a sector or age group used to be called Oct 15, 2026

@jmilljr24 jmilljr24 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I like the model for this.

Will it still exist after the fm import? If not, can we open a blocked issue for its removal?

@maebeale

Copy link
Copy Markdown
Collaborator Author

@jmilljr24 i was thinking it'd be helpful to them post-import. and i was also thinking there's likelihood of other data coming out of the woodwork later that would need it. but yeah, if they think 100% not needed we can delete after for sure.

@maebeale
maebeale force-pushed the maebeale/tag-aliases branch from 1d6100f to 1eda3b3 Compare October 15, 2026 12:22
maebeale and others added 5 commits October 15, 2026 08:29
Four systems collected who a facilitator serves, each with its own word list,
and the portal's consolidation renamed and merged its way to one vocabulary —
but nothing recorded how a legacy *input* becomes one of those tags. The Rolodex
import has to answer that per value, and a forms backfill and Story Share
migration will too, so the tables live in one place instead of three guesses.

The deliberate non-mappings matter as much as the mappings: six FileMaker
Settings describe where someone works rather than who they serve, and three Life
Experiences have no sector yet. Both are recorded so the next reader doesn't
invent a near-miss.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
ADR-0007's tables have to live somewhere a lookup can read. A constant would
mean a deploy every time the archive's free text turns up another spelling, and
would vanish the day the imports are done — but what a tag used to be called is
worth keeping after that, so TagAlias rows carry it instead.

A row names one legacy term and the tag it resolves to, plus the system the term
came from and who recorded it. A term that names two tags is two rows, which is
how "C & T" reaches both Children and Teens.

A term can also name nothing on purpose. Six FileMaker "settings" say where
someone works rather than who they serve, and "Other" says nothing a tag could
carry; recording those as ignored keeps ~2,800 mentions of them out of the queue
of terms that genuinely need a decision.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
A retired sector or age range is unpublished rather than deleted, so its old
taggings survive — and resolving to one would hand it to hundreds of records
that never had it. The live sectors table holds more than the catalogue: 634
archive rows name "Poverty", a retired row, which Sector.all would have quietly
revived. A term that only matches a retired tag now reads as unresolved, which
puts it in front of someone instead.

The seeder reads the same published vocabulary, so a term aimed at a retired tag
is reported rather than recorded as an alias that can never resolve.

Serving families is serving every age, so FileMaker's "Families" age group tags
all four age ranges rather than going unread — a person has no population tag to
carry it on its own.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Four terms with real volume behind them: Poverty points at the retired
sector that already carries its taggings, Elder Abuse adds the Elders age
range, Children's Services makes Children the primary one, and war is left
untagged rather than filed under a sector it does not mean.

Two of those cross vocabularies — a life experience and a service area that
name ages, not sectors — so the lookup answers with both kinds and the caller
takes what it needs. Primacy stays the caller's call, since it follows from the
field a term sat in rather than from the term.

The compound cells ("Sexual Assault & Domestic Violence") resolve to every
sector they name, and the answers that say nothing — n/a, unsure, Everyone, the
delivery modes — are recorded as naming nothing, so the undecided queue is
short enough to read.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Most of the hand-typed cells are a venue, a programme name or a sentence about
the work, and a term AWBW hasn't ruled on shouldn't masquerade as one it has.
So the readable ones are recorded as proposed: they resolve, so no import waits
on a review, and TagAlias.proposed is the list to walk with staff term by term.

Around 90 terms, each worth one or two archive rows — Immigration Clinic, Grief
support group, Supervised visitation sessions for foster youth, and the cells
that name both sectors and the ages they serve. Another 16 say nothing a tag
could carry and are proposed as naming nothing.

Text that names an organization, a place that identifies one, or a facilitator's
own circumstances is left alone: it's personal, and it belongs in the archive
rather than copied into a catalogue. That leaves 23 terms, one mention each,
unresolved for good — down from 150.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@maebeale
maebeale force-pushed the maebeale/tag-aliases branch from 1eda3b3 to f103b8b Compare October 15, 2026 12:32
@maebeale maebeale changed the title JM: Record what a sector or age group used to be called Record what a sector or age group used to be called Oct 15, 2026
@maebeale
maebeale merged commit fa87878 into main Oct 15, 2026
3 checks passed
@maebeale
maebeale deleted the maebeale/tag-aliases branch October 15, 2026 12:45
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants