# Báo cáo Audit & Vá Lỗi Engine Lịch Pháp

**URL:** https://lab.quizzman.com/tool/about-calendar-audit  
**Công cụ:** https://lab.quizzman.com/tool/calendar-converter  
**Almanac API:** `GET /api/tool-module/calendar/almanac?date=YYYY-MM-DD&timezone=VN`  
**Ngày:** T9/2026

Audit lớp Hoàng lịch (Thập Nhị Trực, Nhị Thập Bát Tú) trên cùng lõi thiên văn đã đối chiếu NASA. Âm lịch, Can Chi ngày, Hoàng/Hắc đạo, nạp âm và tiết khí **đúng**; hai trường Trực và Tú lệch **cùng một bậc** — không phải lỗi ngẫu nhiên từng ngày.

Đối chiếu độc lập 01/09/2026 (giờ Việt Nam): **Mậu Dần – Thiên Hình Hắc Đạo – Trực Phá – sao Thất (Thất Hỏa Trư)**. Engine cũ trả **Nguy + Bích**.

---

## 1. Lỗi Thập Nhị Trực — truyền số tháng thay vì chi tháng tiết khí

- **Triệu chứng:** 01/09/2026 (âm 20/7, chi ngày Dần) ra Trực **Nguy** thay vì **Phá**. Chuỗi Kiến → … → Phá → Nguy lệch đúng một bậc.
- **Nguyên nhân:** `getDayOfficer(chi_ngày, chi_tháng)` nhận `lunar.month` (1–12). Tháng Bảy bị đọc như Mùi (index 7) trong khi tháng tiết khí lúc đó là **Thân** (index 8, sau Lập Thu). Công thức `index = (chi_ngày − chi_tháng + 12) mod 12` vì thế lệch +1. Scoring engine còn dùng `(solarMonth + 1) % 12` từ tháng dương lịch Gregorian — tháng 9 DL không phải tháng Thân.
- **Quy tắc đúng:** Ngày có chi trùng chi **tháng tiết khí** (Lập Xuân = Dần) là Trực Kiến, rồi tiến một trực mỗi ngày.
- **Patch:**
  - `getCalendarInfo` / `generateDayReading` truyền `solarMonthCanChi.chiIndex`.
  - Scoring dùng `getSolarMonthCanChi(jdn)`, không còn số tháng Gregorian.
  - Khóa regression: Dần ngày + Thân tháng → Phá.

---

## 2. Lỗi Nhị Thập Bát Tú — epoch JDN lệch một ngày

- **Triệu chứng:** Cùng ngày ra sao **Bích** thay vì **Thất** (室, Thất Hỏa Trư). Cả 28 tú lệch +1.
- **Nguyên nhân:** Comment ghi «01/01/1995 (Chủ Nhật) = sao Hư» nhưng hằng `MANSIONS_EPOCH_JDN = 2449718` — đó là JDN của **31/12/1994**. `jdFromDate(1, 1, 1995) = 2449719`.
- **Công thức:** `index = (JDN − 2449719 + 10) mod 28` (epoch Hư = index 10). Đây là chu kỳ **nhật tú lịch dân sự**, không phải vị trí thiên văn thực của Mặt Trăng.
- **Patch:** `MANSIONS_EPOCH_JDN = 2449719`. Ngày sau 01/09/2026 mới là Bích — đúng output cũ của engine.

---

## 3. Golden 01/09/2026 (VN)

| Hạng mục | Trước vá | Sau vá / đối chiếu |
|---|---|---|
| Âm lịch | 20/7 năm Bính Ngọ | 20/7 năm Bính Ngọ |
| Can chi ngày | Mậu Dần | Mậu Dần |
| Hoàng/Hắc đạo | Thiên Hình Hắc Đạo | Thiên Hình Hắc Đạo |
| Thập Nhị Trực | Nguy | **Phá** |
| Nhị Thập Bát Tú | Bích | **Thất (Thất Hỏa Trư)** |
| Nạp âm | Thành Đầu Thổ | Thành Đầu Thổ |
| Tiết khí | Xử Thử | Xử Thử |

Câu chuẩn: *Xét theo hệ Hoàng Đạo – Hắc Đạo, ngày 1/9/2026 là ngày Thiên Hình Hắc Đạo. Trong hệ Thập Nhị Trực, đây là ngày Trực Phá. Theo Nhị Thập Bát Tú, ngày ứng với sao Thất (Thất Hỏa Trư). Ngày Mậu Dần mang nạp âm Thành Đầu Thổ, thuộc hành Thổ. Âm lịch: ngày 20 tháng Bảy năm Bính Ngọ. Tiết khí: Xử Thử.*

---

## 4. Không phải bug thiên văn

Sóc Meeus vs NASA, λ☉ phân–chí abridged VSOP87 (~0.5°), Tết VN≠CN do gấp ngày UTC+7/+8 — đã audit riêng (`NASA_PARITY_AUDIT`, Astro Tools). Lỗi T9/2026 nằm ở **neo lịch dân sự** (chi tháng tiết khí + JDN epoch), không phải ephemeris.

---

## Tổng kết

Hai offset độc lập cùng lệch +1 nên Almanac API trông như «cả khối Hoàng lịch sai một ngày». Đã khóa bằng `truc-xiu.test.cjs` (23 assert) trong suite calendar-engine. Lõi Sóc / tiết khí / Can Chi ngày không đổi.
