fix(qizheng): pass school options into the vendored chart and stabilize gates
BUG-710: call getSevenGovernorsChart with ketuMode/siderealMode so calculation.ketu_mode is the engine school, not the request echo. BUG-711: stop forbidding /ephemeris in the sidebar contract. BUG-712: compare ephemeris event longitudes at 6 decimals and fail closed when the golden is missing.
This commit is contained in:
@@ -599,7 +599,10 @@ function mapQizheng(raw: Record<string, unknown> | null): ChartViewQizhengOk | C
|
||||
return {
|
||||
status: "ok",
|
||||
coordinateSystem: text(raw.coordinate_system) ?? "qizheng_mansion_degrees_from_jiao",
|
||||
ketuMode: text(raw.ketu_mode) ?? text(raw.ketuMode) ?? "unspecified",
|
||||
ketuMode: text(record(raw.calculation)?.engine_ketu_mode)
|
||||
?? text(record(raw.chart)?.ketu_mode)
|
||||
?? text(raw.ketuMode)
|
||||
?? "unspecified",
|
||||
boundary: COORDINATE_BOUNDARY.qizheng,
|
||||
palaces,
|
||||
bodies,
|
||||
|
||||
@@ -135,6 +135,26 @@ test("a real western engine packet lights the tropical tab without mixing sidere
|
||||
assert.equal(body.qizheng.status, "unavailable");
|
||||
});
|
||||
|
||||
test("qizheng ketuMode follows the engine field, not a request echo", async () => {
|
||||
const qizheng = {
|
||||
coordinate_system: "qizheng_mansion_degrees_from_jiao",
|
||||
calculation: { ketu_mode: "descending-node", engine_ketu_mode: "apogee" },
|
||||
palaces: [{ name: "午", branch: "午", lifePalace: "命宫", mansions: ["星"], occupants: [] }],
|
||||
bodies: { sun: { mansion: "奎", siderealLon: 177.94, palace: "亥宮", dignity: "陷" } },
|
||||
};
|
||||
const { postEngine } = engine({ "/api/qizheng": qizheng });
|
||||
const result = await assembleChartView({
|
||||
userId: "user-1",
|
||||
profile,
|
||||
postEngine,
|
||||
asOf: "2026-09-15",
|
||||
});
|
||||
const body = chartViewOkSchema.parse(result.body);
|
||||
assert.equal(body.qizheng.status, "ok");
|
||||
if (body.qizheng.status !== "ok") throw new Error("expected qizheng ok");
|
||||
assert.equal(body.qizheng.ketuMode, "apogee");
|
||||
});
|
||||
|
||||
test("the golden chart-view envelope stays inside the page contract", () => {
|
||||
chartViewResponseSchema.parse({
|
||||
status: "birth_profile_incomplete",
|
||||
|
||||
@@ -67,7 +67,11 @@ function render(payload: EphemerisOkResponse | null, date = payload?.date ?? "20
|
||||
test("the ephemeris page is its own route and never grows page.tsx", () => {
|
||||
assert.match(routePage, /from "@\/components\/ephemeris\/ephemeris-page"/);
|
||||
assert.doesNotMatch(readFileSync(new URL("../src/app/page.tsx", import.meta.url), "utf8"), /ephemeris-page/);
|
||||
assert.doesNotMatch(readFileSync(new URL("../src/components/app-sidebar.tsx", import.meta.url), "utf8"), /ephemeris/);
|
||||
// 原值: assert.doesNotMatch(app-sidebar.tsx, /ephemeris/)
|
||||
// 新值: 本单文件归属只锁 page.tsx / 本 route,不再锁 sidebar
|
||||
// 原因: TASK-chart-page-20260915 任务 3 要求 sidebar 同时加「星盘」「星历」入口;文件归属「本单不改 sidebar」不是产品事实「sidebar 不得出现 ephemeris」(BUG-711)
|
||||
const thisTest = readFileSync(new URL(import.meta.url), "utf8");
|
||||
assert.doesNotMatch(thisTest, /from "@\/components\/app-sidebar"/);
|
||||
});
|
||||
|
||||
test("date switching replaces panchanga and transits", () => {
|
||||
|
||||
Reference in New Issue
Block a user