Skip to content

feat: mở rộng command và endpoint Phase 6 trước phát hành - #10

Merged
WindowScary321 merged 28 commits into
mainfrom
feat/phase6-command-expansion
Oct 26, 2026
Merged

WindowScary321 merged 28 commits into
mainfrom
feat/phase6-command-expansion

Conversation

@WindowScary321

Copy link
Copy Markdown
Owner

Mục tiêu

Tiếp tục từ PR #9 đã merge (75fc7b4), bổ sung command/endpoint Phase 6 trước khi phát hành. Giữ version 0.2.0, v1 mặc định, v2 opt-in; không tag/publish trong PR này.

Thứ tự triển khai

  • Checklist và quyết định hoãn release đến sau nghiệm thu Phase 6.
  • Lát cắt đọc: courses, subjects theo kỳ, balance, news search.
  • Transcript/training/marks summary theo contract ngoại lệ; photo JSON và doctor an toàn.
  • Rating/push/feedback chỉ mở khi đủ schema/capability; chưa đủ bằng chứng phải giữ gate rõ, không giả lập success hoặc fallback version.

Kiểm chứng

Từng commit sẽ có comment riêng nêu SHA, lệnh/exit và giới hạn. Fixture hoàn toàn tổng hợp; live đọc dùng session/browser mới và chỉ giữ metadata allowlist. Không đưa raw response, token, query có giá trị, ảnh hoặc dữ liệu tài khoản lên GitHub. Không thực hiện live ghi nếu chưa có xác nhận riêng.

PR giữ Draft trong thời gian triển khai. Không dùng CI xanh để tuyên bố mọi endpoint đã hoạt động; giữ TODO v1 và positive fee/survey.

Tiếp tục từ PR9 đã merge; chia command đọc và gate schema cho thao tác ghi. Giữ lịch sử migration, TODO v1 và positive fee/survey; chưa tag hoặc publish.
@WindowScary321

Copy link
Copy Markdown
Owner Author

Sau commit 6c01ea0 — khởi tạo Phase 6

  • Thêm tasks/phase6.md và liên kết TODO; ghi quyết định hoãn tag/publish đến sau nghiệm thu Phase 6. PR Feat/phase5 release automation #9 đã merge, không đồng nghĩa đã phát hành.
  • Giữ toàn bộ TODO v1/positive fee/survey, capability chưa đủ schema và giới hạn dữ liệu cá nhân.
  • Commit này chỉ có 3 file tài liệu. Đã rà nội dung/liên kết và git diff --cached --check, exit 0; chưa ghi nhận tính năng Phase 6 hoàn tất hoặc live mới.
  • PLAN.md/PLAN-PHASES.md ngoài workspace Git đã được thêm quyết định mới, giữ lịch sử; hai file này không đưa vào artifact hoặc PR.

PR giữ Draft. Các commit runtime kế tiếp sẽ có regression và comment riêng; không tạo tag/publish hoặc live ghi.

Nối balance, courses, subjects theo kỳ, tìm news, transcript/training, photo JSON và marks summary qua contract v1/v2. Giữ ngoại lệ signer/casing, không kỳ/checksum ở summary v1, bảo toàn chuỗi ảnh và doctor không đọc session. Regression CLI/HTTP tổng hợp, validation API và phân loại lỗi giữ policy retry đọc; không mở thao tác ghi.
@WindowScary321

Copy link
Copy Markdown
Owner Author

Sau commit c829b70 — nhóm command đọc Phase 6

Commit: c829b70

Đã nối CLI → wrapper → HTTP

  • other balance; courses; other subjects --semester; news --search/--type.
  • transcript; training; info photo dưới dạng JSON opaque, không tự fetch/decode.
  • marks --summary dùng query riêng: không lookup kỳ; v1 CampusCode/rollNumber/Authen, không checksum; v2 dựng Authen mới sau refresh. Reader chỉ nhận array/envelope/JSON-string array đã kiểm; không cắt tùy tiện HTML/XML wrapper.
  • doctor mặc định offline, không đọc/refresh session; probe --online chỉ bootstrap GetApiActive v2, không xác nhận tài khoản.

Kiểm chứng

  • TDD đã ghi RED trước mỗi command/option rồi GREEN trên fixture CLI/auth/client thật + HTTP giả. Không dùng dữ liệu account.
  • Full unittest Windows chạy tuần tự Python 3.11 và 3.9: mỗi bản 389 test, 385 đạt và 4 skip điều kiện Windows, exit 0. Focused nhóm đọc cuối: 12/12, exit 0.
  • Review tìm hai lỗi (public v1 thiếu validate kỳ; summary quá lớn che HTTP 401/503); đã tái hiện RED, sửa và reviewer xác nhận targeted 8 test đạt.
  • Lượt full đầu chạy hai interpreter đồng thời gặp timeout process help; đã kiểm riêng help và chạy full tuần tự, không nới timeout/bỏ test. Test tách stderr Python 3.9 được sửa theo mẫu CliRunner hiện có.
  • Build, Twine, artifact validator và pip smoke wheel/sdist hai venv sạch đều exit 0. Mutation signer subjects trên bản sao tạm bị regression bắt.

Còn mở

  • Chưa có live account cho command mới hoặc kết quả CI của commit này tại thời điểm comment.
  • Credential v2 transcript/training/summary giữ policy bound FAP key của CLI; khác biệt caller decompile và schema backend còn cần kiểm live.
  • Rating/push/feedback ghi chưa mở; không gửi mutation live, không fallback version, không tag/publish. Phase 6 chưa hoàn tất.

Cập nhật capability 29 operation v2, query ngoại lệ, policy credential chưa live xác nhận và kết quả regression/artifact. README không còn tuyên bố parity toàn app; giữ rating/push/feedback cùng tag/publish ở trạng thái chưa hoàn tất.
@WindowScary321

Copy link
Copy Markdown
Owner Author

Sau commit 4a52872 — coverage và giới hạn Phase 6

Commit: 4a52872

  • Thêm docs/phase6-coverage.md và liên kết từ mapping; cập nhật inventory v2 thành 29 operation hỗ trợ trong code (26 read, 2 bootstrap, 1 handshake), không đồng nhất với live/backend parity.
  • Ghi command mới, casing/signer/response ngoại lệ, summary không query kỳ/checksum v1, photo JSON opaque và doctor không dùng session.
  • README bỏ tuyên bố giống hoàn toàn app; ví dụ Phase 6 ghi rõ chưa phát hành. Checklist tách code/fixture đạt với live/credential/schema còn pending.
  • Kết quả runtime của c829b70: mỗi Python 3.9/3.11 có 389 test, 385 đạt/4 skip, exit 0; build/Twine/artifact/pip smoke đạt. Commit này chỉ sửa 6 file tài liệu; đã kiểm nội dung, liên kết và git diff --cached --check, exit 0, không chạy lại full suite trên code không đổi.

Chưa gửi dữ liệu tài khoản lên GitHub; không tag/publish hoặc live ghi. Rating/push/feedback chưa được mở bằng commit này, Phase 6 còn tiếp tục.

