Skip to content

Timeline

The order of all v2 work, from the first create-turbo command to cutover: the steps that belong to no single role, written in full on this site as TL steps, and a row for every Backend, Frontend and Docs Engineer pack at the point where it runs. D25 created this timeline; it follows the decisions and how we work, and never overrides them.

It moved here from the Google doc [Runbook] v2 timeline on 2026-10-07 (TL-M0-27, D28), with its row numbers and step IDs unchanged.

  • Work down the run order. Run a row only when the rows above it are done, unless the row says it can run earlier.
  • Four kinds of rows. TL steps are written in full on this site, one page each. BE and FE packs are written in [Runbook] v2 backend and [Runbook] v2 frontend, in Google Docs until each role moves its runbook here (D28); their row here says when to run them. DOC packs are pull requests to apps/docs from the Docs Engineer (D27). Gates are a decision or a check that must happen before the rows after it.
  • Status lives on the Opleet v2 board (D28). Every M0 row not yet done has an issue, linked in its last column, and the row is done when its issue closes. A row that must wait for another says so. Rows done before the move show their date. Rows of the later phases get their issues when their phase starts.
  • Logging. A run is logged as a comment on the row's issue: the date, what was run, and the output that mattered. A TL step's Runs section keeps the runs logged before the move.
  • Who edits what. A CTO session writes the TL steps and the run order. The Backend, Frontend and Docs Engineers may change the step IDs of their own rows, or add a row marked Proposed where a new pack belongs, in a pull request; only a CTO session or zuki reorders rows or changes a TL step.
  • Agent pull requests. Agents reach Opleettop/monorepo only through the Claude GitHub app, which can see no other repository (D28). They push a branch, open a pull request and get its checks green; they never merge. zuki reviews every pull request and squash-merges it, and the ruleset on main enforces that. In M0 only DOC packs and CTO pull requests arrive this way; from the data phase on, every pack does.
  • When a TL step fails, stop and paste the output into a CTO session (a chat in the SaaS Principal Engineer project with no role named) and into the step's issue.
  • Commands are pnpm first, for zsh on zuki's Mac. Copy one numbered block at a time; each code block has a copy button. The TL steps were run end to end in a test workspace on 2026-10-05, except for the Starlight template download and the first Supabase start; TL-M0-26 was run there on 2026-10-06.
