Medals¶
Medals are the horizontal achievement layer that sits on top of the linear military rank progression. Where rank measures how much a player has done (point thresholds → trading bonus, max-turns bonus, combat bonus), medals commemorate what specific things a player has done — ten thousand combat kills, a successful diplomatic treaty, a deep-nebula shard run, mentioning the right cat to the right guard.
The award lifecycle (storage, dispatcher, realtime events, admin tools) lives in ../../SYSTEMS/medal-service.md. This doc covers the catalog — what medals exist, what they commemorate, what they grant, and the lore that grounds them.
🚧 Partial. The medal system is shipped — storage, the award dispatcher + realtime events, and the bespoke per-medal effect layer (§ Effects). Nine medals auto-award through play (the three combat-tier checks in medal_service.check_combat_medals for Bronze Cluster / Silver Cluster / Quantum Cross, plus six wired in WO-CG2). The catalog below is the launch target: the remaining entries are admin-grant-only until their auto-award counters land, and a few await systems not yet built.
Categories¶
Five categories at launch, expandable:
| Category | What it commemorates |
|---|---|
| Combat | Kills, victories, survival under fire |
| Economic | Trade volume, port ownership, market dominance |
| Exploration | Sectors discovered, gates built, deep-nebula runs |
| Diplomatic | Treaties, multi-faction reputation, council service |
| Special / Hidden | Easter eggs, lore beats, one-off achievements |
The schema enum (medal_category) is closed at launch but extensible — additional categories like GENESIS, GOVERNANCE, SOCIAL, or SEASONAL can be added when their gameplay loops mature.
Tiers¶
| Tier | Visual treatment | Where it appears |
|---|---|---|
BRONZE |
Bronze metallic | First-tier achievements |
SILVER |
Silver metallic | Mid-tier achievements |
GOLD |
Gold metallic | High-tier achievements |
PLATINUM |
Platinum / iridescent | Capstone achievements |
UNIQUE |
One-of-a-kind / lore-themed | Special and one-off medals; no tier escalation |
In addition to color-coded tiers, every medal has a shape tier (circle / hexagon / star / shield / cross) — a colorblind-safe second axis so players can distinguish medals at a glance even when the color cue is degraded by accessibility settings.
Effects philosophy¶
✅ Shipped — medal_service.get_active_medal_bonuses() folds held-medal effects into the combat-damage / trade-rate / turn-regen / haggle-band hooks under the hard per-hook caps; one-time grants are idempotent on award; 33 medals are seeded with effects (WO-CG c1a0333). The full per-medal effect table + magnitudes live in the design spec (audit/design-briefs/medal-effects-spec.md). Auto-award dispatchers cover nine medals (the three combat-tier checks plus six more, WO-CG2 7a069f4); the remaining catalog is admin-grant-only until its counters land.
Medals carry bespoke, per-medal effects. Each medal grants a small gameplay effect tied to the loop it celebrates — a combat medal buffs combat, an explorer medal eases exploration, a trade medal sharpens trade. The effect must be diegetically grounded (the lore makes the effect, not the other way around), and a medal whose celebrated loop exposes no per-player stat to buff stays prestige-only rather than inventing a mechanic. Rank remains the primary progression layer; medal effects are a deliberately small celebration sprinkle on top.
Application model. Each catalog entry carries an effect; medal_service.get_active_medal_bonuses() reads held medals and folds their effects into the three bonus stacks the resolvers already consume — the rank-bonus dict (combat damage / trade rate), the Player.aria_bonus_multiplier (turn-regen rate, never the ADR-0004 turn cap), and the haggle band multiplier. Effects are passive-while-held or one-time-on-award (idempotent on the medal-award insert).
Per-hook caps — the hard ceiling. Total held-medal bonus is clamped per hook: combat_damage ≤ +3%, trading_discount ≤ −2%, turn_regen ≤ +0.05 (within the 1.0–1.5 aria clamp), haggle_band ≤ +0.08 — all tiny against rank's reach (+40% combat / −50% trade). The flat per-hook cap is the real stacking guarantee. No medal effect may mint credits outside a bounded faucet or perturb a canon invariant.
One-time grants — a bounded celebration faucet, fired once per medal per account (lifetime total ≈ 6,050 cr + 25 turns, well under a single month of the Galactic Citizen perk; a sprinkle, not an income channel):
| Medal | Tier | Grant |
|---|---|---|
| First Blood | bronze | +150 cr, +10 turns |
| Colonizer | bronze | +200 cr |
| Quartermaster | bronze | +700 cr |
| Pathfinder | bronze | +15 turns |
| Cartel Breaker | silver | +1,000 cr |
| Bounty Hunter | silver | +1,000 cr |
| Genesis Award | gold | +1,000 cr + a passive +0.02 turn-regen while held |
| Worldsmith | platinum | +2,000 cr |
Special-case perks — exempt from the medal caps. A few medals record perks sized by their lore moment, not the medal cap:
| Medal | Effect |
|---|---|
| Orange Cat Society | The +15% persuasion bonus granted during first-login dialogue (see first-login.md). The medal records it; the bonus is the lore beat, exempt from the haggle cap. |
| Honorary Tabby | +1 starting reputation with Mercantile Guild, applied at first Mercantile interaction (one-time). |
| Pillar of the Pioneer Office | −2% per-pioneer migration fee at any Capital Sector's Class-0 station (clamp range unchanged). |
Catalog¶
Combat¶
| Medal | Tier | Trigger | Commemorates |
|---|---|---|---|
| Bronze Cluster | Bronze | 100 combat victories | Survival of the first hundred fights — the threshold past which a recruit becomes a veteran. |
| Silver Cluster | Silver | 1,000 combat victories | A career soldier's record; the back of the navy is built on Silver Clusters. |
| Quantum Cross | Gold | 10,000 combat victories | The vanishingly few who have made killing other ships their life's work. |
| First Blood | Unique | First successful PvP victory against another player | The transition from NPC scuffles to player-vs-player combat — the moment the universe gets real. |
| Carrier-Killer | Platinum | Destroy a Carrier-class ship in single-pilot combat | Pulling down a capital hull with a single ship — feat, not statistic. |
| The Longest Hour | Unique | Survive a 5-on-1 engagement where you were the 1, and finish with hull > 0 |
Coming out the other side of being outnumbered five-to-one. |
| Cabal-Breaker | Unique | Participate in a successful raid on the Cabal HQ (per Cabal lore) | The endgame trophy — only one award per Cabal HQ clear cycle. |
Economic¶
| Medal | Tier | Trigger | Commemorates |
|---|---|---|---|
| Trader's Merit | Bronze | 500 completed trades and lifetime trade revenue ≥ 1,000,000 cr | The first real merchant — past the early-game grind, into actual commerce. |
| Guild Order of the Manifest | Silver | Lifetime trade revenue ≥ 100,000,000 cr and Mercantile Guild reputation ≥ Allied | Recognition by the Guild itself — the ledger is your ledger. |
| Pillar of the Pioneer Office | Silver | Transport ≥ 10,000 colonists in cryosleep transit, lifetime | The frontier moves on the backs of colonist haulers; this medal says you carried more than your share. (Effect allowlist — see above.) |
| Port Sovereign | Gold | Own ≥ 5 ports simultaneously for 30 consecutive real-time days | Holding a network of ports long enough that the sector's commerce flows through your gates. |
| The Cornered Market | Platinum | Hold ≥ 70% of total active galactic supply of a single core commodity for 24 consecutive real-time hours | The whales-only medal — a brief, demonstrable monopoly. Quietly disliked by the Mercantile Guild. |
Exploration¶
| Medal | Tier | Trigger | Commemorates |
|---|---|---|---|
| Pathfinder | Bronze | First-discover 100 sectors | The early cartographer's badge — before there were maps, you made them. |
| Cartographer's Compass | Silver | First-discover 500 sectors across at least 3 distinct regions | A surveyor who's worked more than one region's stars. |
| Quantum Harvest | Silver | Personally harvest ≥ 500 Quantum Shards from nebulae (not bought, not pooled) | The shard-runner's medal — earned shard by shard in the deep nebulae. |
| Gate Architect | Gold | Construct ≥ 3 player-built warp gates | Reshaping the topology of the galaxy itself, not just mapping it. |
| The Lost Cluster | Platinum | First-discover an isolated cluster (no natural-tunnel link to the main network — reachable only via Quantum Jump) | True frontier — a cluster nobody had ever been to until you jumped blind. |
Diplomatic¶
| Medal | Tier | Trigger | Commemorates |
|---|---|---|---|
| Concordat Seal | Silver | Be the negotiating signatory on ≥ 1 inter-region treaty (trade, defense, non-aggression, or cultural) that survives ≥ 30 real-time days | Diplomacy that holds — a treaty that didn't collapse the next week. |
| Ambassador of Two Banners | Gold | Reach Honored or higher reputation with ≥ 2 mutually-rivalrous factions simultaneously | Threading the needle between rivals — the diplomat-spy archetype. |
| The Peacemaker's Star | Gold | Mediate the resolution of a declared inter-region war | Ending a war you weren't fighting. (📐 depends on launch-target war declaration system.) |
| Voice of the Council | Silver | Serve a full term on a Regional Council via election | Civic service — quiet medal, earned by showing up. (📐 depends on regional governance launch.) |
Special / Hidden¶
These medals are not shown in the public catalog until earned (Medal.is_hidden = true).
| Medal | Tier | Trigger | Commemorates |
|---|---|---|---|
| Orange Cat Society | Unique | Mention the cat (per detection rules below) during first-login dialogue | Recognition that you've walked the docks before — see The Orange Cat Society below. (Effect allowlist — see above.) |
| Honorary Tabby | Unique | Complete first-login at negotiation_skill = strong, claim a rarity_tier ≥ 3 ship, and trigger the cat-mention in the same session |
The rare combination — you talked your way into a real ship and you noticed Pumpkin. Pumpkin remembers. (Effect allowlist — see above.) |
| Pumpkin's Own | Unique | Trigger the cat-mention while playing as a Region Owner subscriber, in a session where the guard personality rolled Tired Night-Shifter |
Wildly specific lore-trivia medal — the kind of thing the playerbase will catalogue on a wiki within 48 hours of launch. Pure flavor. |
| Ghost in the Static | Unique | Discover a Lost World — land inside a graph-disconnected dark-territory formation reached only by Quantum Jump (see ../galaxy/special-formations.md#lost-worlds-quantum-jump-only-content) |
First to step into territory that touches no warp on the chart — a ghost on the long-range scans, real only to the one who jumped blind to reach it. (📐 depends on the launch-target Lost-World discovery system.) |
| Static on the Wire | Unique | Discover a Lost Sector — the smallest dark-territory formation: a lone sector off the warp graph, reachable only by Quantum Jump (see ../galaxy/special-formations.md#lost-worlds-quantum-jump-only-content) |
A single pinprick of dark territory found at the end of a blind jump — no warp leads there, and almost none lead back. (📐 depends on the launch-target Lost-Sector discovery system.) |
| The Sol Pilgrim | Unique | Visit Earth orbit (the Sol-system Easter egg sector) | A pilgrimage medal for finding the lore corner most players never reach. (📐 depends on Sol Easter egg landing.) |
| Survived the HQ | Unique | Enter the Cabal HQ sector and successfully escape without being destroyed | Distinct from Cabal-Breaker (which requires the kill) — this is for the scout who came back alive. |
The Orange Cat Society¶
Pumpkin¶
Pumpkin is an orange tabby tom, one ear notched, who lives in the Callisto Colony shipyard. Officially he belongs to nobody. Unofficially he belongs to everyone who has ever passed through the Pioneer Office — a stray that the night-shift dockworkers started feeding decades ago, kept alive long past any cat's natural span by an open secret nobody at the colony will admit on the record: the Nova Scientific Institute's medical wing on Callisto runs an experimental geriatric-feline regenerative protocol, and Pumpkin has been their unofficial test subject for three generations of dockhands. He is, depending on which mechanic you ask, somewhere between thirty and seventy years old, and he is exactly the same cat their grandfather knew.
Pumpkin patrols the shipyard like he owns it — because in every way that matters, he does. He sleeps on the warm thrust-coupling housings of ships scheduled for departure (sailors say a ship Pumpkin sleeps on comes home; sailors say a lot of things). During the security guard's interrogation in first-login, Pumpkin will do one of three things, deterministically rolled from a small table per session: weave between the player's ankles, bat at a piece of dust caught in the holographic ID scanner, or hop onto the guard's desk and sit on whatever paperwork is open. The guards pretend to shoo him. They never quite do.
The Society¶
The Orange Cat Society is a real thing the way most real things in shipyards are real — never written down, never officially acknowledged, but understood. It's the loose informal fraternity of veteran spacers, dockhands, customs officers, and Federation enlisted personnel who have all, at some point, stood where the player is standing and noticed the cat. Mentioning Pumpkin during an ID check is a sign — to a Callisto guard, to a Mercantile customs agent at any major Sol-system port, to a Frontier hauler comparing notes at a refueling depot — that you've been around. You're not a paper-trail traveler. You're someone who has actually walked the docks. The +15% persuasion bonus during the first-login dialogue isn't magic. It's the guard relaxing because, whoever you are, you're not new.
The Society has no membership roster. It has only one ritual: when an orange tabby crosses your path on the docks, you nod.
Detection patterns¶
The first-login manual provider (per SYSTEMS/first-login.md) detects cat-mentions via whole-word regex matches against the player's raw input. Whole-word boundaries are required — substring matches on words like "scattered" or "category" must not trigger.
English (en) base patterns¶
cat, cats, kitty, kitties, kitten, tabby, feline, orange cat, the cat, that cat, pumpkin (the proper-name reference — full bonus), meow, purr, purring, whiskers, mouser, furball, furry friend.
Locale-specific aliases¶
| Locale | Aliases |
|---|---|
es (Spanish) |
gato, gata, gatito, michi, minino, atigrado |
fr (French) |
chat, chatte, chaton, matou, minou, tigré |
zh (Chinese Simplified) |
猫, 猫咪, 小猫, 橘猫, 橘子 |
pt (Portuguese, Brazilian) |
gato, gata, gatinho, bichano, felino, rajado |
de (Partial — see OPERATIONS/i18n.md) |
katze, kater, kätzchen, mieze, stubentiger |
Detector contract: case-insensitive, whole-word match against the player's raw input before sanitization. Always match the player's active-locale alias list plus the English list (a Spanish-speaking player who types "cat" still triggers). One match per session is sufficient — repeated mentions don't stack.
Player-facing surfaces¶
Display surfaces — where medals appear¶
The Trophy Room is the only "see all" surface. Every other surface shows at most one medal (the player's pinned medal) plus a count.
| Surface | What renders | Density | Interaction |
|---|---|---|---|
Trophy Room (MedalShowcase.tsx on player profile) |
Full collection, categorized; locked silhouettes for unearned | All medals | Click → medal detail modal (lore, earned-at date, conditions) |
| Player nameplate in chat | Pinned medal icon | 1 | Hover → tooltip (medal name + 1-line flavor) |
| Sector view | Pinned medal icon next to player marker label | 1 | Hover-tooltip + click-through to public profile |
| Leaderboards | "Medals" count column + pinned medal icon | 1 + count | Click → that player's public Trophy Room |
Team rosters (TeamManager.tsx) |
Per-member: pinned medal icon + total count badge | 1 + count | Click row → public profile |
| Combat log | Combat-tier medal icon next to combatant names | 1 (combat-medals only) | Tooltip only |
| Player-discovery banner (first-encounter in a sector) | Pinned medal icon under player name; "(N medals)" suffix if 5+ | 1 + count | None — banner is transient |
Login splash (post-auth, pre-GameDashboard) |
If a medal was earned while offline, splash centerpieces it for ~2s; otherwise skip | 1 (offline-earned) | Click anywhere to dismiss |
| Admin player view | Full collection with audit trail (granted-by, when, reason, source event) | All + audit | Inline actions: revoke, hide-from-public override |
Pinning model¶
Each player can pin one medal as their public face (Player.settings.medal_privacy.pinned_medal_id). Defaults to the player's highest-prestige earned medal per the catalog's prestige ordering. Hidden medals can be pinned but only render publicly if medal_privacy.show_hidden = true.
Award notification flow¶
In-session toast / banner: a non-modal banner card slides into the top-center of the dashboard chrome. The medal icon shimmer-wipes into the slot over ~600 ms; banner persists ~8 seconds, then auto-dismisses to a small bottom-right toast for ~20 s. A single-shot fanfare cue plays (gated by Player.settings.audio.sfx_volume); three cue variants by tier (combat / economic / hidden). Animations respect Player.settings.accessibility.reduced_motion (collapses to a fade). Notification copy follows the tone guide below.
Cross-session (offline-earned): the award is queued as a persistent system message (Message.message_type = "system", priority = "high") plus a flag in Player.settings.medal_privacy.unviewed_awards: [medal_id...]. At next login, the splash shows the most recent unviewed award (or "N new commendations" if multiple). A "NEW" pip persists on each unviewed medal in the Trophy Room until first viewed.
Hidden-medal handling (spoiler protection): hidden medals' toast is one-shot reveal — obscured icon for the first 1.2 seconds, then unveils with hint-shaped copy ("Something noticed you. The Orange Cat Society has welcomed you in"). Subsequent views (Trophy Room, profile) show the medal in plain text — the spoiler protection is one-shot only.
Player-to-player visibility:
| Audience | Default | Setting |
|---|---|---|
| Earner's own team | Realtime team toast | medal_privacy.broadcast_to_team (default ON) |
| Earner's current sector | Routine medals: silent. Prestige tier (tier ≥ GOLD or category = UNIQUE): sector-wide notification |
Hard-coded by catalog tier, not user-tunable |
| Global feed | None at launch | (Reserved for future galaxy-tier medals) |
Suppression: players can mute their own medal toasts via Player.settings.notification_preferences.medals (default: notifications on). When muted, awards still persist to inbox and Trophy Room — just no in-session banner or sound.
Award notification copy — first-pass¶
Tone reference: faction-lore.md (gritty space-opera, faction-flavored where applicable). All entries post-pended with "— View in Trophy Room.":
| Trigger | Copy |
|---|---|
| Bronze Cluster | "One hundred kills logged. The brass have noticed. Bronze Cluster awarded." |
| Silver Cluster | "A thousand ships dead in your wake. Silver Cluster awarded." |
| Quantum Cross | "Ten thousand confirmed kills. The Federation declassified your record long enough to pin this on you. Quantum Cross awarded." |
| Trader's Merit | "The Mercantile Guild has reviewed your trade volume and finds it sufficient to acknowledge. Trader's Merit awarded." |
| Pathfinder | "First into the dark, first onto the charts. Pathfinder awarded — twenty unmapped sectors logged in your name." |
| Orange Cat Society (hidden) | "Something noticed you. The Orange Cat Society has welcomed you in. They do not explain themselves." |
| Concordat Seal | "You walked between three flags and left none of them angry. Concordat Seal awarded." |
Style notes: no exclamation marks (reads MMO-cheerful, off-brand); faction-issued medals use a faction voice; hidden-medal copy hints at being observed without spelling out the trigger; combat copy is matter-of-fact (the kill counts speak for themselves).
Privacy controls¶
Player.settings.medal_privacy JSONB shape (see ../../DATA_MODELS/jsonb-schema.md#playersettings):
{
"medal_privacy": {
"visibility": "all | curated | none",
"pinned_medal_id": "str | null",
"curated_medal_ids": ["str"],
"show_hidden": false,
"show_count_publicly": true,
"broadcast_to_team": true,
"unviewed_awards": ["str"]
}
}
Knob semantics:
visibility = "all"(default): every earned medal renders on public profile / Trophy Room (subject toshow_hidden).visibility = "curated": only medals listed incurated_medal_idsrender publicly.visibility = "none": public profile shows only count (or nothing ifshow_count_publicly = false); Trophy Room is owner-only.show_hidden(defaultfalse): hidden-tier medals never render publicly even atvisibility = "all". Intentional opt-in — earning a hidden medal is a private moment by default.
Default policy: opt-in publicity for normal medals, opt-out for hidden. Most players want to show off a Bronze Cluster; hidden medals (Orange Cat Society, easter eggs) should default private and require an explicit "yeah, share that one" toggle.
Admin override: admins always see the full collection (including hidden) via the admin player view, regardless of player privacy settings. Each view of a privacy-overridden hidden medal writes an audit_logs entry (action view_hidden_medal).
Admin actions¶
A new MedalAdmin.tsx page under services/admin-ui/src/components/pages/ with two tabs:
- Grant — search a player, pick a medal from the catalog, optional reason, grant.
- Catalog — browse the medal catalog (read-only at launch).
Single-grant workflow: search by username/id → typeahead-pick from catalog → optional reason text (≤500 chars) → submit. Server records grant via MedalService.admin_grant, writes audit_logs entry with {action: "medal_grant", actor_user_id, target_player_id, medal_id, reason}. Player gets the standard award notification flow.
Bulk grant (for events): paste up to 1,000 player IDs / usernames or upload CSV. Server returns dry-run summary ("96 valid, 4 invalid: …"); admin confirms; commits. Routes through the admin-UI bulk-rate-limit bucket per OPERATIONS/admin-ui.md (10/min). All grants in a batch share a grant_batch_id for atomic-undo. Personal toasts suppressed for batch sizes > 50 (players see medals at next-login splash).
Revocation (mistaken grants, tournament disqualifications): every revocation requires a mandatory reason text. Writes audit_logs entry; emits a personal system message to the player ("Your Medal Name has been rescinded. Reason: …"). Bulk-revoke by grant_batch_id undoes a tournament's grants in one button (with confirmation).
Auth gate: per ADR-0027, this is User.is_admin = True only — no per-permission RBAC at launch.
Naming conventions¶
A short style guide for future medal additions:
- Tier escalation borrows from era progression. Bronze/Silver/Gold are pre-spaceflight materials; Quantum/Stellar/Singularity are the SF-prestige tier. Use material-name floors for early medals; escalate to physics terms at the top.
- Category vocabulary is faction-flavored. Combat = military ("Star", "Cross", "Order"). Economic = guild-mercantile ("Order of the Manifest", "Guild...", "Pillar of...", "Sovereign"). Exploration = surveyor / cartographer ("Pathfinder", "Compass", "Architect"). Diplomatic = formal-civic ("Concordat", "Council", "Ambassador", "Peacemaker's"). Special = lore-noun ("Orange Cat Society", "Sol Pilgrim").
- Possessive titles signal earned rank, not gift. "Trader's Merit" / "Cartographer's Compass" / "Peacemaker's Star" — apostrophe-s reads as "this is what they call you now".
- One proper noun per name maximum. "Quantum Cross" is fine. "Federation Quantum Cross of the Sol Frontier" is too much.
- Avoid generic verbs ("Master Trader", "Elite Pilot"). Reads as MMO completionist filler. Prefer artifact-noun constructions that imply a physical token someone bestowed on you.
Source map¶
| Concern | Path (target) |
|---|---|
| Catalog seed data | services/gameserver/src/services/medal_catalog.py |
| Service & lifecycle | ../../SYSTEMS/medal-service.md |
| Player UI: Trophy Room | services/player-client/src/components/ranking/MedalShowcase.tsx |
| Player UI: pinned medal nameplate | services/player-client/src/components/common/PlayerNamePlate.tsx (target) |
| Admin UI | services/admin-ui/src/components/pages/MedalAdmin.tsx (target) |
| Schema | ../../DATA_MODELS/player.md Player section + new Medal/PlayerMedal entries |
| JSONB privacy block | ../../DATA_MODELS/jsonb-schema.md Player.settings.medal_privacy |
Related¶
- Award lifecycle / dispatcher / events / schema decision:
../../SYSTEMS/medal-service.md, ADR-0028. - The cat-mention mechanic:
./first-login.md,../../SYSTEMS/first-login.md. - Rank progression that medals sit alongside:
./ranking.md. - Realtime broadcast taxonomy:
../../SYSTEMS/realtime-bus.md. - Personal-rep system tied to faction-related medal triggers:
../../SYSTEMS/bounty-and-reputation.md.