fix(privacy): remove answer-key pattern collision

Apply owner-case-purge fix2 P0/F3 corrections.

Co-Authored-By: Claude Code <noreply@anthropic.com>
This commit is contained in:
jesse-ux
2026-09-20 00:55:20 +08:00
co-authored by Claude Code
parent 5cbc2d0097
commit 90309bc8b6
5 changed files with 39 additions and 20 deletions
+6 -7
View File
@@ -1,10 +1,9 @@
# BLOCKED
## 私人案例清理:远程 review 分支推送认证失败(2026-09-19
## ~~私人案例清理:远程 review 分支推送认证失败(2026-09-19)~~
- 产品要求先发布 `codex/owner-case-purge-20260919` 供远程 review;本地提交已完成,但向 Gitea 推送返回 `remote: Failed to authenticate user` / `fatal: Authentication failed`
- 随后只读 `ls-remote --heads` 成功,同名远端分支不存在;没有发布成功,未推 staging 或 main,未部署。
- 需要恢复当前账号的 Gitea Git 写入认证或权限,再推同一分支并核对远端 SHA。不读取、转交或借用凭据,不更改认证配置,不 force push。
- **已解除:** 恢复认证后已成功推送 `codex/owner-case-purge-20260919`,远端 SHA 与本地提交一致;未推 staging 或 main,未部署。此前失败历史保留,不再代表当前状态
- ~~产品要求先发布 `codex/owner-case-purge-20260919` 供远程 review;首次推送因 Gitea 认证失败。~~
## ~~私人案例清理:任务书引用范围与全仓扫描口径冲突(2026-09-19~~
@@ -13,10 +12,10 @@
- ~~禁止标记声明会自命中,历史文档和合成样例也超出原清单,精确许可口径待确认。~~
- 授权与实施记录:`docs/tasks/TASK-owner-case-purge-fix-20260919.md``docs/tasks/PROGRESS-owner-case-purge-20260919.md`。仅允许经过核实的节点/样例,不豁免整目录。
## 私人案例清理:删除测试清单写入权限(2026-09-19)
## ~~私人案例清理:删除测试清单写入权限(2026-09-19)~~
- 权限控制拒绝从本地 `scratch/owner-case-purge/deleted-tests.json` 派生逐项清单写入 `docs/tasks/PROGRESS-owner-case-purge-20260919.md`。未换工具或通过代理代写;清单留在本地忽略目录
- 任务书要求逐个记录删除测试名,该验收记录尚未完成;不声称完整交付。产品随后要求先推当前工作分支供远程 review,允许发布待审提交,但不解除此记录缺口、不合入 staging。解除需要允许仅将审查后的非敏感测试名称及计数写入指定进度文件,不包含私值、私人转录文件名或原始日志。
- **已解除:** 修复单允许把审查后的 12 个测试前缀、Linux 对照计数及非敏感核算写入进度文件;已补 F3,未写入私值、私人转录文件名或原始日志。此前权限拒绝历史保留
- ~~任务书要求的逐项删除测试清单此前因本地权限分类器拒绝而未落盘。~~
## 私人案例清理:上游哈希快照与完整验收缺口(2026-09-19)
+1 -1
View File
@@ -12834,7 +12834,7 @@
- 现象与触发:修改 mirror 映射时,原同步策略仅保护业务和凭据路径,不阻止任务书列明的私人案例与本机扫描资料路径;咨询输出检查不会扫描跟踪文件。
- 根因:导入工具缺少不可由外部 policy 移除的隐私路径规则;现有禁止标记直接以字面量写在测试源文件,原样全仓扫描将自命中。
- 修复:新增独立 `REQUIRED_PRIVACY_PATH_PATTERNS`,在 `load_policy` 同时拒绝镜像源、目标与 semantic_merge 路径,根目录与嵌套路径、大小写一致受约束;不改原商业保护集合,避免现有 policy 全部加载失败。报错不回显命中内容。
- 验证:新增 42 条参数化用例通过(mirror 28 + semantic_merge 14);同步工具整体 70 passed / 2 failed,两条失败均为基线已有 Windows 符号链接权限缺口(WinError 1314)。仓库守卫含实际扫描共 57 项通过,补齐链接只读目标文本与本地规则 BOM 回归。快速门缺少 mcp,未声称通过。
- 验证:新增 42 条参数化用例通过(mirror 28 + semantic_merge 14);同步工具整体 70 passed / 2 failed,两条失败均为基线已有 Windows 符号链接权限缺口(WinError 1314)。仓库守卫含实际扫描共 57 项通过,补齐链接只读目标文本与本地规则 BOM 回归。第二轮验收发现 `pl9_1993` 模式撞答案键守卫,已删除该重复模式;答案键禁止字面量测试保持不变并通过。快速门缺少 mcp,未声称通过。
- 防复发:保留源/目标、根/嵌套、大小写回归;仓库扫描复用既有标记并检查用户目录前缀,已接入 quick。仅精确许可经过核实的声明/合成样例及无关数值节点,48 项自测通过;历史校正包正常扫描,不豁免整目录。该固定规则集不是通用 PII 检测器。
- 关联记录:BUG-190 / BUG-191 / BUG-192(导入约束历史)、BUG-261 / BUG-278(导入与保护边界)、BUG-972(存量残留)。旧防线覆盖范围有限,未拦截本次路径资料。
- 修复版本:本轮本地工作树,尚未提交、推送或部署;待最终验收后再评估 resolved。
@@ -93,6 +93,25 @@
不记录私人出生参数、案例标识、本机用户名或会话原文;断言变更表的旧值使用原符号或定位描述,新的测试数据明确标注为虚构。
## 已删除测试逐项清单(F3
按修复单记录,获批删除的 12 个测试文件及其测试前缀如下(不含私人资料):
- `test_deep_fragment_oss_reuse_gate_round2`
- `test_fragment_migration_registries`
- `test_fragment_second_pass_candidate_ledger`
- `test_high_value_gap_registries`
- `test_technique_promotion_audit_kp_gochara_muhurta`
- `test_truth_source_runtime_identity`
- `test_whole_machine_jyotish_fragment_scan`
- `test_workbuddy_round3_candidate_ledger`
- `test_workbuddy_round4_candidate_ledger`
- `test_workbuddy_round4_formalization_registry`
- `test_workbuddy_round4_usage_closure_queue`
- `test_workbuddy_round5_transfer_status`
Linux 完整依赖环境对照:基线 2,905 条 / 501 文件,修复分支 2,970 条 / 491 文件;净变化为 `-43 + 108 = +65`,文件数变化为 `-12 + 2 = -10`。Windows 环境因缺 `mcp` / `hypothesis` 仅收集到 2,758 → 2,823,不能替代 Linux 全量数字。
## 最终复验进展与交付阻塞
- 2026-09-19 权限控制拒绝将本地 `scratch/owner-case-purge/deleted-tests.json` 派生清单写入本文件;未换工具、未交给其他代理绕过。逐个删除测试名及该批追加记录尚未落盘,当时暂停提交与推送。产品随后明确要求先推当前工作分支供远程 review,因此允许保存并发布待审提交;逐项记录缺口仍保留,不据此声称 staging 完整交付。
@@ -1,13 +1,13 @@
# 给 yinduzhanxing 库主的清理指令(2026-09-19
> 这份文件保留上游仓 `yinduzhanxing` 的历史清理范围,已于 2026-09-19 脱敏;不是可直接运行的脚本,也不授权本会话改上游。所有私人引用占位符仅为说明,不能作为搜索、正则或删除参数。上游执行方须在自己的受控环境重新定位并确认精确清单。它不属于本仓任务书,本仓工作 `TASK-owner-case-purge-20260919.md`。
> 这份文件是交给上游仓 `yinduzhanxing`GitHub `732642856/yinduzhanxing`)库主的独立指令,可整段贴给他的 coding agent。它不属于本仓任务书,本仓的对应工作 `TASK-owner-case-purge-20260919.md`。
> 全文不转录任何出生日期、出生分钟、经纬度、本机用户名;检索键一律指到源文件行,执行时自己读。
---
## 你要做什么
把仓库里**你本人的出生案例**(案例 ID `[库主案例标识已移除]_user_case` / 别名 `[私人案例引用已移除]` / 紫微别名文件族 `ziwei_*[库主案例标识已移除]*`)、**另一位真实用户的三份报告**、以及**你电脑上的绝对路径**从仓库 HEAD 里清干净,并顺手清掉一批零信息损失的冗余文件。基线 `main` = `a6f47abd`2026-09-03)。在新分支 `cleanup/owner-case-purge` 上做,做完自己看 diff 再合。
把仓库里**你本人的出生案例**(案例 ID `pl9_1993_user_case` / 别名 `yn-1993` / 紫微别名文件族 `ziwei_*wenmo*`)、**另一位真实用户的三份报告**、以及**你电脑上的绝对路径**从仓库 HEAD 里清干净,并顺手清掉一批零信息损失的冗余文件。基线 `main` = `a6f47abd`2026-09-03)。在新分支 `cleanup/owner-case-purge` 上做,做完自己看 diff 再合。
## 第一步:先取检索键(不要写进任何提交)
@@ -26,27 +26,29 @@ 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` `[私人案例引用已移除]`:按年月日命中就加载 `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` 起的 `[私人案例引用已移除]` 及调用方,一并删。
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` 及调用方,一并删。
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。
## 第三步:删案例文件
历史核对曾识别 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(同名测试)。
```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(同名测试)。
根目录三份**未跟踪**的另一位真实用户报告(`git status --short` 里 3 个 `??`,文件名含「个人印度占星报告」)直接删,`.gitignore``*个人印度占星报告*.md`
`SKILL.md:13,125,561` 三处「[私人案例引用已移除] 本盘」措辞删掉;`progress.md:3474-3480,3588` 四段整段删(含你本机 `.codex/attachments/...` 路径和完整出生参数)。
`SKILL.md:13,125,561` 三处「yn-1993 本盘」措辞删掉;`progress.md:3474-3480,3588` 四段整段删(含你本机 `.codex/attachments/...` 路径和完整出生参数)。
## 第四步:26 个测试三分
```bash
git grep -lEf tests/privacy_markers.local.txt -- tests
```
- **直接断言你的案例存在的 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`
- **直接断言你的案例存在的 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`
- **把你的生日当通用 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` 那条「前端源码不含你生日」的守卫**保留**。
@@ -63,11 +65,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>`
验收:运行第六步仓库守卫的内置 `HOME_PREFIX` 规则,未许可命中为 0;这是规则标识,不是要 grep 的字面字符串
验收:`git grep -c "/Users/" -- . ':!references/open_source_sources' | wc -l` 为 0
## 第六步:仓库级隐私守卫(防复发)
新增 `tests/test_repo_privacy_markers.py`:扫 `git ls-files`(排除 pdf / wasm / `open_source_sources`),检查内置用户主目录前缀规则 `HOME_PREFIX`;本地私有标记文件仅补充规则,文件缺失时内置规则仍运行,不得整项 skip。失败只报规则编号、脱敏路径、行号及计数;不输出命中原文
新增 `tests/test_repo_privacy_markers.py``tests/privacy_markers.local.txt`gitignore 的)里的模式,`git ls-files`(排除 pdf / wasm / `open_source_sources`),命中即失败;文件不存在时 skip 并打印提示。`/Users/` 前缀作为内置模式始终检查
## 第七步:冗余清理(零信息损失,已逐条 md5 / diff 核实)
@@ -94,7 +96,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
# 上面的 pytest 必须实际执行 HOME_PREFIX 内置规则;不能 grep 规则名称代替扫描。
git grep -l "/Users/" -- . ':!references/open_source_sources' | wc -l # 0
git diff --stat a6f47abd | tail -1
```
-1
View File
@@ -56,7 +56,6 @@ REQUIRED_PROTECTED_PATTERNS = frozenset({
REQUIRED_PRIVACY_PATH_PATTERNS = (
"**/*1993*",
"**/*wenmo*",
"**/*pl9_1993*",
"**/character_level_*",
"**/whole_machine_*",
"**/workbuddy_round*",