Trade With Viet
Session Explainer
Internal use only — enter access password
session

Full-stack upgrade: codebase health, premium design system, TWV rail consolidation, live deploy

2026-07-03 · explainer.tradewithviet.com

One audit, three workstreams, shipped to productionMột lần rà soát, ba luồng công việc, đã lên production

A three-agent audit of the VietConnect app and the TradeWithViet content-automation skills turned into 13 verified commits: type-safety restored, a fragmented UI unified into one premium design system, and the TWV publishing rails collapsed from seven to one with a slot-lock that prevents double-posts. Merged to main and deployed live.Một lần rà soát bằng ba agent trên app VietConnect và bộ kỹ năng tự động hóa nội dung TradeWithViet đã thành 13 commit đã kiểm chứng: khôi phục type-safety, gom giao diện rời rạc thành một hệ thiết kế cao cấp thống nhất, và rút các đường xuất bản của TWV từ bảy xuống một, kèm khóa khung giờ chống đăng trùng. Đã merge vào main và deploy live.

{'en': 'Status', 'vi': 'Trạng thái'}LiveĐã live{'en': 'Commits', 'vi': 'Commit'}13{'en': 'Verify', 'vi': 'Kiểm chứng'}99 unit + 32 e2e green99 unit + 32 e2e xanh{'en': 'Scope', 'vi': 'Phạm vi'}Next.js app + TWV skillsApp Next.js + kỹ năng TWV

6-layer thinking chainChuỗi tư duy 6 tầng

L1
Raw requestYêu cầu gốc
"Review my website codebase and the TWV skills to see what to upgrade, make more efficient, and more premium." Later: "push and deploy live.""Rà soát codebase website và các kỹ năng TWV xem có thể nâng cấp, hiệu quả hơn, giao diện cao cấp hơn." Sau đó: "push và deploy live."
L2
Reframe — what was really neededDiễn giải lại — nhu cầu thật
This was not a request for small tweaks. It was a quality lift across a pre-revenue platform and its content siblings: reduce the tech debt that slows every future session, make the product look investment-ready, and stop the recurring double-post incidents in the automation. The word 'review' means diagnose first, not start editing.Đây không phải yêu cầu chỉnh vặt. Đây là một đợt nâng chất trên nền tảng chưa có doanh thu và các nhánh nội dung của nó: giảm nợ kỹ thuật đang làm chậm mọi phiên làm việc sau này, làm sản phẩm trông sẵn sàng gọi vốn, và chấm dứt sự cố đăng trùng lặp lại trong tự động hóa. Chữ 'rà soát' nghĩa là chẩn đoán trước, chưa sửa vội.
L3
ConstraintsRàng buộc
  • Next.js 16 and Tailwind v4 differ from training-data conventions (no tailwind.config; tokens live in globals.css).
  • The database type file is hand-maintained, not generated.
  • The EN/VI i18n parity gate must stay at 100%.
  • TWV skills live outside the repo (gitignored) and the WordPress site is live, so no experiments there.
  • Buffer is on the FREE plan; no OAuth possible in a headless session.
  • Next.js 16 và Tailwind v4 khác với quy ước trong dữ liệu huấn luyện (không có tailwind.config; token nằm trong globals.css).
  • Tệp kiểu dữ liệu (database types) được bảo trì tay, không phải sinh tự động.
  • Cổng kiểm tra đồng bộ i18n EN/VI phải giữ 100%.
  • Kỹ năng TWV nằm ngoài repo (gitignore) và trang WordPress đang chạy thật, nên không thử nghiệm ở đó.
  • Buffer đang ở gói MIỄN PHÍ; không thể chạy OAuth trong phiên không tương tác.
L4
Options weighedCác lựa chọn cân nhắc
  • Do everything inline, in order — simplest to follow, but slow and it buries root causes.
  • One big-bang PR — fast to open, but unreviewable and risky to deploy.
  • Audit-first with parallel agents, then phase-by-phase shippable commits (chosen) — more coordination up front, but each change is small, independent, and verifiable.
  • Only surface fixes — cheap, but leaves the type-safety and double-post problems intact.
  • Làm tuần tự từng việc — dễ theo dõi nhất, nhưng chậm và che mất nguyên nhân gốc.
  • Một PR gộp tất cả — mở nhanh, nhưng không review nổi và rủi ro khi deploy.
  • Rà soát trước bằng agent song song, rồi commit theo từng pha ship được (đã chọn) — tốn phối hợp lúc đầu, nhưng mỗi thay đổi nhỏ, độc lập, kiểm chứng được.
  • Chỉ vá bề mặt — rẻ, nhưng để nguyên vấn đề type-safety và đăng trùng.
