ADC Pool 漏斗 Level 01 定义与执行契约(contract-only,未执行) - #57
Merged
Conversation
…ecuted) Freeze the definition, criteria, ordering, semantics, evidence standard and output validation for ADC Pool Level 01, and record which criteria the level uses in a machine-readable registry. Nothing is executed: no clinical context is enumerated, no target is enumerated, no pair, disposition, ranking or recommendation is produced. This ordering is what the 2026-08-04 rulings on PR #53 and #54 require: a contract-only PR freezes scope and semantics first, then APPROVE, then the run. This PR is that prerequisite for Level 01. Level 01 executes zero Gates. It runs three eligibility locks that produce CandidateFilterResult, which the contract states explicitly is not a Gate result. Each lock borrows one Gate's responsibility without constituting that Gate's PASS. There is also a hard reason, measured from the repository: the dependency chain is T7 -> T2 -> {T0, T1}, and the source document rules T1 out of Level 01-03, so Level 01 cannot produce a legitimate T7 result at all. Locks are the only expression compatible with the frozen topology. Cost is defined as marginal cost per candidate eliminated, which granularity determines: eliminating a clinical context removes a whole column, a target a whole row, a pair-level criterion one cell. Hence context -> target -> pair, enforced mechanically by test. Cheapness alone is insufficient: C42/C44/C45 are all cost_tier low, cheaper than T2/T7/T11, but competitive crowding must not KILL alone, so they cannot run first. GAP-P01..GAP-P06 are recorded, not resolved. GAP-P05 is a direct conflict between EarlyReductionSchedule, which forces T2 before T7, and the source document, which wants T7 first at Level 02. BLOCK-02: LOCK-02 needs a CRC clinical context list, and the only enumeration available comes from the quarantined PR #53 run, so even with APPROVE Level 01 cannot execute until that upstream run is re-executed and accepted. No architecture change: src/, src/contracts/, genmodules/, extensions/, docs/architecture/ and AGENTS.md are untouched; no Gate added and the 45-Gate topology is unchanged. 242 tests pass (228 baseline + 14 new). The new tests were mutation-tested, with all five mutations caught and rolled back exactly. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Blocker 1: no_known_linkage was EXCLUDE while the same contract stated absent evidence always DEFERs and absent_evidence_may_exclude was false. The reviewer is right that this is not cosmetic: "no linkage found" conflated "not yet assessed / search incomplete" with "searched the declared scope and found nothing", and an executor could encode ordinary missing evidence either way, which directly changes the size of Pool Level 01. LOCK-03 now has four outcomes, each carrying an explicit evidence_state. linkage_unassessed (not_assessed) and the new linkage_evidence_missing (absent_incomplete_search) both DEFER to hold. Exclusion is only available as no_known_linkage_after_complete_search, whose semantics are restricted to EXCLUDE_FROM_ACTIVE_POOL with is_scientific_disproof false, is_killed false and a permanent reactivation-eligible state. It requires six search-completeness fields; missing any one forces a fallback to linkage_evidence_missing. The snapshot carries those six columns, 25 -> 31. Blocker 2: the old identity summed killed and superseded into the Universe Index pair-state total, but a target ruled not_surface_target is by definition not an eligible surface target. Context-level, target-level and pair-level outcomes were mixed into one total, so no unique denominator existed at run time. I had not spotted this. Level 01 now produces three objects: Raw Enumeration Matrix (raw x raw, may contain excluded items), Eligible Universe Index (eligible contexts x eligible targets) and Pool Level 01 (pair states active/hold/reactivation-eligible), plus two eligibility audit artefacts. State vocabularies are split per granularity; killed and superseded are audit history and are excluded from pair reconciliation. CNT-01..CNT-05 are machine-readable and the tests evaluate them on a worked example, asserting that superseding a context removes exactly |eligible_targets| pairs and killing a target removes exactly |eligible_contexts|, while the raw matrix is unchanged. GAP-P03 and GAP-P04 are restated to match, and both remain unresolved: the three-object structure and the two EXCLUDE semantics are still external encoding conventions rather than contract support. Tests 14 -> 23, covering each acceptance criterion the reviewer specified. 251 tests pass. Ten further mutations were caught and rolled back exactly, fifteen across both rounds. Still no change under src/, genmodules/, extensions/, docs/architecture/ or AGENTS.md, and no Gate added. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…l-level-01 # Conflicts: # logs/worklog.md
leezx
added a commit
that referenced
this pull request
Aug 5, 2026
…ut-binding ADC Pool Level 01 input binding, contract-only, raw-axis binding only. ChatGPT APPROVE, 2026-08-04, after three REQUEST_CHANGES rounds. The connector returned 403 so no review is recorded on GitHub; the rulings were relayed by the human lead and are recorded in docs/handoff/2026-08-04-adc-pool-level-01-input-binding.zh-CN.md sections 11-13 and logs/worklog.md. This merge accepts the input binding of the raw clinical-context and raw target axes, the derivation boundaries, and the evidence-gap definitions. It does NOT authorise executing Level 01 and approves no candidate, no target, no clinical context, no screening result, no ranking, no experimental recommendation and no scientific conclusion. scope_of_authorisation is raw_axis_binding_only and authorises_level_01_execution is false. Two gaps block execution: EVGAP-01 needs a controlled target-surface localization evidence extraction, because the approved layer contains zero occurrences of plasma membrane, extracellular, localization, signal peptide or GPI; EVGAP-02 needs a controlled CRC-specific target-context linkage extraction, because all 41 crc_prevalence units are not_available and none of the 33 supporting adc_precedent units carries an indication. Each needs its own contract-only PR and APPROVE. Semantics fixed across the review rounds and locked by tests: transmembrane annotation may only yield possible_surface_target and DEFER, never eligible; pan-cancer ADC precedent is target/modality metadata and cannot satisfy CRC linkage; indication_fit cannot substitute for source-level CRC evidence; missing and conflicting evidence never exclude; and VAL-B07, lock_01_derivation.coverage and predicted_result_shape.target_eligibility must agree key by key at 0 eligible, 41 hold, 0 killed. Three executor errors are recorded rather than concealed: binding LOCK-03 to crc_prevalence alone would have guaranteed an empty pool; counting "statement contains CRC" was a false positive produced by the disclaimer clause; and the BLOCK-02 wording in PR #57 over-generalised "quarantined" into "no usable input", which is why no new enumeration run was in fact needed. PR #53 and #54 artefacts remain barred. No Gate was run, no score assigned, no ranking produced, and no candidate, evidence or result entered the repository. 283 tests pass.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
状态
第一轮审核
REQUEST_CHANGES的两条阻断已全部接受并在本 PR 内修订完毕,请复审。6036c01(首轮受审 HEAD 为0e39ef5)main基线e7092d5,5 个文件、+1312/-0Ran 251 tests全部通过(基线 228 + 新增 23)logs/worklog.md。这个 PR 是什么
冻结 ADC Pool 漏斗 Level 01 的定义、判据、顺序、语义、证据标准与输出验证,并把「本层用了哪些判据」写成可复核的机器可读记录。
本 PR 不执行 Level 01。 没有枚举 clinical context、没有枚举 target、没有生成任何 pair、disposition、排序或推荐。没有任何外部运行。
这个先后顺序是 2026-08-04 对 PR #53 与 #54 的裁决所要求的:先用 contract-only PR 预先冻结范围与语义,获
APPROVE后再运行,重跑产物才是被接受的产物。本 PR 就是 Level 01 的那个前置契约。docs/pools/ADC_POOL_FUNNEL_LEVEL_01.zh-CN.mddocs/pools/adc_pool_gate_usage.yamltests/test_adc_pool_gate_usage.pyCandidateFilterResult语义上docs/handoff/2026-08-04-adc-pool-level-01.zh-CN.mdlogs/worklog.md本轮修订:两条阻断
阻断 1(接受):
no_known_linkage的 disposition 与证据标准自相矛盾契约同时写着「证据缺失一律 DEFER,永不 EXCLUDE」与
absent_evidence_may_exclude: false,却把no_known_linkage定为 EXCLUDE。审核方指出这不是文字问题:「没有发现 linkage」混合了「未评估/检索不充分」与「已完成规定范围检索仍无发现」两种完全不同的情况,执行者可任选一种编码,直接影响 Pool Level 01 的规模。LOCK-03的 outcome 由 3 拆成 4,每个 outcome 新增evidence_state:linkage_evidence_existsactivepresentlinkage_unassessedholdnot_assessedlinkage_evidence_missing(新增)holdabsent_incomplete_searchno_known_linkage_after_complete_search(更名并收紧)reactivation-eligibleabsent_after_complete_search那唯一的 EXCLUDE 被硬性收紧:语义只能是
EXCLUDE_FROM_ACTIVE_POOL,并写入is_scientific_disproof: false、is_killed: false、retained_in_eligible_universe_index: true;必须附六项检索完整性记录(search_complete、search_policy_ref、source_coverage_ref、search_scope、searched_at、search_policy_version)才允许输出,缺任何一项必须退回linkage_evidence_missing(DEFER)。快照相应 25 列 → 31 列。evidence_standard显式列出absent_evidence_states: [not_assessed, absent_incomplete_search],并把「完整检索后无发现」单列为不属于证据缺失。按验收标准新增测试:
test_missing_or_unassessed_evidence_can_never_exclude、test_only_a_completed_search_may_remove_a_pair_from_the_active_pool、test_completeness_fields_are_carried_by_the_snapshot、test_definitional_exclusions_are_never_reactivation_eligible。阻断 2(接受):Universe Index 的定义与计数公式不一致
原公式把
killed(含not_surface_target)与superseded(含redundant_context)算进 Universe Index 的 pair-state 总和,但被判not_surface_target的靶点按定义已不属于「合格 surface targets」。context 级资格结论、target 级资格结论与 pair 级池状态被混进同一总和,运行时得不到唯一正确的 denominator。这一条我原先没看出来。拆成三个对象(另加两份资格审计产物,共五份,不得合并成一张表):
undefined_context/redundant_context/not_surface_target/identity_unresolvedactive/hold/reactivation-eligible状态词表按粒度分开:context 级
eligible/hold/superseded;target 级eligible/hold/killed;pair 级active/hold/reactivation-eligible。原来那份混合的五值pool_states已删除。killed与superseded属资格审计历史、不参与 pair 级对账,写入excluded_from_pair_reconciliation。五条计数恒等式写成机器可读形式(
lhs+rhs_product/rhs_sum):CNT-01:|raw_matrix| = |raw_contexts| × |raw_targets|CNT-02:|eligible_universe_index| = |eligible_contexts| × |eligible_targets|CNT-03:|eligible_universe_index| = |active| + |hold_pairs| + |reactivation_eligible_pairs|CNT-04:|raw_contexts| = |eligible_contexts| + |hold_contexts| + |superseded_contexts|CNT-05:|raw_targets| = |eligible_targets| + |hold_targets| + |killed_targets|测试在算例上实际求值,不是只检查字段存在:
test_counting_identities_are_consistent_on_a_worked_example、test_superseding_a_context_removes_exactly_one_column(context 被 superseded 时 Eligible Universe Index 恰好减少|eligible_targets|,Raw Matrix 不变)、test_killing_a_target_removes_exactly_one_row(恰好减少|eligible_contexts|)、test_pair_reconciliation_excludes_killed_and_superseded、test_pool_objects_separate_eligibility_audit_from_pair_states。Level 01 的核心结论:运行的 Gate 数量是零
只运行三把 eligibility lock,产出
CandidateFilterResult——按契约明确不是 Gate 结果。gates_not_run逐一列出全部 45 个 Gate,测试断言与冻结拓扑完全相等;result_is_gate_result: false;gate_scores_written: none;EVALUATED/NOT_EVALUATED/UNRESOLVED全域保留。LOCK-02context eligibilityclinical_context_endpoint(T0,low)LOCK-01target identitytumor_cell_surface_availability(T7,medium)LOCK-03linkage existencetarget_population_mapping(T2,medium)除了设计取舍,还有一个实测得到的硬理由:依赖链是
T7 → T2 → {T0, T1},而来源文档第五节明确 T1 不适合作 Level 01–03 的普遍筛选器,冻结拓扑又要求按依赖顺序执行、不得跳过前置 Gate。故在不跑 T1 的前提下,Level 01 结构上不可能产生一个合法的 T7 结果。 三把锁写成CandidateFilterResult是唯一与冻结拓扑相容的表达。顺序原则怎么落地的
成本 = 每淘汰一个候选的边际成本,由粒度决定:淘汰一个 context 移除候选矩阵一整列,一个 target 移除一整行,pair 级判据每次只处理一格。故顺序必为 context → target → pair。与来源文档第四节独立一致,并解释了它为什么对。由
test_locks_run_cheapest_granularity_first机械保证。便宜本身不够,必须同时具备否决力。 反例来自实测:45 个 Gate 中
cost_tier = low的只有 7 个,其中competitive_position_entry_window/patent_landscape/preliminary_technical_fto比 T2/T7/T11 的medium更便宜,但竞争拥挤不得单独 KILL,所以不能排在最前。完整表述:在阴性结果具有否决力的判据里,先跑边际成本最低的那个。明示的偏离与缺口
DEVIATION-01(第一轮已获接受):来源文档的weak_or_redundant_context拆成redundant_context(EXCLUDE,可判定的集合包含关系)与weak_context(DEFER,价值判断)。GAP-P01..GAP-P06已记录、未解决,需独立任务与月度额度:GAP-P01/P02:内核没有 pool level 身份/快照对象,没有active/hold/killed/superseded/reactivation-eligible生命周期状态。GAP-P03(本轮改写):内核没有三对象结构,也没有把 context/target 级资格审计与 pair 级池状态分开的结构,故三对象与CNT-01..CNT-05只能靠外部产物加本注册表约束表达。GAP-P04(本轮改写):CandidateDisposition三值无法区分EXCLUDE_DEFINITIONALLY_INELIGIBLE(killed/superseded)与EXCLUDE_FROM_ACTIVE_POOL(reactivation-eligible,非科学证伪);本契约靠disposition_semantics与resulting_state补足,属外部编码约定而非契约支持。GAP-P05(Level 02,冲突):src/capabilities/early_t_gate_reduction.py的EarlyReductionSchedule硬性要求 T2 先于 T7,来源文档第四节要求 Level 02 先跑 T7。二者不能同时成立。GAP-P06(Level 02):EARLY_REDUCTION_GATE_IDS不含任何 C Gate,Level 02 的 C2/C4/C5 quick scan 无法通过既有能力调度。架构影响
未触碰
src/、src/contracts/、genmodules/、genmodules/assetgenos_catalog/、extensions/、docs/architecture/、AGENTS.md、prompts/。未新增 Gate,未改 45-Gate 拓扑与身份、四阶段生命周期、八类核心对象、GateInputEnvelope@2.0.0、GateModelOutput@2.0.0、任何 Model 或 Profile。5 个文件全在docs/、tests/、logs/,可由git diff --stat main...HEAD核验。据此不构成架构变更、不消耗 2026 年 8 月月度架构修复额度。依据是 diff 范围而非推导结论,与 PR #54 被降级为「待审假设」的那个断言性质不同;若仍认为只能是待审假设,请指出。
当前阻断
BLOCK-01:本契约获APPROVE前不得执行 Level 01。BLOCK-02:LOCK-02需要 CRC clinical context 清单,而唯一的枚举来自被隔离的 PR task_20260804: record CRC clinical frame and membrane target screen run #53 运行(UNAUTHORIZED_QUARANTINED_NOT_ACCEPTED),按裁决不得作为后续输入。故即使本契约获批,Level 01 仍不能执行,必须先重跑 CRC clinical frame 并被接受。这是隔离裁决的直接后果,此处明示而非绕过。没有做什么
defined_levels只有"01",由测试断言;来源文档第八节的 Level 02/03 清单只作GAP-P05/P06的上下文引用,未冻结为定义)。CandidateDisposition或新增 pool 生命周期枚举。requirements.txt注释写「207 tests」,实测 228。按第 25 条不在本 PR 顺手改,只记录。验证
Ran 251 tests全部通过(基线 228 + 新增 23)。scripts/verify_repository_boundary.sh:Repository boundary check passed.git diff --check通过;零__pycache__。diff -q一致、恢复OK。首轮 5 个;本轮 10 个:把linkage_unassessed改 EXCLUDE、把linkage_evidence_missing改 EXCLUDE、完整检索排除的resulting_state由reactivation-eligible改active、把它声明为科学证伪且is_killed: true、删掉一项检索完整性字段、删掉快照一列检索完整性列、把killed_targets混进CNT-03求和、CNT-02乘数由eligible_contexts换raw_contexts、资格审计对象声明为产生 pair 状态、给 target 级 outcome 赋 pair 级状态值。snapshot_columns31 列、gates_not_run45 项、3 把锁 13 个 outcome、5 个 pool object、5 条计数恒等式、6 条缺口、cost_tier = low的 Gate 7 个。请复审重点看两点
no_known_linkage_after_complete_search的六项完整性要求与CNT-01..CNT-05的对象划分。NO_ARCHITECTURE_CHANGE的判断是否成立(依据是 diff 范围)。本 PR 不适用
AGENTS.md「审核豁免」,须经 ChatGPTAPPROVE。批准本 PR 只代表接受 Level 01 的定义与判据记录,不授权执行 Level 01,也不批准任何靶点、情境、筛选结果或科学结论。