Chuyển tới nội dung chính

Rà soát PoF theo đề thi và phiếu chấm

Các đường dẫn docs/... trong bảng này nay thuộc trang docs; docs/TESTING.md và docs/images/ vẫn nằm trong repository.

Bảng đối chiếu repository với mục 5, 10, 11, 12 của đề thi và phần B, C.I của phiếu đánh giá. Phần PoF chiếm 50 điểm và được chấm trên repository trước phần trình diễn, nên mọi bằng chứng phải thấy được từ trang chủ GitHub.

Kiểm ngày 30/10/2026 trên main (41a01c3, tag v1.1.0) và Khuong/main (58906c3). Số liệu GitHub lấy từ API công khai, không đăng nhập, nên cũng là những gì giám khảo nhìn thấy. Các thay đổi của nhánh Khuong/pof-hardening đã vào main (merge e94c0dc, PR #160); CI xanh.

Ký hiệu: ✅ đạt, ⚠️ còn thiếu hoặc chưa chuẩn, ❌ chưa có.

Hồ sơ nộp (báo cáo kỹ thuật, slide, video, ảnh giao diện) do nhóm bổ sung riêng nên không nằm trong bảng này.

1. Tóm tắt​

Tiêu chí PoFĐiểmTình trạngViệc còn lại
1. Kho mã nguồn và lịch sử phát triển5✅Đóng dần issue #161 đến #168 bằng PR
2. Giấy phép và tính tương thích10✅Xác nhận -only hay -or-later của AGPL
3. Release và quản lý phiên bản5✅Đặt tag mới khi phát hành tiếp
4. Build và cài đặt từ mã nguồn10✅Chạy thử trên máy sạch (#161, #162)
5. Thư viện, phụ thuộc, nguồn gốc10✅Không còn việc
6. Tài liệu, quản lý lỗi, giao tiếp10✅Đóng dần issue bằng PR

Không có lỗi loại trừ ở mục 12 của đề: repository công khai, có LICENSE, có release, không phát hiện secret.

2. Điều kiện kiểm tra trước khi chấm (phần B của phiếu)​

#Điều kiệnKết quảBằng chứng
1Repository công khai, có web viewer✅HaUI-ImplSolution/DX-OS, visibility: public, API trả 200 không đăng nhập
2Giấy phép OSI, có LICENSE toàn văn, có thông báo✅LICENSE Apache-2.0 (10,8 KB, toàn văn), GitHub nhận đúng Apache-2.0; ai/LICENSE AGPL-3.0; NOTICE; COPYRIGHT.txt
3Có release/tag trước hạn nộp, không dùng định dạng độc quyền✅5 tag và 5 GitHub Release; tệp .tar.gz đính kèm do workflow mới tạo; hạn nộp thật chưa chốt
4Có hướng dẫn build/install, chạy lại được✅README có bước dựng bằng Docker, build không Docker và chạy ngoài thư mục mã nguồn
5Khai báo thư viện, phiên bản, nguồn, giấy phép✅COPYRIGHT.txt và sbom/, mọi gói có giấy phép
6README, CHANGELOG, bug tracker, tài liệu đúng trạng thái✅Đã có 8 issue, xem mục 8
7Không lộ secret hay dữ liệu cá nhân✅Không thấy secret; email mỗi người một địa chỉ, xem mục 9
8Lịch sử Git liên tục, commit hợp lý✅686 commit từ 05/09 đến 30/10/2026, mọi tuần đều có commit, xem mục 3

3. Tiêu chí 1: kho mã nguồn và lịch sử (5 điểm)​

MụcTrạng tháiBằng chứng đã kiểmViệc cần làm
Công khai, truy cập mở✅API không đăng nhập trả 200 cho repo, release, tag, LICENSE
Lịch sử trải đều✅Số commit theo tuần ISO: W36 3, W37 80, W38 81, W39 52, W40 92, W41 97, W42 85, W43 84, W44 112
Nhiều người đóng góp✅3 sinh viên: KhuongSpring 457, tung51652-alt 117, nddKhanh 107 commit; còn dependabot
Nhận diện tác giả✅git log có 9 tên cho 3 người; .mailmap gom về KhuongSpring, tung51652-alt, nddKhanh (hai commit mang email cơ quan chưa gom, xem mục 9)
Repo được dùng thật✅158 pull request (135 đã gộp), CI chạy trên mọi PR
Nhánh trên GitHub✅Chỉ 5 nhánh: main, Khuong/main và 3 nhánh Dependabot; trên máy còn tham chiếu origin/* cũ, dọn bằng git fetch --prune
Thông điệp commit✅Phần lớn theo Conventional Commits; còn Initial commit, update: docs, P1-5, feat: phrase 1 đến 4 ("phrase" thay vì "phase") trong lịch sử cũKhông sửa lịch sử đã đẩy; biết để trả lời khi hội đồng hỏi
Tag phản ánh sản phẩm✅PR #160 đã gộp, main và Khuong/main cùng nội dungĐặt tag mới sau mỗi lần gộp phát hành
Issue được dùng✅8 issue mở ngày 30/10/2026 (#161 đến #168), lấy từ BACKLOG.mdĐóng dần bằng PR có Closes #n

4. Tiêu chí 2: giấy phép và tính tương thích (10 điểm)​

MụcTrạng tháiBằng chứngCòn lại
License OSI, toàn văn, NOTICE✅LICENSE Apache-2.0, ai/LICENSE AGPL-3.0, NOTICE
Giấy phép hai vùng rõ ràng✅COPYRIGHT.txt mục 1 và README: ai/ AGPL-3.0, phần còn lại Apache-2.0; AI Service là tiến trình riêng gọi qua HTTP
Thành phần bên thứ ba có giấy phép rõ✅COPYRIGHT.txt có bảng cho Maven, npm, Python, mô hình, dữ liệu, hạ tầng
Header giấy phép trong từng tệp mã✅Mọi tệp Java, TypeScript, JavaScript, Python, shell, YAML có SPDX-License-Identifier: Apache-2.0, riêng ai/ là AGPL-3.0-only
Header của ai/ khớp ai/LICENSE✅77 tệp trong ai/ từng mang Apache-2.0 trong khi ai/LICENSE là AGPL-3.0; đã đổi sang AGPL-3.0-onlyXác nhận chọn -only hay -or-later
Kiểm giấy phép tự động✅Job license của CI Infra chạy .github/scripts/check_licenses.py: kiểm header và giấy phép của từng gói trong sbom/, ngoại lệ ở .github/license-exceptions.json (hiện rỗng)
Giấy phép mô hình CV✅COPYRIGHT.txt và ai/weights/README.md giải thích vì sao áp AGPL-3.0 cho crop_classifier.onnx dù thẻ mô hình ghi Apache-2.0
Bảng công nghệ trong README✅Dòng AI Service ghi AGPL-3.0 cho mã ai/ và MIT, Apache-2.0 cho thư viện
Dữ liệu RAG của Lab⚠️COPYRIGHT.txt nêu nguồn, ngày truy cập, giấy phép, SHA-256 của từng văn bản HaUI và giữ nguyên nội dung; chưa có văn bản cho phép phân phối lại từ HaUIXin xác nhận bằng văn bản của HaUI nếu có thể, hoặc giữ nguyên cách ghi nguồn

5. Tiêu chí 3: release và quản lý phiên bản (5 điểm)​

MụcTrạng tháiBằng chứngCòn lại
Có tag và release✅v1.0.0 (13/10) đến v1.1.0 (30/10), đều là release chính thức
CHANGELOG theo phiên bản✅Keep a Changelog, có mục cho cả 5 bản và [Unreleased]
Tệp phát hành định dạng mở✅Workflow Release Package chạy khi đẩy tag v*; đã chạy tay ngày 30/10/2026 cho cả 5 tag, mỗi release có dx-os-X.Y.Z.tar.gz, .sha256 và 4 SBOM .cdx.json
Ghi chú phát hành✅Ghi chú của v1.0.0, v1.0.1, v1.0.2, v1.1.0 lấy từ mục CHANGELOG; v1.0.3 giữ ghi chú viết tay
Image theo phiên bản✅Workflow Release chạy trên tag thì đẩy thêm tag image vX.Y.Z lên GHCRChạy Release trên tag mới
Số phiên bản trong mã khớp tag✅Backend, web, mobile, SBOM cùng 1.1.1Nếu bản kế tiếp không phải 1.1.1 thì đổi ở backend/**/pom.xml, frontend/package.json, mobile/package.json, mobile/app.json
Tài liệu nêu đúng release✅docs/SUBMISSION.md mục 1 ghi Release v1.0.0 đến v1.1.0Cập nhật khi có release mới
Ngày hạn nộp⚠️BACKLOG.md mục 1: chưa chốt; tag cuối phải tạo trước hạnChốt ngày, rồi đặt tag cuối

6. Tiêu chí 4: build và cài đặt từ mã nguồn (10 điểm)​

MụcTrạng tháiBằng chứngCòn lại
Hướng dẫn cài đặt đầy đủ✅README.md mục "Cài đặt và chạy": yêu cầu hệ thống, các lệnh từ git clone đến ./deploy/start.sh
Cấu hình trước khi build, không sửa mã✅Mọi cấu hình ở deploy/.env (mẫu deploy/.env.example); deploy/doctor.sh kiểm trước khi chạy
Công cụ nguồn mở✅Docker, Compose, Git, Maven wrapper, npm, pip
Chạy lại được trên stack sạch✅Workflow E2E chạy Farm 10 bước và Lab 16 bước, xanh trên main ngày 30/10
Build không qua Docker✅README mục "Build từ mã nguồn không qua Docker": lệnh cho backend, web, mobile, AI (bản tiếng Anh ở README_EN.md)
Chạy ngoài thư mục mã nguồn✅deploy/install.sh <prefix> [tag] chép deploy/, data/, sso/, bi/, chat/ và crop classifier sang thư mục khác, sinh .env, dùng image GHCR; job install của CI kiểm compose và mọi tệp được mount; đã chạy thử config cho Farm và LabChạy docker compose pull và start.sh từ thư mục đã cài (#162); các package GHCR đã công khai
Hai đường nhập .env khác nhau✅README và CONTRIBUTING.md cùng dùng make_ci_env.py, đường điền tay ghi thêm
Kiểm clone sạch⚠️BACKLOG.md mục 3: "Khởi động bản Qwen từ clone sạch" chưa kiểmChạy đúng chuỗi README trên máy sạch trước ngày nộp
Yêu cầu phần cứng với giám khảo⚠️8 GB RAM, 40 GB ổ đĩa; Qwen cần CPU có AVX2, máy không có thì đặt AI_ANSWER_GENERATION=false (đã ghi ở README)
Dung lượng clone⚠️.git nặng khoảng 259 MB do trọng số mô hìnhGhi dung lượng clone trong README nếu cần

7. Tiêu chí 5: thư viện, phụ thuộc, nguồn gốc (10 điểm)​

MụcTrạng tháiBằng chứngCòn lại
Danh sách thư viện, phiên bản, giấy phép✅COPYRIGHT.txt 7 mục; README gọi đây là bảng dependency
SBOM đủ giấy phép✅sbom/ai.cdx.json thiếu giấy phép ở 107/108 gói Python; .github/scripts/enrich_sbom_licenses.py bổ sung từ PyPI, nay 108/108Dấu "BSD License" của PyPI được hiểu là BSD-3-Clause, nên xem lại nếu cần chính xác tới từng gói
Phạm vi SBOM✅sbom/README.md ghi rõ SBOM chỉ gồm thư viện của mã nhóm viết; image bên thứ ba ở COPYRIGHT.txt mục 6; SBOM đính kèm release
Ghim phiên bản image✅Mọi image bên thứ ba trong deploy/docker-compose.yml ghim tag và digest; compose config hợp lệ cho Farm và Labdeploy/backup.sh và deploy/reset.sh còn dùng tag trần cho PostgreSQL và Alpine
Không sửa mã thượng nguồn✅Không có tệp .patch; Keycloak dựng từ bản phát hành chính thức; Mattermost nguyên bản
Không phát hành kèm thư viện đóng gói✅Không có vendor/, node_modules/, third_party/ trong cây Git
Nguồn gốc tệp mô hình✅ai/weights/README.md ghi nguồn, commit và SHA-256 của crop_classifier.onnx, đã so với bản gốc trên Hugging Face: trùng từng byte
Tệp .zip của Superset✅bi/README.md ghi đây là định dạng export của Superset
Tài liệu của công cụ AI trong repo✅Mọi tệp trong .claude/ và .codex/ (skill, agent, quy tắc làm việc) đã gỡ khỏi repo và nằm trong .gitignore; các tệp vẫn còn trên máy của nhóm. Lịch sử cũ vẫn chứa chúng
Tệp nhị phân trong repo⚠️ai/weights/ khoảng 250 MBKhông gỡ khỏi lịch sử; cân nhắc tải lúc build nếu muốn clone nhẹ hơn
Cập nhật phụ thuộc✅Dependabot, CI Dependencies chặn khi có lỗ hổng HIGH/CRITICAL đã có bản vá

8. Tiêu chí 6: tài liệu, quản lý lỗi, giao tiếp (10 điểm)​

MụcTrạng tháiBằng chứngCòn lại
README đủ mục đề yêu cầu✅README.md và README_EN.md: kiến trúc 3 tầng, bảng H-P-D-I cho Farm và Lab, tính năng, công nghệ và giấy phép, cài đặt, cấu hình, chạy thử, tài khoản demo, API, kiểm thử, đóng góp
CHANGELOG✅Có mục cho cả 5 bản; [Unreleased] ghi các thay đổi của nhánh này
Tài liệu kiến trúc, API✅ARCHITECTURE.md; springdoc/Swagger UI trong backend; 66 tệp Markdown không có liên kết tương đối hỏng
CONTRIBUTING, CODE_OF_CONDUCT✅GitHub xác nhận cả hai
CONTRIBUTING khớp quy trình thật✅Nhánh Khuong/main làm nhánh tích hợp, mục Phát hành mô tả tag trên main và các workflow
SECURITY.md✅Có tệp: cách báo qua GitHub, quy trình xử lý, phạm vi, cơ chế quét trong CI; nhóm đã bật Private vulnerability reportingKiểm lại cam kết "xác nhận trong 7 ngày"
Biểu mẫu issue✅bug_report.yml, feature_request.yml, config.yml thay cho hai tệp .md; liên kết trong README đã đổiKiểm ở tab Issues > New issue sau khi gộp
Issue tracker có nội dung✅8 issue (#161 đến #168), danh sách dưới
Actions có lượt chạy lỗi⚠️Workflow Online check (chạy theo lịch) có ba lượt failure ngày 29 và 30/10; tệp workflow không còn trên mainKhông cần làm nếu workflow đã bỏ; lượt lỗi cũ vẫn hiện ở tab Actions
Bản test✅224 phương thức @Test Java (39 tệp), 148 hàm test Python; E2E hai ứng dụng trong CI

Issue đã mở​

Lấy từ BACKLOG.md mục 3 đến 6, mỗi việc một issue gắn nhãn enhancement; đóng bằng PR có Closes #n:

  • #161 Kiểm khởi động từ clone sạch với Qwen bật.
  • #162 Kiểm cài đặt ngoài thư mục mã nguồn bằng image GHCR.
  • #163 Đánh giá toàn pipeline chẩn đoán bằng ảnh ruộng thật có nhãn kỹ sư.
  • #164 Xóa audit_log theo thời hạn.
  • #165 Cảnh báo đăng nhập sai theo tài khoản.
  • #166 Phân trang tra cứu chi tiết ở phía máy chủ (màn hình giám sát).
  • #167 Che thông tin cá nhân trong log.
  • #168 Bổ sung bài tri thức Lab về máy in, VPN, quy chế phòng máy.

9. Lộ dữ liệu nhạy cảm (điều kiện 7 của phần B)​

Kiểm traKết quả
Mẫu khóa, token, khóa riêng trên cây hiện tạiKhông có (quét mẫu AWS, GitHub, Slack, Google, khóa riêng)
Cùng các mẫu trên toàn bộ lịch sử GitKhông có
Tệp .env thật bị theo dõiKhông; chỉ có bốn tệp .env.example
Mật khẩu mặc định trong .env.exampleĐể trống, make_ci_env.py sinh ngẫu nhiên; .gitleaks.toml chỉ cho phép vài mật khẩu demo cũ còn trong lịch sử
GitleaksCI Infra có job secret-scan; trên máy này chưa cài gitleaks nên chưa tự chạy lại toàn lịch sử
Email trong repo✅ Mỗi thành viên một địa chỉ, nhóm đã xác nhận: ở README.md, README_EN.md mục Liên hệ và CODE_OF_CONDUCT.md (một địa chỉ của Khương)
Email trong lịch sử commit✅ .mailmap gom mọi danh tính về một tên và một email mỗi người (kể cả hai commit mang email cơ quan), nên git log và git shortlog chỉ hiện địa chỉ đã chọn; lịch sử gốc không bị viết lại

10. Mức trừ điểm có thể gặp (mục 12 của đề)​

Lỗi trong đềMức xử lý của đềDX-OS hiện tại
Repository không công khaiKhông chấm PoFKhông vi phạm
Không có LICENSE hoặc license không rõ-5 đến -10Không vi phạm
Không có release/tag-5Không vi phạm; release chưa có tệp phát hành cho đến khi chạy Release Package
Không build/install được từ mã nguồn-5 đến -10Rủi ro thấp; còn cần chạy thử trên máy sạch (#161, #162)
Không có README/hướng dẫn chạy-5Không vi phạm
Không có CHANGELOG hoặc bug tracker-3 đến -5Không vi phạm: có CHANGELOG và 8 issue
Commit secret, API key, dữ liệu nhạy cảmTrừ nghiêm trọngKhông thấy secret; email mỗi người một địa chỉ (mục 9)
Dùng thành phần đóng hoặc không rõ giấy phépKhông tính phần liên quanKhông thấy
Không chứng minh được Open-Core headlessTrừ mạnh ở tiêu chí kiến trúcNgoài phạm vi tài liệu này; ArchitectureTest và ARCHITECTURE.md là bằng chứng chính

11. Thứ tự làm tiếp​

  1. Đóng dần các issue #161 đến #168 bằng PR.
  2. Chốt ngày hạn nộp; đặt tag mới trên main (workflow Release Package tự tạo Release kèm gói), chạy Release để có image vX.Y.Z.
  3. Chạy chuỗi README trên một máy sạch, cả cách cài ra thư mục khác (deploy/install.sh).
  4. Xác nhận -only hay -or-later của AGPL cho ai/.

12. Phạm vi kiểm tra​

Đã kiểm: cây Git và lịch sử cục bộ, API công khai của GitHub (repo, release, tag, issue, PR, Actions, community profile), tệp trong repo, quét mẫu secret trên cây hiện tại và toàn lịch sử, liên kết Markdown tương đối, thẻ mô hình và tệp ONNX trên Hugging Face. Các thay đổi trong nhánh đã chạy thử cục bộ: check_licenses.py (0 vấn đề), install.sh và docker compose config ở thư mục cài, biên dịch backend, kiểm kiểu web và mobile, cú pháp YAML và shell, các bước tạo gói của workflow phát hành.

Chưa kiểm được:

  • Cài đặt GitHub cần quyền chủ repo: branch protection, Private vulnerability reporting.
  • Chạy lại README từ một clone sạch trên máy mới, và docker compose pull từ GHCR.
  • Gitleaks hoặc trufflehog toàn lịch sử; quét mới dừng ở các mẫu khóa phổ biến.