L5
Principle invokedNguyên tắc áp dụng
Diagnose before prescribe, then make every change independently shippable and verifiable. Parallelize work that does not share files.Chẩn đoán trước khi kê đơn, rồi làm mỗi thay đổi ship được và kiểm chứng được độc lập. Song song hóa những việc không đụng chung tệp.
L6
Pick + recognition signalLựa chọn + dấu hiệu nhận biết
Three read-only audit agents ran in parallel (codebase health, UI premium, TWV skills), then two design-plan agents, then execution agents on disjoint file sets. Result: 13 commits, each passing lint + type-check + tests, merged and deployed. Recognition signal: when scope is broad but separable, fan out read-only audits first, then execute in slices you can verify one at a time.Ba agent rà soát chỉ-đọc chạy song song (sức khỏe codebase, giao diện cao cấp, kỹ năng TWV), rồi hai agent lập kế hoạch thiết kế, rồi các agent thực thi trên các nhóm tệp tách rời. Kết quả: 13 commit, mỗi commit qua lint + kiểm kiểu + test, đã merge và deploy. Dấu hiệu nhận biết: khi phạm vi rộng nhưng tách được, hãy tỏa ra rà soát chỉ-đọc trước, rồi thực thi theo lát cắt kiểm chứng được từng phần.

How the work was organizedCách tổ chức công việc

The session ran as a fan-out: audit agents produced findings, plan agents turned findings into phased plans, and execution agents applied the plans on non-overlapping files so they could run at the same time without colliding.Phiên làm việc chạy theo mô hình tỏa nhánh: agent rà soát tạo ra phát hiện, agent kế hoạch biến phát hiện thành kế hoạch theo pha, và agent thực thi áp kế hoạch lên các tệp không chồng lấn nên chạy đồng thời mà không xung đột.

Technical termThuật ngữ kỹ thuậtPlain nameTên dễ hiểuRoleVai trò
Explore agents ×3Read-only auditorsNgười rà soát chỉ-đọcCodebase health, UI premium-ness, TWV skill ecosystem — each returned a findings report, none edited code.Sức khỏe codebase, độ cao cấp giao diện, hệ kỹ năng TWV — mỗi bên trả về báo cáo phát hiện, không sửa code.
Plan agents ×2Design plannersNgười lập kế hoạchTurned the UI and TWV findings into phased, independently-shippable plans with locked decisions.Biến phát hiện UI và TWV thành kế hoạch theo pha, ship được độc lập, với các quyết định đã chốt.
Execution agentsImplementersNgười thực thiApplied token migrations, type fixes, slot-lock rail, skill reconciliation — each on a disjoint file set, run in parallel.Áp di trú token, sửa kiểu, đường khóa khung giờ, hòa giải kỹ năng — mỗi bên trên nhóm tệp tách rời, chạy song song.
lint:colors gateColor guardCổng gác màuA grep script that fails the build if any raw palette class (zinc/gray/indigo/teal…) reappears outside the pitch deck.Một script grep làm hỏng build nếu bất kỳ class màu thô (zinc/gray/indigo/teal…) tái xuất ngoài bộ slide pitch.

Read it in 30 seconds: audits map the terrain, plans choose the route, implementers walk disjoint paths at once, and gates (type-check, tests, color-guard) confirm each step before the next.

Lesson to carry forward: parallelism is safe only when file ownership does not overlap. The plan explicitly told each agent which folders it owned, so two agents never wrote the same file.

Đọc trong 30 giây: rà soát vẽ địa hình, kế hoạch chọn đường, người thực thi đi các lối tách rời cùng lúc, và các cổng (kiểm kiểu, test, gác màu) xác nhận từng bước trước khi sang bước sau.

Bài học mang theo: song song chỉ an toàn khi quyền sở hữu tệp không chồng lấn. Kế hoạch nói rõ mỗi agent sở hữu thư mục nào, nên không có hai agent cùng ghi một tệp.

What ran, in orderĐã chạy theo thứ tự