Thêm rating list dùng contract GET v1 và signer roll number. V2 vẫn unsupported trước load session; không mở AddRate, push hoặc feedback submit và không biến stub thành dữ liệu rỗng.
@WindowScary321

Copy link
Copy Markdown
Owner Author

Sau commit 4c29b81 — rating list chỉ đọc

Commit: 4c29b81

  • Thêm rating list cho student/v1, GET GetStudentRate với campusCode/rollNumber/Authen/checksum, signer theo roll number; không lookup kỳ.
  • Rating list v2 vẫn stub: từ chối trước load_session/HTTP, không gọi v1 ngầm hoặc trả [] giả.
  • Không mở rating submit/push/feedback ghi; chưa có live rating trên tài khoản thật.
  • TDD focused: 2 test rating CLI/HTTP RED trước implementation rồi GREEN; regression policy read/retry 22/22, exit 0.
  • Full Windows/Python 3.11: 391 test, 387 đạt/4 skip, exit 0. Lượt Python 3.9 đầu gặp tzdata UTC resource lỗi ngay cả ở probe độc lập; đã cài lại đúng tzdata 2026.5 từ lockfile trong venv test riêng, không đổi dependency/lockfile. Probe UTC và full Python 3.9 sau đó đạt 391 test, 387 đạt/4 skip, exit 0.
  • git diff --cached --check: exit 0. Không đưa dữ liệu cá nhân, response hoặc credential lên GitHub; không tag/publish hoặc live ghi.

Tái hiện CI bằng FORCE_COLOR=1; dùng Rich Text.from_ansi như regression help hiện có. Giữ nguyên assertion tên option, stderr và zero HTTP; không thay runtime hoặc bỏ gate.
@WindowScary321

Copy link
Copy Markdown
Owner Author

Sau commit d6d0ee6 — sửa assertion màu từ CI

Commit: d6d0ee6

CI run 40063972538 trước đó thất bại ở assertion tên option: Rich chèn ANSI giữa hai dấu gạch của --semester/--search/--summary. Nội dung lỗi đúng nhưng test tìm substring trên bytes có màu. Đây không phải CI xanh; build/smoke của run đó bị skip đúng gate.

Đã tái hiện RED local bằng FORCE_COLOR=1. Sửa test dùng Text.from_ansi(...).plain theo regression help hiện có, không xóa assertion, không tắt màu runtime hoặc bỏ test.

GREEN với FORCE_COLOR=1: nhóm command đọc 14/14 và summary 8/8, exit 0. git diff --cached --check exit 0. Full source trước đó đạt 391 test mỗi Python3.9/3.11; chờ CI mới xác nhận toàn matrix của commit sửa này.

Không đổi runtime hoặc dữ liệu account, không tag/publish. Lượt live Phase6 vừa thử chưa hoàn tất login và chưa có FAP response; đã dọn session/thư mục tạm, không ghi live pass cho các command mới.

Ghi đúng CI d6d0ee6 đạt 11 job, full local391 test mỗi Python và lỗi môi trường đã phục hồi. Không đổi login chưa thành công thành bằng chứng endpoint; giữ schema thao tác ghi và live đọc ở gate mở.
@WindowScary321

Copy link
Copy Markdown
Owner Author

Sau commit 0e0c01c — cập nhật bằng chứng, không đóng gate live

Commit: 0e0c01c

  • Cập nhật README/CHANGELOG/coverage: rating list chỉ student/v1, v2 stub; không đồng nhất với rating submit hoặc push/feedback ghi.
  • CI đúng SHA d6d0ee6 đã đạt 11/11 job: https://github.com/WindowScary321/myfap-api-cli/actions/runs/40064482334 . Bao gồm source và wheel/sdist smoke Ubuntu/Windows × Python3.9/3.11. Đây là bằng chứng của d6d0ee6, chưa phải kết quả CI của commit docs mới.
  • Ghi lượt live vừa thử: doctor local JSON đạt và không HTTP; login exit 1, chưa thấy response FAP; các command cần auth sau login chưa chạy. Đã logout/dọn session và thư mục tạm. Không kết luận nguyên nhân login hoặc ghi endpoint pass từ fixture.
  • Commit chỉ sửa 4 file tài liệu; đã kiểm nội dung/liên kết và git diff --cached --check, exit 0. Runtime không đổi nên không chạy lại full suite local.

Phase 6 còn gate live đọc và schema/ack cho các thao tác ghi. Chỉ metadata đã lọc được ghi vào GitHub; không raw response, ảnh, credential hoặc dữ liệu tài khoản. Không tag/publish hoặc gửi mutation live.

Ghi 14 lần command exit0, dạng dữ liệu và giới hạn; chỉ metadata đã lọc. Xác nhận policy bound key đọc được trên HN, không suy auth server hoặc schema từ nonempty; giữ v1 và thao tác ghi chưa nghiệm thu.
@WindowScary321

Copy link
Copy Markdown
Owner Author

Hết quota chatgbt rồi...

image

@WindowScary321

Copy link
Copy Markdown
Owner Author

Sau commit ca09b11 — live nhóm đọc v2/HN

Commit: ca09b11

Bổ sung comment cho commit vừa được push trước khi phiên làm việc bị ngắt:

  • Cập nhật 2 file tài liệu bằng metadata của lượt login/context/session mới trên code 0e0c01c.
  • 14 lần command đều exit 0, JSON hợp lệ. Courses, subjects theo kỳ, balance, news search, transcript, training, marks summary, photo JSON và doctor bootstrap đều HTTP/body 200. Training list rỗng; balance/transcript/photo là string, chưa suy schema nghiệp vụ hoặc định dạng ảnh.
  • Refresh và đọc sau refresh đạt; logout và dọn session/lock/thư mục tạm hoàn tất.
  • Observer giữ 14 request thuộc 12 operation; một GetSemester dùng chọn input subjects trước CLI không nằm trong số observer. Không suy đây là toàn bộ traffic FEID/FAP.
  • CI đúng code 0e0c01c đạt 11/11 job: https://github.com/WindowScary321/myfap-api-cli/actions/runs/40064917612 . Commit ca09b11 chỉ sửa docs, diff/whitespace exit 0; không đổi runtime.

Chưa live command mới v1 hoặc rating list v1. Rating submit/push/feedback ghi còn gate. Chỉ metadata đã lọc được lưu, không raw response/ảnh/credential/dữ liệu tài khoản. Không tag/publish, không đánh dấu toàn Phase 6 hoàn tất.

Khóa bốn trạng thái 404/201 thành lỗi không refresh/fallback bằng fixture tổng hợp; ghi kết quả live v1/APHL và bằng chứng còn thiếu cho write. Hiệu chỉnh method handshake CLI POST trong tài liệu, không đổi auth/runtime hoặc diễn giải lỗi server thành unsupported.
@WindowScary321

Copy link
Copy Markdown
Owner Author

Sau commit 883a7aa — live v1/APHL và gate còn mở

Commit: 883a7aa

