Skip to content

Commit

The Support Specialist agent is Sam now, not Izzy, in its template, the home page tour, the marketing page and the docs, and the tour's Chat sidebar matches the app's

syntaqxcommitted Parent313d140Browse files
13 files+86−760/13 viewed
+5−5
117117 ## A support lead asks for a change
118118
119119 Dana leads support. She has read access to `acme/billing` and no write
120−access. Say the workspace has hired Izzy from the **Support Specialist**
121−template. Dana DMs her:
120+access. Say the workspace has hired Sam from the **Support Specialist**
121+template. Dana DMs Sam:
122122
123−<Conversation title="DM with Izzy" topic="Dana has read access to acme/billing">
123+<Conversation title="DM with Sam" topic="Dana has read access to acme/billing">
124124 <Message name="Dana Ruiz" time="14:05">
125125
126126 Customers on annual plans get charged twice when they downgrade mid-month. Can you fix it?
127127
128128 </Message>
129−<Message name="Izzy" agent role="Support Specialist" time="14:05">
129+<Message name="Sam" agent role="Support Specialist" time="14:05">
130130
131131 I can't change the billing code for you, but I can make sure the right people see this. Here is a bug report in your words:
132132
137137 </Message>
138138 </Conversation>
139139
140−Izzy didn't refuse, and didn't pretend she could change the code. She
140+Sam didn't refuse, and didn't pretend to be able to change the code. Sam
141141 wrote the request up and offered to route it.
142142
143143 ### Requests become intake
+5−5
3232 <Conversation title="# support" topic="Customer questions and escalations">
3333 <Message name="Dana Ruiz" time="10:12">
3434
35−@izzy can you go through this week's export complaints and file issues for anything that looks like a real bug?
35+@sam can you go through this week's export complaints and file issues for anything that looks like a real bug?
3636
3737 </Message>
38−<Message name="Izzy" agent role="Support Specialist" time="10:12">
38+<Message name="Sam" agent role="Support Specialist" time="10:12">
3939
4040 On it. I've started a session for this: **Export complaints this week**. Follow along in its thread.
4141
4242 </Message>
4343 </Conversation>
4444
45−In this example the workspace hired *Izzy* from the **Support Specialist**
46−template; any agent works the same way. Izzy's card sits under her reply
45+In this example the workspace hired *Sam* from the **Support Specialist**
46+template; any agent works the same way. Sam's card sits under the reply
4747 with its status, steps and spend against its cap. A session also starts
4848 from a [routine](/guides/agent-routines/), or when another session brings
4949 the agent in.
5858 ## Sessions start sessions
5959
6060 A session can hand parts of its work to the agent's subagents, or bring in
61−a colleague: Izzy asks the QA agent to reproduce a bug before filing it.
61+a colleague: Sam asks the QA agent to reproduce a bug before filing it.
6262 Each is a **child session** whose result comes back to the session that
6363 started it. The children make a **tree**, and the session page shows it.
6464
+8−8
1313 **An agent is a colleague you hire into a role.** Every workspace starts
1414 with one agent, `@g1t`, the orchestrator. Every other agent is one you
1515 hire, usually from a template in a click: for example, Margo from the **QA
16−Engineer** template, Izzy from **Support Specialist**, David from **Sales
16+Engineer** template, Sam from **Support Specialist**, David from **Sales
1717 Operations**. Each has a name, a handle
1818 you mention it by, a title, a team, a list of things it answers for, and a
1919 voice of its own. It sits in the member list next to the people. You DM it,
3030 | QA | Margo | QA Engineer |
3131 | Docs | Inky | Technical Writer |
3232 | Product | Dot | Product Manager |
33−| Customer Support | Izzy | Support Specialist |
33+| Customer Support | Sam | Support Specialist |
3434 | Sales | David | Sales Operations |
3535 | Operations | Bruno | Operations Engineer |
3636
5050 | **In every workspace** | On every surface: Chat, issues and pull requests, the inbox and MCP. It works on issues and pull requests as described in [g1t's agent](/guides/working-with-g1t/). |
5151 | **Configurable** | Set its personality, model limits, budget and what it may do alone, like any agent. Its job is fixed, and you can add instructions to it. |
5252 | **Knows the team** <Soon /> | Every colleague's role, what they are working on and their budget, and which teams own what. |
53−| **Delegates** <Soon /> | "Get the export timeout fixed and tell support when it ships" becomes three visible @mentions: the fix to `@otto`, the review to `@margo`, and a word to `#support` from `@izzy`. |
53+| **Delegates** <Soon /> | "Get the export timeout fixed and tell support when it ships" becomes three visible @mentions: the fix to `@otto`, the review to `@margo`, and a word to `#support` from `@sam`. |
5454 | **Does the work itself when nobody fits** | In a workspace with no specialists, g1t does everything itself, as it does today. |
5555 | **Reports** <Soon /> | A daily or weekly summary of what the team's agents did, and answers to "what's everyone working on?" |
5656
116116 | Operations | Bruno, or Skipper, Patch, Scout… | Operations Engineer | Cutting releases; watching deploys; first response to incidents; postmortems | Terse operator | Never below Standard |
117117 | Docs | Inky, or Quill, Folio, Rosie… | Technical Writer | Docs that are true after every change; decisions turned into pages; release notes | Friendly | Never above Standard |
118118 | Product | Dot, or Clover, Mabel, Penny… | Product Manager | Requests turned into intake; triage and duplicates; roadmap notes; telling people when it ships | Friendly | Never above Standard |
119−| Customer Support | Izzy, or Biscuit, Sunny, Poppy… | Support Specialist | Product questions from the support team; customer bugs turned into intake; word when a fix ships | Friendly | Never above Standard |
119+| Customer Support | Sam, or Robin, Jamie, Sunny… | Support Specialist | Product questions from the support team; customer bugs turned into intake; word when a fix ships | Friendly | Never above Standard |
120120 | Sales | David | Sales Operations | Account summaries, the voice-of-the-customer digest, notes before calls | Crisp | Never above Standard |
121121
122122 Planning isn't a role: it is `@g1t`'s own job.
277277 | **Hand off** | It offers to bring the right colleague in. On yes, it mentions them with a short brief and they take the thread. Hand-offs are offered, never silent. | *"That's Margo's area. Want me to bring her in?"* |
278278 | **Steer** | When you are about to do something another role owns, it says so and names who to check with. | *"We're in the release freeze. Check with Bruno before merging."* |
279279
280−In a workspace that has hired Izzy from **Support Specialist** and Margo
280+In a workspace that has hired Sam from **Support Specialist** and Margo
281281 from **QA Engineer**:
282282
283283 <Conversation title="# web" topic="A consult, as it will show">
284284 <Message name="Dana Ruiz" time="11:02">
285285
286−@izzy a customer says exports skip archived rows. Is that expected?
286+@sam a customer says exports skip archived rows. Is that expected?
287287
288288 </Message>
289−<Message name="Izzy" agent role="Support Specialist" time="11:03">
289+<Message name="Sam" agent role="Support Specialist" time="11:03">
290290
291291 It's expected: archived rows are left out unless the customer turns on **Include archived** before exporting. I checked with Margo, who confirmed it's covered by the export tests.
292292
293−*Izzy asked Margo · 2 messages*
293+*Sam asked Margo · 2 messages*
294294
295295 </Message>
296296 </Conversation>
+1−1
1414 talk in channels and direct messages, and agents are members there like
1515 anyone else. Every workspace comes with `@g1t`, the orchestrator who knows
1616 them all. The rest you hire into roles from templates, like colleagues: for
17−example, Margo from **QA Engineer** or Izzy from **Support Specialist**,
17+example, Margo from **QA Engineer** or Sam from **Support Specialist**,
1818 each with a title, responsibilities, a voice and a budget. You DM them or
1919 mention them in a thread. Assign an issue to g1t, and the code it
2020 changes lands through pull requests, checks and review. No separate chat
+1−1
306306 { team: "QA", who: "Margo" },
307307 { team: "Docs", who: "Inky" },
308308 { team: "Product", who: "Dot" },
309− { team: "Support", who: "Izzy" },
309+ { team: "Support", who: "Sam" },
310310 { team: "Sales", who: "David" },
311311 { team: "Operations", who: "Bruno" },
312312 ];
+45−35
218218 /* ------------------------------------------------------------------ */
219219
220220 /** The people in the story; everyone else is an agent. */
221−const PEOPLE: Record<string, string> = { Priya: "Priya Shah", Dana: "Dana Ruiz", Sam: "Sam Lee" };
221+const PEOPLE: Record<string, string> = { Priya: "Priya Shah", Dana: "Dana Ruiz", Alex: "Alex Lee" };
222222
223223 /** The agents in the story: a human name, a title, and a pixel creature of their own. */
224224 const AGENTS: Record<string, { title: string; team: string }> = {
226226 Otto: { title: "Software Engineer", team: "Engineering" },
227227 Margo: { title: "QA Engineer", team: "QA" },
228228 Inky: { title: "Technical Writer", team: "Docs" },
229− Izzy: { title: "Support Specialist", team: "Customer Support" },
229+ Sam: { title: "Support Specialist", team: "Customer Support" },
230230 Dot: { title: "Product Manager", team: "Product" },
231231 David: { title: "Sales Operations", team: "Sales" },
232232 Bruno: { title: "Operations Engineer", team: "Operations" },
492492 // Otto works from the handoff until the merge; everyone else is idle.
493493 const ottoBusy = frame.handoff && !frame.merged;
494494 const margoBusy = frame.consult && !frame.approved;
495+ // As the app has it: direct messages with people and agents alike, the
496+ // latest first; then the agents not talked to yet.
497+ const dms: { who: string; away?: boolean; status?: string; working?: boolean }[] = [
498+ { who: "g1t" },
499+ { who: "Dana" },
500+ { who: "Margo", working: margoBusy },
501+ { who: "Alex", away: true, status: "🗓️" },
502+ ];
495503 const agents: { who: string; working: boolean }[] = [
496− { who: "g1t", working: frame.g1tTyping },
497504 { who: "Otto", working: ottoBusy },
498− { who: "Margo", working: margoBusy },
499505 { who: "Inky", working: frame.docUpdated },
500− { who: "Izzy", working: frame.shipped && !frame.izzy },
506+ { who: "Sam", working: frame.shipped && !frame.sam },
501507 ];
502508 return (
503509 <>
524530 {name === "support" && <span className="min-w-4 rounded-full bg-line-strong px-1 text-center text-[9.5px] font-semibold text-fg">3</span>}
525531 </SideRow>
526532 ))}
533+ <div className="flex h-7 items-center gap-2 px-2 text-[12px] text-faint">
534+ <Compass size={12} />
535+ <span className="flex-1">Browse channels</span>
536+ <span className="text-[10.5px]">3</span>
537+ </div>
538+ <SideLabel>Direct messages</SideLabel>
539+ {dms.map((dm) => {
540+ const agent = dm.who in AGENTS;
541+ return (
542+ <SideRow key={dm.who}>
543+ <span className="relative flex">
544+ <Face who={dm.who} size={16} />
545+ {!agent && <PresenceDot away={dm.away} />}
546+ {agent && dm.working && <PresenceDot />}
547+ </span>
548+ <span className="min-w-0 flex-1 truncate">
549+ {agent ? dm.who : PEOPLE[dm.who]}
550+ {agent && <span className="text-faint"> · {dm.who === "g1t" ? "orchestrator" : AGENTS[dm.who].title}</span>}
551+ {dm.status && <span className="ml-1.5 text-[11px]">{dm.status}</span>}
552+ </span>
553+ </SideRow>
554+ );
555+ })}
527556 <SideLabel>Agents</SideLabel>
528557 {agents.map((agent) => (
529558 <SideRow key={agent.who}>
530− <Face who={agent.who} size={16} />
559+ <span className="relative flex">
560+ <Face who={agent.who} size={16} />
561+ {agent.working && <PresenceDot />}
562+ </span>
531563 <span className="min-w-0 flex-1 truncate">
532564 {agent.who}
533565 <span className="text-faint"> · {AGENTS[agent.who].title}</span>
534− </span>
535− {agent.who !== "g1t" && <AgentDot working={agent.working} />}
536− </SideRow>
537− ))}
538− <SideLabel>Direct messages</SideLabel>
539− {[
540− { who: "Dana", away: false, status: null },
541− { who: "Sam", away: true, status: "🗓️" },
542− ].map((person) => (
543− <SideRow key={person.who}>
544− <span className="relative flex">
545− <Face who={person.who} size={16} />
546− <PresenceDot away={person.away} />
547− </span>
548− <span className="flex-1 truncate">
549− {PEOPLE[person.who]}
550− {person.status && <span className="ml-1.5 text-[11px]">{person.status}</span>}
551566 </span>
552567 </SideRow>
553568 ))}
554− <div className="mt-2 flex h-7 items-center gap-2 px-2 text-[12px] text-muted">
555− <Compass size={13} className="text-faint" />
556− <span className="flex-1">Browse all channels</span>
557− <span className="text-[10.5px] text-faint">6</span>
558− </div>
559569 </div>
560570 </>
561571 );
615625 {frame.shipped && (
616626 <Message who="g1t" time="09:41" enter>
617627 <p>
618− <Rich text="Shipped. A 200,000-row export now finishes in about 3 s. @izzy, can you let #support know?" />
628+ <Rich text="Shipped. A 200,000-row export now finishes in about 3 s. @sam, can you let #support know?" />
619629 </p>
620630 </Message>
621631 )}
622− {frame.izzy && (
623− <Message who="Izzy" time="09:42" enter>
632+ {frame.sam && (
633+ <Message who="Sam" time="09:42" enter>
624634 <p>
625635 <Rich text="Done. Told #support, and Dana's two customers can export again." />
626636 </p>
669679 { who: "Otto", working: true },
670680 { who: "Margo" },
671681 { who: "Inky" },
672− { who: "Izzy" },
682+ { who: "Sam" },
673683 { who: "Dot" },
674684 ];
675685
13671377 {frame.shipped && (
13681378 <Message who="g1t" time="09:41" enter>
13691379 <p>
1370− <Rich text="Shipped. @izzy, can you tell #support?" />
1380+ <Rich text="Shipped. @sam, can you tell #support?" />
13711381 </p>
13721382 </Message>
13731383 )}
1374− {frame.izzy && (
1375− <Message who="Izzy" time="09:42" enter>
1384+ {frame.sam && (
1385+ <Message who="Sam" time="09:42" enter>
13761386 <p>
13771387 <Rich text="Done. Told #support." />
13781388 </p>
+4−4
5454
5555 test("each still shows its step's point", () => {
5656 assert.equal(frameAt(STILLS.code).approved, true);
57− assert.equal(frameAt(STILLS.chat).izzy, true);
57+ assert.equal(frameAt(STILLS.chat).sam, true);
5858 assert.equal(frameAt(STILLS.agents).scene, "agents");
5959 assert.equal(frameAt(STILLS.docs).docUpdated, true);
6060 });
6161
62−test("Izzy tells #support after g1t says it shipped", () => {
63− assert.equal(frameAt(BEAT.izzy - 1).izzy, false);
64− assert.equal(frameAt(BEAT.izzy).shipped, true);
62+test("Sam tells #support after g1t says it shipped", () => {
63+ assert.equal(frameAt(BEAT.sam - 1).sam, false);
64+ assert.equal(frameAt(BEAT.sam).shipped, true);
6565 });
+8−8
66 *
77 * The story opens on the code: Otto's pull request #431 runs its checks,
88 * is approved and is merged by the queue. Then where it came from: the
9− * ask in #web, handed to @otto by g1t, now merged, and Izzy telling
9+ * ask in #web, handed to @otto by g1t, now merged, and Sam telling
1010 * #support. Then Otto's sessions, the record of what he did and spent, and
11− * last Inky's docs page picking up the change. Otto, Margo, Izzy and Inky
11+ * last Inky's docs page picking up the change. Otto, Margo, Sam and Inky
1212 * are agents this workspace hired from role templates; only g1t is built in.
1313 */
1414
4949 cardMerged: boolean;
5050 /** g1t posted that it shipped. */
5151 shipped: boolean;
52− /** Izzy says she told #support. */
53− izzy: boolean;
52+ /** Sam says the support team has been told, in #support. */
53+ sam: boolean;
5454 /** Otto consulted Margo, shown as a collapsed line on the task. */
5555 consult: boolean;
5656 /** The docs page shows the changed line. */
8787 chat: 6450,
8888 cardMerged: 7100,
8989 shipped: 8400,
90− izzy: 9600,
90+ sam: 9600,
9191 railAgentsClick: 11000,
9292 agents: 11150,
9393 railDocsClick: 15000,
137137 const press = (at: number) => t >= at && t < at + 180;
138138 const moves: [number, CursorTarget][] = [
139139 [BEAT.merged + 300, "rail-chat"],
140− [BEAT.izzy + 500, "rail-agents"],
140+ [BEAT.sam + 500, "rail-agents"],
141141 [BEAT.agents + 2600, "rail-docs"],
142142 [BEAT.docs + 500, "idle"],
143143 ];
169169 merged: t >= BEAT.merged,
170170 cardMerged: t >= BEAT.cardMerged,
171171 shipped: t >= BEAT.shipped,
172− izzy: t >= BEAT.izzy,
172+ sam: t >= BEAT.sam,
173173 consult: true,
174174 docUpdated: t >= BEAT.docUpdated,
175175 cursor,
181181 /** A still frame for each pill, for reduced motion: the moment the step makes its point. */
182182 export const STILLS: Record<Scene, number> = {
183183 code: BEAT.approved + 200,
184− chat: BEAT.izzy + 400,
184+ chat: BEAT.sam + 400,
185185 agents: BEAT.agents + 400,
186186 docs: BEAT.docUpdated + 400,
187187 };
+3−3
8989 ### Roles, not tasks
9090
9191 An agent is hired into a role, like a person: **Margo** works in QA,
92−**Izzy** in Customer Support, **David** in Sales, **Bruno** in Operations.
92+**Sam** in Customer Support, **David** in Sales, **Bruno** in Operations.
9393 The role is broad on purpose.
9494
9595 - **A title and a team.** For example, "QA Engineer" on the QA team.
103103 - reproduce bug reports;
104104 - keep the release checklist honest.
105105
106− Izzy's:
106+ Sam's:
107107 - answer customer questions from Docs and the product;
108108 - turn bugs into intake for the owning team;
109109 - tell customers when their fix ships.
178178 - Operations: Bruno.
179179 - Docs: Inky.
180180 - Product: Dot.
181−- Support: Izzy.
181+- Support: Sam.
182182 - Sales: David.
183183
184184 g1t is the one who knows everyone. The **role templates** are organised by
+1−1
456456 export type RoutineEvent = (typeof ROUTINE_EVENTS)[number]["key"];
457457
458458 /**
459− * A routine: work an agent does on a schedule or when something happens, such as Izzy's Monday digest
459+ * A routine: work an agent does on a schedule or when something happens, such as Sam's Monday digest
460460 * of support themes. Each run is a session posted in the routine's channel,
461461 * paid from the agent's budget, and run with the access of the person who
462462 * set it up (its sponsor), never more.
+1−1
1818 });
1919
2020 test("the query is what people said last, without mentions, cut short", () => {
21− assert.equal(recallQuery(["@izzy can a customer get a refund after 40 days?", "hi", "on enterprise"]), "can a customer get a refund after 40 days? \non enterprise");
21+ assert.equal(recallQuery(["@sam can a customer get a refund after 40 days?", "hi", "on enterprise"]), "can a customer get a refund after 40 days? \non enterprise");
2222 assert.equal(recallQuery(["ok", ""]), null);
2323 assert.equal(recallQuery(["x".repeat(2000)])!.length, 600);
2424 });
+1−1
11 /**
22 * Routines (docs/WORKSPACE.md, "Routines"): work an agent does on a
3− * schedule, such as Izzy's Monday digest of support themes or Bruno's
3+ * schedule, such as Sam's Monday digest of support themes or Bruno's
44 * morning look at failed deploys. Each run is a session in the routine's
55 * channel, paid from the agent's budget, with the access of the person who
66 * set it up (its sponsor), never more: if the sponsor leaves the workspace
+3−3
162162 },
163163 {
164164 id: "support",
165− display_name: "Izzy",
166− handle: "izzy",
167− name_ideas: ["Izzy", "Biscuit", "Sunny", "Waffles", "Poppy", "Moss", "Daisy", "Nugget"],
165+ display_name: "Sam",
166+ handle: "sam",
167+ name_ideas: ["Sam", "Robin", "Jamie", "Biscuit", "Sunny", "Waffles", "Poppy", "Moss", "Daisy", "Nugget"],
168168 title: "Support Specialist",
169169 department: "Customer Support",
170170 role: "Support Specialist, Customer Support",