1
Parallel audit (3 agents)Rà soát song song (3 agent)
Codebase health, UI premium, TWV skills — findings only.Sức khỏe codebase, giao diện cao cấp, kỹ năng TWV — chỉ phát hiện.
2
Parallel planning (2 agents)Lập kế hoạch song song (2 agent)
UI premium plan + TWV consolidation plan, with decisions locked by user answers.Kế hoạch giao diện + kế hoạch hợp nhất TWV, quyết định chốt theo câu trả lời của người dùng.
3
Codebase quick-winsSửa nhanh codebase
Type-safety, middleware, dead deps, forgot-password, sitemap fix.Type-safety, middleware, gỡ deps thừa, quên mật khẩu, sửa sitemap.
4
UI premium phases 0-7Giao diện cao cấp pha 0-7
Tokens, primitives, shell, states, home, suppliers, remaining pages, sweep.Token, primitive, khung, trạng thái, trang chủ, nhà cung cấp, các trang còn lại, quét dọn.
5
TWV consolidation phases 1-7Hợp nhất TWV pha 1-7
Config source, slot-lock rail, skill reconciliation, humanizer fix, QA gates, hygiene, parallelize.Nguồn cấu hình, đường khóa khung giờ, hòa giải kỹ năng, sửa humanizer, cổng QA, dọn dẹp, song song hóa.
6
Push, PR, resolve conflicts, mergePush, PR, giải xung đột, merge
PR #5, 5 merge conflicts resolved (my tokens + main's logic), re-verified.PR #5, giải 5 xung đột merge (token của tôi + logic của main), kiểm chứng lại.
7
Production deploy + live smoke-checkDeploy production + kiểm tra live
Vercel Ready in 3 min; all routes 200, sitemap/robots fixed, new tokens confirmed in shipped CSS.Vercel Ready trong 3 phút; mọi route 200, sitemap/robots đã sửa, token mới xác nhận trong CSS đã ship.

Layered decision cardsCác quyết định theo tầng

