Baltimorean "Ard!" → "Baltimorean" rename across inline surfaces (banner / scroll line / my-notes Title row); navbar DON greeting keeps "Ayo, Ard!" as the sole Ard! flair — and a companion PronounsAppletFlowTest sync-point fix for the 200/Brief response path introduced by the Baltimorean unlock loop in 435a192 ; FT fix (functional_tests/test_game_kit.py) — PronounsAppletFlowTest.test_pronoun_flip_propagates_to_billscroll_and_most_recent was written pre-Baltimorean when set_pronouns always returned 204 → reload; the Baltimorean loop split the response into 200-w-brief (first-bawlmorese, no reload — Brief banner would be lost) vs 204-reload (other pronouns), so the test's step-4 wait_for(.gk-pronoun-card.active[data-pronoun='bawlmorese']) hung indefinitely on the Brief banner because the active class only updates after the reload that no longer happens; sync point swapped to wait_for(.note-banner) — the Brief banner's appearance is the natural post-commit signal that the server saved the pronoun (after which step-5/6 navigate to billboard + scroll to verify "yos" prose) ; rename core (drama/models.py) — Note.grant_if_new else branch's attr_combo inline attribution now uses note.display_name instead of note.display_title, so the scroll line reads "Look!—new Note unlocked. Baltimorean recognizes @disco the Baltimorean." instead of "…the Ard!." (for stargazer/schizo/nomad display_name == display_title so the line is unchanged; only baltimorean's two values diverge — display_title="Ard!" for navbar flair, display_name="Baltimorean" for everywhere else); Brief.title field also swapped from display_title to display_name so the banner title slot reads "Baltimorean" not "Ard!" — admin-grant branch (_ADMIN_NOTE_SLUGS: super-schizo, super-nomad) still uses display_title for the "honorary title of {X}" phrase because that branch DOES want the don-able title there ("Schizoid Man" / "Stranger") ; my-notes card "Title:" row rename — added card_title key to _NOTE_DISPLAY["baltimorean"] ({"greeting": "Ayo,", "title": "Ard!", "card_title": "Baltimorean"}) + new Note.card_title property that falls through _NOTE_DISPLAY[slug]["card_title"] then defaults to display_title; billboard/views.py _my_notes_context swaps "recognition_title": n.display_titlen.card_title so the my-notes Baltimorean card shows "Title: Baltimorean" instead of "Title: Ard!" — super-schizo's card still reads "Title: Schizoid Man" because card_title falls back to display_title for slugs w.o an override ; ONLY Ard! surface remaining: navbar DON greeting via User.active_title.display_title (lyric/models.py:158) — display_title itself was deliberately untouched so the navbar still flips Welcome, EarthmanAyo, Ard! after DON, which is the entire point of the Baltimorean flair ; existing DB rows w. stored "the Ard!" Line.text + Brief.title="Ard!" from prior dev-DB grants will NOT update — those columns are persisted at grant_if_new time, not computed live; user has accepted dev-DB wipe-and-re-acquire as the path forward, so no data migration ; tests — drama/tests/unit/test_models.py +2 UTs (test_baltimorean_card_title_is_baltimorean pins the override, test_stargazer_card_title_falls_back_to_display_title pins the fallback for non-overridden slugs); drama/tests/integrated/test_note_brief.py test_first_grant_creates_post_line_and_brief updated assertion brief.title == note.display_name (was display_title) to reflect the new contract; dashboard/tests/integrated/test_views.py test_brief_payload_carries_baltimorean_title expects "Baltimorean" not "Ard!"; functional_tests/test_bill_baltimorean.py T1 banner title check swapped "Ard!" → "Baltimorean" + module docstring line 10 updated — T4 (navbar DON greeting flip to "Ayo, Ard!") preserved verbatim, the one surface where Ard! still lives ; full FT suite for baltimorean 6/6 green in 53s; drama + dashboard + billboard ITs/UTs 290 green in 16.5s — TDD
All checks were successful
ci/woodpecker/push/pyswiss Pipeline was successful
ci/woodpecker/push/main Pipeline was successful

Code architected by Disco DeDisco <discodedisco@outlook.com>
Git commit message Co-Authored-By:
Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Disco DeDisco
2026-05-18 10:54:30 -04:00
parent 435a192349
commit 1ccb045889
7 changed files with 41 additions and 15 deletions

View File