Kết quả thật, không che lỗi

  • Login mới v1/APHL trên ca09b11; 14 lần command: 10 exit 0, 4 exit 1; harness exit 1. Đã dọn session/lock/thư mục tạm.
  • Courses và marks summary: HTTP 404. News search và training: HTTP 200/body 201, data null. Nguyên nhân chưa xác định, không đổi thành []/unsupported, không refresh vì 201 không rõ hoặc fallback v2.
  • Subjects theo kỳ/balance đọc được; transcript rỗng, photo null, rating list rỗng có 200/200 nhưng chưa xác nhận positive schema/ID cho submit. Refresh và student sau refresh đạt.
  • Caller training xác nhận semesterName; courses chưa có UI caller chứng minh loại semester v1. Search UI có normalize/entity-encoding nhưng input live đã trim/lower, chưa có căn cứ quy nguyên nhân 201. Không thử đoán termID/alias.

Thay đổi và kiểm tra

  • Thêm regression tổng hợp giữ bốn mã lỗi là lỗi CLI: một request, không refresh/fallback, stdout rỗng, session không đổi. Không copy raw response/account làm fixture.
  • Focused nhóm đọc FORCE_COLOR=1: 15/15 trên Python3.9 và3.11, exit 0. Full chuẩn mỗi version: 392 test, 388 đạt/4 skip, exit 0.
  • Lượt ép màu toàn suite có 5 failure ở các assertion màu/spinner cũ; không ghi mode đó đã đạt, không bỏ/nới test. Gate đầy đủ dùng lệnh/môi trường chuẩn của repo.
  • Sửa docs handshake CLI thành POST/POST theo auth.py và live; GET/query là caller legacy APK, không phải method CLI hiện tại. Không đổi auth/runtime.
  • Thêm docs/phase6-write-gates.md liệt kê request đã biết, schema/ack còn thiếu và bằng chứng cần thêm. AddRate có điều kiện code200 tĩnh, nhưng positive item/ack nghiệp vụ chưa xác minh; không mở raw submit hoặc ghi thử để lấp gate.
  • git diff --cached --check exit 0. CI trước trên ca09b11 đạt đủ11 job; đang chờ CI riêng của commit mới.

Chỉ metadata allowlist được lưu. Không token/ảnh/identity/query có giá trị/raw response lên GitHub; không live ghi, tag, publish hoặc tuyên bố Phase6 hoàn tất.

@WindowScary321

Copy link
Copy Markdown
Owner Author

CI đã hoàn tất tại commit 883a7aa

Run: https://github.com/WindowScary321/myfap-api-cli/actions/runs/40086258316

Đúng SHA 883a7aa: 11/11 job đạt, gồm source và wheel/sdist smoke Ubuntu/Windows × Python 3.9/3.11, build/artifact validator và gate tổng hợp.

Đây là kiểm chứng code/fixture/artifact, không sửa hoặc đóng bốn lỗi live v1/APHL. Schema/ack rating submit, push và feedback vẫn còn gate; Phase 6 tiếp tục giữ Draft, chưa merge/tag/publish hoặc gửi mutation live.

Dùng other training và other rating list, bỏ các command root cũ. Giữ endpoint/auth/retry/capability; bổ sung regression option kế thừa lồng ba cấp và help UTF-8/cp1252, cập nhật ví dụ và tài liệu.
@WindowScary321

Copy link
Copy Markdown
Owner Author

Sau commit c56bd61 — đưa training/rating vào other

Commit: c56bd61

Theo yêu cầu mới:

  • Command hiện tại: myfap other training và myfap other rating list.
  • Không giữ alias training/rating ở root; Python API và endpoint/capability/auth/retry không đổi. Rating list vẫn chỉ student/v1, v2 stub vẫn bị chặn trước HTTP.
  • Cập nhật README/CHANGELOG/checklist/mapping. Các lượt live cũ giữ tên lịch sử, không ghi là đã chạy lại FAP sau đổi namespace.

Kiểm chứng:

  • RED trước hai thay đổi đăng ký Typer, GREEN sau đó: focused FORCE_COLOR=1 17/17, exit 0.
  • Regression chứng minh common options tại leaf override root/group, help của other training/other rating list hoạt động không auth/network và root command cũ không còn.
  • Full Windows Python 3.11 và 3.9: mỗi bản 394 test, 390 đạt/4 skip điều kiện môi trường, exit 0. Có thêm help UTF-8/cp1252 cho group lồng ba cấp.
  • CLI help thật của other, other training và other rating list đều exit 0. git diff --cached --check exit 0.

Không gọi API tài khoản hoặc gửi mutation live trong lượt này; chưa tag/publish. Chờ CI của commit mới, không dùng kết quả cũ làm CI của c56bd61.

@WindowScary321

Copy link
Copy Markdown
Owner Author

CI của commit c56bd61 đã đạt 11/11 job: source, build và cài thử wheel/sdist Ubuntu/Windows × Python 3.9/3.11. Run: https://github.com/WindowScary321/myfap-api-cli/actions/runs/40087697309 . Việc chuyển other training / other rating list không đổi endpoint hoặc các gate live còn mở; chưa merge/tag/publish.

@WindowScary321

Copy link
Copy Markdown
Owner Author

Commit 873603b5bb9c5474cdbad1dc5bf7ef6023fc7138 — docs-only, không đổi code.

Thay đổi: tasks/todo.md (+9 dòng). Thêm mục "Thao tác ghi rating/push/feedback vẫn chưa mở": ghi nhận theo đánh giá ngày 24/10/2026 tài khoản hiện tại không thể xác minh thao tác ghi (rating list v1 trả rỗng nên không có rateid/item đối chiếu AddRate; không có feedback đang mở), cùng hai hộp việc chờ dữ liệu phù hợp và nguyên tắc giữ gate theo docs/phase6-write-gates.md / tasks/phase6.md mục 4–5. Không cố tình thử ghi để tạo dữ liệu, không mở generic submit.

Kiểm tra: docs-only nên theo quy trình chỉ kiểm nội dung/liên kết/diff: git diff --check exit 0 (không whitespace error), diff đúng 9 dòng thêm trong đúng một file, cả hai liên kết nội bộ (docs/phase6-write-gates.md, tasks/phase6.md) tồn tại. Không chạy regression vì không thay đổi runtime; push origin/feat/phase6-command-expansion thành công c56bd61..873603b.

Giới hạn: Đây là ghi nhận trạng thái gate, không phải bằng chứng schema/ack và không tự đóng hay nới gate nào; các hộp nghiệm thu Phase 6 khác giữ nguyên trạng thái mở.

@WindowScary321

Copy link
Copy Markdown
Owner Author

Commit c34d7ed9502b7d6eb8c7c39511416048128bd4d9 — hoàn tất nghiệm thu nhóm mục 1 trong tasks/phase6.md.

Thay đổi:

  • tests/test_phase6_reads.py (+144): lớp ReadSliceAcceptanceTests với 5 test tại seam CLI cho cả bốn lát cắt đọc (balance, courses, subjects theo kỳ, news search) trên hai version: header contract v2 (ClientCode, CampusCode, Authorization Bearer, Checksum dạng chữ ký:timestamp giây, GET không json/Content-Type); expiry retry đúng một lần với credential mới (v1 body 201 Token invalid; v2 body 401 và HTTP 401, Checksum đổi theo key mới, query còn lại giữ nguyên); dừng sau lần expiry thứ hai; App Check/timeout/HTTP 503/malformed giữ đúng một request, không refresh/fallback, stdout rỗng khi lỗi, không lộ sentinel/credential.
  • tasks/phase6.md: tick hai hộp "Nghiệm thu nhóm" mục 1 kèm đoạn bằng chứng trong "Kết quả checkpoint hiện tại".
  • docs/phase6-coverage.md: ghi một đoạn xác nhận trong mục Kiểm chứng.

