feat(narayana): label the product Narayana as the legacy algorithm (T4, BUG-1215)

Round-4 ruling Q4 / product decision A: scoring and the consultation and
report time axes keep the old Narayana (from the Lagna, always zodiacal) until
the Rath trial is decided; every user-visible Narayana now says so.
narayana_legacy_label adds profile=legacy_reference_only and the note (zh/en)
at the consumers (consultation modules, full reading Step 4.13, CLI), not in
the frozen narayana_dasha.py (ERR-110/115). The card's timing.narayana carries
'algorithm'; the projection allowlist passes algorithm_note; the reference
report's Narayana section and the dasha-family table show '算法:…' (English
twin in the phrase table). The unused narayana-dasha --variant-profile flag,
the one place offering a Chara Dasha author's profile for Narayana, is removed.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01N4f2nya58RoRu4yEmJgRGE
This commit is contained in:
Jesse_Chen
2026-10-03 16:42:15 +08:00
co-authored by Claude Opus 5.5
parent 7cb332bce6
commit 9eb22f6363
9 changed files with 119 additions and 7 deletions
@@ -615,6 +615,9 @@ function baseTiming(timing: Record<string, unknown>, gaps: string[]) {
}
const remaining = copy(currentNarayana.remaining_years);
if (remaining !== undefined) narayana.remaining_years = remaining;
// BUG-1215: say which Narayana this is (legacy: from the Lagna, always zodiacal).
const algorithmNote = record(timing.narayana_dasha).algorithm_note;
if (narayana.md && typeof algorithmNote === "string" && algorithmNote) narayana.algorithm = algorithmNote;
if (!narayana.md) gaps.push("base.narayana.md");
return { vimshottari, narayana };
}
@@ -346,6 +346,8 @@ const timingKeys = new Set([
// Without these keys the projection kept `current_dasha` as an empty object
// and dropped the pratyantar dates, although the engine had both.
"md", "ad", "pd", "years", "startage", "endage", "remainingyears", "pratyantardashatimeline",
// BUG-1215: the running Narayana is the legacy algorithm; its label travels with it.
"algorithmnote",
]);
const validationKeys = new Set([