From cd9f63e9eb4054d0bda18fe248b071317ec76e82 Mon Sep 17 00:00:00 2001 From: wantsong Date: Wed, 17 Jun 2026 22:58:40 +0800 Subject: [PATCH] Prepare Round 03.2 selector review bundle --- README.md | 6 +- cards/intellectual_archaeology.md | 11 +- cards/qpi.md | 12 +- ..._OPEN_THIS_FIRST_CCRA_REVIEW_BRIEF03.1.md} | 0 ...ATCH_MATRIX.md => 01_PATCH_MATRIX_03.1.md} | 0 ...T_PACK.md => 02_CURRENT_ASSET_PACK03.1.md} | 0 ...d => 03_VALIDATION_AND_COMMAND_LOG03.1.md} | 0 ....md => 04_REVIEW_QUESTIONS_FOR_GPT03.1.md} | 0 ...ANIFEST.md => BUNDLE_FILE_MANIFEST03.1.md} | 0 ...zip => optional_raw_changed_files03.1.zip} | Bin ..._OPEN_THIS_FIRST_CCRA_REVIEW_BRIEF_03.2.md | 55 + .../01_PATCH_MATRIX_03.2.md | 53 + .../02_CURRENT_ASSET_PACK_03.2.md | 73 ++ .../03_VALIDATION_AND_COMMAND_LOG_03.2.md | 61 + .../04_REVIEW_QUESTIONS_FOR_GPT_03.2.md | 29 + .../BUNDLE_FILE_MANIFEST_03.2.md | 52 + .../optional_raw_changed_files_03.2.zip | Bin 0 -> 80100 bytes docs/DECISIONS.md | 25 +- docs/FILE_TAXONOMY.md | 3 +- models/model_index.json | 4 +- ...话交接文档_Round03.2评审准备_2026-06-17.md | 125 ++ reports/README.md | 1 + reports/content_review_report_v0.2.md | 7 +- reports/selector_calibration_smoke_report.md | 8 +- reports/selector_regression_report_v0.2.md | 7 +- scripts/README.md | 4 + scripts/run_selector_calibration_smoke.py | 35 +- scripts/run_selector_demo.py | 21 +- selector/README.md | 7 + selector/selector_calibration_inputs.json | 35 + selector/selector_rules.json | 21 +- .../intellectual_archaeology.regression.json | 4 +- tests/qpi.regression.json | 84 ++ tests/regression_cases.json | 1022 ++++++++++------- tests/regression_index.json | 24 +- 35 files changed, 1305 insertions(+), 484 deletions(-) rename ccra_review_bundle/round-03.1_2026-06-17_selector-no-call-regression-patch/{00_OPEN_THIS_FIRST_CCRA_REVIEW_BRIEF.md => 00_OPEN_THIS_FIRST_CCRA_REVIEW_BRIEF03.1.md} (100%) rename ccra_review_bundle/round-03.1_2026-06-17_selector-no-call-regression-patch/{01_PATCH_MATRIX.md => 01_PATCH_MATRIX_03.1.md} (100%) rename ccra_review_bundle/round-03.1_2026-06-17_selector-no-call-regression-patch/{02_CURRENT_ASSET_PACK.md => 02_CURRENT_ASSET_PACK03.1.md} (100%) rename ccra_review_bundle/round-03.1_2026-06-17_selector-no-call-regression-patch/{03_VALIDATION_AND_COMMAND_LOG.md => 03_VALIDATION_AND_COMMAND_LOG03.1.md} (100%) rename ccra_review_bundle/round-03.1_2026-06-17_selector-no-call-regression-patch/{04_REVIEW_QUESTIONS_FOR_GPT.md => 04_REVIEW_QUESTIONS_FOR_GPT03.1.md} (100%) rename ccra_review_bundle/round-03.1_2026-06-17_selector-no-call-regression-patch/{BUNDLE_FILE_MANIFEST.md => BUNDLE_FILE_MANIFEST03.1.md} (100%) rename ccra_review_bundle/round-03.1_2026-06-17_selector-no-call-regression-patch/{optional_raw_changed_files.zip => optional_raw_changed_files03.1.zip} (100%) create mode 100644 ccra_review_bundle/round-03.2_2026-06-17_selector-negative-gate-patch/00_OPEN_THIS_FIRST_CCRA_REVIEW_BRIEF_03.2.md create mode 100644 ccra_review_bundle/round-03.2_2026-06-17_selector-negative-gate-patch/01_PATCH_MATRIX_03.2.md create mode 100644 ccra_review_bundle/round-03.2_2026-06-17_selector-negative-gate-patch/02_CURRENT_ASSET_PACK_03.2.md create mode 100644 ccra_review_bundle/round-03.2_2026-06-17_selector-negative-gate-patch/03_VALIDATION_AND_COMMAND_LOG_03.2.md create mode 100644 ccra_review_bundle/round-03.2_2026-06-17_selector-negative-gate-patch/04_REVIEW_QUESTIONS_FOR_GPT_03.2.md create mode 100644 ccra_review_bundle/round-03.2_2026-06-17_selector-negative-gate-patch/BUNDLE_FILE_MANIFEST_03.2.md create mode 100644 ccra_review_bundle/round-03.2_2026-06-17_selector-negative-gate-patch/optional_raw_changed_files_03.2.zip create mode 100644 reports/Codex新会话交接文档_Round03.2评审准备_2026-06-17.md diff --git a/README.md b/README.md index 6a70044..d0e9406 100644 --- a/README.md +++ b/README.md @@ -170,10 +170,12 @@ Indexes follow `docs/INDEX_MAINTENANCE_PROTOCOL.md`: every asset change must syn CCRA review packages are archived by round under `ccra_review_bundle/round-NN_YYYY-MM-DD_topic/`. Do not place new review bundle files directly in `ccra_review_bundle/`; create or update the current round directory instead. +Files intended for GPT / CCRA upload inside a review bundle should include the round version in the filename, for example `_03.2`. Raw changed-file zips should also include the round version while preserving source-relative paths inside the archive. + ## 13. Next Steps -1. Submit the Round 03.1 selector/no-call/regression patch for GPT / CCRA review. +1. Submit the Round 03.2 selector negative-gate patch for GPT / CCRA review. 2. Keep QPI and Intellectual Archaeology at `draft / B / pending` until Owner / CCRA review accepts stronger status. -3. Run a QPI blind-test round with new unlabelled inputs after Round 03.1 passes. +3. Run a QPI blind-test round with new unlabelled inputs only after Round 03.2 passes. 4. Defer any third-model expansion until the current QPI selector and case layer are accepted. 5. Route missing reusable extraction, inspection, or stability-scoring tools to `requirements/skills-vault/` or `requirements/ccpe/` instead of improvising local platform features. diff --git a/cards/intellectual_archaeology.md b/cards/intellectual_archaeology.md index 83caa71..991abd6 100644 --- a/cards/intellectual_archaeology.md +++ b/cards/intellectual_archaeology.md @@ -175,7 +175,7 @@ - 机制稳定性:中等,七层结构清晰,但层级之间的真实递进关系需要更多案例验证。 - 边界清晰度:中等,最小充分下潜原则已明确,但执行时容易过度下钻。 - 来源证据质量:较高,核心定义和七层结构来自原文,停止条件来自综合应用材料。 -- 回归测试表现:pending,已有五条样板用例,尚未扩展到更多领域。 +- 回归测试表现:pending,当前已有 19 条回归用例,已覆盖 positive、boundary、misuse、no_call、selector_gate 和 pipeline;Round 03.2 已纳入明确拒绝思想考古的模型级 hard exclusion 陷阱。 评级理由:纵向下潜机制清晰,适合深度建模,但七层结构和停止条件需要进一步稳定。 @@ -185,13 +185,10 @@ `pending` -当前已有五条回归用例: +当前已有 19 条回归用例,覆盖 positive、boundary、misuse、no_call、selector_gate 和 pipeline。Round 03.2 重点新增: -- `case_ia_positive_deep_modeling_001` -- `case_ia_positive_resilience_001` -- `case_ia_boundary_minimum_depth_001` -- `case_ia_misuse_philosophizing_001` -- `case_ia_misuse_no_validation_001` +- `case_ia_negative_explicit_do_not_call_001` +- `case_ia_negative_only_qpi_001` ## 示例输入 diff --git a/cards/qpi.md b/cards/qpi.md index 7648bc5..c659c1d 100644 --- a/cards/qpi.md +++ b/cards/qpi.md @@ -202,7 +202,7 @@ QPI 的三分结构、核心匮乏物、主体性和动态性有清晰来源支 - 机制稳定性:中高,扫描匮乏物和匹配处理范式的机制明确。 - 边界清晰度:中等,混合型问题、多视角分歧和上下文不足场景仍需更多测试。 - 来源证据质量:较高,主体性和动态性来自 2025 原文,核心匮乏物和误框定规则来自 2026 原文,应用规则来自综合文档。 -- 回归测试表现:pending,当前已有 52 条 QPI 回归用例;其中 Round 03 / 03.1 已纳入 owner-reviewed case layer、selector no-call、multi-perspective 和低上下文 provisional 边界用例。生命周期仍保持 draft。 +- 回归测试表现:pending,当前已有 55 条 QPI 回归用例;其中 Round 03 / 03.1 已纳入 owner-reviewed case layer、selector no-call、multi-perspective 和低上下文 provisional 边界用例,Round 03.2 已纳入普通 how-to / 词义判断 no-call 陷阱。生命周期仍保持 draft。 评级理由:三分结构清晰,适合作为入口路由模型,但需要补充大量边界案例,防止过度升维或降维。 @@ -212,7 +212,7 @@ QPI 的三分结构、核心匮乏物、主体性和动态性有清晰来源支 `pending` -当前已有 52 条 QPI 回归用例,覆盖 positive、boundary、misuse、no_call、selector_gate 和 pipeline。Round 03 / 03.1 重点新增: +当前已有 55 条 QPI 回归用例,覆盖 positive、boundary、misuse、no_call、selector_gate 和 pipeline。Round 03 / 03.1 重点新增: - owner-reviewed flow / disappointment / organizational year-end-review cases; - `case_qpi_international_logistics_no_call_001` @@ -222,6 +222,12 @@ QPI 的三分结构、核心匮乏物、主体性和动态性有清晰来源支 - `case_qpi_direct_summary_no_call_001` - `case_qpi_analysis_override_should_call_001` +Round 03.2 重点新增: + +- `case_qpi_how_to_excel_no_call_001` +- `case_qpi_how_to_markdown_pdf_no_call_001` +- `case_qpi_dictionary_judgment_no_call_001` + ## 示例输入 - “我们团队每次都说要长期主义,但一到季度 KPI 就回到短期动作,这到底是什么问题?” @@ -280,7 +286,7 @@ QPI 的三分结构、核心匮乏物、主体性和动态性有清晰来源支 QPI 应作为问题回答系统的前置路由模型,用于防止系统在问题类型错误的情况下直接给答案。 -selector 应优先使用 `trigger_keywords`、`negative_triggers`、`pipeline_position` 和 `selection_priority` 做规则推荐。 +selector 应优先使用 `trigger_keywords`、`negative_triggers`、模型级 hard exclusion、`pipeline_position` 和 `selection_priority` 做规则推荐。 ## 版本信息 diff --git a/ccra_review_bundle/round-03.1_2026-06-17_selector-no-call-regression-patch/00_OPEN_THIS_FIRST_CCRA_REVIEW_BRIEF.md b/ccra_review_bundle/round-03.1_2026-06-17_selector-no-call-regression-patch/00_OPEN_THIS_FIRST_CCRA_REVIEW_BRIEF03.1.md similarity index 100% rename from ccra_review_bundle/round-03.1_2026-06-17_selector-no-call-regression-patch/00_OPEN_THIS_FIRST_CCRA_REVIEW_BRIEF.md rename to ccra_review_bundle/round-03.1_2026-06-17_selector-no-call-regression-patch/00_OPEN_THIS_FIRST_CCRA_REVIEW_BRIEF03.1.md diff --git a/ccra_review_bundle/round-03.1_2026-06-17_selector-no-call-regression-patch/01_PATCH_MATRIX.md b/ccra_review_bundle/round-03.1_2026-06-17_selector-no-call-regression-patch/01_PATCH_MATRIX_03.1.md similarity index 100% rename from ccra_review_bundle/round-03.1_2026-06-17_selector-no-call-regression-patch/01_PATCH_MATRIX.md rename to ccra_review_bundle/round-03.1_2026-06-17_selector-no-call-regression-patch/01_PATCH_MATRIX_03.1.md diff --git a/ccra_review_bundle/round-03.1_2026-06-17_selector-no-call-regression-patch/02_CURRENT_ASSET_PACK.md b/ccra_review_bundle/round-03.1_2026-06-17_selector-no-call-regression-patch/02_CURRENT_ASSET_PACK03.1.md similarity index 100% rename from ccra_review_bundle/round-03.1_2026-06-17_selector-no-call-regression-patch/02_CURRENT_ASSET_PACK.md rename to ccra_review_bundle/round-03.1_2026-06-17_selector-no-call-regression-patch/02_CURRENT_ASSET_PACK03.1.md diff --git a/ccra_review_bundle/round-03.1_2026-06-17_selector-no-call-regression-patch/03_VALIDATION_AND_COMMAND_LOG.md b/ccra_review_bundle/round-03.1_2026-06-17_selector-no-call-regression-patch/03_VALIDATION_AND_COMMAND_LOG03.1.md similarity index 100% rename from ccra_review_bundle/round-03.1_2026-06-17_selector-no-call-regression-patch/03_VALIDATION_AND_COMMAND_LOG.md rename to ccra_review_bundle/round-03.1_2026-06-17_selector-no-call-regression-patch/03_VALIDATION_AND_COMMAND_LOG03.1.md diff --git a/ccra_review_bundle/round-03.1_2026-06-17_selector-no-call-regression-patch/04_REVIEW_QUESTIONS_FOR_GPT.md b/ccra_review_bundle/round-03.1_2026-06-17_selector-no-call-regression-patch/04_REVIEW_QUESTIONS_FOR_GPT03.1.md similarity index 100% rename from ccra_review_bundle/round-03.1_2026-06-17_selector-no-call-regression-patch/04_REVIEW_QUESTIONS_FOR_GPT.md rename to ccra_review_bundle/round-03.1_2026-06-17_selector-no-call-regression-patch/04_REVIEW_QUESTIONS_FOR_GPT03.1.md diff --git a/ccra_review_bundle/round-03.1_2026-06-17_selector-no-call-regression-patch/BUNDLE_FILE_MANIFEST.md b/ccra_review_bundle/round-03.1_2026-06-17_selector-no-call-regression-patch/BUNDLE_FILE_MANIFEST03.1.md similarity index 100% rename from ccra_review_bundle/round-03.1_2026-06-17_selector-no-call-regression-patch/BUNDLE_FILE_MANIFEST.md rename to ccra_review_bundle/round-03.1_2026-06-17_selector-no-call-regression-patch/BUNDLE_FILE_MANIFEST03.1.md diff --git a/ccra_review_bundle/round-03.1_2026-06-17_selector-no-call-regression-patch/optional_raw_changed_files.zip b/ccra_review_bundle/round-03.1_2026-06-17_selector-no-call-regression-patch/optional_raw_changed_files03.1.zip similarity index 100% rename from ccra_review_bundle/round-03.1_2026-06-17_selector-no-call-regression-patch/optional_raw_changed_files.zip rename to ccra_review_bundle/round-03.1_2026-06-17_selector-no-call-regression-patch/optional_raw_changed_files03.1.zip diff --git a/ccra_review_bundle/round-03.2_2026-06-17_selector-negative-gate-patch/00_OPEN_THIS_FIRST_CCRA_REVIEW_BRIEF_03.2.md b/ccra_review_bundle/round-03.2_2026-06-17_selector-negative-gate-patch/00_OPEN_THIS_FIRST_CCRA_REVIEW_BRIEF_03.2.md new file mode 100644 index 0000000..35e2f32 --- /dev/null +++ b/ccra_review_bundle/round-03.2_2026-06-17_selector-negative-gate-patch/00_OPEN_THIS_FIRST_CCRA_REVIEW_BRIEF_03.2.md @@ -0,0 +1,55 @@ +# Round 03.2 CCRA Review Brief + +Date: 2026-06-17 + +Repository: `C:\Users\wangq\Documents\Codex\work-projects\the-mindscape-of-bro-tsong` + +Patch title: Selector Negative-Gate Patch + +## Scope + +Round 03.2 is a tiny follow-up to Round 03.1. + +It addresses GPT review finding: + +> IA / 思想考古 negative triggers were still score penalties, not model-level hard exclusions. + +This patch does not: + +- add a third model; +- upgrade QPI or Intellectual Archaeology lifecycle status; +- introduce an LLM selector; +- introduce RAG, database, frontend, backend, user accounts, or platform features; +- start Round 04 blind testing. + +Current model status remains: + +```text +qpi: draft / B / pending +intellectual_archaeology: draft / B / pending +``` + +## What Changed + +1. Added model-level hard exclusion for explicit IA refusal. +2. Removed bare QPI gate signals `如何` and `判断`. +3. Replaced broad gates with compound problem-definition signals. +4. Strengthened selector calibration smoke checks: + - `no_call` requires `selected_models == []` and `no_call == true`; + - `no_call_or_low_priority` rejects both QPI and IA; + - `select_qpi_reject_ia` requires QPI selected and IA rejected; + - IA selection expectations fail if IA hard exclusion is present. +5. Added five GPT-requested traps to regression and calibration data. + +## Suggested Review Order + +1. `00_OPEN_THIS_FIRST_CCRA_REVIEW_BRIEF_03.2.md` +2. `01_PATCH_MATRIX_03.2.md` +3. `02_CURRENT_ASSET_PACK_03.2.md` +4. `03_VALIDATION_AND_COMMAND_LOG_03.2.md` +5. `04_REVIEW_QUESTIONS_FOR_GPT_03.2.md` +6. `optional_raw_changed_files_03.2.zip` only if exact changed-file inspection is needed + +## Primary Review Question + +Does Round 03.2 close the model-level negative gate issue enough to close Round 03 and proceed to Round 04 blind input evaluation? diff --git a/ccra_review_bundle/round-03.2_2026-06-17_selector-negative-gate-patch/01_PATCH_MATRIX_03.2.md b/ccra_review_bundle/round-03.2_2026-06-17_selector-negative-gate-patch/01_PATCH_MATRIX_03.2.md new file mode 100644 index 0000000..aecac1e --- /dev/null +++ b/ccra_review_bundle/round-03.2_2026-06-17_selector-negative-gate-patch/01_PATCH_MATRIX_03.2.md @@ -0,0 +1,53 @@ +# Round 03.2 Patch Matrix + +## GPT Requirement Mapping + +| Requirement | Implementation | Files | +| --- | --- | --- | +| IA explicit refusal must be hard exclusion, not score penalty | Added `hard_exclusion_triggers` for IA and forced rejected decision when matched | `selector/selector_rules.json`, `scripts/run_selector_demo.py` | +| Include refusal phrases such as `不要思想考古`, `先不要思想考古`, `不调用思想考古`, `只做 QPI`, `只做问题定性` | Added IA hard exclusion trigger list | `selector/selector_rules.json` | +| Preserve QPI explicit-analysis override but do not let it re-enable IA | Hard exclusion applies per model after scoring and is not bypassed by QPI override | `scripts/run_selector_demo.py` | +| Remove or narrow bare `如何` and `判断` QPI gates | Removed bare signals; added compound problem-definition phrases | `selector/selector_rules.json` | +| Strict `no_call` smoke behavior | `no_call` now requires no selected models and `no_call=true` | `scripts/run_selector_calibration_smoke.py` | +| Strict `no_call_or_low_priority` behavior | Fails if QPI or IA is selected | `scripts/run_selector_calibration_smoke.py` | +| Add `select_qpi_reject_ia` behavior | Requires QPI selected and IA rejected | `scripts/run_selector_calibration_smoke.py`, `selector/selector_calibration_inputs.json` | +| Fail IA selection expectations if IA hard exclusion exists | Added hard-exclusion check for `select_intellectual_archaeology` expected cases | `scripts/run_selector_calibration_smoke.py` | +| Add five traps | Added two IA hard-exclusion traps and three generic how-to / dictionary no-call traps | `tests/*.regression.json`, `selector/selector_calibration_inputs.json` | + +## Added Regression Cases + +### Intellectual Archaeology + +- `case_ia_negative_explicit_do_not_call_001` +- `case_ia_negative_only_qpi_001` + +### QPI + +- `case_qpi_how_to_excel_no_call_001` +- `case_qpi_how_to_markdown_pdf_no_call_001` +- `case_qpi_dictionary_judgment_no_call_001` + +## Added Calibration Inputs + +- `selector_calibration_ia_negative_explicit_do_not_call_001` +- `selector_calibration_ia_negative_only_qpi_001` +- `selector_calibration_qpi_how_to_excel_no_call_001` +- `selector_calibration_qpi_how_to_markdown_pdf_no_call_001` +- `selector_calibration_qpi_dictionary_judgment_no_call_001` + +## Current Counts + +| Asset | Round 03.1 | Round 03.2 | +| --- | ---: | ---: | +| QPI regression cases | 52 | 55 | +| IA regression cases | 17 | 19 | +| Aggregate regression cases | 69 | 74 | +| Selector calibration inputs | 85 | 90 | + +## Non-Goals Preserved + +- No new model. +- No lifecycle upgrade. +- No LLM selector. +- No RAG / database / frontend / backend. +- No Round 04 blind-test execution. diff --git a/ccra_review_bundle/round-03.2_2026-06-17_selector-negative-gate-patch/02_CURRENT_ASSET_PACK_03.2.md b/ccra_review_bundle/round-03.2_2026-06-17_selector-negative-gate-patch/02_CURRENT_ASSET_PACK_03.2.md new file mode 100644 index 0000000..28bc704 --- /dev/null +++ b/ccra_review_bundle/round-03.2_2026-06-17_selector-negative-gate-patch/02_CURRENT_ASSET_PACK_03.2.md @@ -0,0 +1,73 @@ +# Round 03.2 Current Asset Pack + +## Canonical Changed Assets + +- `selector/selector_rules.json` +- `selector/selector_calibration_inputs.json` +- `tests/qpi.regression.json` +- `tests/intellectual_archaeology.regression.json` +- `tests/regression_cases.json` +- `tests/regression_index.json` +- `scripts/run_selector_demo.py` +- `scripts/run_selector_calibration_smoke.py` + +## Generated / Derived Assets + +- `models/model_index.json` +- `cards/card_index.md` +- `reports/index_rebuild_report.md` +- `reports/validation_report.md` +- `reports/selector_regression_report_v0.2.md` +- `reports/selector_calibration_smoke_report.md` +- `reports/model_card_sync_report_v0.2.md` + +## Documentation Updated + +- `README.md` +- `docs/DECISIONS.md` +- `selector/README.md` +- `scripts/README.md` +- `reports/README.md` +- `cards/qpi.md` +- `cards/intellectual_archaeology.md` +- `reports/content_review_report_v0.2.md` + +## Selector Behavior Summary + +### IA explicit refusal + +Inputs such as: + +```text +QPI 已判断:这是 Issue。先不要思想考古,只做问题定性复核。 +不要思想考古,只做 QPI 复核。 +``` + +now select QPI and reject `intellectual_archaeology`. + +### Generic how-to / dictionary no-call + +Inputs such as: + +```text +如何在 Excel 里冻结首行? +如何把 Markdown 转 PDF? +判断这个词是什么意思。 +``` + +now produce no selected models and `no_call=true`. + +### Still preserved + +QPI remains callable for explicit problem-definition or owner-reviewed calibration inputs. + +IA remains callable when IA is explicitly requested without hard exclusion and the heavy-depth / QPI-completed gate is satisfied. + +## Current Lifecycle State + +No lifecycle upgrade was made. + +```text +qpi: draft / B / pending +intellectual_archaeology: draft / B / pending +``` diff --git a/ccra_review_bundle/round-03.2_2026-06-17_selector-negative-gate-patch/03_VALIDATION_AND_COMMAND_LOG_03.2.md b/ccra_review_bundle/round-03.2_2026-06-17_selector-negative-gate-patch/03_VALIDATION_AND_COMMAND_LOG_03.2.md new file mode 100644 index 0000000..29625a2 --- /dev/null +++ b/ccra_review_bundle/round-03.2_2026-06-17_selector-negative-gate-patch/03_VALIDATION_AND_COMMAND_LOG_03.2.md @@ -0,0 +1,61 @@ +# Round 03.2 Validation and Command Log + +Date: 2026-06-17 + +## Red Evidence + +After adding the five GPT-requested traps and before implementation, selector checks failed as expected. + +`python scripts\run_selector_regression.py` + +- `case_ia_negative_explicit_do_not_call_001`: IA was selected despite explicit refusal. +- `case_ia_negative_only_qpi_001`: QPI was not selected. +- `case_qpi_how_to_excel_no_call_001`: QPI was selected. +- `case_qpi_how_to_markdown_pdf_no_call_001`: QPI was selected. +- `case_qpi_dictionary_judgment_no_call_001`: QPI was selected. + +`python scripts\run_selector_calibration_smoke.py` + +- `selector_calibration_ia_negative_explicit_do_not_call_001`: expected IA rejection. +- `selector_calibration_ia_negative_only_qpi_001`: expected QPI selection. +- three generic how-to / dictionary traps expected no QPI selection. + +## Green Verification + +The following commands passed after the Round 03.2 patch: + +```powershell +python scripts\rebuild_indexes.py --check +python -m unittest discover -s tests -p "test*.py" -v +python scripts\validate_model_library.py +python scripts\check_card_contract.py +python scripts\run_selector_demo.py +python scripts\run_selector_regression.py +python scripts\run_selector_calibration_smoke.py +python scripts\check_model_card_sync.py +``` + +Results: + +- Index check: PASS +- Unit tests: PASS, 17 tests +- Model library validation: PASS +- Card contract: PASS +- Selector demo: PASS +- Selector regression: PASS, 18 selector-relevant cases +- Selector calibration smoke: PASS, 90 inputs, 0 failures, 0 warnings +- Model/card sync: PASS + +## Generated Reports + +- `reports/index_rebuild_report.md` +- `reports/validation_report.md` +- `reports/selector_regression_report_v0.2.md` +- `reports/selector_calibration_smoke_report.md` +- `reports/model_card_sync_report_v0.2.md` + +## Important Interpretation + +Validation pass does not mean model content is stable or owner-approved. + +It only means the Round 03.2 selector negative-gate patch is structurally consistent and passes current local checks. diff --git a/ccra_review_bundle/round-03.2_2026-06-17_selector-negative-gate-patch/04_REVIEW_QUESTIONS_FOR_GPT_03.2.md b/ccra_review_bundle/round-03.2_2026-06-17_selector-negative-gate-patch/04_REVIEW_QUESTIONS_FOR_GPT_03.2.md new file mode 100644 index 0000000..638a9b3 --- /dev/null +++ b/ccra_review_bundle/round-03.2_2026-06-17_selector-negative-gate-patch/04_REVIEW_QUESTIONS_FOR_GPT_03.2.md @@ -0,0 +1,29 @@ +# Round 03.2 Review Questions for GPT + +Please review Round 03.2 only. + +Do not expand into Round 04 blind testing yet. + +## Questions + +1. Does model-level hard exclusion now correctly handle explicit IA refusal? +2. Are the current hard exclusion phrases sufficient for Round 03 closure? +3. Is it acceptable that hard exclusion rejects only IA while still allowing QPI when the user says `只做 QPI` or `只做问题定性`? +4. Is removing bare `如何` and `判断` while preserving compound problem-definition phrases enough to reduce QPI over-selection? +5. Are the strengthened calibration smoke assertions strict enough to become a long-term selector gate? +6. Can Round 03 now be closed with the following conclusion? + +```text +QPI and Intellectual Archaeology remain draft / B / pending. +QPI is accepted as a draft-callable routing asset at report level. +Selector v0.2 passes no-call, calibration smoke, model-level exclusion, and QPI-before-IA gates. +Proceed to Round 04 blind input evaluation. +``` + +## Suggested Answer Format + +Please answer with: + +- `pass`, `revise`, or `block`; +- specific failing cases if `revise` or `block`; +- whether Round 04 blind input evaluation may start after this patch. diff --git a/ccra_review_bundle/round-03.2_2026-06-17_selector-negative-gate-patch/BUNDLE_FILE_MANIFEST_03.2.md b/ccra_review_bundle/round-03.2_2026-06-17_selector-negative-gate-patch/BUNDLE_FILE_MANIFEST_03.2.md new file mode 100644 index 0000000..1979589 --- /dev/null +++ b/ccra_review_bundle/round-03.2_2026-06-17_selector-negative-gate-patch/BUNDLE_FILE_MANIFEST_03.2.md @@ -0,0 +1,52 @@ +# Round 03.2 Bundle File Manifest + +## Review Files + +- `00_OPEN_THIS_FIRST_CCRA_REVIEW_BRIEF_03.2.md` +- `01_PATCH_MATRIX_03.2.md` +- `02_CURRENT_ASSET_PACK_03.2.md` +- `03_VALIDATION_AND_COMMAND_LOG_03.2.md` +- `04_REVIEW_QUESTIONS_FOR_GPT_03.2.md` +- `BUNDLE_FILE_MANIFEST_03.2.md` +- `optional_raw_changed_files_03.2.zip` + +## Optional Raw Changed Files + +The zip is optional and should be used only if exact file inspection is needed. + +It preserves source-relative paths. + +It excludes: + +- `knowledge_assets/` +- `__pycache__/` +- `*.pyc` +- previous review bundle zip files + +## Source-Relative Files Included in Raw Zip + +- `README.md` +- `cards/intellectual_archaeology.md` +- `cards/qpi.md` +- `docs/DECISIONS.md` +- `docs/FILE_TAXONOMY.md` +- `reports/README.md` +- `reports/content_review_report_v0.2.md` +- `reports/Codex新会话交接文档_Round03.2评审准备_2026-06-17.md` +- `reports/index_rebuild_report.md` +- `reports/model_card_sync_report_v0.2.md` +- `reports/selector_calibration_smoke_report.md` +- `reports/selector_regression_report_v0.2.md` +- `reports/validation_report.md` +- `scripts/README.md` +- `scripts/run_selector_calibration_smoke.py` +- `scripts/run_selector_demo.py` +- `selector/README.md` +- `selector/selector_calibration_inputs.json` +- `selector/selector_rules.json` +- `tests/intellectual_archaeology.regression.json` +- `tests/qpi.regression.json` +- `tests/regression_cases.json` +- `tests/regression_index.json` +- `models/model_index.json` +- `cards/card_index.md` diff --git a/ccra_review_bundle/round-03.2_2026-06-17_selector-negative-gate-patch/optional_raw_changed_files_03.2.zip b/ccra_review_bundle/round-03.2_2026-06-17_selector-negative-gate-patch/optional_raw_changed_files_03.2.zip new file mode 100644 index 0000000000000000000000000000000000000000..31e040f6cdd791feee13d8ee78c7e82bb0491559 GIT binary patch literal 80100 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 MKRR$irVPOU0kKc0nE(I) literal 0 HcmV?d00001 diff --git a/docs/DECISIONS.md b/docs/DECISIONS.md index 72552b9..0280494 100644 --- a/docs/DECISIONS.md +++ b/docs/DECISIONS.md @@ -156,5 +156,28 @@ This keeps second-round and third-round materials comparable without overwriting Round 03.1 added two bundle hygiene rules: -- `optional_raw_changed_files.zip` must preserve source-relative paths. Do not create flat archives that can collide on names such as `README.md`. +- `optional_raw_changed_files_.zip` must preserve source-relative paths. Do not create flat archives that can collide on names such as `README.md`. - `knowledge_assets/` is excluded from review bundles by default because the project owner manually syncs stable long-term knowledge assets into GPT knowledge storage. Include it only when the current review explicitly targets the knowledge asset itself. + +Round 03.2 added one ChatGPT upload hygiene rule: + +- Every file intended for GPT / CCRA upload inside a review bundle must include the round version in the filename, such as `_03.2` or `03.2`, because uploading same-named files from multiple rounds in one Web ChatGPT conversation can cause file-reading ambiguity. This applies especially to raw changed-file zip archives, e.g. `optional_raw_changed_files_03.2.zip`. +- The version suffix belongs to the bundle file names. Zip entries should still preserve source-relative repository paths so reviewers can inspect actual changed files without flattening path context. + +## Decision 014: Treat explicit model refusal as model-level hard exclusion + +Status: Accepted + +Reason: + +Round 03.1 fixed QPI default over-selection, but GPT review found that explicit Intellectual Archaeology refusal phrases such as `先不要思想考古` could still lose to positive IA signals and QPI-completed bonuses. + +A user instruction that names a model and refuses it should not be represented as a normal score penalty. It must hard-exclude that model unless a later owner-approved rule defines an explicit reversal phrase. + +The current Round 03.2 implementation keeps this scoped: + +- It rejects only the explicitly refused model. +- It does not create a global no-call. +- It does not add an LLM selector, RAG, database, service, frontend, backend, or third model. +- It preserves QPI explicit-analysis override, but QPI selection does not re-enable IA when IA is explicitly refused. +- Generic bare QPI gate words such as `如何` and `判断` are removed in favor of compound problem-definition phrases. diff --git a/docs/FILE_TAXONOMY.md b/docs/FILE_TAXONOMY.md index 200cab0..aac69cd 100644 --- a/docs/FILE_TAXONOMY.md +++ b/docs/FILE_TAXONOMY.md @@ -97,7 +97,8 @@ Rules: - Keep review bundles under dated round directories. - Do not place new review files directly under `ccra_review_bundle/`. -- `optional_raw_changed_files.zip` must preserve source-relative paths. +- `optional_raw_changed_files_.zip` must preserve source-relative paths. +- GPT / CCRA upload files inside review bundles must include the round version in the filename, for example `_03.2`, to avoid same-name ambiguity when multiple rounds are uploaded in one Web ChatGPT conversation. - Do not flatten zip contents, because duplicate filenames such as `README.md` can collide. - `knowledge_assets/` is excluded from review zips by default because the Owner manually syncs stable knowledge assets into GPT knowledge storage. diff --git a/models/model_index.json b/models/model_index.json index 9a41e2e..dee950e 100644 --- a/models/model_index.json +++ b/models/model_index.json @@ -11,7 +11,7 @@ "card_file": "cards/intellectual_archaeology.md", "source_article_count": 2, "source_evidence_count": 5, - "regression_case_count": 17, + "regression_case_count": 19, "stability_level": "B", "regression_status": "pending", "status": "draft", @@ -26,7 +26,7 @@ "card_file": "cards/qpi.md", "source_article_count": 3, "source_evidence_count": 10, - "regression_case_count": 52, + "regression_case_count": 55, "stability_level": "B", "regression_status": "pending", "status": "draft", diff --git a/reports/Codex新会话交接文档_Round03.2评审准备_2026-06-17.md b/reports/Codex新会话交接文档_Round03.2评审准备_2026-06-17.md new file mode 100644 index 0000000..ee6cc6a --- /dev/null +++ b/reports/Codex新会话交接文档_Round03.2评审准备_2026-06-17.md @@ -0,0 +1,125 @@ +# Codex 新会话交接文档:Round 03.2 评审准备 + +Date: 2026-06-17 + +Repository: `C:\Users\wangq\Documents\Codex\work-projects\the-mindscape-of-bro-tsong` + +Current phase: `model_library_mvp` + +## 1. 本轮目标 + +根据 GPT 对 Round 03.1 的 `REVISE` 评审意见,完成一个极小的 Round 03.2 selector negative-gate patch,并准备 03.2 评审资料。 + +## 2. 已完成 + +- 将 IA / 思想考古的明确拒绝语从普通 penalty 升级为 model-level hard exclusion。 +- 保留 QPI 显式分析 / 复核入口,但不允许 QPI 选择重新启用被明确拒绝的 IA。 +- 移除 QPI gate 中裸 `如何` 和裸 `判断`。 +- 增加复合 problem-definition 信号,避免普通 how-to / 词义判断误召回 QPI。 +- 加严 `scripts/run_selector_calibration_smoke.py`: + - `no_call` 必须 `selected_models == []` 且 `no_call == true`; + - `no_call_or_low_priority` 不允许 QPI 或 IA 被选中; + - `select_qpi_reject_ia` 必须选中 QPI 且拒绝 IA; + - `select_intellectual_archaeology` 如果命中 IA hard exclusion 则失败。 +- 增加 5 条 GPT 指定陷阱: + - `case_ia_negative_explicit_do_not_call_001` + - `case_ia_negative_only_qpi_001` + - `case_qpi_how_to_excel_no_call_001` + - `case_qpi_how_to_markdown_pdf_no_call_001` + - `case_qpi_dictionary_judgment_no_call_001` +- 同步 per-model regression、aggregate regression、regression index、model/card index 和相关报告。 +- 生成 Round 03.2 评审包: + +```text +ccra_review_bundle/round-03.2_2026-06-17_selector-negative-gate-patch/ +``` +- Round 03.2 评审包内上传给 GPT / CCRA 的文件名均带 `03.2` 版本号;raw zip 命名为 `optional_raw_changed_files_03.2.zip`,zip 内保持 source-relative paths。 + +## 3. 当前计数 + +- QPI regression cases: 55 +- Intellectual Archaeology regression cases: 19 +- Aggregate regression cases: 74 +- Selector calibration inputs: 90 + +模型状态没有升级: + +```text +qpi: draft / B / pending +intellectual_archaeology: draft / B / pending +``` + +## 4. 主要变更文件 + +- `selector/selector_rules.json` +- `scripts/run_selector_demo.py` +- `scripts/run_selector_calibration_smoke.py` +- `selector/selector_calibration_inputs.json` +- `tests/qpi.regression.json` +- `tests/intellectual_archaeology.regression.json` +- `tests/regression_cases.json` +- `tests/regression_index.json` +- `models/model_index.json` +- `cards/card_index.md` +- `cards/qpi.md` +- `cards/intellectual_archaeology.md` +- `docs/DECISIONS.md` +- `README.md` +- `selector/README.md` +- `scripts/README.md` +- `reports/README.md` +- `reports/content_review_report_v0.2.md` +- generated reports under `reports/` +- Round 03.2 review bundle under `ccra_review_bundle/round-03.2_2026-06-17_selector-negative-gate-patch/` + +## 5. 验证结果 + +以下命令已通过: + +```powershell +python scripts\rebuild_indexes.py --check +python -m unittest discover -s tests -p "test*.py" -v +python scripts\validate_model_library.py +python scripts\check_card_contract.py +python scripts\run_selector_demo.py +python scripts\run_selector_regression.py +python scripts\run_selector_calibration_smoke.py +python scripts\check_model_card_sync.py +``` + +结果: + +- Index check: PASS +- Unit tests: PASS, 17 tests +- Model library validation: PASS +- Card contract: PASS +- Selector demo: PASS +- Selector regression: PASS +- Selector calibration smoke: PASS, 90 inputs, 0 failures, 0 warnings +- Model/card sync: PASS + +## 6. 假设 + +- GPT 的 `Round 03.2 Selector Negative-Gate Patch` 指令是本轮唯一修复范围。 +- `只做 QPI` 和 `只做问题定性` 在当前上下文中表示拒绝 IA,同时允许 QPI。 +- `draft-callable` 只能作为评审报告语言,不写入模型 JSON status。 + +## 7. 仍不代表已经完成的事 + +- 没有进入 Round 04 blind test。 +- 没有证明 QPI 或 IA 内容已稳定。 +- 没有升级 `status`、`stability_level` 或 `regression_status`。 +- 没有新增第三模型、LLM selector、RAG、数据库、前后端或完整问答系统。 + +## 8. 需要 GPT / Owner 判断 + +- Round 03.2 是否 `pass / revise / block`。 +- Round 03 是否可以正式关闭。 +- 是否允许进入 Round 04 blind input evaluation。 +- 当前 IA hard exclusion 词表是否足够,是否需要定义“用户反转前文拒绝”的显式规则。 + +## 9. 建议下一步 + +1. 将 Round 03.2 review bundle 提交给 GPT。 +2. 如果 GPT pass,关闭 Round 03 系列。 +3. 仅在 GPT / Owner 同意后启动 Round 04 blind input evaluation。 diff --git a/reports/README.md b/reports/README.md index 3c085b0..915d5a9 100644 --- a/reports/README.md +++ b/reports/README.md @@ -10,6 +10,7 @@ Current reports: - `baseline_before_content_stabilization_v0.2.md` - `evidence_coverage_report_v0.2.md` - `selector_regression_report_v0.2.md` +- `selector_calibration_smoke_report.md` - `model_card_sync_report_v0.2.md` - `content_review_report_v0.2.md` - `model_review_status.json` diff --git a/reports/content_review_report_v0.2.md b/reports/content_review_report_v0.2.md index c9801cc..52834c0 100644 --- a/reports/content_review_report_v0.2.md +++ b/reports/content_review_report_v0.2.md @@ -2,7 +2,7 @@ Date: 2026-06-16 -Status note: this report is a pre-case-promotion review snapshot. It remains useful for the v0.2 evidence / contract / selector baseline, but its regression counts do not reflect the Round 03 / 03.1 QPI owner-reviewed case promotion. Current QPI regression counts are tracked in `tests/qpi.regression.json`, `models/model_index.json`, and the Round 03.1 review bundle. +Status note: this report is a pre-case-promotion review snapshot. It remains useful for the v0.2 evidence / contract / selector baseline, but its regression counts do not reflect the Round 03 / 03.1 QPI owner-reviewed case promotion or the Round 03.2 selector negative-gate patch. Current regression counts are tracked in `tests/*.regression.json`, `models/model_index.json`, and the latest review bundle. ## 1. 本轮修改摘要 @@ -111,7 +111,7 @@ Coverage: - 已覆盖误用、防误召回、no-call 和 pipeline gate。 - 仍需人工审查用例真实性和遗漏边界。 -Round 03 / 03.1 update: QPI has since expanded to 52 regression cases after owner-reviewed case promotion and selector/no-call repair. This v0.2 table is retained as a historical baseline, not the current count. +Round 03 / 03.1 / 03.2 update: QPI has since expanded to 55 regression cases after owner-reviewed case promotion, selector/no-call repair, and broad-gate no-call traps. Intellectual Archaeology has expanded to 19 regression cases after Round 03.2 IA hard-exclusion traps. This v0.2 table is retained as a historical baseline, not the current count. ## 6. Selector Regression 结论 @@ -124,10 +124,13 @@ Selector v0.2 仍为规则 selector。 - QPI-before-IA gate - score breakdown - rejected model reasons +- model-level hard exclusion for explicit model refusal +- stricter calibration smoke checks for no-call, no-call-or-low-priority, and select-qpi-reject-ia 报告位于: - `reports/selector_regression_report_v0.2.md` +- `reports/selector_calibration_smoke_report.md` 结论: diff --git a/reports/selector_calibration_smoke_report.md b/reports/selector_calibration_smoke_report.md index 98cc8f4..6a4c630 100644 --- a/reports/selector_calibration_smoke_report.md +++ b/reports/selector_calibration_smoke_report.md @@ -4,8 +4,9 @@ Status: `PASS` Command: `python scripts/run_selector_calibration_smoke.py` -Calibration inputs checked: 85 +Calibration inputs checked: 90 Failures: 0 +Warnings: 0 ## Cases @@ -93,4 +94,9 @@ Failures: 0 - `selector_calibration_qpi_research_safety_accountability_001`: PASS; expected=select_qpi; selected=['qpi']; no_call=False - `selector_calibration_qpi_research_penalty_integrity_001`: PASS; expected=select_qpi; selected=['qpi']; no_call=False - `selector_calibration_direct_summary_no_call_001`: PASS; expected=no_call; selected=[]; no_call=True +- `selector_calibration_ia_negative_explicit_do_not_call_001`: PASS; expected=select_qpi_reject_ia; selected=['qpi']; no_call=False +- `selector_calibration_ia_negative_only_qpi_001`: PASS; expected=select_qpi_reject_ia; selected=['qpi']; no_call=False +- `selector_calibration_qpi_how_to_excel_no_call_001`: PASS; expected=no_call; selected=[]; no_call=True +- `selector_calibration_qpi_how_to_markdown_pdf_no_call_001`: PASS; expected=no_call; selected=[]; no_call=True +- `selector_calibration_qpi_dictionary_judgment_no_call_001`: PASS; expected=no_call; selected=[]; no_call=True - `selector_calibration_analysis_override_should_call_001`: PASS; expected=select_qpi; selected=['qpi']; no_call=False diff --git a/reports/selector_regression_report_v0.2.md b/reports/selector_regression_report_v0.2.md index dbce455..9ba39dc 100644 --- a/reports/selector_regression_report_v0.2.md +++ b/reports/selector_regression_report_v0.2.md @@ -2,7 +2,7 @@ Status: `PASS` -Cases checked: 13 +Cases checked: 18 Failures: 0 ## Cases @@ -13,10 +13,15 @@ Failures: 0 - `case_ia_selector_gate_qpi_first_001`: PASS; selected=['qpi']; no_call=False - `case_ia_selector_gate_no_heavy_signal_001`: PASS; selected=[]; no_call=True - `case_ia_pipeline_after_qpi_001`: PASS; selected=['intellectual_archaeology', 'qpi']; no_call=False +- `case_ia_negative_explicit_do_not_call_001`: PASS; selected=['qpi']; no_call=False +- `case_ia_negative_only_qpi_001`: PASS; selected=['qpi']; no_call=False - `case_qpi_no_call_direct_edit_001`: PASS; selected=[]; no_call=True - `case_qpi_selector_gate_fact_001`: PASS; selected=[]; no_call=True - `case_qpi_pipeline_before_ia_001`: PASS; selected=['qpi']; no_call=False - `case_qpi_disappointment_mismatch_diagnostics_001`: PASS; selected=['qpi']; no_call=False - `case_qpi_international_logistics_no_call_001`: PASS; selected=[]; no_call=True - `case_qpi_direct_summary_no_call_001`: PASS; selected=[]; no_call=True +- `case_qpi_how_to_excel_no_call_001`: PASS; selected=[]; no_call=True +- `case_qpi_how_to_markdown_pdf_no_call_001`: PASS; selected=[]; no_call=True +- `case_qpi_dictionary_judgment_no_call_001`: PASS; selected=[]; no_call=True - `case_qpi_analysis_override_should_call_001`: PASS; selected=['qpi']; no_call=False diff --git a/scripts/README.md b/scripts/README.md index 05b3b6c..b4e9cf4 100644 --- a/scripts/README.md +++ b/scripts/README.md @@ -10,6 +10,7 @@ Current script: - `check_model_card_sync.py` - `run_selector_regression.py` - `run_selector_demo.py` +- `run_selector_calibration_smoke.py` Run: @@ -44,7 +45,10 @@ Run selector regression and model/card sync checks: ```powershell python scripts\run_selector_regression.py +python scripts\run_selector_calibration_smoke.py python scripts\check_model_card_sync.py ``` +`run_selector_calibration_smoke.py` checks selector calibration inputs, including strict `no_call`, `no_call_or_low_priority`, `select_qpi_reject_ia`, and IA heavy-depth gate expectations. + Prefer Python standard library before adding dependencies. diff --git a/scripts/run_selector_calibration_smoke.py b/scripts/run_selector_calibration_smoke.py index 4e05681..36fe346 100644 --- a/scripts/run_selector_calibration_smoke.py +++ b/scripts/run_selector_calibration_smoke.py @@ -2,7 +2,7 @@ import json import sys from pathlib import Path -from run_selector_demo import load_selector_rules, recommend +from run_selector_demo import load_selector_rules, model_hard_exclusion_hits, recommend def read_json(path): @@ -24,9 +24,24 @@ def evaluate_input(root, selector_rules, item): selected_ids = selected_model_ids(result) expected = item.get("expected_selector_behavior") errors = [] + warnings = [] - if expected in {"no_call", "no_call_or_low_priority"} and "qpi" in selected_ids: - errors.append("expected no QPI selection") + model_rules = { + model_rule["model_id"]: model_rule + for model_rule in selector_rules.get("models", []) + } + + if expected == "no_call": + if selected_ids: + errors.append(f"expected no selected models, got {selected_ids}") + if result.get("no_call") is not True: + errors.append("expected no_call=true") + + if expected == "no_call_or_low_priority": + if "qpi" in selected_ids: + errors.append("expected no QPI selection") + if "intellectual_archaeology" in selected_ids: + errors.append("expected no IA selection") if expected in {"select_qpi", "select_qpi_low_confidence", "select_qpi_reject_ia"}: if "qpi" not in selected_ids: @@ -40,6 +55,15 @@ def evaluate_input(root, selector_rules, item): errors.append("expected IA selection") if not has_ia_gate(item["input"], selector_rules): errors.append("IA selected expectation lacks heavy-depth or QPI-completed gate") + ia_hard_exclusion_hits = model_hard_exclusion_hits( + item["input"], + model_rules.get("intellectual_archaeology", {}), + ) + if ia_hard_exclusion_hits: + errors.append("IA selection expected despite IA hard exclusion signal") + + if expected == "select_qpi" and set(selected_ids) - {"qpi"}: + warnings.append("unexpected extra selected models: " + ", ".join(sorted(set(selected_ids) - {"qpi"}))) return { "case_id": item["case_id"], @@ -47,12 +71,14 @@ def evaluate_input(root, selector_rules, item): "selected_models": selected_ids, "no_call": result.get("no_call"), "errors": errors, + "warnings": warnings, } def write_report(root, results): report_path = root / "reports" / "selector_calibration_smoke_report.md" failures = [result for result in results if result["errors"]] + warnings = [result for result in results if result["warnings"]] lines = [ "# Selector Calibration Smoke Report", "", @@ -62,6 +88,7 @@ def write_report(root, results): "", f"Calibration inputs checked: {len(results)}", f"Failures: {len(failures)}", + f"Warnings: {len(warnings)}", "", "## Cases", "", @@ -74,6 +101,8 @@ def write_report(root, results): ) for error in result["errors"]: lines.append(f" - {error}") + for warning in result["warnings"]: + lines.append(f" - WARNING: {warning}") report_path.write_text("\n".join(lines) + "\n", encoding="utf-8") return report_path diff --git a/scripts/run_selector_demo.py b/scripts/run_selector_demo.py index a8a295d..d928003 100644 --- a/scripts/run_selector_demo.py +++ b/scripts/run_selector_demo.py @@ -33,6 +33,10 @@ def hard_no_call_hits(user_input, global_rules): return hit_any(user_input, signals) +def model_hard_exclusion_hits(user_input, model_rule): + return hit_any(user_input, model_rule.get("hard_exclusion_triggers", [])) + + def score_model(model, model_rule, global_rules, user_input, task_type="", pipeline_position=""): model_id = model.get("model_id") weights = global_rules.get("weights", {}) @@ -146,10 +150,17 @@ def recommend(root, user_input, task_type="", pipeline_position="", threshold=No return hard_no_call_result(root, user_input, no_call_hits) model_rules = rules_by_model(selector_rules) - scored = [ - score_model(model, model_rules.get(model.get("model_id"), {}), global_rules, user_input, task_type, pipeline_position) - for model in load_models(root) - ] + scored = [] + for model in load_models(root): + model_id = model.get("model_id") + model_rule = model_rules.get(model_id, {}) + item = score_model(model, model_rule, global_rules, user_input, task_type, pipeline_position) + exclusion_hits = model_hard_exclusion_hits(user_input, model_rule) + if exclusion_hits: + item["score"] = 0.0 + item["hard_excluded"] = True + item["penalties"].append("model hard exclusion signal: " + "、".join(sorted(set(exclusion_hits))[:4])) + scored.append(item) no_call = all(item["score"] < threshold for item in scored) selected = [] rejected = [] @@ -160,7 +171,7 @@ def recommend(root, user_input, task_type="", pipeline_position="", threshold=No "score": item["score"], "reasons": item["reasons"], "penalties": item["penalties"], - "decision": "selected" if item["score"] >= threshold and not no_call else "rejected" + "decision": "selected" if item["score"] >= threshold and not no_call and not item.get("hard_excluded") else "rejected" } if output_item["decision"] == "selected": selected.append(output_item) diff --git a/selector/README.md b/selector/README.md index 89580d9..3cb4556 100644 --- a/selector/README.md +++ b/selector/README.md @@ -9,6 +9,7 @@ It should use simple matching rules: - Trigger keywords - Input types - Negative triggers +- Model-level hard exclusion triggers - Pipeline position - Selection priority - Negative trigger first @@ -18,6 +19,12 @@ It should use simple matching rules: - Direct-execution no-call signals - Calibration smoke checks +Round 03.2 selector rule: + +- Explicit refusal of a specific model, such as `不要思想考古` or `只做 QPI`, is a model-level hard exclusion for that model. +- A hard exclusion rejects only the named model; it does not globally no-call the request. +- Generic bare QPI gate words such as `如何` and `判断` should not be used alone. Use compound problem-definition phrases instead. + Current files: - `selector_rules.json` diff --git a/selector/selector_calibration_inputs.json b/selector/selector_calibration_inputs.json index a6042b6..1f7e5fe 100644 --- a/selector/selector_calibration_inputs.json +++ b/selector/selector_calibration_inputs.json @@ -591,6 +591,41 @@ "expected_selector_behavior": "no_call", "expected_notes": "Round 03.1 direct summary request must not select QPI by default score." }, + { + "case_id": "selector_calibration_ia_negative_explicit_do_not_call_001", + "category": "round_03_2_model_level_negative_gate", + "input": "QPI 已判断:这是 Issue。先不要思想考古,只做问题定性复核。", + "expected_selector_behavior": "select_qpi_reject_ia", + "expected_notes": "Explicit IA refusal must be a model-level hard exclusion, not a score penalty." + }, + { + "case_id": "selector_calibration_ia_negative_only_qpi_001", + "category": "round_03_2_model_level_negative_gate", + "input": "不要思想考古,只做 QPI 复核。", + "expected_selector_behavior": "select_qpi_reject_ia", + "expected_notes": "Only-QPI instruction should reject IA even when IA terms appear." + }, + { + "case_id": "selector_calibration_qpi_how_to_excel_no_call_001", + "category": "round_03_2_broad_qpi_gate_no_call", + "input": "如何在 Excel 里冻结首行?", + "expected_selector_behavior": "no_call", + "expected_notes": "Generic tool how-to should not be routed to QPI by bare 如何." + }, + { + "case_id": "selector_calibration_qpi_how_to_markdown_pdf_no_call_001", + "category": "round_03_2_broad_qpi_gate_no_call", + "input": "如何把 Markdown 转 PDF?", + "expected_selector_behavior": "no_call", + "expected_notes": "Generic conversion how-to should not be routed to QPI by bare 如何." + }, + { + "case_id": "selector_calibration_qpi_dictionary_judgment_no_call_001", + "category": "round_03_2_broad_qpi_gate_no_call", + "input": "判断这个词是什么意思。", + "expected_selector_behavior": "no_call", + "expected_notes": "Dictionary meaning request should not be routed to QPI by bare 判断." + }, { "case_id": "selector_calibration_analysis_override_should_call_001", "category": "round_03_1_analysis_override", diff --git a/selector/selector_rules.json b/selector/selector_rules.json index dc15608..faec365 100644 --- a/selector/selector_rules.json +++ b/selector/selector_rules.json @@ -79,8 +79,15 @@ "这是问题", "执行路径问题", "组织共识问题", - "如何", - "判断", + "如何判断这是什么问题", + "如何定义这个问题", + "如何提高流量", + "如何区分 Q/P/I", + "判断主导稀缺", + "判断这是问题还是课题", + "判断应该调用哪个模型", + "只做 QPI", + "只做问题定性", "真实调用", "上下文", "审计边界", @@ -92,6 +99,8 @@ "行动杠杆", "依赖风险", "误路由", + "真实独立 agent 调用记录", + "正式输出", "过度升维", "负激励", "成本转嫁", @@ -202,6 +211,14 @@ "先不要思想考古", "不要思想考古" ], + "hard_exclusion_triggers": [ + "不要思想考古", + "先不要思想考古", + "不要调用思想考古", + "不调用思想考古", + "只做 QPI", + "只做问题定性" + ], "pipeline_position": "modeling_depth_analysis", "selection_priority": 7, "routing_notes": "通常在 QPI 判断为中重型难题或课题后调用;遇到轻量事实检索应避免调用。" diff --git a/tests/intellectual_archaeology.regression.json b/tests/intellectual_archaeology.regression.json index 2c0c6eb..74cdeca 100644 --- a/tests/intellectual_archaeology.regression.json +++ b/tests/intellectual_archaeology.regression.json @@ -17,6 +17,8 @@ {"case_id": "case_ia_misuse_layer_jump_001", "model_id": "intellectual_archaeology", "case_type": "misuse", "input": "我们还没弄清应用层事实,就想直接讨论哲学基岩。", "expected_behavior": "应阻止层级跳跃,从应用层事实和证据缺口开始。", "failure_signal": "跳过中间层级。", "expected_output_elements": ["layers_to_analyze", "application"], "should_call_model": true, "expected_primary_model": "intellectual_archaeology", "negative_expected_models": [], "expected_classification": "not_applicable", "expected_dominant_scarcity": "not_applicable", "expected_max_depth": "application", "minimum_required_elements": ["stop_reason"], "forbidden_elements": ["philosophical_bedrock"], "evaluation_mode": "structured", "notes": "层级跳跃误用。"}, {"case_id": "case_ia_selector_gate_qpi_first_001", "model_id": "intellectual_archaeology", "case_type": "selector_gate", "input": "这个问题到底是缺数据、缺路径还是缺共识?", "expected_behavior": "selector 应先选 QPI,不应直接选思想考古。", "failure_signal": "IA 抢在 QPI 前。", "expected_output_elements": ["qpi first"], "should_call_model": false, "expected_primary_model": "qpi", "negative_expected_models": ["intellectual_archaeology"], "expected_classification": "not_applicable", "expected_dominant_scarcity": "not_applicable", "expected_max_depth": "no_call", "minimum_required_elements": ["rejected_models"], "forbidden_elements": ["selected IA"], "evaluation_mode": "structured", "notes": "QPI-before-IA gate。"}, {"case_id": "case_ia_selector_gate_no_heavy_signal_001", "model_id": "intellectual_archaeology", "case_type": "selector_gate", "input": "底层这个词怎么翻译?只要一个英文。", "expected_behavior": "虽然有底层一词,也不应召回思想考古。", "failure_signal": "关键词误召回。", "expected_output_elements": ["rejected_models"], "should_call_model": false, "expected_primary_model": "none", "negative_expected_models": ["intellectual_archaeology"], "expected_classification": "not_applicable", "expected_dominant_scarcity": "not_applicable", "expected_max_depth": "no_call", "minimum_required_elements": ["negative trigger"], "forbidden_elements": ["七层"], "evaluation_mode": "structured", "notes": "关键词误召回防护。"}, - {"case_id": "case_ia_pipeline_after_qpi_001", "model_id": "intellectual_archaeology", "case_type": "pipeline", "input": "QPI 已判断为中重型课题,且需要抽取底层机制和验证路径。", "expected_behavior": "IA 可作为 QPI 后续模型被调用。", "failure_signal": "在 QPI 放行后仍拒绝。", "expected_output_elements": ["QPI 后续", "should_call=true"], "should_call_model": true, "expected_primary_model": "intellectual_archaeology", "negative_expected_models": [], "expected_classification": "not_applicable", "expected_dominant_scarcity": "not_applicable", "expected_max_depth": "core_mechanism", "minimum_required_elements": ["entry_reason"], "forbidden_elements": [], "evaluation_mode": "structured", "notes": "QPI 后续 pipeline。"} + {"case_id": "case_ia_pipeline_after_qpi_001", "model_id": "intellectual_archaeology", "case_type": "pipeline", "input": "QPI 已判断为中重型课题,且需要抽取底层机制和验证路径。", "expected_behavior": "IA 可作为 QPI 后续模型被调用。", "failure_signal": "在 QPI 放行后仍拒绝。", "expected_output_elements": ["QPI 后续", "should_call=true"], "should_call_model": true, "expected_primary_model": "intellectual_archaeology", "negative_expected_models": [], "expected_classification": "not_applicable", "expected_dominant_scarcity": "not_applicable", "expected_max_depth": "core_mechanism", "minimum_required_elements": ["entry_reason"], "forbidden_elements": [], "evaluation_mode": "structured", "notes": "QPI 后续 pipeline。"}, + {"case_id": "case_ia_negative_explicit_do_not_call_001", "model_id": "intellectual_archaeology", "case_type": "selector_gate", "input": "QPI 已判断:这是 Issue。先不要思想考古,只做问题定性复核。", "expected_behavior": "selector 应选择 QPI,并硬拒绝思想考古。", "failure_signal": "因为“思想考古”和“QPI 已判断”加分而仍选中 IA。", "expected_output_elements": ["selected=qpi", "rejected=intellectual_archaeology"], "should_call_model": false, "expected_primary_model": "qpi", "negative_expected_models": ["intellectual_archaeology"], "expected_classification": "not_applicable", "expected_dominant_scarcity": "not_applicable", "expected_max_depth": "no_call", "minimum_required_elements": ["model_level_hard_exclusion"], "forbidden_elements": ["selected IA"], "evaluation_mode": "structured", "notes": "Round 03.2 hard exclusion trap: explicit IA refusal must override score."}, + {"case_id": "case_ia_negative_only_qpi_001", "model_id": "intellectual_archaeology", "case_type": "selector_gate", "input": "不要思想考古,只做 QPI 复核。", "expected_behavior": "selector 应选择 QPI,并硬拒绝思想考古。", "failure_signal": "IA 负触发只被当作 penalty,仍可能被选中。", "expected_output_elements": ["selected=qpi", "rejected=intellectual_archaeology"], "should_call_model": false, "expected_primary_model": "qpi", "negative_expected_models": ["intellectual_archaeology"], "expected_classification": "not_applicable", "expected_dominant_scarcity": "not_applicable", "expected_max_depth": "no_call", "minimum_required_elements": ["model_level_hard_exclusion"], "forbidden_elements": ["selected IA"], "evaluation_mode": "structured", "notes": "Round 03.2 hard exclusion trap: only-QPI instruction rejects IA."} ] } diff --git a/tests/qpi.regression.json b/tests/qpi.regression.json index f61f495..4b3a6ba 100644 --- a/tests/qpi.regression.json +++ b/tests/qpi.regression.json @@ -1550,6 +1550,90 @@ "evaluation_mode": "structured", "notes": "Round 03.1 direct execution no-call." }, + { + "case_id": "case_qpi_how_to_excel_no_call_001", + "model_id": "qpi", + "case_type": "no_call", + "input": "如何在 Excel 里冻结首行?", + "expected_behavior": "应 no_call:普通工具 how-to 不应因裸“如何”触发 QPI。", + "failure_signal": "selector 选中 QPI。", + "expected_output_elements": [ + "classification=no_call" + ], + "should_call_model": false, + "expected_primary_model": "none", + "negative_expected_models": [ + "qpi", + "intellectual_archaeology" + ], + "expected_classification": "no_call", + "expected_dominant_scarcity": "not_applicable", + "expected_max_depth": "not_applicable", + "minimum_required_elements": [ + "no_call" + ], + "forbidden_elements": [ + "problem_definition" + ], + "evaluation_mode": "structured", + "notes": "Round 03.2 no-call trap: narrow bare qpi_gate_signals." + }, + { + "case_id": "case_qpi_how_to_markdown_pdf_no_call_001", + "model_id": "qpi", + "case_type": "no_call", + "input": "如何把 Markdown 转 PDF?", + "expected_behavior": "应 no_call:普通格式转换 how-to 不应调用 QPI。", + "failure_signal": "selector 选中 QPI。", + "expected_output_elements": [ + "classification=no_call" + ], + "should_call_model": false, + "expected_primary_model": "none", + "negative_expected_models": [ + "qpi", + "intellectual_archaeology" + ], + "expected_classification": "no_call", + "expected_dominant_scarcity": "not_applicable", + "expected_max_depth": "not_applicable", + "minimum_required_elements": [ + "no_call" + ], + "forbidden_elements": [ + "problem_definition" + ], + "evaluation_mode": "structured", + "notes": "Round 03.2 no-call trap: generic how-to is not QPI." + }, + { + "case_id": "case_qpi_dictionary_judgment_no_call_001", + "model_id": "qpi", + "case_type": "no_call", + "input": "判断这个词是什么意思。", + "expected_behavior": "应 no_call:普通词义判断不应因裸“判断”触发 QPI。", + "failure_signal": "selector 选中 QPI。", + "expected_output_elements": [ + "classification=no_call" + ], + "should_call_model": false, + "expected_primary_model": "none", + "negative_expected_models": [ + "qpi", + "intellectual_archaeology" + ], + "expected_classification": "no_call", + "expected_dominant_scarcity": "not_applicable", + "expected_max_depth": "not_applicable", + "minimum_required_elements": [ + "no_call" + ], + "forbidden_elements": [ + "problem_definition" + ], + "evaluation_mode": "structured", + "notes": "Round 03.2 no-call trap: dictionary judgment is not QPI." + }, { "case_id": "case_qpi_analysis_override_should_call_001", "model_id": "qpi", diff --git a/tests/regression_cases.json b/tests/regression_cases.json index 5b5ae6b..dc74827 100644 --- a/tests/regression_cases.json +++ b/tests/regression_cases.json @@ -644,447 +644,6 @@ "source_case_digest_id": "qpi-disappointment-008", "notes": "Owner-reviewed disappointment case 008. Canonical anchor: one-person self-governance can still be Issue." }, - { - "case_id": "case_ia_positive_deep_modeling_001", - "model_id": "intellectual_archaeology", - "case_type": "positive", - "input": "我们要把专家对课堂质量的直觉变成一个可复用评价模型,但不知道底层教育目的和学习机制如何支撑指标。", - "expected_behavior": "应调用思想考古学,下潜到核心机理层,标出验证需求。", - "failure_signal": "只总结表层指标。", - "expected_output_elements": [ - "should_call=true", - "recommended_max_depth=core_mechanism" - ], - "should_call_model": true, - "expected_primary_model": "intellectual_archaeology", - "negative_expected_models": [], - "expected_classification": "not_applicable", - "expected_dominant_scarcity": "not_applicable", - "expected_max_depth": "core_mechanism", - "minimum_required_elements": [ - "stop_reason", - "validation_needed" - ], - "forbidden_elements": [], - "evaluation_mode": "structured", - "notes": "重型正例。" - }, - { - "case_id": "case_ia_positive_resilience_001", - "model_id": "intellectual_archaeology", - "case_type": "positive", - "input": "新的教学工具出现后,我们想知道现有评价模型需要局部调整还是必须重建底层教育模型。", - "expected_behavior": "应区分稳定内核和可变外壳,判断冲击层级。", - "failure_signal": "动辄推倒全部模型。", - "expected_output_elements": [ - "稳定内核", - "冲击层级" - ], - "should_call_model": true, - "expected_primary_model": "intellectual_archaeology", - "negative_expected_models": [], - "expected_classification": "not_applicable", - "expected_dominant_scarcity": "not_applicable", - "expected_max_depth": "purpose", - "minimum_required_elements": [ - "layers_to_analyze", - "action_implication" - ], - "forbidden_elements": [ - "默认哲学基岩" - ], - "evaluation_mode": "structured", - "notes": "中重型正例。" - }, - { - "case_id": "case_ia_positive_model_extraction_001", - "model_id": "intellectual_archaeology", - "case_type": "positive", - "input": "我要从一篇长文章中抽取可复用认知模型,需要判断它的机制、边界和底层假设。", - "expected_behavior": "应调用思想考古,最多到核心机理层或人类能力层。", - "failure_signal": "只做摘要或直接上哲学。", - "expected_output_elements": [ - "模型抽取", - "recommended_max_depth" - ], - "should_call_model": true, - "expected_primary_model": "intellectual_archaeology", - "negative_expected_models": [], - "expected_classification": "not_applicable", - "expected_dominant_scarcity": "not_applicable", - "expected_max_depth": "core_mechanism", - "minimum_required_elements": [ - "assumptions_by_layer", - "validation_needed" - ], - "forbidden_elements": [], - "evaluation_mode": "structured", - "notes": "模型抽取场景。" - }, - { - "case_id": "case_ia_positive_heavy_failure_001", - "model_id": "intellectual_archaeology", - "case_type": "positive", - "input": "这个战略方案连续三次失败,但每次复盘都只停留在执行动作,我们怀疑底层目的和机制错了。", - "expected_behavior": "应调用,允许下潜到目的层或核心机理层。", - "failure_signal": "只给执行建议。", - "expected_output_elements": [ - "entry_reason", - "core_mechanism" - ], - "should_call_model": true, - "expected_primary_model": "intellectual_archaeology", - "negative_expected_models": [], - "expected_classification": "not_applicable", - "expected_dominant_scarcity": "not_applicable", - "expected_max_depth": "core_mechanism", - "minimum_required_elements": [ - "no_deeper_reason" - ], - "forbidden_elements": [], - "evaluation_mode": "structured", - "notes": "重型失败复盘。" - }, - { - "case_id": "case_ia_positive_heavy_philosophy_001", - "model_id": "intellectual_archaeology", - "case_type": "positive", - "input": "我们正在定义问题本身的模型,涉及认知主体和现实映射的关系。", - "expected_behavior": "可下潜到哲学基岩层,但必须说明为何需要。", - "failure_signal": "不说明理由就上哲学。", - "expected_output_elements": [ - "philosophical_bedrock", - "entry_reason" - ], - "should_call_model": true, - "expected_primary_model": "intellectual_archaeology", - "negative_expected_models": [], - "expected_classification": "not_applicable", - "expected_dominant_scarcity": "not_applicable", - "expected_max_depth": "philosophical_bedrock", - "minimum_required_elements": [ - "stop_reason", - "action_implication" - ], - "forbidden_elements": [], - "evaluation_mode": "structured", - "notes": "少数可到哲学基岩的正例。" - }, - { - "case_id": "case_ia_boundary_medium_purpose_001", - "model_id": "intellectual_archaeology", - "case_type": "boundary", - "input": "我们知道课堂评价指标,但不知道它服务的教育目的是否一致。", - "expected_behavior": "应下潜到目的层后停止。", - "failure_signal": "自动下潜到哲学基岩。", - "expected_output_elements": [ - "recommended_max_depth=purpose" - ], - "should_call_model": true, - "expected_primary_model": "intellectual_archaeology", - "negative_expected_models": [], - "expected_classification": "not_applicable", - "expected_dominant_scarcity": "not_applicable", - "expected_max_depth": "purpose", - "minimum_required_elements": [ - "no_deeper_reason" - ], - "forbidden_elements": [ - "philosophical_bedrock" - ], - "evaluation_mode": "structured", - "notes": "中型目的层。" - }, - { - "case_id": "case_ia_boundary_medium_process_001", - "model_id": "intellectual_archaeology", - "case_type": "boundary", - "input": "流程卡住了,我们需要理解实际业务过程,而不是重写价值观。", - "expected_behavior": "最多到过程层,说明停止理由。", - "failure_signal": "展开人类能力或哲学层。", - "expected_output_elements": [ - "recommended_max_depth=process" - ], - "should_call_model": true, - "expected_primary_model": "intellectual_archaeology", - "negative_expected_models": [], - "expected_classification": "not_applicable", - "expected_dominant_scarcity": "not_applicable", - "expected_max_depth": "process", - "minimum_required_elements": [ - "stop_reason" - ], - "forbidden_elements": [ - "human_capability", - "philosophical_bedrock" - ], - "evaluation_mode": "structured", - "notes": "过程层停止。" - }, - { - "case_id": "case_ia_boundary_medium_core_001", - "model_id": "intellectual_archaeology", - "case_type": "boundary", - "input": "我们已经有流程图,但不知道学习机制是否支撑这个流程。", - "expected_behavior": "可下潜到核心机理层,不应继续到哲学基岩。", - "failure_signal": "无条件七层全开。", - "expected_output_elements": [ - "core_mechanism", - "no_deeper_reason" - ], - "should_call_model": true, - "expected_primary_model": "intellectual_archaeology", - "negative_expected_models": [], - "expected_classification": "not_applicable", - "expected_dominant_scarcity": "not_applicable", - "expected_max_depth": "core_mechanism", - "minimum_required_elements": [ - "validation_needed" - ], - "forbidden_elements": [ - "philosophical_bedrock" - ], - "evaluation_mode": "structured", - "notes": "核心机理层停止。" - }, - { - "case_id": "case_ia_no_call_fact_001", - "model_id": "intellectual_archaeology", - "case_type": "no_call", - "input": "我只是想知道这篇文章里有没有提到某个工具名称。", - "expected_behavior": "不应调用思想考古,应建议直接检索。", - "failure_signal": "强行展开七层哲学分析。", - "expected_output_elements": [ - "should_call=false" - ], - "should_call_model": false, - "expected_primary_model": "none", - "negative_expected_models": [ - "intellectual_archaeology" - ], - "expected_classification": "not_applicable", - "expected_dominant_scarcity": "not_applicable", - "expected_max_depth": "no_call", - "minimum_required_elements": [ - "entry_reason" - ], - "forbidden_elements": [ - "七层" - ], - "evaluation_mode": "structured", - "notes": "事实检索 no-call。" - }, - { - "case_id": "case_ia_no_call_edit_001", - "model_id": "intellectual_archaeology", - "case_type": "no_call", - "input": "请把这段话润色一下,不要深入分析。", - "expected_behavior": "不调用。", - "failure_signal": "展开底层假设。", - "expected_output_elements": [ - "should_call=false" - ], - "should_call_model": false, - "expected_primary_model": "none", - "negative_expected_models": [ - "intellectual_archaeology" - ], - "expected_classification": "not_applicable", - "expected_dominant_scarcity": "not_applicable", - "expected_max_depth": "no_call", - "minimum_required_elements": [ - "no_deeper_reason" - ], - "forbidden_elements": [ - "底层假设" - ], - "evaluation_mode": "structured", - "notes": "润色 no-call。" - }, - { - "case_id": "case_ia_no_call_light_execution_001", - "model_id": "intellectual_archaeology", - "case_type": "no_call", - "input": "按钮文案写错了,直接改成保存即可。", - "expected_behavior": "不调用。", - "failure_signal": "重新定义用户关系。", - "expected_output_elements": [ - "should_call=false" - ], - "should_call_model": false, - "expected_primary_model": "none", - "negative_expected_models": [ - "intellectual_archaeology" - ], - "expected_classification": "not_applicable", - "expected_dominant_scarcity": "not_applicable", - "expected_max_depth": "no_call", - "minimum_required_elements": [ - "action_implication" - ], - "forbidden_elements": [ - "philosophical_bedrock" - ], - "evaluation_mode": "structured", - "notes": "轻量执行 no-call。" - }, - { - "case_id": "case_ia_misuse_philosophizing_001", - "model_id": "intellectual_archaeology", - "case_type": "misuse", - "input": "我们已经知道方案只需要修一个按钮文案,但还想顺便从哲学基岩重新定义用户关系。", - "expected_behavior": "应拒绝过度下钻,说明继续下潜不会改变判断或行动。", - "failure_signal": "接受无必要的哲学化扩展。", - "expected_output_elements": [ - "停止下钻", - "行动不改变" - ], - "should_call_model": false, - "expected_primary_model": "none", - "negative_expected_models": [ - "intellectual_archaeology" - ], - "expected_classification": "not_applicable", - "expected_dominant_scarcity": "not_applicable", - "expected_max_depth": "no_call", - "minimum_required_elements": [ - "no_deeper_reason" - ], - "forbidden_elements": [ - "philosophical_bedrock" - ], - "evaluation_mode": "structured", - "notes": "过度哲学化。" - }, - { - "case_id": "case_ia_misuse_no_validation_001", - "model_id": "intellectual_archaeology", - "case_type": "misuse", - "input": "我们用七层结构写出一个很自洽的模型,准备直接上线,不做红队、数据对撞或专家盲审。", - "expected_behavior": "应指出内部自洽不等于现实有效,要求补充验证机制。", - "failure_signal": "把七层结构本身视为充分验证。", - "expected_output_elements": [ - "validation_needed" - ], - "should_call_model": true, - "expected_primary_model": "intellectual_archaeology", - "negative_expected_models": [], - "expected_classification": "not_applicable", - "expected_dominant_scarcity": "not_applicable", - "expected_max_depth": "core_mechanism", - "minimum_required_elements": [ - "validation_needed" - ], - "forbidden_elements": [ - "直接上线" - ], - "evaluation_mode": "structured", - "notes": "无验证误用。" - }, - { - "case_id": "case_ia_misuse_layer_jump_001", - "model_id": "intellectual_archaeology", - "case_type": "misuse", - "input": "我们还没弄清应用层事实,就想直接讨论哲学基岩。", - "expected_behavior": "应阻止层级跳跃,从应用层事实和证据缺口开始。", - "failure_signal": "跳过中间层级。", - "expected_output_elements": [ - "layers_to_analyze", - "application" - ], - "should_call_model": true, - "expected_primary_model": "intellectual_archaeology", - "negative_expected_models": [], - "expected_classification": "not_applicable", - "expected_dominant_scarcity": "not_applicable", - "expected_max_depth": "application", - "minimum_required_elements": [ - "stop_reason" - ], - "forbidden_elements": [ - "philosophical_bedrock" - ], - "evaluation_mode": "structured", - "notes": "层级跳跃误用。" - }, - { - "case_id": "case_ia_selector_gate_qpi_first_001", - "model_id": "intellectual_archaeology", - "case_type": "selector_gate", - "input": "这个问题到底是缺数据、缺路径还是缺共识?", - "expected_behavior": "selector 应先选 QPI,不应直接选思想考古。", - "failure_signal": "IA 抢在 QPI 前。", - "expected_output_elements": [ - "qpi first" - ], - "should_call_model": false, - "expected_primary_model": "qpi", - "negative_expected_models": [ - "intellectual_archaeology" - ], - "expected_classification": "not_applicable", - "expected_dominant_scarcity": "not_applicable", - "expected_max_depth": "no_call", - "minimum_required_elements": [ - "rejected_models" - ], - "forbidden_elements": [ - "selected IA" - ], - "evaluation_mode": "structured", - "notes": "QPI-before-IA gate。" - }, - { - "case_id": "case_ia_selector_gate_no_heavy_signal_001", - "model_id": "intellectual_archaeology", - "case_type": "selector_gate", - "input": "底层这个词怎么翻译?只要一个英文。", - "expected_behavior": "虽然有底层一词,也不应召回思想考古。", - "failure_signal": "关键词误召回。", - "expected_output_elements": [ - "rejected_models" - ], - "should_call_model": false, - "expected_primary_model": "none", - "negative_expected_models": [ - "intellectual_archaeology" - ], - "expected_classification": "not_applicable", - "expected_dominant_scarcity": "not_applicable", - "expected_max_depth": "no_call", - "minimum_required_elements": [ - "negative trigger" - ], - "forbidden_elements": [ - "七层" - ], - "evaluation_mode": "structured", - "notes": "关键词误召回防护。" - }, - { - "case_id": "case_ia_pipeline_after_qpi_001", - "model_id": "intellectual_archaeology", - "case_type": "pipeline", - "input": "QPI 已判断为中重型课题,且需要抽取底层机制和验证路径。", - "expected_behavior": "IA 可作为 QPI 后续模型被调用。", - "failure_signal": "在 QPI 放行后仍拒绝。", - "expected_output_elements": [ - "QPI 后续", - "should_call=true" - ], - "should_call_model": true, - "expected_primary_model": "intellectual_archaeology", - "negative_expected_models": [], - "expected_classification": "not_applicable", - "expected_dominant_scarcity": "not_applicable", - "expected_max_depth": "core_mechanism", - "minimum_required_elements": [ - "entry_reason" - ], - "forbidden_elements": [], - "evaluation_mode": "structured", - "notes": "QPI 后续 pipeline。" - }, { "case_id": "case_qpi_org_hard_resource_documentation_001", "model_id": "qpi", @@ -1990,6 +1549,90 @@ "evaluation_mode": "structured", "notes": "Round 03.1 direct execution no-call." }, + { + "case_id": "case_qpi_how_to_excel_no_call_001", + "model_id": "qpi", + "case_type": "no_call", + "input": "如何在 Excel 里冻结首行?", + "expected_behavior": "应 no_call:普通工具 how-to 不应因裸“如何”触发 QPI。", + "failure_signal": "selector 选中 QPI。", + "expected_output_elements": [ + "classification=no_call" + ], + "should_call_model": false, + "expected_primary_model": "none", + "negative_expected_models": [ + "qpi", + "intellectual_archaeology" + ], + "expected_classification": "no_call", + "expected_dominant_scarcity": "not_applicable", + "expected_max_depth": "not_applicable", + "minimum_required_elements": [ + "no_call" + ], + "forbidden_elements": [ + "problem_definition" + ], + "evaluation_mode": "structured", + "notes": "Round 03.2 no-call trap: narrow bare qpi_gate_signals." + }, + { + "case_id": "case_qpi_how_to_markdown_pdf_no_call_001", + "model_id": "qpi", + "case_type": "no_call", + "input": "如何把 Markdown 转 PDF?", + "expected_behavior": "应 no_call:普通格式转换 how-to 不应调用 QPI。", + "failure_signal": "selector 选中 QPI。", + "expected_output_elements": [ + "classification=no_call" + ], + "should_call_model": false, + "expected_primary_model": "none", + "negative_expected_models": [ + "qpi", + "intellectual_archaeology" + ], + "expected_classification": "no_call", + "expected_dominant_scarcity": "not_applicable", + "expected_max_depth": "not_applicable", + "minimum_required_elements": [ + "no_call" + ], + "forbidden_elements": [ + "problem_definition" + ], + "evaluation_mode": "structured", + "notes": "Round 03.2 no-call trap: generic how-to is not QPI." + }, + { + "case_id": "case_qpi_dictionary_judgment_no_call_001", + "model_id": "qpi", + "case_type": "no_call", + "input": "判断这个词是什么意思。", + "expected_behavior": "应 no_call:普通词义判断不应因裸“判断”触发 QPI。", + "failure_signal": "selector 选中 QPI。", + "expected_output_elements": [ + "classification=no_call" + ], + "should_call_model": false, + "expected_primary_model": "none", + "negative_expected_models": [ + "qpi", + "intellectual_archaeology" + ], + "expected_classification": "no_call", + "expected_dominant_scarcity": "not_applicable", + "expected_max_depth": "not_applicable", + "minimum_required_elements": [ + "no_call" + ], + "forbidden_elements": [ + "problem_definition" + ], + "evaluation_mode": "structured", + "notes": "Round 03.2 no-call trap: dictionary judgment is not QPI." + }, { "case_id": "case_qpi_analysis_override_should_call_001", "model_id": "qpi", @@ -2017,6 +1660,503 @@ ], "evaluation_mode": "structured", "notes": "Round 03.1 override trap: direct execution phrase plus explicit analysis request." + }, + { + "case_id": "case_ia_positive_deep_modeling_001", + "model_id": "intellectual_archaeology", + "case_type": "positive", + "input": "我们要把专家对课堂质量的直觉变成一个可复用评价模型,但不知道底层教育目的和学习机制如何支撑指标。", + "expected_behavior": "应调用思想考古学,下潜到核心机理层,标出验证需求。", + "failure_signal": "只总结表层指标。", + "expected_output_elements": [ + "should_call=true", + "recommended_max_depth=core_mechanism" + ], + "should_call_model": true, + "expected_primary_model": "intellectual_archaeology", + "negative_expected_models": [], + "expected_classification": "not_applicable", + "expected_dominant_scarcity": "not_applicable", + "expected_max_depth": "core_mechanism", + "minimum_required_elements": [ + "stop_reason", + "validation_needed" + ], + "forbidden_elements": [], + "evaluation_mode": "structured", + "notes": "重型正例。" + }, + { + "case_id": "case_ia_positive_resilience_001", + "model_id": "intellectual_archaeology", + "case_type": "positive", + "input": "新的教学工具出现后,我们想知道现有评价模型需要局部调整还是必须重建底层教育模型。", + "expected_behavior": "应区分稳定内核和可变外壳,判断冲击层级。", + "failure_signal": "动辄推倒全部模型。", + "expected_output_elements": [ + "稳定内核", + "冲击层级" + ], + "should_call_model": true, + "expected_primary_model": "intellectual_archaeology", + "negative_expected_models": [], + "expected_classification": "not_applicable", + "expected_dominant_scarcity": "not_applicable", + "expected_max_depth": "purpose", + "minimum_required_elements": [ + "layers_to_analyze", + "action_implication" + ], + "forbidden_elements": [ + "默认哲学基岩" + ], + "evaluation_mode": "structured", + "notes": "中重型正例。" + }, + { + "case_id": "case_ia_positive_model_extraction_001", + "model_id": "intellectual_archaeology", + "case_type": "positive", + "input": "我要从一篇长文章中抽取可复用认知模型,需要判断它的机制、边界和底层假设。", + "expected_behavior": "应调用思想考古,最多到核心机理层或人类能力层。", + "failure_signal": "只做摘要或直接上哲学。", + "expected_output_elements": [ + "模型抽取", + "recommended_max_depth" + ], + "should_call_model": true, + "expected_primary_model": "intellectual_archaeology", + "negative_expected_models": [], + "expected_classification": "not_applicable", + "expected_dominant_scarcity": "not_applicable", + "expected_max_depth": "core_mechanism", + "minimum_required_elements": [ + "assumptions_by_layer", + "validation_needed" + ], + "forbidden_elements": [], + "evaluation_mode": "structured", + "notes": "模型抽取场景。" + }, + { + "case_id": "case_ia_positive_heavy_failure_001", + "model_id": "intellectual_archaeology", + "case_type": "positive", + "input": "这个战略方案连续三次失败,但每次复盘都只停留在执行动作,我们怀疑底层目的和机制错了。", + "expected_behavior": "应调用,允许下潜到目的层或核心机理层。", + "failure_signal": "只给执行建议。", + "expected_output_elements": [ + "entry_reason", + "core_mechanism" + ], + "should_call_model": true, + "expected_primary_model": "intellectual_archaeology", + "negative_expected_models": [], + "expected_classification": "not_applicable", + "expected_dominant_scarcity": "not_applicable", + "expected_max_depth": "core_mechanism", + "minimum_required_elements": [ + "no_deeper_reason" + ], + "forbidden_elements": [], + "evaluation_mode": "structured", + "notes": "重型失败复盘。" + }, + { + "case_id": "case_ia_positive_heavy_philosophy_001", + "model_id": "intellectual_archaeology", + "case_type": "positive", + "input": "我们正在定义问题本身的模型,涉及认知主体和现实映射的关系。", + "expected_behavior": "可下潜到哲学基岩层,但必须说明为何需要。", + "failure_signal": "不说明理由就上哲学。", + "expected_output_elements": [ + "philosophical_bedrock", + "entry_reason" + ], + "should_call_model": true, + "expected_primary_model": "intellectual_archaeology", + "negative_expected_models": [], + "expected_classification": "not_applicable", + "expected_dominant_scarcity": "not_applicable", + "expected_max_depth": "philosophical_bedrock", + "minimum_required_elements": [ + "stop_reason", + "action_implication" + ], + "forbidden_elements": [], + "evaluation_mode": "structured", + "notes": "少数可到哲学基岩的正例。" + }, + { + "case_id": "case_ia_boundary_medium_purpose_001", + "model_id": "intellectual_archaeology", + "case_type": "boundary", + "input": "我们知道课堂评价指标,但不知道它服务的教育目的是否一致。", + "expected_behavior": "应下潜到目的层后停止。", + "failure_signal": "自动下潜到哲学基岩。", + "expected_output_elements": [ + "recommended_max_depth=purpose" + ], + "should_call_model": true, + "expected_primary_model": "intellectual_archaeology", + "negative_expected_models": [], + "expected_classification": "not_applicable", + "expected_dominant_scarcity": "not_applicable", + "expected_max_depth": "purpose", + "minimum_required_elements": [ + "no_deeper_reason" + ], + "forbidden_elements": [ + "philosophical_bedrock" + ], + "evaluation_mode": "structured", + "notes": "中型目的层。" + }, + { + "case_id": "case_ia_boundary_medium_process_001", + "model_id": "intellectual_archaeology", + "case_type": "boundary", + "input": "流程卡住了,我们需要理解实际业务过程,而不是重写价值观。", + "expected_behavior": "最多到过程层,说明停止理由。", + "failure_signal": "展开人类能力或哲学层。", + "expected_output_elements": [ + "recommended_max_depth=process" + ], + "should_call_model": true, + "expected_primary_model": "intellectual_archaeology", + "negative_expected_models": [], + "expected_classification": "not_applicable", + "expected_dominant_scarcity": "not_applicable", + "expected_max_depth": "process", + "minimum_required_elements": [ + "stop_reason" + ], + "forbidden_elements": [ + "human_capability", + "philosophical_bedrock" + ], + "evaluation_mode": "structured", + "notes": "过程层停止。" + }, + { + "case_id": "case_ia_boundary_medium_core_001", + "model_id": "intellectual_archaeology", + "case_type": "boundary", + "input": "我们已经有流程图,但不知道学习机制是否支撑这个流程。", + "expected_behavior": "可下潜到核心机理层,不应继续到哲学基岩。", + "failure_signal": "无条件七层全开。", + "expected_output_elements": [ + "core_mechanism", + "no_deeper_reason" + ], + "should_call_model": true, + "expected_primary_model": "intellectual_archaeology", + "negative_expected_models": [], + "expected_classification": "not_applicable", + "expected_dominant_scarcity": "not_applicable", + "expected_max_depth": "core_mechanism", + "minimum_required_elements": [ + "validation_needed" + ], + "forbidden_elements": [ + "philosophical_bedrock" + ], + "evaluation_mode": "structured", + "notes": "核心机理层停止。" + }, + { + "case_id": "case_ia_no_call_fact_001", + "model_id": "intellectual_archaeology", + "case_type": "no_call", + "input": "我只是想知道这篇文章里有没有提到某个工具名称。", + "expected_behavior": "不应调用思想考古,应建议直接检索。", + "failure_signal": "强行展开七层哲学分析。", + "expected_output_elements": [ + "should_call=false" + ], + "should_call_model": false, + "expected_primary_model": "none", + "negative_expected_models": [ + "intellectual_archaeology" + ], + "expected_classification": "not_applicable", + "expected_dominant_scarcity": "not_applicable", + "expected_max_depth": "no_call", + "minimum_required_elements": [ + "entry_reason" + ], + "forbidden_elements": [ + "七层" + ], + "evaluation_mode": "structured", + "notes": "事实检索 no-call。" + }, + { + "case_id": "case_ia_no_call_edit_001", + "model_id": "intellectual_archaeology", + "case_type": "no_call", + "input": "请把这段话润色一下,不要深入分析。", + "expected_behavior": "不调用。", + "failure_signal": "展开底层假设。", + "expected_output_elements": [ + "should_call=false" + ], + "should_call_model": false, + "expected_primary_model": "none", + "negative_expected_models": [ + "intellectual_archaeology" + ], + "expected_classification": "not_applicable", + "expected_dominant_scarcity": "not_applicable", + "expected_max_depth": "no_call", + "minimum_required_elements": [ + "no_deeper_reason" + ], + "forbidden_elements": [ + "底层假设" + ], + "evaluation_mode": "structured", + "notes": "润色 no-call。" + }, + { + "case_id": "case_ia_no_call_light_execution_001", + "model_id": "intellectual_archaeology", + "case_type": "no_call", + "input": "按钮文案写错了,直接改成保存即可。", + "expected_behavior": "不调用。", + "failure_signal": "重新定义用户关系。", + "expected_output_elements": [ + "should_call=false" + ], + "should_call_model": false, + "expected_primary_model": "none", + "negative_expected_models": [ + "intellectual_archaeology" + ], + "expected_classification": "not_applicable", + "expected_dominant_scarcity": "not_applicable", + "expected_max_depth": "no_call", + "minimum_required_elements": [ + "action_implication" + ], + "forbidden_elements": [ + "philosophical_bedrock" + ], + "evaluation_mode": "structured", + "notes": "轻量执行 no-call。" + }, + { + "case_id": "case_ia_misuse_philosophizing_001", + "model_id": "intellectual_archaeology", + "case_type": "misuse", + "input": "我们已经知道方案只需要修一个按钮文案,但还想顺便从哲学基岩重新定义用户关系。", + "expected_behavior": "应拒绝过度下钻,说明继续下潜不会改变判断或行动。", + "failure_signal": "接受无必要的哲学化扩展。", + "expected_output_elements": [ + "停止下钻", + "行动不改变" + ], + "should_call_model": false, + "expected_primary_model": "none", + "negative_expected_models": [ + "intellectual_archaeology" + ], + "expected_classification": "not_applicable", + "expected_dominant_scarcity": "not_applicable", + "expected_max_depth": "no_call", + "minimum_required_elements": [ + "no_deeper_reason" + ], + "forbidden_elements": [ + "philosophical_bedrock" + ], + "evaluation_mode": "structured", + "notes": "过度哲学化。" + }, + { + "case_id": "case_ia_misuse_no_validation_001", + "model_id": "intellectual_archaeology", + "case_type": "misuse", + "input": "我们用七层结构写出一个很自洽的模型,准备直接上线,不做红队、数据对撞或专家盲审。", + "expected_behavior": "应指出内部自洽不等于现实有效,要求补充验证机制。", + "failure_signal": "把七层结构本身视为充分验证。", + "expected_output_elements": [ + "validation_needed" + ], + "should_call_model": true, + "expected_primary_model": "intellectual_archaeology", + "negative_expected_models": [], + "expected_classification": "not_applicable", + "expected_dominant_scarcity": "not_applicable", + "expected_max_depth": "core_mechanism", + "minimum_required_elements": [ + "validation_needed" + ], + "forbidden_elements": [ + "直接上线" + ], + "evaluation_mode": "structured", + "notes": "无验证误用。" + }, + { + "case_id": "case_ia_misuse_layer_jump_001", + "model_id": "intellectual_archaeology", + "case_type": "misuse", + "input": "我们还没弄清应用层事实,就想直接讨论哲学基岩。", + "expected_behavior": "应阻止层级跳跃,从应用层事实和证据缺口开始。", + "failure_signal": "跳过中间层级。", + "expected_output_elements": [ + "layers_to_analyze", + "application" + ], + "should_call_model": true, + "expected_primary_model": "intellectual_archaeology", + "negative_expected_models": [], + "expected_classification": "not_applicable", + "expected_dominant_scarcity": "not_applicable", + "expected_max_depth": "application", + "minimum_required_elements": [ + "stop_reason" + ], + "forbidden_elements": [ + "philosophical_bedrock" + ], + "evaluation_mode": "structured", + "notes": "层级跳跃误用。" + }, + { + "case_id": "case_ia_selector_gate_qpi_first_001", + "model_id": "intellectual_archaeology", + "case_type": "selector_gate", + "input": "这个问题到底是缺数据、缺路径还是缺共识?", + "expected_behavior": "selector 应先选 QPI,不应直接选思想考古。", + "failure_signal": "IA 抢在 QPI 前。", + "expected_output_elements": [ + "qpi first" + ], + "should_call_model": false, + "expected_primary_model": "qpi", + "negative_expected_models": [ + "intellectual_archaeology" + ], + "expected_classification": "not_applicable", + "expected_dominant_scarcity": "not_applicable", + "expected_max_depth": "no_call", + "minimum_required_elements": [ + "rejected_models" + ], + "forbidden_elements": [ + "selected IA" + ], + "evaluation_mode": "structured", + "notes": "QPI-before-IA gate。" + }, + { + "case_id": "case_ia_selector_gate_no_heavy_signal_001", + "model_id": "intellectual_archaeology", + "case_type": "selector_gate", + "input": "底层这个词怎么翻译?只要一个英文。", + "expected_behavior": "虽然有底层一词,也不应召回思想考古。", + "failure_signal": "关键词误召回。", + "expected_output_elements": [ + "rejected_models" + ], + "should_call_model": false, + "expected_primary_model": "none", + "negative_expected_models": [ + "intellectual_archaeology" + ], + "expected_classification": "not_applicable", + "expected_dominant_scarcity": "not_applicable", + "expected_max_depth": "no_call", + "minimum_required_elements": [ + "negative trigger" + ], + "forbidden_elements": [ + "七层" + ], + "evaluation_mode": "structured", + "notes": "关键词误召回防护。" + }, + { + "case_id": "case_ia_pipeline_after_qpi_001", + "model_id": "intellectual_archaeology", + "case_type": "pipeline", + "input": "QPI 已判断为中重型课题,且需要抽取底层机制和验证路径。", + "expected_behavior": "IA 可作为 QPI 后续模型被调用。", + "failure_signal": "在 QPI 放行后仍拒绝。", + "expected_output_elements": [ + "QPI 后续", + "should_call=true" + ], + "should_call_model": true, + "expected_primary_model": "intellectual_archaeology", + "negative_expected_models": [], + "expected_classification": "not_applicable", + "expected_dominant_scarcity": "not_applicable", + "expected_max_depth": "core_mechanism", + "minimum_required_elements": [ + "entry_reason" + ], + "forbidden_elements": [], + "evaluation_mode": "structured", + "notes": "QPI 后续 pipeline。" + }, + { + "case_id": "case_ia_negative_explicit_do_not_call_001", + "model_id": "intellectual_archaeology", + "case_type": "selector_gate", + "input": "QPI 已判断:这是 Issue。先不要思想考古,只做问题定性复核。", + "expected_behavior": "selector 应选择 QPI,并硬拒绝思想考古。", + "failure_signal": "因为“思想考古”和“QPI 已判断”加分而仍选中 IA。", + "expected_output_elements": [ + "selected=qpi", + "rejected=intellectual_archaeology" + ], + "should_call_model": false, + "expected_primary_model": "qpi", + "negative_expected_models": [ + "intellectual_archaeology" + ], + "expected_classification": "not_applicable", + "expected_dominant_scarcity": "not_applicable", + "expected_max_depth": "no_call", + "minimum_required_elements": [ + "model_level_hard_exclusion" + ], + "forbidden_elements": [ + "selected IA" + ], + "evaluation_mode": "structured", + "notes": "Round 03.2 hard exclusion trap: explicit IA refusal must override score." + }, + { + "case_id": "case_ia_negative_only_qpi_001", + "model_id": "intellectual_archaeology", + "case_type": "selector_gate", + "input": "不要思想考古,只做 QPI 复核。", + "expected_behavior": "selector 应选择 QPI,并硬拒绝思想考古。", + "failure_signal": "IA 负触发只被当作 penalty,仍可能被选中。", + "expected_output_elements": [ + "selected=qpi", + "rejected=intellectual_archaeology" + ], + "should_call_model": false, + "expected_primary_model": "qpi", + "negative_expected_models": [ + "intellectual_archaeology" + ], + "expected_classification": "not_applicable", + "expected_dominant_scarcity": "not_applicable", + "expected_max_depth": "no_call", + "minimum_required_elements": [ + "model_level_hard_exclusion" + ], + "forbidden_elements": [ + "selected IA" + ], + "evaluation_mode": "structured", + "notes": "Round 03.2 hard exclusion trap: only-QPI instruction rejects IA." } ] } diff --git a/tests/regression_index.json b/tests/regression_index.json index 4be3196..c1daee7 100644 --- a/tests/regression_index.json +++ b/tests/regression_index.json @@ -1,33 +1,33 @@ { "index_version": "0.2", - "last_updated": "2026-06-16", + "last_updated": "2026-06-17", "source_of_truth": "per_model_files", "aggregate_file": "tests/regression_cases.json", "models": [ { "model_id": "qpi", "regression_file": "tests/qpi.regression.json", - "case_count": 17, + "case_count": 55, "case_type_counts": { - "positive": 9, - "boundary": 3, - "misuse": 2, - "no_call": 1, - "selector_gate": 1, - "pipeline": 1 + "boundary": 13, + "misuse": 16, + "no_call": 6, + "pipeline": 1, + "positive": 16, + "selector_gate": 3 } }, { "model_id": "intellectual_archaeology", "regression_file": "tests/intellectual_archaeology.regression.json", - "case_count": 17, + "case_count": 19, "case_type_counts": { - "positive": 5, "boundary": 3, "misuse": 3, "no_call": 3, - "selector_gate": 2, - "pipeline": 1 + "pipeline": 1, + "positive": 5, + "selector_gate": 4 } } ]