feat(consult): prompt and Skill read from the evidence card (Skill 6.9.17)

The natal system prompt now says: the card in claim_cards is the chart
evidence for this answer, quote it as given, look up one further section of
this calculation with read-consultation-evidence before writing, and read
evidence_card.backstage as a confidence cap. The "use every executed layer"
and must_use_layers sentences are replaced; local_layers paths now point at
the card. SKILL.md 关联技法完整调取 / 0.0.1 and router 0.7 state that the
full result stays in receipts, the 本轮技法 panel and reports while web chat
answers from the card; computing the full spectrum is unchanged. Skill and
package version 6.9.16 -> 6.9.17 (tests/run_all.py 三栏).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017eEAG8HD3mm8gsKXgk8uU8
This commit is contained in:
Jesse_Chen
2026-09-27 02:54:11 +08:00
co-authored by Claude Opus 5.5
parent 850f18605b
commit 147ebc1789
9 changed files with 42 additions and 23 deletions
+4 -4
View File
@@ -1,6 +1,6 @@
---
name: jyotish-vedic-astrology
version: 6.9.16
version: 6.9.17
description: "印度占星(Jyotish)商业解盘与推运系统。核心能力:PDF星盘输入→严谨解盘→受合同约束的推运方向输出。Dasha、Yoga、分盘、合盘与补救建议按计算回执和能力状态交付;精确应期及受限技法不会作为确定性商业结论。触发词:印度占星、吠陀占星、Jyotish、解盘、推运、星盘分析、Dasha、Transit、Nakshatra、Yoga。Repo: https://git.copse.top/root/Jyotisha"
---
@@ -17,7 +17,7 @@ description: "印度占星(Jyotish)商业解盘与推运系统。核心能
若研究快照、商业覆盖层和服务端回执冲突,以商业覆盖层和服务端回执为准。真实计算只能来自服务端工具,模型不得重算或发明行星位置。候选出生时间不得写成 confirmed;`blocked`、参数敏感、外部验证未闭环和多体系冲突必须原样保留。网页对话的技法审计表由界面折叠展示(已执行 / 阻塞 / 不适用),口语回答不要再把该表写进正文;正式个人报告仍按 `executive_summary -> thematic_narrative -> evidence_appendix` 排列,审计表位于附录。医疗、法律、投资、安全关键结论及确定性死亡/诊断/妊娠预测均禁止。
> **版本**:v6.9.16 | **详细变更**:`CHANGELOG.md`
> **版本**:v6.9.17 | **详细变更**:`CHANGELOG.md`
> **对标状态**:中文用户端与技法覆盖领先;D1/D9/AV/Chara 等有守门,Dasha/Shadbala 外部 oracle 扩充仍在进行。
>
> **真相边界**:当前问题已不是“完全缺技法名称”,而是少数高价值传统深度仍未闭环;请优先修复精度与裁决链,而不是继续表面堆功能名。
@@ -51,7 +51,7 @@ Ashtottari 已从 `blocked_rule_source_conflict` 解到 `selected_rule_family_pa
## 关联技法完整调取
全谱系真实调用:咨询工作流必须真实运行全部可运行且问题相关的技法,不得因篇幅、成本或另写一份运行时覆盖层而少算一层。确定性措辞受商业声明合同约束;信息密度不受成本削减。口语回答须先用已交付的统一参数与原始结构(度数、分盘、Dasha 边界、强弱、西洋层),再并列各体系结果、冲突与证据状态,最后给出条件性综合推理。
全谱系真实调用:咨询工作流必须真实运行全部可运行且问题相关的技法,不得因篇幅、成本或另写一份运行时覆盖层而少算一层。确定性措辞受商业声明合同约束;信息密度不受成本削减:完整结果保留在服务端回执、网页「本轮技法」折叠面板与正式个人报告里。网页普通对话写答案时只读服务端按问题筛出的数据卡——基础段(上升、十二宫星座、行星落宫与度数、功能吉凶与宫主归属、当前 Vimshottari 大运 / 子运 / 子子运起止、Narayana 当前段)加当前问题领域段(该领域的分盘、宫、行星与相关层);卡外数据只能用只读补取工具取一次,取的是本轮已算好的结果,不重算。口语回答先用卡上的原始结构(度数、分盘、Dasha 边界、强弱),再并列各体系结果、冲突与证据状态,最后给出条件性综合推理。
- 共同基础:D1、功能性吉凶星、相关 Yoga、Vimshottari 与 Narayana Dasha、行运、Shadbala、Ashtakavarga。
- 分盘:主题相关分盘优先解读;D1–D60 中 20 张正式传统分盘与 40 张研究型通用 D-N 均须计算。正式分盘与 generic D-N 分别标明,不得把研究 D-N 宣传为已验证传统分盘。
@@ -162,7 +162,7 @@ adapter available 解释为已完成 VedAstro、PyJHora/JHora 或 jyotishganit r
完整规范 → `references/ai-reading-workflow-prompt.md` v5.1.0。网页咨询与本地 Agent 调用同一套步骤,不得另减技法。
0. **阶段负一**:问题类型路由(事业/婚恋/财务/应期/历史验证/综合解盘)→ 必须先读 `references/strict-workflow-router.md`,按对应 strict checklist 执行;用户不需要主动点名高级技法。
0.0.1 **全谱系真实调用**:事业、财富、年度推运、事件应期、校时或综合解盘,必须实际运行全部可用且问题相关的印度与西方技法。不得把“仓库存在”“UI可见”或“默认未传参数”伪装成已调用;每一项必须输出 `executed`、`blocked` 或 `not_applicable`。限制只作用于确定性措辞,不得削减信息密度。咨询工作流与本文件是同一套合同,不另维持一份锁定稿调用面。
0.0.1 **全谱系真实调用**:事业、财富、年度推运、事件应期、校时或综合解盘,必须实际运行全部可用且问题相关的印度与西方技法。不得把“仓库存在”“UI可见”或“默认未传参数”伪装成已调用;每一项必须输出 `executed`、`blocked` 或 `not_applicable`。限制只作用于确定性措辞,不得削减信息密度;网页普通对话的写答案模型读按问题筛出的数据卡,完整结果留在回执、「本轮技法」面板与报告(见「关联技法完整调取」)。咨询工作流与本文件是同一套合同,不另维持一份锁定稿调用面。
0.1 **事件判定骨架**:凡涉及 marriage / career / wealth / event verify,必须执行 `事件判定骨架 v1.0`,按 `Route -> Evidence Ledger -> Adjudication -> Output Contract` 顺序输出;不得再凭直觉跳模块或随口给置信度。详见 `references/ai-reading-workflow-prompt.md`、`references/event_judgment_skeleton.md`、`references/event_judgment_marriage.md` 与 `references/event_judgment_examples.md`。
1. **阶段零**:入口路由(A/B/C自动判断)
2. **阶段一**(仅B):PDF/图片提取 + Quality Gate
+9 -8
View File
@@ -18,13 +18,15 @@ export type { ConsultationInput } from "./consultation-workflow.ts";
const jyotishInstructions = `You are the guide for a conversational Vedic astrology product.
${productConversationVoice}
${natalSpokenReportContract}
Write in Simplified Chinese: a heading-free spoken opener first (反差(表面 A,底下 B,命名成一个格局)→ 谁在推、谁在修 → 别去应 X 的象、去扮演 Y 的象 → 最多三条短行动,各 ≤ 20 characters; ≤ 400 characters), then the skill Level 2 report skeleton for natal domain questions. Markdown tables are required for raw structure, Yogas, and the Technique Audit Table.
Write in Simplified Chinese: a heading-free spoken opener first (反差(表面 A,底下 B,命名成一个格局)→ 谁在推、谁在修 → 别去应 X 的象、去扮演 Y 的象 → 最多三条短行动,各 ≤ 20 characters; ≤ 400 characters), then the skill Level 2 report skeleton for natal domain questions. Use Markdown tables for raw structure and, when the card carries yogas, for the Yoga table; the Technique Audit Table is folded by the product UI and never written in the body.
${jyotishSkillMethodBlock}
The bound skill method is this product's answering contract, including its report order. Use run-jyotish-consultation for actual chart calculations instead of inventing results. 骨架不可省略,但必须以直接回应开场. Do not replace the skeleton with spoken-only chat.
Call run-jyotish-consultation before answering every turn, including short follow-ups; the calculation is request-scoped and is never carried over from an earlier turn.
Select consultation domains only through the single ordered domains array of run-jyotish-consultation, whether the question covers one domain or several; omit it to accept the domain the server already selected. List every domain the question actually needs, in priority order, up to six. Do not drop a relevant domain to keep the plan short—the natal compute already ran the full technique spectrum. The server canonicalizes aliases, rejects unsupported/product domains, executes as many accepted domains as the wall clock can pay for (about ${MAX_CONSULTATION_DOMAINS}), and returns the rest in omitted_domains. The actual executed domains are in the tool context and receipt. The only legal domain ids are the ones enumerated in that array's schema; the skill's methodology names strict-workflow checklists such as career-timing-strict, and those labels select techniques inside the skill, never domains for this tool. A rejected domain plan is final for this run: correct the domains once, and never re-send the same call with extra parameters.
Select consultation domains only through the single ordered domains array of run-jyotish-consultation, whether the question covers one domain or several; omit it to accept the domain the server already selected. List every domain the question actually needs, in priority order, up to six. Do not drop a relevant domain to keep the plan short—the natal compute already ran the full technique spectrum. A question about one's parents uses parents and one about one's children uses children; family is only for the household as a whole. The server canonicalizes aliases, rejects unsupported/product domains, executes as many accepted domains as the wall clock can pay for (about ${MAX_CONSULTATION_DOMAINS}), and returns the rest in omitted_domains. The actual executed domains are in the tool context and receipt. The only legal domain ids are the ones enumerated in that array's schema; the skill's methodology names strict-workflow checklists such as career-timing-strict, and those labels select techniques inside the skill, never domains for this tool. A rejected domain plan is final for this run: correct the domains once, and never re-send the same call with extra parameters.
The tool result's methodology field is the domain checklist for the routes that actually ran, quoted from the live skill. The shared Full-spectrum invocation and Event judgment skeleton are bound in the system prompt; methodology.sections carries only the domain-specific checklists with the tool result. Treat those domain sections as the method for this answer, not as background: work through their mandatory modules against the evidence you were given, and obey their output discipline, including any instruction to separate kinds of claim rather than merge them into one vague statement. Those domain sections are already delivered, so never spend a turn re-reading them; methodology.further_reading lists the references the skill names, and you may read one with skill_read only when the question needs something the delivered sections do not cover. When methodology.domains_without_strict_checklist names a domain, the skill declares no named checklist for it: still follow the bound Full-spectrum invocation, Event judgment skeleton, and shared baseline, and do not imply a named strict route was followed. When methodology is absent, follow the bound skill method above.
The tool result always carries one top-level answer contract—status, evidence_contract, claim_cards, rectification—even when several domains ran. For a multi-domain plan that top level is the most restrictive merge of the executed domains, so obey it exactly as written and read consultations only for per-domain detail. Never treat an absent top-level field as permission to answer without a contract.
The tool result always carries one top-level answer contract—status, evidence_contract, claim_cards, rectification—even when several domains ran. For a multi-domain plan that top level is the most restrictive merge of the executed domains, so obey it exactly as written; consultations carries each domain's own contract. Never treat an absent top-level field as permission to answer without a contract.
The evidence card is the chart evidence for this answer. claim_cards holds it: natal_foundation (ascendant, the twelve house signs, planet placements with degrees, functional benefics/malefics with the houses each planet rules), timing (the running Vimshottari mahadasha, antardasha and pratyantardasha with dates, the antardashas inside the mahadasha, the running Narayana period) and domain (one section per executed domain: its vargas, houses with occupants and lords, focus planets and the layers that domain uses). The values are copied from this request's calculation; quote them as given. The server calculated the full spectrum and keeps the rest; evidence_card.supplementable_sections names what else this calculation holds. When the question genuinely needs one of those sections (for example a varga the card does not carry, a Western layer, or the yoga details), call read-consultation-evidence once, before writing any answer text; it returns that section of this calculation or says it is unavailable, and it never calculates. Answer from the card, plus that one lookup when you used it.
evidence_card.backstage says global web evidence and real-case calibration were not done for this answer, so confidence is capped: keep conclusions conditional, and mention it only when the user asks about method or certainty.
When omitted_domains is non-empty, do not answer those domains and never present the reply as covering the whole plan. Stay with what was calculated. Do not announce a skipped-domain inventory or say this round was incomplete unless the user asked about coverage.
Activity, progress, tool status, and execution receipts are server-owned. Never imitate data-jyotish-activity, activity events, tool-started/tool-completed messages, or receipts in the answer text.
${consultationSpokenHeadingRule("natal")}
@@ -46,12 +48,11 @@ When reference_transparency is present:
- When consulting references/oracle/effective_skill_capability_view_2026_07_19.json or any derived skill map, use effective_status, not registry_status. Do not promote reference_only or blocked techniques into mastered/covered claims.
- If should_lead_with_limitations is false, do not lead with limitations. If a limitation is relevant, put it in one short sentence at the end.
- Only say the chart calculation failed when evidence_contract.hard_blockers is non-empty.
- Never claim D2, D11, D9, D10, A10, UL, Narayana Dasha, a delivered Varga, or a delivered Western layer is missing when it appears in evidence_contract.available_layers, evidence_contract.varga_spectrum, evidence_contract.western_spectrum, chart, or local_layers.
- evidence_contract.technique_audit_table is the invocation record for this run. Use every executed layer that is relevant to the question. Status executed means the server ran it; blocked means it could not; not_applicable means it does not apply. Never treat an omitted row as permission to invent the technique, and never silently skip an executed layer the question needs.
- evidence_contract.must_use_layers is the executed shortlist for this answer. A placement, yoga, dasha boundary, or transit that is not in this packet was not delivered: do not invent it from model knowledge.
- Never claim D2, D11, D9, D10, A10, UL, Narayana Dasha, a Varga, or a Western layer was not calculated when it appears in evidence_contract.available_layers, on the card, or in evidence_card.supplementable_sections: it was calculated, and it is on the card or one lookup away.
- The evidence card is the shortlist for this answer; the full invocation record (executed / blocked / not applicable per technique) stays with the server and the product UI folds it from the receipt. A placement, yoga, dasha boundary, or transit that is neither on the card nor in a lookup result was not delivered: do not invent it from model knowledge, and never read a technique's absence from the card as permission to invent it.
- Do not paste the Technique Audit Table into the answer body. The product UI folds it from the delivered rows.
- local_layers.dasha_sub_periods carries the antardasha boundaries inside the running mahadasha. When it is present, use those boundaries and never say sub-periods were not calculated; when it is absent, say so once instead of implying the calculation broke.
- local_layers.transits.search_period is the searched observation window. When it is present, an empty triggers list means no exact contact in that window, not that transits were skipped. Quote only delivered trigger dates; do not invent a retrograde or exact hit that is not in triggers.
- The card's timing section carries the antardasha and pratyantardasha boundaries inside the running mahadasha and the running Narayana period. When they are present, use those boundaries and never say sub-periods were not calculated; when one is absent, say so once instead of implying the calculation broke.
- A domain section's transits.search_period is the searched observation window. When it is present, an empty triggers list means no exact contact in that window, not that transits were skipped. Quote only delivered trigger dates; do not invent a retrograde or exact hit that is not in triggers.
- Treat evidence_contract.answer_policy as a hard output contract. When can_answer_precise_timing is false, provide only direction or structure and do not state a month, date, or guaranteed timing outcome.
- Treat answer_policy.deterministic_claims_forbidden_for as a hard prohibition. Do not use a restricted technique to make a deterministic conclusion. reference_only, partial, blocked, research_only_blocked, and partial_registry_only are commercial claim boundaries, not validated capabilities.
- When rectification.boundary=not_auto_rectified, treat that as final: a candidate time or score is not a verified birth time and must not be presented as one. When the boundary is precision_ok or precision_annotated, use the delivered clock; do not invent candidate windows or say the time is unrectified.
+2 -2
View File
@@ -47,7 +47,7 @@ For career / wealth / marriage / family (and any natal domain reading): open wit
Required body order after that opener, using these exact H2 headings: ## 先回答你的问题, then ## 盘里支持这个判断的地方, then ## 时间怎么看, then ## 这周可以做的一件事. Do not write a thinking-process checklist; Activity is server-owned. Do not write 统一参数与原始结构 or 技法审计表 into the body — the evidence panel already renders those rows.
1. Answer the question first: the contrast, who is pushing / who is dressing the result, which role to play.
2. Ground the judgment in delivered chart fields (houses, lords, yogas, strength). Raman six-step house judgment and the Yoga table stay in this section as evidence, not as a parameter dump. Cite, do not dump degrees tables.
2. Ground the judgment in the evidence card's chart fields (houses, lords, yogas, strength). Raman six-step house judgment and the Yoga table stay in this section as evidence when the card carries them, not as a parameter dump. Cite, do not dump degrees tables.
3. Timing: current Dasha and transits when delivered. Phrase as 能量活跃度/概率, never an absolute date guarantee.
4. One or two actions for this week. Direct, not footnote-soft.
@@ -55,7 +55,7 @@ Address the reader as 你. Gloss a technical term once in plain Chinese (婚姻
Raman yogas and house steps remain governed_support_only_candidate_ready: write strength and promotion/hindrance in skill language, but do not upgrade them into verified fate truth.
Never:
- Skip an executed layer the question needs in order to keep the answer short.
- Skip a card fact the question needs in order to keep the answer short.
- Put the Technique Audit Table or 统一参数 heading back into the spoken body.
One natal career/wealth/marriage/family question still uses the opener-plus-skeleton above.`;
+5 -1
View File
@@ -45,7 +45,11 @@ test("keeps strength, Ashtakavarga, and timing evidence available to the answer
assert.match(workflowSource, /dasha_sub_periods: modules\.dasha_sub_periods/);
assert.match(workflowSource, /varga_spectrum: modules\.varga_spectrum/);
assert.match(workflowSource, /technique_audit_table: consumerContext\.technique_audit_table/);
assert.match(agentSource, /evidence_contract\.technique_audit_table/);
// 原值: assert.match(agentSource, /evidence_contract\.technique_audit_table/)(提示要求模型通读审计表)
// 新值: 审计表仍由工作流带回、留在服务端回执与「本轮技法」面板;提示改为数据卡是清单、审计记录留在服务端
// 原因: TASK-consult-evidence-card-20260927 D3/T4(推翻「technique_audit_table is the invocation record… Use every executed layer」)
assert.doesNotMatch(agentSource, /evidence_contract\.technique_audit_table/);
assert.match(agentSource, /the full invocation record \(executed \/ blocked \/ not applicable per technique\) stays with the server/);
assert.match(workflowSource, /evidence_contract:/);
assert.match(workflowSource, /missing_route_layers: consumerContext\.missing_route_layers/);
assert.match(workflowSource, /answer_policy: consumerContext\.answer_policy/);
@@ -32,6 +32,9 @@ test("web consult compute and projection keep the live skill's locally computed
assert.match(attach, /search_transit_triggers/);
assert.match(workflow, /transits: context\.local_layers\.transits/);
assert.match(workflow, /must_use_layers/);
assert.match(instructions, /must_use_layers is the executed shortlist/);
// 原值: assert.match(instructions, /must_use_layers is the executed shortlist/)
// 新值: 计算照旧全谱系(上面几条不变),提示改为「数据卡是这次回答的清单」
// 原因: TASK-consult-evidence-card-20260927 D3/T4:只改给模型看什么,BUG-287 的计算口径不变
assert.match(instructions, /The evidence card is the shortlist for this answer/);
assert.doesNotMatch(instructions, /AGENTS\.md/);
});
@@ -16,7 +16,11 @@ test("product voice uses a spoken opener then the skill Level 2 report skeleton"
assert.match(voice, /Yoga table/);
assert.match(voice, /Do not write 统一参数与原始结构 or 技法审计表 into the body/);
assert.match(voice, /governed_support_only_candidate_ready/);
assert.match(voice, /Skip an executed layer the question needs/);
// 原值: assert.match(voice, /Skip an executed layer the question needs/)
// 新值: 「不许为了短而漏掉问题需要的卡上事实」;写答案的模型只读数据卡
// 原因: TASK-consult-evidence-card-20260927 D1/T4(推翻「用尽每个已执行层」的口径)
assert.match(voice, /Skip a card fact the question needs/);
assert.doesNotMatch(voice, /Skip an executed layer/);
// 原值: assert.match(voice, /你更适合把已经积累的专业能力做成长期事业/) —— 它是 Good 例。
// 新值: 同一句改断言成 Bad 例(下方 voice-opener-shape 测试里锁住它在 Bad 段)。
// 原因: 产品判定这句像顾问报告——没有反差、没说谁在推谁在修、没有可扮演的象。
@@ -39,7 +43,12 @@ test("product voice uses a spoken opener then the skill Level 2 report skeleton"
assert.match(binding, /present its Level 2 report template in the chat body after a 3-6 sentence spoken reply/);
assert.match(mastra, /The bound skill method is this product's answering contract/);
assert.match(mastra, /Do not use a restricted technique/);
assert.match(mastra, /must_use_layers is the executed shortlist/);
// 原值: assert.match(mastra, /must_use_layers is the executed shortlist/)
// 新值: 数据卡是这次回答的清单;卡外数据只能用补取工具取一次
// 原因: TASK-consult-evidence-card-20260927 D1/D3/T4,must_use_layers 与审计表不再进模型上下文
assert.match(mastra, /The evidence card is the shortlist for this answer/);
assert.match(mastra, /call read-consultation-evidence once, before writing any answer text/);
assert.doesNotMatch(mastra, /must_use_layers is the executed shortlist|Use every executed layer/);
assert.match(mastra, /do not invent it from model knowledge/);
assert.match(mastra, /search_period is the searched observation window/);
assert.match(voice, /## 先回答你的问题/);
+1 -1
View File
@@ -24,7 +24,7 @@ _scripts_dir = os.path.join(_repo_root, "scripts")
if _scripts_dir not in sys.path:
sys.path.insert(0, _scripts_dir)
__version__ = "6.9.16"
__version__ = "6.9.17"
__all__ = [
"calculate_chart",
"calculate_dasha",
+2 -2
View File
@@ -62,12 +62,12 @@ Every Level 2+ chart reading must include `MEVG / Global Web Evidence` and
For career, wealth, annual forecast, event timing, rectification, or a comprehensive reading, the system must **actually execute every available, question-relevant Indian and Western technique** before interpretation. A module merely existing in the repository, registry, or UI does not count as used.
1. Preserve every produced raw payload, varga, dasha, strength table, transit window, and cross-system difference. Information density must never be reduced because an oracle, formula variant, or holdout is incomplete.
1. Preserve every produced raw payload, varga, dasha, strength table, transit window, and cross-system difference. Information density must never be reduced because an oracle, formula variant, or holdout is incomplete. In web chat the full result is preserved in the server receipt, the folded 「本轮技法」 panel and the personal report; the answer-writing model reads the server's question-scoped evidence card (base chart plus the asked domain's section) and may look up one further section of the same calculation, read-only.
2. Invoke the Indian core relevant to the route: D1 plus all relevant vargas; Vimshottari, Narayana, Chara Dasha, Yogini, Ashtottari, Kalachakra and Bhrigu Pada where implemented; Jaimini/Arudha; KP; Double Transit PAC; transit LL/7L; Bhava Chalit; Sudarshana; Tajika/Varshaphala/Muntha; Nakshatra overlay; strengths, AV, yoga, argala, and relevant sahams.
3. Invoke the Western core for the same birth data: tropical natal chart, transit-to-natal duration scan, Solar Return, secondary progressions, solar arc, converse progressions/arcs, midpoints, Lunar Return, and parans where implemented.
4. A technique requiring unavailable inputs (for example partner data, Prashna question time, or an electional target) must still appear in the Technique Audit Table as `blocked` with its required input. It must not be silently skipped.
5. Keep raw information and conditional interpretations visible. The only restricted content is an unsupported certainty claim: no inevitable event, no unsupported exact day, and no claim of cross-system verification when only one system ran.
6. The report must state per technique: `executed`, `blocked`, or `not_applicable`, its settings, raw-output path, and its effect on assertion strength. `not_executed` is a workflow failure for a relevant technique.
6. The report must state per technique: `executed`, `blocked`, or `not_applicable`, its settings, raw-output path, and its effect on assertion strength. `not_executed` is a workflow failure for a relevant technique. In web chat that per-technique record is the receipt's folded 「本轮技法」 panel, not the answer body.
---
## 0.8 User-Led Reading Calibration Gate
+4 -2
View File
@@ -688,8 +688,10 @@ def t99():
@test("Package version is consistent")
def t100():
from jyotish_vedic import __version__
# 原值=6.9.15;新值=6.9.16。原因=婚恋三层模型与条件大运接入,新增 skill 版本目录。
assert __version__ == '6.9.16'
# 原值=6.9.16;新值=6.9.17。原因=网页普通对话写答案改读数据卡(全谱系计算不变,
# 完整结果留在回执 / 本轮技法 / 报告),SKILL.md「关联技法完整调取」与 0.0.1 同步
# (TASK-consult-evidence-card-20260927 T4)。
assert __version__ == '6.9.17'
# ── v6.9.11 Precision gate tests ──
@test("Transit uses Swiss Ephemeris")