Primary color = #1E6FA3, not the logo blueMàu chủ đạo = #1E6FA3, không phải xanh logo
L1The app had three competing 'primary' blues rendering side by side.App có ba màu xanh 'chủ đạo' cạnh tranh nhau, hiển thị cạnh nhau.
L2Pick one primary for buttons, links, focus rings — the interactive color a user touches.Chọn một màu chủ đạo cho nút, link, viền focus — màu tương tác mà người dùng chạm vào.
L3On white: logo blue #3B9BD9 is 3.05:1 (fails AA text), header #2886C3 is 3.97:1 (borderline), and #1E6FA3 is 5.4:1 (passes AA for all text). App CTAs use 14px semibold labels.Trên nền trắng: xanh logo #3B9BD9 là 3.05:1 (rớt chuẩn AA cho chữ), header #2886C3 là 3.97:1 (giáp ranh), và #1E6FA3 là 5.4:1 (đạt AA cho mọi cỡ chữ). Nút CTA của app dùng chữ 14px đậm vừa.
L4Adopt the light logo blue (on-brand but fails contrast) / keep the header blue (borderline) / use the darker #1E6FA3 which already existed in the brand system as --vc-blue-dark.Dùng xanh logo sáng (đúng thương hiệu nhưng rớt tương phản) / giữ xanh header (giáp ranh) / dùng #1E6FA3 đậm hơn vốn đã có sẵn trong hệ thương hiệu dưới tên --vc-blue-dark.
L5Accessibility is non-negotiable for text, and reuse what the brand already defines before inventing.Khả năng tiếp cận là bất khả thương lượng với chữ, và tái dùng cái thương hiệu đã định nghĩa trước khi bịa ra cái mới.
L6#1E6FA3 became the interactive primary; #3B9BD9 was kept as a brand accent on dark surfaces only. Recognition: a brand color that fails contrast becomes an accent, never the interactive primary.#1E6FA3 thành màu chủ đạo tương tác; #3B9BD9 giữ làm màu nhấn thương hiệu chỉ trên nền tối. Nhận biết: màu thương hiệu rớt tương phản thì làm màu nhấn, không bao giờ làm màu chủ đạo tương tác.
The 'as any' casts: fix the type contract, not the call sitesCác ép kiểu 'as any': sửa hợp đồng kiểu, không sửa chỗ gọi
L119 'supabase as any' casts bypassed type-safety on every dashboard/RFQ/compliance write.19 ép kiểu 'supabase as any' vô hiệu type-safety ở mọi thao tác ghi dashboard/RFQ/compliance.
L2The comments blamed 'RLS at build time' and missing tables — but that was the assumed cause, not the verified one.Các ghi chú đổ cho 'RLS lúc build' và thiếu bảng — nhưng đó là nguyên nhân phỏng đoán, chưa kiểm chứng.
L3supabase-js 2.99 requires every table to declare Relationships tuples, and Row types to be `type` not `interface` (interfaces do not satisfy Record).supabase-js 2.99 đòi mọi bảng khai báo bộ Relationships, và kiểu Row phải là `type` chứ không phải `interface` (interface không thỏa Record).
L4Trust the comments and cast differently / regenerate types via the Supabase CLI (needs live DB creds) / empirically probe why Database resolves to `never`.Tin ghi chú và ép kiểu kiểu khác / sinh lại types qua Supabase CLI (cần thông tin đăng nhập DB thật) / thử nghiệm tìm vì sao Database phân giải thành `never`.
L5Verify the actual failure before fixing the assumed one.Kiểm chứng lỗi thật trước khi sửa lỗi phỏng đoán.
L6A throwaway probe showed Database['public'] collapsed to `never`, so every row inferred as `never`. Fixed the type definitions (types + Relationships + 6 missing tables + 8 RPCs); all 19 casts vanished. Recognition: when every write needs a cast, suspect the schema type contract, not each call site.Một probe dùng một lần cho thấy Database['public'] sập về `never`, nên mọi hàng suy ra thành `never`. Sửa định nghĩa kiểu (đổi sang type + Relationships + 6 bảng thiếu + 8 RPC); cả 19 ép kiểu biến mất. Nhận biết: khi mọi thao tác ghi cần ép kiểu, hãy nghi ngờ hợp đồng kiểu của schema, không phải từng chỗ gọi.
One publishing rail with a pre-queue slot-lockMột đường xuất bản với khóa khung giờ trước khi xếp hàng
L1TWV had 7+ parallel ways to post to Buffer, and a history of double-post incidents.TWV có hơn 7 cách song song để đăng lên Buffer, và lịch sử sự cố đăng trùng.
L2The real need was not 'clean up duplicates' but 'stop creating them in the first place'.Nhu cầu thật không phải 'dọn bản trùng' mà là 'đừng tạo ra chúng ngay từ đầu'.
L3Each rail derived channel IDs and capacity independently; the existing dupe-guard only deleted duplicates after they posted.Mỗi đường tự suy ra ID kênh và sức chứa độc lập; bộ chống-trùng hiện có chỉ xóa bản trùng sau khi đã đăng.
L4Keep reactive cleanup / add a lock inside each of the 7 rails / collapse to one sanctioned rail with a pre-queue slot-lock.Giữ dọn dẹp phản ứng / thêm khóa vào từng đường trong 7 đường / gom về một đường được phép với khóa khung giờ trước khi xếp hàng.
L5Prevention beats cleanup; one canonical path beats N parallel ones.Phòng ngừa hơn dọn dẹp; một đường chuẩn hơn N đường song song.
L6queue_buffer_safe() with ledger + live-queue + capacity guards became the only Buffer entry point, keyed by slug|channel|date — mirroring the proven BEUP slot-lock. Recognition: recurring incidents from parallel paths mean converge to one guarded path, do not patch each path.queue_buffer_safe() với các chốt sổ cái + hàng đợi trực tiếp + sức chứa trở thành lối vào Buffer duy nhất, khóa theo slug|kênh|ngày — theo đúng khóa khung giờ BEUP đã kiểm chứng. Nhận biết: sự cố lặp từ các đường song song nghĩa là hãy hội tụ về một đường có chốt, đừng vá từng đường.
Keep shadcn, drop the other two depsGiữ shadcn, gỡ hai deps còn lại
L1The audit flagged three dependencies with zero imports in src.Rà soát gắn cờ ba phụ thuộc không có import nào trong src.
L2'Unused in src' is not the same as 'safe to remove' — a package can be used by CSS or config.'Không dùng trong src' không giống 'gỡ được an toàn' — một gói có thể dùng qua CSS hoặc cấu hình.
L3shadcn's tailwind.css is @imported in globals.css and supplies the data-* variants that the ui/ primitives rely on.tailwind.css của shadcn được @import trong globals.css và cung cấp các biến thể data-* mà primitive trong ui/ dựa vào.
L4Remove all three (fast, but breaks the component variants) / verify each package's real usage across JS, CSS, and config.Gỡ cả ba (nhanh, nhưng làm hỏng biến thể component) / kiểm chứng cách dùng thật của từng gói qua JS, CSS và cấu hình.
L5Verify usage across all import surfaces, not just JavaScript imports.Kiểm chứng cách dùng trên mọi bề mặt import, không chỉ import JavaScript.
L6Dropped @tanstack/react-table and nuqs; kept shadcn. Recognition: '0 imports in src' misses CSS @import and build-config usage — grep the CSS too before uninstalling.Gỡ @tanstack/react-table và nuqs; giữ shadcn. Nhận biết: '0 import trong src' bỏ sót @import CSS và cách dùng trong cấu hình build — grep cả CSS trước khi gỡ cài.
The red Vercel check was environmental, not a regressionCổng Vercel đỏ là do môi trường, không phải hồi quy
L1The PR's Vercel check failed with 'supabaseUrl is required'.Cổng Vercel của PR báo lỗi 'supabaseUrl is required'.
L2Is this my code breaking the build, or an environment condition? The answer decides whether to revert or proceed.Đây là code của tôi làm hỏng build, hay điều kiện môi trường? Câu trả lời quyết định nên revert hay tiếp tục.
L3The local build passed; the error occurred at build-time page-data collection, which needs the Supabase env var.Build local đã pass; lỗi xảy ra ở bước thu thập dữ liệu trang lúc build, vốn cần biến môi trường Supabase.
L4Assume my change broke it and revert / check the deployment history to see if this failure is new.Cho rằng thay đổi của tôi làm hỏng và revert / xem lịch sử deploy để biết lỗi này có mới không.
L5A signal that pattern-matches a known failure may have a different cause — check the evidence for this specific action before acting on it.Một tín hiệu khớp mẫu với lỗi đã biết có thể có nguyên nhân khác — kiểm chứng bằng chứng cho hành động cụ thể này trước khi hành động.
L6History showed every Preview deployment errored for 101 days while every Production deployment succeeded — the Preview environment lacks the Supabase vars, Production has them. Safe to merge. Recognition: a check that is red on every historical run of its kind is environmental, not your diff.Lịch sử cho thấy mọi bản Preview đều lỗi suốt 101 ngày trong khi mọi bản Production đều thành công — môi trường Preview thiếu biến Supabase, Production thì có. An toàn để merge. Nhận biết: một cổng đỏ ở mọi lần chạy cùng loại trong lịch sử là do môi trường, không phải diff của bạn.
Merge conflicts: keep my tokens AND main's logicXung đột merge: giữ token của tôi VÀ logic của main
L1Merging main brought 5 conflicts in files both sides had touched.Merge main mang về 5 xung đột ở các tệp cả hai phía đều đụng.
L2Main's PR had added funnel links to the same files my design pass had recolored — a style-vs-logic overlap.PR của main đã thêm link phễu vào chính các tệp mà đợt thiết kế của tôi đổi màu — một chồng lấn giữa kiểu và logic.
L3Taking my side wholesale would drop main's funnel links; taking main's side would drop my color tokens.Lấy trọn phía tôi sẽ mất link phễu của main; lấy trọn phía main sẽ mất token màu của tôi.
L4Take mine / take theirs / reconcile by combining the functional content with the token colors.Lấy của tôi / lấy của họ / hòa giải bằng cách kết hợp nội dung chức năng với màu token.
L5Never drop a functional change to win a styling conflict.Không bao giờ bỏ một thay đổi chức năng để thắng một xung đột về kiểu.
L6Inspected each block: the funnel-link content was identical on both sides, only the color classes differed, so keeping my token version lost nothing functional. Re-verified with type-check + build + tests before committing the merge. Recognition: in a style-vs-logic conflict, reconcile, do not pick a side.Soi từng khối: nội dung link phễu giống hệt hai phía, chỉ khác class màu, nên giữ bản token của tôi không mất gì về chức năng. Kiểm chứng lại bằng kiểm kiểu + build + test trước khi commit merge. Nhận biết: trong xung đột kiểu-với-logic, hãy hòa giải, đừng chọn một phía.

