Skip to content
1,608 linesCodeBlameRaw
1# g1t plan
2
3g1t is where people and agents ship software together: a git platform built on Cloudflare Workers and Artifacts for
4the "Build the Next-Gen Git Platform on Cloudflare" competition.
5
6- Submission closes **October 14, 2026, 11:59 PM PDT**: a 5–10 minute demo
7 video, this repository (MIT) and run instructions.
8- Judging: 50% originality and quality of the prototype for agent-oriented
9 collaboration; 25% multi-agent concurrency, coordination, context
10 preservation, review and conflict handling; 25% ease of use.
11
12## The point
13
14**g1t is where a team of agents ships code, with the people they work for.**
15
16Hosting git is table stakes, and g1t does it the familiar way: issues,
17branches, pull requests, review, protected branches, people working by hand.
18None of that is the selling point. The selling point is the layer above it,
19which no forge has: **you hand g1t an outcome, and a fleet of agents converges
20it onto `main`, coordinating with each other and with you, with every decision
21on the record.**
22
23Three things only g1t does, and every feature should serve one of them:
24
251. **Outcomes, not pull requests.** The unit people work in is "make onboarding
26 work offline", not branch #4012. A brief becomes a plan of issues with
27 dependencies; agents take them as they unblock; people steer the outcome
28 and see it converge, rather than stopping at the pull request.
292. **Agents that work as a team.** Agents know what the others are doing, file
30 what they find instead of widening their change, ask and answer each other
31 through the forge, and defer to people. Many agents on one codebase without
32 a human refereeing collisions.
333. **`main` that only ever moves forward.** Every change lands through checks
34 in the combination it will live in (the merge queue), failures go back to the
35 agent that wrote them, and any line can answer "why is this here?"
36
37## Product model
38
39g1t keeps the two things every engineer already knows, issues and pull
40requests, and changes the assumption underneath them. A forge built for
41people expects a few changes in flight, each watched by its author. g1t
42expects dozens of agents working at once across a project, each on its own
43issue, all of which have to land on `main`. A person assigns an issue to
44g1t and chooses nothing else: not how many agents, and not which
45model. An issue can still collect more than one pull request (a second
46attempt, or someone's own agent alongside g1t's), and when it does the
47issue records which one was taken.
48
49| Concept | What it is |
50| --- | --- |
51| **Issue** | What should change in a repo: a bug, a feature, a question. Opened by a person, an agent or an integration such as an error tracker. Carries labels, a description that may say what done means (a Definition of done: context, never a gate), comments, and every pull request made for it. What a merge needs is the default branch's required checks: workflow statuses, the same for people and agents. |
52| **Pull request** | A proposed change in its own Artifacts fork, made by an agent or a person, usually for an issue. Any number can be open for one issue. Starts as a draft; marked ready; merged or closed. |
53| **Session** | The agent's full context for a pull request: prompt, messages, tool calls, cost. Stored with the pull request and linked from every commit it produced. |
54| **Compare view** | Every pull request for an issue side by side with diff, check results, conflicts against main and against each other, and a reviewer agent's summary. |
55| **Merge** | A person or a policy picks a pull request. A per-repo merge queue lands it. The issue closes, recording which pull request resolved it; the others for that issue close as superseded, or are rebased by their agents when the issue is kept open. |
56
57Issues and pull requests share one sequence of numbers per repository, so
58`#12` names exactly one of them.
59
60Features that fall out of the model:
61
62- **Why-blame.** Click a line and see the prompt and reasoning that produced
63 it, not only the commit.
64- **Overlap radar.** Pull requests that touch the same files are flagged
65 while the agents are still working, and the agents are told.
66- **Live lanes.** Watch every pull request progress in real time.
67
68## Why issues and pull requests, not something new
69
70An earlier version of this plan merged the two into one new object, an
71"issue" holding "pull requests". That was wrong, for three reasons.
72
73- **Issues come from everywhere.** People file them, agents file them, and
74 Sentry files them. Most are never worked on by whoever opened them. They
75 need their own life: labels, triage, discussion, closing as not planned.
76- **"Which change did we take?" needs two objects.** When five agents each
77 propose a change, the answer has to be recorded somewhere other than the
78 five proposals. On g1t it is on the issue: `resolved by #14`.
79- **Nobody should have to learn a word to use the product.** An engineer who
80 has used any forge can use g1t on the first day, and finds the agent
81 features where they would look for them.
82
83What g1t adds to the familiar pair:
84
85- **Several pull requests per issue is supported**, not an accident. It
86 is the exception, for a second attempt or a competing one, but when it
87 happens the issue's page lists them with their state, and merging one
88 closes the issue with that pull request recorded and the others marked
89 superseded.
90- **A pull request can be part of the work.** Merging with "keep the issue
91 open" leaves the issue and its other pull requests alone.
92- **Every pull request has a fork and a session.** See
93 [forks and branches](https://docs.g1t.sh/concepts/forks/).
94- **Labels need no setup.** A repository starts with the default labels
95 (`bug`, `documentation`, `enhancement`, `question`, `dependencies`,
96 `security` and the rest), each with a color and a description, on issues
97 and pull requests alike; someone with Triage makes a new one as they use
98 it. **Milestones** gather issues and pull requests under a goal and a
99 due date. Pull requests can merge into any branch; the default branch's
100 protection holds only for those into it.
101- **The developer path is unchanged.** Push a branch, open a pull request
102 from it, get review, merge. Agents get a fork per pull request instead.
103- **Both paths meet at `main`.** The same landing rules apply to a person's
104 pull request and an agent's.
105
106## Converging on main
107
108Twelve issues started together will finish at different times and touch
109overlapping code. Getting them all into `main` without a person refereeing
110is the hard part, and it is handled in four places.
111
1121. **Before work starts: plan the overlap away.** A project is a graph of
113 issues. A planner agent can split a large goal into issues, predict
114 which files each will touch, and add a dependency where two would collide,
115 so one starts from the other's result instead of from `main`.
1162. **While agents work: overlap radar.** Each pull request's changed files and
117 symbols are tracked as it pushes. When two pull requests from different issues
118 enter the same area, both agents are told what the other is doing there.
1193. **When `main` moves: the author resolves.** Every open pull request is
120 trial-merged against the new `main`. A clean merge updates the pull request
121 silently. A conflict resumes that pull request's agent with its original
122 session and the incoming change, so the conflict is resolved by the agent
123 that wrote the code and still knows why.
1244. **At landing: a speculative queue.** Approved pull requests enter the
125 repo's queue. g1t builds the combined states (`main`+A, `main`+A+B, …) and runs
126 their checks in parallel. Pull requests land in order as their combined state
127 passes; one that fails is ejected back to its agent and the states behind
128 it are rebuilt. `main` only ever receives a state that passed.
129
130Landing can be fully automatic: a repo policy such as "checks pass and the
131reviewer agent approves" merges without a person.
132
133## Agents aware of each other
134
135Each repo keeps a live **work registry**: for every running pull request, its
136issue, a running summary of what it has done, and the files and symbols it
137has touched or plans to touch. Agents use it through MCP tools; g1t also
138acts on it without being asked.
139
140- **Before starting.** When an issue is opened, or an agent is about to
141 begin a task, g1t searches open issues and running pull requests for the same
142 goal (by meaning, not wording) and for the same area of code. If a match
143 exists the agent is told who is on it and how far along, and chooses: join
144 as a deliberate racer, wait for the result, or drop the task. Duplicate
145 issues are offered for merging.
146- **Finding out-of-scope work.** An agent that discovers something outside
147 its issue asks the registry who works there. If another pull request owns that
148 area, it **hands off**: a note, the relevant excerpt of its session, and
149 optionally commits the receiver can take. If nobody does, it opens a child
150 issue instead of widening its own change.
151- **Asking.** An agent can put a question or a request to another pull request.
152 The receiver gets it at its next turn.
153- **Waiting.** An agent that needs another pull request's result parks itself.
154 Its sandbox sleeps, spend stops, and it resumes from the new state when
155 that pull request merges.
156- **Agents that do not cooperate.** For pushes from tools that never call
157 these tools, g1t compares the pushed change against running pull requests and
158 flags near-duplicates itself.
159
160Every handoff, question and wait has a state (offered, accepted, declined,
161done), appears in the timeline, and is visible to people. A handoff declined
162twice, or two agents passing work back and forth, goes to the "needs you"
163inbox.
164
165## Review at scale
166
167Cloudflare's brief asks "how do you review everything they produce?". With
168hundreds of agents, a person cannot read every diff, so review is by
169exception.
170
171- **Evidence, not diffs.** Every pull request carries a proof bundle: checks run
172 and their output, a preview URL, a plain-language summary, and the
173 behaviour that changed.
174- **Two agent reviewers.** One reviews the change against the issue. A
175 second is adversarial: it tries to break the change and reports what it
176 found.
177- **Risk tiers.** Each change is scored from what it touches, how large it
178 is, and how the reviewers ruled. Low risk merges on policy; high risk goes
179 to a person with the evidence already assembled.
180- **Trust is earned.** An agent's record on a path (merged, reverted, caught
181 by review) raises or lowers the tier its changes land in.
182- **Sampling.** A share of auto-merged changes is sent to a person anyway,
183 to keep the policy honest.
184
185## Rethinking the git primitives
186
187- **No branches for agents.** A pull request is a fork; `main` is the only
188 long-lived line. There is nothing to name, clean up or go stale.
189- **Projected main.** New pull requests start from `main` plus everything already
190 in the landing queue, so they are built on the state they will land on.
191- **Structural merge.** The merge engine merges by syntax tree, not by line,
192 for supported languages. Two agents adding different functions to the same
193 file do not conflict.
194- **Forkable sessions.** A session can be forked at any turn: the code as it
195 was at that moment plus the conversation up to it, continued with a
196 different instruction. Branching applies to the reasoning as well as the
197 code.
198- **Provenance in history.** Every commit records its issue, session,
199 agent, model and cost, and is signed with a key issued to that pull request. The
200 history can be audited by machine.
201
202## People in the loop
203
204### Code that arrives from outside
205
206People will keep pushing with plain git, their editor, or another tool. Every
207push goes through g1t's git front end, so none of it bypasses the model.
208
209- **A push to a branch becomes a pull request.** g1t adopts it with the pusher as
210 author. A reviewer agent writes the issue it appears to serve and offers
211 to attach it to an open issue it matches. From there it gets the same
212 checks, compare view and queue as agent work.
213- **A push to `main` follows repo policy.** Protected: refused with a message
214 saying which ref to push to instead, so it enters the queue. Open: accepted
215 and treated as "`main` moved", which re-verifies the queue and triggers
216 resolve-on-move for every open pull request.
217- **Context is an open format.** A commit trailer names the session that
218 produced it, so any tool can attach its transcript. Commits without one are
219 shown in why-blame as "pushed by a person, no session".
220- **Approval rules.** Per repo and per path: merge automatically, require a
221 named person, or require a person when the change is large or the reviewer
222 agent is unsure.
223
224### Joining work that is already running
225
226- **Every session has a live page** that works on a phone: the transcript as
227 it streams, the current diff, check results.
228- **Steer.** Send a message, pause, or redirect. Hosted agents receive it
229 immediately; a person's own Claude Code receives it at its next turn
230 through the CLI hooks.
231- **Answer.** When an agent is blocked on a question, it appears in a "needs
232 you" inbox and as a notification. The answer resumes the agent.
233- **Take over and hand back.** Check out the pull request's fork, commit by hand,
234 push, and let the agent continue from there.
235
236### Planning by writing
237
238- **Brief.** Write the outcome in prose on the site, or commit it as a
239 markdown file. A planner agent turns it into a project: issues, each with
240 what done means, and dependencies. The person edits the graph before anything starts.
241- **Plan from their own agent.** The same operations are MCP tools, so a
242 person can plan in their own Claude Code session and create the project
243 from there.
244- **The brief stays the source of truth.** Editing it later re-plans: new
245 issues are added, obsolete ones are closed.
246
247### Seeing what moved
248
249- **Project page.** The outcome, the issue graph coloured by state, and how
250 many of its issues have landed with their required checks passing,
251 compared with when the project started.
252- **Digest.** An agent-written summary per project and per person: what
253 merged, what is blocked on whom, which conflicts were resolved, what it
254 cost.
255- **Timeline.** Every event (push, steer, check, conflict, merge) in order,
256 each linked to the session and the person or agent behind it.
257
258## One session, any surface
259
260A session belongs to g1t, not to the device it started on. The browser, a
261phone and Claude Code are views of the same session.
262
263- **Browser and phone.** The site is a responsive, installable web app with
264 push notifications. Everything a person does (brief, steer, answer,
265 approve, merge) works there.
266- **Claude Code.** Through `mcp.g1t.sh` and the CLI hooks, a local session is
267 a g1t session: its transcript syncs as it runs and it appears in mission
268 control like any other.
269- **Moving a session.** A local session can be sent to the cloud: a hosted
270 agent takes over the fork and the transcript and continues, so the laptop
271 can close. A hosted session can be pulled down: the CLI checks out the fork
272 and resumes it in local Claude Code with its history.
273- **Limit.** A session running only on a laptop stops when the laptop does.
274 It can be steered between turns but not continued until it is moved or the
275 laptop is back.
276
277## For people who do not write code
278
279- **Documents are first-class.** Specs, guides, policies and decisions live
280 in repos as markdown, shown in a Docs view: rendered pages, edited in the
281 browser like a document, with inline comments. "Suggest a change" is an
282 pull request and "publish" is merge, without git vocabulary.
283- **Document issues.** "Write the onboarding guide for the billing API" is
284 an issue. Its Definition of done is a checklist judged by a reviewer agent
285 instead of a workflow. Agents draft and revise; people comment and approve.
286- **Templates.** Product brief, RFC, decision record. A filled-in template is
287 a brief the planner can turn into a project.
288- **Explain.** Ask about any repo, project or change in plain language and
289 get an answer with links to the code and sessions behind it.
290- **Living documentation.** g1t generates "how this works" pages from the
291 code and keeps them current. When a merged change contradicts a document,
292 an issue opens to update it.
293- **See it, don't read it.** Every pull request on a deployable repo gets a
294 preview URL (Workers Builds from the pull request's fork), so an approver clicks
295 through the result instead of reading a diff. Changes are also summarised
296 in plain language.
297- **Roles.** Viewer, commenter, planner, approver: a person can plan and
298 approve work without ever cloning a repo.
299
300## The macro view
301
302The hierarchy above a single repo:
303
304| Level | What it is |
305| --- | --- |
306| **Workspace** | A company or team: its people, repos, agents, budget and policies. |
307| **Initiative** | A business outcome with an owner and measurable results, e.g. "move billing to usage-based pricing". Spans any number of repos. |
308| **Outcome** | One deliverable inside an initiative: a brief and its graph of issues (shown as **Plan**). Called "project" before 2026-10-04; that name now means what [Projects](#projects) describes. |
309| **Issue / Pull request** | As above. An issue may touch several repos; a pull request for it then holds one fork per repo and they land together. |
310
311How it feeds up, and what is built:
312
313- **A workspace is the unit everything belongs to.** Repositories, people,
314 access tokens, and later projects, budgets and policies are the
315 workspace's, never a person's. An account owns nothing; its first step
316 after confirming its email is creating a workspace, and the site sends it
317 there from wherever it was going.
318- **One namespace.** Usernames and workspaces share one set of names, as on
319 Docker Hub and npm. A username is reserved for its owner's workspace, so
320 `g1t.sh/<name>` never means two things.
321- **The workspace page is the roll-up.** `g1t.sh/<workspace>` shows its
322 repositories with their open issues and pull requests, and the pull
323 requests in progress across all of them. Projects and initiatives will
324 roll up to the same page. Its own pages live under `/<workspace>/-/`
325 (people, access tokens, settings), which no repository can be named.
326- **Workspace access tokens instead of service accounts.** A workspace has
327 tokens of its own, in the same table and code path as personal ones. One
328 acts as the workspace, with a member's rights in that workspace only,
329 records who made it and when it was last used, and keeps working when
330 that person leaves. CI, integrations and automations use these.
331
332### Portfolio
333
334One page answers "where is the business" across every initiative:
335
336- **Health** per initiative: on track, at risk, or blocked, derived from
337 facts (checks passing, issues stalled, questions waiting on a person),
338 not self-reported.
339- **Progress** as measurable results: required checks passing, issues
340 merged out of planned, and the trend since the start.
341- **Forecast** from actual throughput: at the current rate, when the
342 remaining issues land.
343- **Spend** in tokens and dollars against a budget, per initiative.
344- **Waiting on people**: every decision or approval a person owes, by name.
345- **Roadmap**: initiatives laid out as now, next, later, with optional
346 time-boxed cycles for teams that work in sprints.
347
348### Status without asking
349
350- **Standup.** An agent writes a daily report per initiative and one for the
351 whole workspace: what merged, what changed direction, what is at risk and
352 why, what needs a person. Delivered by email or webhook.
353- **Ask.** A question box over the full event log and all sessions: "what
354 happened on the billing migration since Monday?" answers with links to the
355 sessions and commits behind each claim.
356
357### Long-running agents
358
359Work that runs for days needs supervision that does not depend on someone
360watching.
361
362- **Checkpoints.** A long pull request reports milestones against its issue, so
363 progress is visible before anything merges.
364- **Stall and drift detection.** A pull request with no meaningful progress, or
365 whose changes have wandered away from its issue, is flagged and can be
366 stopped or re-briefed automatically.
367- **Budgets.** Hard limits on spend and time per pull request, project and
368 initiative.
369
370### Context hub
371
372Agents working across repos and days need context that outlives any one
373session and reaches beyond the code. The context hub is one place an agent
374asks, whatever the source.
375
376| Source | What it holds | How it gets there |
377| --- | --- | --- |
378| **Memory** | Decisions, conventions, gotchas, facts about systems | Written by agents and people in g1t |
379| **Code and sessions** | The repos, and the reasoning behind every change | Already in g1t |
380| **Connected sources** | Jira and Linear tickets, Notion and Confluence pages, Google Drive documents, Slack threads, Sentry issues | Connectors, authorised per workspace |
381
382How it behaves:
383
384- **One search.** An agent asks a question and gets ranked results across
385 all sources, each labelled with where it came from, who wrote it, and how
386 fresh it is.
387- **Connected sources stay where they are.** g1t indexes them for search and
388 fetches the current version when an agent opens one. The external system
389 remains the source of truth, and a link placed on an issue ("see
390 JIRA-482", a Notion URL) is pulled into the agent's starting context.
391- **Permissions carry over.** A connector only exposes what the connecting
392 account can see, and a workspace admin chooses which spaces, projects or
393 channels are included.
394- **External content is untrusted.** A ticket or page can contain text meant
395 to manipulate an agent. It is marked as reference material, never treated
396 as instructions.
397- **Documentation is separate.** Context is what agents know; documentation
398 is what people read, and it is generated from context and code.
399
400Memory is the part of the hub that g1t owns and agents write to:
401
402- **Memory is written freely.** Any agent or person adds an entry with one
403 call: a decision, a convention, a gotcha, a fact about a system. No review
404 gate. Each entry records who wrote it, from which session, and when.
405- **It is still a repository.** Each workspace has a memory repo in
406 Artifacts, so every write is a commit: versioned, attributable, and
407 revertible.
408- **It is kept healthy by an agent.** A consolidation agent merges
409 duplicates, retires entries that newer ones contradict, and flags
410 conflicts it cannot settle. People can pin an entry (agents may not change
411 it), correct it, or retract it.
412- **Agents read it.** Every session starts with the context relevant to its
413 issue, found by search, and can query more through MCP.
414- **Updates are events.** A memory write or a change in a connected source
415 is an event, so "when context changes, update the affected docs" is an
416 automation, on by default.
417- **It is scoped inside the workspace.** Some context applies to the whole
418 workspace, some to one initiative, project or repo, so an agent gets what
419 applies to its work.
420- **It never crosses workspaces.** A workspace is the isolation boundary: its
421 context, sessions and private repos are invisible to every other
422 workspace, and an agent's token is bound to one workspace.
423
424## Working in g1t
425
426- **Mission control.** The signed-in home page: every running session, every
427 issue waiting on a decision, and what merged, across all repos.
428- **Outcomes.** Group issues across repos toward one result and track how
429 many are open, racing, or merged. (What [Projects](#projects) means is
430 below.)
431- **Steering.** Send a message to a running pull request, or to all pull requests on an
432 issue at once, without stopping them.
433- **Automations.** Rules that start work without a person (next section).
434
435## Automations and integrations
436
437> **2026-10-03:** g1t's own `.g1t/automations` format was built and then set
438> aside at the user's request ("let's just copy GitHub Actions on that for the
439> time being"). Automation on g1t is GitHub Actions workflows in
440> `.g1t/workflows/`; the format below is kept for later.
441
442An automation is **when** an event happens, **if** conditions hold, **do**
443something. They are defined as files in the repo (`.g1t/automations/`), the
444way GitHub Actions workflows are, and can also be built in the UI.
445
446### Events that can trigger one
447
448| Source | Examples |
449| --- | --- |
450| Git | push, merge, check failed, `main` moved |
451| g1t | issue opened, pull request stalled, context updated, handoff declined, budget reached |
452| Time | cron schedule |
453| Integrations | Sentry issue, PagerDuty incident, Linear or Jira ticket, Slack message or mention, GitHub issue, Stripe event |
454| Anything else | a signed generic webhook, or an email to a per-repo address |
455
456**Actions**: open an issue (optionally assigning N agents to it), message
457a running pull request, update documentation, notify, call a
458webhook, write back to the source system.
459
460**Example: Sentry.** A new production error arrives. The automation opens an
461issue labelled `bug`, with the stack trace, release and frequency in its
462description. Why-blame
463finds the session that wrote the failing line, so the fixing agent starts
464with the original reasoning. When the fix merges, g1t comments on the Sentry
465issue and resolves it.
466
467### Rules every automation obeys
468
469- **Deduplication.** The same Sentry issue firing 500 times maps to one
470 issue.
471- **Limits.** Concurrency and budget caps per automation.
472- **Loop protection.** Work started by an automation cannot retrigger the
473 same automation without a person in between.
474- **External input is untrusted.** A webhook payload can contain text written
475 by an attacker. Agents started by external events run with reduced
476 permissions and cannot merge without the repo's approval rule passing.
477
478**Checks** are the other half of what GitHub Actions does: build and test
479commands declared in `.g1t/checks.yaml`, run in sandboxes on every pull request
480and on every combined state in the landing queue.
481
482Agents can also reach integrations directly: an agent definition lists MCP
483servers (Sentry, Linear and so on) it may use while working.
484
485### Workflows: the toolkit, OIDC and artifacts
486
487> **2026-10-08:** built so that workflows that deploy, cache and pass files
488> run unmodified.
489
490- **The toolkit's services.** Every job gets `ACTIONS_RUNTIME_TOKEN` (a
491 JWT whose `scp` names its run and job, signed with a key derived from
492 the job's own token, so nothing new is kept), `ACTIONS_RESULTS_URL`,
493 `ACTIONS_CACHE_URL` and `ACTIONS_CACHE_SERVICE_V2`. The API answers the
494 cache's Twirp service (v2) and its older REST protocol, the artifact
495 Twirp service, and the signed blob links they hand out (a subset of
496 Azure Blob's protocol mapped onto R2 multipart uploads), from the same
497 cache and artifact rows g1t's own runner uses. As the clients' source
498 reads, `@actions/cache` and `@actions/artifact` treat any server
499 but github.com as GitHub Enterprise Server, so the cache client speaks
500 the older protocol and the artifact client refuses to run. g1t's runner
501 therefore keeps handling `actions/upload-artifact`, `download-artifact`
502 and `upload-artifact/merge` itself; the Twirp artifact service is there
503 for clients that do not check.
504- **OIDC.** The issuer is `{API}/actions/oidc`, the API's own host, with
505 discovery, JWKS (RFC 7638 `kid`s, a previous key published while
506 rotating) and a token endpoint for `core.getIDToken`. Claims follow
507 GitHub's. A job gets one only when its permissions (or its workflow's)
508 give `id-token: write`, and never for an untrusted run. The permission
509 check reads only `id-token` (`services/actions/src/runtime.rs`,
510 `id_token_permitted`), the seam for the full `permissions:` model.
511- **Artifacts** moved from KV to R2 (`a/` in the cache bucket), with rows
512 in the actions service: numeric ids, 5 GiB each and 10 GiB a run,
513 zipped by the runner, `retention-days` up to the repository's setting
514 (1 to 90, 14 by default), `overwrite`, `compression-level`, patterns,
515 merging and other runs of the same repository. The REST artifacts API and
516 the `workflow` tool's artifact actions follow GitHub's shapes; the run's
517 page lists them with size and expiry, with download and delete. Their
518 storage is charged with the cache's.
519- **Later:** the toolkit's older artifact protocol (`upload-artifact@v3`
520 inside other actions), downloads from other repositories, and npm
521 trusted publishing, which depends on npm accepting g1t's issuer.
522
523## A repository that maintains itself
524
525> **2026-10-04:** the user asked for Dependabot, GitHub Advanced Security and
526> Vercel-style deployments, "so you're not having to maintain shit and you're
527> just pushing up agents that are delivering work consistently".
528
529GitHub reports problems and leaves the fix to you. In g1t, an agent opens an
530issue for each problem, writes the fix, runs its checks, links a preview and
531lands it through the queue. People only decide.
532
533### Upkeep agents
534
535- **Dependency updates.** The file is `dependabot.yml` version 2, read from
536 the default branch at `.g1t/dependabot.yml` (or `.yaml`), then
537 `.github/dependabot.yml` (or `.yaml`); `.g1t/` wins when both exist, and
538 an imported repository's file works unchanged. Every option is read and
539 checked, each problem reported with its line and key on the Security page
540 and as the `g1t / dependabot.yml` status on pull requests that change the
541 file; a file with problems is not acted on.
542 - **Built (2026-10-07):** version updates for npm, cargo, gomod and pip:
543 schedules (all intervals, cron and natural phrases, time zones, a
544 picked time per repository), allow, ignore, cooldown (3 days by
545 default), groups (including across directories and `group-by`),
546 versioning strategies, open-pull-requests-limit, commit-message,
547 branch names, rebase-strategy, assignees, reviewers, private
548 registries filled from workflow secrets (npm, cargo, Go proxy, Python
549 index), and the `@g1t` comment commands. Pull requests come from g1t
550 with an `updated-dependencies` commit record and land through the
551 required checks; one that fails them is closed and becomes a
552 "needs code changes" issue assigned to g1t.
553 - **Security updates follow the same file:** ignore (and comment
554 ignores), allow names, `applies-to: security-updates` groups,
555 commit-message, assignees, reviewers, labels and milestone. Cooldown
556 and the open pull request limit do not apply. The Security updates
557 switch still turns them on and off.
558 - **Labels, milestone and target-branch** are applied to version
559 updates: `dependencies` and the ecosystem's label by default, missing
560 labels created; `target-branch` updates are made from that branch and
561 merge into it.
562 - **Not done yet:** one pull request for a multi-ecosystem group
563 (it opens one per ecosystem); registries that sign in with OIDC;
564 updating vendored copies; and version updates for the other
565 ecosystems (bundler, composer, docker, github-actions, gradle, maven,
566 nuget, terraform, uv and the rest are read and checked only).
567- **Secret scanning.** Pushes are scanned for known token formats. A push
568 that adds a secret is refused with the file and line; one already in
569 history opens an issue to rotate it and remove it.
570- **Vulnerability alerts.** Dependencies are matched against the OSV
571 database. Every alert links to the issue and pull request fixing it.
572- **Code scanning.** A reviewer agent reads each pull request's diff for
573 security problems and leaves findings as review comments with a
574 suggested fix. Findings on `main` open issues.
575- **A security page per repository** lists alerts, secrets and findings,
576 with the agent work on each, like GitHub's Security tab.
577
578All of these are event sources for the existing issue → agent → checks →
579queue pipeline; they need no new kind of work.
580
581### The security suite (built 2026-10-07)
582
583GitHub Advanced Security's depth, in g1t's shape (services/security,
584`g1t_contracts::security_suite`, docs `guides/security/*`):
585
586- **Secret protection.** Custom patterns (repository and workspace; Rust
587 `regex`, linear time, size-limited; test strings; dry run over the
588 default branch) used by push protection, `commit_file` and history
589 scans. Bypass with a reason (false positive, used in tests, will fix
590 later), recorded on the alert and in the audit log; delegated bypass
591 (requests reviewed by owners and repository admins, through the inbox).
592 Validity checks for GitHub, GitLab, Stripe, Slack, npm, OpenAI,
593 Anthropic and SendGrid tokens, made by the repos service, which reads the
594 landed secret again: the value never leaves it except to the issuer. AWS
595 keys (need their secret key to sign) and webhook addresses (would post)
596 are the extension points left (`g1t_scan::validity::check_for`).
597- **Code scanning.** SARIF 2.1.0 uploads → alerts with fingerprints (tool
598 partial fingerprints first), fixed when no longer reported; pull request
599 uploads → line comments and the `Code scanning` commit status, gated by a
600 per-repository threshold and required like any check. Starter workflow:
601 a scanner per language present, each uploading its own category: Bandit
602 (Python), gosec (Go), ESLint + eslint-plugin-security with the SARIF
603 formatter (JS/TS), Clippy + clippy-sarif (Rust); all install from the
604 registries the runner's egress already allows. Semgrep's registry rules
605 and the Opengrep rules fork are not usable in a paid feature, so neither
606 is used. "Fix with g1t" opens an issue and runs the agent.
607- **Supply chain.** Dependency graph (direct/transitive where the lockfile
608 says, npm licenses), SPDX 2.3 SBOM, `Dependency review` status on every
609 pull request (OSV severity threshold, license deny list, summary comment).
610- **Overview.** Workspace totals, opened/closed, a daily snapshot trend,
611 coverage, repositories most in need first.
612- **Paid.** The Security and quality activation on private repositories;
613 free on public ones; the free core (secret scanning, push protection,
614 vulnerability alerts, security updates, dependency graph) free everywhere.
615
616Not built yet:
617
618- **The reviewer agent as an analysis source.** g1t's reviewer reads each
619 pull request's diff (`agent_review`), but its findings are review
620 comments, not SARIF. Next: have it emit SARIF for the security issues it
621 finds and upload them as the tool `g1t review`, so they become alerts and
622 count toward the Code scanning check.
623- **Repository security advisories.** Private advisories, draft →
624 published, with affected versions (ranges per ecosystem), severity and a
625 CVSS vector, credits, and a private fork (a `g1t/advisory/GHSA-…` working
626 copy only the advisory's collaborators can see) for the fix, merged into
627 the default branch when the advisory publishes. Published advisories
628 should feed the OSV-shaped data other g1t repositories' vulnerability
629 alerts read. CVE requests are out of scope. Needs: an `advisories` table
630 per repository, a collaborator list per advisory, the private-fork
631 visibility rule in repos, and an Advisories page on the Security tab.
632- **SARIF upload as a background job.** Uploads are read in the request
633 (10 MB encoded, 40 MB unzipped, 5,000 results); larger ones need a queue.
634
635### Deployments
636
637- **A preview for every pull request**, at
638 `<pr>--<repo>--<owner>.g1t.page`, linked on the pull request and updated
639 on each push. `main` deploys to `<repo>--<owner>.g1t.page`, and a
640 repository can add its own domain.
641- **On g1t.page, not g1t.sh,** so customer code never shares cookies or an
642 origin with the site people sign in to.
643- **Built on Workers for Platforms.** Each deployment is a user Worker in a
644 dispatch namespace; one dispatch Worker on `*.g1t.page` routes to it. The
645 build runs in the same runners as Actions. Static sites and Workers apps
646 first; container apps and databases later.
647- **Agents use the preview.** The reviewer agent opens the preview in a
648 browser, takes screenshots of what changed and attaches them to its
649 review, so an approver sees the result without reading the diff.
650- **Environments.** Preview, production and their secrets; deploy history
651 and one-click rollback.
652- **Scale to zero.** An idle branch costs neither g1t nor the customer
653 anything: a Worker runs, and is billed, only while it answers a request.
654 A preview is deleted when its pull request closes or merges, and after
655 a set number of idle days. Container apps, later, sleep when idle.
656- **Billed to the customer, never free.** The user (2026-10-04): "we
657 should not be giving any of this available for free". Every deployment
658 is metered per workspace (requests, CPU time, deployed apps, stored
659 data), priced at Cloudflare's cost + 20% like agent usage, and drawn
660 from prepaid credit. `FREE_WHILE_BUILDING` and the free model allowance
661 do not cover deployments: a workspace without credit cannot deploy, and
662 turning deployments on says so first.
663- **Turning them on is a paid plan, the way Cloudflare's is.** "Including
664 things like them even enabling the feature should have that pay like
665 Cloudflare does." Enabling deployments for a workspace starts a monthly
666 fee that includes an allowance of requests, CPU time and deployed apps;
667 usage past it is billed per unit, as Workers for Platforms bills g1t.
668 The fee and allowance are the user's to set.
669- **Recommended, off in one click.** Because enabling costs money, it is
670 never switched on without the workspace agreeing: new repositories
671 recommend it prominently. A repository can turn it off, keep only production, or
672 deploy somewhere else from its own workflows. Apps built for Cloudflare
673 (Workers, static assets, D1, KV, R2) deploy without configuration.
674
675Later, toward GitLab's DevOps breadth: environment protection rules,
676package and container registries, releases, container hosting.
677
678## Projects
679
680> **2026-10-04:** the user: "an extra dimension of Projects so it's not
681> just repositories … where a lot of things can live", "very Vercel
682> like", with dependencies across projects "the Platform Engineering /
683> Port route", and "the repository is *part* of a project: you could be
684> mirroring it from GitHub/GitLab/Bitbucket, or you could let us host it
685> for you", with room for Mercurial or anything else later.
686
687**A project is the thing you are building and running; a repository is
688where some of its code lives.** Everything that is about running software
689(deployments, environments, domains, secrets, dependencies, owners,
690health, upkeep) belongs to the project. What is about the code itself
691(branches, pull requests, review, merge rules) stays with the repository.
692That split is what lets the code live anywhere.
693
694### The model
695
696| | What it is | Like |
697| --- | --- | --- |
698| **Workspace** | The company or team. Members, billing, plans, shared secrets. | Vercel team, GitLab group, GitHub org |
699| **Group** | An optional named set of projects, one level: "Payments", "Mobile". For browsing, ownership and shared settings. | GitLab subgroup, Backstage system, Port domain |
700| **Project** | One deployable thing: a site, an API, a worker, a library. Has exactly one **source**. | Vercel project, Port service, Backstage component |
701| **Source** | Where its code is: a repository and a **root directory** in it. | Vercel's connected repo + root directory |
702| **Dependency** | Project A uses project B: calls its API, consumes its package, reads its queue. | Port relations, Backstage `dependsOn` |
703
704- **One project, one source; one repository, any number of projects.** A
705 project builds from exactly one place, which keeps it as simple as
706 Vercel's. A monorepo is several projects on one repository, each with
707 its own root directory (`apps/web`, `services/api`), and a push builds
708 only the projects whose root it touched. The common case stays 1:1, and
709 every existing repository gets a project of its own name when this
710 ships, so nobody has to set anything up.
711- **Groups are for people; dependencies are for software.** Groups decide
712 where a project shows up and who owns it. Dependencies decide what
713 happens when one changes. Neither replaces the other, and a dependency
714 can cross groups.
715
716### Sources: where the code lives
717
718A source is an adapter behind one interface (`SourcePort`: clone URL,
719branches, commits, pushes as events, pull requests if it has them):
720
721| Source | Code lives | g1t gets pushes by | Pull requests |
722| --- | --- | --- | --- |
723| **Hosted on g1t** (today) | Artifacts | its own events | g1t's, with agents, the queue, review |
724| **Mirrored** from GitHub, GitLab or Bitbucket | Both; g1t keeps a copy | the provider's webhook, then fetch | The provider's, read into g1t; agents open theirs there |
725| **Connected, not copied** | The provider only | webhook | The provider's |
726| **Later:** Mercurial, Perforce, a tarball upload | Behind the same port | per adapter | per adapter |
727
728A mirrored or connected project still gets everything that is the
729project's: previews on its pull requests (a status and a comment on
730GitHub's), production on its default branch, secrets, dependencies,
731upkeep agents. That is the on-ramp: a team keeps GitHub and gets g1t's
732deployments and agents first, and moves the code later or never.
733Bring-your-own-git is also why the project, not the repository, holds the
734URL `g1t.sh/<workspace>/<project>`.
735
736### What lives on a project
737
738| | Today it is on | Moves to the project |
739| --- | --- | --- |
740| Deployments: production, previews, build settings, root directory, framework | The repository | Yes |
741| Environments: production, preview, and custom ones (`staging`) with protection rules (required approvers, branch limits) | Nowhere yet | New, on the project |
742| Domains: `<project>--<workspace>.g1t.page`, and custom domains | The repository's name | Yes |
743| Secrets and variables | The repository | Yes. Workspace rows link to projects instead of repositories. A repository's workflows read the rows of its project (with several projects on one repository, the one marked as the repository's default). |
744| Dependencies | Nowhere | New |
745| Owners, on-call, links (docs, dashboards, runbooks) | Nowhere | New: the catalog's metadata |
746| Health: scorecards (has an owner, CI passes, dependencies current, no open security alerts, deploys within N days) | Nowhere | New |
747| Upkeep agents: dependency updates, security alerts | The plan | Scoped per project |
748| Logs and analytics of the running app | Nowhere | New: requests, errors and CPU per environment, from Workers analytics |
749| Branches, pull requests, review, merge rules, the queue, webhooks | The repository | Stay |
750
751### Dependencies: why this gets powerful
752
753Declared in the UI, or in the source as `.g1t/project.yml` (which wins
754when present, as `catalog-info.yaml` does in Backstage):
755
756```yaml
757name: web
758root: apps/web
759dependsOn:
760 - project: api # calls its HTTP API
761 as: API_URL # its URL, per environment, as a variable
762 - project: ui-kit # consumes its package
763```
764
765What g1t does with them:
766
7671. **Reference variables.** `API_URL` above resolves to `api`'s production
768 URL in production and to the matching preview in a preview, the way
769 Railway's `${{ api.URL }}` references work. No hard-coded URLs.
7702. **Preview stacks.** A pull request on `api` gets its own preview, and
771 **Preview with dependents** builds `web`'s preview pointed at it, so a
772 reviewer clicks through the whole change across projects. A change that
773 spans repositories (one issue, one fork per repository) gets one stack.
7743. **Release order.** Production deploys go out in dependency order; a
775 change set across projects lands through the queue together or not at
776 all.
7774. **Impact on every pull request.** "Changes `api`; `web` and `mobile`
778 depend on it." Agents get the graph in their context: an agent
779 changing an API opens follow-up issues on the projects that call it,
780 and reviewers see what else could break.
7815. **Upkeep across the graph.** A vulnerable package in `ui-kit` opens
782 issues, assigned to agents, on every project that consumes it.
7836. **Scorecards turn into work.** A project failing a scorecard check
784 ("no owner", "dependencies 90 days old") gets an issue an agent can fix.
785 That is the Port idea with the work done for you.
7867. **The map.** A workspace's projects as a graph, coloured by health and
787 by what is deploying now.
788
789### Pages
790
791- `g1t.sh/<workspace>`: projects first (grouped, with health and
792 production status), then repositories.
793- `g1t.sh/<workspace>/<project>`: overview (production, latest previews,
794 health, owners, dependencies both ways), **Deployments**,
795 **Environments**, **Secrets and variables**, **Logs**, **Settings**
796 (source, root directory, build, domains, groups, owners).
797- A hosted repository keeps its code pages; from a project they are its
798 **Code** tab. A repository page lists the projects built from it.
799
800### Services
801
802- `services/projects` (new): projects, groups, sources, dependencies,
803 owners, scorecards. Events `project.created`, `project.updated`,
804 `dependency.changed`.
805- `services/deployments`: keyed by project instead of repository.
806- Secrets and variables: the scope becomes workspace → project.
807- Sources: the hosted adapter wraps `services/repos`; a mirror adapter
808 per provider in `services/integrations`, which already holds those
809 connections.
810
811### Build order
812
8131. **Projects as the home of deployments and secrets**, 1:1 with every
814 existing repository: the service, the pages, deployments and secrets
815 moved to the project, `<project>--<workspace>.g1t.page`.
8162. **Dependencies:** declared in the UI and `.g1t/project.yml`, reference
817 variables, impact on pull requests and in agents' context, the map.
8183. **Preview stacks** and cross-project change sets.
8194. **Monorepos:** several projects on one repository, each with a root
820 directory, building only what a push touched.
8215. **Mirrored sources:** GitHub first, then GitLab and Bitbucket.
8226. **Groups, owners, scorecards** feeding the upkeep agents.
8237. **Environments** with protection rules; custom domains; logs.
824
825**Step 1 shipped 2026-10-04:** `services/projects`; every repository a
826project of its own name; the site projects-first (workspace page of
827project cards, the project overview at `g1t.sh/<workspace>/<project>`, code
828under `/code`, the sidebar and the New project flow); deployments keyed by
829project and branch at `<project>-<workspace>.g1t.page` and
830`<project>-git-<branch>-<workspace>.g1t.page`; secrets and variables owned
831by the project.
832
833**Step 5, GitHub, built 2026-10-05:** one GitHub App (`g1t-sh`) for both
834sign-in and repository access. Sign-in is its user authorization with PKCE
835(identity, `src/github.rs`): accounts known by GitHub's numeric id, a
836matching verified email never linked without signing in to the account,
837new accounts behind the invite check. Repositories come through its
838installations (integrations, `src/github.rs`), copied with every branch and
839tag by the repos service (`src/mirror.rs`) as **import**, **mirror** (g1t
840follows GitHub on its push webhook) or **move to g1t** (GitHub follows g1t
841on `git.push`). A mirror is a hosted repository that keeps a full copy, so
842its project stays `hosted` and deploys like any other; the tie lives in
843integrations' `github_repos`. Not yet: previews and statuses on GitHub's own
844pull requests, comments and pull requests copied, GitLab and Bitbucket.
845
846### People and search
847
848> **2026-10-04:** "pull up user profiles, using a /u/username prefix kinda
849> like DockerHub … search for users if you search that explicitly, how
850> GitHub has the aside for searching against filters … a significantly
851> stronger implementation."
852
853- **Profiles at `g1t.sh/u/<username>`**, apart from workspaces at
854 `g1t.sh/<workspace>`: who they are, their workspaces, recent work,
855 agents' sessions they steered.
856- **Search with a filter sidebar:** Projects, Code, Issues, Pull requests,
857 Users, Workspaces, each with its count; filters by workspace, language,
858 state, author, agent, label, date; qualifiers in the query
859 (`user:`, `is:open`, `agent:g1t`) as on GitHub. Typing `u/name`
860 searches people directly, as Docker Hub does.
861
8621 and 2 serve the competition directly (multi-agent coordination across
863projects is 25% of the score); 3 is the demo's best moment if time allows.
864
865## Billing model
866
867> **2026-10-04:** "Some things just require you to have a card on file …
868> some things will be something you give us an initial amount of money
869> per month just to activate, tons of things additionally will be usage
870> based, some things will just be usage based only … at minimum a
871> breakeven with Cloudflare costs, or in some cases a value add." Stripe
872> moves to Flagon, Inc. (g1t.sh is its product). Proposed below; the
873> prices are the user's to confirm.
874
875### Four kinds of charge
876
877Every feature is exactly one of these, and the Billing page says which:
878
879| Kind | What the workspace does | Example |
880| --- | --- | --- |
881| **Free** | Nothing | Hosting code, issues, pull requests, review, the merge queue, bringing your own agent over MCP |
882| **Card on file** | Adds a card; pays only for what it uses | Previews, g1t's agents, workflow minutes |
883| **Activation** | Turns a feature on for a monthly fee that includes an allowance; usage past it is metered | Production deployments, Security and quality |
884| **Usage only** | Nothing up front; every unit is metered | Model tokens, build minutes, storage past the free amount |
885
886A card is needed before anything that can cost money starts. Nothing is
887ever switched on without the workspace choosing it.
888
889### Postpaid, with spend limits
890
891- **One Stripe customer and one subscription per workspace**, on Flagon,
892 Inc.'s account. Activations are licensed line items; every usage
893 dimension is a metered price backed by a Stripe Meter. Stripe invoices
894 monthly in arrears and charges the card on file; failed payments go
895 through Stripe's retries and emails, and g1t hears of them by webhook.
896- **Spend limits instead of prepaid credit.** A workspace sets a monthly
897 limit overall and per feature (Vercel's spend management). g1t counts
898 usage as it happens and stops starting new paid work at the limit,
899 with a warning at 50%, 80% and 100%. Prepaid top-ups go away; promotions
900 (the free model allowance) become Stripe credit on the customer.
901- **Usage reaches Stripe from billing alone.** Every service reports
902 usage to the billing service as it happens (it already records agent
903 runs and builds); billing batches them into Stripe meter events every
904 few minutes, idempotently by g1t's own ids, and keeps the ledger g1t's
905 pages show. Nothing else talks to Stripe.
906
907### Scope: workspace, then projects
908
909- A feature is turned on for the **workspace** (by an owner, with the
910 activation if it has one), then allowed for **all projects** or
911 **selected projects**.
912- Every **project** can opt out on its own page. A project with nothing
913 to deploy (no Workers config, no build script, no `index.html`) is
914 detected, says so on its Deployments page, and never builds or costs
915 anything.
916- Agents and workflows are allowed per project the same way, so a
917 workspace can keep spend to the projects that matter.
918
919### Prices: what it costs us, passed through
920
921> **2026-10-04, decided:** postpaid with spend limits, as Vercel and
922> Cloudflare do; no per-seat price, ever ("fuck per-seat pricing").
923> "If they're barely using them great, but if they're using the shit out
924> of them that will cost me a ton, so that cost needs to move onto them."
925
926**Every Cloudflare cost a workspace causes is metered to it.** Light use
927fits in a small free allowance; past it, each unit is charged at
928Cloudflare's price times a margin of at least 1.5, which pays for Stripe
929(about 3%), shared overhead (the site, the API, D1) and g1t itself.
930
931Cloudflare's prices (October 2026), and the cost per unit g1t meters:
932
933| What g1t meters | Cloudflare's price | Cost to g1t per unit |
934| --- | --- | --- |
935| **Sandbox minute** (agents, checks, merge queue, workflow jobs, deploy builds), standard-1: ½ vCPU, 4 GiB, 8 GB | CPU $0.00002 / vCPU-s while busy; memory $0.0000025 / GiB-s and disk $0.00000007 / GB-s while running | ≤ $0.0012 / minute (CPU counted as busy throughout, since g1t cannot see it per sandbox) |
936| **App request** (deployments) | Workers for Platforms: $0.30 / million past 20M | $0.30 / million |
937| **App CPU** | $0.02 / million CPU-ms past 60M | $0.02 / million ms |
938| **App** (a deployed script) | $0.02 / script-month past 1,000 | $0.02 / app-month |
939| **Storage** (repositories, artifacts, caches) | Artifacts $0.50 / GB-month (billing starts 2026-10-14); KV $0.50 / GB-month | $0.50 / GB-month |
940| **Git operation** (clone, fetch, push) | Artifacts $0.15 / 1,000 past 10,000 | $0.15 / 1,000 |
941| **Model tokens** | The provider's price | As charged |
942| Container egress, emails, the site's own requests | Small and shared | In the margin |
943
944> **2026-10-06, decided:** no per-feature quotas on the plan. "A paying
945> user should be able to push past the Git operations number, they're
946> just paying usage on it." One plan, $20 a month per workspace with $10
947> of usage included; every meter is charged from the first unit at cost +
948> 20% (builds, app requests and CPU, custom domains), drawn from the $10
949> first, then up to the spend limit, which is the only thing that stops a
950> paying workspace (with abuse protection). Projects, previews and apps
951> are not metered (Workers for Platforms' script pool makes them ~free).
952> The forge's free amounts are the same for everyone: 1 GB private storage
953> and 50,000 git operations a month; past them the plan pays and a free
954> workspace is held (pushes stop, git slowed). The table below is the
955> earlier proposal; billing's price book and g1t.sh/pricing are current.
956
957What a workspace pays:
958
959| Meter | Free each month | Then | Margin | For comparison |
960| --- | --- | --- | --- | --- |
961| Sandbox minutes | None (2026-10-05: charged from the first second) | Cost + 20%, by the second | 1.2× | GitHub Actions $0.008 / minute (Linux 2-core); Vercel builds $0.0035 / CPU-minute |
962| App requests | 1 million with Deployments | $0.50 / million | 1.7× | Vercel $0.60 / million invocations |
963| App CPU | 3 million ms with Deployments | $0.04 / million ms | 2× | Vercel active CPU about $0.036 / million ms |
964| Apps | 10 with Deployments | $0.05 / app-month | 2.5× | |
965| Storage | 1 GB | $1.00 / GB-month | 2× | GitHub LFS $0.07 / GB, but repositories are free there |
966| Git operations | 10,000 | $0.30 / 1,000 | 2× | |
967| g1t's models | | Cost + 20% | 1.2× | The provider's own price |
968| Your own model provider | | Only its sandbox minutes (the $0.10 run fee was dropped 2026-10-05) | | |
969| **Deployments** activation | | $5 / month, with the allowances above | covers Workers for Platforms' $25 / month across workspaces | Vercel Pro $20 per seat |
970| **Security and quality** activation (built 2026-10-07: price book meter `security_activation`) | | $10 / month; fixes as agent usage | | GitHub Advanced Security $49 per committer |
971
972A workspace that uses g1t lightly (a few agent runs, a small site)
973pays nothing or its activation; a workspace running agents all day pays
974for the sandboxes and models those agents use, with g1t's margin on
975each. Nothing in a workspace's bill is subsidised by another's.
976
977### Build order
978
9791. Stripe customer per workspace and card on file (Checkout in setup
980 mode), webhooks (invoice paid and failed, subscription changes,
981 payment method changes), the Billing page rebuilt around the four
982 kinds.
9832. One subscription per workspace with activations as items; Deployments
984 moves onto it.
9853. Meters for each usage dimension above, fed from billing's ledger:
986 every sandbox reports how long it ran when it stops (agents, checks,
987 the queue, workflow jobs and deploy builds alike); deployments report
988 requests, CPU and apps; repos report storage and git operations. Spend
989 limits and their warnings; prepaid credit retired.
9904. Per-workspace allow-lists of projects for each feature, and per-project
991 opt-out; "nothing to deploy" detection.
9925. Turn off FREE_WHILE_BUILDING when the user says so. **Done 2026-10-05.**
993
994Shipped by 2026-10-05: sandbox seconds for every sandbox; the price book
995and its keeper (runs settled to AI Gateway's price every 15 minutes;
996Container and Workers costs checked against Cloudflare's billable usage
997and container analytics daily, with a public change log on
998g1t.sh/pricing); usage limits by trust with automatic payment near the
999limit; app traffic counted toward limits as it happens; billing accounts,
1000terms and enterprises; free mode off, syntaqx comped.
1001
1002Still to build, in order: Stripe card-on-file without a payment (setup
1003mode) and webhooks; month-end invoices for postpaid usage (and one
1004invoice per enterprise); the subscription with activations as items;
1005storage and git-operation meters; limit warnings by email at 50/80/100%;
1006self-serve enterprise management for enterprise owners.
1007
1008### Accounts, terms and enterprises
1009
1010Every workspace is paid for by a billing account: its own (`ws_<slug>`)
1011or an enterprise's (`ent_…`), which pays for several workspaces with one
1012limit, one set of terms and, once invoices exist, one bill, as GitHub
1013Enterprise does. Terms are standard, comped (nothing charged, usage still
1014recorded at cost, paid features on) or custom (a discount, its own
1015ceiling, an end date). g1t staff manage them in **sudo.g1t.sh**, a
1016separate Worker behind Cloudflare Access that also verifies the Access
1017token itself and allows only listed staff emails; every change is kept
1018with who made it and why.
1019
1020### Limits: stop non-payers, never payers
1021
1022The limit is on usage not yet paid for, counted at cost to g1t or charge,
1023whichever is more: $3 before any live payment, then twice what has been
1024paid ($25 to $1,000), or what staff set. A workspace with a card on file
1025is charged automatically near its limit, which both pays what it owes and
1026raises the limit, so paying users are never stopped. A declined card
1027stops work until paid. The owner's own spend limit always means stop.
1028Test-mode payments never lower exposure or raise trust.
1029
1030### Tax, card fees and free workspaces (built 2026-10-08)
1031
1032> **2026-10-08, decided:** Stripe Tax everywhere ("so I don't fuck up on
1033> taxes"); Stripe's card fee passed to the customer with the 20% markup
1034> kept; one free workspace per person; no invites on free workspaces.
1035
1036- **Stripe Tax on every payment.** `automatic_tax` on every Checkout page
1037 (plan, Security and quality, prepaying, AI credit), every subscription
1038 and every invoice g1t makes (month close, threshold, enterprise), and a
1039 tax calculation and transaction for auto-reload's off-session charge.
1040 Tax code `txcd_10103001` (SaaS, business use), every price
1041 `tax_behavior=exclusive`. Checkout always collects the billing address
1042 and tax ID and saves them on the customer. Prices on g1t are shown
1043 excluding tax. Tax is never revenue: balances and plan payments are
1044 credited without it, it is kept in `tax_and_fees`, shown as its own
1045 statement line, and as **Tax collected** on sudo's Costs. Without an
1046 address g1t does not charge: the owners are asked for one.
1047- **The card fee** (2.9% + $0.30, grossed up) is its own line on every
1048 card payment, the plan's and Security's as a monthly item; never on a
1049 bank transfer or an enterprise's invoice. On by default
1050 (`cost_settings.card_fee`). Not revenue either. Meters stay at cost +
1051 20%; models at the provider's price plus the agent rate.
1052- **One free workspace per person.** Identity asks billing
1053 (`free_workspaces`) before creating one; a second is refused with the
1054 way forward. Those who own several from before keep them.
1055- **A free workspace adds no one**: no members, invites or outside
1056 collaborators until it starts the plan; its members stay; @g1t never
1057 counts. Enforced in identity for every path (site, API, MCP).
1058- Details: docs/BILLING_OPERATIONS.md, *Tax and the card fee*.
1059
1060### Promo codes (planned)
1061
1062Staff credits (promotional, goodwill, refund; `services/billing/src/grants.rs`,
1063docs/BILLING_OPERATIONS.md) are given one workspace at a time. Promo codes
1064give promotional credit in bulk, on redemption, through the same grants:
1065
1066- **Codes.** sudo → Credits & refunds → **New code**: the code (or one
1067 made up), the credit ($ amount), max redemptions, when the code stops
1068 working, how long each redeemed credit lasts (an expiry, as any grant),
1069 and a note. Table `promo_codes` (code, amount, max, redeemed, ends_at,
1070 credit_days, note, created_by, disabled_at) and `promo_redemptions`
1071 (code, workspace, grant id, by, at), unique on (code, workspace).
1072- **Redeeming.** An owner types it on the workspace's Billing page
1073 (`redeem_code`, owners only). One D1 batch checks the code is open, under
1074 its max and not redeemed by the workspace, counts the redemption and
1075 makes the grant (`grant_credit`, kind promotional, the code as its note),
1076 so two redemptions at once never pass the max. Wrong or used-up codes say
1077 so without telling which codes exist; redemptions are rate-limited per
1078 owner.
1079- **Seeing them.** Each code's redemptions, credit given and spent come
1080 from the grants it made, so margin needs nothing new: spent promo credit
1081 is already given away, by kind.
1082- **Not yet built** because it adds an owner-facing form, abuse limits and
1083 a second sudo form; giving credit by workspace covers launch.
1084
1085## Agents and models
1086
1087### Defining an agent
1088
1089An agent is a file (`.g1t/agents/<name>.md`, or in the workspace library):
1090instructions, the harness and model to run, the tools and MCP servers it may
1091use, its sandbox image, permissions and budget. Agents take roles: planner,
1092implementer, reviewer, conflict resolver, documenter, memory consolidator.
1093Each role has a default that a repo can replace.
1094
1095### Where it runs, and on whose model
1096
1097| Option | How it works | Fits |
1098| --- | --- | --- |
1099| Hosted, g1t's model | g1t runs the sandbox and bills usage | Getting started; no keys to manage |
1100| Hosted, your API key | Same sandbox, your Anthropic, OpenAI or Google key | Teams with existing contracts |
1101| Hosted, your endpoint | Any OpenAI-compatible URL: Bedrock, Vertex, Azure, a self-hosted model | Private or fine-tuned models |
1102| Your runner | A g1t runner daemon on your own machines picks up pull requests | Code or models that may not leave your network |
1103| Your own session | Local Claude Code, Cursor or any MCP client joins through `mcp.g1t.sh` | Individuals; subscription plans |
1104
1105Decisions behind this:
1106
1107- **g1t does not build its own agent loop.** It runs existing harnesses
1108 (Claude Code first, through its headless mode) behind a small runner
1109 contract: a container image, an entry command, and session events reported
1110 through the CLI. Other harnesses plug in by meeting the contract.
1111- **All hosted model traffic goes through Cloudflare AI Gateway.** That gives
1112 one place for spend tracking, budgets, rate limits, fallback and logs,
1113 whichever provider or endpoint is behind it.
1114- **Nobody has to pick a model.** A person assigns work to `g1t`, as
1115 they would assign an issue to a colleague, and **Auto** routes each job
1116 to the cheapest model that can do it (see
1117 [Routing for cost](#routing-for-cost) below). A workspace can pin a tier
1118 per kind of work instead. Each request is tagged at the gateway with the
1119 kind of work, the tier, the repository and the pull request, and each
1120 run says which model ran and why. The gateway's own dynamic routes
1121 cannot make the choice yet: they work only on its OpenAI-compatible
1122 endpoint, and the harness speaks Anthropic's.
1123- **Subscriptions stay local.** A Claude subscription cannot be used by a
1124 hosted sandbox; it needs an API key. People on subscriptions use their own
1125 Claude Code session, which is a full participant.
1126- **The workspace pays.** A workspace buys AI credit by card and each
1127 agent run deducts the model at the provider's price plus the agent rate
1128 per million (weighted) tokens; on its own model key, only the agent rate,
1129 counted from the model proxy and the sandbox's own report. The billing service asks
1130 nothing of the others: the runner asks it before starting a sandbox and
1131 is refused when there is no credit, and the sandbox reports what its run
1132 cost with a token only it holds. Where no card processor is configured
1133 nothing is charged and agents stay limited to listed accounts.
1134- **Keys are secrets.** Stored in Cloudflare Secrets Store, injected into the
1135 sandbox for one pull request, never shown again.
1136
1137### Seeing a pull request through
1138
1139Assigning an issue is the only thing a person does until there is something
1140to merge. A pull request made by g1t goes through checks, a review
1141by another agent, revision when either finds something, and catching up
1142when `main` moves, without anyone pressing a button. It ends as ready to
1143merge, or as "needs you" with the reason: the checks still fail after two
1144revisions, a review could not be written, or a conflict could not be
1145resolved.
1146
1147The work service decides the next step from the pull request's state and
1148claims it in one statement, so a step is taken once. The runner asks on
1149every event that could change the answer (ready, pushed, checks finished,
1150review finished, `main` moved), and on a five-minute sweep for anything
1151missed, and carries the step out in a sandbox.
1152
1153A pull request does not have to be up to date with `main` to merge,
1154unless the repository's settings require it, as on GitHub. Merging one that
1155is behind brings it up to date first (a clean merge needs no model; an
1156agent resolves a conflict) and lands it when that push arrives. With the
1157requirement on, catching up is a step of its own and the checks run again
1158on the result.
1159
1160Each repository sets its own rules, on one settings page: whether its
1161default branch takes pushes at all, how many approvals a merge needs and
1162whether an agent's counts, whether failed checks can be overridden, whether
1163a second agent reviews, and how often an agent is sent back before a person
1164is asked. A pull request g1t opens follows the same rules as anyone's.
1165Pushes to a protected branch are refused in the git front end, with the
1166reason shown by git beside the branch.
1167
1168Merging is a person's decision unless the repository says otherwise. With
1169"merge automatically when ready" turned on in its settings, a ready pull
1170request lands by itself, attributed to `g1t`. That is the whole path from
1171an assigned issue to a commit on `main` with nobody in between. Required
1172human approval per path, and risk tiers, are still to come.
1173
1174### Routing for cost
1175
1176*Built (runner `route` in `services/runner/src/model-env.ts`).* The goal
1177is cost per merged change, not cost per request: a cheap attempt that
1178fails and is retried on the same model costs more than one that finishes.
1179
1180- **Tiers and catalogue.** `small` (Claude Haiku 5.5 since 2026-10-08,
1181 $0.10/$0.50 per million input/output up to 100k-token prompts, five
1182 times that above; it was Haiku 4.5 at $1/$5), `large` (Claude Sonnet 5.5, $2/$10) and `frontier`
1183 (Claude Opus 5.5, $4/$20). Models, names and list prices are
1184 configuration (`AGENT_ROUTING`), never code; prices there are for
1185 estimates only, runs are charged what AI Gateway priced them at.
1186- **Starting tier by job.** Catch-up, answering a question, and reviews of
1187 at most 10 files and 200 lines touching no sensitive path: small.
1188 Plans: small at high effort (Haiku 5.5 takes an effort level).
1189 Changes, revisions and other reviews: large. Reviews over 60 files
1190 or 3,000 lines: frontier. Labels: `architecture` frontier, `security` off
1191 small, `docs`/`documentation`/`typo` let changes and answers start small.
1192- **Escalation.** A failed (or guardrail-stopped) attempt at the same work
1193 goes one tier up; two in a row, frontier; a revision counts its rounds;
1194 a change left at low confidence sends the next attempt up.
1195- **Learning, per repository.** From the last 20 runs of the same kind:
1196 one tier down when the cheaper tier finished at least 90% of at least 5
1197 (never for sensitive or labelled work, never on a retry); one tier up
1198 when this tier failed at least half of at least 5. No new tables: it
1199 reads work's `agent_runs` (model, status, confidence).
1200- **Explained.** Every run's first step and session note is one line:
1201 *Used a fast model (Claude Haiku 5.5): small change, 3 files and 80
1202 lines.* Effort per kind of job (`effort` in `AGENT_ROUTING`: plan high,
1203 answer medium, update low) is sent as `CLAUDE_CODE_EFFORT_LEVEL` on
1204 g1t's tiers and named in that line.
1205- **Chosen instead.** `model_routes` rows to g1t's models name `small`,
1206 `large` or `frontier`, or nothing for Auto (Integrations → Models).
1207 A workspace's own Anthropic key with no model named is routed by Auto
1208 too.
1209- **Measured.** `scripts/ops/routing-savings.mjs` replays tasks through
1210 the router offline, priced from the catalogue, against routing before
1211 Auto and against the frontier model for everything, net of failed
1212 attempts, with cost per merged change; `--live` reads billing's runs and
1213 counted tokens. On the bundled sample (13 tasks, assumed failures): Auto
1214 costs 7% less than the frontier model for everything and about 7% more
1215 per run than routing before it, but half as much per merged change,
1216 because it finishes the hard tasks the old routing gave up on. At
1217 current prices Opus 5.5 and Sonnet 5.5 cost the same per cache read, and
1218 cache reads are most of an agent run's tokens, so moving off the
1219 frontier model saves less than its list price suggests; the fast tier
1220 and fewer failed attempts are where the money is. Run `--live` monthly
1221 and after any routing change.
1222- **A cheaper route for the simplest jobs (designed, off).** A fourth tier
1223 on Workers AI through AI Gateway (an open model, billed on Cloudflare's
1224 invoice) for classification-sized jobs: commit messages, triage,
1225 summaries. Behind the same router as a tier with its own catalogue entry
1226 and `tasks` rules, off by default. It needs the proxy to translate the
1227 harness's Anthropic requests to the gateway's OpenAI-compatible
1228 endpoint (it already does for workspaces' own OpenAI-shaped providers)
1229 and a quality bar from the savings harness before any job moves to it.
1230
1231### Choosing the right agent automatically
1232
1233Because several agents can work on the same issue, every issue with more
1234than one pull request is an evaluation on real work. g1t records, per repo and per kind of issue, each
1235agent's win rate, cost and time. That produces a leaderboard, and a routing
1236policy: send each new issue to the agent that wins that kind most often,
1237start with the cheapest that is good enough, and escalate to a stronger one
1238when checks fail.
1239
1240## Talking: the inbox and channels
1241
1242Not a discussions forum. People and agents need one place to talk in real
1243time, and an app that feels like one on desktop and phone.
1244
1245**The inbox comes first.** Everything that needs a person or that they
1246follow, from people and agents: review requests, agent questions and
1247handoffs, failures, mentions, deploys. Read and unread, saved, done,
1248snoozed; ranked so what an agent is blocked on comes first; email digests
1249and push. It is the delivery layer chat needs too (who is told what, read
1250state, push), so building it first makes channels cheap.
1251
1252*Built:* the events service keeps it (`services/events/src/inbox.rs` and
1253`subscriptions.rs`, migrations `0005_inbox` and `0006_inbox_threads` on the
1254`g1t-events` database), writing items as events arrive from the bus; work's
1255`inbox_subject` says what each event names. Each person has one **thread**
1256per issue, pull request, workflow on a branch or deployment: new activity
1257brings it back unread with a count and its last 10 activities, and while it
1258is unread its most urgent severity is kept. Each item has a **reason**
1259(`agent`, `review_requested`, `assign`, `mention`, `ci_activity`,
1260`security_alert`, `state_change`, `author`, `comment`, `manual`,
1261`subscribed`). Who is told: `agent.asked` and `pull.stalled` (needs you,
1262closed again by `pull.resumed` and the like), `pull.review_requested`
1263(needs you, closed by `pull.review_request_removed`),
1264`issue.assigned`/`pull.assigned`, failed checks and workflows,
1265`deployment.failed` and a recovering `deployment.succeeded`, g1t's reviews
1266and finished changes, closes, reopens and merges to everyone subscribed,
1267and comments to the people mentioned and everyone subscribed. Never the
1268actor, never g1t. **Subscriptions**: authors, assignees and reviewers are
1269subscribed without a row; commenting or being mentioned subscribes; anyone
1270can subscribe, unsubscribe (still told of what is asked of them) or ignore.
1271**Watching** a repository: participating (the default), all, ignore, or
1272custom (issues, pulls, deployments, security); whoever creates a repository
1273watches it at their default, all activity unless they change it.
1274**Settings**: which reasons are also emailed (agent, review_requested and
1275mention by default) and the default watch for new repositories; email goes
1276through identity's `notify_by_email`, to a confirmed address only while the
1277person can still read the repository. **REST and MCP**: 14 operations under
1278`/notifications`, `/repos/:owner/:name/subscription` and
1279`/user/subscriptions` (scopes `notifications:read` and
1280`notifications:write`, in the Agent preset), and the `notifications` MCP
1281tool; never usable by g1t's own tokens. On the site: a bell in the top bar
1282opening a sheet with tabs (All, Needs you, Errors, Success, Info), Done,
1283Save, Snooze and Mark all read; `/inbox` with Saved, Done and a reason
1284filter; reasons and update counts on each card; a Notifications box on
1285issue and pull request pages; a Watch menu in the repository header;
1286Settings → Notifications; a Needs you card on mission control. Agent sits
1287beside the bell, disabled. Still to come: security alerts (the security
1288service publishes no event yet), email digests and push, Agent, and
1289channels.
1290
1291**Channels** (working name): workspace channels, direct messages and
1292threads, live.
1293
1294- Each channel is a Durable Object holding its WebSocket connections with
1295 hibernation, so idle channels cost nothing; history in D1, files in R2.
1296- Agents are members. `@g1t` in a channel starts work, answers, or
1297 posts a summary; agents post their questions and handoffs where people
1298 already are. A thread becomes an issue or an outcome in one action, and
1299 the agent's progress streams into that thread.
1300- Tied to the work: issues, pull requests, runs and deploys each have a
1301 thread; links unfurl into live cards (checks, agent step, preview).
1302 What a channel settles can become workspace memory, with its source.
1303- Apps: an installable PWA first (desktop and mobile, offline shell, Web
1304 Push), then native shells on the same API: Tauri for desktop (tray,
1305 deep links), React Native for iOS and Android (background
1306 notifications).
1307
1308GitHub-style Discussions are not planned: channels and threads on the
1309work replace them.
1310
1311## What GitHub ships today, and where g1t differs
1312
1313GitHub's Agent HQ and Copilot app give each agent session its own git
1314worktree and branch, list sessions in a mission-control view grouped by
1315project, and let a task be assigned to several agents so their output can be
1316compared. Underneath, the unit of work is still a branch and a pull request.
1317
1318| | GitHub | g1t |
1319| --- | --- | --- |
1320| Where a session works | A worktree on one developer's machine, or a cloud sandbox | A server-side fork that any agent on any machine can join and anyone can open |
1321| Agent context | Lives in the app's session view | Stored with the repository and linked from each commit (why-blame) |
1322| Several agents on one task | Separate pull requests to compare by hand | One issue holding every pull request made for it, compared side by side, with the merged one recorded on the issue |
1323| Collisions between agents | Found as merge conflicts at the end | Flagged during the work (overlap radar) |
1324| Landing changes | One pull request at a time | A merge queue that lands the chosen one and closes the rest as superseded |
1325| Which agents | Those offered through a Copilot subscription | Any MCP client, plus hosted agents |
1326
1327## How agents connect
1328
13291. **Bring your own agent.** A remote MCP server at `mcp.g1t.sh` lets Claude
1330 Code (or any MCP client) list issues, claim one, get a clone URL and
1331 token, report progress and submit. Adding it is one command; sign-in is a
1332 browser OAuth flow with no token to paste. The `g1t` CLI installs Claude
1333 Code hooks that upload the session transcript as the agent works.
13342. **g1t's agent.** Assign an issue to g1t, or many issues at
1335 once, each to an agent of its own. g1t starts a sandbox for each
1336 (Cloudflare Containers), running a coding agent headless against its
1337 own pull request and fork.
13383. **API and CLI.** Everything above is available at `api.g1t.sh` and
1339 through `g1t`.
1340
1341## Public surfaces
1342
1343| Host | What it serves |
1344| --- | --- |
1345| `g1t.sh` | The site, git over HTTPS, git over SSH |
1346| `api.g1t.sh` | REST API, with no version in its paths, with a published OpenAPI document, cursor pagination, rate-limit headers, idempotency keys on writes, server-sent events for live pull request state, and signed webhooks |
1347| `mcp.g1t.sh` | Remote MCP server over streamable HTTP |
1348
1349g1t is its own OAuth 2.1 authorization server: authorization code with PKCE,
1350dynamic client registration that stores nothing (a client id encodes its
1351own registration, so the open endpoint cannot be used to fill a database),
1352discovery metadata and rotating refresh tokens. Still to come: scopes
1353per resource (`repo:read`, `repo:write`, `issue:write`, `pull:write`).
1354MCP clients, the CLI (device flow) and third-party apps all use it. Access
1355tokens and SSH keys remain for git itself.
1356
1357### Workspace aliases (internal, built 2026-10-07)
1358
1359`g1t` is the product; `flagon-io` is Flagon, Inc., the organization that
1360builds it. So nobody mistakes one for the other, `g1t.sh/g1t` leads to
1361`g1t.sh/flagon-io`. That is a workspace alias: a name g1t's staff point at
1362a workspace, kept in identity's `workspace_aliases` (migration 0029, which
1363seeds `g1t`) by the workspace's id, so it follows renames. It is not a
1364customer feature and is not documented for users; staff add and remove
1365aliases on sudo's Aliases page, with a reason, in sudo's audit log. We may
1366give other companies one for a trading name the same way.
1367
1368An alias is resolved wherever an old slug is (identity's `resolve_slug`),
1369so it costs only the not-found path: site pages 301 to the same page under
1370the workspace, the API and MCP run the call again under its slug, package
1371registries 301, and git over HTTPS is answered in place
1372(`resolve_alias`), because pushes do not follow redirects. An alias is
1373never a route, a username or a workspace's slug, and nobody can register
1374it while it exists. `@g1t` stays g1t's agent: mentions link to how the
1375agent works, never to `/g1t`.
1376
1377## Architecture
1378
1379| Component | Language | Runs on | Responsibility |
1380| --- | --- | --- | --- |
1381| `crates/contracts`, `packages/contracts` | Rust, TypeScript | — | The interface of every service, the event catalogue, shared types. Services and clients depend on this, never on each other's code. |
1382| `services/identity` | Rust | Worker + D1 | Accounts, workspaces and memberships, sessions, SSH keys, access tokens, device sign-in, OAuth codes and grants |
1383| `services/repos` | Rust | Worker + D1 + Artifacts | Repository registry, contents, forks, diffs, landing, git over HTTPS. Storage sits behind a `GitStore` port with an Artifacts adapter. |
1384| `services/work` | Rust | Worker + D1 | Issues, pull requests, comments, sessions; later a Durable Object per repo for the landing queue and live state |
1385| `services/billing` | Rust | Worker + D1 + Stripe | Each workspace's agent credit: payments, the ledger of every run, and the gate on starting one |
1386| `services/events` | Rust | Worker + Queues + D1 | The event bus: durable log, and one queue per subscribing service |
1387| `services/runner`, `crates/runner` | TypeScript, Rust | Worker + Containers | Starts a sandbox per g1t run; the program inside runs the agent harness and reports through the public API |
1388| `services/og` | TypeScript | Worker + Cache API | Social cards at `og.g1t.sh`: one PNG per page of the site and the docs (satori and resvg), looked up as an anonymous visitor, so nothing private appears on one |
1389| `apps/web` | TypeScript | Worker | Server-rendered site. Holds no data; calls services over RPC. |
1390| `apps/docs` | TypeScript | Worker (static) | Documentation and the API explorer |
1391| `apps/api` | Rust | Worker | REST API (`api.g1t.sh`), MCP server (`mcp.g1t.sh`) and OpenAPI document, all generated from one list of operations; the OAuth endpoints |
1392| `crates/sshd` | Rust | Container | Git over SSH, bridged to Artifacts |
1393| `crates/merged` | Rust | Container | Trial merges, conflict matrix, landing merges (needs real git; the Artifacts binding is read-only) |
1394| `crates/core` | Rust | native and WASM | pkt-line, packfile and diff code shared by the above and by the Worker |
1395| `crates/g1t` | Rust | user's machine | CLI: auth, SSH proxy, Claude Code hooks, issues and pull requests |
1396
1397Storage: Artifacts for repositories (one fork per pull request), D1 for accounts
1398and metadata, R2 for session transcripts and logs, Durable Object SQLite for
1399per-repo coordination state.
1400
1401How the services fit together:
1402
1403- **Each service is its own Worker with its own database.** It deploys,
1404 scales and fails on its own. Callers reach it through a typed RPC binding
1405 to the interface in `packages/contracts`.
1406- **Expected failures are values.** Every call returns a `Result`, so "not
1407 found" or "forbidden" crosses a service boundary as data.
1408- **Side effects travel as events.** A service publishes what happened
1409 (`git.push`, `issue.opened`, `pull.merged`, …) to the bus and does not
1410 call other services to react. Each subscriber consumes from its own queue.
1411 Timelines, webhooks and automations read the same stream, which is what
1412 lets something like GitHub Actions be built on top.
1413- **Every read takes the viewer.** Authorization is decided inside the
1414 service that owns the data, not by its callers.
1415
1416The Workers runtime scales request handling on its own, so the edge layer
1417stays in TypeScript. Rust is used where there is real computation or a real
1418protocol to implement.
1419
1420## Languages
1421
1422The site is TypeScript. Everything behind it is Rust, compiled to
1423WebAssembly for Workers and natively for containers and the CLI. Identity, repos, work, events and the API are all Rust. The one exception
1424is the Worker that starts sandboxes, because Cloudflare's Containers
1425library is TypeScript. Rust services speak a
1426small JSON protocol over service bindings (`POST /rpc/<method>`), with the
1427types in `crates/contracts`.
1428
1429## Identifiers
1430
1431Every id is a [TypeID](https://github.com/jetify-com/typeid): a prefix naming
1432the kind of thing, then a UUIDv7 in lowercase base32, such as
1433`pr_01jb2k7x9hfq0b3zj0f5s2m8ra`.
1434
1435- The prefix makes an id self-describing and stops ids of different kinds
1436 being mixed up.
1437- Ids sort by creation time as plain strings. In SQLite (D1 and Durable
1438 Objects) that keeps inserts at the end of the primary-key index instead of
1439 scattering them, and gives time-ordered paging for free.
1440- The suffix decodes to a standard UUIDv7 for any system that wants one.
1441- Ids are made by the service that creates the record, not by the database,
1442 so they work across services and can be assigned before a write.
1443
1444## Events at scale, and audit
1445
1446The current event log is a single D1 database. That is fine for a
1447prototype and wrong for the target: D1 is one writer and 10 GB. The design
1448for volume splits storage by how the data is read.
1449
1450| Tier | Store | Holds | Read by |
1451| --- | --- | --- | --- |
1452| Hot | A Durable Object per repository, with SQLite | Recent events for that repo | Timelines, live pages over WebSocket |
1453| Complete | Cloudflare Pipelines into R2 as Apache Iceberg | Every event, forever, partitioned by day and workspace | Analytics, standups, "ask", export |
1454| Audit | The same R2 store, under object lock | Who did what, from where, with which credential | Compliance, investigation |
1455
1456- **No single hot database.** Each repository's recent events live with that
1457 repository, so load spreads across as many objects as there are repos.
1458- **The complete record is files, not rows.** Iceberg on R2 has no practical
1459 size limit and is queried with SQL.
1460- **Audit is a property of every event.** The envelope carries the actor
1461 (person, agent, token or system), the credential used, the request id and
1462 the source address. Audit entries for a workspace are hash-chained, so a
1463 removed or altered entry is detectable, and are written under a retention
1464 lock.
1465- **Delivery is at least once.** Consumers are idempotent on the event id.
1466
1467## Accounts and forge basics
1468
1469- Registration with email verification, sign-in, forgot password (Cloudflare
1470 Email Sending), Turnstile on public forms.
1471- GitHub sign-in, SSH keys, access tokens, active sessions.
1472- Profiles, public and private repositories, repository search (D1 full-text).
1473- Rendered README, syntax highlighting, commit history, diffs.
1474- Transferring a repository between workspaces (by id: its git store key
1475 never moves; every service follows `repo.transferred`; old paths redirect
1476 until reused) and deleting an empty, settled workspace (its slug is
1477 tombstoned, never reissued except to the person whose username it is).
1478- Access: five repository roles, a workspace base permission, outside
1479 collaborators and invitations. Teams are built on it (2026-10-07): visible
1480 or secret, nested up to 8 levels (child teams inherit their parents'
1481 roles), run by maintainers and owners. A team's role on a repository is a
1482 `repo_grants` row whose principal is the team, which identity resolves
1483 into the same `RepoGrant`s on each person, so `access::can` needs nothing
1484 new: the highest role wins. `@workspace/team` mentions tell the team's
1485 people; a team asked to review either asks everyone or picks people by
1486 round robin or load balance.
1487- CODEOWNERS, read in both conventions (single-section, and sections with
1488 approval counts, optional sections and default owners) from the first of
1489 `.g1t/`, `.github/`, the root, `docs/` and `.gitlab/`. Owners are asked to
1490 review, the `g1t / codeowners` status lints a changed file, and branch
1491 protection's "Require review from code owners" holds merges, for people,
1492 agents and the queue alike, until each owning rule is approved.
1493
1494## Built on Cloudflare
1495
1496| Need | Product |
1497| --- | --- |
1498| Repositories; a fork per pull request; data residency per workspace | Artifacts (forks, jurisdictions) |
1499| Reacting to pushes | Artifacts event subscriptions on Queues |
1500| Preview URL per pull request; deploy on merge | Workers for Platforms on `g1t.page` |
1501| Site, API, MCP, git front end | Workers |
1502| Per-repo coordination, live updates | Durable Objects |
1503| Pull request lifecycles, automations | Workflows, Cron Triggers |
1504| Agent sandboxes, SSH server, merge engine | Sandbox SDK and Containers |
1505| Fast starts on large repos | ArtifactFS |
1506| Model traffic, spend, budgets | AI Gateway |
1507| Summaries, embeddings | Workers AI |
1508| Context hub search | Vectorize |
1509| Accounts and metadata | D1 |
1510| Transcripts and logs | R2 |
1511| Email, bot protection, keys | Email Sending, Turnstile, Secrets Store |
1512
1513## Running g1t yourself
1514
1515g1t.sh runs on Cloudflare, and that does not change. The core is MIT and
1516must also run on anyone's own machine with `docker compose up`. A free
1517core people can self-host is what makes paid hosting worth trusting.
1518Self-hosting never makes hosted worse: hosted code paths keep their
1519behaviour, and a self-hosted adapter sits beside the hosted one. The
1520inventory of every Cloudflare dependency, the design and the risks are in
1521[SELF_HOSTING.md](SELF_HOSTING.md).
1522
1523The approach: the Workers stay Workers, and self-hosted they run in
1524workerd, the open-source Workers runtime. D1, KV and Queues are SQLite on a
1525volume, with the same migrations. Cloudflare-only bindings are replaced
1526by stand-ins:
1527
1528- Artifacts becomes bare repositories served by `git http-backend`;
1529- Email Sending becomes SMTP, through Mailpit;
1530- services that are off answer "off" instead of failing.
1531
1532| Phase | Scope | Estimate |
1533| --- | --- | --- |
1534| 1. Core forge | Done: `deploy/self-host/` (compose, git store, binding stand-ins, smoke test) and the "Run g1t yourself" guide. Left: the API on its own port, `PUBLIC_URL` in place of hard-coded hosts, cron, pull requests in the smoke test, CI that runs it. | 1–1.5 weeks left |
1535| 2. Agents | Docker sandboxes with the same runner image, an egress allow-list proxy for guardrails, `g1t.toml`, a launcher in place of `wrangler dev` | 2–3 weeks |
1536| 3. Search, context, deployments | sqlite-vec plus an OpenAI-compatible embedder; an app host on workerd; Caddy for app and custom domains; SSH | 3–4 weeks |
1537| 4. Parity and upgrades | Code-level ports in `g1t_kit` and `@g1t/platform`, sudo without Access, online backups, released images, an upgrade test in CI | 3–4 weeks |
1538
1539## The submission
1540
1541- **g1t is built on g1t.** This repository is hosted on g1t.sh, its features
1542 are opened as issues and built by racing agents, and it deploys from
1543 Artifacts through Workers Builds. The history is the proof.
1544- **The demo follows one story.** A brief becomes a project; twelve issues
1545 fan out to dozens of agents; agents notice each other, hand off, and
1546 resolve a conflict; reviewers triage; the queue lands everything on
1547 `main`; why-blame explains a line; the portfolio shows where it all
1548 stands. Then the same thing at a thousand agents.
1549- **Judges can try it in a minute.** Open registration on g1t.sh, one-click
1550 import of a GitHub repo, one command to connect Claude Code, a seeded demo
1551 workspace, and a single deploy command for running their own copy.
1552- **The formats are open.** The commit trailers, session format and runner
1553 contract are published so other tools can interoperate.
1554
1555## Build order
1556
1557What is left is ordered by how much it shows the point above, not by forge
1558parity. Forge basics are done well enough; each item below should make the
1559demo's story stronger.
1560
1561Done from this list: the outcome page (a plan's issues as a live graph with
1562cost and a feed of what happened), coordination you can see (agents' issues
1563and comments stand out in the feed; agents hold g1t's tools through a token
1564scoped to one repository), steering a running agent (messages delivered
1565between steps, and at the end), and recording sessions from anyone's own
1566Claude Code (`curl -fsSL https://g1t.sh/install/claude.sh | sh`). Integrations are
1567in: a workspace's own model provider (Anthropic or any Anthropic-compatible
1568endpoint, reached through a model proxy so no sandbox holds a key; its
1569runs pay only their sandbox time), alerts from Sentry, Datadog and signed webhooks
1570that open one issue per problem and can start an agent, and Jira and Linear
1571tickets that agents read, people import, and that hear back. Racing a
1572set number of agents on one issue is dropped: choosing how many agents to
1573use is not something people should have to do.
1574
15751. ~~**Handoffs and questions between agents** as states on the outcome
1576 page.~~ Done: questions and handoffs show as waiting, read, answered,
1577 taken on or declined; since 2026-10-03 an agent asked while it is not at
1578 work is woken to answer, where before the question waited forever.
15792. **Upkeep agents** (above): dependency updates, secret scanning,
1580 vulnerability alerts, code scanning, the security page. No new
1581 infrastructure.
15823. **Deployments on `g1t.page`** (above): previews per pull request,
1583 production on merge, the reviewer agent checking the preview.
15844. **The large run, building 2 and 3.** About 20–30 issues on g1t itself,
1585 built by agents and landed through the queue, for the video: g1t built
1586 on g1t.
15875. **Polish for judges trying it in a minute:** a seeded demo workspace, the
1588 empty states, and the first-run path from sign-up to an outcome landing.
1589
1590Earlier items still open, after those:
1591
15921. Deleting a branch once its pull request merges; risk tiers. (Approval
1593 rules per path are in, as CODEOWNERS.)
15942. Scopes on OAuth grants and access tokens.
15953. Event storage per the design above: per-repo hot log, Iceberg on R2,
1596 hash-chained audit.
15974. CLI with Claude Code hooks to record sessions automatically.
15985. Reviewing and catching up automatically, by policy; required reviews;
1599 risk tiers.
16006. Compare view, proof bundles; handoff between agents.
16017. Projects, mission control, steering; why-blame, digest, timeline.
16028. Context hub, portfolio; automations and integrations (Sentry first).
16039. SSH; bot protection; own keys, endpoints and runners.
160410. Large run (100+ agents across many issues), hardening, demo.
1605
1606Later: code search, mirroring to GitHub, passkeys, SSH
1607on port 22 without the CLI proxy (needs the Workers inbound TCP private
1608beta).