﻿【开发测试检查点 v12.2.42.2｜头像候选→主页终审流程修复】
本包非正式发布版，原正式版保持 v12.2.42。包含相同的原有本机数据库schema；测试时务必先备份并不要覆盖正在运行的8G多人商业版。
本检查点仅改变候选入口与头像终审衔接；头像不提供职业证明，明确反证仍淘汰。此前已终结的资料不足记录不会自动重跑。

﻿前程似锦 v12.2.42 — 安装与长期运行
【v12.2.42 全局调用链审计与架构收口】
- 按“公司规章 / 公共证据能力 / 业务部门 / 基础设施”分层收口：全局硬规则只定义一次，搜索卡、好友卡、候选主页共享同一套证据能力，但自定义模式、文件种子、人工直接种子继续保留各自部门边界。
- 头像辅助从搜索页/好友卡文字“不确定”阶段立即启动，作为第二层补充证据；明确符合直接继续，明确年轻/女性/非美国/低价值/任一已知网络数>=1000等反证仍优先，头像不能翻盘。卡片头像证据会继续带入候选主页，必要时才补主页头像。
- 候选主页先做有界页面就绪观察，再固定6次采样；卡片已知姓名、职业、年龄、地点、网络数不会因主页暂时Unknown而丢失，新的明确主页反证仍可推翻旧正向。Facebook技术错误页与真人资料不足分开。
- 终态统一为 confirmed / review / avatar_pending / other / reject / page_error；所有终态可审计并受NO-REQUEUE保护。仅头像年龄形成的review不会自动成为种子。
- 种子/All Friends边界加固：自动种子新确认Friends>=1000会停止分裂；人工直接种子保留部门特例。All Friends暂未加载不再假noall；好友分裂只有明确非好友尾部，或可靠总数与唯一扫描缺口<=10时才done。
- 搜索页只保留正式60秒“无新增暂时候选”健康切换；旧约6秒无新搜索卡提前结束旁路已删除。
- 历史旧种子来源安全迁移，来源不明任务隔离而不重排；数据库schema当前为22。checkpoint/resume双账本、跨浏览器恢复、seen/validated幂等计数和UI本批/累计统计均与SQLite真值对齐。
- 200 / 80 / 30、候选10槽、old 1 + new 1、阶段隔离、永久去重、NO-REQUEUE保持。

【v12.2.41 历史：头像不确定闭环】默认模式统一为“文字规则先判 → 明确符合/明确淘汰直接结束 → 其余所有无法定论统一启动头像辅助”。卡片不确定且头像达到成熟男性条件可进入主页；主页完整验证仍不确定且头像达到条件则进入“头像判断表”供人工查看。Self-employed 仅表示就业形态，不再被当作明确低价值职业；明确低价值职业、明确女性、明确年轻、明确非美国、任一数量≥1000等硬反证仍直接淘汰。头像待定不自动成为种子。
【v12.2.39 控制台截断修复】嵌入式控制台左栏实际宽度统一为330px，展开工作区为860px并按浏览器可用宽度自适应；修复原298px宿主裁切330px左栏导致右边缘像被截断的问题。仅UI尺寸修复，不改变头像辅助、筛选、种子树、NO-REQUEUE或200/80/30调度逻辑。
【v12.2.38 头像辅助UI可见化】
- 控制台新增“头像辅助”模块，可直接看到头像模型 READY/UNAVAILABLE。
- 显示当前头像辅助候选、已完成头像辅助验证、本批头像辅助转确定符合、本批头像辅助转高概率、本批头像辅助待定。
- 控制台候选高水位不再写死250，改为读取后台真实阈值；当前正确显示200，并同时显示200 / 80 / 30调度水位。
- 修正控制台旧提示文案，明确好友卡/搜索卡在文字资料不足时可由头像辅助获得一次主页验证机会。
- 本阶段只增加UI/统计可见性，不改变头像辅助业务规则、职业/年龄终审、种子资格、All Friends、NO-REQUEUE或数据库schema。

【v12.2.37 头像辅助安装修复】
- 修复 Windows PowerShell 5.1 在探测缺失 cv2/numpy 时把 Python traceback 当成终止错误，导致还没执行 pip 就直接 AVATAR_HELPER=UNAVAILABLE 的问题。
- 头像模型/运行库下载失败时记录明确的 pip/download 错误；核心插件仍保持降级可运行。
- 业务筛选、头像辅助规则、200/80/30、种子树、All Friends、NO-REQUEUE、数据库 schema 均未改变。

