Không phải rủi ro vibe coding nào cũng nằm trong code logic.

Có khi app chạy đúng, test pass, feature ổn, nhưng build pipeline ship nhầm thứ không nên public:

  • Source maps.
  • Debug bundle.
  • .env file.
  • Local config.
  • Test fixture có data thật.
  • Internal docs.
  • Generated archive.
  • Build cache.
  • Screenshot nhạy cảm.

Đây là loại lỗi rất đời thường. Nó không cần prompt injection. Không cần model jailbreak. Chỉ cần một file bị include sai.

Source map không xấu, nhưng public nhầm thì đau

Source map giúp debug code đã bundle/minify. Trong frontend app, source map public đôi khi là quyết định có chủ ý.

Vấn đề là khi artifact chứa source nội bộ, config, path, comment, hoặc logic không intended for public release.

Claude Code source-map incident là ví dụ lớn: một release package được report là đã include source map chứa hàng trăm nghìn dòng TypeScript nội bộ. Anthropic nói không có customer data hay credentials bị lộ, và gọi đây là release packaging issue do human error, không phải breach.

Điểm học cho vibe coding không phải “đừng dùng Claude Code”. Điểm học là: release packaging cũng là security boundary.

Nếu team lớn còn có thể ship nhầm artifact, app vibe-coded nhỏ càng không nên bỏ qua bước kiểm dist.

AI rất dễ tạo thêm file mà bạn không để ý

Agent có thể tạo:

  • debug.log
  • backup.zip
  • test-output.json
  • sample-users.csv
  • playwright-report/
  • coverage/
  • .env.local
  • screenshots/
  • tmp/
  • *.map

Một số file vô hại. Một số file không nên deploy. Vấn đề là bạn không biết nếu không xem.

Trước deploy, câu hỏi không chỉ là:

Build pass chưa?

Mà là:

Build output có gì?

Gate tối thiểu trước deploy

Với app nhỏ, thêm một gate đơn giản:

Before deploy:
- List all generated artifacts in dist/public/build output.
- Flag source maps, env files, logs, archives, screenshots, reports, local configs.
- Search built files for API keys, tokens, emails, private URLs, and internal hostnames.
- Confirm what is intentionally public.
- Do not deploy until I approve flagged items.

Nếu dùng npm package, thêm:

Run npm pack --dry-run and show what files would be published.

Nếu dùng Docker:

List files copied into the final image.
Confirm no .env, local config, SSH key, or test data is included.

Không cần enterprise pipeline. Cần thói quen nhìn output cuối.

Non-tech vẫn kiểm được

Bạn có thể yêu cầu agent tạo bảng:

Artifact | Public? | Reason | Risk | Action

Ví dụ:

dist/assets/app.js.map | no | source map | exposes source structure | remove before deploy
dist/test-users.csv | no | fixture | contains sample PII-like rows | remove
public/logo.png | yes | brand asset | low | keep

Nếu agent không giải thích được file nào public, chưa deploy.

Đừng tin .gitignore là đủ

.gitignore chỉ nói Git bỏ qua file nào. Nó không tự động nói deploy tool bỏ qua file nào.

Một file có thể:

  • Không được commit nhưng vẫn nằm trong dist.
  • Không nằm trong repo nhưng được copy vào Docker image.
  • Không nằm trong source nhưng được generated trong build.
  • Không được ignore bởi npm publish.
  • Không bị Cloudflare/Vercel/Netlify loại ra.

Vì vậy artifact review phải nhìn output thật, không chỉ nhìn repo source.

Chốt lại

Vibe coding thường tập trung vào prompt và app behavior. Nhưng release artifact cũng là một phần của sản phẩm.

Code đúng mà package sai vẫn leak. Build pass mà dist chứa file nhạy cảm vẫn fail. Deploy thành công mà source map không intended public vẫn là incident.

Trước khi publish app AI-built, hãy bắt agent trả lời một câu rất cụ thể: “Chúng ta sắp đưa những file nào lên internet?”

Tham khảo