From 51f3f47bbeaf72373c787eee6c0e78b99652fc3a Mon Sep 17 00:00:00 2001 From: Jesse_Chen Date: Fri, 2 Oct 2026 13:01:55 +0800 Subject: [PATCH] =?UTF-8?q?docs:=20functional=20v2=20wrap-up=20=E2=80=94?= =?UTF-8?q?=20BUG-1158=20resolved,=20BUG-1180=EF=BD=9E1182,=20ERR-114,=20b?= =?UTF-8?q?acktest=20round=205,=20progress?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 (1M context) Claude-Session: https://claude.ai/code/session_01N4f2nya58RoRu4yEmJgRGE --- CHANGELOG.md | 9 ++ docs/BUG_HISTORY.md | 55 +++++++- docs/research/pre_work_error_ledger.md | 6 + ...consult-upstream-functional-v2-20261002.md | 127 ++++++++++++++++++ docs/tasks/README.md | 1 + .../consult-affliction-backtest-20261001.md | 73 +++++++++- 6 files changed, 267 insertions(+), 4 deletions(-) create mode 100644 docs/tasks/PROGRESS-consult-upstream-functional-v2-20261002.md diff --git a/CHANGELOG.md b/CHANGELOG.md index d9fa80ce..f6a86b0c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,14 @@ # 印度占星 Skill 更新日志 +## 2026-10-02 — 功能吉凶改按《BPHS》第 34 章总则加逐上升例外;生时校正算法升到第 10 版;父母题不再把受冲的母亲写成「在管、在安排」 + +- 「哪些星对你这个上升算吉、算凶」改用《BPHS》第 34 章的总则加逐上升的明文例外(例:天蝎上升的太阳改为吉、火星改为中性;只管 12 宫的星不再一律算凶)。报告、数据卡、普通对话、合盘、生时校正里的功能吉 / 凶星一栏随之变化;每颗星注明依据(总则或该上升的例外)(BUG-1158)。 +- 生时校正:功能吉凶进入打分,同样的经历会算出略有不同的分数,算法版本因此从第 9 版升到第 10 版。以前的校正记录照常从历史里打开、按原来的结果只读显示,并给「重新比较」;新比较按第 10 版算,跨午夜的候选日期照旧保留(BUG-1181)。 +- 五大人格格局里,火星、土星成格时不再把自己算成「凶星同宫」,Ruchaka、Shasha 能正常认出(BUG-1180)。 +- 普通对话:父母题里受冲多的那一方,不再用宫主落在哪、宫里有吉星去写「她一直在管你、在安排你」,行动建议也不再默认你能给他打电话;全篇只请你说一次实际情况(BUG-1182)。事业题不再把事业宫主落 6、8、12 宫翻成「不在台前、往深处做」(BUG-1176)。 +- 名人回测第五轮:父母题严重冲突 0(三轮来一直是 3)、禁句 0、每份只问一次;事业仍有 5 / 18 把名人写成「不靠曝光」一类,未达通过线。 +- Skill 版本不变;数据库新增一条只改函数体的迁移(`20261002010000`,日期窗合同按算法代数判断),不改表结构。 + ## 2026-10-02 — 事业题不猜你做哪一行,先问你;开场不再替你下结论;盘上成立的大格局以「传统格局,只作参考」列出 - 事业题只讲盘上哪里有力量、哪里有阻力、什么时候推进;不再替你断定做哪一行、是台前还是幕后,段末问你一句实际在做什么。你说了自己的工作(比如「我是演员」),下一轮按这份工作去讲助力、阻力和时间,不会说「盘早就显示你会做这行」(BUG-1176)。 diff --git a/docs/BUG_HISTORY.md b/docs/BUG_HISTORY.md index f34f79bf..9dcf8488 100644 --- a/docs/BUG_HISTORY.md +++ b/docs/BUG_HISTORY.md @@ -15577,7 +15577,7 @@ ## BUG-1158 | 功能吉凶层把命主一律标成 yogakaraka,10 宫主太阳在天蝎上升标中性 -- 状态:investigating(部分修复:yogakaraka 定义已改并合入 `codex/consult-career-yoga-functional-20261002`;吉凶分组仍是 v1 公式,BPHS 第 34 章全表待占星顾问) +- 状态:resolved(2026-10-02 产品采纳上游功能吉凶 profile v2,见本条末「决策日志(第三次)」;生时校正算法身份随之升到 scoring-10,见 BUG-1181) - 首次发现 / 最近更新:2026-10-01 / 2026-10-02 - 影响面:`scripts/functional_benefics.py` `derive_functional_benefic_malefic`(`SOURCE = strict_functional_benefic_malefic_v1`,2026-06-28 `09817b96` 引入);所有读功能吉凶的地方(数据卡、Technique Audit、报告)。 - 现象:泰勒盘(天蝎上升)火星(1、6 宫主)标 yogakaraka、太阳(10 宫主)标中性;同一规则下奥巴马(摩羯上升)土星(1、2 宫主)、乔布斯(处女上升)水星(1、10 宫主)也是 yogakaraka。 @@ -15590,7 +15590,9 @@ - 复发自:无 - 决策日志(2026-10-02):产品 D1(`TASK-consult-career-yoga-functional-20261002`)推翻 `strict_functional_benefic_malefic_v1`:yogakaraka 只认同时主角宫(4、7、10)与三方宫(5、9)的单颗星;12 个上升按 BPHS 第 34 章逐上升写死。实现 `1d039429`(分支 `codex/consult-career-yoga-functional-t1-20261002`):`BPHS_CH34_TABLE` + `SOURCE = bphs_ch34_table_v1`,每格带出处(公开英文译本 + 梵文逐词对照,第 13、19–44 颂),14 个格保留公式值标 `formula_fallback`,12 上升全格由 `tests/test_functional_benefics_bphs_table.py` 锁住。生时校正 v5 77 例评测(硬红线 3):±10 引擎头名 0.1818 → 0.1688、六题回放头名 0.6364 → 0.5974、线上区间回放头名 0.6753 → 0.6364,±30 六题回放 0.4935 → 0.4675,覆盖全部不变,±60 上升;超过 1 个百分点,按红线停在 T1,未合入。逐格旧值 / 新值 / 出处与歧义清单见 `docs/tasks/PROGRESS-consult-career-yoga-functional-20261002.md`。 - 决策日志(2026-10-02 第二次):产品看了 T1 回归数字后决定只合入 yogakaraka 一条:yogakaraka 须同时主 4/7/10 之一与 5/9 之一,1 宫不计入此判定,吉 / 凶 / 中性分组不变(命主仍为吉)。实现 `ffafa28b`,`SOURCE = strict_functional_benefic_malefic_v2`;变化:白羊火星、金牛 / 天秤金星、双子 / 处女水星、天蝎火星、射手 / 双鱼木星、摩羯 / 水瓶土星不再是 yogakaraka,分组逐格与 v1 相同。生时校正 v5 77 例改前 / 改后(`81f6e513` / `ffafa28b`)三档头名、覆盖、宽度逐项相同(±10 先验 0.1818、六题回放 0.6364、线上区间回放 0.6753,覆盖 0.987),未触发红线。验证:`tests/test_functional_yogakaraka_kendra_trikona.py`。BPHS 全表与 15 个待复核格见 T1 分支 `docs/research/bphs_ch34_functional_table_review_2026_10_02.md`(`c66c122a`)。另:协调方随后要求移植上游 `yinduzhanxing` `e9beae6b` 的功能吉凶文件,本会话的自动权限判定拒绝了从另一仓库原样拷入代码,未执行,需用户授权后再做。 -- 修复版本:部分:`codex/consult-career-yoga-functional-20261002` `ffafa28b`(yogakaraka);全表在未合入分支 `codex/consult-career-yoga-functional-t1-20261002` +- 决策日志(2026-10-02 第三次,产品授权):改为采用上游 Skill 仓同日的功能吉凶 profile v2(`bphs_ch34_general_with_sign_exceptions_v2`):BPHS 第 34 章总则(三方宫主吉;3/6/11 宫主与有条件的 8 宫主凶;只管 12 宫的星是条件性的,不自动判凶;日月管 8 宫按例外;只管角宫或只管 2 宫的星判中性)+ 逐上升明文例外(`ROLE_OVERRIDES`:白羊火星中性、金牛金星凶 / 太阳吉、双子木星凶、处女木星凶、天秤金星中性 / 火星凶、天蝎火星中性 / 太阳吉、射手木星与水星中性、摩羯月亮凶、水瓶火星凶 / 水星中性、双鱼水星凶);yogakaraka 维持严格定义(同时管 4/7/10 之一与 5/9 之一,1 宫不计两次)。每颗星带 `role_basis`,`rule_reference` 指向 `references/functional-role-profile.md`。瑜伽引擎 `yoga_engine.py` 的 `functional_malefics()` / `functional_benefics()` 改读同一函数(第一次决策日志第 9 条「两套口径」随之消除)。本条推翻第二次决策日志里的「吉凶分组不变」与 T1 分支的逐格对照表方案;T1 分支 `codex/consult-career-yoga-functional-t1-20261002` 不再合入。生时校正 v5 77 例(PM 在 `57782aea` 前后同法实测):引擎先验头名 ±10/30/60 0.1818/0.0779/0.0649 → 0.1818/0.0909/0.0779;六题回放 0.6364/0.4935/0.2597 → 0.6364/0.4935/0.3117;线上区间回放 0.6753/0.4935/0.3247 → 0.6623/0.5584/0.4026;覆盖 0.987/0.987/0.974 → 0.987/0.987/0.987。五格上升、一格(区间回放 ±10)−1.3 pp(一例),产品接受。 +- 验证(第三次):`tests/test_functional_yogakaraka_kendra_trikona.py`(`57782aea` 改写);两份普通对话 golden 用 capture 脚本重生成(`PYTHONHASHSEED=0 JYOTISH_API_CHART_CACHE_TTL_SECONDS=0`,两次逐字节相同,只有功能吉凶字段变化);`frontend/tests/consult-upstream-functional-v2-20261002.test.ts` 锁 golden 的 profile 与天蝎、处女两个上升的分组;`consult-card-affliction-data-20261001.test.ts` 乔布斯太阳 `malefic` → `neutral`(三栏在测试注释)。Python 全量失败名单与基线逐条相同。 +- 修复版本:`57782aea`(移植)+ `codex/consult-upstream-functional-v2-20261002`(golden、算法身份、测试;未推送)。早先部分修复 `ffafa28b` 已被取代。 ## BUG-1159 | 数据卡瑜伽清单是规则候选全集,大格局(Sasa、落陷取消、Gajakesari)进不来 @@ -15702,6 +15704,7 @@ - 相关记录:BUG-1164、BUG-1070 - 复发自:无 - 修复版本:`codex/consult-no-presupposition-backtest-20261001`(已部署 staging `f361365a`,2026-10-02 health 核对、/api/account 401) +- 复发(2026-10-02):同一类「示例里的读法被照抄」在父母题复发——是非题与父母题 Good 例保留的「4 宫主落 10 宫 → 心力放在你的前途上 / 离你近、上心」被梦露盘(4 宫主正落 10 宫、母亲受冲两个以上)照抄;另有一处把逆行写成「拖出来」。见 BUG-1182。 ## BUG-1166 | 用户纠正盘上判断时,追问轮没有「先认下、不辩护」的写法 @@ -15827,7 +15830,8 @@ - 相关记录:BUG-1168、BUG-1162、BUG-1167 - 复发自:无 - 决策日志(2026-10-02 第二次):第三轮回测行业对 3/18 后,产品决定事业题不猜行业:删掉「行业看星的本性」「公众 / 幕后要有依据」两行与「先讲一生事业形态:公众型还是幕后型」,改为 `CAREER_FIELD_ASK_RULE`(只讲力量、阻力、时间;不断定行业与公众 / 幕后;不写人人适用的话;事业段末问一句实际做什么,算全篇唯一请求),定义在 `consultation-thinking-plan.ts`、事业清单引用;追问轮加 `CAREER_FOLLOW_UP_RULE`(用户说了工作就按工作读,不编依据)。AL 一行去掉「落 10 宫 = 公众形象就是事业」。提交 `6a02e5e9`。第四轮回测:请问一句 18/18、事业追问 6/6 按真实职业读;但 9/18 仍在主线里写「不是站台式 / 不在台面上 / 往深处做」,多由 A10、AL、太阳、10 宫主落 4/6/8/12 宫直接推出;严重冲突合计 12/72(≤ 5 未达)。 -- 修复版本:`codex/consult-career-yoga-functional-20261002`(文本层) +- 第五轮(2026-10-02,产品批准本轮修第四轮残留):`CAREER_FIELD_ASK_RULE` 加一句「A10、AL、太阳、10 宫主落 4、6、8、12 宫只说这条线的阻力或代价(要经手、要绕路、来得晚),不翻成『不在台前』『不在台面上』『不靠曝光』『幕后』『不是站台式』『往深处做』,也不把落宫翻成行业(8 宫不等于研究、账目,12 宫不等于海外、幕后工作)」,仍只定义在 `consultation-thinking-plan.ts`;`frontend/tests/consult-upstream-functional-v2-20261002.test.ts` 锁句。第五轮回测:行业 / 类型与生平冲突 9/18 → 5/18(乔布斯 r2「靠一门本事坐实,不是靠一阵热闹」〔边界〕、泰勒 r1「不是靠人缘和曝光速成」、梦露 r1 / r2「不跟着曝光走」「经手别人的事…不是靠曝光」、布什 r2「靠能扛事,不是靠场面」),通过线 ≤ 1 未达;段末问一句 17/18(奥巴马 r1 只问了受冲那一句)。剩下 5 份里 4 份的推法是「10 宫主 / D10 落 6 宫或 8 宫 → 经手、担责 → 不靠曝光」,规则点了名的说法换成同义词(「不靠场面」「不是一阵热闹」)再出现。事业追问(足球运动员 / 演员 / 政治家 × 2)6/6 按真实职业读,泰勒、齐达内两份主动认下上一轮读偏。状态维持 investigating。 +- 修复版本:`codex/consult-career-yoga-functional-20261002`(文本层);第五轮规则 `codex/consult-upstream-functional-v2-20261002`(未推送) ## BUG-1177 | 开场「第一句就是结论」不受受冲规则约束,对照组被开场下了「距离感明显」一类结论 @@ -15873,3 +15877,48 @@ - 复发自:无 - 修复版本:`codex/rectification-post-adopt-verify-20261001`。 +## BUG-1180 | Pancha Mahapurusha 检测把火星、土星自己算作「凶星合相」,Ruchaka / Shasha 永远判失效 + +- 状态:resolved(修复随上游移植 `57782aea`,本轮补回归测试) +- 首次发现 / 最近更新:2026-10-02 / 2026-10-02 +- 影响面:`scripts/pancha_mahapurusha.py` `_has_malefic_aspect` / `detect_pancha_mahapurusha`;读它的 `scripts/jyotish_api_server.py` `_detect_yogas`(排盘自带瑜伽,只收 `is_valid` 的五大人格格局)与 `/api/pancha_mahapurusha`(`assess_pmc_strength`)。 +- 现象:火星在白羊 / 天蝎 / 摩羯坐角宫(Ruchaka)、土星在天秤 / 摩羯 / 水瓶坐角宫(Shasha),即使同宫没有任何别的凶星,也被标「受凶星合相: Mars / Saturn — Yoga部分失效」,`is_valid = False`,排盘自带瑜伽里永远不出现这两个格局。 +- 触发条件:任何 Ruchaka / Shasha 候选。 +- 根因(已核实代码):`_has_malefic_aspect(planet_sign, all_planets)` 用 `pn == planet_sign` 跳过自身——把行星名和星座名比较,永远不等;火星、土星本身在 `NATURAL_MALEFICS` 里,于是自己与自己同宫就算一次「凶星合相」。木星、水星、金星不是自然凶星,不受影响。 +- 修复:函数加 `planet` 参数,按 `pn == planet` 跳过本星(上游 `e9beae6b` 原样移植,`57782aea`)。别的凶星同宫仍判失效。 +- 验证:新增 `tests/test_pancha_mahapurusha_self_conjunction.py`(火星独坐白羊 1 宫 → Ruchaka 成立、无失效原因;土星天秤 10 宫 → Shasha 成立;同宫另有土星仍失效且只点名土星;木星与火星同宫仍失效)。用 `57782aea^` 的旧文件跑同一输入:Ruchaka `is_valid = False`(红),新文件为真(绿)。两份普通对话 golden 重生成后瑜伽字段无变化(九位名人没有触发这两个格局的独坐配置)。 +- 防复发:回归测试锁「自身不算合相」;跳过自身必须按行星名比较。 +- 相关记录:BUG-1159、BUG-1174、BUG-1175(传统格局栏读的是规则引擎结果,不经本模块)。 +- 复发自:无 +- 修复版本:`57782aea`;测试 `codex/consult-upstream-functional-v2-20261002`(未推送)。 + +## BUG-1181 | 功能吉凶 v2 改了生时校正打分,算法身份没跟着升:旧分数会被当作当前结果复用;「日期窗合同」写死只认 scoring-9 + +- 状态:resolved(代码与测试;部署、迁移与真机为待办) +- 首次发现 / 最近更新:2026-10-02 / 2026-10-02 +- 影响面:`scripts/rectification/scoring_service.py` `ALGORITHM_VERSION`;前端 `v9EngineVersion()` 缺省串、`engine-client.ts`(score / diagnostics 的 `dated` 判定)、`tool-service.ts`(候选行解析、legacy 段选择判定)、`score-persist.ts`(是否先补日期窗)、`rectification-candidate-result.ts`;数据库函数 `validate_dated_rectification_candidate`。 +- 现象:`57782aea` 之后 `tests/test_rectification_engine_memoization.py` 8 项失败(同一输入候选 12:00 的分数 8.6274 → 8.4977)。功能吉凶分组经 `*_functional_benefic_auxiliary` / `*_functional_malefic_auxiliary` 规则进入事件矩阵,同输入出不同分;而 `ALGORITHM_VERSION` 仍是 scoring-9,`cachedEngineScoreIsReusable` 按算法身份 + 证据指纹判断能否复用,证据未变的历史 Case 会把旧分组算出的分数当作当前结果。 +- 触发条件:任何功能吉凶分组变化的上升(v2 改了 10 个上升的至少一颗星)且证据未变的校正 Case。 +- 根因:一,先例规定「打分语义变化必须 bump `ALGORITHM_VERSION`」(`TASK-rectification-engine-convergence-20260901` 硬红线 3;跨午夜修复 7→8→9 同此办理,BUG-981~985),功能吉凶移植时未同步。二,前端五处、数据库一处用 `=== "rectification-v5-matrix-scoring-9"` 判断「这是带日期窗合同的结果」:直接升到 scoring-10,新结果会被当成旧的同日结果解析(跨午夜候选丢日期),数据库的防伪守卫也会对 scoring-10 失效。 +- 决策记录:按先例升到 `rectification-v5-matrix-scoring-10`(同输入分数变了就升,策略版本 `rectification-candidate-policy-v3` 与输入合同 v5 不变;不改 Skill、不重标历史结果)。「日期窗合同」改为按代数判断(≥ 9),避免下一次升版再踩同一处。 +- 修复:Python 常量升到 scoring-10;前端新增 `isDatedScoringAlgorithmVersion`(`core/candidate-window.ts`,正则取代数 ≥ 9),五处字面量判断全部改用它,`v9EngineVersion()` 缺省串同步;迁移 `20261002010000_rectification_dated_algorithm_generation.sql` 只重建 `validate_dated_rectification_candidate` 函数体,守卫改为 `~ '^rectification-v5-matrix-scoring-(9|[1-9][0-9]+)$'`,其余逐字节与 `20260920020000` 相同(不动表、列、权限、历史行)。按 ERR-110 重新冻结校正研究记录(标签 `functional_v2_2026_10_02`):`sealed_holdout_rerun.py` / `reported_offset_sweep.py` 指向新记录,`PRODUCTION_FILES` 补 `scripts/functional_benefics.py`(ERR-114:它不在冻结身份里,`57782aea` 改分数时门禁没红),`references/rectification_sealed_holdout.v1.json` 的 current / previous 照 09-29 先例轮换,旧记录逐字节保留。影子 20 例与 09-29 逐条相同(指标不变);原生 reported-offset 900 例 230 例变化,窗口内平均头名不变(±15/30/60:0.0636/0.06/0.05),交付覆盖 0.9864/0.99/1.0 → 0.9955/0.9967/1.0。 +- 验证:记忆化 golden 按文件自带 `write_golden` 新写 `tests/golden/rectification_engine_memoization_v2.json`(scoring-10,源码 `57782aea`),v1(scoring-8)保持逐字节不变并以 sha256 钉住,新增测试证明当前分数已偏离 v1;文件 22 项全过。前端:新增 `rectification-dated-algorithm-generation-20261002.test.ts`(代数判定 9/10/11/100 真、8/09/空/非字符串假;源码里不再有 `=== "…scoring-N"`;SQL 守卫;scoring-9 历史结果在 scoring-10 下打开为只读并给「重新比较」、候选仍带日期);真实引擎新生成 scoring-10 跨午夜 golden(`midnight_date_anchor_regression.py --golden`,同机 A/B 3×7 字段逐位相等)并让跨午夜贯穿测试对 scoring-9 / scoring-10 两份 golden 都跑;把判定临时改回字面量,scoring-10 那一份即红。数据库:本机 PG17 + docker 替身跑 `database-adopted-birth-date`(scoring-10 / 11 去掉日期合同被拒、scoring-8 仍按旧同日结果返回空);去掉迁移文件即红 2 项、恢复后绿。`npm run test:db` 全量 80 项:基线 `57782aea` 与本分支都是 74 过 / 6 败,失败名单逐条相同(替身不支持的 pg_dump、部署脚本等)。重新冻结后 `test_rectification_validation_integrity_gate.py` 等 8 项转绿,`rectification-confirmation-gate.test.ts` 改读新报告(三栏在注释)。历史打开:`rectification-*.test.ts` 1,872 项(含 BUG-621 历史打开、BUG-984 只读与重新比较)0 失败。 +- 防复发:打分语义变化必须升 `ALGORITHM_VERSION`,记忆化 golden 新增版本文件、旧文件冻结,校正研究记录按 ERR-110 重新冻结;`test_functional_roles_are_part_of_the_production_identity` 锁功能吉凶文件在冻结身份里;「是否带日期窗合同」只能用 `isDatedScoringAlgorithmVersion` / SQL 正则判断,源码扫描测试拦字面量比较。 +- 待办:部署前核实 staging / 生产环境没有设置 `RECTIFICATION_ENGINE_VERSION` / `RECTIFICATION_ALGORITHM_VERSION` 锁旧身份(`deploy/`、`.gitea/` 未设);迁移在部署前自动应用,对当前已部署代码向后兼容(只放宽到 ≥ 9 的守卫)。 +- 相关记录:BUG-1158、BUG-621、BUG-733、BUG-981、BUG-982、BUG-983、BUG-984、BUG-985;错误台账 ERR-110、ERR-114。 +- 复发自:无(跨午夜那次升版同时引入了「日期窗合同」,当时只有 scoring-9 一个代,字面量判断没有暴露)。 +- 修复版本:`codex/consult-upstream-functional-v2-20261002`(未推送)。 + +## BUG-1182 | 第四轮回测残留:受冲两个以上的母亲被写成「在管、在安排、近」,逆行被写成「拖出来」,全篇两处请求 + +- 状态:resolved(文本层;第五轮回测父母严重冲突 3 → 0、禁句 1 → 0、两处请求 3 → 0) +- 首次发现 / 最近更新:2026-10-02 / 2026-10-02 +- 影响面:`frontend/src/lib/consultation-thinking-plan.ts` `AFFLICTION_RANGE_RULE`;`frontend/src/lib/consultation-condensed-checklist.ts` 通用读法第 5 行;`frontend/src/mastra/product-voice.ts` 不揣测一条、父母题与是非题 Good 例;`frontend/docs/VOICE.md`。 +- 现象:第二~四轮回测,梦露父母 ×2「把心力压在你的前途上,方式是安排、催」「妈妈这条有实际照顾的一层」、琵雅芙父母 ×1「她这条线的重心是管和安排」——三份都已写出受冲范围,又在同一段或「他们怎么对待我」一段把母亲写成在场、在管;行动写「给妈妈打电话」「挑一件事去问爸爸」。琵雅芙健康 r2 出现「8 宫那颗土星还是逆行的,意思也偏『拖出来的问题』」;三份答案全篇两处请求。 +- 根因(已核实):一,系统提示里有三处把「4 宫主落 10 宫」直接配上「母亲的注意力在你的前途上 / 离你近、上心」(不揣测一条、父母题 Good 例、是非题 Good 例),梦露盘 4 宫主正落 10 宫,模型照抄;BUG-1165 修示例时只去掉了「逆行」,这条读法留着。二,`AFFLICTION_RANGE_RULE` 只禁「有分量」「关系稳」这类安慰词,没有禁「拿宫主落宫、宫里的吉星去描写这个人在做什么」,也没有管行动建议。三,通用读法只写了「逆行不等于反复、打回来」,模型换成「拖出来」。四,`AFFLICTION_RANGE_RULE` 要求「这一段末尾」请用户说一句,和事业段末的那一问在同一篇里叠加。 +- 修复:`AFFLICTION_RANGE_RULE` 加「不拿宫主落哪一宫、宫里有吉星去描写这个人对你做什么(『在管』『在安排』『心思在你的前途上』『照顾是实的』都预设人在身边,宫主落宫和吉星只说这条线另有支撑的迹象),这一方的行动建议也不写给他打电话、去问他」与「问过之后别的段落不再另问」;三处示例括号改为「(母亲这条线没有受冲;4 宫主落 10 宫)」/「盘上有证据、且这条线没有受冲时可以写……」;通用读法第 5 行改为「逆行不等于『反复、打回来』,也不等于『拖得久、拖出来』,推论里不拿逆行当理由(依据里可以列)」。都是单一定义处的文字,不加任何对模型输出的正则后处理。 +- 验证:`frontend/tests/consult-upstream-functional-v2-20261002.test.ts` 锁四句;改动的既有断言(`consult-no-presupposition-20261001.test.ts` 的 `AFFLICTION_RANGE_TEXT` 与是非题例、`consultation-voice-contract.test.ts` 两处)三栏写在测试注释。第五轮回测:父母 18 份严重冲突 0(梦露、琵雅芙四份母亲段只写「迹象 + 范围 + 另有支撑的迹象」,「他们怎么对待我」写「盘上看不出谁具体怎么对你」);禁句 0;72 份每份恰好一处请求。残留:琵雅芙父母 r2 行动「挑一件他们习惯替你做决定的小事」仍预设父母在场(记通过·弱)。 +- 防复发:示例括号不得放「宫位 → 人物行为」的对应;受冲规则覆盖开场、正文、「他们怎么对待我」与行动四处;名人回测父母项。 +- 相关记录:BUG-1164、BUG-1165、BUG-1177、BUG-1176。 +- 复发自:BUG-1165(示例读法被照抄)。BUG-1165 的合同测试只白名单了「逆行」一词,没有检查示例括号里「宫位 → 行为」的读法,所以未拦住。 +- 修复版本:`codex/consult-upstream-functional-v2-20261002`(未推送)。 diff --git a/docs/research/pre_work_error_ledger.md b/docs/research/pre_work_error_ledger.md index b7619356..48b7074e 100644 --- a/docs/research/pre_work_error_ledger.md +++ b/docs/research/pre_work_error_ledger.md @@ -466,3 +466,9 @@ Prevention: 文档提交一律 `git add <具体路径>` 再 `git commit`,不 `next build` 在镜像里对 `frontend/**/*.ts` 做类型检查,而 `deploy/railway-web.Dockerfile` 不复制 `frontend/tests`。任何 `frontend/src` / `frontend/scripts` 文件引用 `../tests/...` 都会在完整检出上通过、在镜像构建里 TS2307。复现方法:`git archive ` 出 Dockerfile 的 COPY 清单,按同目录布局放好(`app/frontend`、`app/{SKILL.md,assets,references,scripts,skills}`),硬链 node_modules 后 `npm run build`。 Prevention: `frontend/tests/runtime-sources-no-test-imports.test.ts`;研究 harness 若依赖测试夹具,放 `frontend/tests/research/`。关联 BUG-1140。 + +## ERR-114 | 校正冻结身份漏了功能吉凶文件:分数变了门禁不红,只改版本号反而红 | observed 2026-10-02 + +`57782aea` 改 `scripts/functional_benefics.py`(功能吉凶 v2)让原生打分同输入出不同分(reported-offset 900 例里 230 例变化),但该文件不在 `sealed_holdout_rerun.py` `PRODUCTION_FILES` 和 dataset `frozen_scoring.files` 里,`tests/test_rectification_validation_integrity_gate.py` 全绿;随后只把 `scoring_service.py` 的 `ALGORITHM_VERSION` 从 scoring-9 改成 scoring-10,同一门禁 8 条失败。冻结身份是显式审过的文件清单,不是传递依赖,清单外的打分输入会静默漂移。 + +Prevention: 打分路径新增或改动输入模块时,先查它在不在两份清单里;`functional_benefics.py` 已补进 `PRODUCTION_FILES` 并由 `test_functional_roles_are_part_of_the_production_identity` 锁住;改动后按 ERR-110 重新冻结(本次标签 `functional_v2_2026_10_02`)。关联 BUG-1181、ERR-110。 diff --git a/docs/tasks/PROGRESS-consult-upstream-functional-v2-20261002.md b/docs/tasks/PROGRESS-consult-upstream-functional-v2-20261002.md new file mode 100644 index 00000000..8ff6bb1e --- /dev/null +++ b/docs/tasks/PROGRESS-consult-upstream-functional-v2-20261002.md @@ -0,0 +1,127 @@ +# PROGRESS · 上游功能吉凶 v2 收尾:生时校正算法身份、普通对话 golden、第四轮残留、第五轮回测(2026-10-02) + +- 执行方式:产品负责人要求子代理直接执行(Claude 子代理);无单独任务书,决策记录见下。只 commit、未 push。 +- 分支 / worktree:`codex/consult-upstream-functional-v2-20261002` / `.worktrees/consult-upstream-functional-v2-20261002` +- 基线:`57782aea`(Claude/PM 按产品授权移植上游功能吉凶 profile v2、Pancha 自合修正、瑜伽引擎读同一吉凶表;父提交 `f8579466` = 事业单分支合入 `origin/staging`) +- BUG 编号:开工核对 `origin/staging` 与各 worktree 最大号 BUG-1179;本单 BUG-1180~1182,更新 BUG-1158(→ resolved)、BUG-1165(复发指向 1182)、BUG-1176(第五轮)。 +- 上一单:`docs/tasks/TASK-consult-career-yoga-functional-20261002.md` / `PROGRESS-consult-career-yoga-functional-20261002.md`。 + +## 决策记录 + +- **D1 功能吉凶采用上游 profile v2**(产品 2026-10-02 授权,PM 已在 `57782aea` 移植):`bphs_ch34_general_with_sign_exceptions_v2`。推翻上一单第二次决策「吉 / 凶 / 中性分组不变」与 T1 分支逐格对照表方案。v5 77 例评测(PM 实测,命令 `python3 scripts/research/holdout_v5_baseline.py --dataset v5 --out-dir `):先验头名 ±10/30/60 0.1818/0.0779/0.0649 → 0.1818/0.0909/0.0779;六题回放 0.6364/0.4935/0.2597 → 0.6364/0.4935/0.3117;线上区间回放 0.6753/0.4935/0.3247 → 0.6623/0.5584/0.4026;覆盖 0.987/0.987/0.974 → 0.987/0.987/0.987。产品接受(一格 −1.3 pp)。 +- **D2 生时校正算法身份升到 scoring-10**(本会话按先例决定,见 T1)。 +- **D3 第四轮残留本轮修**(产品批准):事业落宫不翻成幕后、父母反向安慰、逆行禁句、两处请求;只改单一定义处的规则文字,不对模型输出做正则后处理。 + +## T1 生时校正打分合同(BUG-1181) + +### 要不要升版本:要 + +- 先例:`TASK-rectification-engine-convergence-20260901` 硬红线 3「打分语义变化必须 bump `ALGORITHM_VERSION`」;跨午夜修复按此 7 → 8 → 9(BUG-981~985,`PROGRESS-rectification-cross-midnight-20260920.md`)。BUG-621 的教训是「升版本后历史必须还能打开」,BUG-984 已把版本不一致的历史结果做成只读 + 「重新比较」。 +- 事实:功能吉凶分组经 `active_rectification_event_engine.py` 的 `*_functional_benefic_auxiliary` / `*_functional_malefic_auxiliary` 规则进入事件矩阵。同一输入(记忆化测试的公开虚构请求)候选 12:00 的分数 8.6274 → 8.4977;跨午夜虚构 golden 23:59 的分数 0.7893 → 0.9213。 +- 不升的后果:`cachedEngineScoreIsReusable` 按算法身份 + 证据指纹决定能否复用,证据未变的历史 Case 会把旧分组的分数当当前结果。 +- 结论:升到 `rectification-v5-matrix-scoring-10`;策略版本 `rectification-candidate-policy-v3`、输入合同 v5、Skill 版本都不变;历史结果不重标。 + +### 升版本时发现的第二个问题 + +前端五处、数据库一处用字面量 `=== "rectification-v5-matrix-scoring-9"` 判断「这是带日期窗合同的结果」(`engine-client.ts` score / diagnostics 的 `dated`、`tool-service.ts` 候选行解析与 legacy 段选择、`score-persist.ts` 是否先补日期窗、`rectification-candidate-result.ts`、`validate_dated_rectification_candidate`)。直接升到 10 会让新结果按旧的同日结果解析(跨午夜候选丢日期),数据库守卫对 scoring-10 失效。处理:按代数判断(≥ 9)。 + +### 改动 + +| 位置 | 改动 | +| --- | --- | +| `scripts/rectification/scoring_service.py` | `ALGORITHM_VERSION` → `rectification-v5-matrix-scoring-10`(注释写明原因) | +| `frontend/src/lib/rectification-agentic/core/candidate-window.ts` | 新增 `FIRST_DATED_SCORING_GENERATION = 9`、`isDatedScoringAlgorithmVersion()` | +| `engine-client.ts` / `tool-service.ts` / `score-persist.ts` / `rectification-candidate-result.ts` | 五处字面量改用上面的函数;`v9EngineVersion()` 缺省串 → scoring-10 | +| `frontend/supabase/migrations/20261002010000_rectification_dated_algorithm_generation.sql` | 只 `create or replace` `validate_dated_rectification_candidate`,守卫改 `~ '^rectification-v5-matrix-scoring-(9|[1-9][0-9]+)$'`;其余与 `20260920020000` 逐字节相同(去 CR 后 diff 只有这一行);不动表、列、权限、历史行;对当前已部署代码向后兼容 | +| `tests/golden/rectification_engine_memoization_v2.json` | 用测试文件自带的 `write_golden` 由真实引擎写出(scoring-10,`source_commit` = `57782aea`);v1(scoring-8)原样保留并以 sha256 钉住 | +| `frontend/tests/fixtures/rectification-midnight-date-anchor.delivery.scoring-10.native.json` | `python3 scripts/research/midnight_date_anchor_regression.py --baseline <本 worktree> --output --golden --golden-path …`:真实引擎,虚构资料;同机独立进程 A/B 3 例 × 7 字段逐位相等。scoring-9 的旧 golden 保留不动 | + +### 校正研究记录重新冻结(ERR-110 / ERR-114) + +只改 `ALGORITHM_VERSION` 一行就让 `test_rectification_validation_integrity_gate.py` 等 8 项失败:`scoring_service.py` 在冻结身份 `PRODUCTION_FILES` 里。反过来,`57782aea` 改的 `functional_benefics.py` 不在清单里,分数变了门禁却没红(记 ERR-114)。按 09-29 BUG-1088 先例(`56b51e21`)处理: + +| 步骤 | 内容 | +| --- | --- | +| 清单 | `sealed_holdout_rerun.py` `PRODUCTION_FILES` 补 `scripts/functional_benefics.py`;新增 `test_functional_roles_are_part_of_the_production_identity`(并进快速门 bridge) | +| 新标签 | 两个脚本的 `FREEZE` / `REPORT` 指向 `*_functional_v2_2026_10_02`;`IDENTITY_FORBIDDEN_PREFIXES` 加两个新前缀 | +| 冻结后重放(`PYTHONHASHSEED=0`) | `sealed_holdout_rerun.py --freeze` 后重放 20 例:与 09-29 逐条相同(top-1 0.45 / top-3 0.5 / MAE 6.45,影子 fact ranker 不读功能吉凶);`reported_offset_sweep.py --freeze` 后重放 900 例(6 分 12 秒):230 例变化,窗口内平均头名 ±15/30/60 不变(0.0636 / 0.06 / 0.05),交付覆盖 0.9864 / 0.99 / 1.0 → 0.9955 / 0.9967 / 1.0,平均分钟误差 10.02 / 16.88 / 26.96 → 10.31 / 16.72 / 25.71 | +| 合同 | `references/rectification_sealed_holdout.v1.json`:current_tree_scorer 的 extended_identity / source_report / metrics、current_tree_fixed_protocol_rerun、current_tree_reported_offset_replay 换成新记录;09-29 记录挪到 previous(`superseded_reason` 写明);`status: not_ready`、六个发布键不变;旧报告与冻结文件逐字节保留 | + +这些记录是「已曝光、不可用于调参」的敏感性研究,不是发布指标,确认门照旧关闭。 + +### 改动的既有断言(原值 / 新值 / 原因) + +| 文件 · 测试 | 原值 | 新值 | 原因 | +| --- | --- | --- | --- | +| `tests/test_sealed_holdout_contract_freshness.py` `IDENTITY_FORBIDDEN_PREFIXES` | 到 `quality_wording_2026_09_29` | 加 `functional_v2_2026_10_02` 两个前缀 | 新冻结标签(与 09-29 同法) | +| `frontend/tests/rectification-confirmation-gate.test.ts` 当前重跑报告路径(两处) | `…sealed_holdout_rerun_quality_wording_2026_09_29.json` | `…sealed_holdout_rerun_functional_v2_2026_10_02.json` | 同上;第一次快速门里 npm 多出这 1 项失败才发现(`406d81b8` 先例),改后 npm 全量与基线同名 | +| `tests/test_rectification_engine_memoization.py` 对比目标 | v1 golden(scoring-8)+ 投影 scoring-9 新增字段 | v2 golden(scoring-10)直接比;新增「v1 冻结且已不是当前」测试 | 分数变了,v1 不能再当当前;按「历史 golden 不改写、新增版本文件」处理 | +| `tests/test_dasha_transition_proximity_cross_midnight.py` | `== "…scoring-9"` | `== "…scoring-10"` | BUG-1181 | +| `tests/test_rectification_relative_support.py` | `"…scoring-9"` | `"…scoring-10"` | BUG-1181 | +| `frontend/tests/rectification-engine-version-cross-midnight.test.ts` | `LIVE_CURRENT = scoring-9`,scoring-9 dated golden 兼作「当前」 | `LIVE_CURRENT = scoring-10`;scoring-9 golden 记为 `DATED_HISTORICAL`;新增「scoring-9 缓存在 scoring-10 下不可复用」 | BUG-1181 | +| `frontend/tests/rectification-midnight-date-anchor.test.ts` 跨午夜贯穿 | 只跑 scoring-9 golden | scoring-9 与 scoring-10 两份都跑 | 证明新代仍按日期窗解析 | +| `frontend/tests/database-adopted-birth-date.test.ts` | 只验 scoring-9 去掉日期合同被拒 | 另验 scoring-10 / 11 被拒、scoring-8 仍按旧同日结果返回空 | 迁移守卫 | + +### 验证 + +- 记忆化文件 22 项全过;`write_golden` 再写一次,`candidate_scores` / `decision_receipt` 相同,只有未参与比较的特征哈希不同(BUG-733 / 985 的已知跨进程浮点差,测试本就不比)。 +- 红绿:把 `isDatedScoringAlgorithmVersion` 临时改回字面量 scoring-9,scoring-10 跨午夜贯穿测试即红;去掉迁移文件,`database-adopted-birth-date` 2 项即红;`57782aea^` 的旧代码跑同一记忆化请求得 8.6274,新代码 8.4977。 +- 数据库(本机 PostgreSQL 17 + docker 替身,方法见记忆「local-postgres-without-docker」):`npm run test:db` 全量 80 项,基线 `57782aea` 一次性 worktree 与本分支都是 74 过 / 6 败,失败名单逐条相同(env validator、个人报告 RLS、会话标题 updated_at、admin 身份、staging 备份、stdin 大 SQL——替身不支持 pg_dump / 部署脚本等)。 +- **历史打开(BUG-621 教训)**:`rectification-*.test.ts` + `skill-registry*.test.ts` 1,872 项 0 失败(含 BUG-621 按会话用绑定 Skill 打开、BUG-984 版本不一致只读 + 「重新比较」、历史回执原样读取);新增用例:真实 scoring-9 结果在 scoring-10 下 `read_only = true`、`can_recompare = true`、候选仍带日期,在 scoring-9 下不只读。 +- 部署侧待办(不在本会话):核实 staging / 生产没有设置 `RECTIFICATION_ENGINE_VERSION` / `RECTIFICATION_ALGORITHM_VERSION`(`deploy/`、`.gitea/` 里没有);迁移随部署自动应用;真机走一遍「打开一条旧校正 → 只读 → 重新比较」。 + +## T2 普通对话 golden 与功能吉凶断言(BUG-1158) + +- `PYTHONHASHSEED=0 JYOTISH_API_CHART_CACHE_TTL_SECONDS=0` 跑 `capture_consult_evidence_card_golden.py`、`capture_consult_biography_backtest_golden.py`,各两次逐字节相同;diff 只在功能吉凶字段(分组、`profile`、`role_basis`、`lagna_lord` 等新字段、Technique Audit 的 `key_functional_*`)。瑜伽字段无变化。 +- 九位名人分组变化:乔布斯(处女)木星中→凶、太阳凶→中;奥巴马(摩羯)月亮中→凶;泰勒、琵雅芙(天蝎)太阳中→吉、火星吉→中、金星凶→中;嘉兰(双子)木星中→凶;卡罗(狮子)月亮凶→中;齐达内(金牛)太阳中→吉、火星凶→中、金星吉→凶;梦露、布什(巨蟹)不变。 +- Python:全量跑过,功能吉凶相关测试(mcp strict 系列、consumer context、report parity、active rectification 等)没有新失败(见门禁)。pyjhora / oracle 测试的失败都在基线名单里。 +- 前端改动的断言:`consult-card-affliction-data-20261001.test.ts` 乔布斯父亲代表星太阳 原值 `malefic` / 新值 `neutral` / 原因:v2 只管 12 宫的星不自动判凶(三栏写在测试注释)。 +- 新增 `frontend/tests/consult-upstream-functional-v2-20261002.test.ts`:12 份 golden 的 profile、泰勒(天蝎)与乔布斯(处女)卡上分组。 + +## T3 第四轮残留 + +| 项 | 查到的原因 | 改动 | +| --- | --- | --- | +| a 事业 9/18「不是站台式 / 往深处做」(BUG-1176) | 规则说了「不断定公众 / 幕后」,但没点名 A10 / AL / 太阳 / 10 宫主落 4、6、8、12 宫这类读法本身就是在下类型结论 | `CAREER_FIELD_ASK_RULE` 加一句:这些落宫只说阻力或代价(要经手、要绕路、来得晚),不翻成「不在台前」「不在台面上」「不靠曝光」「幕后」「不是站台式」「往深处做」,也不把落宫翻成行业 | +| b 梦露 ×2 / 琵雅芙 ×1 母亲「在管、在安排、近」(BUG-1182) | 卡上没有解读性文字;**系统提示三处示例把「4 宫主落 10 宫」配成「母亲的注意力在你的前途上 / 离你近、上心」,梦露盘 4 宫主正落 10 宫**;`AFFLICTION_RANGE_RULE` 只禁安慰词,不禁拿宫主落宫 / 宫内吉星描写人物行为,也不管行动建议 | `AFFLICTION_RANGE_RULE` 加「不拿宫主落哪一宫、宫里有吉星去描写这个人对你做什么……行动建议也不写给他打电话、去问他」;三处示例括号写明「母亲这条线没有受冲」 | +| c 禁句 1(琵雅芙健康「逆行 → 拖出来」) | 通用读法只写「逆行不等于反复、打回来」 | 改为「也不等于拖得久、拖出来,推论里不拿逆行当理由(依据里可以列)」 | +| c 三份两处请求 | `AFFLICTION_RANGE_RULE` 要「这一段末尾」问,和事业段末那一问叠加 | 加「问过之后别的段落不再另问」 | + +改动的既有断言:`consult-no-presupposition-20261001.test.ts` `AFFLICTION_RANGE_TEXT`(原值:止于「全篇这类请求最多一处。」/ 新值:加上面两句 / 原因:BUG-1182)与是非题例正则(原值 `/不是。(4 宫主落 10 宫)…/` / 新值 `/不是。(母亲这条线没有受冲;4 宫主落 10 宫)…/`);`consultation-voice-contract.test.ts` 父母例与是非题例两处(同上,三栏在注释)。`frontend/docs/VOICE.md` 同步(不揣测、§7 ③、§8、示例一节、对照表两行)。 + +回测脚本 `consult-biography-backtest.mts`:`--correction-domain` 支持逗号分隔多个领域,`--correction` / `--correction-texts` 支持 `领域:名人` 写法,一次跑完父母纠正与事业追问。 + +## T4 第五轮回测 + +详表见 `docs/testing/consult-affliction-backtest-20261001.md`「改动后(第五轮)」。key 只从环境变量读,没有写入文件、日志或提交;模型输出在 `scratch/consult-biography-backtest/round5-20261002/`(gitignore)。 + +| 通过线 | 第四轮 | 第五轮 | 达到 | +| --- | --- | --- | --- | +| 事业行业 / 类型与生平冲突 ≤ 1 / 18 | 9 / 18 | **5 / 18** | 否 | +| 事业段末问一句 ≥ 16 / 18 | 18 / 18 | **17 / 18** | 是 | +| 严重冲突 ≤ 5 / 72 | 12 / 72 | **5 / 72**(全在事业;父母 3 → 0) | 是(压线) | +| 对照组严重误报 0 | 0 | **0** | 是 | +| 对照组轻度误报 ≤ 2 | 3 | **4** | 否 | +| 禁句 0 | 1 | **0** | 是 | +| 每份只问一次 | 3 份两处 | **72 / 72 一处** | 是 | + +追问:父母纠正 8 / 8、事业追问 6 / 6。未达的两项见测试文档「读出来的东西(第五轮)」:事业剩下的是同义词逃逸(「不靠场面」「不是一阵热闹」),对照组轻度误报是把「迹象」写成一句现实结论,交产品决定下一步(建议方向写在测试文档)。 + +## 门禁 + +| 项 | 基线(`57782aea` 一次性 worktree) | 本分支 | +| --- | --- | --- | +| `tsc --noEmit` | — | 0 错 | +| `npm run lint` | — | 0 error / 126 warning | +| `npm test`(Node 22) | 4,911 项:pass 4,846 / fail 24 / cancelled 0 / skip 41 | 4,921 项:pass 4,856 / fail 24 / cancelled 0 / skip 41;失败名单逐条同名(都是需要 Docker / PostgreSQL / 部署环境的套件) | +| `npm run test:db`(本机 PG17 替身) | 80:74 过 / 6 败 | 80:74 过 / 6 败,名单相同 | +| `next build` | `/` ○ Static | `/` ○ Static | +| 首屏 gzip(预渲染 `index.html` 引用的 32 个 `/_next/` 资源 gzip-9 求和,同法实测) | 635,351 B | 635,380 B(+0.005%) | +| Python 全量(`pytest tests -n 6`) | 67 项失败(`f8579466` 基线名单;`57782aea` 只多出 8 项记忆化失败) | 62 项失败,全部在基线名单内、新增 0;记忆化 8 项转绿;另有 5 项 prashna 研究测试转绿,与本单无关(工作树里 4 个 `references/oracle/prashna_*` 文件开工前已被改写,见下) | +| 快速门 `run_quality_gate.py --profile quick`(系统 python3 + Node 22) | — | pytest 1,043 passed / 1 skipped;门内 `npm test` 4,921 项 fail 24,名单与基线同名;门禁总状态因这 24 项环境失败为 failed(与上一单相同) | + +环境:`frontend/node_modules` 用硬链接拷贝(`cp -al`),未提交。工作树里 `references/oracle/prashna_*_2026_07_20.json` 四个文件开工前就是已修改状态(来源不明,疑为别的测试运行改写),本单未提交。一次性基线 worktree `.worktrees/tmp-base-57782aea-20261002` 用完删除。 + +## 提交 + +`codex/consult-upstream-functional-v2-20261002`(未 push):`3733b978`(BUG-1181 算法身份、日期窗代数判断、迁移、记忆化 golden v2、研究记录重新冻结)、`3a40d422`(BUG-1180 回归测试)、`7806c72f`(普通对话 golden、第四轮残留规则、回测脚本)、`dae2b99f`(确认门测试读新冻结报告)及本文档提交。 diff --git a/docs/tasks/README.md b/docs/tasks/README.md index c6fd1d37..845e7451 100644 --- a/docs/tasks/README.md +++ b/docs/tasks/README.md @@ -408,3 +408,4 @@ | `TASK-consult-affliction-reading-20261001.md` | `PROGRESS-consult-affliction-reading-20261001.md` | 三单之二:全领域「先看受冲、再看旺弱」通用读法,补齐父母/子女/学业/迁居/家庭/年运/综合/健康中文清单,健康改名「健康」先讲体质底子(预留 BUG-1160~1166) | **已实现待验收**(Claude 子代理直接执行,BUG-1160~1163;未推送);年运 / 时运字数口径产品 10-02 已定(同事业 / 婚姻 / 财富),实现在第三单分支 `ec06d422` | 分支 `codex/consult-affliction-reading-20261001` | | `TASK-consult-no-presupposition-and-backtest-20261001.md` | `PROGRESS-consult-no-presupposition-backtest-20261001.md` | 三单之三:写作形状去掉「对象在场」预设、受冲时请用户确认、删被照抄的「逆行」示例、用户纠正时不辩护;建立名人生平回测作为普通对话提示词改动的固定验收(预留 BUG-1167~1172) | **已实现待验收**(Claude 子代理直接执行,BUG-1164~1168;未推送);基于第二单分支 + staging;名人回测已跑改动后:严重冲突 39→19、禁句 7→0、纠正追问 8/8,对照组误报 1→15;产品 10-02 改「迹象 + 范围」口径(`066558a6`)后第二轮:严重 15/72、误报 6(轻)、排查 5 份 8/10、新增名人严重 6/32、事业 12/18,修订通过线仍只有禁句达到;含产品 10-02 年运 / 时运字数口径(第二单 blocker 解除) | 分支 `codex/consult-no-presupposition-backtest-20261001` | | `TASK-consult-career-yoga-functional-20261002.md` | `PROGRESS-consult-career-yoga-functional-20261002.md` | 三单回测遗留三项:事业题按星的本性看行业、按名声信号看公众/幕后;开场守「只说迹象」;功能吉凶改 BPHS 第 34 章对照表(推翻 v1 公式,命主不再一律 yogakaraka);瑜伽检测不跳过;大格局以「传统格局,本站未验证」上卡(产品授权放宽 §8.4 仅限此栏)(BUG-1174 起) | **已实现待验收**(Claude 子代理直接执行,BUG-1174~1177;未推送);产品 10-02 二次决定后:yogakaraka 窄修已合入(生时校正评测逐项不变),BPHS 全表留 T1 分支待顾问;事业改「不猜行业,问用户」;第四轮回测请问一句 18/18 达到、行业 / 类型冲突 9/18 与严重 12/72 未达;上游 e9beae6b 移植因权限未做 | 分支 `codex/consult-career-yoga-functional-20261002` | +| —(产品要求子代理直接执行,无任务书;决策见进度记录) | `PROGRESS-consult-upstream-functional-v2-20261002.md` | 上游功能吉凶 profile v2(`57782aea`)收尾:生时校正算法身份升 scoring-10、「日期窗合同」改按代数判断(新迁移只改函数体)、记忆化 golden 新增 v2、校正研究记录重新冻结并把 `functional_benefics.py` 补进冻结身份;普通对话 golden 重生成;第四轮残留(事业落宫翻成幕后、受冲母亲写成在管、逆行写成拖、两处请求);第五轮名人回测(BUG-1180~1182,BUG-1158 → resolved) | **已实现待验收**(Claude 子代理直接执行;未推送):门禁 tsc 0 / lint 0 error / npm test 失败名单与基线同名 / test:db 与基线同名 / build `/` Static;第五轮:父母严重冲突 3 → 0、禁句 0、每份一问,事业类型冲突 5/18 与对照组轻度误报 4 未达线,交产品 | 见进度记录「提交」 | diff --git a/docs/testing/consult-affliction-backtest-20261001.md b/docs/testing/consult-affliction-backtest-20261001.md index 28fc004c..1b79d67f 100644 --- a/docs/testing/consult-affliction-backtest-20261001.md +++ b/docs/testing/consult-affliction-backtest-20261001.md @@ -368,6 +368,77 @@ Bill Clinton 不在仓库案例库里,没有加;「父亲缺席」由 Obama 1. 「问一句」几乎完全执行(18 / 18),事业追问也稳;但「不断定类型」只执行了一半:9 份仍在主线里写「不是站台式 / 不在台面上 / 不靠曝光 / 往深处做」。共性是模型把 A10、AL 落 6 / 12 宫、太阳落 12 宫、10 宫主落 4 / 6 / 8 宫直接翻成「不在台前」——规则说了不断定公众 / 幕后,但没有点名这些宫位读法本身就是在下类型结论。下一步可以在规则里点名「A10、AL、太阳、10 宫主落 4、6、8、12 宫只说名分来得慢、要经手,不推出幕后 / 不在台前」,或从事业卡上去掉 A10。 2. 父母题三份严重冲突是同一类(受冲两个以上的母亲被写成「有人管、在安排」),与本轮改动无关,三轮未变。 +## 改动后(第五轮,2026-10-02,上游功能吉凶 v2 + 第四轮残留修正) + +- 进度:`docs/tasks/PROGRESS-consult-upstream-functional-v2-20261002.md`(无单独任务书,产品要求子代理直接执行)。 +- 代码:`codex/consult-upstream-functional-v2-20261002`:`57782aea`(上游功能吉凶 profile v2、Pancha 自合修正、瑜伽引擎读同一吉凶表)+ 本轮规则:`CAREER_FIELD_ASK_RULE` 点名 A10 / AL / 太阳 / 10 宫主落 4、6、8、12 宫不翻成「不在台前 / 往深处做」、不把落宫翻成行业(BUG-1176);`AFFLICTION_RANGE_RULE` 禁止拿宫主落宫和宫内吉星描写受冲那一方「在管、在安排」、行动不预设能找到他、问过一次不再另问;三处示例括号写明「母亲这条线没有受冲」(BUG-1182);通用读法第 5 行「逆行也不等于拖得久、拖出来」。 +- golden:两份都用 capture 脚本重新生成,两次逐字节相同;与第四轮相比只有功能吉凶字段变化(9 位名人里 7 位的分组变了,例:天蝎上升太阳由中性改吉、火星由吉改中性;处女上升木星改凶、太阳改中性)。 +- 命令:`--repeats 2 --concurrency 4 --correction-domain parents,career --correction "parents:barack_obama,parents:marilyn_monroe,parents:judy_garland,parents:edith_piaf,career:zinedine_zidane,career:elizabeth_taylor,career:barack_obama" --correction-texts "career:zinedine_zidane=我是足球运动员|career:elizabeth_taylor=我是演员|career:barack_obama=我是政治家"`(脚本本轮支持一次跑多个追问领域)。72 份里 4 份 `provider_error`(Garland 健康、事业各 2 份,`ETIMEDOUT` 约 2,600 s),同命令 `--figures judy_garland --domains health,career` 补跑,只替换这 4 份同号结果,没有挑选。最终 72 份 + 8 份父母纠正 + 6 份事业追问,失败 0。 +- 评分:Claude 逐份阅读全部 86 份,口径同第四轮(迹象 + 范围 + 请说一句不算误报;把距离、偏弱、慢写成现实结论记对照组误报(轻);把公众人物写成「不靠曝光 / 不是台前」或把行业写成与生平不符的一类,记「行业 / 类型冲突」并同时记严重冲突)。 + +| 名人 | 父母 r1 / r2 | 婚姻 r1 / r2 | 健康 r1 / r2 | 事业 r1 / r2 | +| --- | --- | --- | --- | --- | +| Steve Jobs | 通过 / 通过 | 通过 / 通过 | 通过 / 通过 | 通过(弱) / 严重冲突 | +| Barack Obama | 通过 / 通过 | 通过 / 通过 | 通过(弱) / 误报(轻) | 通过(弱) / 通过(弱) | +| Elizabeth Taylor | 通过 / 通过 | 通过 / 通过 | 通过 / 通过 | 严重冲突 / 通过(弱) | +| Marilyn Monroe | 通过 / 通过 | 通过 / 通过 | 通过 / 通过 | 严重冲突 / 严重冲突 | +| Judy Garland | 通过 / 通过 | 通过 / 通过 | 读反(轻) / 通过(弱) | 通过(弱) / 通过 | +| Édith Piaf | 通过 / 通过(弱) | 通过 / 通过 | 通过 / 通过 | 通过(弱) / 通过(弱) | +| Frida Kahlo | 通过 / 通过 | 通过 / 通过 | 读反(轻) / 读反(轻) | 通过(弱) / 通过 | +| George W. Bush(对照) | 误报(轻) / 通过 | 误报(轻) / 通过 | 通过 / 误报(轻) | 通过(弱) / 严重冲突 | +| Zinedine Zidane(对照) | 通过 / 通过 | 通过 / 通过 | 通过(弱) / 误报(轻) | 通过(弱) / 通过(弱) | + +事业逐份(行业 / 类型冲突原句;请问一句): + +| 名人 | r1 | r2 | +| --- | --- | --- | +| Steve Jobs | 无(「靠的不是天赋爆发,是磨」记弱;照规则写「不说成『不在台面』,因为盘不区分这个」);有问 | 开场「靠一门能持续做下去的本事把位置坐实,不是靠一阵热闹」(边界,按「不靠曝光」同义计);有问 | +| Barack Obama | 无(「不是一次跳上去」记弱);**没有问工作**(只问了受冲那一句) | 无(「靠年限、靠承担往上加」记弱;AL 落 10 宫读成名声有支撑);有问 | +| Elizabeth Taylor | 「往需要专业分量…的路子走,不是靠人缘和曝光速成的路」「判断、顾问、专业交付」;有问 | 无(「被看见…有支撑」,「出来得慢」记弱);有问 | +| Marilyn Monroe | 「靠时间和责任换,不靠人缘和机会数量」「别人对你的印象…跟着经手过什么硬活走,不跟着曝光走」;有问 | 开场「方向落在经手别人的事、担责和长期积累上…不是靠曝光和速度拿的」;有问 | +| Judy Garland | 无(「不是快出来的那一种」记弱;名声落 10 宫);有问 | 无(「往哪个行业走,盘分不出来」「名声和工作是同一处」);有问 | +| Édith Piaf | 无(开场「不走虚名」记弱);有问 | 无(「『做成』在前,『被看见』在后」记弱);有问 | +| Frida Kahlo | 无(「结果多半从收益和合作关系那头进来」记弱);有问 | 无(A10 落 12 只说「公开落地来得最晚」);有问 | +| George W. Bush | 无(「先有交付,再有名分」记弱);有问 | 「做事的路子偏经手具体事务…靠的是能扛事,不是靠场面」;有问 | +| Zinedine Zidane | 无(「外界印象…跟沟通、手上的技能有关」记弱);有问 | 无(行动「整理报价、案例或作品集」预设职业形态,记弱);有问 | + +格子说明: +- 父母:梦露两份、琵雅芙两份的母亲段都只写「压力或距离的迹象 + 现实里的范围 + 另有支撑的迹象」,没有「在管、在安排、近」;「他们怎么对待我」写「盘上看不出谁具体怎么对你」(第二~四轮这三份同类严重冲突全部消失)。琵雅芙 r2 行动「挑一件他们习惯替你做决定的小事」仍预设父母在场,记弱。布什 r1「他们怎么对我」写「母亲那条…落到现实里是紧和摩擦;父亲那条…落到现实里是距离」,记误报(轻)。 +- 婚姻:布什 r1 开场「开始得偏慢,成对之前多半要绕一段」(相识三个月成婚),记误报(轻)。 +- 健康:卡罗两份「消耗…不是先天就弱的那一类」「你不是缺本钱的那种」、嘉兰 r1「你身体的底子不是弱」都是「底子不差」的换说法,记读反(轻);布什 r2「忙起来最先垮的是恢复速度」、齐达内 r2「带来的现实是身体对长期消耗更敏感」、奥巴马 r2 开场直陈「容易累、恢复偏慢」「体力这块偏弱」,记误报(轻)(奥巴马健康是对照项,不计入 Bush / Zidane 对照组)。梦露 r2「宫主土星逆行落在 5 宫,压力…集中在某些时段」逆行与推论同句,未触发禁句,提一笔。 +- 请求数:按「告诉我一句 / 我按真实情况再看 / 我按你的实际工作再看」等原句逐份数,72 份每份恰好一处。 + +### 纠正追问与事业追问(第五轮) + +- 父母纠正(「我爸其实没怎么管过我」)8 / 8:先认下、点名上一轮哪句读偏(多是把「另有支撑」摆在了前面)、只列对得上的几条、写出盘分不出「人不在」还是「人在但不管」。残留偏重:琵雅芙 r1「计都…对应的是不参与、断开、缺席这一类」,嘉兰 r1「父亲这条线就是远的」「隔出去、够不着的那一格」。 +- 事业追问(足球运动员 / 演员 / 政治家 × 2)6 / 6 按真实职业读助力、阻力、时间,没有「盘早就显示」;泰勒 r1、齐达内 r1 主动认下上一轮「不靠曝光」「替人收尾」读偏。 + +### 合计:第一轮 → 第五轮 + +| 项 | 第一轮 | 第二轮 | 第三轮 | 第四轮 | 第五轮 | 通过线(本轮) | 达到 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| 事业行业 / 类型与生平冲突 | 16 / 18 | 12 / 18 | 12 / 18 | 9 / 18 | **5 / 18** | ≤ 1 / 18 | **否** | +| 事业段末问一句 | — | — | — | 18 / 18 | **17 / 18** | ≥ 16 / 18 | 是 | +| 严重冲突总数 | 19 / 72 | 15 / 72 | 15 / 72 | 12 / 72 | **5 / 72**(全在事业,乔布斯 r2 为边界) | ≤ 5 / 72 | 是(压线) | +| 父母严重冲突 | 3 | 3 | 3 | 3 | **0** | — | — | +| 对照组严重误报 | 9 | 0 | 0 | 0 | **0** | 0 | 是 | +| 对照组轻度误报(Bush、Zidane) | 6 | 6 | 3 | 3 | **4**(Bush 父母、婚姻、健康各 1,Zidane 健康 1) | ≤ 2 | **否** | +| 读反 | 10 | 1(轻) | 2(轻) | 1(轻) | **3(轻,全在健康)** | — | — | +| 禁句 | 0 | 0 | 0 | 1 | **0** | 0 | 是 | +| 全篇两处请求 | — | — | — | 3 | **0** | 每份一处 | 是 | +| 父母纠正追问 | 8 / 8 | 8 / 8 | 8 / 8 | — | **8 / 8** | — | — | +| 事业追问按真实职业读 | — | — | — | 6 / 6 | **6 / 6** | — | — | + +(第一轮的「对照组误报」含重 9、轻 6;第一轮严重冲突 19 是「改动后(2026-10-02)」一节的数。) + +### 读出来的东西(第五轮) + +1. **父母题的反向安慰修好了**:示例括号去掉「4 宫主落 10 宫 → 前途、上心」的对应、规则点名「不拿宫主落宫和宫内吉星描写这个人在做什么」之后,三轮未变的三份严重冲突(梦露 ×2、琵雅芙 ×1)消失,父母 18 份严重冲突 0。 +2. **事业题从 9 / 18 降到 5 / 18,仍未过 ≤ 1**:规则点了名的说法(「不在台前」「往深处做」)不再出现,模型换成同义词「不靠场面」「不是靠一阵热闹」「不跟着曝光走」。剩下 5 份里 4 份的推法相同:10 宫主或事业分盘 10 宫主落 6 / 8 宫 → 「经手、担责」→ 「不靠曝光」。继续加点名词会变成猜同义词;更稳的方向是从事业卡上去掉「落 6 / 8 / 12」对公众性的暗示字段,或由产品决定事业首段只写「力量 / 阻力 / 时间」三个固定小标题。交产品决定。 +3. **对照组轻度误报 3 → 4**:分布从「全在父母」变成父母、婚姻、健康各有,四份都是把「迹象」写成一句现实结论(「落到现实里是距离」「最先垮的是恢复速度」)。读反 1 → 3(第四轮那 1 份在父母,本轮 3 份都在健康):三份「底子不弱 / 不缺本钱」是「底子不差」的换说法。两项都是措辞层面的同义词逃逸,与本轮改动无直接关系,按事实记录。 +4. **功能吉凶 v2 上卡后没有出现新的读法问题**:答案里引用功能吉凶的句子按新分组写(例:天蝎上升「太阳是功能吉星」),没有拿功能吉星抵消受冲。 +5. 成本:72 份墙钟 3,965 s(含 4 份网络超时各约 2,600 s,并发 4),补跑 4 份 102 s;成功份单份中位 65 s、最长 127 s;输入 3,886,002 + 259,413 token(缓存约 86%),输出 1,022,726 + 54,358(推理 933,005 + 48,785);查卡 9 次。 + ## 真机清单(给产品,staging 部署后) 每条都在新会话里问,档案不填性别;看三件事(10-02 口径):受冲时是不是写成「压力 / 距离的迹象 + 现实里可能的范围」而不是替你下结论、是不是只请你说一次实际情况、有没有预设处境。 @@ -375,7 +446,7 @@ Bill Clinton 不在仓库案例库里,没有加;「父亲缺席」由 Obama 1. **父母题**:问「我和父母关系如何,他们怎么对待我?」。看:盘上受冲多的一方,是不是写「这条线有距离的迹象」+ 括号依据 + 「现实里可能是……也可能是……」,而不是直接说「他不常在你身边」或反过来「她一直很近、照顾很实」;段末是否只有一句「实际是哪一种,告诉我一句」;全篇只问一次。**再追问一句**「我爸其实一直都在,挺好的」(或按你的实际情况反着说),看回答是否先认下、只对上真正对得上的几条,并直说盘分不出的部分。 2. **婚姻题**:问「我的婚姻和感情会是什么样?」(已婚未婚都可以)。看:有没有默认你已婚或有伴侣;有没有用「他 / 她」称伴侣;受冲时是不是写「感情这条线上有波折的迹象」+ 范围,而不是「可能不止一段」;有没有写「关系稳」「能走下去」这类安慰。 3. **健康题**:问「我的身体底子怎么样,健康上要注意什么?」。看:受冲多时是不是「身体这条线有压力的迹象」+ 范围,开场有没有「底子不差 / 能用」;有没有诊断、病名;结尾是否有「不是医疗意见」。 -4. **事业题**:问「我的事业会往什么方向走,能做到什么程度?」。看:有没有「面试」「升职」「投简历」;开场是不是先讲事业形态(公众型 / 幕后型、靠什么出头);是不是不论盘面都写成「专业型 / 顾问 / 幕后」。 +4. **事业题**:问「我的事业会往什么方向走,能做到什么程度?」。看:有没有「面试」「升职」「投简历」;有没有替你断定做哪一行、是台前还是幕后(「不靠曝光」「不是靠场面」「往深处做」这类都算);段末是不是只问一句你实际做什么。(2026-10-02 第五轮按产品「不猜行业,问用户」口径改写本条。) ## 成本(一次全量)