Repository navigation
v1.1.0
·
366 commits
to develop
since this release
Gói phát hành chính thức: signet-1.1.0.tar.gz (định dạng mở), kiểm bằng sha256sum -c signet-1.1.0.tar.gz.sha256; danh mục thành phần kèm giấy phép (SBOM CycloneDX): signet-1.1.0.cdx.json. "Source code (zip)" và "Source code (tar.gz)" do GitHub tự gắn vào mọi bản phát hành, không phải gói của đội.
Bản cho vòng trường. Lõi Signet có thêm ứng dụng thứ hai và cắm được ứng dụng mới bằng một lệnh; cổng có tường lửa ứng dụng web; Văn phòng điện tử có giao diện hồ sơ, phòng đọc và phả hệ của từng biểu đồ báo cáo.
- Ứng dụng trên lõi: Không gian cá nhân P.A.R.A (
/ca-nhan/);moc app installcài ứng dụng từ manifest mà không sửa tệp nào của lõi, ví dụ Bảng tin đơn vị (apps/bang-tin) nghe luồng sự kiện đã làm sạchcore.app_events. - Văn phòng điện tử: giao diện hồ sơ công việc, lãnh đạo phòng nộp lưu theo yêu cầu, phòng đọc xem tệp có dấu tên người xem (F3.8; nộp lưu nền đã có từ 1.0.0); phả hệ của từng biểu đồ báo cáo: biểu đồ ← khung nhìn ← bảng (F3.9, F3.11); tự chẩn đoán H-P-D-I cho lãnh đạo (F4.7); góp ý và số đo "sau" (F4.6).
- Bảo mật: WAF Coraza + OWASP CRS ở APISIX (F3.15), chặn mặc định, mỗi loại trừ có lý do và số đo; giao diện báo rõ khi cổng chặn; nâng pypdf 6.21.2 (ba GHSA) và gỡ pip khỏi image của dịch vụ.
- Dữ liệu và vận hành: API nạp lô văn bản đến; log tập trung Vector + Parseable (tắt mặc định); thông báo email; trang Trạng thái công khai; SBOM CycloneDX kèm mỗi bản phát hành.
- Kho mã: cấu hình phần mềm nguồn mở gom vào
platform/, khai giấy phép REUSE, repo đổi tênHIT-Champion/Signet, gói phát hànhsignet-X.Y.Z.tar.gz; CI chia năm phần chạy song song.
Toàn bộ ghi chép thay đổi của 1.1.0 (41 mục)
Đã thêm
- API nạp lô văn bản đến (cụm ⑤ Tầng 1):
POST /api/imports/incomingnhận NDJSON hoặc CSV cùng trường vớireceiveIncoming, kèm zip tệp đính kèm tùy chọn. svc-files xử lý nền theo mẻ; mỗi dòng đi đúng đường tiếp nhận lẻ — ClamAV, ActionreceiveIncomingthay mặt văn thư, tùy chọn vào sổ — nên vẫn cách ly đơn vị và có dòng sổ kiểm toán riêng.GET /api/imports/{id}báo đã nhận / đạt / trùng / lỗi,…/rowsbáo lỗi từng dòng. Gửi lại cùng tệp không nhân đôi (Idempotency-Key, chỉ mục chặn trùng); svc-files khởi động lại thì lô chạy tiếp. Dòng bị từ chối thì tệp đã lưu được gỡ;restrictedsai kiểu bị chặn trước khi tệp vào kho; trần byte một lô ghi vào khoMOC_IMPORT_STORE_MAX_MB; dòng được giữ khi đang làm nên hai tiến trình không làm trùng. Bảngcore.import_jobs,core.import_rows(migration 1792281602800). Lô mẫu 200 dòngseed/nap-lo/van-ban-den.csv,make demo-nap-lo. Test (đếm tĩnh): svc-files +113, db +18, scripts +12, svc-workflow +2, giao diện +2. - Tường lửa ứng dụng web ở cổng APISIX (F3.15): Coraza v3.3.3 + OWASP CRS v4.14.0 (coraza-proxy-wasm 0.6.0, ghim digest và băm) chặn tải tấn công (SQLi, XSS, duyệt thư mục, chèn lệnh, Log4Shell, tải lên
.php…) trên mọi đường trước khi kiểm token → 403 cóX-Request-Id, dòng chặn trong nhật ký mang cùng mã. Mặc định chặn,MOC_WAF=On | DetectionOnly | Off; giá trị sai bịmake upvà reconciler GitOps (trước khi dừng Signet) từ chối, và image dừng ngay lúc khởi động với dòng lỗi rõ thay vì cổng trả 503. Loại trừ CRS gỡ theo id, có lý do, chỉ trên đúng khóa: Keycloak, chữ truy vấn GraphQL, truy cập bằng IP; chữ tự do trong biến GraphQL (nội dung, trích yếu, ý kiến, ghi chú, góp ý), câu hỏi trợ lý, ô Tìm kiếm; tên tệp tải lên có' " ; = :. Dò trên 7 389 yêu cầu dựng từ toàn bộ chữ của dữ liệu mẫu: không chữ mẫu nào bị chặn nhầm (trước đó 4/21 PDF mẫu). JSON lồng sâu bị chặn trước WAF (GHSA-6gcq-wc29-5xf2). Nội dung tệp vẫn do ClamAV soi. APISIX dựng thành imagemoc/apisix, 4 worker (MOC_APISIX_WORKERS); smoke thêm 7 kiểm, có tên tệp và nội dung hành chính thật phải qua (platform/apisix/README.md, mục WAF). - Khai giấy phép theo chuẩn REUSE:
REUSE.tomlkhai Apache-2.0 cho các tệp không chèn được header (JSON, ảnh, PDF, tài liệu, dữ liệu mẫu),LICENSES/Apache-2.0.txtlà bản sao củaLICENSE;reuse lint5.0.2 đạt, 482/482 tệp có thông tin bản quyền và giấy phép..env.examplemang header giấy phép,make license-checkkiểm cả tệp này (PoF #2). - README (cả bản tiếng Anh) có mục "Cấu trúc thư mục": mỗi thư mục chứa gì, mã đội tự viết nằm đâu, các tác tử AI (F4.1–F4.4) ở tệp nào, test của từng phần ở đâu.
- Tài liệu đánh giá AI
docs/danh-gia-ai.md: với đọc văn bản đến, trợ lý hỏi đáp, gợi ý giao việc và bộ che thông tin cá nhân (F4.1–F4.4) — mục đích, mô hình và công cụ kèm phiên bản, giấy phép (trỏDEPENDENCIES.md), dữ liệu đo và cách làm nhãn, lệnh đo lại, số đo kèm ngày, máy và nguồn, phần chưa đo, giới hạn, cơ chế an toàn kèm tệp mã. Thêm lần đo trợ lý hỏi đáp trên bản online (23/10/2026, Qwen3-1.7B và Qwen3-Embedding-0.6B trên CPU): recall@3 16/16, 0 nguồn bị cấm, câu trả lời của mô hình qua kiểm 16/16, p50 8,9 giây. Bảng Tài liệu của README (cả bản tiếng Anh) có thêm dòng này. - Hồ sơ chất vấn:
docs/du-thi/hoi-dap-hoi-dong.mdgồm 13 câu hội đồng dễ hỏi (lên 100.000 người dùng, nguồn mở và khóa nhà cung cấp, lõi dùng lại cho ứng dụng khác, bảo mật, AI bịa và dữ liệu ra ngoài, sao lưu và tự phục hồi, chạy không Internet, chi phí, giấy phép, việc chưa làm), mỗi câu trả lời kèm đường dẫn, lệnhmake, bước CI làm bằng chứng.docs/demo-script.mdthêm mục "Phương án dự phòng" (mất mạng, hỏng laptop, AI chậm, TOTP không qua, bước demo lỗi; máy dự phòng chạy tại chỗ không cần Internet, video) và checklist T-1 ngày, T-1 giờ, T-5 phút. - Bảng mức hoàn thiện
docs/muc-hoan-thien.md: 43 tính năng F1.1–F4.6, mỗi tính năng một mức (Hoàn thiện 32, Dùng được 5, Minh họa 2, Một phần 1, Chưa làm 3; định nghĩa ở đầu tệp) kèm bằng chứng — tệp test và số hàm test đếm tĩnh (tổng 1 425, cách đếm ghi rõ), bước CI, màn demo hay kịch bản e2e — và hạn chế đã biết. Độ phủ 29 năng lực của 7 cụm dịch vụ Tầng 1 theo đề: 17 hoàn thiện, 3 chưa có (kịch bản serverless, API nạp lô, trục streaming sự kiện). Lệnh đếm lại, kiểm lại ở cuối tệp. - Thông báo đa kênh: ngoài chuông trên web,
svc-workflowgửi thêm email (SMTP, STARTTLS/SSL) tới địa chỉ trong danh bạ và tin tóm tắt lên webhook (Mattermost, Slack, ntfy) khi đặtMOC_SMTP_HOST,MOC_NOTIFY_WEBHOOK_URL— mặc định tắt. Hộp thư đicore.notification_deliveriestạo cùng giao dịch với thông báo, gửi ở nền, thử lại tối đa 5 lần có giãn cách, mỗi lần ghi sổ kiểm toán; webhook không có tên người, không có văn bản hạn chế; nhật ký không có địa chỉ email, URL. Mailpit (profilemail) làm hộp thư thử cho demo. Test svc-workflow +41, scripts +8. - Chuỗi cung ứng:
make sbomsinh SBOM CycloneDX của cây mã nguồn bằng Syft 1.54.1 (image ghim digest), bản phát hành đính kèmmoc-X.Y.Z.cdx.jsoncùng.sha256;make license-audit(scripts/license_audit.py, chỉ thư viện chuẩn) kiểm giấy phép của mọi gói kể cả gói gián tiếp theo chính sách củaDEPENDENCIES.md, gói chưa rõ hay ngoài chính sách cần ngoại lệ có lý do trong.github/license-exceptions.json. Job CI "Giấy phép (PoF #2)" chạy cả hai: 769 gói (npm 690, Python 73, action 6) đều đạt, 22 gói qua nhờ ngoại lệ.SECURITY.md: phiên bản được hỗ trợ, báo lỗ hổng riêng tư qua GitHub, thời gian phản hồi, phạm vi kể cả bản chạy thử trực tuyến. Test scripts +22. - Trang công khai Trạng thái hệ thống
/trang-thai(không cần đăng nhập, tự làm mới mỗi 30 giây): tình trạng chung và từng thành phần theo tầng người dùng → lõi → quy trình → dữ liệu → trí tuệ nhân tạo, phiên bản, thời gian chạy, giờ sao lưu gần nhất, trợ lý AI bật hay tắt kèm tên mô hình; có đường tới từ trang đăng nhập lỗi, chân trang cổng xác thực, thanh bên.GET /api/statuscủasvc-filesgom ở phía máy chủ (lưu đệm 10 giây cho mọi người, mỗi lần dò tối đa 3 giây), chỉ trả nhãn cố định, không tên máy, địa chỉ hay số liệu; APISIX giới hạn 30 lần/phút mỗi IP (MOC_RATE_STATUS_PER_MIN).moc backup createghi dòngsystem.backed_upvào sổ kiểm toán. Test svc-files +36, office +9, e2e +1. - Ứng dụng thứ hai trên lõi, Không gian cá nhân P.A.R.A (
/ca-nhan/,apps/ca-nhan): mỗi người cất tệp của mình trong bốn thư mục Dự án, Lĩnh vực, Tài nguyên, Lưu trữ — tải lên quasvc-files(ClamAV), chuyển, tải về; client Keycloak riêngapp-ca-nhan, cùng phiên SSO với Văn phòng điện tử; schema riêngpersonalcó quyền đến từng dòng, mỗi lần xếp, chuyển vào sổ kiểm toán của lõi. Không sửa dòng nào trongservices/; cách thêm một ứng dụng:docs/them-ung-dung.md. Bản cài cũ thêm client bằngmoc realm clients(make seedcũng gọi);make demo-ca-nhan. - Góp ý và số đo "sau" theo đặc tả §8 (F4.6): nút Góp ý trên thanh trên của Văn phòng điện tử — mức hài lòng 1–5, vài dòng, màn hình đang dùng tự gắn dạng khuôn đường dẫn (không id, không chuỗi truy vấn); bảng
office.feedbackcách ly theo đơn vị, người gửi chỉ thấy góp ý của mình, lãnh đạo và quản trị đơn vị xem danh sách (không có người gửi) và tổng hợp theo màn hình ở trang Góp ý; CSDL chặn gửi dồn (3 góp ý mỗi 10 phút, 20 mỗi 24 giờ); góp ý không gắn sổ kiểm toán. Trang Số đo cho lãnh đạo đơn vị vàmake do-so-lieu-sau: thời gian từ văn bản đến tới khi giao xử lý (trung vị, p90), tỷ lệ xử lý quá hạn, 5 lần tìm lại văn bản cũ qua API (độ trễ hệ thống), số bước chuyển tay so sánh định tính; cột "trước" ghi chưa đo, số trên đơn vị mẫu (core.tenants.sample_data) ghi rõ là dữ liệu mẫu. Cách đo:docs/so-lieu-sau.md. Test db +30, office +21, scripts +16. - Log tập trung (F3.14, profile
logs, tắt mặc định): tệp compose phủplatform/logs/docker-compose.logs.ymlđổi driver log của APISIX, app-office, app-ca-nhan,svc-files,svc-workflowsang fluentd, gửi Vector 0.59.0 rồi Parseable v3.2.4 (chỉ nghe 127.0.0.1, bỏ mọi capability, mật khẩu domake env,make uphaymake logs-upsinh, mật khẩu rỗng thì không mở cổng, giữMOC_LOGS_RETENTION_DAYSngày). Vector ghép dòng Docker cắt ở 16 KiB rồi che lần hai: token Bearer/Basic (cả có=đệm), JWT; giá trị của khóa mật khẩu, bí mật, token, khóa API, phiên (cả có tiền tố, hậu tố, dict Python, mật khẩu có dấu cách, nháy không đóng, khóa ở mọi tầng của dòng JSON, khóa viết thoát) và của cờ dòng lệnh như--password; Authorization (không nháy thì tới hết dòng, cả Digest), Cookie nhiều cặp; mật khẩu trong chuỗi kết nối; chuỗi truy vấn của URL; email (cả có dấu), số điện thoại (cả +84), CCCD; CMND, số tài khoản, mã số thuế khi có từ khóa đứng trước; số viết tách nhóm không có từ khóa, họ tên vẫn lọt (danh sách ởdocs/van-hanh.md). Không gắndocker.sock,docker logsvẫn đọc được;make logs-up,make logs-tra ID=…,make logs-down,make demo-log-tap-trung.svc-workflowmangX-Request-Idnhưsvc-files(nhật ký, lời gọi Hasura nên vàocore.audit_log.request_id, lời gọisvc-files), mã sai dạng thì thay bằng mã mới; APISIX ghi mã yêu cầu ở cuối dòng log truy cập. Rủi ro (CORS của Parseable, mất log khi Vector dừng) và cách tắt:docs/van-hanh.md, mục Log tập trung. Test svc-workflow +10, scripts +29,vector test29 ca. - Cắm ứng dụng vào lõi bằng một lệnh, không sửa tệp nào của lõi:
python3 scripts/moc.py app install apps/<thư mục>/app.yaml(make app-install APP=…,--dry-runin kế hoạch),app list,app remove(giữ dữ liệu),app sync. Manifest theoscripts/app-manifest.schema.json; lệnh tạo client Keycloak (PKCE S256, 5 mapper; client dịch vụ khi cần), route APISIX, container, schema + migration chạy bằng vai trò CSDL riêng của ứng dụng (không quyền gì trên lõi; view,DEFAULT, trigger đọc lõi hay chạy bằng quyền của Hasura bị từ chối trước khi commit), bảng và quyền Hasura (lọc đơn vị; điều kiện trong quyền không_exists, qua quan hệ sang lõi chỉvisible: {_eq: true}— Hasura chạy điều kiện bằng quyền admin), Event Trigger — trạng thái trong.moc-apps/(ngoài git), tệp chạy dựng từ tệp lõi nguyên văn (APISIX tự nạp lại, metadata sống qua khởi động lại Hasura). Chạy lại không tạo trùng; lỗi báo đúng bước. Lõi phát luồng sự kiện đã làm sạchcore.app_events(migration 1792281603200: tiếp nhận, vào sổ, phát hành; không văn bản hạn chế) qua Hasura Event Triggers. Ứng dụng thứ baapps/bang-tin— Bảng tin đơn vị;make demo-cai-ung-dung; cách làm, ranh giới tin cậy và rủi ro ởdocs/them-ung-dung.mdmục 1.moc backupghi và tạo lại vai trò CSDL của ứng dụng khi khôi phục sang máy mới. Test (đếm tĩnh): scripts +52, db +14, bang-tin +20. - Tự chẩn đoán mức trưởng thành H-P-D-I cho lãnh đạo (F4.7): trang Tự chẩn đoán
/tu-chan-doan— 12 câu do đội tự viết theo bốn không gian Con người, Quy trình, Dữ liệu, Trí tuệ, mỗi câu 5 mức quan sát được (vi/en, có JSON Schema), radar ECharts, cảnh báo lệch nền theo nguyên lý tiến hóa tuyến tính H → P → D → I, không gian nên làm trước, bước tiếp theo trỏ đúng trang Signet mà vai trò người xem mở được. Cạnh mỗi không gian là bằng chứng đo được của chính đơn vị lấy từ các view đã có (dashboard, số đo F4.6, độ chính xác tác tử F4.1/F4.3, hồ sơ nộp lưu), chỉ số chưa có dữ liệu thì không hiện. Lãnh đạo đơn vị lưu kết quả vàooffice.maturity_assessments(CSDL kiểm đủ bộ câu và tính điểm, cách ly theo đơn vị, tối đa 5 lần lưu mỗi giờ, không sửa, xóa, gắn sổ kiểm toán) để xem tiến bộ; lãnh đạo phòng làm được nhưng không lưu. Không phải bộ chỉ số chính thức, không quy đổi DTI. Nguồn, cách chấm, giới hạn:docs/tu-chan-doan.md. Test office +18, db +18. - Giao diện hồ sơ công việc và phòng đọc xem tệp (F3.8, màn (i)): trang Hồ sơ công việc của Văn phòng điện tử — chuyên viên, lãnh đạo phòng lập hồ sơ (ký hiệu, tiêu đề, thời hạn bảo quản), thêm văn bản đã xong của phòng, đóng hồ sơ; văn thư, lãnh đạo đơn vị xem cả đơn vị; lãnh đạo phòng bấm Nộp lưu (
POST /api/case-files/{id}/archive; đội chọn lãnh đạo phòng làm người nộp, người thứ hai sau người lập; chung một lượt với vòng nộp lưu nền, ghi sổ kiểm toán khi giành được lượt, lỗi trả mã đúng nghĩa). Phòng đọc trên trang hồ sơ đã nộp lưu: manifest khớp băm, văn bản trong gói, nút Xem tệp PDF (GET /api/case-files/{id}/archive/files/{file_id}) — kiểm băm tệp với manifest, đóng dấu "PHÒNG ĐỌC" kèm tên người xem, giờ xem, ghicase_file.file_viewedvào sổ kiểm toán rồi mới trả, chỉ xem trong trang (inline,no-store); gói lạnh không đổi. Test svc-files +22, office +10, e2eho-so.spec.ts;make smokenộp lưu qua endpoint mới (chuyên viên gọi bị 403) và xem tệp;make demo-nong-lanhkiểm thêm bước xem tệp. - Phả hệ trên báo cáo tổng hợp (F3.9, F3.11): khung nhìn
office.report_lineagetính từ catalog PostgreSQL lúc truy vấn khung nhìn báo cáooffice.v_*nào đọc bảng, view nào (đệ quy qua view lồng, không khai tay — sửa view là phả hệ đổi theo), chỉ có tên và cạnh, lãnh đạo đơn vị đọc như dashboard. Trang Phả hệ số liệu (/pha-he) và nút "Nguồn số liệu" trên từng biểu đồ của trang Điều hành: đồ thị ECharts biểu đồ → khung nhìn → bảng, nối với lượt nộp lưu gần nhất (bảng → Parquet → gói lưu trữ, số dòng đã kiểm), bảng nguồn đi kèm, tải phả hệ dạng OpenLineage (JSON Lines); biểu đồ nào đọc khung nhìn nào khai một chỗ, có test đối chiếu với truy vấn thật của trang. Bướccommitcủa nộp lưu khai thêmoffice.archived_document_facts;make demo-pha-hethêm bước in phả hệ báo cáo, smoke thêm 2 kiểm. Test db +6, office +13, scripts +4, e2e +1.
Đã sửa đổi
- README (cả bản tiếng Anh) viết lại thành 12 mục, cài đặt lên khoảng giữa trang thay vì dòng 221: Giới thiệu, Kiến trúc, Tính năng, Bằng chứng 4 nguyên lý, Công nghệ và giấy phép (phiên bản, giấy phép, vai trò từng thành phần), Cài đặt từ mã nguồn, Chạy thử (bản online signet.htechcs.com, tài khoản, địa chỉ), Vận hành và kiểm thử, Xử lý sự cố, Tài liệu, Đóng góp và liên hệ (nhóm phát triển), Giấy phép. Sơ đồ ASCII thay bằng sơ đồ kiến trúc động (GIF, tiếng Việt và tiếng Anh): luồng yêu cầu chạy trái sang phải, màu theo H-P-D-I, viền đậm là mã của đội, logo trên các phần mềm nguồn mở dùng nguyên bản; sinh lại bằng
python3 scripts/so_do_kien_truc.py gif(Chromium và FFmpeg, chỉ khi sửa sơ đồ). Logo khai riêng trongREUSE.toml(LicenseRef-Logos), nguồn ởdocs/anh/logo/NGUON.md(#108). - Repo đổi tên
HIT-Champion/HVL→HIT-Champion/Signet(#112): đường dẫn trong hướng dẫn đóng góp, chính sách bảo mật, mẫu issue, tài liệu triển khai, vận hành, quy trình nhánh,scripts/release_body.pyvà producer của sự kiện OpenLineage; lệnhcd HVLsau khi clone thànhcd Signet. GitHub vẫn chuyển hướng đường dẫn cũ. - CI nhanh hơn: job "Chạy thử toàn hệ thống (PoF #4)" chia ba phần chạy song song trên ba máy (luồng chính, e2e và các màn lõi; màn AI, nộp lưu, ký số, sao lưu và khôi phục; cài đặt và GitOps), phần nào cũng tự dựng và nạp mẫu — khoảng 27 phút còn khoảng 12 phút, vẫn chạy đủ mọi bước. PR chỉ đổi tài liệu (
*.md, ảnh trongdocs/, trừdocs/api/) không dựng hệ thống. Tên job ruleset yêu cầu giữ nguyên. - CI nhanh hơn nữa (#110): job "Chạy thử toàn hệ thống (PoF #4)" chia năm phần (
luong-chinh,e2e,ai,sao-luu,cai-dat); smoke chạy lại sau khôi phục và cuối GitOps không chờ timer nhắc hạn lần nữa (đã kiểm ởluong-chinh), smoke ngay saumake installthay bằng kiểm nhanh vì GitOps chạy smoke đủ trên cùng bản cài; job "Dựng từ mã nguồn" đỏ khi một bước gọi tên phần không có trong ma trận hay một phần không có bước nào; Python in ngay từng dòng để mốc thời gian trong nhật ký đúng.make demo-tu-phuc-hoithử lại tải tệp tối đa 30 giây khi cổng còn trả 502/503 ngay sau khi svc-files được dựng lại (APISIX hỏi lại DNS mỗi 5 giây), in số giây đã chờ. - Trang Release ngắn lại (
scripts/release_body.py): dòng chỉ gói chính thứcmoc-X.Y.Z.tar.gzkèm lệnh kiểm.sha256(GitHub tự gắn "Source code (zip)" vào mọi bản phát hành mà không gỡ được, PoF #3), phần tóm tắt viết ngay dưới tiêu đề phiên bản trong CHANGELOG, rồi toàn bộ ghi chép gập lại. Dòng tiếp nối được nối lại: GitHub hiện mỗi dấu xuống dòng của mô tả Release thành một dòng mới. Mục [1.0.0], [0.1.0] thêm phần tóm tắt. Test scripts +6. - Lịch phát hành:
v1.0.0(23/10);v1.1.0trước vòng trường 01/11; bản nộp chấm làv1.2.0(03/12); sauv1.2.0, mỗi bản sửa lỗi gộp vàodevelopđi kèm một bản vá để lúc chấmdevelopvàmaincùng nội dung.docs/git_flow.mdghi lệnh thiết lập repo (merge commit, bật secret scanning) và lý do giữdeveloplàm nhánh mặc định; mục 11 ghi đúng mốc chuyển quy trình (sauv1.0.0) và việc các lượt chạy cũ đã bị xóa khỏi trang Actions. - Gói phát hành đổi tên
moc-X.Y.Z.tar.gz→signet-X.Y.Z.tar.gz(cả SBOM.cdx.jsonvà.sha256) theo tên sản phẩm; tên mãmoctrong mã, image, dịch vụ giữ nguyên. Gói củav0.1.0,v1.0.0giữ tên cũ (không gắn lại thẻ). - Tài liệu phục vụ cuộc thi chuyển vào
docs/du-thi/(phân tích đề, tóm tắt thể lệ, bảng tự chấm PoF, kế hoạch phát triển, thư mụcnghien-cuu/), kèm trang mục lục;docs/chỉ còn tài liệu về sản phẩm. Mọi liên kết và chỗ nhắc đường dẫn (README, đặc tả, mô hình dữ liệu, README dịch vụ, chú thích BPMN vàflowable.py) đã sửa theo. - Cấu hình của phần mềm nguồn mở dùng nguyên bản gom vào
platform/:auth/→platform/keycloak/,gateway/→platform/apisix/,realtime/→platform/centrifugo/,openbao/,monitoring/→platform/openbao/,platform/monitoring/,ops/systemd/→platform/systemd/, kèm trangplatform/README.md. BPMN vào thư mục của dịch vụ nạp nó (services/svc-workflow/processes/), cảm biến giả lập vàoservices/ot-sensor/. Gốc repo từ 15 còn 10 thư mục. Compose,install.sh, test, tài liệu đổi đường dẫn theo; đường dẫn trong container không đổi. Cài lại vào bản cài theo bố cục cũ thìmake installxóa các tệp cũ (theo MANIFEST) và cả thư mục cha đã rỗng. - CI: bước "Tài liệu API trong docs/api/ khớp mã" lệch thì sinh lại
docs/api/trên chính hệ thống vừa dựng và tải lên thành artifactdocs-api-<lần chạy>(giữ 7 ngày); người sửa PR chép về rồi commit, không phải dựng cả hệ thống ở máy.docs/api/README.mdcó lệnhgh run download. ROADMAP.mdviết lại theo hiện trạng: trước đây gần như mọi mục còn[ ]và viết theo lúc chọn công cụ ("Chốt nền tảng …"). Nay giữ khung giai đoạn 0, bốn không gian H-P-D-I, giai đoạn 5 và Ngoài phạm vi; mục đã xong ghi[x]kèm thành phần và mã F hay tệp làm bằng chứng (docs/muc-hoan-thien.md), mục làm dở ghi rõ phần còn thiếu, việc đang làm ghi số PR nếu có. Thêm mục "Sau vòng trường": việc còn thiếu thật xếp theo ưu tiên, kèm lý do, không gắn ngày.docs/architecture.mdviết lại theo hệ thống đang chạy: sơ đồ tổng thể vẽ lại bằng Mermaid với đường dẫn thật của APISIX; bản đồ công cụ thay bảng "đang khảo sát" bằng thành phần, phiên bản ghim, cụm Tầng 1, vị trí trong repo và mức theodocs/muc-hoan-thien.md, khe cắm chưa có ghi thẳng "chưa có". Mục mới "Ranh giới lõi và ứng dụng" xếp từng module củasvc-files,svc-workflowvà từng phần CSDL vào lõi, phần máy chủ của Văn phòng điện tử hay phần dùng chung mang dáng nghiệp vụ, kèm chỗ dính, lý do đang gộp và hướng tách sauv1.1.0. Thêm QĐ-008…QĐ-012 cho quyết định đã có trong mã (sự kiện trong bảng thay broker, Flowable, SeaweedFS, ứng dụng là trang tĩnh, Văn phòng chung tiến trình với lõi), QĐ-013 (WAF, chờ PR), hộp "Đọc trong 10 phút" và mục "Chỗ còn yếu"; §1.2, §1.3 sửa câu đã lệch (profile chia theo tầng, RAM đo được, "cài dưới một giờ" chưa đo).
Đã sửa lỗi
- Cổng thỉnh thoảng trả 502 khi gọi
svc-files(gặp ở CI của #130): APISIX giữ kết nối rảnh tới dịch vụ phía sau 60 giây, uvicorn củasvc-filesđóng sau 5 giây; yêu cầu tới đúng lúc uvicorn đóng thì APISIX nhận EOF hoặc RST, trả 502 và không thử lại.svc-filesnay giữ kết nối 75 giây (--timeout-keep-alive 75), chỉ APISIX đóng kết nối rảnh. Dựng lại với APISIX 3.18 và uvicorn 0.54.0 như repo, nghỉ 4,990–5,010 giây giữa hai yêu cầu: trước 31/1 312 yêu cầu bị 502, sau 0/1 312. - Tài liệu ghi lệch với mã (#119):
DEPENDENCIES.mdnói Hasura dùng Event Triggers và Redpanda được thay bằng Event Triggers, nhưngdb/metadatakhông khai trigger nào — nay ghi đúng: sự kiện nằm trong bảng PostgreSQL, Centrifugo đẩy tới trình duyệt, trục sự kiện chưa có.docs/muc-hoan-thien.mdthôi ghi "chưa có bước CI" chomake demo-log-tap-trung,make do-so-lieu-sau,make demo-nap-lo(đã chạy trong CI từ #111);ROADMAP.mdghi log tập trung là Một phần thay vì Đang làm. DEPENDENCIES.mdliệt kê PDF.js (pdfjs-dist) dù giao diện không dùng: tệp được lấy bằng fetch rồi lưu về máy. Bỏ dòng đó, sửa chú thích cùng ý trongsvc-files. Câu "gói npm gián tiếp không có giấy phép ngoài danh sách OSI" cũng sai: có thêm bảng năm gói ngoại lệ, đều chỉ dùng lúc dựng, lúc phát triển, không nằm trong trang phát hành —caniuse-lite(CC-BY-4.0),mdn-data,@speed-highlight/core(CC0-1.0),node-forge(chọn BSD-3-Clause),type-fest(chọn MIT).- Tên 4 job CI có dấu
#(Giấy phép (PoF #2)…) bị YAML hiểu phần từ#là chú thích: trang Actions hiệnGiấy phép (PoF, và ruleset đòi đúng tên có#thì không PR nào gộp được. Tên đặt trong ngoặc kép; test mới kiểm mọi job ruleset đòi đều có thật. Test scripts +2. - Nhắc hạn, báo lãnh đạo (F2.3): dòng nhắc được ghi vào dòng thời gian văn bản trước khi gửi thông báo. Trước đây gửi trước rồi mới ghi, người bấm thông báo mở văn bản ngay có thể chưa thấy dòng nhắc;
make smokethỉnh thoảng đỏ vì đọc trúng khoảng đó. Test svc-workflow +1. - Văn bản hạn chế quá nặng để đóng dấu có lúc bị báo "không đọc được PDF" thay vì "PDF quá nặng, vượt giới hạn bộ nhớ": tiến trình con nạp WeasyPrint sau khi đặt trần bộ nhớ, dlopen thư viện pango hỏng lại báo "cannot open shared object file" (OSError); mã C của WeasyPrint hết bộ nhớ thì chết bằng SIGTRAP hay SIGSEGV tùy bản dựng, bị coi là tệp hỏng. Bản sửa ở 1.0.0 chỉ cứu test (trần ≤ 64 MB thì coi là hết bộ nhớ): trần 96–160 MB vẫn báo sai. Nay WeasyPrint nạp trước khi đặt trần, mọi việc sau đó nằm trong
try, hết bộ nhớ cả lúc ghi kết quả thì thoát bằng mã riêng; tiến trình con chết vì tín hiệu (trừ SIGXCPU) là hết bộ nhớ — tệp chỉ đi qua pypdf, mã C chỉ vẽ lớp dấu; bỏ đoán theo lời báo lỗi, chỉ tin MemoryError và ENOMEM. Test svc-files +13. - brotli 1.2.0 → 1.2.1, brotlicffi 1.2.0.2 → 1.2.1.0 (
svc-files, gói kéo theo của fontTools mà WeasyPrint dùng): vá lỗi ghi tràn bộ nhớ trong bộ giải nén Brotli (PYSEC-2026-4322, PYSEC-2026-4323, CRITICAL) mà OSV-Scanner trong CI báo từ 23/10. Bản vá phát hành 22/10: ngoại lệ quy tắc hai tuần, ghi ởDEPENDENCIES.md. - Sửa các lỗi SonarQube tìm thấy ở lần quét đầu (23/10/2026).
POST /ot/notify/{tenant}củasvc-workflowkhai trả 204 mà có 5 nhánhreturnthân lỗi (5 BLOCKERpython:S8400): lỗi nay némWorkflowErrorcho một bộ xử lý chung; mã HTTP, thân lỗi và OpenAPI không đổi.MOC_SMTP_TLS=noneđi cùngMOC_SMTP_USERtừng đăng nhập máy chủ thư qua kết nối không mã hóa, mật khẩu đi dạng rõ: nay không đăng nhập, thư email báo lỗi gửi, lúc khởi động ghi một dòngconfig.warning(không chặn khởi động). Ô tìm kiếm, ô chọn văn bản đến hay đi và ô lý do lưu có tên cho trình đọc màn hình, nút Tìm ghitype="submit", kiểm form không cònreduce()thiếu giá trị đầu. Ký tự điều khiển hai chiều trong mãsvc-filesviết bằng mã thoát. Test mới chạy lại các luật này mà không cần SonarQube: route khai 204 khôngreturnthân, ký tự hai chiều ởservices/,apps/,scripts/, nhãn ô nhập vàtypecủa nút trong form ở mọi tệp.vue. Các cảnh báo còn lại là báo nhầm, không chènNOSONAR. Test svc-workflow +5, office +3, scripts +2. - Cổng WAF chặn (F3.15) thì Văn phòng điện tử báo "Cổng an ninh chặn nội dung này… (mã )", thay cho "Có lỗi xảy ra: Unexpected token '<'…" (đọc trang 403 HTML của cổng như JSON), "HTTP 403" hay câu "không có quyền" sai nghĩa ở trang Hỏi đáp. 403 JSON của Hasura, svc-files giữ như cũ. E2e
waf.spec.ts: tên tệp có' ; =, dự thảo có đề mục I./II./III. và đường dẫn theo IP, ô Tìm kiếm "File …?" đi qua WAF; ô Nơi nhận chỉ làhttp://<IP>/…bị chặn và hiện đúng mã. Test office +6. - Đăng nhập thỉnh thoảng bị WAF chặn 403 (gặp ở CI của develop 6710703): token ngẫu nhiên do Keycloak, oidc-client-ts sinh tình cờ trùng mẫu của OWASP CRS — libinjection (942100) với cookie
KC_AUTH_SESSION_HASHmà Keycloak bọc trong ngoặc kép ("+…") hay chuỗi8--…, tên hàm PHP (933150:rtrim,fputs), đuôi tệp (930120:.nsr), lệnh Unix (932250). Loại trừ 10010, 10020 nay gỡ đúng các luật đó trên đúng 6 cookie và 8 tham số token của Keycloak, OIDC; luật SQLi khác, XSS, Java, Node.js vẫn soi. Đo với APISIX + Coraza như repo, 21 loại token × 2 500 giá trị ngẫu nhiên đúng dạng: trước 7/50 951 bị chặn, sau 0/50 968; 16 giá trị đã bị chặn (có giá trị trong log CI) nay đều qua. Test scripts +1, smoke +1 kiểm.
Bảo mật
- Image
svc-files,svc-workflow(cảot-sensor, dùng chung image) gỡ pip ngay sau khi cài thư viện: pip 26.2.1 của image nềnpython:3.13.16-slimmang theo bản sao cũ của certifi 2026.6.17 (GHSA-6q48-6c7w-9gw2, CRITICAL: gốc emSign có CA trung gian lộ khóa), urllib3 2.7.0 (CVE-2026-97687, CVE-2026-97689), msgpack 1.1.2 (GHSA-6v7p-g79w-8964), setuptools 70.3.0 (CVE-2025-47273). Gói của dịch vụ đã ở bản vá, lúc chạy không dùng pip; không thêm, không nâng gói nào. Trivy 0.75.0 quét lại image dựng mới (23/10/2026): lỗ hổng HIGH/CRITICAL có bản sửa của mỗi image từ 5 (1 CRITICAL, 4 HIGH) còn 0, phần Python không còn lỗ hổng nào; HIGH/CRITICAL còn lại đều là gói Debian chưa có bản sửa. - Nâng pypdf 6.21.1 → 6.21.2 trong
svc-files(GHSA-6c7f-9265-g8fw, GHSA-gmh7-3g9r-mjh5, GHSA-jr96-gvgh-j3r4, HIGH: PDF tải lên dị dạng làm bước đọc chữ chạy rất lâu); gói kéo theo củaapps/office: serialize-javascript 7.1.2 → 7.1.3 (GHSA-m5mm-p8h7-m29v), fast-uri 3.1.8 → 3.1.9 (chỉ lúc dựng, bốn GHSA). Ngoại lệ vá bảo mật ghi ởDEPENDENCIES.md.