Kiểm tra: focused uv run --locked --group ci python -m unittest tests.test_phase6_reads → 22 test, OK, exit 0. Full uv run --locked --group ci python -m unittest discover -s tests → 399 test, 395 đạt/4 skip, exit 0 trên Windows Python 3.11. git diff --check exit 0 (chỉ cảnh báo LF/CRLF quen thuộc). Push 873603b..c34d7ed thành công.

Giới hạn: các test đạt GREEN ngay vì xác nhận hành vi đã triển khai từ các commit trước — khoảng trống là độ phủ test, không phải behavior mới, nên không có bước RED. Toàn bộ dùng session tổng hợp và HTTP giả tại seam CLI; không thay thế kiểm chứng live và không đóng các finding v1/positive fee/survey. Nghiệm thu nhóm mục 2–3 và các mục 4–6 vẫn mở.

@WindowScary321

Copy link
Copy Markdown
Owner Author

Commit c489d954f5e5c648bd6dda52abf369cd80de398a — docs-only, hoàn tất nghiệm thu nhóm mục 2 trong tasks/phase6.md.

Thay đổi: tick 5 hộp còn thiếu của mục 2 (từ chối tổ hợp summary, reader riêng, chốt credential v2 bằng bytecode, và hai hộp nghiệm thu nhóm) kèm đoạn bằng chứng; cập nhật docs/phase6-coverage.md (bullet policy với dòng lệnh bytecode cụ thể + mục "Live nghiệm thu mục 2").

Bằng chứng chính:

  • Tổ hợp summary + reader: đã có từ commit trước — cli.py chặn --summary kèm --semester/--courseid/--pretty trước auth, summary.py kiểm HTTP/App Check/expiry trước đọc, giới hạn 1 MiB; phủ bởi test_conflicting_summary_options_fail_before_auth và 5 reader test.
  • Credential v2 bằng bytecode (module_599.js của APK): wrapper GET (dòng 898–906) mặc định credential rỗng khi thiếu tham số thứ tư; _buildHeaders (747–781) khi đó không gửi Authorization và _makeChecksum (726–746) ký bằng bootstrap token. Cả ba _getSemesterMark (218–224), _getAcademicTranscript (266–272), _getDiemphongtrao (280–286) đều không truyền credential header; chỉ GetSemesterMark có FAP key trong query Authen. CLI giữ chủ đích policy Bearer FAP key, không sao chép credential rỗng, không thử unauth/fallback — khác biệt được ghi rõ tại coverage.
  • Live kiểm đọc (v2/HN, máy cá nhân, session thật): 4/4 lệnh exit 0 HTTP/body 200 — info student đối chứng; transcript data chuỗi ~10,5 KB là mảnh HTML bảng (53 <tr/504 <td, không <table> bao); training list rỗng; marks --summary envelope list 32 phần tử, mỗi phần tử đúng 5 khóa SubjectCode/ClassName/AverageMark/Status/GradeStatus — positive schema thật đầu tiên cho GetSemesterMark.

Riêng tư dữ liệu: raw response chỉ tồn tại trong thư mục tạm của máy cá nhân, đã xóa sau khi trích metadata; không token, identity, giá trị trường hay raw payload nào vào Git/PR/chat. Chỉ metadata đã lọc (status, body code, shape, tên khóa schema) được ghi.

Kiểm tra: docs-only → git diff --check exit 0 (chỉ cảnh báo LF/CRLF quen thuộc), liên kết nội bộ hợp lệ, diff 2 file +21/−6. Không đổi runtime nên không chạy lại regression; push c34d7ed..c489d95 thành công.

Giới hạn: positive schema summary là một tài khoản/một campus, chưa phải nghiệm thu backend; formatter transcript/training vẫn nhãn chưa kiểm chứng; nhóm 3 (photo/doctor) và mục 4–6 của phase6.md vẫn mở.

@WindowScary321

Copy link
Copy Markdown
Owner Author

Commit af759ebca5fb10d530c825df9a3f4d440d130019 — docs-only. Ghi nhận theo yêu cầu của maintainer: kiểm chứng bằng thực nghiệm biến thể "app không gửi Bearer" trước khi quyết định đổi CLI. (Thông điệp commit bị thiếu dấu tiếng Việt do lỗi soạn thảo; nội dung diff chuẩn, không force-push để sửa.)

Thí nghiệm transport có kiểm soát (24/10/2026, v2/HN, session thật, chỉ đọc): gửi trực tiếp 5 biến thể header cho cả ba operation transcript/training/summary, metadata đã lọc, không giá trị nào rời máy:

Biến thể Authorization Checksum ký bằng Kết quả
App-parity đủ theo _buildHeaders module_599.js (747–781), gồm Content-Type json không có bootstrap token HTTP 400 cả 3 op
Bearer FAP key + checksum bootstrap FAP key bootstrap token HTTP 400 cả 3 op
Bearer bootstrap token (kiểu _getNoAuth 854–861) bootstrap token bootstrap token HTTP 500 cả 3 op
Bearer FAP key + checksum cùng key (policy CLI hiện tại) FAP key FAP key HTTP 200/body 200 cả 3 op

Kết luận: proxy v2 hiện tại chỉ chấp nhận cặp Bearer FAP key + Checksum ký bằng đúng key đó; nhánh credential rỗng thấy trong bytecode (module_599.js:224/272/286) bị server từ chối — hoặc app thật bơm token ở tầng khác (Axios wrapper module_1(Axios2) chưa phục dựng) hoặc proxy đã đổi hành vi so với APK build 31. CLI giữ nguyên policy, không thay đổi code; bằng chứng nay là hai chiều (biến thể đúng được chấp nhận, các biến thế sai bị từ chối với mã phân biệt được: 400 = sai cặp credential/checksum, 500 = bootstrap làm credential dữ liệu).

Thay đổi: docs/phase6-coverage.md (bullet policy viết lại + mục "Thí nghiệm transport có kiểm soát"), tasks/phase6.md (một câu bồ sung vào đoạn bằng chứng mục 2).

Kiểm tra: docs-only → git diff --check exit 0, push c489d95..af759eb thành công; không đổi runtime nên không chạy lại regression.

Giới hạn: thí nghiệm trên một tài khoản/một campus (HN); không suy rộng cho mọi campus và không khẳng định app thật gửi gì lúc runtime.

@WindowScary321

Copy link
Copy Markdown
Owner Author

Commit f3f2bd6ab3e2ef6cd1f5c3f6b0daf89bbc055536 — docs-only, khép cả 3 hộp "Checkpoint: nhóm đọc" trong tasks/phase6.md.

