﻿【开发测试检查点 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 历史：头像不确定闭环】默认模式先完整执行文字规则；只有文字无法明确通过或明确淘汰时才启动头像。所有不确定来源统一收口，不再只补年龄/男性：职业不明、Retired、Self-employed、公司/学校/地区等稀疏信息以及多字段同时不足都适用。头像达到成熟男性辅助条件后，卡片可进主页；主页仍无法定论则进入“头像判断表”人工查看。
【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. 插件第一次连接本机共享数据库时输入主解锁密码。
4. v12.2.19 只新增搜索页健康控制与手动搜索列表：当前“地区 + 职业”组合连续 60 秒没有实际新增暂时候选人时自动切换；手动选择的地区 + 职业组合可组成可见列表临时插队，列表完成后恢复原默认 searchIndex。旧版6秒“无新搜索卡”提前结束旁路已在v12.2.42删除；当前只使用60秒“无新增暂时候选”健康切换。
5. v12.2.29 阶段1只调整年龄推断冲突与高概率边界；卡片入口、种子资格、调度、All Friends、数据库/NO-REQUEUE 等其他业务规则不变。
6. 扩展与本机服务版本必须一致为 12.2.42.2；升级后重新运行一次“安装本机共享数据库.bat”，原数据库原地迁移并保留历史数据。


【v12.2.35 阶段7：最终清理与发布审计】
- 不改变业务判断与调度分支；仅同步正式版本、修正文档阶段标记、更新Manifest旧描述，并完成最终发布审计。
- 当前调度水位固定为200 / 80 / 30；10候选槽、old 1 + new 1、真实All Friends、>=1000硬淘汰、NO-REQUEUE均保持。
- 未发现能够无风险删除的在用业务函数，最终包不做“为了变短而删除”的危险清理。

【v12.2.34 阶段6：全链回归与三代循环验收】
- 代码侧三代完整链、页面契约和隔离本机数据库均通过；可形成根层0 -> 子层1 -> 孙层2。
- 真实Generation R需要安装后用新根种子/新未扫描好友分支观察，旧seed_friend_seen不重放。

【v12.2.34 阶段5C：种子补充低水位审计】
- 30保持不变；它同时承担低库存时先验证后代、再决定是否回搜索补根的反馈点。
- 阶段5最终调度水位为200 / 80 / 30。


【v12.2.34 阶段5B：种子启动水位保守下调】
- 只将 SEED_START_WATER 从 100 下调到 80；候选高水位继续200，种子补充低水位继续30。
- search仍是第一排根种子的点火器：达到80个可运行种子才进入集中分裂，不会因为出现少量种子就停止搜索。
- seed模式进入后仍持续到 <=30 才进入补充，因此80/30之间保留50个种子的滞回，不会在79/80附近反复切换。
- candidate模式仍整批排空；搜索耗尽时仍会使用已有种子。
- 本阶段不改变筛选、probe、自动种子资格、All Friends、双代际、数据库或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：代际繁殖可观测性】
- 只增加 seed lineage / generation 诊断，不改变任何人物通过/淘汰结果。
- 原 scheduler generation 继续只服务 old/new 双槽；新增逻辑“树层级”表示真实父子深度，根种子=0，子种子逐层+1，避免调度换代时序把第一排/第二排/第三排混淆。
- 自动子种子记录父种子、父 scheduler generation、父树层级和当前树层级；搜索根、好友子种子、人工链接、人工文件分别记录 search/friend/manual/file 来源。
- 种子质量统计新增 confirmed、review、两类新种子来源，并新增按“树层级”汇总的“代际繁殖统计”工作表和 Generation R。
- Generation R 当前只是诊断值；不会触发 poorSeed、搜索恢复、提前停止或任何隐藏阈值。旧历史种子没有 lineage 元数据时只作为本轮观察基线层0，不重扫、不重新入队。
- 调度、All Friends、卡片probe、主页终审、数据库schema、NO-REQUEUE均不改。
【v12.2.31 阶段3：默认自动种子资格对齐】
- 默认普通自动候选的 confirmed / 校准后的 review 都可进入现有 Friends / All Friends 种子能力检查。
- 不再为默认自动候选重复使用 age=yes + work.seed/score 的第二套种子质量门槛。
- 真正 seedEligible 仍必须是真实 All Friends；>=1000 全局数量硬淘汰不变。
- 功能模式与人工文件种子验证继续使用原严格种子资格，不被本阶段连带修改。
- 250/100/30、双代槽、数据库、NO-REQUEUE、好友尾部与搜索矩阵不变。

【v12.2.30 阶段2：卡片侦察入口】
- friends：角色信息量足够时才允许打开主页，最终职业仍由主页严格联合判断。
- search：只允许卡片角色与当前搜索职业匹配的资料不足卡进入主页。
- Owner/Founder/普通 Manager/Consultant/Advisor/Retired/教育-only 等不因本阶段放宽。
- 自动种子、All Friends、调度阀门、数据库与 NO-REQUEUE 不变。

【v12.2.29 阶段1：年龄冲突与高概率校准】
- 明确 Age / Born 直接证据仍最高优先；仅在推断证据之间出现“50+正向线索 + likely <50反向线索”冲突时，改为年龄证据冲突/Unknown，不允许弱线索静默覆盖另一侧。
- 高概率只允许核心年龄/地点接近 confirmed：age probable + US yes；age yes + US probable；或 age yes + US yes + 三项网络全 Unknown。网络 Unknown 仍按既有全局规则保留为 Unknown，不额外猜测或硬淘汰。
- location Unknown、age Unknown、age probable + location probable、work=review 都不再进入高概率。
- 本阶段不修改好友卡/搜索卡入口，不修改 seedPotential/seedEligible，不修改 250/100/30 调度阀门。

