Skip to content
1,391 linesCodeBlameRaw

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.

Chat and workspace agents: channels, DMs and named agents you talk to1# The workspace: chat, agents, docs and code in one place
2
3A g1t workspace is where a team and its agents talk, write things down and
4ship code. Four modes share one identity, one inbox, one search, one audit
5log and one bill:
6
7| Mode | What it is |
8| --- | --- |
9| **Chat** | Channels, threads and direct messages. People and agents are members alike. |
10| **Agents** | The workspace's agents: who they are, what they are doing right now, what they cost. |
11| **Docs** | The workspace's written knowledge: specs, runbooks, decisions, onboarding. Agents read it and keep it current. |
12| **Code** | Projects, issues, pull requests, checks, deploys. Exactly as today. |
13
14Home and Inbox sit above the modes and span all of them.
15
16This plan supersedes `docs/CHANNELS.md`. It keeps that document's data
17shapes for channels and messages. It changes how agents run, adds
18coordination between agents, and adds Docs.
19
20## The bet
21
22Every team already runs three tools that don't know about each other:
23
24- a chat app;
25- a wiki;
26- a forge.
27
28Agents are bolted onto each one separately. A bot in the chat app can talk
29but can't safely touch code. A coding agent can touch code but forgets the
30conversation that asked for it. The wiki goes stale the week it is written.
31
32g1t puts the three in one system of record, and agents are members of it:
33
34- **Agents are teammates, not features.** Each has a name, a face, a job, a
35 personality, a budget and a desk. You DM it, invite it to a channel, add
36 it to a doc's owners, assign it an issue.
37- **Conversation starts work; the forge records it.** A request in chat
38 becomes a task. Code changes become pull requests. Knowledge becomes doc
39 edits. Everything links back to the thread that asked for it.
40- **Agents work like real sessions.** An agent works the way a Claude Code
41 session does: it reads, edits, runs things, keeps its context across
42 days, can be steered mid-flight, and can hold several jobs at once.
43- **Agents coordinate in the open.** Before an agent touches something, it
44 claims it. When two agents' work would collide, they negotiate in a
45 thread a person can read, not in a hidden log.
46- **The rails are the product.** Budgets, scopes, approvals and audit are
47 decided by policy, not by the agent's judgment, and they are visible on
48 every card.
49
50## Agents
51
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)52### g1t, the orchestrator
53
54`@g1t` is the agent every workspace has from the start, on every surface:
55
56- g1t Chat;
57- issues and pull requests;
58- the inbox;
59- the external chat app;
60- MCP.
61
62You don't create it and can't archive it. It is the one to talk to when you
63don't know who should do something.
64
65- **It knows the team.** It knows every specialist in the workspace: their
66 roles, what they are working on, and their budgets. It also knows the
67 people, and which teams own what.
68- **It delegates.** "Get the flaky checks fixed and tell support when it
69 ships" becomes:
70 1. g1t asks `@triage` to group the reports;
71 2. it hands the fix to `@builder` and the review to `@reviewer`;
72 3. it tells `#support` when the fix ships.
73
Merge branch 'worktree-agent-a1398e81ad1a64c5f'74 Every hand-off is the `hand_off` tool, visible where it lands (see
75 *Hand-offs* under "Agents know each other"); an @mention in its message
76 hands nothing over. The hop limit and the asker's access apply along
77 the whole chain.
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- **It does the work itself when nobody fits.** In a workspace with no
79 specialists, g1t does everything itself, as it does today.
80- **It reports.** g1t sends the daily or weekly summary of what the team's
81 agents did, and answers "what's everyone working on?"
82- **It is configurable like any agent.** You can set its personality,
83 routing limits, budget and autonomy. Its job (orchestrate, delegate,
84 report) is fixed, but you can add instructions to it.
85
86**Agents** mode is where you manage the specialists: custom, named agents
87with a narrow job, such as a reviewer, release manager, on-call, support
88triage or docs keeper. g1t stays pinned at the top of that list as the
89orchestrator.
90
91### Roles, not tasks
92
93An agent is hired into a role, like a person: **Margo** works in QA,
Merge branch 'chat-sidebar' into fast-push94**Sam** in Customer Support, **David** in Sales, **Bruno** in Operations.
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)95The role is broad on purpose.
96
97- **A title and a team.** For example, "QA Engineer" on the QA team.
98 Agents join real teams (see *Like a colleague*), so they get the team's
99 channels, mentions and review requests, and g1t routes work by team: "QA
100 should look at this" reaches Margo.
101- **Responsibilities**, not one task. Margo's:
102 - review pull requests for risk and test coverage;
103 - write test plans for new features;
104 - chase flaky checks;
105 - reproduce bug reports;
106 - keep the release checklist honest.
107
Merge branch 'chat-sidebar' into fast-push108 Sam's:
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)109 - answer customer questions from Docs and the product;
110 - turn bugs into intake for the owning team;
111 - tell customers when their fix ships.
112- **Skills** are the repeatable procedures inside the role ("cut a
113 release", "write a postmortem"), made by walking the agent through once.
114- **Subagents** are the specialised help an agent uses inside its own work.
115 Margo might keep:
116 - a `flake-hunter` that bisects a flaky test;
117 - a `migration-checker` that reviews database migrations.
118
119 Subagents have these rules:
120 - **Defined on the agent.** Each has its own instructions and routing
121 limits.
122 - **Not members.** They never appear in chat or member lists, and never
123 talk to people. They report to their agent, which speaks for them.
124 - **Never wider than their agent.** Their scopes, budget and audience can
125 only be equal or narrower. Their spend counts against the agent's
126 budget and the task.
127 - **Many at once.** They run in parallel inside a task, the way a person
128 hands parts of a job to tools. The task card shows them as sub-steps.
129
130**Back office and front office.** Every agent is back office by default:
131it works with the team and never talks to anyone outside the company.
132
133- **Back office.** **David** in Sales Operations is the example. He:
134 - reads the customer conversations the workspace already has (support
135 channels, shared customer notes, and later connected email, call notes
136 and CRM records);
137 - summarizes what's happening per account and across them: who is at
138 risk, what keeps being asked for, and what was promised;
139 - posts a weekly voice-of-the-customer digest;
140 - prepares account notes before a call;
141 - links feature requests to the accounts asking for them, so Product
142 sees the demand.
143
144 He never contacts a customer. Customer-data rules apply to everything he
145 reads.
146- **Front office** (later) agents talk to customers directly, through
147 email, a support widget or a shared channel. They need stricter rails:
148 - an owner switch per agent;
149 - only Public and approved Docs content;
150 - human approval for anything that promises, refunds or commits;
151 - a clear "you're talking to an agent" label.
152
153 They come after the external surfaces exist.
154
155**Agents know each other.** Every agent, not only g1t, knows the team:
156each agent's name, title, team, responsibilities and status. When a
157question belongs to someone else, it uses one of three moves:
158
Merge branch 'worktree-agent-a1398e81ad1a64c5f'159- **Consult** (`ask_colleague`). It asks the colleague a quick question
160 and brings the answer back; the person stays with the agent they asked,
161 and the colleague does no work in the conversation. The exchange is
162 visible as a card in the thread ("David asked Margo").
163- **Hand off** (`hand_off`). A specialist offers to bring the right
164 colleague in: "That's Margo's area. Want me to hand it to her?" On yes,
165 it hands her the work with a brief (g1t hands off without asking when a
166 specialist's role fits). Hand-offs are never silent, so people always
167 know who they're talking to.
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)168- **Steer.** When someone is about to do something another role owns, it
169 says so and names who to check with. Examples: merging during a release
170 freeze, or promising a customer a date.
171
172Every move carries the audience and the asker's access. A colleague can
Merge branch 'worktree-agent-a1398e81ad1a64c5f'173only contribute what the conversation's audience may see. A consult is
174billed to the reply that asked; a hand-off's work to the colleague's own
175budget, like any reply. An agent may not send work back to an agent that
176already handled it within the same chain without a person stepping in.
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)177The hop limit applies to the whole chain.
178
Merge branch 'worktree-agent-a1398e81ad1a64c5f'179#### Where you are
180
181Every turn (a reply or a session step), the agent's prompt says what the
182conversation is (a direct message with someone, a group direct message,
183or a public or private channel by name) and lists its members: every
184agent, with its title, and people up to 20, then a count, the person who
185asked always among them (`conversation_for_agent` in services/chat). It
186says plainly:
187
188- only these members read what it says here;
189- writing the name or @handle of anyone not listed reaches no one;
190- its messages never wake another agent: only `hand_off` does, and
191 `ask_colleague` is for a private quick question;
192- it never claims to have asked, told or handed work to anyone unless a
193 tool did it.
194
195The chat service enforces the rest, whatever the model writes:
196
197- **Agents' messages wake nobody.** Only a person's message wakes agents
198 (by mention in a channel; in a direct message, the agents it mentions,
199 or all of them when it mentions none). Agents reach each other only by
200 hand-off, so no loops and no agent summoned because its name came up.
201- **Mentions of non-members are plain.** In an agent's message, an
202 @mention of anyone who isn't a member of the conversation loses its
203 `@` when it is kept, so it shows no pill and notifies nobody. Code and
204 team mentions are left alone. People's own mentions are unchanged.
205- **A workflow job's token wakes no agent** in chat, as on issues.
206
207#### Hand-offs
208
209`hand_off { handle, brief }`, from a chat reply (sessions use `bring_in`),
210at most two per reply, within the hop limit. The agents service refuses,
211as the tool's answer: an unknown handle, a person, the agent itself,
212`@g1t` (no agent puts g1t to work), an agent already in the chain, one
213that is paused or out of budget, and an asker who isn't a workspace
214member. The chat service (`hand_off_as_agent`) checks the same rails and
215that the asker is in the conversation, then:
216
217- **The colleague is in this channel or group DM:** the brief is posted
218 here as the delegating agent, in the same thread, addressed to them.
219- **Otherwise:** the group DM of the asker, the delegating agent and the
220 colleague is opened (or reused: the same three always get the same
221 one), the brief is posted there, and a `handoff` card in the current
222 conversation links to it.
223
224Either way the brief wakes the colleague and nobody else, one hop further
225along the asker's chain, carrying the asker's access. In the group DM the
226audience is its members, so the colleague reads only what all three may.
227The colleague is told who handed it the work and not to hand it back.
228
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)229A workspace's org chart can therefore read like a real company:
230
231- Engineering: people, plus Builder.
232- QA: Margo.
233- Operations: Bruno.
234- Docs: Inky.
235- Product: Dot.
Merge branch 'chat-sidebar' into fast-push236- Support: Sam.
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)237- Sales: David.
238
239g1t is the one who knows everyone. The **role templates** are organised by
240department. Each starts with a fun name, a title, responsibilities, a voice
241and sensible routing limits, and you can change all of it.
242
Chat and workspace agents: channels, DMs and named agents you talk to243### What an agent is
244
245An agent is a member of a workspace, of kind `agent`. It appears everywhere
246a person does: member lists, mentions, assignees, reviewers, doc authors,
247the audit log.
248
249`@g1t` stays what it is today: the platform's own agent, reachable from any
250workspace with no setup. A workspace's own agents are created by its
251members and belong only to that workspace. g1t's built-in roles (planner,
252implementer, reviewer, triage, documenter) ship as templates you can adopt,
253rename and change. They are not hidden system actors.
254
255### The definition
256
257An agent is a versioned record in the workspace. It can also be mirrored
258to a repository as `.g1t/agents/<handle>.md`: front matter for settings,
259the body for its job. Edits from either side create a new version, and
260every run records which version it ran.
261
262| Field | What it controls |
263| --- | --- |
264| Identity | Display name, `@handle`, avatar, a one-line role ("Release manager for g1t"). |
265| Job | Instructions: what it is responsible for, how it works, what good looks like. |
266| Personality | Voice only: tone, verbosity, formality, emoji, language, how it asks questions. Presets (Crisp, Friendly, Socratic, Terse operator) plus free text. Personality never changes policy. |
267| Models | Routed per step by need, never picked when assigning work. See [Model routing](#model-routing). The definition only sets limits on the routing: a floor, a ceiling, and which providers it may use. |
268| Budget | A monthly cap, a per-task cap, and an optional daily cap. See [Budgets](#budgets). |
269| Scopes | Which projects, channels and doc spaces it can read and which it can write. Default: read what it is invited to, write nothing. |
270| Autonomy | What it may do alone and what needs a person. For example: open pull requests (alone); merge (needs approval); deploy to production (needs approval); publish a doc page (alone in spaces it owns, a suggestion elsewhere). Rulesets and branch protection still apply on top. |
271| Capacity | How many tasks it works at once (default 3). Beyond that, tasks queue on its desk. |
272| Triggers | What wakes it without a mention: a schedule, any g1t event, a message in a channel it watches, a webhook, a doc page going stale. |
273| Skills | Saved procedures it can repeat ("cut a release", "write the weekly update"), made by walking it through once. |
274| Tools | g1t's MCP tools allowed by its scopes, plus MCP servers the workspace connected. |
275| Memory | What it has learned. Readable and editable on its profile, with sources. |
276
277### Like a colleague
278
279Agents are treated like employees, not like settings:
280
281- **They belong to teams.** An agent can be added to any team, the same as
282 a person. It then:
283 - gets that team's channels and mentions;
284 - can be requested as a reviewer through the team;
285 - shows up on the team's page.
286- **They post updates on their own.**
287 - When a task changes state (started, opened a pull request, blocked,
288 done), the agent says so in the thread that asked for it.
289 - A daily or weekly summary, if you turn it on, goes to the channels it
290 works for: what it shipped, what it is waiting on, and what it spent.
291 - Everyone always knows what each agent is doing without asking.
292- **They have a manager.** Every agent has an owner: the person who
293 approves its budget and gets its escalations.
294- **Chat comes first, and issues still work.** You can give an agent work
295 just by talking to it. Creating an issue and assigning it to the agent
296 still works the same way, for planned work and for anyone who prefers
297 it.
298
299### Creating one
300
301Agents can be created in three ways:
302
303- **In chat.** Write something like "make a release manager called Ship that
304 cuts g1t releases on Tuesdays and asks me before tagging". g1t answers with
305 a draft card holding every field. You edit the card and confirm.
306- **From a template**, on the Agents page.
307- **By committing** `.g1t/agents/ship.md`. g1t offers to adopt it into the
308 workspace.
309
310Once saved, the agent:
311
312- introduces itself in the channels it was added to;
313- opens a DM with the person who created it;
314- shows up as idle on the Agents page.
315
316### Agents mode
317
318The sidebar lists:
319
320- agents you talk to;
321- agents working right now, each showing its live tasks;
322- agents waiting on you;
323- all agents.
324
325An agent's page has five tabs:
326
327| Tab | What it shows |
328| --- | --- |
329| **Desk** | Every task it holds, as live cards (like Claude Code tabs): steps, files touched, cost so far, what it is waiting on. Open one to read the full transcript, steer it, pause it or take it over. |
330| **Profile** | The definition, with version history. |
331| **Memory** | What it remembers, with the source of each fact. Each fact can be pinned, edited or forgotten. |
332| **Spend** | Spend this month against its budget, by task and by model. |
333| **Activity** | Everything it did, from the audit log. |
334
335## How agents run
336
337### Two kinds of turn
338
339Most messages to an agent don't need a computer. A reply should take a
340second and cost a fraction of a cent. Spinning up a sandbox for every
341message would make chat slow and expensive.
342
343- **Replies** run in a Worker with no sandbox. The model gets the thread,
344 the agent's definition and memory, and g1t's MCP tools within the agent's
345 scopes:
346 - read code, issues, pull requests, checks, deploys and docs;
347 - search context;
348 - post a message;
349 - open a task;
350 - claim something;
351 - ask another agent.
352
353 Questions, summaries, triage, planning and doc reads are all replies.
354- **Sessions** run in a sandbox, exactly as today's runs do. They are used
355 for anything that edits a repository, runs code or tests, or works for
356 longer than a reply. A reply escalates to a session by opening a task.
357
358### Sessions persist
359
360Today each run is a fresh headless `claude --print`. Sessions become
361resumable:
362
363- Each task has a session: the Claude Code session id, its transcript
364 (stored in R2), the branch it works on, and its claims.
365- A sandbox lives only while the session is doing something. When it goes
366 idle the sandbox stops. The transcript is saved, and the work is pushed
367 to the task's branch. Idle agents cost nothing.
368- The next message to that task resumes the session in a new sandbox: the
369 saved transcript is restored and the run uses `claude --resume <id>`. It
370 could be a reply in its thread, a review comment, a failed check or an
371 answer from another agent. The agent picks up with full context, as if
372 it never left.
373- Steering keeps today's after-tool-call hook (`crates/runner/src/steer.rs`).
374 It now reads from the task's thread, not only from the pull request.
375- A person can open any session and see what Claude Code would show:
376 - the transcript;
377 - the diff so far;
378 - the terminal output.
379
380 From there they can send a message, pause it, or take it over. Taking
381 over hands them the branch and the transcript.
382
383### The desk
384
385Each agent has one desk: a Durable Object keyed by agent id. Everything
386addressed to the agent arrives at the desk:
387
388- mentions;
389- DMs;
390- assignments;
391- triggers;
392- messages from other agents.
393
394The desk decides what each one is:
395
3961. **A question or chat** goes to a reply.
3972. **About a task it already holds** (same thread, same pull request, or
398 it says so) steers that session.
3993. **New work** opens a task. If the desk is at capacity, the task queues
400 with its position shown to whoever asked.
401
402The desk also enforces the agent's capacity, schedules its triggers, and
403holds the agent's presence (idle, working, waiting on you, out of budget).
404Workspace-wide concurrency stays the plan's entitlement
405(`maxConcurrentAgents`), checked as today.
406
407### Tasks
408
409A task is one job an agent took on. It records:
410
411- who asked, and in which thread;
412- the goal, and what done means;
413- status: `queued`, `working`, `waiting`, `done` or `cancelled`;
414- its budget and spend;
415- its session;
416- its claims;
417- what it produced: issues, pull requests, deploys, doc pages, answers.
418
419Issues and pull requests stay as they are. A task that touches code ends in
420pull requests. A task that is planned work opens issues through the
421planner. A task appears in the issue list only if it produced an issue.
422Each project gets a Tasks tab for the rest.
423
424Assigning an issue to an agent creates a task for it, so every existing
425entry point keeps working:
426
427- assignment;
428- mentions in pull requests;
429- label rules;
430- the planner.
431
432## Coordination
433
434Several agents working at once on the same codebase, docs and deploys will
435collide unless the system prevents it. Today's protection is a list of
436in-flight pull requests in the prompt (`describeInFlight`). It becomes a
437real protocol.
438
439### Claims
440
441Before acting, a task claims what it will touch. Claims are held by a
442coordinator: one Durable Object per workspace, a single writer so that
443grants are atomic. They are shown on the task card.
444
445| Claim | Kind | Example |
446| --- | --- | --- |
447| An issue | Exclusive | Only one task works #412. |
448| A branch | Exclusive | A task's own branch, always. |
449| An environment | Exclusive | Production deploys of `flagon-io/g1t`. |
450| A doc section | Exclusive while editing | "Runbook › Rollback". |
451| Paths in a repository | Shared, with overlap detection | `crates/git/**`. Declared from the plan, then widened automatically to the files the diff actually touches. |
452
453Rules:
454
455- **Exclusive claims** that are already held return the holder. The task
456 either waits (it subscribes and resumes when the claim is released) or
457 asks the holder.
458- **Overlapping path claims** don't block. Both tasks are told who else is
459 in those paths, and the later one must say how it will avoid the
460 conflict. It can sequence after the other, split the work differently, or
461 agree a boundary with the other agent in a thread. The merge queue stays
462 the final referee.
463- **Claims are leases.** They expire if the session dies, and are renewed
464 while the task is alive. A person can break any claim.
465- **People claim too.** Assigning yourself an issue or opening a pull
466 request counts, so agents route around humans as well as each other.
467
468### Talking to each other
469
470Agents message each other through the existing `agent_messages` exchange
471(message, question, handoff). It is widened from pull request numbers to
472task addresses, and it always appears in a visible thread:
473
474- the requesting task's thread when there is one;
475- otherwise the project's channel;
476- otherwise a workspace `#agents` channel.
477
478Agents also get two new kinds:
479
480- **review**: "look at my change before I ask a human";
481- **claim request**: "can I have the deploy lock after you?".
482
483Safety rails:
484
485- **Hop limit.** An agent-to-agent chain started by one human request
486 stops after a set number of hops (default 6) and asks a person.
Merge branch 'worktree-agent-a1398e81ad1a64c5f'487- **Handed only.** In chat, agents are woken by another agent only
488 through a hand-off, never by a mention or because a message appeared in
489 a channel they watch.
Chat and workspace agents: channels, DMs and named agents you talk to490- **Rate limit.** An agent posts at most a set number of messages per
491 thread per minute without a person in the loop.
492- **Shared budget.** Work done for another agent's task is charged to the
493 task that asked for it, so a chain can't escape its budget.
494
495### A lead, when you want one
496
497Any agent can be made the lead of a project or channel. A lead receives
498new work there first, splits it into tasks, hands them to the right agents,
499and reports progress in one place. The built-in planner is a lead template.
500Without a lead, the agent that was asked owns the work and hands off
501pieces itself.
502
503## Docs
504
505### What it is
506
507Docs is the workspace's knowledge base:
508
509- **spaces** (one per team or project, plus a workspace space);
510- holding a tree of **pages**;
511- edited together in real time, with mentions of people, agents, issues,
512 pull requests, channels and other pages.
513
514Every page has history, comments, backlinks and owners.
515
516### Agents and docs
517
518This is where Docs earns its place:
519
Docs index by meaning: passages of every page and project doc, embedded on save and recalled for agents; hybrid search for people520- **Agents read it.** Pages and projects' docs are split into passages
521 and indexed by meaning in Docs' own semantic index, and agents recall
522 the most relevant passages on every reply and session step, only from
523 spaces everyone in the conversation can read. A space can be pinned to
524 an agent as required reading, which recall looks in first.
Docs: a workspace knowledge base people and agents write together525- **Agents write it.** An agent edits pages directly where the space lets
526 agents edit and the person it acts for can edit. Otherwise the edit
527 becomes a **suggestion**: tracked changes a person accepts or rejects
528 inline, the same review loop as a pull request. Every edit is attributed
529 and in the page history.
Chat and workspace agents: channels, DMs and named agents you talk to530- **Pages know what they describe.** A page can cite code: paths, symbols,
531 endpoints, environment variables. When a merged pull request changes
532 something a page cites, the page is marked possibly stale and its owners
533 are notified. If an agent owns the page, it drafts the update.
534- **Conversations become pages.** "Write this up" in a thread makes a page
535 from the thread, linked both ways. Decisions made in chat get a home.
536- **A documenter agent** (a template) keeps a space current. It updates
537 pages after merges, writes release notes and the weekly summary, and
538 turns incident threads into postmortems.
539
540### Docs and repository docs
541
Agents work in sessions: bounded, visible, steerable work spun off from chat, with subagents and colleagues in a tree paid by its root; memory with sources and scopes; routines; a workspace budget for every agent; agents file issues for whoever asked542Code is not docs. A project has no Docs tab: Docs is its own mode, and
543pages are found there, by space, by search, and filtered by the project
544they are about. A page can be linked to projects, so "docs about
545`flagon-io/g1t`" is a filter in Docs, never a page inside Code.
546
Chat and workspace agents: channels, DMs and named agents you talk to547Repository docs (README, `docs/`) stay in the repository and change through
Agents work in sessions: bounded, visible, steerable work spun off from chat, with subagents and colleagues in a tree paid by its root; memory with sources and scopes; routines; a workspace budget for every agent; agents file issues for whoever asked548pull requests, and Code shows them as files, as it does today. Docs mode
549can also list a project's `docs/` folder as a read-only space next to the
550workspace's own spaces, so one search covers both. Editing a repository
551page from Docs opens a pull request.
Chat and workspace agents: channels, DMs and named agents you talk to552
553### How it is stored
554
Docs: a workspace knowledge base people and agents write together555Built (`services/docs`, contract `packages/contracts/src/docs.ts`):
556
557- **Live editing.** Each page is a Durable Object (`PageRoom`) that owns
558 the page's Yjs document, reached over a WebSocket through the site
559 (`/<workspace>/-/docs/live?page=<id>`), speaking the y-protocols sync
560 and awareness messages. The editor is BlockNote (MPL-2.0) on that
561 document. The room keeps the document in its own SQLite storage as a
562 snapshot plus the updates since, and enforces the socket's role: a
563 viewer or commenter never changes the document.
564- **Everything else in D1** (`g1t-docs`): spaces, members and roles,
565 linked projects, the page tree, owners, favorites, views, backlinks,
566 versions, suggestions, templates, files' metadata, and a full-text index
567 (FTS5) over titles and Markdown.
568- **Markdown is derived.** A few seconds after a burst of edits the room
569 saves the page's Markdown rendition to D1: what search indexes, agents
570 read, export writes, and the page shows before its editor loads. Agents
571 write Markdown too; it becomes blocks in the same document, so their
572 changes merge with whatever people are typing.
573- **History** is a version (the Yjs state and its Markdown) at most every
574 10 minutes of editing, and for every agent edit, accepted suggestion and
575 restore, with who made it. Restore copies an old version's blocks in as
576 a new change.
577- **Comments** live in the page's document too (a `threads` map, in the
578 shape BlockNote's comment UI reads), written only through the service,
579 which checks the role; a passage's comment is a mark on its text.
580- **Files** go to R2 (`g1t-docs-files`) behind a small store interface and
581 are served from the usercontent origin at `/docs-files/<key>`, 256
Docs know what code they describe; a project's docs folder in Docs; Docs events; files on any S3 store582 random bits per file. Self-hosted, the same interface keeps them in any
583 S3-compatible store (`DOCS_FILES=s3`, SigV4 by hand: `src/sigv4.ts`).
584- **Citations and staleness** (`src/citations.ts`, `src/staleness.ts`,
585 tables `citations` and `page_changes`). A page cites code from its text
586 (the editor's `citation` chips: a repository, a path or glob, what kind
587 of thing (path, symbol, endpoint, env var) and the commit it was cited
588 at; and any link to `/<owner>/<repo>/blob|tree/<ref>/<path>`), rebuilt
589 on each save, and from its header's "Describes" list. The docs service
590 consumes `g1t-events-docs` (`SUBSCRIBER_DOCS`: `git.push`,
591 `pull.merged`). For a repository some live page cites, it asks what
592 changed as g1t itself (a merged pull request's files from work; a push
593 to the default branch by comparing `before..after` in repos), matches the
594 cited paths, and records one row per page and commit (the push and the
595 pull request of one merge land on the same row; the pull request names
596 it). A new row notifies the page's owners (naming the change only to
597 those who can read the repository), tells open editors to reload, and
598 publishes `doc.page.stale`. The page shows a banner with the newest
599 change the reader can read ("a change you can't see" otherwise); Mark as
600 current (edit role) clears every open row; the sidebar, home and cards
601 show it. Agents get `stalePagesForAgent` (changes only in repositories
602 their person can read) and mark a page current with an edit or
603 suggestion carrying `marks_current`.
604- **Projects' docs** (`src/repo-spaces.ts`, tables `repo_spaces`,
605 `repo_files`, `repo_files_fts`). A member adds a repository they can
606 read; its README and `docs/**/*.md` on the default branch are read with
607 `listFiles` and `rawBlobs` (only blobs whose hash changed), kept as
608 Markdown with FTS, and read again on every push to the default branch.
609 Each reader sees the ones `ReposApi.readable` says they can read. Shown
610 read-only at `/<workspace>/-/docs/repo/<owner>/<name>/<path>`; "Edit in
611 Code" opens the file (Code has no file editor yet; when it has one, or a
612 "propose a change" flow, the button opens that instead).
613- **Events.** `doc.page.created`, `doc.page.updated` (when history
614 records a version: at most every ten minutes of editing, and every agent
615 edit, accepted suggestion and restore, with its authors),
616 `doc.page.archived` and `doc.page.stale`, published with no `repoId` so a
617 page never reaches a repository's timeline or hooks (types in
618 `packages/contracts/src/events.ts` and `g1t_contracts::events`). Not
619 offered to webhooks yet.
Docs: a workspace knowledge base people and agents write together620
621Decided: **not git, for now.** Spaces were planned as git repositories.
622D1 + Durable Objects ships live collaboration, comments, suggestions and
623search without a git write per keystroke burst, and Markdown export (a
624page, or a space as a zip in its tree's folders) keeps the content
Docs know what code they describe; a project's docs folder in Docs; Docs events; files on any S3 store625portable. A project's `docs/` is shown as a read-only space (below);
626editing it from Docs as a pull request is the next step.
Docs: a workspace knowledge base people and agents write together627For self-hosting, the Durable Object, R2 and D1 sit behind the room,
628`FileStore` and SQL; nothing above them depends on Cloudflare.
Chat and workspace agents: channels, DMs and named agents you talk to629
Write a thread up in Docs from chat; cards' buttons in notifications; a session's card stays at the top of its thread630"Write this up" from a thread is built as an ask, not a hidden job: **⋯ →
631Write this up in Docs** (a message's menu, the long-press sheet, the thread
632panel's header) picks a space the person can edit, an optional title and
633the writer (@g1t, or an agent in the conversation), then posts, as the
634person, in the thread: `@g1t write this thread up as a Docs page in <space>
635titled "<title>": what was decided, why, and what's next. Link this thread
636as the source: <thread link>`. The normal agent flow does the rest
637(a session if needed, `create_page`). The page linking back is the agent's
638doing; the thread link it cites is `<conversation path>?thread=<id>`, which
639**Copy link to thread** also gives.
640
Docs know what code they describe; a project's docs folder in Docs; Docs events; files on any S3 store641Not built yet: the documenter agent (it reads `stalePagesForAgent` and
642updates with `marks_current`; the routine and its `doc.page.stale` trigger
643are the agents service's), editing a project's docs from Docs as a pull
Docs index by meaning: passages of every page and project doc, embedded on save and recalled for agents; hybrid search for people644request.
Docs: a workspace knowledge base people and agents write together645
Docs index by meaning: passages of every page and project doc, embedded on save and recalled for agents; hybrid search for people646**The semantic index: how agents find what Docs say.** Docs keeps its
647own index rather than putting pages in `services/context`, because a
648page's access is per space (private and team spaces, listed members),
649which the context hub's per-project privacy can't express. Built
650(`services/docs` src/chunks.ts, src/indexer.ts, src/recall.ts,
651src/vectors.ts):
652
653- **Passages.** A page's derived Markdown, and each projects' docs file,
654 is split by heading into passages of about 300 to 1,500 characters
655 (long sections split on paragraph boundaries, a code block kept whole,
656 tiny sections joined to the next), each with its heading path
657 ("Runbook › Rollback"). They live in D1 (`doc_chunks`, with FTS5 over
658 heading and text in `doc_chunks_fts`), and as vectors in Vectorize
659 (`g1t-docs`, 768 dimensions, cosine), embedded by Workers AI
660 (`@cf/baai/bge-base-en-v1.5`) with the title and heading in front.
661 Vector ids are `<page or file id>:<seq>`; metadata is `workspace_id`
662 and `space_id` (both indexed), `kind`, and `page_id`, or `repo_file_id`
663 and `repo_id`. A projects' docs file's space is its repo space, and its
664 id `rf_<hash of space and path>`.
665- **Indexing never slows editing.** The page's room indexes it half a
666 minute after its Markdown first changes, on its own alarm. Only
667 passages whose text changed are embedded; one that only moved keeps its
668 vector. Creating, renaming, moving and restoring a page index it; the
669 trash, deleting, removing a project's docs and a purged repository take
670 passages out. A project's docs files are indexed after each read (on
671 adding them, and after each push to the default branch).
672- **A cap, and catching up.** At most 200 passages are embedded per
673 workspace per hour (`doc_embed_usage`, which also counts characters as
674 an estimate of tokens); past it the rest are kept for words and a
675 catch-up run embeds them the next hour. Any failure leaves passages for
676 the next save or run; saving never waits on, or fails for, the index.
677- **Backfill.** A run (`doc_index_runs`) indexes a workspace's existing
678 pages and files 20 at a time, as `docs.index` jobs on the docs
679 service's own events queue. It starts by itself the first time an agent
680 recalls from a workspace that has pages but was never indexed, and an
681 owner can start it again (`reindexDocs`).
682- **Recall** (`recallForAgent`, RPC `recall_for_agent`). The spaces an
683 agent may read for the viewer and audience come from the same check as
684 every other agent read (`agentSpaces`, behind `spacesForAgent` and
685 `searchForAgent`); projects' docs only from repositories the viewer can
686 read and, for a DM or private channel, every person in it (a public
687 channel, or more than 20 people: public repositories only). The query is
688 embedded once (kept a minute per isolate) and the index asked for the
689 24 nearest passages within those spaces (by a `$in` filter on
690 `space_id`, or for more than 40 spaces by workspace, 50 of them,
691 filtered after). Passages below a cosine similarity of 0.6 are dropped;
692 at most two per page; required spaces (`spaces`) are asked separately
693 and come first; when meaning finds fewer than `limit` (5 by default, 10
694 at most), passages matching any of the query's words fill in (score
695 0.5). Each passage comes with its page or file, heading, and whether the
696 page is possibly out of date. Archived pages and spaces are never
697 returned: what comes back is checked against D1 as it is now.
698- **People's search** asks the same index: the Docs search page is hybrid
699 (`mode: "hybrid"`), word hits and meaning hits fused by reciprocal rank,
700 each with the passage and heading that matched. Search as you type (page
701 links) stays words only.
702- **Adapters.** Docs talks to an `Embedder` and a `VectorStore`
703 (src/vectors.ts), so a self-hosted g1t could use another model or vector
704 database. Only Cloudflare's are built. Without them, passages are still
705 kept and recall matches words.
Docs know what code they describe; a project's docs folder in Docs; Docs events; files on any S3 store706
Chat and workspace agents: channels, DMs and named agents you talk to707## Chat
708
709Channels, direct messages, threads, reactions, read state and the
710scaled sidebar follow `docs/CHANNELS.md` (data model in its "Data"
711section). The additions:
712
713- **Cards.** Everything that happens is a card in the right channels, and
714 its actions work in place:
715 - tasks, with live status;
716 - pull requests, checks, deploys and incidents;
717 - doc changes;
718 - approvals;
719 - claims, for example "@ship is waiting on the deploy lock held by
720 @oncall".
721- **One timeline.** Replying in a thread about an issue or pull request is
722 commenting on it, so the conversation and the record stay one thing.
723- **Channels link to projects and doc spaces.** A linked channel gets those
724 events, and Code and Docs show it in the side dock (as in the mockup).
725- **Search** covers messages, pages and tasks the viewer can see. This
726 joins the site-wide search, separate from context search.
727
728## Budgets
729
730Spend is limited at four levels. Each level is checked before work starts
731(reserve) and enforced while it runs (settle). These are the same
732mechanisms as today (`docs/SPEND-GUARDRAILS.md`), widened:
733
7341. **Workspace.** The owner's spend limit and the AI credit wallet. A hard
735 stop.
7362. **Agent.** Monthly, and optionally daily, caps on the agent definition.
737 At 80% the agent tells the channel that pays for it. At 100% it stops
738 taking new tasks and finishes nothing past its per-task reserve.
7393. **Task.** A cap per task, defaulting from the agent. The card shows
740 spend against the cap live. Going over is an approval card, not a
741 silent overrun.
7424. **Session.** Today's per-run caps and guardrails: minutes, tokens,
743 network.
744
745Replies are metered as Agent tokens at the same rates as runs. An idle
746agent costs nothing. Usage and the agent's Spend tab break cost down by
747agent, task and model.
748
749## The whole company
750
751Chat is for everyone in the company: support, sales, finance, design and
752leadership as well as engineers. Most of them never change code, and
753agents must not become a way around that. They still get the full value:
754they can ask questions, look things up, hand over customer data, and have
755their requests reach the right team.
756
757### Members without Code
758
759Every workspace member gets Chat, Docs, Agents and the Inbox. Code is a
760per-member switch: **Code access**, on by default, which owners turn off
761for people who don't work on code.
762
763A member without Code access:
764
765- **Sees a rail without Code.** Home shows their channels, DMs, docs and
766 inbox, not projects.
767- **Has no repository access at all.** No repository, issue, pull request,
768 check or deploy page is open to them. The workspace's base permission and
769 team repository grants don't apply. Turning Code access back on restores
770 what their teams and roles give them.
771- **Still sees work reach them in chat.** Cards about issues, pull requests
772 and deploys appear in the channels they're in as summaries: title, state
773 and who is on it. Opening one asks for Code access instead of showing the
774 page.
775- **Can ask agents anything about the product.** Agents explain how things
776 work and what changed, but never show them source code. Owners can tighten
777 this so agents only answer from Docs.
778- **Doesn't count against anything.** There are no seats, so adding the
779 whole company costs nothing until they use agents.
780
781This is stored as `code_access` on the membership (identity service). Every
782service that authorizes a repository checks it, and the site hides Code
783when it is off.
784
785### The asker's access caps the agent
786
787An agent never does more for someone than that person could do themselves.
788
789- **What it does.** An agent acts with the *intersection* of its own scopes
790 and the access of the person asking.
791 - Someone without write access to a repository can't get an agent to
792 change it, whatever the agent's own scopes are.
793 - A task always records who asked. Approvals go to people who hold the
794 access the task needs.
795- **What it says.** An agent answers only with what everyone who can read
796 the reply can see.
797 - In a DM, that is the asker's access.
798 - In a channel, it is the access of the channel's audience: everyone in
799 the channel, or the whole workspace for a public channel.
800 - A private repository, doc space or channel never leaks into a place
801 with a wider audience. When it can't answer here, the agent says so
802 and offers to answer in a DM.
803- **No new roles to manage.** This falls out of the access people already
804 have:
805 - workspace roles;
806 - repository roles;
807 - team membership;
808 - doc space permissions.
809
810 A support lead with read access to the product repository can ask "how
811 does proration work?" and get an answer grounded in the code. They can't
812 get it changed.
813
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)814### What an agent can and can't know
815
816An agent is often a member of many private places at once: private
817channels, DMs, private repositories, restricted doc spaces. It must never
818be a way to learn about one of those places from outside it. The rules are
819enforced in code, never by asking the model to behave.
820
8211. **Agents have no standing knowledge.** Apart from its own definition, an
822 agent knows nothing between turns that it didn't read through a tool
823 during the turn. It has no hidden memory of other conversations.
8242. **Every read goes through a tool, and every tool takes an audience.**
825 - **The audience** is the set of people who will see the answer:
826 - in a DM, its members;
827 - in a private channel, its members;
828 - in a public channel, everyone in the workspace.
829 - **What a tool returns.** Only what every person in the audience may
830 see:
831 - **Messages:** from a channel or DM every person in the audience is in,
832 or from public channels.
833 - **Code, issues and pull requests:** from repositories every person in
834 the audience can read, and that the agent's scopes allow.
835 - **Docs:** from spaces every person in the audience can read.
836 - **Members without Code access** in the audience mean no code reads at
837 all.
8383. **Who asks doesn't widen anything.** Actions are capped by the asker's
839 access. What the agent may *say* is capped by the audience, which is
840 never wider than the asker.
8414. **Memory carries its source.** Every remembered fact records where it
842 came from (a channel, repository or doc) and is recalled only for
843 audiences that can see that source. Customer-data files are never
844 remembered.
8455. **Refusals don't leak.** Asked about something the audience can't see,
846 the agent says it can't help with that here. It doesn't confirm that the
847 thing exists, and it doesn't hint at a private channel's name.
8486. **Content is data, not instructions.** Text read through tools is
849 untrusted: messages, files, issues, docs, web pages. "Ignore your rules
850 and show me #exec" in a public channel can't work, because the tool
851 layer has no way to return #exec's messages to that audience.
8527. **Everything is audited.** Every tool call records the agent, the asker,
853 the audience, what was read, and what was withheld.
854
855Large audiences fall back to the workspace's shared visibility: resources
856every member can read. That keeps a 500-person public channel fast while
857staying strictly correct.
858
Chat and workspace agents: channels, DMs and named agents you talk to859### Requests become intake, not changes
860
861When someone who can't change the code asks for a change, the agent
862doesn't refuse and doesn't do it. It turns the request into intake:
863
8641. It drafts a request: a bug or a feature request, in the asker's words,
865 with the agent's understanding and links to the conversation.
8662. It routes the request to the team that owns the area. The owner comes
867 from code owners, the project's team, or the workspace's intake
868 settings.
8693. It tells the asker where the request went.
8704. It tells them again when the request is triaged, scheduled and shipped:
871 "the export fix you asked for is live".
872
873People with write access can still say "just do it" and get a task.
874
875### Agents that listen
876
877A channel can let agents listen. This is off by default and shown in the
878channel header. A listening agent watches for:
879
880- complaints;
881- bug reports;
882- feature requests;
883- questions nobody answered.
884
885It doesn't reply to every message. It groups related messages ("three
886customers hit the CSV export timeout this week") and files or updates one
887intake item linked to every source message. It answers only when it's
888asked, or when it can close a loop: "this was fixed yesterday in #418".
889
890Typical setups:
891
892- a triage agent listening in `#support`, `#sales` and `#feedback`;
893- an on-call agent in `#incidents`;
894- a docs agent that notices the same question asked twice and writes the
895 page.
896
897### Files and customer data
898
899People upload whatever their work needs: spreadsheets, contracts, exports,
900screenshots. Agents work with these, under rules the workspace sets:
901
902- **Classification.** Every file has a level:
903 - Public;
904 - Internal (the default);
905 - Confidential;
906 - Customer data.
907
908 The uploader sets the level. An agent may suggest raising it when it
909 sees personal data.
910- **Which models may see it.** Each level lists the providers allowed to
911 process it. For example, customer data may go only to the workspace's
912 own provider with zero retention. An agent that may not send a file to
913 any allowed model says so; it never quietly skips the file.
914- **Memory.** Agents never write customer data into their memory, and
915 never put it into issues, pull requests or channels with a wider
916 audience than the file's.
917- **Retention.** Each level has a retention period, and deletions are
918 final.
919- **Audit.** Every time an agent reads a Confidential or customer-data
920 file, the audit log records it with the task and the person who asked.
921
922### Not just code
923
924Agents work across the company's tools, not only the repository, through
925MCP connectors the workspace adds (a CRM, a help desk, a data warehouse).
926The same rules apply:
927
928- the asker's access caps the agent;
929- the channel's audience caps what it says;
930- classification decides which models see the data.
931
932## Working from another chat app
933
934Some companies will keep their existing chat app for the whole
935organization. Often only the engineers use g1t, or nobody does at first.
936That has to be a good experience, not a punishment. The agents are the same
937agents wherever you talk to them, and the work lands in the same place.
938g1t earns the move over time by being better, never by making the
939integration worse.
940
941User-facing text calls this "the chat app integration" and, on its
942integration page, by the app's own name. Marketing never compares the two.
943
944### One agent, many places
945
946Where a conversation happens is just a *surface*. Each surface has an
947adapter in `services/integrations`:
948
949- g1t Chat;
950- a connected chat app;
951- later, email.
952
953Everything else is shared, whichever surface a message arrived on:
954
955- the agent;
956- its memory;
957- its tasks;
958- its budget;
959- its claims;
960- the audit log.
961
962- **Every external conversation has a home in g1t.** When an agent is used
963 in an external channel or DM, g1t keeps a linked conversation: the
964 messages the agent was given or posted, with permalinks back. Tasks,
965 issues and pull requests link to it like any thread. "Why was this
966 changed?" leads back to the external thread. The agent's memory learns
967 from it the same way.
968- **A task started in one place can be followed from either.** A task
969 started in the external app posts its updates there. Its live card,
970 session and diff are one click away in g1t. Steering works from both:
971 - a reply in the external thread;
972 - a message on the task in g1t.
973- **Approvals settle everywhere.** An approval is a button in the external
974 message, a card in g1t and an item in the inbox. Acting in any one
975 settles all three.
976
977### The app in their chat
978
979The workspace installs one app into its external chat workspace from
980Integrations. The app's name is g1t.
981
982- **Each agent speaks as itself.** Messages are posted with the agent's
983 name and avatar.
984 - Mention the app and name the agent: "@g1t ask @reviewer to look at
985 #418".
986 - Or use a shortcut per agent: `/g1t reviewer …`.
987 - In the app's DM, a picker chooses which agent you are talking to.
988- **Invite it to a channel** to let agents answer there when mentioned.
989 Turn on listening to let a triage agent group feedback, the same as in
990 g1t (see [Agents that listen](#agents-that-listen)).
991- **Cards render natively** in the external app: tasks, pull requests,
992 checks, deploys and approvals, with buttons. "Open in g1t" goes to the
993 full view.
994- **Bridged channels** (optional). Link an external channel to a g1t
995 channel and the two mirror each other: messages, threads, edits and
996 reactions. Engineers stay in g1t while the rest of the company stays
997 where it is, in one conversation. Each message shows where it came from.
998
999### Who is asking
1000
1001The rules from [The whole company](#the-whole-company) apply unchanged.
1002They depend on knowing who the person is.
1003
1004- **Linked people.** The first time someone talks to an agent from the
1005 external app, the agent asks them to link their account: one click to
1006 sign in to g1t. From then on they act with their own g1t access.
1007- **Unlinked people** are treated as members without Code access:
1008 - they can ask questions and get answers from Docs;
1009 - their change requests become intake;
1010 - they never get code changed, or see code an agent wouldn't show
1011 them.
1012
1013 Owners can require linking before an agent answers at all.
1014- **Audience.** In an external channel, the audience is everyone in that
1015 channel. Agents answer there with only what all of its linked members
1016 can see, and treat unlinked members as having no Code access. Private
1017 g1t content stays out of external channels unless an owner allows it
1018 for that channel.
1019- **Data.** Messages from the external app are stored only as part of
1020 linked conversations, under the workspace's retention and classification
1021 rules. Files shared there follow the same model-routing rules as
1022 uploads.
1023
1024### Why people move over anyway
1025
1026The external app gets the agents, the answers and the approvals. g1t
1027keeps what only it can do:
1028
1029- live task cards with sessions and diffs you can steer;
1030- the one timeline where replying is commenting on a pull request;
1031- Docs side by side with the conversation;
1032- presence that shows what every agent is doing;
1033- no limit on history or seats.
1034
1035These are pointed to in context with "Open in g1t", never with nags.
1036
1037### Build
1038
1039The adapter interface comes with the agents service now. Replies read a
1040conversation and post through a surface port, so the external app is one
1041more adapter later, not a rewrite.
1042
1043The app itself ships after Chat and tasks, in this order:
1044
10451. install;
10462. agents speaking as themselves;
10473. account linking;
10484. linked conversations;
10495. approvals;
10506. bridged channels;
10517. listening.
1052
1053## Model routing
1054
1055Nobody picks a model to get work done. g1t routes each step of an agent's
1056work to the tier it needs, using today's `AGENT_ROUTING`:
1057
1058| Step | Tier |
1059| --- | --- |
1060| Chat replies, triage | small |
1061| Implementation, routine review | large |
1062| Planning, hard reviews, retries after a failure | frontier |
1063
1064As today, routing steps up after failures and steps back down when the
1065cheaper tier worked.
1066
1067The agent definition limits the routing; it does not replace it:
1068
1069- **Floor.** For example, "never below large" for a reviewer that must be
1070 careful.
1071- **Ceiling.** For example, "never frontier" for a cheap triage agent.
1072- **Providers.** Which models it may use: g1t's hosted models, the
1073 workspace's own providers from Integrations (Anthropic, OpenAI,
1074 compatible endpoints), or both. When the workspace has its own providers,
1075 each tier maps to a provider and model in the workspace's routing
1076 settings. An agent restricted to the workspace's own keys never touches
1077 g1t's.
1078- **Pinned model.** An advanced escape hatch for own endpoints. Not shown
1079 by default.
1080
1081Every step records the model that ran. It is shown in the session and on
1082the agent's Spend tab, so routing is visible without anyone having to
1083choose.
1084
1085## Pricing
1086
1087This follows the standing pricing rule: measured cost plus a modest,
1088uniform overhead, and no seats.
1089
1090| What | How it is charged |
1091| --- | --- |
1092| People chatting: messages, threads, reactions, read state, live delivery | Included on every plan, the free plan too. It costs very little (a message is a few row writes and one Durable Object request; idle sockets hibernate). History is never cut off. It is still metered raw, so the daily reconciliation sees the real cost. |
1093| Docs: pages, editing, history | Included on every plan, like chat. |
1094| An agent replying in chat | Agent tokens from the AI credit wallet: provider price plus the g1t agent rate. Charged to that agent's budget and, inside a task, to the task. |
1095| An agent's sessions | Agent tokens as above, plus sandbox time at cost +20%. |
1096| An agent's model calls on the workspace's own provider | The provider bills the workspace directly. g1t charges the agent rate only. |
1097| Files in chat and docs | The storage meter (served from g1tusercontent.com), at cost +20%. |
1098| Calls and huddles (later) | Media relay at cost +20%. |
1099| Idle agents | Nothing. |
1100
1101Free workspaces get chat and docs with protective caps: a file storage
1102cap, and no agents until the workspace buys AI credit. That keeps the free
1103plan free of compute.
1104
1105## Rails, summarized
1106
1107| Concern | Decided by |
1108| --- | --- |
1109| What an agent can see | Its scopes, and the channels and spaces it was invited to. An invite grants read, never write. |
1110| What it can change | Its scopes, then rulesets, branch protection and environment rules. |
1111| When it must ask | Its autonomy settings plus policy. Approvals are cards in the thread and items in the inbox; acting in either settles both. |
1112| What it can spend | Workspace, then agent, then task, then session. |
1113| Who did what | The audit log. Every action records the agent, its definition version, the task, and the person who asked. |
1114| Not colliding | Claims, the coordinator and the merge queue. |
1115| Not looping | Hop limits, addressed-only replies, rate limits, shared budgets. |
1116
1117## Shell
1118
1119A rail on the left, as in the mockups: Home, Code, Chat, Docs, Agents,
1120Inbox, then the account.
1121
One kind of access token; presence and status; usernames keep their case; the tour is a miniature of the real app; icons for password managers1122- The workspace's avatar (its switcher) sits at the top of the rail in the
1123 top bar's line: the same height, rule and colour as the top bar, so it
1124 reads as part of it, as the mode's sidebar heading does.
1125- The landing page's product tour (`components/product-tour.tsx`) is a
1126 miniature of this shell, not a different one: the same rail and order,
1127 each mode's sidebar with its real sections and words, the same top bar,
1128 the app's own cards and avatars. A change to the shell changes the tour
1129 in the same change.
1130
Chat and workspace agents: channels, DMs and named agents you talk to1131- Each mode has its own sidebar, and no mode's sidebar lists another mode's
1132 things.
1133- Code keeps today's sidebar.
1134- A side dock shows the current project's or page's linked channels in Code
Agents work in sessions: bounded, visible, steerable work spun off from chat, with subagents and colleagues in a tree paid by its root; memory with sources and scopes; routines; a workspace budget for every agent; agents file issues for whoever asked1135 and Docs, and the linked project and docs in Chat. The dock links out to
1136 Docs; Code never grows a Docs tab of its own.
1137- g1t's own public pages (a profile at `/u/<name>`, Explore, Search, the
1138 trust pages) belong to no workspace: `modeOf` calls them `site`, no mode
1139 is lit and no mode's sidebar opens; the page has the width. A visitor
1140 sees a profile, Explore and Search in the public frame (top bar and
1141 footer, no sidebar; `usesAppShell` in `lib/chrome.ts`). A project page
1142 keeps its sidebar for everyone, since its menu is how you move around it.
Chat and workspace agents: channels, DMs and named agents you talk to1143
1144Concretely:
1145
1146- `shell.tsx` gains a `mode` above today's drill-down stack;
1147- `workspace-nav.ts` gains a `ModeKey`;
1148- each mode keeps its own `SidebarKey`s.
1149
Cards you act on in chat; agents comment and review as themselves; names shown cleanly; commits on the calendar1150## Cards
1151
1152What agents post in chat is something you act on where you read it, not a
1153link to somewhere else. A card has a title, a state, a short preview,
1154labelled facts, and up to five actions. Links just open a place; every
1155other action goes to the service that owns the card (`owner`, today
1156`agents`), which checks the person may, acts as them, and updates the card
1157in place for everyone in the conversation.
1158
1159| Card | Actions |
1160| --- | --- |
1161| A session, working | **Message** (it reads it at its next step), **Stop** (asks first), **Open** |
1162| A session at its cap | **Approve more** with the new cap inline (owners), **Stop**, **Open** |
1163| A session, done | Its report as the preview; **Follow up** (it picks up again with its context), **Open** |
1164| A draft issue | **File issue** (filed as whoever presses it, only where they can read), **Discard** (whoever asked, or an owner) |
1165
1166Rules, in code: chat checks the person can read the conversation and that
1167the card offers the action; the owner checks everything else. An action
1168that needs a value (an amount, a line of text) asks for it inline. Agents
1169never file, approve or stop anything on their own through a card.
1170
Write a thread up in Docs from chat; cards' buttons in notifications; a session's card stays at the top of its thread1171**From a notification.** A notification about a card carries
1172`card: { channel_id, message_id, actions }` (`FeedNotification.card`), and
1173pressing one of those actions sends the same `card_action` as the card.
1174
1175- Chat attaches it to any notification about a message whose card has an
1176 owner and something to press, and an agent's card that asks someone to
1177 act (a primary action: File issue, Approve more) notifies whoever asked
1178 the agent as `agent_waiting`, if they are in the conversation.
1179- The agents service sends `approval` (a session at its cap) with the
1180 session card's place and actions.
1181- The toast shows the actions (amounts inline, confirmations inline); the
1182 inbox panel lists **Waiting on you in chat**: the newest notification per
1183 card from the last day, until it is acted on in that tab.
1184- A push has buttons only for actions with no input (two at most: Stop,
1185 Open, File issue, Discard). The service worker posts `card_action` with
1186 the person's session and shows the answer as a notification.
1187- A thread's first page carries `root`, the message it is under, however
1188 long the thread is, so a session's live card stays at the top of its
1189 thread panel.
1190
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)1191## Live notifications
1192
1193A DM has to reach someone wherever they are in g1t, not only inside Chat.
1194Nothing polls: one socket per tab carries everything live.
1195
1196- **One feed per person** (`services/notify`): a Durable Object named by
1197 their user id, holding a socket per open tab (WebSocket hibernation), their
1198 last 100 notifications, unread counts per conversation, push subscriptions
1199 and preferences, in its own SQLite storage.
1200- **The socket.** Every page of a signed-in person opens
1201 `wss://<site>/-/live?workspace=<slug>`. The site checks the session, reads
1202 the workspace's counts from chat and the inbox, and forwards the upgrade.
1203 The feed sends `counts` (`chat_unread`, `chat_mentions`, `inbox_unread`,
1204 `per_channel`) on connect and after every change, so the rail's badges,
1205 the Chat sidebar's counts and the tab's "(3) …" all move at once in every
1206 tab. A tab pings every 25 s and says when it gains or loses focus; while
1207 the socket is down it reconnects with jittered backoff, and only then does
1208 the Chat sidebar fall back to a slow refresh.
1209- **Who is told.** Chat tells the feed of every message: everyone in the
1210 conversation has their counts moved, and a notification goes to everyone
1211 else in a DM, to whoever is @mentioned, and to the people in a thread
1212 that gets a reply (unless they muted the conversation; DMs and mentions
1213 come through a mute). Reading a conversation, or writing in it, sets its
1214 counts in every tab. The events service tells the feed of every new inbox
1215 item (agents waiting on you, reviews asked of you, mentions), and of the
1216 inbox count after items arrive or are marked anywhere: the site, the API
1217 or MCP.
1218- **Toasts.** Bottom right on a computer, along the top on a phone; three
1219 at most, six seconds each, held while the pointer or keyboard is on them;
1220 a DM or mention has a reply box. None for the conversation already open.
1221 An optional soft sound, off by default.
1222- **Browser push** (Web Push, VAPID): sent only when no tab is in front of
1223 the person. g1t never asks for permission on load: after the first DM or
1224 mention toast it offers "Get notified when someone messages you", once;
1225 a no is kept. The service worker (`public/sw.js`) shows one notification
1226 per conversation and, on a click, focuses an open tab or opens one.
1227- **Preferences** (Settings → Notifications): everything, direct messages
1228 and mentions (the default), or nothing, with a level per workspace; this
1229 browser's notifications on or off; the sound; a test.
1230
One kind of access token; presence and status; usernames keep their case; the tour is a miniature of the real app; icons for password managers1231## Presence and status
1232
1233Whether someone is here, and what they say about themselves, shown
1234wherever a person is: DMs in the Chat sidebar, cards over names, member
1235lists, the People page, after their name on their messages. Live over the
1236same socket as notifications; nothing polls.
1237
1238- **Presence** is worked out by the person's feed (`services/notify`,
1239 `src/presence.ts`) from their open tabs: `active` while any tab has had
1240 input in the last 10 minutes (each tab says when it goes idle or comes
1241 back, in its `state` frame), `away` when every tab is idle or they set
1242 themselves away, `offline` when no tab is open (after 30 seconds, so a
1243 reload or a switch of workspace is not leaving).
1244- **Status**: an emoji, a few words and `clear_at`. Presets: In a meeting,
1245 Commuting, Focusing, Out sick, On vacation. Clear after 30 minutes, an
1246 hour, 4 hours, today, this week, never or a chosen time (the browser
1247 turns these into an instant in the person's own time).
1248- **Do Not Disturb** (`dnd_until`): the feed toasts and pushes nothing until
1249 then; counts and the inbox still move. 30 minutes, an hour, or until 9
1250 tomorrow morning.
1251- **Source** (`manual`, `calendar`, `integration`): integrations will set a
1252 status through `set_presence` with their own source. One set by hand is
1253 never replaced or cleared by them.
1254- **Where it is kept.** In the person's feed (their Durable Object's
1255 SQLite), not identity's D1: it is per-person live state like the feed's
1256 sockets and preferences, the feed must read Do Not Disturb on every
1257 notification, and expiry is an alarm on that one object. Nothing about it
1258 needs a query across people.
1259- **Who hears.** One room per workspace (`src/room.ts`, a Durable Object
1260 named by its slug) keeps every member's latest word. A feed tells the
1261 rooms of the workspaces its person belongs to (the site sends the list
1262 with each socket) whenever how they show changes, and when a status or
1263 Do Not Disturb runs out (an alarm). The room passes it to the feeds of
1264 the members online now, which send it to their tabs open in that
1265 workspace; a tab connecting reads everyone from its workspace's room.
1266- **Wire.** `FeedEvent` gains `presence` (`people`, `full`) and `me`;
1267 `FeedClientFrame`'s `state` gains `idle`; `FeedSeed` gains `workspaces`.
1268 RPCs: `presence` and `set_presence` (`NotifyApi.presence`,
1269 `NotifyApi.setPresence`). The site's `POST /-/notify` takes
1270 `intent: "presence"` with a `PresenceChange`, always as `manual`.
1271- Agents keep their own status (idle, working, out of budget); none of this
1272 applies to them.
1273
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)1274### Desktop app
1275
1276An Electron shell that loads the web app, so it is the same g1t, plus what
1277only a native app can do: native notifications, the dock or taskbar badge,
1278a tray icon with the unread count, `g1t://` deep links, a global shortcut
1279to bring it forward, and auto-update. Its preload script exposes
1280`window.g1tDesktop` (`notify`, `setBadge`, `openUrl`, `onNavigate`;
1281the shape is in `apps/web/app/lib/notify-client.ts`). The web client
1282delivers everything through a `NotificationSink` and prefers the bridge
1283when it is there: toasts while the window is in front, native
1284notifications while it is not, and no Web Push.
1285
Integrations are a directory of connectors, for a workspace and for each person1286## Integrations directory
1287
1288Built 2026-10-09. One catalog, `packages/contracts/src/connectors.ts`
1289(`@g1t/contracts/connectors`), lists every connector: id, name, category,
1290one-line description, `scopes` (`workspace`, `personal`, or both, with a
1291`personal` override for what differs), `status` (`available` or `soon`),
1292`href` per scope for available ones (`:workspace` is filled in), capability
1293tags, and the integration `provider` behind it. Adding a connector, or
1294moving one from soon to available, is an edit there plus its setup page.
1295
1296Two pages draw from it with the same component (`components/connectors.tsx`):
1297the workspace's `-/integrations` ("for everyone in <workspace>", owners
1298manage) and `/settings/integrations` ("just for you, in every workspace").
1299The workspace's setup pages for providers moved to
1300`-/integrations/{models,alerts,trackers}`. Connected state comes from
1301integrations (connections and their `last_error`), the GitHub App's
1302installations, workspace webhooks, GitHub sign-in and OAuth grants.
1303
1304**Ask for this** on a Soon card is a prefilled email to support for now; a
1305stored request (workspace, connector, person) can replace it without
1306changing the cards. The Calendar connectors will set presence with
1307`source: "calendar"` (Presence and status, above).
1308
Chat and workspace agents: channels, DMs and named agents you talk to1309## Services
1310
1311Following the architecture principles: separate services, interfaces in
1312`packages/contracts` and `crates/contracts`, side effects through
1313`services/events`.
1314
1315| Service | Owns |
1316| --- | --- |
One kind of access token; presence and status; usernames keep their case; the tour is a miniature of the real app; icons for password managers1317| `services/notify` (new, TS) | One feed per person: live notifications and unread counts over each tab's socket, browser push (VAPID), preferences, presence, status and Do Not Disturb; one presence room per workspace. Durable Object SQLite storage, no D1. |
Chat and workspace agents: channels, DMs and named agents you talk to1318| `services/chat` (new, TS) | Channels, members, messages, threads, reactions, read state; one Durable Object per channel for live delivery with WebSocket hibernation. |
1319| `services/agents` (new, TS) | Agent definitions and versions, the desk Durable Object per agent, the coordinator Durable Object per workspace (claims), replies (the no-sandbox model loop over g1t MCP). |
Docs know what code they describe; a project's docs folder in Docs; Docs events; files on any S3 store1320| `services/docs` (new, TS) | Spaces, pages, the page Durable Object (Yjs), history, suggestions, comments, templates, search (FTS5), files (R2, or S3 self-hosted), citations and staleness (queue `g1t-events-docs`), projects' docs folders, `doc.page.*` events. |
Chat and workspace agents: channels, DMs and named agents you talk to1321| `services/work` | Tasks and task links beside `agent_runs` (which gains `task_id`); `agent_messages` widened to task addresses. |
1322| `services/runner` | Resumable sessions: transcript save and restore in R2, `--resume`, the steer hook reading task threads, claims checked at start and widened from diffs. |
1323| `services/context` | Indexes doc pages and channel decisions; serves them to replies and sessions. |
1324| `services/events` | New event types (`chat.message.created`, `task.*`, `claim.*`, `doc.page.*`); inbox reasons for mentions, approvals, suggestions, stale pages. |
1325| `services/billing` | Agent-level budgets in the reserve/settle contract; Agent-token metering for replies. |
1326
1327Every Cloudflare primitive used here stays behind an adapter, so
1328self-hosting keeps working:
1329
1330- Durable Objects;
1331- WebSockets;
1332- R2;
1333- D1.
1334
1335## Build order
1336
1337Each step ships something usable.
1338
13391. **Contracts.** Agent definition and version, task, claim, channel,
1340 message, card, page; RPC methods; event types.
13412. **Agents as members.** `services/agents` with definitions, templates
1342 (planner, implementer, reviewer, triage, documenter) and the Agents mode
1343 list and profile. Assigning an issue to a workspace agent works through
1344 today's runner, as a task.
13453. **Shell.** The rail and modes; Chat, Docs and Agents sidebars (empty
1346 states where needed); the dock.
13474. **Channels.** `services/chat`, live delivery, threads, reactions, read
1348 state, mentions into the inbox.
13495. **Talk to an agent.** The desk; replies with no sandbox; DMs and
1350 mentions; personality applied.
13516. **Tasks and resumable sessions.** Tasks from chat; live task cards;
1352 sessions saved and resumed; steering from the thread; opening a session
1353 and taking it over; capacity and the queue.
13547. **Budgets and approvals.** Agent and task budgets in billing; approval
1355 cards that settle with the inbox.
13568. **Coordination.** The coordinator; claims on issues, branches,
1357 environments and paths; overlap negotiation in threads; widened
1358 `agent_messages`; hop and rate limits; leads.
13599. **Docs.** Spaces, pages, live editing, history, comments, mentions;
1360 indexed by context; agents reading.
136110. **Agents in Docs.** Suggestions, citations and staleness, "write this
1362 up", the documenter template, repository docs as spaces.
136311. **Create in chat, skills and triggers.** The draft-card flow; skills
1364 from a walkthrough; schedules, events, watched channels and webhooks as
1365 triggers.
136612. **Scale and reach.**
1367 - Team sections, browse, muting, and search across messages, pages and
1368 tasks.
1369 - Installable desktop and mobile apps.
1370 - Bridges for teams that keep another chat tool: one app per workspace,
1371 a handle per agent.
1372
1373Steps 2, 5 and 6 are the turning point: from then on, talking to an agent
1374is the everyday way work starts. Step 8 lets a workspace run many agents at
1375once safely. Step 10 is where Docs stops being a wiki and becomes the
1376thing that keeps itself true.
1377
1378## Decisions to confirm
1379
1380- **Model choice on the agent.** Per-agent preferred models, set when the
1381 agent is defined, with Auto as the default. Choosing a model when
1382 assigning work stays out.
1383- **Replies without a sandbox.** Chat answers come from a Worker-side model
1384 loop, not a container. Recommended for speed and cost.
Docs: a workspace knowledge base people and agents write together1385- **Docs stored in git.** Decided against for now: D1 + a Durable Object
1386 per page, with Markdown export (see "How it is stored").
1387- **Agent edits to docs** are suggestions by default. Built: a space's
1388 managers can set "Agents in this space" to edit directly, which applies
1389 only where the person the agent acts for can edit.
Chat and workspace agents: channels, DMs and named agents you talk to1390- **Default capacity** of 3 concurrent tasks per agent, and a hop limit
1391 of 6.

This file's history is long; its oldest lines are credited to the oldest commit read.