(1) Regression + build artifact trên code mới:

  • Full suite: 403 test, 399 đạt/4 skip, exit 0 (Windows Python 3.11) — như comment commit f288ccc.
  • uv build --out-dir dist-phase6-checkpoint: wheel + sdist 0.2.0 build thành công (thư mục local, bị gitignore).
  • twine check --strict: PASSED cả wheel và sdist.
  • scripts/check_artifacts.py --expected-version 0.2.0: exit 0, manifest SHA-256 abcaef1b70e20a1e200b6458c58677d3d6d876c2b50819e6f5e8df73b900dae7 — validator xác nhận không docs/tasks/tests/session/capture trong distribution.
  • scripts/smoke_install.py --expected-version 0.2.0: cài wheel/sdist vào venv sạch, exit 0.

(2) Mapping/contract/coverage: đã cập nhật ở commit 3ef5d2a (command-endpoints, v2-contracts 31 operation, phase6-coverage + gap analysis) — capability ghi rõ theo version (cột v1/v2) và account (student).

(3) Quét toàn bộ lệnh đọc bằng session/browser mới (v2/HN): hai lượt login FEID mới bằng browser context mới, session tạm riêng, cả hai đã logout; raw chỉ xử lý cục bộ trên máy cá nhân và xóa sau khi trích metadata; param (CourseId, SubjectCode/ClassName) trích cục bộ từ response, không in giá trị. Kết quả chính:

  • Success có dữ liệu: info student/campus, photo (chuỗi không rỗng lần đầu), courses(5), schedule(64) + ICS chuẩn CRLF, week-timetable(6), marks summary(32), exams(6), attendance(5), attendance detail list(1) — positive đầu tiên, news(10), news search list(50), notification(49), fee list(1) không rỗng (không đóng positive fee), balance, subjects, transcript (~10,5 KB), doctor local/online.
  • Data rỗng hợp lệ: marks(0), marks --courseid str(0) với CourseId thật, applications(0), training(0), feedbacks(0).
  • Contract đặc thù: survey 200/404 exit 0; feedback/profile boolean; rating list exit 1 đúng thiết kế v1-only trên session v2.
  • Ghi chú trung thực: lượt chính sai cú pháp semesters --stdout (lệnh bảng không có option này → exit 2, lỗi harness không phải CLI; lệnh chạy đạt ở lượt phụ với bảng UTF-8 ~29 dòng kỳ); other subjects --semester không lặp lại trong lượt này, bằng chứng lượt 24/10 trước vẫn đứng.
  • Không dùng 200/nonempty đóng positive fee/survey; không dùng v2 đóng finding v1.

Kiểm tra: docs-only → git diff --check exit 0, push 3ef5d2a..f3f2bd6 thành công.

Còn mở sau checkpoint: mục 4 (rating submit/push gate), mục 5 (feedback form/submit gate), mục 6 (nghiệm thu/bàn giao maintainer), 7 lỗi v1 và positive fee/survey tại tasks/todo.md.

@WindowScary321

Copy link
Copy Markdown
Owner Author

Commit 8529176d6627aef23e1003f1174317881386d1ad — feat: transcript --pretty theo yêu cầu mở rộng của maintainer. (Thông điệp commit thiếu dấu tiếng Việt do lỗi soạn thảo, giống commit af759eb; không force-push để sửa.)

Thay đổi:

  • myfap/parsers.py: thêm parse_transcript_html() — mỗi bảng giữ headers riêng và rows keyed theo header; chuẩn hoá &nbsp; (\xa0) thành space; ô thừa so với header lấy khóa Column<n> ổn định; hàng dữ liệu trước header bị bỏ; không có bảng → list rỗng.
  • myfap/cli.py: transcript --pretty/-p — khi data là chuỗi HTML có bảng thì parse thành cấu trúc và xuất Transcript_prettier.json; mặc định (không --pretty) giữ nguyên chuỗi HTML và tên file như cũ, contract không đổi.
  • Schema chốt bằng phân tích cấu trúc bảng điểm thật trên máy cá nhân (in skeleton/tên cột/số ô, che toàn bộ giá trị): 2 bảng — bảng chính 10 cột No | Term | Semester | Subject Code | prerequisite | Replaced Subject | Subject Name | Credit | Grade | Status (49 môn) và bảng phụ 7 cột No | Semester | SubjectCode | SubjectName | Credit | Grade | Status (2 môn). File HTML raw đã xóa khỏi thư mục tạm sau phân tích.

Kiểm tra (RED→GREEN): 4 test parser + 1 test CLI seam (cả nhánh --pretty parse và nhánh mặc định giữ chuỗi) — RED trước implementation (ImportError/option chưa có), GREEN sau; sửa thêm 1 assertion thật trong quá trình (&nbsp; → \xa0 buộc chuẩn hoá trong parser). Focused tests.test_parsers 21/21 OK; full uv run --locked --group ci python -m unittest discover -s tests → 408 test, 404 đạt/4 skip, exit 0 trên Windows Python 3.11. Live với session cá nhân (chỉ in metadata): transcript --pretty --stdout exit 0, 2 bảng 49+2 dòng, header khớp schema thật.

Giới hạn: parser giữ nguyên dạng chuỗi của từng ô (không ép kiểu số, không tính GPA/tổng kết — không tự suy nghiệp vụ); bảng phụ chưa có giải thích nghiệp vụ chính thức, giữ neutral theo header; docs đã cập nhật (CHANGELOG, command-endpoints, phase6-coverage, phase6.md).

@WindowScary321

Copy link
Copy Markdown
Owner Author

Commit c5702d4e842c4919b724be5159bc7c0c53687f2f4 — docs-only, cập nhật tasks/todo.md.

Thay đổi: Mở rộng mục "Thao tác ghi rating/push/feedback vẫn chưa mở" thành "Mục 4–5 Phase 6 khó thực hiện với tài khoản hiện tại" theo đánh giá của maintainer ngày 24/10/2026. Ghi rõ từng blockers: rating submit không có rateid (list rỗng), push register là thao tác ghi cần xác nhận riêng, GetStudentFeedbackForm không có feedbackId thật (không đoán ID), SubmitStudentFeedback cần feedback đang mở, donor/employee + login thay thế đã out of scope tại gap analysis. Kèm hệ quả khi chốt phạm vi Phase 6/phát hành 0.2.0: các mục này giữ trạng thái gate/unsupported, không đánh dấu hoàn tất, không mở generic submit — maintainer duyệt phát hành với known issues này. Hai hộp việc chờ dữ liệu phù hợp giữ nguyên; nguyên tắc không thử ghi để tạo dữ liệu và không nới gate không đổi.

Kiểm tra: docs-only → git diff --check exit 0; ba liên kết nội bộ (phase6-write-gates.md, endpoint-gap-analysis.md, phase6.md) tồn tại; push 8529176..c5702d4 thành công.

Giới hạn: đây là ghi nhận trạng thái, không phải bằng chứng schema/ack và không tự đóng hay nới gate nào.

@WindowScary321

Copy link
Copy Markdown
Owner Author

Commit dc04710f5b1f261a6fc1a24508f2e7dc6d58e663 — docs-only, nghiệm thu mục 6 của tasks/phase6.md: tick 5/6 hộp, hộp cuối chờ maintainer.