【v12.2.36 头像辅助召回】
- 头像只做单向辅助：现有文字规则已经决定要打开的人，头像永远不能拦截。
- 搜索页/好友卡只有在职业资料不足时，才会调用本机头像模型；单人、男性外观、视觉年龄偏50+可获得一次主页终审机会。
- 明确普通/低价值职业仍按原规则淘汰；头像不能把明确不符合的人救回来。
- 主页最终没有可靠年龄证据时，头像50+只提供 probable 弱辅助；明确年轻证据优先，且“仅靠头像年龄”的 review 不自动成为种子。
- 因头像进入但主页最终仍无明确工作/年龄结论的人进入“头像辅助待定”工作表，绝不作为自动种子。
- 头像分析完全在本机服务执行。首次升级后必须重新运行“安装本机共享数据库.bat”；安装器会安装 OpenCV 并下载约90MB年龄/性别模型。若头像运行环境下载失败，核心插件仍可运行，但头像辅助暂不可用。
- 数据库 schema、200/80/30、All Friends、NO-REQUEUE、old/new 双槽均未改变。


【安装 / 更新】
1. 双击“安装本机共享数据库.bat”。它会更新本机服务并保留原有数据库数据。
2. 在浏览器扩展管理页加载“extension”文件夹。
3. 第一次使用输入主解锁密码；同一台电脑的不同浏览器 / Profile 可连接同一本机共享数据库。
4. v12.2.19 新增搜索页 60 秒无新增候选健康计时和可见的手动“地区 + 职业”搜索列表；候选、职业、数量、种子、好友分裂、NO-REQUEUE 与数据库 schema 不因本版改变。扩展与本机服务必须同时为 12.2.42.2；升级后重新运行一次“安装本机共享数据库.bat”，原数据库会原地迁移到当前schema并保留历史数据。


【v12.2.35 阶段7：最终清理与发布审计】
- 本阶段没有修改人物筛选、卡片probe、自动种子资格、All Friends、好友尾部、200/80/30调度分支、old/new generation、数据库schema或NO-REQUEUE。
- 清理并修正文档中的阶段版本标记；补充阶段5C与阶段6结果；Manifest 描述同步到当前正式能力，避免继续显示v12.2.19旧说明。
- 全项目重新执行JS/Python/Manifest语法检查、三代全链、页面契约、本机服务隔离数据库、调度关键场景、版本一致性、包内临时文件与回解diff检查。
- 未发现可以在不影响现有运行/断点/去重/正式结果的前提下安全删除的业务函数，因此不为了“清理”擅自删除仍有调用链的代码。

【v12.2.34 阶段6：全链回归与三代循环验收】
- 代码侧完整模拟 search root -> candidate -> confirmed/review -> seed -> friend cards -> 第二代 -> 第三代，父子URL和逻辑树层级连续传递。
- 三代循环专项49/49、页面契约15/15、本机服务隔离数据库19/19均通过；正式业务标准未改变。
- 该结果属于代码侧验收，不等同于已在真实Facebook账号跑出三代；实际Generation R仍应使用新根种子/未扫描分支观察。

【v12.2.34 阶段5C：种子补充低水位审计】
- SEED_REFILL_LOW 保持30，不继续降低。
- 30不仅是“回搜索线”，也是种子库存下降后优先验证已有后代、让第二代/第三代有机会回灌种子池的反馈点。
- 因此阶段5最终水位保持 200 / 80 / 30。


【v12.2.34 阶段5B：种子启动水位保守下调】
- 只将 SEED_START_WATER 从 100 下调到 80；CANDIDATE_HIGH_WATER 继续保持 200，SEED_REFILL_LOW 继续保持 30。
- 目的：第一排根种子仍由 search 持续点火积累，但不必等到100个才进入集中分裂；80仍然是大批量根种子，不是“找到几个就停”。
- search/refill 达到80才切 seed；进入 seed 后仍持续集中分裂，直到种子降到30或候选达到200才离开，保留80/30之间50个种子的明显滞回带。
- candidate 模式仍整批处理到 backlog=0；不会因为80阈值在候选处理中来回切换。
- 搜索耗尽时仍按原规则使用现有种子，不会因为未达到80而闲置。
- 本阶段没有修改 SEED_REFILL_LOW、年龄/高概率、卡片probe、自动种子资格、All Friends、好友尾部、old/new generation、数据库schema、NO-REQUEUE。


