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.

Stage 1 đã chuyển A1/A2/A3 từ công cụ gọi thủ công sang có auto-trigger ở các điểm ghi dữ liệu chính (project create, intake/environment/evidence-mode, GTM capability/target, audit-run/validation-run ingestion, Command Center platform summary). CHƯA phủ toàn bộ hệ thống — các bề mặt bên dưới vẫn dùng logic/legacy riêng, chưa qua A1/A2/A3. Mini-spec A13 bổ sung 1 scheduler THẬT (asyncio in-process, không cron/worker ngoài) tự động re-check readiness stale định kỳ (2h/lần quét) + watchlist/Command Center/revalidation — xem GET /jobs/summary và trang Background Jobs. Mini-spec A16 mở rộng A2 sang 7 phase surface (GA4/Ads/Social/Consent/Watchlist/Recovery/Release) — MỖI surface chỉ được wire 1 facet cụ thể (KHÔNG phải toàn bộ output của surface đó), xem chi tiết ở domain A2_evidence_truthfulness bên dưới — KHÔNG claim 100% coverage.

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_inclusion chặ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ọi is_readiness_stale() rồi evaluate_project_readiness() nếu stale; wired thêm event-driven ngay tại upsert_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ảng background_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_summary panel

    mỗi platform (GA4/GTM/Google Ads/Meta/TikTok/Website/Consent) được evaluate_and_record() qua A2, đánh dấu is_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ẦN result.confidence (TrackingBaselineConfidence) theo canonical_band trướ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ần ConsentModeFit/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ần ReleaseHealthState/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ần Ga4EventUsability (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án TrackingBaselineConfidence.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) sang EvidenceState qua 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ồi evidence_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 EvidenceClaimEvaluation row 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ộ output

    mỗ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's assess_dedup_risk/assess_timing_compliance; Consent's assess_mode_classification/assess_requirement_level/assess_impact/classify_tag_binding (4/5 hàm); Watchlist's compute_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's compute_recovery_decision/infer_recovery_layer; Release's classify_release_health/compute_rollback_review_recommendation/GtmReleaseEligibilityState; GA4's Ga4ScoreDimension numeric 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_status trong 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_inclusion vì 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_pilot kè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 AuditFinding mới tự động bulk_auto_scope_findings() ngay sau khi run thành công (commit).

  • Validation-run ingestion (validation_run_service.process_validation_run)

    mọi ValidationFinding mớ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_coverage trê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-scoping

    thiế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_source

    khô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) qua browser_runtime_engine.py THUẦ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 được map_browser_runtime_evidence_status() sang EvidenceState rồi evaluate_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/TikTok

    is_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).