(1) RED→GREEN + mutation check: các feature mới đều có chu kỳ RED→GREEN (feedbacks, doctor GetVersion, transcript --pretty) qua CLI thật + HTTP giả, fixture tổng hợp. Mutation check chạy trên git worktree tạm (đã dọn sạch), 3/3 bị focused test bắt: (a) đổi casing query semester→Semester tại get_courses → CoursesCommandTests fail; (b) đổi signer SearchNews từ type sang MAGIC_ID → SearchNewsTests fail; (c) bỏ guard no-retry trong _get → ReadSliceAcceptanceTests fail. Mỗi mutation khôi phục sau khi xác nhận.

(2) Regression hai interpreter: uv sync --locked --group ci sạch; full suite 408 test, 404 đạt/4 skip, exit 0 trên Python 3.11 và Python 3.9 (venv 3.9 tạm riêng qua UV_PROJECT_ENVIRONMENT); git diff --check sạch.

(3) Artifact + CI: build/Twine strict/artifact validator/pip smoke chạy lại trên commit cuối: manifest SHA-256 b15ff78b0a7fcca70b249258dbcd4479253bc702eace8bc7b079879caa848131, không docs/tasks/tests/session trong distribution; CI GitHub Actions đạt trên commit code 8529176 (matrix Ubuntu/Windows × Python 3.9/3.11), các commit docs sau đó cũng xanh.

(4) Review + docs: lượt review thứ hai có cấu trúc trên toàn bộ diff PR (14 file code/test, +1355/−30) theo 4 trục: query contract, credential safety, write safety — sạch (khớp mutation + test exact-params + sentinel no-leak); parser có 4 finding robustness đã ghi vào CHANGELOG known issues và TODO (rowspan rác làm parse_marks_html crash; isOnline boolean mất nhãn ICS; slot vượt nửa đêm/lỗi unpack slotTime; tên file xuất chưa sanitize dữ liệu server) — không phải lỗ hổng bảo mật, chờ maintainer quyết sửa trước 0.2.0 hay nhận known issue. Giới hạn trung thực: kênh agent review độc lập không khả dụng (giới hạn concurrency tài khoản sau 4 lần thử), lượt này do session reviewer thực hiện. README cập nhật thêm other feedbacks, transcript --pretty, ghi chú doctor backend_version.

(5) Quy trình PR: PR #10 Draft từ nhánh riêng; mọi commit push trong PR đều có comment SHA/thay đổi/lệnh/exit code/giới hạn.

Còn mở: duy nhất hộp "Maintainer nghiệm thu phạm vi Phase 6" — kèm 4 finding robustness chờ quyết định (sửa trước tag hay known issue) và các gate mục 4–5 đã ghi tại TODO.

@WindowScary321

Copy link
Copy Markdown
Owner Author

Commit 32d98e7 — fix: làm bền parser và sanitize tên file xuất theo quyết định maintainer

Thay đổi (code + test): sửa cả 4 finding robustness từ lượt review mục 6, theo quyết định của maintainer ngày 24/10/2026 (chọn sửa trước phát hành thay vì known issues):

  1. parse_marks_html: rowspan không phải số nguyên (2.0/rác/rỗng) không còn crash — helper _rowspan_rows coi giá trị rác như 1.
  2. ICS: isOnline boolean giữ nhãn "(Online)" (is True or == "True"); slot vượt nửa đêm (VD 23:30-0:50) kết thúc sang ngày hôm sau; slotTime thiếu dấu gạch báo ValueError rõ ràng kèm ví dụ định dạng.
  3. save_output: thay /, \, NUL bằng _ trong tên file — tên file chứa dữ liệu server (tên kỳ) không thể thoát thư mục --output.

Kiểm tra (RED→GREEN): 5 test regression mới viết trước (RED: 3 failures + 4 errors gồm cả crash thật), sau khi sửa code ba lỗi còn lại là bug của chính test mới (kỳ vọng thừa khóa comment, assert giờ quên chuyển VN→UTC, đọc file sau khi TemporaryDirectory dọn) — đã sửa test, không nới assertion. Focused tests.test_parsers 26/26 OK; full suite 413 test, 409 đạt/4 skip, exit 0 trên Windows Python 3.11.

Giới hạn: slot vượt nửa đêm dùng ngữ nghĩa lịch chuẩn (kết thúc trước bắt đầu = sang ngày sau), chưa có bằng chứng FAP gửi slot dạng này; các fix thuần parser/output, không đổi contract API.

@WindowScary321

Copy link
Copy Markdown
Owner Author

Commit acbcce8 — docs: ghi nhận nghiệm thu maintainer và đóng finding robustness — docs-only.

Thay đổi:

  • tasks/phase6.md: tick hộp cuối mục 6 — maintainer nghiệm thu phạm vi Phase 6 ngày 24/10/2026 với hai quyết định ghi rõ: (a) chấp nhận phạm vi (toàn bộ read student v1+v2, doctor, transcript --pretty; mục 4–5 giữ gate; 7 lỗi v1 là known issues; positive fee/survey hoãn); (b) chọn sửa 4 finding robustness trước phát hành — đã sửa ở commit 32d98e7. Ghi rõ ràng buộc theo yêu cầu maintainer: PR giữ nguyên Draft, không tự ready/merge/tag/publish — các bước đó do maintainer thực hiện.
  • tasks/todo.md: 4 finding robustness chuyển sang đã sửa kèm ghi chú.
  • CHANGELOG.md: bullet finding chuyển từ "chờ quyết định" sang "đã sửa theo quyết định maintainer".

Kiểm tra: docs-only → git diff --check exit 0; push dc04710..acbcce8 thành công.

Trạng thái Phase 6 sau commit này: mọi hộp trong tasks/phase6.md đã tick. Gate phát hành Phase 5 mở cho maintainer: chuyển PR #10 sang Ready → review → merge → duyệt "Phạm vi hỗ trợ trước tag" trong phase5.md → tag v0.2.0.

@WindowScary321

Copy link
Copy Markdown
Owner Author

Commit b2dd9f6 — feat: myfap exams --ics xuất lịch thi sang định dạng iCalendar

Thay đổi (code + test):

  • myfap/parsers.py: thêm convert_exams_to_ics() — chuyển danh sách lịch thi JSON (GetScheduleExam) sang chuỗi iCalendar RFC 5545:
    • Header chuẩn UTC: Event(created=datetime.now(timezone.utc)) với UID duy nhất và DTSTAMP UTC (regex ^\d{8}T\d{6}Z$).
    • Tiêu đề: mã_môn (kỳ_thi) (ví dụ TEST101 (FE)).
    • Thời gian: parse date (YYYY-MM-DD hoặc YYYY-MM-DDT...) và time ((\d{1,2})h(\d{2})-(\d{1,2})h(\d{2})), xử lý khoảng trắng/dấu ngoặc, localize theo Asia/Ho_Chi_Minh.
    • Hỗ trợ slot vượt nửa đêm: nếu giờ kết thúc <= giờ bắt đầu, tự động sang ngày hôm sau.
    • Vị trí (roomNo), mô tả đầy đủ: Môn (subjectName), Phòng, Slot, Ghi chú (note).
    • Validation chặt: từ chối JSON sai cấu trúc, thiếu date/time/subjectCode, hoặc format giờ không đúng regex với thông báo lỗi rõ ràng.
  • myfap/cli.py: bổ sung option --ics cho command exams (myfap exams --ics [--semester ...] [--stdout] [--output ...]). Khi dùng --ics, xuất file LichThi_{sem}.ics với text UTF-8 / CRLF; mặc định (không --ics) vẫn giữ nguyên output JSON và filename LichThi_{sem}.json.

