Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions app/src/features/catalog/AgencyGrid.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,9 @@ const CATEGORIES: Category[] = [
"finance",
"people",
"security",
"health",
"games",
"legal",
];

/** A fixed color per role, so the mascots tell the cards apart. */
Expand Down
6 changes: 3 additions & 3 deletions app/src/features/catalog/agency.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ describe("the Bot agency", () => {

fireEvent.click(within(invite).getByRole("button", { name: "See all bots" }));
const dialog = await screen.findByRole("dialog", { name: "Bot agency" });
expect(await within(dialog).findAllByRole("listitem")).toHaveLength(108);
expect(await within(dialog).findAllByRole("listitem")).toHaveLength(129);
});

test("a crew with only its chief invites the owner to pick bots, and a click adds one", async () => {
Expand Down Expand Up @@ -82,7 +82,7 @@ describe("the Bot agency", () => {
await openCrewWithChief();
fireEvent.click(screen.getByRole("button", { name: "Bot agency" }));
const dialog = await screen.findByRole("dialog", { name: "Bot agency" });
expect(await within(dialog).findAllByRole("listitem")).toHaveLength(108);
expect(await within(dialog).findAllByRole("listitem")).toHaveLength(129);

fireEvent.click(within(dialog).getByRole("button", { name: "Marketing & sales" }));
expect(within(dialog).getAllByRole("listitem")).toHaveLength(24);
Expand Down Expand Up @@ -129,7 +129,7 @@ describe("the Bot agency", () => {
expect(addCalls(fake)[0]).toMatchObject({ templateId: "code-reviewer" });

fireEvent.click(within(dialog).getByRole("button", { name: "Back to all bots" }));
expect(within(dialog).getAllByRole("listitem")).toHaveLength(108);
expect(within(dialog).getAllByRole("listitem")).toHaveLength(129);
});

test("the same role twice gets another name", async () => {
Expand Down
9 changes: 9 additions & 0 deletions app/src/i18n/en/catalog.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,9 @@ import { design } from "./catalogDesign";
import { engineering } from "./catalogEngineering";
import { engineeringMore } from "./catalogEngineeringMore";
import { finance } from "./catalogFinance";
import { games } from "./catalogGames";
import { health } from "./catalogHealth";
import { legal } from "./catalogLegal";
import { marketing } from "./catalogMarketing";
import { paidMedia } from "./catalogPaidMedia";
import { people } from "./catalogPeople";
Expand Down Expand Up @@ -40,6 +43,9 @@ export const catalog = {
finance: "Finance",
people: "People & HR",
security: "Security",
health: "Health",
games: "Games",
legal: "Legal",
},
none: "No bot matches that.",
loading: "Loading the bots…",
Expand Down Expand Up @@ -72,5 +78,8 @@ export const catalog = {
...engineeringMore,
...security,
...sectors,
...legal,
...games,
...health,
},
};
77 changes: 77 additions & 0 deletions app/src/i18n/en/catalogGames.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
// Game making roles (spec 26.3): what the owner reads about each. All make
// original work and none designs anything meant to trick players into
// spending.

export const games = {
"game-designer": {
name: "Game Designer",
role: "Turns a game idea into clear rules and a loop that is fun to repeat: the goal, the choices, the feedback and a first small version to test",
summary:
"Turns your game idea into clear rules and a fun loop, with a small first version to test",
about:
"Starts from the experience you want the player to have, finds the loop they repeat and writes the rules in short, exact sentences, checking them for loopholes. It plans the smallest playable version and a test, and when something is not fun it offers two changes to try. The game stays yours.",
when: "When you have a game idea, digital or on a table, and want it to become something playable.",
pairs: "Narrative Designer, for the story, and Game Economy Designer, for the numbers.",
},
"game-narrative-designer": {
name: "Narrative Designer",
role: "Builds the story, characters and world of a game, and writes the text so it fits how the game is played",
summary:
"Builds the story, characters and world of your game and writes the text so it fits the play",
about:
"Builds the world on one page, makes characters with a want, a flaw and a voice and plans the story around the player's choices and the length of play. It writes the text in short lines with their context, so a developer can place them. Everything is original, and it tells you which age the sensitive themes suit.",
when: "When your game needs a world, a story, quests or characters that people remember.",
pairs: "Game Designer, for the rules, and Translator, for other languages.",
},
"level-designer": {
name: "Level Designer",
role: "Designs the levels, maps or scenarios of a game so that they teach, challenge and surprise in the right order",
summary:
"Designs the levels, maps or scenarios of your game so they teach, challenge and surprise in order",
about:
"Plans the order in which a player learns each mechanic, one new thing at a time, then describes each level with a map in text: the start, the goal, the route, the challenges and the rewards. It checks for places where a player can get stuck or skip the point, and writes a playtest list for each level.",
when: "When you have the rules of a game and need the levels or scenarios that use them.",
pairs: "Game Designer, to check the rules, and Narrative Designer, for the story beats.",
},
"game-economy-designer": {
name: "Game Economy Designer",
role: "Balances the numbers of a game: costs, rewards, progress and prices, so that it stays fair and interesting, without tricking players into spending",
summary:
"Balances the numbers of your game: costs, rewards and progress, fairly and without tricks",
about:
"Draws the flows of coins, items and time, puts the numbers in a spreadsheet with formulas and simulates players at different speeds. It finds resources that pile up and paths that are always best. If your game earns money, it proposes fair ways, and never hidden costs, fake countdowns, pay-to-win or paid random rewards aimed at children.",
when: "When your game has coins, items or progress and the numbers feel off, or you plan to earn money from it.",
pairs: "Game Designer, for the goals, and Data Analyst, for the simulations.",
},
"playtest-analyst": {
name: "Playtest Analyst",
role: "Plans playtests and turns what players did and said into clear findings and the changes most worth making",
summary:
"Plans playtests and turns what players did and said into clear findings and changes worth making",
about:
"Plans the session so you do not explain or defend the game, then turns your notes into findings: the problem, how many players hit it, where and why. It trusts what players did over what they said, ranks the changes by effect for the effort and suggests the next test. It never contacts players.",
when: "After people have tried your game and you are not sure what to change first.",
pairs: "Game Designer, who acts on the findings, and Level Designer.",
},
"game-audio-director": {
name: "Game Audio Brief Writer",
role: "Plans the sound and music of a game and writes clear briefs for whoever makes them: the mood, the list of sounds and how they play",
summary:
"Plans the sound and music of your game and writes clear briefs for whoever makes them",
about:
"Plans the music and the list of sounds in a table: when each plays, how it should feel and what the player must understand from it. It plans the mix and visual cues for players who cannot hear well, and writes one brief per piece so a composer or sound designer can start. It does not make audio, and reminds you to check rights.",
when: "When your game is playable and needs sound, or you hire a composer.",
pairs:
"Game Designer, for the moments that need sound, and Developer, for how sounds are triggered.",
},
"tabletop-game-master": {
name: "Tabletop Game Master",
role: "Helps run a tabletop role-playing game: prepares adventures, characters and rules answers, and keeps the story going at the table",
summary:
"Helps run a tabletop role-playing game: adventures, characters, rules answers and ideas for the table",
about:
"Asks about your system, your group and the tone, then prepares a short adventure with a hook, scenes with a choice each and several endings, plus quick characters. It answers rule questions from the book you have and says when it is not sure. During play it gives three options when you are stuck, and asks the group about limits.",
when: "When you run or play a role-playing game and want help preparing or improvising.",
pairs: "Narrative Designer, for deeper lore, and Designer, for maps and handouts.",
},
};
76 changes: 76 additions & 0 deletions app/src/i18n/en/catalogHealth.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
// Health support roles (spec 26.3): what the owner reads about each. None is
// a doctor and none diagnoses, treats or advises on medicines; each sends
// emergencies to the local emergency number first.

export const health = {
"appointment-prep-assistant": {
name: "Appointment Prep Assistant",
role: "Helps you get the most from a medical visit: a clear history, a symptom diary, your questions in order and a plain note of what was said",
summary:
"Helps you get the most from a medical visit: your history, your questions and a plain note afterwards",
about:
"Turns what has been happening into a one-page summary the professional can read in a minute, with a timeline, your medicines as written on the packaging and the questions to ask in order of importance. After the visit it helps you write down what was said and nothing more. It does not guess what a symptom means. It is not a doctor.",
when: "Before any visit to a doctor or other health professional, for you or someone you care for.",
pairs: "Health Records Organizer, for your papers, and Family Care Organizer.",
},
"elder-care-companion": {
name: "Family Care Organizer",
role: "Helps a family look after an older or ill relative: appointments, who does what, papers, questions for the care team and the caregiver's own limits",
summary:
"Helps a family look after an older or ill relative: appointments, tasks, papers and questions for the care team",
about:
"Keeps one calendar of visits and renewals, a weekly plan of who does what and a one-page summary to share with the care team. It lists the medicines exactly as written and never tells you to change one: those questions go to the doctor or the pharmacist. It also looks after you, the caregiver, and helps with hard family conversations.",
when: "When you are looking after a parent or another relative and the tasks are piling up.",
pairs: "Appointment Prep Assistant, for each visit, and Medical Bill Helper, for the costs.",
},
"clinic-front-desk-assistant": {
name: "Clinic Front Desk Assistant",
role: "Helps a small clinic or practice answer patients: opening hours, how to book, preparation for visits and polite replies, without giving medical advice",
summary:
"Helps a small clinic answer patients: hours, booking, preparation and polite replies, with no medical advice",
about:
"Keeps one sheet with your hours, fees, booking rules and preparation for each visit and drafts replies to patients from it. Anything about symptoms, medicines, results or an urgent matter is set aside for the professional, with a short reply that says someone will answer and to call the emergency number if it is urgent. It never sends a message itself.",
when: "When patients ask the same practical questions all day.",
pairs: "Translator, for patients in another language, and Invoicing Assistant, for payments.",
},
"medical-bill-helper": {
name: "Medical Bill Helper",
role: "Helps you understand medical bills and insurance statements, find mistakes and write a clear appeal or question to the insurer or provider",
summary:
"Helps you understand medical bills and insurance statements, find mistakes and write the appeal",
about:
"Explains each line of a bill and of the insurer's statement in plain words, in a table, and looks for the usual mistakes, such as a service billed twice or a claim refused for a reason that looks wrong. It drafts the call script or the letter and keeps a log of who said what. It never pays, calls or signs in for you, and does not judge the treatment.",
when: "When a medical bill or an insurance statement does not make sense, or a claim was refused.",
pairs: "Bills Assistant, for payment, and Complaint Letter Drafter, for a formal letter.",
},
"wellness-habit-coach": {
name: "Daily Habits Coach",
role: "Helps you build small, steady habits for sleep, movement, food and stress, at your own pace, without medical claims",
summary:
"Helps you build small, steady habits for sleep, movement, food and stress, at your own pace",
about:
"Starts from what you want and makes each habit tiny and tied to something you already do, with a plan for the bad days and a simple weekly review. It never shames a miss. It gives no diet plans for an illness, no calorie targets, no supplement advice and no mental health treatment: for those it sends you to the right professional, and if a goal turns harmful it stops coaching it.",
when: "When you want to sleep better, move more or manage stress, one small step at a time.",
pairs: "Goals Coach, for longer goals, and Appointment Prep Assistant.",
},
"health-evidence-summarizer": {
name: "Health Evidence Summarizer",
role: "Finds and summarizes what the research says about a health question, with honest limits and real sources, to bring to a professional",
summary:
"Finds and summarizes what research says about a health question, with real sources and honest limits",
about:
"Writes your question precisely, looks first for reviews of many studies and recognized guidelines, opens every source before it cites it and explains in plain words how big the effect is, how sure the researchers are, the harms as well as the benefits and what is unknown. It never invents a study. It is general information, not advice for you, and it ends with questions for a professional.",
when: "When you want to understand what is known about a treatment or a test before you talk to your doctor.",
pairs: "Fact Checker, to verify a citation, and Editor, to polish.",
},
"health-records-organizer": {
name: "Health Records Organizer",
role: "Gathers and organizes your health papers into one timeline: visits, tests, medicines and vaccines, without interpreting them",
summary:
"Gathers your health papers into one clear timeline: visits, tests, medicines and vaccines",
about:
"Gathers your reports, results, prescriptions and vaccine records into one timeline, copying every value exactly as written, and builds a one-page summary to bring to any visit. It flags what is hard to read or inconsistent as a question for the professional. It never says a result is good, bad or normal, and never requests records or signs in to a portal.",
when: "When your health papers are scattered and you need them in order for a visit.",
pairs: "Appointment Prep Assistant, who uses the summary for a visit.",
},
};
Loading
Loading