From a801985d4fbbec1647fea3ef0523b5a921a3b18f Mon Sep 17 00:00:00 2001 From: Jesse_Chen Date: Sun, 18 Oct 2026 15:01:27 +0800 Subject: [PATCH] docs(tasks): synastry report shows reasons inline and a dasha timeline Co-Authored-By: Claude Opus 5.5 (1M context) Claude-Session: https://claude.ai/code/session_014Ad9rqAB8pXXvyzh7f4X8v --- docs/tasks/README.md | 2 +- .../TASK-synastry-full-report-20261018.md | 45 ++++++++++--------- 2 files changed, 25 insertions(+), 22 deletions(-) diff --git a/docs/tasks/README.md b/docs/tasks/README.md index e754dd78..fa237ba9 100644 --- a/docs/tasks/README.md +++ b/docs/tasks/README.md @@ -503,4 +503,4 @@ | `TASK-people-archive-limit-20-20261017.md` | — | 星盘档案上限 5→20 人(触发器新迁移 + 常量 + 文案;婚恋合盘前置单) | 待领取 | `codex/people-archive-limit-20-20261017`;动表,需 test:db | | `TASK-marriage-match-p1-20261017.md` | #79 | 婚恋合盘引擎(搬上游 bde5d615:marriage_match + 合盘证据包;35 分七项、不分男女;第六版不扣点、不做页面)(BUG-1370 起) | 待执行(不再等 #78) | `codex/marriage-match-p1-20261017`;动表 | | `TASK-full-reading-module-parity-20261018.md` | #81 | full-reading 补齐上游 5 个模块(西占层文件没搬致永远 blocked、Navamsha / Niryaana 用我们自己的实现填键、Lagna Vargottamamsa / Pushkara / Punarphoo)(BUG-1375 起) | 待执行(可与 #78 并行) | `codex/full-reading-module-parity-20261018` | -| `TASK-synastry-full-report-20261018.md` | #82 | 婚恋合盘:选人页 + 完整合盘报告(关系画像八节,正文无术语;英文按需;计费键 synastry.full) | 排队(等 #78、#79、#81) | `codex/synastry-full-report-20261018`;动表 | +| `TASK-synastry-full-report-20261018.md` | #82 | 婚恋合盘:选人页 + 完整合盘报告(关系画像九节:结论+原因+关系时间线;英文按需;计费键 synastry.full) | 排队(等 #78、#79、#81) | `codex/synastry-full-report-20261018`;动表 | diff --git a/docs/tasks/TASK-synastry-full-report-20261018.md b/docs/tasks/TASK-synastry-full-report-20261018.md index adfcfc78..f8f39a80 100644 --- a/docs/tasks/TASK-synastry-full-report-20261018.md +++ b/docs/tasks/TASK-synastry-full-report-20261018.md @@ -7,7 +7,7 @@ - **前置**:#78(档案上限 20 人)、#79(引擎、证据包接口、存储;第六版起不做页面)、#81(full-reading 补齐 5 个模块)三单都合入后开工。三单彼此不冲突,可并行。 - **上线**:#79 与本单要一起提升到 `main`(#79 单独上线时旧入口还在、新入口不存在)。本单从 #79 合入后的 `origin/staging` 开分支,复用 #79 的引擎、证据包接口、选人页和 `synastry_reports` 新列。 - **正文写作首要准则**:`docs/research/synastry_relationship_language_guide_2026_10_18.md`(产品负责人 10-18 提供,「从星曜语言到关系语言」)。凡与上游写作规范冲突处,以它为准。 -- 原型(v8,关系画像):https://claude.ai/artifact/Tq6vhXFMnGitDZhJdamaHe 。原型里的人名和正文全是虚构示例。 +- 原型(v10,关系画像 + 原因 + 时间线):https://claude.ai/artifact/Tq6vhXFMnGitDZhJdamaHe 。原型里的人名和正文全是虚构示例。 - 上游参照:占星师仓库 `yinduzhanxing` 提交 `bde5d615` 的 `skills/jyotish-full-synastry-reading/`。上游仓库私有,原样副本在 `docs/research/upstream_full_synastry_bde5d615/`(`skill/` 下是 Skill 本体,`tests/` 下是五个测试文件;`.py.txt` 搬入时去掉 `.txt`)。 ## 现状实证(按符号定位) @@ -33,11 +33,12 @@ | E2 | **先写中文,切到英文时再写**:英文不翻译中文稿,从同一份证据包按同一准则重新写;第一次切换时生成,不另扣点 | | E3 | **单独计费项 `synastry.full`**,默认价格同个人完整报告(`report.full`)。价格由后台发布,代码里不写死。同一对人、两人出生资料没改、规则版本没变,再次打开读已有报告,不扣点 | | E4 | 报告写作**重新启用模型**,但只用于合盘报告;个人报告保持引擎渲染不变(`PERSONAL_REPORT_WRITER_ENABLED` 不动) | -| E5 | **正文是关系画像,不是技术报告**(产品 10-18 第二版,推翻本单第一版的「九节 + 传统配对参考」):按准则文件,把星曜语言翻译成关系经验语言。正文**不出现任何分数、Koota 名、星曜名、宫位、分盘、大运等术语**,也不出现「克 / 煞 / 凶 / 吉」「注定 / 必然 / 命中」。结构八节:一、关系基调(底层天气);二、情感节奏;三、沟通与理解;四、安全感与亲密;五、冲突与修复;六、生活节律与现实协作;七、长期方向;八、共同练习(两三条可操作的建议)。之后保留「可以一起聊聊」四问、折叠的「技术依据摘要」(E5b)与脚注。开头不放分数、不放结论档位 | -| E5b | **正文之后加一个默认折叠的「技术依据摘要」**(产品 10-18 第三版,取代第二版「完全不给用户看」):35 分、火星冲克、婚姻宫压力等技术层照算;摘要的内容与格式**由产品负责人另行提供**,到达前本单不得开工这一项(见让步顺序)。正文八节仍然不出现任何术语 | -| E5d | **印度占星依据要能给用户解读,引导到对话里**(产品 10-18):每节末尾一个「问问这一段的依据」入口,点开进入一个绑定这份合盘报告的对话,由对话用印度占星的语言解释这一节背后的依据(对话里可以用术语)。对话侧的能力另立任务书(Claude 写,编号待定),与本单、#79 一起上线;本单只做入口按钮与传给对话的参数,入口在对话侧合入前不显示 | +| E5 | **正文是关系画像**(产品 10-18 第三版,推翻第一版「九节 + 传统配对参考」):按准则文件把星曜语言翻译成关系经验语言。结构九节:一、关系基调(底层天气);二、情感节奏;三、沟通与理解;四、安全感与亲密;五、冲突与修复;六、生活节律与现实协作;七、长期方向;八、关系时间线(E6);九、共同练习(两三条可操作的建议)。之后是「对哪一段想再问清楚」入口(E5d)、「可以一起聊聊」四问、折叠的「技术依据摘要」(E5b)、脚注。开头不放分数、不放结论档位 | +| E5b | **正文之后加一个默认折叠的「技术依据摘要」**(产品 10-18 第三版,取代第二版「完全不给用户看」):35 分、火星冲克、婚姻宫压力等技术层照算;摘要的内容与格式**由产品负责人另行提供**,到达前本单不得开工这一项(见让步顺序)。结论段落仍然不出现任何术语 | +| E5e | **每节直接给出原因,不折叠**(产品 10-18,采纳占星师「要加分析逻辑」):第一到七节在结论段落之后紧跟一个「原因」块,两到三步,每步一行白话推理,下面一行灰字是盘面依据。结论段落与白话推理不出现术语;**灰字依据允许出现星曜、宫位、分盘、大运**,但每条都必须对得上证据包里的具体条目 | +| E5d | **依据可以去对话里问**(产品 10-18):不在每节挂按钮。报告末尾一个入口「对哪一段想再问清楚?」,列出第一到八节的标题,选一节进入一个绑定这份合盘报告的对话,由对话用印度占星的语言细讲。对话侧另立任务书(Claude 写),与本单、#79 一起上线;对话侧合入前这个入口不显示 | | E5c | 写法守五条:说「你们之间」不说「你 / 他是什么人」;说倾向不说必然;说需求不说缺点;给条件不给结论;保留双方主体性。可以写「一方……另一方……」或点名谁需要什么,但不得把一方写成问题源 | -| E6 | 不收集两人现在的关系阶段与经历。「长期方向」**写大致阶段,不提大运**(产品 10-18):如「明年下半年起,两人都更愿意把关系放到优先位置」;不说「某年结婚 / 领证 / 分开」,不出现大运、行运等术语 | +| E6 | **关系时间线**(产品 10-18,采纳占星师「要加入大运:这段关系在哪段时间会发生什么」,推翻同日「只写大致阶段、不提大运」):取两人接下来约五年的 Vimshottari 大运 / 子运分界,合并成三到五段(短于 6 个月的段并入相邻段)。每段:起止年月、阶段名(如「靠近、了解」「两人同步,适合确认」「现实考验」)、一段关系语言的描述、一行灰字依据(两人各自的大运 / 子运与起止、相关行运)。按上游规则,两人时间重叠本身不算共同事件:每段写成「两人各自走到什么阶段 → 这段关系在这期间会是什么样子」,不写「某年结婚 / 领证 / 分开」。不收集两人现在的关系阶段与经历 | | E7 | 上游的发版前检查(`pre_work_check`)、全网资料核验(MEVG)、书库检索是写稿代理的开发流程,**不进产品运行时**;报告脚注照常写「计算层归纳,不是定论」 | | E8 | 缺的 5 个模块全部补上(产品 10-18):`TASK-full-reading-module-parity-20261018.md`,**必须在本单开工前合入** | @@ -49,17 +50,18 @@ → 预留 synastry.full → 建报告行 + 任务 → worker:取两人出生资料 → Python POST /api/synastry_full_dossier(#79 已做):两次 full-reading → 上游证据包 + 两个 profile 的 marriage_match - → 八节中文:每节一次模型调用,只喂这一节对应的证据(映射见下表)与公共上下文,并发 ≤ 3 + → 时间线分段(确定性:两人大运 / 子运分界合并成三到五段,依据行由程序生成) + → 九节中文:每节一次模型调用,只喂这一节对应的证据(映射见下表)与公共上下文,并发 ≤ 3 → 中文质检(Python,本单自己的关系语言质检) 不过:只重写不过的节,最多 1 轮,把失败原因附进提示 仍不过:任务失败、释放预留 - → 存:中文八节 Markdown、每节的私有依据(claims)、证据包快照、质检回执 + → 存:中文九节(含原因与依据行)、时间线分段、证据包快照、质检回执 → 结算 synastry.full 阅读页切到英文(第一次) - → POST /api/reports/:id/english → 任务(不扣点)→ 八节英文 + 英文质检 → 存 + → POST /api/reports/:id/english → 任务(不扣点)→ 九节英文 + 英文质检 → 存 ``` -### 八节与证据映射 +### 九节与证据映射 | 节 | 英文标题 | 喂给模型的证据(上游证据包字段) | | --- | --- | --- | @@ -69,27 +71,28 @@ | 四、安全感与亲密 | Safety and Intimacy | `attraction_and_closeness` + `mutual_affection_activation`(两个方向都要写:什么让对方感到被重视、什么让对方退缩) | | 五、冲突与修复 | Conflict and Repair | `communication_conflict_and_repair`(冲突与修复部分)、`can_it_stay_steady` 的修复部分 | | 六、生活节律与现实协作 | Daily Life and Practical Partnership | `shared_life_gains_and_pressures` | -| 七、长期方向 | Long-term Direction | `relationship_progression`、`can_it_stay_steady`(D9 双人互动已执行时必须用上,但正文不提 D9)、`relationship_weather` + `parallel_timing_context` + `event_resonance_gate`(只换算成大致阶段) | -| 八、共同练习 | Practices to Share | 前七节的依据;每条建议必须能回指一条具体依据 | +| 七、长期方向 | Long-term Direction | `relationship_progression`、`can_it_stay_steady`(D9 双人互动已执行时必须用上,结论段落不提 D9,依据行可以提) | +| 八、关系时间线 | Relationship Timeline | 程序分好的三到五段(两人各自的大运 / 子运、起止)+ `parallel_timing_context`、`event_resonance_gate`;模型只写每段的阶段名和描述,依据行由程序生成 | +| 九、共同练习 | Practices to Share | 前八节的依据;每条建议必须能回指一条具体依据 | -`marriage_match`(35 分、火星冲克、婚姻宫压力)作为背景放进第二、四、五、六节的输入,只能被翻译成关系语言(例如「压力下一个追、一个退」),不得以分数或名称出现。 +`marriage_match`(35 分、火星冲克、婚姻宫压力)作为背景放进第二、四、五、六节的输入;结论与白话推理里只能翻译成关系语言(例如「压力下一个追、一个退」),依据行可以写名称,但不写分数。 ### 模型提示(新文件,建议 `frontend/src/mastra/synastry-report.ts`) - 系统提示以准则文件为主体(原文要点全部进提示,含五条写法与示例);上游 `chinese-synastry-writing-contract.md`、`customer-report-shape.md` 只取「证据怎么用」的部分:每个判断要有两条同向依据、冲突要降级、时间要有条件、补充方法(宿曜、西占、问卦)不得点名。上游要求在正文里写术语、写「七宫主落……」句式、点名 D9 的部分**不采用**。英文提示同理,以准则文件为主体,参考 `english-synastry-writing-contract.md` 的证据部分。 - 每节输入:两人称呼(档案里的称呼,不给出生日期、出生地)、这一节的标题与要求、上表对应的证据。 -- 每节输出 JSON:`{ text, claims: [{ sentence, evidence, label }] }`。`evidence` 指向这一节输入里的具体条目,`label` 取上游六个证据标签之一。**claims 只存不显示**:这是「技术是底稿」的落地,验收和以后复核靠它。 +- 第一到七节输出 JSON:`{ text, reasons: [{ plain, basis, evidence, label }] }`,`reasons` 两到三条:`plain` 是白话推理(不含术语),`basis` 是给用户看的灰字依据(可含术语),`evidence` 指向这一节输入里的具体条目,`label` 取上游六个证据标签之一(只存不显示)。第八节输出 `{ segments: [{ id, phase, text }] }`(`id` 对应程序分好的段);第九节输出 `{ items: [{ text, evidence }] }`。 ### 中文 / 英文质检(本单自己的,`scripts/synastry_full_reader_gate.py`) 上游校验器(`validate_bilingual_synastry_delivery.py`)原样搬入不改,但它的读者规则与准则冲突(要求正文出现 D9、要求首句含特定靠近感词),所以**不用它判正文**;只复用它的 `PRIVATE_EVIDENCE_TERMS`、`SUPPLEMENTARY_METHOD_TERMS` 两张表。本单自己的质检,中英各一套,逐条: -1. 八个标题齐全、顺序对;每节中文至少 120 字(英文 80 词),全文中文至少 1800 字(英文 1100 词)。 -2. **术语禁表**(中文):行星名(太阳、月亮、水星、金星、火星、木星、土星、罗睺、计都)、「宫」、星座名、星宿、上升、分盘 / 九分盘 / 婚姻分盘、D1 / D9 / D 加数字、大运、小运、行运、Dasha、Koota、Kuja、火星冲克、Nadi、Yoni、Varna、Ashtakoota、Papasamya、UL、DK、「数字 + 分」、满分。英文对应一套(planet names、house、sign names、nakshatra、ascendant、Navamsa、D9、dasha、transit、koota、points/score 等)。 +1. 九个标题齐全、顺序对;第一到七节结论段落中文至少 120 字(英文 80 词),全文中文至少 1800 字(英文 1100 词);第一到七节每节有两到三条原因;时间线三到五段。 +2. **术语禁表**(只查结论段落、白话推理、时间线描述、共同练习;**灰字依据行不查**)(中文):行星名(太阳、月亮、水星、金星、火星、木星、土星、罗睺、计都)、「宫」、星座名、星宿、上升、分盘 / 九分盘 / 婚姻分盘、D1 / D9 / D 加数字、大运、小运、行运、Dasha、Koota、Kuja、火星冲克、Nadi、Yoni、Varna、Ashtakoota、Papasamya、UL、DK、「数字 + 分」、满分。英文对应一套(planet names、house、sign names、nakshatra、ascendant、Navamsa、D9、dasha、transit、koota、points/score 等)。 3. **判断禁表**:克、煞、凶、吉、注定、必然、命中、一定会、合不合、不合、相合、不适合、适合结婚、不宜、灵魂伴侣、宇宙安排、百分百、会不会在一起;「年份 / 月份 + 结婚 / 领证 / 分手 / 离婚」。 4. 上游私有词表、补充方法名表一个都不能出现。 5. 首句不得是分析腔(「这段关系的核心不是……」「不是有没有……」)。 -6. 每节至少一条 claim,且 `evidence` 能在这一节的输入里找到;第八节每条建议都要有 claim。 +6. 每条原因的 `evidence` 能在这一节的输入里找到,`basis` 里出现的星曜 / 宫位 / 大运与该条证据一致(逐字段比对,不一致即失败);第九节每条建议都有 `evidence`;时间线依据行由程序生成,模型不得改写。 不过的节带着失败原因重写一次,仍不过则任务失败、释放预留。 @@ -97,7 +100,7 @@ 1. `scripts/jyotish_api_server.py` 不增长(类方法数、`__new__` 伪造点、行数护栏);新接口在独立模块,主文件只加注册行。`app/(app)/page.tsx` 的 `Home()` 状态数不增长。 2. 上游 `skills/jyotish-full-synastry-reading/` 的脚本与参考文件**原样搬入**,`diff` 为空;不得为了让我们这边的测试通过去改上游文件。 -3. 报告正文八节不得出现任何分数、Koota、星曜、宫位、分盘、大运等术语,以及质检第 3 条的判断禁表、补充方法名、私有证据词。质检必须拦住这些。术语只允许出现在默认折叠的「技术依据摘要」和对话里。 +3. 结论段落、白话推理、时间线描述、共同练习不得出现任何分数、Koota、星曜、宫位、分盘、大运等术语;判断禁表、补充方法名、私有证据词全文都不得出现。术语只允许出现在灰字依据行、折叠的「技术依据摘要」和对话里。质检必须拦住这些。 4. 模型提示不得带出生日期、时间、出生地和经纬度;证据包快照只存在报告自己的行里,随报告删除;日志不打证据包和正文。 5. 扣点:任务失败、超时、质检两轮不过、用户中途删报告 → 释放不扣;读已有报告不预留;英文版不扣点。模型 token 用量照常记账(`kind: "synastry_full"`),进成本统计。 6. 动表的轮次真跑 `npm run test:db`;只加列、加枚举值、加键,不删旧列(AGENTS §7.6)。 @@ -108,13 +111,13 @@ | # | 内容 | 验收标准 | | --- | --- | --- | -| T1 | **数据**:`personal_reports.report_type` 加 `synastry_full`;加两人引用列(另一人 `partner_chart_profile_id` 或等价字段,本人用约定值)与 `synastry_report_id`(指向 #79 的 `synastry_reports` 行,带两人出生资料指纹与 `rules_version`)。证据包快照、中文八节与 claims、质检回执存进 `personal_report_sections`(与个人报告快照同一套)。zod、v2 schema、列表标签同步 | `test:db`:同一对人同指纹第二次找到已有报告;任一人改资料后找不到;删任一人后报告与合盘行一并消失 | +| T1 | **数据**:`personal_reports.report_type` 加 `synastry_full`;加两人引用列(另一人 `partner_chart_profile_id` 或等价字段,本人用约定值)与 `synastry_report_id`(指向 #79 的 `synastry_reports` 行,带两人出生资料指纹与 `rules_version`)。证据包快照、中文九节(含原因与依据行)、质检回执存进 `personal_report_sections`(与个人报告快照同一套)。zod、v2 schema、列表标签同步 | `test:db`:同一对人同指纹第二次找到已有报告;任一人改资料后找不到;删任一人后报告与合盘行一并消失 | | T2 | **计费键 `synastry.full`**:一个迁移把键加进实证 5 列出的所有 SQL CHECK 与函数;TS 侧同步所有枚举与后台标签(「完整合盘报告」);不写价格 | `test:db`:未发布价格时创建报告返回与个人报告同样的「暂未定价」错误;发布后预留、结算、释放三条路径都绿;后台定价页能看到新键 | | T3 | **创建入口**:`POST /api/reports` 接受 `reportType: "synastry_full"` + 两个人物 id(同一人 400,不属于本人的 id 拒绝);命中已有报告直接返回不预留;`compatibility` 开关与 `report_center` 开关都要开;沿用每日上限、限流、同时只能生成一份 | 路由测试覆盖以上每条 | | T4 | **worker 分支**:按上面的链路实现;阶段进度 `loading_context` → `computing_charts` → `writing_report` → `checking_report` → `persisting_report`;Python 429 走现有 `upstream_busy` 重试;每节模型调用有超时,单节失败只重试该节 | 单测:一节失败只重写这一节;质检两轮不过任务失败并释放预留;删报告释放预留 | -| T5 | **质检** `scripts/synastry_full_reader_gate.py`(中英两套规则)+ 薄注册接口(或 worker 直接调 CLI,二选一写进 PROGRESS) | pytest:准则文件第四节的示例(补够字数的版本)通过;分别塞进「金星」「七宫」「22 分」「注定」「2027 年结婚」「宿曜」「execution_receipt」、首句改成「这段关系的核心不是……」、删掉一节、去掉某节 claims,各失败一次;英文同理 | -| T6 | **英文版按需生成**:`POST /api/reports/:id/english` 建任务(不扣点);同一报告只会有一个英文任务;失败可重试 | 路由与 worker 测试;英文提示里不出现中文稿内容(断言提示文本不含中文八节正文) | -| T7 | **阅读页**:合盘报告标题「A × B · 婚恋合盘」;八节正文(每节末尾「问问这一段的依据」入口,E5d,对话侧未合入时隐藏)→「可以一起聊聊」四问 →「技术依据摘要」(默认折叠,内容按产品提供的格式)→ 脚注(「合盘描述的是互动的质地,走不走、怎么走,仍然是你们两个人的选择」)。切英文时若还没生成,原地显示等待面板(一次揭幕),生成好整份替换 | 渲染测试用名人 golden;**正文八节**过一遍质检第 2、3 条禁表为空(折叠摘要不在此列);摘要默认收起;手机 390 px 无横向滚动;`next build` 后 `/` 仍 Static,首屏 gzip ±2% | +| T5 | **质检** `scripts/synastry_full_reader_gate.py`(中英两套规则)+ 薄注册接口(或 worker 直接调 CLI,二选一写进 PROGRESS) | pytest:准则文件第四节的示例(补够字数、补上原因的版本)通过;依据行写错一处宫位(与证据不符)失败一次;分别塞进「金星」「七宫」「22 分」「注定」「2027 年结婚」「宿曜」「execution_receipt」、首句改成「这段关系的核心不是……」、删掉一节、去掉某节 claims,各失败一次;英文同理 | +| T6 | **英文版按需生成**:`POST /api/reports/:id/english` 建任务(不扣点);同一报告只会有一个英文任务;失败可重试 | 路由与 worker 测试;英文提示里不出现中文稿内容(断言提示文本不含中文九节正文) | +| T7 | **阅读页**:合盘报告标题「A × B · 婚恋合盘」;九节正文(第一到七节结论后直接显示「原因」块,不折叠;时间线每段直接显示依据行)→「对哪一段想再问清楚?」入口(E5d,对话侧未合入时隐藏)→「可以一起聊聊」四问 →「技术依据摘要」(默认折叠,内容按产品提供的格式)→ 脚注(「合盘描述的是互动的质地,走不走、怎么走,仍然是你们两个人的选择」)。切英文时若还没生成,原地显示等待面板(一次揭幕),生成好整份替换 | 渲染测试用名人 golden;结论段落过一遍质检第 2、3 条禁表为空;原因块不可折叠;摘要默认收起;手机 390 px 无横向滚动;`next build` 后 `/` 仍 Static,首屏 gzip ±2% | | T8 | **婚恋合盘页(从 #79 移来)与入口**:侧栏「婚恋合盘」;选人页(两个自定义下拉,底行「+ 新增星盘」复用星盘档案新建表;居中按钮,按钮下点数说明读 `synastry.full` 定价);「开始合盘」创建报告并跳到阅读页;「之前的合盘」列出合盘报告;档案页「和我合盘」改跳本页并预选两人;报告中心列表里合盘报告的卡片写「A × B 婚恋合盘」;删人确认句加「K 份合盘」 | 渲染与路由测试;20 人时下拉可滚动 | | T9 | **上游测试搬入**:五个测试文件 + #79 已有的 `test_marriage_match_product.py`;`aspects.py` 同步上游 `bde5d615` 版本(方向角与速度判相位),跑全量 pytest 与基线逐条比对(相位值变了,报告类测试可能受影响,逐条写原因);读 `jyotish-app/main.js` 那条与调 `_compute_marriage_match` 那条改写为我们的等价断言(三栏说明) | 上游 49 条全过或有三栏说明;全量 pytest 无新增失败 | | T10 | **记录**:BUG-1373(#79 登记为 investigating,本单修复后改 resolved);DESIGN.md(选人页、阅读页、英文按需生成的等待态)、VOICE.md(引用准则文件;报告禁表、标题格式)、CHANGELOG、PROGRESS(与上游的差异:质检包装层、两条改写的测试)、`docs/testing/synastry-full-report-20261018.md` 真人清单(生成一份、再次打开不扣点、切英文、删人连带删除、失败退点、手机宽) | 文档齐 |