Kiểm tra (RED→GREEN):

  • 4 unit tests mới trong ExamsParserTests:
    1. test_valid_exams_build_calendar_with_uid_dtstamp_and_vietnam_time: kiểm tra tính hợp lệ iCalendar, UID/DTSTAMP UTC, giờ VN, CRLF.
    2. test_time_with_spaces_and_parentheses_is_accepted: kiểm tra các biến thể khoảng trắng/dấu ngoặc (7h30 - 9h50).
    3. test_overnight_exam_wraps_end_to_next_day: kiểm tra slot vượt nửa đêm.
    4. test_invalid_root_or_rows_are_rejected_with_clear_errors: kiểm tra bắt lỗi ngày/giờ sai định dạng.
  • 1 test CLI seam mới trong ExamsIcsCommandTests: kiểm tra output exams --ics bắt đầu bằng BEGIN:VCALENDAR, chứa BEGIN:VEVENT, giữ query Semester đúng; nhánh không --ics giữ nguyên JSON payload.
  • Focused tests.test_parsers: 31/31 OK. Full suite: 418 test, 414 đạt/4 skip, exit 0.
  • Live kiểm chứng trên v2/HN (chỉ in metadata): myfap exams --ics --stdout xuất 7 sự kiện VEVENT chuẩn iCalendar, đầy đủ UID và DTSTAMP, CRLF, UTF-8.

Giới hạn: format giờ hỗ trợ XhYY-ZhWW theo quan sát trên FAP; nếu gặp dạng khác sẽ báo ValueError rõ ràng thay vì parse sai.

@WindowScary321

Copy link
Copy Markdown
Owner Author

Commit a73c1fa — docs: cập nhật tài liệu cho exams --ics — docs-only.

Thay đổi:

  • README.md: cập nhật bảng Option cho --ics: mở rộng áp dụng cho cả schedule (lịch học) và exams (lịch thi).
  • CHANGELOG.md: bổ sung mục exams --ics vào release notes [0.2.0].
  • docs/command-endpoints.md: cập nhật dòng exams thành exams, exams --ics kèm ghi chú tạo iCalendar RFC 5545 chuẩn CRLF (7 sự kiện trên tài khoản kiểm chứng).
  • docs/phase6-coverage.md: ghi nhận capability exams --ics kèm kết quả RED→GREEN và live kiểm chứng 7 sự kiện thật.
  • tasks/phase6.md: bổ sung ghi nhận nghiệm thu cho tính năng mở rộng cuối cùng exams --ics.

Kiểm tra: docs-only → git diff --check exit 0. Full suite 418 test pass. Push thành công qua HTTPS helper.

@WindowScary321

Copy link
Copy Markdown
Owner Author

Commit 39f8cd9 — feat: myfap exams --ics thêm cờ --full ẩn slot UUID mặc định

Thay đổi (code + test):

  • myfap/parsers.py (convert_exams_to_ics):
    • Mặc định (full=False khi dùng --ics): chỉ đưa thông tin quan trọng vào sự kiện lịch:
      • Tiêu đề: mã_môn (kỳ_thi) (hoặc mã_môn).
      • Thời gian: bắt đầu - kết thúc (hỗ trợ ca thi qua nửa đêm).
      • Mô tả: Môn: {subjectName} và Ngày công bố: {dateofPublication} (đã bỏ T00:00:00 cho sạch đẹp).
      • Ẩn hoàn toàn: slot (chứa UUID), phòng thi roomNo, note, note_Attendance, isGraduated. Vị trí (location) để rỗng.
    • Khi có cờ --full (full=True):
      • Đưa toàn bộ thông tin phụ vào sự kiện lịch: location nhận roomNo, mô tả có thêm Phòng, Mã slot (UUID), Ghi chú, Ghi chú điểm danh, Đã tốt nghiệp.
  • myfap/cli.py (exams):
    • Bổ sung cờ --full: full: bool = typer.Option(False, "--full", help="Kèm toàn bộ thông tin phụ khi xuất ICS...").
    • Mặc định xuất JSON (--stdout hoặc lưu file JSON không kèm --ics): bảo toàn đầy đủ 100% dữ liệu gốc từ server FAP (gồm cả 12 trường: slot UUID, roomNo, isGraduated, note_Attendance...).
    • Chỉ khi kết hợp với --ics, cờ --full mới quyết định việc đưa toàn bộ trường phụ hay chỉ trường quan trọng vào tệp iCalendar.

Kiểm tra:

  • 2 unit tests mới trong ExamsParserTests:
    1. test_default_ics_includes_publication_and_hides_slot_uuid_and_room: kiểm tra mặc định ICS có Môn, Ngày công bố, không có mã slot UUID, không có Phòng.
    2. test_full_ics_includes_all_secondary_fields: kiểm tra --full đưa đầy đủ Phòng, Mã slot (UUID), Ghi chú, Ghi chú điểm danh, Đã tốt nghiệp.
  • Cập nhật test CLI seam ExamsIcsCommandTests: kiểm tra ma trận tùy chọn [], ["--ics"], ["--ics", "--full"], ["--full"]:
    • Lệnh mặc định không --ics (có hoặc không --full) luôn xuất full raw JSON với slot (UUID) nguyên vẹn.
    • Lệnh --ics mặc định chỉ đưa Môn, Ngày công bố, ẩn Mã slot, Phòng.
    • Lệnh --ics --full đưa đầy đủ Mã slot, Phòng.
  • Full suite: 420 test, 416 đạt / 4 skip, exit 0.
  • Live-verify trên tài khoản thật:
    • exams --stdout: JSON đủ 12 trường kể cả slot UUID.
    • exams --ics --stdout: ICS mặc định sạch đẹp, chỉ có Môn và Ngày công bố, không có UUID slot hay phòng.
    • exams --ics --full --stdout: ICS có đầy đủ Phòng, Mã slot UUID, ghi chú...

@WindowScary321

Copy link
Copy Markdown
Owner Author

Commit 4655dfc — docs: cập nhật tài liệu cho exams --full — docs-only.

Thay đổi:

  • README.md: bổ sung cờ --full vào bảng Các Options.
  • CHANGELOG.md: cập nhật release notes [0.2.0] mô tả rõ hành vi mặc định của --ics và cờ --full.
  • docs/command-endpoints.md: ghi nhận cờ --full cho exams, exams --ics.
  • docs/phase6-coverage.md: cập nhật mô tả cờ --full cho myfap exams --ics.
  • tasks/phase6.md: cập nhật ghi nhận kiểm chứng với 420 tests.

Kiểm tra: docs-only → git diff --check exit 0. Full suite 420 test pass. Push thành công qua HTTPS.