Artifact mapBản đồ tệp tạo ra

PathĐường dẫnWhatLà gìWho reads itAi dùng
src/app/globals.cssSingle design-token source: primary/wine/gold/success ramps, elevation + motion tokens, heading font ruleNguồn token thiết kế duy nhất: dải primary/wine/gold/success, token độ nổi + chuyển động, quy tắc font tiêu đềEvery componentMọi component
src/types/database.tsTypes + Relationships + 6 tables + 8 RPCs — the fix that killed all 19 'as any' castsKiểu + Relationships + 6 bảng + 8 RPC — bản sửa xóa hết 19 ép kiểu 'as any'Every Supabase queryMọi truy vấn Supabase
src/middleware.tsReuses session user for the dashboard guard; excludes sitemap/robots from intl routingTái dùng phiên người dùng cho chốt dashboard; loại sitemap/robots khỏi định tuyến i18nEvery requestMọi request
src/app/[locale]/(auth)/forgot-password + reset-passwordNew password-reset flow (login linked a dead route)Luồng đặt lại mật khẩu mới (login trỏ vào route chết)Users who forgot their passwordNgười dùng quên mật khẩu
src/components/suppliers/tier-config.tsShared tier colors (diamond=wine, verified=success, standard=gold) replacing 3 duplicated mapsMàu hạng dùng chung (diamond=wine, verified=success, standard=gold) thay 3 bản trùng lặpSupplier card + profileThẻ + hồ sơ nhà cung cấp
scripts/twv-automation/twv_config.pySingle config source: channel map, capacity, timing, slot-keyNguồn cấu hình duy nhất: bản đồ kênh, sức chứa, giờ, khóa khung giờAll TWV publishingToàn bộ xuất bản TWV
scripts/twv-automation/wp_twv.pyqueue_buffer_safe() slot-lock — the one sanctioned Buffer railqueue_buffer_safe() khóa khung giờ — đường Buffer được phép duy nhấtEvery scheduled TWV postMọi bài TWV đã lên lịch
scripts/twv-automation/README.mdInventory mapping each surviving script to its owning skill + the no-one-shots ruleBản kiểm kê ánh xạ mỗi script còn lại tới kỹ năng sở hữu + quy tắc cấm one-shotFuture maintenanceBảo trì về sau
docs/decisions.mdAppended the 2026-07-02 upgrade decisions so they are never re-litigatedGhi thêm các quyết định nâng cấp 2026-07-02 để không phải bàn lạiEvery future sessionMọi phiên sau này
What still needs youViệc vẫn cần bạn
  • Stripe price IDs are still placeholders — revenue stays blocked until you create real products in the Stripe Dashboard and paste their price IDs into src/lib/stripe/products.ts. This is the single highest-value remaining task.ID giá Stripe vẫn là chỗ giữ chỗ — doanh thu còn bị chặn cho tới khi bạn tạo sản phẩm thật trong Stripe Dashboard và dán ID giá vào src/lib/stripe/products.ts. Đây là việc còn lại có giá trị cao nhất.
  • To make the Vercel Preview check green on future PRs, add NEXT_PUBLIC_SUPABASE_URL and NEXT_PUBLIC_SUPABASE_ANON_KEY to the Preview environment in Vercel project settings (Production already has them).Để cổng Vercel Preview xanh ở các PR sau, thêm NEXT_PUBLIC_SUPABASE_URL và NEXT_PUBLIC_SUPABASE_ANON_KEY vào môi trường Preview trong cài đặt project Vercel (Production đã có sẵn).
  • The daily clip-drip launchd job was retired (its schedule had expired). A clean daily template sits at ~/Library/LaunchAgents/archive-twv/com.twv.clip-drip.plist.new-template — copy it back and bootstrap it only when you have fresh clips queued; it is now slot-locked and QA-gated.Tác vụ clip-drip hằng ngày đã gỡ (lịch của nó hết hạn). Một mẫu daily sạch nằm ở ~/Library/LaunchAgents/archive-twv/com.twv.clip-drip.plist.new-template — copy lại và bootstrap chỉ khi bạn có clip mới trong hàng đợi; nó nay đã có khóa khung giờ và cổng QA.
  • Archive oneshot-tariff-long-jul3.py after July 3 once its Facebook post is confirmed live.Lưu trữ oneshot-tariff-long-jul3.py sau ngày 3/7 khi bài Facebook của nó đã xác nhận live.

Check your understandingKiểm tra hiểu biết

Why was #1E6FA3 chosen as the interactive primary instead of the logo blue #3B9BD9?Vì sao chọn #1E6FA3 làm màu chủ đạo tương tác thay vì xanh logo #3B9BD9?
The '19 as any casts' were caused by what root cause?19 ép kiểu 'as any' do nguyên nhân gốc nào?
Why was the failing Vercel Preview check judged safe to merge over?Vì sao cổng Vercel Preview đỏ được đánh giá là an toàn để merge?
In your own words: why is a single slot-lock rail better than adding a duplicate-guard to each of the 7 publishing paths?Bằng lời của bạn: vì sao một đường khóa khung giờ duy nhất tốt hơn việc thêm bộ chống-trùng vào từng đường trong 7 đường xuất bản?
Mastery checklist — tick what you can explain unpromptedBảng tự đánh giá — tích những gì bạn tự giải thích được