Pick any line to see why it is the way it is: the commit, the pull request and issue it came from, and what the agent was thinking.
| Merge the workspace shell: navigation and phone shell, g1t as orchestrator, agents in roles with audience-checked reads, reactions and custom emoji, live notifications and browser push, the homepage tour (agents 0002, chat 0002) | 1 | /** |
| 2 | * The landing page's product tour: one story told as a timeline. Every | |
| 3 | * frame is a pure function of the time into the loop, so the tour can be | |
| 4 | * paused, resumed, jumped to a step, or shown still, and the server and | |
| 5 | * the first client render agree (t = 0). | |
| 6 | * | |
| The site no longer has g1t's own agents. g1t is where the coding agents you already use do their work, so the Agents mode is gone from the rail, with every page under /<workspace>/-/agents: personas, faces, skills, abilities, routines, computers, sessions and agent spend. Customize (skills, connectors, plugins, marketplaces), the context hub, model providers, the AI Gateway page, the Spend page and pill, Ask g1t, and the repository's Agents, Plans and agent settings pages go too, and their addresses now answer 404. | 7 | * The story is about the code. Priya's pull request #431 runs its checks, |
| 8 | * is approved by Dana and is merged by the queue, and production deploys. | |
| 9 | * Then how it was made: the session Priya's coding agent recorded onto the | |
| 10 | * pull request through g1t's MCP server. Then the people: #web, where Dana | |
| 11 | * reported the bug and hears it shipped. Last, the docs page Dana updates. | |
| Merge the workspace shell: navigation and phone shell, g1t as orchestrator, agents in roles with audience-checked reads, reactions and custom emoji, live notifications and browser push, the homepage tour (agents 0002, chat 0002) | 12 | */ |
| 13 | ||
| The site no longer has g1t's own agents. g1t is where the coding agents you already use do their work, so the Agents mode is gone from the rail, with every page under /<workspace>/-/agents: personas, faces, skills, abilities, routines, computers, sessions and agent spend. Customize (skills, connectors, plugins, marketplaces), the context hub, model providers, the AI Gateway page, the Spend page and pill, Ask g1t, and the repository's Agents, Plans and agent settings pages go too, and their addresses now answer 404. | 14 | export type Scene = "code" | "session" | "chat" | "docs"; |
| Merge the workspace shell: navigation and phone shell, g1t as orchestrator, agents in roles with audience-checked reads, reactions and custom emoji, live notifications and browser push, the homepage tour (agents 0002, chat 0002) | 15 | |
| 16 | /** Where the soft cursor points: an element marked `data-tour="<target>"`. */ | |
| The site no longer has g1t's own agents. g1t is where the coding agents you already use do their work, so the Agents mode is gone from the rail, with every page under /<workspace>/-/agents: personas, faces, skills, abilities, routines, computers, sessions and agent spend. Customize (skills, connectors, plugins, marketplaces), the context hub, model providers, the AI Gateway page, the Spend page and pill, Ask g1t, and the repository's Agents, Plans and agent settings pages go too, and their addresses now answer 404. | 17 | export type CursorTarget = "pr-session" | "rail-code" | "rail-chat" | "rail-docs" | "idle"; |
| Merge the workspace shell: navigation and phone shell, g1t as orchestrator, agents in roles with audience-checked reads, reactions and custom emoji, live notifications and browser push, the homepage tour (agents 0002, chat 0002) | 18 | |
| 19 | export type Frame = { | |
| 20 | scene: Scene; | |
| 21 | /** Checks passed on the pull request, 0 to CHECKS.length. */ | |
| 22 | checks: number; | |
| 23 | /** The diff is shown on the pull request. */ | |
| 24 | diff: boolean; | |
| The site no longer has g1t's own agents. g1t is where the coding agents you already use do their work, so the Agents mode is gone from the rail, with every page under /<workspace>/-/agents: personas, faces, skills, abilities, routines, computers, sessions and agent spend. Customize (skills, connectors, plugins, marketplaces), the context hub, model providers, the AI Gateway page, the Spend page and pill, Ask g1t, and the repository's Agents, Plans and agent settings pages go too, and their addresses now answer 404. | 25 | /** Dana approved. */ |
| Merge the workspace shell: navigation and phone shell, g1t as orchestrator, agents in roles with audience-checked reads, reactions and custom emoji, live notifications and browser push, the homepage tour (agents 0002, chat 0002) | 26 | approved: boolean; |
| 27 | /** The merge queue merged it. */ | |
| 28 | merged: boolean; | |
| The site no longer has g1t's own agents. g1t is where the coding agents you already use do their work, so the Agents mode is gone from the rail, with every page under /<workspace>/-/agents: personas, faces, skills, abilities, routines, computers, sessions and agent spend. Customize (skills, connectors, plugins, marketplaces), the context hub, model providers, the AI Gateway page, the Spend page and pill, Ask g1t, and the repository's Agents, Plans and agent settings pages go too, and their addresses now answer 404. | 29 | /** Entries of the recorded session shown, 0 to SESSION.length. */ |
| 30 | entries: number; | |
| 31 | /** Priya posted in #web that it shipped. */ | |
| Merge the workspace shell: navigation and phone shell, g1t as orchestrator, agents in roles with audience-checked reads, reactions and custom emoji, live notifications and browser push, the homepage tour (agents 0002, chat 0002) | 32 | shipped: boolean; |
| The site no longer has g1t's own agents. g1t is where the coding agents you already use do their work, so the Agents mode is gone from the rail, with every page under /<workspace>/-/agents: personas, faces, skills, abilities, routines, computers, sessions and agent spend. Customize (skills, connectors, plugins, marketplaces), the context hub, model providers, the AI Gateway page, the Spend page and pill, Ask g1t, and the repository's Agents, Plans and agent settings pages go too, and their addresses now answer 404. | 33 | /** Dana says support has been told, in #web. */ |
| 34 | told: boolean; | |
| Merge the workspace shell: navigation and phone shell, g1t as orchestrator, agents in roles with audience-checked reads, reactions and custom emoji, live notifications and browser push, the homepage tour (agents 0002, chat 0002) | 35 | /** The docs page shows the changed line. */ |
| 36 | docUpdated: boolean; | |
| 37 | cursor: CursorTarget; | |
| 38 | /** The cursor is pressing. */ | |
| 39 | click: boolean; | |
| 40 | /** The cursor is shown at all. */ | |
| 41 | cursorShown: boolean; | |
| 42 | }; | |
| 43 | ||
| The site no longer has g1t's own agents. g1t is where the coding agents you already use do their work, so the Agents mode is gone from the rail, with every page under /<workspace>/-/agents: personas, faces, skills, abilities, routines, computers, sessions and agent spend. Customize (skills, connectors, plugins, marketplaces), the context hub, model providers, the AI Gateway page, the Spend page and pill, Ask g1t, and the repository's Agents, Plans and agent settings pages go too, and their addresses now answer 404. | 44 | /** One entry of the session the coding agent recorded onto the pull request. */ |
| 45 | export type SessionEntry = { kind: "prompt" | "message" | "tool"; text: string; tool?: string; commit?: string }; | |
| Merge the workspace shell: navigation and phone shell, g1t as orchestrator, agents in roles with audience-checked reads, reactions and custom emoji, live notifications and browser push, the homepage tour (agents 0002, chat 0002) | 46 | |
| The site no longer has g1t's own agents. g1t is where the coding agents you already use do their work, so the Agents mode is gone from the rail, with every page under /<workspace>/-/agents: personas, faces, skills, abilities, routines, computers, sessions and agent spend. Customize (skills, connectors, plugins, marketplaces), the context hub, model providers, the AI Gateway page, the Spend page and pill, Ask g1t, and the repository's Agents, Plans and agent settings pages go too, and their addresses now answer 404. | 47 | /** The session Priya's coding agent recorded onto #431 as it worked. */ |
| 48 | export const SESSION: SessionEntry[] = [ | |
| 49 | { kind: "prompt", text: "Big accounts time out on CSV export (Dana's report in #web). Find out why and fix it." }, | |
| 50 | { kind: "tool", tool: "read", text: "services/export/csv.py" }, | |
| 51 | { kind: "message", text: "Every row loads before the first byte is sent, so accounts over 100k rows hit the 60 s limit." }, | |
| 52 | { kind: "tool", tool: "bash", text: "pytest tests/test_export.py -k big_account → 3.1 s, was 61 s" }, | |
| 53 | { kind: "message", text: "Rows now stream in batches of 1,000. Opened #431.", commit: "3f9c2a1" }, | |
| Merge the workspace shell: navigation and phone shell, g1t as orchestrator, agents in roles with audience-checked reads, reactions and custom emoji, live notifications and browser push, the homepage tour (agents 0002, chat 0002) | 54 | ]; |
| 55 | ||
| 56 | export const CHECKS = ["build", "test", "lint", "preview"]; | |
| 57 | ||
| 58 | /** The beats of the story, in ms from the start of the loop. */ | |
| 59 | export const BEAT = { | |
| Merge site-audit: SEO routes, analytics with consent first in Europe, security page, founder and X account, docs header; the tour opens on the pull request and leads with Code, on the real shell, with Agents and Docs working today | 60 | code: 0, |
| 61 | check0: 900, | |
| Merge the workspace shell: navigation and phone shell, g1t as orchestrator, agents in roles with audience-checked reads, reactions and custom emoji, live notifications and browser push, the homepage tour (agents 0002, chat 0002) | 62 | checkGap: 650, |
| Merge site-audit: SEO routes, analytics with consent first in Europe, security page, founder and X account, docs header; the tour opens on the pull request and leads with Code, on the real shell, with Agents and Docs working today | 63 | diff: 1300, |
| 64 | approved: 3900, | |
| 65 | merged: 5000, | |
| The site no longer has g1t's own agents. g1t is where the coding agents you already use do their work, so the Agents mode is gone from the rail, with every page under /<workspace>/-/agents: personas, faces, skills, abilities, routines, computers, sessions and agent spend. Customize (skills, connectors, plugins, marketplaces), the context hub, model providers, the AI Gateway page, the Spend page and pill, Ask g1t, and the repository's Agents, Plans and agent settings pages go too, and their addresses now answer 404. | 66 | sessionClick: 6300, |
| 67 | session: 6450, | |
| 68 | entry0: 6700, | |
| 69 | entryGap: 500, | |
| 70 | railChatClick: 10000, | |
| 71 | chat: 10150, | |
| 72 | shipped: 11000, | |
| 73 | told: 12200, | |
| 74 | railDocsClick: 14000, | |
| 75 | docs: 14150, | |
| 76 | docUpdated: 15300, | |
| 77 | end: 20000, | |
| Merge the workspace shell: navigation and phone shell, g1t as orchestrator, agents in roles with audience-checked reads, reactions and custom emoji, live notifications and browser push, the homepage tour (agents 0002, chat 0002) | 78 | } as const; |
| 79 | ||
| 80 | /** The whole loop, in ms. */ | |
| 81 | export const LOOP_MS = BEAT.end; | |
| 82 | ||
| 83 | /** The step pills under the frame: where each starts, for jumping to it. */ | |
| The site no longer has g1t's own agents. g1t is where the coding agents you already use do their work, so the Agents mode is gone from the rail, with every page under /<workspace>/-/agents: personas, faces, skills, abilities, routines, computers, sessions and agent spend. Customize (skills, connectors, plugins, marketplaces), the context hub, model providers, the AI Gateway page, the Spend page and pill, Ask g1t, and the repository's Agents, Plans and agent settings pages go too, and their addresses now answer 404. | 84 | export const PILLS: { scene: Scene; label: string; start: number }[] = [ |
| 85 | { scene: "code", label: "Pull request", start: 0 }, | |
| 86 | { scene: "session", label: "Session", start: BEAT.session }, | |
| 87 | { scene: "chat", label: "Chat", start: BEAT.chat }, | |
| 88 | { scene: "docs", label: "Artifacts", start: BEAT.docs }, | |
| Merge the workspace shell: navigation and phone shell, g1t as orchestrator, agents in roles with audience-checked reads, reactions and custom emoji, live notifications and browser push, the homepage tour (agents 0002, chat 0002) | 89 | ]; |
| 90 | ||
| Merge site-audit: SEO routes, analytics with consent first in Europe, security page, founder and X account, docs header; the tour opens on the pull request and leads with Code, on the real shell, with Agents and Docs working today | 91 | /** Which pill a time falls under. */ |
| Merge the workspace shell: navigation and phone shell, g1t as orchestrator, agents in roles with audience-checked reads, reactions and custom emoji, live notifications and browser push, the homepage tour (agents 0002, chat 0002) | 92 | export function pillAt(t: number): number { |
| 93 | let index = 0; | |
| 94 | PILLS.forEach((pill, i) => { | |
| 95 | if (t >= pill.start) index = i; | |
| 96 | }); | |
| 97 | return index; | |
| 98 | } | |
| 99 | ||
| 100 | /** How far through its pill a time is, 0 to 1. */ | |
| 101 | export function pillProgress(t: number): number { | |
| 102 | const index = pillAt(t); | |
| 103 | const start = PILLS[index].start; | |
| 104 | const end = PILLS[index + 1]?.start ?? LOOP_MS; | |
| 105 | return Math.min(1, Math.max(0, (t - start) / (end - start))); | |
| 106 | } | |
| 107 | ||
| 108 | function count(t: number, first: number, gap: number, max: number): number { | |
| 109 | if (t < first) return 0; | |
| 110 | return Math.min(max, Math.floor((t - first) / gap) + 1); | |
| 111 | } | |
| 112 | ||
| 113 | /** Where the cursor is headed, and whether it is pressing, at time t. */ | |
| 114 | function cursorAt(t: number): { cursor: CursorTarget; click: boolean } { | |
| 115 | const press = (at: number) => t >= at && t < at + 180; | |
| 116 | const moves: [number, CursorTarget][] = [ | |
| The site no longer has g1t's own agents. g1t is where the coding agents you already use do their work, so the Agents mode is gone from the rail, with every page under /<workspace>/-/agents: personas, faces, skills, abilities, routines, computers, sessions and agent spend. Customize (skills, connectors, plugins, marketplaces), the context hub, model providers, the AI Gateway page, the Spend page and pill, Ask g1t, and the repository's Agents, Plans and agent settings pages go too, and their addresses now answer 404. | 117 | [BEAT.merged + 300, "pr-session"], |
| 118 | [BEAT.session + 2600, "rail-chat"], | |
| 119 | [BEAT.told + 500, "rail-docs"], | |
| Merge the workspace shell: navigation and phone shell, g1t as orchestrator, agents in roles with audience-checked reads, reactions and custom emoji, live notifications and browser push, the homepage tour (agents 0002, chat 0002) | 120 | [BEAT.docs + 500, "idle"], |
| 121 | ]; | |
| 122 | let cursor: CursorTarget = "idle"; | |
| 123 | for (const [at, target] of moves) if (t >= at) cursor = target; | |
| The site no longer has g1t's own agents. g1t is where the coding agents you already use do their work, so the Agents mode is gone from the rail, with every page under /<workspace>/-/agents: personas, faces, skills, abilities, routines, computers, sessions and agent spend. Customize (skills, connectors, plugins, marketplaces), the context hub, model providers, the AI Gateway page, the Spend page and pill, Ask g1t, and the repository's Agents, Plans and agent settings pages go too, and their addresses now answer 404. | 124 | const click = press(BEAT.sessionClick) || press(BEAT.railChatClick) || press(BEAT.railDocsClick); |
| Merge the workspace shell: navigation and phone shell, g1t as orchestrator, agents in roles with audience-checked reads, reactions and custom emoji, live notifications and browser push, the homepage tour (agents 0002, chat 0002) | 125 | return { cursor, click }; |
| 126 | } | |
| 127 | ||
| The site no longer has g1t's own agents. g1t is where the coding agents you already use do their work, so the Agents mode is gone from the rail, with every page under /<workspace>/-/agents: personas, faces, skills, abilities, routines, computers, sessions and agent spend. Customize (skills, connectors, plugins, marketplaces), the context hub, model providers, the AI Gateway page, the Spend page and pill, Ask g1t, and the repository's Agents, Plans and agent settings pages go too, and their addresses now answer 404. | 128 | /** The frame at time t (ms into the loop). */ |
| Merge the workspace shell: navigation and phone shell, g1t as orchestrator, agents in roles with audience-checked reads, reactions and custom emoji, live notifications and browser push, the homepage tour (agents 0002, chat 0002) | 129 | export function frameAt(time: number): Frame { |
| 130 | const t = ((time % LOOP_MS) + LOOP_MS) % LOOP_MS; | |
| The site no longer has g1t's own agents. g1t is where the coding agents you already use do their work, so the Agents mode is gone from the rail, with every page under /<workspace>/-/agents: personas, faces, skills, abilities, routines, computers, sessions and agent spend. Customize (skills, connectors, plugins, marketplaces), the context hub, model providers, the AI Gateway page, the Spend page and pill, Ask g1t, and the repository's Agents, Plans and agent settings pages go too, and their addresses now answer 404. | 131 | const scene: Scene = t >= BEAT.docs ? "docs" : t >= BEAT.chat ? "chat" : t >= BEAT.session ? "session" : "code"; |
| Merge the workspace shell: navigation and phone shell, g1t as orchestrator, agents in roles with audience-checked reads, reactions and custom emoji, live notifications and browser push, the homepage tour (agents 0002, chat 0002) | 132 | const { cursor, click } = cursorAt(t); |
| 133 | return { | |
| 134 | scene, | |
| 135 | checks: count(t, BEAT.check0, BEAT.checkGap, CHECKS.length), | |
| 136 | diff: t >= BEAT.diff, | |
| 137 | approved: t >= BEAT.approved, | |
| 138 | merged: t >= BEAT.merged, | |
| The site no longer has g1t's own agents. g1t is where the coding agents you already use do their work, so the Agents mode is gone from the rail, with every page under /<workspace>/-/agents: personas, faces, skills, abilities, routines, computers, sessions and agent spend. Customize (skills, connectors, plugins, marketplaces), the context hub, model providers, the AI Gateway page, the Spend page and pill, Ask g1t, and the repository's Agents, Plans and agent settings pages go too, and their addresses now answer 404. | 139 | // The session was recorded before the story opens; the tour plays it back once its tab is opened. |
| 140 | entries: t < BEAT.session ? 0 : count(t, BEAT.entry0, BEAT.entryGap, SESSION.length), | |
| Merge the workspace shell: navigation and phone shell, g1t as orchestrator, agents in roles with audience-checked reads, reactions and custom emoji, live notifications and browser push, the homepage tour (agents 0002, chat 0002) | 141 | shipped: t >= BEAT.shipped, |
| The site no longer has g1t's own agents. g1t is where the coding agents you already use do their work, so the Agents mode is gone from the rail, with every page under /<workspace>/-/agents: personas, faces, skills, abilities, routines, computers, sessions and agent spend. Customize (skills, connectors, plugins, marketplaces), the context hub, model providers, the AI Gateway page, the Spend page and pill, Ask g1t, and the repository's Agents, Plans and agent settings pages go too, and their addresses now answer 404. | 142 | told: t >= BEAT.told, |
| Merge the workspace shell: navigation and phone shell, g1t as orchestrator, agents in roles with audience-checked reads, reactions and custom emoji, live notifications and browser push, the homepage tour (agents 0002, chat 0002) | 143 | docUpdated: t >= BEAT.docUpdated, |
| 144 | cursor, | |
| 145 | click, | |
| Merge site-audit: SEO routes, analytics with consent first in Europe, security page, founder and X account, docs header; the tour opens on the pull request and leads with Code, on the real shell, with Agents and Docs working today | 146 | cursorShown: t >= BEAT.merged && t < BEAT.end - 600, |
| Merge the workspace shell: navigation and phone shell, g1t as orchestrator, agents in roles with audience-checked reads, reactions and custom emoji, live notifications and browser push, the homepage tour (agents 0002, chat 0002) | 147 | }; |
| 148 | } | |
| 149 | ||
| 150 | /** A still frame for each pill, for reduced motion: the moment the step makes its point. */ | |
| 151 | export const STILLS: Record<Scene, number> = { | |
| 152 | code: BEAT.approved + 200, | |
| The site no longer has g1t's own agents. g1t is where the coding agents you already use do their work, so the Agents mode is gone from the rail, with every page under /<workspace>/-/agents: personas, faces, skills, abilities, routines, computers, sessions and agent spend. Customize (skills, connectors, plugins, marketplaces), the context hub, model providers, the AI Gateway page, the Spend page and pill, Ask g1t, and the repository's Agents, Plans and agent settings pages go too, and their addresses now answer 404. | 153 | session: BEAT.railChatClick - 400, |
| 154 | chat: BEAT.told + 400, | |
| Merge the workspace shell: navigation and phone shell, g1t as orchestrator, agents in roles with audience-checked reads, reactions and custom emoji, live notifications and browser push, the homepage tour (agents 0002, chat 0002) | 155 | docs: BEAT.docUpdated + 400, |
| 156 | }; | |
| 157 | ||
| 158 | /** Whether two frames would draw the same. */ | |
| 159 | export function sameFrame(a: Frame, b: Frame): boolean { | |
| 160 | for (const key of Object.keys(a) as (keyof Frame)[]) if (a[key] !== b[key]) return false; | |
| 161 | return true; | |
| 162 | } |
This file's history is long; its oldest lines are credited to the oldest commit read.