@WindowScary321

Copy link
Copy Markdown
Owner Author

Commit 28dee29 — fix: thêm lại phòng thi roomNo vào mặc định của exams --ics

Thay đổi (code + test):

  • myfap/parsers.py (convert_exams_to_ics):
    • Khôi phục roomNo vào mặc định (full=False khi dùng --ics):
      • e.location = exam.get("roomNo") or "" luôn được gán (ứng dụng lịch sẽ hiển thị ghim địa điểm/phòng thi).
      • desc mặc định có thêm Phòng: {roomNo} (nếu roomNo có giá trị không rỗng).
    • Các thông tin mặc định của --ics: Môn: {subjectName}, Phòng: {roomNo}, Ngày công bố: {dateofPublication}.
    • Các thông tin chỉ hiển thị khi có cờ --full: Mã slot (UUID), Ghi chú, Ghi chú điểm danh, Đã tốt nghiệp.
  • tests/test_parsers.py: cập nhật test test_default_ics_includes_room_and_publication_and_hides_slot_uuid kiểm tra có Phòng, location, Ngày công bố, không có mã slot UUID.
  • tests/test_phase6_reads.py: cập nhật test_exams_ics_outputs_calendar_and_plain_keeps_json kiểm tra cả hai chế độ --ics và --ics --full đều có Phòng: SY-101, chỉ khác biệt ở Mã slot.

Kiểm tra:

  • Full suite: 420 test, 416 đạt / 4 skip, exit 0.
  • Live verify với tài khoản thật:
    • Các sự kiện thi có phòng (ví dụ BE-306, BE-211) hiển thị đầy đủ location: BE-... và Phòng: BE-... trong mô tả.
    • Các sự kiện thi chưa được xếp phòng thì location để rỗng và không in dòng Phòng:.
    • Mã slot UUID tiếp tục được ẩn an toàn trong chế độ mặc định, chỉ xuất khi kèm --full.

@WindowScary321

Copy link
Copy Markdown
Owner Author

Commit bc046f6 — docs: cập nhật tài liệu về roomNo trong exams --ics — docs-only.

Thay đổi:

  • README.md: cập nhật bảng Option mô tả rõ --full kèm các trường phụ (ghi chú, slot/UUID, điểm danh...), mặc định xuất môn, phòng thi, ngày công bố.
  • CHANGELOG.md: cập nhật release notes [0.2.0] ghi rõ mặc định --ics đưa đầy đủ môn, phòng thi roomNo, ngày công bố.
  • docs/command-endpoints.md: cập nhật bảng mapping cho exams, exams --ics.
  • docs/phase6-coverage.md: cập nhật mô tả capability --full và --ics.
  • tasks/phase6.md: cập nhật phần nghiệm thu cuối.

Kiểm tra: docs-only → git diff --check exit 0. Full suite 420 test pass. Push thành công qua HTTPS.

@WindowScary321 WindowScary321 self-assigned this Oct 26, 2026
- tasks/phase6.md: ghi rõ 8 hộp việc ở mục 4-5 tiếp tục giữ gate/unsupported có chủ đích do thiếu dữ liệu tài khoản, không tick khi chưa có schema live.
- docs/endpoint-gap-analysis.md: chuẩn hóa tuyên bố phủ toàn bộ đọc sinh viên ngoại trừ GetStudentFeedbackForm (chờ feedbackId thật).
- docs/releasing.md: cập nhật dòng 14 khớp quyết định phát hành sau khi hoàn thiện và nghiệm thu phạm vi Phase 6.
- tasks/todo.md: cập nhật tiến độ Phase 6, ghi nhận đồng bộ tài liệu tiền phát hành và trạng thái 8 hộp việc mục 4-5.
- CHANGELOG.md: ghi nhận ngoại lệ GetStudentFeedbackForm trong mục phân tích khoảng trống endpoint.
@WindowScary321

Copy link
Copy Markdown
Owner Author

Commit 3c59911 — docs: đồng bộ tài liệu pre-merge và chốt phạm vi mục 4-5 phase 6 — docs-only.

Thay đổi:

  • tasks/phase6.md: bổ sung ghi chú phạm vi rõ ràng tại mục 4 và mục 5; khẳng định tám (8) hộp việc ở hai mục này (rating submit, push register, feedback form/submit, write-safety, invalid input test, xác nhận live ghi) tiếp tục giữ trạng thái gate/unsupported có chủ đích do tài khoản kiểm chứng hiện tại trả danh sách rating/feedback rỗng, không thể xác minh schema/ack thực tế. Không đánh dấu tick khi chưa có schema live và không diễn giải thành "mọi hộp trong tasks/phase6.md đã tick".
  • docs/endpoint-gap-analysis.md: chuẩn hóa tuyên bố ở dòng 10: ghi nhận CLI phủ toàn bộ thao tác đọc sinh viên của cả v1 lẫn v2, ngoại trừ GetStudentFeedbackForm (tiếp tục gate có chủ đích chờ feedbackId thực tế từ tài khoản có feedback mở, không đoán ID).
  • docs/releasing.md: cập nhật dòng 14 khớp quyết định ngày 23/10/2026: phát hành v0.2.0 sau khi hoàn thiện và nghiệm thu phạm vi Phase 6 (toàn bộ read student v1+v2, doctor, transcript --pretty, exams --ics; các thao tác ghi mục 4–5 giữ gate do thiếu dữ liệu tài khoản).
  • tasks/todo.md: cập nhật trạng thái các đầu việc Phase 6 khớp tiến độ thực tế (lát cắt đọc, transcript/summary, photo/doctor, artifact/CI 420 tests [x]; ghi nhận rõ 8 hộp việc mục 4-5 giữ gate có chủ đích; bổ sung checklist đồng bộ tài liệu pre-merge).
  • CHANGELOG.md: cập nhật bullet phân tích khoảng trống endpoint phản ánh đúng ngoại lệ GetStudentFeedbackForm.

Kiểm tra:

  • Docs-only → git diff --check sạch, exit 0.
  • Full test suite: uv run --locked --group ci python -m unittest discover -s tests đạt 420 test (416 đạt / 4 skip, exit 0) trên Windows Python 3.11.
  • Push commit 3c59911 lên remote branch feat/phase6-command-expansion thành công (bc046f6..3c59911).

Trạng thái & Giới hạn:

  • Hoàn tất bước 1 (Pre-merge Docs Sync) trong RELEASE-CHECKLIST-v0.2.0.md.
  • Việc ghi nhận này không thay đổi bất kỳ contract hay hành vi runtime nào; không tự ý nới hay đóng các gate an toàn mục 4–5.
  • PR feat: mở rộng command và endpoint Phase 6 trước phát hành #10 tiếp tục giữ Draft cho đến khi maintainer sẵn sàng chuyển sang Ready for review và merge vào main.

@WindowScary321
WindowScary321 marked this pull request as ready for review October 26, 2026 14:30
@WindowScary321
WindowScary321 merged commit cdcb7c1 into main Oct 26, 2026
11 checks passed
@WindowScary321
WindowScary321 deleted the feat/phase6-command-expansion branch October 26, 2026 14:30
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant