Download game/fallbacks.py from build-small-hackathon/brad-did-something: direct link, hf CLI and curl.
- Browser
- Download file 14.6 kB
-
https://huggingface.co/spaces/build-small-hackathon/brad-did-something/resolve/main/game/fallbacks.py
- Command line
-
hf download hf://spaces/build-small-hackathon/brad-did-something/game/fallbacks.py
-
curl -L -o fallbacks.py https://huggingface.co/spaces/build-small-hackathon/brad-did-something/resolve/main/game/fallbacks.py
14.6 kB
| """Pre-written fallbacks — content from AI_PROMPTS.md. The player must never | |
| see an error: any Modal timeout or validation failure lands here.""" | |
| from __future__ import annotations | |
| import random | |
| REACTIONS = { | |
| "brad": { | |
| "positive": "Knew you'd see it, boss. This is why we're a great team. I already told two people.", | |
| "neutral": "Okay. Noted. Circling back. The window's still open by the way. Brad-window.", | |
| "negative": "Wow. Okay. That's a choice. I'm putting this in my book. There's a chapter now.", | |
| }, | |
| "stacey": { | |
| "positive": "Oh thank god. Thank you. I already drafted three apology emails, I'll only send one.", | |
| "neutral": "Right, yes, totally — I'll fix it. I know exactly how. Mostly exactly.", | |
| "negative": "No that's fair. That's completely fair. I'm so sorry. I'll just— yes. Okay.", | |
| }, | |
| "kevin": { | |
| "positive": "Directionally, this validates everything. I'll add a slide. The slide will be green.", | |
| "neutral": "Interesting. The data didn't predict this. I'll adjust the methodology. Quietly.", | |
| "negative": "With respect, the numbers disagree. I'll re-run them until they don't.", | |
| }, | |
| "janet": { | |
| "positive": "THIS is leadership with a point of view. I'm putting it in the newsletter. With a metaphor.", | |
| "neutral": "Fine. But the brand will remember how this felt.", | |
| "negative": "I hear you. The vision doesn't, but I do.", | |
| }, | |
| "derek": { | |
| "positive": "Hm. That's what Margaret would have done. Before the incident.", | |
| "neutral": "Noted. We tried that in 2019. Well. Something like it.", | |
| "negative": "...Understood.", | |
| }, | |
| } | |
| _KIND_DELTAS = { | |
| "positive": (25_000, 40_000, 2, 2, "npc_happy"), | |
| "neutral": (-5_000, 10_000, 0, 0, "npc_confused"), | |
| "negative": (-40_000, -15_000, -3, -3, "npc_devastated"), | |
| } | |
| NPC_NAMES = {"brad": "Brad", "stacey": "Stacey", "kevin": "Kevin", | |
| "janet": "Janet", "derek": "Derek"} | |
| def kind_for_response(response_type: str) -> str: | |
| if response_type in ("quick_fine",): | |
| return "negative" | |
| if response_type in ("custom", "quick_explain", "quick_quit"): | |
| return "neutral" | |
| return "positive" | |
| def crisis_fallback(npc_id: str, response_type: str) -> dict: | |
| kind = kind_for_response(response_type) | |
| lo, hi, morale, rel, anim = _KIND_DELTAS[kind] | |
| delta = random.randint(lo // 1000, hi // 1000) * 1000 | |
| name = NPC_NAMES[npc_id] | |
| sign = "+" if delta >= 0 else "-" | |
| return { | |
| "npc_reaction": REACTIONS[npc_id][kind], | |
| "consequence": f"{name} handled it. Nobody is entirely sure how, and nobody asked.", | |
| "revenue_delta": delta, | |
| "animation": anim, | |
| "boss_title": "Acting Head of Whatever This Is", | |
| "log_entry": f"{name} had a situation. It was handled. {sign}${abs(delta) // 1000}K.", | |
| "morale_delta": morale, | |
| "npc_id": npc_id, | |
| "relationship_delta": rel, | |
| "pocket_money_delta": 0, | |
| "special_next_event": None, | |
| } | |
| _EVENT_FALLBACKS = [ | |
| { | |
| "affected_npc": "player", | |
| "category": "professional", | |
| "headline": "The printer has produced something", | |
| "intro": "> inbox: the printer in the kitchen has been printing the same page for twenty minutes. People have seen it. It is a ranking.", | |
| "option_a": "Shred everything and declare a paperless office, effective immediately.", | |
| "option_b": "Pin it to the corkboard and call it radical transparency.", | |
| "urgency": "It is still printing.", | |
| "setup_animation": "npc_confused", | |
| "morale_preview": -3, | |
| }, | |
| { | |
| "affected_npc": "stacey", | |
| "category": "professional", | |
| "headline": "Wrong attachment, right energy", | |
| "intro": "So the good news is the client got the file on time. The other news is it was the internal nicknames spreadsheet. Their CEO is 'Captain Synergy'. He has replied.", | |
| "option_a": "Claim it was an icebreaker initiative and send the rest of the spreadsheet.", | |
| "option_b": "Blame a software glitch nobody can name.", | |
| "urgency": "He has replied TWICE.", | |
| "setup_animation": "npc_crying", | |
| "morale_preview": -4, | |
| }, | |
| { | |
| "affected_npc": "brad", | |
| "category": "external", | |
| "headline": "Mystery package addressed to nobody", | |
| "intro": "Boss. Package at reception. No sender. I opened it. That part's done, so. It's five hundred stress balls with a competitor's logo. I have a theory.", | |
| "option_a": "Distribute the stress balls. Free is free.", | |
| "option_b": "Mail them back with a strongly worded sticky note.", | |
| "urgency": "Brad's theory has slides.", | |
| "setup_animation": "npc_smug", | |
| "morale_preview": 2, | |
| }, | |
| { | |
| "affected_npc": "kevin", | |
| "category": "personal", | |
| "headline": "It is Kevin's birthday", | |
| "intro": "For the record I did not expect anyone to remember. The data suggested a 12 percent chance. I brought my own hat. Directionally, this is fine.", | |
| "option_a": "Emergency cake run on company budget. Backdate the enthusiasm.", | |
| "option_b": "Declare birthdays a Q4 initiative.", | |
| "urgency": "He is wearing the hat.", | |
| "setup_animation": "npc_devastated", | |
| "morale_preview": -5, | |
| }, | |
| ] | |
| def event_fallback(index: int) -> dict: | |
| return dict(_EVENT_FALLBACKS[index % len(_EVENT_FALLBACKS)]) | |
| # type-matched fallbacks so a special's arrival animation never contradicts its | |
| # content (a "newspaper" arrival must not fall back to a birthday, etc.) | |
| _SPECIAL_FALLBACKS = { | |
| "newspaper": { | |
| "affected_npc": "brad", | |
| "category": "external", | |
| "headline": "The press got hold of it", | |
| "intro": "Boss. So. A reporter wrote us up. The headline uses the word " | |
| "'reportedly' four times and there's a photo of me mid-sentence. " | |
| "It's already being shared. I look powerful though.", | |
| "option_a": "Issue a correction so dry nobody finishes reading it.", | |
| "option_b": "Lean in and frame the whole thing as bold market disruption.", | |
| "urgency": "The comment section has discovered us.", | |
| "setup_animation": "npc_hiding", | |
| "morale_preview": -5, | |
| }, | |
| "client_emergency": { | |
| "affected_npc": "stacey", | |
| "category": "professional", | |
| "headline": "A client is on the line, right now", | |
| "intro": "I have Northpath Solutions on hold and they are not happy. " | |
| "Something about a deliverable we may have described as 'basically " | |
| "done'. It was not basically done. It was basically a folder.", | |
| "option_a": "Take the call yourself and promise a recovery plan by Friday.", | |
| "option_b": "Have Stacey stall with enthusiasm while we invent the thing.", | |
| "urgency": "They can hear the hold music looping. So can we.", | |
| "setup_animation": "npc_crying", | |
| "morale_preview": -6, | |
| }, | |
| "personal": { | |
| "affected_npc": "kevin", | |
| "category": "personal", | |
| "headline": "Something is going on with the team", | |
| "intro": "Not a work thing, technically. But it's bleeding into the work " | |
| "thing. There were tears at the printer. The printer is fine. The " | |
| "person is, statistically, also fine. Probably.", | |
| "option_a": "Check in personally and quietly cover their afternoon.", | |
| "option_b": "Declare a surprise team lunch and never address it directly.", | |
| "urgency": "The whole floor is pretending to type.", | |
| "setup_animation": "npc_devastated", | |
| "morale_preview": -4, | |
| }, | |
| "hr": { | |
| "affected_npc": "player", | |
| "category": "professional", | |
| "headline": "HR would like a quick word", | |
| "intro": "> HR has requested a brief, informal, absolutely-not-a-big-deal " | |
| "conversation regarding 'recent patterns'. They have used the " | |
| "phrase 'just to document it'. There is a folder.", | |
| "option_a": "Walk in honest and own whatever this is about.", | |
| "option_b": "Bring your own folder. Establish folder dominance.", | |
| "urgency": "The meeting room blinds are already closed.", | |
| "setup_animation": "npc_suspicious", | |
| "morale_preview": -5, | |
| }, | |
| } | |
| def special_fallback(kind: str, index: int) -> dict: | |
| """A coherent fallback whose theme matches the special-event arrival.""" | |
| if kind in _SPECIAL_FALLBACKS: | |
| return dict(_SPECIAL_FALLBACKS[kind]) | |
| return event_fallback(index) | |
| def presentation_fallback(round_no: int, last_log: str) -> dict: | |
| if round_no >= 3: | |
| return { | |
| "round": round_no, | |
| "board_tone": "neutral", | |
| "event_referenced": last_log[:150], | |
| "round_difficulty": "standard", | |
| "board_dialogue": "The board has reviewed the quarter so far. Specifically this: " | |
| f"\"{last_log[:120]}\". Give us your closing statement.", | |
| "cumulative_score": 50, | |
| } | |
| return { | |
| "round": round_no, | |
| "board_tone": "neutral", | |
| "event_referenced": last_log[:150], | |
| "round_difficulty": "standard", | |
| "option_a": "Own it completely and pivot to the pipeline.", | |
| "option_b": "Contextualize it as a learning investment.", | |
| "board_dialogue": f"Let's start with this item from the record: \"{last_log[:120]}\". " | |
| "Walk us through it.", | |
| } | |
| CHAT_OPENERS = { | |
| "brad": "Boss. Glad you stopped by. I'm working on something big. Can't say what. It's big though.", | |
| "stacey": "Oh! Hi. Everything's under control. I just triple-checked the recipient field on everything. Twice.", | |
| "kevin": "Good timing. The numbers are doing something interesting. Directionally interesting.", | |
| "janet": "I've been thinking about our visual language. We need to talk about it. Not now. But soon.", | |
| "derek": "Hm. You walk the floor now. Interesting.", | |
| } | |
| CHAT_REPLIES = { | |
| "brad": "Knew you'd get it, boss. This is why I tell people we're tight.", | |
| "stacey": "That actually helps. Thank you. I'll only worry about it a normal amount now.", | |
| "kevin": "Noted. I'll factor that into the model. The model appreciates it.", | |
| "janet": "See, THIS is the kind of dialogue the brand needs internally.", | |
| "derek": "Hm. Noted.", | |
| } | |
| def chat_fallback(npc_id: str, opener: bool) -> dict: | |
| return { | |
| "npc_line": (CHAT_OPENERS if opener else CHAT_REPLIES)[npc_id], | |
| "relationship_delta": 0 if opener else 1, | |
| "morale_delta": 0, | |
| } | |
| BANTER_LINES = [ | |
| ("brad", "...so I told them, that's not a bug, that's a premium feature. They went quiet. Closing energy."), | |
| ("kevin", "The Q3 numbers are directionally fine. Directionally."), | |
| ("janet", "The font says reliable. We are not a reliable font company."), | |
| ("stacey", "Okay but who do I apologize to if nobody noticed yet?"), | |
| ("derek", "We had a printer like that in 2019. Before the incident."), | |
| ] | |
| def banter_fallback(index: int) -> dict: | |
| npc_id, line = BANTER_LINES[index % len(BANTER_LINES)] | |
| return {"npc_id": npc_id, "line": line} | |
| EAVESDROP_EXCHANGES = [ | |
| [("brad", "Kevin. Buddy. Your chart says we grew 140 percent."), | |
| ("kevin", "The chart is directionally accurate, Brad."), | |
| ("brad", "I put it in the client deck.")], | |
| [("janet", "The newsletter needs a hero image that says resilience."), | |
| ("stacey", "Is that why you sent me forty photos of lighthouses?"), | |
| ("janet", "Forty OPTIONS, Stacey.")], | |
| ] | |
| def eavesdrop_fallback(index: int) -> dict: | |
| exchange = EAVESDROP_EXCHANGES[index % len(EAVESDROP_EXCHANGES)] | |
| return {"lines": [{"speaker": s, "line": l} for s, l in exchange]} | |
| EMAIL_BANK = [ | |
| {"sender": "janet", "subject": "BRAND PULSE — week of now", | |
| "body": "Team. This week the brand felt like a lighthouse in fog: present, vertical, misunderstood. More on this in my longer email. There will be a longer email."}, | |
| {"sender": "kevin", "subject": "Metric of the Day", | |
| "body": "Pipeline velocity is up 31% against a baseline I have defined myself. Methodology available upon request. Please do not request it."}, | |
| {"sender": "system", "subject": "FACILITIES: regarding the printer", | |
| "body": "The third-floor printer has been restored to factory settings. We are not able to explain what it was printing before. Please direct questions nowhere."}, | |
| ] | |
| def email_fallback(index: int) -> dict: | |
| return dict(EMAIL_BANK[index % len(EMAIL_BANK)]) | |
| _ROMANCE_INTROS = { | |
| "brad": "Boss. Off the record. I've been thinking — we're a great team, right? Like, a GREAT team. I made you a playlist. It's all walk-on music.", | |
| "stacey": "Okay so this is unprofessional and I've rehearsed it four times and deleted three drafts, but — would it be weird if I said I look forward to our one-on-ones? More than the agenda warrants?", | |
| "kevin": "I ran the numbers on our working relationship and the trend line is, directionally, very warm. I made a slide. The slide has a heart on it. The x-axis is us.", | |
| "janet": "I've been building a mood board. It's about us. It's mostly the color of a sunset and one photo of your stapler. I think it's saying something. I think it's saying a lot.", | |
| "derek": "Hm. You stayed late again. So did I. ...That's all. Unless it isn't. It might not be. Hm.", | |
| } | |
| def romance_fallback(npc_id: str) -> dict: | |
| npc_id = npc_id or "stacey" | |
| return { | |
| "affected_npc": npc_id, | |
| "category": "personal", | |
| "headline": f"{NPC_NAMES[npc_id]} has feelings, apparently", | |
| "intro": _ROMANCE_INTROS[npc_id], | |
| "option_a": "Lean in. Say you've felt it too. What's the worst that happens.", | |
| "option_b": "Smile, keep it warm, and steer firmly back to the quarterly numbers.", | |
| "urgency": "The whole floor is pretending not to watch.", | |
| "setup_animation": "heart_float", | |
| "morale_preview": 4, | |
| } | |
| def verdict_fallback(tier: str) -> dict: | |
| verdicts = { | |
| "hit_target": "Against every available signal, the number is real. The board has voted to stop asking how.", | |
| "above_600k": "Close. The board has expressed this in an emoji, in Slack, three times. You know the one.", | |
| "300k_to_600k": "The board wants a call. Not a good call. You already know the energy of the call.", | |
| "below_300k": "The board has drafted something. It mentions your continued presence. It is currently unsigned.", | |
| } | |
| return {"verdict": verdicts[tier]} | |