Phạm vi enforcement (A1/A2/A3)
Công bố trung thực: hệ thống đang ở giai đoạn stage_1 — KHÔNG phải toàn bộ hệ thống đã được A1 (Pilot Readiness), A2 (Evidence Truthfulness), A3 (Real-World Scoping) auto-enforce. Trang này liệt kê rõ bề mặt nào đã có auto-trigger mặc định và bề mặt nào vẫn còn bypass/logic riêng.
A1_project_readiness
Đã enforce mặc định (7)
- ✓
Tạo project mới
auto_project_created(project_service.create_project) - ✓
Cập nhật Intake profile
auto_intake_changed - ✓
Cập nhật Environment profile
auto_environment_changed - ✓
Cập nhật Evidence-mode profile
auto_evidence_mode_changed - ✓
GTM capability snapshot thay đổi
auto_capability_changed(gtm_writeback_service.refresh_capability_snapshot/declare_capability_snapshot) - ✓
Target profile phát hiện/xác nhận
auto_target_changed(gtm_writeback_service.detect_target_profiles/confirm_target_profile) - ✓
Yêu cầu vào pilot
auto_pilot_request, LUÔN re-evaluate trước khi cho phép (request_pilot_inclusionchặn nếu INTAKE_BLOCKED, cần acknowledge nếu LIMITED_PILOT_ONLY)
Còn bypass / chưa phủ (2)
- •
Mini-spec A13
READINESS_STALE_RECHECK job (
background_job_engine.py, interval mặc định 2h) quét MỌI project, gọiis_readiness_stale() rồievaluate_project_readiness() nếu stale; wired thêm event-driven ngay tạiupsert_intake_profile(). Đây LÀ cron/background job THẬT (asyncio in-process, không worker/Celery ngoài) — không còn là bypass surface thuần tuý, nhưng CHỈ chạy trong 1 process API đang sống (container restart mất tick đang chờ, không có persistence riêng cho lịch trình ngoài chính bảngbackground_jobs) và tick mặc định cách nhau 5 phút (A13_SCHEDULER_TICK_SECONDS) — không phải real-time. - •Không có cơ chế chặn nếu dữ liệu bị sửa trực tiếp qua DB/migration ngoài các service function nêu trên.
A2_evidence_truthfulness
Đã enforce mặc định (9)
- ✓
Command Center
platform_health_summarypanelmỗi platform (GA4/GTM/Google Ads/Meta/
TikTok/Website/Consent) đượcevaluate_and_record() qua A2, đánh dấuis_a2_enforced=true. - ✓
Mini-spec A16
Watchlist:
tracking_watchlist_service.evaluate_item() ghi 1 canonical A2 evaluation THẬT (subject_type=watchlist_state) từ các drift signal đã xét, rồi ÉP TRẦNresult.confidence(TrackingBaselineConfidence) theocanonical_bandtrước khi lưu (cap_baseline_confidence_by_claim_band) — local engine (classify_watchlist_health) GIỮ NGUYÊN, nhưng KHÔNG được hiển thị confidence cao hơn A2 cho phép. - ✓
Mini-spec A16
Ads:
ads_validation_service.reconcile_project() ghi 1 canonical A2 evaluation/conversion action (subject_type=ads_reconciliation) từAdsReliabilityRating, ÉP TRẦN rating trước khi lưu (cap_ads_reliability_by_claim_band).assess_duplicate_risk() (trục RỦI RO, không phải confidence) KHÔNG bị ép trần — cố ý, 2 khái niệm khác nhau. - ✓
Mini-spec A16
Social:
social_validation_service.reconcile_project() ghi 1 canonical A2 evaluation/event (subject_type=social_reconciliation,subject_reference=identity:<event>) từSocialIdentityConsistencyStatus, ÉP TRẦN status trước khi lưu (cap_social_identity_consistency_by_claim_band).assess_dedup_risk()/assess_timing_compliance() (trục RỦI RO/tuân thủ thời gian) CHƯA được wire. - ✓
Mini-spec A16
Consent:
consent_validation_service.reconcile_project() ghi 1 canonical A2 evaluation/project (subject_type=consent_reconciliation,subject_reference=signal_completeness) từConsentEvidenceSource— KHÔNG ép trầnConsentModeFit/ConsentImplementationType(trục tuân thủ, không phải confidence, ép trần sẽ trộn lẫn 2 khái niệm khác nhau). - ✓
Mini-spec A16
Recovery:
tracking_recovery_service.evaluate_impact() ghi 1 canonical A2 evaluation/case (subject_type=recovery_decision) từcase.confirmation_level. KHÔNG ép trần Severity (không phải trục confidence) —classify_severity()/compute_recovery_decision() đã evidence-first sẵn (confirmation_level=INFERENCE luôn downgrade), A16 chỉ thêm audit trail truy vấn được. - ✓
Mini-spec A16
Release:
release_service.evaluate_release_health() ghi 1 canonical A2 evaluation/release event (subject_type=post_publish_health) từ observation source+confidence (map_release_observation— adapter có sẵn từ A2 gốc, lần đầu được gọi thật);gtm_release_service.create_publish_attempt() ghi 1 canonical A2 evaluation/candidate (subject_type=publish_recommendation) từGtmPublishResultState. KHÔNG ép trầnReleaseHealthState/GtmVersionCandidateState(state machine, không phải trục confidence). - ✓
Mini-spec A16
GA4 (green-field, chưa từng có evidence-state nào trước A16):
ga4_validation_service.complete_run() ghi 1 canonical A2 evaluation/expected-event (subject_type=ga4_validation) xác nhận SỰ TỒN TẠI của observed event — KHÔNG ép trầnGa4EventUsability(trục chất lượng/rủi ro đã evidence-grounded qua finding severity, ép trần sẽ trộn lẫn 2 trục khác nhau). - ✓
A16 follow-up (2026-07-29)
6/10 Command Center collector còn lại (remediation,
gtm_change, validation,release_publish,platform_reconciliation,consent_compliance) KHÔNG còn gánTrackingBaselineConfidence.MEDIUM cố định cho mọi signal. Mỗi collector giờ map enum trạng thái THẬT của chính nguồn dữ liệu đó (RemediationPlanStatus/GtmChangeSetStatus/ValidationRunOverallResult/GtmVersionCandidateState/EvidenceLevel) sangEvidenceStatequa 5 adapter mới (evidence_truthfulness_engine.py:map_remediation_plan_status/map_gtm_change_set_status/map_validation_run_result/map_gtm_version_candidate_state/map_evidence_level), rồievidence_state_to_baseline_confidence() — CÙNG cầu nối đã dùng ở _collect_safe_apply/_collect_recovery_case từ trước. Cộng với 4/10 collector vốn đã evidence-derived (safe_apply,recovery_case, watchlist — hưởng lợi gián tiếp từ A16's cap,post_publish_observation), TOÀN BỘ 10/10 collector giờ đọc evidence thật, KHÔNG collector nào còn flat literal.
Còn bypass / chưa phủ (3)
- •
A16 follow-up KHÔNG persist 1
EvidenceClaimEvaluationrow riêng cho từng Command Center signal (khác 7 surface ở A16 gốc, nơi MỖI reconcile/transition ghi 1 row)vì snapshot Command Center generate thường xuyên (mỗi refresh/on-demand), ghi row per-signal sẽ phình bảng không cần thiết mà không tăng thêm truthfulness (canonical evaluation CẤP PLATFORM đã ghi qua _evaluate_platform_truthfulness(), KHÔNG đổi). Đây là lựa chọn kiến trúc có chủ đích, không phải thiếu sót — nếu cần audit trail per-signal trong tương lai, nên thêm CÓ CHỌN LỌC (vd chỉ signal severity HIGH/CRITICAL) thay vì ghi mọi signal mỗi refresh.
- •
Mini-spec A16 CHỈ wire 1 facet/surface (xem
default_enforced_surfaces), KHÔNG phải toàn bộ outputmỗi phase surface vẫn còn N-1 trục khác dùng logic cục bộ CHƯA qua A2: Ads'
assess_duplicate_risk/assess_gclid_pipeline; Social'sassess_dedup_risk/assess_timing_compliance; Consent'sassess_mode_classification/assess_requirement_level/assess_impact/classify_tag_binding(4/5 hàm); Watchlist'scompute_watchlist_route(dùng lại confidence ĐÃ ép trần nên gián tiếp hưởng lợi, nhưng route logic tự nó chưa gọi A2); Recovery'scompute_recovery_decision/infer_recovery_layer; Release'sclassify_release_health/compute_rollback_review_recommendation/GtmReleaseEligibilityState; GA4'sGa4ScoreDimensionnumeric scoring (ga4_score_service.compute_scores) vàdebugview_penalty. - •
Canonical A2 evaluation được ghi THẬT và truy vấn được qua GET .../evidence-truthfulness/evaluations/by-subject, nhưng CHƯA được thêm làm field riêng vào response schema của từng surface (vd
Ga4EventMappingRow/AdsConversionActionOut)operator cần gọi route evidence-truthfulness riêng để xem canonical result, chưa hiện inline trong UI mỗi trang phase. Frontend UI của 7 trang phase KHÔNG đổi ở A16 (ngoài scope — 'You do not need a major UI redesign').
A7_pilot_roster_gating
Đã enforce mặc định (6)
- ✓
Chỉ 1 write path DUY NHẤT tới Project.
pilot_statustrong toàn bộ backend (re-verify qua grep `pilot_status= ` toàn app/, mini-spec A7)request_pilot_inclusion(), route POST .../readiness/pilot-inclusion.ProjectUpdate(PATCH /projects/{id}) KHÔNG có field này — không thể set lẫn qua update chung. - ✓
request_pilot_inclusion() LUÔN re-run A1 TRƯỚC khi quyết định (trigger_source=auto_pilot_request)loại bỏ khả năng dùng evaluation cũ/stale bằng cách không bao giờ tin cache, mạnh hơn việc chỉ kiểm tra cờ
is_stale. - ✓INTAKE_BLOCKED và readiness stale LUÔN bị chặn không override được; LIMITED_PILOT_ONLY chỉ qua khi operator tự
acknowledge_limited=true (không tự nâng cấp). - ✓
GET .../readiness/pilot-eligibility
check CHỈ ĐỌC (không re-evaluate) cho badge/list, coi staleness là yếu tố CHẶN thật sự (khác
request_pilot_inclusionvì không tự làm mới dữ liệu). - ✓
GET .../readiness/pilot-gating-history
lịch sử quyết định gating tái dùng evaluation history có sẵn (lọc theo
trigger_source=auto_pilot_request), không bảng riêng. - ✓
POST .../readiness/pilot-removal
rời pilot KHÔNG bị gate (đúng thiết kế: gating chỉ áp cho việc VÀO, không áp cho việc RA).
Còn bypass / chưa phủ (2)
- •
Audit 'chỉ 1 write path' là kiểm tra THỦ CÔNG (grep) tại thời điểm viết mini-spec A7
KHÔNG có lint rule/test tự động chặn 1 write path thứ 2 xuất hiện trong tương lai nếu ai đó thêm code mới ghi trực tiếp `
project.pilot_status= ...` ở nơi khác. - •
Không có bulk-add/roster UI phức tạp (theo đúng phạm vi tối thiểu A7 yêu cầu)
GET .../pilot-roster chỉ liệt kê project ĐANG
pilot_status!=not_in_pilotkèm eligibility hiện tại, không phải 1 hệ thống quản lý roster đầy đủ (không có lịch sử thêm/xoá theo audit trail riêng ngoài evaluation history).
A3_real_world_scoping
Đã enforce mặc định (2)
- ✓
Audit-run ingestion (
upload_service.process_upload)mọi
AuditFindingmới tự độngbulk_auto_scope_findings() ngay sau khi run thành công (commit). - ✓
Validation-run ingestion (
validation_run_service.process_validation_run)mọi
ValidationFindingmới tự động scope tương tự.
Còn bypass / chưa phủ (4)
- •
Finding tạo TRƯỚC khi A5 wiring có hiệu lực (lịch sử) KHÔNG được backfill tự động
vẫn hiện chưa-scope cho tới khi operator resolve thủ công qua endpoint A3 gốc (PUT .../real-world-scoping/findings/{ref}). Xem panel
scope_coveragetrên Command Center để biết số lượng thực tế mỗi project. - •
Chỉ AUDIT_FINDING và VALIDATION_FINDING được auto-scope. Finding của các phase khác (Google Ads, GA4, Social/Meta/
TikTok, Consent, Remediation) KHÔNG nằm trong phạm vi real-world-scopingthiết kế A3 gốc chỉ áp cho GTM/website-level finding, chưa mở rộng.
- •
auto-scope (A5, lúc ingest finding) LUÔN gán
implementation_surface=unknown_sourcekhông có heuristic tự phát hiện GTM-managed/hardcoded tại thời điểm đó. Mini-spec A12 sau này CÓ backfill giá trị thật (từ browser evidence, chỉ khi target đã unambiguous) cho các dòng đang
unknown_source— nhưng CHỈ khi có browser evidence snapshot thật được nộp lên, không phải suy luận từ chính finding. - •
Ambiguity chỉ tự resolve khi CÓ ĐÚNG 1 target ứng viên
0 hoặc ≥2 ứng viên luôn giữ ambiguous/no-candidates, không bao giờ tự đoán.
B2_browser_runtime_validation
Đã enforce mặc định (2)
- ✓
POST /projects/{id}/browser-runtime/sessions
Playwright Chromium THẬT chạy on-demand (KHÔNG cron/background), thu thập console/network/dataLayer/screenshot/marker per step, phân loại
evidence_status(browser_runtime_observed/inferred/blocked/incomplete) quabrowser_runtime_engine.pyTHUẦN (không đoán khi thiếu bằng chứng — chỉ SUCCEEDED + có network/dataLayer/screenshot trực tiếp mới = observed). - ✓
Mỗi step
evidence_statusđượcmap_browser_runtime_evidence_status() sangEvidenceStaterồievaluate_and_record() (A2 GỐC, KHÔNG viết logic song song)ghi 1 canonical
EvidenceClaimEvaluation/session (subject_type=browser_runtime_session,claim_type=runtime_claim), truy vấn được qua route evidence-truthfulness chung như mọi surface khác.
Còn bypass / chưa phủ (3)
- •
B2 CHỈ chạy khi operator/caller chủ động gọi (on-demand)
KHÔNG tự động recheck watchlist/recovery/release theo lịch. Tích hợp gọi lại B2 từ mini-spec 6 (post-publish)/8/9 (recovery/watchlist recheck) CHƯA được wire ở B2 — mới có module + API độc lập, chưa có call site nào trong 3 mini-spec đó gọi B2 tự động.
- •
Chỉ Chromium (spec Part 'kiến trúc' #2
Firefox/
WebKitđể sau nếu cần). Không tự vượt captcha/MFA/anti-bot/consent wall — B2 CHỈ phát hiện + báo blocked qua heuristic marker-text/HTTP-401-403-407, KHÔNG giải quyết được (đúng 'Không làm' của spec). - •
Network capture CHỈ giữ request khớp host pattern tracking đã biết (GA4/GTM/Ads/Meta/
TikTokis_tracking_relevant_url()) để tránh phình JSONB — request first-party/CAPI qua server-side proxy KHÔNG match pattern domain public sẽ KHÔNG được ghi nhận (giới hạn đã biết, xem docs/browser-runtime.md).