Skip to content

ADC Pool 漏斗 Level 01 定义与执行契约(contract-only,未执行) - #57

Merged
leezx merged 3 commits into
mainfrom
task_20260804_adc-pool-level-01
Aug 4, 2026
Merged

ADC Pool 漏斗 Level 01 定义与执行契约(contract-only,未执行)#57
leezx merged 3 commits into
mainfrom
task_20260804_adc-pool-level-01

Conversation

@leezx

@leezx leezx commented Aug 4, 2026

Copy link
Copy Markdown
Owner

状态

第一轮审核 REQUEST_CHANGES 的两条阻断已全部接受并在本 PR 内修订完毕,请复审。

  • 复审 HEAD:6036c01(首轮受审 HEAD 为 0e39ef5
  • main 基线 e7092d5,5 个文件、+1312/-0
  • Ran 251 tests 全部通过(基线 228 + 新增 23)
  • 审核方尝试通过 GitHub 连接器写回正式 review,连接器返回 403,故 GitHub 上没有 review 记录;裁决内容以人类负责人转述为准,已完整记录在 handoff 第十二节与 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.md Level 01 完整定义与执行契约
docs/pools/adc_pool_gate_usage.yaml 每层判据使用的权威机器可读记录,每新增一层追加一个条目
tests/test_adc_pool_gate_usage.py 23 项校验,把该记录钉在冻结的 45-Gate 拓扑与 CandidateFilterResult 语义上
docs/handoff/2026-08-04-adc-pool-level-01.zh-CN.md 交接备忘(第十二节为本轮裁决与修订记录)
logs/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

输出 disposition resulting_state evidence_state
linkage_evidence_exists RETAIN active present
linkage_unassessed DEFER hold not_assessed
linkage_evidence_missing(新增) DEFER hold absent_incomplete_search
no_known_linkage_after_complete_search(更名并收紧) EXCLUDE reactivation-eligible absent_after_complete_search

那唯一的 EXCLUDE 被硬性收紧:语义只能是 EXCLUDE_FROM_ACTIVE_POOL,并写入 is_scientific_disproof: falseis_killed: falseretained_in_eligible_universe_index: true;必须附六项检索完整性记录(search_completesearch_policy_refsource_coverage_refsearch_scopesearched_atsearch_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_excludetest_only_a_completed_search_may_remove_a_pair_from_the_active_pooltest_completeness_fields_are_carried_by_the_snapshottest_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。这一条我原先没看出来。

拆成三个对象(另加两份资格审计产物,共五份,不得合并成一张表):

对象 内容
A. Raw Enumeration Matrix raw contexts × raw targets,可以undefined_contextredundant_contextnot_surface_targetidentity_unresolved
B. Eligible Universe Index eligible contexts × eligible surface targets
C. Pool Level 01 pair 级 activeholdreactivation-eligible

状态词表按粒度分开:context 级 eligibleholdsuperseded;target 级 eligibleholdkilled;pair 级 activeholdreactivation-eligible。原来那份混合的五值 pool_states 已删除。killedsuperseded 属资格审计历史、不参与 pair 级对账,写入 excluded_from_pair_reconciliation

五条计数恒等式写成机器可读形式(lhs + rhs_productrhs_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_exampletest_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_supersededtest_pool_objects_separate_eligibility_audit_from_pair_states


Level 01 的核心结论:运行的 Gate 数量是零

只运行三把 eligibility lock,产出 CandidateFilterResult——按契约明确不是 Gate 结果。gates_not_run 逐一列出全部 45 个 Gate,测试断言与冻结拓扑完全相等;result_is_gate_result: falsegate_scores_written: noneEVALUATEDNOT_EVALUATEDUNRESOLVED 全域保留。

顺序 Lock 粒度 借用职责(不构成该 Gate 的 PASS)
1 LOCK-02 context eligibility context 级 clinical_context_endpoint(T0,low
2 LOCK-01 target identity target 级 tumor_cell_surface_availability(T7,medium
3 LOCK-03 linkage existence pair 级 target_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_windowpatent_landscapepreliminary_technical_fto 比 T2/T7/T11 的 medium 更便宜,但竞争拥挤不得单独 KILL,所以不能排在最前。完整表述:在阴性结果具有否决力的判据里,先跑边际成本最低的那个。

明示的偏离与缺口

DEVIATION-01(第一轮已获接受):来源文档的 weak_or_redundant_context 拆成 redundant_context(EXCLUDE,可判定的集合包含关系)与 weak_context(DEFER,价值判断)。

GAP-P01..GAP-P06 已记录、未解决,需独立任务与月度额度:

  • GAP-P01P02:内核没有 pool level 身份/快照对象,没有 active/hold/killed/superseded/reactivation-eligible 生命周期状态。
  • GAP-P03(本轮改写):内核没有三对象结构,也没有把 context/target 级资格审计与 pair 级池状态分开的结构,故三对象与 CNT-01..CNT-05 只能靠外部产物加本注册表约束表达。
  • GAP-P04(本轮改写):CandidateDisposition 三值无法区分 EXCLUDE_DEFINITIONALLY_INELIGIBLEkilledsuperseded)与 EXCLUDE_FROM_ACTIVE_POOLreactivation-eligible,非科学证伪);本契约靠 disposition_semanticsresulting_state 补足,属外部编码约定而非契约支持。
  • GAP-P05(Level 02,冲突)src/capabilities/early_t_gate_reduction.pyEarlyReductionSchedule 硬性要求 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.mdprompts/。未新增 Gate,未改 45-Gate 拓扑与身份、四阶段生命周期、八类核心对象、GateInputEnvelope@2.0.0GateModelOutput@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-02LOCK-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 并被接受。这是隔离裁决的直接后果,此处明示而非绕过。

没有做什么

验证

  • Ran 251 tests 全部通过(基线 228 + 新增 23)。
  • scripts/verify_repository_boundary.shRepository boundary check passed.
  • git diff --check 通过;零 __pycache__
  • 变异检验累计 15 个,全部被捕获后精确回滚,回滚后与备份 diff -q 一致、恢复 OK。首轮 5 个;本轮 10 个:把 linkage_unassessed 改 EXCLUDE、把 linkage_evidence_missing 改 EXCLUDE、完整检索排除的 resulting_statereactivation-eligibleactive、把它声明为科学证伪且 is_killed: true、删掉一项检索完整性字段、删掉快照一列检索完整性列、把 killed_targets 混进 CNT-03 求和、CNT-02 乘数由 eligible_contextsraw_contexts、资格审计对象声明为产生 pair 状态、给 target 级 outcome 赋 pair 级状态值。
  • 实测数值:snapshot_columns 31 列、gates_not_run 45 项、3 把锁 13 个 outcome、5 个 pool object、5 条计数恒等式、6 条缺口、cost_tier = low 的 Gate 7 个。

请复审重点看两点

  1. 两条阻断的修订是否达到验收标准,特别是 no_known_linkage_after_complete_search 的六项完整性要求与 CNT-01..CNT-05 的对象划分。
  2. NO_ARCHITECTURE_CHANGE 的判断是否成立(依据是 diff 范围)。

本 PR 不适用 AGENTS.md「审核豁免」,须经 ChatGPT APPROVE。批准本 PR 只代表接受 Level 01 的定义与判据记录,不授权执行 Level 01,也不批准任何靶点、情境、筛选结果或科学结论。

leezx and others added 3 commits August 4, 2026 18:41
…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>
@leezx
leezx merged commit 5e0458b into main Aug 4, 2026
2 checks passed
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.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant