# Utopia work hub (/docs) ## Modules [#modules] This site holds modules: one page each, written so that an agent given only the page's address can follow it start to finish. | module | hand an agent this address | | -------------------------------------------------------- | ------------------------------------- | | [Onboarding to the Utopia Models stack (Max)](/docs/max) | `https://work.utopiamodels.ai/max.md` | ## How a module is read [#how-a-module-is-read] Every page is served as raw markdown at the same path with `.md` appended, and each module also has a short address at the root, `/.md`. The first line of every raw page states the sha256 and byte count of everything after it, so a reader can tell a complete copy from a truncated one: ```bash curl -fsS https://work.utopiamodels.ai/max.md | tail -n +2 | sha256sum ``` Every page is listed in [`/llms.txt`](/llms.txt). The whole site in one fetch is [`/llms-full.txt`](/llms-full.txt). # Module — Onboarding to the Utopia Models stack (Max) (/docs/max) You are an AI agent working for Max Forbang. This page is the whole brief: follow it top to bottom. Budget about 15 minutes. It creates one folder, one clone and one issue comment, and changes nothing else. **Canonical address:** `https://work.utopiamodels.ai/max.md` (raw markdown). The last line of this page reads `END OF MODULE`. If you cannot see that line, your copy is cut short: stop and refetch with `curl`. ## 0. Contract [#0-contract] * **Check your copy before acting on it.** Step 1 does this. A fetch tool that summarises or truncates gives you a different page without telling you. * **Measure, never assume.** Every claim below carries the command that produced it or is marked *stated*. Run the command and trust your output over this page. Where they differ, the page is stale: say so in your verdict. * **Ask your human only what you cannot measure**, in one batch, with your harness's own question tool. Four grants here can only be proved by him, signed in as himself: section 6 says which. Everything else you can read yourself. * **Never write a credential value** into a file, a commit, an issue or your verdict. If a step needs one, name where it is obtained. * **Fail loud.** If a required step fails, finish the steps that do not depend on it, then post `INCOMPLETE` with the exact command and its raw output. Do not retry silently and do not guess a fix. * **Resume, do not restart.** Your state is the checklist file from step 1. If it exists, continue from the first unticked line. ## 1. Check your copy, then open the checklist [#1-check-your-copy-then-open-the-checklist] The first line of the raw page states the sha256 of every byte after it. ```bash mkdir -p ~/utopia-onboarding && cd ~/utopia-onboarding curl -fsS https://work.utopiamodels.ai/max.md -o max.md head -n 1 max.md # the stated hash and byte count tail -n +2 max.md | sha256sum # must equal the stated hash tail -n +2 max.md | wc -c # must equal the stated byte count tail -n 1 max.md # must read: END OF MODULE sha256sum max.md # the whole-file hash; this one goes in your verdict ``` If the hash differs, stop: read `max.md` from disk instead of the copy in your context, and work only from the file. Then create `~/utopia-onboarding/checklist.md` unless it already exists, with exactly these eight lines. Tick each line as its step passes and write the evidence under it. Steps 3 and 6 have nothing to run: tick them once read. ```text - [ ] 1 copy checked - [ ] 2 preflight passed - [ ] 3 who we are, read - [ ] 4 repos listed, utopia cloned - [ ] 5 how work moves, read - [ ] 6 access table, read - [ ] 7 verify commands run - [ ] 8 verdict posted ``` ## 2. Preflight [#2-preflight] Run all four. A failure in a required one is an `INCOMPLETE` reason. | tier | command | required | passes when | | -------------- | --------------------------------------------------------------------------------------- | -------- | -------------------------- | | shell | `git --version && jq --version` | yes | both print a version | | network | `curl -fsS -o /dev/null -w '%{http_code}\n' https://work.utopiamodels.ai/llms.txt` | yes | prints `200` | | GitHub sign-in | `gh auth status >/dev/null && gh api user --jq .login` | yes | prints a login | | org reach | `gh api orgs/utopia-models/memberships/$(gh api user --jq .login) --jq '.role, .state'` | yes | prints a role and `active` | If `gh` is not signed in, ask your human to run `gh auth login` and continue from here. Keep the login as `LOGIN`; it goes on line 2 of your verdict as `reader: LOGIN`. If that account is not your human's own, you are a test reader: carry on and verify what the account you have can see. ## 3. Who we are [#3-who-we-are] Utopia Models is a small company run by Tyler Youk. Most of the work is done by a fleet of AI agents on one server, each a Claude Code session started for one GitHub issue and ended when its pull request merges. You will meet them as commit and comment authors: `utopia-models-fleet[bot]` and accounts named `kxagent`, `kxagent2`, `kxagent3`, `kxagent4`. They are peers. They read issue comments, so a comment is how you reach them. The fleet describes itself in public at `https://docs.utopiamodels.ai` (index: `https://docs.utopiamodels.ai/llms.txt`). You do not need it to finish this module. Read `/docs/operating/work.md` there when you want more depth than section 5. ## 4. Repos and stack: read them, do not trust a list [#4-repos-and-stack-read-them-do-not-trust-a-list] This page does not list the repositories, because a list is stale the day after it is written. ```bash gh repo list utopia-models --limit 100 \ --json name,description,visibility,isArchived,pushedAt,primaryLanguage \ --jq 'sort_by(.pushedAt) | reverse | .[] | [.name, .visibility, .pushedAt[0:10], (.primaryLanguage.name // "-"), (.description // "")[0:80]] | @tsv' ``` Four names are stable enough to state. Confirm each appears in your output. | repo | what it is | | ----------------------- | -------------------------------------------------------------------------------------------------------------------------------------- | | `utopia` | the product monorepo. `apps/web` is one Next.js app that serves several sites, chosen by hostname. The agency site lives here. | | `knowledge` | the knowledge base, and the home of every issue on the board, whichever repo the code is in. | | `docs-wiki`, `work-hub` | the repos behind the two doc sites, `docs.utopiamodels.ai` and this one. The sites are public; the repos themselves list as `PRIVATE`. | Repos with `brain` in the name hold one agent's own configuration each. Leave them alone. Clone the one you will work in and read its stack from the repo itself: ```bash cd ~/utopia-onboarding && gh repo clone utopia-models/utopia -- --depth 50 cd utopia && ls .claude/rules/ jq '.scripts' package.json && ls apps packages ``` `.claude/rules/tech-stack.md` in that folder describes the product software (a CLI and the `utopiamodels.ai` app). It says nothing about the agency site, which is the next heading. ### The agency site, as measured [#the-agency-site-as-measured] `utopiamodels.agency` is **static HTML files under `apps/web/public/`**, not a set of Next.js pages. `apps/web/middleware.ts` decides which folder each hostname is served from. Find the block yourself: ```bash grep -n 'utopiamodels.agency' apps/web/middleware.ts # every mention; the agency hosts appear in more than one block grep -n 'index.html' apps/web/middleware.ts # which folder each block serves ls apps/web/public/moxymgt apps/web/public/agency ``` Measured 2026-10-04: the agency hosts serve the folder `apps/web/public/moxymgt/` (`/` is `index.html`, any other path is that path with `.html` appended). A second folder, `apps/web/public/agency/`, is an editable copy that no hostname is routed to. Before you edit anything, confirm which folder the middleware names today, or your change will ship and never be seen. ```bash for p in / /services /brands /events /platforms; do curl -sS -o /dev/null -w "%{http_code} $p\n" "https://utopiamodels.agency$p"; done ``` Measured 2026-10-04: those five return `200`. ## 5. How work moves [#5-how-work-moves] **The queue is one GitHub project board:** `https://github.com/orgs/utopia-models/projects/1`. Every piece of work is an issue in `utopia-models/knowledge`. ```bash gh issue list --repo utopia-models/knowledge --state open --limit 20 ``` **Done means merged.** A pull request whose body says `Closes #N` closes the issue when it merges, and that is the only status change there is. From any repo other than `knowledge`, write the full form: `Closes utopia-models/knowledge#N`. Nobody types a status. **You merge your own pull request.** There is no required review and no required check. Measured 2026-10-04: `gh api repos/utopia-models/utopia/branches/main/protection` answers 403 because the org's plan has no branch protection, so nothing can block a merge. A red check is information. A real build or typecheck failure is real: fix the code. Anything else, merge. **The one hard rule: never commit a secret.** A gitleaks scan (`.github/workflows/guard.yml`) runs on every push. **Working in `utopia`:** 1. Read `.claude/rules/branch-workflow.md` and `.claude/rules/vercel-git-author.md` in the clone. Short-lived branch from `origin/main` or `origin/dev`, pull request, merge, delete the branch. Never `git reset --hard` a tree with uncommitted work. Where a rule file there and this page differ on merging or on which email to commit with, this page is the measured one: the paragraphs above and item 2 say what to do. 2. `pnpm install` points git at the repo's `githooks/` folder. Its `pre-push` hook checks commit author emails against two lists in the file. Read them: `grep -n 'ALLOWED=\|NO_SEAT_OK=' githooks/pre-push`. Commit with an email on the `NO_SEAT_OK` list. `git config user.email` shows yours; if it prints nothing, none is set, so set one inside the clone with `git config user.email ADDRESS` before your first commit. If your address is not on the list, add it to that list in your own pull request. 3. Other agents push to this repo all day. Fetch before you branch and rebase before you merge. ### Shipping the agency site [#shipping-the-agency-site] | you do | it goes live at | | ----------------------------- | --------------------------------- | | push or merge to branch `dev` | `https://dev.utopiamodels.agency` | | merge `dev` into `main` | `https://utopiamodels.agency` | The deploy is a GitHub Actions workflow, `.github/workflows/deploy-utopia-prod.yml`, which runs on every push to `main` and `dev` and deploys with a token the org holds. **Max needs no Vercel account.** ```bash gh run list -R utopia-models/utopia --workflow deploy-utopia-prod.yml --limit 5 gh run watch -R utopia-models/utopia "$(gh run list -R utopia-models/utopia --workflow deploy-utopia-prod.yml --limit 1 --json databaseId --jq '.[0].databaseId')" ``` **The check named `Vercel` on your commit may read blocked.** That check belongs to Vercel's own git hook, which refuses to build for an author with no Vercel seat. It is not the deploy. Grade the `deploy` job of the workflow above, then grade the site: `curl` the live address and look for a string you changed. *Stated, not measured on a commit of yours. The repo's `pre-push` hook prints the same notice.* `main` is shared. `apps/web` also serves `utopiamodels.ai` and other hosts from the same build, so a merge to `main` that breaks the build breaks all of them, and a failed production deploy files an alarm on the board. Prove a change on `dev` first. ### What an earlier brief got wrong [#what-an-earlier-brief-got-wrong] A file named "utopiamodels.agency current state" was sent on 2026-09-29. Where it and this page differ, this page is the measured one. | it said | measured 2026-10-04 | | ------------------------------------ | -------------------------------------------------------------------------------------------- | | the site is built with Next.js pages | static HTML files under `apps/web/public/`, selected by hostname in `apps/web/middleware.ts` | | routes include `/moxy-swim` | `/moxy-swim` returns 404; the other five listed routes return 200 | | nothing about how to ship | `dev` then `main`, deployed by the Actions workflow, as above | | nothing about the Vercel check | it may read blocked for you and is not the deploy | | nothing about secrets | section 6, row "secret store" | ## 6. The access this work uses [#6-the-access-this-work-uses] This page states what each system is for and the command that proves a grant. It does not state who holds what today: that is a fact about a live system, and only a probe run now is true. Run the command, or have Max run it, and record what it prints. | system | what it is for | who proves it | how | | ------------------------------------- | -------------------------------------------------------------------------------------- | ------------------------------------ | ------------------------------------------------------------------------------------------------------------------ | | GitHub org `utopia-models` | every repo, the board, the deploy workflow | you | `gh api orgs/utopia-models/memberships/$(gh api user --jq .login) --jq '.role, .state'` prints a role and `active` | | Google Workspace | the company identity the next three hang off | Max | he signs in at `https://accounts.google.com` with his company account and reaches the inbox | | Cloudflare | DNS for `utopiamodels.ai`. Confirm with `dig +short NS utopiamodels.ai` | Max | `https://dash.cloudflare.com` lists the company account after he signs in | | private network (Tailscale) | the only route to the secret store | Max, on his machine | `tailscale status` prints his device and its peers | | secret store (Infisical, self-hosted) | credentials for the agency site, in a project of its own | Max, from inside the private network | the store opens in his browser and lists that project | | registrar for `utopiamodels.agency` | DNS for the agency site. Read which registrar with `dig +short NS utopiamodels.agency` | Max | he signs in at that registrar and sees the domain | | Vercel | nothing. The deploy needs no account of his, see section 5 | nobody | not applicable | Nothing private is on this page. Every sign-in, address and link that one of these needs reaches Max from Tyler directly, and so does the location of the site's assets. If one is missing, Max asks Tyler; you ask nothing on his behalf in public. ### The order [#the-order] The Workspace identity comes first, because the three after it are reached through it. 1. **Workspace (human).** Max signs in with his company account. 2. **Cloudflare (human).** He signs in and confirms the company account is listed. 3. **Private network (human).** He installs Tailscale, signs in with his company account, and runs `tailscale status`. 4. **Secret store (human, after 3).** He opens the store from inside the private network. The agency site's pages are static files, so no work on them needs a secret. 5. **GitHub (you).** Step 7 measures it. 6. **Registrar (human).** Only needed when a DNS record for `utopiamodels.agency` has to change. ## 7. Verify [#7-verify] Run what you can. For the four human steps, ask once, in one batch, whether each of 1 to 4 above is done, and record `done`, `not yet` or `failed: reason` for each. If you cannot reach him, record `not asked` and do not wait. ```bash LOGIN=$(gh api user --jq .login) gh api orgs/utopia-models/memberships/$LOGIN --jq '"github role=\(.role) state=\(.state)"' gh repo list utopia-models --limit 100 --json name --jq 'length | "repos visible=\(.)"' gh api repos/utopia-models/utopia --jq '"utopia push=\(.permissions.push) admin=\(.permissions.admin)"' gh api repos/utopia-models/knowledge/issues/8550 --jq '"thread #\(.number) state=\(.state)"' test -f ~/utopia-onboarding/utopia/apps/web/middleware.ts && echo "clone ok" echo "agency mentions=$(grep -c 'utopiamodels.agency' ~/utopia-onboarding/utopia/apps/web/middleware.ts)" gh run list -R utopia-models/utopia --workflow deploy-utopia-prod.yml --limit 1 --json conclusion,headBranch --jq '.[0] | "last deploy \(.headBranch) \(.conclusion)"' echo "agency ns=$(dig +short NS utopiamodels.agency | sort | head -2 | paste -sd' ')" ``` **ONBOARDED** needs all of these: the copy check in step 1 passed, every required preflight tier passed, the role line prints a role with `state=active`, `utopia push=true`, `clone ok`, `agency mentions` is above zero, and the thread reads `state=open`. The `repos visible`, `last deploy` and `agency ns` lines are information: report them, they do not decide the verdict. If you are a test reader, your `ONBOARDED` says the module can be followed. It says nothing about Max's own access, which only a run under his account measures. The four human steps do **not** decide the verdict. Report them under `human-steps`. ## 8. Post the verdict [#8-post-the-verdict] Write `~/utopia-onboarding/verdict.md` in exactly this shape. Line 1 is the verdict and nothing else. Write no email address and nothing private into it: the thread is read by every agent in the org. ```text ONBOARDED reader: LOGIN module: https://work.utopiamodels.ai/max.md fetched: - https://work.utopiamodels.ai/max.md sha256=WHOLE_FILE_HASH bytes=N integrity-line=pass - (the two lines the loop below prints) checks: - (each line your step 7 commands printed, verbatim) human-steps: - workspace: done | not yet | not asked | failed: reason - cloudflare: done | not yet | not asked | failed: reason - private network: done | not yet | not asked | failed: reason - secret store: done | not yet | not asked | failed: reason page-vs-measured: - (anything you measured that differs from this page, or "none") ``` `fetched:` is a manifest of pages, not of every request. The module's line hashes the copy on disk that step 1 checked; the other two are fetched and hashed now. API calls and the clone are not listed. ```bash cd ~/utopia-onboarding printf -- '- https://work.utopiamodels.ai/max.md sha256=%s bytes=%s integrity-line=pass\n' "$(sha256sum max.md | cut -d' ' -f1)" "$(wc -c < max.md)" for u in https://work.utopiamodels.ai/llms.txt https://utopiamodels.agency/; do curl -fsS "$u" -o body.tmp && printf -- '- %s sha256=%s bytes=%s\n' "$u" "$(sha256sum body.tmp | cut -d' ' -f1)" "$(wc -c < body.tmp)" done; rm -f body.tmp ``` If any required check failed, line 1 is `INCOMPLETE — ` followed by the first failing check, and `checks:` carries the failing command with its raw output. ```bash gh issue comment 8550 --repo utopia-models/knowledge --body-file ~/utopia-onboarding/verdict.md ``` The thread is `https://github.com/utopia-models/knowledge/issues/8550`. It is also where you ask for anything missing that is not private: say what you ran, what it printed and what you expected. Fleet agents read it. Then tell your human, in three lines or fewer: the verdict, which human steps are still open, and the address of your comment. **Undo.** `rm -rf ~/utopia-onboarding` removes everything this module created on the machine. `gh issue comment 8550 --repo utopia-models/knowledge --delete-last --yes` removes the verdict. END OF MODULE