Opus Handoff — D28 Deploy Live Smoke Rev3
Handoff cho Opus phiên mới — D28 Deploy + Live Smoke Prompt rev3
Date: 2026-05-10
Audience: Opus phiên mới
Source: GPT-5.5 Thinking / Incomex Hội đồng AI
Status: Cần tiếp tục patch prompt deploy/live-smoke từ rev2 → rev3. Chưa dispatch Agent.
0. Tóm tắt một câu
Chúng ta đã hoàn thành hạ tầng generated table-map ở Nuxt và đã build-verify PASS. Việc tiếp theo là vá prompt deploy/live-smoke rev2 thành rev3 để chuẩn bị cho deploy production đầu tiên, nhưng chưa được dispatch.
1. Mục tiêu lớn của chuỗi này
Mục tiêu chính của giai đoạn hiện tại vẫn là:
Hoàn thành hạ tầng miếng thông tin / text-as-code,
trong đó checkpoint gần nhất là hiển thị được bảng notification/event_outbox theo đúng khuôn Điều 28,
không tạo UI Nuxt riêng và không hardcode thủ công.
Phần Nuxt/Điều 28 chỉ được làm vừa đủ để:
notification/event_outbox nằm đúng trong tổng thể thiết kế,
không phải làm lại sau này,
không sa đà full Nuxt redesign.
2. Trạng thái kỹ thuật hiện tại
2.1 Universal event core / notification backend
Đã có universal event core trên PG:
event_outboxvà các bảng liên quan đã tạo;- Directus permission metadata-only đã tạo;
- unsafe fields bị chặn;
tbl_event_outboxđã có trongtable_registry, nhưng còn draft;event_outboxroute chưa publish/smoke;- P3D notification display vẫn paused.
Trạng thái phải giữ:
table_registry_id=21
permission_id=1483
tbl_event_outbox.status=draft
notification_display=paused
p3d_resume_allowed=false
2.2 D28 minimum display governance
Đã có requirements v0.2, đủ làm checkpoint tối thiểu:
tbl_event_outbox= Family 1 / DirectusTable instance;- generated map = shared Table Module infrastructure;
- các UI family khác để Phase 2+, không block P3D.
File:
knowledge/dev/laws/dieu28-trien-khai/requirements/d28-nuxt-ui-display-requirements-spec-draft.md
2.3 Generated table-map implementation — DONE as PARTIAL then verified PASS by build
Đã hoàn thành Phase 1B generated map:
- Generator script:
web/scripts/generate-table-maps.mjs
- Generated artifact:
web/generated/table-maps.generated.ts
-
3 hardcoded map consumers đã đổi sang import generated map:
pages/knowledge/registries/[entityType]/index.vueconfig/detail-sections.tsserver/api/discovery/relations.get.ts
-
package scripts đã thêm:
generate:table-mapsverify:table-maps
Commits:
0947613 — auto-snapshot: generator + artifact
d2db418 — manual D28 commit: consumer/package modifications
Rollback code nếu cần:
git revert d2db418 0947613 --no-edit
2.4 Build verify — PASS thật
Pack D28_DEPLOY_BUILD_VERIFY_PACK đã chạy và PASS:
- typecheck PASS;
- Nuxt build PASS;
- server import alias
~/generated/table-maps.generatedresolve được; - client import PASS;
- SSR import PASS;
- source tree clean;
- no deploy;
- no live route smoke;
- no Directus/PG mutation;
- no publish
event_outbox.
File report:
knowledge/dev/laws/dieu28-trien-khai/reports/d28-deploy-build-verify-pack-report.md
GPT accepted report:
knowledge/dev/laws/dieu44-trien-khai/reviews/gpt-review-d28-build-verify-pass-and-deploy-review-directive-2026-05-10.md
3. Hai deviation build-verify đã được chấp nhận
D1 — B1 → B3-variant switch
B1 docker compose run --rm --no-deps web bị compose validation chặn vì directus.env_file=.env.local không tồn tại. Agent chuyển sang:
docker build -f web/Dockerfile.local -t d28-build-verify:tmp web/
docker run --rm d28-build-verify:tmp ...
GPT accepted vì:
- ephemeral;
- không đụng service đang chạy;
- không deploy;
- không host package install;
- image temp đã remove;
- source tree clean.
D2 — Secret scan false positive forgot-password
Build log scan match password trong filename:
forgot-password.*.mjs
Không phải credential. Agent classify FILENAME_FALSE_POSITIVE, không print raw secrets. GPT accepted.
Future prompt policy:
filename/path match như forgot-password.* → FILENAME_FALSE_POSITIVE nếu không có credential value.
credential-like match → SECRET_LEAK_FAIL, STOP, không print matching lines.
4. Prompt hiện tại cần patch
Prompt đang cần sửa:
knowledge/dev/laws/dieu28-trien-khai/prompts/d28-deploy-and-live-smoke-prompt-review.md
Trạng thái hiện tại:
Rev: 2
Status: DRAFT for GPT/User review — KHÔNG dispatch
GPT review mới nhất yêu cầu rev3:
knowledge/dev/laws/dieu44-trien-khai/reviews/gpt-review-d28-deploy-live-smoke-prompt-rev2-2026-05-10.md
Kết luận GPT:
REV3 REQUIRED — do not dispatch rev2.
5. Mục tiêu của prompt deploy/live-smoke
Đây là pack đầu tiên có thể deploy production.
Phải giữ mô hình 2 stage:
Stage 1 — Preflight only
RUN_STAGE=1_PREFLIGHT_ONLY
- Chỉ preflight / no-impact;
- không build;
- không deploy;
- không smoke;
- không docker tag;
- không compose edit;
- không restart;
- upload Stage 1 report;
- status
AWAITING_DEPLOY_APPROVAL.
Stage 2 — Deploy + smoke
RUN_STAGE=2_DEPLOY_AND_SMOKE
Chỉ được chạy nếu dispatch có exact approval phrase gắn với Stage 1 report values.
Stage 2 sẽ:
- tạo backup image tag;
- build production image mới;
- patch compose image line;
- restart Nuxt service;
- live smoke routes;
- report.
Không publish tbl_event_outbox trong D28 deploy pack này.
6. Hard boundaries phải giữ trong rev3
NO_DIRECTUS_MUTATION=true
NO_PG_MUTATION=true
NO_PUBLISH_EVENT_OUTBOX=true
NO_CHANGE_TABLE_REGISTRY=true
NO_FIX_TBL_MODULES_LIST=true
NO_ADD_ENTITY_TYPE_COLUMN=true
NO_PACKAGE_INSTALL_ON_HOST=true
NO_LOCKFILE_CHANGE=true
NO_FILE_MUTATION_OUTSIDE_TEMP=true
NO_SECRET_IN_CODE_OR_LOG=true
NO_PRINT_ENV_TOKEN_URL=true
NO_PRINT_HTTP_BODY=true
NO_LOG_PRINTED_BEFORE_SECRET_SCAN=true
NO_AUTO_ROLLBACK=true
NO_TOUCH_DIRECTUS_SERVICE=true
NO_TOUCH_POSTGRES_SERVICE=true
NO_DEPLOY_WITHOUT_USER_APPROVAL=true
NO_SMOKE_EVENT_OUTBOX_ROUTE=true
NO_HARDCODE_IMAGE_TAG=true
NO_MUTATION_IN_STAGE_1=true
Add/keep:
NO_LOG_TAIL_AFTER_SECRET_SCAN_FAIL=true
NO_BACKUP_TAG_OVERWRITE_WITHOUT_APPROVAL=true
NO_COMPOSE_BACKUP_OVERWRITE=true
NO_STAGE2_WITHOUT_STAGE1_REPORT=true
7. GPT-required rev3 patches — apply all
P1 — Không print safe-tail nếu secret scan FAIL
Trong rev2 có pattern:
grep -qi ... $LOGFILE && echo SCAN=FAIL || echo SCAN=PASS
grep -v -i -E 'token|secret|bearer|password|authorization' $LOGFILE | tail -15
Phải sửa thành policy:
IF SCAN=PASS → safe tail allowed.
IF SCAN=FAIL → do not print tail.
IF SCAN=FAIL → classify privately, report only classification/counts.
IF classification=FILENAME_FALSE_POSITIVE → optional redacted summary/tail allowed, not required.
IF classification=SECRET_LEAK_FAIL → STOP, no tail, no matching lines.
Áp dụng cho:
- production image build log;
- compose up log;
- container logs;
- workflow sample response;
- relations endpoint response.
P2 — Backup image tag không được overwrite
Rev2 dùng fixed:
nuxt-ssr-local:pre-d28-rollback
Cần Stage 1 inspect:
backup_tag_exists=true|false
backup_tag_points_to_current_image=true|false|UNKNOWN
GPT preference: dùng unique backup tag để tránh conflict:
nuxt-ssr-local:pre-d28-rollback-<timestamp>
Patch rev3 theo hướng unique tag. Stage 1 phải generate/propose exact tag, Stage 2 phải approve đúng tag đó.
P3 — Compose backup path phải unique
Rev2 dùng:
/opt/incomex/docker/docker-compose.yml.pre-d28
Cần đổi thành:
/opt/incomex/docker/docker-compose.yml.pre-d28-<timestamp>
Stage 1 report exact compose_backup_path. Stage 2 dùng đúng path đó.
P4 — Approval phrase bind theo Stage 1 report values
Stage 1 report phải output exact:
proposed_new_image_tag
proposed_backup_image_tag
compose_backup_path
current_production_image
Stage 2 phải đọc Stage 1 report và verify approval phrase khớp các value này.
Approval phrase nên là dạng chứa exact tag:
APPROVE D28 DEPLOY: I authorize deploying commits d2db418 + 0947613 as image <proposed_new_image_tag> to production with brief service interruption, using rollback image <proposed_backup_image_tag> and compose backup <compose_backup_path>.
P5 — Workflow sample discovery optional/safe hơn
Stage 1 không nên bắt buộc dùng Directus admin token.
Patch:
workflow_sample_discovery=SKIPPED_SAFETY
workflow_sample_id=NONE
workflow_tab_smoke=SKIPPED_NO_SAMPLE_ID
Nếu Agent chọn làm API read:
- store temp file;
- scan/redact;
- extract id only;
- không print URL/body;
- chỉ report
WORKFLOW_SAMPLE_ID_FOUND=true|false, không cần print actual id.
P6 — Không head -50 Dockerfile
Thay bằng grep structural lines only:
grep -E '^(FROM|WORKDIR|COPY|RUN|CMD|ENTRYPOINT)' web/Dockerfile | head -30
Không print ARG/ENV raw.
P7 — Stage 1 không cho docker logs thoải mái
Remove docker logs khỏi Stage 1 allowed ops, trừ khi dùng temp-log + scan before print. GPT preference: bỏ nếu không cần.
P8 — Smoke base URL không print env-derived URL
Report only:
smoke_base_url_mode=LOCALHOST|PORT_MAPPING|PUBLIC_HOST
smoke_base_url_redacted=<scheme>://<host-redacted>
Agent có thể dùng actual URL nội bộ để curl, nhưng không print URL nếu lấy từ env.
P9 — Relations smoke dùng một curl call
Thay double curl bằng:
STATUS=$(curl -s -o "$RESPFILE" -w '%{http_code}' ...)
Report status only, no body. Cleanup response file.
P10 — Compose patch verify diff đúng 1 line
Sau patch compose:
compose_diff_only_nuxt_image_line=true|false
compose_patch_line_count=1
Dùng diff giữa backup và compose hiện tại, nhưng chỉ in/redact dòng nuxt-ssr-local nếu an toàn. Nếu không đúng exactly 1 image line change → restore backup and STOP.
P11 — Stage 2 phải re-check drift trước mutation
Before any Stage 2 mutation:
- git status clean;
- HEAD still includes commits;
- current image still equals Stage 1
current_production_imageor user-approved current image; - compose line still matches Stage 1 report;
- build verify PASS report still exists;
- Stage 1 report exists and says
preflight_status=PASS,status=AWAITING_DEPLOY_APPROVAL.
If drift → STOP:
PREFLIGHT_DRIFT_AFTER_STAGE1
P12 — Build image cleanup policy
Report:
new_image_created=true|false
new_image_removed_on_abort=true|false|N/A
old_image_preserved=true
backup_image_created=true|false
If build succeeds but deploy aborts before restart, state what happens to new image.
P13 — Rollback method rõ ràng
Do not mix methods.
GPT preference:
Rollback = restore compose backup to original tag, then docker compose up -d incomex-nuxt.
This returns infra to exact pre-deploy compose state.
Do not combine cp backup compose and sed to backup image in the same rollback path.
P14 — Stage 2 phải đọc Stage 1 report
Stage 2 must read:
knowledge/dev/laws/dieu28-trien-khai/reports/d28-deploy-and-live-smoke-stage1-preflight-report.md
Verify:
preflight_status=PASS
status=AWAITING_DEPLOY_APPROVAL
8. Files Opus phiên mới nên đọc trước khi patch
Must-read immediate
- Current prompt rev2 to patch:
knowledge/dev/laws/dieu28-trien-khai/prompts/d28-deploy-and-live-smoke-prompt-review.md
- Latest GPT review requiring rev3:
knowledge/dev/laws/dieu44-trien-khai/reviews/gpt-review-d28-deploy-live-smoke-prompt-rev2-2026-05-10.md
- Build verify PASS report:
knowledge/dev/laws/dieu28-trien-khai/reports/d28-deploy-build-verify-pack-report.md
- GPT accepted build verify:
knowledge/dev/laws/dieu44-trien-khai/reviews/gpt-review-d28-build-verify-pass-and-deploy-review-directive-2026-05-10.md
Useful context
- Generated-map implementation report rev3:
knowledge/dev/laws/dieu28-trien-khai/reports/d28-generated-table-map-implementation-report.md
- GPT final approval for Path F rev8:
knowledge/dev/laws/dieu44-trien-khai/reviews/gpt-final-approval-d28-generated-table-map-implementation-prompt-rev8-2026-05-10.md
- D28 Nuxt requirements v0.2:
knowledge/dev/laws/dieu28-trien-khai/requirements/d28-nuxt-ui-display-requirements-spec-draft.md
- D28 deploy/build verify prompt rev2 approval:
knowledge/dev/laws/dieu44-trien-khai/reviews/gpt-final-approval-d28-deploy-build-verify-pack-prompt-rev2-2026-05-10.md
9. What Opus phiên mới should do immediately
- Read this handoff.
- Read the current prompt rev2.
- Read GPT review rev2 requiring rev3.
- Patch
d28-deploy-and-live-smoke-prompt-review.mdto rev3 applying all 14 patches above. - Keep two-stage model.
- Do not dispatch Agent.
- Return summary to GPT/User for review.
Expected output from Opus:
D28 deploy/live-smoke prompt rev3 done.
Patches applied: P1–P14.
No dispatch.
Ready for GPT/User review.
10. Things Opus must NOT do
Do NOT dispatch Agent.
Do NOT run Stage 1.
Do NOT run Stage 2.
Do NOT deploy.
Do NOT restart container.
Do NOT smoke routes.
Do NOT publish tbl_event_outbox.
Do NOT mutate Directus.
Do NOT mutate PG.
Do NOT mutate table_registry.
Do NOT fix tbl_modules_list.collection.
Do NOT add entity_type.
Do NOT resume P3D.
11. Current exact state to preserve
build_verify_status=PASS
generated_map_commits=0947613,d2db418
tbl_event_outbox.status=draft
notification_display=paused
p3d_resume_allowed=false
current_prompt_to_patch=d28-deploy-and-live-smoke-prompt-review.md rev2
next_required_action=OPUS_PATCH_DEPLOY_LIVE_SMOKE_PROMPT_REV3
agent_dispatch_allowed=false_until_rev3_review
12. Hình tượng nhanh cho Opus mới
Chúng ta đã:
làm xong máy in nhãn tự động,
đã kiểm thử trong xưởng build,
chưa mở cửa thư viện thật.
Bây giờ đang viết quy trình mở cửa thật lần đầu:
Stage 1 = đi kiểm chìa khóa, camera, lối thoát hiểm — không đụng gì.
Stage 2 = nếu User nói đúng câu cho phép, mở cửa thật, kiểm 20+ lối đi.
Vì đây là lần đầu deploy production, prompt phải cực kỳ chặt:
Stage 1 không được tạo bất kỳ thay đổi nào.
Stage 2 phải bind theo kết quả Stage 1.
Rollback phải có câu phê duyệt riêng.
Không được tự động rollback hay tự động publish notification.
13. Final instruction
Opus phiên mới chỉ cần tiếp tục từ đây:
Patch prompt rev2 → rev3:
knowledge/dev/laws/dieu28-trien-khai/prompts/d28-deploy-and-live-smoke-prompt-review.md
Follow exactly:
knowledge/dev/laws/dieu44-trien-khai/reviews/gpt-review-d28-deploy-live-smoke-prompt-rev2-2026-05-10.md
Then stop for GPT/User review.