@@ -216,7 +216,7 @@ def my_notes(request):
{
"obj": n,
"title": _NOTE_META.get(n.slug, {}).get("title", n.slug),
"recognition_title": n.display_title,
"recognition_title": n.card_title,
"description": _NOTE_META.get(n.slug, {}).get("description", ""),
"palette_options": _NOTE_META.get(n.slug, {}).get("palette_options", []),
"swatch_label": _NOTE_META.get(n.slug, {}).get("swatch_label"),

View File

@@ -768,7 +768,7 @@ class SetPronounsBawlmoreseUnlockTest(TestCase):
def test_brief_payload_carries_baltimorean_title(self):
response = self.client.post(self.url, data={"pronouns": "bawlmorese"})
brief = response.json()["brief"]
self.assertEqual(brief["title"], "Ard!")
self.assertEqual(brief["title"], "Baltimorean")
def test_brief_payload_square_url_jumps_to_my_notes(self):
"""NOTE_UNLOCK Briefs carry a `square_url` pointing at /billboard/my-notes/

View File

@@ -212,7 +212,7 @@ _NOTE_DISPLAY = {
"nomad": {"greeting": "Welcome,", "title": "Nomad"},
"super-schizo": {"greeting": "21<span class='ord'>st</span> Century", "title": "Schizoid Man"},
"super-nomad": {"greeting": "Howdy,", "title": "Stranger"},
"baltimorean": {"greeting": "Ayo,", "title": "Ard!"},
"baltimorean": {"greeting": "Ayo,", "title": "Ard!", "card_title": "Baltimorean"},
}
# Note slugs whose grant prose uses the long admin format ("The administration
@@ -249,6 +249,15 @@ class Note(models.Model):
def display_greeting(self):
return _NOTE_DISPLAY.get(self.slug, {}).get("greeting", "Welcome,")
@property
def card_title(self):
"""The string shown in the my-notes card's "Title:" row. Defaults to
`display_title` (the don-able title — most slugs render the title you
DON here, e.g. "Schizoid Man" for super-schizo). Baltimorean overrides
so the card reads "Baltimorean" instead of the navbar-only "Ard!"
flair."""
return _NOTE_DISPLAY.get(self.slug, {}).get("card_title", self.display_title)
@property
def display_name(self):
"""The Note's *name* (e.g., "Stargazer", "Super-Schizo") — the heading
@@ -316,9 +325,13 @@ class Note(models.Model):
"This does not entail any additional corporate benefits."
)
else:
# Inline attribution reads "{handle} the {Note name}", not the
# don-able title. For most slugs the two coincide ("the Stargazer")
# but Baltimorean's title is the navbar flair "Ard!" — "the Ard!"
# reads oddly inline; "the Baltimorean" matches the Note name.
attr_combo = (
f'<span class="post-attribution">{handle} '
f'the {note.display_title}</span>'
f'the {note.display_name}</span>'
)
line_text = (
f"Look!—new Note unlocked. {note_anchor} "
@@ -339,6 +352,6 @@ class Note(models.Model):
post=post,
line=line,
kind=Brief.KIND_NOTE_UNLOCK,
title=note.display_title,
title=note.display_name,
)
return note, created, brief

View File

@@ -30,8 +30,9 @@ class GrantIfNewSpawnsBriefTest(TestCase):
self.assertEqual(brief.owner, self.user)
# The Brief's line is one of the Post's lines
self.assertIn(brief.line, list(post.lines.all()))
# Brief title matches Note display title
self.assertEqual(brief.title, note.display_title)
# Brief title matches Note display name (the Note's name — used in the
# banner's title slot and inline "the {name}" attribution).
self.assertEqual(brief.title, note.display_name)
def test_second_grant_same_slug_returns_no_brief(self):
Note.grant_if_new(self.user, "stargazer")

View File

@@ -27,6 +27,12 @@ class NoteDisplayBaltimoreanTest(SimpleTestCase):
through to `slug.title()` → 'Baltimorean'."""
self.assertEqual(_note("baltimorean").display_name, "Baltimorean")
def test_baltimorean_card_title_is_baltimorean(self):
"""The my-notes card's "Title:" row uses `card_title`, which Baltimorean
explicitly overrides to "Baltimorean" so the navbar-only "Ard!" flair
doesn't leak onto the card."""
self.assertEqual(_note("baltimorean").card_title, "Baltimorean")
class NoteDisplayStargazerTest(SimpleTestCase):
"""Smoke tests for the existing stargazer entry — pins the contract that
@@ -37,3 +43,8 @@ class NoteDisplayStargazerTest(SimpleTestCase):
def test_stargazer_display_greeting_is_welcome(self):
self.assertEqual(_note("stargazer").display_greeting, "Welcome,")
def test_stargazer_card_title_falls_back_to_display_title(self):
"""Slugs without a `card_title` override fall through to display_title —
for stargazer that's "Stargazer" (don-able title == Note name)."""
self.assertEqual(_note("stargazer").card_title, "Stargazer")

View File

@@ -7,7 +7,7 @@ Baltimorean Note and fires the slide-down Brief banner.
End-to-end loop captured here:
1. Game Kit → pronouns applet → click `bawlmorese` card → guard portal "OK"
2. Brief banner slides in with title "Ard!" + Look! prose + FYI/NVM/?-square
2. Brief banner slides in with title "Baltimorean" + Look! prose + FYI/NVM/?-square
3. Navigate to /billboard/my-notes/ → Baltimorean item w. the Aaron quote
4. DON the Baltimorean Note → navbar greeting flips
"Welcome, Earthman""Ayo, Ard!"
@@ -106,10 +106,10 @@ class BaltimoreanNoteFromGameKitTest(FunctionalTest):
banner = self.wait_for_slow(lambda: self.browser.find_element(
By.CSS_SELECTOR, ".note-banner"
))
# The title slot carries the recognition title — for baltimorean
# that's "Ard!" (vs stargazer's "Stargazer").
# The title slot carries the Note name — "Baltimorean". The don-able
# title "Ard!" only surfaces in the navbar greeting after DON.
self.assertIn(
"Ard!",
"Baltimorean",
banner.find_element(By.CSS_SELECTOR, ".note-banner__title").text,
)
# Look! prose lands in the description.

View File

@@ -198,12 +198,13 @@ class PronounsAppletFlowTest(FunctionalTest):
self.assertIn("Set pronoun preference?", portal.text)
self.assertIn("yo/yo/yos", portal.text)
# 4. Click OK — the page reloads, .active class moves to bawlmorese.
# 4. Click OK — first-time bawlmorese unlocks the Baltimorean Note, so
# the server returns 200 w. a Brief payload (no reload — the banner
# would be lost). Wait for the banner to confirm the commit landed
# before navigating away.
portal.find_element(By.CSS_SELECTOR, ".guard-yes").click()
self.wait_for(
lambda: self.browser.find_element(
By.CSS_SELECTOR, ".gk-pronoun-card.active[data-pronoun='bawlmorese']"
)
lambda: self.browser.find_element(By.CSS_SELECTOR, ".note-banner")
)
# 5. Navigate to the Billboard — Most Recent Scroll applet must now