【v12.2.33 阶段5A：候选高水位第一步保守下调】
- 只将 CANDIDATE_HIGH_WATER 从 250 下调到 200。
- 目的：搜索/种子 source 在累计候选时更早进入一次完整候选验证批次，让新规则更快反馈出 confirmed/review/下一代种子；仍保留大批次与模式滞回，不改成无阈值或并行流水线。
- SEED_START_WATER 仍为 100；SEED_REFILL_LOW 仍为 30。
- candidate 模式仍会一直处理到 backlog=0 才退出，因此不会在 199/200 附近来回抖动。
- search 仍是点火器：种子未达到100时，候选批次排空后继续从原搜索检查点补充；本版不会因候选阈值下调而把搜索改成“找到一点就停”。
- seed 模式仍是集中分裂：只有候选累计到200时才切候选验证；验证排空后继续原有种子/补充逻辑。
- 没有修改年龄、高概率、卡片probe、自动种子资格、All Friends、好友尾部、old/new generation、数据库schema、NO-REQUEUE。




【v12.2.32 阶段4：代际繁殖可观测性】
- 本阶段只增加种子血统与代际统计，不改变筛选、种子资格或调度行为。
- 原 scheduler generation 继续只负责 old/new 双槽调度；另记录逻辑“树层级”表示真实父子深度：根种子=0，根种子的子种子=1，以此类推。这样即使调度 generation 因换代时序前进，第一排/第二排/第三排也不会被混淆。
- 新自动种子记录 seedOrigin、父种子 URL/名称、父 scheduler generation、父树层级、当前树层级与产生它的 confirmed/review 分类；人工直接种子和人工文件种子作为 manual/file 根种子，树层级=0。
- 每个父种子继续统计唯一扫描好友卡、新增候选、已验证、confirmed、review、>=1000 与新子种子，并区分 confirmed->新种子 / review->新种子。
- 下载结果和诊断新增“代际繁殖统计”，按“树层级”显示每层已尝试/已消耗父种子、目标人物产出、新子种子和 Generation R；R 只用于观察，不会自动淘汰种子或改变调度。
- 旧历史种子如果没有 lineage 元数据，只在本轮观察中按基线根层级0处理；不重扫、不重新入队，也不猜测不存在的父子关系。
- 250/100/30、10候选槽、old 1 + new 1、真实 All Friends、NO-REQUEUE、数据库 schema 全部不改。
【v12.2.31 阶段3：默认自动种子资格对齐】
- 默认模式的普通自动候选只要最终分类已经是 confirmed 或校准后的 review，就进入现有 Friends / All Friends 种子能力检查；不再额外要求 age=yes 或第二套 work.seed/score。
- 这不是放宽主页最终标准：review 已由 v12.2.29 收紧为只差一个有边界核心证据；age/location unknown、双 probable、明显年轻、职业不完整仍不能进入 review。
- 真正成为种子仍必须确认真实 All Friends，且 Followers / Following / Friends 任一已知可靠值 >=1000 仍硬淘汰。
- 功能模式与人工文件种子验证保持原来的更严格 age=yes/work score 种子门槛，避免默认模式修改跨模块改变其既有行为。
- 250/100/30 调度、双代种子、数据库schema、NO-REQUEUE、好友尾部、搜索矩阵均不改。

【v12.2.30 阶段2：好友卡 / 搜索卡侦察入口】
- 最终主页职业标准不放宽，仍要求职位 + 公司/行业联合成立。
- 好友卡只在出现明确目标角色时允许打开主页终审；教育-only、空白、泛 Engineer/Manager/Consultant/Advisor/Retired、Owner/Founder 等仍不因资料不足而打开。
- 搜索卡只借用当前搜索词的目标角色上下文；卡片角色与当前搜索角色匹配时可打开主页，不再把所有 unknown 卡片都放开。
- 明确低价值职业/行业、Assistant、CFO/CTO 等原硬拒绝继续优先，不能被侦察入口绕过。
- 250/100/30 调度、All Friends、自动种子资格、数据库/NO-REQUEUE 本阶段不改。

【v12.2.29 阶段1：年龄冲突与高概率校准】
- 推断年龄同时出现50+正向证据与likely <50反向教育证据时，不再由简单status排序强行选一侧；改为冲突/Unknown，避免进入高概率或种子链。
- 高概率收紧为核心年龄/地点只差一个有边界证据；地点完全Unknown、年龄完全Unknown、年龄与地点同时probable、职业仅review均不再进入高概率；网络 Unknown 继续遵循既有全局规则。
- 直接Age/Born事实仍最高优先；本阶段未修改卡片probe、自动种子资格、All Friends、调度阀门、数据库schema与NO-REQUEUE。

