chore(privacy): purge upstream private material and add import guards

Prepare branch for remote review; preserve documented validation gaps and protected historical packages.

Co-Authored-By: Claude Code <noreply@anthropic.com>
This commit is contained in:
jesse-ux
2026-09-20 00:55:18 +08:00
co-authored by Claude Code
parent 3937390bca
commit 5cbc2d0097
3578 changed files with 4519 additions and 1385525 deletions
@@ -0,0 +1,113 @@
# 上游私人案例与本机路径清理 · 执行记录
## 基线与范围
- 日期:2026-09-19。
- 任务书:`TASK-owner-case-purge-20260919.md`,含最新新增红线。
- 实际开工基线:`35ca7299c`(已 fetch 验证的 `origin/staging`);原任务书功能基线为 `b05d2fa1`。
- 实现工作树:`.worktrees/owner-case-purge-20260919`,分支 `codex/owner-case-purge-20260919`。
- 基线测试工作树:`.worktrees/owner-case-purge-baseline-20260919`,detached `35ca7299c`。
- 主检出的未跟踪资料保持不动。禁止 stash,不修改其他会话分支。
- 校正 Skill 历史版本与注册表、带哈希的上游研究快照均不手改;不修改业务流程、前端页面、主 API、数据库迁移、workflow、DNS 或 main。
## 当前工作状态
| 项目 | 状态 |
| --- | --- |
| 删除范围与引用独立审计 | 已完成;发现任务范围冲突,见补充任务书 |
| 前后端原始测试基线 | 已完成;存在原有失败和环境缺口,非全绿 |
| T2 虚构 fixture 常量化 | 已完成本地修改与定向前后对照;没有新增失败 |
| T1 / T3 删除 | 产品确认具体目标后已删除 3,494 文件,删除前全部与基线逐字节核对 |
| T4 同步排除 | 已完成本地实现,42 条新增回归通过(mirror 28 + semantic_merge 14) |
| T4 仓库守卫 | 已实现并接入 quick;57 项通过(56 自测 + 实际仓扫),包括链接/BOM 回归 |
| F1 引用修复 | 8 份 oracle JSON 与 manifest 已修复,新增 9 合同测试通过 |
| F2 额外清理 | 已脱敏 35 份文档及额外安全测试输入,保留通用报告符号及无关数值 |
| 完整验收与 staging 交付 | 独立定向复验通过;全量存在基线/环境缺口,删除测试清单写入权限阻塞交付;未提交、未推送、未部署 |
补充提案:`TASK-owner-case-purge-fix-20260919.md`;环境补验清单:`docs/testing/owner-case-purge-20260919.md`。
## 已核实的环境
- 当前主机没有仓库 `.venv`;系统 Python 3.11.7 可导入 pytest、swisseph。测试使用此解释器,不能称为指定虚拟环境验收。
- Node 22 可用;已有前端依赖可只读复用,不升级依赖。
- 同步工具原始基线出现两条符号链接测试失败;定向复跑确认 `WinError 1314`(Windows 符号链接权限)。不为使工具通过而删除或放宽安全断言。
## 已完成的同步防线与保护边界检查
- `scripts/import_yinduzhanxing.py` 新增独立强制隐私路径模式;mirror 源与目标均拒绝,覆盖根路径、嵌套路径、大小写。不改原 `REQUIRED_PROTECTED_PATTERNS`,因为它与现有 policy 做集合差校验,直接增加会让未升级的 policy 无法加载。
- 新增测试不写私人模式副本,通过模式序号构造路径;错误信息不回显命中内容。
| 验证 | 实测结果 |
| --- | --- |
| 新增同步路径参数化回归 | 42 通过 |
| 同步工具完整定向测试 | 70 通过 / 2 失败;失败与基线相同,均为 Windows 符号链接权限 |
| Python 快速门 | 未通过,缺少 `mcp` |
| 校正历史版本包逐字节比对 | 186 文件,0 改动 |
| Skill 注册表与上游哈希快照 | 各 1 文件,0 改动 |
| `frontend/src` | 632 文件,0 改动 |
| 主 API 文件 | 0 改动 |
| 前端全量基线 | 3486 tests / 3408 pass / 78 fail / 0 skip / 0 cancelled |
| 前端基线 TypeScript / lint | TypeScript 0 错;lint 0 error / 120 warning |
| Python 全量基线 | 收集 2758 项、13 模块收集错误,退出 2;实际用例执行 0;缺少 `mcp` / `hypothesis` |
| 默认构建基线与修改版 | 均未通过:Turbopack 拒绝指向工作树外的 node_modules junction |
| 补充 webpack 构建基线 | 编译和类型检查完成;页面数据收集因 symlink EPERM 失败,无完整产物 |
| Static / 首屏 gzip | 环境缺口,未验收 |
| 开工预检 | 23 通过 / 1 失败,既有碎片分类断言;远端可见性 verified |
| 前端修改后全量 | 3486 tests / 3408 pass / 78 fail / 0 skip / 0 cancelled;失败名、来源文件、顺序逐项一致,差异 0 |
## 已确认的任务范围冲突
1. `references/oracle/evidence_packet_index_2026_07_19.json` 登记全部待删台账;完整性检查会打开索引并判断每个目标路径存在。原清单删除而不更新索引,将使 `test_evidence_packet_index_integrity_validator_passes_current_index` 失败。
2. 技法矩阵、effective view 与 skill truth overlay 存在交叉证据引用。已追到的运行时消费者只读取索引状态/汇总或透传 evidence 字符串,没有发现自动打开这些拟删台账的直接读取;但 effective view 对模型可查,直接删除仍留下可达的悬空路径,不能声称模型上下文完全不受影响。
3. 任务要求复用的禁止标记在其声明处自命中;扫描泛用户目录前缀还会命中模板和历史任务书。原 T2/T3 清单不足以实现“仅上游快照一个豁免”的全仓零命中。
4. 校正历史包当前扫描无命中,不需要改包或新增整目录豁免。保护红线不变。
这些事实与任务书“只有自身合同测试读者”的描述不符,初期因此暂缓。随后产品在本会话依次选择“补齐范围继续”“确认删除上述目标”“授权读取并脱敏”,补充范围已解除阻塞。子代理曾因只读任务/授权识别拒绝写入,未要求其绕过;主会话在实际用户确认后执行精确删除及仓内文档脱敏。不读取凭据、生产数据、仓外私人文件,不降低完整性断言。
## T2 定向前后对照与断言说明
实际修改 7 份 Python 测试加 `conftest.py`,不是原单文字所称的 8 份测试;另有 13 个前端测试/支持文件及 1 份日期选择器计划,共 22 文件。未删除任何测试或新增 skip。
| 检查 | 修改前 | 修改后 |
| --- | --- | --- |
| Python 定向 | 68 项:52 通过 / 16 失败 / 0 跳过 | 相同,失败名单逐项一致 |
| 前端定向(含共享使用方和 `.mjs`) | 209 项:208 通过 / 1 失败 / 0 跳过 | 相同,失败名单逐项一致 |
| Python 断言数 | 255 | 255 |
| 前端断言数 | 352 | 352 |
| T2 授权文件目标隐私标记(含中文日期变体) | 未清理 | 0 命中 |
| TypeScript / lint 主会话复验 | 基线 0 错 / 0 error | 均退出 0 |
| Python collect-only 主会话复验 | 2758 已收集 / 13 错误模块 | 2786 已收集 / 13 错误模块;增加 28 正好对应同步回归 |
| 原值(符号定位) | 新值 | 原因 |
| --- | --- | --- |
| 目标日期字面量 | `FIXTURE_BIRTH_DATE` / `FIXTURE_BIRTH.date`,虚构日期 `1990-06-15` | 删除私人 fixture、统一维护 |
| API 目标出生分钟 | `FIXTURE_BIRTH_TIME = 10:20` | 使用虚构分钟 |
| 目标 fixture 配套坐标 | 共享虚构组合的 `31.2 / 121.5` | 不对应被清理的私人资料;独立场景保留 |
| `candidate_scan.start/end` 原精确期望 | 虚构输入减/加 30 分钟,即 `09:50 / 10:50` | 保留边界断言与 61 个候选断言 |
| 日期解析年/月索引/日断言 | `1990 / 5 / 15` | 输入变更后的同语义精确断言 |
| 中文日期展示与指定文档示例 | 新虚构日期及对应中文展示 | 保持输入、说明和断言自洽 |
定向脱敏证据:`scratch/t2-evidence/result-summary.json`。原始日志、JUnit 与修改前副本仅在忽略目录,不能提交。所有 T2 文件保持 LF,主会话 `git diff --check` 退出 0。
## 隐私记录规则
不记录私人出生参数、案例标识、本机用户名或会话原文;断言变更表的旧值使用原符号或定位描述,新的测试数据明确标注为虚构。
## 最终复验进展与交付阻塞
- 2026-09-19 权限控制拒绝将本地 `scratch/owner-case-purge/deleted-tests.json` 派生清单写入本文件;未换工具、未交给其他代理绕过。逐个删除测试名及该批追加记录尚未落盘,当时暂停提交与推送。产品随后明确要求先推当前工作分支供远程 review,因此允许保存并发布待审提交;逐项记录缺口仍保留,不据此声称 staging 完整交付。
- 最终前端全量:3486 tests / 3408 passed / 78 failed / 0 skipped;失败身份与顺序逐项和基线一致,差异 0。TypeScript 退出 0;lint 0 error / 120 warning,与基线一致。
- 补充前端定向:consultation-route-service 17/17、agent-observability 12/12、personal-report-contract 27/27;Skill registry 12 通过 / 4 既有失败,binding 1 个既有文件级失败,均在原基线。
- 补充 Python 定向:vedastro_rest_bridge 6/6、personal_report_contract 40/40。
- 最终 Python collect/full 均成功收集 2,823 项并出现 13 模块收集错误,和基线错误模块逐一一致;缺 mcp/hypothesis,退出 2、实际执行 0,不能称为全量通过。数量核算:2,758 − 43 个获批删除用例 + 108 个新增用例 = 2,823;另外两条参数化路径由旧用户名改为 example,表现为 nodeid 两删两增,不改变数量。新增 108 = 导入 42 + 清理合同 9 + 隐私守卫 57。完整 importer 70 passed / 2 个既有 symlink failed;守卫与清理合同 66/66,0 skip。
- 最终默认构建与补充 webpack 构建仍分别受外部 junction 和 Skill symlink EPERM 阻断,编译成功不等于构建通过;无完整产物,Static/gzip 未验收。
- 独立复验首轮:新增清理合同 9/9、文档清理后隐私守卫 49/49。随后补齐链接/BOM 的 8 项回归,守卫当前 57 项通过:末端链接只扫描链接文本,祖先链接/junction 报安全错误,不读取仓外目标;普通已删除文件仍单独计数。内存补扫尚未跟踪的新文件无命中,但正式提交前仍须 stage 后再次扫描。最终独立复验:守卫 57/57、清理合同 9/9、导入路径回归 42/42,共 108 passed;将 5 个新增文件加入内存扫描集合后扫描 4,492 文件、未许可命中 0,校正历史 186 文件全部覆盖,上游临时例外 1。该内存验证没有修改 Git 索引,正式暂存后仍须复扫。
- 独立审核发现 semantic_merge 路径也会进入导入 manifest,已补同等隐私拒绝;新增 14 参数化回归通过,加上 mirror 28 项共 42 项。既有两条 symlink 权限失败不放宽。
- 最终字节复核:校正历史 186、注册表 1、上游哈希快照 1、frontend/src 632、主 API 1、MCP 1、其余业务 scripts 449 文件均 0 差异。9 份引用 JSON 的换行回归已修复为 LF,diff --check 退出 0。
- 完成本地验收时 fetch 成功,origin/staging 仍为本轮基线 `35ca7299c9b9c5464002f11c00310c01919e89a1`;当时没有提交、推送或部署。
## 远程 review 分支发布
产品随后明确要求先推当前分支进行远程 review。本次仅发布 `codex/owner-case-purge-20260919`,不推 staging、不提升 main、不部署,保留上述记录与环境缺口。
已暂存本轮跟踪文件改动与 5 个已审新文件,没有加入 scratch 或本地隐私标记文件。暂存后重新执行隐私守卫与清理合同:66/66 通过;`git diff --cached --check` 退出 0。本地提交已完成;随后推送该工作分支返回 Gitea 认证失败(`Failed to authenticate user`)。只读 `ls-remote --heads` 核对成功,同名远端分支不存在,故未发布、暂不能远程 review。未修改认证配置或借用凭据;待恢复 Git 写入认证后推原分支并验证 SHA。
@@ -24,7 +24,7 @@
## 任务 0 · 基线复核
worktree:`/Users/jesse/Downloads/Copse/astrology/.worktrees/react-compiler-20260817`
worktree:`<home>/Downloads/Copse/astrology/.worktrees/react-compiler-20260817`
(`git worktree add -b codex/react-compiler-20260817 ../.worktrees/react-compiler-20260817 origin/staging`,
基点 `e8d201dd`)。`frontend/` 已跑一次 `npm install`(新 worktree 无 node_modules)。
@@ -2,8 +2,8 @@
## 基线与范围
- Git 根目录:`/Users/jesse/Downloads/Copse/astrology/yinduzhanxing`
- 隔离 worktree:`/Users/jesse/Downloads/Copse/astrology/.worktrees/rectification-convergence-impl-20260830`
- Git 根目录:`<home>/Downloads/Copse/astrology/yinduzhanxing`
- 隔离 worktree:`<home>/Downloads/Copse/astrology/.worktrees/rectification-convergence-impl-20260830`
- 分支:`codex/rectification-convergence-impl-20260830`
- 最新基线:`origin/staging` @ `f8aea88bc30fccedcd66367283a2623d774fed6a`
- 2026-08-31 已重新执行 `git fetch origin --prune`,本地 `HEAD` 与 `origin/staging` 均为上述 SHA,ahead/behind 为 `0/0`。
@@ -15,8 +15,8 @@
- 上游访谈手册与阈值资料已归档在 `references/upstream/`。
- 两份真实会话记录已归档:
- `references/upstream/1993-session-repeated-questions.txt`
- `references/upstream/1993-session-correction-rerun.txt`
- `会话转录已按 2026-09-19 决策删除`
- `会话转录已按 2026-09-19 决策删除`
- 上游产品契约是固定节奏后交付候选区间与标签,不把默认目标设为唯一分钟。
- 固定终止话术为:
`当前最优结果是候选时间段,而不是已经确认的唯一出生分钟。临时代表时间仅用于下一轮验证与比较。`
@@ -24,8 +24,8 @@
### 1993 案例的答案回流事实
- 用户回答确实把 14:30–15:00 收窄到 14:48–14:50;这部分可以声称为回答支持的区间收窄。
- 14:49 来自仓库既有答案/校准资料回流,不是用户回答自动推导出的唯一分钟。
- 上游污染标记包括 `pl9_1993_user_case`、`target_minute = 14:49`、`observed_pl9_1993_case_only` 以及 `scripts/narayana_dasha.py:601-613` 的案例专用 tie-break。
- [隐私标记 R003 已移除] 来自仓库既有答案/校准资料回流,不是用户回答自动推导出的唯一分钟。
- 上游污染标记包括 `[库主案例标识已移除]_user_case`、`target_minute = [隐私标记 R003 已移除]`、`observed_[库主案例标识已移除]_case_only` 以及 `scripts/narayana_dasha.py:601-613` 的案例专用 tie-break。
- 本仓本次未引入、未同步上述污染逻辑;没有修改评分权重、sealed holdout 或 confirmation gate blocker。
## 已完成任务 1–3
@@ -115,6 +115,6 @@
| 9 改窗口重跑 | 未开始 | — |
| 10 首轮批量出题 | 未开始 | `src/mastra/agentic-rectification.ts` 中「一次一问」仍在 |
任务 1、2、3、6 的实现与任务书要求一致,未发现踩红线:`convergence-evaluator.ts` 未被改动,`confirmation-gate.ts` 的 blocker 未放宽,sealed holdout 阈值未动,本仓仍未被 1993 案例答案污染(全仓 `pl9_1993` / `target_minute` 无相关命中)。
任务 1、2、3、6 的实现与任务书要求一致,未发现踩红线:`convergence-evaluator.ts` 未被改动,`confirmation-gate.ts` 的 blocker 未放宽,sealed holdout 阈值未动,本仓仍未被 1993 案例答案污染(全仓 `[库主案例标识已移除]` / `target_minute` 无相关命中)。
未完成项转入 `TASK-round2-cost-and-delivery-20260831.md`。
@@ -2,7 +2,7 @@
## 基线与交付边界
- 隔离 worktree:`/Users/jesse/Downloads/Copse/astrology/.worktrees/rectification-decision-authority-20260831`
- 隔离 worktree:`<home>/Downloads/Copse/astrology/.worktrees/rectification-decision-authority-20260831`
- 分支:`codex/rectification-decision-authority-20260831`
- 基线:`origin/staging` @ `9aebd0474a089ed5bec1fc8e8432d0d85e93ffb6`
- A+B 已以 `9f011194f2befc23693a5b2872e8e3da5a4394c0` 推送到 `origin/staging` 并完成独立验收。
+2 -2
View File
@@ -1,6 +1,6 @@
# PROGRESS · 仓库整备(2026-09-03)
工作树:`/Users/jesse/Downloads/Copse/astrology/.worktrees/repo-hygiene-20260903`
工作树:`<home>/Downloads/Copse/astrology/.worktrees/repo-hygiene-20260903`
分支:`codex/repo-hygiene-20260903`
基线:开工后快进到 `origin/staging` @ `58cae371`(含 BUG-510 与上游同步任务书)。任务书:`docs/tasks/TASK-repo-hygiene-20260903.md`。
未碰 `main`。未改 `DEFAULT_AYANAMSA_NAME`(保持 `raman`)。未改校正打分/阈值/golden。未改 `page.tsx`(仍 2041 行)。`scripts/jyotish_api_server.py` 仍 11120 行。
@@ -18,7 +18,7 @@ BUG 编号:开工时最大号 **BUG-510**。岁差记 **BUG-511**。
## 环境备忘
- 本 worktree **没有** `.venv`。预检与 Python 测试用主仓 `/Users/jesse/Downloads/Copse/astrology/yinduzhanxing/.venv`(`mcp` 1.28.1,`hypothesis` 已装)。
- 本 worktree **没有** `.venv`。预检与 Python 测试用主仓 `<home>/Downloads/Copse/astrology/yinduzhanxing/.venv`(`mcp` 1.28.1,`hypothesis` 已装)。
- 本地错装 `mcp 2.x` / 缺 `hypothesis` 是环境问题,不改 pin。`requirements.txt` 仍是 `mcp>=1.0,<2`;`requirements-dev.txt` 已有 `hypothesis>=6.0`。
- 任务书写把迁移放进 `frontend/db/migrations/`。实际 migrator 跑 supabase + db 两目录。本轮唯一迁移:`frontend/supabase/migrations/20260903010000_profile_ayanamsa.sql`。
- 「账户与出生资料」在现界面是 **星盘资料** 本人编辑表。岁差单选在那里,未改 `page.tsx`,未进 `个人资料`。
@@ -43,7 +43,7 @@ npm run lint
npm run build
# exit 0;5 个既有 Turbopack 动态文件访问 warning
JYOTISH_PRE_WORK_PYTHON=/Users/jesse/Downloads/Copse/astrology/yinduzhanxing/.venv/bin/python \
JYOTISH_PRE_WORK_PYTHON=<home>/Downloads/Copse/astrology/yinduzhanxing/.venv/bin/python \
python3 scripts/pre_work_check.py --remote-timeout 8 --command-timeout 45
# pass
```
@@ -1,6 +1,6 @@
# PROGRESS · BUG-526 报告链路不得直读已收权的校正表(2026-09-04)
工作树:`/Users/jesse/Downloads/Copse/astrology/.worktrees/report-candidate-range-20260904`
工作树:`<home>/Downloads/Copse/astrology/.worktrees/report-candidate-range-20260904`
分支:`codex/report-candidate-range-20260904`
基线:任务书写 `cce919fe`;开工 `origin/staging` HEAD 为 `846b6064`(含本任务书)。
任务书:仓库根 `TASK-report-candidate-range-read-20260904.md`
@@ -1,6 +1,6 @@
# PROGRESS · BUG-535 文档 charts 上限绑定 CHART_IDS(2026-09-04)
工作树:`/Users/jesse/Downloads/Copse/astrology/.worktrees/report-chart-cap-20260904`
工作树:`<home>/Downloads/Copse/astrology/.worktrees/report-chart-cap-20260904`
分支:`codex/report-chart-cap-20260904`
基线:任务书写 `e674cd38`;开工 `origin/staging` HEAD 为 `d2955c62`(含本任务书 `40387ff9`)。
任务书:仓库根 `TASK-report-chart-cap-20260904.md`
@@ -29,7 +29,7 @@
## 质量门
```bash
/Users/jesse/Downloads/Copse/astrology/yinduzhanxing/.venv/bin/python -m pytest \
<home>/Downloads/Copse/astrology/yinduzhanxing/.venv/bin/python -m pytest \
tests/test_report_longform_gaps2.py \
tests/test_timing_precision_contract.py \
tests/test_report_longform_parity.py -q
@@ -1,6 +1,6 @@
# PROGRESS · 长报告对齐全量版并挂入产品(2026-09-05)
工作树:`/Users/jesse/Downloads/Copse/astrology/.worktrees/report-longform-parity-20260905`
工作树:`<home>/Downloads/Copse/astrology/.worktrees/report-longform-parity-20260905`
分支:`codex/report-longform-parity-20260905`
基线:任务书写 `d2955c62` 之后;开工 `origin/staging` 为 `3fd001ca`(含本任务书);收尾已快进到 `18a5a488`。
任务书:仓库根 `TASK-report-longform-parity-20260905.md`
@@ -1,6 +1,6 @@
# PROGRESS · consultation_workflow 全量 500(出生时间敏感度 float 崩溃)(2026-09-04)
工作树:`/Users/jesse/Downloads/Copse/astrology/.worktrees/report-sensitivity-crash-20260904`
工作树:`<home>/Downloads/Copse/astrology/.worktrees/report-sensitivity-crash-20260904`
分支:`codex/report-sensitivity-crash-20260904`
基线:任务书写 `285c5722`;开工 `git fetch` 后 `origin/staging` HEAD 为 `45e00f46`(含本任务书)。
任务书:仓库根 `TASK-report-sensitivity-crash-20260904.md`
@@ -1,6 +1,6 @@
# PROGRESS · 上游能力接入(任务 3–7,2026-09-03)
工作树:`/Users/jesse/Downloads/Copse/astrology/.worktrees/upstream-capabilities-20260903`
工作树:`<home>/Downloads/Copse/astrology/.worktrees/upstream-capabilities-20260903`
分支:`codex/upstream-capabilities-20260903`(当前基线 `origin/staging` @ `49cd66c5`)
任务书:`docs/tasks/TASK-upstream-sync-20260903.md`
@@ -56,7 +56,7 @@ quick gate 收口过程:实施中先后修复了专业导出内部标识净化
### 做了什么
1. 引入 `scripts/vedastro_rest_bridge.py`(对齐上游 `a6f47abd` 的 REST Calculate 调用)。**去掉 yn-1993 / Handan / 1993-04-17 14:49 默认值。** 默认改为虚构 smoke:Beijing `39.9042, 116.4074`,`12:00 01/01/1990 +08:00`,`LAHIRI`。
1. 引入 `scripts/vedastro_rest_bridge.py`(对齐上游 `a6f47abd` 的 REST Calculate 调用)。**去掉 [私人案例引用已移除] / Handan / [隐私标记 R001 已移除] [隐私标记 R003 已移除] 默认值。** 默认改为虚构 smoke:Beijing `39.9042, 116.4074`,`12:00 01/01/1990 +08:00`,`LAHIRI`。
2. 本地 5 次/分钟限流。HTTP 429 与本地令牌耗尽均降为 `official_blocked`,不抛给调用方当硬错误。`match` 子命令返回 `official_blocked` / `match_subcommand_not_implemented`,不伪造合盘。
3. `scripts/vedastro_gateway.py`:官方健康改为打 `/api/Calculate` 的 `Status: Pass`;status 输出 `transport=rest`、`rate_limit_per_minute=5`、`mcp_bridge_role=protocol_probe_only`。`JYOTISH_SKIP_LOCAL_ENV=1` 时探测为 `not_probed`。
4. `scripts/vedastro_parity_matrix.py` 与 fast-path checklist:MCP/API Surface 的 `fastest_path_lane` 改为 `rest_adapter`;MCP 桥文件保留,只作协议探测。
@@ -77,7 +77,7 @@ tests/test_vedastro_official_mcp_bridge.py
**67 passed**(含任务 0 的 `test_import_yinduzhanxing.py`)。REST 桥测试用录制响应,不打真网。曾有一次 `active_backend=local_fallback` 失败是 pytest 进程被 `VEDASTRO_ENABLE_NETWORK=0` 污染,不是产品回归。
`tests/test_vedastro_rest_bridge.py` 断言默认 payload **不含** `14:49`。
`tests/test_vedastro_rest_bridge.py` 断言默认 payload **不含** `[隐私标记 R003 已移除]`。
### 有网络手工跑
@@ -213,7 +213,7 @@ p50 ≈ **1.016**,最大 1.177,低于 1.3 停工线。
| ayanamsa / birth-time sensitivity 前端集合 | **135 passed / 0 failed** |
| `frontend/tests/rectification-*.test.ts` | **68 files / 840 passed / 0 failed**(基线不少于 62 files) |
| `tsc --noEmit --incremental false` | 通过 |
| 隐私扫描 | 产品默认值无真实案例;命中仅为既有校正 fixture、golden 禁止标记及「不得含 14:49」断言 |
| 隐私扫描 | 产品默认值无真实案例;命中仅为既有校正 fixture、golden 禁止标记及「不得含 [隐私标记 R003 已移除]」断言 |
- 39 文件历史全套的 7 个基线失败为:active rectification 长对话 1、dynamic rectification 3、minute development/holdout 2、日期冻结状态 1;在本分支与 `origin/staging @ 49cd66c5` 逐项相同,因此未扩大范围修改冻结算法、历史 fixture 或日期台账。
- 未跑 `docs/testing/` 的登录态浏览器校正清单;这是环境缺口,不是代码欠项。
@@ -1,8 +1,8 @@
# PROGRESS · 上游同步(任务 0–2,2026-09-03)
工作树:`/Users/jesse/Downloads/Copse/astrology/.worktrees/upstream-sync-20260903`
工作树:`<home>/Downloads/Copse/astrology/.worktrees/upstream-sync-20260903`
分支:`codex/upstream-sync-20260903`
上游只读克隆:`/Users/jesse/Downloads/Copse/astrology/.upstream-readonly/yinduzhanxing`(HTTPS + `gh auth git-credential`;未写入、未提交、未推送)
上游只读克隆:`<home>/Downloads/Copse/astrology/.upstream-readonly/yinduzhanxing`(HTTPS + `gh auth git-credential`;未写入、未提交、未推送)
任务书:`docs/tasks/TASK-upstream-sync-20260903.md`
未碰 `main`。未改 `.gitea/workflows/**`。任务 2 已合完,未提交。
@@ -20,7 +20,7 @@
rebase 无冲突。任务 2 的 ours 以 rebase 后的工作树为准,没有在 `58cae371` 上预合并。
本 worktree **没有** `.venv`(导入器 `validate_clean_target` 会拒 ignored 文件)。Python 用主仓 `/Users/jesse/Downloads/Copse/astrology/yinduzhanxing/.venv/bin/python -B`,`PYTHONDONTWRITEBYTECODE=1`。
本 worktree **没有** `.venv`(导入器 `validate_clean_target` 会拒 ignored 文件)。Python 用主仓 `<home>/Downloads/Copse/astrology/yinduzhanxing/.venv/bin/python -B`,`PYTHONDONTWRITEBYTECODE=1`。
## 任务状态
@@ -49,7 +49,7 @@ rebase 无冲突。任务 2 的 ours 以 rebase 后的工作树为准,没有
- `references/upstream/yinduzhanxing/source-manifest.json`:git 模式,无 archive 字段;`imported_at=2026-09-03T08:19:47Z` ≠ `source_committed_at`
- `references/upstream/yinduzhanxing/import-plan.json`:身份字段改到 `a6f47abd`,entries / rejected_regressions 保留
镜像 SKILL.md 原文里仍有上游对 `yn-1993` 的研究备注。那是快照,不是产品默认出生参数。产品脚本与 golden 未带 `1993-04-17` / `14:49`。
镜像 SKILL.md 原文里仍有上游对 `[私人案例引用已移除]` 的研究备注。那是快照,不是产品默认出生参数。产品脚本与 golden 未带 `[隐私标记 R001 已移除]` / `[隐私标记 R003 已移除]`。
### 咨询契约 golden
@@ -212,7 +212,7 @@ KP 带入(无隐私):
- `references/ai-reading-workflow-prompt.md` +9
- `references/mandatory-verification-gate-protocol.md` +39
无 `1993-04-17` / `14:49` / nadi 清单。
无 `[隐私标记 R001 已移除]` / `[隐私标记 R003 已移除]` / nadi 清单。
### 高冲突入口
@@ -227,7 +227,7 @@ KP 带入(无隐私):
| 1 | 顶层 import | 手工 | `Path` / `SimpleNamespace` / `Any` + `re` / `contextlib` / `io` |
| 2 | import | 手工 | 只留 `build_guided_topics`;本地 stub `build_report_theme_catalog` / `attach_calculation_profile`;不导入缺失的 startrack / calculation_profile_contract |
| 3 | `_calc_sidereal_planets_for_jd` | theirs 速度旗标 + 补 `calc_flags` | 计算正确性;ours 同函数无商业改动 |
| 4 | 新 PL9/报告辅助函数(~9107 行) | theirs + 消毒 | 纯新增且 import 可解析或已守护。去掉 1993 候选表加载、Domi 控制样本、`14:49`、本机路径 |
| 4 | 新 PL9/报告辅助函数(~9107 行) | theirs + 消毒 | 纯新增且 import 可解析或已守护。去掉 1993 候选表加载、Domi 控制样本、`[隐私标记 R003 已移除]`、本机路径 |
| 5 | envelope / startrack | 手工 stub | `_build_response_envelope` **原样返回 payload**,避免 CLI/API 合同变形 |
| 6 | `_add_chart_args` | ours | `DEFAULT_AYANAMSA_NAME`;不接 `position-mode` / `chesta-profile` CLI(shadbala 无该参数) |
| 7 | `_build_ai_prompt_pack` 岁差默认 | 手工 | name=`DEFAULT_AYANAMSA_NAME`,display=`Raman`(产品默认,不再写 Lahiri) |
@@ -250,7 +250,7 @@ KP 带入(无隐私):
`cmd_classical_*` / `cmd_nadi_*` 未取。auto-merge 进来的 argparse 与 dispatch 已删。缺失研究模块一律 stub / `_try_attr_import`,不拖脚本。
消毒:`_load_1993_candidate_segment_table` 恒返回 `None`;`_is_domi_pl9_control_case` 恒 `False`;Domi 视觉页 PDF/fixture 合同(原按空日期 + 控制样本时刻触发)整段不导入。`scripts/tajika.py` 的 PyJHora sidecar 只认 `JYOTISH_PYJHORA_PYTHON` / `python3.14` / `python3`,不带本机用户路径。`scripts/narayana_dasha.py` 把 `observed_pl9_1993_case_only` 改成 `observed_pl9_control_case_only`(答案泄漏字面量守卫)。
消毒:`[私人案例引用已移除]` 恒返回 `None`;`_is_domi_pl9_control_case` 恒 `False`;Domi 视觉页 PDF/fixture 合同(原按空日期 + 控制样本时刻触发)整段不导入。`scripts/tajika.py` 的 PyJHora sidecar 只认 `JYOTISH_PYJHORA_PYTHON` / `python3.14` / `python3`,不带本机用户路径。`scripts/narayana_dasha.py` 把 `observed_[库主案例标识已移除]_case_only` 改成 `observed_pl9_control_case_only`(答案泄漏字面量守卫)。
虚构 Beijing 1990-01-01 12:00:`full-reading`(quick 门 `test_cli_smoke` 全绿)、`pl9-export --format json` schema=`pl9_style_professional_export_v1`、树内 `status=failed` 为 0;岁差日志 `[Ayanamsa] raman`。缺研究文件的段是 `blocked`(可接受)。
@@ -1,7 +1,7 @@
# PROGRESS · 上游同步验收修复单(2026-09-04)
任务书:`TASK-upstream-sync-fix-20260903.md`
工作树:`/Users/jesse/Downloads/Copse/astrology/.worktrees/upstream-sync-fix-20260903`
工作树:`<home>/Downloads/Copse/astrology/.worktrees/upstream-sync-fix-20260903`
分支:`codex/upstream-sync-fix-20260903`
实际开工基线:`origin/staging` @ `779717f48c7ce08f9c731663f2203dae19c250c3`
原任务书验收基线:`origin/staging` @ `c1e3f32a`
+2 -1
View File
@@ -7,6 +7,7 @@
- 被环境或依赖挡住的事项写进根目录 `BLOCKED.md`;Bug 事实写进 `docs/BUG_HISTORY.md`;两者不在这里重复。
- 纯文档改动不触发 staging 门禁(见 `deploy/gated-paths.txt`)。
- [上游私人案例与本机路径清理](PROGRESS-owner-case-purge-20260919.md) — 2026-09-19,执行分支已创建;删除依赖与全仓扫描口径发现任务范围冲突,未交付。
- [侧栏导航注册循环修复与验收](PROGRESS-sidebar-navigation-loop-20260919.md) — 2026-09-19,修复/回归已完成,完整验收与 staging 交付状态见记录。
## 状态板
@@ -286,7 +287,7 @@
| `TASK-rectification-precision-gate-guided-collect-fix-20260916.md` | `PROGRESS-rectification-precision-gate-guided-collect-fix-20260916.md` | **验收修复单**:F1 `decision_receipt` 新增 `guided_collect_windows` 让 `test_rectification_engine_memoization` golden 红(在 CORE_PYTEST_TARGETS,staging 未部署 cfb41daf);F2 16 条既有校正断言红未按三栏改;F3 `mayDeliverOnPrecision` 缺省即放行、短路 BUG-654 且 `guidedCollectExhausted` 不含 refresh;F4 无领域轨道窗口轮询贴领域、一窗只问一领域;F5 离线回放注入 month_lo 非真值方向、0/20 不作数;F6 录入卡合成「或」列表句走模型轮;F7 page.tsx +1、手造 fixture。D6 产品已拍板:门槛只是必要条件,仍问完线再出。BUG 段 744 起 | **已验收通过,已合入 staging**;合入后 run `2697` 仍红 capability audit(`(secondary)/chart`),跟进 BUG-753 | `dc732825`(Opus 子代理实现,Claude 独立验收):tsc 0 / lint 0 error / npm test 3405 条 31 红与基线 a396bbe0 逐条一致(16 条校正红转绿、0 新红)/ pytest 193 通过 / `○ /` Static / gzip 582,552 → 582,800(+0.04%)/ page.tsx 1836 → 1835 / golden diff 仅加 `guided_collect_windows` 一键 / Skill 10.0.28。F5 真值方向回放三档仍 0 例靠引导件达标,作研究结论记录。D2+D6 合并后 10 分钟门槛只上报不改出卡时机 |
| — (产品口头拍板,无任务书) | `PROGRESS-agent-voice-20260917.md` | **对话口气改形状(纯提示词与文案,无 BUG 号)**:产品判定现有人设出来的是顾问报告。人设改成「把人当一个人认真对待 / 行动力很强、嘴有点毒但靠谱的同事」;开场从「一句结论 + 2–3 条短要点 + 一句下一步」换成固定形状——**反差**(表面 A 底下 B,命名成一个格局)→ **谁在推谁在修**(大运主星推、行运修体面)→ **别去应 X 的象,去扮演 Y 的象** → **最多三条短行动**(各 ≤ 20 字),仍无标题、≤ 400 字。新增希望纪律:有转机且允许精确应期就说到月份,没有就说这段时间拿来干什么、能扮演哪个象,禁「一切都会好 / 相信自己 / 加油 / 你值得更好的 / 宇宙自有安排」。申报时段与无出生分钟两条降级路线形状照给、不编月份。改 `product-voice.ts` / `consult/route.ts` 用户回合文案 / 三处复述旧形状的系统指令 / `VOICE.md`(五条原则→七条)/ `CHANGELOG.md`。零业务逻辑改动,Skill 版本不变 | 已实现,待验收 | `codex/agent-voice-20260917`:tsc 0 / lint 0 error(118 warning 不变)/ npm test 3468→3471 条、36 红与基线 `ff0427cf` 逐条相同、0 新红 / `○ /` Static / 首屏 gzip 1,416,965 两侧**字节相同**(改动全在服务端模块,客户端 chunk 无该文本)。真机口气走查欠 |
| — (产品口头拍板,无任务书) | `PROGRESS-settings-ui-20260919.md` | **设置面板布局与资料入口整理**:基线 `4f4cd684`;四分区继续共用固定 `.settings-modal`,桌面导航 176px→200px 并加分隔,内容区增加内边距,表单 cap 440px→560px,导航移除误导性右箭头;账户头像 48px→56px;“添加其他人”移到分组标题操作区。已同步 `frontend/DESIGN.md` 与合同测试;tsc 0、lint 0 error、定向测试 21/21;build 被 Windows Skill runtime symlink 权限阻塞,浏览器走查待受控环境;BUG-970 保持 `investigating` | 待验收 | `codex/settings-ui-20260919` |
| `TASK-owner-case-purge-20260919.md` | `PROGRESS-owner-case-purge-20260919.md` | **上游库主案例与本机路径残留清除(只含本仓)**:镜像同步带进库主本人案例(`pl9_1993_user_case` / `yn-1993`)与其本机绝对路径,`origin/staging` 命中 95 个文件:33 个在无引用的 `versions/` 三快照(3,467 文件、71.6 MB)、13 个前端 fixture、10 个 Python 测试(其中 1 个用生日+出生分钟、2 个断言本机路径)、11 份整机扫描台账 + 1 份 manifest、2 份会话转录、上游 SKILL 快照。运行时无特判不用动。产品拍板整体删除不留匿名版;fixture 统一虚构常量;`import_yinduzhanxing.py` 加隐私排除项 + 新增仓库级隐私守卫测试;上游 SKILL 快照等库主清完再重导入(BLOCKED 记录)。上游仓的清理指令另见 `UPSTREAM-INSTRUCTION-owner-case-purge-20260919.md`(交给库主,不在本仓执行)。BUG-972/973 | **已验收通过(2026-09-20,`497798ac`);未合入 staging,等产品放行** | 两轮:`fe9489e6` 未通过(1 P0:`import_yinduzhanxing.py` 新增的 `**/*pl9_1993*` 撞 `test_rectification_engine_convergence` 答案键守卫,该守卫在快速门 glob 内,合入会让门禁红)→ 修复单 `TASK-owner-case-purge-fix2-20260919.md` → `497798ac` 通过。Claude 在 Linux 全依赖环境独立复验:快速门 Python 步 859 passed / 0 failed(上一轮就是这步红),Python 全量 63 红与基线 `35ca7299` **逐条相同、0 新红**,收集 2,905 → 2,967(+108 新增 +3 安全行 −6 模式参数 −43 已删),tsc 0 / lint 0 error 120 warning 同基线 / `npm test` 3530 条失败清单为基线子集(少 1 条工作流 YAML,非回归)/ `○ /` Static、首屏 gzip 617,915 与基线字节相同(前端自 `fe9489e6` 起零改动)。上游指令文件已逐字节还原为 `35ca7299` 原文;12 个已删测试名与计数已落进度记录;BLOCKED 两条已划掉。校正 Skill 哈希包 186 文件、注册表、上游快照、`frontend/src`、主 API 全程 0 改动;库主本机用户名 0 命中。遗留 P3:进度记录里 Linux 收集数仍写 2,970(实为 2,967)、BUG-973「修复版本」行仍写未推送 |
| `TASK-owner-case-purge-20260919.md` | `PROGRESS-owner-case-purge-20260919.md` | **上游库主案例与本机路径残留清除(只含本仓)**:镜像同步带进库主本人案例(敏感案例标识与本机路径)并被 `origin/staging` 命中,涉及无引用的 `versions/` 三快照、前端 fixture、Python 测试、整机扫描台账、会话转录及上游 SKILL 快照。运行时无特判不用动。产品拍板整体删除不留匿名版;fixture 统一虚构常量;`import_yinduzhanxing.py` 加隐私排除项 + 新增仓库级隐私守卫测试;上游 SKILL 快照等库主清完再重导入(BLOCKED 记录)。上游仓的清理指令另见 `UPSTREAM-INSTRUCTION-owner-case-purge-20260919.md`(交给库主,不在本仓执行)。BUG-972/973 | **已验收通过(2026-09-20,`497798ac`);未合入 staging,等产品放行** | 两轮:首轮未通过(1 个隐私守卫冲突:新增路径规则与答案键守卫冲突,该守卫在快速门 glob 内,合入会让门禁红)→ 修复单 `TASK-owner-case-purge-fix2-20260919.md` → `497798ac` 通过。Claude 在 Linux 全依赖环境独立复验:快速门 Python 步 859 passed / 0 failed(上一轮就是这步红),Python 全量 63 红与基线逐条相同、0 新红,收集数与删除清单已记录;tsc 0 / lint 0 error、120 warning 同基线 / `npm test` 失败清单为基线子集(少 1 条工作流 YAML,非回归)/ `○ /` Static、首屏 gzip 与基线字节相同(前端自首轮提交起零改动)。上游指令文件已逐字节还原为基线原文;12 个已删测试名与计数已落进度记录;BLOCKED 两条已划掉。校正 Skill 哈希包、注册表、上游快照、`frontend/src`、主 API 全程 0 改动;库主本机用户名 0 命中。遗留 P3:进度记录和 BUG 状态文字待后续对账修正 |
## 命名与归档
+6 -6
View File
@@ -11,7 +11,7 @@
## 1. 事故实证
本仓从上游镜像同步时把库主本人案例(案例 ID `pl9_1993_user_case` / 别名 `yn-1993`)和库主电脑的绝对路径一起带了进来。以库主标识(案例 ID、生日字符串、经纬度、出生秒级时间、别名、本机用户名)检索 `origin/staging`,命中 95 个文件。
本仓从上游镜像同步时把库主本人案例(案例 ID `[库主案例标识已移除]_user_case` / 别名 `[私人案例引用已移除]`)和库主电脑的绝对路径一起带了进来。以库主标识(案例 ID、生日字符串、经纬度、出生秒级时间、别名、本机用户名)检索 `origin/staging`,命中 95 个文件。
检索键取法(不要写进任何提交):
```bash
@@ -23,12 +23,12 @@ git show origin/staging:tests/test_truth_source_runtime_identity.py | sed -n 14p
2. **前端测试 13 个文件把库主生日当 fixture 日期。** `frontend/tests/birth-time-journey-test-support.ts:25,34,156`、`birth-time-intake.test.ts:25,336`、`birth-time-dynamic-*.test.ts`、`birth-time-journey-*.test.ts`、`birth-time-journey-turn-persistence.test.mjs:185`。坐标已换成上海,只剩日期。
3. **Python 测试 10 个。** `tests/test_active_rectification_api.py:23,32-33,43,61,91,96,111` 用库主**生日 + 出生分钟**;`test_active_rectification_events.py`(7 处)、`test_dynamic_rectification.py:123`、`test_dynamic_rectification_fact_priority.py:11`、`test_minute_rectification_feature_facts_v4.py:62`、`test_rectification_horary_observation.py:8`、`test_rectification_kp_cusp_observation.py:21` 用生日;`test_deep_fragment_oss_reuse_gate_round2.py:20,30`、`test_truth_source_runtime_identity.py:14` 断言库主本机路径。
4. **整机扫描台账 11 份 + 1 份 manifest。** `references/oracle/` 下 2026-07 的 `deep_fragment_oss_reuse_gate_round2`、`event_judgment_fragment_rule_family_registry`、`fragment_second_pass_candidate_ledger`、`local_oss_reuse_sweep_kp_muhurta_av_compat`、`technique_fragment_inventory`(无任何读者)、`technique_promotion_audit_kp_gochara_muhurta`、`truth_source_runtime_identity`、`whole_machine_jyotish_fragment_scan`、`workbuddy_round{3,4}_candidate_ledger`、`workbuddy_round5_transfer_status`,全部只被各自的合同测试读;`scripts/technique_promotion_audit_kp_gochara_muhurta.py:21` 把库主本机备份路径当 `kp_reference`。`references/rangacharya_source_manifest.json` 含本机路径但有运行时读者 `scripts/rangacharya_readiness.py`。
5. **会话转录 2 份。** `references/upstream/1993-session-{correction-rerun,repeated-questions}.txt` 是库主本人校正会话的原文(含出生参数与生活事件),只被 `docs/tasks/TASK-rectification-convergence-20260830.md:199,407,457` 与 `PROGRESS-rectification-convergence-20260830.md:18-19` 引用。
5. **会话转录 2 份。** `会话转录已按 2026-09-19 决策删除` 是库主本人校正会话的原文(含出生参数与生活事件),只被 `docs/tasks/TASK-rectification-convergence-20260830.md:199,407,457` 与 `PROGRESS-rectification-convergence-20260830.md:18-19` 引用。
6. **上游镜像快照。** `references/upstream/yinduzhanxing/SKILL.md`(`SKILL.md:13` 声明为只读研究快照,`references/cross_project_contract/imports/*.json` 记录哈希)与 `references/upstream/test_birth_time_rectification_skill_contract.py` 含库主标识。
7. **文档示例。** `docs/superpowers/plans/2026-07-17-birth-date-picker.md:52,418` 用库主生日当示例;`docs/research/whole_machine_fragment_sweep_2026_07_{14,16}.md` 与四份 `docs/superpowers/plans/2026-07-*.md` 含本机路径。
8. **防线缺口。** `tests/test_consultation_contract_golden.py:44` 已把库主生日与出生分钟列为 `FORBIDDEN_PRIVACY_MARKERS`,但只检查咨询输出,不检查仓库文件;`scripts/import_yinduzhanxing.py:36-53` 排除清单没有任何库主案例或整机扫描模式,下次同步会原样带回。
本仓 `scripts/` 运行时**没有**上游那两个按库主生日分支的函数(`_known_case_regression_hint` / `_load_1993_candidate_segment_table`),`frontend/src/` 也无命中,不需要动运行时逻辑。
本仓 `scripts/` 运行时**没有**上游那两个按库主生日分支的函数(`_known_case_regression_hint` / `[私人案例引用已移除]`),`frontend/src/` 也无命中,不需要动运行时逻辑。
## 2. 根因
@@ -66,13 +66,13 @@ git show origin/staging:tests/test_truth_source_runtime_identity.py | sed -n 14p
**T3 删整机扫描台账与会话转录。**
- 删 `references/oracle/` 上述 11 份及各自合同测试:`tests/test_{deep_fragment_oss_reuse_gate_round2,fragment_migration_registries,fragment_second_pass_candidate_ledger,high_value_gap_registries,technique_promotion_audit_kp_gochara_muhurta,truth_source_runtime_identity,whole_machine_jyotish_fragment_scan,workbuddy_round3_candidate_ledger,workbuddy_round4_candidate_ledger,workbuddy_round4_formalization_registry,workbuddy_round4_usage_closure_queue,workbuddy_round5_transfer_status}.py`;`tests/test_skill_truth_overlay_application.py` 里读 `technique_promotion_audit_*` 的段落删除;`scripts/technique_promotion_audit_kp_gochara_muhurta.py` 整个删除。
- `references/rangacharya_source_manifest.json` 与 `scripts/rangacharya_readiness.py` 里的本机路径改 `<home>` 占位,不删文件。
- 删 `references/upstream/1993-session-*.txt` 两份与 `references/upstream/test_birth_time_rectification_skill_contract.py`;`TASK-rectification-convergence-20260830.md:199,407,457` 与 `PROGRESS-rectification-convergence-20260830.md:18-19` 改为「会话转录已按 2026-09-19 决策删除」。
- 已按原决策核实并删除两份指定私人会话转录(不在文档中重录其识别性文件名),以及 `references/upstream/test_birth_time_rectification_skill_contract.py`;`TASK-rectification-convergence-20260830.md:199,407,457` 与 `PROGRESS-rectification-convergence-20260830.md:18-19` 改为「会话转录已按 2026-09-19 决策删除」。
- `docs/research/whole_machine_fragment_sweep_2026_07_{14,16}.md` 与 `docs/superpowers/plans/` 四份里的本机路径改 `<home>`。
验收:本机用户名 `git grep -l` 在 HEAD 为 0(`references/upstream/yinduzhanxing/SKILL.md` 除外,按 §3 记 BLOCKED);pytest 数量 = 基线 − 被删测试数。
**T4 同步排除 + 仓库级隐私守卫。**
- `scripts/import_yinduzhanxing.py` 排除清单加 `**/*1993*`、`**/*wenmo*`、`**/*pl9_1993*`、`**/character_level_*`、`**/whole_machine_*`、`**/workbuddy_round*`、`**/*_scoring_manifest_*`;`tests/test_import_yinduzhanxing.py` 补一条「含库主模式的路径被拒」的用例(用文件名模式,不用真实值)。
- 新增 `tests/test_repo_privacy_markers.py`:扫 `git ls-files`(排除 pdf / wasm / `vendor/` / `references/open_source_sources/`),模式来自 `test_consultation_contract_golden.py:44` 的 `FORBIDDEN_PRIVACY_MARKERS` 复用 + 内置 `/Users/` 前缀 + `tests/privacy_markers.local.txt`(gitignore,可选),命中即失败;`references/upstream/yinduzhanxing/SKILL.md` 在库主清完上游前列为显式豁免并注明到期条件。
- `scripts/import_yinduzhanxing.py` 使用独立的 `REQUIRED_PRIVACY_PATH_PATTERNS` 强制排除原决策指定的七类私人/扫描资料路径,mirror 源和目标及 semantic_merge 路径都检查。本任务书不再复制涉及私人标识的模式字面量,具体规则以该常量为准;方括号脱敏说明不得当作 glob。`tests/test_import_yinduzhanxing.py` 按模式序号构造根目录/嵌套/大小写回归,不复制私人值。
- 新增 `tests/test_repo_privacy_markers.py`:扫 `git ls-files`(排除 pdf / wasm / `vendor/` / `references/open_source_sources/`),模式来自 `test_consultation_contract_golden.py:44` 的 `FORBIDDEN_PRIVACY_MARKERS` 复用 + 内置 `HOME_PREFIX(用户主目录前缀)` 前缀 + `tests/privacy_markers.local.txt`(gitignore,可选),命中即失败;`references/upstream/yinduzhanxing/SKILL.md` 在库主清完上游前列为显式豁免并注明到期条件。
验收:`.venv/bin/python -m pytest tests/test_repo_privacy_markers.py tests/test_import_yinduzhanxing.py tests/test_consultation_contract_golden.py -q` 通过;快速门 `run_quality_gate.py --profile quick` 通过。
**T5 记录。** `docs/BUG_HISTORY.md` 两条(§7)、`BLOCKED.md` 一条(上游快照豁免)、`CHANGELOG.md` 一行(无用户可感知行为变化,只记快照删除与隐私守卫)。
@@ -0,0 +1,94 @@
# 私人案例清理任务补充范围 · 已获产品授权
## 0. 基线 commit
- 实际开工远端基线:`35ca7299c9b9c5464002f11c00310c01919e89a1`。
- 依赖任务:`TASK-owner-case-purge-20260919.md`。
- 已有执行分支:`codex/owner-case-purge-20260919`;无争议 T2 和导入路径拦截先留本地,未交付 staging。
- 产品于 2026-09-19 通过本会话明确选择“补齐范围继续”,批准本单追加范围与精确许可口径。与原单同文件、同分支串行;不同文件可并行处理,不另起重叠实现。
## 1. 事故实证(符号定位)
1. `scripts/evidence_packet_index_integrity.py::build` 遍历 `references/oracle/evidence_packet_index_2026_07_19.json` 的路径并检查存在性;全部拟删台账仍在索引。仅模拟原删除清单,缺失路径由 0 变为 11。
2. `tests/test_evidence_packet_index_integrity.py::test_evidence_packet_index_integrity_validator_passes_current_index` 要求 `status == pass` 且 `missing_path_count == 0`。原单没有列入索引修复,机械删除会造成回归。
3. `scripts/full_technique_invocation_matrix.py` 递归扫描 `skills` / `references`;原单 T1 的版本目录虽然不参与线上 live 加载,但参与研究矩阵扫描。应验该测试,不应声称没有其他读者。
4. `scripts/skill_truth_overlay_view.py::build_effective_registry` 透传证据引用;`scripts/claim_audit_runtime_gate.py::evaluate_claim` 读取索引状态与限制;前端 truth-source identity 使用索引计数,Mastra 将 effective view 作为可查资料。当前未发现消费者自动打开待删台账,但仍有模型可达的悬空证据路径风险。
5. 仓库扫描按原单字面实现会命中 `FORBIDDEN_PRIVACY_MARKERS` 声明本身、泛用户目录前缀说明及合成安全样例。还存在原 T2/T3 清单外的历史任务、测试与研究资料命中。
6. `scripts/run_quality_gate.py` 的 quick 是显式测试列表;新文件不会因存在就自动进入快速门。
7. `scripts/rangacharya_readiness.py::build_report` 只将解析后的 manifest 转为布尔值,不读取其 sources 路径。只替换 manifest 路径并保持有效非空结构,报告输出应不变;脚本自身没有目标私人路径,不必改它。
## 2. 根因
原任务书将“主要 Skill / MCP 入口没有直接引用”误等同于“只有自身合同测试读者”,遗漏了索引、派生视图和完整性门。全仓扫描没有定义标记声明自命中与虚构安全样例的处理方式,且实际清理清单未覆盖全部命中。
## 3. 决策记录
- **已有授权**:按原单整体清除私人案例;虚构 fixture 常量化;导入路径排除;不改哈希绑定的上游快照与校正历史版本。
- **已授权(2026-09-19)**:允许同步修复下列索引/派生资料中的悬空引用,保留所有原有 blocked/reference-only 等限制;扩大到额外命中的历史文档和测试资料;标记声明及已证实虚构安全样例采用精确到节点或字面量的许可,不豁免整目录;将新隐私守卫加入现有 quick 清单。
- 本次授权修订原单“仅一个整文件豁免即全仓零命中”的字面口径:除既有上游快照临时例外外,仅允许经过核实的规则定义/合成测试样例;真实私人残留仍须为零。
- 不授权重写 Git 历史、删除其他能力证据、放宽声明边界或改业务流程。
## 4. 硬红线
1. 校正历史版本目录、注册表及来源哈希绑定不改,逐字节比对必须为零差异。
2. `frontend/src`、主 API、业务引擎不因资料清理而修改;不动 main、workflow、DNS、迁移、依赖版本。
3. 不以删完整性测试、整目录豁免、改弱 blocked/reference-only 限制换取通过。
4. 不在任务书、进度、Bug 历史、测试名和日志摘要中复写真实参数或私人路径。删除断言旧值仅用符号定位说明。
5. 不声称已完成部署或全仓清零,除非有对应实测证据。
## 5. 任务分解与验收
### F1 索引与派生资料引用修复
需追加审阅范围(不是整文件删除授权):
- `references/oracle/evidence_packet_index_2026_07_19.json`
- `references/oracle/full_technique_invocation_matrix_2026_07_22.json`
- `references/oracle/effective_skill_capability_view_2026_07_19.json`
- `references/oracle/skill_truth_overlay_2026_07_19.json`
- `references/oracle/rectification_missing_layer_integration_plan_2026_07_19.json`
- `references/oracle/source_runtime_closure_queue_2026_07_21.json`
- `references/oracle/workbuddy_round4_formalization_registry_2026_07_21.json`
- `references/oracle/workbuddy_round4_usage_closure_queue_2026_07_21.json`
逐引用判断:移除只描述已删除私人资料的记录;必要的限制记录保留,改成诚实的不可用/已移除证据状态,不伪造替代 oracle。
验收:完整性索引无悬空路径;原声明限制不放宽;补跑 evidence packet integrity、full technique matrix、claim audit gate、skill truth overlay / rectification audit、missing layer plan、source runtime closure queue 六组测试。
### F2 补足清理清单
全仓命中仅输出文件/规则代号与计数,分类为真实残留、声明节点、合成样例。逐文件清理真正残留,不大范围替换普通时间字符串。
补处理 `docs/tasks/TASK-round2-cost-and-delivery-20260831.md` 中遗漏的两处已删除会话文档引用。历史事实按原单决策保留“已删除”说明,不复制原文。
验收:新增精确许可有反向用例,证明相同文件其他位置与新增跟踪文件仍会被拦;可选本地标记文件保持 gitignored,失败输出不含命中原文。
### F3 接入快速门与完整验收
将新仓库隐私守卫加入现有 quick 显式列表,不改 workflow;运行原单要求的定向、全量、构建与健康检查。
验收:测试减少只来自获批删除清单;新增用例单列。无 Docker/依赖/符号链接权限或构建产物时,写环境缺口与基线逐项对照,不标通过。
## 6. 让步顺序
- 保持全部隐私与业务边界优先,不为做完任务机械删除索引证据。
- 引用处置无法确定时先暂停该条,不能删除声明限制。
- 前端快照删除沿用原单 T1 让步条件,但不得碰校正包。
- 环境补测可以后续在合适环境完成;测试结论不得让步。
## 7. 开工前置命令
从本轮独立工作树执行,先确认原未提交修改属于本轮;不得 stash 或覆盖。
```bash
git status -sb
git fetch origin --prune
python scripts/pre_work_check.py --remote-timeout 8 --command-timeout 45
python -m pytest tests/test_evidence_packet_index_integrity.py tests/test_full_technique_invocation_matrix.py tests/test_claim_audit_runtime_gate.py tests/test_skill_truth_overlay_and_rectification_audit.py tests/test_rectification_missing_layer_integration_plan.py tests/test_source_runtime_closure_queue_2026_07_21.py -q
```
当前主机没有项目 `.venv`,上述 python 为已检测可导入 pytest/swisseph 的系统 Python;缺少 mcp/hypothesis 的情况必须显式记录,不暗称虚拟环境完整验收。
## 8. BUG 编号起点
本轮已在本地记录 BUG-972 / BUG-973,状态分别 blocked / investigating。最终 fetch 确认远端仍为原基线,无新增占号;尚未提交/推送。以后恢复交付前仍须再核对远端最大号。相关事实优先补入这两条,不因补任务再重复开 Bug。
@@ -114,7 +114,7 @@ progress.md:1611 — "zero cases ready for blind replay"
1. **任务 0 是门控,但它只是一次信息收集,不许写代码。** 在拿到上游访谈手册与一份真实会话记录之前,不得改动 `rectification-decision.ts` 的判定。
2. **诚实性不可让渡。** 不得为了让访谈「看起来能收敛」而放宽 `confirmation-gate.ts` 的任何 blocker,不得降低 `SEALED_MINUTE_HOLDOUT` 门槛,不得在 `confirmation_allowed=false` 时宣称唯一分钟。这套 fail-closed 机制现在正在正确工作。
3. **禁止答案回流。** 任何以已知答案调出来的规则,不得进入生产打分链路,只能存在于标注 `regression_only` 且被评测明确排除的夹具里。上游已经发生过一次(见任务 0 补充),本仓当前干净,必须保持。
4. **上游同步必须过污染审查。** 不得同步任何带 `pl9_1993`、`observed_*_case_only`、`target_minute` 标记的打分逻辑,特别是上游 `scripts/narayana_dasha.py:601-613` 的 tie-break。任务 5 的同步机制必须包含这道检查。
4. **上游同步必须过污染审查。** 不得同步任何带 `[库主案例标识已移除]`、`observed_*_case_only`、`target_minute` 标记的打分逻辑,特别是上游 `scripts/narayana_dasha.py:601-613` 的 tie-break。任务 5 的同步机制必须包含这道检查。
5. **超预算的出口必须是「交付区间」,不是「失败」。** 走 `completeWithRange(..., "exhausted")`,用户拿到候选区间与明确的边界说明。任何把超预算实现成报错、静默停止或空白页的做法都是错的。
6. **不得用 holdout 调参。** `minute_rectification_holdout_v3` 的 `source_audit_status` 是 `invalidated_after_replay`,只能当开发集看趋势,**不得作为发布指标,不得写回 sealed 字段**。`v4_intake` 的 `production_tuning_allowed` 保持 `false`。
7. **不要引入第五套打分器。** 不要移植 `jyotish-app/rectification-engine.js` 的 40/35/15/10 权重。它信号更弱(无 Narayana / Arudha / Ashtakavarga / Shadbala)且从未评测。
@@ -196,22 +196,22 @@ assert receipt["claim_status"] == "candidate_range_not_birth_time_truth"
### 补充(2026-08-31)· 两份真实会话记录证明「本地收敛」源于答案泄漏
会话记录已归档:`references/upstream/1993-session-repeated-questions.txt`、`references/upstream/1993-session-correction-rerun.txt`。
会话记录已归档:`会话转录已按 2026-09-19 决策删除`、`会话转录已按 2026-09-19 决策删除`。
Agent 在记录中两次自陈:
> 我明显受到了仓里这份 1993 案例的现成高质量材料影响…不是纯靠你当下问答独立推出来的。
> 14:49 这个点,主要还是被仓里的 1993 已知校准档锁住了,不是单靠这些回答「算出来」的唯一真值。
> [隐私标记 R003 已移除] 这个点,主要还是被仓里的 1993 已知校准档锁住了,不是单靠这些回答「算出来」的唯一真值。
答案原本就写在上游 `docs/research/qizheng_1993_native_current_report_2026_08_26.md`(`1993-04-17 14:49:00`)。随后的「修正」是把答案接进打分链路(`pl9_1993_user_case`,`target_minute = 14:49`,提交 `3bb90620`)。进一步核查发现上游打分器里已有按该案例调出的规则:
答案原本就写在上游 `docs/research/[私人案例引用已移除]`(`[隐私标记 R001 已移除] [隐私标记 R003 已移除]:00`)。随后的「修正」是把答案接进打分链路(`[库主案例标识已移除]_user_case`,`target_minute = [隐私标记 R003 已移除]`,提交 `3bb90620`)。进一步核查发现上游打分器里已有按该案例调出的规则:
```
scripts/narayana_dasha.py:601 "selection_levels": ["observed_pl9_1993_gemini_sagittarius_tie_break"]
scripts/narayana_dasha.py:613 evidence_status = "observed_pl9_1993_case_only"
scripts/narayana_dasha.py:601 "selection_levels": ["observed_[库主案例标识已移除]_gemini_sagittarius_tie_break"]
scripts/narayana_dasha.py:613 evidence_status = "observed_[库主案例标识已移除]_case_only"
```
**本仓已核查未受污染**(全仓 grep `pl9_1993` / `target_minute` / `14:49` 无相关命中)。红线 3、4 用于保持这一状态。
**本仓已核查未受污染**(全仓 grep `[库主案例标识已移除]` / `target_minute` / `[隐私标记 R003 已移除]` 无相关命中)。红线 3、4 用于保持这一状态。
**但记录同时证明了真实能力**:用户的 8 条生平锚点把窗口从 14:30–15:00(30 分钟)压到 14:48–14:50(3 分钟)。**收窄是真的,选定分钟不是。** 这与 `mean_absolute_minute_error: 6.95` 及上游标签梯子顶端「still not birth-time truth」完全一致,并再次确认产品目标应为交付区间。
@@ -404,7 +404,7 @@ do_not_apply_as_birth_time_truth
### 事实
`references/upstream/1993-session-correction-rerun.txt` 里,整场对话最有价值的产物是用户主动索要的那张表:
`会话转录已按 2026-09-19 决策删除` 里,整场对话最有价值的产物是用户主动索要的那张表:
| 你的回答 | 压缩后的分钟区间 | 作用 |
| --- | --- | --- |
@@ -454,7 +454,7 @@ do_not_apply_as_birth_time_truth
### 事实
`1993-session-correction-rerun.txt` 整篇的主题就是「默认只把 14:30–15:00 当作未知区间,重新跑一轮」。
`会话转录已按 2026-09-19 决策删除` 整篇的主题就是「默认只把 14:30–15:00 当作未知区间,重新跑一轮」。
本仓 `declared_window` 在开 case 时从 profile 读一次(`v9/case-service.ts:42-43`、`rectification-agentic/session.ts:194-195`),未找到中途重定义或保留证据重跑的路径。这是高频真实场景:家人过后又想起更准确的时段。
@@ -22,7 +22,7 @@
## 1. 硬红线
1. **绝不引入任何"答案钥匙"。** 不得加入按已知用户/已知案例定向的回归提示、target_minute、校准包(教训见 Round A 根因 3:上游 `pl9_1993 target_minute=14:49` 污染事件)。所有新打分与出题逻辑必须对任意未知用户同样成立,`grep -rn "target_minute\|pl9_1993\|regression_only" scripts/ frontend/` 在改动后必须零命中。
1. **绝不引入任何"答案钥匙"。** 不得加入按已知用户/已知案例定向的回归提示、target_minute、校准包(教训见 Round A 根因 3:上游 `[库主案例标识已移除] target_minute=[隐私标记 R003 已移除]` 污染事件)。所有新打分与出题逻辑必须对任意未知用户同样成立,`grep -rn "target_minute\|[库主案例标识已移除]\|regression_only" scripts/ frontend/` 在改动后必须零命中。
2. **确认门与表达边界不动。** `confirmation_allowed` fail-closed、"不可分区间/代表性候选"措辞、candidate/accepted/confirmed 三层语义、Round A 的采用门语义,一律不改。
3. **版本与缓存一致性。** 打分语义变化必须 bump `ALGORITHM_VERSION`(`active_rectification_events`)与 `POLICY_VERSION`(`decision_policy.py`),并确认 TS `candidateSnapshotSource`(`core/snapshot-source.ts`)因 policy 版本变化而判定旧快照过期、触发重算,而不是复用旧候选。
4. **确定性。** 新逻辑全部确定性可复算:同输入同输出;先验表是版本化常量,不得运行时拟合。
@@ -52,7 +52,7 @@ const locallySelectable = separation.ranked.length > 0
### 根因 3 · "本地 Agent 能收敛到 1-2 分钟"不构成 web 端目标(答案泄漏,勿对标)
有一组本地对话记录(yinduzhanxing 根目录 `1993生时校正对话-*.txt`)显示本地 Agent 调用同一 skill 能把 1993 案例收敛到 14:49。**那不是校时能力,是答案泄漏**:本地仓里存有该用户的既有结论(`qizheng_1993_native_current_report_2026_08_26.md` 记录 14:49:00、候选段表钉死 14:48-14:50、`classical_zr_known_user_case_calibration_1993` 回归包),Agent 在对话里两次自认"14:49 主要被仓里的已知校准档锁住,不是单靠回答算出来的",随后更把 `target_minute=14:49` 作为回归提示直接写进了脚本(该污染只在上游 `codex/add-birth-time-rectification-skill` 分支 commit 3bb90620,**已核实未进入本产品仓与 vendored skill 快照**,`grep pl9_1993|target_minute|regression_only` 为零命中)。web 端面对无答案库的陌生用户,7 分钟不可分区间 + 80% 拟合才是 5 条事件的真实信息量上限。任何人(包括测试)不得以"收敛到唯一分钟"作为本轮验收口径,也不得把该上游分支的回归提示代码引入产品。
有一组本地对话记录(yinduzhanxing 根目录 `会话转录已按 2026-09-19 决策删除`)显示本地 Agent 调用同一 skill 能把 1993 案例收敛到 [隐私标记 R003 已移除]。**那不是校时能力,是答案泄漏**:本地仓里存有该用户的既有结论(`[私人案例引用已移除]` 记录 [隐私标记 R003 已移除]:00、候选段表钉死 14:48-14:50、`[私人案例引用已移除]` 回归包),Agent 在对话里两次自认"[隐私标记 R003 已移除] 主要被仓里的已知校准档锁住,不是单靠回答算出来的",随后更把 `target_minute=[隐私标记 R003 已移除]` 作为回归提示直接写进了脚本(该污染只在上游 `codex/add-birth-time-rectification-skill` 分支 commit 3bb90620,**已核实未进入本产品仓与 vendored skill 快照**,`grep [库主案例标识已移除]|target_minute|regression_only` 为零命中)。web 端面对无答案库的陌生用户,7 分钟不可分区间 + 80% 拟合才是 5 条事件的真实信息量上限。任何人(包括测试)不得以"收敛到唯一分钟"作为本轮验收口径,也不得把该上游分支的回归提示代码引入产品。
### 附带确认(本轮不修)
@@ -27,7 +27,7 @@
3. **归因表的收窄贡献必须来自服务端打分,不得由模型叙述生成。** 一张看起来专业、实则模型编的归因表比没有更糟。
4. **零贡献证据必须显式标注**,不得静默丢弃。这是诚实性的一部分。
5. **禁止答案回流**(沿用上一轮红线 3):任何以已知答案调出来的规则不得进入生产打分链路。
6. **上游同步必须过污染审查**(沿用上一轮红线 4):不得同步带 `pl9_1993`、`observed_*_case_only`、`target_minute` 标记的打分逻辑。
6. **上游同步必须过污染审查**(沿用上一轮红线 4):不得同步带 `[库主案例标识已移除]`、`observed_*_case_only`、`target_minute` 标记的打分逻辑。
7. **诚实性不可让渡**:不得放宽 `confirmation-gate.ts` 的 blocker,不得降低 sealed holdout 门槛。
8. **不得修改既有测试断言** —— 除非该断言锁的正是本轮要改的缺陷本身;那种情况必须在断言上方注明原值与原因,并在 PROGRESS 单列。
9. 推 staging 前必须 `./node_modules/.bin/tsc --noEmit` 通过。**不要用 `npx tsc`**,本仓库环境下会装到空包 `tsc@2.0.4`。
@@ -52,7 +52,7 @@ git worktree add -b codex/round2-cost-delivery-20260831 \
- `frontend/src/app/api/admin/usage/aggregate/route.ts` —— 任务 0 的现成入口
- `frontend/src/lib/agent-generation-settings.ts` —— `cachedSystemMessage()` 的 provider 分支
- `frontend/src/lib/rectification-agentic/v9/evidence-model.ts` 与 `core/rectification-decision.ts` —— 任务 2 要接归因的地方
- `references/upstream/1993-session-correction-rerun.txt` —— 归因表的目标形态就在这份记录里
- `会话转录已按 2026-09-19 决策删除` —— 归因表的目标形态就在这份记录里
---
@@ -123,7 +123,7 @@ export function cachedSystemMessage(content: string, model?: unknown) {
### 事实
`references/upstream/1993-session-correction-rerun.txt` 里,整场真实会话最有价值的产物是用户主动索要的那张表:
`会话转录已按 2026-09-19 决策删除` 里,整场真实会话最有价值的产物是用户主动索要的那张表:
| 你的回答 | 压缩后的分钟区间 | 作用 |
| --- | --- | --- |
+4 -4
View File
@@ -67,7 +67,7 @@
1. **方向单向。** 只从 `/workspace/yinduzhanxing` 读,不得向其写入、提交或推送;不得改 `sync_policy.v2.json` 的方向、受保护路径与最小保护集。
2. **受保护路径不接收上游内容**:`skills/jyotish-birth-time-rectification/**`、`skills/jyotish-vedic-astrology/**`(只能新增版本目录,不能改既有版本)、根 `SKILL.md`(只允许语义合并本任务书列出的三段)、`frontend/**`、`deploy/**`、`.gitea/**`、`references/oracle/commercial_skill_truth_overlay.v1.json`(只允许按决策记录新增条目)。
3. **校正只按任务 7 的范围动。** 上游自快照以来对校正的改动共四个提交,逐个核过:
- `3bb90620`(08-31)新增 `_known_case_regression_hint`:对 `1993-04-17` 出生时间读作者本人的已知案例标定文件,把 `14:49` 当回归目标并在分钟排名里 +5 分。**这就是已定性的答案泄漏,一行都不得进入本仓**;同一提交里按 `sensitivity_count` 排分钟的 `minute_rankings` 也不取(比本仓 V5 打分弱)。该提交里的 `active_rectification_selector.py`、`factual_reliability`、把 `scan_candidate_times` 挂进 `_candidate_scan` 是可取部分,见任务 7a。
- `3bb90620`(08-31)新增 `_known_case_regression_hint`:对 `[隐私标记 R001 已移除]` 出生时间读作者本人的已知案例标定文件,把 `[隐私标记 R003 已移除]` 当回归目标并在分钟排名里 +5 分。**这就是已定性的答案泄漏,一行都不得进入本仓**;同一提交里按 `sensitivity_count` 排分钟的 `minute_rankings` 也不取(比本仓 V5 打分弱)。该提交里的 `active_rectification_selector.py`、`factual_reliability`、把 `scan_candidate_times` 挂进 `_candidate_scan` 是可取部分,见任务 7a。
- `dbb9804a`(08-18)亲属事件域(parent / sibling / spouse_family)与分盘扩到 D3/D7/D12:本仓 `family` 域已含 D12/D7/D3,分盘列表 `[2,3,4,5,7,9,10,12,24,30]` 是超集,不取;该提交里 `ayanamsa` / `node_mode` 从请求读取的模式取,见任务 7b。
- `d5b83c71`(08-27)`compare_candidate_minutes` 固定分钟微比较:本仓 V5 score service、`minute_rectification_pairwise_v3.py`、`minute_candidate_discriminability.py`、`build_stability_diagnostics` 已覆盖且更强,不取。`references/rectification_evidence_contract_v1.json` 事件域注册表是治理数据,本仓 `rectification_technique_contract.py` 已是代码化合同且不含 D60/D40/D45,规则等价,不取,PROGRESS 记一句。
- `a9058663`(08-31)便携版校正 skill v2.0.0:与本仓 v10.0.14 服务器权威 Case 模型不同源,受保护路径,不取。
@@ -209,7 +209,7 @@ git -C /workspace/yinduzhanxing rev-parse HEAD
### 做法
1. 引入 `scripts/vedastro_rest_bridge.py`(上游 `a6f47abd` 版本),去掉其内置的 yn-1993 默认出生参数(本仓不得携带真实出生资料,默认改为虚构 smoke 数据或必填)。
1. 引入 `scripts/vedastro_rest_bridge.py`(上游 `a6f47abd` 版本),去掉其内置的 [私人案例引用已移除] 默认出生参数(本仓不得携带真实出生资料,默认改为虚构 smoke 数据或必填)。
2. `scripts/vedastro_gateway.py`:官方通路的健康判定改为对 `/api/Calculate` 的实际 `Status: Pass`;`official_verified` / `official_blocked` / `local_fallback` 三态语义不变;免费层 5 次/分钟写进 gateway 的限流参数与 `/api/vedastro_gateway/status` 输出。
3. `scripts/vedastro_parity_matrix.py` 与其他调用 `vedastro_official_mcp_bridge.py` 的路径改为走 REST 桥;MCP 桥保留文件与测试,标注"仅协议探测",不再是默认通路。`match` 合盘子命令上游尚未实现,本仓合盘对标继续标 `official_blocked`,不得伪造。
4. 更新 `docs/engine/README.md`(或本仓 VedAstro 文档所在处)与 `scripts/diagnose_vedastro_mode.py` 的说明。
@@ -276,13 +276,13 @@ git -C /workspace/yinduzhanxing rev-parse HEAD
### 7c · 不确定出生时间的报告敏感度节(P2,依赖任务 2 与任务 6)
- 引入上游四个 `flexible_birth_time_*` 模块与测试;`_build_birth_time_sensitivity` 里读 1993 分段表的 `_load_1993_candidate_segment_table` 与 `candidate_segment_table` 一并删掉,`candidate_micro_compare` 段不要。窗口来源改为:报告请求带的出生时间精度真值(`BIRTH_TIME_ACCURACY`,`TASK-consultation-birth-accuracy-20260901.md` 已贯通)为 `confirmed` 时**不生成**本节;为 `provisional` / `approximate` 时窗口取校正案例已采用的可信区间(案例不存在时用精度等级对应的固定宽度,宽度表写进代码常量并在 PROGRESS 说明),上限 15 个候选分钟,超出则只取区间两端与代表分钟。
- 引入上游四个 `flexible_birth_time_*` 模块与测试;`_build_birth_time_sensitivity` 里读 1993 分段表的 `[私人案例引用已移除]` 与 `candidate_segment_table` 一并删掉,`candidate_micro_compare` 段不要。窗口来源改为:报告请求带的出生时间精度真值(`BIRTH_TIME_ACCURACY`,`TASK-consultation-birth-accuracy-20260901.md` 已贯通)为 `confirmed` 时**不生成**本节;为 `provisional` / `approximate` 时窗口取校正案例已采用的可信区间(案例不存在时用精度等级对应的固定宽度,宽度表写进代码常量并在 PROGRESS 说明),上限 15 个候选分钟,超出则只取区间两端与代表分钟。
- 产物:`consultation_workflow` 响应新增 `birth_time_sensitivity`(schema 沿用上游 `jyotish.report_birth_time_sensitivity.v1`,`status ∈ {not_applicable, candidate_window_only}`),个人报告 bundle 新增对应的解读性事实(哪些主题结论在窗口内稳定、哪些敏感),报告附录多一节"出生时间敏感度",正文各章在该主题被标为敏感时加一句边界提示。writer 输入隔离与 schema 规则沿用。
- 验收:`confirmed` 案例的报告与改前逐字节一致(bundle hash 不变);`provisional` 案例的报告附录出现敏感度节,且每个"敏感"判断能追溯到窗口内至少一个分钟的层变化;引擎侧 `python scripts/jyotish_engine.py full-reading` 带窗口参数不依赖任何 references 数据文件;前端 `tsc` 0 错,报告测试绿。
### 任务 7 通用红线
- 仓库内不得出现任何真实出生案例;任务 7 全部 fixture 用虚构 smoke 数据。合并前 `grep -rn "1993-04-17\|14:49" scripts tests frontend/src` 必须为空(或只命中与该日期无关的既有测试数据,逐条说明)。
- 仓库内不得出现任何真实出生案例;任务 7 全部 fixture 用虚构 smoke 数据。合并前 `grep -rn "[隐私标记 R001 已移除]\|[隐私标记 R003 已移除]" scripts tests frontend/src` 必须为空(或只命中与该日期无关的既有测试数据,逐条说明)。
- `ALGORITHM_VERSION` / `POLICY` 常量不变;若任何 golden 变化,说明是新增键还是数值变化,数值变化即视为越界。
- 合入后重跑 `docs/testing/` 里校正的浏览器走查清单,结果写 PROGRESS;走不了的写环境缺口。
@@ -10,10 +10,10 @@
### 通过的部分
- 任务 0:`references/cross_project_contract/imports/commit-a6f47abd….json` 与镜像 `SKILL.md` 就位;`tests/test_consultation_contract_golden.py`、`test_upstream_git_import_a6f47abd.py`、`test_import_yinduzhanxing.py`、`test_upstream_import_plan.py` 绿;两份隐私扫描 `pass: 0 findings`;产品代码里 `grep "14:49\|1993-04-17"` 为空。
- 任务 0:`references/cross_project_contract/imports/commit-a6f47abd….json` 与镜像 `SKILL.md` 就位;`tests/test_consultation_contract_golden.py`、`test_upstream_git_import_a6f47abd.py`、`test_import_yinduzhanxing.py`、`test_upstream_import_plan.py` 绿;两份隐私扫描 `pass: 0 findings`;产品代码里 `grep "[隐私标记 R003 已移除]\|[隐私标记 R001 已移除]"` 为空。
- 任务 1:注册表 116 项,README 徽章 116 / 79 / 8 / 0 与之一致;`test_readme_badges`、`test_capability_evidence_pool`、`test_commercial_skill_truth_contract` 绿;`6.9.15` 版本目录新增、`6.9.14` 未动。
- 任务 2 / 6 的产品路径端到端(本地起 API,虚构盘 2000-01-01 12:00 UTC 0/0,career):传 `lahiri` → Moon Swati,传 `raman` → Vishakha,回执里所有 `ayanamsa*` 标签与请求一致(含 Gulika);响应顶层已有 `timing_narrative` / `module_execution_audit` / `pratyantar_dasha_timeline` / `planetary_friendship`。`jyotish_api_server.py` 11143 行 ≤ 上限 11363。
- 任务 4:`tests/test_vedastro_rest_bridge.py` 绿;默认 payload 不含 `14:49`。
- 任务 4:`tests/test_vedastro_rest_bridge.py` 绿;默认 payload 不含 `[隐私标记 R003 已移除]`。
- 前端:`tsc` 0 错、lint 0 error、全量 2575 pass / 25 fail / 10 skipped,25 条全是 Docker / rsync / YAML / Playwright 环境项,`class-name-definition-contract` 已绿。
- 全量 Python 跑完 `git status --short` 为空(整备修复单任务 4 达标)。
+2 -2
View File
@@ -17,7 +17,7 @@
| PL9 用户版 `reader_main`(`_render_pl9_user_markdown`) | 把 `blocked`→「待补」、`parameter_sensitive`→「参考」,删含 PyJHora / schema / 审计 的行 | 违反本仓真话边界(报告页 `blocked` / `conflict` 标签必须可见,`frontend/DESIGN.md` Personal report reader) | **不取** |
| 年运北印 SVG(`annual_north_indian_renderer.py`)、年运 Tajika / Mudda / saham 扩展 | 服务端 SVG | 图盘已决定前端自绘(`TASK-report-chart-render-20260909.md`) | 不取 |
| Narayana / Rashi dasha 显式合同(`rashi_dasha_explicit_contract.py`、`narayana_dasha.py` +59、`drig / lagna_kendradi / navamsha / shoola_dasha.py`) | Visti Larsen 源冻结研究 | 本仓 `narayana_dasha.py` 有商业改动,与上游 main 已分叉 | 不取;PROGRESS 记一句 |
| 校正:`_known_case_regression_hint`、「lock yn-1993 ayanamsa calibration baseline」、`active_rectification_candidates.py`、`/api/active_rectification_candidates` | 答案泄漏模式 + 候选差异合同 | 本仓已定性为泄漏(`TASK-upstream-sync-20260903.md` 硬红线 3);split-hash / 分歧面板已覆盖候选差异需求 | **不取** |
| 校正:`_known_case_regression_hint`、「lock [私人案例引用已移除] ayanamsa calibration baseline」、`active_rectification_candidates.py`、`/api/active_rectification_candidates` | 答案泄漏模式 + 候选差异合同 | 本仓已定性为泄漏(`TASK-upstream-sync-20260903.md` 硬红线 3);split-hash / 分歧面板已覆盖候选差异需求 | **不取** |
| `_render_pl9_user_markdown` 之外的 `render_pl9_markdown` 25 个 hunk、`write_pl9_pdf(edition)`、api_server +207 | PDF 版式与 MCP 报告入口 | 本仓报告是 Markdown 直渲,api_server 距增长上限只剩 67 行(11296 / 11363) | 不取 |
三方合并干跑(base = 上游 main `a6f47abd`,ours = `origin/staging`,theirs = 分支):`jyotish_engine.py` 整文件 13 冲突——但本单**不整文件合并引擎**,只搬 `cmd_full_reading` 的两个 hunk(都在本仓 L16309 附近、无冲突区域);`mcp_server.py` 2 冲突(L50 import 区、`_maybe_attach_vedastro_evidence` 附近的岁差参数改动,后者不取);`dasha_calculator_enhanced.py` 0 冲突。
@@ -49,7 +49,7 @@
5. 条件大运不得进入 `_calc_dasa_convergence` 的多系统交叉投票(保持 Vimshottari + Chara + Yogini 三系统不变),也不得进入校正打分(`rectification_*` 一个文件都不碰)。
6. 注册表新条目商业状态按 09-03 规则:网页路径实际执行的才可写 `partial`,否则 `research_only_blocked`;条件大运 10 项因 full reading 会执行且报告会显示 → `partial`,`claim_boundary` 写「条件适用性 + 子周期 profile 为 PyJHora 等分法,未做多引擎 parity」。
7. 不带任何 `references/research/**`、`references/oracle/*_2026_09_*.json` 研究台账进本仓;上游测试里 import 这些路径的用例不搬。
8. 隐私:上游测试若含真实生日(分支里有 `yn-1993`、`1993-04-17` 样本),搬过来时换成公开名人或虚构日期。
8. 隐私:上游测试若含真实生日(分支里有 `[私人案例引用已移除]`、`[隐私标记 R001 已移除]` 样本),搬过来时换成公开名人或虚构日期。
9. 前端不动(婚恋证据项走现有 evidence 渲染);若发现必须动前端,停下来写 PROGRESS。
## 5. 任务分解
@@ -1,13 +1,13 @@
# 给 yinduzhanxing 库主的清理指令(2026-09-19)
> 这份文件是交给上游仓 `yinduzhanxing`(GitHub `732642856/yinduzhanxing`)库主的独立指令,可整段贴给他的 coding agent。它不属于本仓任务书,本仓的对应工作在 `TASK-owner-case-purge-20260919.md`。
> 这份文件保留上游仓 `yinduzhanxing` 的历史清理范围,已于 2026-09-19 脱敏;不是可直接运行的脚本,也不授权本会话改上游。所有私人引用占位符仅为说明,不能作为搜索、正则或删除参数。上游执行方须在自己的受控环境重新定位并确认精确清单。它不属于本仓任务书,本仓工作见 `TASK-owner-case-purge-20260919.md`。
> 全文不转录任何出生日期、出生分钟、经纬度、本机用户名;检索键一律指到源文件行,执行时自己读。
---
## 你要做什么
把仓库里**你本人的出生案例**(案例 ID `pl9_1993_user_case` / 别名 `yn-1993` / 紫微别名文件族 `ziwei_*wenmo*`)、**另一位真实用户的三份报告**、以及**你电脑上的绝对路径**从仓库 HEAD 里清干净,并顺手清掉一批零信息损失的冗余文件。基线 `main` = `a6f47abd`(2026-09-03)。在新分支 `cleanup/owner-case-purge` 上做,做完自己看 diff 再合。
把仓库里**你本人的出生案例**(案例 ID `[库主案例标识已移除]_user_case` / 别名 `[私人案例引用已移除]` / 紫微别名文件族 `ziwei_*[库主案例标识已移除]*`)、**另一位真实用户的三份报告**、以及**你电脑上的绝对路径**从仓库 HEAD 里清干净,并顺手清掉一批零信息损失的冗余文件。基线 `main` = `a6f47abd`(2026-09-03)。在新分支 `cleanup/owner-case-purge` 上做,做完自己看 diff 再合。
## 第一步:先取检索键(不要写进任何提交)
@@ -26,29 +26,27 @@ git grep -lEf tests/privacy_markers.local.txt -- . ':!*.pdf' ':!*.wasm' ':!refer
## 第二步:运行时去特判(这是 Bug,不只是隐私)
1. `scripts/active_rectification_questions.py:176-209` `_known_case_regression_hint`:用出生日期字符串判断来访者是不是你,是就返回你的 `target_minute`。**任何和你同一天生日的用户都会拿到你的答案。** 删函数、删 `:468` 的调用和返回字段。
2. `scripts/jyotish_engine.py:2130-2160` `_load_1993_candidate_segment_table`:按年月日命中就加载 `references/oracle/1993_birth_time_candidate_segment_table_2026_08_23.json`。删函数,删 `:2072-2086` 的 `candidate_segment_table` / `candidate_segment_reference` 两键,删 `scripts/jyotish_api_server.py:14047-14049` 的读取(该文件受 `tests/test_api_server_growth_contract.py` 行数冻结,只减不增)。
3. `scripts/classical_astrology.py:100-102` 三个 `DEFAULT_CLASSICAL_ZR_*` 常量与 `:3665` 起的 `build_classical_zr_1993_event_feedback_template_packet` 及调用方,一并删。
2. `scripts/jyotish_engine.py:2130-2160` `[私人案例引用已移除]`:按年月日命中就加载 `references/oracle/1993_birth_time_candidate_segment_table_2026_08_23.json`。删函数,删 `:2072-2086` 的 `candidate_segment_table` / `candidate_segment_reference` 两键,删 `scripts/jyotish_api_server.py:14047-14049` 的读取(该文件受 `tests/test_api_server_growth_contract.py` 行数冻结,只减不增)。
3. `scripts/classical_astrology.py:100-102` 三个 `DEFAULT_CLASSICAL_ZR_*` 常量与 `:3665` 起的 `[私人案例引用已移除]` 及调用方,一并删。
4. `scripts/panchanga_api_bridge.py:26-31`、`scripts/vedastro_rest_bridge.py:19-20` 默认参数改成公开名人(AstroDatabank AA 级,例如乔布斯,资料已在 `references/real_case_calibration/replay_manifest.json`),`SUBJECT` 改成该名人 ID。
验收:`git grep -nE "1993|known_user_case|candidate_segment_table" scripts/` 为 0;`python3 -m pytest tests/test_active_rectification_questions.py tests/test_active_rectification_api.py tests/test_classical_astrology.py -q` fail=0。
## 第三步:删案例文件
```bash
git ls-files | grep -iE "1993|wenmo|1993_user" # 36 个,全删
```
分布:`docs/research` 9、`references/oracle` 8、`references/real_case_calibration` 9(含 `astrolog_parity/` 5)、`scripts` 6(`capture_1993_*.py` ×2、`pl9_1993_case_contract.py`、`qizheng_1993_replay_packet.py`、`vedastro_1993_difference_attribution_ledger.py`、`ziwei_wenmo_parser.py`)、`tests` 4(同名测试)。
历史核对曾识别 36 个案例文件。私人检索键已移除,不保留可执行的批量删除命令。上游执行方须用本地私有标记生成候选清单,逐个核实路径、读者和改动归属,再按获得确认的精确清单删除;不得把本文件的方括号占位符当正则。
分布:`docs/research` 9、`references/oracle` 8、`references/real_case_calibration` 9(含 `astrolog_parity/` 5)、`scripts` 6(`[私人案例引用已移除]` ×2、`[库主案例标识已移除]_case_contract.py`、`[私人案例引用已移除]`、`[私人案例引用已移除]`、`ziwei_[库主案例标识已移除]_parser.py`)、`tests` 4(同名测试)。
根目录三份**未跟踪**的另一位真实用户报告(`git status --short` 里 3 个 `??`,文件名含「个人印度占星报告」)直接删,`.gitignore` 加 `*个人印度占星报告*.md`。
`SKILL.md:13,125,561` 三处「yn-1993 本盘」措辞删掉;`progress.md:3474-3480,3588` 四段整段删(含你本机 `.codex/attachments/...` 路径和完整出生参数)。
`SKILL.md:13,125,561` 三处「[私人案例引用已移除] 本盘」措辞删掉;`progress.md:3474-3480,3588` 四段整段删(含你本机 `.codex/attachments/...` 路径和完整出生参数)。
## 第四步:26 个测试三分
```bash
git grep -lEf tests/privacy_markers.local.txt -- tests
```
- **直接断言你的案例存在的 13 个**:随文件删除,或只删 `case_1993` 那段断言。例:`tests/test_narayana_dense_observed_profile_matrix.py:22`、`test_narayana_pl9_multi_case_promotion_gate.py:24`、`test_narayana_dasha.py:140`、`test_classical_astrology.py:1242`、`test_qizheng_practical_rule_pack.py:61`、`test_ziwei_personal_report.py:125`、`test_startrack_full_report_opt_in.py:16`、`test_startrack_language_bridge_adapter.py:1399`、`test_vimshottari_first_balance_fix_ledger.py:23`、`test_xhs_minitool_bundle.py:113`、`test_vedastro_rest_bridge.py:35`、`test_chara_narayana_variant_profiles.py:32`。
- **直接断言你的案例存在的 13 个**:随文件删除,或只删 `[私人案例引用已移除]` 那段断言。例:`tests/test_narayana_dense_observed_profile_matrix.py:22`、`test_narayana_pl9_multi_case_promotion_gate.py:24`、`test_narayana_dasha.py:140`、`test_classical_astrology.py:1242`、`test_qizheng_practical_rule_pack.py:61`、`test_ziwei_personal_report.py:125`、`test_startrack_full_report_opt_in.py:16`、`test_startrack_language_bridge_adapter.py:1399`、`test_vimshottari_first_balance_fix_ledger.py:23`、`test_xhs_minitool_bundle.py:113`、`test_vedastro_rest_bridge.py:35`、`test_chara_narayana_variant_profiles.py:32`。
- **把你的生日当通用 fixture 的 13 个**:换成第二步选定的公开名人,或一份虚构常量(放 `tests/conftest.py`)。例:`test_local_case_fill_checklist.py:11`、`test_local_flexible_time_case_template.py:11`、`test_active_rectification_api.py:22`、`test_active_rectification_result_summary.py:125`、`test_birth_time_rectification_skill_contract.py:218`。
- `tests/test_frontend_productization.py:381` 那条「前端源码不含你生日」的守卫**保留**。
@@ -65,11 +63,11 @@ git grep -lEf tests/privacy_markers.local.txt -- tests
- `docs/rfc/**` 6 处绝对内链改相对路径(`integration_plan.md:7-8`、`test_strategy.md:7-9`、`schema.md:5`)。
- 剩下的逐文件判断:整机扫描清单删,研究文档里的路径改 `<home>`。
验收:`git grep -c "/Users/" -- . ':!references/open_source_sources' | wc -l` 为 0。
验收:运行第六步仓库守卫的内置 `HOME_PREFIX` 规则,未许可命中为 0;这是规则标识,不是要 grep 的字面字符串。
## 第六步:仓库级隐私守卫(防复发)
新增 `tests/test_repo_privacy_markers.py`:读 `tests/privacy_markers.local.txt`(gitignore 的)里的模式,扫 `git ls-files`(排除 pdf / wasm / `open_source_sources`),命中即失败;文件不存在时 skip 并打印提示。`/Users/` 前缀作为内置模式始终检查。
新增 `tests/test_repo_privacy_markers.py`:扫 `git ls-files`(排除 pdf / wasm / `open_source_sources`),检查内置用户主目录前缀规则 `HOME_PREFIX`;本地私有标记文件仅补充规则,文件缺失时内置规则仍运行,不得整项 skip。失败只报规则编号、脱敏路径、行号及计数;不输出命中原文。
## 第七步:冗余清理(零信息损失,已逐条 md5 / diff 核实)
@@ -96,7 +94,7 @@ git grep -lEf tests/privacy_markers.local.txt -- tests
python3 -m pytest tests/ -q # 失败清单与开工基线逐条比对,0 新红
python3 -m pytest tests/test_repo_privacy_markers.py -q
git grep -lEf tests/privacy_markers.local.txt -- . ':!*.pdf' ':!*.wasm' ':!references/open_source_sources' | wc -l # 0
git grep -l "/Users/" -- . ':!references/open_source_sources' | wc -l # 0
# 上面的 pytest 必须实际执行 HOME_PREFIX 内置规则;不能 grep 规则名称代替扫描。
git diff --stat a6f47abd | tail -1
```