Phase What it delivers Where its steps are
M0 Foundation The repository, tooling and CI; V13's rules in apps/docs, then schema V13 with its tests; the app shell; staging, hosting and the docs site. Rebuilt from an empty folder (D25). TL steps on this site; the M0 tabs of the backend and frontend runbooks; DOC pack A in apps/docs
Data phase Every domain's migration step and reconcile, run end to end on a copy of v1 (D17). The backend runbook's Data phase tab; TL steps for the nightly job
M1 to M7 Each module's database actions and pages, on real data. A DOC pack in apps/docs, then the module tabs of both runbooks
Staff testing and cutover Staff testing, go/no-go and the cutover weekend (D20, D21). [Guide] v2 cutover weekend and rollback; TL steps for production
# Step What it does Written by Issue or outcome
1 TL-M0-01, run as BE-M0-01 Tool versions on the Mac: Node 26.7.0, pnpm 12.8.1, git 2.56.0, Docker 29.8.1 with 3.8 GiB, no psql. Logged in BE-M0-01. BE Done 2026-10-05
2 TL-M0-02 Node 24 for the repository folder CTO Done (reported 2026-10-06)
# Step What it does Written by Issue or outcome
3 TL-M0-03 Create the repository with create-turbo CTO Done (reported 2026-10-06)
4 TL-M0-04 Remove the starter; pin pnpm 12 and Node 24 CTO Done (reported 2026-10-06)
5 TL-M0-05 Shared settings: .gitignore, README, TypeScript base, Turborepo tasks CTO Done (reported 2026-10-06)
6 TL-M0-06 Biome CTO Done (reported 2026-10-06)
7 TL-M0-07 Commit messages: commitlint and Lefthook CTO Done (reported 2026-10-06)
# Step What it does Written by Issue or outcome
8 TL-M0-08 Scaffold apps/web CTO Done (reported 2026-10-06)
9 TL-M0-09 Scaffold apps/docs CTO Done (reported 2026-10-06)
10 TL-M0-10 Create packages/db-types CTO Done (reported 2026-10-06)
11 TL-M0-11 Run everything once from the root CTO Done (reported 2026-10-06)
# Step What it does Written by Issue or outcome
12 TL-M0-12 Private GitHub repository CTO Done (reported 2026-10-06)
13 TL-M0-13 CI on every pull request CTO Done (reported 2026-10-06)
14 TL-M0-14 Protect main: a local push guard (path B, D26). The GitHub ruleset comes in TL-M0-28 (D28) CTO Done 2026-10-06 (path B)
14a TL-M0-26 Rule format and the rule check: the page that defines a rule, and pnpm docs:rules in CI (D27). Doesn't depend on the GitHub plan. CTO Done 2026-10-06
14b TL-M0-28 GitHub Team (D28, closes OQ23): the ruleset on main, Dependabot alerts, the labels, the Opleet v2 board, and the Claude app on monorepo only. Row 35a runs right after it CTO #9
14c DOC pack A V13's rules into apps/docs: the site's structure and sidebar, the domain codes, and each business rule from the V13 references (Q1 to Q9, P1 to P16, the rules and conventions, roles and RLS) as a rule with an ID and status planned. Can run alongside rows 15 to 18; BE pack B waits for it. Waits for row 14b. DOC #10
# Step What it does Written by Issue or outcome
15 TL-M0-15 Docker memory for the local Supabase stack CTO Done 2026-10-06
16 TL-M0-16 Supabase CLI and an empty local project CTO Done 2026-10-06
17 TL-M0-17 AGENTS.md: the guide every coding agent reads CTO Done 2026-10-06; its line about the agent fork replaced by TL-M0-27 (D28)
# Step What it does Written by Issue or outcome
18 BE pack A · BE-M0-10, BE-M0-11 Local stack settings in config.toml: auth (sign-up off, site URL), the ES256 signing key so getClaims() verifies locally (FE-R4), unused services switched off. BE Done 2026-10-06
18a BE pack A · BE-M0-32 The local signing key out of git and a new one made: pull request #6 committed supabase/signing_keys.json, the private key. Can run now. Proposed by BE on 2026-10-07. BE #69
19 BE pack B · BE-M0-12 to BE-M0-20 Schema V13 written domain by domain: extensions and enums; tenancy and access, with profiles.locale and an RPC that sets the caller's own locale (FE-R5); master data; vehicles; drivers; rentals; operations; money; functions and views. Each file comes with its pgTAP tests and error keys (D10, D19). Waits for row 14c. BE #11
20 BE pack C · BE-M0-21 RLS: the policy generator in tools/db and the generated policies, with tests for pool scoping, deny overrides, tenant isolation and anon. BE #12
21 BE pack D · BE-M0-22 to BE-M0-24 Seed and Storage: the system rows, the sealed E2E organization, buckets with D14 paths and the P15 guards. BE #13
22 BE pack E · BE-M0-25 to BE-M0-27, BE-M0-31 E2E logins script in tools/db (FE-R2); the pnpm db:types script and the first generated types (FE-R1); the acceptance check: each of the 44 checks the delivered M0 had passes as a pgTAP test. BE #14
23 TL-M0-18 CI database job: start, reset, test, types diff, on a path filter (D12). Waits for row 22. CTO #15
# Step What it does Written by Issue or outcome
24 FE pack A · FE-M0-02 to FE-M0-05 The Opleet design system in apps/web: tokens, op-* CSS, components and icons, behind the @ui/ alias (D8), from the Opleet Design System. Can run any time after row 11. FE Done 2026-10-07
25 FE pack B · FE-M0-06 to FE-M0-08 Supabase clients with @supabase/ssr and the publishable key; proxy.ts with getClaims(); sign-in and sign-out (D13, D22). Waits for row 22. FE #16
26 FE pack C · FE-M0-09 to FE-M0-11 The shell: navigation by permission from my_permissions(), pool switcher, theme, refusal page, module placeholders, design preview. Waits for row 22. FE #17
27 Gate OQ17 decided: option A1, Indonesian-first text built in apps/web with an English file beside it (D29). zuki Done 2026-10-07
28 FE pack D · FE-M0-12 to FE-M0-14 Languages: the catalog, the locale toggle saved on the profile, and the error-key mapper (D7, D10). Waits for row 27. FE #18
29 FE pack E Playwright: the smoke specs and the per-role menu check against the local stack (D19). Waits for rows 25 and 26, and the six rules pack E cites in apps/docs. FE #19
30 TL-M0-19 CI end-to-end job: the smoke specs on every pull request. Waits for row 29. CTO #20
# Step What it does Written by Issue or outcome
31 TL-M0-20 The v2 staging Supabase project: Singapore, Postgres 17, auth settings by hand CTO #21
32 BE pack F · BE-M0-28 to BE-M0-30 Link the CLI to staging; first push; seed and E2E logins on staging. BE #22
33 TL-M0-21 Vercel project for apps/web in Singapore, pointed at staging, on the paid plan (D5; Hobby can't deploy a private organization repository). Deployment Checks on the checks job, so a production deploy goes live only after CI passes on its commit (D26). CTO #23
34 TL-M0-22 Sentry project for apps/web (D24); FE wires the SDK in its next pack CTO, FE #24
35 TL-M0-23 Cloudflare Pages for apps/docs behind Cloudflare Access. Can run any time; runs early so the upper-ups can review the rules. CTO #25
35a TL-M0-27 The register and this timeline move into apps/docs as one CTO pull request, with their numbers unchanged; each Google doc gets a first line pointing there (D28). Runs right after row 14b, ahead of its place here. Waits for row 14b. CTO #26
36 TL-M0-24 M0 exit check (below) CTO #27

M0 exit check (row 36). M0 is done, and the data phase starts (D17, D25), when all of these hold:

  • A fresh clone installs with pnpm install --frozen-lockfile, then builds and typechecks without errors.
  • pnpm supabase start applies every migration and the seed; pnpm supabase db reset rebuilds from empty; pnpm supabase test db passes, the 44 acceptance checks included.
  • An E2E login for each role signs in on the local stack and sees the menu its v1 role sees.
  • CI is green on a pull request: checks, pr-title, the database job and the end-to-end job.
  • Staging holds the schema, the seed and the E2E logins, and the Vercel deployment signs in against it.
  • apps/docs is deployed behind Cloudflare Access.
  • main is protected: the ruleset from TL-M0-28 is active (D28), and Vercel holds each production deploy until the checks job passes on its commit.
  • apps/docs holds V13's rules with IDs, pnpm docs:rules passes in CI, and each of the 44 acceptance checks cites a rule (D27).
  • The register lives in apps/docs, with its numbers unchanged (TL-M0-27, D27).
# Step What it does Written by Status
1 BE pack Copy v1 into a throwaway local database, as in Part C of the database workflow guide. The dump is personal data: it stays outside the repository and is deleted afterwards. BE Not written
2 BE pack The money study first (D17): v1's bills, debts and payments read on the copy. What it finds changes the schema before pages depend on it. BE Not written
3 Gate OQ19 decided: finance names the v1 balance of record (D18). zuki Open
4 BE pack The migration machinery in tools/migration: snapshot, value_map, id_map, unmapped values, unmatched rows and accepted differences (D18). BE Not written
5 BE packs The domain steps in order, each with its reconcile checks: access, master_data, vehicles, drivers, rentals, operations, money. BE Not written
6 BE pack Photos from v1 Storage to the v2 buckets at D14 paths, skipping what was already copied. BE Not written
7 Gate CR1 and OQ4 decided: what may run unattended, and what runs the rehearsal. zuki Open
8 TL step A read-only database user on v1 production for the rehearsal. It touches v1 production, so it stays L0. CTO Not written
9 TL step The nightly rehearsal job. CTO Not written; needs row 7
10 Gate The first full night runs end to end on staging. zuki Open
# Step What it does Written by Status
1 M1 Access and master data. Decide first: OQ1, OQ2. The DOC pack (the module's rules, with IDs), then the BE pack (tests first, then actions, views and error keys), then the FE pack (journeys first, then pages), then a demo to the team leads on staging with real data. DOC, BE, then FE Not written
2 M2 Vehicles. Decide first: OQ10. The DOC pack (the module's rules, with IDs), then the BE pack (tests first, then actions, views and error keys), then the FE pack (journeys first, then pages), then a demo to the team leads on staging with real data. DOC, BE, then FE Not written
3 M3 Drivers, queue and screening. Decide first: OQ7, OQ8, OQ9, OQ13. The DOC pack (the module's rules, with IDs), then the BE pack (tests first, then actions, views and error keys), then the FE pack (journeys first, then pages), then a demo to the team leads on staging with real data. DOC, BE, then FE Not written
4 M4 Onboarding, booking and contracts. Decide first: OQ6. The DOC pack (the module's rules, with IDs), then the BE pack (tests first, then actions, views and error keys), then the FE pack (journeys first, then pages), then a demo to the team leads on staging with real data. DOC, BE, then FE Not written
5 M5 Operations. The DOC pack (the module's rules, with IDs), then the BE pack (tests first, then actions, views and error keys), then the FE pack (journeys first, then pages), then a demo to the team leads on staging with real data. DOC, BE, then FE Not written
6 M6 Money. Decide first: OQ9, OQ11. The DOC pack (the module's rules, with IDs), then the BE pack (tests first, then actions, views and error keys), then the FE pack (journeys first, then pages), then a demo to the team leads on staging with real data. DOC, BE, then FE Not written
7 M7 Reports. The DOC pack (the module's rules, with IDs), then the BE pack (tests first, then actions, views and error keys), then the FE pack (journeys first, then pages), then a demo to the team leads on staging with real data. DOC, BE, then FE Not written
# Step What it does Written by Status
1 Gate OQ20 and OQ22 decided: what must work on the first Monday, and who does what at cutover. zuki Open
2 TL step The v2 production Supabase project: Singapore, Postgres 17, the nightly pg_dump and MFA for super_admin (D16), auth settings (OQ12). CTO Not written
3 BE pack Personal data in place before go-live: retention rules (OQ18), app.anonymize_driver(), the breach procedure, and the lawyer's review (D15). BE Not written
4 — Two weeks of staff testing on staging, with a shadow day per team. zuki, team leads Not started
5 Gate Go/no-go: 10 clean nights in a row, every test green, each team lead's sign-off, a finance period close (D20). zuki Open
6 — The cutover weekend, run from [Guide] v2 cutover weekend and rollback. Saturday decides (D21). zuki Not started
7 BE pack After cutover: the migration files frozen into a baseline; from then on, changes are new files only (D11). BE Not written

TL-M0-01 is BE-M0-01 in the backend runbook, done on 2026-10-05. Every other TL step has its own page under M0 TL steps in the sidebar, in run order. Every step is L0: zuki runs it by hand and logs the run on the step's issue.