【v12.2.28 年龄推算与高概率门槛修正】
- 修正“年龄 unknown + 美国地点 + elite/high 职业仍可进入高概率”的旧旁路：高概率现在必须具备 yes/probable 的 50+ 年龄证据，职业不能替代年龄条件。
- 教育年份增加“明显偏年轻”的反向推算。它只在明确教育阶段且按正常年龄上界加年份误差后仍低于 50 时触发，用于淘汰明显偏年轻候选，不把教育年份伪装成精确出生年龄。
- 例：2026 年看到 University 2002，按大学阶段上界 24 岁并加 1 年年份误差，当前上界约 49，因此判为 likely <50，不再进入高概率。
- 原有明确生日/出生年份、保守证明 50+、around 50、工作起始/职业年限推算保持；职业、地点、性别、Friends/Followers/Following、999/1000、候选10槽、种子双槽、NO-REQUEUE、数据库与断点未改。

【v12.2.25 候选误停与页面终态修正】
- 候选/文件种子主页的六次完整文字采样必须先完成，再做一次页面级错误确认；不再因为页面早期尚未渲染完整或某条失效帖子而提前结束采样。
- “This content isn’t available / 内容暂时不可用”若确认为单个候选主页错误，只记录并关闭该候选后继续补槽，不再停止整个运行。种子好友来源页同类单页错误也只结束该种子。
- 页面错误、登录失效、好友列表不可见、Page 类型判断均收紧为页面级/明确证据，避免帖子、分享内容或无关浏览器标签中的相同文字触发全局终态。
- 真正的 Temporarily Blocked、页面加载错误、授权/本机服务/任务现场故障仍按原规则停止并保留未完成任务。功能模式、默认模式、职业规则、Friends / Followers / Following 与 >=1000、搜索、种子分裂、NO-REQUEUE、数据库 schema 均未改。

【v12.2.24 本次更新】
- 功能模式的 Job Title 改为严格职业白名单：填写 physician 就只保留匹配 physician 的职业，其他职业直接淘汰；多个职业以逗号分隔时，匹配任一已填写职业即可。
- 功能模式中明确填写 CTO / manager / supervisor 等职业时，以用户填写的职业白名单为准，可覆盖默认职业淘汰表；默认模式仍保持 CTO 淘汰。
- 功能区移除 Region 字段及 Region 候选过滤；地区统一由“搜索页控制”的地区选择负责。升级后旧版本已保存的 qcFilterRegion 会在加载功能设置时自动清除并停止生效。
- 同时填写 Friends / Industry / Job Title / Marital Status 等多个字段时，所有已填写字段都必须满足；未填写字段不增加自定义限制。

【v12.2.22 人物资料读取简化】
- 候选主页与人工文件种子验证的人物资格证据改为六次完整 body.innerText 累积后统一判断。
- DOM 不再参与性别、年龄、地点、职业、公司/行业、教育、Page 等人物资格判断；不再使用前90/130/180/230等固定行数或 Work/Personal details/Education 固定区块作为判断门槛。
- DOM 仅继续用于搜索/好友卡片与主页链接发现、Friends / All friends 导航，以及按用户要求保持不动的 Friends / Followers / Following 数量读取。
- 现有筛选标准、>=1000 边界、搜索、候选10槽、种子双槽、好友分裂、NO-REQUEUE、数据库 schema 均保持不变。


【v12.2.21 本次更新】
- 仅在“人工加入优质种子”区域新增“一键清空人工种子”。
- 只清除仍处于 pending / paused 的人工直加种子；正在分裂的人工种子不强行中断。
- 不清自动发现种子，不清文件种子验证池，不改候选、搜索、好友分裂、去重、NO-REQUEUE 或数据库 schema。


【v12.2.19 本次更新】
- 当前搜索组合新增独立 60 秒“无新增暂时候选人”健康计时；调度离开搜索时计时暂停，真正新增候选才清零。
- 【已被v12.2.42覆盖】旧版曾保留连续约6秒无新搜索结果卡的提前结束规则；当前正式版已删除该旁路，仅使用60秒“无新增暂时候选”健康切换。
- UI 新增手动“地区 + 职业”组合列表：可加入多组、上移/下移、删除、立即搜索或执行列表。
- 手动列表只临时插队，默认 searchIndex 不前进；列表结束后回到原来的默认搜索进度。
- v12.2.18 候选六次完整采样、搜索卡严格入口及其余业务规则保持不变。

