Làm việc trên cloud
Từ 2026-09-01, môi trường phát triển chuẩn của Nemo12 là Claude Code on web (claude.ai/code): phiên Claude chạy trên máy cloud của Anthropic, tự clone dac2205/nemo12.com, làm việc rồi mở PR. Máy local vẫn dùng được, nhưng không còn là nơi duy nhất giữ trạng thái.
Managed Agents không chạy trên Cloudflare. Vòng lặp agent và sandbox của Managed Agents đều nằm trên hạ tầng Anthropic. Cloudflare trong dự án này là nơi sản phẩm chạy (Workers, D1, R2, Queues) — không phải nơi agent chạy. Muốn phần thực thi thật sự nằm trên Cloudflare thì phải dựng self-hosted sandbox (worker polling ngoài) — chưa làm, và chưa cần.
Ba chế độ phiên, đừng chọn nhầm
Nút chọn môi trường ở claude.ai/code có ba mục, và chỉ MỘT trong ba thật sự chạy trên cloud:
| Chế độ | Claude Code chạy ở đâu | Máy anh tắt thì sao |
|---|---|---|
| Cloud ☁ | máy cloud của Anthropic, tự clone repo từ GitHub | phiên vẫn sống, tự khởi động lại khi rảnh quá lâu |
| Remote Control 🖥 | máy Mac của anh — claude.ai chỉ là màn hình điều khiển | phiên chết: Remote Control disconnected |
| Local | app desktop | không liên quan tới claude.ai |
Nhìn icon cạnh tên phiên là biết ngay: hình đám mây là Cloud, hình màn hình là Remote Control. Phiên Cloud còn ghi kèm tên môi trường (Default · nemo12.com); Remote Control thì không.
Đây là chỗ dễ nhầm nhất, vì cả ba đều mở từ cùng một trang web và nhìn giống hệt nhau lúc đang chạy. Chỉ khi máy Mac ngủ hoặc đóng thì mới lộ ra phiên đó thật ra vẫn phụ thuộc vào máy — và lúc đó công việc đang dở đã đứng rồi. Một phiên đã tạo không đổi chế độ được; muốn chuyển thì mở phiên mới ở chế độ Cloud.
Ba thứ trước đây chỉ có ở máy local, nay đã vào repo
| Thứ | Trước | Nay |
|---|---|---|
| Trí nhớ phiên | ~/.claude/projects/…/memory/ trên một máy | .claude/memory/ trong git |
.env dev của từng app | gõ tay, gitignore | npm install tự dựng lại từ .env.production |
| Skills + dev server | đã ở .claude/ trong git | không đổi |
Khởi động một phiên cloud
npm installChỉ vậy. Vòng đời prepare của npm chạy hai việc: bật .githooks, và dựng các file .env dev từ .env.production đã có trong git (giá trị duy nhất là Google OAuth client ID — công khai). Không có bước bootstrap nào phải nhớ; một bước phải nhớ là một bước sẽ có ngày bị quên, và cái hỏng khi quên thì im lặng — npm run dev vẫn chạy, chỉ là đăng nhập Google gãy.
npm run setup:env vẫn còn để chạy lại riêng phần .env. Trên CI thì script tự đứng ngoài: build ở đó đọc thẳng .env.production, thêm một file .env nữa chỉ làm mờ nguồn giá trị.
Đọc .claude/memory/MEMORY.md trước khi bắt tay: đó là bối cảnh mà một phiên mới không tự suy ra được từ code.
Cái gì KHÔNG đi lên cloud
Secret thật vẫn ở đúng chỗ cũ và không bao giờ vào repo:
CLOUDFLARE_API_TOKEN,CLOUDFLARE_ACCOUNT_ID— GitHub repo Secrets, CI đọc lúc deploy.- Secret của worker —
wrangler secret, không có bản sao ở đâu khác. - ID đo lường (
VITE_GTM_ID) — GitHub repo Variables.
Phiên cloud không có các thứ này, và đó là đúng: deploy đi qua CI (luật đầy đủ ở .claude/memory/nemo12-deploy-qua-github.md — nằm ngoài site docs nên không đặt link được), không phải qua tay phiên.
Nhiều phiên vẫn phải theo luật cũ
Phiên cloud mỗi cái một bản clone riêng nên không còn cảnh hai phiên ghi đè nhau trên cùng một cây làm việc. Nhưng luật sổ chung (docs/intake.md + docs/intake/, docs/traceability.md, bảng REQ) vẫn nguyên: chỉ CHÈN, không ghi đè, và cấp số SRC bằng node scripts/src-new.mjs. Hai phiên cloud song song vẫn cấp trùng số nếu đọc con trỏ rồi tự +1.