All notable changes to this project are documented here. Versions follow the internal release line used during the doctoral meta-analysis (P6).
demo/ui.html: từ 7.2.0 (Defense App v1, 01/08/2026) nút Presenter
PIN gọi hàm presenterPin() chưa được định nghĩa và giao diện không gửi tiêu đề
X-MAIDA-Demo-PIN, nên mọi thao tác ghi qua giao diện (trích xuất, duyệt, khóa,
reset) đều bị demo/run_defense.py trả về 401. Nay có hộp nhập PIN trong trang,
PIN giữ trong sessionStorage của phiên và được gửi kèm mọi yêu cầu
POST/PATCH/PUT/DELETE; sai PIN thì xóa và hỏi lại. Trang nhận ?pin= trên URL
(chỉ dành cho bộ khởi chạy cục bộ) rồi xóa khỏi thanh địa chỉ.demo/smoke_test.py thêm kiểm tra tĩnh: giao diện phải định nghĩa presenterPin
và gửi X-MAIDA-Demo-PIN, để lỗi này không lặp lại.CHAY_MAIDA_WINDOWS.bat: chỉ nhận Python 3.12/3.11 64-bit (py -3.12-64),
báo rõ khi máy chỉ có bản 32-bit thay vì để pip biên dịch pandas rồi hỏng; tự
tạo mã PIN 4 chữ số (MAIDA_DEMO_PIN) in to ở cuối cửa sổ, mở trình duyệt với
?pin= để không phải gõ lại; đặt sẵn MAIDA_ADMIN_KEY để backend không in khóa
quản trị ra màn hình (dễ nhầm với PIN; ở chế độ demo khóa này không dùng).demo/HUONG_DAN_CHAY_THAT.md cập nhật theo hai điểm trên. Số hiệu 7.2.3 ở
backend/main.py, backend/pyproject.toml, CITATION.cff, .zenodo.json.*.html ở gốc kho), assets/ đa phương tiện (ảnh, bài hát,
phông chữ), voice/, film/, icons/, css/, workflow GitHub Pages và các tài
liệu làm việc cũ (CODE_REVIEW_2026-08-31.md, TRUOC-CONG-BO.md,
PUBLISHING.md, docs/BRANCH-POLICY.md, HUONG_DAN_TIENG_VIET.docx). Giữ
assets/brand/ và assets/diagrams/.Do Thuy Huong
<thuyhuongctu@gmail.com>, bỏ trailer công cụ trong thông điệp commit; mọi mã
commit thay đổi. Tag v7.1.1 trỏ lại đúng commit tham chiếu của hồ sơ đăng ký
quyền tác giả (xem IP_REGISTER.md). Chỉ giữ nhánh main.backend/main.py, hàm extract_pdf (tuyến POST /api/extract).
Xem THIRD_PARTY_LICENSES.md mục 2 để biết lý do và phạm vi.backend/tests/test_persistence_and_demo_mode.py,
backend/tests/test_720_post_extraction.py) và script lịch sử
verify_findings.py trước đây dùng PyMuPDF để tạo tệp PDF mẫu; nay dựng PDF
tối giản trực tiếp bằng tay (không phụ thuộc thư viện tạo PDF nào), tránh
đưa PyMuPDF trở lại qua đường kiểm thử.license trong backend/pyproject.toml (trước đó ghi
LicenseRef-MAIDA-Academic, không khớp LICENSE) thành AGPL-3.0-only —
bản chuẩn LICENSE gốc không đổi, chỉ sửa siêu dữ liệu gói.MAIDA_SOURCE_DEPOSIT_v7.1.1_SANITIZED.zip đã
nộp cho hồ sơ đăng ký quyền tác giả 7.1.1 giữ nguyên, vẫn dùng PyMuPDF như đã
khai; thay đổi này chỉ áp dụng cho mã nguồn từ 7.1.2 trở đi.Bản vá bảo mật sau 7.2.1, không đổi công thức, không đổi lược đồ dữ liệu, không
đụng bản ghi đã khóa. Mã đã vào main qua PR #103; bản này chỉ gắn số hiệu để
dựng lại ảnh container có kèm bản vá.
/api/ sang
backend, nên trước bản này khách ghé bất kỳ có thể gọi thẳng
PATCH /verify, POST /lock, POST /extract (tốn ngân sách LLM) và
POST /notion/sync. Nay middleware admin_key_guard chặn mọi yêu cầu
POST/PATCH/PUT/DELETE thiếu header X-MAIDA-Admin-Key khớp
MAIDA_ADMIN_KEY (so sánh hằng thời gian); các tuyến chỉ đọc vẫn công
khai. Không đặt khóa thì backend tự sinh một khóa và in ra lúc khởi động,
không bao giờ mặc định mở. Defense App (MAIDA_DEMO_MODE) giữ PIN riêng.localStorage,
không nhúng vào gói JS lúc build.latest trên GHCR trước bản này dựng từ 7.2.1, chưa có khóa quản trị;
máy chủ đang chạy ảnh cũ cần kéo lại ảnh và đặt MAIDA_ADMIN_KEY.10.5281/zenodo.22920619 (tag v7.2.2
= 8af4881), ghi bổ sung sau khi phát hành. Bản phát hành GitHub lúc đầu
mang nhầm tag viết hoa V7.2.2, nên Zenodo lưu thêm một bản ghi trùng,
10.5281/zenodo.22920581, cùng commit 8af4881: nội dung đúng nhưng KHÔNG
trích dẫn, để mọi trích dẫn trỏ về một bản ghi. Tag viết hoa cũng không kích
hoạt deploy-ghcr.yml (bộ lọc v* phân biệt hoa thường); ảnh GHCR 7.2.2 chỉ
được dựng sau khi gắn lại tag v7.2.2.Bản vá nhỏ sau 7.2.0, không đổi công thức, không đổi lược đồ dữ liệu, không đụng bản ghi đã khóa.
/api/health của 7.2.0 vẫn trả "version": "7.1.1" trong khi
tài liệu OpenAPI ghi 7.2.0. Nay backend có một hằng APP_VERSION duy nhất
(tiêu đề ứng dụng, OpenAPI, /api/health đều đọc từ đó); giao diện lấy số
hiệu từ /api/health thay vì ghi cứng; test
test_721_version_consistency.py khóa APP_VERSION = backend/pyproject.toml
= CITATION.cff = .zenodo.json.VerificationPanel): thêm ô sửa n_predictors (cần cho
t/β từ hồi quy, df = n − p − 1); hiển thị chỉ đọc các trường máy chủ dẫn xuất
(metric_type, estimand_source, r_source, df_source, variance_r,
variance_formula, variance_z, source_controls, lambda_applied,
beta_outside_pb_domain), khối “Machine proposal” bất biến
(extraction_confidence, trích dẫn bằng chứng và trang, cảnh báo
text_truncated), và dòng pi_edited_fields / pi_override_at. Cảnh báo
rõ khi bản ghi không có r nên không khóa được. Chỉ gửi các trường trong
danh sách trắng PI_EDITABLE_FIELDS làm field_overrides.detail của FastAPI
(ví dụ lý do 422 của danh sách trắng hay cổng khóa) thay vì
“Request failed with status code 422”.analysis/ đạt; tsc --noEmit và
vite build sạch./verify nay tự dẫn xuất
variance_r, variance_z, metric_type… từ thống kê sơ cấp ngay lần xác
minh đầu (không cần sửa trường nào), nên bản ghi nhập từ CSV hay từ kho SQLite
cũ khoá được thay vì kẹt 422 vĩnh viễn. Ứng dụng bảo vệ (demo/run_defense.py)
gieo bản ghi qua cùng hàm dẫn xuất, nên 18 bản ghi mẫu đều có phương sai và
người trình bày xác minh + khoá được bản ghi chờ; demo/smoke_test.py kiểm
đúng đường này.assets/data/site-metrics.json là nguồn duy nhất: version, version_doi,
và generation = thế hệ khoá dữ liệu v7.1.1 tách riêng); ghi chú “tạm thời”
nói rõ 7.2.0 là bản phần mềm, không khoá lại kho dữ liệu; các trang
commercial, defense, huong, asia, asia-maida-paper, styleguide cập nhật theo;
scripts/check_site_metrics.py đạt trên 24 trang.10.5281/zenodo.22259090) vào
CITATION.cff và README. DOI phiên bản của chính bản 7.2.1 là
10.5281/zenodo.22260059 (tag v7.2.1 = d2ea8e3), ghi bổ sung sau khi
phát hành. Ba bản ghi Zenodo ngày 03/09/2026 là bản thay thế, KHÔNG trích dẫn:
22258783 và 22258977 (nhãn v.7.2.0, lưu commit 3c8de32 chưa vá) và
22259684 (nhãn v7.2.1, lưu commit 3ff42c4 tức mã 7.2.0). Tác giả đã yêu
cầu Zenodo gỡ ba bản ghi này.10.5281/zenodo.21850575 (luôn trỏ tới bản phát hành
mới nhất); bản nộp tay ngày 09/07/2026 là một chuỗi riêng
(10.5281/zenodo.21282516, phiên bản .21282517) và mãi trỏ tới v7.1.1.
CITATION.cff, README và trang web trước đây ghi 21282516 là “DOI mọi phiên
bản” — không đúng với chuỗi đang chạy. Nay: DOI khái niệm = 21850575; bản
nộp tay giữ nguyên, ghi rõ là bản lưu trữ v7.1.1 mà luận án và hồ sơ đăng ký
bản quyền trích dẫn. Hai bản ghi Zenodo gắn nhãn v.7.2.0
(22258783, 22258977) sinh ra từ release gắn sai tag (trỏ 3c8de32 chưa vá)
là bản thay thế, không trích dẫn.Phát hành gộp ba mục “Chưa phát hành” bên dưới (A1–A3, E1, demo) cùng bản vá
cho mười phát hiện của CODE_REVIEW_2026-08-31.md (ca tái hiện:
verify_findings.py). Không đụng vào bản ghi P6 đã khóa. Bộ dữ liệu P6 của
luận án không bị ảnh hưởng bởi các lỗi này (bảng 17 cột do tác giả quản lý,
phương sai tính trong R từ n bằng escalc(ZCOR)), nhưng mọi tuyên bố về công
cụ từ nay dẫn 7.2.0.
effect_r, effect_t, effect_df,
effect_beta, n_predictors, sample_n đi qua đúng hàm dẫn xuất của đường
trích xuất (StatisticalExtractor.derive_from_primary), nên variance_r,
variance_z, variance_formula, metric_type, estimand_source,
source_controls, df_source, lambda_applied, r_source,
beta_outside_pb_domain được tính lại cùng lúc. Bản ghi mất r (β ngoài
khoảng) tự bật requires_verification và POST /lock từ chối (422)./api/studies/export/csv xuất mọi trường của bản ghi
theo thứ tự model (kể cả variance_r, variance_z, metric_type,
evidence_quote, machine_proposal dạng JSON).field_overrides chuyển sang danh sách trắng
PI_EDITABLE_FIELDS (20 trường: sáu thống kê sơ cấp, mã điều tiết, siêu dữ
liệu). pi_locked, locked_at, study_id, machine_proposal,
extraction_confidence, evidence_* và mọi trường dẫn xuất bị từ chối 422
thay vì bị bỏ qua hay áp lặng lẽ. Sửa của người ghi ở pi_edited_fields
(danh sách tên trường) và pi_override_at; extraction_confidence là điểm
của máy, không bao giờ bị ghi đè.MalformedLLMOutputError), không còn 500 và không còn
bản ghi rỗng.lambda_applied = (β ≥ 0) ở cả backend lẫn analysis/effect_size.py.variance_z (1/(n − 3) bậc không; 1/(df − 1) riêng phần) nay được
sinh trong đường chạy thật; test test_C3_backend_agrees_with_analysis_module
khóa hai cài đặt khớp nhau trên r, variance_r, variance_z, lambda_applied..bak khỏi kho và thêm *.bak vào .gitignore; giới hạn
40.000 ký tự văn bản PDF ghi thành hằng PDF_TEXT_LIMIT và trường
text_truncated trên bản ghi; datetime.utcnow() → datetime.now(timezone.utc);
frontend/src/types.ts khai đủ trường của backend (giao diện hiển thị các
trường mới là việc của 7.2.1).backend/tests/test_720_post_extraction.py (11 test, mỗi test ghim
một phát hiện); toàn bộ 74 test backend và 20 test analysis/ đạt.Bước 1 trong bảy bước chạy lại. Ba lỗi tầng công thức được sửa đồng bộ ở
backend Python, máy tính demo trong trình duyệt, phần mô tả phương pháp
trên trang, và module R mới analysis/effect_sizes.R (kèm testthat).
LƯU Ý: các bản ghi P6 đã khóa suy từ beta hoặc từ t thiếu df PHẢI được mã
lại (bước 2) trước khi chạy lại mô hình gộp.
r = 0.98·β + 0.05·λ, λ = 1 khi
β ≥ 0. Bản cũ bỏ số hạng λ nên mọi hiệu ứng dương suy từ β bị hạ thấp
đúng 0,05. Ngoài khoảng |β| ≤ 0,5 nay KHÔNG quy đổi (trả về None/NA và
loại khỏi gộp) thay vì chặn về ±1.df = n − p − 1 với trường mới
n_predictors; không còn mặc định n − 2. Thiếu số biến giải thích thì
bản ghi không quy đổi và gắn cờ chờ PI, kèm df_source (reported/derived).metric_type (zero_order / partial /
semipartial) và tính phương sai đúng theo loại:
bậc không (1−r²)²/(n−1), riêng phần (1−r²)²/df; lưu variance_r và
variance_formula trên từng bản ghi để kiểm toán.test_effect_size_conversions.py với ví dụ tính tay
cho cả ba công thức; cập nhật test_712_governance.py theo hành vi mới
(58 test đạt). Test R: analysis/test_effect_sizes.R.analysis/effect_size.py (v8.0.0): thêm Fisher z +
var_z (A4), legacy_r đo chênh lệch với cách tính cũ, và recode_csv
mã lại CSV kèm cột r_legacy/delta_r; 19 kiểm thử tính tay
(analysis/test_effect_size.py, chạy được không cần pytest); bộ mẫu
mau_cu.csv → mau_moi.csv làm kiểm thử hồi quy (khớp từng byte,
chứng minh mã ổn định; tính đúng đắn nằm ở 19 test tính tay). Backend
đồng bộ theo ngữ nghĩa gói: bản ghi suy từ β mang metric_type =
partial (β đã kiểm soát các biến khác), df suy được cả cho đường β khi
có n_predictors.analysis/effect_size.R (thay effect_sizes.R +
test_effect_sizes.R tạm thời): tự kiểm tra khi chạy
Rscript analysis/effect_size.R, kèm khung quy trình metafor bước 3–7
(ba cấp/hai cấp, phương sai vững theo cụm, khoảng dự báo, PET-PEESE,
giả thuyết chữ S).metric_type =
zero_order: P&B hiệu chuẩn công thức để khôi phục r bậc không; nguồn
gốc tách sang hai trường mới estimand_source (observed /
imputed_pb2005) và source_controls. Ba lớp: r báo cáo (zero_order ·
observed), t hồi quy (partial · observed), β quy đổi (zero_order ·
imputed: chỉ phân tích độ nhạy, không vào mô hình chính vì phương sai
bậc không bỏ qua sai số quy đổi). Đồng bộ Python + R + backend +
migrate_v8; test đảo lại tương ứng (20 test tay + 60 test backend).derived_from trỏ về bản gốc,
phát hành DOI phiên bản mới và ghi nhật ký sai lệch OSF. Trang công
khai hạ r̄ = .074 xuống trạng thái tạm thời (thuộc v7.1.1, chờ thế hệ
khóa v8.0.0) ở ô KPI, đoạn phương pháp và chú thích biểu đồ rừng.Sổ đăng ký vấn đề E1: đường tải PDF trả về cùng một kết quả cho mọi tệp, mâu thuẫn với chính tuyên bố “không có khóa thì nói thẳng, không bịa”.
evidence_page + evidence_quote
(câu nguyên văn chứa thống kê tiêu điểm) bắt buộc trong prompt và lược
đồ; thống kê không kèm dẫn chứng bị TỪ CHỐI 422, không tạo bản ghi
(EvidenceMissingError).Rà soát E2 kèm theo (kho 236 có nhiễm bản ghi mặc định không?): 0 khớp với bản ghi diễn tập; 12 cụm trùng (r, n) khác study, 22/26 thành viên là is_estimated=1 thuộc dải S190+ với n tròn, trùng đúng nhóm 47 bản ghi phải thu hồi thống kê nguồn. Báo cáo và bảng đối chiếu ngược nằm ở p6/data/v8/ (kho luận án).
demo/ (15/07/2026)Đóng gói trình diễn, KHÔNG thay đổi mã lõi 7.1.x: demo/run_defense.py
khởi động đúng backend FastAPI hiện có, nạp sẵn bản ghi thật từ cơ sở dữ
liệu P6 đã khóa (18 dòng mẫu trong demo/demo_seed.csv, hoặc toàn bộ qua
MAIDA_SEED_CSV), và phục vụ giao diện một tệp demo/ui.html chạy bằng
Python thuần. Hướng dẫn tiếng Việt: demo/HUONG_DAN_BAO_VE.md.
Bản vá quản trị: đưa mã về đúng với giao thức đã mô tả trong tài liệu, không thay đổi kết quả của các bản ghi P6 đã khóa.
df_imputed minh bạch.machine_proposal: ảnh chụp bất biến các giá trị máy đề xuất tại
thời điểm trích xuất, không thể ghi đè, tách bạch máy đề xuất với
con người quyết định ở cấp từng bản ghi.docs/”. The Pages
workflow stages _site from root *.html plus assets/, icons/ and
voice/; it never reads docs/. The stale claim is the likely reason a
superseded copy of the site sat under docs/ for months without anyone
correcting it. Those two dead pages were removed on the same date.)LLM_PROVIDER, LLM_API_KEY, and
LLM_MODEL environment variables while retaining backward-compatible aliases
for existing local deployments.backend/ and frontend/.backend/pyproject.toml (PEP 621) making the backend
pip-installable (pip install -e backend[test]), with pinned runtime
dependencies and a test extra.backend/tests/ (pytest) pinning the Cohen (1988) t→r and
Peterson & Brown (2005) β→r conversions, sign preservation, the unit-interval
bound, and the three-level confidence scheme / PI-review threshold.react-scripts 5,
which cannot build under React 19) to Vite 6 + @vitejs/plugin-react.
Added vite.config.ts, root index.html, tsconfig.json, src/vite-env.d.ts,
and frontend/.env.example; the API base URL now reads import.meta.env.VITE_API_URL.
Build output stays in build/ so the Docker/nginx setup is unchanged..github/workflows/ci.yml running the backend pytest suite
and the frontend Vite production build on every change.cdai_score relabelled to
country Digital Adoption Index (0-1); ICRV enum corrected to the
institutional I/II/III/FR/MX taxonomy; DOI-type and performance-type enums
aligned to the coded study database.ExtractedEffect, StudyDatabaseEntry,
VerificationDecision.notion_sync.py) for the coded study database.pi_locked=True records to forest_data.csv,
the analysis input for the three-level meta-analysis (k=238, K=288).Version history reflects iterative, human-directed development; see the git commit log for the full, dated trail.
IP_REGISTER.md for the full post-freeze rules and the 7.1.0/7.1.1
reconciliation note.7.1.2+ (patch): bug fixes only; no new features, no architecture change.7.2.0 (minor): new features that keep the current architecture and
purpose (“Meta-Analysis Intelligent Data Assistant”); developed on a
separate branch, never on the 7.1.1 release.8.0.0 (major): substantial changes to architecture or scope.