【功能区 / 自定义筛选（Stage 2B）】
- 默认模式：完全忽略功能区字段，继续使用 v11.16 原搜索矩阵与候选判断。
- 功能模式：所有已填写字段都是严格条件；Job Title 为职业白名单，未匹配已填写职业直接淘汰。未填写字段不增加自定义限制。
- Friends 最大数量只约束 Friends 自身；原有 Followers / Following / Friends 任一已知值 >=1000 的全局淘汰规则始终保留。
- Job Title / Industry 可改变功能模式搜索组合，并在候选主页严格匹配；地区统一由“搜索页控制”选择，不再由功能区过滤；Marital Status 只参与候选主页筛选。
- 默认模式与功能模式分别保存搜索游标和搜索检查点，切换后恢复各自进度。
- 功能设置与游标进入现有共享运行检查点，同机换浏览器 / Profile 时保持一致；没有新增数据库表或 schema。
- 运行中不可修改功能设置；先暂停，再保存切换。

【数据位置与原则】
- 本机共享数据库：%LOCALAPPDATA%\QianChengJin\data\qianchengjin.db
- 正式历史、永久去重、任务状态与关键进度继续使用同一份数据库。
- 不建立第二份人物数据库；种子只在既有 seedData 中记录 generation。
- 已完成任务不重新入队；真正未完成任务保留原状态与进度续跑。

【搜索页：结果卡片驱动】
- 搜索页只把 People 搜索主结果中的真实人物结果卡作为“搜索仍在继续”的证据。
- 导航、推荐人物、People You May Know / Suggested for you、Pages / Groups / Posts / Photos / Reels / Videos / Events / Marketplace 等模块不算当前搜索结果卡。
- 当前“地区 + 职业”出现新的本地结果卡：无新卡计数立即清零，继续向下。
- 当前没有新结果卡：继续有界向下推进；不会再因约6秒无新卡提前结束。只有当前组合在搜索调度实际运行期间连续60秒没有新增暂时候选时，才切换下一职业。
- 同一地区的全部职业跑完后才进入下一个地区。
- 搜索页本地新卡与数据库永久去重分开：即使人物以前已处理过，只要该卡是当前组合新加载出来的真实结果卡，也会作为“页面仍在继续”的证据；候选入库阶段仍会永久去重。
- 已删除“到底 + DOM 静止约 5 秒就停止整个运行”的旧路径。

【种子代际双槽】
- 当前老代固定 1 路；当前新代固定 1 路。
- 每个种子保存 generation；数据库只保存一份人物记录，不复制、不搬表。
- 人工直接种子与人工文件验证通过的根种子进入当前老代；自动候选新发现的优质种子进入当前新代。
- 当当前老代最后一个 pending / active / paused 任务消失的那个瞬间，只移动两个代际指针：原新代立即成为老代，下一代立即成为新代。
- 如果原新代此时已有 active 页面，该页面不关闭、不重开、不重新领取，直接在逻辑上成为老槽正在运行的页面。
- 换代以后才产生的新种子进入新的新代，不会被误并进上一代。
- 换代不改 seed_status、不退回 pending、不复制记录、不产生重试队列，NO-REQUEUE 保持不变。
- v11.8 的 old/new lane 在首次启动 v11.9/12.2.7 服务时一次性迁移为 generation；pending / active / paused / done 等原状态保持不变。

【候选与自动种子】
- 自动候选仍为 10 槽，0.5 秒错峰，关 1 补 1。
- Candidate age, profession, gender, and US-location rules are unchanged. For network counts, any known Followers / Following / Friends value >=1000 rejects immediately; a missing value remains unknown and does not reject.
- After seedPotential is met, the automatic candidate opens Friends and confirms a real All friends tab. A missing Friends count no longer blocks seed entry; any known network value >=1000 has already been rejected before this step.

【好友分裂】
- All Friends 先经过有界唤醒/等待；只有页面明确表示无好友/不可用才进入 noall，暂时未加载只保留现场并在达到保护阈值后暂停。
- 好友分裂不再以“三次无新好友卡”直接done。只有最后好友后出现明确非好友模块，或可靠显示好友总数与唯一扫描数的缺口<=10时才完成；总数Unknown且没有明确尾部时保持未完成。

【版本】
- 浏览器扩展：12.2.42.2。
- 本机服务：12.2.42.2。
- 数据库 schema：22。


Stage 3 local authorization
- Open the popup and copy the displayed Machine ID.
- A signed license code for that Machine ID is required before Start / Continue can run.
- The license file is local to this computer and shared across browser Profiles because it is stored by the local service, not browser storage.
- Expiration comes from the signed license payload; this verifier does not impose a fixed one-month duration.
- When a license expires during a run, unfinished work and checkpoints are preserved and the run stops; a new valid license can continue from the saved position.
- LicenseGenerator is intentionally NOT included in Stage 3; it belongs to Stage 4, and its private signing key must never be copied into the share-side package.