【v12.2.28 年龄推算与高概率门槛修正】
- 年龄 unknown 不再因为 elite/high 职业 + 美国地点而进入高概率；高概率必须具备 yes/probable 的 50+ 年龄证据。
- 教育年份增加明显偏年轻反向推算；例如 2026 年的 University 2002 会得到 likely <50，从正式结果中淘汰。
- 该反向推算只是年龄筛选证据，不声明精确出生年龄；其他规则不变。

【v12.2.25 候选误停与页面终态修正】
- 候选与文件种子先完成六次完整文字采样，再做页面级错误确认；不使用帖子/分享里的错误文字提前终止人物读取。
- 单个候选或单个种子的“内容暂时不可用 / 页面不存在”只作为该任务的页面异常处理并继续调度；真正 Temporarily Blocked / 页面加载错误仍停止并保留现场。
- 运行中只有受控任务标签的登录失效报告可以停止任务；无关手动 Facebook 标签不会再误停全局运行。
- 好友列表不可见与 Page 类型使用更严格的明确文字证据，避免正文/分享内容误触发终态。

【v12.2.24 功能模式严格白名单】
- Job Title 是严格职业白名单：填写什么职业就只要什么职业，未匹配的其他职业直接淘汰。
- 明确填写 CTO / manager / supervisor 时，以功能区职业白名单为准，可覆盖默认职业淘汰表；默认模式的 CTO 淘汰仍保留。
- 功能区已移除 Region；地区统一在“搜索页控制”设置。
- 同时填写多个功能字段时，所有已填写字段都必须满足；未填写字段不增加自定义限制。

【v12.2.22 人物资料读取简化】
- 候选主页与人工文件种子验证：六次完整 body.innerText 累积证据后再统一判断。
- 性别、年龄、地点、职业、公司/行业、教育、Page 不再依赖 DOM 结构、固定区块或前多少行。
- DOM 只保留卡片/主页链接发现、Friends / All friends 导航，以及现有网络数量读取。
- Friends / Followers / Following 与 >=1000 规则未修改。

【功能区 / 自定义筛选（Stage 2B）】
- 默认模式完全忽略功能区字段。
- 功能模式中所有已填写字段都是严格条件；Job Title 为职业白名单，未匹配就直接淘汰；未填写字段不增加自定义限制。
- Friends 自定义上限只约束 Friends；全局 Followers / Following / Friends 任一已知可靠值 >=1000 的统一硬淘汰线始终优先。
- Job Title / Industry 用于功能模式搜索与候选严格匹配；地区统一由“搜索页控制”设置；Marital Status 用于候选匹配。
- 两种模式的搜索游标 / 搜索检查点分开保存，切换不会把另一模式的搜索进度解释错。
- 设置与游标同步到现有共享运行状态；没有新增数据库 schema。
- 修改功能设置前需要先暂停运行。

【运行原则】
- 已完成任务永久去重、不重新入队；真正未完成任务按原状态继续。
- 自动候选 10 槽；种子 2 路：当前老代 1 槽 + 当前新代 1 槽；人工文件种子验证仍为独立流程。
- Candidate/profile reading uses six short samples before any business judgment; no Page/Female/network/career/confirmed/review result can end the six-sample collection early. One shared networkCountRule rejects any known Followers / Following / Friends value >=1000; 999 passes. If all three counts remain Unknown at the final decision, the record cannot enter confirmed and may at most enter review. Automatic seed verification can add explicit Friends / All friends evidence to the same final rule.
- 好友分裂不再以“三次无新好友卡”直接完成；必须出现明确非好友尾部，或可靠好友总数与唯一扫描数缺口<=10。All Friends暂未加载只保留现场/暂停，不制造假noall。

【搜索页】
- 使用独立 searchResultCardFor 卡片确认器，只认 People 主搜索结果人物卡。
- 当前组合发现新的真实搜索结果卡就继续向下；没有新卡时继续有界推进，不再因约6秒无新卡切换。
- 搜索健康计时只统计当前组合在搜索调度真正运行的时间；只有实际新增暂时候选才清零。连续60秒没有新增暂时候选时切换下一组合，这是当前唯一的自动搜索组合健康切换规则。
- 搜索本地卡片去重与永久人物去重分开，避免大量数据库重复人物造成搜索页提前结束。
- 不再使用“页面静止 / DOM 静止 / 到底静止”作为停止整个运行的条件。
- UI 可自由选择一个地区 + 一个职业组成手动搜索项，可加入多组列表、调整顺序、删除、立即执行或执行整个列表。手动列表只临时插队；执行期间默认 searchIndex 不前进，列表结束后回到原默认组合继续。

【种子代际双槽】
- 每个种子保存 generation；本机服务保存当前 oldGeneration / newGeneration 两个指针。
- 老代彻底清空的瞬间立即把指针推进一代，不等待新槽 active 页面结束。
- 正在运行的原新代页面直接成为新老代现场，不关闭、不重开、不重新 claim。
- 换代以后产生的种子进入下一代，不能被上一代换代误吞。
- 换代只移动指针，不改人物记录、不改 seed_status、不重新入队。

【版本】
- 扩展版本：12.2.42.2。
- manifest.version：12.2.42.2。
- 本机服务 SERVICE_VERSION：12.2.42.2。


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.
