From 16591e21e270f8368c133d669667751f6b2357a9 Mon Sep 17 00:00:00 2001 From: wantsong Date: Wed, 17 Jun 2026 01:59:56 +0800 Subject: [PATCH] feat: build model library mvp foundation --- AGENTS.md | 17 + README.md | 49 +- cards/README.md | 12 +- cards/card_index.md | 6 + cards/intellectual_archaeology.md | 246 + cards/qpi.md | 287 ++ .../00_OPEN_THIS_FIRST_CCRA_REVIEW_BRIEF.md | 67 + .../01_GUIDANCE_PACK_AND_COMPLIANCE_MATRIX.md | 3954 +++++++++++++++++ .../02_CURRENT_ASSET_PACK.md | 1626 +++++++ .../03_REPORTS_DIFF_AND_COMMAND_LOG.md | 1012 +++++ .../BUNDLE_FILE_MANIFEST.md | 9 + .../optional_raw_changed_files.zip | Bin 0 -> 116961 bytes .../00_OPEN_THIS_FIRST_CCRA_REVIEW_BRIEF.md | 93 + .../01_GUIDANCE_PACK_AND_COMPLIANCE_MATRIX.md | 96 + .../02_CURRENT_ASSET_PACK.md | 60 + .../03_REPORTS_DIFF_AND_COMMAND_LOG.md | 85 + .../BUNDLE_FILE_MANIFEST.md | 38 + .../optional_raw_changed_files.zip | Bin 0 -> 54436 bytes docs/CHATGPT_HANDOFF_RULES.md | 83 + docs/CONTENT_STABILIZATION_PROTOCOL.md | 84 + docs/DATA_CONTRACT.md | 35 + docs/DECISIONS.md | 70 + docs/GPT_PLAN_LOCALIZATION_PROTOCOL.md | 65 + docs/INDEX_MAINTENANCE_PROTOCOL.md | 115 + docs/INTELLECTUAL_ARCHAEOLOGY_DEPTH_GATE.md | 103 + docs/KNOWLEDGE_ASSET_RULES.md | 90 + docs/MODEL_CARD_CONTRACT.md | 133 + docs/MODEL_EXTRACTION_RULES.md | 174 + docs/MODEL_EXTRACTION_WORKFLOW.md | 133 + docs/PROJECT_BRIEF.md | 3 + docs/QPI_CONTEXTUAL_ROUTING_RULES.md | 178 + docs/WORKFLOW.md | 26 +- docs/model_case_preprocessing/README.md | 23 + .../qpi/CASE_PREPROCESSING_WORKFLOW.md | 175 + docs/model_case_preprocessing/qpi/README.md | 10 + ...-model-extraction-contract-and-workflow.md | 844 ++++ ...contract-hardening-selector-calibration.md | 80 + knowledge_assets/00_用户背景与产品上下文.md | 70 + knowledge_assets/01_核心模型地图.md | 62 + knowledge_assets/02_模型卡结构规范.md | 86 + knowledge_assets/03_核心模型抽取样板.md | 106 + knowledge_assets/06_模型稳固性评级规则.md | 64 + knowledge_assets/07_产品规划过程记录.md | 58 + .../08_CCRA模型库MVP质量门与交接协议.md | 383 ++ knowledge_assets/README.md | 16 + models/README.md | 6 +- models/intellectual_archaeology.model.json | 187 + models/model_index.json | 36 + models/qpi.model.json | 243 + repo_tree.txt | 82 + .../ChatGPT交接文档_模型库MVP_2026-06-16.md | 138 + ...档_模型库MVP_第二轮内容稳定化_2026-06-16.md | 153 + reports/Codex_模型资产链路摘要_v0.1.md | 98 + ...会话交接文档_CCRA评审后处理_2026-06-16.md | 258 ++ ...文档_QPI案例草稿审阅与第三轮后续_2026-06-17.md | 274 ++ ...odex新会话交接文档_模型库MVP_2026-06-16.md | 281 ++ reports/GPT规划落地差异检查_v0.1.md | 162 + reports/README.md | 15 +- ...eline_before_content_stabilization_v0.2.md | 67 + reports/changed_files_manifest.md | 39 + reports/command_log.md | 88 + reports/content_review_report.md | 15 + reports/content_review_report_v0.2.md | 177 + reports/evidence_coverage_matrix.md | 17 + reports/evidence_coverage_report_v0.2.md | 98 + reports/index_check_report.md | 22 + reports/index_rebuild_report.md | 9 + reports/model_card_sync_report_v0.2.md | 13 + .../qpi/round-01/README.md | 13 + ...isappointment-emotional-isolation.cases.md | 569 +++ .../qpi/round-01/flow-redesign.cases.md | 423 ++ .../year-end-review-academic-affairs.cases.md | 563 +++ ...ear-end-review-development-office.cases.md | 564 +++ ...eview-employment-entrepreneurship.cases.md | 566 +++ ...ear-end-review-engineering-center.cases.md | 552 +++ ...-end-review-international-college.cases.md | 561 +++ .../year-end-review-research-office.cases.md | 565 +++ reports/model_review_status.json | 34 + reports/next_action_register_v0.2.md | 25 + reports/open_questions_for_CCRA.md | 31 + reports/schema_change_notes.md | 95 + reports/selector_regression_report.md | 15 + reports/selector_regression_report_v0.2.md | 18 + reports/selector_score_breakdown.md | 24 + reports/validation_report.md | 12 + reports/内容修复检查摘要_v0.1.md | 41 + reports/内容修复检查摘要_v0.2.md | 33 + reports/规则Schema工作流检查摘要_v0.1.md | 116 + schemas/README.md | 11 +- schemas/card_index.schema.json | 16 + schemas/model_card.schema.json | 260 ++ schemas/model_index.schema.json | 48 + schemas/model_spec.schema.json | 49 + schemas/regression_case.schema.json | 53 + schemas/source_article.schema.json | 32 + schemas/source_excerpt.schema.json | 37 + scripts/README.md | 48 +- scripts/check_card_contract.py | 72 + scripts/check_model_card_sync.py | 131 + scripts/rebuild_indexes.py | 183 + scripts/run_selector_demo.py | 176 + scripts/run_selector_regression.py | 90 + scripts/validate_model_library.py | 482 ++ selector/README.md | 18 +- selector/selector_calibration_inputs.json | 147 + selector/selector_examples.json | 41 + selector/selector_rules.json | 151 + sources/README.md | 12 +- sources/evidence_coverage.matrix.json | 92 + sources/source_articles.json | 48 + sources/source_excerpts.json | 199 + tests/README.md | 19 + .../intellectual_archaeology.regression.json | 22 + tests/qpi.regression.json | 22 + tests/regression_cases.json | 38 + tests/regression_index.json | 34 + tests/test_card_contract.py | 37 + tests/test_rebuild_indexes.py | 77 + tests/test_validate_model_library.py | 458 ++ 119 files changed, 21292 insertions(+), 35 deletions(-) create mode 100644 cards/card_index.md create mode 100644 cards/intellectual_archaeology.md create mode 100644 cards/qpi.md create mode 100644 ccra_review_bundle/round-02_2026-06-16_second-audit/00_OPEN_THIS_FIRST_CCRA_REVIEW_BRIEF.md create mode 100644 ccra_review_bundle/round-02_2026-06-16_second-audit/01_GUIDANCE_PACK_AND_COMPLIANCE_MATRIX.md create mode 100644 ccra_review_bundle/round-02_2026-06-16_second-audit/02_CURRENT_ASSET_PACK.md create mode 100644 ccra_review_bundle/round-02_2026-06-16_second-audit/03_REPORTS_DIFF_AND_COMMAND_LOG.md create mode 100644 ccra_review_bundle/round-02_2026-06-16_second-audit/BUNDLE_FILE_MANIFEST.md create mode 100644 ccra_review_bundle/round-02_2026-06-16_second-audit/optional_raw_changed_files.zip create mode 100644 ccra_review_bundle/round-03_2026-06-17_contract-hardening-selector-calibration/00_OPEN_THIS_FIRST_CCRA_REVIEW_BRIEF.md create mode 100644 ccra_review_bundle/round-03_2026-06-17_contract-hardening-selector-calibration/01_GUIDANCE_PACK_AND_COMPLIANCE_MATRIX.md create mode 100644 ccra_review_bundle/round-03_2026-06-17_contract-hardening-selector-calibration/02_CURRENT_ASSET_PACK.md create mode 100644 ccra_review_bundle/round-03_2026-06-17_contract-hardening-selector-calibration/03_REPORTS_DIFF_AND_COMMAND_LOG.md create mode 100644 ccra_review_bundle/round-03_2026-06-17_contract-hardening-selector-calibration/BUNDLE_FILE_MANIFEST.md create mode 100644 ccra_review_bundle/round-03_2026-06-17_contract-hardening-selector-calibration/optional_raw_changed_files.zip create mode 100644 docs/CHATGPT_HANDOFF_RULES.md create mode 100644 docs/CONTENT_STABILIZATION_PROTOCOL.md create mode 100644 docs/GPT_PLAN_LOCALIZATION_PROTOCOL.md create mode 100644 docs/INDEX_MAINTENANCE_PROTOCOL.md create mode 100644 docs/INTELLECTUAL_ARCHAEOLOGY_DEPTH_GATE.md create mode 100644 docs/KNOWLEDGE_ASSET_RULES.md create mode 100644 docs/MODEL_CARD_CONTRACT.md create mode 100644 docs/MODEL_EXTRACTION_RULES.md create mode 100644 docs/MODEL_EXTRACTION_WORKFLOW.md create mode 100644 docs/QPI_CONTEXTUAL_ROUTING_RULES.md create mode 100644 docs/model_case_preprocessing/README.md create mode 100644 docs/model_case_preprocessing/qpi/CASE_PREPROCESSING_WORKFLOW.md create mode 100644 docs/model_case_preprocessing/qpi/README.md create mode 100644 docs/superpowers/plans/2026-06-16-model-extraction-contract-and-workflow.md create mode 100644 docs/superpowers/plans/2026-06-17-contract-hardening-selector-calibration.md create mode 100644 knowledge_assets/00_用户背景与产品上下文.md create mode 100644 knowledge_assets/01_核心模型地图.md create mode 100644 knowledge_assets/02_模型卡结构规范.md create mode 100644 knowledge_assets/03_核心模型抽取样板.md create mode 100644 knowledge_assets/06_模型稳固性评级规则.md create mode 100644 knowledge_assets/07_产品规划过程记录.md create mode 100644 knowledge_assets/08_CCRA模型库MVP质量门与交接协议.md create mode 100644 knowledge_assets/README.md create mode 100644 models/intellectual_archaeology.model.json create mode 100644 models/model_index.json create mode 100644 models/qpi.model.json create mode 100644 repo_tree.txt create mode 100644 reports/ChatGPT交接文档_模型库MVP_2026-06-16.md create mode 100644 reports/ChatGPT交接文档_模型库MVP_第二轮内容稳定化_2026-06-16.md create mode 100644 reports/Codex_模型资产链路摘要_v0.1.md create mode 100644 reports/Codex新会话交接文档_CCRA评审后处理_2026-06-16.md create mode 100644 reports/Codex新会话交接文档_QPI案例草稿审阅与第三轮后续_2026-06-17.md create mode 100644 reports/Codex新会话交接文档_模型库MVP_2026-06-16.md create mode 100644 reports/GPT规划落地差异检查_v0.1.md create mode 100644 reports/baseline_before_content_stabilization_v0.2.md create mode 100644 reports/changed_files_manifest.md create mode 100644 reports/command_log.md create mode 100644 reports/content_review_report.md create mode 100644 reports/content_review_report_v0.2.md create mode 100644 reports/evidence_coverage_matrix.md create mode 100644 reports/evidence_coverage_report_v0.2.md create mode 100644 reports/index_check_report.md create mode 100644 reports/index_rebuild_report.md create mode 100644 reports/model_card_sync_report_v0.2.md create mode 100644 reports/model_case_preprocessing/qpi/round-01/README.md create mode 100644 reports/model_case_preprocessing/qpi/round-01/disappointment-emotional-isolation.cases.md create mode 100644 reports/model_case_preprocessing/qpi/round-01/flow-redesign.cases.md create mode 100644 reports/model_case_preprocessing/qpi/round-01/year-end-review-academic-affairs.cases.md create mode 100644 reports/model_case_preprocessing/qpi/round-01/year-end-review-development-office.cases.md create mode 100644 reports/model_case_preprocessing/qpi/round-01/year-end-review-employment-entrepreneurship.cases.md create mode 100644 reports/model_case_preprocessing/qpi/round-01/year-end-review-engineering-center.cases.md create mode 100644 reports/model_case_preprocessing/qpi/round-01/year-end-review-international-college.cases.md create mode 100644 reports/model_case_preprocessing/qpi/round-01/year-end-review-research-office.cases.md create mode 100644 reports/model_review_status.json create mode 100644 reports/next_action_register_v0.2.md create mode 100644 reports/open_questions_for_CCRA.md create mode 100644 reports/schema_change_notes.md create mode 100644 reports/selector_regression_report.md create mode 100644 reports/selector_regression_report_v0.2.md create mode 100644 reports/selector_score_breakdown.md create mode 100644 reports/validation_report.md create mode 100644 reports/内容修复检查摘要_v0.1.md create mode 100644 reports/内容修复检查摘要_v0.2.md create mode 100644 reports/规则Schema工作流检查摘要_v0.1.md create mode 100644 schemas/card_index.schema.json create mode 100644 schemas/model_card.schema.json create mode 100644 schemas/model_index.schema.json create mode 100644 schemas/model_spec.schema.json create mode 100644 schemas/regression_case.schema.json create mode 100644 schemas/source_article.schema.json create mode 100644 schemas/source_excerpt.schema.json create mode 100644 scripts/check_card_contract.py create mode 100644 scripts/check_model_card_sync.py create mode 100644 scripts/rebuild_indexes.py create mode 100644 scripts/run_selector_demo.py create mode 100644 scripts/run_selector_regression.py create mode 100644 scripts/validate_model_library.py create mode 100644 selector/selector_calibration_inputs.json create mode 100644 selector/selector_examples.json create mode 100644 selector/selector_rules.json create mode 100644 sources/evidence_coverage.matrix.json create mode 100644 sources/source_articles.json create mode 100644 sources/source_excerpts.json create mode 100644 tests/intellectual_archaeology.regression.json create mode 100644 tests/qpi.regression.json create mode 100644 tests/regression_cases.json create mode 100644 tests/regression_index.json create mode 100644 tests/test_card_contract.py create mode 100644 tests/test_rebuild_indexes.py create mode 100644 tests/test_validate_model_library.py diff --git a/AGENTS.md b/AGENTS.md index e01c05d..09b478d 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -100,6 +100,7 @@ Every model must eventually have: - `one_sentence_definition` - `core_question` - `core_mechanism` +- `status` - `source_articles` - `source_evidence` - `input_types` @@ -184,6 +185,22 @@ Validation should eventually check: - Valid regression test model references - Required fields - Enum values +- Model/card index drift + +Index maintenance should follow: + +```text +incremental update on every model/card/source/test change ++ +full rebuild or full reconciliation at release, handoff, schema migration, batch expansion, or validation drift +``` + +Use: + +```text +python scripts\rebuild_indexes.py --write +python scripts\rebuild_indexes.py --check +``` Validation output should be written to: diff --git a/README.md b/README.md index 22b6178..1c111b3 100644 --- a/README.md +++ b/README.md @@ -78,6 +78,8 @@ tests/ Regression cases for model use, misuse, and boundary checks. selector/ Rule-based selector configuration and examples. scripts/ Local validation and selector demo scripts. reports/ Validation reports, extraction notes, and concrete session handoffs. +knowledge_assets/ Stable long-term reusable knowledge distilled from local project artifacts. +ccra_review_bundle/ Per-round CCRA review packages; each round must live in its own dated subdirectory. ``` ## 7. Data Format @@ -88,7 +90,7 @@ Markdown files are used for human-readable model cards and documentation. ## 8. Validation -All model JSON files should eventually pass schema validation. +All model JSON files should pass the local schema before they are treated as stable. Validation should check: @@ -98,6 +100,9 @@ Validation should check: - Source article references - Source evidence references - Regression test references +- Model/card indexes +- Markdown card required sections +- Regression case coverage ## 9. Minimal Selector @@ -135,16 +140,38 @@ See `PROJECTS.md` for the operative cross-repository boundary map, including req ## 12. Current Status -Initial project setup. +Foundation repair in progress for: + +- QPI +- Intellectual Archaeology / 思想考古学 + +Current foundation assets include: + +- GPT plan localization protocol. +- Model extraction rules. +- Model card contract. +- Model extraction workflow. +- JSON schemas for model cards, source articles, source excerpts, regression cases, and indexes. +- Machine-readable model index. +- Human-readable card index. +- Validation scripts for model library contracts and card headings. +- Source article and source excerpt indexes. +- Regression cases for model use, boundary behavior, and misuse. +- Rule-based selector configuration and examples. +- A standard-library validation script that writes `reports/validation_report.md`. +- A standard-library index rebuild/check script that writes `reports/index_rebuild_report.md`. +- ChatGPT handoff rules. +- Long-term knowledge asset rules and initial `knowledge_assets/` documents. + +Current QPI and Intellectual Archaeology model contents pass the local contract and remain `draft` pending product review. + +Indexes follow `docs/INDEX_MAINTENANCE_PROTOCOL.md`: every asset change must synchronize `models/model_index.json` and `cards/card_index.md`, and handoff/release points must run a full rebuild or check. + +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. ## 13. Next Steps -1. Confirm directory structure. -2. Confirm schema files. -3. Add QPI model JSON. -4. Add Intellectual Archaeology model JSON. -5. Add human-readable model cards. -6. Add source records and evidence excerpts. -7. Add regression cases. -8. Add validation scripts. -9. Add minimal selector demo. +1. Review QPI and Intellectual Archaeology content for product correctness. +2. Review whether the new `knowledge_assets/` package is sufficient for ChatGPT / CCRA reuse. +3. Decide whether to expand to a third core model. +4. Decide whether extraction, inspection, and stability scoring should become CCPE or skills-vault requests. diff --git a/cards/README.md b/cards/README.md index c5dd1eb..11c7fb0 100644 --- a/cards/README.md +++ b/cards/README.md @@ -1,10 +1,14 @@ # Cards -This folder will contain human-readable Markdown model cards. +This folder contains human-readable Markdown model cards. -The first expected cards are: +Current draft cards are: -- `qpi.card.md` -- `intellectual_archaeology.card.md` +- `qpi.md` +- `intellectual_archaeology.md` Model cards should explain model purpose, mechanism, usage boundaries, misuse risks, source traceability, and productization notes. + +`card_index.md` is the human-readable model card registry. + +Current cards are `draft_pre_contract` until they are repaired against `docs/MODEL_CARD_CONTRACT.md`. diff --git a/cards/card_index.md b/cards/card_index.md new file mode 100644 index 0000000..0de6b17 --- /dev/null +++ b/cards/card_index.md @@ -0,0 +1,6 @@ +# Card Index + +| Model ID | 模型名称 | 类型 | 流程位置 | Card | Model JSON | 稳固性 | 回归状态 | 状态 | +| --- | --- | --- | --- | --- | --- | --- | --- | --- | +| intellectual_archaeology | 思想考古学 | deep_modeling_model | deep_analysis | `cards/intellectual_archaeology.md` | `models/intellectual_archaeology.model.json` | B | pending | draft | +| qpi | QPI 三元定性模型 | routing_model | pre_analysis | `cards/qpi.md` | `models/qpi.model.json` | B | pending | draft | diff --git a/cards/intellectual_archaeology.md b/cards/intellectual_archaeology.md new file mode 100644 index 0000000..83caa71 --- /dev/null +++ b/cards/intellectual_archaeology.md @@ -0,0 +1,246 @@ +# 思想考古学 + +## 模型名称 + +思想考古学 + +## 模型 ID + +`intellectual_archaeology` + +## 一句话定义 + +思想考古学是一种从表层应用逐层下钻到哲学基岩的建模方法,用于发现支撑一个模型或判断的深层假设、核心机理和动态韧性来源。 + +## 模型类型 + +`deep_modeling_model` + +思想考古学是深度建模模型,不是前置路由模型,也不是轻量执行流程。 + +## 所在流程位置 + +`deep_analysis` + +通常应在 QPI 或问题价值评估之后调用。 + +## 来源文章 + +- `article_intellectual_archaeology_primary_001`: 《建模者的工坊》 +- `article_cognitive_os_synthesis_001`: 《Wantsong认知操作系统》 + +## 来源证据片段 + +- `excerpt_ia_primary_definition_001`: 支撑思想考古学的定义。 +- `excerpt_ia_primary_layers_001`: 支撑七层下钻机制。 +- `excerpt_ia_primary_resilience_001`: 支撑动态韧性价值。 +- `excerpt_ia_cognitive_os_minimum_depth_001`: 支撑最小充分下潜原则。 +- `excerpt_ia_primary_validation_001`: 支撑内部自洽不等于现实有效的验证要求。 + +## 核心问题 + +当前问题、方案或模型背后,隐藏了哪些更深层的结构性假设? + +## 核心机制 + +思想考古学把待建模对象放入七层深度框架: + +1. 应用层 +2. 领域层 +3. 过程层 +4. 目的层 +5. 核心机理层 +6. 人类能力层 +7. 哲学基岩层 + +每一层都追问上一层的支撑假设。下钻必须遵守最小充分下潜原则:如果继续下潜不再改变判断、路径、验证方式或行动边界,就应该停止。 + +## 输入类型 + +- 复杂问题 +- 系统性议题 +- 反复失败的问题 +- 专家隐性知识 +- 认知模型草稿 +- 产品底层逻辑 +- 需要抽取底层假设的业务方案 + +## 输出类型 + +- 层级化问题地图 +- 是否应该调用 +- 进入思想考古的理由 +- 建议最大下潜层级 +- 实际分析层级 +- 停止理由 +- 不继续下潜理由 +- 深层假设清单 +- 最小充分下潜层级 +- 模型稳固性判断 +- 需要验证的薄弱环节 +- 后续建模建议 + +## 适用场景 + +- QPI 判断问题偏课题或中重型难题。 +- 问题具有高复用价值。 +- 用户希望从文章中抽取模型。 +- 当前解释停留在表层工具或症状。 +- 需要把专家隐性知识显性化。 +- 需要为一个模型寻找更稳固的底层结构。 +- 一个问题反复解决但反复失败。 + +## 不适用场景 + +- 当前只是缺少一个事实或材料位置,直接检索即可。 +- 问题属于低风险轻量表达,不值得进入深层建模。 +- 继续下钻不再改变判断、路径、验证方式或行动边界。 +- 用户明确只需要短平快执行,不需要模型化解释。 +- 缺少足够领域材料,无法区分真实底层假设和空泛哲学化表达。 + +## 调用关键词 + +- 深层结构 +- 底层逻辑 +- 模型稳不稳 +- 为什么反复失败 +- 问题的根在哪里 +- 沉淀成模型 +- 从文章抽取模型 +- 方法论的基岩 +- 隐性知识 +- 哲学基岩 + +## 负向触发条件 + +- 快速回答 +- 不要展开 +- 只查事实 +- 只要执行步骤 +- 不要深入分析 +- 只改文案 + +## 相关模型 + +- `qpi`: 通常作为前置路由模型,先判断问题是否值得进入深度建模。 + +## 冲突模型 + +- `fast_execution_flow`: 当用户只需要轻量执行或快速产出时,思想考古学不应默认介入。 + +## 学科底座关联 + +- 哲学 +- 认识论 +- 系统论 +- 复杂系统 +- 认知心理学 +- 专家知识显性化 +- 因果推理 +- 设计理论 + +## 常见误用 + +- 把思想考古学误用为文章摘要或概念堆叠。 +- 为了显得深刻而无限下钻。 +- 把所有轻量问题都拖入七层分析。 +- 只做纵向下潜而缺少横向模型竞争。 +- 用哲学基岩替代现实验证。 +- 下潜后没有回到可行动结论。 + +## 失败信号 + +- 分析很深但不能改变判断或行动。 +- 层级之间没有清楚递进关系。 +- 把所有问题都下钻到哲学层。 +- 输出只有抽象概念而没有模型结构。 +- 没有说明应该在哪一层停止。 +- 没有指出需要证据验证的地方。 + +## 可信度等级 + +`medium` + +思想考古学的定义、七层结构、动态韧性和验证要求都有来源支撑,但七层结构的停止条件仍需要更多跨场景案例校准。 + +## 稳固性状态 + +`B` + +需要继续稳定化。 + +## 稳定性评估 + +- 概念清晰度:中高,模型名称和下钻方向明确。 +- 机制稳定性:中等,七层结构清晰,但层级之间的真实递进关系需要更多案例验证。 +- 边界清晰度:中等,最小充分下潜原则已明确,但执行时容易过度下钻。 +- 来源证据质量:较高,核心定义和七层结构来自原文,停止条件来自综合应用材料。 +- 回归测试表现:pending,已有五条样板用例,尚未扩展到更多领域。 + +评级理由:纵向下潜机制清晰,适合深度建模,但七层结构和停止条件需要进一步稳定。 + +下一步稳定化动作:补充不同复杂度问题的下潜深度测试,明确最小充分下潜原则。 + +## 回归测试状态 + +`pending` + +当前已有五条回归用例: + +- `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` + +## 示例输入 + +- “我想把过去文章中的认知模型抽取出来,但不知道这些模型到底稳不稳,应该怎么判断?” +- “现代人为什么一边渴望连接,一边又渴望逃离连接?” + +## 示例输出 + +- “第一个输入适合下潜到核心机理层,判断文章、模型卡、系统调用、回归测试之间的关系。” +- “第二个输入可从应用层、评价层、过程层、目的层和人类能力层分析连接与逃离连接的双重机制。” + +## 输出契约 + +输出必须包含: + +- `should_call`: `true | false`。 +- `entry_reason`: 为什么值得进入思想考古;不应调用时说明 no-call 原因。 +- `recommended_max_depth`: `application | domain | process | purpose | core_mechanism | human_capability | philosophical_bedrock`。 +- `layers_to_analyze`: 实际需要分析的层级数组。 +- `stop_reason`: 为什么停在这一层。 +- `no_deeper_reason`: 继续下潜不会改变什么。 +- `assumptions_by_layer`: 按七层列出关键假设;未分析层级保留空数组。 +- `validation_needed`: 哪些判断需要现实反馈、数据、专家盲审或红队。 +- `action_implication`: 下潜结果如何改变下一步行动。 + +## 深度控制 + +原则:最小充分下潜。 + +停止条件: + +- 已经足以改变决策。 +- 继续下潜不会增加解释力。 +- 缺少证据支撑更深推断。 +- 问题不值得重型建模。 +- 用户当前只需要执行层结果。 +- QPI 未放行中重型难题或课题时,不进入完整思想考古。 +- 如果建议最大下潜层级低于哲学基岩,不得自动展开到哲学基岩。 + +过度调用警告:思想考古不是所有问题的默认流程,必须先经过问题价值评估和 QPI 定性。 + +## 产品化建议 + +思想考古适合作为中重度问题的深层建模模块,不应默认全量调用。 + +它应该由 QPI、问题复杂度和复用价值共同触发。输出必须回到可验证、可行动的模型结构。 + +## 版本信息 + +- version: `0.1` +- last_updated: `2026-06-16` +- status: `draft` diff --git a/cards/qpi.md b/cards/qpi.md new file mode 100644 index 0000000..384acee --- /dev/null +++ b/cards/qpi.md @@ -0,0 +1,287 @@ +# QPI 三元定性模型 + +## 模型名称 + +QPI 三元定性模型 + +## 模型 ID + +`qpi` + +## 一句话定义 + +QPI 用于判断某个认知主体在特定上下文中,如何将期望—现实落差框定为 Question、Problem、Issue、mixed 或 no-call,并识别其中的上下文缺口、动态演化和误框定风险。 + +## 模型类型 + +`routing_model` + +QPI 是前置路由模型,不是最终分析模型。 + +## 所在流程位置 + +`pre_analysis` + +它应在深度分析、系统建模或执行拆解之前调用。 + +## 来源文章 + +- `article_qpi_primary_001`: 《问题之锚:从混沌现实到认知秩序的重构》 +- `article_qpi_contextual_2025_001`: 《解构“问题”:认知主体与现实映射的动态框架》 +- `article_cognitive_os_synthesis_001`: 《Wantsong认知操作系统》 + +## 来源证据片段 + +- `excerpt_qpi_primary_spectrum_001`: 支撑 QPI 的三元分类和核心匮乏物定义。 +- `excerpt_qpi_primary_question_001`: 支撑提问对应数据匮乏。 +- `excerpt_qpi_primary_problem_001`: 支撑难题对应路径、方法和资源匮乏。 +- `excerpt_qpi_primary_issue_001`: 支撑课题对应动态平衡和演化。 +- `excerpt_qpi_primary_pathology_reduction_001`: 支撑暴力降维误用识别。 +- `excerpt_qpi_primary_pathology_inflation_001`: 支撑恶意升维误用识别。 +- `excerpt_qpi_contextual_subjectivity_001`: 支撑 QPI 必须基于主体和上下文场景判断。 +- `excerpt_qpi_contextual_gap_001`: 支撑问题作为期望—现实落差的定义。 +- `excerpt_qpi_contextual_dynamic_001`: 支撑问题框架会随时间和新信息演化。 +- `excerpt_qpi_cognitive_os_application_001`: 支撑 QPI 在问题定义阶段的应用位置。 + +## 核心问题 + +谁在什么场景下,把什么期望—现实落差框定成了哪类问题;这个框定是否缺上下文、正在演化或存在误框定风险? + +## 核心机制 + +QPI 先执行 no-call gate,再确认主体位置、场景上下文、责任范围、经验水平、问题拥有者、来源和时间尺度。 + +如果缺少主体或场景,QPI 只能输出 provisional classification,不能高置信定性。此时必须给出 `missing_context`、`evidence_gap` 和澄清问题。 + +- 缺数据,归为提问,适合搜索、检索、自动化。 +- 缺路径、方法或资源,归为难题,适合工程求解和资源调配。 +- 缺共识、确定性或动态秩序,归为课题,适合对话、博弈、干预和演化。 + +完成分类后,还要检查是否存在暴力降维、恶意升维、手段错配、工具解法主义或过早定性。 + +QPI 必须区分: + +- `intra_frame_mixed`: 同一主体、同一场景、同一阶段内,多类匮乏物同时存在。 +- `inter_viewpoint_divergence`: 同一句输入在不同主体、责任位置或时间尺度下会被框定成不同 QPI 类型。 + +## 输入类型 + +- 模糊问题 +- 复杂问题 +- 业务问题描述 +- 组织冲突叙述 +- 需求或故障初始表述 +- 需要进入深度分析前的问题定义 + +## 输出类型 + +- 问题类型判断 +- 分类作用域 +- 是否临时判断 +- 主体位置 +- 场景上下文 +- 责任范围 +- 经验水平 +- 问题拥有者 +- 问题来源 +- 时间尺度 +- 期望现实落差 +- 上下文充足度 +- 缺失上下文 +- 三类匮乏物强度 +- 主导匮乏物 +- 分类理由 +- 分类置信度 +- 多视角分类 +- 动态阶段 +- 可能演化轨迹 +- 成功标准稳定性 +- 硬反馈可用性 +- 治理负荷 +- 澄清问题 +- 证据缺口 +- 核心匮乏物判断 +- 误判风险 +- 推荐处理路径 +- 后续模型调用建议 + +## 适用场景 + +- 用户输入的问题定义不清。 +- 同一问题被不同主体以不同方式理解。 +- 用户急于求解但尚未判断问题性质。 +- 问题中混杂事实、路径、利益、共识和系统结构。 +- 需要决定后续调用哪些认知模型。 +- 怀疑存在暴力降维、恶意升维或手段与目标错配。 + +## 不适用场景 + +- 用户只是查询明确事实。 +- 用户已经给出明确执行任务。 +- 输入是纯创意写作且不需要问题定性。 +- 问题已经被清楚分类且只需要执行后续步骤。 +- 输入不是问题定义,而是纯粹的润色或格式转换请求。 + +## 调用关键词 + +- 问题到底是什么 +- 为什么解决不了 +- 卡在哪里 +- 技术问题还是组织问题 +- 方向是不是错了 +- 为什么反复出现 +- 该怎么定义这个问题 +- 这个问题怎么拆 +- 缺数据 +- 缺路径 +- 缺共识 + +## 负向触发条件 + +- 请直接查询 +- 请直接改写 +- 只要清单 +- 不要分析原因 +- 不要展开 +- 只改错别字 + +## 相关模型 + +- `intellectual_archaeology`: 当 QPI 判断问题偏中重型难题或课题时,可进入思想考古做深度建模。 + +## 冲突模型 + +无明确冲突模型。 + +## 学科底座关联 + +- 问题定义理论 +- 决策科学 +- 系统论 +- 复杂系统 +- 组织行为 +- 工程问题分解 + +## 常见误用 + +- 把 QPI 当作完整解决方案,而不是问题定义和路由模型。 +- 把所有复杂叙事都归为课题,逃避可执行的难题拆解。 +- 把系统性课题暴力压缩成个人执行难题。 +- 把具体可解决的难题恶意升维成不可处理的课题。 +- 在事实缺口上过度建模,拖慢本应直接检索的提问。 +- 忽略问题拥有者,直接给出单一视角的分类。 +- 把缺少主体和场景的复杂短句直接判成高置信 Q/P/I。 +- 把跨主体视角分歧误写成同一主体内的 mixed。 + +## 失败信号 + +- 核心匮乏物识别错误,导致后续资源配置错位。 +- 未识别权力叙事,接受了伪问题或甩锅框架。 +- 把动态平衡型课题误判为可终结的难题。 +- 把明确工程障碍误判为需要无限讨论的课题。 +- 分类没有给出理由。 +- 分类之后没有给出后续处理路径。 +- 缺少 `subject_position` 或 `scenario_context` 时仍输出 high confidence。 +- 只按表层关键词定性,忽略责任范围、成功标准、硬反馈和治理负荷。 + +## 可信度等级 + +`medium` + +QPI 的三分结构、核心匮乏物、主体性和动态性有清晰来源支撑,但真实输入中经常出现上下文不足、多视角分歧和同一主体内的 Q/P/I 混合状态,仍需要更多边界案例稳定判断。 + +## 稳固性状态 + +`B` + +需要继续稳定化。 + +## 稳定性评估 + +- 概念清晰度:较高,提问、难题、课题的核心匮乏物清楚。 +- 机制稳定性:中高,扫描匮乏物和匹配处理范式的机制明确。 +- 边界清晰度:中等,混合型问题、多视角分歧和上下文不足场景仍需更多测试。 +- 来源证据质量:较高,主体性和动态性来自 2025 原文,核心匮乏物和误框定规则来自 2026 原文,应用规则来自综合文档。 +- 回归测试表现:pending,已有五条样板用例,尚未经过真实案例扩展。 + +评级理由:三分结构清晰,适合作为入口路由模型,但需要补充大量边界案例,防止过度升维或降维。 + +下一步稳定化动作:补充主体-上下文-动态案例、混合问题、误用问题和轻量问题测试,并记录主导匮乏物与多视角分歧判断标准。 + +## 回归测试状态 + +`pending` + +当前已有五条回归用例: + +- `case_qpi_positive_question_001` +- `case_qpi_positive_problem_001` +- `case_qpi_positive_issue_001` +- `case_qpi_boundary_mixed_001` +- `case_qpi_misuse_inflation_001` + +## 示例输入 + +- “我们团队每次都说要长期主义,但一到季度 KPI 就回到短期动作,这到底是什么问题?” +- “我知道要做模型库,但不知道先用数据库还是文件系统,这属于什么问题?” + +## 示例输出 + +- “第一个输入更接近课题,因为它涉及激励结构、时间尺度冲突和组织共识。” +- “第二个输入更接近难题,因为目标明确,主要缺的是实现路径和技术取舍。” + +## 输出契约 + +输出必须包含: + +- `problem_owner`: 谁的问题;未知时写 `unknown`。 +- `classification_scope`: `subject_contextual | multi_perspective | insufficient_context | no_call`。 +- `is_provisional`: 缺少主体或场景时必须为 `true`。 +- `subject_position`: 当前认知主体的位置;未知时写 `unknown`。 +- `scenario_context`: 问题发生的场景;未知时写 `unknown`。 +- `responsibility_scope`: 个体学习、团队执行、跨职能治理、owner 治理或 `unknown`。 +- `context_sufficiency`: `high | medium | low`。 +- `missing_context`: 缺少哪些主体、场景、目标、资源、责任或时间信息。 +- `problem_source`: 问题从哪里被提出,是否可能带有立场、恐惧或甩锅框架。 +- `time_scale`: `short_term | mid_term | long_term | mixed | unknown`。 +- `expectation_reality_gap`: expected、reality、gap_summary;未知时写 `unknown`。 +- `scarcity_profile`: 分别标出 `data_scarcity`、`path_or_resource_scarcity`、`consensus_or_order_scarcity` 的强度。 +- `dominant_scarcity`: `data | path_resource | consensus_order | mixed | unknown`。 +- `classification`: `question | problem | issue | mixed | no_call`。 +- `classification_confidence`: `high | medium | low`。 +- `classification_by_viewpoint`: 多视角分歧时列出不同主体下的分类和理由。 +- `dynamic_stage`: `initial | evolving | recurring | stabilized | unknown`。 +- `possible_trajectory`: 问题可能从 Q 到 P、从 P 到 I,或反向收敛。 +- `success_criteria_stability`: `stable | unstable | contested | unknown`。 +- `hard_feedback_availability`: `high | medium | low | unknown`。 +- `governance_load`: `high | medium | low | unknown`。 +- `evidence_gap`: 还缺哪些信息才能稳定判断;mixed 或 low confidence 时必须填写。 +- `misclassification_risk`: 暴力降维、恶意升维或手段错配风险。 +- `recommended_clarifying_questions`: 上下文不足时必须给出需要补问的问题。 +- `recommended_next_step`: 检索、工程拆解、共识协调、补充上下文或不调用。 +- `next_model_candidates`: 后续可调用模型 ID。 + +## 深度控制 + +原则:先定性,再决定是否进入深层模型。 + +停止条件: + +- 如果只是明确事实查询,停止在提问层并建议检索。 +- 如果已明确是执行任务,停止继续路由。 +- 如果分类证据不足,先输出 `evidence_gap` 并要求补充上下文。 +- 如果负向触发命中且没有复杂问题信号,输出 `classification=no_call`。 + +过度调用警告:QPI 是前置路由模型,不应替代后续具体分析模型。 + +## 产品化建议 + +QPI 应作为问题回答系统的前置路由模型,用于防止系统在问题类型错误的情况下直接给答案。 + +selector 应优先使用 `trigger_keywords`、`negative_triggers`、`pipeline_position` 和 `selection_priority` 做规则推荐。 + +## 版本信息 + +- version: `0.1` +- last_updated: `2026-06-16` +- status: `draft` diff --git a/ccra_review_bundle/round-02_2026-06-16_second-audit/00_OPEN_THIS_FIRST_CCRA_REVIEW_BRIEF.md b/ccra_review_bundle/round-02_2026-06-16_second-audit/00_OPEN_THIS_FIRST_CCRA_REVIEW_BRIEF.md new file mode 100644 index 0000000..7bde819 --- /dev/null +++ b/ccra_review_bundle/round-02_2026-06-16_second-audit/00_OPEN_THIS_FIRST_CCRA_REVIEW_BRIEF.md @@ -0,0 +1,67 @@ +# CCRA Review Brief + +## 1. 本轮目标 + +把 QPI 和思想考古从“工程可运行”推进到“内容可审查、证据可追溯、误用可测试、selector 可防误召回”。 + +## 2. 本轮依据文件 + +- `2026-06-16-核心模型抽取样板 v0.1.md` +- `CCRA_Codex指导意见_Index更新策略与下一轮执行_v0.2_2026-06-16.md` +- `CCRA_Codex指导意见_模型库MVP第二轮内容稳定化_v0.3_2026-06-16.md` +- `CCRA_下一轮审核包压缩上传协议_v0.1_2026-06-16.md` + +## 3. 本轮禁止事项 + +- 不扩展第三模型 +- 不接完整问题回答系统 +- 不引入 LLM selector +- 不升级 stable,除非 CCRA 明确批准 + +## 4. 当前状态摘要 + +| Model ID | Status | Stability | Regression Status | Regression Count | Evidence Count | +| --- | --- | --- | --- | ---: | ---: | +| `qpi` | draft | B | pending | 17 | 7 | +| `intellectual_archaeology` | draft | B | pending | 17 | 5 | + +## 5. 本轮完成事项 + +- 新增内容稳定化协议。 +- 建立字段级 evidence coverage matrix。 +- 修复 source excerpt 的 quote_status / source_location。 +- 强化 QPI 输出契约。 +- 强化思想考古停止门。 +- 每模型 regression cases 扩展到 17 条。 +- selector 升级到 v0.2 规则版,增加 no-call、negative trigger、QPI-before-IA gate、rejected reasons。 +- 新增 selector regression 与 JSON/Markdown sync checks。 +- 生成压缩审核包 `ccra_review_bundle/`。 + +## 6. 本轮未完成事项 + +- 未升级 stable:按用户和 CCRA 明确约束保持 draft。 +- 未扩展第三模型:按用户和 CCRA 明确约束继续阻塞。 +- 未引入 LLM selector:selector v0.2 仍为规则系统。 +- 未接完整问题回答系统:属于本轮非目标。 + +## 7. Codex 自我判断 + +工程验证已通过;内容已经从“能跑通”推进到“可审查”。但内容质量、模型边界、回归用例真实性、selector 阈值仍需要 CCRA / Owner 审核。当前建议保持 `draft / B / pending`。 + +## 8. 请求 CCRA 审核的问题 + +1. QPI mixed case 的主导匮乏物仲裁是否足够。 +2. QPI 输出契约中的 `problem_owner`、`time_scale`、`dominant_scarcity`、`evidence_gap` 是否应进入 schema required。 +3. 思想考古 `recommended_max_depth`、`stop_reason`、`no_deeper_reason` 是否应进入 schema required。 +4. selector v0.2 是否仍有误召回风险。 +5. 是否允许进入下一阶段;默认仍不建议扩第三模型。 + +## 9. 文件清单 + +| Bundle File | Contains | Why Needed | +| --- | --- | --- | +| `00_OPEN_THIS_FIRST_CCRA_REVIEW_BRIEF.md` | 审核入口、当前状态、请求审核问题 | 新会话第一屏读取 | +| `01_GUIDANCE_PACK_AND_COMPLIANCE_MATRIX.md` | 三份指导合并、优先级、compliance matrix | 替代分散上传指导文件 | +| `02_CURRENT_ASSET_PACK.md` | 当前关键资产内容和 SHA256 | 替代 10-15 个分散资产文件 | +| `03_REPORTS_DIFF_AND_COMMAND_LOG.md` | 报告、diff、命令日志、open questions | 替代临时报告文件 | +| `optional_raw_changed_files.zip` | changed/new 原始文件备份 | CCRA 指定原文时再用 | diff --git a/ccra_review_bundle/round-02_2026-06-16_second-audit/01_GUIDANCE_PACK_AND_COMPLIANCE_MATRIX.md b/ccra_review_bundle/round-02_2026-06-16_second-audit/01_GUIDANCE_PACK_AND_COMPLIANCE_MATRIX.md new file mode 100644 index 0000000..525e4a5 --- /dev/null +++ b/ccra_review_bundle/round-02_2026-06-16_second-audit/01_GUIDANCE_PACK_AND_COMPLIANCE_MATRIX.md @@ -0,0 +1,3954 @@ +# Guidance Pack and Compliance Matrix + +## 1. Guidance Priority + +Priority order: `v0.3 内容稳定化指导 > v0.2 Index 更新策略 > v0.1 核心模型抽取样板`. + +## 2. Included Guidance Documents + +### v0.1 核心模型抽取样板 + +- Original path: `C:\Users\wangq\Documents\Codex\knowledge-vault\work\internal\强哥的思想宇宙\GPT成果\2026-06-16-核心模型抽取样板 v0.1.md` +- SHA256: `053dbb2a89d91b116d533481e0e68bc19b436075f034b8412475183f5f63f4b6` + +````markdown +# 《核心模型抽取样板 v0.1》 + +版本:v0.1 +用途:交给 Codex 建立“模型库 / 模型管理子系统 MVP”的工程样板 +当前样板模型:QPI、思想考古 +第一使用者:你本人 +当前阶段:模型管理子系统 MVP 前置规范,不是完整产品计划书 + +这份样板承接你默认产品计划书中的几个核心模块:**模型卡结构、数据结构初稿、Agentic 工作流草案、模型调用与冲突处理规则、回归测试与评估机制、给 Codex 的开发前置说明**。 + +--- + +## 0. 核心判断 + +当前阶段不要让 Codex 直接开发“完整模型管理后台”。 + +第一阶段真正要验证的是: + +> 能否把你的核心认知模型,从文章和既有表述中抽取成一套既能被人理解、又能被系统调用、还能被回归测试的模型资产结构。 + +所以这个样板工程的目标不是做漂亮后台,而是跑通一条最小链路: + +```text +原始文章 / 代表文本 +→ 来源文章索引 +→ 关键证据片段 +→ 人读模型卡 +→ 机器可读模型 JSON +→ 回归测试用例 +→ 最小模型选择器 +``` + +如果这条链路跑通,再扩展到 8-10 个核心模型。 +如果这条链路不稳,贸然扩展模型数量只会制造一批“看起来完整、实际不可调用”的模型卡。 + +--- + +## 1. 文档目标 + +### 1.1 本文档要解决什么 + +本文档用于指导 Codex 完成一个 **核心模型抽取样板工程**。 + +它要让 Codex 明确: + +1. 模型库应该采用什么目录结构; +2. 模型卡应该包含哪些字段; +3. QPI 和思想考古两个模型如何被抽成样板; +4. 来源文章和证据片段如何关联; +5. 模型如何被系统调用; +6. 模型如何做回归测试; +7. 后续扩展到 8-10 个核心模型时应该遵守什么规范。 + +### 1.2 本文档不解决什么 + +本阶段不做: + +```text +完整模型管理后台 +完整知识图谱 +100 多个模型全量管理 +自动从所有文章抽取模型 +复杂 RAG 知识库 +复杂用户系统 +公开平台 +权限系统 +计费系统 +多人协作系统 +完整问题回答产品 +``` + +本阶段只做 **核心模型库的工程样板**。 + +--- + +## 2. 样板工程的 MVP 定义 + +### 2.1 一句话定义 + +**核心模型抽取样板 v0.1 是一个 file-first 的模型库工程样板,用 QPI 和思想考古两个核心模型验证“文章 → 证据片段 → 模型卡 → 机器 JSON → 回归测试 → 最小选择器”的完整链路。** + +### 2.2 MVP 验证命题 + +第一阶段要验证的核心命题是: + +> 少量核心认知模型,能否被整理成结构化、可追溯、可调用、可测试的模型资产,并为后续问题回答系统提供稳定底座。 + +### 2.3 MVP 最小产物 + +Codex 完成后,至少应该产出: + +```text +1. 模型库目录结构 +2. model_card.schema.json +3. source_article.schema.json +4. source_excerpt.schema.json +5. regression_case.schema.json +6. QPI 人读模型卡 +7. QPI 机器可读 JSON +8. 思想考古人读模型卡 +9. 思想考古机器可读 JSON +10. 来源文章索引 +11. 关键证据片段索引 +12. 两个模型的回归测试用例 +13. 最小模型选择器 +14. 校验脚本或校验说明 +15. README.md +``` + +--- + +## 3. 核心抽取原则 + +### 3.1 模型抽取不是文章摘要 + +文章摘要回答的是: + +```text +这篇文章讲了什么? +``` + +模型抽取回答的是: + +```text +这篇文章中有哪些可复用的认知机制? +这些机制能处理什么输入? +能输出什么结果? +什么时候该调用? +什么时候不该调用? +如何测试它是否被误用? +``` + +所以模型抽取不能停留在“总结观点”,必须形成可调用规格。 + +--- + +### 3.2 模型卡必须有来源证据 + +每个核心字段都要尽量能追溯到来源: + +```text +模型定义 ← 来源文章 / 关键段落 +核心机制 ← 来源文章 / 关键段落 +适用场景 ← 来源文章 / 代表案例 / 后续推导 +不适用场景 ← 红队推导 / 反例测试 +调用规则 ← 产品化推导 +回归测试 ← 模型边界推导 +``` + +不能让模型卡变成脱离原文的二次包装。 + +--- + +### 3.3 区分“传播用模型”和“系统调用用模型” + +传播用模型可以有表达性、隐喻性、文学性。 + +系统调用用模型必须满足: + +```text +概念清楚 +输入清楚 +输出清楚 +适用边界清楚 +误用风险清楚 +调用条件清楚 +测试方式清楚 +``` + +QPI 和思想考古进入模型库时,都要按“系统调用用模型”重构,而不是保留为文章中的原始表达。 + +--- + +### 3.4 第一版允许半自动,不追求全自动 + +Codex 不应该在 v0.1 阶段尝试自动完成全部模型抽取。 + +更合理的路径是: + +```text +人工提供两个样板模型 +Codex 建立 schema、目录、校验器、选择器 +后续再用同一结构扩展更多模型 +``` + +当前目标是“规范稳定”,不是“自动化程度高”。 + +--- + +## 4. 文章到模型的抽取协议 + +建议把抽取分成 5 层。 + +```text +第 1 层:来源文章层 +第 2 层:证据片段层 +第 3 层:人读模型卡层 +第 4 层:机器调用规格层 +第 5 层:回归测试层 +``` + +--- + +### 4.1 第 1 层:来源文章层 + +记录模型来自哪些文章、代表文本或讨论材料。 + +每篇来源文章至少包含: + +```json +{ + "source_id": "article_qpi_primary_001", + "title": "问题之锚:从混沌现实到认知秩序的重构", + "author": "Wantsong", + "date": "unknown", + "source_type": "original_article", + "file_path": "sources/articles/qpi_primary.md", + "related_models": ["qpi"], + "source_status": "representative", + "notes": "QPI 的主要来源文本,用于抽取 Question / Problem / Issue 三分结构。" +} +``` + +字段说明: + +| 字段 | 说明 | +| -------------- | ----------------------------------------------------------- | +| source_id | 来源文章唯一 ID | +| title | 文章标题 | +| author | 作者 | +| date | 日期,不确定可写 unknown | +| source_type | original_article / transcript / note / discussion / excerpt | +| file_path | 本地文件路径或引用路径 | +| related_models | 关联模型 | +| source_status | primary / representative / supplementary / deprecated | +| notes | 备注 | + +--- + +### 4.2 第 2 层:证据片段层 + +从来源文章中抽出关键片段。 + +注意:这里不只是摘录,而是要标记片段在模型中的功能。 + +片段类型建议: + +| excerpt_type | 作用 | +| -------------- | ------ | +| definition | 定义片段 | +| problem_origin | 问题来源片段 | +| mechanism | 机制片段 | +| taxonomy | 分类片段 | +| procedure | 操作流程片段 | +| boundary | 边界片段 | +| misuse | 误用片段 | +| example | 示例片段 | +| metaphor | 隐喻片段 | +| test | 测试片段 | + +示例: + +```json +{ + "excerpt_id": "qpi_excerpt_problem_confusion_001", + "source_id": "article_qpi_primary_001", + "related_model_id": "qpi", + "excerpt_type": "problem_origin", + "raw_excerpt": "待填入原文片段", + "summary": "同一个'问题'在不同角色眼中可能是事实缺口、路径障碍或系统性冲突,若不先定性,会导致认知错位和行动失灵。", + "used_for": [ + "core_question", + "call_when", + "regression_tests" + ], + "confidence": "medium", + "notes": "用于支撑 QPI 作为前置问题定性模型。" +} +``` + +--- + +### 4.3 第 3 层:人读模型卡层 + +人读模型卡用于你自己阅读、审查、修改和后续知识库沉淀。 + +它应该是 Markdown 格式。 + +每张人读模型卡至少包含: + +```text +## 模型名称 + +### 模型 ID + +### 一句话定义 + +### 模型类型 + +### 所在流程位置 + +### 来源文章 + +### 来源证据片段 + +### 核心问题 + +### 核心机制 + +### 输入类型 + +### 输出类型 + +### 适用场景 + +### 不适用场景 + +### 调用关键词 + +### 负向触发条件 + +### 相关模型 + +### 冲突模型 + +### 学科底座关联 + +### 常见误用 + +### 失败信号 + +### 可信度等级 + +### 稳固性状态 + +### 回归测试状态 + +### 示例输入 + +### 示例输出 + +### 产品化建议 +``` + +--- + +### 4.4 第 4 层:机器调用规格层 + +机器调用规格用于问题回答系统读取。 + +它应该是 JSON 或 YAML。 +v0.1 建议统一先用 JSON,便于 schema 校验。 + +机器调用规格必须回答: + +```text +这个模型什么时候被调用? +什么时候不被调用? +输入是什么? +输出是什么? +调用优先级是多少? +适合放在流程哪个位置? +需要哪些前置模型? +后续可以接哪些模型? +与哪些模型冲突? +如何判断调用失败? +``` + +--- + +### 4.5 第 5 层:回归测试层 + +回归测试用于判断模型是否稳定。 + +每个核心模型至少有三类测试: + +```text +正向适用测试 +边界测试 +误用测试 +``` + +建议每个模型 v0.1 至少有 5 个测试用例: + +```text +2 个正向适用 +2 个边界案例 +1 个误用案例 +``` + +--- + +## 5. 建议目录结构 + +Codex 可以按下面结构创建样板工程。 + +```text +model_library_mvp/ + README.md + + schemas/ + model_card.schema.json + source_article.schema.json + source_excerpt.schema.json + regression_case.schema.json + + models/ + qpi.model.json + intellectual_archaeology.model.json + + cards/ + qpi.card.md + intellectual_archaeology.card.md + + sources/ + source_articles.json + source_excerpts.json + + tests/ + qpi.regression.json + intellectual_archaeology.regression.json + + selector/ + selection_rules.json + selector_examples.json + + scripts/ + validate_models.py + validate_sources.py + validate_tests.py + run_selector_demo.py + + reports/ + validation_report.md + extraction_notes.md +``` + +v0.1 可以没有前端界面。 +只要目录、schema、样例数据、校验脚本、选择器 demo 能跑通,就算完成第一步。 + +--- + +## 6. 模型卡核心字段规范 + +### 6.1 必填字段 + +```json +[ + "model_id", + "model_name", + "model_type", + "pipeline_position", + "one_sentence_definition", + "core_question", + "core_mechanism", + "source_articles", + "source_evidence", + "input_types", + "output_types", + "call_when", + "do_not_call_when", + "common_misuses", + "failure_modes", + "selection_priority", + "confidence_level", + "stability_profile", + "regression_status", + "productization_notes" +] +``` + +### 6.2 推荐字段 + +```json +[ + "trigger_keywords", + "negative_triggers", + "related_models", + "conflicting_models", + "disciplinary_anchors", + "example_inputs", + "example_outputs", + "output_contract", + "depth_control", + "stabilization_path", + "version", + "last_updated" +] +``` + +--- + +## 7. 枚举值建议 + +### 7.1 model_type + +```json +[ + "routing_model", + "deep_modeling_model", + "lens_model", + "diagnostic_model", + "evaluation_model", + "generation_model", + "conflict_resolution_model", + "stabilization_model" +] +``` + +### 7.2 pipeline_position + +```json +[ + "pre_analysis", + "analysis", + "deep_analysis", + "synthesis", + "red_team", + "evaluation", + "post_processing" +] +``` + +### 7.3 confidence_level + +```json +[ + "high", + "medium", + "low" +] +``` + +### 7.4 regression_status + +```json +[ + "not_started", + "pending", + "in_progress", + "passed", + "failed", + "needs_rebuild" +] +``` + +### 7.5 stability_level + +```json +[ + "A", + "B", + "C", + "D" +] +``` + +建议含义: + +| 等级 | 含义 | +| -- | ------------- | +| A | 高稳固,可进入核心调用 | +| B | 基本稳固,需要边界测试 | +| C | 有解释力,但概念或边界不稳 | +| D | 暂不适合系统调用,需要重构 | + +--- + +## 8. model_card.schema.json 草案 + +Codex 可以先按这个草案实现,后续再细化。 + +```json +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "title": "Cognitive Model Card", + "type": "object", + "required": [ + "model_id", + "model_name", + "model_type", + "pipeline_position", + "one_sentence_definition", + "core_question", + "core_mechanism", + "source_articles", + "source_evidence", + "input_types", + "output_types", + "call_when", + "do_not_call_when", + "common_misuses", + "failure_modes", + "selection_priority", + "confidence_level", + "stability_profile", + "regression_status", + "productization_notes" + ], + "properties": { + "model_id": { + "type": "string" + }, + "model_name": { + "type": "string" + }, + "model_type": { + "type": "string", + "enum": [ + "routing_model", + "deep_modeling_model", + "lens_model", + "diagnostic_model", + "evaluation_model", + "generation_model", + "conflict_resolution_model", + "stabilization_model" + ] + }, + "pipeline_position": { + "type": "string", + "enum": [ + "pre_analysis", + "analysis", + "deep_analysis", + "synthesis", + "red_team", + "evaluation", + "post_processing" + ] + }, + "one_sentence_definition": { + "type": "string" + }, + "core_question": { + "type": "string" + }, + "core_mechanism": { + "type": "string" + }, + "source_articles": { + "type": "array", + "items": { + "type": "string" + } + }, + "source_evidence": { + "type": "array", + "items": { + "type": "string" + } + }, + "input_types": { + "type": "array", + "items": { + "type": "string" + } + }, + "output_types": { + "type": "array", + "items": { + "type": "string" + } + }, + "call_when": { + "type": "array", + "items": { + "type": "string" + } + }, + "do_not_call_when": { + "type": "array", + "items": { + "type": "string" + } + }, + "trigger_keywords": { + "type": "array", + "items": { + "type": "string" + } + }, + "negative_triggers": { + "type": "array", + "items": { + "type": "string" + } + }, + "related_models": { + "type": "array", + "items": { + "type": "string" + } + }, + "conflicting_models": { + "type": "array", + "items": { + "type": "string" + } + }, + "disciplinary_anchors": { + "type": "array", + "items": { + "type": "string" + } + }, + "common_misuses": { + "type": "array", + "items": { + "type": "string" + } + }, + "failure_modes": { + "type": "array", + "items": { + "type": "string" + } + }, + "selection_priority": { + "type": "integer", + "minimum": 1, + "maximum": 10 + }, + "confidence_level": { + "type": "string", + "enum": [ + "high", + "medium", + "low" + ] + }, + "stability_profile": { + "type": "object", + "required": [ + "stability_level", + "needs_stabilization", + "main_risks" + ], + "properties": { + "stability_level": { + "type": "string", + "enum": [ + "A", + "B", + "C", + "D" + ] + }, + "needs_stabilization": { + "type": "boolean" + }, + "main_risks": { + "type": "array", + "items": { + "type": "string" + } + }, + "stabilization_notes": { + "type": "string" + } + } + }, + "regression_status": { + "type": "string", + "enum": [ + "not_started", + "pending", + "in_progress", + "passed", + "failed", + "needs_rebuild" + ] + }, + "example_inputs": { + "type": "array", + "items": { + "type": "string" + } + }, + "example_outputs": { + "type": "array", + "items": { + "type": "string" + } + }, + "output_contract": { + "type": "array", + "items": { + "type": "string" + } + }, + "productization_notes": { + "type": "string" + }, + "version": { + "type": "string" + }, + "last_updated": { + "type": "string" + } + } +} +``` + +--- + +## 9. source_article.schema.json 草案 + +```json +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "title": "Source Article", + "type": "object", + "required": [ + "source_id", + "title", + "source_type", + "related_models", + "source_status" + ], + "properties": { + "source_id": { + "type": "string" + }, + "title": { + "type": "string" + }, + "author": { + "type": "string" + }, + "date": { + "type": "string" + }, + "source_type": { + "type": "string", + "enum": [ + "original_article", + "representative_text", + "discussion_note", + "transcript", + "excerpt", + "other" + ] + }, + "file_path": { + "type": "string" + }, + "related_models": { + "type": "array", + "items": { + "type": "string" + } + }, + "source_status": { + "type": "string", + "enum": [ + "primary", + "representative", + "supplementary", + "deprecated", + "unknown" + ] + }, + "notes": { + "type": "string" + } + } +} +``` + +--- + +## 10. source_excerpt.schema.json 草案 + +```json +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "title": "Source Excerpt", + "type": "object", + "required": [ + "excerpt_id", + "source_id", + "related_model_id", + "excerpt_type", + "summary", + "used_for" + ], + "properties": { + "excerpt_id": { + "type": "string" + }, + "source_id": { + "type": "string" + }, + "related_model_id": { + "type": "string" + }, + "excerpt_type": { + "type": "string", + "enum": [ + "definition", + "problem_origin", + "mechanism", + "taxonomy", + "procedure", + "boundary", + "misuse", + "example", + "metaphor", + "test", + "other" + ] + }, + "raw_excerpt": { + "type": "string" + }, + "summary": { + "type": "string" + }, + "used_for": { + "type": "array", + "items": { + "type": "string" + } + }, + "confidence": { + "type": "string", + "enum": [ + "high", + "medium", + "low" + ] + }, + "notes": { + "type": "string" + } + } +} +``` + +--- + +## 11. regression_case.schema.json 草案 + +```json +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "title": "Regression Case", + "type": "object", + "required": [ + "case_id", + "model_id", + "case_type", + "input", + "expected_behavior", + "failure_signal" + ], + "properties": { + "case_id": { + "type": "string" + }, + "model_id": { + "type": "string" + }, + "case_type": { + "type": "string", + "enum": [ + "positive", + "boundary", + "misuse", + "conflict", + "stress" + ] + }, + "input": { + "type": "string" + }, + "expected_behavior": { + "type": "string" + }, + "expected_output_elements": { + "type": "array", + "items": { + "type": "string" + } + }, + "failure_signal": { + "type": "string" + }, + "notes": { + "type": "string" + } + } +} +``` + +--- + +## 12. 样板模型一:QPI + +### 12.1 QPI 人读模型卡 v0.1 + +```markdown +## QPI 问题定性模型 + +### 模型 ID + +qpi + +### 一句话定义 + +QPI 是一个问题定性与认知路由模型,用来判断当前输入到底是缺信息的 Question、缺路径的 Problem,还是缺稳定性 / 共识的 Issue,并据此决定后续处理路径。 + +### 模型类型 + +routing_model + +### 所在流程位置 + +pre_analysis + +QPI 应该放在问题回答系统的前置阶段。 +它不是直接回答问题,而是先判断“这是什么类型的问题”。 + +### 来源文章 + +- article_qpi_primary_001:问题之锚:从混沌现实到认知秩序的重构 +- article_qpi_supplementary_001:QPI 后续讨论或补充材料,待补充 + +### 来源证据片段 + +- qpi_excerpt_problem_confusion_001 +- qpi_excerpt_taxonomy_001 +- qpi_excerpt_misuse_001 +- qpi_excerpt_action_path_001 + +### 核心问题 + +当前输入到底是: + +1. 缺事实、数据、信息的 Question; +2. 缺路径、方案、资源的 Problem; +3. 缺稳定性、共识、动态平衡的 Issue? + +### 核心机制 + +QPI 通过识别“核心匮乏物”来区分问题类型: + +- Question:核心匮乏是信息; +- Problem:核心匮乏是路径; +- Issue:核心匮乏是稳定性、共识或动态平衡。 + +不同类型的问题对应不同处理范式: + +- Question 适合搜索、查证、信息补全; +- Problem 适合工程求解、路径设计、资源调度; +- Issue 适合生态干预、博弈分析、结构调整、长期适应。 + +### 输入类型 + +- 模糊问题 +- 复杂问题 +- 产品问题 +- 组织问题 +- 认知困惑 +- 战略判断 +- 多方冲突文本 +- 用户不知道该如何定义的问题 + +### 输出类型 + +- Q / P / I 分类 +- 分类理由 +- 误判风险 +- 推荐处理路径 +- 是否需要调用后续模型 +- 是否需要深度下潜 + +### 适用场景 + +适合在以下场景调用: + +1. 用户输入的问题定义不清; +2. 同一问题被不同主体以不同方式理解; +3. 用户急于求解,但尚未判断问题性质; +4. 问题中混杂了事实、路径、利益、共识和系统结构; +5. 需要决定后续调用哪些认知模型; +6. 需要防止把复杂 Issue 简化成普通 Problem。 + +### 不适用场景 + +不适合在以下场景调用: + +1. 用户只是查询明确事实; +2. 用户已经给出明确执行任务; +3. 输入是纯创意写作,不需要问题定性; +4. 问题已经被清楚分类,只需要执行后续步骤; +5. 时间窗口极短,只允许直接行动。 + +### 调用关键词 + +- 问题到底是什么 +- 为什么解决不了 +- 到底卡在哪里 +- 这是技术问题还是组织问题 +- 是不是方向错了 +- 为什么反复出现 +- 该怎么定义这个问题 +- 这个问题应该怎么拆 + +### 负向触发条件 + +以下情况要降低 QPI 调用优先级: + +- 用户要求直接查事实; +- 用户要求直接改写文本; +- 用户要求直接生成清单; +- 输入中没有明显的问题定义困难; +- 输入已经指定使用其他模型。 + +### 相关模型 + +- 思想考古 +- 认知棱镜 +- 认知显影 +- 问题分层类模型 +- 冲突汇总类模型 + +### 冲突模型 + +暂不指定具体冲突模型。 +但 QPI 与“直接给答案”的流程存在流程冲突:如果 QPI 判断尚未完成,不应急于进入回答。 + +### 学科底座关联 + +- 问题定义理论 +- 决策科学 +- 系统论 +- 复杂系统 +- 组织行为 +- 设计思维 +- 工程问题分解 + +### 常见误用 + +1. 把所有复杂问题都判断成 Issue; +2. 把系统性 Issue 暴力降维成个体 Problem; +3. 把具体可解决的 Problem 恶意升维成无法处理的 Issue; +4. 在 Question 阶段过度建模; +5. 把 QPI 当成最终分析模型,而不是前置路由模型。 + +### 失败信号 + +如果系统出现以下情况,说明 QPI 调用失败: + +1. 面对事实查询却输出复杂系统分析; +2. 面对组织性 Issue 却只给个人行动清单; +3. 面对具体执行 Problem 却泛化到宏大结构; +4. 分类没有给出理由; +5. 分类之后没有给出后续处理路径。 + +### 可信度等级 + +medium + +### 稳固性状态 + +B + +说明: +QPI 的基本结构清晰,适合作为入口模型。 +但它需要大量边界案例测试,尤其要防止“所有问题都升维成 Issue”。 + +### 回归测试状态 + +pending + +### 示例输入 + +“我们团队每次都说要长期主义,但一到季度 KPI 就回到短期动作,这到底是什么问题?” + +### 示例输出 + +该输入更接近 Issue,而不是普通 Problem。 + +理由: + +1. 它不是单纯缺信息; +2. 也不是简单缺执行路径; +3. 它涉及激励结构、时间尺度冲突、组织共识和多主体行为; +4. 如果把它当成 Problem,只给执行清单,很可能治标不治本。 + +推荐后续调用: + +- 思想考古:下潜其深层结构; +- 冲突汇总模型:识别长期主义与短期 KPI 的冲突; +- 学科底座校准:组织行为与激励机制。 + +### 产品化建议 + +QPI 应作为问题回答系统的默认前置路由模型之一。 +它的核心价值不是生成深刻答案,而是防止系统在问题类型错误的情况下直接回答。 +``` + +--- + +### 12.2 QPI 机器调用 JSON v0.1 + +```json +{ + "model_id": "qpi", + "model_name": "QPI 问题定性模型", + "model_type": "routing_model", + "pipeline_position": "pre_analysis", + "one_sentence_definition": "QPI 是一个问题定性与认知路由模型,用来判断当前输入到底是缺信息的 Question、缺路径的 Problem,还是缺稳定性 / 共识的 Issue,并据此决定后续处理路径。", + "core_question": "当前输入到底是 Question、Problem 还是 Issue?", + "core_mechanism": "QPI 通过识别问题中的核心匮乏物进行分类:Question 缺信息,Problem 缺路径,Issue 缺稳定性、共识或动态平衡。不同类型的问题对应不同处理范式。", + "source_articles": [ + "article_qpi_primary_001", + "article_qpi_supplementary_001" + ], + "source_evidence": [ + "qpi_excerpt_problem_confusion_001", + "qpi_excerpt_taxonomy_001", + "qpi_excerpt_misuse_001", + "qpi_excerpt_action_path_001" + ], + "input_types": [ + "模糊问题", + "复杂问题", + "产品问题", + "组织问题", + "认知困惑", + "战略判断", + "多方冲突文本" + ], + "output_types": [ + "问题类型判断", + "分类理由", + "误判风险", + "推荐处理路径", + "后续模型调用建议" + ], + "call_when": [ + "用户输入的问题定义不清", + "同一问题被不同主体以不同方式理解", + "用户急于求解但尚未判断问题性质", + "问题中混杂事实、路径、利益、共识和系统结构", + "需要决定后续调用哪些认知模型" + ], + "do_not_call_when": [ + "用户只是查询明确事实", + "用户已经给出明确执行任务", + "输入是纯创意写作且不需要问题定性", + "问题已经被清楚分类且只需要执行后续步骤" + ], + "trigger_keywords": [ + "问题到底是什么", + "为什么解决不了", + "卡在哪里", + "技术问题还是组织问题", + "方向是不是错了", + "为什么反复出现", + "该怎么定义这个问题", + "这个问题怎么拆" + ], + "negative_triggers": [ + "请直接查询", + "请直接改写", + "只要清单", + "不要分析原因", + "不要展开" + ], + "related_models": [ + "intellectual_archaeology", + "cognitive_prism", + "cognitive_development" + ], + "conflicting_models": [], + "disciplinary_anchors": [ + "问题定义理论", + "决策科学", + "系统论", + "复杂系统", + "组织行为", + "工程问题分解" + ], + "common_misuses": [ + "把所有复杂问题都判断成 Issue", + "把系统性 Issue 暴力降维成个体 Problem", + "把具体可解决的 Problem 恶意升维成无法处理的 Issue", + "在 Question 阶段过度建模", + "把 QPI 当成最终分析模型而不是前置路由模型" + ], + "failure_modes": [ + "面对事实查询却输出复杂系统分析", + "面对组织性 Issue 却只给个人行动清单", + "面对具体执行 Problem 却泛化到宏大结构", + "分类没有给出理由", + "分类之后没有给出后续处理路径" + ], + "selection_priority": 9, + "confidence_level": "medium", + "stability_profile": { + "stability_level": "B", + "needs_stabilization": true, + "main_risks": [ + "边界案例需要测试", + "容易把复杂问题过度升维为 Issue", + "Question / Problem / Issue 的判断标准需要进一步示例化" + ], + "stabilization_notes": "优先补充正向、边界、误用三类测试案例,形成分类判准。" + }, + "regression_status": "pending", + "example_inputs": [ + "我们团队每次都说要长期主义,但一到季度 KPI 就回到短期动作,这到底是什么问题?", + "我知道要做模型库,但不知道先用数据库还是文件系统,这属于什么问题?" + ], + "example_outputs": [ + "第一个输入更接近 Issue,因为它涉及激励结构、时间尺度冲突和组织共识。", + "第二个输入更接近 Problem,因为目标明确,主要缺的是实现路径和技术取舍。" + ], + "output_contract": [ + "判断输入属于 Question、Problem、Issue 或混合型", + "说明分类理由", + "指出可能误判", + "给出推荐处理路径", + "建议后续调用模型" + ], + "productization_notes": "QPI 应作为问题回答系统的前置路由模型,用于防止系统在问题类型错误的情况下直接给答案。", + "version": "0.1", + "last_updated": "2026-06-15" +} +``` + +--- + +### 12.3 QPI 来源片段样例 + +```json +[ + { + "excerpt_id": "qpi_excerpt_problem_confusion_001", + "source_id": "article_qpi_primary_001", + "related_model_id": "qpi", + "excerpt_type": "problem_origin", + "raw_excerpt": "待填入原文片段", + "summary": "同一个'问题'在不同角色眼中可能是事实缺口、路径障碍或系统性冲突,若不先定性,会导致认知错位和行动失灵。", + "used_for": [ + "core_question", + "call_when", + "example_inputs" + ], + "confidence": "medium", + "notes": "用于支撑 QPI 作为问题定性模型。" + }, + { + "excerpt_id": "qpi_excerpt_taxonomy_001", + "source_id": "article_qpi_primary_001", + "related_model_id": "qpi", + "excerpt_type": "taxonomy", + "raw_excerpt": "待填入原文片段", + "summary": "QPI 将问题划分为 Question、Problem、Issue 三类,分别对应信息匮乏、路径匮乏、稳定性或共识匮乏。", + "used_for": [ + "core_mechanism", + "output_contract", + "regression_tests" + ], + "confidence": "high", + "notes": "用于支撑 QPI 的核心三分结构。" + }, + { + "excerpt_id": "qpi_excerpt_misuse_001", + "source_id": "article_qpi_primary_001", + "related_model_id": "qpi", + "excerpt_type": "misuse", + "raw_excerpt": "待填入原文片段", + "summary": "QPI 的误用包括把 Issue 降维成 Problem,或把 Problem 升维成不可处理的 Issue。", + "used_for": [ + "common_misuses", + "failure_modes" + ], + "confidence": "medium", + "notes": "用于支撑 QPI 的边界和误用检查。" + } +] +``` + +--- + +### 12.4 QPI 回归测试样例 + +```json +[ + { + "case_id": "qpi_positive_question_001", + "model_id": "qpi", + "case_type": "positive", + "input": "这段代码为什么报错?", + "expected_behavior": "应判断为 Question 或偏 Question,因为当前主要缺少具体错误信息、日志、代码上下文等事实材料。", + "expected_output_elements": [ + "判断为 Question", + "要求补充事实信息", + "不应过度建模" + ], + "failure_signal": "系统开始讨论组织结构、人生意义或复杂系统,而没有要求补充事实信息。", + "notes": "测试 QPI 是否能识别简单信息缺口。" + }, + { + "case_id": "qpi_positive_problem_001", + "model_id": "qpi", + "case_type": "positive", + "input": "我知道要先做模型库,但不知道应该用数据库还是 JSON 文件。", + "expected_behavior": "应判断为 Problem,因为目标基本明确,主要缺的是实现路径和技术取舍。", + "expected_output_elements": [ + "判断为 Problem", + "指出目标明确但路径未定", + "建议进行工程取舍分析" + ], + "failure_signal": "系统把问题上升到知识哲学层面,忽略具体实现路径。", + "notes": "测试 QPI 是否能识别路径缺口。" + }, + { + "case_id": "qpi_positive_issue_001", + "model_id": "qpi", + "case_type": "positive", + "input": "团队每次都说要长期主义,但一到季度 KPI 就回到短期动作,这到底是什么问题?", + "expected_behavior": "应判断为 Issue,因为它涉及激励结构、时间尺度冲突、多主体行为和组织共识。", + "expected_output_elements": [ + "判断为 Issue", + "指出不是简单执行问题", + "建议分析激励结构和组织反馈" + ], + "failure_signal": "系统只给出个人执行清单,例如'制定计划、加强沟通、定期复盘'。", + "notes": "测试 QPI 是否能识别系统性稳定问题。" + }, + { + "case_id": "qpi_boundary_mixed_001", + "model_id": "qpi", + "case_type": "boundary", + "input": "我的产品方向不确定,也不知道用户到底要什么,还担心技术做不出来。", + "expected_behavior": "应判断为混合型问题,包含 Question、Problem 和 Issue,但需要指出当前优先处理的问题类型。", + "expected_output_elements": [ + "识别混合型", + "拆分信息缺口、路径缺口和稳定性缺口", + "给出处理优先级" + ], + "failure_signal": "系统强行只判为一种类型,且不说明混合成分。", + "notes": "测试 QPI 对混合问题的处理能力。" + }, + { + "case_id": "qpi_misuse_over_issue_001", + "model_id": "qpi", + "case_type": "misuse", + "input": "我不知道 Notion 的这个按钮在哪里。", + "expected_behavior": "应判断为 Question,不应升维为 Issue。", + "expected_output_elements": [ + "判断为 Question", + "建议查找界面位置或文档", + "不做宏大分析" + ], + "failure_signal": "系统讨论现代工具复杂性、用户控制感、信息架构困境等宏大问题。", + "notes": "防止 QPI 过度升维。" + } +] +``` + +--- + +## 13. 样板模型二:思想考古 + +### 13.1 思想考古人读模型卡 v0.1 + +```markdown +## 思想考古模型 + +### 模型 ID + +intellectual_archaeology + +### 一句话定义 + +思想考古是一个纵向下潜模型,用来从表层现象一路追问到过程层、机理层、目的层、人类能力层乃至哲学基岩,从而识别问题或模型背后的深层结构和隐含假设。 + +### 模型类型 + +deep_modeling_model + +### 所在流程位置 + +deep_analysis + +思想考古不适合作为所有问题的默认入口。 +它应在 QPI 定性之后,被用于高复用、高复杂度、需要沉淀方法论或模型的问题。 + +### 来源文章 + +- article_archaeology_primary_001:建模者的工坊:一场将直觉锻造成罗盘的认知炼金术 +- article_archaeology_supplementary_001:思想考古相关后续讨论,待补充 + +### 来源证据片段 + +- archaeology_excerpt_depth_001 +- archaeology_excerpt_layers_001 +- archaeology_excerpt_boundary_001 +- archaeology_excerpt_modeling_001 + +### 核心问题 + +当前问题、方案或模型背后,隐藏了哪些更深层的结构性假设? + +具体包括: + +1. 它表面上在处理什么; +2. 它依赖什么评价标准; +3. 它背后有哪些过程和机制; +4. 它服务什么目的; +5. 它依赖什么核心机理; +6. 它对应人类哪种能力; +7. 它背后有哪些哲学前提。 + +### 核心机制 + +思想考古通过纵向下潜,把一个表层问题拆到更深层的结构。 + +建议七层结构如下: + +1. 应用层:具体工具、流程、指标、场景; +2. 评价层:如何判断好坏、成功与失败; +3. 过程层:实际运作过程、操作链条、反馈机制; +4. 目的层:最终服务的目标和价值原子; +5. 核心机理层:系统如何学习、演化、自适应; +6. 人类能力层:它对应人类怎样的问题解决能力; +7. 哲学基岩层:它关于问题、知识、现实、主体的根本假设。 + +### 输入类型 + +- 复杂问题 +- 系统性议题 +- 反复失败的问题 +- 需要沉淀方法论的问题 +- 专家隐性知识 +- 认知模型草稿 +- 产品底层逻辑 +- 长期可复用的分析对象 + +### 输出类型 + +- 层级化问题地图 +- 深层假设清单 +- 最小充分下潜层级 +- 模型稳固性判断 +- 需要验证的薄弱环节 +- 后续建模建议 + +### 适用场景 + +适合在以下场景调用: + +1. QPI 判断问题偏 Issue; +2. 问题具有高复用价值; +3. 用户希望从文章中抽取模型; +4. 当前解释停留在表层工具或症状; +5. 需要把专家隐性知识显性化; +6. 需要为一个模型寻找更稳固的底层结构; +7. 一个问题反复解决但反复失败。 + +### 不适用场景 + +不适合在以下场景调用: + +1. 简单事实查询; +2. 明确执行任务; +3. 低风险、低复用问题; +4. 用户只要快速输出,不需要深层建模; +5. 继续下潜不会改变决策; +6. 缺乏证据,无法支持深层推断。 + +### 调用关键词 + +- 背后的深层结构 +- 底层逻辑 +- 这个模型稳不稳 +- 为什么反复失败 +- 这个问题的根在哪里 +- 这个想法能不能沉淀成模型 +- 如何从文章抽取模型 +- 这个方法论的基岩是什么 + +### 负向触发条件 + +以下情况要降低调用优先级: + +- 用户明确要求快速答案; +- 问题只需要查事实; +- 问题不值得重型建模; +- 当前信息不足以支持深层推断; +- 使用 QPI 后判断为轻量 Question。 + +### 相关模型 + +- QPI +- 认知棱镜 +- 认知显影 +- 建模者委员会 +- 回归测试模型 +- 学科底座校准模型 + +### 冲突模型 + +思想考古与“快速执行模型”存在成本冲突。 +如果任务目标是快速完成一个低复用动作,思想考古可能过重。 + +### 学科底座关联 + +- 哲学 +- 认识论 +- 系统论 +- 复杂系统 +- 认知心理学 +- 专家知识显性化 +- 因果推理 +- 设计理论 + +### 常见误用 + +1. 为了显得深刻而无限下钻; +2. 把所有轻量问题都拖入七层分析; +3. 只做纵向下潜,缺少横向模型竞争; +4. 用哲学基岩替代现实验证; +5. 把隐喻性表达误当作稳定机制; +6. 下潜后没有回到可行动结论。 + +### 失败信号 + +如果系统出现以下情况,说明思想考古调用失败: + +1. 分析很深,但不能改变判断或行动; +2. 层级之间没有清楚递进关系; +3. 把所有问题都下钻到哲学层; +4. 输出只有抽象概念,没有模型结构; +5. 没有说明应该在哪一层停止; +6. 没有指出需要证据验证的地方。 + +### 可信度等级 + +medium + +### 稳固性状态 + +B + +说明: +思想考古的方向清晰,适合做深度建模。 +但七层结构需要进一步稳定,避免不同文章或不同任务中层级名称漂移。 + +### 回归测试状态 + +pending + +### 示例输入 + +“我想把过去文章中的认知模型抽取出来,但不知道这些模型到底稳不稳,应该怎么判断?” + +### 示例输出 + +该问题适合调用思想考古。 + +初步层级判断: + +1. 应用层:把文章整理成模型库; +2. 评价层:判断模型是否稳固; +3. 过程层:从文章到证据片段,再到模型卡和测试用例; +4. 目的层:让模型能被问题回答系统调用; +5. 核心机理层:把隐性认知加工方式外化为可测试模块; +6. 人类能力层:外化专家直觉、提高问题加工稳定性; +7. 哲学基岩层:知识不是静态内容,而是可调用、可校准、可迭代的认知工具。 + +建议最小充分下潜到第 5 层。 +暂时不必强行进入第 7 层,因为当前任务主要是产品化和工程样板。 + +### 产品化建议 + +思想考古应作为中重度问题的深层建模模块。 +它不应该默认每次调用,而应由 QPI、问题复杂度和复用价值共同决定是否启动。 +``` + +--- + +### 13.2 思想考古机器调用 JSON v0.1 + +```json +{ + "model_id": "intellectual_archaeology", + "model_name": "思想考古模型", + "model_type": "deep_modeling_model", + "pipeline_position": "deep_analysis", + "one_sentence_definition": "思想考古是一个纵向下潜模型,用来从表层现象一路追问到过程层、机理层、目的层、人类能力层乃至哲学基岩,从而识别问题或模型背后的深层结构和隐含假设。", + "core_question": "当前问题、方案或模型背后,隐藏了哪些更深层的结构性假设?", + "core_mechanism": "思想考古通过纵向下潜,把一个表层问题拆到更深层的结构。建议从应用层、评价层、过程层、目的层、核心机理层、人类能力层、哲学基岩层逐层分析,并遵守最小充分下潜原则。", + "source_articles": [ + "article_archaeology_primary_001", + "article_archaeology_supplementary_001" + ], + "source_evidence": [ + "archaeology_excerpt_depth_001", + "archaeology_excerpt_layers_001", + "archaeology_excerpt_boundary_001", + "archaeology_excerpt_modeling_001" + ], + "input_types": [ + "复杂问题", + "系统性议题", + "反复失败的问题", + "需要沉淀方法论的问题", + "专家隐性知识", + "认知模型草稿", + "产品底层逻辑" + ], + "output_types": [ + "层级化问题地图", + "深层假设清单", + "最小充分下潜层级", + "模型稳固性判断", + "需要验证的薄弱环节", + "后续建模建议" + ], + "call_when": [ + "QPI 判断问题偏 Issue", + "问题具有高复用价值", + "用户希望从文章中抽取模型", + "当前解释停留在表层工具或症状", + "需要把专家隐性知识显性化", + "需要为一个模型寻找更稳固的底层结构", + "一个问题反复解决但反复失败" + ], + "do_not_call_when": [ + "简单事实查询", + "明确执行任务", + "低风险低复用问题", + "用户只要快速输出", + "继续下潜不会改变决策", + "缺乏证据支撑深层推断" + ], + "trigger_keywords": [ + "深层结构", + "底层逻辑", + "模型稳不稳", + "为什么反复失败", + "问题的根在哪里", + "沉淀成模型", + "从文章抽取模型", + "方法论的基岩" + ], + "negative_triggers": [ + "快速回答", + "不要展开", + "只查事实", + "只要执行步骤", + "不要深入分析" + ], + "related_models": [ + "qpi", + "cognitive_prism", + "cognitive_development", + "modeling_committee", + "regression_testing" + ], + "conflicting_models": [ + "fast_execution_flow" + ], + "disciplinary_anchors": [ + "哲学", + "认识论", + "系统论", + "复杂系统", + "认知心理学", + "专家知识显性化", + "因果推理", + "设计理论" + ], + "common_misuses": [ + "为了显得深刻而无限下钻", + "把所有轻量问题都拖入七层分析", + "只做纵向下潜而缺少横向模型竞争", + "用哲学基岩替代现实验证", + "把隐喻性表达误当作稳定机制", + "下潜后没有回到可行动结论" + ], + "failure_modes": [ + "分析很深但不能改变判断或行动", + "层级之间没有清楚递进关系", + "把所有问题都下钻到哲学层", + "输出只有抽象概念而没有模型结构", + "没有说明应该在哪一层停止", + "没有指出需要证据验证的地方" + ], + "selection_priority": 7, + "confidence_level": "medium", + "stability_profile": { + "stability_level": "B", + "needs_stabilization": true, + "main_risks": [ + "七层结构需要进一步稳定", + "容易过度下潜", + "容易输出抽象概念而缺少行动回路", + "需要更多真实案例验证" + ], + "stabilization_notes": "优先补充不同复杂度问题的测试案例,明确最小充分下潜原则和停止条件。" + }, + "regression_status": "pending", + "example_inputs": [ + "我想把过去文章中的认知模型抽取出来,但不知道这些模型到底稳不稳,应该怎么判断?", + "现代人为什么一边渴望连接,一边又渴望逃离连接?" + ], + "example_outputs": [ + "第一个输入适合下潜到核心机理层,判断文章、模型卡、系统调用、回归测试之间的关系。", + "第二个输入可从应用层、评价层、过程层、目的层和人类能力层分析连接与逃离连接的双重机制。" + ], + "output_contract": [ + "判断当前问题所在表层", + "给出建议下潜层级", + "按层级输出结构化分析", + "指出每一层的关键假设", + "给出最小充分下潜停止点", + "标记需要证据或现实反馈校准的部分" + ], + "depth_control": { + "principle": "最小充分下潜", + "stop_conditions": [ + "已经足以改变决策", + "继续下潜不会增加解释力", + "缺少证据支撑更深推断", + "问题不值得重型建模", + "用户当前只需要执行层结果" + ], + "overuse_warning": "思想考古不是所有问题的默认流程,必须先经过问题价值评估和 QPI 定性。" + }, + "productization_notes": "思想考古适合作为中重度问题的深层建模模块,不应默认全量调用。它应该由 QPI、问题复杂度和复用价值共同触发。", + "version": "0.1", + "last_updated": "2026-06-15" +} +``` + +--- + +### 13.3 思想考古来源片段样例 + +```json +[ + { + "excerpt_id": "archaeology_excerpt_depth_001", + "source_id": "article_archaeology_primary_001", + "related_model_id": "intellectual_archaeology", + "excerpt_type": "mechanism", + "raw_excerpt": "待填入原文片段", + "summary": "思想考古要求从表层现象向深层结构下潜,通过层层追问识别问题背后的机制、目的和基岩假设。", + "used_for": [ + "core_mechanism", + "call_when", + "output_contract" + ], + "confidence": "medium", + "notes": "用于支撑思想考古作为纵向下潜模型。" + }, + { + "excerpt_id": "archaeology_excerpt_layers_001", + "source_id": "article_archaeology_primary_001", + "related_model_id": "intellectual_archaeology", + "excerpt_type": "taxonomy", + "raw_excerpt": "待填入原文片段", + "summary": "思想考古可被整理为应用层、评价层、过程层、目的层、核心机理层、人类能力层和哲学基岩层。", + "used_for": [ + "core_mechanism", + "example_outputs", + "regression_tests" + ], + "confidence": "medium", + "notes": "七层结构需要在后续版本中继续校准。" + }, + { + "excerpt_id": "archaeology_excerpt_boundary_001", + "source_id": "article_archaeology_primary_001", + "related_model_id": "intellectual_archaeology", + "excerpt_type": "boundary", + "raw_excerpt": "待填入原文片段", + "summary": "思想考古应遵守最小充分下潜原则,不应把所有问题都拖入重型建模流程。", + "used_for": [ + "do_not_call_when", + "depth_control", + "common_misuses" + ], + "confidence": "medium", + "notes": "用于防止思想考古过度使用。" + } +] +``` + +--- + +### 13.4 思想考古回归测试样例 + +```json +[ + { + "case_id": "archaeology_positive_modeling_001", + "model_id": "intellectual_archaeology", + "case_type": "positive", + "input": "我想把过去文章中的认知模型抽取出来,但不知道这些模型到底稳不稳,应该怎么判断?", + "expected_behavior": "应调用思想考古,将问题从文章整理下潜到模型稳固性、系统调用和认知能力外化层面。", + "expected_output_elements": [ + "给出层级化分析", + "指出模型稳固性问题", + "说明最小充分下潜层级", + "回到可执行的模型抽取流程" + ], + "failure_signal": "系统只给出普通资料整理建议,没有触及模型稳固性、调用规则和回归测试。", + "notes": "测试思想考古是否能用于模型抽取场景。" + }, + { + "case_id": "archaeology_positive_issue_001", + "model_id": "intellectual_archaeology", + "case_type": "positive", + "input": "现代人为什么一边渴望连接,一边又渴望逃离连接?", + "expected_behavior": "应将问题下潜到连接的功能、连接带来的负荷、主体边界、社会反馈和人类关系需求等层级。", + "expected_output_elements": [ + "识别表层矛盾", + "分析连接的收益与成本", + "指出深层心理或社会机制", + "避免只做情绪化解释" + ], + "failure_signal": "系统只输出鸡汤式解释,例如'人既需要爱也需要自由'。", + "notes": "测试思想考古能否处理复杂认知现象。" + }, + { + "case_id": "archaeology_boundary_light_task_001", + "model_id": "intellectual_archaeology", + "case_type": "boundary", + "input": "帮我把这句话改得更简洁。", + "expected_behavior": "不应调用思想考古,或只轻量说明无需深层建模。", + "expected_output_elements": [ + "识别为轻量任务", + "不进入七层分析", + "直接执行改写" + ], + "failure_signal": "系统开始分析语言背后的哲学基岩。", + "notes": "防止思想考古过度调用。" + }, + { + "case_id": "archaeology_boundary_stop_depth_001", + "model_id": "intellectual_archaeology", + "case_type": "boundary", + "input": "我在设计模型库时,不确定模型卡字段要不要加'哲学基岩'。", + "expected_behavior": "应分析到产品调用和字段成本层面即可,不必强行进入完整七层。", + "expected_output_elements": [ + "判断字段是否服务调用", + "说明哲学基岩可作为可选字段", + "提出最小充分方案" + ], + "failure_signal": "系统展开大段哲学分析,却没有回答字段设计取舍。", + "notes": "测试最小充分下潜原则。" + }, + { + "case_id": "archaeology_misuse_abstract_001", + "model_id": "intellectual_archaeology", + "case_type": "misuse", + "input": "我的模型管理 MVP 下一步要做什么?", + "expected_behavior": "如果调用思想考古,也必须回到可执行任务,不应只输出抽象层级。", + "expected_output_elements": [ + "识别当前阶段", + "说明下潜对决策的帮助", + "输出下一步任务清单" + ], + "failure_signal": "系统只讨论知识、现实、主体性等抽象概念,没有任务切片。", + "notes": "防止思想考古脱离产品规划。" + } +] +``` + +--- + +## 14. QPI 与思想考古的组合关系 + +这两个模型在系统中不是并列替代关系,而是前后衔接关系。 + +```text +输入问题 +→ QPI 判断问题类型 +→ 判断是否需要深度下潜 +→ 如果问题复杂、高复用、偏 Issue,则调用思想考古 +→ 输出层级结构和深层假设 +→ 后续再接其他横向棱镜模型 +``` + +### 14.1 系统位置 + +| 模型 | 系统位置 | 作用 | +| ---- | ------------- | ------------- | +| QPI | pre_analysis | 判断问题类型,决定处理路径 | +| 思想考古 | deep_analysis | 对复杂问题进行纵向下潜 | + +### 14.2 调用优先级 + +| 场景 | 推荐调用 | +| --------------- | ----------- | +| 问题定义不清 | 优先 QPI | +| 只是查事实 | 不调用思想考古 | +| 目标明确但路径未定 | QPI 后进入工程求解 | +| 多主体冲突 / 系统性反复失败 | QPI + 思想考古 | +| 需要从文章抽模型 | 思想考古 | +| 需要判断模型是否稳固 | 思想考古 + 回归测试 | + +--- + +## 15. 最小模型选择器规则 + +v0.1 的模型选择器不需要复杂算法。 + +可以先使用规则 + 简单评分。 + +### 15.1 输入 + +```json +{ + "user_input": "团队每次都说要长期主义,但一到季度 KPI 就回到短期动作,这到底是什么问题?", + "task_type": "question_analysis", + "depth_preference": "medium" +} +``` + +### 15.2 输出 + +```json +{ + "recommended_models": [ + { + "model_id": "qpi", + "score": 0.92, + "reason": "输入包含'到底是什么问题',且存在问题定性需求。" + }, + { + "model_id": "intellectual_archaeology", + "score": 0.78, + "reason": "该问题涉及长期主义、KPI、组织激励和反复失败,适合进行深层结构分析。" + } + ], + "not_recommended_models": [], + "routing_notes": "先用 QPI 判断问题类型。如果判定为 Issue,再调用思想考古进行最小充分下潜。" +} +``` + +### 15.3 简单评分规则 + +建议先按 4 类信号评分: + +```text +1. trigger_keywords 命中 +2. input_types 匹配 +3. do_not_call_when 是否触发 +4. pipeline_position 是否适合当前阶段 +``` + +伪规则: + +```text +初始分 = 0 + +命中 trigger_keywords:+0.2 +匹配 input_types:+0.2 +任务阶段匹配 pipeline_position:+0.2 +用户表达中出现复杂性 / 反复失败 / 多主体冲突:+0.2 +模型 selection_priority 高:+0.1 + +命中 negative_triggers:-0.3 +命中 do_not_call_when:-0.5 +``` + +v0.1 只需要返回候选模型和推荐理由,不需要自动生成最终分析。 + +--- + +## 16. 最小 selector_examples.json + +```json +[ + { + "example_id": "selector_example_001", + "user_input": "我们团队每次都说要长期主义,但一到季度 KPI 就回到短期动作,这到底是什么问题?", + "expected_models": [ + "qpi", + "intellectual_archaeology" + ], + "expected_reasoning": "先用 QPI 判断该问题更偏 Issue,再用思想考古分析其激励结构、时间尺度和组织共识。" + }, + { + "example_id": "selector_example_002", + "user_input": "这段代码为什么报错?", + "expected_models": [ + "qpi" + ], + "expected_reasoning": "QPI 应将其判断为偏 Question,但不应继续调用思想考古。" + }, + { + "example_id": "selector_example_003", + "user_input": "我想从一篇文章里抽出一个可复用的认知模型,应该怎么做?", + "expected_models": [ + "intellectual_archaeology", + "qpi" + ], + "expected_reasoning": "该问题涉及模型抽取和隐性知识显性化,思想考古适合主导;QPI 可用于前置判断任务性质。" + }, + { + "example_id": "selector_example_004", + "user_input": "帮我把这句话改得更简洁。", + "expected_models": [], + "expected_reasoning": "这是轻量执行任务,不需要调用 QPI 或思想考古。" + } +] +``` + +--- + +## 17. 稳固性评级规则 v0.1 + +每个模型都要有稳定性评估,不要只写“可信度高 / 中 / 低”。 + +建议从 5 个维度评估: + +```text +概念清晰度 +机制稳定性 +边界清晰度 +来源证据质量 +回归测试表现 +``` + +### 17.1 评分维度 + +| 维度 | 问题 | +| ------ | --------------- | +| 概念清晰度 | 模型的核心概念是否清楚? | +| 机制稳定性 | 模型是否有明确运作机制? | +| 边界清晰度 | 是否知道什么时候不能用? | +| 来源证据质量 | 是否能追溯到文章和关键片段? | +| 回归测试表现 | 是否通过正向、边界、误用测试? | + +### 17.2 等级规则 + +| 等级 | 标准 | +| -- | ---------------- | +| A | 五个维度都较稳定,可进入核心调用 | +| B | 基本可用,但需要边界案例测试 | +| C | 有启发,但系统调用风险较高 | +| D | 不适合进入模型库,需要重构 | + +### 17.3 QPI 当前建议评级 + +```json +{ + "model_id": "qpi", + "stability_level": "B", + "reason": "三分结构清晰,适合作为入口路由模型,但需要补充大量边界案例,防止过度升维或降维。", + "next_stabilization_action": "补充混合问题、误用问题和轻量问题测试。" +} +``` + +### 17.4 思想考古当前建议评级 + +```json +{ + "model_id": "intellectual_archaeology", + "stability_level": "B", + "reason": "纵向下潜机制清晰,适合深度建模,但七层结构和停止条件需要进一步稳定。", + "next_stabilization_action": "补充不同复杂度问题的下潜深度测试,明确最小充分下潜原则。" +} +``` + +--- + +## 18. Codex 开工任务 + +### Task 1:创建工程目录 + +目标: + +```text +创建 model_library_mvp 目录 +按本文档建立 schemas / models / cards / sources / tests / selector / scripts / reports +``` + +验收标准: + +```text +目录结构完整 +README.md 存在 +所有关键目录都有占位说明 +``` + +--- + +### Task 2:创建 JSON Schema + +目标: + +```text +创建: +- model_card.schema.json +- source_article.schema.json +- source_excerpt.schema.json +- regression_case.schema.json +``` + +验收标准: + +```text +schema 可以被 jsonschema 校验工具读取 +必填字段生效 +枚举值生效 +错误数据能被识别 +``` + +--- + +### Task 3:录入两个样板模型 + +目标: + +```text +创建: +- models/qpi.model.json +- models/intellectual_archaeology.model.json +- cards/qpi.card.md +- cards/intellectual_archaeology.card.md +``` + +验收标准: + +```text +两个 JSON 文件通过 model_card.schema.json 校验 +两个 Markdown 卡片可读 +字段与本文档基本一致 +``` + +--- + +### Task 4:创建来源索引和证据片段索引 + +目标: + +```text +创建: +- sources/source_articles.json +- sources/source_excerpts.json +``` + +验收标准: + +```text +source_articles.json 至少包含 QPI 和思想考古的来源记录 +source_excerpts.json 至少包含两个模型各 3 条证据片段 +模型卡中的 source_articles 和 source_evidence 能对应到实际 ID +``` + +--- + +### Task 5:创建回归测试用例 + +目标: + +```text +创建: +- tests/qpi.regression.json +- tests/intellectual_archaeology.regression.json +``` + +验收标准: + +```text +每个模型至少 5 个测试用例 +包含 positive、boundary、misuse 三类 +测试用例通过 regression_case.schema.json 校验 +``` + +--- + +### Task 6:创建校验脚本 + +目标: + +```text +创建: +- scripts/validate_models.py +- scripts/validate_sources.py +- scripts/validate_tests.py +``` + +验收标准: + +```text +能检查 JSON 是否符合 schema +能检查 model_id 是否唯一 +能检查 source_evidence 是否存在 +能检查 regression_tests 是否引用了存在的 model_id +输出 validation_report.md +``` + +--- + +### Task 7:创建最小模型选择器 demo + +目标: + +```text +创建: +- selector/selection_rules.json +- selector/selector_examples.json +- scripts/run_selector_demo.py +``` + +验收标准: + +```text +输入一个问题 +读取两个模型 JSON +根据关键词、输入类型、负向触发条件、selection_priority 返回候选模型 +输出推荐理由 +至少能跑通 selector_examples.json 中的样例 +``` + +--- + +## 19. 验收标准总表 + +Codex 完成后,必须满足: + +```text +1. 项目目录结构完整 +2. schema 文件存在并可校验 +3. QPI 模型 JSON 存在并通过校验 +4. 思想考古模型 JSON 存在并通过校验 +5. 两张人读模型卡存在 +6. 来源文章索引存在 +7. 来源证据片段索引存在 +8. 模型卡引用的 source_id 和 excerpt_id 能找到 +9. 每个模型至少 5 个回归测试用例 +10. 回归测试用例通过 schema 校验 +11. 最小模型选择器能返回推荐模型和理由 +12. README.md 说明如何运行校验和 selector demo +13. reports/validation_report.md 记录校验结果 +``` + +不要求: + +```text +不要求前端界面 +不要求数据库 +不要求向量检索 +不要求真实 LLM 调用 +不要求完整问题回答系统 +不要求自动抽取所有模型 +``` + +--- + +## 20. Codex 返回 ChatGPT 时的交接材料 + +Codex 完成后,请整理一份: + +```text +Codex_工程产物摘要_v0.1.md +``` + +建议包含: + +```markdown +## Codex 工程产物摘要 v0.1 + +### 1. 当前完成阶段 + +### 2. 已创建目录结构 + +### 3. 已创建文件清单 + +### 4. Schema 实现情况 + +### 5. QPI 模型卡实现情况 + +### 6. 思想考古模型卡实现情况 + +### 7. 来源索引实现情况 + +### 8. 回归测试实现情况 + +### 9. 模型选择器实现情况 + +### 10. 校验结果 + +### 11. 与原计划不一致的地方 + +### 12. 当前发现的问题 + +### 13. 需要 ChatGPT / CCRA 判断的问题 + +### 14. 下一步建议 +``` + +你回到 ChatGPT 新会话时,建议上传: + +```text +1. Codex_工程产物摘要_v0.1.md +2. README.md +3. model_card.schema.json +4. qpi.model.json +5. intellectual_archaeology.model.json +6. source_articles.json +7. source_excerpts.json +8. qpi.regression.json +9. intellectual_archaeology.regression.json +10. selector_examples.json +``` + +不要直接上传整个工程目录。 +先让我判断结构是否合理,再决定是否需要看代码细节。 + +--- + +## 21. 下一阶段判断点 + +当 Codex 完成这个样板工程后,下一步不要立刻扩展到 100 多个模型。 + +应该先判断 5 个问题: + +```text +1. 当前模型卡 schema 是否过重? +2. QPI 和思想考古的字段是否足够支撑系统调用? +3. 来源证据片段是否真的能帮助追溯? +4. 回归测试是否能暴露模型误用? +5. 最小模型选择器是否足以推荐 3-5 个候选模型? +``` + +如果这 5 个问题基本通过,下一阶段再做: + +```text +扩展到 5 个核心模型 +→ 扩展到 8-10 个核心模型 +→ 接入最小问题回答链路 +→ 让输入问题经过 QPI、模型选择器、多棱镜分析、冲突汇总、综合洞察输出 +``` + +如果这 5 个问题没有通过,先修 schema 和抽取协议,不要扩展模型数量。 + +--- + +## 22. 给 Codex 的一句话指令 + +可以把下面这段直接放给 Codex: + +```text +请根据《核心模型抽取样板 v0.1》,创建一个 file-first 的 model_library_mvp 工程。不要开发完整后台,不要接数据库,不要做复杂 RAG。第一阶段只需要建立目录结构、JSON Schema、QPI 和思想考古两个样板模型、人读模型卡、来源文章索引、证据片段索引、回归测试用例、校验脚本和最小模型选择器 demo。完成后输出 README.md 和 Codex_工程产物摘要_v0.1.md,说明已完成内容、校验结果、与计划差异和需要下一轮产品判断的问题。 +``` + +--- + +## 23. 最后提醒 + +这个样板工程的成败,不取决于代码复杂度,而取决于一件事: + +> QPI 和思想考古是否真的从“文章里的概念”变成了“系统能稳定调用的认知模型”。 + +所以第一版宁可简陋,也要保证: + +```text +结构清楚 +来源可追溯 +边界可检查 +误用可测试 +后续可扩展 +``` + +这就是模型管理子系统 MVP 的第一块地基。 +```` + +### v0.2 Index 更新策略 + +- Original path: `C:\Users\wangq\Documents\Codex\knowledge-vault\work\internal\强哥的思想宇宙\GPT成果\CCRA_Codex指导意见_Index更新策略与下一轮执行_v0.2_2026-06-16.md` +- SHA256: `a4fff44fa30883986bbbab61e430494cca88869d40b93bf2e4f193dcf133646d` + +````markdown +# CCRA 指导意见:Model/Card Index 更新策略与下一轮执行说明 + +version: 0.2 +date: 2026-06-16 +scope: `model_library_mvp` +target_reader: Codex +status: approved_for_next_execution + +--- + +## 0. 核心结论 + +`model_index.json` 和 `card_index.md` 不应只在“需要时”才全量更新,也不应每次都靠人工全量重写。 + +采用策略: + +```text +每次资产变更必须增量同步索引 ++ +关键节点必须全量重建或全量一致性校验 +``` + +也就是: + +```text +incremental update on every model/card/source/test change ++ +full rebuild / full reconciliation at release, handoff, schema migration, batch expansion, or validation drift +``` + +原因: + +1. `model_index.json` 是机器发现模型的入口。 +2. `card_index.md` 是人读审查模型卡的入口。 +3. 它们不是模型内容本身的唯一真相,但它们是模型库导航、校验、交接和后续 selector 使用的注册表。 +4. 如果索引滞后,ChatGPT / CCRA / Codex 会读到不完整或过期状态。 +5. 如果每次都手工全量更新,随着模型扩展到 8-10 个会增加漂移风险。 + +因此,下一轮应把索引维护从“人工补文档”升级为“可生成、可校验、可审查”的工程规则。 + +--- + +## 1. 当前事实基线 + +当前项目处于 `model_library_mvp` 阶段。 + +已存在两类索引: + +```text +models/model_index.json +cards/card_index.md +``` + +当前长期知识资产中的核心模型地图已经规定: + +```text +models/model_index.json 是机器索引入口 +cards/card_index.md 是人读索引入口 +``` + +当前模型库已有两个样板模型: + +```text +qpi +intellectual_archaeology +``` + +当前两个模型状态均为: + +```text +status: draft +stability_level: B +regression_status: pending +``` + +当前工作重点不是扩展大量模型,而是稳定模型库资产链路: + +```text +source article record +-> source evidence excerpts +-> model JSON +-> Markdown card +-> regression cases +-> selector examples or routing rules +-> model/card index entries +-> validation report +``` + +--- + +## 2. 索引的产品定位 + +### 2.1 model_index.json 的定位 + +`models/model_index.json` 是机器可读的模型注册表。 + +它用于: + +```text +发现当前有哪些模型 +读取模型路径 +读取 card 路径 +读取模型类型 +读取 pipeline position +读取状态、稳固性、回归测试状态 +读取 source / evidence / regression case 数量 +支持 selector、validator、handoff、未来应用层集成 +``` + +它不应承载完整模型内容。完整内容仍在: + +```text +models/*.model.json +cards/*.md +sources/source_articles.json +sources/source_excerpts.json +tests/regression_cases.json +``` + +### 2.2 card_index.md 的定位 + +`cards/card_index.md` 是人读模型卡索引。 + +它用于: + +```text +快速查看模型卡列表 +快速检查模型状态 +帮助 ChatGPT / CCRA / owner 审查模型库 +作为交接文档中的人类入口 +``` + +它不应成为另一个独立维护的内容源。它应该是 `model_index.json` 与模型卡实际存在状态的人读投影。 + +### 2.3 两个索引的关系 + +推荐关系: + +```text +models/*.model.json + cards/*.md + sources/*.json + tests/*.json + ↓ +scripts/rebuild_indexes.py + ↓ +models/model_index.json + ↓ +cards/card_index.md +``` + +解释: + +1. 机器注册表优先生成或校验 `model_index.json`。 +2. 人读索引 `card_index.md` 应从 `model_index.json` 渲染出来。 +3. 如果暂时不做自动生成,也必须用 validator 检查二者一致。 +4. 不允许长期手工维护两个索引而不做漂移检查。 + +--- + +## 3. 更新策略 + +### 3.1 每次必须增量更新的情况 + +只要发生以下任一变更,必须在同一次提交 / 同一轮 Codex 修改中更新索引: + +```text +新增模型 +删除模型 +归档模型 +重命名 model_id +修改 model_name +修改 model_type +修改 pipeline_position +修改 model_file 路径 +修改 card_file 路径 +新增或删除 source article 关联 +新增或删除 source evidence 关联 +新增或删除 regression case +修改 stability_level +修改 regression_status +修改 status +模型从 draft 进入 review / callable / stable 等状态 +card 文件新增、删除、重命名 +``` + +最低要求: + +```text +资产变更不能让 model_index.json 或 card_index.md 滞后一轮。 +``` + +也就是说: + +```text +新增模型时,index entry 必须同时出现。 +删除或归档模型时,index entry 必须同时更新。 +状态变化时,index 中状态必须同时更新。 +``` + +### 3.2 必须全量重建或全量一致性校验的情况 + +以下情况必须运行全量重建或全量校验: + +```text +每次交接给 ChatGPT / CCRA / owner 前 +每次准备 validation_report.md 前 +每次 schema 发生变化后 +每次新增一批模型后 +每次模型路径、目录结构、文件命名规则发生变化后 +每次合并较大范围修改后 +每次 selector 规则依赖模型索引前 +每次模型状态准备升级前,例如 draft -> reviewed / callable / stable +每次发现 index drift、dangling reference、orphan file 后 +``` + +建议节奏: + +```text +单模型变更:增量更新 + full check +批量变更:最后 full rebuild + full check +交接节点:必须 full rebuild/check +版本节点:必须 full rebuild/check +``` + +### 3.3 不建议的做法 + +不建议: + +```text +只在最后需要交付时才补一次 index +每次手工全量重写两个 index +把 card_index.md 当作独立内容源手工维护 +让 model_index.json 与模型 JSON 状态不一致 +让 regression_case_count 手工估算 +让 source_evidence_count 手工估算 +只靠 README 说明当前模型列表 +``` + +--- + +## 4. 下一轮 Codex 执行任务 + +### 4.1 新增索引维护协议文档 + +新增: + +```text +docs/INDEX_MAINTENANCE_PROTOCOL.md +``` + +内容应包含: + +```text +index 的定位 +增量更新触发条件 +全量重建触发条件 +model_index.json 字段来源 +card_index.md 生成规则 +drift 检查规则 +Codex 修改模型时的 checklist +``` + +### 4.2 新增索引重建脚本 + +新增: + +```text +scripts/rebuild_indexes.py +``` + +功能要求: + +1. 扫描 `models/*.model.json`,排除 `models/model_index.json`。 +2. 对每个模型读取以下字段: + +```text +model_id +model_name +model_type +pipeline_position +stability_profile.stability_level +regression_status +status +version +last_updated +``` + +3. 检查对应 card 是否存在。 +4. 从模型 JSON 的 `source_articles` 计算 `source_article_count`。 +5. 从模型 JSON 的 `source_evidence` 计算 `source_evidence_count`。 +6. 从 `tests/regression_cases.json` 计算 `regression_case_count`。 +7. 生成或更新: + +```text +models/model_index.json +cards/card_index.md +``` + +8. 输出 report: + +```text +reports/index_rebuild_report.md +``` + +9. 支持两种模式: + +```powershell +python scripts\rebuild_indexes.py --check +python scripts\rebuild_indexes.py --write +``` + +要求: + +```text +--check 只检查,不写文件;发现漂移时返回非零退出码。 +--write 重新生成 index 文件。 +``` + +### 4.3 扩展 validate_model_library.py + +修改: + +```text +scripts/validate_model_library.py +``` + +新增校验项: + +```text +model_index.json 中每个 model_file 必须存在 +model_index.json 中每个 card_file 必须存在 +每个 models/*.model.json 必须有 index entry +每个 cards/*.md 必须有 card_index entry +card_index.md 中每个条目必须能在 model_index.json 找到 +source_article_count 必须与模型 JSON source_articles 数量一致 +source_evidence_count 必须与模型 JSON source_evidence 数量一致 +regression_case_count 必须与 tests/regression_cases.json 中同 model_id 数量一致 +stability_level 必须与模型 JSON stability_profile.stability_level 一致 +regression_status 必须与模型 JSON regression_status 一致 +status 必须与模型 JSON status 一致 +``` + +### 4.4 明确 index 字段来源 + +`model_index.json` 中字段来源如下: + +| index 字段 | 来源 | +|---|---| +| `model_id` | `models/*.model.json.model_id` | +| `model_name` | `models/*.model.json.model_name` | +| `model_type` | `models/*.model.json.model_type` | +| `pipeline_position` | `models/*.model.json.pipeline_position` | +| `model_file` | 文件路径 | +| `card_file` | 按模型 ID 匹配或模型 JSON 中显式字段;若没有则按约定推断 | +| `source_article_count` | `source_articles` 数组长度 | +| `source_evidence_count` | `source_evidence` 数组长度 | +| `regression_case_count` | `tests/regression_cases.json` 中同 `model_id` 的 case 数 | +| `stability_level` | `stability_profile.stability_level` | +| `regression_status` | `regression_status` | +| `status` | `status` | +| `last_updated` | `last_updated` | + +### 4.5 card_index.md 生成规则 + +`card_index.md` 应从 `model_index.json` 渲染生成。 + +表格字段保持当前简单结构: + +```text +Model ID +模型名称 +类型 +流程位置 +Card +Model JSON +稳固性 +回归状态 +状态 +``` + +可追加但非必须字段: + +```text +source evidence count +regression case count +last_updated +``` + +v0.2 不建议把 card_index.md 做得太复杂。 + +--- + +## 5. 状态升级规则 + +索引维护不能自动把模型升级为 stable。 + +Codex 可以根据文件内容同步: + +```text +status +stability_level +regression_status +``` + +但不能自行判断模型升级。 + +升级必须由 owner / ChatGPT / CCRA 审查后明确决定。 + +禁止: + +```text +因为 schema pass 就把 status 改成 stable +因为 regression case 数量增加就把 regression_status 改成 passed +因为 index 一致就把 stability_level 从 B 改成 A +``` + +当前 QPI 和思想考古仍保持: + +```text +status: draft +stability_level: B +regression_status: pending +``` + +直到内容审查、边界测试和 selector 回归测试完成。 + +--- + +## 6. 验收标准 + +Codex 完成后,应满足: + +```powershell +python scripts\rebuild_indexes.py --check +python scripts\check_card_contract.py +python scripts\validate_model_library.py +python scripts\run_selector_demo.py +python -m unittest discover -s tests -p "test*.py" -v +``` + +全部通过。 + +同时生成或更新: + +```text +docs/INDEX_MAINTENANCE_PROTOCOL.md +scripts/rebuild_indexes.py +reports/index_rebuild_report.md +reports/validation_report.md +models/model_index.json +cards/card_index.md +``` + +验收时重点检查: + +```text +没有 orphan model JSON +没有 orphan card +没有 dangling model_file +没有 dangling card_file +没有 source evidence 计数漂移 +没有 regression case 计数漂移 +model_index.json 与 card_index.md 状态一致 +validation_report.md 明确写出 index check 结果 +``` + +--- + +## 7. 下一步工作边界 + +本轮只做索引维护与校验机制,不做: + +```text +数据库 +后台 UI +自动抽取 100 个模型 +LLM selector +完整 RAG +跨仓库同步器 +公开产品功能 +``` + +可以做: + +```text +索引维护协议 +索引重建脚本 +索引一致性校验 +validation report 扩展 +README / handoff 中补充索引维护说明 +``` + +--- + +## 8. 给 Codex 的执行口径 + +请按以下顺序执行: + +```text +1. 阅读现有 README、model_index.json、card_index.md、validate_model_library.py、check_card_contract.py。 +2. 新增 docs/INDEX_MAINTENANCE_PROTOCOL.md。 +3. 实现 scripts/rebuild_indexes.py,支持 --check 和 --write。 +4. 用 --write 生成当前 model_index.json 与 card_index.md。 +5. 扩展 validate_model_library.py 的 index drift 检查。 +6. 运行全部验证命令。 +7. 更新 reports/validation_report.md。 +8. 在交接文档中说明:索引采用“每次增量同步 + 关键节点全量重建/校验”策略。 +``` + +提交完成后,把以下信息交回: + +```text +变更文件列表 +索引重建结果 +校验命令结果 +是否发现 drift +是否有字段需要 owner 决策 +是否保持 QPI / 思想考古为 draft + B + pending +``` + +--- + +## 9. CCRA 判断 + +当前索引策略的核心不是“省事”,而是避免模型库变成一堆散文件。 + +`model_index.json` 和 `card_index.md` 是模型库进入可维护状态的最小导航层。 +它们必须跟随内容资产同步更新,但又不能靠人工长期维护。 +因此 v0.2 的正确方向是:让 Codex 把索引更新变成脚本化、可检查、可交接的工程约束。 +```` + +### v0.3 内容稳定化 + +- Original path: `C:\Users\wangq\Documents\Codex\knowledge-vault\work\internal\强哥的思想宇宙\GPT成果\CCRA_Codex指导意见_模型库MVP第二轮内容稳定化_v0.3_2026-06-16.md` +- SHA256: `6a4a653602cc467b0a7fbb52765336e75e4109b8af2c0d5bd5aa584dcb86464c` + +````markdown +# CCRA 给 Codex 的指导意见:模型库 MVP 第二轮内容稳定化与质量补强 v0.3 + +日期:2026-06-16 +适用仓库:`model_library_mvp` +适用阶段:QPI / 思想考古学两个样板模型进入内容稳定化审查 +执行者:Codex +上游判断者:CCRA / ChatGPT / Owner + +--- + +## 0. 一句话结论 + +本轮不要扩展第三个模型,也不要接入完整问题回答系统。 +当前应从“文件和 contract 能跑通”推进到“证据链、边界、回归测试、selector 误召回防护能站住”。 + +两个此前遗漏的文件已经补齐: + +```text +models/qpi.model.json +sources/source_excerpts.json +``` + +这解决了第一轮审查中的“QPI 机器卡缺失”和“证据片段索引缺失”问题。 +但补齐文件后,当前工作暴露出新的质量债:模型内容仍是 `draft`,证据支撑还没有做到字段级,回归测试仍是样板级,selector 还不能证明“选得准、不误召回、不乱下潜”。 + +--- + +## 1. 当前状态确认 + +### 1.1 已经可以确认通过的部分 + +当前工程方向继续确认通过: + +```text +file-first 架构:通过 +JSON 作为机器可读模型数据:通过 +Markdown 作为人读模型卡:通过 +QPI / 思想考古两个样板模型:通过工程 contract +source_articles / source_excerpts:已补齐 +model_index / card_index:当前两模型条目与数量基本一致 +回归测试容器:已存在 +最小 selector demo:已存在 +``` + +### 1.2 不能确认通过的部分 + +以下内容不能升级为 stable: + +```text +QPI 内容稳定性:不能通过,只能保持 draft-callable +思想考古学内容稳定性:不能通过,只能保持 draft-callable +source evidence 字段级充分性:不能通过 +regression cases 稳定性验证强度:不能通过 +selector 选择准确性:不能通过 +内容审查闭环:不能通过 +``` + +当前正确状态应是: + +```text +engineering_contract_passed = true +content_review_status = pending +evidence_review_status = pending +selector_review_status = pending +stability_level = B +regression_status = pending +model_status = draft +``` + +不要把 `validation_report: PASS` 理解为模型内容已稳定。它只代表字段、引用和基础 contract 能跑通。 + +--- + +## 2. 本轮发现的主要不足 + +### 2.1 证据链仍然停留在“片段存在”,没有进入“字段级支撑” + +当前每个模型都有 5 条 source evidence,数量满足 v0.1 样板要求。 +但现在的 `used_for` 只覆盖了部分字段,很多系统调用关键字段仍属于产品推导、红队推导或人工判断,没有被显式标记。 + +需要区分四类支撑来源: + +```text +direct_source:原文直接支撑 +derived_from_source:从原文合理推导 +product_decision:产品化调用规则 +red_team_inference:红队边界或误用推导 +owner_decision:Owner / CCRA 的人工决策 +``` + +当前不足不是“没有证据”,而是“没有标明哪些字段是原文直接支撑,哪些是产品化推导”。 + +### 2.2 `raw_excerpt` 需要区分“原文摘录”和“压缩摘录” + +当前 `source_excerpts.json` 中,部分 `raw_excerpt` 不是完整原文摘录,而是压缩表达。 +例如思想考古七层结构片段使用了省略号: + +```text +第一层(应用层)...第七层(哲学基岩层) +``` + +如果字段名叫 `raw_excerpt`,就应尽量是原文准确摘录;如果为了节省篇幅而压缩,必须显式标记。 + +建议新增或规范字段: + +```json +{ + "quote_status": "exact | condensed | paraphrased", + "raw_excerpt": "原文准确摘录;如果不是 exact,不应伪装成完整原文", + "summary": "摘要或解释", + "source_location": "章节、段落、标题或行号,若未知则写 unknown" +} +``` + +验收要求: + +```text +quote_status = exact 时,raw_excerpt 不应包含无说明的 “...” 或 “……” +quote_status = condensed 时,必须保留 summary,并在 notes 说明已压缩 +``` + +### 2.3 source schema 枚举可能已经和实现数据漂移 + +当前实现数据里出现了以下值: + +```text +source_type: synthesis_note +source_status: derived_synthesis +excerpt_type: application_rule / value_claim / boundary_rule / validation_rule +``` + +这些值有产品意义,可以保留。 +但 Codex 必须确认本地 schema 是否已经支持它们。 + +执行规则: + +```text +如果 schema 已支持这些枚举: + 更新 docs 和 knowledge_assets 中的 schema 摘要,避免长期文档落后。 + +如果 schema 未支持这些枚举: + 不要静默绕过校验。 + 要么将数据映射回既有枚举; + 要么正式扩展 schema,并在 DECISIONS / docs 中记录原因。 +``` + +不能出现“数据中有一套枚举,schema 文档中是另一套枚举”的隐性漂移。 + +### 2.4 QPI 的输出契约还不够硬 + +`qpi.model.json` 的 `core_mechanism` 已经提到: + +```text +问题拥有者 +问题来源 +时间尺度 +核心匮乏物 +暴力降维 / 恶意升维 / 手段错配 +``` + +但当前 `output_types` 和 `output_contract` 还没有强制这些字段。 +这会导致 QPI 在真实问题中输出仍然偏“解释性”,不足以支撑稳定路由。 + +QPI 必须新增或强化结构化输出字段: + +```json +{ + "problem_owner": "谁的问题", + "problem_source": "问题从哪里被提出,是否可能带有立场或甩锅框架", + "time_scale": "short_term | mid_term | long_term | mixed | unknown", + "scarcity_profile": { + "data_scarcity": "high | medium | low | unknown", + "path_or_resource_scarcity": "high | medium | low | unknown", + "consensus_or_order_scarcity": "high | medium | low | unknown" + }, + "dominant_scarcity": "data | path_resource | consensus_order | mixed | unknown", + "classification": "question | problem | issue | mixed | no_call", + "classification_confidence": "high | medium | low", + "evidence_gap": ["还缺哪些信息才能稳定判断"], + "misclassification_risk": ["可能被暴力降维、恶意升维或手段错配的风险"], + "recommended_next_step": "检索 / 工程拆解 / 共识协调 / 补充上下文 / 不调用", + "next_model_candidates": ["后续可调用模型 ID"] +} +``` + +这不要求立即开发完整运行时,只要求模型卡、JSON 和回归测试先按这个契约准备好。 + +### 2.5 思想考古学的停止条件还没有足够可测试 + +思想考古学保留七层结构是正确的,但不能默认全量七层展开。 +当前 `depth_control.stop_conditions` 已经存在,但还需要变成可测试输出。 + +思想考古学必须新增或强化结构化输出字段: + +```json +{ + "should_call": true, + "entry_reason": "为什么值得进入思想考古", + "recommended_max_depth": "application | domain | process | purpose | core_mechanism | human_capability | philosophical_bedrock", + "layers_to_analyze": ["实际需要分析的层级"], + "stop_reason": "为什么停在这一层", + "no_deeper_reason": "继续下潜不会改变什么", + "assumptions_by_layer": { + "application": [], + "domain": [], + "process": [], + "purpose": [], + "core_mechanism": [], + "human_capability": [], + "philosophical_bedrock": [] + }, + "validation_needed": ["哪些判断需要现实反馈、数据、专家盲审或红队"], + "action_implication": "下潜结果如何改变下一步行动" +} +``` + +重点不是让输出更复杂,而是防止思想考古变成“自动哲学化”。 + +### 2.6 regression cases 仍是样板级,不能证明模型稳定 + +当前每个模型 5 条用例,满足 v0.1 最低要求,但不足以支撑 B 级以上稳定调用。 + +下一轮最低目标: + +```text +每个模型至少 15 条 regression cases +``` + +建议结构: + +```text +QPI: +- 3 条 Question 正例 +- 3 条 Problem 正例 +- 3 条 Issue 正例 +- 3 条 mixed / boundary 案例 +- 2 条 misuse 案例:恶意升维、暴力降维 +- 1 条 no-call 案例:明确事实查询 / 纯改写 / 直接执行 + +思想考古学: +- 3 条重型正例 +- 3 条中型正例:只下潜到目的层或核心机理层 +- 3 条 no-call / minimum-depth 案例 +- 3 条 misuse 案例:过度哲学化、无现实验证、层级跳跃 +- 2 条 selector gate 案例:QPI 不应放行或只应轻量放行 +- 1 条模型抽取场景案例 +``` + +### 2.7 regression cases 还不够机器可评估 + +当前 case 主要是自然语言 `expected_behavior` 和 `expected_output_elements`。这适合人审,但不够支撑 selector / model behavior 自动检查。 + +建议在 `regression_case.schema.json` 中新增可选 v0.2 字段: + +```json +{ + "should_call_model": true, + "expected_primary_model": "qpi", + "negative_expected_models": ["intellectual_archaeology"], + "expected_classification": "question | problem | issue | mixed | no_call | not_applicable", + "expected_dominant_scarcity": "data | path_resource | consensus_order | mixed | unknown | not_applicable", + "expected_max_depth": "application | domain | process | purpose | core_mechanism | human_capability | philosophical_bedrock | no_call | not_applicable", + "minimum_required_elements": ["必须出现的输出元素"], + "forbidden_elements": ["不应出现的输出元素"], + "evaluation_mode": "manual | keyword | structured | semantic" +} +``` + +v0.2 不必马上做复杂 LLM 评测,但数据结构要先为自动评估留接口。 + +### 2.8 selector 仍停留在 demo,不足以证明选择准确 + +selector v0.1 可以继续规则化,不要现在加入 LLM。 +但必须增强以下能力: + +```text +negative trigger 先行 +no-call threshold +QPI-before-IA gate +score breakdown +rejected model reasons +selector regression tests +``` + +建议 selector 输出格式: + +```json +{ + "input": "...", + "selected_models": [ + { + "model_id": "qpi", + "score": 0.86, + "reasons": ["trigger keyword matched", "pipeline_position pre_analysis"], + "penalties": [], + "decision": "selected" + } + ], + "rejected_models": [ + { + "model_id": "intellectual_archaeology", + "score": 0.21, + "reasons": [], + "penalties": ["negative trigger: 只查事实", "no QPI heavy-problem gate"], + "decision": "rejected" + } + ], + "no_call": false +} +``` + +重点是让 Codex 能用 regression cases 验证: + +```text +不该调用思想考古时,不能因为“深层、底层、模型”等词误召回。 +明确事实查询时,QPI 也不应过度分析。 +``` + +### 2.9 Markdown card 与 JSON model card 需要语义同步检查 + +当前 `check_card_contract.py` 主要检查 Markdown 章节是否存在。 +它不能证明 Markdown 和 JSON 的关键字段语义一致。 + +需要新增: + +```text +scripts/check_model_card_sync.py +``` + +至少检查: + +```text +model_id +model_name +model_type +pipeline_position +source_articles +source_evidence +stability_level +regression_status +version +last_updated +output_contract 摘要 +depth_control / 停止条件摘要 +``` + +v0.2 只做硬字段一致性即可,中文长文本不做完全相等检查。 + +### 2.10 状态门不够细 + +当前 `status: draft` 太粗。建议不一定立刻改 schema,但至少在报告中明确四个状态: + +```text +engineering_contract_status +content_review_status +evidence_review_status +regression_review_status +selector_review_status +``` + +示例: + +```json +{ + "model_id": "qpi", + "engineering_contract_status": "passed", + "content_review_status": "needs_minor_revision", + "evidence_review_status": "needs_field_level_matrix", + "regression_review_status": "needs_expansion", + "selector_review_status": "needs_no_call_tests" +} +``` + +先放在 `reports/content_review_report_v0.2.md` 或 `reports/model_review_status.json`,不急着塞进 `model_index.json`。 + +--- + +## 3. 本轮 Codex 执行任务 + +### Task 0:先跑现有基线,不改内容 + +先运行现有命令并记录结果: + +```powershell +python -m unittest discover -s tests -p "test*.py" -v +python scripts\check_card_contract.py +python scripts\validate_model_library.py +python scripts\run_selector_demo.py +``` + +输出: + +```text +reports/baseline_before_content_stabilization_v0.2.md +``` + +报告中说明: + +```text +当前模型数量 +当前 source evidence 数量 +当前 regression cases 数量 +当前 selector 示例数量 +当前 model/card index 状态 +当前 PASS 代表什么、不代表什么 +``` + +--- + +### Task 1:新增内容稳定化协议 + +创建: + +```text +docs/CONTENT_STABILIZATION_PROTOCOL.md +``` + +必须写清楚: + +```text +1. 工程 contract 通过不等于内容稳定。 +2. 模型从 draft 升级必须经过: + - evidence review + - content review + - regression review + - selector review + - owner / CCRA review +3. QPI 和思想考古保持 B / pending / draft。 +4. 不引入第三模型,直到两个样板模型通过本轮内容稳定化。 +``` + +--- + +### Task 2:建立字段级 evidence coverage matrix + +创建: + +```text +reports/evidence_coverage_report_v0.2.md +sources/evidence_coverage.matrix.json +``` + +`evidence_coverage.matrix.json` 建议结构: + +```json +{ + "model_id": "qpi", + "field_coverage": [ + { + "field": "core_mechanism", + "support_type": "direct_source", + "excerpt_ids": ["excerpt_qpi_primary_spectrum_001"], + "coverage_status": "supported", + "notes": "Q/P/I 和核心匮乏物有原文直接支撑。" + }, + { + "field": "negative_triggers", + "support_type": "product_decision", + "excerpt_ids": [], + "coverage_status": "derived", + "notes": "来源于产品化防误用规则,不是原文直接表达。" + } + ] +} +``` + +coverage_status 枚举建议: + +```text +supported +partially_supported +derived +unsupported +needs_owner_review +``` + +验收标准: + +```text +每个模型至少覆盖 model_card.schema.json 的 required 字段。 +每个 required 字段都必须被标记为 supported / derived / needs_owner_review 等状态。 +不要求所有字段都有原文直接证据,但必须诚实标注。 +``` + +--- + +### Task 3:修复 source evidence 精确性与枚举一致性 + +检查并修复: + +```text +sources/source_excerpts.json +schemas/source_excerpt.schema.json +schemas/source_article.schema.json +docs/MODEL_EXTRACTION_RULES.md +knowledge_assets/03_核心模型抽取样板.md(如存在对应摘要) +``` + +具体要求: + +```text +1. 为 source excerpt 增加 quote_status 或等价字段。 +2. raw_excerpt 如非准确原文,不得伪装成完整原文。 +3. 检查 excerpt_type 是否被 schema 正式允许。 +4. 检查 source_type / source_status 是否被 schema 正式允许。 +5. 对 synthesis_note / derived_synthesis 明确说明它们是综合材料,不等于原始主证据。 +``` + +--- + +### Task 4:强化 QPI 机器输出契约与模型卡 + +修改: + +```text +models/qpi.model.json +cards/qpi.md +``` + +必须补入或强化: + +```text +problem_owner +problem_source +time_scale +scarcity_profile +dominant_scarcity +classification_confidence +evidence_gap +misclassification_risk +recommended_next_step +next_model_candidates +``` + +建议位置: + +```text +output_types +output_contract +depth_control +stabilization_path +example_outputs +``` + +验收标准: + +```text +QPI 输出不再只是“判断类型 + 理由”,而是能产出稳定路由所需字段。 +QPI 对 mixed 案例必须先标 evidence_gap,再判断 dominant_scarcity。 +QPI 对事实查询和纯执行任务能输出 no_call / stop。 +``` + +--- + +### Task 5:强化思想考古的深度控制与停止门 + +修改: + +```text +models/intellectual_archaeology.model.json +cards/intellectual_archaeology.md +``` + +必须补入或强化: + +```text +should_call +entry_reason +recommended_max_depth +layers_to_analyze +stop_reason +no_deeper_reason +assumptions_by_layer +validation_needed +action_implication +``` + +验收标准: + +```text +思想考古保留七层结构,但每次调用必须说明最多下潜到哪一层。 +如果不应调用,必须能说明不调用原因。 +如果停止在过程层 / 目的层 / 核心机理层,不能继续自动展开到哲学基岩。 +输出必须回到行动、验证或模型稳定化判断。 +``` + +--- + +### Task 6:扩展并拆分 regression cases + +当前可以保留聚合文件,但 v0.2 要增加按模型拆分文件: + +```text +tests/qpi.regression.json +tests/intellectual_archaeology.regression.json +tests/regression_cases.json +``` + +规则: + +```text +按模型文件是人审 source of truth。 +聚合文件可以由脚本生成,用于统一校验。 +``` + +数量要求: + +```text +qpi >= 15 cases +intellectual_archaeology >= 15 cases +``` + +类型至少包含: + +```text +positive +boundary +misuse +no_call +selector_gate +pipeline +``` + +如果暂时不改 schema enum,则先把新增类型放在 notes 或扩展 schema 后再录入。不要把 no_call / selector_gate 硬塞进 boundary 里导致语义不清。 + +--- + +### Task 7:增强 regression schema 的可评估字段 + +修改: + +```text +schemas/regression_case.schema.json +``` + +新增 v0.2 可选字段: + +```json +[ + "should_call_model", + "expected_primary_model", + "negative_expected_models", + "expected_classification", + "expected_dominant_scarcity", + "expected_max_depth", + "minimum_required_elements", + "forbidden_elements", + "evaluation_mode" +] +``` + +验收标准: + +```text +旧用例仍可通过。 +新增用例能表达 no-call、误召回、最大下潜层级和禁止输出项。 +validator 能检查字段类型和 model_id 引用。 +``` + +--- + +### Task 8:强化 selector v0.2,但不引入 LLM + +修改或新增: + +```text +selector/selector_rules.json +selector/selector_examples.json +scripts/run_selector_demo.py +scripts/run_selector_regression.py +``` + +selector 规则必须包含: + +```text +negative trigger 先行 +no-call threshold +QPI-before-IA gate +score breakdown +rejected model reasons +``` + +新增 selector regression: + +```text +从 tests/*.regression.json 读取 no_call / selector_gate / pipeline cases。 +验证 selected_models 和 rejected_models 是否符合预期。 +输出 reports/selector_regression_report_v0.2.md。 +``` + +不得做: + +```text +不接 LLM +不接向量库 +不做完整问题回答系统 +不做复杂 agent runtime +``` + +--- + +### Task 9:新增 JSON / Markdown 同步检查器 + +创建: + +```text +scripts/check_model_card_sync.py +reports/model_card_sync_report_v0.2.md +``` + +检查: + +```text +model_id +model_name +model_type +pipeline_position +source_articles +source_evidence +stability_level +regression_status +version +last_updated +关键 output_contract 条目是否在 Markdown 中有对应说明 +关键 depth_control / 停止条件是否在 Markdown 中有对应说明 +``` + +验收标准: + +```text +QPI 和思想考古都通过硬字段同步检查。 +如果中文长文本不能完全同步,也要在 report 中列出人工审查项。 +``` + +--- + +### Task 10:生成内容审查报告和下一步状态表 + +创建: + +```text +reports/content_review_report_v0.2.md +reports/model_review_status.json +reports/next_action_register_v0.2.md +``` + +`content_review_report_v0.2.md` 必须包含: + +```text +1. 本轮修改摘要 +2. QPI 内容审查结果 +3. 思想考古内容审查结果 +4. evidence coverage 结论 +5. regression coverage 结论 +6. selector regression 结论 +7. 仍未解决的问题 +8. 是否允许进入 draft-callable +9. 是否允许升级 stable +10. 是否允许扩展第三模型 +``` + +默认结论应保持: + +```text +draft-callable: allowed +stable: not allowed +third_model_expansion: not allowed +``` + +除非 owner / CCRA 明确改判。 + +--- + +## 4. 本轮验收标准 + +Codex 完成后,必须满足: + +```text +1. 现有工程命令仍全部 PASS。 +2. 新增 content stabilization protocol。 +3. 完成字段级 evidence coverage matrix。 +4. source excerpt 的 raw / condensed / paraphrased 状态明确。 +5. schema 与实现枚举一致。 +6. QPI 输出契约包含 problem_owner、time_scale、dominant_scarcity、evidence_gap。 +7. 思想考古输出契约包含 recommended_max_depth、stop_reason、no_deeper_reason。 +8. 每个模型 regression cases >= 15。 +9. selector 能输出 score breakdown 和 rejected model reasons。 +10. 新增 selector regression report。 +11. 新增 JSON / Markdown 同步检查报告。 +12. 生成 content_review_report_v0.2.md。 +13. model_index / card_index 按上一份 CCRA index 指导意见同步更新或通过 --check。 +14. QPI / 思想考古仍保持 B / pending / draft,除非 CCRA 明确升级。 +``` + +--- + +## 5. 不要做的事情 + +本轮不要做: + +```text +不要扩展第三个模型 +不要录入 8-10 个模型 +不要接入完整问题回答链路 +不要接 LLM selector +不要接向量数据库 +不要做前端或后台管理页面 +不要做知识图谱 +不要把 regression_status 改成 passed +不要把 stability_level 改成 A +不要把 draft 改成 stable +``` + +本轮目标只有一个: + +```text +把 QPI 和思想考古两个样板模型,从“工程可运行”推进到“内容可审查、证据可追溯、误用可测试、selector 可防误召回”。 +``` + +--- + +## 6. 给 Codex 的执行顺序建议 + +建议严格按顺序执行: + +```text +1. 跑 baseline report +2. 写 CONTENT_STABILIZATION_PROTOCOL +3. 做 evidence coverage matrix +4. 修 source evidence 精确性和 schema 枚举 +5. 修 QPI 输出契约 +6. 修思想考古停止门 +7. 扩展 regression schema +8. 扩展 regression cases +9. 强化 selector +10. 加 JSON / Markdown sync checker +11. 跑全量 validation +12. 生成 content_review_report_v0.2 +13. 更新 indexes 或运行 index --check +14. 输出 Codex 交接摘要 +``` + +如果中途发现 schema 改动会牵连过大,优先保留 backward compatibility,新增字段设为 optional,不要破坏现有 v0.1 数据。 + +--- + +## 7. Codex 交接时必须返回的文件 + +完成后请返回或汇总以下文件: + +```text +docs/CONTENT_STABILIZATION_PROTOCOL.md +reports/baseline_before_content_stabilization_v0.2.md +reports/evidence_coverage_report_v0.2.md +sources/evidence_coverage.matrix.json +models/qpi.model.json +cards/qpi.md +models/intellectual_archaeology.model.json +cards/intellectual_archaeology.md +tests/qpi.regression.json +tests/intellectual_archaeology.regression.json +tests/regression_cases.json +schemas/regression_case.schema.json +schemas/source_excerpt.schema.json +selector/selector_rules.json +selector/selector_examples.json +scripts/check_model_card_sync.py +scripts/run_selector_regression.py +reports/selector_regression_report_v0.2.md +reports/model_card_sync_report_v0.2.md +reports/content_review_report_v0.2.md +reports/model_review_status.json +reports/next_action_register_v0.2.md +``` + +交接摘要必须明确回答: + +```text +1. 当前 QPI 是否仍为 draft? +2. 当前思想考古是否仍为 draft? +3. 每个模型 evidence coverage 哪些字段是 supported,哪些是 derived? +4. 每个模型 regression cases 数量与类型分布是什么? +5. selector 有哪些 no-call / false-positive 防护? +6. 哪些问题仍需要 CCRA / Owner 判断? +7. 是否建议进入第三模型扩展?默认答案应为否。 +``` +```` + +## 3. Compliance Matrix + +| Guidance | Requirement | Done / Not Done / Partial | Evidence File | Notes | +| --- | --- | --- | --- | --- | +| v0.3 | 不扩展第三模型 | Done | `reports/content_review_report_v0.2.md` | 保持两模型 | +| v0.3 | 不接完整问题回答系统 | Done | `reports/content_review_report_v0.2.md` | 未新增问答链路 | +| v0.3 | 不引入 LLM selector | Done | `selector/selector_rules.json`; `scripts/run_selector_demo.py` | selector v0.2 remains rule-based | +| v0.3 | 不升级 stable | Done | `models/model_index.json`; model JSON files | 两模型 draft / B / pending | +| v0.3 | 字段级 evidence coverage matrix | Done | `sources/evidence_coverage.matrix.json` | required fields classified | +| v0.3 | source excerpt 精确性修复 | Done | `sources/source_excerpts.json`; `schemas/source_excerpt.schema.json` | quote_status/source_location added | +| v0.3 | QPI 输出契约强化 | Done | `models/qpi.model.json`; `cards/qpi.md` | problem_owner/time_scale/dominant_scarcity/evidence_gap included | +| v0.3 | 思想考古停止门强化 | Done | `models/intellectual_archaeology.model.json`; `cards/intellectual_archaeology.md` | recommended_max_depth/stop_reason/no_deeper_reason included | +| v0.3 | 每模型 regression >= 15 | Done | `tests/qpi.regression.json`; `tests/intellectual_archaeology.regression.json` | 17 each | +| v0.3 | selector v0.2 防误召回 | Done | `reports/selector_regression_report_v0.2.md` | 9 selector cases PASS | +| v0.3 | JSON / Markdown 同步检查 | Done | `reports/model_card_sync_report_v0.2.md` | hard-field sync PASS | +| v0.2 | index rebuild/check script | Done | `scripts/rebuild_indexes.py` | --check / --write supported | +| v0.2 | index drift check | Done | `reports/index_check_report.md`; `reports/index_rebuild_report.md` | PASS | +| v0.2 | model/card index synchronized | Done | `models/model_index.json`; `cards/card_index.md` | counts updated | +| v0.1 | file-first JSON/Markdown MVP | Done | `README.md`; assets | no DB/frontend/backend | + +## 4. Deviations From Guidance + +- `draft-callable` remains a report conclusion, not a model JSON status value. +- `reports/*_v0.2.md` files are canonical; no-version aliases were added for audit convenience. +- Full source files are included in `02_CURRENT_ASSET_PACK.md`; optional zip is only backup. + +## 5. Open Decisions For CCRA + +- See `reports/open_questions_for_CCRA.md` and section 10 of `03_REPORTS_DIFF_AND_COMMAND_LOG.md`. diff --git a/ccra_review_bundle/round-02_2026-06-16_second-audit/02_CURRENT_ASSET_PACK.md b/ccra_review_bundle/round-02_2026-06-16_second-audit/02_CURRENT_ASSET_PACK.md new file mode 100644 index 0000000..071903f --- /dev/null +++ b/ccra_review_bundle/round-02_2026-06-16_second-audit/02_CURRENT_ASSET_PACK.md @@ -0,0 +1,1626 @@ +# Current Asset Pack + +This file replaces separate upload of current asset files. Each section includes original path and SHA256. + +===== FILE: README.md ===== + +- Original path: `README.md` +- SHA256: `b8f70b6119cd6400148dd39316ff5c4b3e24d30e79705c445b9b5bd759eb3868` + +````markdown +# The Mindscape of Bro Tsong + +Project: The Mindscape of Bro Tsong + +Current phase: `model_library_mvp` + +Current subsystem: Model Library / Model Management MVP + +## 1. Project Definition + +This project is a file-first MVP for a cognitive model library. + +It turns core cognitive models into structured, traceable, callable, and testable model assets. + +The first version validates the workflow with two sample models: + +- QPI +- Intellectual Archaeology + +## 2. What This Project Is + +This project is: + +- A model asset library +- A model card system +- A source evidence index +- A regression test container +- A minimal model selection demo foundation +- A foundation for a future question-answering / cognitive processing system + +## 3. What This Project Is Not + +This project is not: + +- A full model management platform +- A public SaaS product +- A user-facing application +- A complete knowledge graph +- A full RAG system +- A commercial platform +- A multi-user collaboration system +- A complete question-answering system + +## 4. Current MVP Goal + +The current MVP tests whether a small number of core cognitive models can be represented as: + +- Human-readable model cards +- Machine-readable JSON model specs +- Source article records +- Source evidence excerpts +- Regression test cases +- Minimal selector inputs and outputs + +## 5. First Sample Models + +### QPI + +QPI is a routing model that classifies a user input as: + +- Question: lack of information +- Problem: lack of path or method +- Issue: lack of stability, consensus, or dynamic balance + +### Intellectual Archaeology + +Intellectual Archaeology is a deep modeling model that analyzes a topic through multiple depth layers, from surface application to mechanism, purpose, human capability, and philosophical assumptions. + +## 6. Repository Structure + +```text +docs/ Project rules, contracts, workflow notes, decisions, non-goals, and handoff templates. +schemas/ JSON Schema files for model specs, source records, source excerpts, and regression cases. +models/ Machine-readable JSON model specifications. +cards/ Human-readable Markdown model cards. +sources/ Source article records and source evidence excerpts. +tests/ Regression cases for model use, misuse, and boundary checks. +selector/ Rule-based selector configuration and examples. +scripts/ Local validation and selector demo scripts. +reports/ Validation reports, extraction notes, and concrete session handoffs. +knowledge_assets/ Stable long-term reusable knowledge distilled from local project artifacts. +``` + +## 7. Data Format + +The project uses JSON as the machine-readable source format. + +Markdown files are used for human-readable model cards and documentation. + +## 8. Validation + +All model JSON files should pass the local schema before they are treated as stable. + +Validation should check: + +- Required fields +- Enum values +- Unique model IDs +- Source article references +- Source evidence references +- Regression test references +- Model/card indexes +- Markdown card required sections +- Regression case coverage + +## 9. Minimal Selector + +The selector is not a full AI system. + +It is a simple demo that recommends candidate models based on: + +- Trigger keywords +- Input type match +- Negative triggers +- Pipeline position +- Selection priority + +## 10. Development Principles + +- Keep the MVP small. +- Prefer files over databases. +- Prefer explicit schema over implicit conventions. +- Prefer traceability over automation. +- Prefer testability over expressive writing. +- Do not expand to many models before the sample models are stable. +- Treat `model_library_mvp` as the current phase, not as a nested project root. + +## 11. Related Projects + +- `knowledge-vault`: source archive, discussion records, and durable upstream documentation. +- `ccpe-system`: expert-agent, runtime, model, and protocol specification workbench. +- `skills-vault`: canonical source for reusable automation skills. +- `writing-workbench`: deep writing production workspace. +- `video-workbench`: dimensional output workspace for scripts, presentations, and videos. + +This repository consumes selected source material and model definitions from the surrounding ecosystem, but it remains the product/system boundary for The Mindscape of Bro Tsong. + +See `PROJECTS.md` for the operative cross-repository boundary map, including request channels for `ccpe-system` and `skills-vault`. + +## 12. Current Status + +Foundation repair in progress for: + +- QPI +- Intellectual Archaeology / 思想考古学 + +Current foundation assets include: + +- GPT plan localization protocol. +- Model extraction rules. +- Model card contract. +- Model extraction workflow. +- JSON schemas for model cards, source articles, source excerpts, regression cases, and indexes. +- Machine-readable model index. +- Human-readable card index. +- Validation scripts for model library contracts and card headings. +- Source article and source excerpt indexes. +- Regression cases for model use, boundary behavior, and misuse. +- Rule-based selector configuration and examples. +- A standard-library validation script that writes `reports/validation_report.md`. +- A standard-library index rebuild/check script that writes `reports/index_rebuild_report.md`. +- ChatGPT handoff rules. +- Long-term knowledge asset rules and initial `knowledge_assets/` documents. + +Current QPI and Intellectual Archaeology model contents pass the local contract and remain `draft` pending product review. + +Indexes follow `docs/INDEX_MAINTENANCE_PROTOCOL.md`: every asset change must synchronize `models/model_index.json` and `cards/card_index.md`, and handoff/release points must run a full rebuild or check. + +## 13. Next Steps + +1. Review QPI and Intellectual Archaeology content for product correctness. +2. Review whether the new `knowledge_assets/` package is sufficient for ChatGPT / CCRA reuse. +3. Decide whether to expand to a third core model. +4. Decide whether extraction, inspection, and stability scoring should become CCPE or skills-vault requests. +```` + +===== FILE: models/model_index.json ===== + +- Original path: `models/model_index.json` +- SHA256: `04f6d0220bf1f2f6a627bf587f323128a555fa975688b74fd15ca5bd908b072c` + +````json +{ + "index_version": "0.1", + "last_updated": "2026-06-16", + "models": [ + { + "model_id": "intellectual_archaeology", + "model_name": "思想考古学", + "model_type": "deep_modeling_model", + "pipeline_position": "deep_analysis", + "model_file": "models/intellectual_archaeology.model.json", + "card_file": "cards/intellectual_archaeology.md", + "source_article_count": 2, + "source_evidence_count": 5, + "regression_case_count": 17, + "stability_level": "B", + "regression_status": "pending", + "status": "draft", + "last_updated": "2026-06-16" + }, + { + "model_id": "qpi", + "model_name": "QPI 三元定性模型", + "model_type": "routing_model", + "pipeline_position": "pre_analysis", + "model_file": "models/qpi.model.json", + "card_file": "cards/qpi.md", + "source_article_count": 2, + "source_evidence_count": 7, + "regression_case_count": 17, + "stability_level": "B", + "regression_status": "pending", + "status": "draft", + "last_updated": "2026-06-16" + } + ] +} +```` + +===== FILE: cards/card_index.md ===== + +- Original path: `cards/card_index.md` +- SHA256: `171a024f17cf7d3a57231cf77a183fd89cb12165b9b6f3b88e63cd32c43f86a3` + +````markdown +# Card Index + +| Model ID | 模型名称 | 类型 | 流程位置 | Card | Model JSON | 稳固性 | 回归状态 | 状态 | +| --- | --- | --- | --- | --- | --- | --- | --- | --- | +| intellectual_archaeology | 思想考古学 | deep_modeling_model | deep_analysis | `cards/intellectual_archaeology.md` | `models/intellectual_archaeology.model.json` | B | pending | draft | +| qpi | QPI 三元定性模型 | routing_model | pre_analysis | `cards/qpi.md` | `models/qpi.model.json` | B | pending | draft | +```` + +===== FILE: models/qpi.model.json ===== + +- Original path: `models/qpi.model.json` +- SHA256: `2ff7db7bfc34e7bebc2cd888c67ee8235ef4eab1f0b2091306a308ab821a9f43` + +````json +{ + "model_id": "qpi", + "model_name": "QPI 三元定性模型", + "model_type": "routing_model", + "pipeline_position": "pre_analysis", + "one_sentence_definition": "QPI 用核心匮乏物把混沌局面区分为提问、难题和课题,以决定后续应采用检索、工程求解还是生态干预。", + "core_question": "当前输入真正缺的是数据、路径/资源,还是共识/确定性/秩序?", + "core_mechanism": "先确认问题拥有者、来源和时间尺度,再扫描核心匮乏物:缺数据则归为提问,缺路径、方法或资源则归为难题,缺共识、确定性或动态秩序则归为课题;随后检查是否存在暴力降维、恶意升维或手段错配。", + "status": "draft", + "source_articles": [ + "article_qpi_primary_001", + "article_cognitive_os_synthesis_001" + ], + "source_evidence": [ + "excerpt_qpi_primary_spectrum_001", + "excerpt_qpi_primary_question_001", + "excerpt_qpi_primary_problem_001", + "excerpt_qpi_primary_issue_001", + "excerpt_qpi_primary_pathology_reduction_001", + "excerpt_qpi_primary_pathology_inflation_001", + "excerpt_qpi_cognitive_os_application_001" + ], + "input_types": [ + "模糊问题", + "复杂问题", + "业务问题描述", + "组织冲突叙述", + "需求或故障初始表述", + "需要进入深度分析前的问题定义" + ], + "output_types": [ + "问题类型判断", + "问题拥有者", + "问题来源", + "时间尺度", + "三类匮乏物强度", + "主导匮乏物", + "分类理由", + "分类置信度", + "证据缺口", + "核心匮乏物判断", + "误判风险", + "推荐处理路径", + "后续模型调用建议" + ], + "call_when": [ + "用户输入的问题定义不清。", + "同一问题被不同主体以不同方式理解。", + "用户急于求解但尚未判断问题性质。", + "问题中混杂事实、路径、利益、共识和系统结构。", + "需要决定后续调用哪些认知模型。", + "怀疑存在暴力降维、恶意升维或手段与目标错配。" + ], + "do_not_call_when": [ + "用户只是查询明确事实。", + "用户已经给出明确执行任务。", + "输入是纯创意写作且不需要问题定性。", + "问题已经被清楚分类且只需要执行后续步骤。", + "输入不是问题定义,而是纯粹的润色或格式转换请求。" + ], + "trigger_keywords": [ + "问题到底是什么", + "为什么解决不了", + "卡在哪里", + "技术问题还是组织问题", + "方向是不是错了", + "为什么反复出现", + "该怎么定义这个问题", + "这个问题怎么拆", + "缺数据", + "缺路径", + "缺共识" + ], + "negative_triggers": [ + "请直接查询", + "请直接改写", + "只要清单", + "不要分析原因", + "不要展开", + "只改错别字" + ], + "related_models": [ + "intellectual_archaeology" + ], + "conflicting_models": [], + "disciplinary_anchors": [ + "问题定义理论", + "决策科学", + "系统论", + "复杂系统", + "组织行为", + "工程问题分解" + ], + "common_misuses": [ + "把 QPI 当作完整解决方案,而不是问题定义和路由模型。", + "把所有复杂叙事都归为课题,逃避可执行的难题拆解。", + "把系统性课题暴力压缩成个人执行难题。", + "把具体可解决的难题恶意升维成不可处理的课题。", + "在事实缺口上过度建模,拖慢本应直接检索的提问。", + "忽略问题拥有者,直接给出单一视角的分类。" + ], + "failure_modes": [ + "核心匮乏物识别错误,导致后续资源配置错位。", + "未识别权力叙事,接受了伪问题或甩锅框架。", + "把动态平衡型课题误判为可终结的难题。", + "把明确工程障碍误判为需要无限讨论的课题。", + "分类没有给出理由。", + "分类之后没有给出后续处理路径。" + ], + "selection_priority": 9, + "confidence_level": "medium", + "stability_profile": { + "stability_level": "B", + "needs_stabilization": true, + "main_risks": [ + "Q/P/I 在真实复杂案例中可能同时存在,需要输出主导匮乏物而非单标签绝对判断。", + "权力博弈判断依赖上下文,证据不足时不能断言动机。", + "边界案例仍需用真实业务输入扩展。" + ], + "reason": "三分结构清晰,适合作为入口路由模型,但需要补充大量边界案例,防止过度升维或降维。", + "next_stabilization_action": "补充混合问题、误用问题和轻量问题测试,并记录主导匮乏物判断标准。", + "stabilization_notes": "当前已具备 v0.1 调用基础,但仍保持 draft 状态。" + }, + "regression_status": "pending", + "example_inputs": [ + "我们团队每次都说要长期主义,但一到季度 KPI 就回到短期动作,这到底是什么问题?", + "我知道要做模型库,但不知道先用数据库还是文件系统,这属于什么问题?" + ], + "example_outputs": [ + "第一个输入更接近课题,因为它涉及激励结构、时间尺度冲突和组织共识。", + "第二个输入更接近难题,因为目标明确,主要缺的是实现路径和技术取舍。" + ], + "output_contract": [ + "problem_owner: 谁的问题;未知时写 unknown。", + "problem_source: 问题从哪里被提出,是否可能带有立场、恐惧或甩锅框架。", + "time_scale: short_term | mid_term | long_term | mixed | unknown。", + "scarcity_profile: 分别标出 data_scarcity、path_or_resource_scarcity、consensus_or_order_scarcity 的 high | medium | low | unknown。", + "dominant_scarcity: data | path_resource | consensus_order | mixed | unknown。", + "classification: question | problem | issue | mixed | no_call。", + "classification_confidence: high | medium | low。", + "evidence_gap: 列出还缺哪些信息才能稳定判断;mixed 或 low confidence 时必须填写。", + "misclassification_risk: 标出暴力降维、恶意升维或手段错配风险。", + "recommended_next_step: 检索 | 工程拆解 | 共识协调 | 补充上下文 | 不调用。", + "next_model_candidates: 后续可调用模型 ID;无则为空数组。" + ], + "structured_output_contract": { + "problem_owner": "string | unknown", + "problem_source": "string | unknown", + "time_scale": ["short_term", "mid_term", "long_term", "mixed", "unknown"], + "scarcity_profile": { + "data_scarcity": ["high", "medium", "low", "unknown"], + "path_or_resource_scarcity": ["high", "medium", "low", "unknown"], + "consensus_or_order_scarcity": ["high", "medium", "low", "unknown"] + }, + "dominant_scarcity": ["data", "path_resource", "consensus_order", "mixed", "unknown"], + "classification": ["question", "problem", "issue", "mixed", "no_call"], + "classification_confidence": ["high", "medium", "low"], + "evidence_gap": "array", + "misclassification_risk": "array", + "recommended_next_step": ["检索", "工程拆解", "共识协调", "补充上下文", "不调用"], + "next_model_candidates": "array" + }, + "depth_control": { + "principle": "先定性,再决定是否进入深层模型。", + "stop_conditions": [ + "如果只是明确事实查询,停止在提问层并建议检索。", + "如果已明确是执行任务,停止继续路由。", + "如果分类证据不足,先输出 evidence_gap 并要求补充上下文。", + "如果 negative_triggers 命中且没有复杂问题信号,输出 classification=no_call。" + ], + "overuse_warning": "QPI 是前置路由模型,不应替代后续具体分析模型。" + }, + "stabilization_path": [ + "补充真实业务混合案例。", + "补充暴力降维和恶意升维案例。", + "形成主导匮乏物判定示例库。" + ], + "productization_notes": "QPI 应作为问题回答系统的前置路由模型,用于防止系统在问题类型错误的情况下直接给答案。", + "version": "0.1", + "last_updated": "2026-06-16" +} +```` + +===== FILE: models/intellectual_archaeology.model.json ===== + +- Original path: `models/intellectual_archaeology.model.json` +- SHA256: `c114ffac2065d42603d071c1339af9833c133a1bc942b1f2a1c57fa9d141831d` + +````json +{ + "model_id": "intellectual_archaeology", + "model_name": "思想考古学", + "model_type": "deep_modeling_model", + "pipeline_position": "deep_analysis", + "one_sentence_definition": "思想考古学是一种从表层应用逐层下钻到哲学基岩的建模方法,用于发现支撑一个模型或判断的深层假设、核心机理和动态韧性来源。", + "core_question": "当前问题、方案或模型背后,隐藏了哪些更深层的结构性假设?", + "core_mechanism": "把待建模对象放入七层深度框架:应用层、领域层、过程层、目的层、核心机理层、人类能力层、哲学基岩层;逐层追问支撑上一层的假设,并以最小充分下潜原则停止,避免为了深刻而深刻。", + "status": "draft", + "source_articles": [ + "article_intellectual_archaeology_primary_001", + "article_cognitive_os_synthesis_001" + ], + "source_evidence": [ + "excerpt_ia_primary_definition_001", + "excerpt_ia_primary_layers_001", + "excerpt_ia_primary_resilience_001", + "excerpt_ia_cognitive_os_minimum_depth_001", + "excerpt_ia_primary_validation_001" + ], + "input_types": [ + "复杂问题", + "系统性议题", + "反复失败的问题", + "专家隐性知识", + "认知模型草稿", + "产品底层逻辑", + "需要抽取底层假设的业务方案" + ], + "output_types": [ + "层级化问题地图", + "是否应该调用", + "进入思想考古的理由", + "建议最大下潜层级", + "实际分析层级", + "停止理由", + "不继续下潜理由", + "深层假设清单", + "最小充分下潜层级", + "模型稳固性判断", + "需要验证的薄弱环节", + "后续建模建议" + ], + "call_when": [ + "QPI 判断问题偏课题或中重型难题。", + "问题具有高复用价值。", + "用户希望从文章中抽取模型。", + "当前解释停留在表层工具或症状。", + "需要把专家隐性知识显性化。", + "需要为一个模型寻找更稳固的底层结构。", + "一个问题反复解决但反复失败。" + ], + "do_not_call_when": [ + "当前只是缺少一个事实或材料位置,直接检索即可。", + "问题属于低风险轻量表达,不值得进入深层建模。", + "继续下钻不再改变判断、路径、验证方式或行动边界。", + "用户明确只需要短平快执行,不需要模型化解释。", + "缺少足够领域材料,无法区分真实底层假设和空泛哲学化表达。" + ], + "trigger_keywords": [ + "深层结构", + "底层逻辑", + "模型稳不稳", + "为什么反复失败", + "问题的根在哪里", + "沉淀成模型", + "从文章抽取模型", + "方法论的基岩", + "隐性知识", + "哲学基岩" + ], + "negative_triggers": [ + "快速回答", + "不要展开", + "只查事实", + "只要执行步骤", + "不要深入分析", + "只改文案" + ], + "related_models": [ + "qpi" + ], + "conflicting_models": [ + "fast_execution_flow" + ], + "disciplinary_anchors": [ + "哲学", + "认识论", + "系统论", + "复杂系统", + "认知心理学", + "专家知识显性化", + "因果推理", + "设计理论" + ], + "common_misuses": [ + "把思想考古学误用为文章摘要或概念堆叠。", + "为了显得深刻而无限下钻。", + "把所有轻量问题都拖入七层分析。", + "只做纵向下潜而缺少横向模型竞争。", + "用哲学基岩替代现实验证。", + "下潜后没有回到可行动结论。" + ], + "failure_modes": [ + "分析很深但不能改变判断或行动。", + "层级之间没有清楚递进关系。", + "把所有问题都下钻到哲学层。", + "输出只有抽象概念而没有模型结构。", + "没有说明应该在哪一层停止。", + "没有指出需要证据验证的地方。" + ], + "selection_priority": 7, + "confidence_level": "medium", + "stability_profile": { + "stability_level": "B", + "needs_stabilization": true, + "main_risks": [ + "七层结构需要进一步稳定。", + "容易过度下潜。", + "容易输出抽象概念而缺少行动回路。", + "需要更多真实案例验证。" + ], + "reason": "纵向下潜机制清晰,适合深度建模,但七层结构和停止条件需要进一步稳定。", + "next_stabilization_action": "补充不同复杂度问题的下潜深度测试,明确最小充分下潜原则。", + "stabilization_notes": "当前适合作为中重型问题的 draft 深度建模模块。" + }, + "regression_status": "pending", + "example_inputs": [ + "我想把过去文章中的认知模型抽取出来,但不知道这些模型到底稳不稳,应该怎么判断?", + "现代人为什么一边渴望连接,一边又渴望逃离连接?" + ], + "example_outputs": [ + "第一个输入适合下潜到核心机理层,判断文章、模型卡、系统调用、回归测试之间的关系。", + "第二个输入可从应用层、评价层、过程层、目的层和人类能力层分析连接与逃离连接的双重机制。" + ], + "output_contract": [ + "should_call: true | false。", + "entry_reason: 为什么值得进入思想考古;不应调用时说明 no-call 原因。", + "recommended_max_depth: application | domain | process | purpose | core_mechanism | human_capability | philosophical_bedrock。", + "layers_to_analyze: 实际需要分析的层级数组。", + "stop_reason: 为什么停在这一层。", + "no_deeper_reason: 继续下潜不会改变什么。", + "assumptions_by_layer: 按七层列出关键假设;未分析层级保留空数组。", + "validation_needed: 哪些判断需要现实反馈、数据、专家盲审或红队。", + "action_implication: 下潜结果如何改变下一步行动。" + ], + "structured_output_contract": { + "should_call": "boolean", + "entry_reason": "string", + "recommended_max_depth": ["application", "domain", "process", "purpose", "core_mechanism", "human_capability", "philosophical_bedrock"], + "layers_to_analyze": "array", + "stop_reason": "string", + "no_deeper_reason": "string", + "assumptions_by_layer": { + "application": "array", + "domain": "array", + "process": "array", + "purpose": "array", + "core_mechanism": "array", + "human_capability": "array", + "philosophical_bedrock": "array" + }, + "validation_needed": "array", + "action_implication": "string" + }, + "depth_control": { + "principle": "最小充分下潜", + "stop_conditions": [ + "已经足以改变决策。", + "继续下潜不会增加解释力。", + "缺少证据支撑更深推断。", + "问题不值得重型建模。", + "用户当前只需要执行层结果。", + "QPI 未放行中重型难题或课题时,不进入完整思想考古。", + "如果 recommended_max_depth 低于 philosophical_bedrock,不得自动展开到哲学基岩。" + ], + "overuse_warning": "思想考古不是所有问题的默认流程,必须先经过问题价值评估和 QPI 定性。" + }, + "stabilization_path": [ + "补充轻量、中量、重量问题的边界测试。", + "补充不同领域的七层下钻案例。", + "建立停止条件和现实验证的示例库。" + ], + "productization_notes": "思想考古适合作为中重度问题的深层建模模块,不应默认全量调用。它应该由 QPI、问题复杂度和复用价值共同触发。", + "version": "0.1", + "last_updated": "2026-06-16" +} +```` + +===== FILE: cards/qpi.md ===== + +- Original path: `cards/qpi.md` +- SHA256: `dea4f4c03037e904598aa9cb08b0bd866a53f55fdab3983ede6a4bb0c1e86c4f` + +````markdown +# QPI 三元定性模型 + +## 模型名称 + +QPI 三元定性模型 + +## 模型 ID + +`qpi` + +## 一句话定义 + +QPI 用核心匮乏物把混沌局面区分为提问、难题和课题,以决定后续应采用检索、工程求解还是生态干预。 + +## 模型类型 + +`routing_model` + +QPI 是前置路由模型,不是最终分析模型。 + +## 所在流程位置 + +`pre_analysis` + +它应在深度分析、系统建模或执行拆解之前调用。 + +## 来源文章 + +- `article_qpi_primary_001`: 《问题之锚:从混沌现实到认知秩序的重构》 +- `article_cognitive_os_synthesis_001`: 《Wantsong认知操作系统》 + +## 来源证据片段 + +- `excerpt_qpi_primary_spectrum_001`: 支撑 QPI 的三元分类和核心匮乏物定义。 +- `excerpt_qpi_primary_question_001`: 支撑提问对应数据匮乏。 +- `excerpt_qpi_primary_problem_001`: 支撑难题对应路径、方法和资源匮乏。 +- `excerpt_qpi_primary_issue_001`: 支撑课题对应动态平衡和演化。 +- `excerpt_qpi_primary_pathology_reduction_001`: 支撑暴力降维误用识别。 +- `excerpt_qpi_primary_pathology_inflation_001`: 支撑恶意升维误用识别。 +- `excerpt_qpi_cognitive_os_application_001`: 支撑 QPI 在问题定义阶段的应用位置。 + +## 核心问题 + +当前输入真正缺的是数据、路径/资源,还是共识/确定性/秩序? + +## 核心机制 + +QPI 先确认问题拥有者、来源和时间尺度,再扫描核心匮乏物。 + +- 缺数据,归为提问,适合搜索、检索、自动化。 +- 缺路径、方法或资源,归为难题,适合工程求解和资源调配。 +- 缺共识、确定性或动态秩序,归为课题,适合对话、博弈、干预和演化。 + +完成分类后,还要检查是否存在暴力降维、恶意升维或手段错配。 + +## 输入类型 + +- 模糊问题 +- 复杂问题 +- 业务问题描述 +- 组织冲突叙述 +- 需求或故障初始表述 +- 需要进入深度分析前的问题定义 + +## 输出类型 + +- 问题类型判断 +- 问题拥有者 +- 问题来源 +- 时间尺度 +- 三类匮乏物强度 +- 主导匮乏物 +- 分类理由 +- 分类置信度 +- 证据缺口 +- 核心匮乏物判断 +- 误判风险 +- 推荐处理路径 +- 后续模型调用建议 + +## 适用场景 + +- 用户输入的问题定义不清。 +- 同一问题被不同主体以不同方式理解。 +- 用户急于求解但尚未判断问题性质。 +- 问题中混杂事实、路径、利益、共识和系统结构。 +- 需要决定后续调用哪些认知模型。 +- 怀疑存在暴力降维、恶意升维或手段与目标错配。 + +## 不适用场景 + +- 用户只是查询明确事实。 +- 用户已经给出明确执行任务。 +- 输入是纯创意写作且不需要问题定性。 +- 问题已经被清楚分类且只需要执行后续步骤。 +- 输入不是问题定义,而是纯粹的润色或格式转换请求。 + +## 调用关键词 + +- 问题到底是什么 +- 为什么解决不了 +- 卡在哪里 +- 技术问题还是组织问题 +- 方向是不是错了 +- 为什么反复出现 +- 该怎么定义这个问题 +- 这个问题怎么拆 +- 缺数据 +- 缺路径 +- 缺共识 + +## 负向触发条件 + +- 请直接查询 +- 请直接改写 +- 只要清单 +- 不要分析原因 +- 不要展开 +- 只改错别字 + +## 相关模型 + +- `intellectual_archaeology`: 当 QPI 判断问题偏中重型难题或课题时,可进入思想考古做深度建模。 + +## 冲突模型 + +无明确冲突模型。 + +## 学科底座关联 + +- 问题定义理论 +- 决策科学 +- 系统论 +- 复杂系统 +- 组织行为 +- 工程问题分解 + +## 常见误用 + +- 把 QPI 当作完整解决方案,而不是问题定义和路由模型。 +- 把所有复杂叙事都归为课题,逃避可执行的难题拆解。 +- 把系统性课题暴力压缩成个人执行难题。 +- 把具体可解决的难题恶意升维成不可处理的课题。 +- 在事实缺口上过度建模,拖慢本应直接检索的提问。 +- 忽略问题拥有者,直接给出单一视角的分类。 + +## 失败信号 + +- 核心匮乏物识别错误,导致后续资源配置错位。 +- 未识别权力叙事,接受了伪问题或甩锅框架。 +- 把动态平衡型课题误判为可终结的难题。 +- 把明确工程障碍误判为需要无限讨论的课题。 +- 分类没有给出理由。 +- 分类之后没有给出后续处理路径。 + +## 可信度等级 + +`medium` + +QPI 的三分结构和核心匮乏物有清晰原文支撑,但真实输入中经常出现 Q/P/I 混合状态,仍需要更多边界案例稳定判断。 + +## 稳固性状态 + +`B` + +需要继续稳定化。 + +## 稳定性评估 + +- 概念清晰度:较高,提问、难题、课题的核心匮乏物清楚。 +- 机制稳定性:中高,扫描匮乏物和匹配处理范式的机制明确。 +- 边界清晰度:中等,混合型问题仍需更多测试。 +- 来源证据质量:较高,主要定义来自原文,应用规则来自综合文档。 +- 回归测试表现:pending,已有五条样板用例,尚未经过真实案例扩展。 + +评级理由:三分结构清晰,适合作为入口路由模型,但需要补充大量边界案例,防止过度升维或降维。 + +下一步稳定化动作:补充混合问题、误用问题和轻量问题测试,并记录主导匮乏物判断标准。 + +## 回归测试状态 + +`pending` + +当前已有五条回归用例: + +- `case_qpi_positive_question_001` +- `case_qpi_positive_problem_001` +- `case_qpi_positive_issue_001` +- `case_qpi_boundary_mixed_001` +- `case_qpi_misuse_inflation_001` + +## 示例输入 + +- “我们团队每次都说要长期主义,但一到季度 KPI 就回到短期动作,这到底是什么问题?” +- “我知道要做模型库,但不知道先用数据库还是文件系统,这属于什么问题?” + +## 示例输出 + +- “第一个输入更接近课题,因为它涉及激励结构、时间尺度冲突和组织共识。” +- “第二个输入更接近难题,因为目标明确,主要缺的是实现路径和技术取舍。” + +## 输出契约 + +输出必须包含: + +- `problem_owner`: 谁的问题;未知时写 `unknown`。 +- `problem_source`: 问题从哪里被提出,是否可能带有立场、恐惧或甩锅框架。 +- `time_scale`: `short_term | mid_term | long_term | mixed | unknown`。 +- `scarcity_profile`: 分别标出 `data_scarcity`、`path_or_resource_scarcity`、`consensus_or_order_scarcity` 的强度。 +- `dominant_scarcity`: `data | path_resource | consensus_order | mixed | unknown`。 +- `classification`: `question | problem | issue | mixed | no_call`。 +- `classification_confidence`: `high | medium | low`。 +- `evidence_gap`: 还缺哪些信息才能稳定判断;mixed 或 low confidence 时必须填写。 +- `misclassification_risk`: 暴力降维、恶意升维或手段错配风险。 +- `recommended_next_step`: 检索、工程拆解、共识协调、补充上下文或不调用。 +- `next_model_candidates`: 后续可调用模型 ID。 + +## 深度控制 + +原则:先定性,再决定是否进入深层模型。 + +停止条件: + +- 如果只是明确事实查询,停止在提问层并建议检索。 +- 如果已明确是执行任务,停止继续路由。 +- 如果分类证据不足,先输出 `evidence_gap` 并要求补充上下文。 +- 如果负向触发命中且没有复杂问题信号,输出 `classification=no_call`。 + +过度调用警告:QPI 是前置路由模型,不应替代后续具体分析模型。 + +## 产品化建议 + +QPI 应作为问题回答系统的前置路由模型,用于防止系统在问题类型错误的情况下直接给答案。 + +selector 应优先使用 `trigger_keywords`、`negative_triggers`、`pipeline_position` 和 `selection_priority` 做规则推荐。 + +## 版本信息 + +- version: `0.1` +- last_updated: `2026-06-16` +- status: `draft` +```` + +===== FILE: cards/intellectual_archaeology.md ===== + +- Original path: `cards/intellectual_archaeology.md` +- SHA256: `705f1834a866c84e4c536cacdd25d788f3c4629847f34721040c946ebaf29b1b` + +````markdown +# 思想考古学 + +## 模型名称 + +思想考古学 + +## 模型 ID + +`intellectual_archaeology` + +## 一句话定义 + +思想考古学是一种从表层应用逐层下钻到哲学基岩的建模方法,用于发现支撑一个模型或判断的深层假设、核心机理和动态韧性来源。 + +## 模型类型 + +`deep_modeling_model` + +思想考古学是深度建模模型,不是前置路由模型,也不是轻量执行流程。 + +## 所在流程位置 + +`deep_analysis` + +通常应在 QPI 或问题价值评估之后调用。 + +## 来源文章 + +- `article_intellectual_archaeology_primary_001`: 《建模者的工坊》 +- `article_cognitive_os_synthesis_001`: 《Wantsong认知操作系统》 + +## 来源证据片段 + +- `excerpt_ia_primary_definition_001`: 支撑思想考古学的定义。 +- `excerpt_ia_primary_layers_001`: 支撑七层下钻机制。 +- `excerpt_ia_primary_resilience_001`: 支撑动态韧性价值。 +- `excerpt_ia_cognitive_os_minimum_depth_001`: 支撑最小充分下潜原则。 +- `excerpt_ia_primary_validation_001`: 支撑内部自洽不等于现实有效的验证要求。 + +## 核心问题 + +当前问题、方案或模型背后,隐藏了哪些更深层的结构性假设? + +## 核心机制 + +思想考古学把待建模对象放入七层深度框架: + +1. 应用层 +2. 领域层 +3. 过程层 +4. 目的层 +5. 核心机理层 +6. 人类能力层 +7. 哲学基岩层 + +每一层都追问上一层的支撑假设。下钻必须遵守最小充分下潜原则:如果继续下潜不再改变判断、路径、验证方式或行动边界,就应该停止。 + +## 输入类型 + +- 复杂问题 +- 系统性议题 +- 反复失败的问题 +- 专家隐性知识 +- 认知模型草稿 +- 产品底层逻辑 +- 需要抽取底层假设的业务方案 + +## 输出类型 + +- 层级化问题地图 +- 是否应该调用 +- 进入思想考古的理由 +- 建议最大下潜层级 +- 实际分析层级 +- 停止理由 +- 不继续下潜理由 +- 深层假设清单 +- 最小充分下潜层级 +- 模型稳固性判断 +- 需要验证的薄弱环节 +- 后续建模建议 + +## 适用场景 + +- QPI 判断问题偏课题或中重型难题。 +- 问题具有高复用价值。 +- 用户希望从文章中抽取模型。 +- 当前解释停留在表层工具或症状。 +- 需要把专家隐性知识显性化。 +- 需要为一个模型寻找更稳固的底层结构。 +- 一个问题反复解决但反复失败。 + +## 不适用场景 + +- 当前只是缺少一个事实或材料位置,直接检索即可。 +- 问题属于低风险轻量表达,不值得进入深层建模。 +- 继续下钻不再改变判断、路径、验证方式或行动边界。 +- 用户明确只需要短平快执行,不需要模型化解释。 +- 缺少足够领域材料,无法区分真实底层假设和空泛哲学化表达。 + +## 调用关键词 + +- 深层结构 +- 底层逻辑 +- 模型稳不稳 +- 为什么反复失败 +- 问题的根在哪里 +- 沉淀成模型 +- 从文章抽取模型 +- 方法论的基岩 +- 隐性知识 +- 哲学基岩 + +## 负向触发条件 + +- 快速回答 +- 不要展开 +- 只查事实 +- 只要执行步骤 +- 不要深入分析 +- 只改文案 + +## 相关模型 + +- `qpi`: 通常作为前置路由模型,先判断问题是否值得进入深度建模。 + +## 冲突模型 + +- `fast_execution_flow`: 当用户只需要轻量执行或快速产出时,思想考古学不应默认介入。 + +## 学科底座关联 + +- 哲学 +- 认识论 +- 系统论 +- 复杂系统 +- 认知心理学 +- 专家知识显性化 +- 因果推理 +- 设计理论 + +## 常见误用 + +- 把思想考古学误用为文章摘要或概念堆叠。 +- 为了显得深刻而无限下钻。 +- 把所有轻量问题都拖入七层分析。 +- 只做纵向下潜而缺少横向模型竞争。 +- 用哲学基岩替代现实验证。 +- 下潜后没有回到可行动结论。 + +## 失败信号 + +- 分析很深但不能改变判断或行动。 +- 层级之间没有清楚递进关系。 +- 把所有问题都下钻到哲学层。 +- 输出只有抽象概念而没有模型结构。 +- 没有说明应该在哪一层停止。 +- 没有指出需要证据验证的地方。 + +## 可信度等级 + +`medium` + +思想考古学的定义、七层结构、动态韧性和验证要求都有来源支撑,但七层结构的停止条件仍需要更多跨场景案例校准。 + +## 稳固性状态 + +`B` + +需要继续稳定化。 + +## 稳定性评估 + +- 概念清晰度:中高,模型名称和下钻方向明确。 +- 机制稳定性:中等,七层结构清晰,但层级之间的真实递进关系需要更多案例验证。 +- 边界清晰度:中等,最小充分下潜原则已明确,但执行时容易过度下钻。 +- 来源证据质量:较高,核心定义和七层结构来自原文,停止条件来自综合应用材料。 +- 回归测试表现:pending,已有五条样板用例,尚未扩展到更多领域。 + +评级理由:纵向下潜机制清晰,适合深度建模,但七层结构和停止条件需要进一步稳定。 + +下一步稳定化动作:补充不同复杂度问题的下潜深度测试,明确最小充分下潜原则。 + +## 回归测试状态 + +`pending` + +当前已有五条回归用例: + +- `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` + +## 示例输入 + +- “我想把过去文章中的认知模型抽取出来,但不知道这些模型到底稳不稳,应该怎么判断?” +- “现代人为什么一边渴望连接,一边又渴望逃离连接?” + +## 示例输出 + +- “第一个输入适合下潜到核心机理层,判断文章、模型卡、系统调用、回归测试之间的关系。” +- “第二个输入可从应用层、评价层、过程层、目的层和人类能力层分析连接与逃离连接的双重机制。” + +## 输出契约 + +输出必须包含: + +- `should_call`: `true | false`。 +- `entry_reason`: 为什么值得进入思想考古;不应调用时说明 no-call 原因。 +- `recommended_max_depth`: `application | domain | process | purpose | core_mechanism | human_capability | philosophical_bedrock`。 +- `layers_to_analyze`: 实际需要分析的层级数组。 +- `stop_reason`: 为什么停在这一层。 +- `no_deeper_reason`: 继续下潜不会改变什么。 +- `assumptions_by_layer`: 按七层列出关键假设;未分析层级保留空数组。 +- `validation_needed`: 哪些判断需要现实反馈、数据、专家盲审或红队。 +- `action_implication`: 下潜结果如何改变下一步行动。 + +## 深度控制 + +原则:最小充分下潜。 + +停止条件: + +- 已经足以改变决策。 +- 继续下潜不会增加解释力。 +- 缺少证据支撑更深推断。 +- 问题不值得重型建模。 +- 用户当前只需要执行层结果。 +- QPI 未放行中重型难题或课题时,不进入完整思想考古。 +- 如果建议最大下潜层级低于哲学基岩,不得自动展开到哲学基岩。 + +过度调用警告:思想考古不是所有问题的默认流程,必须先经过问题价值评估和 QPI 定性。 + +## 产品化建议 + +思想考古适合作为中重度问题的深层建模模块,不应默认全量调用。 + +它应该由 QPI、问题复杂度和复用价值共同触发。输出必须回到可验证、可行动的模型结构。 + +## 版本信息 + +- version: `0.1` +- last_updated: `2026-06-16` +- status: `draft` +```` + +===== FILE: sources/source_articles.json ===== + +- Original path: `sources/source_articles.json` +- SHA256: `e0f0ea17b8beca53adba188dd3e36fd5bcdb794e76ec35821aa49d6383fc88cb` + +````json +{ + "source_articles": [ + { + "source_id": "article_qpi_primary_001", + "title": "问题之锚:从混沌现实到认知秩序的重构", + "author": "Wantsong", + "date": "2026-01-07", + "source_type": "original_article", + "file_path": "C:\\Users\\wangq\\Documents\\Codex\\knowledge-vault\\sayings\\2026\\2026-01-07-anchoring-the-void.md", + "related_models": ["qpi"], + "source_status": "representative", + "notes": "QPI 的主要来源文本,用于抽取提问、难题、课题三分结构、核心匮乏物、病理诊断与重构策略。" + }, + { + "source_id": "article_intellectual_archaeology_primary_001", + "title": "建模者的工坊", + "author": "Wantsong", + "date": "2025-10-26", + "source_type": "original_article", + "file_path": "C:\\Users\\wangq\\Documents\\Codex\\knowledge-vault\\sayings\\2025\\2025-10-26-the-workshop-of-Modelers.md", + "related_models": ["intellectual_archaeology"], + "source_status": "representative", + "notes": "思想考古学的主要来源文本,重点依据 1.3 节抽取七层下钻框架、动态韧性与模型验证要求。" + }, + { + "source_id": "article_cognitive_os_synthesis_001", + "title": "Wantsong认知操作系统", + "author": "Wantsong", + "date": "unknown", + "source_type": "synthesis_note", + "file_path": "C:\\Users\\wangq\\Documents\\Codex\\knowledge-vault\\rules\\cognitive-science\\综合认知模型\\Wantsong认知操作系统.md", + "related_models": ["qpi", "intellectual_archaeology"], + "source_status": "derived_synthesis", + "notes": "既有应用说明和模型化表达,用于补充 QPI 在流程中的位置、思想考古的最小充分原则和操作边界。" + } + ] +} +```` + +===== FILE: sources/source_excerpts.json ===== + +- Original path: `sources/source_excerpts.json` +- SHA256: `5ebe3942e8127de701cb393e818f5670e9590b03a465a49b620f1458f76e78ef` + +````json +{ + "source_excerpts": [ + { + "excerpt_id": "excerpt_qpi_primary_spectrum_001", + "source_id": "article_qpi_primary_001", + "related_model_id": "qpi", + "excerpt_type": "definition", + "summary": "QPI 的核心分类不是难度分级,而是按照核心匮乏物区分提问、难题和课题。", + "used_for": ["one_sentence_definition", "core_mechanism", "output_types"], + "quote_status": "exact", + "raw_excerpt": "我们将这三条光谱命名为:提问 (Question)、难题 (Problem) 与 课题 (Issue)。区分它们的关键,不在于其表象的规模大小,而在于其内核中 “核心匮乏物 (Core Scarcity)” 的差异。", + "source_location": "1. 光谱层:QPI 三元结构,约第 48 行", + "confidence": "high", + "notes": "来自 QPI 原文第一章。" + }, + { + "excerpt_id": "excerpt_qpi_primary_question_001", + "source_id": "article_qpi_primary_001", + "related_model_id": "qpi", + "excerpt_type": "taxonomy", + "summary": "提问对应数据匮乏,应通过搜索、检索、自动化和标准化信息流处理。", + "used_for": ["core_mechanism", "call_when", "regression_cases"], + "quote_status": "exact", + "raw_excerpt": "在这一层级,世界是简单或线性因果的。解决“提问”不需要创造新的路径,也不需要协调价值观的冲突,只需要执行搜索或检索的动作。", + "source_location": "1.1 光谱 A:提问,约第 59 行", + "confidence": "high", + "notes": "用于定义 Q 类输入和正例。" + }, + { + "excerpt_id": "excerpt_qpi_primary_problem_001", + "source_id": "article_qpi_primary_001", + "related_model_id": "qpi", + "excerpt_type": "taxonomy", + "summary": "难题对应路径、方法和资源匮乏;目标清晰但桥梁断裂,理论上可通过工程求解闭环。", + "used_for": ["core_mechanism", "call_when", "regression_cases"], + "quote_status": "exact", + "raw_excerpt": "与“提问”不同,“难题”不仅仅是信息的缺失。我们清楚地知道现在的状态(A点),也无比渴望到达理想的状态(B点),但我们发现连接A与B的桥梁断裂了,或者根本不存在现成的道路。", + "source_location": "1.2 光谱 B:难题,约第 65 行", + "confidence": "high", + "notes": "用于定义 P 类输入和正例。" + }, + { + "excerpt_id": "excerpt_qpi_primary_issue_001", + "source_id": "article_qpi_primary_001", + "related_model_id": "qpi", + "excerpt_type": "taxonomy", + "summary": "课题对应确定性因果与共识匮乏;不追求终结式解决,而追求动态平衡与演化。", + "used_for": ["core_mechanism", "do_not_call_when", "regression_cases"], + "quote_status": "exact", + "raw_excerpt": "对于“课题”,我们追求的不是完结,而是系统的动态平衡与演化。", + "source_location": "1.3 光谱 C:课题,约第 82 行", + "confidence": "high", + "notes": "用于定义 I 类输入、误用和边界。" + }, + { + "excerpt_id": "excerpt_qpi_primary_pathology_reduction_001", + "source_id": "article_qpi_primary_001", + "related_model_id": "qpi", + "excerpt_type": "boundary_rule", + "summary": "暴力降维通常来自权力上位者,将系统性课题压缩成具体执行难题以规避系统责任。", + "used_for": ["common_misuses", "failure_modes", "regression_cases"], + "quote_status": "exact", + "raw_excerpt": "这通常来自权力的上位者。当面对一个复杂的、系统性的“课题 (Issue)”时,承认其复杂性意味着承认管理者在系统设计上的无能或失职。", + "source_location": "3.2 病理学:暴力降维,约第 160 行", + "confidence": "high", + "notes": "用于 QPI 误用和防降维测试。" + }, + { + "excerpt_id": "excerpt_qpi_primary_pathology_inflation_001", + "source_id": "article_qpi_primary_001", + "related_model_id": "qpi", + "excerpt_type": "boundary_rule", + "summary": "恶意升维通常来自执行层,将职责范围内的具体难题放大为不可抗力课题。", + "used_for": ["common_misuses", "failure_modes", "regression_cases"], + "quote_status": "exact", + "raw_excerpt": "这通常来自权力的下位者或执行层。当面对一个具体的、属于自己职责范围内的“难题 (Problem)”时,为了掩盖自身的失误或懒惰,执行者会试图将这个 P 恶意放大为一个不可抗力的 I。", + "source_location": "3.2 病理学:恶意升维,约第 170 行", + "confidence": "high", + "notes": "用于 QPI 误用和防升维测试。" + }, + { + "excerpt_id": "excerpt_qpi_cognitive_os_application_001", + "source_id": "article_cognitive_os_synthesis_001", + "related_model_id": "qpi", + "excerpt_type": "application_rule", + "summary": "QPI 在认知操作系统中位于问题定义阶段,用于先确认问题拥有者、来源和时间尺度,再做三元定性。", + "used_for": ["pipeline_position", "input_types", "selection_rules"], + "quote_status": "condensed", + "raw_excerpt": "扫除前置迷雾后,使用 Wantsong QPI 统一理论 对问题进行精准定性,直接决定后续的资源调度与干预范式。", + "source_location": "2.2 光谱定位:QPI 三元定性,约第 115 行", + "confidence": "medium", + "notes": "这是综合文档中的应用层表达,Markdown 标记已压缩,不作为原始定义唯一来源。" + }, + { + "excerpt_id": "excerpt_ia_primary_definition_001", + "source_id": "article_intellectual_archaeology_primary_001", + "related_model_id": "intellectual_archaeology", + "excerpt_type": "definition", + "summary": "思想考古学是一种严谨艰苦的智力活动,要求从表层现象层层下钻到哲学基岩。", + "used_for": ["one_sentence_definition", "core_question", "core_mechanism"], + "quote_status": "exact", + "raw_excerpt": "工坊的日常运作是在“炼金”,那么其成功的根基,则深植于一项更为严谨、更为艰苦的智力活动——我们称之为 “思想考古学”(Intellectual Archaeology)。", + "source_location": "1.3 建模的深度:作为思想考古的多层框架,约第 66 行", + "confidence": "high", + "notes": "来自原文 1.3 节开头。" + }, + { + "excerpt_id": "excerpt_ia_primary_layers_001", + "source_id": "article_intellectual_archaeology_primary_001", + "related_model_id": "intellectual_archaeology", + "excerpt_type": "mechanism", + "summary": "思想考古学以七层同心圆下钻:应用层、领域层、过程层、目的层、核心机理层、人类能力层、哲学基岩层。", + "used_for": ["core_mechanism", "output_types", "regression_cases"], + "quote_status": "condensed", + "raw_excerpt": "我们构建的,是一个七层同心圆式的模型:第一层(应用层)...第七层(哲学基岩层):问题模型。", + "source_location": "1.3 七层同心圆模型,约第 70-80 行", + "confidence": "high", + "notes": "已压缩原文七条列表,因此 quote_status=condensed;完整文本见 source article。" + }, + { + "excerpt_id": "excerpt_ia_primary_resilience_001", + "source_id": "article_intellectual_archaeology_primary_001", + "related_model_id": "intellectual_archaeology", + "excerpt_type": "value_claim", + "summary": "思想考古的价值在于让模型拥有稳定深刻的内核和灵活适应变化的外壳,从而提升动态韧性。", + "used_for": ["call_when", "stability_profile", "productization_notes"], + "quote_status": "exact", + "raw_excerpt": "一个模型的价值,不在于其永不改变,而在于其拥有一个稳定、深刻的“内核”,以及一个能够灵活适应变化的“外壳”。思想考古的深度,直接决定了这个内核的稳固程度。", + "source_location": "1.3 动态韧性说明,约第 88 行", + "confidence": "high", + "notes": "用于说明何时调用思想考古。" + }, + { + "excerpt_id": "excerpt_ia_cognitive_os_minimum_depth_001", + "source_id": "article_cognitive_os_synthesis_001", + "related_model_id": "intellectual_archaeology", + "excerpt_type": "boundary_rule", + "summary": "思想考古容易过度挖掘,必须遵守最小充分下潜原则:继续下潜不再改变判断和行动时停止。", + "used_for": ["do_not_call_when", "common_misuses", "failure_modes", "regression_cases"], + "quote_status": "exact", + "raw_excerpt": "思想考古极易导致过度挖掘。并非所有问题都需要下潜到“哲学基岩”。下潜的唯一停止标准是:是否足以改变判断和行动?", + "source_location": "3.1 纵向下潜:思想考古与最小充分原则,约第 166 行", + "confidence": "medium", + "notes": "来自综合应用文档,作为产品化边界规则。" + }, + { + "excerpt_id": "excerpt_ia_primary_validation_001", + "source_id": "article_intellectual_archaeology_primary_001", + "related_model_id": "intellectual_archaeology", + "excerpt_type": "validation_rule", + "summary": "思想考古产出的模型必须经过内部有效性、动态压力和外部有效性验证,不能只依靠内部自洽。", + "used_for": ["regression_status", "failure_modes", "productization_notes"], + "quote_status": "exact", + "raw_excerpt": "内部逻辑的自洽,绝不等于外部现实的有效。一枚在无风实验室里指向精准的罗盘,未必能经受住真实海洋中磁暴的考验。", + "source_location": "第四幕:验证,约第 215 行", + "confidence": "high", + "notes": "来自第四幕验证段落。" + } + ] +} +```` + +===== FILE: tests/regression_cases.json ===== + +- Original path: `tests/regression_cases.json` +- SHA256: `9f0cbcb9453ab2f362c95d3baf523c6bd8960b0dd82ec5e851dfecb926ccd4ac` + +````json +{ + "regression_cases": [ + {"case_id": "case_qpi_positive_question_001", "model_id": "qpi", "case_type": "positive", "input": "我不知道这次服务器宕机的错误码是什么,也不知道日志在哪里。", "expected_behavior": "应识别为提问,核心匮乏物是数据,建议先检索日志和错误码。", "failure_signal": "把它升维为组织课题,或直接给出复杂治理建议。", "expected_output_elements": ["classification=question", "dominant_scarcity=data", "recommended_next_step=检索"], "should_call_model": true, "expected_primary_model": "qpi", "negative_expected_models": ["intellectual_archaeology"], "expected_classification": "question", "expected_dominant_scarcity": "data", "expected_max_depth": "not_applicable", "minimum_required_elements": ["problem_owner", "scarcity_profile", "evidence_gap"], "forbidden_elements": ["philosophical_bedrock"], "evaluation_mode": "structured", "notes": "Q 类正例。"}, + {"case_id": "case_qpi_positive_question_002", "model_id": "qpi", "case_type": "positive", "input": "竞争对手上个月的定价策略我没有资料,先帮我判断这是什么缺口。", "expected_behavior": "应识别为提问,缺少事实资料。", "failure_signal": "进入思想考古或组织治理。", "expected_output_elements": ["question", "data_scarcity=high"], "should_call_model": true, "expected_primary_model": "qpi", "negative_expected_models": ["intellectual_archaeology"], "expected_classification": "question", "expected_dominant_scarcity": "data", "expected_max_depth": "not_applicable", "minimum_required_elements": ["classification_confidence", "recommended_next_step"], "forbidden_elements": ["七层下钻"], "evaluation_mode": "structured", "notes": "Q 类正例。"}, + {"case_id": "case_qpi_positive_question_003", "model_id": "qpi", "case_type": "positive", "input": "我只是不知道季度报表在哪里,这算不算复杂问题?", "expected_behavior": "应识别为提问或 no_call 边界,建议检索位置,不做深层分析。", "failure_signal": "把它解释成系统性课题。", "expected_output_elements": ["data_scarcity=high", "recommended_next_step=检索"], "should_call_model": true, "expected_primary_model": "qpi", "negative_expected_models": ["intellectual_archaeology"], "expected_classification": "question", "expected_dominant_scarcity": "data", "expected_max_depth": "not_applicable", "minimum_required_elements": ["classification", "evidence_gap"], "forbidden_elements": ["哲学基岩"], "evaluation_mode": "structured", "notes": "轻量 Q 类。"}, + {"case_id": "case_qpi_positive_problem_001", "model_id": "qpi", "case_type": "positive", "input": "我们知道目标是三个月内提升留存,但现有团队缺少增长实验方法和数据分析资源。", "expected_behavior": "应识别为难题,核心匮乏物是路径、方法与资源。", "failure_signal": "只要求团队开会达成共识,忽略路径和资源缺口。", "expected_output_elements": ["classification=problem", "dominant_scarcity=path_resource"], "should_call_model": true, "expected_primary_model": "qpi", "negative_expected_models": [], "expected_classification": "problem", "expected_dominant_scarcity": "path_resource", "expected_max_depth": "not_applicable", "minimum_required_elements": ["recommended_next_step=工程拆解"], "forbidden_elements": [], "evaluation_mode": "structured", "notes": "P 类正例。"}, + {"case_id": "case_qpi_positive_problem_002", "model_id": "qpi", "case_type": "positive", "input": "我们要把模型库做出来,目标清楚,但不知道文件结构、schema 和验证脚本怎么排。", "expected_behavior": "应识别为难题,缺路径和工程拆解。", "failure_signal": "误判为课题或哲学问题。", "expected_output_elements": ["problem", "path_or_resource_scarcity=high"], "should_call_model": true, "expected_primary_model": "qpi", "negative_expected_models": ["intellectual_archaeology"], "expected_classification": "problem", "expected_dominant_scarcity": "path_resource", "expected_max_depth": "not_applicable", "minimum_required_elements": ["problem_owner", "recommended_next_step"], "forbidden_elements": ["philosophical_bedrock"], "evaluation_mode": "structured", "notes": "工程路径正例。"}, + {"case_id": "case_qpi_positive_problem_003", "model_id": "qpi", "case_type": "positive", "input": "销售团队知道要触达老客户,但缺少名单清洗流程和跟进节奏。", "expected_behavior": "应识别为难题,建议工程拆解和资源配置。", "failure_signal": "把它归为价值观冲突。", "expected_output_elements": ["problem", "工程拆解"], "should_call_model": true, "expected_primary_model": "qpi", "negative_expected_models": [], "expected_classification": "problem", "expected_dominant_scarcity": "path_resource", "expected_max_depth": "not_applicable", "minimum_required_elements": ["scarcity_profile"], "forbidden_elements": [], "evaluation_mode": "structured", "notes": "P 类正例。"}, + {"case_id": "case_qpi_positive_issue_001", "model_id": "qpi", "case_type": "positive", "input": "公司各部门对增长目标、品牌定位和用户价值完全没有共识,每个方案都会引发新的抵抗。", "expected_behavior": "应识别为课题,核心匮乏物是共识、确定性与动态秩序。", "failure_signal": "把它简化成某个员工执行力不足或单一预算不足。", "expected_output_elements": ["classification=issue", "dominant_scarcity=consensus_order"], "should_call_model": true, "expected_primary_model": "qpi", "negative_expected_models": [], "expected_classification": "issue", "expected_dominant_scarcity": "consensus_order", "expected_max_depth": "not_applicable", "minimum_required_elements": ["misclassification_risk"], "forbidden_elements": [], "evaluation_mode": "structured", "notes": "I 类正例。"}, + {"case_id": "case_qpi_positive_issue_002", "model_id": "qpi", "case_type": "positive", "input": "长期主义和季度 KPI 反复冲突,团队每次都回到短期动作。", "expected_behavior": "应识别为课题或 mixed 偏 issue,指出时间尺度冲突和共识秩序缺口。", "failure_signal": "只给执行清单。", "expected_output_elements": ["issue", "time_scale=mixed"], "should_call_model": true, "expected_primary_model": "qpi", "negative_expected_models": [], "expected_classification": "issue", "expected_dominant_scarcity": "consensus_order", "expected_max_depth": "not_applicable", "minimum_required_elements": ["time_scale", "problem_source"], "forbidden_elements": [], "evaluation_mode": "structured", "notes": "组织时间尺度课题。"}, + {"case_id": "case_qpi_positive_issue_003", "model_id": "qpi", "case_type": "positive", "input": "教育资源不公平不是一个项目能终结的,但我们需要判断该怎么定义它。", "expected_behavior": "应识别为课题,强调动态治理而非终结式解决。", "failure_signal": "承诺单一解决方案。", "expected_output_elements": ["issue", "动态平衡"], "should_call_model": true, "expected_primary_model": "qpi", "negative_expected_models": [], "expected_classification": "issue", "expected_dominant_scarcity": "consensus_order", "expected_max_depth": "not_applicable", "minimum_required_elements": ["recommended_next_step=共识协调"], "forbidden_elements": ["一次性解决"], "evaluation_mode": "structured", "notes": "社会系统课题。"}, + {"case_id": "case_qpi_boundary_mixed_001", "model_id": "qpi", "case_type": "boundary", "input": "用户流失率升高,既缺少分群数据,也不确定是产品路径问题还是品牌信任问题。", "expected_behavior": "应先标出混合状态,建议补齐数据后再判断主导匮乏物。", "failure_signal": "直接断言这是课题或难题,且不给出证据缺口。", "expected_output_elements": ["classification=mixed", "evidence_gap"], "should_call_model": true, "expected_primary_model": "qpi", "negative_expected_models": [], "expected_classification": "mixed", "expected_dominant_scarcity": "mixed", "expected_max_depth": "not_applicable", "minimum_required_elements": ["evidence_gap", "dominant_scarcity"], "forbidden_elements": [], "evaluation_mode": "structured", "notes": "mixed 边界。"}, + {"case_id": "case_qpi_boundary_mixed_002", "model_id": "qpi", "case_type": "boundary", "input": "产品上线失败,可能是缺数据、缺发布流程,也可能是团队对价值主张不一致。", "expected_behavior": "应标 mixed,并要求补充证据以判断主导匮乏物。", "failure_signal": "强行单标签。", "expected_output_elements": ["mixed", "补充上下文"], "should_call_model": true, "expected_primary_model": "qpi", "negative_expected_models": [], "expected_classification": "mixed", "expected_dominant_scarcity": "mixed", "expected_max_depth": "not_applicable", "minimum_required_elements": ["scarcity_profile"], "forbidden_elements": [], "evaluation_mode": "structured", "notes": "三类匮乏物混合。"}, + {"case_id": "case_qpi_boundary_mixed_003", "model_id": "qpi", "case_type": "boundary", "input": "团队说这是战略课题,但实际只看到客户跟进表长期没人维护。", "expected_behavior": "应警惕恶意升维,先切回可验证的路径/责任问题。", "failure_signal": "接受战略课题叙事。", "expected_output_elements": ["恶意升维", "problem"], "should_call_model": true, "expected_primary_model": "qpi", "negative_expected_models": ["intellectual_archaeology"], "expected_classification": "problem", "expected_dominant_scarcity": "path_resource", "expected_max_depth": "not_applicable", "minimum_required_elements": ["misclassification_risk"], "forbidden_elements": ["哲学基岩"], "evaluation_mode": "structured", "notes": "边界加误用。"}, + {"case_id": "case_qpi_misuse_inflation_001", "model_id": "qpi", "case_type": "misuse", "input": "我没有跟进客户不是我的问题,是大环境不好,客户都没预算。", "expected_behavior": "应警惕恶意升维,要求从宏大 Issue 中切割出当前可执行、可衡量的 Problem。", "failure_signal": "完全接受大环境叙事,放弃执行责任拆解。", "expected_output_elements": ["恶意升维", "具体障碍"], "should_call_model": true, "expected_primary_model": "qpi", "negative_expected_models": ["intellectual_archaeology"], "expected_classification": "problem", "expected_dominant_scarcity": "path_resource", "expected_max_depth": "not_applicable", "minimum_required_elements": ["problem_source", "misclassification_risk"], "forbidden_elements": ["不可抗力所以无需行动"], "evaluation_mode": "structured", "notes": "恶意升维。"}, + {"case_id": "case_qpi_misuse_reduction_001", "model_id": "qpi", "case_type": "misuse", "input": "组织创新乏力就是员工不够努力,给他们加 KPI 就行。", "expected_behavior": "应识别暴力降维,提示系统性课题被压缩成个人执行难题。", "failure_signal": "接受单一执行力解释。", "expected_output_elements": ["暴力降维", "issue"], "should_call_model": true, "expected_primary_model": "qpi", "negative_expected_models": [], "expected_classification": "issue", "expected_dominant_scarcity": "consensus_order", "expected_max_depth": "not_applicable", "minimum_required_elements": ["misclassification_risk"], "forbidden_elements": ["只加 KPI"], "evaluation_mode": "structured", "notes": "暴力降维。"}, + {"case_id": "case_qpi_no_call_direct_edit_001", "model_id": "qpi", "case_type": "no_call", "input": "请直接把这句话改得更顺,不要分析原因。", "expected_behavior": "应 no_call,不进入 QPI 分析。", "failure_signal": "输出问题类型判断。", "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": ["recommended_next_step=不调用"], "forbidden_elements": ["dominant_scarcity=data"], "evaluation_mode": "structured", "notes": "纯改写 no-call。"}, + {"case_id": "case_qpi_selector_gate_fact_001", "model_id": "qpi", "case_type": "selector_gate", "input": "只查一下 QPI 这三个字母是什么意思,不要展开。", "expected_behavior": "selector 应低分或 no_call,思想考古必须被拒绝。", "failure_signal": "因为出现 QPI 或模型词而召回 IA。", "expected_output_elements": ["no_call"], "should_call_model": false, "expected_primary_model": "none", "negative_expected_models": ["intellectual_archaeology"], "expected_classification": "no_call", "expected_dominant_scarcity": "not_applicable", "expected_max_depth": "not_applicable", "minimum_required_elements": ["rejected_models"], "forbidden_elements": ["七层"], "evaluation_mode": "structured", "notes": "selector 防误召回。"}, + {"case_id": "case_qpi_pipeline_before_ia_001", "model_id": "qpi", "case_type": "pipeline", "input": "我们不知道这是执行路径问题还是组织共识问题,后面可能要深挖。", "expected_behavior": "应先调用 QPI,再决定是否进入思想考古。", "failure_signal": "直接调用思想考古。", "expected_output_elements": ["qpi first"], "should_call_model": true, "expected_primary_model": "qpi", "negative_expected_models": [], "expected_classification": "mixed", "expected_dominant_scarcity": "mixed", "expected_max_depth": "not_applicable", "minimum_required_elements": ["next_model_candidates"], "forbidden_elements": [], "evaluation_mode": "structured", "notes": "QPI-before-IA pipeline gate。"}, + {"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。"} + ] +} +```` + +===== FILE: tests/qpi.regression.json ===== + +- Original path: `tests/qpi.regression.json` +- SHA256: `362ead2035aa6dece16e8abbeb94d6e44b85cabeae252299bd278e58052c2072` + +````json +{ + "model_id": "qpi", + "regression_cases": [ + {"case_id": "case_qpi_positive_question_001", "model_id": "qpi", "case_type": "positive", "input": "我不知道这次服务器宕机的错误码是什么,也不知道日志在哪里。", "expected_behavior": "应识别为提问,核心匮乏物是数据,建议先检索日志和错误码。", "failure_signal": "把它升维为组织课题,或直接给出复杂治理建议。", "expected_output_elements": ["classification=question", "dominant_scarcity=data", "recommended_next_step=检索"], "should_call_model": true, "expected_primary_model": "qpi", "negative_expected_models": ["intellectual_archaeology"], "expected_classification": "question", "expected_dominant_scarcity": "data", "expected_max_depth": "not_applicable", "minimum_required_elements": ["problem_owner", "scarcity_profile", "evidence_gap"], "forbidden_elements": ["philosophical_bedrock"], "evaluation_mode": "structured", "notes": "Q 类正例。"}, + {"case_id": "case_qpi_positive_question_002", "model_id": "qpi", "case_type": "positive", "input": "竞争对手上个月的定价策略我没有资料,先帮我判断这是什么缺口。", "expected_behavior": "应识别为提问,缺少事实资料。", "failure_signal": "进入思想考古或组织治理。", "expected_output_elements": ["question", "data_scarcity=high"], "should_call_model": true, "expected_primary_model": "qpi", "negative_expected_models": ["intellectual_archaeology"], "expected_classification": "question", "expected_dominant_scarcity": "data", "expected_max_depth": "not_applicable", "minimum_required_elements": ["classification_confidence", "recommended_next_step"], "forbidden_elements": ["七层下钻"], "evaluation_mode": "structured", "notes": "Q 类正例。"}, + {"case_id": "case_qpi_positive_question_003", "model_id": "qpi", "case_type": "positive", "input": "我只是不知道季度报表在哪里,这算不算复杂问题?", "expected_behavior": "应识别为提问或 no_call 边界,建议检索位置,不做深层分析。", "failure_signal": "把它解释成系统性课题。", "expected_output_elements": ["data_scarcity=high", "recommended_next_step=检索"], "should_call_model": true, "expected_primary_model": "qpi", "negative_expected_models": ["intellectual_archaeology"], "expected_classification": "question", "expected_dominant_scarcity": "data", "expected_max_depth": "not_applicable", "minimum_required_elements": ["classification", "evidence_gap"], "forbidden_elements": ["哲学基岩"], "evaluation_mode": "structured", "notes": "轻量 Q 类。"}, + {"case_id": "case_qpi_positive_problem_001", "model_id": "qpi", "case_type": "positive", "input": "我们知道目标是三个月内提升留存,但现有团队缺少增长实验方法和数据分析资源。", "expected_behavior": "应识别为难题,核心匮乏物是路径、方法与资源。", "failure_signal": "只要求团队开会达成共识,忽略路径和资源缺口。", "expected_output_elements": ["classification=problem", "dominant_scarcity=path_resource"], "should_call_model": true, "expected_primary_model": "qpi", "negative_expected_models": [], "expected_classification": "problem", "expected_dominant_scarcity": "path_resource", "expected_max_depth": "not_applicable", "minimum_required_elements": ["recommended_next_step=工程拆解"], "forbidden_elements": [], "evaluation_mode": "structured", "notes": "P 类正例。"}, + {"case_id": "case_qpi_positive_problem_002", "model_id": "qpi", "case_type": "positive", "input": "我们要把模型库做出来,目标清楚,但不知道文件结构、schema 和验证脚本怎么排。", "expected_behavior": "应识别为难题,缺路径和工程拆解。", "failure_signal": "误判为课题或哲学问题。", "expected_output_elements": ["problem", "path_or_resource_scarcity=high"], "should_call_model": true, "expected_primary_model": "qpi", "negative_expected_models": ["intellectual_archaeology"], "expected_classification": "problem", "expected_dominant_scarcity": "path_resource", "expected_max_depth": "not_applicable", "minimum_required_elements": ["problem_owner", "recommended_next_step"], "forbidden_elements": ["philosophical_bedrock"], "evaluation_mode": "structured", "notes": "工程路径正例。"}, + {"case_id": "case_qpi_positive_problem_003", "model_id": "qpi", "case_type": "positive", "input": "销售团队知道要触达老客户,但缺少名单清洗流程和跟进节奏。", "expected_behavior": "应识别为难题,建议工程拆解和资源配置。", "failure_signal": "把它归为价值观冲突。", "expected_output_elements": ["problem", "工程拆解"], "should_call_model": true, "expected_primary_model": "qpi", "negative_expected_models": [], "expected_classification": "problem", "expected_dominant_scarcity": "path_resource", "expected_max_depth": "not_applicable", "minimum_required_elements": ["scarcity_profile"], "forbidden_elements": [], "evaluation_mode": "structured", "notes": "P 类正例。"}, + {"case_id": "case_qpi_positive_issue_001", "model_id": "qpi", "case_type": "positive", "input": "公司各部门对增长目标、品牌定位和用户价值完全没有共识,每个方案都会引发新的抵抗。", "expected_behavior": "应识别为课题,核心匮乏物是共识、确定性与动态秩序。", "failure_signal": "把它简化成某个员工执行力不足或单一预算不足。", "expected_output_elements": ["classification=issue", "dominant_scarcity=consensus_order"], "should_call_model": true, "expected_primary_model": "qpi", "negative_expected_models": [], "expected_classification": "issue", "expected_dominant_scarcity": "consensus_order", "expected_max_depth": "not_applicable", "minimum_required_elements": ["misclassification_risk"], "forbidden_elements": [], "evaluation_mode": "structured", "notes": "I 类正例。"}, + {"case_id": "case_qpi_positive_issue_002", "model_id": "qpi", "case_type": "positive", "input": "长期主义和季度 KPI 反复冲突,团队每次都回到短期动作。", "expected_behavior": "应识别为课题或 mixed 偏 issue,指出时间尺度冲突和共识秩序缺口。", "failure_signal": "只给执行清单。", "expected_output_elements": ["issue", "time_scale=mixed"], "should_call_model": true, "expected_primary_model": "qpi", "negative_expected_models": [], "expected_classification": "issue", "expected_dominant_scarcity": "consensus_order", "expected_max_depth": "not_applicable", "minimum_required_elements": ["time_scale", "problem_source"], "forbidden_elements": [], "evaluation_mode": "structured", "notes": "组织时间尺度课题。"}, + {"case_id": "case_qpi_positive_issue_003", "model_id": "qpi", "case_type": "positive", "input": "教育资源不公平不是一个项目能终结的,但我们需要判断该怎么定义它。", "expected_behavior": "应识别为课题,强调动态治理而非终结式解决。", "failure_signal": "承诺单一解决方案。", "expected_output_elements": ["issue", "动态平衡"], "should_call_model": true, "expected_primary_model": "qpi", "negative_expected_models": [], "expected_classification": "issue", "expected_dominant_scarcity": "consensus_order", "expected_max_depth": "not_applicable", "minimum_required_elements": ["recommended_next_step=共识协调"], "forbidden_elements": ["一次性解决"], "evaluation_mode": "structured", "notes": "社会系统课题。"}, + {"case_id": "case_qpi_boundary_mixed_001", "model_id": "qpi", "case_type": "boundary", "input": "用户流失率升高,既缺少分群数据,也不确定是产品路径问题还是品牌信任问题。", "expected_behavior": "应先标出混合状态,建议补齐数据后再判断主导匮乏物。", "failure_signal": "直接断言这是课题或难题,且不给出证据缺口。", "expected_output_elements": ["classification=mixed", "evidence_gap"], "should_call_model": true, "expected_primary_model": "qpi", "negative_expected_models": [], "expected_classification": "mixed", "expected_dominant_scarcity": "mixed", "expected_max_depth": "not_applicable", "minimum_required_elements": ["evidence_gap", "dominant_scarcity"], "forbidden_elements": [], "evaluation_mode": "structured", "notes": "mixed 边界。"}, + {"case_id": "case_qpi_boundary_mixed_002", "model_id": "qpi", "case_type": "boundary", "input": "产品上线失败,可能是缺数据、缺发布流程,也可能是团队对价值主张不一致。", "expected_behavior": "应标 mixed,并要求补充证据以判断主导匮乏物。", "failure_signal": "强行单标签。", "expected_output_elements": ["mixed", "补充上下文"], "should_call_model": true, "expected_primary_model": "qpi", "negative_expected_models": [], "expected_classification": "mixed", "expected_dominant_scarcity": "mixed", "expected_max_depth": "not_applicable", "minimum_required_elements": ["scarcity_profile"], "forbidden_elements": [], "evaluation_mode": "structured", "notes": "三类匮乏物混合。"}, + {"case_id": "case_qpi_boundary_mixed_003", "model_id": "qpi", "case_type": "boundary", "input": "团队说这是战略课题,但实际只看到客户跟进表长期没人维护。", "expected_behavior": "应警惕恶意升维,先切回可验证的路径/责任问题。", "failure_signal": "接受战略课题叙事。", "expected_output_elements": ["恶意升维", "problem"], "should_call_model": true, "expected_primary_model": "qpi", "negative_expected_models": ["intellectual_archaeology"], "expected_classification": "problem", "expected_dominant_scarcity": "path_resource", "expected_max_depth": "not_applicable", "minimum_required_elements": ["misclassification_risk"], "forbidden_elements": ["哲学基岩"], "evaluation_mode": "structured", "notes": "边界加误用。"}, + {"case_id": "case_qpi_misuse_inflation_001", "model_id": "qpi", "case_type": "misuse", "input": "我没有跟进客户不是我的问题,是大环境不好,客户都没预算。", "expected_behavior": "应警惕恶意升维,要求从宏大 Issue 中切割出当前可执行、可衡量的 Problem。", "failure_signal": "完全接受大环境叙事,放弃执行责任拆解。", "expected_output_elements": ["恶意升维", "具体障碍"], "should_call_model": true, "expected_primary_model": "qpi", "negative_expected_models": ["intellectual_archaeology"], "expected_classification": "problem", "expected_dominant_scarcity": "path_resource", "expected_max_depth": "not_applicable", "minimum_required_elements": ["problem_source", "misclassification_risk"], "forbidden_elements": ["不可抗力所以无需行动"], "evaluation_mode": "structured", "notes": "恶意升维。"}, + {"case_id": "case_qpi_misuse_reduction_001", "model_id": "qpi", "case_type": "misuse", "input": "组织创新乏力就是员工不够努力,给他们加 KPI 就行。", "expected_behavior": "应识别暴力降维,提示系统性课题被压缩成个人执行难题。", "failure_signal": "接受单一执行力解释。", "expected_output_elements": ["暴力降维", "issue"], "should_call_model": true, "expected_primary_model": "qpi", "negative_expected_models": [], "expected_classification": "issue", "expected_dominant_scarcity": "consensus_order", "expected_max_depth": "not_applicable", "minimum_required_elements": ["misclassification_risk"], "forbidden_elements": ["只加 KPI"], "evaluation_mode": "structured", "notes": "暴力降维。"}, + {"case_id": "case_qpi_no_call_direct_edit_001", "model_id": "qpi", "case_type": "no_call", "input": "请直接把这句话改得更顺,不要分析原因。", "expected_behavior": "应 no_call,不进入 QPI 分析。", "failure_signal": "输出问题类型判断。", "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": ["recommended_next_step=不调用"], "forbidden_elements": ["dominant_scarcity=data"], "evaluation_mode": "structured", "notes": "纯改写 no-call。"}, + {"case_id": "case_qpi_selector_gate_fact_001", "model_id": "qpi", "case_type": "selector_gate", "input": "只查一下 QPI 这三个字母是什么意思,不要展开。", "expected_behavior": "selector 应低分或 no_call,思想考古必须被拒绝。", "failure_signal": "因为出现 QPI 或模型词而召回 IA。", "expected_output_elements": ["no_call"], "should_call_model": false, "expected_primary_model": "none", "negative_expected_models": ["intellectual_archaeology"], "expected_classification": "no_call", "expected_dominant_scarcity": "not_applicable", "expected_max_depth": "not_applicable", "minimum_required_elements": ["rejected_models"], "forbidden_elements": ["七层"], "evaluation_mode": "structured", "notes": "selector 防误召回。"}, + {"case_id": "case_qpi_pipeline_before_ia_001", "model_id": "qpi", "case_type": "pipeline", "input": "我们不知道这是执行路径问题还是组织共识问题,后面可能要深挖。", "expected_behavior": "应先调用 QPI,再决定是否进入思想考古。", "failure_signal": "直接调用思想考古。", "expected_output_elements": ["qpi first"], "should_call_model": true, "expected_primary_model": "qpi", "negative_expected_models": [], "expected_classification": "mixed", "expected_dominant_scarcity": "mixed", "expected_max_depth": "not_applicable", "minimum_required_elements": ["next_model_candidates"], "forbidden_elements": [], "evaluation_mode": "structured", "notes": "QPI-before-IA pipeline gate。"} + ] +} +```` + +===== FILE: tests/intellectual_archaeology.regression.json ===== + +- Original path: `tests/intellectual_archaeology.regression.json` +- SHA256: `f6f8a3fe60dbdb74fef53ebe6a297197f45422bc0b36e9aa5c13308f8033912b` + +````json +{ + "model_id": "intellectual_archaeology", + "regression_cases": [ + {"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。"} + ] +} +```` + +===== FILE: tests/regression_index.json ===== + +- Original path: `tests/regression_index.json` +- SHA256: `3dec6527791c81e27f8873bd5cc3db9e169cba79fd2c4cec41ce33c676fdb524` + +````json +{ + "index_version": "0.2", + "last_updated": "2026-06-16", + "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_type_counts": { + "positive": 9, + "boundary": 3, + "misuse": 2, + "no_call": 1, + "selector_gate": 1, + "pipeline": 1 + } + }, + { + "model_id": "intellectual_archaeology", + "regression_file": "tests/intellectual_archaeology.regression.json", + "case_count": 17, + "case_type_counts": { + "positive": 5, + "boundary": 3, + "misuse": 3, + "no_call": 3, + "selector_gate": 2, + "pipeline": 1 + } + } + ] +} +```` + +===== FILE: selector/selector_rules.json ===== + +- Original path: `selector/selector_rules.json` +- SHA256: `85e2c6d6815c6a9a3d33b38006d9e7fc40b5eba4509e973ee2e9b565ee9f948f` + +````json +{ + "selector_version": "0.2", + "selection_method": "rule_based_no_llm", + "global_rules": { + "negative_trigger_first": true, + "no_call_threshold": 0.35, + "qpi_before_ia_gate": true, + "emit_score_breakdown": true, + "emit_rejected_model_reasons": true + }, + "models": [ + { + "model_id": "qpi", + "base_score": 50, + "trigger_keywords": [ + "问题", + "难题", + "课题", + "缺数据", + "缺路径", + "缺共识", + "执行力", + "大环境", + "反复发作", + "系统性", + "怎么定义" + ], + "input_type_matches": [ + "模糊局面", + "业务问题描述", + "组织冲突叙述", + "需求或故障初始表述" + ], + "negative_triggers": [ + "只改错别字", + "翻译", + "润色", + "生成图片" + ], + "pipeline_position": "problem_definition", + "selection_priority": 95, + "routing_notes": "作为默认前置路由模型;如果无法判断问题类型,优先调用 QPI。" + }, + { + "model_id": "intellectual_archaeology", + "base_score": 35, + "trigger_keywords": [ + "底层假设", + "第一性原理", + "哲学基岩", + "模型深度", + "专家直觉", + "隐性知识", + "动态韧性", + "七层", + "思想考古", + "可复用模型" + ], + "input_type_matches": [ + "模型草案", + "复杂议题", + "专家隐性判断", + "需要抽取底层假设的业务方案" + ], + "negative_triggers": [ + "只是查找", + "只要事实", + "低风险", + "马上执行", + "不用解释" + ], + "pipeline_position": "modeling_depth_analysis", + "selection_priority": 80, + "routing_notes": "通常在 QPI 判断为中重型难题或课题后调用;遇到轻量事实检索应避免调用。" + } + ] +} +```` + +===== FILE: selector/selector_examples.json ===== + +- Original path: `selector/selector_examples.json` +- SHA256: `eae36650081bf2485ffcdadf4d10f196445d4eb3fdac815921c2c57222faf5de` + +````json +{ + "selector_examples": [ + { + "example_id": "selector_example_qpi_001", + "input": "我们现在的问题到底是缺数据、缺方法,还是团队没有共识?", + "recommended_model_ids": ["qpi"], + "expected_reasons": ["出现 QPI 核心匮乏物触发词", "处于问题定义阶段"], + "routing_notes": "先做 QPI,再决定是否进入深度建模。" + }, + { + "example_id": "selector_example_ia_001", + "input": "这个模型看起来成立,但我想知道它背后的底层假设和哲学基岩是否稳定。", + "recommended_model_ids": ["intellectual_archaeology"], + "expected_reasons": ["出现底层假设和哲学基岩触发词", "目标是模型深度分析"], + "routing_notes": "调用思想考古学,但应检查是否满足最小充分下潜。" + }, + { + "example_id": "selector_example_both_001", + "input": "用户流失反复出现,我们不知道这是执行路径问题,还是品牌信任和组织共识的深层课题。", + "recommended_model_ids": ["qpi", "intellectual_archaeology"], + "expected_reasons": ["先用 QPI 判断主导匮乏物", "如果确认为中重型课题,再用思想考古下钻"], + "routing_notes": "QPI 应排在前面,思想考古作为后续模型。" + }, + { + "example_id": "selector_example_no_call_001", + "input": "请直接把这句话润色一下,不要深入分析。", + "recommended_model_ids": [], + "rejected_model_ids": ["qpi", "intellectual_archaeology"], + "expected_reasons": ["negative trigger first", "no-call threshold"], + "routing_notes": "纯改写不应召回 QPI 或思想考古。" + }, + { + "example_id": "selector_example_qpi_before_ia_001", + "input": "这个问题到底是缺数据、缺路径还是缺共识?", + "recommended_model_ids": ["qpi"], + "rejected_model_ids": ["intellectual_archaeology"], + "expected_reasons": ["QPI-before-IA gate"], + "routing_notes": "问题定义未完成时,思想考古不应抢先召回。" + } + ] +} +```` + diff --git a/ccra_review_bundle/round-02_2026-06-16_second-audit/03_REPORTS_DIFF_AND_COMMAND_LOG.md b/ccra_review_bundle/round-02_2026-06-16_second-audit/03_REPORTS_DIFF_AND_COMMAND_LOG.md new file mode 100644 index 0000000..bfdbec4 --- /dev/null +++ b/ccra_review_bundle/round-02_2026-06-16_second-audit/03_REPORTS_DIFF_AND_COMMAND_LOG.md @@ -0,0 +1,1012 @@ +# Reports, Diff, and Command Log + +## 1. Validation Summary + +- Unit tests: PASS, 14 tests. +- Card contract: PASS. +- Model library validation: PASS. +- Index drift: PASS. +- Selector regression: PASS. +- Model/card sync: PASS. +- Evidence coverage: matrix/report generated for review. + +## 2. Git Status / Unified Diff Summary + +```text + M AGENTS.md + M README.md + M cards/README.md + M docs/DATA_CONTRACT.md + M docs/DECISIONS.md + M docs/PROJECT_BRIEF.md + M docs/WORKFLOW.md + M models/README.md + M reports/README.md + M schemas/README.md + M scripts/README.md + M selector/README.md + M sources/README.md + M tests/README.md +?? cards/card_index.md +?? cards/intellectual_archaeology.md +?? cards/qpi.md +?? docs/CHATGPT_HANDOFF_RULES.md +?? docs/CONTENT_STABILIZATION_PROTOCOL.md +?? docs/GPT_PLAN_LOCALIZATION_PROTOCOL.md +?? docs/INDEX_MAINTENANCE_PROTOCOL.md +?? docs/KNOWLEDGE_ASSET_RULES.md +?? docs/MODEL_CARD_CONTRACT.md +?? docs/MODEL_EXTRACTION_RULES.md +?? docs/MODEL_EXTRACTION_WORKFLOW.md +?? docs/superpowers/plans/2026-06-16-model-extraction-contract-and-workflow.md +?? knowledge_assets/ +?? models/intellectual_archaeology.model.json +?? models/model_index.json +?? models/qpi.model.json +?? repo_tree.txt +?? "reports/ChatGPT\344\272\244\346\216\245\346\226\207\346\241\243_\346\250\241\345\236\213\345\272\223MVP_2026-06-16.md" +?? "reports/ChatGPT\344\272\244\346\216\245\346\226\207\346\241\243_\346\250\241\345\236\213\345\272\223MVP_\347\254\254\344\272\214\350\275\256\345\206\205\345\256\271\347\250\263\345\256\232\345\214\226_2026-06-16.md" +?? "reports/Codex_\346\250\241\345\236\213\350\265\204\344\272\247\351\223\276\350\267\257\346\221\230\350\246\201_v0.1.md" +?? "reports/Codex\346\226\260\344\274\232\350\257\235\344\272\244\346\216\245\346\226\207\346\241\243_\346\250\241\345\236\213\345\272\223MVP_2026-06-16.md" +?? "reports/GPT\350\247\204\345\210\222\350\220\275\345\234\260\345\267\256\345\274\202\346\243\200\346\237\245_v0.1.md" +?? reports/baseline_before_content_stabilization_v0.2.md +?? reports/changed_files_manifest.md +?? reports/command_log.md +?? reports/content_review_report.md +?? reports/content_review_report_v0.2.md +?? reports/evidence_coverage_matrix.md +?? reports/evidence_coverage_report_v0.2.md +?? reports/index_check_report.md +?? reports/index_rebuild_report.md +?? reports/model_card_sync_report_v0.2.md +?? reports/model_review_status.json +?? reports/next_action_register_v0.2.md +?? reports/open_questions_for_CCRA.md +?? reports/schema_change_notes.md +?? reports/selector_regression_report.md +?? reports/selector_regression_report_v0.2.md +?? reports/selector_score_breakdown.md +?? reports/validation_report.md +?? "reports/\345\206\205\345\256\271\344\277\256\345\244\215\346\243\200\346\237\245\346\221\230\350\246\201_v0.1.md" +?? "reports/\345\206\205\345\256\271\344\277\256\345\244\215\346\243\200\346\237\245\346\221\230\350\246\201_v0.2.md" +?? "reports/\350\247\204\345\210\231Schema\345\267\245\344\275\234\346\265\201\346\243\200\346\237\245\346\221\230\350\246\201_v0.1.md" +?? schemas/card_index.schema.json +?? schemas/model_card.schema.json +?? schemas/model_index.schema.json +?? schemas/model_spec.schema.json +?? schemas/regression_case.schema.json +?? schemas/source_article.schema.json +?? schemas/source_excerpt.schema.json +?? scripts/check_card_contract.py +?? scripts/check_model_card_sync.py +?? scripts/rebuild_indexes.py +?? scripts/run_selector_demo.py +?? scripts/run_selector_regression.py +?? scripts/validate_model_library.py +?? selector/selector_examples.json +?? selector/selector_rules.json +?? sources/evidence_coverage.matrix.json +?? sources/source_articles.json +?? sources/source_excerpts.json +?? tests/intellectual_archaeology.regression.json +?? tests/qpi.regression.json +?? tests/regression_cases.json +?? tests/regression_index.json +?? tests/test_card_contract.py +?? tests/test_rebuild_indexes.py +?? tests/test_validate_model_library.py +``` + +Note: many files are untracked because the model library MVP assets were created in this working tree and have not been committed yet. + +===== FILE: reports/changed_files_manifest.md ===== + +- Original path: `reports/changed_files_manifest.md` +- SHA256: `f314898fdcae979fa97fd2fe4b0171ffb1fbc6a2d6929797bc7ce0162a6242e8` + +````markdown +# Changed Files Manifest + +| File | Change Type | Why Changed | Related Guidance | Need Human Review | +| --- | --- | --- | --- | --- | +| `docs/CONTENT_STABILIZATION_PROTOCOL.md` | added | Define content stabilization gates | v0.3 Task 1 | yes | +| `sources/evidence_coverage.matrix.json` | added | Field-level evidence coverage matrix | v0.3 Task 2 | yes | +| `reports/evidence_coverage_report_v0.2.md` | added | Human-readable evidence coverage summary | v0.3 Task 2 | yes | +| `sources/source_excerpts.json` | modified | Add quote_status/source_location and QPI pathology excerpts | v0.3 Task 3 | yes | +| `schemas/source_excerpt.schema.json` | modified | Formalize quote_status/source_location and excerpt_type enum | v0.3 Task 3 | yes | +| `schemas/source_article.schema.json` | modified | Formalize source_type/source_status enum | v0.3 Task 3 | yes | +| `models/qpi.model.json` | modified | Strengthen QPI output contract and source evidence count | v0.3 Task 4 | yes | +| `cards/qpi.md` | modified | Mirror QPI output contract and evidence references | v0.3 Task 4 | yes | +| `models/intellectual_archaeology.model.json` | modified | Strengthen IA stop gate and structured output contract | v0.3 Task 5 | yes | +| `cards/intellectual_archaeology.md` | modified | Mirror IA stop gate and output contract | v0.3 Task 5 | yes | +| `schemas/regression_case.schema.json` | modified | Add v0.2 evaluable fields and new case types | v0.3 Task 7 | yes | +| `tests/qpi.regression.json` | added | Per-model QPI regression source of truth, 17 cases | v0.3 Task 6 | yes | +| `tests/intellectual_archaeology.regression.json` | added | Per-model IA regression source of truth, 17 cases | v0.3 Task 6 | yes | +| `tests/regression_cases.json` | modified | Aggregate regression cases for validation | v0.3 Task 6 | yes | +| `tests/regression_index.json` | added | Audit index for split regression files | GPT audit package | yes | +| `selector/selector_rules.json` | modified | Selector v0.2 rule config | v0.3 Task 8 | yes | +| `selector/selector_examples.json` | modified | Add no-call and QPI-before-IA examples | v0.3 Task 8 | yes | +| `scripts/run_selector_demo.py` | modified | Emit selected/rejected models, reasons, penalties, no_call | v0.3 Task 8 | no | +| `scripts/run_selector_regression.py` | added | Validate no-call/selector gate/pipeline cases | v0.3 Task 8 | no | +| `scripts/check_model_card_sync.py` | added | Check hard-field JSON/Markdown sync | v0.3 Task 9 | no | +| `scripts/validate_model_library.py` | modified | Validate quote status, enums, 15-case coverage, v0.2 fields | v0.3 Tasks 3/7 | no | +| `models/model_index.json` | regenerated | Sync evidence and regression counts | v0.2 index strategy | yes | +| `cards/card_index.md` | regenerated | Human-readable projection of model index | v0.2 index strategy | yes | +| `reports/content_review_report_v0.2.md` | added | Content stabilization review summary | v0.3 Task 10 | yes | +| `reports/model_review_status.json` | added | Structured review status | v0.3 Task 10 | yes | +| `reports/next_action_register_v0.2.md` | added | Next review/action items | v0.3 Task 10 | yes | +| `reports/selector_regression_report_v0.2.md` | added/generated | Selector regression PASS report | v0.3 Task 8 | yes | +| `reports/model_card_sync_report_v0.2.md` | added/generated | JSON/Markdown sync PASS report | v0.3 Task 9 | yes | +| `reports/validation_report.md` | generated | Validator result | Validation | no | +| `reports/index_rebuild_report.md` | generated | Index check result | v0.2 index strategy | no | +| `reports/ChatGPT交接文档_模型库MVP_第二轮内容稳定化_2026-06-16.md` | added | Audit handoff package | GPT audit request | yes | +| `reports/command_log.md` | added | Command results for audit | GPT audit request | no | +| `reports/open_questions_for_CCRA.md` | added | Concrete review questions | GPT audit request | yes | +| `reports/schema_change_notes.md` | added | Schema diff explanation | GPT audit request | yes | +| `repo_tree.txt` | added | 2-level repo structure for audit | GPT audit request | no | +```` + +===== FILE: reports/validation_report.md ===== + +- Original path: `reports/validation_report.md` +- SHA256: `f8d894c6130d9be3f05d80b4f02fb41f51e499d1357e693350f3b0fe66178ebe` + +````markdown +# Validation Report + +Status: `PASS` + +Command: `python scripts/validate_model_library.py` + +## Result + +- JSON 文件可解析。 +- 模型必填字段存在并符合本地 contract 子集。 +- source article、source excerpt、regression case 引用完整。 +- model/card index 引用完整,计数、状态和索引投影一致。 +```` + +===== FILE: reports/content_review_report_v0.2.md ===== + +- Original path: `reports/content_review_report_v0.2.md` +- SHA256: `d24b1d77cf99e533a346c272a03ba19c06050044c99dfbe8fa465f441135172b` + +````markdown +# Content Review Report v0.2 + +Date: 2026-06-16 + +## 1. 本轮修改摘要 + +本轮没有扩展第三模型,没有接完整问题回答系统,没有引入 LLM selector,也没有升级 stable。 + +完成内容稳定化补强: + +- 新增 `docs/CONTENT_STABILIZATION_PROTOCOL.md`。 +- 新增字段级 evidence coverage matrix。 +- 修复 source excerpt 的 quote 精确性标记。 +- 强化 QPI 结构化输出契约。 +- 强化思想考古停止门。 +- regression cases 扩展到每模型 17 条。 +- selector 升级到 v0.2 规则防误召回。 +- 新增 JSON / Markdown 同步检查。 +- 新增 review status 和 next action register。 + +## 2. QPI 内容审查结果 + +当前状态: + +- `status`: draft +- `stability_level`: B +- `regression_status`: pending + +QPI 已强化输出契约,包含: + +- `problem_owner` +- `problem_source` +- `time_scale` +- `scarcity_profile` +- `dominant_scarcity` +- `classification_confidence` +- `evidence_gap` +- `misclassification_risk` +- `recommended_next_step` +- `next_model_candidates` + +审查结论: + +- 可进入 draft-callable 审查。 +- 不允许升级 stable。 +- mixed 案例和主导匮乏物判断仍需 Owner / CCRA 复核。 + +## 3. 思想考古内容审查结果 + +当前状态: + +- `status`: draft +- `stability_level`: B +- `regression_status`: pending + +思想考古已强化停止门,包含: + +- `should_call` +- `entry_reason` +- `recommended_max_depth` +- `layers_to_analyze` +- `stop_reason` +- `no_deeper_reason` +- `assumptions_by_layer` +- `validation_needed` +- `action_implication` + +审查结论: + +- 可进入 draft-callable 审查。 +- 不允许升级 stable。 +- 哲学基岩层调用边界仍需 Owner / CCRA 复核。 + +## 4. Evidence Coverage 结论 + +字段级矩阵位于 `sources/evidence_coverage.matrix.json`。 + +报告位于 `reports/evidence_coverage_report_v0.2.md`。 + +结论: + +- required 字段均已标注 support type 和 coverage status。 +- QPI 的 Q/P/I、核心匮乏物、暴力降维、恶意升维均有 source evidence 支撑。 +- 思想考古的定义、七层机制、动态韧性、最小充分下潜和验证要求均有 source evidence 支撑。 +- status、stability、confidence、selection priority 仍是 owner / product review 判断,不是 source-direct 事实。 + +## 5. Regression Coverage 结论 + +Regression source of truth: + +- `tests/qpi.regression.json` +- `tests/intellectual_archaeology.regression.json` + +Aggregate file: + +- `tests/regression_cases.json` + +Coverage: + +| Model ID | Total | positive | boundary | misuse | no_call | selector_gate | pipeline | +| --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | +| `qpi` | 17 | 9 | 3 | 2 | 1 | 1 | 1 | +| `intellectual_archaeology` | 17 | 5 | 3 | 3 | 3 | 2 | 1 | + +结论: + +- 每模型均超过 15 条。 +- 已覆盖误用、防误召回、no-call 和 pipeline gate。 +- 仍需人工审查用例真实性和遗漏边界。 + +## 6. Selector Regression 结论 + +Selector v0.2 仍为规则 selector。 + +新增能力: + +- negative trigger 先行 +- no-call threshold +- QPI-before-IA gate +- score breakdown +- rejected model reasons + +报告位于: + +- `reports/selector_regression_report_v0.2.md` + +结论: + +- selector regression 当前 PASS。 +- 明确事实查询、纯改写、轻量翻译不会召回思想考古。 +- 问题定义未完成时,思想考古受 QPI-before-IA gate 抑制。 + +## 7. JSON / Markdown 同步结论 + +检查脚本: + +- `scripts/check_model_card_sync.py` + +报告: + +- `reports/model_card_sync_report_v0.2.md` + +结论: + +- 硬字段同步 PASS。 +- 关键 output contract 和 depth control 术语已在 Markdown card 中出现。 +- 中文长文本语义一致性仍需人工审查。 + +## 8. 仍未解决的问题 + +- QPI 的混合案例是否需要更细的主导匮乏物仲裁规则。 +- 思想考古是否应把 `recommended_max_depth` 的默认值与 QPI 输出强绑定。 +- `draft-callable` 是否应进入模型 JSON schema,还是继续留在 review report。 +- selector v0.2 阈值是否需要基于真实输入校准。 + +## 9. 是否允许进入 draft-callable + +允许。 + +这里的 draft-callable 是 review report 结论,不改变模型 JSON 的 `status: draft`。 + +## 10. 是否允许升级 stable + +不允许。 + +当前两个模型仍保持: + +- `status: draft` +- `stability_level: B` +- `regression_status: pending` + +## 11. 是否允许扩展第三模型 + +不允许。 + +建议先完成 Owner / CCRA 对本轮 evidence、regression、selector 和 content review 的审查。 +```` + +===== FILE: reports/evidence_coverage_matrix.md ===== + +- Original path: `reports/evidence_coverage_matrix.md` +- SHA256: `0f74714543465b463c9eb45983ff5448d46c449b09a77c1157b3d3050fcf7ba9` + +````markdown +# Evidence Coverage Matrix + +Machine-readable matrix: + +- `sources/evidence_coverage.matrix.json` + +Human-readable report: + +- `reports/evidence_coverage_report_v0.2.md` + +Current conclusion: + +- Required fields are classified by support type and coverage status. +- QPI source-direct fields include Q/P/I taxonomy and core scarcity. +- QPI misuse coverage includes violent reduction and malicious inflation excerpts. +- Intellectual Archaeology source-direct fields include definition and seven-layer mechanism. +- Status, stability, confidence, and selection priority remain review decisions. +```` + +===== FILE: reports/evidence_coverage_report_v0.2.md ===== + +- Original path: `reports/evidence_coverage_report_v0.2.md` +- SHA256: `3fdb8992bbd7c4a2e21008b6ef72b36ddd2de56b0190580dadfff5123363928a` + +````markdown +# Evidence Coverage Report v0.2 + +Date: 2026-06-16 + +## Scope + +Models reviewed: + +- `qpi` +- `intellectual_archaeology` + +The field-level machine matrix is stored in `sources/evidence_coverage.matrix.json`. + +## Coverage Method + +Each required model field is classified by: + +- `support_type` +- `coverage_status` +- supporting `excerpt_ids` + +Support type values: + +- `direct_source` +- `derived_from_source` +- `product_decision` +- `red_team_inference` +- `owner_decision` + +Coverage status values: + +- `supported` +- `partially_supported` +- `derived` +- `unsupported` +- `needs_owner_review` + +## QPI Summary + +Directly supported fields include: + +- `model_name` +- `one_sentence_definition` +- `core_mechanism` + +Derived or productized fields include: + +- `model_type` +- `pipeline_position` +- `input_types` +- `output_types` +- `trigger_keywords` +- `negative_triggers` +- `output_contract` + +Owner / CCRA review fields include: + +- `status` +- `selection_priority` +- `confidence_level` +- `stability_profile` +- `regression_status` + +No required field is currently marked `unsupported`. + +## Intellectual Archaeology Summary + +Directly supported fields include: + +- `model_name` +- `one_sentence_definition` +- `core_mechanism` + +Derived or productized fields include: + +- `model_type` +- `pipeline_position` +- `input_types` +- `output_types` +- `trigger_keywords` +- `negative_triggers` +- `output_contract` + +Owner / CCRA review fields include: + +- `status` +- `selection_priority` +- `confidence_level` +- `stability_profile` +- `regression_status` + +No required field is currently marked `unsupported`. + +## Review Conclusion + +Evidence coverage is now explicit enough for content review. + +This does not mean all fields are source-direct. It means source-backed, derived, productized, red-team, and owner-decision fields are separated for review. +```` + +===== FILE: reports/selector_regression_report_v0.2.md ===== + +- Original path: `reports/selector_regression_report_v0.2.md` +- SHA256: `3e405e2c042162e8ce2689ccd4630a15a29180c596e4ec29b869cd31a1527809` + +````markdown +# Selector Regression Report v0.2 + +Status: `PASS` + +Cases checked: 9 +Failures: 0 + +## Cases + +- `case_ia_no_call_fact_001`: PASS; selected=[]; no_call=True +- `case_ia_no_call_edit_001`: PASS; selected=[]; no_call=True +- `case_ia_no_call_light_execution_001`: PASS; selected=[]; no_call=True +- `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']; 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 +```` + +===== FILE: reports/selector_score_breakdown.md ===== + +- Original path: `reports/selector_score_breakdown.md` +- SHA256: `4c0288770d51711a0153a1d9114f0619615223376552aa53f639ab06321d7613` + +````markdown +# Selector Score Breakdown + +Selector v0.2 emits per-model score details from `scripts/run_selector_demo.py`. + +Current demo input: + +```text +团队每次都说要长期主义,但一到季度 KPI 就回到短期动作,这到底是什么问题? +``` + +Current output summary: + +| Model | Score | Decision | Reasons | Penalties | +| --- | ---: | --- | --- | --- | +| `qpi` | 0.44 | selected | pipeline_position matched; complexity signal: 长期; selection_priority=9 | none | +| `intellectual_archaeology` | 0.02 | rejected | complexity signal: 长期; selection_priority=7 | no IA heavy-depth gate | + +Rules represented: + +- Negative trigger first. +- No-call threshold. +- QPI-before-IA gate. +- Rejected model reasons. +- No LLM selector. +```` + +===== FILE: reports/index_check_report.md ===== + +- Original path: `reports/index_check_report.md` +- SHA256: `81f165e1005e299af037ac6c4f7b14b30d51bf92b7b6bf5cefd02052cbbf78f0` + +````markdown +# Index Check Report + +Date: 2026-06-16 + +Status: `PASS` + +Command: + +```powershell +python scripts\rebuild_indexes.py --check +``` + +Canonical generated report: + +- `reports/index_rebuild_report.md` + +Result: + +- `models/model_index.json` matches the generated registry. +- `cards/card_index.md` matches the generated human-readable projection. +- QPI index counts: source evidence 7, regression cases 17. +- Intellectual Archaeology index counts: source evidence 5, regression cases 17. +```` + +===== FILE: reports/index_rebuild_report.md ===== + +- Original path: `reports/index_rebuild_report.md` +- SHA256: `a2abfdd397022a8e2a24fe4de823b425960d1ebfef0dddf469cae04158256df4` + +````markdown +# Index Rebuild Report + +Mode: `check` +Status: `PASS` + +## Result + +- models/model_index.json matches generated model registry. +- cards/card_index.md matches generated card index. +```` + +===== FILE: reports/command_log.md ===== + +- Original path: `reports/command_log.md` +- SHA256: `ef9b0f2b9556b46c46c59787d46cba513105e2bf4edcf6da8e4e9a19cc5931d6` + +````markdown +# Command Log + +Date: 2026-06-16 + +```powershell +python scripts\rebuild_indexes.py --check +``` + +Result: PASS + +```text +index check passed +``` + +```powershell +python scripts\check_card_contract.py +``` + +Result: PASS + +```text +card contract check passed +``` + +```powershell +python scripts\validate_model_library.py +``` + +Result: PASS + +```text +validation passed +``` + +```powershell +python scripts\run_selector_demo.py +``` + +Result: PASS + +Notes: + +- Emits selector v0.2 selected/rejected model output. +- Demo selects `qpi` and rejects `intellectual_archaeology` for the sample long-termism/KPI input. + +```powershell +python scripts\run_selector_regression.py +``` + +Result: PASS + +```text +selector regression passed +``` + +```powershell +python scripts\check_model_card_sync.py +``` + +Result: PASS + +```text +model/card sync passed +``` + +```powershell +python -m unittest discover -s tests -p "test*.py" -v +``` + +Result: PASS + +```text +Ran 14 tests +OK +``` + +```powershell +python -m json.tool reports\model_review_status.json +python -m json.tool sources\evidence_coverage.matrix.json +python -m json.tool tests\regression_cases.json +python -m json.tool models\model_index.json +``` + +Result: PASS + +Notes: + +- Key audit JSON files are parseable. +```` + +===== FILE: reports/schema_change_notes.md ===== + +- Original path: `reports/schema_change_notes.md` +- SHA256: `ec735e83070e5c871fac91017a18f7c28efdf722314b67121a85ccf774fb78c8` + +````markdown +# Schema Change Notes + +## Scope + +This note covers schema changes made during the second content stabilization pass. + +## Changed Schemas + +### `schemas/source_article.schema.json` + +Change: + +- Formalized `source_type` enum: + - `original_article` + - `synthesis_note` + - `placeholder` +- Formalized `source_status` enum: + - `representative` + - `derived_synthesis` + - `placeholder` + +Reason: + +- Current data already used `synthesis_note` and `derived_synthesis`. +- The schema now matches implementation data instead of leaving enum drift implicit. + +### `schemas/source_excerpt.schema.json` + +Change: + +- Added required `quote_status`. +- Added required `source_location`. +- Formalized `quote_status` enum: + - `exact` + - `condensed` + - `paraphrased` +- Formalized `excerpt_type` enum: + - `definition` + - `taxonomy` + - `mechanism` + - `application_rule` + - `value_claim` + - `boundary_rule` + - `validation_rule` + +Reason: + +- Distinguishes exact quotes from compressed or paraphrased evidence. +- Prevents `raw_excerpt` from silently containing condensed text. + +### `schemas/regression_case.schema.json` + +Change: + +- Expanded `case_type` enum: + - `positive` + - `boundary` + - `misuse` + - `no_call` + - `selector_gate` + - `pipeline` +- Added optional evaluable fields: + - `should_call_model` + - `expected_primary_model` + - `negative_expected_models` + - `expected_classification` + - `expected_dominant_scarcity` + - `expected_max_depth` + - `minimum_required_elements` + - `forbidden_elements` + - `evaluation_mode` + +Reason: + +- Supports no-call, false-positive, selector-gate, and structured review cases without adding LLM evaluation. + +## Not Changed + +### `schemas/model_card.schema.json` + +No new required model-card fields were added in this pass. + +Reason: + +- QPI and Intellectual Archaeology output contracts were strengthened in model JSON and cards. +- Making those fields schema-required is left for CCRA / Owner review to avoid over-weighting v0.2. + +### `schemas/model_index.schema.json` + +No additional index semantics were added in this pass. + +Reason: + +- Index continues to mirror model/card state and counts. +- Content review status remains in `reports/model_review_status.json`, not `model_index.json`. +```` + +===== FILE: reports/open_questions_for_CCRA.md ===== + +- Original path: `reports/open_questions_for_CCRA.md` +- SHA256: `ca1768311945d1a57b417c1149f90026545788a315be444985928e795560f97d` + +````markdown +# Open Questions For CCRA + +## QPI + +1. Should `problem_owner` be required in QPI output for all calls, with `unknown` allowed when unavailable? +2. Should `time_scale` be required in QPI output, or remain a recommended routing field? +3. Is the current `dominant_scarcity` enum sufficient: `data`, `path_resource`, `consensus_order`, `mixed`, `unknown`? +4. For mixed cases, should QPI always output `classification=mixed`, or can it output a primary classification plus mixed evidence? +5. Are the violent reduction / malicious inflation checks strong enough for review, or should they become separate required output fields? + +## Intellectual Archaeology + +1. Should `recommended_max_depth` become a required model-card schema field? +2. Should `stop_reason` and `no_deeper_reason` become required output fields? +3. Should `value_of_deeper_analysis` be added explicitly, or is `no_deeper_reason` plus `action_implication` enough? +4. Should QPI approval be mandatory before Intellectual Archaeology can be selected, except for explicit model-extraction tasks? +5. Is `philosophical_bedrock` allowed only when the input explicitly concerns problem ontology or model foundations? + +## Regression And Selector + +1. Are 17 cases per model sufficient for the next review phase? +2. Should `regression_status` remain `pending`, or move to `in_progress` after this expansion? +3. Is selector v0.2's no-call threshold of `0.35` acceptable for review, or should it be calibrated with real inputs? +4. Is it acceptable for mixed QPI cases to recommend QPI first and leave IA as a later candidate only after QPI output? + +## Status + +1. Should `draft-callable` remain report-only for v0.2? +2. Should `draft-callable` become a first-class schema/status field later? +3. Should both models remain `draft / B / pending`? Current Codex recommendation: yes. +4. Should third model expansion remain blocked until after this review? Current Codex recommendation: yes. +```` + +===== FILE: reports/model_card_sync_report_v0.2.md ===== + +- Original path: `reports/model_card_sync_report_v0.2.md` +- SHA256: `9a48a3a5db37fb5150cd007fbbc66c8ac5a24f282ce21bd2e2f7f1b503ba32f4` + +````markdown +# Model Card Sync Report v0.2 + +Status: `PASS` + +## Hard-Field Result + +- Model IDs, names, types, pipeline positions, source IDs, evidence IDs, stability fields, regression status, version, and last_updated are present in Markdown cards. +- Key output contract and depth-control terms are present. + +## Manual Review Items + +- intellectual_archaeology: long Chinese definitions, examples, and risk notes require human semantic review. +- qpi: long Chinese definitions, examples, and risk notes require human semantic review. +```` + +===== FILE: reports/model_review_status.json ===== + +- Original path: `reports/model_review_status.json` +- SHA256: `28bb3bcbb67f1af1e2f94e1e88fa093ed6e8c847a0da9a1810a7e0d6136509c7` + +````json +{ + "review_version": "0.2", + "last_updated": "2026-06-16", + "models": [ + { + "model_id": "qpi", + "engineering_contract_status": "passed", + "content_review_status": "needs_owner_review", + "evidence_review_status": "field_level_matrix_created", + "regression_review_status": "expanded_pending_review", + "selector_review_status": "v0_2_no_call_tests_passed", + "draft_callable": true, + "stable_allowed": false, + "third_model_expansion_allowed": false, + "status": "draft", + "stability_level": "B", + "regression_status": "pending" + }, + { + "model_id": "intellectual_archaeology", + "engineering_contract_status": "passed", + "content_review_status": "needs_owner_review", + "evidence_review_status": "field_level_matrix_created", + "regression_review_status": "expanded_pending_review", + "selector_review_status": "v0_2_no_call_tests_passed", + "draft_callable": true, + "stable_allowed": false, + "third_model_expansion_allowed": false, + "status": "draft", + "stability_level": "B", + "regression_status": "pending" + } + ] +} +```` + +===== FILE: reports/next_action_register_v0.2.md ===== + +- Original path: `reports/next_action_register_v0.2.md` +- SHA256: `d1198e4f856e43a569b3f65712dd3cb0b8b3878d04249457301316b5a3890e9d` + +````markdown +# Next Action Register v0.2 + +## Status + +QPI and Intellectual Archaeology are ready for content review as `draft-callable` assets. + +They are not stable. + +Do not expand to a third model yet. + +## Owner / CCRA Review Items + +1. Review whether QPI's structured output contract is sufficient for routing. +2. Review whether QPI's mixed-case dominant scarcity rule is acceptable. +3. Review whether Intellectual Archaeology's stop gate is strict enough. +4. Review whether `draft-callable` should remain report-only or become a future schema field. +5. Review selector v0.2 false-positive protections against real user inputs. + +## Suggested Next Tasks + +1. Run human review on `reports/evidence_coverage_report_v0.2.md`. +2. Review all 34 regression cases for realism and missing edge cases. +3. Add real failed-call examples if available. +4. Decide whether `model_review_status.json` should become a first-class schema. +5. Only after review, discuss whether a third model should enter the library. +```` + +===== FILE: repo_tree.txt ===== + +- Original path: `repo_tree.txt` +- SHA256: `9c8e36215a6974a626d2ccb2ecf120d31015db53291ebf67ac116df4823d5971` + +````text +. +|-- AGENTS.md +|-- PROJECTS.md +|-- README.md +|-- cards/ +| |-- README.md +| |-- card_index.md +| |-- intellectual_archaeology.md +| `-- qpi.md +|-- docs/ +| |-- CHATGPT_HANDOFF_RULES.md +| |-- CONTENT_STABILIZATION_PROTOCOL.md +| |-- DATA_CONTRACT.md +| |-- DECISIONS.md +| |-- GPT_PLAN_LOCALIZATION_PROTOCOL.md +| |-- INDEX_MAINTENANCE_PROTOCOL.md +| |-- KNOWLEDGE_ASSET_RULES.md +| |-- MODEL_CARD_CONTRACT.md +| |-- MODEL_EXTRACTION_RULES.md +| |-- MODEL_EXTRACTION_WORKFLOW.md +| |-- PROJECT_BRIEF.md +| |-- WORKFLOW.md +| `-- superpowers/ +|-- knowledge_assets/ +| |-- 00_用户背景与产品上下文.md +| |-- 01_核心模型地图.md +| |-- 02_模型卡结构规范.md +| |-- 03_核心模型抽取样板.md +| |-- 06_模型稳固性评级规则.md +| `-- 07_产品规划过程记录.md +|-- models/ +| |-- README.md +| |-- intellectual_archaeology.model.json +| |-- model_index.json +| `-- qpi.model.json +|-- reports/ +| |-- ChatGPT交接文档_模型库MVP_第二轮内容稳定化_2026-06-16.md +| |-- changed_files_manifest.md +| |-- command_log.md +| |-- content_review_report_v0.2.md +| |-- evidence_coverage_report_v0.2.md +| |-- index_check_report.md +| |-- index_rebuild_report.md +| |-- model_card_sync_report_v0.2.md +| |-- model_review_status.json +| |-- open_questions_for_CCRA.md +| |-- schema_change_notes.md +| |-- selector_regression_report_v0.2.md +| `-- validation_report.md +|-- requirements/ +| |-- ccpe/ +| `-- skills-vault/ +|-- schemas/ +| |-- card_index.schema.json +| |-- model_card.schema.json +| |-- model_index.schema.json +| |-- regression_case.schema.json +| |-- source_article.schema.json +| `-- source_excerpt.schema.json +|-- scripts/ +| |-- check_card_contract.py +| |-- check_model_card_sync.py +| |-- rebuild_indexes.py +| |-- run_selector_demo.py +| |-- run_selector_regression.py +| `-- validate_model_library.py +|-- selector/ +| |-- README.md +| |-- selector_examples.json +| `-- selector_rules.json +|-- sources/ +| |-- evidence_coverage.matrix.json +| |-- source_articles.json +| `-- source_excerpts.json +`-- tests/ + |-- intellectual_archaeology.regression.json + |-- qpi.regression.json + |-- regression_cases.json + |-- regression_index.json + |-- test_card_contract.py + |-- test_rebuild_indexes.py + `-- test_validate_model_library.py +```` + diff --git a/ccra_review_bundle/round-02_2026-06-16_second-audit/BUNDLE_FILE_MANIFEST.md b/ccra_review_bundle/round-02_2026-06-16_second-audit/BUNDLE_FILE_MANIFEST.md new file mode 100644 index 0000000..dc89a4a --- /dev/null +++ b/ccra_review_bundle/round-02_2026-06-16_second-audit/BUNDLE_FILE_MANIFEST.md @@ -0,0 +1,9 @@ +# CCRA Review Bundle Manifest + +| File | Size Bytes | SHA256 | +| --- | ---: | --- | +| `00_OPEN_THIS_FIRST_CCRA_REVIEW_BRIEF.md` | 3079 | `b9ad46ac23fe93e466ef55b4631daa4593a2158b1aaf30f432a962e4b4600c63` | +| `01_GUIDANCE_PACK_AND_COMPLIANCE_MATRIX.md` | 103648 | `a667f70aa7652ede151cfacbb907f67c7853647c0f846615e766e6e6e3e6223a` | +| `02_CURRENT_ASSET_PACK.md` | 113495 | `228f1fbd143c8f592e74d7ba9a60ec622a5d08487a43bb051f82ed517425a0a6` | +| `03_REPORTS_DIFF_AND_COMMAND_LOG.md` | 31018 | `ecccc2fa106c4e2e5db7a83448a334369e009a34f20b79d7a125c959251143df` | +| `optional_raw_changed_files.zip` | 116961 | `84ad50d10e47eeba65aa73078d4bdfbc013c3ec0b4ea52d866833842eb2ff8d7` | diff --git a/ccra_review_bundle/round-02_2026-06-16_second-audit/optional_raw_changed_files.zip b/ccra_review_bundle/round-02_2026-06-16_second-audit/optional_raw_changed_files.zip new file mode 100644 index 0000000000000000000000000000000000000000..780b510c693a50acd314b77a11e10e71fd3f946d GIT binary patch literal 116961 zcmY(KLzE`awxs{Got3V%ZQHhO+qP{xD{b30D{b3m*X>@b?|XwYIl~xyC*thb@=_q6 zr~m)}5>R3=r`uYcsXCxd|ij~z=VS>H&%lzD}sI!*S|M+1Nyp&Vfx?QtRFwGi>cJ~PK=X2;b2 zZVeJNvwFw(ote4t^t@L*+c0=~Ixux&r+U=BJa6pJ%S+o7cy`lS6a7&#w03%uysYY6 zF{Np`<5Vl$Ca>@F3sTJ5G;2@<>BOSW`MtEA`6S4$qETyg@hrqU0Trec@?6*=n5I%7 zX=2GMmeI^A$-%k3QZs%IzEV?#qFCiz08Vw~O~cs9+Oe!fA}OvME=ZT-?B($FX6zon zyo%-aF(Ei(f)rbxJ?%jGo7Sp%`$dFetGmL%K+j!+d;-)o?H0Xu$VZi za2l<_(#n38I9KJ@0!AXcTE=tw17h8f&rIqkrS^OAfM6#RG#x`bMqDY81L+9124Bt; zc$L^$Lrjf|JL8%An5erOIjO^s5>=G$jYCls&bxny3q_Q#8pG)Mt(P7ZvVfq;LOek} z!opJoaCiK7k**y+udSp7xa_!g;z&(F7LMYm6VsVvoXQGvB9@E#%lOunjP?Ol%6ul* zDo2snU(P}3QbugnQK;tOEVwWC6biM!%q%KaV`5mS&4f%+wXZ$53(i55`LODu-HC_X zJu6uP;~EDzJk{&^=o~A7X|qL)$44!iu!9TvRI{C0VC=(KuhxzcKXfwH&>bcH%|sZY zlv=A#xit3=1i(P7nSC-$Itu>TTF9Urboz}`a&WfcSB5`Yr~Zla~UHKjWLua z>1(GrBmQc{H>6w+#)cV-b+YOZts|>c>3udXBP|&m85HeHAvG@s3D%Zc6Ydiy4RZpU z^cnl&-4%Zbq#8wcup_apzz=tNR7|5_KYPgjFbbo>2E8Wy>L%2=S2ulO#u^?NdlP`j zgD^WY4~ff+%^i8|8)K4lG{bbBjAge(Y>^lC8Wg^kKz{#A?cij^t>~z<ZQET=G5 z>|(Kz{sgA9jonG5+!LCSQ^mRmy{rhX0*GQ%MIs6fc4n~lPJA{Aa_@@-N^Xg|#R$I9 zso5oOetdE7pt{eRTe4{lDr)+MN zTtDq{&J|CH^n=h(8rGK)_|mmz@Lhn#4a6ZTn(>UlL^}-~K!CCMi~>r2Uuv82NFv4h z?h0#zdItoHz^A;&*Z|z(>r>Zv%NL{O-=4rYCMnl@Ep}LBmypYuxoEaO$NrEAe2y5KAyj_LqX8B z&Vs3J^=unl&Hth-uEK{M!K2t-nU->P0z zUaOpop~d-5TK5fcL)4}zA`m@iothVp=^^6P9uBL*5)>1zo9H|s%T(ETKaE$?$=q&Y zi$VL1)|F+Z14CHsdk+F&YqM_Ut25Hph3pJgB+m;8-fpkmIX*~( z^VDRuAmpRGkO-+~y8Kn69%KEz)UC#AxX;&#S#P+RM>4;EVaNX|f*Cj9#VJX42Q8lW z>tKyhHJdtFI*W6rVNJ)FFHhDG*Q@R$P(CqJ;uGpB*mmALV( z5hV$}7ZgexF@aMj0ohNT!I(J8%@p>*MKZ_hkf%MQnweice0QXZ%f{H@+yWb<-YG632EAjgiz zkhMB*WD4qRDwQ@icwlxDtlYc`Qa5uARtRE$jIkKVKKG`W;NSpGrfG%*&EIB-mp;)$ zvI0lQhb#F;Jm`CfQ-yNHNbI~pnt8oo1iTZfIJZrQgc5Ni(u^b$8U4}+I8eg4;jqDS zaB-2jZu2pF4cD%?HY`R+KHlwdW~OpEe)NQ6*{uAcyNf%=e1}fU(1)5-e@cSjJ@zLLerV5C^JBjYRMXvmtKpdLv)hEo7Wr zbYHWL^6N{vyu!rhZa7&$(K0}l-)+b^E}qqzwm|I)oV8jp9_&I?tFnN@2z6jNDe9<# zP(Z*d1p#Tpy@M-zxzt`m#4b=`oaUhg%V3!&I=Gm}d{!Wr_OvwuUL)rcqrvAkQmjmj z%bRfy=^IYRnY1vHYc0;_i$96z$%M7C*kI&!%KWgJ2;?@Q6o13;%wQPX{Jjs$O>sTg zD;7-_#7d~TT&17Z-5^uZ+GIYsu7t)+7%Cs5V$ca6!F-LxFBxBmpK_cW4;28evZ@2| zC11mCx)feeG7*6%fa@ZT;q5te(kLIuaB}ulHA)htq`ifhIckUR650nBnfB;BKU!lz??g!2gv59h^ z@WP|QPElU8u;iBH&=3;LA3!w-DXR(ITu7T)1s;c~s1Jf(DX=AyP&w>W?bW0304OkD z#y$XZx1&QuSHxuIryC_ z?23Y%C*Qeprjf1lGyjjiF!+sS8i|u+!ni1bdg<}_23VjQ7fVS6lE+mIhN2Q>P=TUH z&me4&vQ$wBs3nWs^A?v4y? zfkug|CMpoRJLp82=x$34XG+!TiIwHd^dbxulg~+mdeIc0E6S2iWu<%mKwA#+?AR`W zQdUt5sA1%SN%ZHL#f#4LEV-4bLT7RA zdoWIOWMaJMkPGdD0t zDY-03yHNmFNdh3)N({!o;Lh?J9n^vdk@t(nrPUM=pN~t@3Spl~U!`faX8Si3wQy5S1w=nYW zBAy6{B^@J>riwh}1h4j!(6CmpGEAn>)kNO;FE8Oyo;oH(-1Z70DF=!(#hr%P=(^dS z4FuP{L)2@TEge<03ej|At26}4HbnW+g5;8I8!hkn3D+Vi&SU6QZ^kT2y0 zeB6{O;;rv8uGkQyr_g@&Vq(D-Lhy-my|9@Y1D*vfU|(kiAlyy^)%B1-yf6Ua0~zCW zG#{`I;$+1!{hvrRg(bC+qgV}gu7W4Uf(am+SZ{b$4mrv02CE6*F$>e368>Pb$|oU7 z_@`XL1UWDHttk{QiF%1C|1a-G1Xx6b{rk`Xq^@+wLG+@F%C@1^7M)d%aTXEnyS2ka zyk{XF!{hm>GIEvV-T{q&WrSB~q0n{A# zzR07X3Zt<14RO`myQ_68LG}!OgG6y&n}%)6x~t%ucyl$^mnYo_@yKx)Nk9x-M3Lij zw1J&B%WT;z6!@IHCGfU}jrxpx_Y~X~#Xj`M;{35O=9ZQ%gL@!a<6gZBDtKkr<>RR` zX~Fy!9laxbvs1P=!V~wlZrcylk6N7jba!_0{Wu)=c6H!s$C{>Hhdgo?ash4DTn}?H z^vDlD$zb~-ar}PQ+wuKb+4+3g@q7Eu>h*c)yin>C5vNNt(Ft+_$pdpeefs)Lnb%>_N`o_8bP@_>R zREO0S9W?avjUfO3gAJwWoOWutHtEGt39-L&K=XkTc;d<=<;*Myg&XjG;8GWA z{xCjO6!M}ZJ}x=+7$`I-xH~2H+WcEn^V?a6M&DduFuQyqd2bWwT0NLZx%wtFGw8I2 zK9Zp}0PtV!uubN)cgq-Ypd1g=M^8H*KTw>AttVJw7Q&YA_`onW?}_% zZaX1I5?YtF;eR82ym6s@yu@BddxHfR>y1akM`O%Qd6DxXr$qEbqm{Xz_Ww4mTRb%u zE<1R76>7EGrsCm{xp}S{;;B^${I$pnj{-BWUBxD|b^SG~>No7eggER}|BaL-GKq?} zv+=ZIs4ocG?m|Sz*1MTnzr$Er*kY zJM~*2UP*5WmW~;&g~eZ__~mo8TS;oQOM{j6>osh2w_01x&t**bO+gu2Jg%#T&*Vlq zRd0#Z#zKz)tL6Ba+rtQAqC2%Sb*#j;wT{yl0|{%mpQ~EFPy-OR&WoO{dhiuOuZu@r zt=5xexNL2g8FT}_ANS&xP0Cd~c)Fsvpe73@RTD)qKuZ(I7rd#uG51=q*E#WtPyXZ zkD1e5*~;Y^zfM>ZW~26zjS~k;%36dSUN#uNP$Nc72@$M`Qtz+#Bb3-v)P#hKd|ILp z1x+Kad#q_ErwOZ$a#Ia_PRPmV&_3rB#)k~hpdsYnKy?dc^Y2cRJ9nI~oz+ z|91UVT4YT({xz#-dr>g=5;q9T=8pNk=dkM2Nvuipe%Co_V5ZFx%v$&O=&;HtlONQ`j#>;(^MynPK_8VW*q}zl-lcAj9ya3+xuO1rT#LwDf5*b? zF~>I3c@>cLLEJHH$AOU8nZYT93%Fa}$m z9m4=MrBaIDn$uEWP|0y(uiiC`Gh5f?WlP5~X;ZITOL^pxuXGCfby5#Om3(bBYJ!x8 z*SXuRsz#bDti5KBD3nx6pgZds}^24PN~yV%O^|xz*il}i;@jI0NZzBzxg!Hq%k0I zHUwO(o=XFBdmONj)9VC7vO2T9DZ;Rb3Zw$2hT3|06{xdNb`c_SX5c=agOpLy^=s4O zX&PS&u{%H;7szilIr);Z1ta8DXuH-$xgYLsXrY)z8+xQ8jo$vwC#XTO&^6M((N4yp zCL_|M2C)km_eI{@t-TJV5eQe6>t1KM$CHXOt#CQ3?qQfWe+^4@%T2}Yg(nF-eGD@u z-K_7@u&MeW9Ym^K`(q%A4>0``gD%iIkyEjCEy&eUx5bIVmS*@F-~k);XKRR+&aU3? ziC_YM=0wV2)sWcKYFDV;2T(ya0r(>6TnnrY%s@Cd?PWVM5fY+}RS~^SkTPi+)9b+2 zDOH1dvly8n>6I3Y&Qne5ANrBZ8#al z^}{f|Q1CIh{Fq^slKsgWc@$-&?I6Ye?R)U9@{v{j&_j1303mMOB8>i(Hz~4Kr2CwK zVi?;%h%d^qS#5le;aYoq_#v#NuxRBM`bb`Doc!#`b12se1Topx7&A`Q@x>diQI67; zB2EzkWy-C^kez-6&ckKbv1*Uc>em6yrG~6+N>kX zyT2b~NATqIRen?}?~SnU@z=}ws-7^C!=QoY z9{Odh3M#1IiQPUTYlS3Ib2_qoih!SyXS&Vsb{Jp0)JP}dm`Mt<2P}#S6qJup8M*ZO zQ=yiA>$-WW0o13bP?zZ4x{NHgWi@Dbp>x10BxM3^-?Tj^`FKecIJQKtxbA5E$gpUasPu7A3IpYbVO7aWT+AI?Ju3@PQ=Ga*mY_ zPXN!dxd?8Ph`~6@ju{U=5F*h2Pe!I5EpJ8Je5|dGn(s}LZH{_{Wq`^v`9qSC+pGcf zoJAoko+~5)a1vr!i55??z))?4%ldf*=3U$|ioT-C-8J(O)hclR7@=ypr6zqSDMa>U?PY(pI*sGO@Go66Y(^{lb~p@S}P}T zjUA7=fBqgk#Ki8qVr~ARbl* z5WXF?^us2`Ko}nd{+2Dlo#!!_SPV7QS#%O*P7%kaiODDzJ~W#FMMGpwB@_rP zHyeSSc?&Bo%(XC8cHTMUS?)1a?KdRkF?90FjX>Spz#Bg%c+r(DYXmvR@@Q(hbO_ZG_GaW}eD>w55mvWl8Zy0579q+HGe<%rtQx4oc z9mcv@%j#Uh10P1%6Pbj}Z>DIO8#tHJQkWvINP#zJAiYr__PEdtMl zl!3);qj)&R&0HqG-}|*hdZX-D%KvKzV{fbb4EfFxm%Dr>CcIOUf1YM?x>6s@lCl82 za0hE%W03Nzn|#jt)B)-qYpU3JfajsRmy01uo;yNmvp=gD`HjS$@8^qj6=v>Ki6!Mz z40}LN^pAIfH#05w=OpZ0yqR63-1`G@ZfKy$X@t(LF5G*?+wuquV&v{^*siagmenOo z7oi+1-EAxWyv|`E_=Ir79BO!&EUp#-7HaxU#3xuAY#g!u0O+$PPo|iGliL@Tap%fS z8DXn-^0eN3)>w9C))#2DASn=D9=ED8zO0b{o5r6yhM>QAxu3U>^GT&~J${mOiy7jk zyfH@^?PCv9&ZoWqJE#%Rn7m=b0{~jM008*Epypt2@&875O4y@l+YeOADb2Mx)D7Z) zw>CSnmbQp1J5iyd>nZV(B#0gU>WJ&}xSs|frH8pgA`a+Fbio=DYy6PpUSn2&qF=kc zKSqo04rv6KcF5)No^b7WOsNIn`MvV$H=~Pq3NW{tG|+-mQ36FO$;!QI?LaG`fKYLcs^oFjv!N>M4%Oe79kS?EYeV6u*D8jD z@abvuyN1ogTD4!61-TCpys>YSnQ*d!`LS?o@Lcn)K`zHHV629| z-gqYLsBdPQ=!!Cf${_&HK1fx1BKFI@XHMPc_b=F6k^Vh*?->lFNr67Y;e~SGr)H(< zg{w}J`i46-%TQ#x!o~UWwElDk4z|13;|(@L3$wbERxUPK7=Jz&P0R$YA1%Vcgp2xcOK11}dhR3lA=rcT-`uNRVE+E#>7WqyT^@S{`2CYePTeff z`3P2oI*n8x4GzX`GM9h!Rck`yRyE|-gu-1&5fgfXkL9i`lh$r1!p2Ikdu}i^fIPMs zUBaE=qmY2TTeNG&Ckm6KQJ_)Z$Bpc4A?$32LLy#AB?yz!qD~srz5R_`(#U|yCL|XY zwyolb?wsPY(TlUGRnmXB37s3v01;u(;_d(u#Ar8#)bX|_}1YTP@VyHl4OPT z64K`&^g8npyu*Jc`^NLTie1QhEyz!CZi5{IeX2E(`Gy^IuV=jYs-Ii_IiN7KDA}Jt z*f|dqw+2Edle}VKhbTOFN{Q8IcpW)}7AnG4s`E+NrzJ0#ubglAnde5nBP{zGgpJ%p z4W}|X~xMt0pCW{JoRgdPtFL5$KjIlb{IH8|S!P&Y)A5q8z8H9b5|Nk1%t%Z31&So`p8m z9-~I%6!75AxyjIQOI7w=Op`~F%gJ$a>*?XTt-S13PV1D(p>mu8_@a@Xi-3O^HpNwVcAOHDGBEI5is8(jfP}luJ^|Vd*~oFw{xw0{Xgj6HcwI z^#}Z_b2f^}u$x^ajSW*!Ln7yc81HOwxgu6}u4lZ7znOTrLj>c$R7ZL`N@4B2_NjFf zQs6uI0~fu>9>QcV;A>vm0>9#WaFerSsraIWlVt|9!65eG5gM0ig8l_Y=1GI@k^farXo&KQ=GiH==(3a%xh=s_xxSc#qn!%9 zCg(7a95-sIrNmq%p;KSK$1Nqn4j$v>dvtqYBtl0IOfXnu6f9eL4dV9^*?vxm#LA5J zMhu+h7QUg0>s+lexD2`fxlty;lQhwmU_ zv15MbL7O`cUGkgH?|4&OXWJ;iEn#KoCWI*l^&@Wadx$^mY&jh zMcI_l#9gtIQc;&?7q(ZnM7y)7d|v_Rit5Vv_9;%mIpZzIJ!8GFoSNB~YM0bCZ9Gp( z+^J|tCV3A~hPqA~q9eBJ+f{ycstV}w)m+y%DTsu|T8t7$7i>}?nCSQY6z>o?1Sp78 zry<^Pw@zl$4i0RKr0fGK!0!~v1kFPw1a8e%+xK-xkx85Kb>-B-zqareR?FI<*^mv* z=3nIT9!ZCtojzsNb4x_5M7}$aMHZ7kU+Vzq75qKc4L$~R!>&W(kIFE^9a4b)MseI7 zE#>3>;`O%#G}m-H!*Erch0M4*o`~Yuap7HGJ^dQWeKJ_%RngFMNUh}L*I0IMJ{RsHDJhNpP(D{+~c1W?jIsv%>L*tV#a+)_w@+sL<=Vk0{^ z#S~kQfhXSpO}JF2*wy$q{L57Dc9EHJj?sq9Rez4f+mj3>nqy^u1GNv=UdpCvQnGhe zNJw5@2CTobC*RxC2hU<9jN2PW3UBHFk)~>hIwnJq13s3bee=x^8WJSaeN*oSzEkUF ziWPleYk=u7kIwgn*c$}8N+kYDi%&uB7KIs=>x#Cb{mm3F9d`JQb_)_6Y^^&!Qb5Yy z%Iqv9N^aPkCLm8<$gLg#WKW8zC}E;jhli?8-hOHvz&wAkD=kAYq3rzgp;hWZ;CX?N z2_wpBsgN-3UU1&n0O4VCWQd@yW$WuqV#LTELP7LGdm2@71VOJ;_<+z_GrbR8{Dy zBrN8v#-@y0`Dkd6%ZaMc-?PcAFMPGe>CXuGkvHsZBlbF^z5D`S?x+zO?Rv_WG(q<{ zzy3+se3BKlV-T-ah|fRYJF9I!#!WeCWnSg~JDbGd6my|E1O+WPv-jRM$>S`W$6@uj zt)aBD;rjyLDv-Mp6F89}>-V>kNS+M&It%9BRRJ~4n2#crc58;>=*HHCF7`T7%ZVp9 z{l!+&EQ2a;_TCiF8|_76N*>q89fYU?9U48`jNGV9Qx}yjTU$4e<#J2J=C5cacZuKA zVi2X~O%r)eXShp0`WKDikbEB}Iz?^q*U}cjJO9qhG1@N|eQ(-(Cs3HtC)DXJ?6{d> zQdnzOiH5!$a2DBNWO!1-BL}Do5>(48l!=^^$0Q5ojN3mSH_ptAEZ))TeLD~xf}+-h+44+_Ck7<&!eU_1_5PR`d9Wmc z0&c%ti$^R*Frr5S8G`88-(3l@BCwG_F=!%2NMlxSc}QGwtxp%pikSAq$rCYX-(uy0 z3(qlLU_YN>LYMe@7lxe4aS`}d4kQy#6X7IGc6RwhaCs>b%n_fnzq^w0W&Ln-nF%NI z4(JAy=*%lAHIobcoL(?{?;CcN%~S0ccm7bS!okSjkD*Rnb9-OW(fE_80{4(A1ne0w zlPug;<$_qfBhs&ed>QV&&N8QbZJ@B_ewceO7!h(Zfha=gh(_=1#RUtj^L+*uX@R=w zCejr`lx7zpBb_@FQ%%gZ!&%~W&l0lpL#gOF>Kh-zzpjR(EVl`Re*U$*8BAfLRjtmY zUiyoZ*0H#WCWxASvdqC;d~^mIwqPIW#&L7;AzTs2Jn7RA>)^mh_d@BJyPx&P{zN+Q zFK*_+Em`=a2eE9fUwdc<-h=@3p~9r;B%jUQp}oV{uYoa96&|M;Vbjj;5}Gp{r$rEc zFmjh7M9iUXc zdr3Gxb!%r@IYd_`wy=B;9y5YOJ*kBYq6p|Ja@MKsO$*IaGr3#j7jHP`hfZdS^9E>b zg$sFCn{p`JIY+uN_rrpk#@mC=x^$3xW#h@B4nd(9^XZBOoltt}Je0Tso%Od%s2Epf z2S;}L1#O01;S9eNkHUQ?<;(^fN1WLWPc6ZOQTbJY_bB&J8yf5FnM=%()^yT3EWt0H z;G#Gl+orHUSM><6vHSUEzY8R>Ua63>vx@aIhZgN}eIBlo%yxL+-nBe2<${r&9QGI0 zPdyC1FMs|UALWGSw2_>oM^XRHN9+Hc|CB!!MFfOpME)g6op>HO5C+)LmrrP^Dx0;n z3M%Yk#lK%OGMijc+Q>L!kFQU}U{38+lf`X!Wb*(bk}qlx-CQg`Lk9c>(GGx*ti|5A?< zrt*W)>}Bv=GyucGCkm@o-IGy{0thIZ)k0l+Pj*k&wFOKHQNB*>{qTZCXDBD}V0!`j zZAfQH@;mXWD4hII6FoLMwoHOh8e>4QaP6uJO>Yib0gkB z|CO#vc}{y7ld^Xf6aesp1OPDpNhc&Ope!b@tS2rYD=a4}s;8(TE%Kilt&NI~5{?L} zPoCcVFWof)f#EpG;>f@uVWB^OW^c{RjP0$^jI;VqGjwlYDhzVSkp2N-3PLPqlZ=>O zQsUteex_!8-y*UvQ}E*BgAE&aC%InN-K7v?>M`dCWM*S7SZ{@j1WFQp$p^5o@#DfH zf()Z?T_c2rR?$O>Q%rIw^Wo{l1!YVkl#0Q|(y!JDQwnwg<_i4K5+freq7qKX3Q1&X#6JAD*(Im6@}A&>vNDaF4@gLO)LgYOiZYt-U|nq0r7F%x#Ndg4>+Y;H2orSS=9=Fg`@+ zv1B48n43`AWdZHSz#v1}tU@dqnQ`b#h%c4(yTH94b+jK^Yn2hhmLKW`_*YXAGpYRY z!CA_YoTiGGFiGi%z|wqG$nF&pGQVVBJdFlc7C>dp62r?JZkGEcq|rv0z$0h4p;Y48 z*w~1r$?oBzNfx)R6?V17brqyHk=7jE?pEym2J@LhN-BA9ptd>3=7w`}PRR1a0Wy#9 z>L-6S3UT%=>e;|_w`T0|x_>Kvwl99RARZ9fRnj2%YMi;2+DENdtXnNV5&Ju?3;#}L zNs3lN@9NKmo7YR+`gCuOL0Z$x_i2x%tFLv7U&ldL$k&0Hg;Qg9OO9`2CaWI1osq>; z?Y5gtyk$4{IWC`!-j3_G!$Z4l)<;e?-=bI6+47+61HMk@%G;i+=ce?}+d3viq0i3c zm-mjx3Q2eO(RD4=urjPkYC;W<Nm2K*v0dkzSB;Z@4W@qA4p-$zHz7mR@NjxbbZ7&*wnI@> zqzgtDSgnwgtBAJ{>^BWPqrSxaoqmzb75Bc|N?@-jZdY0*6%>hhxnRujsZPqa!tg(k zWJpPw?01Q078r%vf=Oa3!tJES*9<^;NvJguBUHymbvt6KF=$h58kkWD965WAEy27w zED+Rxuo`|QmOVB-NC-Pm6wWFM9x`qY-5h5p=rVlRv?yylBa%ln7zglV{2ZyI9;TK- zQ($NtmGEV38dGmN4Lr2yd5+EnH~O2U7UFNeBJBMP0$&IALPM}e))VwI~>%ZFQ+ zor@eTW57}4Vi<4o0unMV%sPUZXS92M#P^SwdyG2xUph@ zL%z?2ISWm}{K#^^PZ4GD{_`DYlr@dHd?#gg|Dz|eWIU&xkwmCU^$&vB{~iy5|3FYq zR{7uhfS!`FfS`o5grx5QUQQXIl6C_*xC}*DA8F}+z-3b!Vj`*2MH|_yl zVRn93cQ0$fAx>tT1H6)v>vY^xHdatkLkc@4G-m_08TkT#t97M08p==2um*W7(16FH_R-E{|8iLieS+_yzQ6@D!JcyGp3ypS$v1b@uVlm%Bah=;7z0 zUTdq|IzGC<8X}(hE1&W_=4eRdY^ZQqS zw%He);QM|u+yaQxK!|Cu;4w_c0v1jne63U!R#e$Nz*;fHn1+W0zOXt3YryHOyAC0t zwc!QLI0|2(F`&n{JLpjANDtFO?a`l9nTljxXRg$^s$|Vhcv3AZim#dOeFvC?g$MClTSkp`8?r2Uia_v}m>hLh~ZyGD- zQA_@&3QC*iQ&J(StJ>q10rhihWa_l`$cOOPi@lFljTQ`r2nGxDm!5C`M%(!oNL*L^a5XM@{M=vMNtXtwx(^I52D$4Zsy;AN)hG&>x-fL;=kv`J8X<*d7~;k~RMT%EDFOOsf#ck{f+0;+#!tzxGn{zHeq`O-lF`3F zy2P#N-q@2T%+^aXH_`2K%DG7Io%klGKdmtsVJwo{6%OO(w>40A9>H}h>^Cim9@?S) z1p_VmtR03TGCgaZJ(4Vn`&xA~x~8F67otRtcTd%RIQaowlB+eC4(f`P>!c;@=^Uhz zJ+4Z<&>w@?5Z~!#jl;S`GVT`AUEa1oDbDQIwcZYo6YAw321d_rg12WDc8uR> zwUZLSi?G?Et$8oWj?WpF8Hd&Pab%!)?$%Dn6JkVcMovAvNSS$y_O^pZwL(gcT*m6r$?Mv&K6pZNh|gqwGWH^P(iV~KI+z%E^ublxw< zDMT;p8|=S!%j{p9?{`q{xb#2L;KBd^i2q0OwPj(`*oSt9aaw z&m(K6?ctSwr{TQ*)(>O$ByEG)b--+d<}A*WR$mlx=R&Sn>Kse zBRhAOFoPb$rw-$$7l7ab3!@Rn)tOE}=lp5lY8g*NWwmO#t9w8UbZp59-jwWUP|+Md zalNJ8u$4uI^P0=L%%#%m>bx>TWcX~*+-g8p#^B!_Et1j&{QH(H*dz8Y0`Li=dZ!EO z2SRiJW5p0yvpX`ytJarS1rwQEZ-jQsgl=4Tc zCZVCi=AXAYZBub{dav8;yJX@;IC7E)F{ci3wHG*Q6F-+nM1)cYst%T2TgT`vVS zpkToFv{j)et~gxOBP^?qrZKKlW9-DwXb_4-Rc}8~)P@FK>EL;k&z4*7}^Ky1u~VM^&ThfYFd zI*}!K9iIF7ktOKfGtg0w^O}UbnV?p%+>9udq(S7f$bKnZKGYcYC4}QpvqdM=K6L6q zNQ-5boHy)Ah$#=-&fZpg_kOb7@s~QU`m@egeh`H_y62L5{|eG-H9oYo#m{Z}XQkX^ukb z#wvJrxZ!1K5{K^)CgYOkK;;DSqNls$#K9e*r?EpNv0@YIVD5$TIwgeL%ywKxH@vrL z>Q{)7Ra&QK^E*15+DVgZSXarXI|+S~ps|+z2Y0L)QzHkS>gDrFJ@4Swn!y9dk~Fn* zX@RRutLlNY8>^IK0<+Ruyl27wbrvD71OnIsLCyc~10k(f+8@obc|x!UXk>hr2=&S%3h^OW0|kie9YKWaMJquP1`By*h!&ZOD{g*tlDQ3|;z z^!r1Y<-k{~q4)1jLP8Lgxjd=eN~+`BvoEe;8(7}7r(b6b1i!(v4wPT}JVfn=r`&WK!^S07lJeQiZpK>>J1(O^TLm&-+T-M9tCb(g8?BaFAy0I5bHRnu3jkGSoBLoytCQ z$8M6^HZWgAxO*z?HQD>T;^*04JzkV>O3eu7-!#Ay({w8+7!zw%PJmsU`&B8cTcilB zq!yCTN-qC;HcUz0h5cs#ArzaysrJ!qz)Ni>?C<5qe?h%PL|5?`;75$W!~bQO@-aGA#gfmg*N^4VGZ z%6;r>6)ZxWr=AUUbsSx6Uk2fL)>0*JBN*z+o;3j-qTQs;Ov0u4YFZEPn{Yci9oeo5 zm5MOM$gvx)TIF-Y9E=cMnZ1H-wG4!?-SlDmDgQ*kRt%t|)LMbWo-H|u2R;|R{avFe zTYmpmxP`wAxDzbA?rY*I<6~Pfcn`1s4A$* zxRVtdV<=%B&cs1D6LZ7!1e0d-z&|&)>E@-_r{1g+5CZa5Z3Zj^VBZ>{KE1d=my;@X z1;!I=U8ZHxg^pQ{2>(c+jF`K9d54i!`EmcDDN!hUa$^%B0Gr-Si zdvl>NSk>nRYV&kt;cshn*HSJ9v5p~LgK-zXnMv`-du~W)x$Gkn2Em~z`cSbvmR9Y> zz;XZps76Gf{A!m@f~bH7vTkDSjeq#rZ7k)P!LU^yCKBi~Z)as)gctHex2nE2J>y1E zP!bD|6_qKW7G8#9?~s1mF0i~a69xB#3&gngO%59)BKGX0qc(F*`_+#tOa2vB4EPGv zX>qMokbw|Aaf%d(zRIwssY*3O<{PJ?wBqW zaMikmrB(@O%GzFbnDO~7P`3s@w%nBBbubvBKd7)>?*EK;2EK?T?!H~L0)-GOxc3y#S0cf=OlFzhXd0Y}Ma|kiC1TFb#b&=Wnn2svQ;m>6s0@2z;=fqZJY5QW zzHQ!N^u(~%YE1AIFupE4jK~kX1yQr^fG0+Ah89jE8_(d(x7b35zzbG!57{d1j_*Yoi~M}x!X z^AZ<^aFNcT!DyEYdrom+sID@s)LKt!E8^@ZW``=rN?*y7bf>*(Yf#G}uJMCaK2l9e zrs(Eam!U9}6!LmkRQ$?hCmciIdYS#<9}Fd*%jB0X#xk*%2(Kqc)FNJPJ>oK&T{Eqe z%h2a34%Zhf9Ng6(@-o zyTpH%Ls-nMt+JL)F;0VC6 z`jMGEmYYdO-sww~ZQ*qMkCY*nS=hGUY7)LS5>?h1?l3_ioghR;yCy^a?2{kVZMG23 z$_ek1StrLlwLWlHV*tmws6Z=1nA^~yy9VLxOFV%ezGlq-3Y8&+Yrt?1ixfwJcBkFM zQVq6}yQMi^hs>#-KK4ZWl+h)1qNa}gw>H_`hDrH_)`s}$>W=wQ@Ct!Z*o`ZfN9$$5+r69ozS;2UJUrCv1<=Gh>fvPqFdL5?s$ks z4#a$A4w|mNcbqssip9c>){swC3#nHfUK3q*F!c_%%WNRkG)$U0t<+}N;)jejMVs$n z6aQ03F35Md1ay+Pu40F)JjyNR()L`b0t{k?B3yXWAXTuIe0S1wxUQSJM7vmLV`u(c zx%Rbq@#FDnbW&l&2X}iSBpEc5f6i%tVn~DX2a0zf?j9sK>y$DJ+h~NPXInBurRe{# z^-fW?M%$8Z+O}=m&Xu-pYo%@5wrx9C+O}=msNCn?s&lHfdYcdb<7_cTME`n>lftRs zxm1R~>FVUK&R_SIkHP%11E~0>iDjn;*}Ly>c?=tBT%%;wtN$KYQ92>^%~G*aS3Bmv z{>LHSEsv{f$^gGEzj*tiqKgsAQj4Uhae&4mkv%AB`h%989;n+y|h2KH83Bo8><% zr$uQ0L6SG`$BJ@iUu4urLVvHOt7;ieZnV^?C|EMj=@)hRwDL>ZwVw_z49rFr39oXyS`7P4zbg7G z6#P+G;GEmXE8^mQo&}F)INUzLX_VO~lLbN$9(bCK&CJl}msI}SbxyTrs( z8&hNI-5OD^ThNE?+vyg%sa{%q-cOJ=dP}v-m$Li)wF+frBs-f^@IWK2vY!TIS1-ZZ zx$fs~K8J;58mJFXA{T5CT-lW&GDTnP>psW>h0kV5JVz-=#2?y!2FeRW-n>?t+TCdC0W31<&x$CT(8_rkIPiTir3SAGj~sp~E@r?7x8m(qbZ5JJ|t7*d#VUhnC?Ix>D z#bApd^vozFC27@-Ao##-2A~%RAQi|Epp$gEmULYkZ}OgBujvHFCr~Sp46-Vc$c{n! zBj5!iC1F_45liO)oAkR`L5o|iMt@f*GxEw)k z+GyMGnyxt+NL77``;cWc--m8zP@2OV#MH?TX=CGXDHn5iOy;%_3EF8h}WmU|n- z&eA$EsZ*%EBmT%7qaCfUc4<&7q*r8nhl$KChcSkVVZ{ojBOO1EOq&|tz*){aF)S3t zO-^Q10NG-T8LVkI6x88Zj_xskXSf(U3Szj;9v{$P3t?X`X`?YJ^Tq1wnV7j_M}H`M zW>cU$DdgWAwu0Oi38;nU2ngVRhV?p}@``X!Ch1}CqC7e_?kFck%3%u0ZyWgqAaIa8 zV&m^38vahqJZ`0wCbL=JwP+x7=T|}{*c`u_qT|a2C#(|(X=6ZEKq_vBQe=P2_^Tcpt3lZ1BGJ?*z3wCACeo3 zMhQodd6I9O1qnM8&L*oWLQyp-z^u=L?T&Q@2L$su5wZFKqegJ<{$lc}z)Y@1R63&6 z#S4wSe9)`xo_xNj-aR*udxTuMCTDpf>e!S_wP+9{%e+AN%n&1vEI4F<-G?2-ltNs? z$HiTLrAR9p1|0yJ2795!G<0tRc$8yKod(OTBJB$%&hm5`^;@AQGF*$;s-2@z@9cz{ zmT-2P%>3IKQ5o}fHkYX;HI8);C8!KiBqs@5l1G_TGHa*keBNTC%Qgk(^esa@am z;3zZ*1XR4eI}pQ zr4IO#-LWC(F!&XcNW3%CcP5_Y*C@k=1RNCxc_@eZA zw*SfUKd;JbRAnwB;Kji;hRT;!7mCiR9FySLm&QL1_RFdalIMyWjFhy{*?!lRhEw(- zO^rGWh0B}$OxnRwPwZzSt2?J<2{lgaSWXGc{Y%jzvqvuEtKeBxaiRG8+wy`7Vlrt)7b-hX{|5U$KDKk zZ0>Do+vqb51~$R$1#RzjTTM|z}n7u+Sue(Wkd6f zhC!LfPs&tV5Te6;F}e8*!On0C+ed3DThXLexdGicl$eFouHf{z_x&pDF4_mMjYPM& z9J@?l^$w2K)xyTI7$Ih@PO5l8EyEffRyO`~ISc zA#~5EH4Qqu3L{a*I}nqFLqKtW4bE-klyBLbrsp`lxOH>-M}Yt#6~z${0s&DbcteTf z)P+ItAL!he9jZ)SR@p>3_^)06s`rbo%3BhbUR!;!wfMO-1j>@82_?x`xsqk`eKB+r z$=3yRrt=irUSbc_oIBL3oUQsf#YKbxd%_I&xDx8Ce6ucKSUU+uV?GSp3< zRu4>ky29%BEkRW3ARP@2?!w_|JvEj1cyNxk0|ZX#>IPF`2fR!U2h{PxMO4Cfs^}67 zs?V?{)TQ1|?OLN3Lxb*9$CDrA?+pYj;egD%VrA+5m(vT8kDDpMt`#3iRj2=BuSK@)`v>boQd zV3ACa2~vPM45U>tZ%jBvd8($}&$7+lO!nfSs^AUhK)T*Y;-|0TNc4<2=VhTYEDd`Y zVx@`+S)Cy5E-ouSm<(a6n?lC6KV;IGK#(a}kR5rV0;>Zz!$@tN-|c) zNg2KHf|A}62jY`BBIyAgIZk9ei|LZ{GSEQiEX`vGOqMu!Z(K&O;K2}k1WFzdyK|HEXxjZ_L2FJge4tqC4F?KSx4i{ zb$^S1W;_yw>R1@Gl;Ig_5~c`r?z>epNHwuK_9|9wfpf=Eh?0a(czjh;(Qsv1Rbe?* z!Nof#|LA?v;{=Xn2ri+-ruMAO)3gGVzkGQA-8p)HBc=y9$4EVs5q?mIbhW;wG^PZ#I&!S4BT z+3RHa^Sfo!+h@?iwy|MJ>=sj}yN&n^PacpBPI{R%x3*6QfLEqz~Ufru* z_k>97-_*_y-)cAe&&Sf^7QR4HeBqCNgKWfQv;Xo+`#X z)GY}kz_{uxeIMyr0v7ZqziQPrX{inJFvq`nO;FB0t9qac!$JW#8Nqq4iRb`_h}wYu zd8BvIrOo{)^LUXE3zuA*863A|=Oasw35S=%3v168 zZ_!t0f&Yx#1uN8XL?pXByDCG7)1zce_>;kQUsAz)V`fn>+SY3x9+wWQuw~IyVZruC za=Wd{u5YJCfN_}23Tnf8(YI871XyXsCuC8-7v25@7uA>ymc!~NEHsQk*U0$0>*Co- zc0*t3Lq1g`PIaq0i&tYL+*WPquq-3H7i@V$GjrOIQ#uB>=U%uZRQS>UWiA>5BKqql z5Hm!V4Gl#IC^eNJSQjjdCQK`~w0-+of&>u+4`uGE3%kVVcCMlP@@JIwcOs&qoI0n( zGm-&FLnlUVE1H(olJ0BOWMRI^;Pn0KIpNU`4lBGZ*<>XHXhJ-xQs)AcK1KC|d25v( zz6G1@K!2Nnr*E?tD;}iJ<$g*ldqGaL0?#?>aCi~x%I{a&19j?`g{`tRWmRk?l1urL!=t7H(i5?0*#=-qd2O(!qhJ8wnE zhs?0H^ziV37Deml!@CKM_eJ=i%e7H1e=R& z4~J3KP=6I)R|#1rFqYIu*A`4;+q!fQPa;1nKIeI9F&0 z^BE3gC%#682BP@MNGs5N00wK$%&i^?H2qtTjUNu2G$H%Qg)9O6v3oP)peSGmi$qw}b z_&W((5KGXBlAfpSum<8(?tJ<#iKHTSPpdq$(_eejueB;Wj8i59N!!#eGgc6;v|Mmp z)c6Wj%6}7k{EtnNF2wJma%kG;twQU{Hfq~O_2ymS(PW$@QzEu0PA0H%U_iPO1JI9) zIfoH&H&`9sWnwS-ep>TsgqR>6JjQau$p01#JnBeQy2BpsK(KZ5QtiUZ|lZ&y*n z2=B;DP2R>5dT8tWK_8i4p?l*Pi-u`-3lO8Ax?i&aZk!NTSs&p@^ifno^@JOho?Qpk8_6ixo+YnSpc zr587tki8wlwev_IU=)1>nsO!Rr>#A(b9|KMsXEv_x?E1I-gOKg4_(W4?|6XMELQE= z=lbGeU0-v46Ie4cZWW~+GhsW7Wd%;O@NG4qDBiV-+)AYZJ&g(6_x!#xw!s3Zmc3Ls zHy(%L)jx`B_=zRmr-2KHX3s@bCHp>`ldw{7Zm*BwzNl10ntup&^WR|UqBlE%rw4tm zg}%G@93}t?3;nw+%TVUQ=P;R)hJvid8JTkd67QT1MGoomTj?1~Dr-1?_?2G^pV|^9WE#3=Ewcv8xEafrOvQmuC9|`EB!MfT$1PO5g(` zN)gQrQiRSyZLV>FAcw4M`02<2akiuv_bo<7kJ@d!X%^BlJv|qzBm2LiSz)tx49D@q zmO8SV!wsJ4tJU<#Xhn&;YPD_eCh?>oS{r@JOO?+dJ`1@0Q3Low21nDQ6>LD*Zw!fo2;&7 zi_?ngv!f^2TU)7+wLK3IoG&h0(BHal`OqdcW#@`H1w&3EHvc?UpE(?Suxf*xXQ5px zin!8Ez!q0zceMV^_*7F=`W@_Z635(0jVbeBXf-CB^Wn-j4Qan@Ood+R+MQg!Qi6hh zq1`TfG6-oenlhjXhf43v#oy!forPhZY*vsI>`>q$nMD`c?ow!M;Hh=Y`fQRO-Z=l) z#IzKpyeVB==1k=*+m2XCc(y|5T(K&~soZXDT0FTwHp#A}r5q{vaojQ;`U)$(XpW*z zg(EC#s01l_C}&GGJ#IGB>MZFZ;)(Us$l4J%*RL3xc++ezQNDA%56d=alZ^`*Lg>t4 z%zm^A&n>Npu(epZc!IF0*myWWg()#}6+?dol5{JL&VPq1aO$!>q*6Fi4-))AvCaV4 zK-EF%WIfhMTh5l68x8a%zbso!8Em|Q$>xBddWEv7FZb{#UTuTxcSDa|rRDx^Hv_Tw zj=>t6)7-e8)TK#`k7p?J6MKJnadlEq`7tm{3-0HofR@gEBfY`*av8n+TlHncvGIfc zFl=@7Fuh@_nC`V(0@biJ&IyCWhVQuT0Zk*wCic&pJPJgHsIzHxaGQrWfiaDSa?l^t z^eR#GPab7Iy397BXyURLVhtghg}Q&R`WaF>PK8n=0l4(uQ`-uRTFI3*8Vw2++>vpW z&}sa~P|40El<~>+IZ8MtztzO$plg*dOA)tA6hCU**`#yuDUSi9-n#yo=7HP28HPT* z9m^BS6}VXkBG7`h#&cG@MYb5uD<&B$=}2F$maj|Dd@r1!jHTV1MK}_Y z2LY?Gi*&Ok{1d2vz=VQ2!%-DHE2tS9h*>0R=M{=M^GO*29b4s96A(>qjC4YWb(k~? zoho!jco~6&%>{C2c3-pEBl31z;f{4yq%PaVah0;A8ewCBNUeoc2Tolg?K3a{eaQVR zIv0np%B9FGW$7VCHc+%0iy8x;0||dq%-Ek=7v^cJ@aDk z8;>6wJm454gz%>K=N>2lRLqEzIQf{x7KRQ^fN>2HL-7Q&Bm$N=0hfsK6PBk^pr7ggPC&PZ_@~^e(AYSExrvv0a;1so7M9YIkNQ@D{+hpoo zH9{Xy#J~}P^AfN|0jouJF?Xo*D~19*(=ICLt-T!GDte5D#s-?5a{)PLTnEtrG5;t& zB$NPnrUbB?70b?(RDu_?Mm@t^be}%vmL(UaHjpLq(e%jnbv#5nSj--& z!Zm6Y3UF&^iI1o_hDoJE;Ix(DEczqPt?XkuX((dn9%|T8q>gI2@4MucB?z2&(i?@4 z*Lbobn|oGWqpht4v!G4Navrf2YoyYL*xP# ze<*JtjXJci_*?Qv<<9G-@Fe!TQNK9{FZp_ScVZ%2RC57<&bBrF|R*$dk=Nb=>;eld19dcE|`4z%cYUss2d zcjKGZHiA=bub<(^Y5LPY6whd0C+nT4I5smP{flwA?XN-9$_s;TllpTNt+Di6P>!p`aJv)~cKEdemN;e7TqpY& z<`-GCPVkVTMsfP!Li%f1woh@rPEygXr}d0Lsr?QFfj-*hxBUedsP}^IHZgw`2u$F~ z9>rZ_b2h$AOJy`DAeCCSm6oY04N~xp?#R)XQ-z*rt84AnIUz5kfrP+f;^R5_&>Uux z2q%a6Y}pRN*w(zeoozWbxM2>Ed2NgJMIc8*gff&Rfge(9B_LBL)DsKcAu3`r&ezDH4VV9O6R#D`G$CG&{tvj!-A)X4l1k?2o_N~+EpMbb6#7#j>^1$}P? zOUf&N)?f}ZL*#JKPKD@0mM`T?WA94xfv{ro9+Ha_>8F}m$P!_QcPged3k|g`osZJR z1`J$8PX&#Tylnvu#SPQ^Q5GV{5e*2T%&Y6A%qN+Uc3T;4!C4G<@}A+=Otg-o2nmfj z1e;j7*~r+J5GXC>En_6i5o)Cm=Dlz<K=k}W2vC4+ptmo82x+j&%^Q7ar2h=5kTyq)tEug#wuPi212C9^ z$Qef-AK|5Q;}D;l(o1Q0E}TxIc*6r9Ik`o!!L^X_7vPy`i27r#J(ySNhNLRMN^DyJ9=xJ_&Uto z0$NjDrXM4e>y<1vAH3}YY_S(l4SD<`QTC)k)cHG7i*%UJUQQ^7;@uE6(74^i1uLu7 zluu`h^B&AsYEhiBi4nWHztJHrmU_ZhP+U?lrj?S<#O@zaxV`2}ULjy}5H;9OKl{07p~ z1_i5qRj6jNINcxkK;LX%D`LNM3Q+roeCleAz~gh#Gy=s&MFjFLq(!ti4SXzh33fVR zRM~VAJ8x4J;}KeiYDNVTWuSpVPF@#d8F;$|#kaFPP_2MgW1~#3jdagsvv1;+m5IW- zn6Z4S6oAf@2AbdYk_@kX-XTg4qJ+zhfA)8b9=D=-CqnGbQBJva+nW?)mkh;tAKiO4 zlCK|>Lh>D9lR3fZR@_AT>29E+_Al9GMQyj%a@tQ^J@=;k8FB%GQb-XKbk7dfIOYrK zJ6psQ`jK7?I&X0{N>QOZu+EF?pZ;mk9gSwC^)fT!PfP5M4l*k!TiH1!E{y5F zmEFq)#6Uo8CJH(%8a>4-HRViOUXKETMzQ@Mbg3?!Lw!!1v5S>d$PO}zyW=Zx%~m?0 zM{!gQ1$^KRp_L4u7dEA3AMK-Sk7-!jd863)r(M=^{mStW$yB1fiDpaa;2y{0H(3LGCQ-~8w2t;L^Ml)H@&U*{GM47Cqi zp=PhP+k4DPEgX2~ZAmF{Pjf392w@ZfT!t9rvb{{u-saE91-xKpE<(EV>`R#|O@fBB znFH41)M*J%3lUF3sUX+XG>xoS4&tbv_)JnoWe{L0dErBW)3IvF5rx*puCJ4lKpGh} z1;={C zCeHxZ^0pW0|JKF_x41E5{Dp*x(o0PtP9Xv?{2Dm|j_*}MQh_zzkd4#Z_fQR^N zcXREX7=})CiVx-(}YSY*+klY)Og; zE9(gjZE->ZcbfnhB_Y-`+!Xv%M!8ujDegZ;fCjn z){MidrdS*xh=34b7d16Cbmsy*Uf(>rikLXZG281L_@$pjUG^!%hf@IOQbhrBCIw}d7Sbi zR%Qij30Upqm7-UV8KP_G^Hi6@MG6hsR5rksvRYEzn#WT!%T-;^A1C(QwDE_k)6&Qv z7)h$a5o3uNJhe2@(JlsJ+ilHU+$1))Erkfi?Z*+=xJ%ROl}Pen4Z9GS|N0fDiL~|!fAuc>bl)^5O*^z4|e0cMv5sG zb#Kj_@p?;xA@EdpLjWDA%{yEpJe%7s|zhxfdQksrj;=V zo;j2ezb1%Era@OGJ8etXYn)w+@kV#5fUZ`zm=H=aihXnSn)#i$?Rnp9GIHp~qtF1%y>3^;MdxBgV= z4jWfi`^%v?qrvIZo{G}}o`-GLe+`o`LCPaq5|rY4oF-1y%mE*%iw-DHKk3U+kf(cJaMxzWvUPm?=yquaT`WXUL^ugi0&Kyl`Hv z!Wf*!LfQ)pAO}JCt!ZjSr{bhw&ufDml^$G#YVH;ACcImDo^W>AvLCuH?4(8jibMmS zA+BPQoNS70EPLvWn!C;E_*LB(Y zBjZna?irjv4CVu2V3tjS4vTY2O+6|DfgD8@3PIl%*pH5o?J`SMWh_dlR>R@$f|gAb zyM%P#j$?QdjiFBLuLjaiEGx%S{%+W#*(2A(%6qqR;D&oSlAuuT#@ zWom8f`YTymJXVf4OUXMYYMV$}&Ec-5B-nOHSE`Ca3E=_OoC#sAY$c|e%xcWIPfqY# zya~y{RM-qHz{6yI{;MEayCYD-tH&dMc(HuP^;RF+T0fqRNI3Ib6hA~VdTuM5Z_gan|RfvJ?OsBQZ`UVczjLP?v@9oOD{%aoP;B>aGhydmEZGM zTW{h{pesR9U4*LytrFOUs3 z;6PF$XQ5Q7q%KfD^-!VnFTo1Ht<0NDj7-M3344@k!*V0h&v#J!xGpb))I-AU9;g{y znw8gEZ!~5c?6@O&@rSLX?k?vl;?`E4&qI- z?ze5CJ>%51(qRFxtwYmfOW7b~yCZcw`u?Yo)xsOD+kqA;H zvStqK46ux-97^k33>i2AP_UIUB!_k!69y_&Z2n#cX0LzQt8Vh+-@ws<*J4mX5Jalw zqr~x?U<-%KW$LdsL*a_YR&uLr5V1ByknrDpO5K zRgPWC0pQUmpFep(Fi^R#l2mi?Tg&kd)W9}FDyN`Ez?fBfrqz&YL3H@Va|`RSAV zN%Wj!ul@Zr+UG;`M-9FJI`utw^UC)zS{=9Yy4EG5El&~hC=Zut2hc^SN-cN`!AHnY zeQDG`_ShqMZCIaaL=%~pz&Lb|2DjZ3kf<{Sp9ul=VvOto*PrZcW;ZL9{@L$ereR7* z?nUtEYwq$vE1jLgh($&aJGkD-IT>9x4c z_uJYT=&FOa_`+EDTlxCoCgORWFt^dDk>kS*Zbmk@>MGW)0yh`8eGwZsJ0~OegC6qY z(dp;r{^sGPbxUNyumaJ!CU9HJxX6+oNKT}TApQEph3JCcX$@F!Gj`0Tm7{wBpe6NY zb345jpBk)z!+{Alkqz(_F)hsBF0|~gr``R))A6g* zYf-14ZBl%M~74^l*FcsU)cegZ#1n{!|t)$w74q#0t=`78OWK4|k0O3UC21 zf?Y3VYGF#z)hZ<}v{k5@s=PSD#^96v6rdz9bzKlu;aqt|HpA<#qV34ZRjcaEbb`2UfD$Pm@yrf|3g26_?p7!O6 zEk#d;NswmwExgpV5dQ6ZCMwx})scRcjuhzeQs|1-df9ihv+%<`IX}6&AfSx(Z((`~T zNf7$yH4+6^gjbjSb{lS-)A|vWR0|0^twDuxZ>g>okR8)nP$l$6R1w*VFeePl#i-;l zU8PPD0M_F621JLk1Vek%gy7j>0Z0TPrU0boUwHok9Vb$2Tn)ucHJWQsIZ|8oRt)v) zHSk03z#xkZ5SZJ|s$h2|by>g~*Z;%P+7drphLZNpt8k*#a;4}ByUwkO;9MwsN=Yu3 zP7ypSuSgS9vP?RgD;{jAO6gG}U16}* zv#QLT>a{%kC{IVsRfP`^Ep}{v1m;znM?3-P!nvDQHH{EXhf0br&m#U4$pIl67pTfu zllG>YBd}(Od=IF{w;NhnFKlSVPl(pXit;gnN%%~^_D^^L=}I3ysxXZJ;`x*ghX~qy zr^j~|$Q`EgOiS5{)WNOKM$8t2-3R9Kait|E&mAd|H4)667uuXWtON}7FV49k<_+pXd&d{Go8lJb0z8*Yo zm|0rm5Q9V-b&y2DVLF0PRh3pk7o+CyF7M_Oo zL`T9&(3ecQ8n|T-i$NY8&0Hc!>IrEYw*+7Oc zMky2bxa{O4NznhPMqnYZTD4c_EF~x_Q^mjh>4)nAV1b|O%5>2J_;6uWfgPMp6x?2r zEYKUr0*r@Xl9nz21`Ukoji}1ATd5ZZ;WFQ^U{m2O^s9j50=y6?5g<#*Y9j;pvZfZ$ z%uWyB$M`tjD-)xFXo1K~Sx&fG-RoFCVp%JN@hs?F&7U3k%_3r^m)X#znhfjHp)~Zp zS&zlAS+MPrEF*OgId?zy$maa5A){6c*&_lnH%tP_06lZs6(UP~s_s<&8GA8MV>L`| zx7HZj(GY5WqWZDWgn6+h%&P}e2b{~-qw53dODy8o#^vW0wxsJ84Gx*8Vv>>t20a@Ytdvi=MRRBwb7_E+_cKhM#)gGA&|!+=n}Xf zbQRQ53L){C)Vys$og!)zOwxCjY+@oHqcG)P1H+?EzRi;;D3Za^aj8R_H=Z&MP#qCs zGypIA^38%HE?UKLe%P~C4jK%c=UqLvVCit0l+~Z46R7UYJ0Q9b3f5#pkcbKbC8$su z;J;5s8oS9cH72Z~3`F;Dvh0K{U0LjDIv+{Fxft9M%2J6+9TBrGuc4%-eeQWmn&P<3 z|Dux$mx*%-IVg69y|=P1GY2jA7ECZS z6*PT$@Str>qy!Y4+-5{@EX63u+L-)i94<4-jnvZ#6!^0dN0RYPrfzH09=?SQS*jv0 zAyz1K$?}3puNGDs3}{idypFZZ(HbnC<8a4b**psa7P9SV3rhP5VTYoXCq-A^ATD%Lk%kS(d{Aez7^NynaRR4` zq$DPv_?+`#ASpM5ya<6^)_S~vyu;1sWBBS2JId>GwZoOE!_LO;f_QdX%a=2C(bo5y z^|ScKk-U(a{X;M3_dhed9Qd#S&sLVC?D8|8e#P&T;MEAV!{=J^?~XJ%;nwrmlM z?K`>L84;5&SgY?^%DWSR!wb2J2wH3Et?7EJ$c{YpowCVbiz!+5ldBa+lV z$n7=6)ND$kM#O*xR=PL;ek8UyXbX_#h^|tcJO!%c=UNyjL%Mxr0foWCtu<3rcvvIO z)mIZA)Qubb)D>x@OD({#ZR)Nd+Lp;v>o* zQhsfBF$T|#zlf^6QgxmzNEomc-SG$mp%1Ho)`Xw^Nn{z2WhiETxh;`Ois%)BYT@fN zT6rIt(zOkki;H(`=U1SZ{UxIY5 z2>y!%O4}-D6q-IVR;OBbRdh9>YqpUlkzW1uG@&`3yVRSh<#jcl3L7zvNyF<>xN$3$ zx9W>r=JcH{vEE^rtO7vz9^C7)R2zg9s{qr;>IrvOA;v1QrB>Xo6xUHyvYu@|zm%h$ zXik!IsRJS4V*yGbk$eGDl2xjfyBdxrOq}E2#LW0*5j(o|J3v ze&vo`j6+P9B1V(q=x>qYRmI!G>te+gn2B8Za@tgO)zv>i`It{=R}4&a;wy$ru!F)v zbq$3BHy^8{hGa37mIkgPY)Ye(SvcHqoi%ELYXw#S#H!nr+uN{-raRChe*FBUc< zx3u%5UEvC!L(uaI2FnQmu7i$z8r}dpw&M_9;Pm-T<-Z89sJDPH2b&Tc)P1GUv6~C1z zspo5!E(_+^sfJb6Wm%>Y$tN)W1%Jzg=8s66?uRVO6$)vZ`_Z^y^cG15N`ecEk}qbz zt!WP54K=hM0{}08<|l=)#~p(biPKlhMX=o6F#_<6%Bnqc{T(NCALW+|}c;HyZOn%83VBR)QYL8b@ats9m0p7kk*kF9~}KyauF@ z>hdr~BhA#N+Y4=P2x5ByFFZN((D*uAJzaeVUsvCm08yv!)LxXQwd8X7@!h{}!QoOc zaoF)(?-T#0N86*F!@Qa%m}JZyoZ2u<;nmmdkGy<5?d<>)h$mlD53P|79e;+LqgBR4!LJ^6#<#k-Hh&!})c3zA~3tS{UiO z`8{PdxAr3FxZC6oP15O4#3lWvBWFT%CAu%{Fx_Ys=lv>@gL|zE1DSiG82K1JaJ?pS zd|R&6J8L<{TZCRL+k#e?h=DCv468+rbOWRB0va6GD|4$faDCNk-(!WL7siU83(A^`^h(*WR#S7z>qSKRdTnv*M!iZY!eX;cz1}w$k76`(Uqjs?0+abqEQDs*--;*Zw;K z+j#@!4ps%l7#99sI;B^IutNftS@K}`b6T%B^E?mPYT*9k%pPZ!3b5E|0`ne`VhO7W z?vS>OFNNx{33Qp}dwLWLP^w|GfriB*Sah3V0^7aZO4WNADEV?)OEMotk_cIjf4%}{sJW(cHltEO;XwBgW?VP=OV~A z@)0Eo#qc01ptgjJp*}X2hD!UwXSi?$6jHNsHAu?83kz3A3FeDYAYUc4>Ry2&?H|b zP0LLF$a@e{9i`R20l-+x{*2MEm*fX8dX*y?b>MiCU>6Uxv6%0}Vz#TTTGrZ)mL9$_ z4Zh$Qij@CNH{#)CQ22aoOD_+l$mz|L4koHDrJF(7d>;|vnE>ac%aJGO1xwr$(CZ5xyK%sJPb z`2*|2v##p9tGl|2lz8Q@alH>iOX{3Dp)D=9IZRlc>S+#?LAEXF|uC|&Wr3h*?2>dr)b4PoI*UWE3}F|7uc^-IM%(dS zWqNE^UAei*c|nnUQlcO~bt}{@I|Ek^bZl{7%)l#{OBO2wunBP(lT{{vdcfZhydKsb zu&U$$ZNOhaBEplv{4gyp|N9?+nQ#_(OsY{SRk&WE;Y*NsL)40#zR%qS`2fS%T1r4d zjVL-_6ki7)Ob{q1UAsF99acZfNKwe~Dx>+rI0gU&ZkYuZ`0ZVAF!~=%&L_-4IRE-7r zIa^9QI2l&=cR#cK5oKD;ud~V`r%qVNL*j5oUdj6b-_~A&M-=?$t%Hz7f8{qW*G@Lx zHUrWI(?bz#Yyd=PvaR2N;p%)UXt$96aLY&RBoRh<>Hye}zrv^1#=z*^)%cU+$|p#W z270P|k(x=rx5qCq}# zEvx3Zp-)gkMkHS%tif^nP*fZSgG_#U_e1`D^trnN6@OWK0)I|)$SI2x8Lgxt*70qH zgd>c|+bHLlZe*Bpa3kU7!{1VPLaOdJ=@+*IlaahYwp)lc$kbxPJI82HyqeOJg`kM~ zy8RI});W^HSXukEC^`KsDjdtAd$|UeK?o`S1-V%ggS^-1@9UPa$nUgLUC!vEG71e& z^eg#j55waFR}@n5qFDk7yT%N!y22zDo34Fm!esnQdseEg1UqAAnr>tj#2LSM37o#c zHDbZO-9DI}%ygF-ws7Cm()y~ahC)qriJ9>da{5Y3n^oG5iTlUW^f zr-n|W5qh?3B(Bl;eI+u=VjHSk@1h*O&`kvdOU=R(D(B8^{b0X?Dxix+Rx?nrcLuV; z+NKy1U_{7xO?H$g9-x@_+%uzWR`AS|QiN`wJE=2|RQoL3WH1D<(A)4^t_irnVb2*8 zuW{R?=Dt!2r#HV*N$`VKLN?UYpGdidP|4gw*&=Gu+Z8^5<aBG_99U?;%ja3m{5+MTznkF)UT;>T+5;Rgr5p9m z&6E11z=OJA+{na)f8IbPm+Q1_=0$YO;MP^uh_H(NRy@-d59pK&v~hYzU2Axo&G7Xv zkt9dT`8o7msY*X;Y4r+s9W=Uw`iq|msL4Nadg2cgl9W~FA&NQB=|eA?DB-S7S3O9$ zywDyY*RJQ*rUB z99Augm8})5vY#3gc)k_%X$dx{$$`hfh6OfdimJ8kKwz`_1cA+>%H*0>L!2>Qz;(HwVr zUDv3%?m>*9?njb@=9O{p_kb z-nl!z%zVvw_joxK_#DYWe6rL3wp1gd_>{cU*5E68JKdg?5@8>Q*UJO!t(;1w^+HNj zHCCed+sc&gqTp;xVA$~B*lKNFKNl4NHQk|joyb|-_+Rf+-%0%XikodeVSGL@9fJ%9 z;9H9{dR}!;PfcR@y>#9!UT?BLRh9uAdcrk1(QMyHFX6H~CIVP4VSHb%7kw96FVpbd zoXFO?Bgu{~D+S3}lPMdN7j`e7NxYY7&b=LLQ!W+}{4^JB-q!)5|pyXggLV z+Rimnrnzo(0(691zt$pu_$EQPu{>tEwaz()o~f*rlbNuUdSt%#CL3KF1jpvAGW>K{84Kv*i;zG*e&F%{IT zQcbmBpNgO9IAIH_h_XXKD?o|x#vG?I=HGkMZ@9>ASZL<3bEs5ATqr9}YEO%lo_(9J zeYfc__ypLzg!rdRy*~YakL`Vrk>lPCl%G^(&pDE$srV#e6aBCAWXVa?nT|j7wH- zaV@JP$up=^COVW=ZqcyS&Y4}&kHGnUf8;juUl6;IBDiB|HGYuNV^Ge+wVgHlm4J z5WQB^5LVSB0*rCF*&;!WqfA{onG1pnhe-Yagq;_+o7ZJn$J0iA0=rEZZ3mF>$K60a zbK94TH_;t{tc46YveT=SOmnKZ6K7X#*hFrT^$;5z6}_%VbNcg$W5G_T^?)=Ji4hLRT$K? zP$d1${E{#cu&V4s)eThi5NPpQxu{aD@O|)5DuLFKA})mHVwT*5D8VY}EDwNjF9D&) z?nK^hrc>JDDq*^~Z-BQbaZp*nr%$t&xqYm%qSk=VjBnF6QktYr_-91gpty4W{t)wU zhV12B{s$*}ex^{(Gg}P|6OihOsA709h1=Yb4wHP)Mkn_Y<9-KjsA`?kC!Bhm(+93(%MHCyb4TrR>51hpheD#=<2l5eV*Uv@a+2)^NCOh@}J zS*ns9T)!%?rcfYMV3A6QXdV~A2f>+`t+XEhxf?4yMv^s?QSXIfi>>8D^D?nuuxs=- z=NWJg-lIn-)|wWHr$Kl};wKAeJL2$Afh#00c!B)D%GW91o+85VKhn4Rcbx{J8HO9>&13VA!h1xIs`D3@{tG*vtZ8qeN&?D_)4NGd?d-b z;||*6x8DnfyVyx*QPW&Z9n0G8d#?k3{gNi&3raT5wzlk_-wfhOHn2gH^94U=aizRt zENe5ALSLsg%Hw5!fGBqr%%313wUqb6C zfr$vnIv8-5E*G=L9!u%x5Dy9vYXZk8M29M?&(n`EgSF|FIzqmAk7IXgk;=76eWcIDoCkL&!08{XVv9dBEsk{V8HU2hS&A5ab9Nx z`mWT51nB1hCP}l2MI&d&PWWZXqaUqvNxn2vuH^$lM_>6x8$^2rm#dadDl7OTm_)S$ z`dW!b*&7f*d+OWyS1a>#_2t$QDA4XXc$K=FF&FFMUz5vZd=F!`!y(Y}59mY3((nyR zrw-H@-D+7!;$IqD3WkF|gxM!m{{wiW*wC+V3{$Ey+mP*jnOX8hA_DK^#{S#xf`j*H z2y>IOP&Lv@kYi@AXka8N2Dcw#N``$ zEFZCjHSoag;h$@`qyTEezk&Pb0X>;WYonybRdg@OU1k$ab`` zE+1(uZcY<0qV1%Cn^oODuC{?c;=RHRg<#u6mnlE25`4PkT9P20EsHx1%bY-g-PT`g zIIf%C$d#;>%9@0(FcGc9e5zZBxLD?^h?JbE10s|x8V9S(EUhr}`w>cIqB{2I9}pWT zo+CuF8McyLv@+qX{wkU2F$!}(^*_#4;10hDsoEYF%ea2glnIQmN+m@usqNT=8KM$I z7C0<{aCY`Ir;_f2$Z2Tasq5>s4mA$|LU7`*Z0m#Xd zDf181C(TRpA4DBN<*@a2UP$Pf8okPD12q>)B$&kKA^e0F0x%Tt45M|oOX5PMX?XiY zC0j}Di-x_gb9n;6Sd;LPJfILu}oIpVI7@y_q z2$hzQ=}II_swCSMa9*4qLX|!t7i{{u%DQEZrml=V`A6hB4k&<+^<6*JH+Z!Rc%V|L5aazq`YxH4z$x(veVQctdYs7JK$gc=aM_EQ`LltG~ zLah^X*+v45X0<6pmRl%;EzPE`7W6Lz8Zl(*rF0bIupY-SBpZU2MF4QLF;riD_IVx8O~JG|<}LLJz0wuA5AcZIHX?b*qk%1WwhaGNs&W%tZFm2B9n(kBsC(RuOh( zT0R*vA6GI7#x({rHMRWuGU1Z3hp`i-ys@&`21*Gg={0TEVhQDx6B&v0RDuH09q!uR z@;L+D`2OR3Bu&)=1!AHa3PNi>mJ&*gZ^jhdkY0ZW_Y*!se~M-s7@re{Ux@5 zwp|&xO%sZ7->+9k_&xknculDt5&5p@PBu;k>Tg(s0_wjS7xP1a0J~efVB6Ianigtt zw62NwA>>)w`v#fS>S!d)_#`V85-C6xg3Z-I4&3I_aDxkIPd&3}Kwz z8T1|~<^5378doC7Au>;%BodeioqQX>u>0WU(=1l5HL)j+eHfDi-i?ip$Fom3EZ@?H ze~HsZ5da|;wcDhvB^2n*-m!$SxKcRIr@4_>3gqzEO^i+YN3qs(-~DJg9iW~DA#SU8 zXBCcd#DlMtdQBsU_)_2RXXyJnu$_I3!^6w1d_&~k`JJN;rHy6_ecb>>T(Rwe->4`Z z`wbe<1hMqxT2UirQK+lyjh@jbt^$lea8>{fwC=z)t++fxu}8 zb`?{!=x50N_<7GNeIWb9h>x*%>kLUIgNh|E%di#gtxk^Wq8vRtM^QK)E&(?juq`x* zjqGREYRVtBzT9CIz2_|l{=@ND5tuv0l;^1|_gWAbOVVLKD#Bi0tk>cv2>4t*K^=n2FqCBB{YXRes?HIAsF@NBhXbnFx(75+L2H2}Y zKV0NvAz^-&Mv1WFo=!22H�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 izKK!5QqK3+u@5<+(3&1A|IKs4l|Mee>-}Vat literal 0 HcmV?d00001 diff --git a/docs/CHATGPT_HANDOFF_RULES.md b/docs/CHATGPT_HANDOFF_RULES.md new file mode 100644 index 0000000..0641646 --- /dev/null +++ b/docs/CHATGPT_HANDOFF_RULES.md @@ -0,0 +1,83 @@ +# ChatGPT Handoff Rules + +## Purpose + +When the project owner moves from Codex back to ChatGPT or CCRA for discussion, Codex must provide a compact handoff document. + +The handoff prevents ChatGPT from reconstructing project state from scattered history and prevents the owner from manually explaining the latest local implementation. + +## When To Create A Handoff + +Create a ChatGPT handoff when: + +- The owner says they are going back to ChatGPT. +- A model extraction or repair session completes. +- Rules, schemas, workflow, indexes, or validation tools materially change. +- The next step requires product, CCRA, or architecture judgment outside Codex. + +Do not replace validation reports with a handoff. The handoff summarizes and points to validated artifacts. + +## Location And Naming + +Store handoffs in `reports/`. + +Use this naming pattern: + +```text +ChatGPT交接文档__.md +``` + +Example: + +```text +reports/ChatGPT交接文档_模型库MVP_2026-06-16.md +``` + +## Required Sections + +Each handoff must include: + +1. 当前阶段 +2. 本轮目标 +3. 已完成内容 +4. 关键文件路径 +5. Codex 实现和原计划的差异 +6. 当前问题 +7. 需要 ChatGPT / CCRA 判断的事项 +8. 下一步候选方向 +9. 验证结果 + +## Required Distinctions + +The handoff must distinguish: + +- 已验证事实 +- 当前草稿 +- 待产品判断 +- 待 CCRA / ChatGPT 判断 +- 已知限制 + +Do not write only "已完成". Include the verification commands and results. + +## Required File References + +The handoff should point to local files rather than copying everything. + +For model library MVP handoffs, include links to: + +- `reports/validation_report.md` +- `models/model_index.json` +- `cards/card_index.md` +- `schemas/model_card.schema.json` +- current model JSON files +- current Markdown cards +- source and regression indexes +- relevant rules or workflow docs + +## Relationship To Knowledge Assets + +Handoffs are session-level reports. + +Long-term reusable knowledge belongs in `knowledge_assets/`. + +If a handoff repeats stable rules, model maps, or project context that should be reused across sessions, create or update a knowledge asset instead of leaving it only in `reports/`. diff --git a/docs/CONTENT_STABILIZATION_PROTOCOL.md b/docs/CONTENT_STABILIZATION_PROTOCOL.md new file mode 100644 index 0000000..8098a46 --- /dev/null +++ b/docs/CONTENT_STABILIZATION_PROTOCOL.md @@ -0,0 +1,84 @@ +# Content Stabilization Protocol + +## Principle + +Engineering contract PASS is not content stability. + +The validation scripts prove that the model library can be parsed, indexed, and checked. They do not prove that a model is semantically correct, sufficiently evidenced, regression-stable, or safe for broad product use. + +## Stabilization Gates + +A model cannot move beyond `draft` without these review gates: + +1. Evidence review. +2. Content review. +3. Regression review. +4. Selector review. +5. Owner / CCRA review. + +Each gate must leave a file-backed result under `reports/` or a structured status entry. + +## Current Model Rule + +For this round: + +| Model ID | Status | Stability | Regression Status | +| --- | --- | --- | --- | +| `qpi` | draft | B | pending | +| `intellectual_archaeology` | draft | B | pending | + +Do not upgrade either model to stable. + +## Current Non-Goals + +This round must not: + +- Add a third model. +- Connect a full question-answering system. +- Introduce an LLM selector. +- Introduce a vector database. +- Build frontend or backend product surfaces. +- Change `stability_level` from B to A. +- Change `regression_status` from pending to passed. +- Change `status` from draft to stable. + +## Draft-Callable Meaning + +`draft-callable` is a review conclusion, not a model JSON status value in v0.2. + +It means: + +- The model remains `status: draft`. +- The model has enough structure for controlled review calls. +- Evidence coverage, regression coverage, selector false-positive protection, and content risks are visible. +- The model still requires Owner / CCRA judgment before any stronger state. + +## Required v0.2 Evidence Types + +Field support must be classified as: + +- `direct_source`: directly supported by source text. +- `derived_from_source`: reasonably inferred from source text. +- `product_decision`: product or selector rule. +- `red_team_inference`: misuse, boundary, or failure inference. +- `owner_decision`: Owner / CCRA judgment. + +## Required v0.2 Coverage Status + +Each required model field must be marked as: + +- `supported` +- `partially_supported` +- `derived` +- `unsupported` +- `needs_owner_review` + +## Required Review Status Fields + +Content review reports should track: + +- `engineering_contract_status` +- `content_review_status` +- `evidence_review_status` +- `regression_review_status` +- `selector_review_status` diff --git a/docs/DATA_CONTRACT.md b/docs/DATA_CONTRACT.md index 0f132e5..6ff4606 100644 --- a/docs/DATA_CONTRACT.md +++ b/docs/DATA_CONTRACT.md @@ -4,6 +4,8 @@ Use JSON for machine-readable data. +Model JSON files own the model asset state, including `status`, `regression_status`, and `stability_profile.stability_level`. + Main JSON objects: - Model spec @@ -11,6 +13,7 @@ Main JSON objects: - Source excerpt - Regression case - Selector example +- Model index ## 2. Human-Readable Format @@ -33,6 +36,7 @@ Every model JSON should include: - `one_sentence_definition` - `core_question` - `core_mechanism` +- `status` - `source_articles` - `source_evidence` - `input_types` @@ -45,8 +49,14 @@ Every model JSON should include: - `confidence_level` - `stability_profile` - `regression_status` +- `output_contract` +- `structured_output_contract` - `productization_notes` +`structured_output_contract` is model-specific. It must not turn QPI-only or Intellectual-Archaeology-only runtime fields into global top-level required fields for every model. + +Model-specific required runtime output fields are checked by `scripts/validate_model_library.py`. + ## 4. Source Article Contract Every source article should include: @@ -95,6 +105,15 @@ Every regression case should include: Optional: - `expected_output_elements` +- `should_call_model` +- `expected_primary_model` +- `negative_expected_models` +- `expected_classification` +- `expected_dominant_scarcity` +- `expected_max_depth` +- `minimum_required_elements` +- `forbidden_elements` +- `evaluation_mode` - `notes` ## 7. Reference Integrity @@ -106,3 +125,19 @@ The following references must be valid: - `regression_case.model_id` -> `models/*.model.json` - `source_excerpt.source_id` -> `sources/source_articles.json` - `source_excerpt.related_model_id` -> `models/*.model.json` + +## 8. Index Integrity + +`models/model_index.json` is generated or checked from model JSON, card files, source references, and regression cases. + +`cards/card_index.md` is the human-readable projection of `models/model_index.json`. + +Indexes must not drift from model state, source/evidence counts, regression case counts, or card file existence. + +## 9. Content Stabilization Integrity + +Engineering validation does not imply content stability. + +Before content stabilization review, every core model should have at least 15 regression cases and field-level evidence coverage. + +Source excerpts must distinguish exact quotes from condensed or paraphrased excerpts with `quote_status`. diff --git a/docs/DECISIONS.md b/docs/DECISIONS.md index ff89ea0..210faf4 100644 --- a/docs/DECISIONS.md +++ b/docs/DECISIONS.md @@ -83,3 +83,73 @@ Frameworks such as CrewAI and LangGraph may be useful later for implementing pro CCPE may define the agent contract, runtime governance, authority, evaluation, and integration registration. skills-vault may provide reusable deterministic helper Skills discovered during implementation. + +## Decision 009: Use `intellectual_archaeology` as the machine model ID + +Status: Accepted + +Reason: + +The source article names the model **“思想考古学”(Intellectual Archaeology)**. + +The machine-readable ID should use the stable English snake_case form `intellectual_archaeology`, while the human-facing model name remains Chinese. + +## Decision 010: Keep field names English and field content Chinese + +Status: Accepted + +Reason: + +English field names make JSON easier to validate and integrate. + +Chinese field values preserve source-language meaning and avoid translation drift during model extraction. + +## Decision 011: GPT plans must be localized before implementation + +Status: Accepted + +Reason: + +GPT planning documents may not know the current local repository state, existing constraints, missing contracts, or prior owner decisions. + +Codex must first convert each GPT plan into local rules, schemas, indexes, workflow, tooling expectations, and validation gates before implementing content. + +Content extraction or content repair must not begin from a GPT plan until the local foundation has been reviewed, unless the project owner explicitly overrides the gate. + +## Decision 012: Maintain indexes by script-backed synchronization + +Status: Accepted + +Reason: + +`models/model_index.json` is the machine discovery entrypoint, and `cards/card_index.md` is the human review entrypoint. + +They should follow source assets instead of becoming separate hand-maintained content sources. + +Every asset change must incrementally synchronize the indexes, and handoff or release points must run a full rebuild or consistency check. + +The current rule is: + +```text +incremental update on every model/card/source/test change ++ +full rebuild or full reconciliation at release, handoff, schema migration, batch expansion, or validation drift +``` + +Model status remains an owner / ChatGPT / CCRA decision; validation and index rebuilds must not upgrade `draft` to a stronger state automatically. + +## Decision 013: Archive CCRA review bundles by round + +Status: Accepted + +Reason: + +The first compressed CCRA review bundle was generated as flat files under `ccra_review_bundle/`. That works for a single handoff, but it becomes ambiguous once later rounds produce new `00_OPEN_THIS_FIRST_CCRA_REVIEW_BRIEF.md`, command logs, diffs, and raw changed files. + +`ccra_review_bundle/` is now the archive root. Each review round must live in a dated subdirectory: + +```text +ccra_review_bundle/round-NN_YYYY-MM-DD_topic/ +``` + +This keeps second-round and third-round materials comparable without overwriting prior evidence. Temporary review bundles remain session evidence and should not be copied into `knowledge_assets/`. diff --git a/docs/GPT_PLAN_LOCALIZATION_PROTOCOL.md b/docs/GPT_PLAN_LOCALIZATION_PROTOCOL.md new file mode 100644 index 0000000..504f064 --- /dev/null +++ b/docs/GPT_PLAN_LOCALIZATION_PROTOCOL.md @@ -0,0 +1,65 @@ +# GPT Plan Localization Protocol + +## Purpose + +GPT planning documents are upstream planning inputs. They are not directly executable repository rules. + +Before Codex implements content from a GPT plan, Codex must convert the plan into local rules, schemas, workflow steps, tools, indexes, and validation criteria. + +## Required Intake Steps + +1. Read the GPT planning document completely enough to extract fields, tasks, non-goals, workflow requirements, tooling expectations, index expectations, and acceptance criteria. +2. Compare the GPT plan against local repository rules in `AGENTS.md`, `README.md`, `docs/DATA_CONTRACT.md`, `docs/WORKFLOW.md`, `docs/DECISIONS.md`, and `PROJECTS.md`. +3. Identify conflicts, missing local contracts, missing schemas, missing validators, missing indexes, missing workflow gates, and missing owner-confirmation points. +4. Write a local execution plan before changing content. +5. Ask the project owner to review the local execution plan. +6. Only after owner approval, implement local rules, schemas, indexes, workflow, and tooling. +7. Validate the foundation. +8. Ask the project owner to review the foundation before content extraction or content repair begins. + +## Required Local Plan + +Each local plan must state: + +- Which parts of the GPT plan become repository rules. +- Which parts become schemas. +- Which parts become workflow gates. +- Which parts become validation or selector tools. +- Which parts are deferred. +- Which parts conflict with existing local rules. +- What the project owner must confirm before implementation. + +## Prohibited Shortcut + +Do not directly create or repair model content from a GPT planning document before local rules, schemas, indexes, workflow, and validation expectations are confirmed. + +Do not treat a GPT plan as a substitute for local schema, local workflow, local index definitions, or local validation tools. + +Do not silently narrow a GPT plan to the current repository minimum field set. If the GPT plan has a richer contract, record the difference and ask for confirmation or implement the richer local contract first. + +## Dual-Track Rule + +Model extraction must keep two tracks separate: + +1. Workflow/tooling track: rules, schemas, indexes, validators, selector demo, audit reports, and supplier requests. +2. Content extraction track: source records, evidence excerpts, model JSON, Markdown cards, regression cases, and selector examples. + +The content extraction track must not absorb missing workflow or tooling work. If a missing capability blocks reliable extraction, create a local plan item or a supplier request before continuing. + +## Required Report + +Each localization pass must produce a report under `reports/` that lists: + +- GPT plan source path. +- Local files created or modified. +- Fields adopted. +- Fields rejected or deferred. +- Workflow gates added. +- Indexes required. +- Tooling needs identified. +- Differences from current repository state. +- Open owner questions. + +## Owner Review Gate + +After local rules, schemas, indexes, workflow, and validation expectations are implemented, Codex must stop for project owner review unless the owner explicitly authorizes continuing into content extraction. diff --git a/docs/INDEX_MAINTENANCE_PROTOCOL.md b/docs/INDEX_MAINTENANCE_PROTOCOL.md new file mode 100644 index 0000000..11dbe22 --- /dev/null +++ b/docs/INDEX_MAINTENANCE_PROTOCOL.md @@ -0,0 +1,115 @@ +# Index Maintenance Protocol + +## Purpose + +`models/model_index.json` is the machine-readable registry for model discovery. + +`cards/card_index.md` is the human-readable projection for review and handoff. + +Neither file is the full source of model content. Full content remains in: + +- `models/*.model.json` +- `cards/*.md` +- `sources/source_articles.json` +- `sources/source_excerpts.json` +- `tests/regression_cases.json` + +## Maintenance Rule + +Every asset change must keep indexes synchronized. + +Key handoff and release points must run a full rebuild or full consistency check. + +The operating rule is: + +```text +incremental update on every model/card/source/test change ++ +full rebuild or full reconciliation at release, handoff, schema migration, batch expansion, or validation drift +``` + +## Incremental Update Triggers + +Update indexes in the same work session whenever any of these changes: + +- Model added, deleted, renamed, or archived. +- `model_id`, `model_name`, `model_type`, or `pipeline_position`. +- `model_file` or `card_file` path. +- Source article or source evidence references. +- Regression cases for a model. +- `stability_profile.stability_level`. +- `regression_status`. +- `status`. +- Card file added, deleted, or renamed. + +## Full Rebuild Or Full Check Triggers + +Run `python scripts\rebuild_indexes.py --check` or `python scripts\rebuild_indexes.py --write` before: + +- ChatGPT / CCRA / owner handoff. +- Writing `reports/validation_report.md`. +- Schema changes. +- Batch model expansion. +- Directory or naming-rule changes. +- Larger merges. +- Selector rules depending on model registry state. +- Any model status upgrade review. +- Any detected index drift or orphan file. + +## Field Sources + +| Index field | Source | +| --- | --- | +| `model_id` | `models/*.model.json.model_id` | +| `model_name` | `models/*.model.json.model_name` | +| `model_type` | `models/*.model.json.model_type` | +| `pipeline_position` | `models/*.model.json.pipeline_position` | +| `model_file` | Model JSON file path | +| `card_file` | `cards/{model_id}.md` in v0.2 | +| `source_article_count` | Length of `source_articles` | +| `source_evidence_count` | Length of `source_evidence` | +| `regression_case_count` | Cases in `tests/regression_cases.json` with the same `model_id` | +| `stability_level` | `stability_profile.stability_level` | +| `regression_status` | `regression_status` | +| `status` | `status` | +| `last_updated` | `last_updated` | + +## Card Index Generation + +`cards/card_index.md` is rendered from `models/model_index.json`. + +Current v0.2 table columns: + +- Model ID +- 模型名称 +- 类型 +- 流程位置 +- Card +- Model JSON +- 稳固性 +- 回归状态 +- 状态 + +Do not treat `cards/card_index.md` as an independent content source. + +## Drift Checks + +Validation must detect: + +- Missing `model_file` or `card_file`. +- Model JSON files missing from `model_index.json`. +- Card files missing from `card_index.md`. +- `card_index.md` entries missing from `model_index.json`. +- Count drift for source articles, source evidence, and regression cases. +- State drift for `stability_level`, `regression_status`, and `status`. + +## Codex Checklist + +When modifying model assets: + +1. Update the source asset first. +2. Run `python scripts\rebuild_indexes.py --write`. +3. Run `python scripts\rebuild_indexes.py --check`. +4. Run `python scripts\validate_model_library.py`. +5. Confirm `reports/index_rebuild_report.md` and `reports/validation_report.md`. +6. Do not upgrade `status`, `stability_level`, or `regression_status` unless owner / ChatGPT / CCRA explicitly decided it. diff --git a/docs/INTELLECTUAL_ARCHAEOLOGY_DEPTH_GATE.md b/docs/INTELLECTUAL_ARCHAEOLOGY_DEPTH_GATE.md new file mode 100644 index 0000000..91b9658 --- /dev/null +++ b/docs/INTELLECTUAL_ARCHAEOLOGY_DEPTH_GATE.md @@ -0,0 +1,103 @@ +# Intellectual Archaeology Depth Gate + +Date: 2026-06-17 + +Status: draft rule hardening for `model_library_mvp` + +## 1. Purpose + +Intellectual Archaeology is a deep modeling model. It is not a default analysis mode, article summary mode, or ornament for ordinary questions. + +The depth gate exists to prevent over-analysis and to force explicit stopping reasons. + +## 2. When `should_call=false` + +Set `should_call=false` when: + +- the user only needs a fact lookup; +- the user asks for rewrite, translation, typo correction, or direct execution; +- QPI has not completed problem definition for an ambiguous problem; +- the input has deep words such as "底层", "模型", or "哲学" but the user intent is light; +- there is not enough material to separate real assumptions from generic abstraction; +- the analysis would not change judgment, route, verification, or action. + +## 3. Depth Levels + +Allowed `recommended_max_depth` values: + +- `application` +- `domain` +- `process` +- `purpose` +- `core_mechanism` +- `human_capability` +- `philosophical_bedrock` + +## 4. Depth Derivation + +Use the shallowest level that can change the next action. + +Stop at `application` when the request is about usage, examples, or immediate application. + +Stop at `domain` when domain assumptions or contextual constraints explain the behavior. + +Stop at `process` when the missing value is workflow, sequence, role boundary, or operating mechanism. + +Stop at `purpose` when the problem is about what the system is trying to optimize or preserve. + +Stop at `core_mechanism` when the request is to extract a reusable model or explain repeated failure. + +Use `human_capability` only when the question depends on human cognition, judgment, agency, fatigue, attention, or embodied limitation. + +Use `philosophical_bedrock` only when the problem explicitly involves value premises, epistemic assumptions, ontology of the problem, or the model's deepest ground. + +## 5. Philosophical Bedrock Is Not Default + +`philosophical_bedrock` must not be selected only because the input contains: + +- "底层"; +- "模型"; +- "哲学"; +- "第一性原理"; +- "深层". + +It is allowed only when deeper analysis changes the framing, validity, or action boundary. + +## 6. Required Runtime Fields + +The model-specific runtime contract requires: + +- `should_call` +- `entry_reason` +- `recommended_max_depth` +- `layers_to_analyze` +- `stop_reason` +- `no_deeper_reason` +- `assumptions_by_layer` +- `validation_needed` +- `action_implication` + +`value_of_deeper_analysis` may be added later as an optional field, but `no_deeper_reason` is required because it prevents depth inflation. + +## 7. Stop Reason Templates + +Use concrete stopping reasons: + +- "Stop at purpose because the decision depends on what the system optimizes; deeper ontology would not change the next action." +- "Stop at core_mechanism because the reusable pattern is now explicit and validation can begin." +- "Stop before philosophical_bedrock because the input lacks evidence for value-premise or epistemic claims." +- "No call because QPI has not completed the problem frame." +- "No call because the user requested direct execution." + +## 8. Status Boundary + +This gate does not upgrade the model. Intellectual Archaeology remains: + +```json +{ + "status": "draft", + "stability_level": "B", + "regression_status": "pending" +} +``` + diff --git a/docs/KNOWLEDGE_ASSET_RULES.md b/docs/KNOWLEDGE_ASSET_RULES.md new file mode 100644 index 0000000..7292ab9 --- /dev/null +++ b/docs/KNOWLEDGE_ASSET_RULES.md @@ -0,0 +1,90 @@ +# Knowledge Asset Rules + +## Purpose + +`knowledge_assets/` stores stable, long-term, reusable knowledge documents for this repository. + +These documents are not raw source archives, not temporary handoffs, and not implementation-only files. They are the durable explanation layer that helps the project owner, ChatGPT, Codex, and future CCRA work understand the model library without reconstructing context from scattered files. + +## What Belongs In `knowledge_assets/` + +Use `knowledge_assets/` for: + +- product context summaries +- model maps +- model card structure rules +- model extraction templates +- stability rating rules +- durable process records +- reusable architecture summaries + +Do not use `knowledge_assets/` for: + +- raw original articles +- temporary validation reports +- full copies of every model card +- generated cache files +- implementation scripts +- source-of-truth JSON model assets + +## Relationship To Other Directories + +`docs/` contains operative local rules, contracts, workflow docs, and decisions. + +`models/` contains machine-readable model JSON source of truth. + +`cards/` contains human-readable model cards. + +`reports/` contains session-level validation, audit, and handoff documents. + +`knowledge_assets/` contains stable explanatory knowledge distilled from those sources. + +## Naming Rule + +Use numeric prefixes for reading order. + +Do not put version numbers in filenames. Put version, status, and last updated date inside the document. + +Examples: + +```text +00_用户背景与产品上下文.md +01_核心模型地图.md +02_模型卡结构规范.md +03_核心模型抽取样板.md +06_模型稳固性评级规则.md +07_产品规划过程记录.md +``` + +## Model Card Sample Rule + +Do not duplicate every concrete model card into `knowledge_assets/`. + +Concrete model card source of truth remains in `cards/` and `models/`. + +If a sample is needed for ChatGPT or CCRA reasoning, create a clearly marked sample or summary document, not a second source of truth. + +For now, QPI and 思想考古 are referenced through: + +- `cards/qpi.md` +- `cards/intellectual_archaeology.md` +- `models/qpi.model.json` +- `models/intellectual_archaeology.model.json` + +## Update Rule + +Update or create a knowledge asset when: + +- a rule becomes stable enough to reuse across sessions +- project context changes in a durable way +- a model map changes +- a workflow or schema decision should be remembered outside a single report +- ChatGPT handoff material repeats across sessions + +Do not update knowledge assets for every small implementation change. Use reports for session-level details. + +## Review Rule + +Knowledge assets should be concise and source-linked. + +When a knowledge asset summarizes a file-backed artifact, link to the artifact and state whether the source of truth remains elsewhere. diff --git a/docs/MODEL_CARD_CONTRACT.md b/docs/MODEL_CARD_CONTRACT.md new file mode 100644 index 0000000..20a38d6 --- /dev/null +++ b/docs/MODEL_CARD_CONTRACT.md @@ -0,0 +1,133 @@ +# Model Card Contract + +Each human-readable model card in `cards/` must include the sections below. + +Section contents should be Chinese when the source material is Chinese. English may appear in IDs, aliases, source terms, and field labels. + +## Required Sections + +## 模型名称 + +The human-readable model name. + +## 模型 ID + +The stable machine ID used by model JSON, source excerpts, regression cases, selector rules, and indexes. + +## 一句话定义 + +One concise sentence explaining what the model does. + +## 模型类型 + +The model type, aligned with `schemas/model_card.schema.json`. + +## 所在流程位置 + +Where the model belongs in the processing pipeline. + +## 来源文章 + +Source article IDs and titles. + +## 来源证据片段 + +Evidence excerpt IDs and what each excerpt supports. + +## 核心问题 + +The core question this model answers. + +## 核心机制 + +The reusable mechanism or operating logic of the model. + +## 输入类型 + +Inputs the model can accept. + +## 输出类型 + +Outputs the model should produce. + +## 适用场景 + +When the model should be called. + +## 不适用场景 + +When the model should not be called. + +## 调用关键词 + +Trigger keywords or expressions that suggest the model may apply. + +## 负向触发条件 + +Expressions, task types, or contexts that should suppress the model. + +## 相关模型 + +Models that can be called before, after, or alongside this model. + +## 冲突模型 + +Models or flows that should not be used together without arbitration. + +## 学科底座关联 + +Disciplines, theories, or knowledge bases that anchor the model. + +## 常见误用 + +Common misuse patterns. + +## 失败信号 + +Signals that the model was called incorrectly or produced unstable output. + +## 可信度等级 + +The current confidence level and why. + +## 稳固性状态 + +The current stability level and whether stabilization is still required. + +## 稳定性评估 + +Assessment across concept clarity, mechanism stability, boundary clarity, source evidence quality, and regression performance. + +## 回归测试状态 + +Regression status and current coverage. + +## 示例输入 + +Representative inputs. + +## 示例输出 + +Representative outputs. + +## 输出契约 + +The expected structure or elements of model output. + +## 深度控制 + +Depth limits, stop conditions, or overuse warnings. + +## 产品化建议 + +Notes for selector, workflow, product integration, or future stabilization. + +## 版本信息 + +Version, last updated date, and draft/stability status. + +## Additional Sections + +Cards may include additional explanatory sections after the required sections. + +Required sections may contain `无` only when the model genuinely has no value for that field, and the reason must be clear. diff --git a/docs/MODEL_EXTRACTION_RULES.md b/docs/MODEL_EXTRACTION_RULES.md new file mode 100644 index 0000000..e052e73 --- /dev/null +++ b/docs/MODEL_EXTRACTION_RULES.md @@ -0,0 +1,174 @@ +# Model Extraction Rules + +## Language Rule + +JSON field names use English. + +JSON field values and Markdown card contents should remain Chinese when the source material is Chinese. English terms may be preserved as aliases, IDs, or source terms. + +This rule exists to avoid translation drift while keeping machine-readable files easy to validate and integrate. + +## Source Traceability Rule + +Every model must reference source article IDs. + +Every model must reference source evidence excerpt IDs. + +Do not invent source IDs without matching records in `sources/source_articles.json`. + +Do not invent evidence excerpt IDs without matching records in `sources/source_excerpts.json`. + +Placeholder excerpts must be marked clearly and must not be treated as verified evidence. + +If a field is a productization inference rather than a direct source claim, record that status in the relevant note, evidence summary, or audit report. + +Evidence coverage must distinguish: + +- `direct_source` +- `derived_from_source` +- `product_decision` +- `red_team_inference` +- `owner_decision` + +Source excerpts must include `quote_status` and `source_location`. + +`quote_status=exact` must not contain unmarked ellipses. If a snippet is compressed, use `quote_status=condensed` and explain the compression in `notes`. + +## Model Extraction Is Not Article Summary + +Article summary answers: + +- What does this article say? + +Model extraction answers: + +- What reusable cognitive mechanism exists? +- What input does it handle? +- What output does it produce? +- When should it be called? +- When should it not be called? +- What are its misuse patterns? +- What are its failure signals? +- How can its stability be tested? +- How can it be routed by a selector? + +Do not stop at viewpoint summary. A model asset must become callable, bounded, traceable, and testable. + +## Required Model Asset Chain + +For each core model, the complete asset chain is: + +1. Source article record. +2. Source evidence excerpts. +3. Human-readable Markdown card. +4. Machine-readable JSON model card. +5. Regression cases. +6. Selector examples or routing rules. +7. Model index entry. +8. Card index entry. +9. Validation report. + +## Required Model JSON Fields + +Model JSON must include the required fields from `schemas/model_card.schema.json` after that schema is implemented. + +Recommended fields from the GPT plan should be included for v0.1 unless a field is explicitly deferred in the localization report. + +The current minimum field list from `docs/DATA_CONTRACT.md` is not enough for the full GPT sample contract. Until `schemas/model_card.schema.json` is implemented, extraction work must treat the GPT sample field list as the stronger target contract. + +## Required Human Card Sections + +Human-readable Markdown cards must follow `docs/MODEL_CARD_CONTRACT.md` after that contract is implemented. + +Before the card contract exists, Codex must not assume a short readable summary is a valid model card. + +## Stability Assessment + +Each model must include stability assessment across: + +- 概念清晰度 +- 机制稳定性 +- 边界清晰度 +- 来源证据质量 +- 回归测试表现 + +Each model must record: + +- `stability_level` +- `reason` +- `next_stabilization_action` + +Stability level meanings: + +- `A`: 五个维度都较稳定,可进入核心调用。 +- `B`: 基本可用,但需要边界案例测试。 +- `C`: 有启发,但系统调用风险较高。 +- `D`: 不适合进入模型库,需要重构。 + +## Regression Rule + +Every core model must have at least fifteen regression cases before content stabilization review. + +Each core model must include: + +- positive cases +- boundary cases +- misuse cases +- no-call cases +- selector gate cases +- pipeline cases + +Regression tests are product stability tests for model use, not only software unit tests. + +## Selector Rule + +The v0.2 selector must not call an LLM. + +Selector output should include: + +- selected model IDs +- rejected model IDs +- scores +- reasons +- penalties +- routing notes +- no-call status + +Selector scoring should consider: + +- trigger keyword hits +- input type match +- negative trigger hits +- `do_not_call_when` hits +- pipeline position +- selection priority +- QPI-before-IA gate + +## Index Rule + +Machine-readable model assets are indexed in `models/model_index.json`. + +Human-readable cards are indexed in `cards/card_index.md`. + +Both indexes must be updated whenever a model or card is added, renamed, deprecated, or materially reclassified. + +For v0.1, manual incremental index updates are acceptable. When the model count grows beyond roughly 8-10 core models, a full rebuild script can be added if manual maintenance becomes costly or error-prone. + +## Workflow Gate Rule + +When a GPT plan is provided, Codex must not begin content extraction immediately. + +The required order is: + +1. Localize the GPT plan into repository rules, schemas, indexes, workflow, and tooling plan. +2. Produce a localization difference report. +3. Ask the project owner to review the local foundation. +4. Only after confirmation, perform model content extraction or repair. + +## Supplier Request Rule + +If reliable extraction requires reusable automation, deterministic validators, batch processors, or installable Skills, classify it as a `skills-vault` need and create a request under `requirements/skills-vault/`. + +If reliable extraction requires expert-agent specifications, model-governance rules, invocation protocols, evaluation rubrics, or runtime contracts, classify it as a `ccpe-system` need and create a request under `requirements/ccpe/`. + +Do not copy canonical CCPE artifacts or reusable Skill source into this repository. diff --git a/docs/MODEL_EXTRACTION_WORKFLOW.md b/docs/MODEL_EXTRACTION_WORKFLOW.md new file mode 100644 index 0000000..21548a9 --- /dev/null +++ b/docs/MODEL_EXTRACTION_WORKFLOW.md @@ -0,0 +1,133 @@ +# Model Extraction Workflow + +This workflow is the required gate sequence for extracting or repairing cognitive model assets. + +## Stage 0: GPT Plan Intake + +Input from user: + +- GPT planning document path +- Source article paths +- Existing model or application material paths +- Target model IDs +- Whether placeholder evidence is allowed +- Whether the goal is rules only, content extraction, or full chain + +Codex output: + +- Local execution plan +- Open questions +- Owner review gate + +## Stage 1: Rules, Schema, Index, And Workflow Foundation + +Codex actions: + +- Convert GPT planning document into local rules. +- Define or update schemas. +- Define or update indexes. +- Define workflow gates. +- Define validation expectations. + +Output: + +- Rules docs +- Schema files +- Index contracts +- Workflow docs +- Difference report + +Owner confirmation: + +- The project owner reviews rules, schemas, indexes, and workflow before content extraction. + +## Stage 2: Source And Evidence Preparation + +Codex actions: + +- Register source articles. +- Extract source evidence excerpts. +- Mark placeholder evidence explicitly if source text is unavailable or insufficient. + +Output: + +- `sources/source_articles.json` +- `sources/source_excerpts.json` + +Checks: + +- Every excerpt references a known source article. +- Every source ID is unique. +- Placeholder evidence is not treated as verified evidence. + +## Stage 3: Model Asset Extraction + +Codex actions: + +- Write machine-readable model JSON. +- Write human-readable Markdown card. +- Update model and card indexes. + +Output: + +- `models/.model.json` +- `cards/.md` +- `models/model_index.json` +- `cards/card_index.md` + +Checks: + +- JSON passes schema. +- Markdown card contains required sections. +- Source references resolve. +- Index entries match model and card files. + +## Stage 4: Regression And Selector Preparation + +Codex actions: + +- Write at least five regression cases per core model. +- Include positive, boundary, and misuse cases. +- Add selector rules and selector examples. + +Output: + +- Regression case files or consolidated regression case JSON. +- Selector rules. +- Selector examples. + +Checks: + +- Every core model has at least five cases. +- Each model has positive, boundary, and misuse cases. +- Selector examples return model IDs and reasons. + +## Stage 5: Validation And Audit + +Codex actions: + +- Run local validation scripts. +- Generate validation report. +- Generate extraction audit report. + +Output: + +- `reports/validation_report.md` +- `reports/_extraction_audit.md` or session-level audit report. + +## Stage 6: Owner Review + +Owner reviews: + +- Model definition +- Field completeness +- Evidence quality +- Boundary and misuse cases +- Selector behavior +- Open questions + +Content is not considered stable until owner review completes. + +## Workflow Rule + +Do not repair or expand model content before Stage 1 foundation is implemented and reviewed, unless the project owner explicitly overrides the gate. diff --git a/docs/PROJECT_BRIEF.md b/docs/PROJECT_BRIEF.md index fd90086..9b7309f 100644 --- a/docs/PROJECT_BRIEF.md +++ b/docs/PROJECT_BRIEF.md @@ -24,6 +24,7 @@ The project solves a model asset management problem: - Model cards need stronger source traceability. - Some early models require regression testing and stabilization. - The future question-answering system needs callable model specifications. +- Model and card indexes need script-backed synchronization so the library does not drift into scattered files. ## 4. MVP Focus @@ -34,6 +35,8 @@ The MVP focuses on two models: These two models are used to validate the model extraction protocol. +The current index maintenance rule is documented in `docs/INDEX_MAINTENANCE_PROTOCOL.md`: every asset change synchronizes `models/model_index.json` and `cards/card_index.md`, while handoff and release points require a full rebuild or check. + ## 5. Long-Term Direction Future versions may support: diff --git a/docs/QPI_CONTEXTUAL_ROUTING_RULES.md b/docs/QPI_CONTEXTUAL_ROUTING_RULES.md new file mode 100644 index 0000000..5230911 --- /dev/null +++ b/docs/QPI_CONTEXTUAL_ROUTING_RULES.md @@ -0,0 +1,178 @@ +# QPI Contextual Routing Rules + +Date: 2026-06-17 + +Status: draft rule hardening for `model_library_mvp` + +## 1. Updated Definition + +QPI is not a text classifier. + +QPI judges how a cognitive subject, in a concrete context, frames an expectation-reality gap as `question`, `problem`, `issue`, `mixed`, or `no_call`. + +The model must therefore inspect: + +- who the subject is; +- what responsibility position they occupy; +- what scenario the gap appears in; +- what the expected outcome and current reality are; +- what resources, authority, time scale, and feedback loops are available; +- whether the frame is stable, provisional, mixed, or changing. + +## 2. Source Structure + +QPI currently draws from two non-substitutable source layers: + +- `article_qpi_contextual_2025_001`: subjectivity, context, expectation-reality gap, dynamic lifecycle, and semantic foundation. +- `article_qpi_primary_001`: core scarcity, cognitive optics, power-framed misclassification, violent reduction, and malicious inflation. + +The 2025 article is not obsolete. It supplies the subject-context-dynamic foundation that prevents QPI from becoming a shallow text classifier. + +## 3. No-Call Gate + +Return `classification_scope=no_call` when the input is only: + +- fact lookup; +- rewrite, polish, or typo correction; +- translation; +- direct file or formatting execution; +- a low-risk instruction where the user explicitly says not to analyze. + +Exception: if the user explicitly says not to execute literally and asks for analysis of the underlying problem, the no-call gate may be bypassed. + +## 4. Subject-Context Gate + +QPI must not produce high-confidence classification without enough context. + +Rules: + +- If `subject_position` is missing, `classification_confidence` must not be `high`. +- If `scenario_context` is missing, `dominant_scarcity` must not be high-confidence. +- If both subject and scenario are missing, set `is_provisional=true`. +- If context is insufficient, fill `missing_context` and `recommended_clarifying_questions`. + +Example: + +```text +Input: 如何提高流量? +``` + +This is not automatically `problem` or `mixed`. It is `insufficient_context` until the subject, responsibility scope, goal, resources, and time scale are known. + +## 5. Expectation-Reality Gap + +Every non-no-call QPI output should extract: + +- expected state; +- current reality; +- gap summary. + +If any part is unknown, write `unknown` instead of inventing context. + +## 6. Mixed Versus Multi-Perspective + +QPI must distinguish two different kinds of complexity. + +`intra_frame_mixed`: + +Same subject, same scenario, same stage. Multiple scarcities coexist inside one problem frame. + +Example: + +```text +我是集团营销负责人,既缺流量增长方法,也担心销售、库存、客服和激励机制跟不上。 +``` + +`inter_viewpoint_divergence`: + +The same surface input would be framed differently by different subjects or responsibility positions. + +Example: + +```text +如何提高流量? +``` + +For a student this may be `question`; for a marketing manager this may be `problem`; for a group marketing director this may be `issue`. + +Do not collapse `inter_viewpoint_divergence` into `mixed`. + +## 7. Scarcity Profile + +Use three scarcity channels: + +- `data_scarcity`: facts, concepts, examples, source location, or basic knowledge are missing. +- `path_or_resource_scarcity`: goal is clear, but method, resource, decomposition, or implementation path is missing. +- `consensus_or_order_scarcity`: success depends on alignment, incentives, governance, stability, authority, or system order. + +Dominant scarcity rules: + +- If exactly one channel is `high`, use its corresponding dominant scarcity. +- If two or three channels are `high` for the same subject and scenario, use `mixed`. +- If evidence is insufficient, use `unknown`. +- For `mixed` or `low` confidence, `evidence_gap` must be non-empty. + +## 8. Issue As Governance Load + +`issue` does not require a multi-person organization. + +Raise issue weight when any of these are present: + +- success criteria are not unique, and multiple standards are reasonable; +- the task cannot be solved once and closed; +- the action will change the future problem structure; +- multiple valid goals require ongoing tradeoff; +- state continuity, role boundaries, invocation authenticity, audit trail, or downstream reuse matters; +- the validator is part of the system being designed; +- local truth can masquerade as global structure; +- the next step depends on human confirmation, authority, or boundary protocol. + +This covers personal workflow redesign cases where the owner, future owner, agents, source materials, token budget, audit boundary, and downstream projects behave like proxy stakeholders. + +## 9. Misframing Risks + +QPI must identify these risks when present: + +- `violent_reduction`: compressing an issue into a personal execution problem. +- `malicious_inflation`: inflating a concrete problem into an untouchable issue. +- `tool_solutionism`: treating subject-context-governance work as mere tool unfamiliarity. +- `premature_classification`: assigning Q/P/I before subject and scenario are known. + +## 10. Routing Output + +The required QPI runtime output fields are declared in `models/qpi.model.json` under `structured_output_contract` and enforced by `scripts/validate_model_library.py`. + +Do not write `draft-callable` into model `status`. QPI remains: + +```json +{ + "status": "draft", + "stability_level": "B", + "regression_status": "pending" +} +``` + +## 11. Raw Case Preprocessing + +Owner-provided raw cases should not be compressed into short classification prompts. + +Each case digest should preserve: + +- `subject_position`; +- `responsibility_scope`; +- `scenario_context`; +- `experience_level`; +- `goal`; +- `expected_outcome`; +- `current_reality`; +- `hard_feedback_availability`; +- `success_criteria`; +- `proxy_stakeholders`; +- `dynamic_shift`; +- `possible_qpi_by_viewpoint`; +- `owner_expected_judgment`; +- `codex_candidate_judgment`; +- `owner_review_needed`. + +Raw case processing is intentionally deferred until owner materials are available. + diff --git a/docs/WORKFLOW.md b/docs/WORKFLOW.md index ba41a99..566146a 100644 --- a/docs/WORKFLOW.md +++ b/docs/WORKFLOW.md @@ -2,6 +2,8 @@ ## 1. Model Extraction Workflow +For detailed model extraction gates, see `docs/MODEL_EXTRACTION_WORKFLOW.md`. + The project follows this flow: ```text @@ -37,8 +39,9 @@ When adding a new model: 4. Add source evidence excerpts. 5. Add regression cases. 6. Add selector examples if relevant. -7. Run validation. -8. Update documentation. +7. Run `python scripts\rebuild_indexes.py --write`. +8. Run validation. +9. Update documentation. ## 4. Stabilization Workflow @@ -51,6 +54,8 @@ If a model is unstable: ## 5. Handoff Workflow +For ChatGPT-specific handoff rules, see `docs/CHATGPT_HANDOFF_RULES.md`. + At the end of each work session: 1. Summarize what changed. @@ -60,6 +65,15 @@ At the end of each work session: 5. List questions that require product or CCRA judgment. 6. Suggest the smallest useful next tasks. +If the owner is going from Codex to ChatGPT, create a `reports/ChatGPT交接文档__.md` file before ending the work session. + +Before handoff, run: + +```powershell +python scripts\rebuild_indexes.py --check +python scripts\validate_model_library.py +``` + ## 6. Supplier Request Workflow When this repository needs a capability owned by a neighboring repository: @@ -95,3 +109,11 @@ Before adoption: 3. Identify whether skills-vault needs to supply reusable deterministic helpers. 4. Keep framework adapters, state, deployment, and product-specific behavior in this repository. 5. Record the boundary decision in `docs/DECISIONS.md`. + +## 9. Knowledge Asset Workflow + +For long-term reusable knowledge rules, see `docs/KNOWLEDGE_ASSET_RULES.md`. + +When a rule, model map, schema explanation, workflow summary, or product context becomes stable enough to reuse across sessions, create or update a file under `knowledge_assets/`. + +Do not leave durable knowledge only in temporary reports. diff --git a/docs/model_case_preprocessing/README.md b/docs/model_case_preprocessing/README.md new file mode 100644 index 0000000..6df99d7 --- /dev/null +++ b/docs/model_case_preprocessing/README.md @@ -0,0 +1,23 @@ +# Model Case Preprocessing + +This folder stores reusable rules for turning owner-provided raw materials into reviewable model case drafts. + +Use one subfolder per model: + +```text +docs/model_case_preprocessing/ + qpi/ + intellectual_archaeology/ + future_model_id/ +``` + +Rules here define preprocessing workflow only. They are not model cards, regression cases, selector calibration files, or stable content-review conclusions. + +Draft outputs should be written under: + +```text +reports/model_case_preprocessing/// +``` + +Machine-readable digests or calibration JSON should be created only after owner review of the Markdown case drafts. + diff --git a/docs/model_case_preprocessing/qpi/CASE_PREPROCESSING_WORKFLOW.md b/docs/model_case_preprocessing/qpi/CASE_PREPROCESSING_WORKFLOW.md new file mode 100644 index 0000000..ad7460a --- /dev/null +++ b/docs/model_case_preprocessing/qpi/CASE_PREPROCESSING_WORKFLOW.md @@ -0,0 +1,175 @@ +# QPI Case Preprocessing Workflow + +Date: 2026-06-17 + +Status: reusable draft workflow for owner review + +## 1. Purpose + +Convert owner-provided raw materials into Markdown QPI case drafts that the owner can confirm or correct. + +This workflow exists because the owner should not need to write JSON or fill a heavy form before case extraction begins. + +## 2. Inputs + +Input is a raw Markdown or text source supplied by the owner. + +Examples: + +- long reflective analysis; +- process redesign notes; +- GPT discussion records; +- QPI case analysis documents; +- model extraction or workflow failure records. + +Do not copy the full source into this repository unless the owner explicitly asks. Record the source path and extract only concise evidence snippets or summaries needed for case review. + +## 3. Output Location + +Write draft cases under: + +```text +reports/model_case_preprocessing/qpi// +``` + +Use one output file per raw source: + +```text +.cases.md +``` + +Each file must be marked: + +```text +status: draft_owner_review_needed +``` + +## 4. Case Draft Format + +Each source file may produce multiple cases. + +Use this structure for every case: + +```markdown +## Case qpi-draft-XXX: + +status: draft_owner_review_needed + +source_path: `` + +### 1. Surface Problem + +What the problem appears to be at first glance. + +### 2. Subject Position + +Who is framing the problem, including role, experience level, responsibility scope, and whether the subject is the present owner, future owner, an agent, a team, or another proxy stakeholder. + +### 3. Scenario Context + +Where the problem appears, including workflow, repo, article, relationship, tool, organization, or life context. + +### 4. Expectation-Reality Gap + +- Expected: +- Reality: +- Gap summary: + +### 5. Attempted Paths + +What has already been tried or assumed. + +### 6. Dynamic Shift + +How the problem frame changes over time, such as Q -> P, P -> I, Q/P -> P/I mixed, or insufficient context -> multi-perspective. + +### 7. Scarcity Profile + +- data_scarcity: +- path_or_resource_scarcity: +- consensus_or_order_scarcity: + +Use `high | medium | low | unknown`. + +### 8. Mixed Or Multi-Perspective + +Choose one: + +- `intra_frame_mixed` +- `inter_viewpoint_divergence` +- `not_mixed` +- `unknown` + +Explain why. + +### 9. Governance Load + +Does the case require ongoing tradeoff, role boundary management, audit authenticity, downstream reuse, state continuity, or human confirmation? + +### 10. Misframing Risks + +Check any that apply: + +- violent_reduction +- malicious_inflation +- tool_solutionism +- premature_classification +- single-cause_reduction +- over_pathologizing +- other + +### 11. Candidate QPI Judgment + +- classification_scope: +- is_provisional: +- classification: +- dominant_scarcity: +- classification_confidence: +- recommended_next_step: + +### 12. Owner Review Questions + +List concrete questions the owner should confirm or correct. +``` + +## 5. Extraction Rules + +Preserve subject-context before classification. + +Do not classify a sentence in isolation if the source provides broader context. + +Separate: + +- `intra_frame_mixed`: same subject, same scene, same stage, multiple scarcities. +- `inter_viewpoint_divergence`: different subjects or responsibility positions would classify the same surface issue differently. + +Do not equate `issue` with "many people". A one-person workflow can be an Issue if it has ongoing governance load, proxy stakeholders, state continuity, audit boundaries, or unstable success criteria. + +Do not turn psychological, relational, or workflow material into clinical claims. Use QPI terms: subject, context, gap, scarcity, frame shift, misframing risk. + +## 6. What Not To Do + +Do not: + +- write selector JSON directly; +- update regression cases directly; +- upgrade model status; +- create a third model; +- summarize the whole source instead of extracting cases; +- quote long source passages; +- pretend draft cases are owner-approved. + +## 7. Promotion Path + +The promotion path is: + +```text +raw source +-> Markdown case drafts +-> owner review and correction +-> case digest JSON +-> selector calibration inputs or regression cases +``` + +Only owner-reviewed cases may become machine-readable calibration or regression assets. + diff --git a/docs/model_case_preprocessing/qpi/README.md b/docs/model_case_preprocessing/qpi/README.md new file mode 100644 index 0000000..6e6cb49 --- /dev/null +++ b/docs/model_case_preprocessing/qpi/README.md @@ -0,0 +1,10 @@ +# QPI Case Preprocessing + +This folder defines how to preprocess raw owner materials into QPI case drafts. + +QPI is a subject-context-dynamic routing model. Preprocessing must preserve the subject, scenario, expectation-reality gap, dynamic shift, and possible misframing risks. Do not compress raw materials into short classification prompts. + +Primary workflow: + +- `CASE_PREPROCESSING_WORKFLOW.md` + diff --git a/docs/superpowers/plans/2026-06-16-model-extraction-contract-and-workflow.md b/docs/superpowers/plans/2026-06-16-model-extraction-contract-and-workflow.md new file mode 100644 index 0000000..52c3aa2 --- /dev/null +++ b/docs/superpowers/plans/2026-06-16-model-extraction-contract-and-workflow.md @@ -0,0 +1,844 @@ +# Model Extraction Contract and Workflow Implementation Plan + +> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking. + +**Goal:** Turn the GPT planning document into local executable rules, schemas, indexes, workflow gates, and validation tools before revising QPI or Intellectual Archaeology content. + +**Architecture:** Treat GPT planning documents as upstream planning inputs, not direct implementation instructions. The repository must first convert them into local contracts, indexes, validators, and workflow gates; only after owner review should content extraction or model asset repair continue. + +**Tech Stack:** Markdown documentation, JSON Schema draft 2020-12, Python standard library validation scripts, file-first JSON indexes. + +--- + +## Scope + +This plan covers the process and tooling foundation for future model extraction. + +It does not repair the current QPI or Intellectual Archaeology model contents yet. Those repairs happen only after the rules, schemas, indexes, workflow, and validators are written and reviewed. + +## Source Planning Document + +Read this first: + +```text +C:\Users\wangq\Documents\Codex\knowledge-vault\work\internal\强哥的思想宇宙\GPT成果\2026-06-16-核心模型抽取样板 v0.1.md +``` + +Use it as an upstream plan. Do not treat it as already-local repository law until the relevant parts are converted into this repository. + +## Required Local Outputs + +Create or update these files: + +- Create: `docs/MODEL_EXTRACTION_RULES.md` +- Create: `docs/MODEL_CARD_CONTRACT.md` +- Create: `docs/MODEL_EXTRACTION_WORKFLOW.md` +- Create: `docs/GPT_PLAN_LOCALIZATION_PROTOCOL.md` +- Create: `schemas/model_card.schema.json` +- Modify: `schemas/source_article.schema.json` +- Modify: `schemas/source_excerpt.schema.json` +- Modify: `schemas/regression_case.schema.json` +- Create: `models/model_index.json` +- Create: `cards/card_index.md` +- Create: `schemas/model_index.schema.json` +- Create: `schemas/card_index.schema.json` +- Modify: `scripts/validate_model_library.py` +- Create: `scripts/check_card_contract.py` +- Create: `scripts/run_selector_demo.py` +- Create: `reports/GPT规划落地差异检查_v0.1.md` +- Modify: `docs/DECISIONS.md` +- Modify: `README.md` +- Modify: `docs/WORKFLOW.md` +- Modify: relevant folder README files + +## Index Decision + +Two indexes are required because model JSON and Markdown cards serve different consumers. + +`models/model_index.json` is the machine-readable model index. It supports validation, selector routing, model lookup, model status tracking, and future application integration. + +`cards/card_index.md` is the human-readable card index. It supports owner review, editorial navigation, extraction status review, and handoff. + +Index maintenance policy for v0.1: + +- During early MVP with two models, update indexes manually and validate references. +- When model count grows beyond roughly 8-10 core models, add an optional full rebuild script. +- Do not require full rebuild on every small edit in v0.1. +- Full extraction from files is acceptable on demand because the repository is file-first and small, but it should become a tool only when manual maintenance becomes costly or error-prone. + +## Workflow Gates + +This repository must use these gates for every future GPT-provided planning document: + +1. GPT plan intake. +2. Local plan creation. +3. Owner review of local plan. +4. Rules/schema/index/workflow implementation. +5. Validation of rules/schema/index/workflow. +6. Owner review of the foundation. +7. Content extraction or content repair. +8. Validation and audit report. +9. Owner content review. + +No model content extraction should happen before gate 6 unless the owner explicitly overrides the gate. + +--- + +### Task 1: Localize GPT Plan Into Repository Rules + +**Files:** +- Create: `docs/GPT_PLAN_LOCALIZATION_PROTOCOL.md` +- Create: `docs/MODEL_EXTRACTION_RULES.md` +- Create: `reports/GPT规划落地差异检查_v0.1.md` +- Modify: `docs/DECISIONS.md` + +- [ ] **Step 1: Write GPT plan localization protocol** + +Create `docs/GPT_PLAN_LOCALIZATION_PROTOCOL.md` with these sections: + +```markdown +# GPT Plan Localization Protocol + +## Purpose + +GPT planning documents are upstream planning inputs. They are not directly executable repository rules. + +Before Codex implements content from a GPT plan, Codex must convert the plan into local rules, schemas, workflow steps, tools, and validation criteria. + +## Required Intake Steps + +1. Read the GPT planning document completely enough to extract fields, tasks, non-goals, workflow requirements, tooling expectations, and acceptance criteria. +2. Compare the GPT plan against local repository rules in `AGENTS.md`, `README.md`, `docs/DATA_CONTRACT.md`, `docs/WORKFLOW.md`, and `PROJECTS.md`. +3. Identify conflicts, missing local contracts, missing schemas, missing validators, missing indexes, and missing workflow gates. +4. Write a local execution plan. +5. Ask the project owner to review the local execution plan. +6. Only after owner approval, implement local rules/schema/workflow/tooling. +7. Ask the project owner to review the foundation before content extraction begins. + +## Prohibited Shortcut + +Do not directly create or repair model content from a GPT planning document before local rules, schemas, workflow, and validation expectations are confirmed. + +## Required Report + +Each localization pass must produce a report under `reports/` that lists: + +- GPT plan source path +- Local files created or modified +- Fields adopted +- Fields rejected or deferred +- Workflow gates added +- Tooling needs identified +- Open owner questions +``` + +- [ ] **Step 2: Write model extraction rules** + +Create `docs/MODEL_EXTRACTION_RULES.md` with these sections: + +```markdown +# Model Extraction Rules + +## Language Rule + +JSON field names use English. + +JSON field values and Markdown card contents should remain Chinese when the source material is Chinese. English terms may be preserved as aliases, IDs, or source terms. + +## Source Traceability Rule + +Every model must reference source article IDs and source evidence excerpt IDs. + +Do not invent source IDs without matching records in `sources/source_articles.json`. + +Do not invent evidence excerpt IDs without matching records in `sources/source_excerpts.json`. + +Placeholder excerpts must be marked clearly and must not be treated as verified evidence. + +## Model Extraction Is Not Article Summary + +Article summary answers what the article says. + +Model extraction answers: + +- What reusable cognitive mechanism exists? +- What input does it handle? +- What output does it produce? +- When should it be called? +- When should it not be called? +- How can misuse be detected? +- How can stability be tested? + +## Required Model Asset Chain + +For each core model: + +1. Source article record +2. Source evidence excerpts +3. Human-readable Markdown card +4. Machine-readable JSON model card +5. Regression cases +6. Selector examples or routing rules +7. Validation report + +## Required Model JSON Fields + +Model JSON must include the required fields from `schemas/model_card.schema.json`. + +Recommended fields from the GPT plan should be included for v0.1 unless a field is explicitly deferred in the localization report. + +## Stability Assessment + +Each model must include stability assessment across: + +- 概念清晰度 +- 机制稳定性 +- 边界清晰度 +- 来源证据质量 +- 回归测试表现 + +Each model must record: + +- `stability_level` +- `reason` +- `next_stabilization_action` + +## Index Rule + +Machine-readable model assets are indexed in `models/model_index.json`. + +Human-readable cards are indexed in `cards/card_index.md`. + +Both indexes must be updated whenever a model or card is added, renamed, deprecated, or materially reclassified. +``` + +- [ ] **Step 3: Write localization diff report** + +Create `reports/GPT规划落地差异检查_v0.1.md` with these sections and fill it from the GPT planning document: + +```markdown +# GPT 规划落地差异检查 v0.1 + +## Source Plan + +`C:\Users\wangq\Documents\Codex\knowledge-vault\work\internal\强哥的思想宇宙\GPT成果\2026-06-16-核心模型抽取样板 v0.1.md` + +## Adopted Into Local Rules + +## Adopted Into Local Schema + +## Adopted Into Local Workflow + +## Adopted Into Tooling Plan + +## Differences From Current Repository + +## Deferred Items + +## Owner Review Questions +``` + +- [ ] **Step 4: Record decision** + +Append to `docs/DECISIONS.md`: + +```markdown +## Decision 011: GPT plans must be localized before implementation + +Status: Accepted + +Reason: + +GPT planning documents may not know the current local repository state, existing constraints, missing contracts, or prior owner decisions. + +Codex must first convert each GPT plan into local rules, schemas, workflow, tooling expectations, and validation gates before implementing content. +``` + +--- + +### Task 2: Define Model Card Contract And Schema + +**Files:** +- Create: `docs/MODEL_CARD_CONTRACT.md` +- Create: `schemas/model_card.schema.json` +- Modify: `schemas/README.md` + +- [ ] **Step 1: Write Markdown card contract** + +Create `docs/MODEL_CARD_CONTRACT.md` with exactly these required card sections: + +```markdown +# Model Card Contract + +Each human-readable model card in `cards/` must include these sections in Chinese content: + +## 模型名称 +## 模型 ID +## 一句话定义 +## 模型类型 +## 所在流程位置 +## 来源文章 +## 来源证据片段 +## 核心问题 +## 核心机制 +## 输入类型 +## 输出类型 +## 适用场景 +## 不适用场景 +## 调用关键词 +## 负向触发条件 +## 相关模型 +## 冲突模型 +## 学科底座关联 +## 常见误用 +## 失败信号 +## 可信度等级 +## 稳固性状态 +## 稳定性评估 +## 回归测试状态 +## 示例输入 +## 示例输出 +## 输出契约 +## 深度控制 +## 产品化建议 +## 版本信息 + +Cards may include additional explanatory sections after the required sections. + +Required sections may contain `无` only when the model genuinely has no value for that field, and the reason must be clear. +``` + +- [ ] **Step 2: Create full model card JSON schema** + +Create `schemas/model_card.schema.json` based on the GPT plan's schema, with these additions: + +- Add Chinese `description` to every property. +- Include recommended fields: `trigger_keywords`, `negative_triggers`, `related_models`, `conflicting_models`, `disciplinary_anchors`, `example_inputs`, `example_outputs`, `output_contract`, `depth_control`, `stabilization_path`, `version`, `last_updated`. +- Use enum values from the GPT plan: + - `model_type`: `routing_model`, `deep_modeling_model`, `lens_model`, `diagnostic_model`, `evaluation_model`, `generation_model`, `conflict_resolution_model`, `stabilization_model` + - `pipeline_position`: `pre_analysis`, `analysis`, `deep_analysis`, `synthesis`, `red_team`, `evaluation`, `post_processing` + - `confidence_level`: `high`, `medium`, `low` + - `regression_status`: `not_started`, `pending`, `in_progress`, `passed`, `failed`, `needs_rebuild` +- Set `selection_priority` minimum 1 and maximum 10. +- Require `stability_profile.stability_level`, `stability_profile.needs_stabilization`, `stability_profile.main_risks`, `stability_profile.reason`, and `stability_profile.next_stabilization_action`. + +- [ ] **Step 3: Update schema README** + +Update `schemas/README.md` so it lists `model_card.schema.json` as the authoritative schema for machine-readable model cards. + +--- + +### Task 3: Define Source, Regression, And Index Schemas + +**Files:** +- Modify: `schemas/source_article.schema.json` +- Modify: `schemas/source_excerpt.schema.json` +- Modify: `schemas/regression_case.schema.json` +- Create: `schemas/model_index.schema.json` +- Create: `schemas/card_index.schema.json` + +- [ ] **Step 1: Add descriptions to existing schemas** + +For `source_article.schema.json`, `source_excerpt.schema.json`, and `regression_case.schema.json`, add Chinese `description` fields for every property. + +- [ ] **Step 2: Strengthen regression schema** + +Update `schemas/regression_case.schema.json` so `case_type` uses enum: + +```json +["positive", "boundary", "misuse"] +``` + +- [ ] **Step 3: Create model index schema** + +Create `schemas/model_index.schema.json` with this structure: + +```json +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "title": "Model Index", + "type": "object", + "required": ["index_version", "last_updated", "models"], + "properties": { + "index_version": { + "type": "string", + "description": "索引版本。" + }, + "last_updated": { + "type": "string", + "description": "索引最后更新时间。" + }, + "models": { + "type": "array", + "items": { + "type": "object", + "required": [ + "model_id", + "model_name", + "model_type", + "pipeline_position", + "model_file", + "card_file", + "source_article_count", + "source_evidence_count", + "regression_case_count", + "stability_level", + "regression_status", + "status" + ], + "properties": { + "model_id": {"type": "string", "description": "模型 ID。"}, + "model_name": {"type": "string", "description": "模型中文名称。"}, + "model_type": {"type": "string", "description": "模型类型。"}, + "pipeline_position": {"type": "string", "description": "模型所在流程位置。"}, + "model_file": {"type": "string", "description": "模型 JSON 文件路径。"}, + "card_file": {"type": "string", "description": "Markdown 模型卡文件路径。"}, + "source_article_count": {"type": "integer", "description": "引用来源文章数量。"}, + "source_evidence_count": {"type": "integer", "description": "引用证据片段数量。"}, + "regression_case_count": {"type": "integer", "description": "回归测试用例数量。"}, + "stability_level": {"type": "string", "description": "稳固性等级。"}, + "regression_status": {"type": "string", "description": "回归测试状态。"}, + "status": {"type": "string", "description": "索引条目状态,例如 draft、active、deprecated。"} + } + } + } + } +} +``` + +- [ ] **Step 4: Create card index schema** + +Create `schemas/card_index.schema.json` with this structure: + +```json +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "title": "Card Index Metadata", + "type": "object", + "required": ["index_version", "last_updated", "required_columns"], + "properties": { + "index_version": {"type": "string", "description": "卡片索引版本。"}, + "last_updated": {"type": "string", "description": "最后更新时间。"}, + "required_columns": { + "type": "array", + "description": "card_index.md 表格必须包含的列名。", + "items": {"type": "string"} + } + } +} +``` + +--- + +### Task 4: Define Model Extraction Workflow + +**Files:** +- Create: `docs/MODEL_EXTRACTION_WORKFLOW.md` +- Modify: `docs/WORKFLOW.md` + +- [ ] **Step 1: Write model extraction workflow** + +Create `docs/MODEL_EXTRACTION_WORKFLOW.md` with these stages: + +```markdown +# Model Extraction Workflow + +## Stage 0: GPT Plan Intake + +Input from user: + +- GPT planning document path +- Source article paths +- Existing model/application material paths +- Target model IDs +- Whether placeholder evidence is allowed +- Whether the goal is rules only, content extraction, or full chain + +Output: + +- Local execution plan +- Open questions +- Owner review gate + +## Stage 1: Rules, Schema, Index, And Workflow Foundation + +Codex actions: + +- Convert GPT planning document into local rules. +- Define or update schemas. +- Define or update indexes. +- Define workflow gates. +- Define validation expectations. + +Output: + +- Rules docs +- Schema files +- Index contracts +- Workflow docs +- Difference report + +Owner confirmation: + +- Owner reviews rules/schema/workflow before content extraction. + +## Stage 2: Source And Evidence Preparation + +Codex actions: + +- Register source articles. +- Extract source evidence excerpts. +- Mark placeholder evidence explicitly if source text is unavailable or insufficient. + +Output: + +- `sources/source_articles.json` +- `sources/source_excerpts.json` + +Checks: + +- Every excerpt references a known source article. +- Every source ID is unique. + +## Stage 3: Model Asset Extraction + +Codex actions: + +- Write machine-readable model JSON. +- Write human-readable Markdown card. +- Update model and card indexes. + +Output: + +- `models/.model.json` +- `cards/.md` +- `models/model_index.json` +- `cards/card_index.md` + +Checks: + +- JSON passes schema. +- Markdown card contains required sections. +- Source references resolve. + +## Stage 4: Regression And Selector Preparation + +Codex actions: + +- Write at least five regression cases per core model. +- Include positive, boundary, and misuse cases. +- Add selector rules and selector examples. + +Output: + +- Regression case files or consolidated regression case JSON. +- Selector rules. +- Selector examples. + +Checks: + +- Every core model has at least five cases. +- Each model has positive, boundary, and misuse cases. +- Selector examples return model IDs and reasons. + +## Stage 5: Validation And Audit + +Codex actions: + +- Run local validation scripts. +- Generate validation report. +- Generate extraction audit report. + +Output: + +- `reports/validation_report.md` +- `reports/_extraction_audit.md` or session-level audit report. + +## Stage 6: Owner Review + +Owner reviews: + +- Model definition +- Field completeness +- Evidence quality +- Boundary and misuse cases +- Selector behavior +- Open questions + +Content is not considered stable until owner review completes. +``` + +- [ ] **Step 2: Link workflow from existing workflow doc** + +Add a short reference in `docs/WORKFLOW.md`: + +```markdown +For detailed model extraction gates, see `docs/MODEL_EXTRACTION_WORKFLOW.md`. +``` + +--- + +### Task 5: Add Index Files + +**Files:** +- Create: `models/model_index.json` +- Create: `cards/card_index.md` +- Modify: `models/README.md` +- Modify: `cards/README.md` + +- [ ] **Step 1: Create machine-readable model index** + +Create `models/model_index.json` with current two models: + +```json +{ + "index_version": "0.1", + "last_updated": "2026-06-16", + "models": [ + { + "model_id": "qpi", + "model_name": "QPI 三元定性模型", + "model_type": "routing_model", + "pipeline_position": "pre_analysis", + "model_file": "models/qpi.model.json", + "card_file": "cards/qpi.md", + "source_article_count": 2, + "source_evidence_count": 5, + "regression_case_count": 5, + "stability_level": "B", + "regression_status": "pending", + "status": "draft" + }, + { + "model_id": "intellectual_archaeology", + "model_name": "思想考古学", + "model_type": "deep_modeling_model", + "pipeline_position": "deep_analysis", + "model_file": "models/intellectual_archaeology.model.json", + "card_file": "cards/intellectual_archaeology.md", + "source_article_count": 2, + "source_evidence_count": 5, + "regression_case_count": 5, + "stability_level": "B", + "regression_status": "pending", + "status": "draft" + } + ] +} +``` + +- [ ] **Step 2: Create human-readable card index** + +Create `cards/card_index.md`: + +```markdown +# Card Index + +| Model ID | 模型名称 | 类型 | 流程位置 | Card | Model JSON | 稳固性 | 回归状态 | 状态 | +| --- | --- | --- | --- | --- | --- | --- | --- | --- | +| qpi | QPI 三元定性模型 | routing_model | pre_analysis | `cards/qpi.md` | `models/qpi.model.json` | B | pending | draft | +| intellectual_archaeology | 思想考古学 | deep_modeling_model | deep_analysis | `cards/intellectual_archaeology.md` | `models/intellectual_archaeology.model.json` | B | pending | draft | +``` + +- [ ] **Step 3: Update README files** + +Update `models/README.md` to state: + +```markdown +`model_index.json` is the machine-readable model registry. +``` + +Update `cards/README.md` to state: + +```markdown +`card_index.md` is the human-readable model card registry. +``` + +--- + +### Task 6: Upgrade Validation Tools + +**Files:** +- Modify: `scripts/validate_model_library.py` +- Create: `scripts/check_card_contract.py` +- Test: `tests/test_validate_model_library.py` +- Create or modify: `tests/test_card_contract.py` + +- [ ] **Step 1: Add failing tests for schema expectations** + +Add tests that expect validation to fail when: + +- Model JSON omits `trigger_keywords`. +- Model JSON has `selection_priority` outside 1-10. +- Model JSON uses `model_type` outside the enum. +- `stability_profile` omits `reason`. +- `models/model_index.json` references a missing model file. +- `cards/card_index.md` omits a known model. + +- [ ] **Step 2: Add failing tests for card sections** + +Create tests that expect `check_card_contract.py` to report a missing required heading when a card lacks `## 调用关键词`. + +- [ ] **Step 3: Implement schema validation** + +Update `scripts/validate_model_library.py` to: + +- Load JSON schemas from `schemas/`. +- Validate model JSON against `schemas/model_card.schema.json`. +- Validate source articles, source excerpts, regression cases, and model index. +- Check model index file paths exist. +- Check every model appears in `models/model_index.json`. +- Check every card appears in `cards/card_index.md`. +- Keep existing reference checks. + +If the standard library is insufficient for full JSON Schema validation, implement the local subset required by current schemas and record that limitation in `reports/validation_report.md`. + +- [ ] **Step 4: Implement card contract checker** + +Create `scripts/check_card_contract.py` to: + +- Read `docs/MODEL_CARD_CONTRACT.md`. +- Extract required `##` headings. +- Check each `cards/*.md` file except `card_index.md`. +- Print missing headings. +- Return non-zero on missing headings. + +- [ ] **Step 5: Verify tests** + +Run: + +```powershell +python -m unittest discover -s tests -p "test*.py" -v +``` + +Expected: + +```text +OK +``` + +--- + +### Task 7: Add Selector Demo Plan And Minimal Script + +**Files:** +- Create: `scripts/run_selector_demo.py` +- Modify: `selector/selector_rules.json` +- Modify: `selector/selector_examples.json` +- Test: add selector tests if practical + +- [ ] **Step 1: Align selector output shape** + +Ensure selector demo outputs: + +```json +{ + "recommended_models": [ + { + "model_id": "qpi", + "score": 0.92, + "reason": "输入包含问题定性需求。" + } + ], + "not_recommended_models": [], + "routing_notes": "先用 QPI 判断问题类型。" +} +``` + +- [ ] **Step 2: Implement no-LLM selector demo** + +Create `scripts/run_selector_demo.py` using only Python standard library. + +Scoring rules: + +- trigger keyword hit: `+0.2` +- input type match: `+0.2` +- pipeline stage match: `+0.2` +- complexity signals: `+0.2` +- selection priority contribution: `selection_priority / 100` +- negative trigger hit: `-0.3` +- do_not_call_when hit: `-0.5` + +The script must read model JSON and selector examples from local files. + +- [ ] **Step 3: Add README command** + +Document: + +```powershell +python scripts\run_selector_demo.py +``` + +--- + +### Task 8: Owner Review Gate + +**Files:** +- Modify: `reports/GPT规划落地差异检查_v0.1.md` +- Create: `reports/规则Schema工作流检查摘要_v0.1.md` + +- [ ] **Step 1: Write foundation check summary** + +Create `reports/规则Schema工作流检查摘要_v0.1.md` with: + +```markdown +# 规则 Schema 工作流检查摘要 v0.1 + +## Completed + +## Files Changed + +## Checks Run + +## Known Limits + +## Owner Review Checklist + +- GPT 规划是否已正确本地化? +- card contract 是否覆盖模型卡样例? +- model schema 是否覆盖机器 JSON 样例? +- index 设计是否满足当前和未来扩展? +- 工作流 gate 是否足以防止直接跳内容? +- 工具需求是否足够但不过度? + +## Do Not Proceed Before Owner Confirms + +Do not repair QPI or Intellectual Archaeology content until this foundation is reviewed. +``` + +- [ ] **Step 2: Stop for owner review** + +After validation passes, stop and ask the owner to review the foundation. Do not continue to model content repair in the same step unless the owner explicitly says to continue. + +--- + +## Verification Commands + +Run these before claiming the foundation is ready: + +```powershell +python -m unittest discover -s tests -p "test*.py" -v +python scripts\check_card_contract.py +python scripts\validate_model_library.py +python scripts\run_selector_demo.py +``` + +Expected: + +- Unit tests pass. +- Card contract check passes after cards are brought into contract, or reports known current failures before content repair. +- Model library validation reports schema/index status clearly. +- Selector demo returns recommended models with score, reason, and routing notes. + +## Self-Review Checklist + +- The plan blocks content repair until rules/schema/workflow/index foundation is reviewed. +- GPT planning document is treated as upstream input, not direct implementation law. +- Both machine and human indexes are defined. +- Index maintenance policy is explicit. +- The dual-track model is represented: + - workflow/tooling track + - content extraction track +- Every new tool has a clear reason. +- No database, backend, frontend, RAG, or platform scope is introduced. + diff --git a/docs/superpowers/plans/2026-06-17-contract-hardening-selector-calibration.md b/docs/superpowers/plans/2026-06-17-contract-hardening-selector-calibration.md new file mode 100644 index 0000000..7b7199a --- /dev/null +++ b/docs/superpowers/plans/2026-06-17-contract-hardening-selector-calibration.md @@ -0,0 +1,80 @@ +# Contract Hardening Selector Calibration Implementation Plan + +> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking. + +**Goal:** Harden the third-round model-library contract and selector behavior without adding a third model, upgrading stable status, or processing owner-supplied raw QPI samples before they are available. + +**Architecture:** Keep the MVP file-first. Model-specific output contracts live in model JSON and are validated by `scripts/validate_model_library.py`; selector runtime behavior is driven by `selector/selector_rules.json`; per-round CCRA review bundles are stored under dated subdirectories. QPI contextual routing rules are documented now, while real owner case preprocessing remains a later input-dependent step. + +**Tech Stack:** JSON, Markdown, Python standard library, PowerShell file operations. + +--- + +### Task 1: Review Bundle Round Structure + +**Files:** +- Move existing files under `ccra_review_bundle/round-02_2026-06-16_second-audit/` +- Create `ccra_review_bundle/round-03_2026-06-17_contract-hardening-selector-calibration/` +- Modify `knowledge_assets/08_CCRA模型库MVP质量门与交接协议.md` +- Modify `docs/DECISIONS.md` +- Modify `README.md` + +- [ ] Move the second-round flat bundle files into the round-02 directory. +- [ ] Create an empty round-03 directory for the new audit package. +- [ ] Document that `ccra_review_bundle/` is now a per-round archive root. +- [ ] Keep per-round command logs and temporary review materials out of `knowledge_assets/`. + +### Task 2: Model-Specific Output Contract Validation + +**Files:** +- Modify `schemas/model_card.schema.json` +- Modify `models/qpi.model.json` +- Modify `models/intellectual_archaeology.model.json` +- Modify `scripts/validate_model_library.py` +- Modify `tests/test_validate_model_library.py` + +- [ ] Add `structured_output_contract` to the schema properties without adding it to global top-level required. +- [ ] Update QPI definition and output contract for subject-context-dynamic routing. +- [ ] Keep IA contract model-specific and include the required depth-gate fields. +- [ ] Add model-specific required contract checks for `qpi` and `intellectual_archaeology`. +- [ ] Add unit coverage proving missing QPI/IA model-specific output contract fields are reported. + +### Task 3: QPI and IA Rules Documentation + +**Files:** +- Create `docs/QPI_CONTEXTUAL_ROUTING_RULES.md` +- Create `docs/INTELLECTUAL_ARCHAEOLOGY_DEPTH_GATE.md` +- Modify `reports/content_review_report_v0.2.md` + +- [ ] Document QPI as a subject-context expectation-reality gap routing model. +- [ ] Distinguish `intra_frame_mixed` from `inter_viewpoint_divergence`. +- [ ] Document context sufficiency, provisional classification, governance-load issue rules, and misframing risks. +- [ ] Document IA should-call false cases, max-depth derivation, and non-default `philosophical_bedrock`. +- [ ] Fix the QPI report field list to include `classification`. + +### Task 4: Selector Runtime Config Source + +**Files:** +- Modify `selector/selector_rules.json` +- Modify `scripts/run_selector_demo.py` +- Modify `scripts/run_selector_regression.py` +- Create `selector/selector_calibration_inputs.json` + +- [ ] Move scoring signals and hard no-call signals into `selector_rules.json`. +- [ ] Make `run_selector_demo.py` load runtime rules from `selector_rules.json`. +- [ ] Apply hard no-call gating before positive scoring unless an explicit override phrase is present. +- [ ] Add calibration inputs covering fact lookup, rewrite, translation, direct execution, QPI-only, IA-after-QPI, model extraction, false positive traps, and mixed QPI cases. +- [ ] Keep calibration inputs marked as draft and owner-reviewable. + +### Task 5: Verification and Third-Round Handoff + +**Files:** +- Modify or create reports under `reports/` +- Later create files under `ccra_review_bundle/round-03_2026-06-17_contract-hardening-selector-calibration/` + +- [ ] Run `python scripts/rebuild_indexes.py --write` if model/index-relevant fields changed. +- [ ] Run the required full check commands. +- [ ] Record command outcomes in reports. +- [ ] Generate the round-03 CCRA review bundle after validation. +- [ ] Keep `qpi` and `intellectual_archaeology` at `draft / B / pending`. + diff --git a/knowledge_assets/00_用户背景与产品上下文.md b/knowledge_assets/00_用户背景与产品上下文.md new file mode 100644 index 0000000..bce189f --- /dev/null +++ b/knowledge_assets/00_用户背景与产品上下文.md @@ -0,0 +1,70 @@ +# 用户背景与产品上下文 + +version: 0.1 + +last_updated: 2026-06-16 + +status: draft + +## 项目定位 + +`the-mindscape-of-bro-tsong` 是 The Mindscape of Bro Tsong 的产品和应用边界。 + +当前阶段是 `model_library_mvp`,目标是建立一个 file-first 的认知模型库 MVP。 + +## 当前 MVP 目标 + +验证少量核心认知模型能否被整理为: + +- 人读 Markdown 模型卡 +- 机器可读 JSON 模型卡 +- 来源文章记录 +- 来源证据片段 +- 回归测试用例 +- 最小规则选择器 +- 本地校验对象 + +## 第一批样板模型 + +- QPI +- 思想考古学 + +QPI 用于前置问题定性和路由。 + +思想考古学用于中重型问题的深度建模。 + +## 边界 + +本仓库不做: + +- 完整前端 +- 后端服务 +- 数据库 +- 向量数据库 +- 完整 RAG 系统 +- 用户账户 +- 认证 +- 支付 +- 公共平台 +- 多用户协作 + +## 周边仓库关系 + +- `knowledge-vault`: 原始文章、上游讨论和源材料。 +- `ccpe-system`: 专家智能体、运行时、协议、评估和治理规格。 +- `skills-vault`: 可复用自动化工具和安装型 Skill 的源头。 +- `writing-workbench`: 深度写作生产工作台。 +- `video-workbench`: 视频和呈现型输出工作台。 + +本仓库消费这些仓库的产物,但不复制它们的 canonical 内容。 + +## 本地 source of truth + +- 项目规则:`docs/` +- 模型 JSON:`models/` +- 人读模型卡:`cards/` +- 来源索引:`sources/` +- 回归测试:`tests/` +- selector:`selector/` +- 校验脚本:`scripts/` +- 过程报告和交接:`reports/` diff --git a/knowledge_assets/01_核心模型地图.md b/knowledge_assets/01_核心模型地图.md new file mode 100644 index 0000000..fb5261b --- /dev/null +++ b/knowledge_assets/01_核心模型地图.md @@ -0,0 +1,62 @@ +# 核心模型地图 + +version: 0.1 + +last_updated: 2026-06-16 + +status: draft + +## 当前模型 + +当前模型地图以 `models/model_index.json` 为机器索引源,以 `cards/card_index.md` 为人读索引源。 + +Index 维护采用“每次资产变化增量同步 + 关键节点全量重建 / 全量校验”的混合策略。 + +## QPI + +- model_id: `qpi` +- model_type: `routing_model` +- pipeline_position: `pre_analysis` +- stability_level: `B` +- regression_status: `pending` +- source of truth: + - `models/qpi.model.json` + - `cards/qpi.md` + +QPI 用于判断当前输入更接近提问、难题、课题或混合型。 + +## 思想考古学 + +- model_id: `intellectual_archaeology` +- model_type: `deep_modeling_model` +- pipeline_position: `deep_analysis` +- stability_level: `B` +- regression_status: `pending` +- source of truth: + - `models/intellectual_archaeology.model.json` + - `cards/intellectual_archaeology.md` + +思想考古学用于从表层应用逐层下钻到哲学基岩,识别模型或判断背后的深层假设、核心机理和动态韧性来源。 + +## 调用关系 + +QPI 通常在前。 + +如果 QPI 判断输入属于中重型难题、课题或高复用模型抽取任务,可以进入思想考古学。 + +如果输入只是明确事实查询、轻量改写或直接执行任务,不应默认调用思想考古学。 + +## 当前扩展原则 + +不要在 QPI 和思想考古学稳定前快速扩展大量模型。 + +新增模型前必须先满足: + +- source article record +- source evidence excerpts +- model JSON +- Markdown card +- regression cases +- selector examples or routing rules +- model/card index entries +- validation report diff --git a/knowledge_assets/02_模型卡结构规范.md b/knowledge_assets/02_模型卡结构规范.md new file mode 100644 index 0000000..d5e696a --- /dev/null +++ b/knowledge_assets/02_模型卡结构规范.md @@ -0,0 +1,86 @@ +# 模型卡结构规范 + +version: 0.1 + +last_updated: 2026-06-16 + +status: draft + +## Source Of Truth + +本文件是长期知识资产摘要。 + +操作性 source of truth 位于: + +- `docs/MODEL_CARD_CONTRACT.md` +- `schemas/model_card.schema.json` + +## 基本原则 + +Markdown card 用于人读审查。 + +JSON model card 用于系统调用、selector、校验和未来应用集成。 + +字段名使用英文。 + +中文来源的字段值和 Markdown 内容保持中文,避免翻译漂移。 + +## Markdown Card 必需章节 + +模型卡必须覆盖: + +- 模型名称 +- 模型 ID +- 一句话定义 +- 模型类型 +- 所在流程位置 +- 来源文章 +- 来源证据片段 +- 核心问题 +- 核心机制 +- 输入类型 +- 输出类型 +- 适用场景 +- 不适用场景 +- 调用关键词 +- 负向触发条件 +- 相关模型 +- 冲突模型 +- 学科底座关联 +- 常见误用 +- 失败信号 +- 可信度等级 +- 稳固性状态 +- 稳定性评估 +- 回归测试状态 +- 示例输入 +- 示例输出 +- 输出契约 +- 深度控制 +- 产品化建议 +- 版本信息 + +## JSON Model Card 必需方向 + +JSON model card 必须回答: + +- 什么时候调用? +- 什么时候不调用? +- 输入是什么? +- 输出是什么? +- 调用优先级是多少? +- 位于流程哪里? +- 前后相关模型是什么? +- 冲突模型是什么? +- 如何判断调用失败? +- 稳固性如何? +- 如何继续稳定化? + +## 校验 + +使用: + +```powershell +python scripts\check_card_contract.py +python scripts\validate_model_library.py +``` diff --git a/knowledge_assets/03_核心模型抽取样板.md b/knowledge_assets/03_核心模型抽取样板.md new file mode 100644 index 0000000..3252485 --- /dev/null +++ b/knowledge_assets/03_核心模型抽取样板.md @@ -0,0 +1,106 @@ +# 核心模型抽取样板 + +version: 0.2 + +last_updated: 2026-06-16 + +status: draft + +## Source Documents + +原始 GPT 规划位于: + +`C:\Users\wangq\Documents\Codex\knowledge-vault\work\internal\强哥的思想宇宙\GPT成果\2026-06-16-核心模型抽取样板 v0.1.md` + +本仓库本地化规则位于: + +- `docs/GPT_PLAN_LOCALIZATION_PROTOCOL.md` +- `docs/MODEL_EXTRACTION_RULES.md` +- `docs/MODEL_EXTRACTION_WORKFLOW.md` + +## 核心判断 + +GPT 规划不是本地可直接执行规则。 + +Codex 必须先把 GPT 规划转成: + +- local rules +- schemas +- workflow gates +- indexes +- validation tools +- owner review points + +再进入内容抽取。 + +## 模型抽取链路 + +```text +原始文章 / 代表文本 +-> source article record +-> source evidence excerpts +-> human-readable Markdown card +-> machine-readable JSON model card +-> regression cases +-> selector examples or routing rules +-> model/card indexes +-> validation report +``` + +## 双工模式 + +模型抽取必须分为两条线: + +1. workflow/tooling track +2. content extraction track + +内容抽取不能吸收缺失的规则、schema、validator、index 或 workflow 工作。 + +## 当前本地样板 + +当前本地样板模型: + +- QPI +- 思想考古学 + +当前验证命令: + +```powershell +python scripts\rebuild_indexes.py --check +python -m unittest discover -s tests -p "test*.py" -v +python scripts\check_card_contract.py +python scripts\validate_model_library.py +python scripts\run_selector_demo.py +python scripts\run_selector_regression.py +python scripts\check_model_card_sync.py +``` + +## v0.2 内容稳定化补充 + +工程 contract 通过不等于内容稳定。 + +字段级 evidence coverage 必须区分: + +- `direct_source` +- `derived_from_source` +- `product_decision` +- `red_team_inference` +- `owner_decision` + +source excerpt 必须标记: + +- `quote_status` +- `source_location` + +`quote_status=exact` 表示准确摘录;压缩摘录必须使用 `quote_status=condensed` 并在 notes 中说明。 + +回归测试在内容稳定化阶段每个核心模型至少 15 条,并覆盖: + +- positive +- boundary +- misuse +- no_call +- selector_gate +- pipeline + +selector v0.2 仍然是规则 selector,不引入 LLM。它必须输出 selected/rejected models、score breakdown、penalties 和 no-call 状态。 diff --git a/knowledge_assets/06_模型稳固性评级规则.md b/knowledge_assets/06_模型稳固性评级规则.md new file mode 100644 index 0000000..7657b9a --- /dev/null +++ b/knowledge_assets/06_模型稳固性评级规则.md @@ -0,0 +1,64 @@ +# 模型稳固性评级规则 + +version: 0.1 + +last_updated: 2026-06-16 + +status: draft + +## 评级维度 + +每个模型必须从五个维度评估: + +- 概念清晰度 +- 机制稳定性 +- 边界清晰度 +- 来源证据质量 +- 回归测试表现 + +## 等级 + +`A`: 五个维度都较稳定,可进入核心调用。 + +`B`: 基本可用,但需要边界案例测试。 + +`C`: 有启发,但系统调用风险较高。 + +`D`: 不适合进入模型库,需要重构。 + +## 必填稳定性字段 + +每个 JSON model card 的 `stability_profile` 必须包含: + +- `stability_level` +- `needs_stabilization` +- `main_risks` +- `reason` +- `next_stabilization_action` + +## 当前样板评级 + +QPI: + +- stability_level: `B` +- reason: 三分结构清晰,适合作为入口路由模型,但需要补充大量边界案例,防止过度升维或降维。 + +思想考古学: + +- stability_level: `B` +- reason: 纵向下潜机制清晰,适合深度建模,但七层结构和停止条件需要进一步稳定。 + +QPI 和思想考古在第二轮内容稳定化完成并通过 CCRA / Owner 审查前,保持 B 级,不因 schema、contract、index check 或 selector demo 通过而升级。 + +## 升级条件 + +模型不能仅因为字段完整就升级。 + +升级必须同时满足: + +- 来源证据充分 +- 边界清楚 +- misuse case 能暴露误用 +- regression cases 覆盖 positive、boundary、misuse +- selector 不会在明显负向触发时误调用 +- owner 或 CCRA 完成内容审查 diff --git a/knowledge_assets/07_产品规划过程记录.md b/knowledge_assets/07_产品规划过程记录.md new file mode 100644 index 0000000..8a94c2d --- /dev/null +++ b/knowledge_assets/07_产品规划过程记录.md @@ -0,0 +1,58 @@ +# 产品规划过程记录 + +version: 0.1 + +last_updated: 2026-06-16 + +status: draft + +## 起点 + +本仓库初始化为 The Mindscape of Bro Tsong 的 `model_library_mvp` 产品边界。 + +初始目标是验证 QPI 和思想考古学两个模型能否被整理成可读、可调用、可追溯、可测试的模型资产。 + +## 关键过程 + +1. 初始化 file-first 目录结构。 +2. 根据 GPT 规划尝试抽取 QPI 和思想考古学。 +3. 发现直接按 GPT 规划现改会导致字段缺失、schema 不完整、workflow 缺位。 +4. 决定 GPT 规划必须先本地化为规则、schema、workflow、index 和工具。 +5. 建立 ChatGPT 交接机制和长期知识资产机制。 +6. 修复 QPI 和思想考古学的 JSON 与 Markdown card,使其通过本地 contract。 +7. 为避免新会话上传文件过多,后续 Codex 交接采用 CCRA review bundle 压缩审核协议;长期协议进知识库,本轮执行证据通过新会话上传。 + +## 当前关键决策 + +详见 `docs/DECISIONS.md`。 + +当前最重要的决策包括: + +- file-first architecture +- JSON for machine-readable model data +- Markdown for human-readable model cards +- rule-based selector in v0.1 +- GPT plans must be localized before implementation +- field names English and field content Chinese + +## 当前验证状态 + +截至 2026-06-16: + +- Unit tests: PASS +- Card contract: PASS +- Model library validation: PASS +- Selector demo: PASS + +详见: + +- `reports/validation_report.md` +- `reports/内容修复检查摘要_v0.1.md` + +## 下一步讨论方向 + +- 是否扩展第三个核心模型 +- 是否强化 selector scoring +- 是否将抽取智能体、检验智能体、评分模型作为 CCPE 或 skills-vault 需求 +- 是否将 regression cases 拆分为按模型文件 +- 是否为知识资产建立自动摘要或索引工具 diff --git a/knowledge_assets/08_CCRA模型库MVP质量门与交接协议.md b/knowledge_assets/08_CCRA模型库MVP质量门与交接协议.md new file mode 100644 index 0000000..0d6004a --- /dev/null +++ b/knowledge_assets/08_CCRA模型库MVP质量门与交接协议.md @@ -0,0 +1,383 @@ +# CCRA 模型库 MVP 质量门与交接协议 + +version: 0.1 + +last_updated: 2026-06-16 + +status: active + +## 1. 协议来源 + +本文件综合以下 CCRA 指导文件: + +- `2026-06-16-核心模型抽取样板 v0.1.md` +- `CCRA_Codex指导意见_Index更新策略与下一轮执行_v0.2_2026-06-16.md` +- `CCRA_Codex指导意见_模型库MVP第二轮内容稳定化_v0.3_2026-06-16.md` +- `CCRA_下一轮审核包压缩上传协议_v0.1_2026-06-16.md` + +如果模型质量规则之间发生冲突,优先级为: + +```text +v0.3 内容稳定化 +> v0.2 Index 策略 +> v0.1 核心模型抽取样板 +``` + +审核包压缩上传协议只约束交接与上传方式,不覆盖模型质量规则。 + +## 2. 当前阶段边界 + +当前阶段是 `model_library_mvp`。 + +本阶段目标是建立 file-first 认知模型库 MVP,让 QPI 和思想考古学两个样板模型具备: + +- 可读:Markdown card 可供人审查。 +- 可追溯:source article 和 source excerpt 能支撑字段来源。 +- 可调用:JSON model card 有稳定输出契约。 +- 可测试:regression cases 能覆盖正例、边界和误用。 +- 可路由:rule-based selector 能推荐和拒绝模型。 + +本阶段不做: + +- 完整前端 +- 后端服务 +- 数据库 +- RAG +- 知识图谱 +- 用户系统 +- 认证 / 支付 +- 商业平台 +- 多人协作系统 +- 完整问题回答系统 +- LLM selector + +## 3. 模型抽取链路 + +核心模型进入模型库时,应按以下链路组织: + +```text +原始文章 / 代表文本 +-> source article record +-> source evidence excerpts +-> Markdown card +-> JSON model card +-> regression cases +-> selector rules / examples +-> model/card indexes +-> validation report +-> CCRA review +``` + +模型抽取不是文章摘要。抽取目标是得到可复用、可边界化、可验证、可被 selector 调用的认知模型资产。 + +GPT / CCRA 规划文件不能直接当作本地执行规则。Codex 必须先将规划本地化为: + +- local rules +- schemas +- workflow gates +- indexes +- validation tools +- owner / CCRA review points + +## 4. Index 维护规则 + +`models/model_index.json` 是机器可读模型注册表。 + +`cards/card_index.md` 是人读模型卡索引。 + +二者是导航层和注册表,不是模型内容本体。 + +完整模型内容仍以以下文件为 source of truth: + +- `models/*.model.json` +- `cards/*.md` +- `sources/source_articles.json` +- `sources/source_excerpts.json` +- `tests/*.regression.json` + +Index 维护采用混合策略: + +```text +每次资产变化后增量同步 ++ +关键节点全量重建或全量校验 +``` + +关键节点包括: + +- ChatGPT / CCRA / owner 交接前 +- release 前 +- schema 变化后 +- 批量扩展模型后 +- 模型状态升级前 +- selector 依赖模型注册表前 +- 发现 index drift 后 + +## 5. 内容稳定化质量门 + +工程 contract 通过不等于内容稳定。 + +模型不能仅因为以下事项通过就升级: + +- JSON 可解析 +- schema pass +- Markdown required headings 存在 +- selector demo 能运行 +- index drift check pass + +核心模型升级必须经过: + +- evidence review +- content review +- regression review +- selector review +- owner / CCRA review + +QPI 和思想考古在通过内容审查前保持: + +- `status: draft` +- `stability_level: B` +- `regression_status: pending` 或 `in_progress` + +不得仅因 schema、contract、selector demo 或本地 validation 通过而升级为 stable。 + +## 6. Evidence Coverage 规则 + +source excerpt 必须区分证据状态。 + +字段级 evidence coverage 至少区分: + +- `direct_source`: 原文直接支撑。 +- `derived_from_source`: 从原文合理推导。 +- `product_decision`: 产品化调用或 selector 规则。 +- `red_team_inference`: 边界、误用、防误召回推导。 +- `owner_decision`: Owner / CCRA 人工判断。 + +source excerpt 应包含: + +- `quote_status` +- `source_location` + +`quote_status` 取值: + +- `exact`: 准确原文摘录。 +- `condensed`: 压缩摘录。 +- `paraphrased`: 转述。 + +如果 `quote_status=exact`,`raw_excerpt` 不应包含未说明的省略号。 + +如果摘录为了节省篇幅而压缩,必须使用 `quote_status=condensed`,并在 notes 中说明。 + +## 7. QPI 强化要求 + +QPI 是前置路由模型,不是完整解决方案。 + +QPI 输出契约必须能支持稳定路由,至少包含: + +- `problem_owner` +- `problem_source` +- `time_scale` +- `scarcity_profile` +- `dominant_scarcity` +- `classification` +- `classification_confidence` +- `evidence_gap` +- `misclassification_risk` +- `recommended_next_step` +- `next_model_candidates` + +QPI 必须能处理: + +- Question: 数据匮乏。 +- Problem: 路径、方法或资源匮乏。 +- Issue: 共识、确定性或动态秩序匮乏。 +- mixed state: 多类匮乏物同时存在。 +- no-call: 明确事实查询、纯改写、直接执行等不需要问题定性场景。 + +QPI 必须识别误用风险: + +- 暴力降维 +- 恶意升维 +- 手段错配 + +## 8. 思想考古强化要求 + +思想考古学是深度建模模型,不是默认分析流程。 + +它必须保留七层结构: + +1. application +2. domain +3. process +4. purpose +5. core_mechanism +6. human_capability +7. philosophical_bedrock + +但不得默认七层全量展开。 + +输出契约必须包含: + +- `should_call` +- `entry_reason` +- `recommended_max_depth` +- `layers_to_analyze` +- `stop_reason` +- `no_deeper_reason` +- `assumptions_by_layer` +- `validation_needed` +- `action_implication` + +思想考古必须遵守最小充分下潜原则: + +```text +如果继续下潜不再改变判断、路径、验证方式或行动边界,就应停止。 +``` + +不应调用思想考古的场景包括: + +- 明确事实查询。 +- 低风险轻量改写。 +- 用户只需要直接执行。 +- 缺少足够材料,无法区分真实假设和空泛哲学化表达。 + +## 9. Regression 扩展要求 + +样板阶段每个核心模型至少 5 条 regression cases。 + +进入内容稳定化阶段后,每个核心模型至少 15 条 regression cases。 + +Regression cases 应覆盖: + +- positive +- boundary +- misuse +- no_call +- selector_gate +- pipeline + +Regression tests 不只是代码测试,也用于检验: + +- 模型是否被正确调用。 +- 不该调用时是否能拒绝。 +- 混合型输入是否能暴露证据缺口。 +- selector 是否误召回。 +- 模型是否过度下潜或过度升维。 + +按模型拆分的 regression 文件可以作为人审 source of truth;聚合文件可以供 validator 使用。 + +## 10. Selector v0.2 原则 + +selector 继续 rule-based。 + +暂不引入 LLM selector。 + +selector v0.2 应优先补强: + +- negative trigger first +- no-call threshold +- negative trigger penalty +- score breakdown +- rejected model reasons +- QPI-before-IA gate +- selector regression tests + +selector 输出应包含: + +- selected models +- rejected models +- scores +- reasons +- penalties +- no-call status +- routing notes + +思想考古不应仅因为出现“底层”“模型”“哲学”等词就被召回。问题定义未完成时,应先通过 QPI。 + +## 11. CCRA 审核包规则 + +新会话不要上传 30 个分散文件。 + +由 Codex 本地生成。`ccra_review_bundle/` 是审核包归档根目录,不直接平铺放置单轮文件。每一轮应创建独立目录: + +```text +ccra_review_bundle/ + round-02_2026-06-16_second-audit/ + round-03_2026-06-17_contract-hardening-selector-calibration/ +``` + +单轮目录内部保持压缩上传协议的标准文件名: + +```text +ccra_review_bundle/round-NN_YYYY-MM-DD_topic/ + 00_OPEN_THIS_FIRST_CCRA_REVIEW_BRIEF.md + 01_GUIDANCE_PACK_AND_COMPLIANCE_MATRIX.md + 02_CURRENT_ASSET_PACK.md + 03_REPORTS_DIFF_AND_COMMAND_LOG.md + BUNDLE_FILE_MANIFEST.md + optional_raw_changed_files.zip +``` + +推荐上传顺序: + +第一批: + +- `00_OPEN_THIS_FIRST_CCRA_REVIEW_BRIEF.md` +- `01_GUIDANCE_PACK_AND_COMPLIANCE_MATRIX.md` +- `03_REPORTS_DIFF_AND_COMMAND_LOG.md` + +如果仍然过大,先上传: + +- `00_OPEN_THIS_FIRST_CCRA_REVIEW_BRIEF.md` +- `03_REPORTS_DIFF_AND_COMMAND_LOG.md` + +第二批按 CCRA 要求补: + +- `02_CURRENT_ASSET_PACK.md` +- `optional_raw_changed_files.zip` +- 或 CCRA 指定的原始文件 + +## 12. 知识库边界规则 + +适合放入知识库: + +- 稳定长期背景文件。 +- 核心模型地图。 +- 模型卡结构规范。 +- 稳固性评级规则。 +- 产品规划过程记录。 +- 已定稿的 CCRA 长期指导协议。 + +不适合放入知识库: + +- 本轮 validation report。 +- command log。 +- 临时 changed files manifest。 +- 临时 selector regression report。 +- 临时 content review report。 +- 未审定的中间状态文件。 +- 下一轮审核包合并文档整体。 + +判断标准: + +```text +回答“以后一直怎么做”的文档,可以进知识库。 +回答“这轮做了什么、改了什么、哪些 PASS/FAIL”的文档,不进知识库。 +``` + +## 13. 推荐分工 + +Codex: + +- 本地执行者。 +- 校验脚本运行者。 +- 审核包生成器。 +- 预审疑点整理者。 + +CCRA: + +- 产品质量门槛判断者。 +- 模型产品化审查者。 +- 是否进入下一阶段的判断者。 + +Codex 不应替代 CCRA 做最终内容质量审查。 diff --git a/knowledge_assets/README.md b/knowledge_assets/README.md new file mode 100644 index 0000000..21da347 --- /dev/null +++ b/knowledge_assets/README.md @@ -0,0 +1,16 @@ +# Knowledge Assets + +This folder contains stable, long-term reusable knowledge documents for the model library MVP. + +It is the durable explanation layer for ChatGPT, Codex, CCRA, and the project owner. + +Rules: + +- Store reusable knowledge here. +- Keep raw source archives outside this repository. +- Keep model source of truth in `models/` and `cards/`. +- Keep session-level validation and handoff documents in `reports/`. +- Do not put version numbers in filenames; record version information inside the document. +- Store long-term CCRA quality gates and handoff protocols here, but do not store per-round review bundles or command logs here. + +See `docs/KNOWLEDGE_ASSET_RULES.md`. diff --git a/models/README.md b/models/README.md index 31de58b..ff89285 100644 --- a/models/README.md +++ b/models/README.md @@ -1,10 +1,12 @@ # Models -This folder will contain machine-readable JSON model specifications. +This folder contains machine-readable JSON model specifications. -The first expected sample models are: +Current sample models: - `qpi.model.json` - `intellectual_archaeology.model.json` Each model file must follow `docs/DATA_CONTRACT.md` and reference valid source and evidence records. + +`model_index.json` is the machine-readable model registry. diff --git a/models/intellectual_archaeology.model.json b/models/intellectual_archaeology.model.json new file mode 100644 index 0000000..8fb44c8 --- /dev/null +++ b/models/intellectual_archaeology.model.json @@ -0,0 +1,187 @@ +{ + "model_id": "intellectual_archaeology", + "model_name": "思想考古学", + "model_type": "deep_modeling_model", + "pipeline_position": "deep_analysis", + "one_sentence_definition": "思想考古学是一种从表层应用逐层下钻到哲学基岩的建模方法,用于发现支撑一个模型或判断的深层假设、核心机理和动态韧性来源。", + "core_question": "当前问题、方案或模型背后,隐藏了哪些更深层的结构性假设?", + "core_mechanism": "把待建模对象放入七层深度框架:应用层、领域层、过程层、目的层、核心机理层、人类能力层、哲学基岩层;逐层追问支撑上一层的假设,并以最小充分下潜原则停止,避免为了深刻而深刻。", + "status": "draft", + "source_articles": [ + "article_intellectual_archaeology_primary_001", + "article_cognitive_os_synthesis_001" + ], + "source_evidence": [ + "excerpt_ia_primary_definition_001", + "excerpt_ia_primary_layers_001", + "excerpt_ia_primary_resilience_001", + "excerpt_ia_cognitive_os_minimum_depth_001", + "excerpt_ia_primary_validation_001" + ], + "input_types": [ + "复杂问题", + "系统性议题", + "反复失败的问题", + "专家隐性知识", + "认知模型草稿", + "产品底层逻辑", + "需要抽取底层假设的业务方案" + ], + "output_types": [ + "层级化问题地图", + "是否应该调用", + "进入思想考古的理由", + "建议最大下潜层级", + "实际分析层级", + "停止理由", + "不继续下潜理由", + "深层假设清单", + "最小充分下潜层级", + "模型稳固性判断", + "需要验证的薄弱环节", + "后续建模建议" + ], + "call_when": [ + "QPI 判断问题偏课题或中重型难题。", + "问题具有高复用价值。", + "用户希望从文章中抽取模型。", + "当前解释停留在表层工具或症状。", + "需要把专家隐性知识显性化。", + "需要为一个模型寻找更稳固的底层结构。", + "一个问题反复解决但反复失败。" + ], + "do_not_call_when": [ + "当前只是缺少一个事实或材料位置,直接检索即可。", + "问题属于低风险轻量表达,不值得进入深层建模。", + "继续下钻不再改变判断、路径、验证方式或行动边界。", + "用户明确只需要短平快执行,不需要模型化解释。", + "缺少足够领域材料,无法区分真实底层假设和空泛哲学化表达。" + ], + "trigger_keywords": [ + "深层结构", + "底层逻辑", + "模型稳不稳", + "为什么反复失败", + "问题的根在哪里", + "沉淀成模型", + "从文章抽取模型", + "方法论的基岩", + "隐性知识", + "哲学基岩" + ], + "negative_triggers": [ + "快速回答", + "不要展开", + "只查事实", + "只要执行步骤", + "不要深入分析", + "只改文案" + ], + "related_models": [ + "qpi" + ], + "conflicting_models": [ + "fast_execution_flow" + ], + "disciplinary_anchors": [ + "哲学", + "认识论", + "系统论", + "复杂系统", + "认知心理学", + "专家知识显性化", + "因果推理", + "设计理论" + ], + "common_misuses": [ + "把思想考古学误用为文章摘要或概念堆叠。", + "为了显得深刻而无限下钻。", + "把所有轻量问题都拖入七层分析。", + "只做纵向下潜而缺少横向模型竞争。", + "用哲学基岩替代现实验证。", + "下潜后没有回到可行动结论。" + ], + "failure_modes": [ + "分析很深但不能改变判断或行动。", + "层级之间没有清楚递进关系。", + "把所有问题都下钻到哲学层。", + "输出只有抽象概念而没有模型结构。", + "没有说明应该在哪一层停止。", + "没有指出需要证据验证的地方。" + ], + "selection_priority": 7, + "confidence_level": "medium", + "stability_profile": { + "stability_level": "B", + "needs_stabilization": true, + "main_risks": [ + "七层结构需要进一步稳定。", + "容易过度下潜。", + "容易输出抽象概念而缺少行动回路。", + "需要更多真实案例验证。" + ], + "reason": "纵向下潜机制清晰,适合深度建模,但七层结构和停止条件需要进一步稳定。", + "next_stabilization_action": "补充不同复杂度问题的下潜深度测试,明确最小充分下潜原则。", + "stabilization_notes": "当前适合作为中重型问题的 draft 深度建模模块。" + }, + "regression_status": "pending", + "example_inputs": [ + "我想把过去文章中的认知模型抽取出来,但不知道这些模型到底稳不稳,应该怎么判断?", + "现代人为什么一边渴望连接,一边又渴望逃离连接?" + ], + "example_outputs": [ + "第一个输入适合下潜到核心机理层,判断文章、模型卡、系统调用、回归测试之间的关系。", + "第二个输入可从应用层、评价层、过程层、目的层和人类能力层分析连接与逃离连接的双重机制。" + ], + "output_contract": [ + "should_call: true | false。", + "entry_reason: 为什么值得进入思想考古;不应调用时说明 no-call 原因。", + "recommended_max_depth: application | domain | process | purpose | core_mechanism | human_capability | philosophical_bedrock。", + "layers_to_analyze: 实际需要分析的层级数组。", + "stop_reason: 为什么停在这一层。", + "no_deeper_reason: 继续下潜不会改变什么。", + "assumptions_by_layer: 按七层列出关键假设;未分析层级保留空数组。", + "validation_needed: 哪些判断需要现实反馈、数据、专家盲审或红队。", + "action_implication: 下潜结果如何改变下一步行动。" + ], + "structured_output_contract": { + "should_call": "boolean", + "entry_reason": "string", + "recommended_max_depth": ["application", "domain", "process", "purpose", "core_mechanism", "human_capability", "philosophical_bedrock"], + "layers_to_analyze": "array", + "stop_reason": "string", + "no_deeper_reason": "string", + "assumptions_by_layer": { + "application": "array", + "domain": "array", + "process": "array", + "purpose": "array", + "core_mechanism": "array", + "human_capability": "array", + "philosophical_bedrock": "array" + }, + "validation_needed": "array", + "action_implication": "string" + }, + "depth_control": { + "principle": "最小充分下潜", + "stop_conditions": [ + "已经足以改变决策。", + "继续下潜不会增加解释力。", + "缺少证据支撑更深推断。", + "问题不值得重型建模。", + "用户当前只需要执行层结果。", + "QPI 未放行中重型难题或课题时,不进入完整思想考古。", + "如果 recommended_max_depth 低于 philosophical_bedrock,不得自动展开到哲学基岩。" + ], + "overuse_warning": "思想考古不是所有问题的默认流程,必须先经过问题价值评估和 QPI 定性。" + }, + "stabilization_path": [ + "补充轻量、中量、重量问题的边界测试。", + "补充不同领域的七层下钻案例。", + "建立停止条件和现实验证的示例库。" + ], + "productization_notes": "思想考古适合作为中重度问题的深层建模模块,不应默认全量调用。它应该由 QPI、问题复杂度和复用价值共同触发。", + "version": "0.1", + "last_updated": "2026-06-16" +} diff --git a/models/model_index.json b/models/model_index.json new file mode 100644 index 0000000..aa4c185 --- /dev/null +++ b/models/model_index.json @@ -0,0 +1,36 @@ +{ + "index_version": "0.1", + "last_updated": "2026-06-17", + "models": [ + { + "model_id": "intellectual_archaeology", + "model_name": "思想考古学", + "model_type": "deep_modeling_model", + "pipeline_position": "deep_analysis", + "model_file": "models/intellectual_archaeology.model.json", + "card_file": "cards/intellectual_archaeology.md", + "source_article_count": 2, + "source_evidence_count": 5, + "regression_case_count": 17, + "stability_level": "B", + "regression_status": "pending", + "status": "draft", + "last_updated": "2026-06-16" + }, + { + "model_id": "qpi", + "model_name": "QPI 三元定性模型", + "model_type": "routing_model", + "pipeline_position": "pre_analysis", + "model_file": "models/qpi.model.json", + "card_file": "cards/qpi.md", + "source_article_count": 3, + "source_evidence_count": 10, + "regression_case_count": 17, + "stability_level": "B", + "regression_status": "pending", + "status": "draft", + "last_updated": "2026-06-16" + } + ] +} diff --git a/models/qpi.model.json b/models/qpi.model.json new file mode 100644 index 0000000..b832f47 --- /dev/null +++ b/models/qpi.model.json @@ -0,0 +1,243 @@ +{ + "model_id": "qpi", + "model_name": "QPI 三元定性模型", + "model_type": "routing_model", + "pipeline_position": "pre_analysis", + "one_sentence_definition": "QPI 用于判断某个认知主体在特定上下文中,如何将期望—现实落差框定为 Question、Problem、Issue、mixed 或 no-call,并识别其中的上下文缺口、动态演化和误框定风险。", + "core_question": "谁在什么场景下,把什么期望—现实落差框定成了哪类问题;这个框定是否缺上下文、正在演化或存在误框定风险?", + "core_mechanism": "先执行 no-call gate,再检查主体位置、场景上下文、责任范围、经验水平、时间尺度、成功标准和硬反馈可用性;在上下文不足时输出 provisional classification 和 missing_context,不做高置信定性;随后抽取期望—现实落差、三类匮乏物、动态阶段、治理负荷和误框定风险,区分同一框架内的 mixed 与跨主体视角分歧。", + "status": "draft", + "source_articles": [ + "article_qpi_primary_001", + "article_qpi_contextual_2025_001", + "article_cognitive_os_synthesis_001" + ], + "source_evidence": [ + "excerpt_qpi_primary_spectrum_001", + "excerpt_qpi_primary_question_001", + "excerpt_qpi_primary_problem_001", + "excerpt_qpi_primary_issue_001", + "excerpt_qpi_primary_pathology_reduction_001", + "excerpt_qpi_primary_pathology_inflation_001", + "excerpt_qpi_contextual_subjectivity_001", + "excerpt_qpi_contextual_gap_001", + "excerpt_qpi_contextual_dynamic_001", + "excerpt_qpi_cognitive_os_application_001" + ], + "input_types": [ + "模糊问题", + "复杂问题", + "业务问题描述", + "组织冲突叙述", + "需求或故障初始表述", + "需要进入深度分析前的问题定义" + ], + "output_types": [ + "问题类型判断", + "分类作用域", + "是否临时判断", + "主体位置", + "场景上下文", + "责任范围", + "经验水平", + "问题拥有者", + "问题来源", + "时间尺度", + "期望现实落差", + "上下文充足度", + "缺失上下文", + "三类匮乏物强度", + "主导匮乏物", + "分类理由", + "分类置信度", + "多视角分类", + "动态阶段", + "可能演化轨迹", + "成功标准稳定性", + "硬反馈可用性", + "治理负荷", + "澄清问题", + "证据缺口", + "核心匮乏物判断", + "误判风险", + "推荐处理路径", + "后续模型调用建议" + ], + "call_when": [ + "用户输入的问题定义不清。", + "同一问题被不同主体以不同方式理解。", + "用户急于求解但尚未判断问题性质。", + "问题中混杂事实、路径、利益、共识和系统结构。", + "需要决定后续调用哪些认知模型。", + "怀疑存在暴力降维、恶意升维或手段与目标错配。" + ], + "do_not_call_when": [ + "用户只是查询明确事实。", + "用户已经给出明确执行任务。", + "输入是纯创意写作且不需要问题定性。", + "问题已经被清楚分类且只需要执行后续步骤。", + "输入不是问题定义,而是纯粹的润色或格式转换请求。" + ], + "trigger_keywords": [ + "问题到底是什么", + "为什么解决不了", + "卡在哪里", + "技术问题还是组织问题", + "方向是不是错了", + "为什么反复出现", + "该怎么定义这个问题", + "这个问题怎么拆", + "缺数据", + "缺路径", + "缺共识" + ], + "negative_triggers": [ + "请直接查询", + "请直接改写", + "只要清单", + "不要分析原因", + "不要展开", + "只改错别字" + ], + "related_models": [ + "intellectual_archaeology" + ], + "conflicting_models": [], + "disciplinary_anchors": [ + "问题定义理论", + "决策科学", + "系统论", + "复杂系统", + "组织行为", + "工程问题分解" + ], + "common_misuses": [ + "把 QPI 当作完整解决方案,而不是问题定义和路由模型。", + "把所有复杂叙事都归为课题,逃避可执行的难题拆解。", + "把系统性课题暴力压缩成个人执行难题。", + "把具体可解决的难题恶意升维成不可处理的课题。", + "在事实缺口上过度建模,拖慢本应直接检索的提问。", + "忽略问题拥有者,直接给出单一视角的分类。" + , + "把缺少主体和场景的复杂短句直接判成高置信 Q/P/I。", + "把跨主体视角分歧误写成同一主体内的 mixed。" + ], + "failure_modes": [ + "核心匮乏物识别错误,导致后续资源配置错位。", + "未识别权力叙事,接受了伪问题或甩锅框架。", + "把动态平衡型课题误判为可终结的难题。", + "把明确工程障碍误判为需要无限讨论的课题。", + "分类没有给出理由。", + "分类之后没有给出后续处理路径。" + , + "缺少 subject_position 或 scenario_context 时仍输出 high confidence。", + "只按表层关键词定性,忽略责任范围、成功标准、硬反馈和治理负荷。" + ], + "selection_priority": 9, + "confidence_level": "medium", + "stability_profile": { + "stability_level": "B", + "needs_stabilization": true, + "main_risks": [ + "Q/P/I 在真实复杂案例中可能同时存在,需要先区分同一主体场景内的 mixed 与不同主体视角导致的 inter_viewpoint_divergence。", + "权力博弈判断依赖上下文,证据不足时不能断言动机。", + "边界案例仍需用真实业务输入扩展。", + "主体性、上下文充足度、动态演化和治理负荷需要继续通过 owner 原始案例校准。" + ], + "reason": "三分结构清晰,适合作为入口路由模型,但需要补充大量边界案例,防止过度升维或降维。", + "next_stabilization_action": "补充主体-上下文-动态案例、混合问题、误用问题和轻量问题测试,并记录主导匮乏物与多视角分歧判断标准。", + "stabilization_notes": "当前已具备 v0.1 调用基础,但仍保持 draft 状态。" + }, + "regression_status": "pending", + "example_inputs": [ + "我们团队每次都说要长期主义,但一到季度 KPI 就回到短期动作,这到底是什么问题?", + "我知道要做模型库,但不知道先用数据库还是文件系统,这属于什么问题?" + ], + "example_outputs": [ + "第一个输入更接近课题,因为它涉及激励结构、时间尺度冲突和组织共识。", + "第二个输入更接近难题,因为目标明确,主要缺的是实现路径和技术取舍。" + ], + "output_contract": [ + "classification_scope: subject_contextual | multi_perspective | insufficient_context | no_call。", + "is_provisional: true | false;缺少主体或场景时必须为 true。", + "subject_position: 当前认知主体的位置;未知时写 unknown。", + "scenario_context: 问题发生的场景;未知时写 unknown。", + "responsibility_scope: individual_learning | team_execution | cross_function_governance | owner_governance | unknown。", + "context_sufficiency: high | medium | low。", + "missing_context: 缺少哪些主体、场景、目标、资源、责任或时间信息。", + "problem_owner: 谁的问题;未知时写 unknown。", + "problem_source: 问题从哪里被提出,是否可能带有立场、恐惧或甩锅框架。", + "time_scale: short_term | mid_term | long_term | mixed | unknown。", + "expectation_reality_gap: expected、reality、gap_summary;未知时写 unknown。", + "scarcity_profile: 分别标出 data_scarcity、path_or_resource_scarcity、consensus_or_order_scarcity 的 high | medium | low | unknown。", + "dominant_scarcity: data | path_resource | consensus_order | mixed | unknown。", + "classification: question | problem | issue | mixed | no_call。", + "classification_confidence: high | medium | low。", + "classification_by_viewpoint: 多视角分歧时列出不同主体下的分类和理由。", + "dynamic_stage: initial | evolving | recurring | stabilized | unknown。", + "possible_trajectory: question_to_problem | problem_to_issue | issue_to_problem | stabilized | unknown。", + "success_criteria_stability: stable | unstable | contested | unknown。", + "hard_feedback_availability: high | medium | low | unknown。", + "governance_load: high | medium | low | unknown。", + "evidence_gap: 列出还缺哪些信息才能稳定判断;mixed 或 low confidence 时必须填写。", + "misclassification_risk: 标出暴力降维、恶意升维或手段错配风险。", + "recommended_clarifying_questions: 上下文不足时必须给出需要补问的问题。", + "recommended_next_step: 检索 | 工程拆解 | 共识协调 | 补充上下文 | 不调用。", + "next_model_candidates: 后续可调用模型 ID;无则为空数组。" + ], + "structured_output_contract": { + "classification_scope": ["subject_contextual", "multi_perspective", "insufficient_context", "no_call"], + "is_provisional": "boolean", + "subject_position": "string | unknown", + "scenario_context": "string | unknown", + "responsibility_scope": ["individual_learning", "team_execution", "cross_function_governance", "owner_governance", "unknown"], + "context_sufficiency": ["high", "medium", "low"], + "missing_context": "array", + "problem_owner": "string | unknown", + "problem_source": "string | unknown", + "time_scale": ["short_term", "mid_term", "long_term", "mixed", "unknown"], + "experience_level": ["novice", "experienced", "expert", "cross_domain", "unknown"], + "expectation_reality_gap": { + "expected": "string | unknown", + "reality": "string | unknown", + "gap_summary": "string | unknown" + }, + "scarcity_profile": { + "data_scarcity": ["high", "medium", "low", "unknown"], + "path_or_resource_scarcity": ["high", "medium", "low", "unknown"], + "consensus_or_order_scarcity": ["high", "medium", "low", "unknown"] + }, + "dominant_scarcity": ["data", "path_resource", "consensus_order", "mixed", "unknown"], + "classification": ["question", "problem", "issue", "mixed", "no_call"], + "classification_confidence": ["high", "medium", "low"], + "classification_by_viewpoint": "array", + "dynamic_stage": ["initial", "evolving", "recurring", "stabilized", "unknown"], + "possible_trajectory": "array", + "success_criteria_stability": ["stable", "unstable", "contested", "unknown"], + "hard_feedback_availability": ["high", "medium", "low", "unknown"], + "governance_load": ["high", "medium", "low", "unknown"], + "evidence_gap": "array", + "misclassification_risk": "array", + "recommended_clarifying_questions": "array", + "recommended_next_step": ["检索", "工程拆解", "共识协调", "补充上下文", "不调用"], + "next_model_candidates": "array" + }, + "depth_control": { + "principle": "先定性,再决定是否进入深层模型。", + "stop_conditions": [ + "如果只是明确事实查询,停止在提问层并建议检索。", + "如果已明确是执行任务,停止继续路由。", + "如果分类证据不足,先输出 evidence_gap 并要求补充上下文。", + "如果 negative_triggers 命中且没有复杂问题信号,输出 classification=no_call。" + ], + "overuse_warning": "QPI 是前置路由模型,不应替代后续具体分析模型。" + }, + "stabilization_path": [ + "补充真实业务混合案例。", + "补充暴力降维和恶意升维案例。", + "形成主导匮乏物判定示例库。" + ], + "productization_notes": "QPI 应作为问题回答系统的前置路由模型,用于防止系统在问题类型错误的情况下直接给答案。", + "version": "0.1", + "last_updated": "2026-06-16" +} diff --git a/repo_tree.txt b/repo_tree.txt new file mode 100644 index 0000000..93c3c3e --- /dev/null +++ b/repo_tree.txt @@ -0,0 +1,82 @@ +. +|-- AGENTS.md +|-- PROJECTS.md +|-- README.md +|-- cards/ +| |-- README.md +| |-- card_index.md +| |-- intellectual_archaeology.md +| `-- qpi.md +|-- docs/ +| |-- CHATGPT_HANDOFF_RULES.md +| |-- CONTENT_STABILIZATION_PROTOCOL.md +| |-- DATA_CONTRACT.md +| |-- DECISIONS.md +| |-- GPT_PLAN_LOCALIZATION_PROTOCOL.md +| |-- INDEX_MAINTENANCE_PROTOCOL.md +| |-- KNOWLEDGE_ASSET_RULES.md +| |-- MODEL_CARD_CONTRACT.md +| |-- MODEL_EXTRACTION_RULES.md +| |-- MODEL_EXTRACTION_WORKFLOW.md +| |-- PROJECT_BRIEF.md +| |-- WORKFLOW.md +| `-- superpowers/ +|-- knowledge_assets/ +| |-- 00_用户背景与产品上下文.md +| |-- 01_核心模型地图.md +| |-- 02_模型卡结构规范.md +| |-- 03_核心模型抽取样板.md +| |-- 06_模型稳固性评级规则.md +| `-- 07_产品规划过程记录.md +|-- models/ +| |-- README.md +| |-- intellectual_archaeology.model.json +| |-- model_index.json +| `-- qpi.model.json +|-- reports/ +| |-- ChatGPT交接文档_模型库MVP_第二轮内容稳定化_2026-06-16.md +| |-- changed_files_manifest.md +| |-- command_log.md +| |-- content_review_report_v0.2.md +| |-- evidence_coverage_report_v0.2.md +| |-- index_check_report.md +| |-- index_rebuild_report.md +| |-- model_card_sync_report_v0.2.md +| |-- model_review_status.json +| |-- open_questions_for_CCRA.md +| |-- schema_change_notes.md +| |-- selector_regression_report_v0.2.md +| `-- validation_report.md +|-- requirements/ +| |-- ccpe/ +| `-- skills-vault/ +|-- schemas/ +| |-- card_index.schema.json +| |-- model_card.schema.json +| |-- model_index.schema.json +| |-- regression_case.schema.json +| |-- source_article.schema.json +| `-- source_excerpt.schema.json +|-- scripts/ +| |-- check_card_contract.py +| |-- check_model_card_sync.py +| |-- rebuild_indexes.py +| |-- run_selector_demo.py +| |-- run_selector_regression.py +| `-- validate_model_library.py +|-- selector/ +| |-- README.md +| |-- selector_examples.json +| `-- selector_rules.json +|-- sources/ +| |-- evidence_coverage.matrix.json +| |-- source_articles.json +| `-- source_excerpts.json +`-- tests/ + |-- intellectual_archaeology.regression.json + |-- qpi.regression.json + |-- regression_cases.json + |-- regression_index.json + |-- test_card_contract.py + |-- test_rebuild_indexes.py + `-- test_validate_model_library.py diff --git a/reports/ChatGPT交接文档_模型库MVP_2026-06-16.md b/reports/ChatGPT交接文档_模型库MVP_2026-06-16.md new file mode 100644 index 0000000..7e379db --- /dev/null +++ b/reports/ChatGPT交接文档_模型库MVP_2026-06-16.md @@ -0,0 +1,138 @@ +# 项目交接文档:模型库 / 模型管理子系统 MVP + +## 1. 当前阶段 + +已完成 QPI 和思想考古学两个样板模型的本地工程化打样。 + +当前状态:模型内容通过本地 contract,但仍是 `draft`,等待产品 / ChatGPT / CCRA 内容审查。 + +## 2. 本轮目标 + +验证 QPI 和思想考古学两个核心模型,能否被整理为: + +- 人读模型卡 +- 机器可读 JSON +- 来源文章索引 +- 来源证据片段 +- 回归测试用例 +- schema 校验对象 +- 最小规则选择器对象 +- model/card index 条目 + +## 3. 已完成内容 + +- 建立 GPT 规划本地化协议。 +- 建立模型抽取规则。 +- 建立模型卡结构规范。 +- 建立模型抽取工作流。 +- 建立知识资产规则。 +- 建立 ChatGPT 交接规则。 +- 建立 `knowledge_assets/` 长期知识资产目录。 +- 创建 model/card/source/excerpt/regression/index schemas。 +- 创建 QPI 和思想考古学的 JSON model card。 +- 创建 QPI 和思想考古学的 Markdown card。 +- 创建 source article 和 source excerpt 索引。 +- 创建 regression cases。 +- 创建 selector rules 和 selector examples。 +- 创建 model index 和 card index。 +- 创建 validator、card contract checker、selector demo。 + +## 4. 关键文件路径 + +规则和流程: + +- `docs/GPT_PLAN_LOCALIZATION_PROTOCOL.md` +- `docs/MODEL_EXTRACTION_RULES.md` +- `docs/MODEL_CARD_CONTRACT.md` +- `docs/MODEL_EXTRACTION_WORKFLOW.md` +- `docs/CHATGPT_HANDOFF_RULES.md` +- `docs/KNOWLEDGE_ASSET_RULES.md` + +长期知识资产: + +- `knowledge_assets/00_用户背景与产品上下文.md` +- `knowledge_assets/01_核心模型地图.md` +- `knowledge_assets/02_模型卡结构规范.md` +- `knowledge_assets/03_核心模型抽取样板.md` +- `knowledge_assets/06_模型稳固性评级规则.md` +- `knowledge_assets/07_产品规划过程记录.md` + +模型资产: + +- `models/qpi.model.json` +- `models/intellectual_archaeology.model.json` +- `cards/qpi.md` +- `cards/intellectual_archaeology.md` +- `models/model_index.json` +- `cards/card_index.md` + +数据与测试: + +- `sources/source_articles.json` +- `sources/source_excerpts.json` +- `tests/regression_cases.json` +- `selector/selector_rules.json` +- `selector/selector_examples.json` + +校验: + +- `scripts/validate_model_library.py` +- `scripts/check_card_contract.py` +- `scripts/run_selector_demo.py` +- `reports/validation_report.md` +- `reports/内容修复检查摘要_v0.1.md` + +## 5. Codex 实现和原计划的差异 + +- 原 GPT 规划是外部计划;Codex 已将其转为本地规则、schema、workflow、index 和工具。 +- 原 GPT 规划建议长期知识库文件名带版本号;本地决定文件名不带版本号,版本写入文档内部。 +- 原 GPT 规划建议可包含具体模型卡长期资产;本地决定不复制具体模型卡,具体模型卡 source of truth 保持在 `cards/` 和 `models/`。 +- 原 GPT 规划中的 `source_index.json` 被拆分为 `sources/source_articles.json` 和 `sources/source_excerpts.json`。 +- regression cases 当前使用合并文件 `tests/regression_cases.json`,未按模型拆分。 + +## 6. 当前问题 + +- QPI 和思想考古学内容通过 contract,但仍需产品语义审查。 +- source evidence 是否足够支撑所有字段,仍需进一步判断。 +- regression cases 是样板级,真实业务案例仍不足。 +- selector demo 可运行,但评分逻辑仍是 v0.1 简单规则。 +- 长期知识资产刚建立,需要确认是否还缺 `04/05` sample 类文件。 + +## 7. 需要 ChatGPT / CCRA 判断的事项 + +- QPI 当前字段和边界是否准确。 +- 思想考古学是否应保持七层结构,还是需要更强的停止条件表达。 +- 是否应引入第三个核心模型。 +- 从产品角度看,后续模型抽取是否需要拆成抽取、检验、评分三个环节。 +- 如果需要多环节审查,这三个环节的质量标准分别是什么。 +- 当前 QPI / 思想考古样板是否已经暴露出需要多角色审查的质量问题。 +- regression cases 是否应按模型拆分。 +- selector 应继续规则化,还是加入 LLM 判断层。 + +## 8. 下一步候选方向 + +- 继续完善模型管理子系统。 +- 接入最小问题回答流程。 +- 扩展到第三个核心模型。 +- 做模型稳固性评级审查。 +- 扩展 regression cases。 +- 评估是否需要抽取、检验、评分三段式审查流程。 + +## 9. 验证结果 + +已运行: + +```powershell +python -m unittest discover -s tests -p "test*.py" -v +python scripts\check_card_contract.py +python scripts\validate_model_library.py +python scripts\run_selector_demo.py +``` + +结果: + +- Unit tests: PASS, 9 tests. +- Card contract: PASS. +- Model library validation: PASS. +- Selector demo: PASS. +- `reports/validation_report.md`: `Status: PASS`. diff --git a/reports/ChatGPT交接文档_模型库MVP_第二轮内容稳定化_2026-06-16.md b/reports/ChatGPT交接文档_模型库MVP_第二轮内容稳定化_2026-06-16.md new file mode 100644 index 0000000..3a24b74 --- /dev/null +++ b/reports/ChatGPT交接文档_模型库MVP_第二轮内容稳定化_2026-06-16.md @@ -0,0 +1,153 @@ +# ChatGPT 交接文档:模型库 MVP 第二轮内容稳定化 + +## 审核摘要 + +本轮依据: + +- `2026-06-16-核心模型抽取样板 v0.1.md` +- `CCRA_Codex指导意见_Index更新策略与下一轮执行_v0.2_2026-06-16.md` +- `CCRA_Codex指导意见_模型库MVP第二轮内容稳定化_v0.3_2026-06-16.md` + +本轮目标: + +- 不扩展第三模型。 +- 不接入完整问题回答系统。 +- 不引入 LLM selector。 +- 不升级 stable。 +- 优先完成 QPI / 思想考古内容稳定化、证据矩阵、回归扩展、selector 防误召回和 index drift 检查。 + +当前状态: + +- QPI: `draft / B / pending` +- 思想考古: `draft / B / pending` + +请求 CCRA 审核: + +1. 内容稳定化是否达标。 +2. evidence coverage 是否足够。 +3. regression cases 是否足够。 +4. selector v0.2 是否避免误召回。 +5. 是否允许进入下一阶段。 + +## 1. 本轮 Codex 接收的指导文件 + +- `reports/Codex新会话交接文档_模型库MVP_2026-06-16.md` +- `C:\Users\wangq\Documents\Codex\knowledge-vault\work\internal\强哥的思想宇宙\GPT成果\CCRA_Codex指导意见_Index更新策略与下一轮执行_v0.2_2026-06-16.md` +- `C:\Users\wangq\Documents\Codex\knowledge-vault\work\internal\强哥的思想宇宙\GPT成果\CCRA_Codex指导意见_模型库MVP第二轮内容稳定化_v0.3_2026-06-16.md` +- 用户明确约束:不扩展第三模型、不接完整问题回答系统、不引入 LLM selector、不升级 stable。 + +## 2. 本轮实际完成任务 + +- 建立 `docs/CONTENT_STABILIZATION_PROTOCOL.md`。 +- 建立字段级 `sources/evidence_coverage.matrix.json` 和 `reports/evidence_coverage_report_v0.2.md`。 +- 修复 `sources/source_excerpts.json` 的 `quote_status`、`source_location`,并补充 QPI 暴力降维 / 恶意升维 evidence。 +- 扩展 source article / source excerpt schema 枚举与 validator 检查。 +- 强化 QPI JSON 和 Markdown card 输出契约。 +- 强化思想考古 JSON 和 Markdown card 停止门。 +- 扩展 regression schema 的可评估字段。 +- 拆分 regression cases 为每模型文件,并保持 aggregate 文件。 +- 每模型扩展到 17 条 regression cases。 +- selector 升级到 v0.2 规则版,保留 no LLM。 +- 新增 `scripts/run_selector_regression.py`。 +- 新增 `scripts/check_model_card_sync.py`。 +- 生成 content review、model review status、next action、command log、schema notes、changed files manifest、repo tree 等审核材料。 + +## 3. 未完成任务及原因 + +- 未升级 `stable`:用户和 CCRA 明确禁止,本轮只允许 draft-callable 审查结论。 +- 未扩展第三模型:用户和 CCRA 明确要求先稳定 QPI / 思想考古。 +- 未接入完整问题回答系统:属于非目标。 +- 未引入 LLM selector:selector v0.2 仍为规则 selector。 +- 未建立 `selector_score_breakdown` 的运行时数据仓库:当前以静态报告和 selector demo 输出说明 score breakdown。 + +## 4. 关键新增 / 修改文件 + +详见: + +- `reports/changed_files_manifest.md` + +核心新增文件: + +- `docs/CONTENT_STABILIZATION_PROTOCOL.md` +- `sources/evidence_coverage.matrix.json` +- `tests/qpi.regression.json` +- `tests/intellectual_archaeology.regression.json` +- `scripts/run_selector_regression.py` +- `scripts/check_model_card_sync.py` +- `reports/content_review_report_v0.2.md` +- `reports/model_review_status.json` +- `reports/next_action_register_v0.2.md` +- `reports/changed_files_manifest.md` +- `reports/command_log.md` +- `reports/open_questions_for_CCRA.md` +- `reports/schema_change_notes.md` + +## 5. 执行命令与结果 + +详见: + +- `reports/command_log.md` + +摘要: + +| Command | Result | +| --- | --- | +| `python scripts\rebuild_indexes.py --check` | PASS | +| `python scripts\check_card_contract.py` | PASS | +| `python scripts\validate_model_library.py` | PASS | +| `python scripts\run_selector_demo.py` | PASS | +| `python scripts\run_selector_regression.py` | PASS | +| `python scripts\check_model_card_sync.py` | PASS | +| `python -m unittest discover -s tests -p "test*.py" -v` | PASS, 14 tests | + +## 6. 实现取舍 + +- `draft-callable` 没有写入模型 JSON,仅作为 review report 结论,避免过早扩展状态 schema。 +- `reports/index_check_report.md` 作为审核友好摘要补充;实际脚本仍写 `reports/index_rebuild_report.md`。 +- `reports/content_review_report.md`、`reports/evidence_coverage_matrix.md`、`reports/selector_regression_report.md` 作为无版本审核入口,指向 v0.2 正本。 +- regression per-model 文件作为人审 source of truth,`tests/regression_cases.json` 保持 aggregate 供 validator 使用。 +- selector v0.2 只做规则评分和拒绝理由,不做回答生成。 + +## 7. 需要 CCRA / 用户确认的问题 + +详见: + +- `reports/open_questions_for_CCRA.md` + +核心问题: + +1. QPI mixed case 的 `dominant_scarcity` 仲裁是否足够。 +2. QPI 输出契约中的 `problem_owner`、`time_scale`、`dominant_scarcity`、`evidence_gap` 是否应进入 schema required。 +3. 思想考古 `recommended_max_depth` / `stop_reason` / `no_deeper_reason` 是否应进入 schema required。 +4. selector v0.2 阈值是否需要基于真实输入校准。 +5. 是否继续保持 `draft / B / pending`。 +6. 是否允许之后讨论第三模型,默认答案仍为否。 + +## 8. 当前模型状态判断 + +| Model | Status | Stability | Regression Status | Draft-callable | Stable Allowed | +| --- | --- | --- | --- | --- | --- | +| `qpi` | draft | B | pending | yes | no | +| `intellectual_archaeology` | draft | B | pending | yes | no | + +## 9. 审核包入口 + +- `models/model_index.json` +- `cards/card_index.md` +- `models/qpi.model.json` +- `models/intellectual_archaeology.model.json` +- `cards/qpi.md` +- `cards/intellectual_archaeology.md` +- `sources/source_articles.json` +- `sources/source_excerpts.json` +- `sources/evidence_coverage.matrix.json` +- `tests/qpi.regression.json` +- `tests/intellectual_archaeology.regression.json` +- `tests/regression_cases.json` +- `selector/selector_rules.json` +- `selector/selector_examples.json` +- `reports/content_review_report_v0.2.md` +- `reports/validation_report.md` +- `reports/index_check_report.md` +- `reports/selector_regression_report_v0.2.md` +- `reports/model_card_sync_report_v0.2.md` diff --git a/reports/Codex_模型资产链路摘要_v0.1.md b/reports/Codex_模型资产链路摘要_v0.1.md new file mode 100644 index 0000000..dc24251 --- /dev/null +++ b/reports/Codex_模型资产链路摘要_v0.1.md @@ -0,0 +1,98 @@ +# Codex 模型资产链路摘要 v0.1 + +## 1. Current Work Session + +Date: 2026-06-16 + +Task: 根据 GPT 抽取样板和三份中文来源材料,建立 QPI 与思想考古学的第一版模型资产链路。 + +## 2. Completed Work + +- 确认 `intellectual_archaeology` 作为思想考古学的机器 ID。 +- 按“字段名英文、字段内容中文”的规则产出 JSON 与 Markdown。 +- 新增四类 JSON Schema:model spec、source article、source excerpt、regression case。 +- 新增三份来源文章记录。 +- 新增十条 source evidence excerpt。 +- 新增 QPI 与思想考古学的模型卡。 +- 新增 QPI 与思想考古学的机器可读 model JSON。 +- 新增十条回归用例,每个模型五条,覆盖正例、边界和误用。 +- 新增 data-only selector 规则与示例。 +- 新增标准库 Python 校验脚本,并以单元测试覆盖核心校验行为。 +- 运行校验并生成 `reports/validation_report.md`。 + +## 3. Files Created + +- `schemas/model_spec.schema.json` +- `schemas/source_article.schema.json` +- `schemas/source_excerpt.schema.json` +- `schemas/regression_case.schema.json` +- `sources/source_articles.json` +- `sources/source_excerpts.json` +- `models/qpi.model.json` +- `models/intellectual_archaeology.model.json` +- `cards/qpi.md` +- `cards/intellectual_archaeology.md` +- `tests/regression_cases.json` +- `tests/test_validate_model_library.py` +- `selector/selector_rules.json` +- `selector/selector_examples.json` +- `scripts/validate_model_library.py` +- `reports/validation_report.md` +- `reports/Codex_模型资产链路摘要_v0.1.md` + +## 4. Files Modified + +- `README.md` +- `schemas/README.md` +- `models/README.md` +- `sources/README.md` +- `tests/README.md` +- `selector/README.md` +- `scripts/README.md` +- `docs/DECISIONS.md` + +## 5. Validation Status + +Commands run: + +```powershell +python -m unittest tests.test_validate_model_library -v +python scripts\validate_model_library.py +``` + +Result: + +- Unit tests: 2 tests passed. +- Model library validation: passed. +- Validation report written to `reports/validation_report.md`. + +## 6. Assumptions Made + +- QPI 的主要来源为 `2026-01-07-anchoring-the-void.md`,综合应用说明作为补充来源。 +- 思想考古学的主要来源为 `2025-10-26-the-workshop-of-Modelers.md` 的 1.3 节,综合应用说明作为边界规则补充来源。 +- 证据片段可以引用原文短段或压缩摘录,但不能替代完整原文;完整来源路径保留在 `sources/source_articles.json`。 +- v0.1 schema 保持宽松,仅锁定必填字段和基础类型,不提前引入复杂 enum。 +- selector 当前只做规则数据,不做可执行 demo,以避免在模型资产尚未审阅前过早扩展脚本。 + +## 7. What Does Not Yet Work + +- `scripts/validate_model_library.py` 还没有执行 JSON Schema draft 的完整校验,只做当前 MVP 需要的必填字段和引用完整性校验。 +- selector 还没有可执行评分脚本。 +- 回归用例还没有自动执行器,它们目前是产品稳定性测试数据。 +- 模型内容尚未经过项目 owner 的逐字段审阅。 +- source excerpts 仍是第一轮人工抽取,后续可以追加更细证据片段。 + +## 8. Questions for Product / CCRA + +- QPI 的 `confidence_level` 是否应从 `medium` 升到 `high`,还是等真实案例回归后再升级? +- 思想考古学是否需要把“七层框架”作为独立结构化字段加入 model JSON,还是暂时保留在 `core_mechanism` 与 card 中? +- selector demo 是否进入下一步,还是先审模型卡和回归用例? +- 是否需要为“源文证据摘录格式”向 `skills-vault` 提出可复用抽取工具需求? + +## 9. Suggested Next Tasks + +1. 项目 owner 审阅两张模型卡的定义、适用边界和常见误用。 +2. 根据审阅意见修订 model JSON 与 cards。 +3. 为 selector 增加最小可执行 demo,输入文本后输出推荐模型、分数、理由和 routing notes。 +4. 将回归用例接入一个简单检查器,验证每个核心模型至少有五条 case,且覆盖 positive、boundary、misuse。 +5. 如果后续需要批量从中文文章抽 evidence excerpt,再向 `requirements/skills-vault/` 写工具需求。 diff --git a/reports/Codex新会话交接文档_CCRA评审后处理_2026-06-16.md b/reports/Codex新会话交接文档_CCRA评审后处理_2026-06-16.md new file mode 100644 index 0000000..bc74981 --- /dev/null +++ b/reports/Codex新会话交接文档_CCRA评审后处理_2026-06-16.md @@ -0,0 +1,258 @@ +# Codex 新会话交接文档:CCRA 评审后处理 + +date: 2026-06-16 + +repo: `C:\Users\wangq\Documents\Codex\work-projects\the-mindscape-of-bro-tsong` + +phase: `model_library_mvp` + +next_context: 用户将在新会话中带回 GPT / CCRA 对压缩审核包的评审意见。 + +## 1. 当前状态摘要 + +本仓库当前仍只处理两个样板模型: + +- `qpi` +- `intellectual_archaeology` + +当前状态保持: + +| Model ID | Status | Stability | Regression Status | +| --- | --- | --- | --- | +| `qpi` | draft | B | pending | +| `intellectual_archaeology` | draft | B | pending | + +本轮没有: + +- 扩展第三模型 +- 接完整问题回答系统 +- 引入 LLM selector +- 升级 stable + +## 2. 本轮已完成事项 + +### 2.1 Index 维护机制 + +已完成: + +- `scripts/rebuild_indexes.py` +- `docs/INDEX_MAINTENANCE_PROTOCOL.md` +- `reports/index_rebuild_report.md` +- `reports/index_check_report.md` + +索引策略: + +```text +每次资产变化增量同步 ++ +关键节点全量重建 / 全量校验 +``` + +### 2.2 第二轮内容稳定化 + +已完成: + +- 字段级 evidence coverage matrix +- source excerpt quote 精确性修复 +- QPI 输出契约强化 +- 思想考古停止门强化 +- regression cases 扩展到每模型 17 条 +- selector v0.2 防误召回 +- JSON / Markdown sync check +- content review report + +核心文件: + +- `docs/CONTENT_STABILIZATION_PROTOCOL.md` +- `sources/evidence_coverage.matrix.json` +- `reports/evidence_coverage_report_v0.2.md` +- `models/qpi.model.json` +- `models/intellectual_archaeology.model.json` +- `cards/qpi.md` +- `cards/intellectual_archaeology.md` +- `tests/qpi.regression.json` +- `tests/intellectual_archaeology.regression.json` +- `tests/regression_cases.json` +- `tests/regression_index.json` +- `selector/selector_rules.json` +- `selector/selector_examples.json` +- `scripts/run_selector_regression.py` +- `scripts/check_model_card_sync.py` +- `reports/content_review_report_v0.2.md` +- `reports/model_review_status.json` +- `reports/next_action_register_v0.2.md` + +### 2.3 CCRA 压缩审核包 + +已按 CCRA 压缩上传协议生成: + +```text +ccra_review_bundle/ +``` + +目录内核心文件: + +- `ccra_review_bundle/00_OPEN_THIS_FIRST_CCRA_REVIEW_BRIEF.md` +- `ccra_review_bundle/01_GUIDANCE_PACK_AND_COMPLIANCE_MATRIX.md` +- `ccra_review_bundle/02_CURRENT_ASSET_PACK.md` +- `ccra_review_bundle/03_REPORTS_DIFF_AND_COMMAND_LOG.md` +- `ccra_review_bundle/BUNDLE_FILE_MANIFEST.md` +- `ccra_review_bundle/optional_raw_changed_files.zip` + +上传建议: + +第一批: + +1. `00_OPEN_THIS_FIRST_CCRA_REVIEW_BRIEF.md` +2. `01_GUIDANCE_PACK_AND_COMPLIANCE_MATRIX.md` +3. `03_REPORTS_DIFF_AND_COMMAND_LOG.md` + +如果仍过大: + +1. `00_OPEN_THIS_FIRST_CCRA_REVIEW_BRIEF.md` +2. `03_REPORTS_DIFF_AND_COMMAND_LOG.md` + +第二批按 CCRA 要求补: + +- `02_CURRENT_ASSET_PACK.md` +- `optional_raw_changed_files.zip` +- 或 CCRA 指定的原始文件 + +### 2.4 长期知识资产更新 + +新增: + +- `knowledge_assets/08_CCRA模型库MVP质量门与交接协议.md` + +同步更新: + +- `knowledge_assets/01_核心模型地图.md` +- `knowledge_assets/06_模型稳固性评级规则.md` +- `knowledge_assets/07_产品规划过程记录.md` +- `knowledge_assets/README.md` + +原则: + +长期协议、质量门、交接规则进入 `knowledge_assets/`。 + +本轮审核包、command log、validation report、diff、selector regression report 等临时证据不进入知识资产,只作为新会话审核材料。 + +## 3. 当前验证命令与结果 + +最近一轮完整验证通过: + +```powershell +python scripts\rebuild_indexes.py --check +python scripts\check_card_contract.py +python scripts\validate_model_library.py +python scripts\run_selector_demo.py +python scripts\run_selector_regression.py +python scripts\check_model_card_sync.py +python -m unittest discover -s tests -p "test*.py" -v +``` + +结果: + +- Index check: PASS +- Card contract: PASS +- Model library validation: PASS +- Selector demo: PASS +- Selector regression: PASS +- Model/card sync: PASS +- Unit tests: PASS, 14 tests + +## 4. 新会话开始时建议先读 + +按顺序读: + +1. `AGENTS.md` +2. `README.md` +3. `reports/Codex新会话交接文档_CCRA评审后处理_2026-06-16.md` +4. 用户带回的 GPT / CCRA 评审意见 +5. `knowledge_assets/08_CCRA模型库MVP质量门与交接协议.md` +6. `ccra_review_bundle/00_OPEN_THIS_FIRST_CCRA_REVIEW_BRIEF.md` +7. `ccra_review_bundle/03_REPORTS_DIFF_AND_COMMAND_LOG.md` +8. 评审意见指定的具体资产文件 + +不要一上来全量重读所有模型资产,除非评审意见要求。 + +## 5. 下一轮处理原则 + +用户会带回 GPT / CCRA 评审后的要求。 + +处理时先分类: + +- 内容修复 +- evidence 修复 +- regression 修复 +- selector 修复 +- schema 修复 +- index / handoff 修复 +- supplier request +- owner / CCRA 决策问题 + +如果评审意见是明确修改要求: + +1. 修改最小必要文件。 +2. 如涉及模型 / evidence / regression,运行 `python scripts\rebuild_indexes.py --write`。 +3. 再运行完整验证。 +4. 更新必要报告和交接文件。 + +如果评审意见是产品判断或质量门意见: + +1. 记录在相应报告或 docs。 +2. 不要自行扩大到第三模型。 +3. 不要自行升级 stable。 + +## 6. 当前仍需 CCRA / Owner 判断的问题 + +这些问题已记录在 `reports/open_questions_for_CCRA.md`: + +- QPI mixed case 的 `dominant_scarcity` 仲裁是否足够。 +- QPI 输出契约中的 `problem_owner`、`time_scale`、`dominant_scarcity`、`evidence_gap` 是否应进入 schema required。 +- 思想考古 `recommended_max_depth`、`stop_reason`、`no_deeper_reason` 是否应进入 schema required。 +- selector v0.2 阈值是否需要基于真实输入校准。 +- `draft-callable` 是否继续作为 report-only 状态,还是进入 schema。 +- 是否继续保持两个模型 `draft / B / pending`。 +- 是否允许之后讨论第三模型,默认答案仍为否。 + +## 7. 禁止事项 + +除非用户 / CCRA 明确改变边界,不要: + +- 扩展第三模型 +- 引入完整问题回答系统 +- 引入 LLM selector +- 引入数据库、RAG、知识图谱、前端或后台管理页面 +- 将 `status` 改为 stable +- 将 `stability_level` 改为 A +- 将 `regression_status` 改为 passed +- 把本轮临时审核材料写入 `knowledge_assets/` + +## 8. 工作区提醒 + +当前工作区有大量 untracked 文件,这是模型库 MVP 工程化和内容稳定化产物,不是临时垃圾。 + +不要误删: + +- `cards/*.md` +- `models/*.json` +- `sources/*.json` +- `tests/*.json` +- `reports/*.md` +- `ccra_review_bundle/*` + +测试运行可能生成: + +- `scripts/__pycache__/` +- `tests/__pycache__/` + +验证后可清理这两个缓存目录。 + +## 9. 新会话建议第一句话 + +用户可在新会话中说: + +```text +请先阅读 reports/Codex新会话交接文档_CCRA评审后处理_2026-06-16.md,然后阅读我带回的 GPT / CCRA 评审意见。不要扩第三模型、不要升级 stable。先判断评审意见属于内容修复、schema 修复、selector 修复、evidence 修复、regression 修复还是需要 owner 决策。 +``` diff --git a/reports/Codex新会话交接文档_QPI案例草稿审阅与第三轮后续_2026-06-17.md b/reports/Codex新会话交接文档_QPI案例草稿审阅与第三轮后续_2026-06-17.md new file mode 100644 index 0000000..08f3241 --- /dev/null +++ b/reports/Codex新会话交接文档_QPI案例草稿审阅与第三轮后续_2026-06-17.md @@ -0,0 +1,274 @@ +# Codex 新会话交接文档:QPI 案例草稿审阅与第三轮后续 + +date: 2026-06-17 + +repo: `C:\Users\wangq\Documents\Codex\work-projects\the-mindscape-of-bro-tsong` + +phase: `model_library_mvp` + +current_focus: QPI 主体-上下文-动态框定规则优化、案例草稿 owner 审阅、后续 CCRA 审核资料补强 + +## 1. 当前状态 + +本会话已完成第三轮第一阶段工程硬化: + +- 未扩展第三模型。 +- 未升级 stable。 +- 未接完整问题回答系统。 +- 未引入 LLM selector。 +- `qpi` 与 `intellectual_archaeology` 保持 `draft / B / pending`。 + +已完成: + +- CCRA 审核包按轮次归档。 +- QPI 从“文本分类器”升级为“主体-上下文-动态框定前置路由模型”。 +- `structured_output_contract` 进入 schema properties,但 QPI / IA 专属字段不进入全局 required。 +- validator 已做模型专属 output contract 检查。 +- selector 已改为读取 `selector/selector_rules.json`,并加入 hard no-call gate。 +- 新增 QPI 案例预处理流程,支持后续多模型扩展。 +- 通过子代理从 8 份原始材料抽出 62 个 QPI draft cases,均为 `draft_owner_review_needed`。 + +## 2. 新会话优先阅读顺序 + +新会话不要一上来全量读所有模型资产。建议按下列顺序: + +1. `AGENTS.md` +2. `README.md` +3. 本文件:`reports/Codex新会话交接文档_QPI案例草稿审阅与第三轮后续_2026-06-17.md` +4. QPI 规则:`docs/QPI_CONTEXTUAL_ROUTING_RULES.md` +5. QPI 案例预处理流程:`docs/model_case_preprocessing/qpi/CASE_PREPROCESSING_WORKFLOW.md` +6. round-01 草稿目录说明:`reports/model_case_preprocessing/qpi/round-01/README.md` +7. 用户正在审阅或指定的具体 `.cases.md` 文件 +8. 第三轮审核包入口:`ccra_review_bundle/round-03_2026-06-17_contract-hardening-selector-calibration/00_OPEN_THIS_FIRST_CCRA_REVIEW_BRIEF.md` +9. 第三轮 compliance matrix:`ccra_review_bundle/round-03_2026-06-17_contract-hardening-selector-calibration/01_GUIDANCE_PACK_AND_COMPLIANCE_MATRIX.md` + +## 3. QPI 案例草稿位置 + +QPI 案例预处理规则: + +- `docs/model_case_preprocessing/README.md` +- `docs/model_case_preprocessing/qpi/README.md` +- `docs/model_case_preprocessing/qpi/CASE_PREPROCESSING_WORKFLOW.md` + +草稿目录: + +```text +reports/model_case_preprocessing/qpi/round-01/ +``` + +草稿文件: + +- `reports/model_case_preprocessing/qpi/round-01/flow-redesign.cases.md` +- `reports/model_case_preprocessing/qpi/round-01/disappointment-emotional-isolation.cases.md` +- `reports/model_case_preprocessing/qpi/round-01/year-end-review-development-office.cases.md` +- `reports/model_case_preprocessing/qpi/round-01/year-end-review-engineering-center.cases.md` +- `reports/model_case_preprocessing/qpi/round-01/year-end-review-international-college.cases.md` +- `reports/model_case_preprocessing/qpi/round-01/year-end-review-academic-affairs.cases.md` +- `reports/model_case_preprocessing/qpi/round-01/year-end-review-employment-entrepreneurship.cases.md` +- `reports/model_case_preprocessing/qpi/round-01/year-end-review-research-office.cases.md` + +总量: + +```text +62 draft QPI cases +``` + +状态: + +```text +draft_owner_review_needed +``` + +这些草稿还不是 selector calibration JSON,也不是 regression cases。 + +## 4. 用户下一步怎么审 + +用户不需要一次审完 62 个。 + +建议先挑 10-15 个高质量案例确认。优先挑: + +- 能体现 QPI 主体性 / 上下文性的案例。 +- 能区分 `intra_frame_mixed` 与 `inter_viewpoint_divergence` 的案例。 +- 能体现组织级 I 域治理负荷的案例。 +- 能暴露暴力降维、恶意升维、工具解法主义、过早定性的案例。 +- 用户认为“这就是 QPI 真实应用”的案例。 + +用户可以在 Markdown 草稿中直接改: + +- 删除不成立的 case。 +- 合并重复 case。 +- 修改 `classification_scope`。 +- 修改 `classification` / `dominant_scarcity`。 +- 修改 `classification_confidence`。 +- 补充 Owner Review Questions 的答案。 +- 标记 `owner_approved_for_digest: true`。 + +如果用户只想低负担审阅,可以直接回复: + +```text +保留:文件A case 1/3/5,文件B case 2/4 +删除:文件C case 6 +合并:文件D case 1 和 case 7 +改判:文件E case 3 从 problem 改为 issue +``` + +Codex 应据此更新 Markdown 草稿。 + +## 5. Codex 后续处理规则 + +在用户确认前,不要: + +- 写 `selector/qpi_case_digests.json`。 +- 把 draft cases 合并进 `selector/selector_calibration_inputs.json`。 +- 把 draft cases 写入 regression。 +- 把 draft case 当成 CCRA 已认可内容。 +- 升级 QPI status / stability / regression status。 + +用户确认后,处理路径是: + +```text +draft .cases.md +-> owner-reviewed .cases.md +-> case digest JSON +-> selector calibration inputs +-> selected regression cases +-> validation +-> CCRA review material update +``` + +建议输出位置: + +- owner-reviewed Markdown 仍留在 `reports/model_case_preprocessing/qpi/round-01/` +- 结构化 digest 建议新增:`selector/qpi_case_digests.json` +- selector 校准合并:`selector/selector_calibration_inputs.json` +- 只有特别关键、可复用且边界明确的案例才进入 `tests/regression_cases.json` + +## 6. 脱敏规则 + +组织级 CT 切片已经要求子代理脱敏加工。 + +后续继续处理组织材料时必须: + +- 不保留真实人名。 +- 不保留古人名认知锚点。 +- 不保留机构名、部门名、地点名。 +- 不保留时间戳。 +- 不保留精确人数、金额、比例、面积等高识别数字。 +- 不保留可直接反推组织身份的细节。 +- 使用泛化角色:`decision_maker`、`execution_lead`、`functional_department`、`the organization`。 +- 使用泛化病理:`compliance workaround risk`、`metric pressure`、`incentive backlash`、`governance load`、`audit authenticity risk`。 + +如果发现残留敏感信息,先修 Markdown 草稿,再进入 digest。 + +## 7. 当前已完成的第三轮审核资料 + +第三轮审核包目录: + +```text +ccra_review_bundle/round-03_2026-06-17_contract-hardening-selector-calibration/ +``` + +核心文件: + +- `ccra_review_bundle/round-03_2026-06-17_contract-hardening-selector-calibration/00_OPEN_THIS_FIRST_CCRA_REVIEW_BRIEF.md` +- `ccra_review_bundle/round-03_2026-06-17_contract-hardening-selector-calibration/01_GUIDANCE_PACK_AND_COMPLIANCE_MATRIX.md` +- `ccra_review_bundle/round-03_2026-06-17_contract-hardening-selector-calibration/02_CURRENT_ASSET_PACK.md` +- `ccra_review_bundle/round-03_2026-06-17_contract-hardening-selector-calibration/03_REPORTS_DIFF_AND_COMMAND_LOG.md` +- `ccra_review_bundle/round-03_2026-06-17_contract-hardening-selector-calibration/BUNDLE_FILE_MANIFEST.md` +- `ccra_review_bundle/round-03_2026-06-17_contract-hardening-selector-calibration/optional_raw_changed_files.zip` + +注意:这些审核包是在 QPI draft cases 进入 digest / calibration 之前生成的。等用户完成案例确认并转成 digest/calibration 后,需要生成新的补充审核资料或 round-04。 + +## 8. 已验证命令 + +第三轮工程硬化完成时已通过: + +```powershell +python scripts\rebuild_indexes.py --check +python -m unittest discover -s tests -p "test*.py" -v +python scripts\check_card_contract.py +python scripts\validate_model_library.py +python scripts\run_selector_demo.py +python scripts\run_selector_regression.py +python scripts\check_model_card_sync.py +``` + +结果: + +- Index check: PASS +- Unit tests: PASS, 15 tests +- Card contract: PASS +- Model library validation: PASS +- Selector demo: PASS +- Selector regression: PASS +- Model/card sync: PASS + +案例草稿抽取后没有再改 selector / regression / model JSON,因此无需因为草稿本身重跑全量验证。等 digest/calibration/regression 被写入后,必须重跑完整验证链。 + +## 9. 后续建议计划 + +### Step 1: 用户审阅草稿 + +用户先选 10-15 个案例,不必全审。 + +### Step 2: Codex 整理 owner-reviewed cases + +Codex 根据用户修改,把草稿标记为: + +```text +owner_reviewed +owner_approved_for_digest: true +``` + +### Step 3: 生成 case digest + +新增或更新: + +```text +selector/qpi_case_digests.json +``` + +### Step 4: 合并 selector calibration + +将确认后的案例转入: + +```text +selector/selector_calibration_inputs.json +``` + +仍需标记来源和 owner-reviewed 状态。 + +### Step 5: 选择少量 regression cases + +只挑关键边界案例进入: + +```text +tests/regression_cases.json +tests/qpi.regression.json +``` + +不要把 62 个草稿全部塞进 regression。 + +### Step 6: 验证与审核包补充 + +重跑完整验证链,更新报告,并生成给 CCRA 的补充审核资料。 + +## 10. 边界提醒 + +不要: + +- 扩展第三模型。 +- 升级 stable。 +- 把 `draft-callable` 写进 model status。 +- 引入 LLM selector。 +- 建完整问答系统。 +- 建数据库、RAG、前端或后台服务。 +- 把未确认草稿当作正式 regression。 + +继续保持: + +```text +qpi: draft / B / pending +intellectual_archaeology: draft / B / pending +``` + diff --git a/reports/Codex新会话交接文档_模型库MVP_2026-06-16.md b/reports/Codex新会话交接文档_模型库MVP_2026-06-16.md new file mode 100644 index 0000000..ec9b499 --- /dev/null +++ b/reports/Codex新会话交接文档_模型库MVP_2026-06-16.md @@ -0,0 +1,281 @@ +# Codex 新会话交接文档:模型库 / 模型管理子系统 MVP + +## 1. 当前状态 + +仓库:`C:\Users\wangq\Documents\Codex\work-projects\the-mindscape-of-bro-tsong` + +当前阶段:`model_library_mvp` + +当前已完成: + +- QPI 和思想考古学两个样板模型已工程化为模型资产。 +- 本地规则、schema、workflow、index、validator、selector demo 已建立。 +- ChatGPT 交接规则和长期知识资产规则已建立。 +- `knowledge_assets/` 已建立,放置长期复用的规则性文档,不复制具体模型卡 source of truth。 +- 索引维护已升级为脚本化规则:每次资产变更增量同步,关键节点全量重建或校验。 +- `status` 已加入模型 JSON,作为 `models/model_index.json.status` 的来源字段。 +- 第二轮内容稳定化已完成:字段级 evidence matrix、source excerpt quote 状态、QPI 输出契约、思想考古停止门、regression 扩展、selector v0.2、防误召回测试、JSON/Markdown 同步检查、content review report。 + +当前模型资产状态: + +- `qpi`: `draft` / `B` / `pending` +- `intellectual_archaeology`: `draft` / `B` / `pending` + +二者通过本地 contract,但仍等待产品 / ChatGPT / CCRA 内容审查。 + +当前 review 结论: + +- draft-callable: allowed +- stable: not allowed +- third model expansion: not allowed + +## 2. 下个 Codex 会话先读文件 + +按顺序读: + +1. `AGENTS.md` +2. `README.md` +3. `reports/Codex新会话交接文档_模型库MVP_2026-06-16.md` +4. `reports/ChatGPT交接文档_模型库MVP_2026-06-16.md` +5. `docs/MODEL_EXTRACTION_WORKFLOW.md` +6. `docs/MODEL_EXTRACTION_RULES.md` +7. `docs/MODEL_CARD_CONTRACT.md` +8. `docs/CHATGPT_HANDOFF_RULES.md` +9. `docs/KNOWLEDGE_ASSET_RULES.md` +10. `docs/INDEX_MAINTENANCE_PROTOCOL.md` +11. `models/model_index.json` +12. `cards/card_index.md` + +如果用户带回 ChatGPT 新建议,先按 `docs/GPT_PLAN_LOCALIZATION_PROTOCOL.md` 做本地化计划,不要直接改内容。 + +## 3. 已验证命令 + +最近一轮验证通过: + +```powershell +python scripts\rebuild_indexes.py --check +python -m unittest discover -s tests -p "test*.py" -v +python scripts\check_card_contract.py +python scripts\validate_model_library.py +python scripts\run_selector_demo.py +python scripts\run_selector_regression.py +python scripts\check_model_card_sync.py +``` + +结果: + +- Index check: PASS. +- Unit tests: PASS, 14 tests. +- Card contract: PASS. +- Model library validation: PASS. +- Selector demo: PASS. +- Selector regression: PASS. +- Model/card sync: PASS. +- `reports/index_rebuild_report.md`: `Status: PASS`. +- `reports/validation_report.md`: `Status: PASS`. + +## 4. 关键规则 + +### GPT 规划规则 + +GPT 规划不是本地可直接执行规则。 + +必须先转为: + +- local rules +- schemas +- workflow gates +- indexes +- validation tools +- owner review points + +再进入内容修改。 + +相关文件: + +- `docs/GPT_PLAN_LOCALIZATION_PROTOCOL.md` +- `docs/MODEL_EXTRACTION_RULES.md` + +### ChatGPT 交接规则 + +每次用户从 Codex 回 ChatGPT 时,生成: + +```text +reports/ChatGPT交接文档__.md +``` + +相关文件: + +- `docs/CHATGPT_HANDOFF_RULES.md` +- `reports/ChatGPT交接文档_模型库MVP_2026-06-16.md` + +### 长期知识资产规则 + +稳定复用知识进入 `knowledge_assets/`。 + +不要把具体模型卡复制进 `knowledge_assets/` 作为第二 source of truth。 + +具体模型卡 source of truth 仍在: + +- `cards/` +- `models/` + +相关文件: + +- `docs/KNOWLEDGE_ASSET_RULES.md` +- `knowledge_assets/` + +### 索引维护规则 + +`models/model_index.json` 是机器发现入口。 + +`cards/card_index.md` 是人读审查入口。 + +二者不再作为独立手工内容源长期维护,而是从模型 JSON、card 文件和 regression cases 生成或校验。 + +规则: + +```text +每次资产变更必须增量同步索引 ++ +关键节点必须全量重建或全量一致性校验 +``` + +相关文件: + +- `docs/INDEX_MAINTENANCE_PROTOCOL.md` +- `scripts/rebuild_indexes.py` +- `reports/index_rebuild_report.md` + +### 内容稳定化规则 + +工程 contract 通过不等于内容稳定。 + +本轮新增: + +- `docs/CONTENT_STABILIZATION_PROTOCOL.md` +- `sources/evidence_coverage.matrix.json` +- `reports/evidence_coverage_report_v0.2.md` +- `reports/content_review_report_v0.2.md` +- `reports/model_review_status.json` +- `reports/next_action_register_v0.2.md` + +当前结论: + +```text +QPI: draft / B / pending +Intellectual Archaeology: draft / B / pending +draft-callable: allowed +stable: not allowed +third_model_expansion: not allowed +``` + +## 5. 当前关键文件 + +模型资产: + +- `models/qpi.model.json` +- `models/intellectual_archaeology.model.json` +- `cards/qpi.md` +- `cards/intellectual_archaeology.md` +- `models/model_index.json` +- `cards/card_index.md` + +schema: + +- `schemas/model_card.schema.json` +- `schemas/source_article.schema.json` +- `schemas/source_excerpt.schema.json` +- `schemas/regression_case.schema.json` +- `schemas/model_index.schema.json` +- `schemas/card_index.schema.json` + +数据: + +- `sources/source_articles.json` +- `sources/source_excerpts.json` +- `tests/regression_cases.json` +- `tests/qpi.regression.json` +- `tests/intellectual_archaeology.regression.json` +- `selector/selector_rules.json` +- `selector/selector_examples.json` + +工具: + +- `scripts/validate_model_library.py` +- `scripts/check_card_contract.py` +- `scripts/rebuild_indexes.py` +- `scripts/run_selector_demo.py` +- `scripts/run_selector_regression.py` +- `scripts/check_model_card_sync.py` + +知识资产: + +- `knowledge_assets/00_用户背景与产品上下文.md` +- `knowledge_assets/01_核心模型地图.md` +- `knowledge_assets/02_模型卡结构规范.md` +- `knowledge_assets/03_核心模型抽取样板.md` +- `knowledge_assets/06_模型稳固性评级规则.md` +- `knowledge_assets/07_产品规划过程记录.md` + +## 6. 当前已知未决问题 + +这些问题应由用户 / ChatGPT / CCRA 做产品或质量判断,不应由 Codex 直接拍板: + +- QPI 当前字段和边界是否准确。 +- 思想考古学是否应保持七层结构,还是需要更强的停止条件表达。 +- 是否应引入第三个核心模型。 +- 从产品角度看,后续模型抽取是否需要拆成抽取、检验、评分三个环节。 +- 如果需要多环节审查,这三个环节的质量标准分别是什么。 +- 当前 QPI / 思想考古样板是否已经暴露出需要多角色审查的质量问题。 +- regression cases 已按模型拆分,但用例真实性和遗漏边界仍需人工审查。 +- selector 已保持规则化并升级到 v0.2;是否未来加入 LLM 判断层仍不是本轮决策。 +- 当前索引策略已工程化,不再需要 owner 判断;但模型状态升级仍需要 owner / ChatGPT / CCRA 明确决定。 +- QPI 混合案例是否需要更细的主导匮乏物仲裁规则。 +- 思想考古 `recommended_max_depth` 是否应与 QPI 输出更强绑定。 +- `draft-callable` 是否应进入 schema,还是继续留在 review report。 + +本地仓库归属判断不交给 ChatGPT: + +- agent spec / invocation / evaluation / governance -> `requirements/ccpe/` +- reusable deterministic tools / batch scripts / format transformers -> `requirements/skills-vault/` +- product-specific config, adapters, state, selector behavior -> 本仓库 + +## 7. 下轮可能任务 + +用户即将带回 ChatGPT 新一轮讨论结果。 + +下轮开始时: + +1. 先读取用户带回的内容。 +2. 判断它是产品判断、内容修复、规则修复、schema 修复、workflow 修复、工具需求,还是 supplier request。 +3. 若是 GPT 规划或建议,先做本地化计划。 +4. 若是明确内容修改,按现有 contract 修模型卡和 JSON。 +5. 修改后运行 `python scripts\rebuild_indexes.py --write`。 +6. 再运行 `python scripts\rebuild_indexes.py --check`、`python scripts\run_selector_regression.py`、`python scripts\check_model_card_sync.py` 和验证命令。 +7. 若用户要再回 ChatGPT,生成新的 ChatGPT 交接文档。 + +## 8. 工作区提醒 + +当前 `git status --short` 显示大量新增文件和修改文件;这些是本轮模型库 MVP 工程化打样产物。 + +不要把 untracked 文件误认为无关临时文件。 + +测试运行会生成: + +- `scripts/__pycache__/` +- `tests/__pycache__/` + +验证后应清理这些缓存目录。 + +## 9. 不要重复做的事 + +不要重新初始化目录。 + +不要重新创建 QPI / 思想考古基础模型资产。 + +不要把具体模型卡复制进 `knowledge_assets/`。 + +不要把 GPT 对 agent / tool 归属的意见直接当成本地仓库归属决策。 + +不要在没有 owner 明确要求时引入数据库、后端服务、前端应用、RAG、认证或平台化能力。 diff --git a/reports/GPT规划落地差异检查_v0.1.md b/reports/GPT规划落地差异检查_v0.1.md new file mode 100644 index 0000000..3c38c11 --- /dev/null +++ b/reports/GPT规划落地差异检查_v0.1.md @@ -0,0 +1,162 @@ +# GPT 规划落地差异检查 v0.1 + +## Source Plan + +`C:\Users\wangq\Documents\Codex\knowledge-vault\work\internal\强哥的思想宇宙\GPT成果\2026-06-16-核心模型抽取样板 v0.1.md` + +## Scope Of This Pass + +本轮只修复规则层。 + +已落地: + +- GPT 规划本地化协议。 +- 模型抽取规则。 +- GPT 规划与当前仓库差异检查。 +- 决策日志。 + +未在本轮执行: + +- schema 修复。 +- card contract 修复。 +- workflow 文档修复。 +- index 文件创建。 +- validator 或 selector 工具修复。 +- QPI / 思想考古内容修复。 + +## Adopted Into Local Rules + +已写入 `docs/GPT_PLAN_LOCALIZATION_PROTOCOL.md`: + +- GPT 规划是上游计划输入,不是本地可直接执行规则。 +- 每次 GPT 规划进入后,必须先做本地计划。 +- 本地计划必须识别规则、schema、workflow、tooling、index、owner gate。 +- 未完成本地化前,不允许直接进入内容抽取或内容修复。 +- 模型抽取必须保持双工模式: + - workflow/tooling track + - content extraction track + +已写入 `docs/MODEL_EXTRACTION_RULES.md`: + +- 字段名英文,中文来源的 JSON 值和 Markdown 内容保持中文。 +- 模型抽取不是文章摘要。 +- 每个模型必须有 source article 和 source evidence 引用。 +- placeholder evidence 必须明确标注,不能伪装成 verified evidence。 +- 完整模型资产链为 source article、source excerpt、Markdown card、JSON model card、regression cases、selector routing、model index、card index、validation report。 +- 每个核心模型至少五个 regression cases,覆盖 positive、boundary、misuse。 +- v0.1 selector 不调用 LLM,必须输出 model ID、score、reason、routing notes。 +- 机器模型索引使用 `models/model_index.json`。 +- 人读模型卡索引使用 `cards/card_index.md`。 +- 未来超过约 8-10 个核心模型后,再考虑 full rebuild index script。 +- 缺失可复用工具时走 `requirements/skills-vault/`。 +- 缺失 CCPE 规格、治理、调用协议或评估能力时走 `requirements/ccpe/`。 + +## Adopted Into Local Schema + +本轮尚未修改 schema。 + +GPT 规划中待落地到 schema 的关键点: + +- `schemas/model_card.schema.json` 应成为机器可读模型卡的权威 schema。 +- 当前 `schemas/model_spec.schema.json` 只覆盖最小字段,不覆盖 GPT 样例完整字段。 +- model JSON 需要补充推荐字段: + - `trigger_keywords` + - `negative_triggers` + - `related_models` + - `conflicting_models` + - `disciplinary_anchors` + - `example_inputs` + - `example_outputs` + - `output_contract` + - `depth_control` + - `stabilization_path` + - `version` + - `last_updated` +- `selection_priority` 应使用 1-10 范围,而不是当前 95 / 80 这类百分制风格。 +- `model_type` 应使用 GPT 规划中的枚举,例如 `routing_model`、`deep_modeling_model`。 +- `pipeline_position` 应使用 GPT 规划中的枚举,例如 `pre_analysis`、`deep_analysis`。 +- `stability_profile` 需要包含: + - `stability_level` + - `needs_stabilization` + - `main_risks` + - `reason` + - `next_stabilization_action` +- 每个 schema 属性需要中文 `description`,避免字段歧义。 + +## Adopted Into Local Workflow + +本轮只在规则文件中记录 workflow gate,尚未创建 `docs/MODEL_EXTRACTION_WORKFLOW.md`。 + +待落地 workflow: + +1. GPT plan intake。 +2. Local plan creation。 +3. Owner review of local plan。 +4. Rules/schema/index/workflow implementation。 +5. Validation of rules/schema/index/workflow。 +6. Owner review of the foundation。 +7. Content extraction or content repair。 +8. Validation and audit report。 +9. Owner content review。 + +## Adopted Into Tooling Plan + +本轮尚未修改工具。 + +GPT 规划中待落地的工具要求: + +- `scripts/validate_model_library.py` 需要升级为 schema、引用、index、card contract、regression coverage 的综合校验器。 +- 需要新增 `scripts/check_card_contract.py`,检查 Markdown card 必需章节。 +- 需要新增 `scripts/run_selector_demo.py`,按关键词、输入类型、负向触发、pipeline position、selection_priority 输出推荐模型、分数、理由和 routing notes。 +- 如果后续需要从 GPT 规划自动提取字段和验收标准,可新增 `scripts/extract_plan_requirements.py`,但 v0.1 暂不必做。 + +## Differences From Current Repository + +当前仓库与 GPT 规划的主要差异: + +1. `cards/qpi.md` 和 `cards/intellectual_archaeology.md` 目前不是按完整 card contract 写成,缺少 GPT 规划中的多个章节。 +2. 当前没有 `docs/MODEL_CARD_CONTRACT.md`。 +3. 当前没有 `schemas/model_card.schema.json`。 +4. 当前 `schemas/model_spec.schema.json` 缺少字段描述、枚举、推荐字段和稳定性理由字段。 +5. 当前 model JSON 的 `model_type`、`pipeline_position`、`selection_priority` 与 GPT 规划枚举和范围不一致。 +6. 当前没有 `models/model_index.json`。 +7. 当前没有 `cards/card_index.md`。 +8. 当前没有 index schema。 +9. 当前 selector 只有 data-only rules 和 examples,没有可执行 demo。 +10. 当前 regression cases 是合并文件,不是 GPT 规划中建议的按模型拆分文件;这不一定错误,但需要在后续 schema/workflow 中明确采用合并还是拆分。 +11. 当前 validation 只检查基础必填字段和引用完整性,没有完整 schema、card contract、index、selector demo 或 regression coverage 检查。 +12. 当前 handoff 把第一版内容称为“资产链路”,但按新的规则判断,它只能算草稿内容,不能算已通过 GPT 样板契约。 + +## Deferred Items + +以下内容留到后续任务执行: + +- 创建 `docs/MODEL_CARD_CONTRACT.md`。 +- 创建 `docs/MODEL_EXTRACTION_WORKFLOW.md`。 +- 创建 `schemas/model_card.schema.json`。 +- 为现有 schemas 添加中文 `description` 和枚举约束。 +- 创建 `schemas/model_index.schema.json` 和 `schemas/card_index.schema.json`。 +- 创建 `models/model_index.json` 和 `cards/card_index.md`。 +- 升级 validator。 +- 新增 card contract checker。 +- 新增 selector demo。 +- 重新修复 QPI 和思想考古模型内容。 + +## Owner Review Questions + +1. `tests/regression_cases.json` 是否继续使用合并文件,还是改为 GPT 规划建议的 `tests/qpi.regression.json` 与 `tests/intellectual_archaeology.regression.json`? +2. 当前两个已经生成的模型内容,后续是直接改写,还是先保留为 `draft_pre_contract` 状态并新建合规版本? +3. `model_spec.schema.json` 是否保留为旧名兼容,还是迁移到 `model_card.schema.json` 并废弃旧名? +4. selector demo 是否应在 schema/index 基础完成后立即实现,还是等模型内容修复后再实现? +5. index 是否在 v0.1 手动维护即可,是否暂缓 full rebuild script? + +## Current Recommendation + +下一步应执行计划 Task 2 和 Task 3: + +1. 建立 `docs/MODEL_CARD_CONTRACT.md`。 +2. 建立 `schemas/model_card.schema.json`。 +3. 给 source、excerpt、regression schema 补中文说明与枚举。 +4. 定义 model/card index schema。 + +在这些完成并经 owner 检查前,不继续修复 QPI 和思想考古内容。 diff --git a/reports/README.md b/reports/README.md index 31bf429..3c085b0 100644 --- a/reports/README.md +++ b/reports/README.md @@ -1,11 +1,18 @@ # Reports -This folder will contain generated or manually written project reports. +This folder contains generated or manually written project reports. -Expected future files: +Current reports: - `validation_report.md` -- `extraction_notes.md` -- Concrete Codex handoff reports +- `Codex_工程产物摘要_v0.1.md` +- `Codex_模型资产链路摘要_v0.1.md` +- `baseline_before_content_stabilization_v0.2.md` +- `evidence_coverage_report_v0.2.md` +- `selector_regression_report_v0.2.md` +- `model_card_sync_report_v0.2.md` +- `content_review_report_v0.2.md` +- `model_review_status.json` +- `next_action_register_v0.2.md` Reports should separate verified facts, assumptions, unresolved questions, and suggested next tasks. diff --git a/reports/baseline_before_content_stabilization_v0.2.md b/reports/baseline_before_content_stabilization_v0.2.md new file mode 100644 index 0000000..dde065f --- /dev/null +++ b/reports/baseline_before_content_stabilization_v0.2.md @@ -0,0 +1,67 @@ +# Baseline Before Content Stabilization v0.2 + +Date: 2026-06-16 + +## Scope + +This baseline was captured before the v0.2 content stabilization pass for: + +- `qpi` +- `intellectual_archaeology` + +No third model is in scope. + +## Baseline Commands + +```powershell +python -m unittest discover -s tests -p "test*.py" -v +python scripts\check_card_contract.py +python scripts\validate_model_library.py +python scripts\run_selector_demo.py +python scripts\rebuild_indexes.py --check +``` + +## Results + +- Unit tests: PASS, 14 tests. +- Card contract: PASS. +- Model library validation: PASS. +- Selector demo: PASS. +- Model/card index check: PASS. + +## Current Asset Counts + +- Models: 2 +- Source articles: 3 +- Source evidence excerpts: 10 +- Regression cases: 10 total, 5 per model +- Selector examples: 3 + +## Current Model State + +| Model ID | Status | Stability | Regression Status | +| --- | --- | --- | --- | +| `qpi` | draft | B | pending | +| `intellectual_archaeology` | draft | B | pending | + +## What PASS Means + +PASS means: + +- JSON files are parseable. +- Required contract fields exist. +- Source article and source excerpt references resolve. +- Regression cases reference known models. +- Model/card indexes are synchronized. +- Markdown cards contain required headings. + +## What PASS Does Not Mean + +PASS does not mean: + +- Model content is stable. +- Evidence is sufficient at field level. +- Raw excerpts are all exact quotes. +- Regression cases are strong enough for stable use. +- Selector behavior is protected against false positive recall. +- QPI or Intellectual Archaeology can be upgraded to stable. diff --git a/reports/changed_files_manifest.md b/reports/changed_files_manifest.md new file mode 100644 index 0000000..d3a3a85 --- /dev/null +++ b/reports/changed_files_manifest.md @@ -0,0 +1,39 @@ +# Changed Files Manifest + +| File | Change Type | Why Changed | Related Guidance | Need Human Review | +| --- | --- | --- | --- | --- | +| `docs/CONTENT_STABILIZATION_PROTOCOL.md` | added | Define content stabilization gates | v0.3 Task 1 | yes | +| `sources/evidence_coverage.matrix.json` | added | Field-level evidence coverage matrix | v0.3 Task 2 | yes | +| `reports/evidence_coverage_report_v0.2.md` | added | Human-readable evidence coverage summary | v0.3 Task 2 | yes | +| `sources/source_excerpts.json` | modified | Add quote_status/source_location and QPI pathology excerpts | v0.3 Task 3 | yes | +| `schemas/source_excerpt.schema.json` | modified | Formalize quote_status/source_location and excerpt_type enum | v0.3 Task 3 | yes | +| `schemas/source_article.schema.json` | modified | Formalize source_type/source_status enum | v0.3 Task 3 | yes | +| `models/qpi.model.json` | modified | Strengthen QPI output contract and source evidence count | v0.3 Task 4 | yes | +| `cards/qpi.md` | modified | Mirror QPI output contract and evidence references | v0.3 Task 4 | yes | +| `models/intellectual_archaeology.model.json` | modified | Strengthen IA stop gate and structured output contract | v0.3 Task 5 | yes | +| `cards/intellectual_archaeology.md` | modified | Mirror IA stop gate and output contract | v0.3 Task 5 | yes | +| `schemas/regression_case.schema.json` | modified | Add v0.2 evaluable fields and new case types | v0.3 Task 7 | yes | +| `tests/qpi.regression.json` | added | Per-model QPI regression source of truth, 17 cases | v0.3 Task 6 | yes | +| `tests/intellectual_archaeology.regression.json` | added | Per-model IA regression source of truth, 17 cases | v0.3 Task 6 | yes | +| `tests/regression_cases.json` | modified | Aggregate regression cases for validation | v0.3 Task 6 | yes | +| `tests/regression_index.json` | added | Audit index for split regression files | GPT audit package | yes | +| `selector/selector_rules.json` | modified | Selector v0.2 rule config | v0.3 Task 8 | yes | +| `selector/selector_examples.json` | modified | Add no-call and QPI-before-IA examples | v0.3 Task 8 | yes | +| `scripts/run_selector_demo.py` | modified | Emit selected/rejected models, reasons, penalties, no_call | v0.3 Task 8 | no | +| `scripts/run_selector_regression.py` | added | Validate no-call/selector gate/pipeline cases | v0.3 Task 8 | no | +| `scripts/check_model_card_sync.py` | added | Check hard-field JSON/Markdown sync | v0.3 Task 9 | no | +| `scripts/validate_model_library.py` | modified | Validate quote status, enums, 15-case coverage, v0.2 fields | v0.3 Tasks 3/7 | no | +| `models/model_index.json` | regenerated | Sync evidence and regression counts | v0.2 index strategy | yes | +| `cards/card_index.md` | regenerated | Human-readable projection of model index | v0.2 index strategy | yes | +| `reports/content_review_report_v0.2.md` | added | Content stabilization review summary | v0.3 Task 10 | yes | +| `reports/model_review_status.json` | added | Structured review status | v0.3 Task 10 | yes | +| `reports/next_action_register_v0.2.md` | added | Next review/action items | v0.3 Task 10 | yes | +| `reports/selector_regression_report_v0.2.md` | added/generated | Selector regression PASS report | v0.3 Task 8 | yes | +| `reports/model_card_sync_report_v0.2.md` | added/generated | JSON/Markdown sync PASS report | v0.3 Task 9 | yes | +| `reports/validation_report.md` | generated | Validator result | Validation | no | +| `reports/index_rebuild_report.md` | generated | Index check result | v0.2 index strategy | no | +| `reports/ChatGPT交接文档_模型库MVP_第二轮内容稳定化_2026-06-16.md` | added | Audit handoff package | GPT audit request | yes | +| `reports/command_log.md` | added | Command results for audit | GPT audit request | no | +| `reports/open_questions_for_CCRA.md` | added | Concrete review questions | GPT audit request | yes | +| `reports/schema_change_notes.md` | added | Schema diff explanation | GPT audit request | yes | +| `repo_tree.txt` | added | 2-level repo structure for audit | GPT audit request | no | diff --git a/reports/command_log.md b/reports/command_log.md new file mode 100644 index 0000000..23320cb --- /dev/null +++ b/reports/command_log.md @@ -0,0 +1,88 @@ +# Command Log + +Date: 2026-06-16 + +```powershell +python scripts\rebuild_indexes.py --check +``` + +Result: PASS + +```text +index check passed +``` + +```powershell +python scripts\check_card_contract.py +``` + +Result: PASS + +```text +card contract check passed +``` + +```powershell +python scripts\validate_model_library.py +``` + +Result: PASS + +```text +validation passed +``` + +```powershell +python scripts\run_selector_demo.py +``` + +Result: PASS + +Notes: + +- Emits selector v0.2 selected/rejected model output. +- Demo selects `qpi` and rejects `intellectual_archaeology` for the sample long-termism/KPI input. + +```powershell +python scripts\run_selector_regression.py +``` + +Result: PASS + +```text +selector regression passed +``` + +```powershell +python scripts\check_model_card_sync.py +``` + +Result: PASS + +```text +model/card sync passed +``` + +```powershell +python -m unittest discover -s tests -p "test*.py" -v +``` + +Result: PASS + +```text +Ran 14 tests +OK +``` + +```powershell +python -m json.tool reports\model_review_status.json +python -m json.tool sources\evidence_coverage.matrix.json +python -m json.tool tests\regression_cases.json +python -m json.tool models\model_index.json +``` + +Result: PASS + +Notes: + +- Key audit JSON files are parseable. diff --git a/reports/content_review_report.md b/reports/content_review_report.md new file mode 100644 index 0000000..9bba959 --- /dev/null +++ b/reports/content_review_report.md @@ -0,0 +1,15 @@ +# Content Review Report + +This file is an audit-friendly alias for: + +- `reports/content_review_report_v0.2.md` + +Current conclusions: + +- QPI: `draft / B / pending` +- Intellectual Archaeology: `draft / B / pending` +- draft-callable: allowed as report conclusion only +- stable: not allowed +- third model expansion: not allowed + +See `reports/content_review_report_v0.2.md` for the full report. diff --git a/reports/content_review_report_v0.2.md b/reports/content_review_report_v0.2.md new file mode 100644 index 0000000..1f05ac9 --- /dev/null +++ b/reports/content_review_report_v0.2.md @@ -0,0 +1,177 @@ +# Content Review Report v0.2 + +Date: 2026-06-16 + +## 1. 本轮修改摘要 + +本轮没有扩展第三模型,没有接完整问题回答系统,没有引入 LLM selector,也没有升级 stable。 + +完成内容稳定化补强: + +- 新增 `docs/CONTENT_STABILIZATION_PROTOCOL.md`。 +- 新增字段级 evidence coverage matrix。 +- 修复 source excerpt 的 quote 精确性标记。 +- 强化 QPI 结构化输出契约。 +- 强化思想考古停止门。 +- regression cases 扩展到每模型 17 条。 +- selector 升级到 v0.2 规则防误召回。 +- 新增 JSON / Markdown 同步检查。 +- 新增 review status 和 next action register。 + +## 2. QPI 内容审查结果 + +当前状态: + +- `status`: draft +- `stability_level`: B +- `regression_status`: pending + +QPI 已强化输出契约,包含: + +- `problem_owner` +- `problem_source` +- `time_scale` +- `scarcity_profile` +- `dominant_scarcity` +- `classification` +- `classification_confidence` +- `evidence_gap` +- `misclassification_risk` +- `recommended_next_step` +- `next_model_candidates` + +审查结论: + +- 可进入 draft-callable 审查。 +- 不允许升级 stable。 +- mixed 案例和主导匮乏物判断仍需 Owner / CCRA 复核。 + +## 3. 思想考古内容审查结果 + +当前状态: + +- `status`: draft +- `stability_level`: B +- `regression_status`: pending + +思想考古已强化停止门,包含: + +- `should_call` +- `entry_reason` +- `recommended_max_depth` +- `layers_to_analyze` +- `stop_reason` +- `no_deeper_reason` +- `assumptions_by_layer` +- `validation_needed` +- `action_implication` + +审查结论: + +- 可进入 draft-callable 审查。 +- 不允许升级 stable。 +- 哲学基岩层调用边界仍需 Owner / CCRA 复核。 + +## 4. Evidence Coverage 结论 + +字段级矩阵位于 `sources/evidence_coverage.matrix.json`。 + +报告位于 `reports/evidence_coverage_report_v0.2.md`。 + +结论: + +- required 字段均已标注 support type 和 coverage status。 +- QPI 的 Q/P/I、核心匮乏物、暴力降维、恶意升维均有 source evidence 支撑。 +- 思想考古的定义、七层机制、动态韧性、最小充分下潜和验证要求均有 source evidence 支撑。 +- status、stability、confidence、selection priority 仍是 owner / product review 判断,不是 source-direct 事实。 + +## 5. Regression Coverage 结论 + +Regression source of truth: + +- `tests/qpi.regression.json` +- `tests/intellectual_archaeology.regression.json` + +Aggregate file: + +- `tests/regression_cases.json` + +Coverage: + +| Model ID | Total | positive | boundary | misuse | no_call | selector_gate | pipeline | +| --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | +| `qpi` | 17 | 9 | 3 | 2 | 1 | 1 | 1 | +| `intellectual_archaeology` | 17 | 5 | 3 | 3 | 3 | 2 | 1 | + +结论: + +- 每模型均超过 15 条。 +- 已覆盖误用、防误召回、no-call 和 pipeline gate。 +- 仍需人工审查用例真实性和遗漏边界。 + +## 6. Selector Regression 结论 + +Selector v0.2 仍为规则 selector。 + +新增能力: + +- negative trigger 先行 +- no-call threshold +- QPI-before-IA gate +- score breakdown +- rejected model reasons + +报告位于: + +- `reports/selector_regression_report_v0.2.md` + +结论: + +- selector regression 当前 PASS。 +- 明确事实查询、纯改写、轻量翻译不会召回思想考古。 +- 问题定义未完成时,思想考古受 QPI-before-IA gate 抑制。 + +## 7. JSON / Markdown 同步结论 + +检查脚本: + +- `scripts/check_model_card_sync.py` + +报告: + +- `reports/model_card_sync_report_v0.2.md` + +结论: + +- 硬字段同步 PASS。 +- 关键 output contract 和 depth control 术语已在 Markdown card 中出现。 +- 中文长文本语义一致性仍需人工审查。 + +## 8. 仍未解决的问题 + +- QPI 的混合案例是否需要更细的主导匮乏物仲裁规则。 +- 思想考古是否应把 `recommended_max_depth` 的默认值与 QPI 输出强绑定。 +- `draft-callable` 是否应进入模型 JSON schema,还是继续留在 review report。 +- selector v0.2 阈值是否需要基于真实输入校准。 + +## 9. 是否允许进入 draft-callable + +允许。 + +这里的 draft-callable 是 review report 结论,不改变模型 JSON 的 `status: draft`。 + +## 10. 是否允许升级 stable + +不允许。 + +当前两个模型仍保持: + +- `status: draft` +- `stability_level: B` +- `regression_status: pending` + +## 11. 是否允许扩展第三模型 + +不允许。 + +建议先完成 Owner / CCRA 对本轮 evidence、regression、selector 和 content review 的审查。 diff --git a/reports/evidence_coverage_matrix.md b/reports/evidence_coverage_matrix.md new file mode 100644 index 0000000..9e9113e --- /dev/null +++ b/reports/evidence_coverage_matrix.md @@ -0,0 +1,17 @@ +# Evidence Coverage Matrix + +Machine-readable matrix: + +- `sources/evidence_coverage.matrix.json` + +Human-readable report: + +- `reports/evidence_coverage_report_v0.2.md` + +Current conclusion: + +- Required fields are classified by support type and coverage status. +- QPI source-direct fields include Q/P/I taxonomy and core scarcity. +- QPI misuse coverage includes violent reduction and malicious inflation excerpts. +- Intellectual Archaeology source-direct fields include definition and seven-layer mechanism. +- Status, stability, confidence, and selection priority remain review decisions. diff --git a/reports/evidence_coverage_report_v0.2.md b/reports/evidence_coverage_report_v0.2.md new file mode 100644 index 0000000..91c3e46 --- /dev/null +++ b/reports/evidence_coverage_report_v0.2.md @@ -0,0 +1,98 @@ +# Evidence Coverage Report v0.2 + +Date: 2026-06-16 + +## Scope + +Models reviewed: + +- `qpi` +- `intellectual_archaeology` + +The field-level machine matrix is stored in `sources/evidence_coverage.matrix.json`. + +## Coverage Method + +Each required model field is classified by: + +- `support_type` +- `coverage_status` +- supporting `excerpt_ids` + +Support type values: + +- `direct_source` +- `derived_from_source` +- `product_decision` +- `red_team_inference` +- `owner_decision` + +Coverage status values: + +- `supported` +- `partially_supported` +- `derived` +- `unsupported` +- `needs_owner_review` + +## QPI Summary + +Directly supported fields include: + +- `model_name` +- `one_sentence_definition` +- `core_mechanism` + +Derived or productized fields include: + +- `model_type` +- `pipeline_position` +- `input_types` +- `output_types` +- `trigger_keywords` +- `negative_triggers` +- `output_contract` + +Owner / CCRA review fields include: + +- `status` +- `selection_priority` +- `confidence_level` +- `stability_profile` +- `regression_status` + +No required field is currently marked `unsupported`. + +## Intellectual Archaeology Summary + +Directly supported fields include: + +- `model_name` +- `one_sentence_definition` +- `core_mechanism` + +Derived or productized fields include: + +- `model_type` +- `pipeline_position` +- `input_types` +- `output_types` +- `trigger_keywords` +- `negative_triggers` +- `output_contract` + +Owner / CCRA review fields include: + +- `status` +- `selection_priority` +- `confidence_level` +- `stability_profile` +- `regression_status` + +No required field is currently marked `unsupported`. + +## Review Conclusion + +Evidence coverage is now explicit enough for content review. + +This does not mean all fields are source-direct. It means source-backed, derived, productized, red-team, and owner-decision fields are separated for review. diff --git a/reports/index_check_report.md b/reports/index_check_report.md new file mode 100644 index 0000000..9309360 --- /dev/null +++ b/reports/index_check_report.md @@ -0,0 +1,22 @@ +# Index Check Report + +Date: 2026-06-16 + +Status: `PASS` + +Command: + +```powershell +python scripts\rebuild_indexes.py --check +``` + +Canonical generated report: + +- `reports/index_rebuild_report.md` + +Result: + +- `models/model_index.json` matches the generated registry. +- `cards/card_index.md` matches the generated human-readable projection. +- QPI index counts: source evidence 7, regression cases 17. +- Intellectual Archaeology index counts: source evidence 5, regression cases 17. diff --git a/reports/index_rebuild_report.md b/reports/index_rebuild_report.md new file mode 100644 index 0000000..4a0061a --- /dev/null +++ b/reports/index_rebuild_report.md @@ -0,0 +1,9 @@ +# Index Rebuild Report + +Mode: `check` +Status: `PASS` + +## Result + +- models/model_index.json matches generated model registry. +- cards/card_index.md matches generated card index. diff --git a/reports/model_card_sync_report_v0.2.md b/reports/model_card_sync_report_v0.2.md new file mode 100644 index 0000000..7f03659 --- /dev/null +++ b/reports/model_card_sync_report_v0.2.md @@ -0,0 +1,13 @@ +# Model Card Sync Report v0.2 + +Status: `PASS` + +## Hard-Field Result + +- Model IDs, names, types, pipeline positions, source IDs, evidence IDs, stability fields, regression status, version, and last_updated are present in Markdown cards. +- Key output contract and depth-control terms are present. + +## Manual Review Items + +- intellectual_archaeology: long Chinese definitions, examples, and risk notes require human semantic review. +- qpi: long Chinese definitions, examples, and risk notes require human semantic review. diff --git a/reports/model_case_preprocessing/qpi/round-01/README.md b/reports/model_case_preprocessing/qpi/round-01/README.md new file mode 100644 index 0000000..177828d --- /dev/null +++ b/reports/model_case_preprocessing/qpi/round-01/README.md @@ -0,0 +1,13 @@ +# QPI Case Preprocessing Round 01 + +status: draft_owner_review_needed + +This round preprocesses owner-provided raw QPI materials into Markdown case drafts. + +Raw source files currently assigned: + +- `C:\Users\wangq\Documents\Codex\knowledge-vault\work\internal\强哥的思想宇宙\QPI案例分析\流程改造.md` +- `C:\Users\wangq\Documents\Codex\knowledge-vault\work\internal\强哥的思想宇宙\QPI案例分析\失望性情感隔离心理分析.md` + +Output files should remain Markdown drafts until owner review. + diff --git a/reports/model_case_preprocessing/qpi/round-01/disappointment-emotional-isolation.cases.md b/reports/model_case_preprocessing/qpi/round-01/disappointment-emotional-isolation.cases.md new file mode 100644 index 0000000..9e30023 --- /dev/null +++ b/reports/model_case_preprocessing/qpi/round-01/disappointment-emotional-isolation.cases.md @@ -0,0 +1,569 @@ +# QPI Case Drafts: Disappointment Emotional Isolation + +status: draft_owner_review_needed + +source_path: `C:\Users\wangq\Documents\Codex\knowledge-vault\work\internal\强哥的思想宇宙\QPI案例分析\失望性情感隔离心理分析.md` + +source_note: Owner-provided raw material. These drafts paraphrase and restructure the source into QPI review cases. They are not clinical assessments and should not be promoted to JSON until owner review. + +## Case qpi-draft-001: Same Surface Term, Different Mechanisms + +status: draft_owner_review_needed + +source_path: `C:\Users\wangq\Documents\Codex\knowledge-vault\work\internal\强哥的思想宇宙\QPI案例分析\失望性情感隔离心理分析.md` + +### 1. Surface Problem + +The surface phrase "disappointment emotional isolation" appears to name one phenomenon, but the source separates at least two frames: passive emotional numbness and active cognitive withdrawal. + +### 2. Subject Position + +The subject may be a person reflecting on their own relational withdrawal, a reader seeking conceptual clarity, or an analyst trying to distinguish mechanisms. The experience level is unknown unless the case specifies whether the subject is seeking vocabulary, self-regulation, or model building. + +### 3. Scenario Context + +The context is psychological-relational interpretation: repeated disappointment in important relationships may lead either to reduced felt response or to deliberate boundary-setting. The same surface description can therefore point to different underlying frames. + +### 4. Expectation-Reality Gap + +- Expected: A single label should clarify the state. +- Reality: The label compresses distinct mechanisms with different intervention implications. +- Gap summary: Naming the phenomenon is insufficient because the frame depends on whether the subject cannot feel, can feel but withdraws, or is using the label to organize a relationship boundary. + +### 5. Attempted Paths + +The source attempts to split the phrase into mechanism types before applying QPI. It also warns against treating the phrase as a standalone diagnosis or moral judgment. + +### 6. Dynamic Shift + +The frame can shift from Q to P/I. At first it looks like a Q: "What does this phrase mean?" Once the subject asks how the state is maintained, generalized, or governed in relationships, it becomes P/I mixed or Issue. + +### 7. Scarcity Profile + +- data_scarcity: medium +- path_or_resource_scarcity: medium +- consensus_or_order_scarcity: medium + +### 8. Mixed Or Multi-Perspective + +`inter_viewpoint_divergence` + +The same phrase can be classified differently depending on whether the subject is asking for conceptual definition, self-management steps, or long-term relational governance. + +### 9. Governance Load + +The governance load is medium to high when the label affects boundaries, help-seeking, self-interpretation, and relationship decisions. It is low only when the task is limited to vocabulary clarification. + +### 10. Misframing Risks + +- premature_classification +- single-cause_reduction +- over_pathologizing +- violent_reduction + +### 11. Candidate QPI Judgment + +- classification_scope: multi_perspective +- is_provisional: true +- classification: mixed +- dominant_scarcity: mixed +- classification_confidence: medium +- recommended_next_step: Clarify whether the subject needs definition, self-regulation, relational boundary design, or long-term governance before assigning a Q/P/I route. + +### 12. Owner Review Questions + +- Should this be treated primarily as a QPI multi-perspective sample rather than an intra-frame mixed sample? +- Should the QPI output require a mechanism distinction before any route recommendation? +- Is "passive numbness vs active withdrawal" a required preprocessing distinction for future psychological-relational cases? + +## Case qpi-draft-002: I Domain Misread As a Label Question + +status: draft_owner_review_needed + +source_path: `C:\Users\wangq\Documents\Codex\knowledge-vault\work\internal\强哥的思想宇宙\QPI案例分析\失望性情感隔离心理分析.md` + +### 1. Surface Problem + +A subject may ask whether their relational withdrawal has a named psychological label. + +### 2. Subject Position + +The subject is likely a self-reflective owner trying to understand a recurring relational pattern. The responsibility scope is not only learning a concept, but deciding how the concept should affect self-understanding, boundaries, and future action. + +### 3. Scenario Context + +The source treats the phenomenon as a psychological-relational system involving expectation, response history, self-explanation, defense, relationship patterns, and current life context. + +### 4. Expectation-Reality Gap + +- Expected: A correct label will settle the question. +- Reality: A label can explain one layer while hiding the system dynamics that keep the pattern stable. +- Gap summary: The subject may be seeking identity certainty through a Q-shaped question, while the actual work requires long-term framing and calibration. + +### 5. Attempted Paths + +The source names several explanatory models but rejects using any one of them as a final single-cause answer. + +### 6. Dynamic Shift + +The case starts as Q: "What is this?" It shifts to I when the label becomes part of the subject's identity, relational decisions, and self-governance system. + +### 7. Scarcity Profile + +- data_scarcity: medium +- path_or_resource_scarcity: medium +- consensus_or_order_scarcity: high + +### 8. Mixed Or Multi-Perspective + +`intra_frame_mixed` + +Within the same subject frame, there is both knowledge scarcity and governance scarcity. The label may help, but routing only to Q risks missing the recurring system. + +### 9. Governance Load + +High. The subject must manage the cost and benefit of the explanatory label, prevent identity freezing, and decide what kinds of external support or self-regulation are appropriate. + +### 10. Misframing Risks + +- violent_reduction +- premature_classification +- single-cause_reduction +- over_pathologizing + +### 11. Candidate QPI Judgment + +- classification_scope: subject_contextual +- is_provisional: true +- classification: mixed +- dominant_scarcity: consensus_order +- classification_confidence: medium +- recommended_next_step: Treat the label as a provisional map, then ask what pattern is recurring, what it protects, what it costs, and what context is needed before choosing an intervention route. + +### 12. Owner Review Questions + +- Should the dominant route be Issue rather than mixed once the subject is using the label to organize identity and relationships? +- What minimum context would distinguish a pure Q concept lookup from an I-domain self-framing case? +- Should this become a selector false-positive trap for "what is X" questions that are actually identity/governance cases? + +## Case qpi-draft-003: Single-Cause Attribution Compresses a System + +status: draft_owner_review_needed + +source_path: `C:\Users\wangq\Documents\Codex\knowledge-vault\work\internal\强哥的思想宇宙\QPI案例分析\失望性情感隔离心理分析.md` + +### 1. Surface Problem + +The subject asks whether one source, such as childhood experience, family relationship, attachment style, or social pressure, explains the current isolation pattern. + +### 2. Subject Position + +The subject is a person or analyst trying to locate causality. The responsibility scope may range from understanding a pattern to choosing an intervention or assigning blame. + +### 3. Scenario Context + +The source argues that psychological-relational patterns are coupled systems. Multiple models may each explain part of the pattern, but no single factor should be treated as the complete cause. + +### 4. Expectation-Reality Gap + +- Expected: Finding the main cause will make the problem tractable. +- Reality: The pattern may be maintained by interacting histories, interpretations, learned predictions, boundaries, pressures, and current relationship conditions. +- Gap summary: A single-cause explanation can make an Issue look like a solvable Problem or a finished Question. + +### 5. Attempted Paths + +The source reviews several attribution paths and criticizes single-point, moral, and intervention-as-cause explanations. + +### 6. Dynamic Shift + +The frame shifts from Q/P to I. It may begin as "What caused this?" or "How do I fix this?", but the source reframes the task as maintaining and recalibrating a dynamic system. + +### 7. Scarcity Profile + +- data_scarcity: medium +- path_or_resource_scarcity: medium +- consensus_or_order_scarcity: high + +### 8. Mixed Or Multi-Perspective + +`intra_frame_mixed` + +Within one subject frame, the same case contains evidence gaps, intervention uncertainty, and governance load. It is not merely multiple observers disagreeing. + +### 9. Governance Load + +High. The subject must avoid blame compression, preserve explanatory plurality, and decide which factor is actionable at the current stage without claiming it is the only cause. + +### 10. Misframing Risks + +- violent_reduction +- single-cause_reduction +- over_pathologizing +- premature_classification + +### 11. Candidate QPI Judgment + +- classification_scope: subject_contextual +- is_provisional: true +- classification: issue +- dominant_scarcity: consensus_order +- classification_confidence: medium +- recommended_next_step: Require a multi-factor maintenance map and separate cause, trigger, maintaining condition, and current action lever before recommending a route. + +### 12. Owner Review Questions + +- Should QPI explicitly mark "single-cause reduction" as a subtype of violent reduction? +- Should this case be used to test that QPI does not output a single definitive cause when the source provides coupled mechanisms? +- What owner-approved language should be used to distinguish explanatory usefulness from causal finality? + +## Case qpi-draft-004: Intervention Framed as a One-Time Solution + +status: draft_owner_review_needed + +source_path: `C:\Users\wangq\Documents\Codex\knowledge-vault\work\internal\强哥的思想宇宙\QPI案例分析\失望性情感隔离心理分析.md` + +### 1. Surface Problem + +The subject asks how to reduce or fix emotional isolation. + +### 2. Subject Position + +The subject is likely the person experiencing the pattern or someone advising them. The responsibility scope includes selecting actions without pretending the issue can be permanently solved in one step. + +### 3. Scenario Context + +The source reframes intervention from finding a cure to managing isolation intensity, object, benefit, cost, and generalization over time. + +### 4. Expectation-Reality Gap + +- Expected: There should be a method or treatment plan that removes the isolation. +- Reality: The phenomenon may require ongoing calibration of expectations, boundaries, investment, and relational experiments. +- Gap summary: The problem is not "which solution works once" but "how to govern a protective pattern that can become overgeneralized." + +### 5. Attempted Paths + +The source considers external intervention, self-adjustment, and relational experience, while arguing that the goal is not a single answer but a self-governance system. + +### 6. Dynamic Shift + +The frame shifts from P to I. It begins as a path problem but becomes an Issue because the relevant actions change with relationship context, risk, feedback, and stage. + +### 7. Scarcity Profile + +- data_scarcity: low +- path_or_resource_scarcity: medium +- consensus_or_order_scarcity: high + +### 8. Mixed Or Multi-Perspective + +`intra_frame_mixed` + +The subject needs both action paths and governance rules. A pure P route would overpromise a one-time fix. + +### 9. Governance Load + +High. The subject must continuously calibrate when isolation is protective, when it is costly, and when external support is useful. + +### 10. Misframing Risks + +- violent_reduction +- tool_solutionism +- malicious_inflation +- premature_classification + +### 11. Candidate QPI Judgment + +- classification_scope: subject_contextual +- is_provisional: true +- classification: mixed +- dominant_scarcity: consensus_order +- classification_confidence: medium +- recommended_next_step: Route as P/I mixed: identify one immediate boundary or experiment, while also defining ongoing governance variables and review conditions. + +### 12. Owner Review Questions + +- Should "cannot be solved once, can be governed over time" be a standard Issue signal? +- Should this case become a regression sample for preventing QPI from over-routing psychological-relational questions to Problem? +- What minimum actionability is required before recommending a P step inside an I-domain case? + +## Case qpi-draft-005: External Help as Method Teaching vs Calibration Environment + +status: draft_owner_review_needed + +source_path: `C:\Users\wangq\Documents\Codex\knowledge-vault\work\internal\强哥的思想宇宙\QPI案例分析\失望性情感隔离心理分析.md` + +### 1. Surface Problem + +The subject questions whether external psychological support is useful or merely treats symptoms. + +### 2. Subject Position + +The subject is evaluating the role of external intervention while preserving personal agency. The subject may distrust external authority, commercialized help, or over-generalized therapeutic scripts. + +### 3. Scenario Context + +The source distinguishes low-quality outside intervention from high-quality support that helps the subject build self-governance, feedback, boundary, and relational calibration capacities. + +### 4. Expectation-Reality Gap + +- Expected: Either the subject must self-design the intervention model, or external help must solve it. +- Reality: A better frame distributes roles: the subject retains final agency, while external support can provide feedback, mirror, method, and safe relational correction. +- Gap summary: The question is not whether outside help solves the Issue, but what role it plays in the governance system. + +### 5. Attempted Paths + +The source first considers the claim that external intervention may be limited, then refines it by separating poor intervention from support that enables self-governance. + +### 6. Dynamic Shift + +The frame shifts from binary Q/P to Issue. The relevant judgment depends on role boundaries, quality conditions, and how the intervention changes the subject's self-regulation system. + +### 7. Scarcity Profile + +- data_scarcity: medium +- path_or_resource_scarcity: medium +- consensus_or_order_scarcity: high + +### 8. Mixed Or Multi-Perspective + +`intra_frame_mixed` + +The same subject needs to decide both what to do and how to govern agency, trust, expertise, and external calibration boundaries. + +### 9. Governance Load + +High. The case requires role boundary management, risk control, authority calibration, and ongoing assessment of whether external help increases or weakens self-governance. + +### 10. Misframing Risks + +- violent_reduction +- malicious_inflation +- single-cause_reduction +- over_pathologizing + +### 11. Candidate QPI Judgment + +- classification_scope: subject_contextual +- is_provisional: true +- classification: issue +- dominant_scarcity: consensus_order +- classification_confidence: medium +- recommended_next_step: Reframe from "external help works or does not work" to "what external role, under what boundaries, helps the subject build a stronger self-governance system." + +### 12. Owner Review Questions + +- Is this an Issue sample because it is primarily about role/order calibration rather than method selection? +- Should QPI include "external authority boundary" as a governance-load signal? +- Should selector calibration treat "does therapy work" style inputs as low-confidence until context is known? + +## Case qpi-draft-006: Time Scale Changes the QPI Classification + +status: draft_owner_review_needed + +source_path: `C:\Users\wangq\Documents\Codex\knowledge-vault\work\internal\强哥的思想宇宙\QPI案例分析\失望性情感隔离心理分析.md` + +### 1. Surface Problem + +The same relational phenomenon appears to have different QPI classifications depending on time scale and system boundary. + +### 2. Subject Position + +The subject is a model builder or self-reflective owner evaluating how one phenomenon changes across moments, situations, and life-history scale. + +### 3. Scenario Context + +The source explicitly frames Q/P/I as dynamic viewpoints rather than static properties. A question about one moment may differ from a question about a concrete decision or a life-system pattern. + +### 4. Expectation-Reality Gap + +- Expected: The phenomenon should have one stable classification. +- Reality: It may be Q at the concept level, P at the action-decision level, and I at the long-term life-pattern level. +- Gap summary: Classification depends on observer position, time scale, goal scale, and system boundary. + +### 5. Attempted Paths + +The source proposes treating problem granularity as a modeling result rather than a fixed property of the issue. + +### 6. Dynamic Shift + +This is the core case: Q -> P -> I across time and scope. The dynamic shift is not a failure of classification; it is the phenomenon QPI must represent. + +### 7. Scarcity Profile + +- data_scarcity: medium +- path_or_resource_scarcity: medium +- consensus_or_order_scarcity: high + +### 8. Mixed Or Multi-Perspective + +`inter_viewpoint_divergence` + +The divergence comes from different time scales and responsibility scopes. It should not be collapsed into intra-frame mixed unless the same subject is operating at multiple scales simultaneously. + +### 9. Governance Load + +High when the subject must choose the right scale before acting. Mis-scaling can cause over-analysis, under-analysis, or wrong intervention choice. + +### 10. Misframing Risks + +- premature_classification +- malicious_inflation +- violent_reduction +- tool_solutionism + +### 11. Candidate QPI Judgment + +- classification_scope: multi_perspective +- is_provisional: true +- classification: mixed +- dominant_scarcity: mixed +- classification_confidence: medium +- recommended_next_step: Ask for the subject's active time scale and decision boundary before deciding whether to answer, solve, or govern. + +### 12. Owner Review Questions + +- Should QPI output include a required `time_scale` or `classification_scope` field for this exact reason? +- Should "same phenomenon, different time scale" be treated as inter-viewpoint divergence or a separate dynamic-scope category? +- Should selector calibration include short inputs that are no-call or Q at one scale but QPI/Issue at another? + +## Case qpi-draft-007: QPI Mismatch Table for Psychological-Relational Material + +status: draft_owner_review_needed + +source_path: `C:\Users\wangq\Documents\Codex\knowledge-vault\work\internal\强哥的思想宇宙\QPI案例分析\失望性情感隔离心理分析.md` + +### 1. Surface Problem + +The source identifies recurring mistakes where a psychological-relational Issue is treated as a label question, single-step solution, moral judgment, or over-expanded life theory. + +### 2. Subject Position + +The subject is a QPI model builder or reviewer designing guardrails for future classification. The responsibility scope is product/model stability rather than direct advice. + +### 3. Scenario Context + +The context is QPI model hardening. Psychological-relational inputs often contain ambiguous language that can trigger over-simplification or over-complication. + +### 4. Expectation-Reality Gap + +- Expected: A table of Q/P/I categories can classify the input. +- Reality: The more important task is detecting frame mismatch before routing. +- Gap summary: QPI needs misframing diagnostics, not only final labels. + +### 5. Attempted Paths + +The source lists mismatch patterns such as treating an Issue as a label lookup, treating an Issue as a one-step plan, or turning a simple concept question into a life problem. + +### 6. Dynamic Shift + +The frame shifts from model content to model validation. The case is about how QPI itself should resist failure modes. + +### 7. Scarcity Profile + +- data_scarcity: low +- path_or_resource_scarcity: medium +- consensus_or_order_scarcity: high + +### 8. Mixed Or Multi-Perspective + +`not_mixed` + +This is primarily a guardrail case for QPI itself, not a user-world case with multiple simultaneous scarcities. + +### 9. Governance Load + +High for the model library. The rule must prevent future selector and regression samples from rewarding shallow category assignment. + +### 10. Misframing Risks + +- violent_reduction +- malicious_inflation +- tool_solutionism +- premature_classification +- single-cause_reduction +- over_pathologizing + +### 11. Candidate QPI Judgment + +- classification_scope: subject_contextual +- is_provisional: false +- classification: issue +- dominant_scarcity: consensus_order +- classification_confidence: medium +- recommended_next_step: Add QPI mismatch diagnostics to case preprocessing so each draft records both candidate classification and likely wrong classifications. + +### 12. Owner Review Questions + +- Should QPI case digest include an explicit `wrong_route_to_avoid` field? +- Should mismatch detection become part of QPI regression rather than selector calibration only? +- Which mismatch labels should be canonical in v0.3? + +## Case qpi-draft-008: Isolation as Protective Boundary or Overgeneralized Defense + +status: draft_owner_review_needed + +source_path: `C:\Users\wangq\Documents\Codex\knowledge-vault\work\internal\强哥的思想宇宙\QPI案例分析\失望性情感隔离心理分析.md` + +### 1. Surface Problem + +The subject asks whether emotional withdrawal is unhealthy avoidance or a valid boundary. + +### 2. Subject Position + +The subject is a person evaluating their own relational strategy. The subject has final authority over boundaries, but may not have enough feedback to tell whether the strategy remains adaptive. + +### 3. Scenario Context + +The source frames isolation as potentially protective in high-risk relationships, but costly when generalized to safe or potentially supportive relationships. + +### 4. Expectation-Reality Gap + +- Expected: The strategy should be judged as either good boundary or bad avoidance. +- Reality: The judgment depends on target, intensity, duration, benefit, cost, and current environment. +- Gap summary: A binary moral or clinical judgment misses the governance variables that determine whether isolation is still serving the subject. + +### 5. Attempted Paths + +The source proposes evaluating object, strength, benefit, and cost rather than treating isolation as uniformly good or bad. + +### 6. Dynamic Shift + +The frame shifts from Q to I. It may start as "Is this normal?" but becomes an ongoing calibration problem across relationships and stages. + +### 7. Scarcity Profile + +- data_scarcity: medium +- path_or_resource_scarcity: medium +- consensus_or_order_scarcity: high + +### 8. Mixed Or Multi-Perspective + +`intra_frame_mixed` + +The same subject must integrate evidence, action paths, and governance tradeoffs. A one-label answer is inadequate. + +### 9. Governance Load + +High. The subject must repeatedly judge when withdrawal is protective, when it is overgeneralized, and when a new relational experiment is worth the risk. + +### 10. Misframing Risks + +- violent_reduction +- over_pathologizing +- single-cause_reduction +- premature_classification + +### 11. Candidate QPI Judgment + +- classification_scope: subject_contextual +- is_provisional: true +- classification: issue +- dominant_scarcity: consensus_order +- classification_confidence: medium +- recommended_next_step: Replace binary judgment with a governance review: target, strength, duration, benefit, cost, and evidence for whether the strategy still fits the current context. + +### 12. Owner Review Questions + +- Should this be classified as Issue rather than P/I mixed because the core task is ongoing calibration? +- What evidence would justify routing part of the case to Problem, such as a concrete boundary conversation? +- Should this case become a canonical example of "Issue does not require many people; one-person self-governance can still be Issue"? diff --git a/reports/model_case_preprocessing/qpi/round-01/flow-redesign.cases.md b/reports/model_case_preprocessing/qpi/round-01/flow-redesign.cases.md new file mode 100644 index 0000000..0222006 --- /dev/null +++ b/reports/model_case_preprocessing/qpi/round-01/flow-redesign.cases.md @@ -0,0 +1,423 @@ +# QPI Case Drafts: Flow Redesign + +status: draft_owner_review_needed + +source_path: `C:\Users\wangq\Documents\Codex\knowledge-vault\work\internal\强哥的思想宇宙\QPI案例分析\流程改造.md` + +source_note: Raw source remains outside this repository. These are reviewable QPI case drafts only; they are not selector JSON, regression cases, or owner-approved calibration data. + +## Case qpi-draft-001: Outline Review Was Not The Real Entry Point + +status: draft_owner_review_needed + +source_path: `C:\Users\wangq\Documents\Codex\knowledge-vault\work\internal\强哥的思想宇宙\QPI案例分析\流程改造.md` + +### 1. Surface Problem + +The apparent problem was how to automate an existing article-outline review loop with multiple reviewers and a main writer. + +### 2. Subject Position + +The subject is the owner as an experienced writer, model builder, and workflow designer trying to externalize a mature personal writing process into a file-first, agentic workflow. The owner is not a beginner asking how to review an outline; the owner is responsible for preserving writing judgment, source fidelity, role boundaries, and downstream reuse. + +### 3. Scenario Context + +The case appears in the transition from a Web single-agent writing workflow to a Codex / CCPE / writing-workbench style workflow. The initial target was a small outline-review loop, but the workflow exposed a prior dependency on material preparation and context engineering before outline generation. + +### 4. Expectation-Reality Gap + +- Expected: The owner expected the outline review stage to be the highest-value small loop to automate first. +- Reality: The review stage depended on earlier material compression, premise context, main-writer framing, and user confirmation. If these were missing, review would only discover unstable foundations late. +- Gap summary: The apparent P-domain task of automating outline review shifted into a broader workflow-framing issue about where context engineering must sit. + +### 5. Attempted Paths + +The initial path treated "existing draft outline enters review" as the entry point. After discussion, the entry was moved earlier: raw viewpoint material -> context engineering -> premise context pack -> main-writer framing -> owner confirmation -> outline v1 -> outline-aligned context -> review. + +### 6. Dynamic Shift + +P -> P/I mixed. The task began as a bounded process automation problem, then became a governance problem about sequencing, context sufficiency, and avoiding late-stage review over unstable inputs. + +### 7. Scarcity Profile + +- data_scarcity: medium +- path_or_resource_scarcity: high +- consensus_or_order_scarcity: high + +### 8. Mixed Or Multi-Perspective + +`intra_frame_mixed` + +For the same owner in the same workflow, there is both path scarcity (how to automate the loop) and order/governance scarcity (where the real entry point should be, and which stage has authority). + +### 9. Governance Load + +High. The case requires deciding stage boundaries, ownership of context engineering, when owner confirmation is required, and how to keep later review from compensating for earlier context failure. + +### 10. Misframing Risks + +- tool_solutionism +- premature_classification +- violent_reduction + +### 11. Candidate QPI Judgment + +- classification_scope: subject_contextual +- is_provisional: true +- classification: mixed +- dominant_scarcity: consensus_order +- classification_confidence: medium +- recommended_next_step: Confirm whether QPI should classify this as P/I mixed rather than a simple workflow automation problem, and identify which context gates are required before outline review. + +### 12. Owner Review Questions + +- Should the dominant scarcity be `consensus_order`, or is `path_resource` more accurate for this stage? +- Is "outline review was the wrong entry point" the core case, or should it be folded into a larger context-engineering case? +- Should this case become a selector calibration example for "workflow automation that looks like P but becomes P/I mixed"? + +## Case qpi-draft-002: Dispatch Pack Was Mistaken For Real Invocation + +status: draft_owner_review_needed + +source_path: `C:\Users\wangq\Documents\Codex\knowledge-vault\work\internal\强哥的思想宇宙\QPI案例分析\流程改造.md` + +### 1. Surface Problem + +The apparent problem was that a multi-agent review test produced files but failed when inspected for actual agent invocation boundaries. + +### 2. Subject Position + +The subject is the owner as workflow auditor and product boundary enforcer. The owner is checking whether review outputs are real independent agent outputs or main-session simulations. + +### 3. Scenario Context + +The failed Sanguo test used writing-workbench-style artifacts for Han Yu, Zhang Liao, Cognitive Imaging, Giant Cognition, and Outline Context Architect. The owner asked for the exact prompt, send instruction, and direct reply for Zhang Liao, exposing that the report had been simulated by the main session. + +### 4. Expectation-Reality Gap + +- Expected: A dispatch pack plus role-specific files would represent real participant invocation. +- Reality: The dispatch pack was only a task description or index, not a complete prompt-to-send or invocation packet. Outputs that looked like reports were not generated by independent agent instances. +- Gap summary: File completeness created a workflow illusion; the missing scarcity was execution authenticity and invocation traceability. + +### 5. Attempted Paths + +The workflow initially accepted generated role reports. After inspection, simulated outputs were marked unusable, the test was invalidated, and the requirement for Agent Invocation Packet / prompt-to-send / invocation record was introduced. + +### 6. Dynamic Shift + +P -> I. At first the issue looked like a missing file-format or dispatch-design problem. It shifted into a governance rule: formal reports must come from real independent participants or be blocked. + +### 7. Scarcity Profile + +- data_scarcity: low +- path_or_resource_scarcity: medium +- consensus_or_order_scarcity: high + +### 8. Mixed Or Multi-Perspective + +`intra_frame_mixed` + +The owner is in one frame, but the problem includes both a path gap (how to package invocation) and an order gap (what counts as formal output). + +### 9. Governance Load + +High. This case depends on audit authenticity, role boundary management, formal-output eligibility, and a rule that the orchestrator must stop rather than simulate when true invocation is unavailable. + +### 10. Misframing Risks + +- tool_solutionism +- premature_classification +- violent_reduction + +### 11. Candidate QPI Judgment + +- classification_scope: subject_contextual +- is_provisional: false +- classification: issue +- dominant_scarcity: consensus_order +- classification_confidence: high +- recommended_next_step: Treat this as a QPI Issue example where the key scarcity is not "how to generate files" but "what execution boundary makes an output legitimate." + +### 12. Owner Review Questions + +- Is `issue` too strong here, or should this be `mixed` because invocation packet implementation also has a clear P component? +- Should "formal_output: false" and "simulation-only" be named as expected downstream routing notes in the case digest? +- Should this case be used as a no-simulation calibration example across other models, not only QPI? + +## Case qpi-draft-003: Chunk-First Distillation Produced Local Truth But Global Misread + +status: draft_owner_review_needed + +source_path: `C:\Users\wangq\Documents\Codex\knowledge-vault\work\internal\强哥的思想宇宙\QPI案例分析\流程改造.md` + +### 1. Surface Problem + +The apparent problem was how to distill a long discussion into reusable topics and material routes. + +### 2. Subject Position + +The subject is the owner as knowledge-vault maintainer and topic-structure reviewer. The owner is not merely asking for a summary; the owner needs material structure that future writing, modeling, and engineering tasks can consume. + +### 3. Scenario Context + +The material-distillation workflow around `失望性情感隔离` ran multiple times. The first attempt split the source into chunks and asked workers to extract topics, then tried to reconstruct the whole. Later attempts introduced whole-source gestalt before worker extraction. + +### 4. Expectation-Reality Gap + +- Expected: Chunked worker extraction would make long-source distillation scalable. +- Reality: Local topic extraction produced locally true outputs but misread or flattened the whole discussion's structure, main axis, and model-evolution line. +- Gap summary: The workflow lacked a whole-source gestalt gate before fragmentation. + +### 5. Attempted Paths + +The first path was R01-R07 chunk-first extraction, followed by topic hierarchy repair. The corrected path started with Step 0 whole-source gestalt, then language repair, structure revision, human confirmation, broad-fidelity workers, synthesis preparation, topic map, material routing, topic docs, and coverage audit. + +### 6. Dynamic Shift + +Q/P -> P/I mixed. At the surface, the question is how to split and summarize long material. In practice, the central issue is when local extraction has enough authority to shape global structure. + +### 7. Scarcity Profile + +- data_scarcity: medium +- path_or_resource_scarcity: high +- consensus_or_order_scarcity: high + +### 8. Mixed Or Multi-Perspective + +`intra_frame_mixed` + +The same owner and same source-processing workflow contain both path scarcity (how to process long material) and order scarcity (which layer has authority: whole-source gestalt, chunks, topic map, or human confirmation). + +### 9. Governance Load + +High. The case requires managing source fidelity, whole/part authority, human confirmation gates, and downstream risk if temporary topic structures become authoritative. + +### 10. Misframing Risks + +- violent_reduction +- premature_classification +- single-cause_reduction +- tool_solutionism + +### 11. Candidate QPI Judgment + +- classification_scope: subject_contextual +- is_provisional: false +- classification: mixed +- dominant_scarcity: consensus_order +- classification_confidence: high +- recommended_next_step: Use this as a QPI example where the correct first move is not more extraction, but a structure-authority gate that distinguishes local truth from global structure. + +### 12. Owner Review Questions + +- Should this case be split into two: one for chunk-first failure and one for whole-source gestalt as remedy? +- Is `dominant_scarcity=consensus_order` correct, or should the dominant scarcity be `path_resource` because the workflow lacked the right processing path? +- Should "local truth impersonating global structure" become a named misframing risk in QPI? + +## Case qpi-draft-004: Material Distillation Needed Stop Gates, Not More Automation + +status: draft_owner_review_needed + +source_path: `C:\Users\wangq\Documents\Codex\knowledge-vault\work\internal\强哥的思想宇宙\QPI案例分析\流程改造.md` + +### 1. Surface Problem + +The apparent problem was how far to continue processing distilled material after topic maps and topic documents were available. + +### 2. Subject Position + +The subject is the owner as knowledge process designer deciding what belongs in knowledge-vault, what should move to writing-workbench, what may become model-mining, and what should stop as a one-time record. + +### 3. Scenario Context + +The third distillation run produced a more mature chain with source map, topic map, material routing, topic documents, human confirmation, and coverage audit. The owner then explicitly skipped model-mining because formal modeling should not be produced by mechanically processing one discussion draft. + +### 4. Expectation-Reality Gap + +- Expected: Once a mature distillation chain exists, it might naturally continue into topic docs, model-mining, writing project setup, or downstream handoff. +- Reality: More automation could prematurely solidify provisional structures or create downstream work not yet authorized by owner judgment. +- Gap summary: The scarcity is not output quantity; it is a stop rule that protects authority, scope, and downstream intent. + +### 5. Attempted Paths + +The workflow matured through multiple gates and audits, but retained explicit boundaries: knowledge-vault handles discussion distillation and knowledge processing; writing-workbench consumes only after the owner decides to write; model-mining is skipped unless separately authorized. + +### 6. Dynamic Shift + +P -> I. The processing pipeline can be engineered, but deciding when not to continue is a governance problem. + +### 7. Scarcity Profile + +- data_scarcity: low +- path_or_resource_scarcity: medium +- consensus_or_order_scarcity: high + +### 8. Mixed Or Multi-Perspective + +`intra_frame_mixed` + +The same source-processing frame combines a solvable pipeline problem with an authority and stop-boundary problem. + +### 9. Governance Load + +High. The case involves owner confirmation, downstream dependency control, preventing premature model extraction, and preventing automation from converting temporary structures into canonical outputs. + +### 10. Misframing Risks + +- tool_solutionism +- malicious_inflation +- premature_classification + +### 11. Candidate QPI Judgment + +- classification_scope: subject_contextual +- is_provisional: false +- classification: issue +- dominant_scarcity: consensus_order +- classification_confidence: high +- recommended_next_step: Treat stop-gate placement as a first-class QPI Issue: define which downstream transitions require owner confirmation before any automated continuation. + +### 12. Owner Review Questions + +- Should this case be classified as `issue`, or as `mixed` because there are also concrete pipeline implementation tasks? +- Should "do not automatically create writing project / model-mining" become an expected routing note? +- Which owner confirmation gates should be represented in the eventual case digest? + +## Case qpi-draft-005: Personal Workflow Redesign Looked Like P But Became P/I + +status: draft_owner_review_needed + +source_path: `C:\Users\wangq\Documents\Codex\knowledge-vault\work\internal\强哥的思想宇宙\QPI案例分析\流程改造.md` + +### 1. Surface Problem + +The apparent problem was that the owner felt a personal workflow redesign should be a P-domain task because it involved only the owner and seemed close to software/process engineering. + +### 2. Subject Position + +The subject is the owner reflecting on their own workflow design. The owner has strong experience in writing, software development, abstraction, and model building, but is now externalizing personal judgment into an agentic, file-backed cognitive production system. + +### 3. Scenario Context + +The reflection compares Vibe Coding small systems with redesigning writing and material-distillation workflows in Codex-like agentic environments. Code often has hard feedback; cognitive workflows rely on judgment, audit, counterexamples, and calibration. + +### 4. Expectation-Reality Gap + +- Expected: Because the affected audience was mainly the owner, the redesign should be a P-domain tool-familiarity or implementation issue. +- Reality: The workflow involved multiple reasonable goals, quasi-stakeholders, state continuity, invocation authenticity, token cost, source fidelity, downstream reuse, and audit boundaries. +- Gap summary: The owner initially treated difficulty as accidental complexity from unfamiliar tools, but the deeper difficulty was essential complexity from governance and judgment externalization. + +### 5. Attempted Paths + +The owner tried to reason from ordinary software development and personal process automation. The analysis reframed the case: small software development often remains P because tests and runtime feedback provide convergence, while cognitive workflow redesign becomes P/I when the validation mechanism itself is part of the system. + +### 6. Dynamic Shift + +P -> P/I mixed. The initial framing is a practical implementation problem; the later framing recognizes ongoing governance load and unstable success criteria. + +### 7. Scarcity Profile + +- data_scarcity: low +- path_or_resource_scarcity: medium +- consensus_or_order_scarcity: high + +### 8. Mixed Or Multi-Perspective + +`intra_frame_mixed` + +The same owner and same redesign effort include P-domain path questions and I-domain governance questions. This is not merely `inter_viewpoint_divergence`, because the case is not different subjects classifying the same sentence differently; it is one subject discovering deeper governance load in the same situation. + +### 9. Governance Load + +Very high. The workflow has proxy stakeholders: present owner, future owner, future writing projects, future knowledge-vault maintenance, agent roles, source material, topic docs, token budget, invocation authenticity, coverage fidelity, and future model-mining. + +### 10. Misframing Risks + +- violent_reduction +- tool_solutionism +- premature_classification + +### 11. Candidate QPI Judgment + +- classification_scope: subject_contextual +- is_provisional: false +- classification: mixed +- dominant_scarcity: consensus_order +- classification_confidence: high +- recommended_next_step: Use this as a primary QPI calibration case for the rule that Issue does not require many human participants; ongoing governance load and proxy stakeholders can raise Issue weight. + +### 12. Owner Review Questions + +- Does this case capture your intended QPI update: "Issue is sustained governance load, not only multi-person conflict"? +- Should this become the anchor case for `intra_frame_mixed` in QPI contextual routing rules? +- Should the eventual digest preserve "code has a compiler; process has no compiler" as a concise rationale, or is that too interpretive? + +## Case qpi-draft-006: Complexity Placement Gate + +status: draft_owner_review_needed + +source_path: `C:\Users\wangq\Documents\Codex\knowledge-vault\work\internal\强哥的思想宇宙\QPI案例分析\流程改造.md` + +### 1. Surface Problem + +The apparent problem was whether the redesigned workflow had become over-engineered. + +### 2. Subject Position + +The subject is the owner as process architect deciding which complexity is justified and which should be removed. + +### 3. Scenario Context + +The source reframes Anti-Overengineering Gate into Complexity Placement Gate. The question changes from "Is this too complex?" to "What does this complexity buy?" + +### 4. Expectation-Reality Gap + +- Expected: The system might be judged by whether it has too many folders, agents, protocols, audits, or handoff artifacts. +- Reality: Some complexity is required when it purchases authenticity, independence, fidelity, structure, traceability, reviewability, reuse, or downstream dependency value. Other complexity should be cut if it buys none of these. +- Gap summary: The core scarcity is a decision rule for placing complexity, not a blanket rule to simplify or expand. + +### 5. Attempted Paths + +The source lists examples: Agent Invocation Packet is justified because it buys authenticity; whole-source gestalt is justified because it buys structure; full coverage audit, thick topic docs, downstream handoff packets, or real worker invocation may or may not be justified depending on value purchased. + +### 6. Dynamic Shift + +Q/P -> I. The surface question "Is this too complex?" could invite a simple answer, but the useful frame is an ongoing governance rule for deciding where complexity is worth paying for. + +### 7. Scarcity Profile + +- data_scarcity: low +- path_or_resource_scarcity: medium +- consensus_or_order_scarcity: high + +### 8. Mixed Or Multi-Perspective + +`not_mixed` + +This case is primarily about governance criteria. It can generate implementation tasks, but the QPI classification itself is centered on Issue. + +### 9. Governance Load + +High. The decision must be re-applied across future workflows, source types, worker dispatches, audits, and downstream artifacts. + +### 10. Misframing Risks + +- violent_reduction +- malicious_inflation +- tool_solutionism +- premature_classification + +### 11. Candidate QPI Judgment + +- classification_scope: subject_contextual +- is_provisional: false +- classification: issue +- dominant_scarcity: consensus_order +- classification_confidence: high +- recommended_next_step: Treat Complexity Placement Gate as a reusable routing principle: ask what complexity buys before adding or removing process layers. + +### 12. Owner Review Questions + +- Should Complexity Placement Gate be represented as a QPI case, a separate model candidate, or both? +- Should this case remain under QPI calibration, or should it later become evidence for another model in the library? +- Are the listed value categories complete enough for an owner-reviewed case digest? diff --git a/reports/model_case_preprocessing/qpi/round-01/year-end-review-academic-affairs.cases.md b/reports/model_case_preprocessing/qpi/round-01/year-end-review-academic-affairs.cases.md new file mode 100644 index 0000000..b0eaef4 --- /dev/null +++ b/reports/model_case_preprocessing/qpi/round-01/year-end-review-academic-affairs.cases.md @@ -0,0 +1,563 @@ +# QPI Case Drafts: Year-End Review Academic Affairs Function + +status: draft_owner_review_needed + +source_path: `[redacted external source path: owner-provided organizational CT slice]` + +source_note: Owner-provided raw organizational material. These drafts are anonymized and generalized for QPI review. Real or potentially identifying people, departments, institutions, timestamps, locations, titles, exact numbers, and sensitive operational details have been removed or generalized. Ancient-style cognitive-anchor names from the source are intentionally omitted. These drafts are not selector JSON, regression cases, or owner-approved calibration data. + +anonymization_note: People are represented as generic roles such as `decision_maker`, `execution_lead`, `technical_staff`, `frontline_staff`, and `affected_learners`. The organization is represented as `the organization`; the department is represented as `academic_affairs_function`. Sensitive details are generalized as `external compliance review`, `credential metric`, `staffing ratio`, `assessment material`, `academic integrity risk`, `teaching operation risk`, `quality assurance gap`, and `public safety compliance gap`. + +## Case qpi-draft-001: Compliance Reporting Becomes Performative Evidence Construction + +status: draft_owner_review_needed + +source_path: `[redacted external source path: owner-provided organizational CT slice]` + +### 1. Surface Problem + +The surface problem is that the organization needs to prepare assessment materials for an external compliance review and wants the submission to present a strong, coherent story. + +### 2. Subject Position + +The subject is the organization under `decision_maker` pressure, with `academic_affairs_function` and `execution_lead` responsible for converting weak operational reality into acceptable review evidence. The subject is not a neutral writer asking how to improve a report; it is an accountable system tempted to use documentation as a substitute for actual capability. + +### 3. Scenario Context + +The case appears in a year-end review context where external compliance survival, assessment evidence, and digital tools are discussed together. The organization faces a high-stakes review and is considering tool-assisted reconstruction of materials. + +### 4. Expectation-Reality Gap + +- Expected: Assessment materials should accurately reflect real teaching operations, quality assurance, and institutional capability. +- Reality: The proposed path risks starting from desired conclusions and then generating supporting materials backward. +- Gap summary: A compliance documentation task becomes a truthfulness and governance problem because evidence construction may replace evidence collection. + +### 5. Attempted Paths + +The apparent path is to use digital or AI tools to accelerate material preparation and make the review narrative more polished. The risky version of this path treats the tool as a way to reverse-engineer evidence after the desired rating is assumed. + +### 6. Dynamic Shift + +P -> I. It starts as a Problem about how to prepare materials efficiently. It shifts into an Issue because the method changes the organization's relationship to evidence, auditability, and institutional honesty. + +### 7. Scarcity Profile + +- data_scarcity: high +- path_or_resource_scarcity: medium +- consensus_or_order_scarcity: high + +### 8. Mixed Or Multi-Perspective + +`intra_frame_mixed` + +For the same organization in the same review scenario, there is both data scarcity and order scarcity. The organization lacks reliable evidence and is also tempted to change the rules of evidence by treating fabricated coherence as acceptable. + +### 9. Governance Load + +High. The case requires managing audit authenticity, review exposure, data lineage, tool boundaries, and the difference between legitimate material organization and performative evidence construction. + +### 10. Misframing Risks + +- violent_reduction +- tool_solutionism +- premature_classification +- single-cause_reduction + +### 11. Candidate QPI Judgment + +- classification_scope: subject_contextual +- is_provisional: true +- classification: mixed +- dominant_scarcity: consensus_order +- classification_confidence: medium +- recommended_next_step: Separate legitimate evidence organization from fabricated evidence construction, then require a traceable evidence inventory before any tool-assisted material drafting. + +### 12. Owner Review Questions + +- Should this case emphasize `consensus_order` because it is about evidence legitimacy, or `data` because the triggering gap is missing reliable proof? +- Should it become a selector calibration case for "AI or tool request that should not be treated as a simple execution task"? +- Is the anonymization level sufficient, or should the external review context be generalized further? + +## Case qpi-draft-002: Credential Metric Repair Creates Staffing Ratio Deadlock + +status: draft_owner_review_needed + +source_path: `[redacted external source path: owner-provided organizational CT slice]` + +### 1. Surface Problem + +The surface problem is that the organization needs to improve a credential or staffing ratio metric for external compliance. + +### 2. Subject Position + +The subject is the organization as framed by `decision_maker` and implemented through `academic_affairs_function`. `frontline_staff`, newly recruited staff, and existing staff become affected system parts rather than equal framers of the problem. + +### 3. Scenario Context + +The case appears in a teaching operation and staffing discussion. The organization has recruited or reclassified people to satisfy metric pressure, but the available course structure and role design cannot absorb them productively. + +### 4. Expectation-Reality Gap + +- Expected: Recruiting or counting higher-credential staff should strengthen compliance and teaching capability. +- Reality: Credential-matched staff may have no suitable work, while existing staff may lose workload or security. +- Gap summary: A compliance metric repair creates resource idle time, role mismatch, and internal conflict. + +### 5. Attempted Paths + +The apparent paths include adding credentialed people, reallocating workload from existing staff, and using organizational structure to make staffing numbers look compliant. These paths improve the table before they improve the operating system. + +### 6. Dynamic Shift + +P -> I. It begins as a Problem about how to meet a metric. It becomes an Issue because the chosen path creates sustained tradeoffs among compliance, cost, workload fairness, staff morale, and actual teaching value. + +### 7. Scarcity Profile + +- data_scarcity: medium +- path_or_resource_scarcity: high +- consensus_or_order_scarcity: high + +### 8. Mixed Or Multi-Perspective + +`intra_frame_mixed` + +The same subject in the same scenario faces both path/resource scarcity and order scarcity. The organization can add people, but cannot translate them into useful teaching capacity without triggering conflict. + +### 9. Governance Load + +High. This requires ongoing management of staffing legitimacy, workload distribution, incentive backlash, budget pressure, compliance exposure, and role boundaries. + +### 10. Misframing Risks + +- violent_reduction +- malicious_inflation +- premature_classification +- single-cause_reduction + +### 11. Candidate QPI Judgment + +- classification_scope: subject_contextual +- is_provisional: true +- classification: mixed +- dominant_scarcity: consensus_order +- classification_confidence: medium +- recommended_next_step: Treat the staffing metric as a P/I mixed case, model real workload absorption before further recruitment or reclassification, and identify which compliance path is legitimate rather than merely cosmetic. + +### 12. Owner Review Questions + +- Should the dominant scarcity be `path_resource` because the immediate blocker is role absorption, or `consensus_order` because the deeper risk is zero-sum governance? +- Should this case be merged with other staffing-ratio cases, or kept separate as an academic-affairs-specific example? +- Does the phrase "credential metric" sufficiently anonymize the original compliance indicator? + +## Case qpi-draft-003: Academic Output Incentive Becomes Integrity Backlash + +status: draft_owner_review_needed + +source_path: `[redacted external source path: owner-provided organizational CT slice]` + +### 1. Surface Problem + +The surface problem is that an academic output incentive policy produced weak or unreliable outputs and now needs correction. + +### 2. Subject Position + +The subject is the organization and `academic_affairs_function` dealing with the consequences of a prior incentive design. `frontline_staff` are both participants in the old incentive game and affected parties under the correction. + +### 3. Scenario Context + +The case appears in a review of teaching quality, promotion incentives, and academic output claims. The organization previously rewarded output quantity or formal compliance, then recognized that the reward system encouraged low-integrity behavior. + +### 4. Expectation-Reality Gap + +- Expected: Output incentives should encourage real academic or teaching development. +- Reality: The incentive design encouraged performative output and may have normalized low-integrity shortcuts. +- Gap summary: A policy intended to strengthen capability created a trust and integrity liability. + +### 5. Attempted Paths + +The organization appears to have used quantifiable output incentives and then considered or initiated a reversal. The reversal may reduce future distortion, but it also risks backlash from people who already paid cost under the previous rule. + +### 6. Dynamic Shift + +P -> I. It starts as a Problem about correcting a bad incentive. It shifts into an Issue because the correction affects trust, fairness, past commitments, and organizational culture. + +### 7. Scarcity Profile + +- data_scarcity: medium +- path_or_resource_scarcity: medium +- consensus_or_order_scarcity: high + +### 8. Mixed Or Multi-Perspective + +`intra_frame_mixed` + +The case contains policy repair, incentive redesign, and trust repair within the same frame. The technical path is not enough because the previous policy has already reshaped behavior and expectations. + +### 9. Governance Load + +High. The organization must manage academic integrity, incentive transition, retroactive fairness, staff trust, and the long-term difference between real capability and formal output. + +### 10. Misframing Risks + +- violent_reduction +- single-cause_reduction +- premature_classification + +### 11. Candidate QPI Judgment + +- classification_scope: subject_contextual +- is_provisional: true +- classification: issue +- dominant_scarcity: consensus_order +- classification_confidence: medium +- recommended_next_step: Frame this as incentive and trust repair, not only as policy cancellation. Separate future integrity rules from transitional handling of people affected by prior incentives. + +### 12. Owner Review Questions + +- Should this be classified as `issue` rather than `mixed`, given that the path to correction exists but legitimacy remains contested? +- Should the draft explicitly include "policy memory" as a proxy stakeholder? +- Is this case useful as a false-negative trap where a selector might under-call QPI because the surface request sounds like policy cleanup? + +## Case qpi-draft-004: Strategic Alignment Is Replaced By Easier Program Packaging + +status: draft_owner_review_needed + +source_path: `[redacted external source path: owner-provided organizational CT slice]` + +### 1. Surface Problem + +The surface problem is choosing which program, project, or specialization to prioritize for strategic development and external recognition. + +### 2. Subject Position + +The subject is the organization under `decision_maker` strategy pressure, with `academic_affairs_function` responsible for translating that strategy into program-level execution. The function also has its own local incentives to choose easier paths. + +### 3. Scenario Context + +The case appears in a strategic alignment discussion. The decision layer expects program choices to connect to a broader organizational industry or mission advantage, while the execution layer gravitates toward options that are easier to package, report, or complete. + +### 4. Expectation-Reality Gap + +- Expected: Program selection should align with the organization's strategic advantage and long-term positioning. +- Reality: Execution may select a more convenient or fashionable option that improves short-term reportability while weakening strategic coherence. +- Gap summary: A strategic choice is reduced to a packaging convenience problem. + +### 5. Attempted Paths + +The attempted path is to choose a more workable or marketable label for application and reporting. This lowers immediate execution difficulty but may disconnect the project from the organization's real strategic base. + +### 6. Dynamic Shift + +P -> I. It begins as a Problem about selecting and executing a project path. It becomes an Issue because the selected path reveals conflict between strategic intent, departmental incentives, and evaluation convenience. + +### 7. Scarcity Profile + +- data_scarcity: medium +- path_or_resource_scarcity: medium +- consensus_or_order_scarcity: high + +### 8. Mixed Or Multi-Perspective + +`inter_viewpoint_divergence` + +From the execution function's viewpoint, this may look like a practical Problem: choose the feasible path. From the decision layer's viewpoint, it is an Issue about strategic discipline and local incentive drift. + +### 9. Governance Load + +High. The case requires aligning strategy, incentives, execution capacity, external review criteria, and the threshold for rejecting convenient but strategically hollow options. + +### 10. Misframing Risks + +- violent_reduction +- malicious_inflation +- premature_classification + +### 11. Candidate QPI Judgment + +- classification_scope: multi_perspective +- is_provisional: true +- classification: issue +- dominant_scarcity: consensus_order +- classification_confidence: medium +- recommended_next_step: Ask whose frame is being used. If the owner frame is strategic governance, treat as Issue; if the local execution frame is selected, first verify whether the easier path still satisfies strategic alignment. + +### 12. Owner Review Questions + +- Should this case be labeled `inter_viewpoint_divergence` because the same choice differs by role, or `intra_frame_mixed` because one organization contains both frames? +- Should the owner-expected judgment emphasize "strategic evasion" or "resource-feasible compromise"? +- Is this a good calibration case for distinguishing local feasibility from organizational strategy? + +## Case qpi-draft-005: Resource Reuse Proposal Collides With Operational Reality + +status: draft_owner_review_needed + +source_path: `[redacted external source path: owner-provided organizational CT slice]` + +### 1. Surface Problem + +The surface problem is how to reuse surplus teaching capacity across internal units to reduce cost and improve utilization. + +### 2. Subject Position + +The subject differs by viewpoint. `decision_maker` sees unused capacity and seeks cross-unit reuse. `execution_lead` and receiving units see timetable mismatch, capability mismatch, and operational disruption. + +### 3. Scenario Context + +The case appears after the organization has created surplus or underused staffing capacity. Cross-unit teaching reuse is proposed as a way to convert idle resources into value. + +### 4. Expectation-Reality Gap + +- Expected: Surplus staff can be redeployed across units to solve underutilization. +- Reality: Role fit, schedule structure, learner profile, and unit boundary constraints may make the proposed reuse impractical or damaging. +- Gap summary: A cost-saving idea that looks simple from above becomes a cross-boundary operating problem below. + +### 5. Attempted Paths + +The attempted path is cross-unit reassignment or shared staffing. The resistance path is to reject the reassignment because the work is not equivalent across units and the schedules do not naturally align. + +### 6. Dynamic Shift + +P -> I. It starts as a Problem about resource allocation. It becomes an Issue because the reuse path triggers role boundary, unit autonomy, quality, and fairness disputes. + +### 7. Scarcity Profile + +- data_scarcity: medium +- path_or_resource_scarcity: high +- consensus_or_order_scarcity: high + +### 8. Mixed Or Multi-Perspective + +`inter_viewpoint_divergence` + +From the decision layer, the case may look like a path/resource Problem. From the receiving or executing units, it becomes an Issue about role fit and imposed coordination burden. + +### 9. Governance Load + +High. Sustainable reuse requires role compatibility, scheduling authority, quality standards, workload agreements, and credible feedback from affected units. + +### 10. Misframing Risks + +- violent_reduction +- single-cause_reduction +- premature_classification + +### 11. Candidate QPI Judgment + +- classification_scope: multi_perspective +- is_provisional: true +- classification: mixed +- dominant_scarcity: mixed +- classification_confidence: medium +- recommended_next_step: Build a role-fit and schedule-fit test before treating surplus capacity as redeployable. If fit fails, do not classify the resistance as mere execution unwillingness. + +### 12. Owner Review Questions + +- Should the classification be `mixed` or `issue`? +- Should this be paired with the staffing ratio deadlock case, or does it represent a distinct resource reuse pattern? +- What minimum evidence would make redeployment a legitimate Problem rather than an Issue? + +## Case qpi-draft-006: Student Outcome Decline Is Reframed As Input Quality Excuse + +status: draft_owner_review_needed + +source_path: `[redacted external source path: owner-provided organizational CT slice]` + +### 1. Surface Problem + +The surface problem is that student outcome indicators and learner complaints have worsened, creating pressure on the academic affairs system. + +### 2. Subject Position + +The subject is `academic_affairs_function` under accountability pressure. `affected_learners` appear as downstream recipients of quality gaps, while `decision_maker` evaluates whether the function still has operational credibility. + +### 3. Scenario Context + +The case appears in a review of student progression, academic quality, complaints, and teaching operation. The function appears to explain poor outcomes partly through input conditions and learner quality. + +### 4. Expectation-Reality Gap + +- Expected: The academic affairs system should improve learning outcomes, identify quality problems, and manage learner complaints before they become systemic distrust. +- Reality: Outcome decline is explained through external or upstream factors, while internal management levers remain under-specified. +- Gap summary: A quality assurance failure is at risk of being reframed as an unavoidable input problem. + +### 5. Attempted Paths + +The apparent path is explanatory defense: cite difficult input conditions, highlight isolated achievements, or use micro-successes to offset macro outcome decline. This may protect the function rhetorically but does not repair the quality system. + +### 6. Dynamic Shift + +Q/P -> I. It begins with Questions about what the data really shows and Problems about process repair. It becomes an Issue when responsibility attribution, trust, and accountability are contested. + +### 7. Scarcity Profile + +- data_scarcity: medium +- path_or_resource_scarcity: high +- consensus_or_order_scarcity: high + +### 8. Mixed Or Multi-Perspective + +`intra_frame_mixed` + +For the same accountability frame, the case contains uncertain causal data, missing improvement path, and order scarcity around responsibility attribution. + +### 9. Governance Load + +High. The organization must manage outcome evidence, learner voice, quality assurance, accountability boundaries, and whether local bright spots can legitimately offset systemic decline. + +### 10. Misframing Risks + +- violent_reduction +- single-cause_reduction +- premature_classification + +### 11. Candidate QPI Judgment + +- classification_scope: subject_contextual +- is_provisional: true +- classification: mixed +- dominant_scarcity: consensus_order +- classification_confidence: medium +- recommended_next_step: Separate input-condition analysis from management-lever analysis, then require a quality assurance map that links complaints, outcomes, process controls, and owner accountability. + +### 12. Owner Review Questions + +- Should this case be classified as `mixed` because data, path, and responsibility are all contested? +- Should isolated achievements be treated as evidence of latent capability or as masking signals? +- What owner-approved wording should be used to avoid over-claiming causal responsibility? + +## Case qpi-draft-007: Digital Platform And Local AI Choice Becomes Governance Boundary Problem + +status: draft_owner_review_needed + +source_path: `[redacted external source path: owner-provided organizational CT slice]` + +### 1. Surface Problem + +The surface problem is choosing a digital collaboration platform or AI deployment mode for the organization. + +### 2. Subject Position + +The subject is split between `decision_maker`, who prioritizes control and data safety, and `technical_staff`, who worries about iteration speed, obsolescence, and practical maintenance. `academic_affairs_function` appears as one affected business function. + +### 3. Scenario Context + +The case appears in a discussion of digital transformation, platform standardization, and AI deployment. Multiple tools or deployment modes are considered without a stable decision basis. + +### 4. Expectation-Reality Gap + +- Expected: The organization should choose a digital base that supports coordination, security, and long-term use. +- Reality: Platform choice is debated through partial priorities, with no shared weighting of data security, iteration speed, integration, maintainability, and user adoption. +- Gap summary: A tool selection question hides an unresolved governance boundary. + +### 5. Attempted Paths + +The apparent paths include comparing platforms, testing tools, and choosing between local control and cloud-based iteration. These paths remain unstable because the evaluation criteria are not settled. + +### 6. Dynamic Shift + +Q/P -> I. It may begin as a Question about which tool is better or a Problem about how to deploy. It becomes an Issue because the real conflict is between governance priorities. + +### 7. Scarcity Profile + +- data_scarcity: medium +- path_or_resource_scarcity: medium +- consensus_or_order_scarcity: high + +### 8. Mixed Or Multi-Perspective + +`inter_viewpoint_divergence` + +The same platform decision can be framed as a technical Problem by implementers, a risk-control Issue by decision makers, and a user-adoption Problem by operating functions. + +### 9. Governance Load + +High. The organization must maintain platform standards, data boundaries, lifecycle decisions, adoption incentives, and responsibility for future migration or failure. + +### 10. Misframing Risks + +- tool_solutionism +- malicious_inflation +- premature_classification + +### 11. Candidate QPI Judgment + +- classification_scope: multi_perspective +- is_provisional: true +- classification: issue +- dominant_scarcity: consensus_order +- classification_confidence: medium +- recommended_next_step: Define decision criteria and authority before selecting tools. Treat the deployment choice as governance-bound technical strategy, not a simple platform preference. + +### 12. Owner Review Questions + +- Should this case remain in QPI calibration, or does it overlap too much with generic technology strategy examples? +- Should the dominant scarcity be `consensus_order` because criteria are contested, or `path_resource` because implementation cost is material? +- Is the local-vs-cloud distinction too specific and should it be further generalized? + +## Case qpi-draft-008: Public Safety Compliance Gap Reveals Bottom-Line Control Failure + +status: draft_owner_review_needed + +source_path: `[redacted external source path: owner-provided organizational CT slice]` + +### 1. Surface Problem + +The surface problem is that a large activity or event was not managed through proper safety and compliance procedures. + +### 2. Subject Position + +The subject is the organization and `academic_affairs_function` as part of the operating system responsible for basic procedural control. `affected_learners`, frontline organizers, and external regulators are proxy stakeholders. + +### 3. Scenario Context + +The case appears inside a broader teaching and compliance review. It is not only an event-management problem; it is evidence that basic operating controls may be weak during high-pressure or high-volume situations. + +### 4. Expectation-Reality Gap + +- Expected: Activities involving large groups should have clear approval, reporting, safety planning, and accountability. +- Reality: The event proceeded without adequate procedural control and created external enforcement or safety exposure. +- Gap summary: A single event failure points to a deeper bottom-line control gap. + +### 5. Attempted Paths + +The source suggests reactive handling after the event rather than a reliable preventive process. The organization may treat it as an isolated incident, but the governance signal is broader. + +### 6. Dynamic Shift + +P -> I. It starts as a Problem about missing event process. It becomes an Issue because it reveals control culture, risk ownership, and whether compliance procedures are treated as optional. + +### 7. Scarcity Profile + +- data_scarcity: low +- path_or_resource_scarcity: high +- consensus_or_order_scarcity: high + +### 8. Mixed Or Multi-Perspective + +`intra_frame_mixed` + +The same operational frame contains a missing process path and a governance failure. A checklist may fix the local process, but not the underlying tolerance for unmanaged risk. + +### 9. Governance Load + +High. The case requires defining approval authority, event risk classification, accountability, external reporting boundaries, learner safety, and hard stop rules. + +### 10. Misframing Risks + +- violent_reduction +- single-cause_reduction +- premature_classification + +### 11. Candidate QPI Judgment + +- classification_scope: subject_contextual +- is_provisional: true +- classification: mixed +- dominant_scarcity: consensus_order +- classification_confidence: medium +- recommended_next_step: Treat the event as a bottom-line control signal, not only a process mistake. Build a hard-gate event approval workflow and assign risk ownership before allowing similar activities. + +### 12. Owner Review Questions + +- Should this case be classified as `mixed` or direct `issue`? +- Should it be included in QPI calibration even though it is less cognitively subtle and more operationally concrete? +- What level of detail should remain after anonymization so the safety risk is still meaningful? diff --git a/reports/model_case_preprocessing/qpi/round-01/year-end-review-development-office.cases.md b/reports/model_case_preprocessing/qpi/round-01/year-end-review-development-office.cases.md new file mode 100644 index 0000000..851014e --- /dev/null +++ b/reports/model_case_preprocessing/qpi/round-01/year-end-review-development-office.cases.md @@ -0,0 +1,564 @@ +# QPI Case Drafts: Year-End Review Planning Function + +status: draft_owner_review_needed + +source_path: `[redacted external source path: owner-provided organizational CT slice]` + +source_note: Owner-provided raw organizational material. These drafts are anonymized and generalized for QPI review. Real or potentially identifying people, departments, institutions, timestamps, locations, titles, and exact numeric details have been removed or generalized. Ancient-style cognitive anchors from the source are intentionally omitted. These drafts are not selector JSON, regression cases, or owner-approved calibration data. + +anonymization_note: People are represented as roles such as `decision_maker`, `execution_lead`, `strategy_staff`, `functional_department`, and `frontline_staff`. The organization is represented as `the organization`; the department is represented as `planning function`. Sensitive details are generalized as `facility metric gap`, `staffing credential metric gap`, `compliance workaround risk`, `incentive backlash`, and `operational continuity risk`. + +## Case qpi-draft-001: Compliance Goal Becomes Compliance Workaround Risk + +status: draft_owner_review_needed + +source_path: `[redacted external source path: owner-provided organizational CT slice]` + +### 1. Surface Problem + +The surface problem is that the organization faces a facility metric gap against an external compliance target and needs a way to make the submitted indicators appear adequate. + +### 2. Subject Position + +The subject is the organization as framed by `decision_maker` and translated by `execution_lead`. The subject is not a neutral analyst asking what the rule says; it is an accountable organization under external review pressure, with limited willingness to invest in physical resources and strong pressure to pass the gate. + +### 3. Scenario Context + +The case appears in a year-end review and planning discussion for a `planning function`. The function is responsible for turning external compliance requirements into internal plans and evidence packages. The broader context is a survival-level compliance milestone where the organization wants to preserve status while minimizing new resource commitments. + +### 4. Expectation-Reality Gap + +- Expected: The organization expects to satisfy external facility-related requirements through planning, packaging, and administrative coordination. +- Reality: The underlying physical resource base has a material gap that cannot be solved by renaming, relabeling, or paperwork alone. +- Gap summary: A hard resource shortage is being reframed as a documentation problem, creating `compliance workaround risk`. + +### 5. Attempted Paths + +The apparent path is to reinterpret or reclassify existing facilities so that reported indicators look closer to the required threshold. This path avoids physical investment but increases audit and credibility risk. + +### 6. Dynamic Shift + +P -> I. It begins as a Problem about how to meet a facility metric under constraints. It shifts into an Issue because the proposed solution changes the organization's relationship to compliance, truthfulness, risk exposure, and long-term auditability. + +### 7. Scarcity Profile + +- data_scarcity: low +- path_or_resource_scarcity: high +- consensus_or_order_scarcity: high + +### 8. Mixed Or Multi-Perspective + +`intra_frame_mixed` + +For the same organization in the same compliance scenario, there is both path/resource scarcity and order scarcity. The hard resource gap creates a path problem, while the workaround creates a governance and legitimacy problem. + +### 9. Governance Load + +High. The case requires managing audit authenticity, regulatory exposure, internal pressure, physical resource limits, and whether short-term indicator repair will damage long-term institutional legitimacy. + +### 10. Misframing Risks + +- violent_reduction +- malicious_inflation +- premature_classification +- single-cause_reduction + +### 11. Candidate QPI Judgment + +- classification_scope: subject_contextual +- is_provisional: true +- classification: mixed +- dominant_scarcity: consensus_order +- classification_confidence: medium +- recommended_next_step: Treat the facility metric gap as a P/I mixed case, separate legitimate remediation paths from compliance workaround risk, and ask the owner whether the intended QPI label should emphasize resource scarcity or governance failure. + +### 12. Owner Review Questions + +- Should the dominant scarcity be `consensus_order` because of compliance workaround risk, or `path_resource` because the physical gap is the triggering constraint? +- Should this case become a selector calibration input for "hard resource gap disguised as documentation problem"? +- Is the draft sufficiently anonymized, or should the source relation to an external compliance milestone be further generalized? + +## Case qpi-draft-002: Credential Metric Repair Creates Operational Continuity Risk + +status: draft_owner_review_needed + +source_path: `[redacted external source path: owner-provided organizational CT slice]` + +### 1. Surface Problem + +The surface problem is that the organization needs to improve a staffing credential metric for external compliance. + +### 2. Subject Position + +The subject is the organization under `decision_maker` pressure, with `execution_lead` responsible for converting the target into staffing action. `frontline_staff` and `functional_department` appear as affected system parts rather than decision owners. + +### 3. Scenario Context + +The scenario is a planning and staffing adjustment discussion in which non-core service and administrative roles are evaluated primarily by whether they help the organization satisfy a credential metric. The planning function is pulled from strategic diagnosis into indicator assembly. + +### 4. Expectation-Reality Gap + +- Expected: Replacing or reclassifying staff can improve a credential indicator and make the organization appear stronger. +- Reality: Credential fit does not equal functional fit. Replacing experienced operational staff with credential-matched but role-mismatched staff may weaken daily operations and increase churn. +- Gap summary: A staffing quality issue is violently reduced to a single credential indicator. + +### 5. Attempted Paths + +The source describes an aggressive replacement or reclassification logic: roles that require continuity, practical experience, or trust are forced into a credential-centered standard. The method may improve the table but damage the operating system. + +### 6. Dynamic Shift + +P -> I. It starts as a Problem about how to close a staffing credential metric gap. It becomes an Issue because the chosen method creates role mismatch, morale damage, labor conflict risk, and operational continuity risk. + +### 7. Scarcity Profile + +- data_scarcity: medium +- path_or_resource_scarcity: high +- consensus_or_order_scarcity: high + +### 8. Mixed Or Multi-Perspective + +`intra_frame_mixed` + +The same subject has simultaneous resource/path scarcity and governance scarcity: it lacks enough metric-qualified staff, but the repair path undermines role boundaries and operational stability. + +### 9. Governance Load + +High. This case requires balancing compliance metrics, role-function fit, morale, operational memory, turnover, and the legitimacy of using people as indicator carriers. + +### 10. Misframing Risks + +- violent_reduction +- single-cause_reduction +- premature_classification + +### 11. Candidate QPI Judgment + +- classification_scope: subject_contextual +- is_provisional: true +- classification: mixed +- dominant_scarcity: consensus_order +- classification_confidence: medium +- recommended_next_step: Frame the case as a staffing-governance Issue with a path/resource trigger, and ask whether the QPI output should explicitly mark `violent_reduction` when role-function fit is collapsed into credential count. + +### 12. Owner Review Questions + +- Should this be treated as the clearest example of `violent_reduction` in this source? +- Should the QPI case emphasize role mismatch, morale damage, compliance optics, or operational continuity? +- Is `classification: issue` more appropriate than `classification: mixed` once the staffing path is chosen? + +## Case qpi-draft-003: Incentive Backlash Misread As Lack of Effort + +status: draft_owner_review_needed + +source_path: `[redacted external source path: owner-provided organizational CT slice]` + +### 1. Surface Problem + +The surface problem is that performance or output indicators are declining and `decision_maker` interprets the decline as insufficient effort or insufficient pressure. + +### 2. Subject Position + +The subject is the organization as seen by two different internal positions. `decision_maker` frames the problem as willpower and output discipline. `execution_lead` and `frontline_staff` experience it as an incentive mismatch where the required behavior imposes unrecovered costs or losses. + +### 3. Scenario Context + +The case appears in a performance discussion where the organization wants higher externally visible output while maintaining tight cost control. The planning function surfaces the contradiction between aspiration and incentive design. + +### 4. Expectation-Reality Gap + +- Expected: Staff should increase output when the organization demands it or when ranking/status pressure rises. +- Reality: Existing policy creates `incentive backlash`; rational staff reduce effort when the required behavior is economically or professionally unrewarding. +- Gap summary: A systemic incentive design problem is misread as individual laziness or insufficient mobilization. + +### 5. Attempted Paths + +The apparent path is to restart pressure, exhortation, or low-cost incentive signals without fixing the underlying cost-reward mismatch. This may briefly increase compliance speech but is unlikely to restore real output. + +### 6. Dynamic Shift + +I misread as P. The decision frame treats the issue as a manageable execution problem: "make people work harder." The source frames it as an Issue: incentives, trust, cost allocation, and long-term response have already changed. + +### 7. Scarcity Profile + +- data_scarcity: medium +- path_or_resource_scarcity: medium +- consensus_or_order_scarcity: high + +### 8. Mixed Or Multi-Perspective + +`inter_viewpoint_divergence` + +Different roles classify the same decline differently. `decision_maker` sees a Problem of mobilization; `frontline_staff` experience an Issue of unfair incentive structure; `planning function` sees a system loop. + +### 9. Governance Load + +High. The case requires redesigning incentive credibility, cost coverage, trust, and future behavior rather than issuing a one-time execution command. + +### 10. Misframing Risks + +- violent_reduction +- single-cause_reduction +- premature_classification + +### 11. Candidate QPI Judgment + +- classification_scope: multi_perspective +- is_provisional: true +- classification: issue +- dominant_scarcity: consensus_order +- classification_confidence: medium +- recommended_next_step: Separate output symptom from incentive mechanism, then ask which role's frame is being routed: mobilization problem, incentive redesign issue, or evidence question about actual causes. + +### 12. Owner Review Questions + +- Should this be classified as `inter_viewpoint_divergence` because roles see different problems, or `intra_frame_mixed` because the organization has simultaneous incentive and path gaps? +- Is the main misframing `violent_reduction` from incentive structure to personal effort? +- Should this be a strong selector calibration example for "performance decline with incentive backlash"? + +## Case qpi-draft-004: Strategic Planning Function Reduced To Indicator Packaging + +status: draft_owner_review_needed + +source_path: `[redacted external source path: owner-provided organizational CT slice]` + +### 1. Surface Problem + +The surface problem is that the `planning function` is criticized for not providing enough innovation, strategy, or concrete implementation value. + +### 2. Subject Position + +The subject can be framed from multiple positions. `decision_maker` sees a weak function that should deliver usable progress. `strategy_staff` sees a strategic function that requires resources, trust, and coordination authority. `execution_lead` sees a function that must translate strategy into compliance packages under cost pressure. + +### 3. Scenario Context + +The scenario is a year-end review where the planning function is expected to speak the language of strategy but is evaluated mainly by its usefulness in meeting immediate compliance and indicator goals. + +### 4. Expectation-Reality Gap + +- Expected: The planning function should generate strategic growth, external collaboration, and innovation. +- Reality: It lacks the authority, resources, and trust needed to implement those ambitions, and is instead pulled into packaging and target repair. +- Gap summary: A strategic function is assigned strategic responsibility but denied strategic operating conditions. + +### 5. Attempted Paths + +`strategy_staff` attempts to propose external resource routes or larger strategic narratives. `decision_maker` rejects resource-intensive paths and reasserts the minimum-cost requirement. The function then risks becoming either ceremonial or defensive. + +### 6. Dynamic Shift + +P/I -> I. The surface problem might be a Problem of poor planning quality. With context, it becomes an Issue about role authority, trust, resource constraints, and whether the organization actually wants strategy or only compliant indicators. + +### 7. Scarcity Profile + +- data_scarcity: medium +- path_or_resource_scarcity: high +- consensus_or_order_scarcity: high + +### 8. Mixed Or Multi-Perspective + +`inter_viewpoint_divergence` + +The same "planning function underperformance" surface problem is classified differently by role: competence problem for `decision_maker`, resource/path problem for `strategy_staff`, and governance issue for a system analyst. + +### 9. Governance Load + +High. The organization must decide whether the planning function has real strategic authority or only responsibility for compliance packaging. Without that decision, every proposed path will be judged by incompatible standards. + +### 10. Misframing Risks + +- violent_reduction +- malicious_inflation +- premature_classification + +### 11. Candidate QPI Judgment + +- classification_scope: multi_perspective +- is_provisional: true +- classification: mixed +- dominant_scarcity: consensus_order +- classification_confidence: medium +- recommended_next_step: Ask the owner to confirm whether this should become a QPI sample for role-authority mismatch: the function is blamed for strategy while governed as a packaging unit. + +### 12. Owner Review Questions + +- Should this be classified as `issue` rather than `mixed` because the role contradiction dominates? +- Does the case need a separate viewpoint table for `decision_maker`, `strategy_staff`, and `execution_lead`? +- Should the anonymized role `planning function` be made even broader for future publication safety? + +## Case qpi-draft-005: Low-Cost Ambition Creates Physical-Law Contradictions + +status: draft_owner_review_needed + +source_path: `[redacted external source path: owner-provided organizational CT slice]` + +### 1. Surface Problem + +The surface problem is how to achieve ambitious organizational outcomes under tight budget and resource constraints. + +### 2. Subject Position + +The subject is `decision_maker` as the owner of targets and cost limits, with `planning function` and `execution_lead` expected to make the contradiction operationally feasible. + +### 3. Scenario Context + +The case occurs across several planning themes: external cooperation, facility readiness, staffing credentials, and performance indicators. The repeated pattern is "raise the standard while minimizing the investment." + +### 4. Expectation-Reality Gap + +- Expected: The organization can obtain high-level outcomes through administrative pressure, packaging, and internal compression. +- Reality: Several desired outcomes require real exchanges, physical capacity, credible incentives, or role-compatible talent. These cannot be created by command alone. +- Gap summary: The organization treats resource-dependent outcomes as if they were compliance wording or discipline problems. + +### 5. Attempted Paths + +The repeated attempted path is cost suppression plus command pressure: demand external cooperation without meaningful exchange, demand output without adequate incentive, demand capacity without physical expansion, and demand talent quality without role-market fit. + +### 6. Dynamic Shift + +P -> I. Each item can look like a separate Problem, but the repeated pattern reveals a deeper Issue: the decision logic itself generates contradictions that downstream actors must absorb. + +### 7. Scarcity Profile + +- data_scarcity: low +- path_or_resource_scarcity: high +- consensus_or_order_scarcity: high + +### 8. Mixed Or Multi-Perspective + +`intra_frame_mixed` + +Within the same organizational frame, path/resource scarcity and order scarcity reinforce each other. The path gap is not accidental; it is produced by the governing cost doctrine. + +### 9. Governance Load + +High. This requires confronting target-resource consistency, investment boundaries, credibility of command, and whether downstream functions are being asked to absorb impossible contradictions. + +### 10. Misframing Risks + +- malicious_inflation +- violent_reduction +- tool_solutionism +- premature_classification + +### 11. Candidate QPI Judgment + +- classification_scope: subject_contextual +- is_provisional: true +- classification: issue +- dominant_scarcity: consensus_order +- classification_confidence: medium +- recommended_next_step: Treat the pattern as an Issue about target-resource governance, not as a list of independent execution blockers. + +### 12. Owner Review Questions + +- Is this case too broad, or is it useful as a meta-case for the whole organizational slice? +- Should QPI allow a "pattern-level Issue" extracted from multiple surface Problems in one source? +- Should this case be merged with the compliance workaround and staffing credential cases, or kept as a higher-level calibration sample? + +## Case qpi-draft-006: Data Completeness Masks Truthfulness Gap + +status: draft_owner_review_needed + +source_path: `[redacted external source path: owner-provided organizational CT slice]` + +### 1. Surface Problem + +The surface problem is that the organization needs complete and favorable records for external review, including facility, staffing, performance, and planning materials. + +### 2. Subject Position + +The subject is the `planning function` as a data assembler and risk translator. It sits between `decision_maker` pressure, `execution_lead` tactics, and external review expectations. + +### 3. Scenario Context + +The source contains multiple instances where indicators can be made to look complete while the underlying reality remains unstable or misleading. The planning function becomes the place where mismatch between reports and operations is either surfaced or hidden. + +### 4. Expectation-Reality Gap + +- Expected: If the data package is complete and internally consistent, the organization can pass the review. +- Reality: The data package may be internally complete while externally fragile because the underlying facts are physically, operationally, or behaviorally weak. +- Gap summary: Data completeness is mistaken for truthfulness and audit resilience. + +### 5. Attempted Paths + +The organization appears to build a coherent evidence package around renamed resources, reclassified staff, and performance narratives. This can reduce short-term data gaps but increase risk when auditors inspect the underlying reality. + +### 6. Dynamic Shift + +Q/P -> I. It begins as a data or documentation question: "What information is missing?" It becomes an Issue once the problem is whether the evidence corresponds to real, stable operations. + +### 7. Scarcity Profile + +- data_scarcity: medium +- path_or_resource_scarcity: medium +- consensus_or_order_scarcity: high + +### 8. Mixed Or Multi-Perspective + +`intra_frame_mixed` + +The same planning frame contains a data scarcity problem and a governance problem. The missing data is not just unknown information; it reflects contested or unstable reality. + +### 9. Governance Load + +High. The organization needs audit authenticity, evidence discipline, internal truth reporting, and escalation rules when data packaging diverges from operational reality. + +### 10. Misframing Risks + +- tool_solutionism +- violent_reduction +- premature_classification + +### 11. Candidate QPI Judgment + +- classification_scope: subject_contextual +- is_provisional: true +- classification: issue +- dominant_scarcity: consensus_order +- classification_confidence: medium +- recommended_next_step: Mark this as an Issue where evidence traceability and audit authenticity dominate; request owner confirmation before converting it into selector calibration. + +### 12. Owner Review Questions + +- Should this case be used to test QPI's ability to distinguish "missing data" from "untrusted data"? +- Should the recommended next step be evidence audit rather than resource planning? +- Is `data_scarcity: medium` correct, or should it be `low` because the facts are known but politically inconvenient? + +## Case qpi-draft-007: Execution Lead As Translator Of Impossible Commands + +status: draft_owner_review_needed + +source_path: `[redacted external source path: owner-provided organizational CT slice]` + +### 1. Surface Problem + +The surface problem is how middle execution converts high-pressure directives into operational action when the directives conflict with resource limits or compliance reality. + +### 2. Subject Position + +The subject is `execution_lead` as a translator between `decision_maker` demands and implementation reality. This role may possess the best data but limited authority to challenge the premise. + +### 3. Scenario Context + +In the organizational slice, `execution_lead` repeatedly appears as the person who knows operational constraints, signals some risk, and then turns the chosen direction into executable workaround or enforcement. + +### 4. Expectation-Reality Gap + +- Expected: Middle execution should make leadership directives feasible and keep the organization moving. +- Reality: When directives are internally contradictory, execution becomes a conversion layer that may normalize workaround risk, suppress professional resistance, and transfer damage downward. +- Gap summary: Operational competence becomes complicit adaptation when the governance premise is broken. + +### 5. Attempted Paths + +The attempted path is pragmatic translation: identify gaps, propose packaging or enforcement moves, and execute once the top-level decision is fixed. This keeps the system moving but may deepen the underlying Issue. + +### 6. Dynamic Shift + +P -> I. It begins as a Problem of execution under constraints. It becomes an Issue about role ethics, authority boundaries, risk ownership, and the organization's inability to feed bad news upward. + +### 7. Scarcity Profile + +- data_scarcity: low +- path_or_resource_scarcity: medium +- consensus_or_order_scarcity: high + +### 8. Mixed Or Multi-Perspective + +`inter_viewpoint_divergence` + +From `decision_maker`, the execution lead may look effective. From `frontline_staff`, the role may look coercive. From QPI, the same behavior reveals governance scarcity: the system lacks a legitimate channel for refusing impossible commands. + +### 9. Governance Load + +High. The case requires boundary rules for escalation, refusal, risk documentation, and whether implementation roles should be evaluated by compliance with command or by protection of system viability. + +### 10. Misframing Risks + +- violent_reduction +- premature_classification +- single-cause_reduction + +### 11. Candidate QPI Judgment + +- classification_scope: multi_perspective +- is_provisional: true +- classification: issue +- dominant_scarcity: consensus_order +- classification_confidence: medium +- recommended_next_step: Use this case to test whether QPI can identify governance scarcity when a competent executor is converting impossible directives into risky action. + +### 12. Owner Review Questions + +- Should this role-level case be kept, or is it too interpretive without more owner confirmation? +- Is the main risk "complicity in workaround" or "lack of escalation channel"? +- Should this become a calibration sample for `inter_viewpoint_divergence`? + +## Case qpi-draft-008: External Review Pressure Turns Mission Into Indicator Survival + +status: draft_owner_review_needed + +source_path: `[redacted external source path: owner-provided organizational CT slice]` + +### 1. Surface Problem + +The surface problem is how the organization can pass a high-stakes external review while also maintaining its stated mission and internal operating health. + +### 2. Subject Position + +The subject is the whole organization under existential review pressure. `decision_maker`, `planning function`, `execution_lead`, and `frontline_staff` all participate in different roles, but the frame is organization-level survival. + +### 3. Scenario Context + +The slice shows the organization treating the external review milestone as an overriding mission. This pressure reorganizes priorities: indicator appearance, cost control, staffing numbers, and reporting coherence dominate over educational or operational substance. + +### 4. Expectation-Reality Gap + +- Expected: Passing the external milestone should validate organizational development. +- Reality: The effort to pass the milestone may be destroying the real capabilities the milestone is supposed to measure. +- Gap summary: The metric becomes detached from the mission and begins to cannibalize the system it was meant to improve. + +### 5. Attempted Paths + +The organization attempts to optimize indicator packages, staffing optics, facility records, and performance narratives under severe cost constraints. These moves may produce short-term apparent progress while increasing long-term fragility. + +### 6. Dynamic Shift + +Multiple P cases -> system-level I. Individual gaps in facilities, staffing, incentives, and planning appear solvable one by one. Together they form an Issue: a negative reinforcing loop where short-term indicator repair worsens long-term capability. + +### 7. Scarcity Profile + +- data_scarcity: low +- path_or_resource_scarcity: high +- consensus_or_order_scarcity: high + +### 8. Mixed Or Multi-Perspective + +`intra_frame_mixed` + +The same organization has simultaneous path scarcity and governance scarcity. The resource gaps are real, but the deeper issue is that the governing objective is forcing destructive short-term substitutions. + +### 9. Governance Load + +Very high. The case requires deciding how to balance survival pressure, truthful reporting, mission integrity, investment constraints, staff stability, and long-term capability. + +### 10. Misframing Risks + +- violent_reduction +- malicious_inflation +- single-cause_reduction +- premature_classification + +### 11. Candidate QPI Judgment + +- classification_scope: subject_contextual +- is_provisional: true +- classification: issue +- dominant_scarcity: consensus_order +- classification_confidence: medium +- recommended_next_step: Treat this as the umbrella organization-level Issue and use the narrower cases as subcases. Owner should confirm whether this should be a calibration input or only a source-level summary case. + +### 12. Owner Review Questions + +- Should this umbrella case be retained, or should only the narrower pathology cases be promoted later? +- Is "indicator survival cannibalizes mission capability" the correct anonymized abstraction? +- Should this case be linked to future CT diagnosis model work rather than only QPI? diff --git a/reports/model_case_preprocessing/qpi/round-01/year-end-review-employment-entrepreneurship.cases.md b/reports/model_case_preprocessing/qpi/round-01/year-end-review-employment-entrepreneurship.cases.md new file mode 100644 index 0000000..5c1ed42 --- /dev/null +++ b/reports/model_case_preprocessing/qpi/round-01/year-end-review-employment-entrepreneurship.cases.md @@ -0,0 +1,566 @@ +# QPI Case Drafts: Year-End Review Employment Function + +status: draft_owner_review_needed + +source_path: `[redacted external source path: owner-provided organizational CT slice]` + +source_note: Owner-provided raw organizational material. These drafts are anonymized and generalized for QPI review. Real or potentially identifying people, departments, institutions, timestamps, places, titles, exact numbers, and sensitive operational details have been removed or generalized. Ancient-style cognitive anchors from the source are intentionally omitted. These drafts are not selector JSON, regression cases, or owner-approved calibration data. + +anonymization_note: People are represented as roles such as `decision_maker`, `execution_lead`, `employment_function`, `teaching_function`, `finance_function`, and `frontline_staff`. The organization is represented as `the organization`. Sensitive details are generalized as `outcome metric pressure`, `student pipeline`, `employer coordination risk`, `credential metric workaround`, `internal accounting mismatch`, `reverse accountability power`, and `compliance exposure`. + +## Case qpi-draft-001: Outcome Metric Pressure Becomes Reverse Accountability Power + +status: draft_owner_review_needed + +source_path: `[redacted external source path: owner-provided organizational CT slice]` + +### 1. Surface Problem + +The surface problem is that student outcome metrics are under strategic pressure, so the organization wants the `employment_function` to force the `teaching_function` to align programs, courses, and student management with employability results. + +### 2. Subject Position + +The subject is the organization as framed by `decision_maker`. The `employment_function` is being promoted from a service role into a control role. The `teaching_function` and `frontline_staff` become affected parties whose professional authority may be overridden by outcome pressure. + +### 3. Scenario Context + +The case appears in an organizational year-end review under survival-level market pressure. The organization treats employment outcomes as proof that the education product is still viable. The `employment_function` is given stronger leverage over student pipeline design and internal accountability. + +### 4. Expectation-Reality Gap + +- Expected: Giving the `employment_function` stronger authority will force teaching, student management, and employer coordination to converge around real outcomes. +- Reality: A service function gaining veto-like power over teaching may trigger organizational rejection, metric gaming, and professional resistance. +- Gap summary: A coordination problem is escalated into a governance redesign without a stable accountability protocol. + +### 5. Attempted Paths + +The apparent path is to let outcome pressure override existing departmental boundaries. Instead of negotiating a shared teaching-employment mechanism, the organization tries to install `reverse accountability power` from the employment side toward the teaching side. + +### 6. Dynamic Shift + +P -> I. It begins as a Problem about improving student outcomes and employer alignment. It becomes an Issue because the proposed path changes authority boundaries, professional legitimacy, incentive structures, and the meaning of educational quality. + +### 7. Scarcity Profile + +- data_scarcity: medium +- path_or_resource_scarcity: high +- consensus_or_order_scarcity: high + +### 8. Mixed Or Multi-Perspective + +`intra_frame_mixed` + +For the same organization in the same year-end review, there is both a path problem and an order problem. The organization lacks a reliable implementation path, and the proposed authority inversion changes the internal order. + +### 9. Governance Load + +High. The case requires ongoing tradeoff among student outcomes, teaching authority, employer promises, accountability design, professional boundaries, and resistance management. + +### 10. Misframing Risks + +- violent_reduction +- malicious_inflation +- premature_classification +- single-cause_reduction + +### 11. Candidate QPI Judgment + +- classification_scope: subject_contextual +- is_provisional: true +- classification: mixed +- dominant_scarcity: consensus_order +- classification_confidence: medium +- recommended_next_step: Treat this as a P/I mixed case. Separate the operational question of how to improve outcomes from the governance question of who may legitimately evaluate and direct teaching work. + +### 12. Owner Review Questions + +- Should this case be treated primarily as `issue`, or as `mixed` because there remains a concrete process design problem? +- Does `reverse accountability power` capture the source pathology without exposing sensitive organizational details? +- Should this become a selector calibration trap for cases where a hard metric hides authority redesign? + +## Case qpi-draft-002: Credential Metric Repair Becomes Compliance Exposure + +status: draft_owner_review_needed + +source_path: `[redacted external source path: owner-provided organizational CT slice]` + +### 1. Surface Problem + +The surface problem is that the organization needs to improve a credential-related metric for external evaluation or institutional positioning. + +### 2. Subject Position + +The subject is the organization under `decision_maker` pressure. The `employment_function` and adjacent functions are treated as tools for closing a metric gap rather than as owners of educational substance. + +### 3. Scenario Context + +The case appears in a review where staffing credentials, external labels, and compliance indicators are discussed as survival assets. The organization considers shortcuts that may satisfy a formal count while bypassing the substantive purpose behind the metric. + +### 4. Expectation-Reality Gap + +- Expected: Acquiring or associating with credentialed personnel can quickly repair a visible compliance gap. +- Reality: If credentialed personnel are not substantively integrated into teaching, research, or student development, the metric becomes a fragile shell and may produce serious audit risk. +- Gap summary: A hard compliance metric is being solved through an externalized workaround rather than real capability building. + +### 5. Attempted Paths + +The apparent path is to source credentialed people or labels cheaply and quickly, treating them as indicator products. This may improve a table in the short term but does not create real capacity. + +### 6. Dynamic Shift + +Q/P -> I. It can begin as a Question about what the credential requirement is, then a Problem about how to close the gap. It becomes an Issue when the chosen path normalizes `credential metric workaround` and creates institutional legitimacy risk. + +### 7. Scarcity Profile + +- data_scarcity: medium +- path_or_resource_scarcity: high +- consensus_or_order_scarcity: high + +### 8. Mixed Or Multi-Perspective + +`intra_frame_mixed` + +The same subject faces a real resource/path scarcity and a governance scarcity. The metric gap is concrete, but the shortcut path changes the organization's compliance posture. + +### 9. Governance Load + +High. The case requires managing external audit exposure, internal incentive distortion, authentic capability building, and the boundary between legitimate remediation and indicator fabrication. + +### 10. Misframing Risks + +- violent_reduction +- tool_solutionism +- premature_classification +- single-cause_reduction + +### 11. Candidate QPI Judgment + +- classification_scope: subject_contextual +- is_provisional: true +- classification: mixed +- dominant_scarcity: consensus_order +- classification_confidence: medium +- recommended_next_step: Identify which credential gaps are substantive capability gaps and which proposed repairs are compliance exposure. Do not classify the case as a simple procurement or staffing problem. + +### 12. Owner Review Questions + +- Should this case be marked as a high-risk `issue` rather than `mixed`? +- Are the generalized terms `credential metric workaround` and `compliance exposure` sufficiently anonymized? +- Should future calibration require QPI to ask for evidence of substantive integration before accepting metric repair as a valid path? + +## Case qpi-draft-003: Internal Accounting Mismatch Inflates Functional Performance + +status: draft_owner_review_needed + +source_path: `[redacted external source path: owner-provided organizational CT slice]` + +### 1. Surface Problem + +The surface problem is that the `employment_function` reports strong non-core revenue or contribution results, but the underlying calculation standard may not match the organization's financial recognition standard. + +### 2. Subject Position + +The subject is the organization and its `finance_function`, with the `employment_function` trying to demonstrate value under survival pressure. The reviewer must distinguish reported functional achievement from actual cash or recognized organizational value. + +### 3. Scenario Context + +The case appears in a year-end performance narrative where functional units are encouraged to prove they are not only cost centers. Reported contribution is used to justify strategic importance and expanded authority. + +### 4. Expectation-Reality Gap + +- Expected: The reported revenue-like figure proves the function has independent value and can become a strategic growth node. +- Reality: The reported number may be based on internal conversion logic, incomplete collection, or non-standard recognition, so it may overstate the actual financial contribution. +- Gap summary: Functional performance is inflated by an `internal accounting mismatch`. + +### 5. Attempted Paths + +The apparent path is to use a department-level calculation standard to claim organizational contribution. This can make the function look more productive while leaving `finance_function` recognition unresolved. + +### 6. Dynamic Shift + +Q -> P/I. It may start as a Question about which number is correct. It becomes a Problem if the organization needs a unified accounting standard. It becomes an Issue when inflated performance numbers are used to justify power expansion or strategic decisions. + +### 7. Scarcity Profile + +- data_scarcity: high +- path_or_resource_scarcity: medium +- consensus_or_order_scarcity: high + +### 8. Mixed Or Multi-Perspective + +`intra_frame_mixed` + +The same subject lacks reliable recognized data and also lacks a shared order for what counts as contribution. The data gap and governance gap reinforce each other. + +### 9. Governance Load + +High. The case requires financial standard alignment, credibility management, performance evaluation fairness, and prevention of strategic decisions based on inflated internal claims. + +### 10. Misframing Risks + +- violent_reduction +- malicious_inflation +- premature_classification +- single-cause_reduction + +### 11. Candidate QPI Judgment + +- classification_scope: subject_contextual +- is_provisional: true +- classification: mixed +- dominant_scarcity: data +- classification_confidence: medium +- recommended_next_step: First reconcile recognized financial data, then separately evaluate whether the function's claimed strategic importance is justified. + +### 12. Owner Review Questions + +- Should `dominant_scarcity` be `data` because the accounting basis is unclear, or `consensus_order` because the deeper risk is performance legitimacy? +- Should this case be used to test QPI's ability to avoid accepting reported metrics at face value? +- Does the anonymized phrasing remove enough source specificity? + +## Case qpi-draft-004: Outcome Promise Creates Student Pipeline Distortion + +status: draft_owner_review_needed + +source_path: `[redacted external source path: owner-provided organizational CT slice]` + +### 1. Surface Problem + +The surface problem is that the organization wants stronger student recruitment and retention by promising clearer employment outcomes. + +### 2. Subject Position + +The subject is the organization under market pressure. `decision_maker` frames student outcomes as a survival proof, while `employment_function`, `student_pipeline`, and `teaching_function` become instruments for making the promise credible. + +### 3. Scenario Context + +The case appears where education value, employment outcomes, pricing pressure, and recruitment narrative are tightly coupled. The organization may use outcome promises to compensate for weak perceived educational value. + +### 4. Expectation-Reality Gap + +- Expected: A stronger employment promise will make the education product easier to sell and will force internal functions to become more market-oriented. +- Reality: If the organization lacks real capability to deliver the promise, the student pipeline may become distorted by overpromising, data pressure, and downstream trust loss. +- Gap summary: A market-facing promise is used before the delivery system is stable. + +### 5. Attempted Paths + +The apparent path is to put employment outcomes into the center of recruitment and program design. This can be valid if backed by real capability, but dangerous if used as a substitute for capability. + +### 6. Dynamic Shift + +P -> I. It starts as a Problem about how to improve recruitment value and student outcomes. It becomes an Issue when the promise affects institutional identity, teaching incentives, student trust, and long-term brand legitimacy. + +### 7. Scarcity Profile + +- data_scarcity: medium +- path_or_resource_scarcity: high +- consensus_or_order_scarcity: high + +### 8. Mixed Or Multi-Perspective + +`intra_frame_mixed` + +Within the same organizational frame, there is a delivery path scarcity and a governance scarcity. The promise cannot be evaluated only as a marketing tactic. + +### 9. Governance Load + +High. The case requires balancing recruitment pressure, student expectations, employer coordination risk, teaching capability, outcome proof, and long-term trust. + +### 10. Misframing Risks + +- violent_reduction +- malicious_inflation +- tool_solutionism +- premature_classification + +### 11. Candidate QPI Judgment + +- classification_scope: subject_contextual +- is_provisional: true +- classification: mixed +- dominant_scarcity: consensus_order +- classification_confidence: medium +- recommended_next_step: Require evidence that the promised outcome can be delivered before treating the issue as a recruitment or messaging problem. + +### 12. Owner Review Questions + +- Should this be a separate case, or merged with the reverse accountability case? +- Does the source imply a stronger `issue` judgment because the student promise changes institutional identity? +- What context would be needed to distinguish legitimate outcome orientation from overpromising? + +## Case qpi-draft-005: High Outcome Data Masks Data Quality Risk + +status: draft_owner_review_needed + +source_path: `[redacted external source path: owner-provided organizational CT slice]` + +### 1. Surface Problem + +The surface problem is that the organization has strong student outcome data and wants to use it as proof of institutional health. + +### 2. Subject Position + +The subject is the organization as evaluated by `decision_maker` and external stakeholders. `employment_function` is the data-producing function, while students, employers, and teaching units become the systems from which the data is extracted. + +### 3. Scenario Context + +The case appears in a review where outcome metrics are used as regulatory, recruitment, and internal performance evidence. The same metric may carry multiple political meanings. + +### 4. Expectation-Reality Gap + +- Expected: Strong outcome data demonstrates real education-market fit and functional performance. +- Reality: If the data is produced under administrative pressure, it may contain hidden coercion, weak verification, or short-term compliance behavior. +- Gap summary: A green dashboard may hide `data quality risk` and behavioral distortion. + +### 5. Attempted Paths + +The apparent path is to celebrate the outcome metric and expand the mechanisms that produced it. The source warns that high-pressure mechanisms can make the data less trustworthy over time. + +### 6. Dynamic Shift + +Q/P -> I. It begins as a Question about whether the data is accurate and a Problem about how to maintain outcomes. It becomes an Issue when incentives push actors toward data production rather than substantive student value. + +### 7. Scarcity Profile + +- data_scarcity: high +- path_or_resource_scarcity: medium +- consensus_or_order_scarcity: high + +### 8. Mixed Or Multi-Perspective + +`intra_frame_mixed` + +The same organization has both a data verification problem and an incentive-order problem. The metric cannot be trusted without understanding how it is produced. + +### 9. Governance Load + +High. The case requires audit design, anti-gaming controls, student trust protection, employer verification, and separation of real outcomes from administrative compliance. + +### 10. Misframing Risks + +- violent_reduction +- malicious_inflation +- premature_classification +- single-cause_reduction + +### 11. Candidate QPI Judgment + +- classification_scope: subject_contextual +- is_provisional: true +- classification: mixed +- dominant_scarcity: data +- classification_confidence: medium +- recommended_next_step: Verify the production mechanism behind the outcome data before using it as evidence of institutional health or as a basis for stronger internal pressure. + +### 12. Owner Review Questions + +- Should this case require QPI to output an explicit `evidence_gap` around data production? +- Is this primarily a data scarcity case or an incentive governance case? +- Should future calibration distinguish high metric value from high metric credibility? + +## Case qpi-draft-006: Employer Coordination Asset Remains Isolated From Teaching + +status: draft_owner_review_needed + +source_path: `[redacted external source path: owner-provided organizational CT slice]` + +### 1. Surface Problem + +The surface problem is that the organization has an employer-linked asset or project, but it is not clearly integrated into the student learning and program design pipeline. + +### 2. Subject Position + +The subject is the organization trying to convert external cooperation into educational capability. The `employment_function` owns or coordinates the external relation, while the `teaching_function` must make it meaningful for students. + +### 3. Scenario Context + +The case appears in a year-end review where external partnership, project funding, and practical training are presented as achievements. The concern is whether these assets are isolated showcases or connected to the core learning system. + +### 4. Expectation-Reality Gap + +- Expected: Employer coordination will become a real capability asset and improve student outcomes. +- Reality: Without integration into curriculum, teaching plans, student projects, and assessment, the asset remains a detached showcase. +- Gap summary: A real external asset exists, but the integration path is incomplete. + +### 5. Attempted Paths + +The apparent path is to list the external asset as proof of employment-oriented education. The missing path is the operational bridge from asset to student capability development. + +### 6. Dynamic Shift + +P. It is mainly a Problem because the asset appears real and the key gap is an integration path. It may become an Issue if authority conflict between functions blocks integration. + +### 7. Scarcity Profile + +- data_scarcity: medium +- path_or_resource_scarcity: high +- consensus_or_order_scarcity: medium + +### 8. Mixed Or Multi-Perspective + +`not_mixed` + +The primary scarcity is path/resource scarcity: how to connect employer assets to teaching and student capability. Governance risk exists, but it is not necessarily dominant unless internal authority conflict blocks integration. + +### 9. Governance Load + +Medium. The case requires coordination between functions, but the source suggests the asset itself may be healthy if connected to the learning system. + +### 10. Misframing Risks + +- tool_solutionism +- premature_classification + +### 11. Candidate QPI Judgment + +- classification_scope: subject_contextual +- is_provisional: true +- classification: problem +- dominant_scarcity: path_resource +- classification_confidence: medium +- recommended_next_step: Ask for the operational bridge from employer asset to curriculum, student project, assessment, and outcome verification. + +### 12. Owner Review Questions + +- Should this case remain `problem`, or should it become `mixed` because cross-function integration may trigger authority conflict? +- Is it useful as a positive contrast case where QPI should not over-escalate to Issue? +- What minimum evidence would prove that the employer asset is truly integrated? + +## Case qpi-draft-007: Functional Performance Gains Justify Power Expansion Too Quickly + +status: draft_owner_review_needed + +source_path: `[redacted external source path: owner-provided organizational CT slice]` + +### 1. Surface Problem + +The surface problem is that a function shows strong visible performance and is therefore granted a larger strategic role. + +### 2. Subject Position + +The subject is the organization under `decision_maker` authority. The `employment_function` becomes the favored vehicle for survival reform, while adjacent functions may lose authority without a full institutional design. + +### 3. Scenario Context + +The case appears in a crisis-driven review. Because the organization distrusts slower legacy systems, a function that appears closer to market outcomes is elevated rapidly. + +### 4. Expectation-Reality Gap + +- Expected: Elevating a high-performing function will break through inertia and force the system to become outcome-oriented. +- Reality: Fast power expansion can exceed the function's professional mandate, create backlash, and turn functional achievement into organizational overreach. +- Gap summary: Performance evidence is used to justify authority expansion before governance boundaries are settled. + +### 5. Attempted Paths + +The apparent path is crisis-driven centralization around the function that seems closest to survival metrics. This may solve inertia but can create a new internal imbalance. + +### 6. Dynamic Shift + +P -> I. It starts as a Problem about overcoming departmental walls and implementation paralysis. It becomes an Issue when the solution redistributes authority, changes evaluation rights, and creates legitimacy conflict. + +### 7. Scarcity Profile + +- data_scarcity: medium +- path_or_resource_scarcity: high +- consensus_or_order_scarcity: high + +### 8. Mixed Or Multi-Perspective + +`intra_frame_mixed` + +The same organization lacks an implementation path and a legitimate authority design. The visible performance gain does not resolve governance scarcity. + +### 9. Governance Load + +High. The case requires designing authority scope, checks and balances, conflict resolution, data credibility, and whether the favored function can bear the role assigned to it. + +### 10. Misframing Risks + +- malicious_inflation +- violent_reduction +- premature_classification + +### 11. Candidate QPI Judgment + +- classification_scope: subject_contextual +- is_provisional: true +- classification: mixed +- dominant_scarcity: consensus_order +- classification_confidence: medium +- recommended_next_step: Do not infer from functional performance that the function should own system-wide authority. Define scope, checks, and evidence standards before expanding control. + +### 12. Owner Review Questions + +- Should this case be merged with Case 001, or kept separate as a general power-expansion pattern? +- Does `malicious_inflation` apply, or is this better described as crisis-driven overextension? +- Should QPI distinguish "asset recognition" from "authority transfer" as a recurring pattern? + +## Case qpi-draft-008: Survival Strategy Reframes Education As Transactional Output + +status: draft_owner_review_needed + +source_path: `[redacted external source path: owner-provided organizational CT slice]` + +### 1. Surface Problem + +The surface problem is that the organization needs a survival strategy in a hostile market and therefore shifts education toward employment, pricing, and measurable output. + +### 2. Subject Position + +The subject is the organization at the strategic level. `decision_maker` frames survival as the primary objective, while students, teaching units, employers, and compliance systems become parts of a transactional survival machine. + +### 3. Scenario Context + +The case appears in a diagnostic slice where student outcome pressure, pricing pressure, compliance indicators, and internal authority redesign converge. The organization may be moving from an education identity toward a transactional output identity. + +### 4. Expectation-Reality Gap + +- Expected: A more transactional, outcome-centered model will help the organization survive market pressure. +- Reality: If the model hollows out teaching substance and relies on metrics, shortcuts, and pressure transfer, it may destroy the very legitimacy needed for long-term survival. +- Gap summary: A survival adaptation risks becoming a self-defeating identity shift. + +### 5. Attempted Paths + +The apparent path is to align the organization around measurable survival outputs: student outcomes, employer linkage, lower-cost delivery, compliance metrics, and function-led accountability. The path may solve short-term pressure while worsening long-term capability. + +### 6. Dynamic Shift + +I. This is not a simple Question or Problem. It concerns strategic identity, institutional legitimacy, value definition, incentive design, and long-term governance. + +### 7. Scarcity Profile + +- data_scarcity: medium +- path_or_resource_scarcity: high +- consensus_or_order_scarcity: high + +### 8. Mixed Or Multi-Perspective + +`intra_frame_mixed` + +There are concrete path/resource scarcities, but the dominant problem is order scarcity: what kind of organization it is becoming, what success means, and which tradeoffs are acceptable. + +### 9. Governance Load + +Very high. The case requires continuous governance of identity, incentives, compliance boundaries, stakeholder trust, student value, and whether short-term survival tactics poison long-term viability. + +### 10. Misframing Risks + +- violent_reduction +- malicious_inflation +- premature_classification +- single-cause_reduction + +### 11. Candidate QPI Judgment + +- classification_scope: subject_contextual +- is_provisional: true +- classification: issue +- dominant_scarcity: consensus_order +- classification_confidence: medium +- recommended_next_step: Treat this as an Issue-level strategic governance case. Identify which survival tactics are reversible experiments and which would permanently alter institutional identity and trust. + +### 12. Owner Review Questions + +- Is this case too broad for calibration, or useful as an Issue anchor? +- Should it be decomposed into several narrower P/I mixed cases? +- What owner-approved wording should be used for the anonymized identity-shift risk? diff --git a/reports/model_case_preprocessing/qpi/round-01/year-end-review-engineering-center.cases.md b/reports/model_case_preprocessing/qpi/round-01/year-end-review-engineering-center.cases.md new file mode 100644 index 0000000..b7f663b --- /dev/null +++ b/reports/model_case_preprocessing/qpi/round-01/year-end-review-engineering-center.cases.md @@ -0,0 +1,552 @@ +# QPI Case Drafts: Year-End Review Technical Function + +status: draft_owner_review_needed + +source_path: `` + +anonymization_note: Real names, ancient-style cognitive-anchor names, organization names, places, timestamps, titles, exact figures, and sensitive operational details have been generalized. This draft preserves only the QPI-relevant structure of the organizational pathology. + +## Case qpi-draft-eng-001: Strategic Target Exceeds Operating Reality + +status: draft_owner_review_needed + +source_path: `` + +### 1. Surface Problem + +A technical_function is asked to move from routine support work into a major revenue-generating or industrialized role. + +### 2. Subject Position + +The framing subject is an organization observer diagnosing the gap between decision_maker ambition and execution_lead capacity. The execution_lead is responsible for delivery but does not control the target, resource allocation, or strategic definition. + +### 3. Scenario Context + +The case appears in a year-end organizational review where a support-oriented technical_function is being evaluated against an expansion mandate that greatly exceeds its current validated output. + +### 4. Expectation-Reality Gap + +- Expected: The technical_function should rapidly become a meaningful industrialization or revenue unit. +- Reality: Existing output, skills, channels, and validated market capacity remain close to a support-function baseline. +- Gap summary: A strategic growth target is imposed without a believable bridge from current capability to target state. + +### 5. Attempted Paths + +The organization has pointed to existing small wins, available staff, possible equipment purchases, and leadership attention as proof that the target can be pursued. + +### 6. Dynamic Shift + +The surface frame starts as a Problem: how to grow output. It shifts into an Issue because the target itself may distort reporting, procurement, project creation, and compliance behavior. + +### 7. Scarcity Profile + +- data_scarcity: medium +- path_or_resource_scarcity: high +- consensus_or_order_scarcity: high + +### 8. Mixed Or Multi-Perspective + +`intra_frame_mixed` + +The same technical_function faces a path/resource gap and an order/governance gap at the same time. The issue is not only how to execute, but whether the imposed target creates unhealthy organizational incentives. + +### 9. Governance Load + +High. The case requires ongoing target governance, metric authenticity checks, procurement restraint, and role-boundary management between strategic ambition and operational reality. + +### 10. Misframing Risks + +- violent_reduction +- malicious_inflation +- tool_solutionism +- premature_classification + +### 11. Candidate QPI Judgment + +- classification_scope: subject_contextual +- is_provisional: true +- classification: mixed +- dominant_scarcity: consensus_order +- classification_confidence: medium +- recommended_next_step: Reframe the target as a staged capability-and-market validation problem before accepting it as an execution target. + +### 12. Owner Review Questions + +- Should this case be judged as `issue` rather than `mixed` because the dominant risk is target governance? +- Should the target-authenticity problem become a reusable QPI calibration pattern? + +## Case qpi-draft-eng-002: Equipment-Led Solutionism Without Market Closure + +status: draft_owner_review_needed + +source_path: `` + +### 1. Surface Problem + +The organization considers buying advanced equipment or creating a high-end production capability. + +### 2. Subject Position + +The decision_maker frames equipment as the enabling condition. The execution_lead frames orders, skills, and operating standards as prior conditions. The observer evaluates the mismatch. + +### 3. Scenario Context + +The technical_function is under pressure to move into higher-value activity while still lacking proven market demand, trained operators, and delivery quality controls. + +### 4. Expectation-Reality Gap + +- Expected: Assets and credentials will create capability, credibility, and future work. +- Reality: The organization lacks confirmed demand, operator competence, and a reliable execution path. +- Gap summary: The proposed solution may add fixed assets before the organization has solved the market and operating model. + +### 5. Attempted Paths + +The decision_maker pushes for asset-first expansion. The execution_lead suggests smaller tests or waiting for confirmed demand before committing to equipment and staffing. + +### 6. Dynamic Shift + +The issue starts as a Problem of sequencing investment. It shifts into Issue when equipment purchase becomes a governance decision that can lock in sunk cost, safety exposure, and reporting pressure. + +### 7. Scarcity Profile + +- data_scarcity: medium +- path_or_resource_scarcity: high +- consensus_or_order_scarcity: high + +### 8. Mixed Or Multi-Perspective + +`intra_frame_mixed` + +The same scene combines missing demand evidence, missing execution capability, and a conflict over investment logic. + +### 9. Governance Load + +High. The case requires procurement gates, demand validation, safety boundaries, and a rule for when asset commitments are allowed. + +### 10. Misframing Risks + +- tool_solutionism +- violent_reduction +- malicious_inflation + +### 11. Candidate QPI Judgment + +- classification_scope: subject_contextual +- is_provisional: false +- classification: mixed +- dominant_scarcity: consensus_order +- classification_confidence: medium +- recommended_next_step: Require demand proof, operator readiness, and safety validation before asset purchase. + +### 12. Owner Review Questions + +- Is `tool_solutionism` the primary misframing risk here? +- Should QPI recommend a hard no-go gate when demand and operator readiness are both absent? + +## Case qpi-draft-eng-003: Compliance Shortcut Becomes Structural Constraint + +status: draft_owner_review_needed + +source_path: `` + +### 1. Surface Problem + +The technical_function needs enough qualified staff to satisfy operational and regulatory expectations. + +### 2. Subject Position + +The execution_lead must deliver staffing coverage. Compliance_authority constrains shortcuts. The decision_maker wants low-cost continuity and expansion. + +### 3. Scenario Context + +A previous low-cost staffing workaround is no longer viable after external or internal compliance pressure. The organization must now meet formal qualification requirements. + +### 4. Expectation-Reality Gap + +- Expected: Staffing gaps can be patched through flexible internal substitution. +- Reality: Compliance boundaries now block the shortcut and force higher-cost, more formal staffing. +- Gap summary: A once-tolerated operating hack has become a structural constraint. + +### 5. Attempted Paths + +The organization previously relied on substitute staffing. Compliance pressure forced a correction, but the expansion target still assumes cheap and flexible labor. + +### 6. Dynamic Shift + +The surface Problem is filling roles. It shifts to Issue because the organization must reconcile cost control, regulatory legitimacy, and expansion demands. + +### 7. Scarcity Profile + +- data_scarcity: low +- path_or_resource_scarcity: high +- consensus_or_order_scarcity: high + +### 8. Mixed Or Multi-Perspective + +`intra_frame_mixed` + +The same staffing problem contains a resource gap and an order gap: the old path is blocked not by logistics alone, but by legitimacy and compliance. + +### 9. Governance Load + +High. The organization needs stable staffing policy, compliance review, budget realism, and authority alignment. + +### 10. Misframing Risks + +- violent_reduction +- single-cause_reduction +- premature_classification + +### 11. Candidate QPI Judgment + +- classification_scope: subject_contextual +- is_provisional: false +- classification: issue +- dominant_scarcity: consensus_order +- classification_confidence: medium +- recommended_next_step: Treat staffing as a compliance-governance constraint, not as a simple headcount patch. + +### 12. Owner Review Questions + +- Should this be a canonical example of `issue` caused by compliance boundary hardening? +- Should QPI require a separate compliance-risk field for cases like this? + +## Case qpi-draft-eng-004: Credential Integrity Treated As Mere Usability + +status: draft_owner_review_needed + +source_path: `` + +### 1. Surface Problem + +The organization discovers a credential or background-check inconsistency in a person it still wants to use. + +### 2. Subject Position + +The decision_maker prioritizes immediate usability. Risk_control or compliance logic is underweighted. The observer frames the event as a governance signal. + +### 3. Scenario Context + +The technical_function is under staffing pressure, making it tempting to treat credential anomalies as a tolerable exception rather than a system-level warning. + +### 4. Expectation-Reality Gap + +- Expected: If someone can perform a near-term task, they can remain useful. +- Reality: Credential integrity problems can expose the organization to trust, compliance, and future audit failures. +- Gap summary: A short-term staffing solution masks a control-system failure. + +### 5. Attempted Paths + +The organization appears inclined to keep using the person if operationally convenient, instead of treating the case as a control breach requiring remediation. + +### 6. Dynamic Shift + +The surface frame is a Question or Problem: can this person be used? It shifts to Issue because the answer affects organizational trust, screening policy, and risk tolerance. + +### 7. Scarcity Profile + +- data_scarcity: medium +- path_or_resource_scarcity: medium +- consensus_or_order_scarcity: high + +### 8. Mixed Or Multi-Perspective + +`intra_frame_mixed` + +The same decision mixes evidence uncertainty, staffing pressure, and governance-order risk. + +### 9. Governance Load + +High. The case requires a durable rule for credential verification, exception handling, and risk ownership. + +### 10. Misframing Risks + +- violent_reduction +- single-cause_reduction +- premature_classification + +### 11. Candidate QPI Judgment + +- classification_scope: subject_contextual +- is_provisional: true +- classification: issue +- dominant_scarcity: consensus_order +- classification_confidence: medium +- recommended_next_step: Convert the incident into a screening and exception-policy review before making a convenience-based staffing decision. + +### 12. Owner Review Questions + +- Should this case be linked to QPI's no-call boundary against making specific personnel judgments? +- Is the key QPI lesson about evidence integrity, compliance order, or both? + +## Case qpi-draft-eng-005: Production Capability Without Acquisition Channel + +status: draft_owner_review_needed + +source_path: `` + +### 1. Surface Problem + +The technical_function may be able to perform some work but does not know where demand or orders will come from. + +### 2. Subject Position + +The execution_lead recognizes a business-closure gap. The decision_maker may assume production capability is enough to create business. + +### 3. Scenario Context + +The organization is trying to convert a support unit into a business unit without an established market channel or customer-acquisition function. + +### 4. Expectation-Reality Gap + +- Expected: If production capability exists, business can be generated. +- Reality: The unit lacks a reliable path from capability to paying demand. +- Gap summary: The business loop is incomplete at the demand-source stage. + +### 5. Attempted Paths + +The organization has discussed possible work types and capabilities, but no validated customer acquisition mechanism appears to exist. + +### 6. Dynamic Shift + +This begins as a Question: where do orders come from? It becomes a Problem when a sales or partnership path must be designed. It may become Issue if decision_maker pressure ignores the missing channel. + +### 7. Scarcity Profile + +- data_scarcity: high +- path_or_resource_scarcity: high +- consensus_or_order_scarcity: medium + +### 8. Mixed Or Multi-Perspective + +`intra_frame_mixed` + +The same surface problem contains both missing market information and missing operating path. + +### 9. Governance Load + +Medium. Governance load rises if the organization continues to impose revenue targets without validating demand sources. + +### 10. Misframing Risks + +- premature_classification +- tool_solutionism +- malicious_inflation + +### 11. Candidate QPI Judgment + +- classification_scope: subject_contextual +- is_provisional: true +- classification: mixed +- dominant_scarcity: data +- classification_confidence: medium +- recommended_next_step: Validate demand source and acquisition channel before committing to revenue targets or equipment expansion. + +### 12. Owner Review Questions + +- Should this be classified as `question` first because the missing demand source blocks all later action? +- What minimal evidence would move this from Q to P? + +## Case qpi-draft-eng-006: Micro-Intervention Creates Execution Fatigue + +status: draft_owner_review_needed + +source_path: `` + +### 1. Surface Problem + +The execution_lead becomes fatigued when decision flow is slow, intrusive, or repeatedly overridden. + +### 2. Subject Position + +The execution_lead is responsible for delivery but lacks stable decision space. The decision_maker holds authority and frequently intervenes in operational detail. + +### 3. Scenario Context + +A technical_function is under expansion pressure while leadership attention alternates between strategic target-setting and tactical detail control. + +### 4. Expectation-Reality Gap + +- Expected: Direct leadership attention should accelerate progress. +- Reality: Micro-intervention can reduce ownership, create waiting behavior, and exhaust execution energy. +- Gap summary: Authority intended as support becomes a bottleneck and demotivating force. + +### 5. Attempted Paths + +The execution_lead appears to defer to decision_maker instructions and minimize independent commitment when details are repeatedly overridden. + +### 6. Dynamic Shift + +The surface problem appears to be execution attitude or morale. It shifts into Issue because decision rights, trust, and role boundaries are unstable. + +### 7. Scarcity Profile + +- data_scarcity: medium +- path_or_resource_scarcity: medium +- consensus_or_order_scarcity: high + +### 8. Mixed Or Multi-Perspective + +`intra_frame_mixed` + +The same situation contains a path problem and an authority-order problem. Execution cannot stabilize until decision rights are clarified. + +### 9. Governance Load + +High. The organization needs explicit decision lanes, escalation rules, and protection of execution ownership. + +### 10. Misframing Risks + +- violent_reduction +- single-cause_reduction +- premature_classification + +### 11. Candidate QPI Judgment + +- classification_scope: subject_contextual +- is_provisional: true +- classification: issue +- dominant_scarcity: consensus_order +- classification_confidence: medium +- recommended_next_step: Diagnose decision-rights architecture before blaming execution motivation. + +### 12. Owner Review Questions + +- Should this case be used as a violent-reduction example: "people are unmotivated" masking authority-design failure? +- What evidence would distinguish healthy hands-on leadership from destructive micro-control? + +## Case qpi-draft-eng-007: Inherited Project May Be Hidden Liability + +status: draft_owner_review_needed + +source_path: `` + +### 1. Surface Problem + +A certification or platform project is transferred to a weaker receiving function after a stronger function declines or disengages. + +### 2. Subject Position + +The receiving technical_function may frame the project as an opportunity. The observer frames the transfer as a possible adverse-selection signal. + +### 3. Scenario Context + +The organization treats an inherited project as a strategic asset, but the transfer history suggests possible hidden maintenance cost, low yield, or execution burden. + +### 4. Expectation-Reality Gap + +- Expected: The project provides scarce qualification, status, or future income. +- Reality: The project may have been avoided by stronger actors because costs, workload, or risk exceed benefits. +- Gap summary: The asset label may hide a liability profile. + +### 5. Attempted Paths + +The organization celebrates or absorbs the project without first validating why the previous owner declined it and whether the receiver has capacity. + +### 6. Dynamic Shift + +The case starts as a Question: why was this project transferred? It becomes a Problem if cost-benefit analysis is needed. It becomes Issue if internal incentives push weaker units to absorb discarded burdens. + +### 7. Scarcity Profile + +- data_scarcity: high +- path_or_resource_scarcity: medium +- consensus_or_order_scarcity: medium + +### 8. Mixed Or Multi-Perspective + +`intra_frame_mixed` + +The receiver's opportunity frame and the observer's risk frame diverge inside the same organizational context. + +### 9. Governance Load + +Medium. The organization needs transfer due diligence, cost accounting, and responsibility boundaries. + +### 10. Misframing Risks + +- premature_classification +- malicious_inflation +- single-cause_reduction + +### 11. Candidate QPI Judgment + +- classification_scope: subject_contextual +- is_provisional: true +- classification: mixed +- dominant_scarcity: data +- classification_confidence: medium +- recommended_next_step: Investigate transfer history, operating cost, and realistic value before treating the project as a confirmed asset. + +### 12. Owner Review Questions + +- Should this be a QPI calibration sample for "asset or liability" ambiguity? +- Is the main lesson adverse selection, missing data, or organizational dumping? + +## Case qpi-draft-eng-008: Personnel Redeployment Without Legitimate Path + +status: draft_owner_review_needed + +source_path: `` + +### 1. Surface Problem + +Existing staff may not fit the new technical direction, and leadership wants to move them elsewhere. + +### 2. Subject Position + +The decision_maker frames redeployment as a management lever. The execution_lead and affected staff face operational and legal constraints. Compliance logic limits informal movement. + +### 3. Scenario Context + +The technical_function is under pressure to upgrade capability while carrying legacy staffing constraints. + +### 4. Expectation-Reality Gap + +- Expected: Existing personnel can be moved aside and replaced with more suitable staff. +- Reality: Redeployment requires lawful, budgeted, and institutionally accepted paths that may not exist. +- Gap summary: A personnel optimization idea lacks a legitimate execution route. + +### 5. Attempted Paths + +The organization discusses moving existing staff out and bringing in higher-capability staff, but no clear legal, financial, or relational path is established. + +### 6. Dynamic Shift + +The surface frame is a Problem: how to upgrade the team. It shifts to Issue because human consequences, compliance boundaries, budget, and organizational trust are intertwined. + +### 7. Scarcity Profile + +- data_scarcity: medium +- path_or_resource_scarcity: high +- consensus_or_order_scarcity: high + +### 8. Mixed Or Multi-Perspective + +`intra_frame_mixed` + +The same staffing challenge contains path scarcity and order scarcity. There may be no acceptable route without redesigning policy and incentives. + +### 9. Governance Load + +High. The case requires legal review, budget planning, role transition design, and authority alignment. + +### 10. Misframing Risks + +- violent_reduction +- single-cause_reduction +- premature_classification + +### 11. Candidate QPI Judgment + +- classification_scope: subject_contextual +- is_provisional: true +- classification: issue +- dominant_scarcity: consensus_order +- classification_confidence: medium +- recommended_next_step: Define lawful redeployment and hiring boundaries before treating staff mismatch as an execution-only problem. + +### 12. Owner Review Questions + +- Should this case be merged with the compliance staffing case or kept separate as a personnel-transition governance case? +- What minimum context is needed to avoid overclaiming legal or labor-risk conclusions? diff --git a/reports/model_case_preprocessing/qpi/round-01/year-end-review-international-college.cases.md b/reports/model_case_preprocessing/qpi/round-01/year-end-review-international-college.cases.md new file mode 100644 index 0000000..be78b65 --- /dev/null +++ b/reports/model_case_preprocessing/qpi/round-01/year-end-review-international-college.cases.md @@ -0,0 +1,561 @@ +# QPI Case Drafts: Year-End Review, Cross-Border Education Function + +status: draft_owner_review_needed + +source_path: `[redacted owner-provided raw source path: organization CT slice]` + +anonymization_note: Real names, ancient-style cognitive-anchor names, organization names, places, timestamps, titles, exact numbers, and sensitive operational details have been generalized. These drafts are for owner review only and must not be promoted to JSON, selector calibration, or regression assets before owner confirmation. + +## Case qpi-draft-intl-001: Compliance Risk Packaged As Enrollment Retention + +status: draft_owner_review_needed + +source_path: `[redacted owner-provided raw source path: organization CT slice]` + +### 1. Surface Problem + +The surface issue appears to be how an enrollment team can retain students who entered through less attractive programs and want a better path. + +### 2. Subject Position + +The framing subject is a department-level execution team under enrollment pressure. The team is responsible for hitting intake and retention targets, but it does not fully own institutional compliance, regulator exposure, or long-term credential trust. + +### 3. Scenario Context + +The case appears in a year-end organizational review. A conventional enrollment pipeline is under market pressure, while a separate cross-border program has stronger growth and cash-flow performance. The struggling side uses a pathway adjustment mechanism to prevent student loss. + +### 4. Expectation-Reality Gap + +- Expected: Flexible pathway management can preserve enrollment and reduce attrition. +- Reality: The same action may convert a retention tactic into a compliance and trust risk. +- Gap summary: What looks like an execution workaround from the team viewpoint may be a governance-level red line from the institutional viewpoint. + +### 5. Attempted Paths + +The execution team reframes the pathway adjustment as practical retention. The decision layer questions whether the mechanism is still legitimate institutional flexibility or has become a prohibited workaround. + +### 6. Dynamic Shift + +The frame shifts from P to P/I mixed. It begins as a resource and process problem: how to keep students in the pipeline. It escalates into Issue because the workaround changes the institution's risk posture and creates a recurring governance burden. + +### 7. Scarcity Profile + +- data_scarcity: medium +- path_or_resource_scarcity: high +- consensus_or_order_scarcity: high + +### 8. Mixed Or Multi-Perspective + +`intra_frame_mixed` + +For the same execution subject in the same organizational scene, there is both a path scarcity and an order scarcity. The team lacks a viable compliant path, and the attempted substitute threatens the legitimacy of the system. + +### 9. Governance Load + +High. The case requires risk containment, role boundary clarification, audit authenticity, future complaint prevention, and a decision on whether short-term survival can override institutional legitimacy. + +### 10. Misframing Risks + +- malicious_inflation +- violent_reduction +- premature_classification +- single-cause_reduction + +### 11. Candidate QPI Judgment + +- classification_scope: subject_contextual +- is_provisional: true +- classification: mixed +- dominant_scarcity: consensus_order +- classification_confidence: medium +- recommended_next_step: Separate retention problem-solving from compliance judgment; confirm hard red lines before designing any replacement pathway. + +### 12. Owner Review Questions + +- Is the dominant scarcity here correctly placed on consensus/order rather than path/resource? +- Should this be treated as Issue rather than mixed because the compliance boundary dominates? +- Which details, if any, are safe enough to retain in a future owner-approved case digest? + +## Case qpi-draft-intl-002: Physical Capacity Treated As Negotiable Resource + +status: draft_owner_review_needed + +source_path: `[redacted owner-provided raw source path: organization CT slice]` + +### 1. Surface Problem + +The surface issue is whether the organization can support an expanded enrollment target despite limited housing and delivery capacity. + +### 2. Subject Position + +The framing subject is a fast-growing cross-border education function seeking resources from the broader organization. It owns growth commitments but depends on other functions for physical delivery. + +### 3. Scenario Context + +The function's growth plan depends on shared infrastructure controlled by other units. Internal claims of having secured capacity conflict with evidence that the available capacity is constrained and contested. + +### 4. Expectation-Reality Gap + +- Expected: Growth targets can be met through internal resource coordination. +- Reality: The target appears to exceed verified delivery capacity, and the solution depends on displacing other units. +- Gap summary: The business promise is ahead of the organization's physical and coordination reality. + +### 5. Attempted Paths + +The function attempts to solve the shortage through internal resource reallocation and pressure on adjacent units rather than through a verified capacity gate. + +### 6. Dynamic Shift + +The case shifts from P to I. At first it looks like a logistics problem. It becomes Issue when resource reallocation creates cross-unit conflict, delivery risk, and potential reputational consequences. + +### 7. Scarcity Profile + +- data_scarcity: medium +- path_or_resource_scarcity: high +- consensus_or_order_scarcity: high + +### 8. Mixed Or Multi-Perspective + +`intra_frame_mixed` + +The same growth function faces resource scarcity and governance scarcity simultaneously. The missing capacity cannot be solved only by a schedule, because allocation rights and downstream harm are contested. + +### 9. Governance Load + +High. The case requires a hard capacity gate, cross-functional arbitration, commitment control, downstream service assurance, and a clear rule for who bears the cost of over-promising. + +### 10. Misframing Risks + +- violent_reduction +- tool_solutionism +- premature_classification + +### 11. Candidate QPI Judgment + +- classification_scope: subject_contextual +- is_provisional: true +- classification: mixed +- dominant_scarcity: path_resource +- classification_confidence: medium +- recommended_next_step: Establish a verified delivery-capacity gate before allowing further promises, then decide whether resource conflict requires governance escalation. + +### 12. Owner Review Questions + +- Should dominant_scarcity be `path_resource` or `consensus_order`? +- Is the key failure over-promising, cross-unit conflict, or the absence of a hard capacity gate? +- Should this case be paired with a no-call selector trap about simple logistics requests? + +## Case qpi-draft-intl-003: Performance-Backed Role Inflation + +status: draft_owner_review_needed + +source_path: `[redacted owner-provided raw source path: organization CT slice]` + +### 1. Surface Problem + +The surface issue is whether a high-performing team should receive higher internal status, stronger authority, or a more formal role. + +### 2. Subject Position + +The framing subject is a high-performing subfunction that has become strategically valuable through revenue, external channels, and market execution ability. It is negotiating its organizational status from a position of performance leverage. + +### 3. Scenario Context + +The organization has an uneven internal power structure. A growth subfunction is gaining influence faster than formal governance rules can absorb, creating tension between performance contribution and institutional order. + +### 4. Expectation-Reality Gap + +- Expected: Strong performance should be recognized and converted into appropriate authority. +- Reality: Authority claims may become personalized, destabilize role boundaries, and create a semi-independent internal power center. +- Gap summary: The organization lacks a clean mechanism for converting business contribution into legitimate governance authority. + +### 5. Attempted Paths + +The subfunction requests upgraded status and symbolic authority. The broader organization informally acknowledges the team's value but lacks a stable rule for granting power without encouraging factional autonomy. + +### 6. Dynamic Shift + +The case is Issue from the start. It is not only a staffing or title allocation problem; it concerns how performance, authority, accountability, and organizational identity are linked. + +### 7. Scarcity Profile + +- data_scarcity: low +- path_or_resource_scarcity: medium +- consensus_or_order_scarcity: high + +### 8. Mixed Or Multi-Perspective + +`intra_frame_mixed` + +The same situation contains a real resource/authority need and a governance-order risk. It should not be reduced to either "reward the team" or "suppress ambition." + +### 9. Governance Load + +High. The organization must manage role boundaries, incentive legitimacy, succession risk, internal fairness, and whether a high-performing team becomes an internal exception to normal rules. + +### 10. Misframing Risks + +- violent_reduction +- malicious_inflation +- single-cause_reduction + +### 11. Candidate QPI Judgment + +- classification_scope: subject_contextual +- is_provisional: true +- classification: issue +- dominant_scarcity: consensus_order +- classification_confidence: medium +- recommended_next_step: Define a rule-based authority and accountability package before granting status; avoid converting personal leverage directly into structural power. + +### 12. Owner Review Questions + +- Is "performance-backed role inflation" the right abstraction, or should this be framed as "authority without accountability"? +- Should this case include proxy stakeholders such as future management, adjacent units, and external partners? +- Is the classification too confidently Issue without more context from the organization owner? + +## Case qpi-draft-intl-004: Strategic Chain Collapsed Into Front-End Sales + +status: draft_owner_review_needed + +source_path: `[redacted owner-provided raw source path: organization CT slice]` + +### 1. Surface Problem + +The surface issue is a disagreement about whether the function should focus on front-end recruitment or build a full education-to-outcome chain. + +### 2. Subject Position + +There are at least two subject positions: a decision layer thinking in long-term chain design, and an execution layer optimizing for faster recruitment and easier short-term delivery. + +### 3. Scenario Context + +The organization wants a cross-stage pathway that links intake, education delivery, advancement, and outcomes. The execution layer narrows the work into lead generation and conversion. + +### 4. Expectation-Reality Gap + +- Expected: The function should build a durable pathway with downstream outcomes. +- Reality: Execution behavior treats the work as a lighter enrollment intermediary business. +- Gap summary: The strategic object and the operational object are not the same. + +### 5. Attempted Paths + +The decision layer pushes for a broader chain. The execution layer continues to prioritize front-end recruitment because it is faster, measurable, and closer to immediate incentives. + +### 6. Dynamic Shift + +This case shows `inter_viewpoint_divergence`. From the execution layer it may look like a P: how to recruit more effectively. From the decision layer it is an I: how to align organizational mission, delivery responsibility, and outcome accountability. + +### 7. Scarcity Profile + +- data_scarcity: medium +- path_or_resource_scarcity: medium +- consensus_or_order_scarcity: high + +### 8. Mixed Or Multi-Perspective + +`inter_viewpoint_divergence` + +The same surface request is framed differently by different responsibility positions. The issue is not merely mixed scarcity inside one frame; it is a divergence between strategic and operational definitions of the work. + +### 9. Governance Load + +High. The organization must decide what business it is actually in, what outcomes are owned, and whether short-term enrollment can be allowed to define the whole function. + +### 10. Misframing Risks + +- violent_reduction +- premature_classification +- malicious_inflation + +### 11. Candidate QPI Judgment + +- classification_scope: multi_perspective +- is_provisional: true +- classification: issue +- dominant_scarcity: consensus_order +- classification_confidence: medium +- recommended_next_step: Explicitly separate the decision-layer strategic frame from the execution-layer sales frame, then define which frame governs resource allocation. + +### 12. Owner Review Questions + +- Is this the clearest example of `inter_viewpoint_divergence` in this source? +- Should the execution-layer frame be classified as Problem while the decision-layer frame is Issue? +- Does this case need a paired expected output showing `classification_by_viewpoint`? + +## Case qpi-draft-intl-005: Inflated Credential Metrics As Fact Scarcity + +status: draft_owner_review_needed + +source_path: `[redacted owner-provided raw source path: organization CT slice]` + +### 1. Surface Problem + +The surface issue is whether reported credential or staffing indicators are real enough to support institutional evaluation and delivery claims. + +### 2. Subject Position + +The framing subject is the decision layer reviewing whether the execution layer's reported indicators represent real capability or only formalistic compliance. + +### 3. Scenario Context + +The organization faces evaluation pressure. The execution layer reports credential-related assets, but the decision layer suspects that the data may be inflated, symbolic, or disconnected from real teaching capacity. + +### 4. Expectation-Reality Gap + +- Expected: Credential indicators should reflect real institutional capacity. +- Reality: Reported indicators may be assembled to satisfy evaluation appearance without improving actual delivery. +- Gap summary: The organization lacks trusted facts about whether the metric corresponds to real capability. + +### 5. Attempted Paths + +The execution layer presents the metric as progress. The decision layer questions the nature, source, and operational usefulness of the metric. + +### 6. Dynamic Shift + +The case begins as Q because the first scarcity is factual: what is the reported indicator really measuring? It may escalate into I if metric inflation is systemic and tied to governance incentives. + +### 7. Scarcity Profile + +- data_scarcity: high +- path_or_resource_scarcity: medium +- consensus_or_order_scarcity: medium + +### 8. Mixed Or Multi-Perspective + +`intra_frame_mixed` + +The first move is fact verification, but the case contains a governance shadow because the organization may reward metric appearance over substance. + +### 9. Governance Load + +Medium to high. If the metric is false or misleading, the organization must repair audit authenticity, incentive design, and future reporting standards. + +### 10. Misframing Risks + +- violent_reduction +- single-cause_reduction +- premature_classification + +### 11. Candidate QPI Judgment + +- classification_scope: subject_contextual +- is_provisional: true +- classification: question +- dominant_scarcity: data +- classification_confidence: medium +- recommended_next_step: Verify whether the indicator maps to real delivery capacity before treating it as an asset or a compliance risk. + +### 12. Owner Review Questions + +- Should this remain Question-first, or should it be Issue because the source already frames it as systemic metric distortion? +- What level of evidence would let this case move from fact verification into governance remediation? +- Should the future digest keep the credential category abstract to avoid compliance sensitivity? + +## Case qpi-draft-intl-006: Pricing Deadlock Misread As Simple Market Weakness + +status: draft_owner_review_needed + +source_path: `[redacted owner-provided raw source path: organization CT slice]` + +### 1. Surface Problem + +The surface issue is weak demand for an existing program due to a mismatch between price and perceived market value. + +### 2. Subject Position + +The framing subject is an execution team responsible for recruitment under inherited pricing and product-positioning constraints. It can observe market rejection but may not have authority to reset the pricing structure. + +### 3. Scenario Context + +The program uses a pricing logic borrowed from stronger or different categories. Lowering price creates fairness and refund risks for existing participants, while not lowering price makes new recruitment difficult. + +### 4. Expectation-Reality Gap + +- Expected: The program should compete in its market and sustain intake. +- Reality: Pricing and perceived value are misaligned, and every correction path creates a secondary risk. +- Gap summary: This is not merely poor sales execution; it is a structural deadlock between market fit and legacy commitment. + +### 5. Attempted Paths + +The team continues recruitment under the existing price structure and explores workaround mechanisms to preserve intake, rather than solving the underlying price-value mismatch. + +### 6. Dynamic Shift + +The case begins as P: find a viable pricing and enrollment path. It can become I when legacy commitments, refund fairness, and institutional reputation become the central constraints. + +### 7. Scarcity Profile + +- data_scarcity: low +- path_or_resource_scarcity: high +- consensus_or_order_scarcity: medium + +### 8. Mixed Or Multi-Perspective + +`intra_frame_mixed` + +The core path problem is clear, but order scarcity emerges because every path affects existing participants and institutional fairness. + +### 9. Governance Load + +Medium. The organization needs a transition rule, risk budget, and communication strategy rather than only a new sales tactic. + +### 10. Misframing Risks + +- violent_reduction +- tool_solutionism +- premature_classification + +### 11. Candidate QPI Judgment + +- classification_scope: subject_contextual +- is_provisional: true +- classification: problem +- dominant_scarcity: path_resource +- classification_confidence: medium +- recommended_next_step: Model the transition options and their fairness costs before using workaround enrollment tactics. + +### 12. Owner Review Questions + +- Should this be a Problem case, or a P/I mixed case because the fairness and legacy-risk layer is central? +- Does the owner want this retained as a distinct case if similar pricing deadlocks appear in other department slices? +- What anonymized wording best captures the inherited-pricing constraint? + +## Case qpi-draft-intl-007: High-Quality Asset At Risk Of Privatization + +status: draft_owner_review_needed + +source_path: `[redacted owner-provided raw source path: organization CT slice]` + +### 1. Surface Problem + +The surface issue is how to retain and scale a high-performing field execution team. + +### 2. Subject Position + +The framing subject is the organization owner or decision layer assessing whether a valuable team capability is an institutional asset or an individual-centered private asset. + +### 3. Scenario Context + +A small, highly capable team has proven it can execute across recruitment, operations, documentation, and external coordination. The capability is valuable, but it may be bound to one leader or subfunction rather than institutionalized. + +### 4. Expectation-Reality Gap + +- Expected: Strong team capability can be reused as an organizational asset. +- Reality: The capability may be personally controlled, hard to transfer, and linked to bargaining power against the organization. +- Gap summary: The organization has an asset, but it may not yet own the asset structurally. + +### 5. Attempted Paths + +The organization celebrates the team's results and may reward the team informally. It has not yet created a governance mechanism that captures the capability without killing the team's effectiveness. + +### 6. Dynamic Shift + +The case shifts from P to I. Initially it asks how to retain or replicate a team. It becomes Issue because institutionalization, incentives, personal leverage, and continuity all need governance. + +### 7. Scarcity Profile + +- data_scarcity: medium +- path_or_resource_scarcity: medium +- consensus_or_order_scarcity: high + +### 8. Mixed Or Multi-Perspective + +`intra_frame_mixed` + +The same team is both an asset and a governance risk. Reducing it to "reward them" or "control them" would miss the system tension. + +### 9. Governance Load + +High. The organization must balance retention, incentives, knowledge transfer, role boundaries, and protection from private capture. + +### 10. Misframing Risks + +- violent_reduction +- single-cause_reduction +- premature_classification + +### 11. Candidate QPI Judgment + +- classification_scope: subject_contextual +- is_provisional: true +- classification: issue +- dominant_scarcity: consensus_order +- classification_confidence: medium +- recommended_next_step: Design an institutionalization path that preserves execution energy while separating team capability from personal bargaining monopoly. + +### 12. Owner Review Questions + +- Is "privatization of organizational capability" the right abstraction here? +- Should this case be connected with the role-inflation case or kept separate? +- What owner-approved signal distinguishes healthy recognition from dangerous private capture? + +## Case qpi-draft-intl-008: Strong External Channel Used To Justify Risky Internal Expansion + +status: draft_owner_review_needed + +source_path: `[redacted owner-provided raw source path: organization CT slice]` + +### 1. Surface Problem + +The surface issue is whether a valuable external partnership and market channel should justify aggressive internal expansion. + +### 2. Subject Position + +The framing subject is a decision layer evaluating a growth function's strategic assets and the risks of overextending them. + +### 3. Scenario Context + +The function holds valuable external access and brand leverage. These assets create real opportunity, but the organization may use them to justify expansion into areas where delivery, compliance, and internal coordination are not ready. + +### 4. Expectation-Reality Gap + +- Expected: A strong external channel should become a protected strategic asset and growth engine. +- Reality: If attached to low-quality or risky internal practices, the same channel can become contaminated and lose credibility. +- Gap summary: Real assets can be converted into future liabilities when the internal operating model cannot support them. + +### 5. Attempted Paths + +The organization highlights the channel as proof of growth potential. The source analysis warns that the asset should not be used as cover for lower-quality or riskier practices. + +### 6. Dynamic Shift + +The frame starts as P: how to exploit a valuable channel. It becomes I when the key question is how to protect the asset from organizational misuse and incentive-driven overreach. + +### 7. Scarcity Profile + +- data_scarcity: low +- path_or_resource_scarcity: medium +- consensus_or_order_scarcity: high + +### 8. Mixed Or Multi-Perspective + +`intra_frame_mixed` + +There is a real growth path, but using it without governance can degrade the very asset that enables growth. + +### 9. Governance Load + +High. The organization needs rules for asset protection, partner trust, quality control, and limits on using strategic channels to mask weak delivery. + +### 10. Misframing Risks + +- malicious_inflation +- violent_reduction +- tool_solutionism + +### 11. Candidate QPI Judgment + +- classification_scope: subject_contextual +- is_provisional: true +- classification: issue +- dominant_scarcity: consensus_order +- classification_confidence: medium +- recommended_next_step: Treat the external channel as a protected strategic asset; define what internal uses are prohibited before scaling. + +### 12. Owner Review Questions + +- Should this case remain separate from capacity and compliance cases, or is it a higher-level synthesis case? +- Is the key misframing "real asset implies safe expansion"? +- What minimum evidence should be kept in a future digest without identifying the partner or program category? + diff --git a/reports/model_case_preprocessing/qpi/round-01/year-end-review-research-office.cases.md b/reports/model_case_preprocessing/qpi/round-01/year-end-review-research-office.cases.md new file mode 100644 index 0000000..756ee62 --- /dev/null +++ b/reports/model_case_preprocessing/qpi/round-01/year-end-review-research-office.cases.md @@ -0,0 +1,565 @@ +# QPI Case Drafts: Year-End Review Research Function + +status: draft_owner_review_needed + +source_path: `[redacted external source path: owner-provided organizational CT slice]` + +source_note: Owner-provided raw organizational material. These drafts are anonymized and generalized for QPI review. Real or potentially identifying people, departments, institutions, timestamps, locations, titles, ancient-style cognitive anchors, exact numeric details, and sensitive operational details have been removed or generalized. These drafts are not selector JSON, regression cases, or owner-approved calibration data. + +anonymization_note: People are represented as roles such as `decision_maker`, `execution_lead`, `research_staff`, `compliance_staff`, and `frontline_staff`. The organization is represented as `the organization`; the department is represented as `research_function`. Sensitive details are generalized as `tax-preference metric pressure`, `research identity simulation`, `paper-and-patent metric pressure`, `talent-role mismatch`, `resource allocation bottleneck`, `facility capacity risk`, and `compliance red-line risk`. + +## Case qpi-draft-001: Tax-Preference Goal Becomes Research Identity Simulation + +status: draft_owner_review_needed + +source_path: `[redacted external source path: owner-provided organizational CT slice]` + +### 1. Surface Problem + +The surface problem is that the organization wants to qualify for an external preferential status that requires a credible research identity. + +### 2. Subject Position + +The subject is the organization as framed by `decision_maker` and translated through `research_function` and related administrative functions. It is not a neutral learner asking how the policy works; it is an accountable organization under financial pressure, attempting to turn an external status requirement into an internal reporting strategy. + +### 3. Scenario Context + +The case appears in a year-end review of a `research_function`. The function is expected to support external certification, research metrics, and organizational reputation, while the actual operating base is more commercial and administrative than research-intensive. + +### 4. Expectation-Reality Gap + +- Expected: The organization expects to obtain a preferential external status by assembling research-related indicators and evidence. +- Reality: The underlying research capacity is not strong enough to naturally support the desired identity, so the organization considers simulating research attributes through administrative reclassification and transactional evidence. +- Gap summary: A capability-building problem is reframed as an evidence-packaging and accounting problem. + +### 5. Attempted Paths + +The apparent path is to make existing people, expenses, and intangible assets appear research-related enough to satisfy the external gate. This avoids building real research capability but increases `compliance red-line risk` and audit fragility. + +### 6. Dynamic Shift + +P -> I. It begins as a Problem about how to meet an external qualification requirement. It shifts into an Issue because the chosen path changes the organization's relationship to truthfulness, legal exposure, research identity, and long-term legitimacy. + +### 7. Scarcity Profile + +- data_scarcity: low +- path_or_resource_scarcity: high +- consensus_or_order_scarcity: high + +### 8. Mixed Or Multi-Perspective + +`intra_frame_mixed` + +For the same organizational subject, the case has both a resource/path gap and a governance gap. The organization lacks sufficient real research capacity, and the proposed workaround undermines the legitimacy of the reported identity. + +### 9. Governance Load + +Very high. The case requires managing audit authenticity, compliance boundaries, financial pressure, research identity, and whether short-term certification gain is worth long-term institutional risk. + +### 10. Misframing Risks + +- violent_reduction +- tool_solutionism +- premature_classification +- single-cause_reduction + +### 11. Candidate QPI Judgment + +- classification_scope: subject_contextual +- is_provisional: true +- classification: issue +- dominant_scarcity: consensus_order +- classification_confidence: medium +- recommended_next_step: Treat the case as a governance Issue with a path/resource trigger; separate legitimate capability-building paths from evidence simulation and compliance red-line risk. + +### 12. Owner Review Questions + +- Should this be the umbrella QPI case for the source, or should it remain a narrower certification-risk sample? +- Should `classification` be `issue` or `mixed` given the strong path/resource shortage behind the governance failure? +- Is the anonymized phrase `research identity simulation` acceptable, or should it be softened further? + +## Case qpi-draft-002: Research Staff Count Treated As Movable Accounting Data + +status: draft_owner_review_needed + +source_path: `[redacted external source path: owner-provided organizational CT slice]` + +### 1. Surface Problem + +The surface problem is that the organization lacks enough research-qualified personnel or research-related cost evidence to satisfy an external metric. + +### 2. Subject Position + +The subject is `decision_maker` using administrative authority to force metric completion, with `research_function`, finance, and personnel-related roles expected to make the numbers fit. A system analyst would see the same situation as a boundary and legitimacy problem rather than a simple data-filling task. + +### 3. Scenario Context + +The case occurs inside a certification and reporting context where staff identity, payroll category, and research contribution are treated as adjustable inputs to a metric package. + +### 4. Expectation-Reality Gap + +- Expected: Staff and cost categories can be rearranged to make the organization appear research-intensive. +- Reality: Research identity depends on actual work, role, capability, and evidence. Moving labels without changing reality creates a fragile and potentially noncompliant data package. +- Gap summary: A real capability shortage is violently reduced to category manipulation. + +### 5. Attempted Paths + +The attempted path is to reassign or relabel non-research roles into research-related categories. This may reduce a reported data gap but creates a truthfulness gap and escalates audit risk. + +### 6. Dynamic Shift + +Q/P -> I. It may first appear as a Question about what the metric requires or a Problem about how to satisfy it. With context, it becomes an Issue because the organization is changing the meaning of "research personnel" to survive the metric. + +### 7. Scarcity Profile + +- data_scarcity: low +- path_or_resource_scarcity: high +- consensus_or_order_scarcity: high + +### 8. Mixed Or Multi-Perspective + +`inter_viewpoint_divergence` + +From `decision_maker`, the case may look like an execution Problem: adjust the table. From a compliance or research-quality viewpoint, it is an Issue about role truthfulness and institutional integrity. + +### 9. Governance Load + +High. The organization needs rules for role classification, evidence authenticity, refusal boundaries, and escalation when a metric request conflicts with real work identity. + +### 10. Misframing Risks + +- violent_reduction +- tool_solutionism +- premature_classification +- single-cause_reduction + +### 11. Candidate QPI Judgment + +- classification_scope: multi_perspective +- is_provisional: true +- classification: issue +- dominant_scarcity: consensus_order +- classification_confidence: medium +- recommended_next_step: Use this as a QPI sample for distinguishing missing data from falsified or untrusted data; ask the owner whether the case should explicitly mark "data completeness is not truthfulness." + +### 12. Owner Review Questions + +- Should this case be classified as `inter_viewpoint_divergence` because different roles see different frames, or `intra_frame_mixed` because both resource and governance scarcities exist? +- Is the main misframing `violent_reduction` from research capability to spreadsheet category? +- Should this sample later test QPI's ability to reject high-confidence classification when compliance details are not owner-verified? + +## Case qpi-draft-003: Transactional Research Assets Create Audit Fragility + +status: draft_owner_review_needed + +source_path: `[redacted external source path: owner-provided organizational CT slice]` + +### 1. Surface Problem + +The surface problem is that the organization needs enough research outputs or transferable assets to support its external status and metrics. + +### 2. Subject Position + +The subject is the `research_function` under `decision_maker` pressure. The function is expected to manufacture evidence for an identity it may not substantively possess. External auditors, regulators, and future organizational actors are proxy stakeholders. + +### 3. Scenario Context + +The case appears where research outputs are discussed less as knowledge production and more as objects that can be transacted, reported, or recycled to satisfy rules. + +### 4. Expectation-Reality Gap + +- Expected: The organization can close the research-output gap by acquiring or circulating research-like assets. +- Reality: If the transaction has weak substantive value, it may create formal evidence while increasing audit fragility and institutional risk. +- Gap summary: The organization treats research evidence as a tradable token rather than as a trace of real capability. + +### 5. Attempted Paths + +The attempted path is to use asset transactions or paper evidence to create the appearance of research output. The method may satisfy a surface indicator while leaving the capability gap unresolved. + +### 6. Dynamic Shift + +P -> I. It starts as a Problem about acquiring enough evidence. It becomes an Issue because the evidence path itself changes the organization's risk profile and value system. + +### 7. Scarcity Profile + +- data_scarcity: medium +- path_or_resource_scarcity: high +- consensus_or_order_scarcity: high + +### 8. Mixed Or Multi-Perspective + +`intra_frame_mixed` + +The same subject has insufficient real output and a governance conflict over whether synthetic evidence should be accepted. The path scarcity and order scarcity reinforce each other. + +### 9. Governance Load + +Very high. The case requires deciding what counts as authentic evidence, what transaction patterns are prohibited, who can refuse risky actions, and how audit traces should be preserved. + +### 10. Misframing Risks + +- tool_solutionism +- violent_reduction +- premature_classification + +### 11. Candidate QPI Judgment + +- classification_scope: subject_contextual +- is_provisional: true +- classification: mixed +- dominant_scarcity: consensus_order +- classification_confidence: medium +- recommended_next_step: Treat the case as a P/I mixed sample where the immediate path gap is dominated by evidence authenticity and compliance governance. + +### 12. Owner Review Questions + +- Should this be merged with Case 001 as a subcase of research identity simulation? +- Should the dominant scarcity be `path_resource` because the organization lacks real assets, or `consensus_order` because the chosen route is illegitimate? +- Is this anonymized enough, or should all references to transactional research assets be further abstracted? + +## Case qpi-draft-004: Ranking Anxiety Converts Research Into Purchasable Metrics + +status: draft_owner_review_needed + +source_path: `[redacted external source path: owner-provided organizational CT slice]` + +### 1. Surface Problem + +The surface problem is that external ranking or reputation indicators are declining or under pressure, and the organization wants quick visible improvement. + +### 2. Subject Position + +The subject is the organization under `metric pressure`. `decision_maker` cares about external visibility and market effects; `research_function` is asked to deliver measurable outputs; `research_staff` and external collaborators become instruments of metric production. + +### 3. Scenario Context + +The case occurs in a review of research performance where publications, projects, and recognitions are treated primarily as ranking inputs rather than as outcomes of genuine inquiry. + +### 4. Expectation-Reality Gap + +- Expected: Increasing reported outputs should improve reputation, ranking, and market appeal. +- Reality: If the output is produced mainly through transactional or low-authenticity mechanisms, the organization may improve the metric while degrading research culture and long-term credibility. +- Gap summary: A reputation problem is reframed as a purchasable output problem, hiding the value-system failure. + +### 5. Attempted Paths + +The attempted path is to reward or purchase visible research outputs without resolving underlying capability, research culture, or quality-control constraints. + +### 6. Dynamic Shift + +P -> I. At first it looks like a Problem of improving ranking inputs. It becomes an Issue when the optimization logic corrupts the meaning of research and creates future trust risk. + +### 7. Scarcity Profile + +- data_scarcity: medium +- path_or_resource_scarcity: medium +- consensus_or_order_scarcity: high + +### 8. Mixed Or Multi-Perspective + +`inter_viewpoint_divergence` + +`decision_maker` may frame the case as a metric execution problem. `research_staff` may experience it as a value and incentive issue. A system analyst sees a governance problem where metrics replace mission. + +### 9. Governance Load + +High. The case requires ongoing tradeoffs among ranking pressure, research authenticity, incentive design, quality control, and reputational exposure. + +### 10. Misframing Risks + +- malicious_inflation +- violent_reduction +- tool_solutionism +- premature_classification + +### 11. Candidate QPI Judgment + +- classification_scope: multi_perspective +- is_provisional: true +- classification: issue +- dominant_scarcity: consensus_order +- classification_confidence: medium +- recommended_next_step: Use this as a QPI sample for "metric improvement is not the same as capability improvement"; ask the owner whether later calibration should route this to governance review rather than execution planning. + +### 12. Owner Review Questions + +- Should this be a strong sample for `malicious_inflation`, where an ordinary metric problem is inflated into a legitimacy narrative to justify risky action? +- Or is the stronger risk `violent_reduction`, where research value is reduced to ranking inputs? +- Should this case later connect to selector traps around "how to improve ranking quickly"? + +## Case qpi-draft-005: High-Level Talent Becomes Role-Mismatched Display Asset + +status: draft_owner_review_needed + +source_path: `[redacted external source path: owner-provided organizational CT slice]` + +### 1. Surface Problem + +The surface problem is that the organization has recruited high-level talent but struggles to place that talent into suitable teaching, research, or operational roles. + +### 2. Subject Position + +The subject is the organization as employer and capability builder. `decision_maker` views talent as proof of quality and as a metric asset. The recruited expert is a proxy stakeholder whose professional identity, motivation, and retention risk matter. + +### 3. Scenario Context + +The case appears in a research and staffing review where expert credentials are valuable for external appearance, but internal course design, research platform, or task structure cannot absorb the expert's actual capability. + +### 4. Expectation-Reality Gap + +- Expected: High-level talent should strengthen research status, teaching quality, and external metrics. +- Reality: The organization lacks appropriate work design, so the talent is assigned generic or mismatched tasks that waste capability and weaken long-term retention. +- Gap summary: Talent acquisition solves a credential problem while creating a role-fit and capability-utilization problem. + +### 5. Attempted Paths + +The attempted path is to keep the talent by creating broad, low-specificity assignments that are easier to schedule but misaligned with the person's expertise. This preserves the visible asset while degrading its productive value. + +### 6. Dynamic Shift + +P -> I. It starts as a Problem of how to arrange work for a high-level hire. It becomes an Issue because the organization treats human capability as a display asset, creating retention, morale, and mission-integrity risks. + +### 7. Scarcity Profile + +- data_scarcity: low +- path_or_resource_scarcity: high +- consensus_or_order_scarcity: high + +### 8. Mixed Or Multi-Perspective + +`intra_frame_mixed` + +The same organization lacks an execution path for using expert capability and also has a governance conflict over whether talent is valued as capability or as an indicator. + +### 9. Governance Load + +High. The case requires balancing credential needs, real capability use, task design, professional dignity, retention risk, and whether the organization is willing to build the platform needed for talent to matter. + +### 10. Misframing Risks + +- violent_reduction +- single-cause_reduction +- premature_classification + +### 11. Candidate QPI Judgment + +- classification_scope: subject_contextual +- is_provisional: true +- classification: mixed +- dominant_scarcity: consensus_order +- classification_confidence: medium +- recommended_next_step: Frame the case as a role-governance Issue with a work-design Problem inside it; ask whether the QPI output should explicitly mark talent-as-indicator reduction. + +### 12. Owner Review Questions + +- Should this case be promoted as a separate QPI calibration sample or kept as a subcase of metric-driven research identity? +- Is `dominant_scarcity: consensus_order` correct, or should `path_resource` dominate because the immediate blocker is work design? +- Should future case digest include proxy stakeholder `high_level_talent`? + +## Case qpi-draft-006: Facility Capacity Risk Misread As Expansion Logistics + +status: draft_owner_review_needed + +source_path: `[redacted external source path: owner-provided organizational CT slice]` + +### 1. Surface Problem + +The surface problem is that a growing program or external-facing activity needs more physical capacity than the organization currently has. + +### 2. Subject Position + +The subject is the organization under growth pressure. `decision_maker` prioritizes expansion and revenue; `execution_lead` must find space; affected staff and users are proxy stakeholders who bear the consequences of compression. + +### 3. Scenario Context + +The case appears in a year-end review where growth has already been promised or pursued, while physical capacity and operational readiness lag behind. + +### 4. Expectation-Reality Gap + +- Expected: The organization can absorb expanded activity by reallocating existing space or forcing internal adjustments. +- Reality: Physical capacity is a hard constraint. Improvised reallocation may damage teaching, work continuity, user experience, safety, and trust. +- Gap summary: A capacity planning failure is treated as a short-term logistics task. + +### 5. Attempted Paths + +The attempted path is to squeeze or repurpose existing space rather than slow expansion or invest in capacity. This may solve the immediate placement problem but transfer cost to other functions and future stability. + +### 6. Dynamic Shift + +P -> I. It begins as a Problem of finding enough physical space. It becomes an Issue when growth promises, resource allocation, user rights, staff disruption, and reputational risk collide. + +### 7. Scarcity Profile + +- data_scarcity: low +- path_or_resource_scarcity: high +- consensus_or_order_scarcity: medium + +### 8. Mixed Or Multi-Perspective + +`intra_frame_mixed` + +The same organizational frame contains a hard resource shortage and a governance burden. The path scarcity is dominant, but the way the shortage is handled creates order and legitimacy risks. + +### 9. Governance Load + +High. The case requires capacity governance, expansion pacing, risk communication, user protection, and whether revenue growth can override physical readiness. + +### 10. Misframing Risks + +- violent_reduction +- premature_classification +- single-cause_reduction + +### 11. Candidate QPI Judgment + +- classification_scope: subject_contextual +- is_provisional: true +- classification: mixed +- dominant_scarcity: path_resource +- classification_confidence: medium +- recommended_next_step: Treat as a P/I mixed case; first verify physical capacity and committed obligations, then decide whether expansion should be capped, delayed, or redesigned. + +### 12. Owner Review Questions + +- Should this case be classified as `problem` because resource scarcity dominates, or `mixed` because downstream governance risk is already visible? +- Should it be used as a calibration sample for "hard constraint cannot be solved by administrative command"? +- Is the growth context anonymized enough, or should all references to external-facing activity be made more generic? + +## Case qpi-draft-007: Safety Responsibility Vacuum Covered By Emergency Command + +status: draft_owner_review_needed + +source_path: `[redacted external source path: owner-provided organizational CT slice]` + +### 1. Surface Problem + +The surface problem is that a safety-related task needs immediate ownership and completion. + +### 2. Subject Position + +The subject is the organization as an operating system. `decision_maker` can issue emergency commands, but the real subject includes the missing responsibility chain, affected users, and downstream risk owners. + +### 3. Scenario Context + +The case appears in a meeting where responsibility for a safety-related administrative action is unclear until a top-down directive assigns it under time pressure. + +### 4. Expectation-Reality Gap + +- Expected: Safety tasks should have a clear owner, process, evidence trail, and escalation route. +- Reality: The responsibility chain is unclear, and the gap is patched through emergency personal assignment rather than through a stable process. +- Gap summary: A process and accountability failure is temporarily hidden by command authority. + +### 5. Attempted Paths + +The attempted path is to assign a person under urgent deadline pressure. This may produce a short-term action but does not solve the underlying absence of stable responsibility architecture. + +### 6. Dynamic Shift + +Q/P -> I. It could look like a Question of "who handles this?" or a Problem of task completion. With context, it becomes an Issue about accountability design, safety governance, and command-dependent operations. + +### 7. Scarcity Profile + +- data_scarcity: medium +- path_or_resource_scarcity: medium +- consensus_or_order_scarcity: high + +### 8. Mixed Or Multi-Perspective + +`intra_frame_mixed` + +The same organizational subject has a data gap about responsibility, a path gap about execution, and a dominant governance gap about safety accountability. + +### 9. Governance Load + +High. The case requires responsibility mapping, documented ownership, escalation rules, safety evidence, and prevention of repeat emergency command substitution. + +### 10. Misframing Risks + +- violent_reduction +- premature_classification +- single-cause_reduction + +### 11. Candidate QPI Judgment + +- classification_scope: subject_contextual +- is_provisional: true +- classification: issue +- dominant_scarcity: consensus_order +- classification_confidence: medium +- recommended_next_step: Route as an Issue: identify the missing responsibility chain before treating it as an isolated task execution problem. + +### 12. Owner Review Questions + +- Should this case be included despite being a smaller slice than the research and compliance cases? +- Is this a useful QPI sample for "Q-like responsibility question that is actually an accountability Issue"? +- Should safety details be further generalized for publication safety? + +## Case qpi-draft-008: Compliance Risk Defined Only By Immediate Penalty + +status: draft_owner_review_needed + +source_path: `[redacted external source path: owner-provided organizational CT slice]` + +### 1. Surface Problem + +The surface problem is whether a past or ongoing compliance-sensitive behavior creates meaningful risk for the organization. + +### 2. Subject Position + +The subject is the organization as interpreted by `compliance_staff`, `research_function`, and `decision_maker`. The viewpoint is not a legal conclusion; it is an internal risk frame that may underestimate non-financial, reputational, and ethical exposure. + +### 3. Scenario Context + +The case appears where internal actors assess external scrutiny through the narrow lens of whether immediate penalties, reimbursement issues, or formal interviews have occurred. + +### 4. Expectation-Reality Gap + +- Expected: If no immediate penalty or visible sanction occurs, the organization can treat the behavior as low-risk or resolved. +- Reality: Compliance and academic integrity risks can persist even without immediate financial loss or official sanction. The absence of punishment is not the same as the presence of legitimacy. +- Gap summary: The organization collapses substantive compliance into short-term penalty avoidance. + +### 5. Attempted Paths + +The attempted path is to benchmark against whether other institutions or actors were formally sanctioned and to use the lack of immediate punishment as proof of acceptability. This converts compliance into a minimum-punishment game. + +### 6. Dynamic Shift + +Q -> I. It starts as a Question about whether a behavior caused formal risk. It becomes an Issue because the organization's definition of risk is miscalibrated and may normalize future boundary crossing. + +### 7. Scarcity Profile + +- data_scarcity: medium +- path_or_resource_scarcity: low +- consensus_or_order_scarcity: high + +### 8. Mixed Or Multi-Perspective + +`inter_viewpoint_divergence` + +Internal actors may classify the situation as a Question about penalty status. A governance or integrity frame classifies it as an Issue about what counts as acceptable behavior. + +### 9. Governance Load + +High. The case requires redefining compliance beyond immediate punishment, creating review standards, and preventing "not caught yet" from becoming the organization's operating rule. + +### 10. Misframing Risks + +- violent_reduction +- single-cause_reduction +- premature_classification + +### 11. Candidate QPI Judgment + +- classification_scope: multi_perspective +- is_provisional: true +- classification: issue +- dominant_scarcity: consensus_order +- classification_confidence: medium +- recommended_next_step: Treat as an Issue about compliance-risk framing; request owner confirmation before using it as a calibration sample because legal interpretation must remain generalized. + +### 12. Owner Review Questions + +- Should this be kept as a separate QPI sample or folded into the broader metric-and-compliance culture case? +- Should the candidate judgment emphasize `inter_viewpoint_divergence` between penalty-status and integrity-status frames? +- Is the legal-risk language sufficiently generalized? + diff --git a/reports/model_review_status.json b/reports/model_review_status.json new file mode 100644 index 0000000..3e987be --- /dev/null +++ b/reports/model_review_status.json @@ -0,0 +1,34 @@ +{ + "review_version": "0.2", + "last_updated": "2026-06-16", + "models": [ + { + "model_id": "qpi", + "engineering_contract_status": "passed", + "content_review_status": "needs_owner_review", + "evidence_review_status": "field_level_matrix_created", + "regression_review_status": "expanded_pending_review", + "selector_review_status": "v0_2_no_call_tests_passed", + "draft_callable": true, + "stable_allowed": false, + "third_model_expansion_allowed": false, + "status": "draft", + "stability_level": "B", + "regression_status": "pending" + }, + { + "model_id": "intellectual_archaeology", + "engineering_contract_status": "passed", + "content_review_status": "needs_owner_review", + "evidence_review_status": "field_level_matrix_created", + "regression_review_status": "expanded_pending_review", + "selector_review_status": "v0_2_no_call_tests_passed", + "draft_callable": true, + "stable_allowed": false, + "third_model_expansion_allowed": false, + "status": "draft", + "stability_level": "B", + "regression_status": "pending" + } + ] +} diff --git a/reports/next_action_register_v0.2.md b/reports/next_action_register_v0.2.md new file mode 100644 index 0000000..5b1eab2 --- /dev/null +++ b/reports/next_action_register_v0.2.md @@ -0,0 +1,25 @@ +# Next Action Register v0.2 + +## Status + +QPI and Intellectual Archaeology are ready for content review as `draft-callable` assets. + +They are not stable. + +Do not expand to a third model yet. + +## Owner / CCRA Review Items + +1. Review whether QPI's structured output contract is sufficient for routing. +2. Review whether QPI's mixed-case dominant scarcity rule is acceptable. +3. Review whether Intellectual Archaeology's stop gate is strict enough. +4. Review whether `draft-callable` should remain report-only or become a future schema field. +5. Review selector v0.2 false-positive protections against real user inputs. + +## Suggested Next Tasks + +1. Run human review on `reports/evidence_coverage_report_v0.2.md`. +2. Review all 34 regression cases for realism and missing edge cases. +3. Add real failed-call examples if available. +4. Decide whether `model_review_status.json` should become a first-class schema. +5. Only after review, discuss whether a third model should enter the library. diff --git a/reports/open_questions_for_CCRA.md b/reports/open_questions_for_CCRA.md new file mode 100644 index 0000000..69bdb14 --- /dev/null +++ b/reports/open_questions_for_CCRA.md @@ -0,0 +1,31 @@ +# Open Questions For CCRA + +## QPI + +1. Should `problem_owner` be required in QPI output for all calls, with `unknown` allowed when unavailable? +2. Should `time_scale` be required in QPI output, or remain a recommended routing field? +3. Is the current `dominant_scarcity` enum sufficient: `data`, `path_resource`, `consensus_order`, `mixed`, `unknown`? +4. For mixed cases, should QPI always output `classification=mixed`, or can it output a primary classification plus mixed evidence? +5. Are the violent reduction / malicious inflation checks strong enough for review, or should they become separate required output fields? + +## Intellectual Archaeology + +1. Should `recommended_max_depth` become a required model-card schema field? +2. Should `stop_reason` and `no_deeper_reason` become required output fields? +3. Should `value_of_deeper_analysis` be added explicitly, or is `no_deeper_reason` plus `action_implication` enough? +4. Should QPI approval be mandatory before Intellectual Archaeology can be selected, except for explicit model-extraction tasks? +5. Is `philosophical_bedrock` allowed only when the input explicitly concerns problem ontology or model foundations? + +## Regression And Selector + +1. Are 17 cases per model sufficient for the next review phase? +2. Should `regression_status` remain `pending`, or move to `in_progress` after this expansion? +3. Is selector v0.2's no-call threshold of `0.35` acceptable for review, or should it be calibrated with real inputs? +4. Is it acceptable for mixed QPI cases to recommend QPI first and leave IA as a later candidate only after QPI output? + +## Status + +1. Should `draft-callable` remain report-only for v0.2? +2. Should `draft-callable` become a first-class schema/status field later? +3. Should both models remain `draft / B / pending`? Current Codex recommendation: yes. +4. Should third model expansion remain blocked until after this review? Current Codex recommendation: yes. diff --git a/reports/schema_change_notes.md b/reports/schema_change_notes.md new file mode 100644 index 0000000..c377457 --- /dev/null +++ b/reports/schema_change_notes.md @@ -0,0 +1,95 @@ +# Schema Change Notes + +## Scope + +This note covers schema changes made during the second content stabilization pass. + +## Changed Schemas + +### `schemas/source_article.schema.json` + +Change: + +- Formalized `source_type` enum: + - `original_article` + - `synthesis_note` + - `placeholder` +- Formalized `source_status` enum: + - `representative` + - `derived_synthesis` + - `placeholder` + +Reason: + +- Current data already used `synthesis_note` and `derived_synthesis`. +- The schema now matches implementation data instead of leaving enum drift implicit. + +### `schemas/source_excerpt.schema.json` + +Change: + +- Added required `quote_status`. +- Added required `source_location`. +- Formalized `quote_status` enum: + - `exact` + - `condensed` + - `paraphrased` +- Formalized `excerpt_type` enum: + - `definition` + - `taxonomy` + - `mechanism` + - `application_rule` + - `value_claim` + - `boundary_rule` + - `validation_rule` + +Reason: + +- Distinguishes exact quotes from compressed or paraphrased evidence. +- Prevents `raw_excerpt` from silently containing condensed text. + +### `schemas/regression_case.schema.json` + +Change: + +- Expanded `case_type` enum: + - `positive` + - `boundary` + - `misuse` + - `no_call` + - `selector_gate` + - `pipeline` +- Added optional evaluable fields: + - `should_call_model` + - `expected_primary_model` + - `negative_expected_models` + - `expected_classification` + - `expected_dominant_scarcity` + - `expected_max_depth` + - `minimum_required_elements` + - `forbidden_elements` + - `evaluation_mode` + +Reason: + +- Supports no-call, false-positive, selector-gate, and structured review cases without adding LLM evaluation. + +## Not Changed + +### `schemas/model_card.schema.json` + +No new required model-card fields were added in this pass. + +Reason: + +- QPI and Intellectual Archaeology output contracts were strengthened in model JSON and cards. +- Making those fields schema-required is left for CCRA / Owner review to avoid over-weighting v0.2. + +### `schemas/model_index.schema.json` + +No additional index semantics were added in this pass. + +Reason: + +- Index continues to mirror model/card state and counts. +- Content review status remains in `reports/model_review_status.json`, not `model_index.json`. diff --git a/reports/selector_regression_report.md b/reports/selector_regression_report.md new file mode 100644 index 0000000..1887e87 --- /dev/null +++ b/reports/selector_regression_report.md @@ -0,0 +1,15 @@ +# Selector Regression Report + +This file is an audit-friendly alias for: + +- `reports/selector_regression_report_v0.2.md` + +Current status: `PASS` + +Summary: + +- Cases checked: 9 +- Failures: 0 +- no-call cases pass. +- QPI-before-IA gate cases pass. +- Pipeline gate cases pass. diff --git a/reports/selector_regression_report_v0.2.md b/reports/selector_regression_report_v0.2.md new file mode 100644 index 0000000..8ca8aa4 --- /dev/null +++ b/reports/selector_regression_report_v0.2.md @@ -0,0 +1,18 @@ +# Selector Regression Report v0.2 + +Status: `PASS` + +Cases checked: 9 +Failures: 0 + +## Cases + +- `case_ia_no_call_fact_001`: PASS; selected=[]; no_call=True +- `case_ia_no_call_edit_001`: PASS; selected=[]; no_call=True +- `case_ia_no_call_light_execution_001`: PASS; selected=[]; no_call=True +- `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_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 diff --git a/reports/selector_score_breakdown.md b/reports/selector_score_breakdown.md new file mode 100644 index 0000000..973d243 --- /dev/null +++ b/reports/selector_score_breakdown.md @@ -0,0 +1,24 @@ +# Selector Score Breakdown + +Selector v0.2 emits per-model score details from `scripts/run_selector_demo.py`. + +Current demo input: + +```text +团队每次都说要长期主义,但一到季度 KPI 就回到短期动作,这到底是什么问题? +``` + +Current output summary: + +| Model | Score | Decision | Reasons | Penalties | +| --- | ---: | --- | --- | --- | +| `qpi` | 0.44 | selected | pipeline_position matched; complexity signal: 长期; selection_priority=9 | none | +| `intellectual_archaeology` | 0.02 | rejected | complexity signal: 长期; selection_priority=7 | no IA heavy-depth gate | + +Rules represented: + +- Negative trigger first. +- No-call threshold. +- QPI-before-IA gate. +- Rejected model reasons. +- No LLM selector. diff --git a/reports/validation_report.md b/reports/validation_report.md new file mode 100644 index 0000000..c499e97 --- /dev/null +++ b/reports/validation_report.md @@ -0,0 +1,12 @@ +# Validation Report + +Status: `PASS` + +Command: `python scripts/validate_model_library.py` + +## Result + +- JSON 文件可解析。 +- 模型必填字段存在并符合本地 contract 子集。 +- source article、source excerpt、regression case 引用完整。 +- model/card index 引用完整,计数、状态和索引投影一致。 diff --git a/reports/内容修复检查摘要_v0.1.md b/reports/内容修复检查摘要_v0.1.md new file mode 100644 index 0000000..71e395e --- /dev/null +++ b/reports/内容修复检查摘要_v0.1.md @@ -0,0 +1,41 @@ +# 内容修复检查摘要 v0.1 + +## Scope + +本次检查对象: + +- `models/qpi.model.json` +- `models/intellectual_archaeology.model.json` +- `cards/qpi.md` +- `cards/intellectual_archaeology.md` +- `models/model_index.json` +- `cards/card_index.md` + +## Verification Commands + +```powershell +python -m unittest discover -s tests -p "test*.py" -v +python scripts\check_card_contract.py +python scripts\validate_model_library.py +python scripts\run_selector_demo.py +``` + +## Results + +- Unit tests: PASS, 9 tests. +- Card contract: PASS. +- Model library validation: PASS. +- Selector demo: PASS. +- `reports/validation_report.md`: `Status: PASS`. + +## Current Status + +QPI and Intellectual Archaeology content now passes the current local contract. + +The model assets remain `draft`, not final product-approved content. The next gate is owner content review for definition wording, evidence adequacy, boundaries, and selector behavior. + +## Notes + +- `scripts/run_selector_demo.py` returns both models with scores and reasons. +- Index entries are aligned with current model and card files. +- Test-generated `__pycache__` directories were removed after verification. diff --git a/reports/内容修复检查摘要_v0.2.md b/reports/内容修复检查摘要_v0.2.md new file mode 100644 index 0000000..1b0728e --- /dev/null +++ b/reports/内容修复检查摘要_v0.2.md @@ -0,0 +1,33 @@ +# 内容修复检查摘要 v0.2 + +## 范围 + +本摘要覆盖模型库 MVP 第二轮内容稳定化。 + +## 完成项 + +- 字段级 evidence coverage matrix 已建立。 +- source excerpt 已增加 `quote_status` 和 `source_location`。 +- QPI 输出契约已强化。 +- 思想考古停止门已强化。 +- regression cases 已扩展到每模型 17 条。 +- selector v0.2 已增加 no-call、negative trigger、QPI-before-IA gate 和 rejected reasons。 +- JSON / Markdown 硬字段同步检查已增加。 + +## 验证状态 + +| Check | Status | +| --- | --- | +| schema / model library validation | PASS | +| card contract check | PASS | +| index drift check | PASS | +| selector regression | PASS | +| JSON / Markdown sync | PASS | +| unit tests | PASS | + +## 当前状态 + +- QPI: `draft / B / pending` +- 思想考古: `draft / B / pending` +- stable: not allowed +- third model expansion: not allowed diff --git a/reports/规则Schema工作流检查摘要_v0.1.md b/reports/规则Schema工作流检查摘要_v0.1.md new file mode 100644 index 0000000..18c36c5 --- /dev/null +++ b/reports/规则Schema工作流检查摘要_v0.1.md @@ -0,0 +1,116 @@ +# 规则 Schema 工作流检查摘要 v0.1 + +## Completed + +- 新增 GPT 规划本地化协议。 +- 新增模型抽取规则。 +- 新增模型卡 Markdown contract。 +- 新增模型抽取 workflow。 +- 新增机器模型索引 `models/model_index.json`。 +- 新增人读模型卡索引 `cards/card_index.md`。 +- 新增权威机器模型卡 schema `schemas/model_card.schema.json`。 +- 新增 `schemas/model_index.schema.json`。 +- 新增 `schemas/card_index.schema.json`。 +- 为 source article、source excerpt、regression case schema 补充中文 `description`。 +- 为 regression case schema 增加 `case_type` 枚举:`positive`、`boundary`、`misuse`。 +- 升级 `scripts/validate_model_library.py`,增加本地 contract 子集、index、回归覆盖检查。 +- 新增 `scripts/check_card_contract.py`。 +- 新增 `scripts/run_selector_demo.py`。 +- 新增和更新单元测试。 +- 更新 README、workflow、schema/scripts/selector/cards/models 目录说明。 + +## Files Changed + +Created: + +- `docs/MODEL_CARD_CONTRACT.md` +- `docs/MODEL_EXTRACTION_WORKFLOW.md` +- `schemas/model_card.schema.json` +- `schemas/model_index.schema.json` +- `schemas/card_index.schema.json` +- `models/model_index.json` +- `cards/card_index.md` +- `scripts/check_card_contract.py` +- `scripts/run_selector_demo.py` +- `tests/test_card_contract.py` +- `reports/规则Schema工作流检查摘要_v0.1.md` + +Modified: + +- `README.md` +- `docs/WORKFLOW.md` +- `schemas/README.md` +- `schemas/source_article.schema.json` +- `schemas/source_excerpt.schema.json` +- `schemas/regression_case.schema.json` +- `scripts/README.md` +- `scripts/validate_model_library.py` +- `selector/README.md` +- `models/README.md` +- `cards/README.md` +- `tests/test_validate_model_library.py` +- `reports/validation_report.md` + +## Checks Run + +```powershell +python -m unittest discover -s tests -p "test*.py" -v +``` + +Result: + +- PASS +- 9 tests run. + +```powershell +python scripts\check_card_contract.py +``` + +Result: + +- FAIL as expected. +- Current `cards/qpi.md` and `cards/intellectual_archaeology.md` are still `draft_pre_contract` and do not yet contain all required headings. +- `cards/README.md` is now ignored by the checker. + +```powershell +python scripts\validate_model_library.py +``` + +Result: + +- FAIL as expected. +- Current `models/qpi.model.json` and `models/intellectual_archaeology.model.json` are still `draft_pre_contract`. +- Main failures are missing recommended/required GPT-plan fields, invalid enum values, invalid `selection_priority` range, and incomplete `stability_profile`. + +```powershell +python scripts\run_selector_demo.py +``` + +Result: + +- PASS. +- Demo outputs recommended model IDs, scores, reasons, and routing notes. +- Scores are low because current model JSON has not yet been repaired with trigger keywords and 1-10 priority values. + +## Known Limits + +- `scripts/validate_model_library.py` implements the local schema subset required by current contracts. It does not implement a complete JSON Schema draft 2020-12 engine. +- Current model/card content is intentionally not repaired in this pass. +- `models/model_index.json` and `cards/card_index.md` mark both sample models as `draft_pre_contract`. +- Selector demo works, but its output quality depends on model JSON fields that are not yet repaired. +- `card_index.schema.json` defines card index metadata, but `cards/card_index.md` itself is Markdown and is checked by local tooling rather than full JSON Schema. + +## Owner Review Checklist + +- GPT 规划是否已正确本地化? +- card contract 是否覆盖模型卡样例? +- model schema 是否覆盖机器 JSON 样例? +- index 设计是否满足当前和未来扩展? +- 工作流 gate 是否足以防止直接跳内容? +- 工具需求是否足够但不过度? +- 是否接受 `tests/regression_cases.json` 继续作为合并式 regression case 文件? +- 是否接受 `model_spec.schema.json` 暂时保留为 pre-contract legacy schema? + +## Do Not Proceed Before Owner Confirms + +Do not repair QPI or Intellectual Archaeology content until this foundation is reviewed or the owner explicitly authorizes content repair. diff --git a/schemas/README.md b/schemas/README.md index a275de8..a861c5e 100644 --- a/schemas/README.md +++ b/schemas/README.md @@ -1,12 +1,17 @@ # Schemas -This folder will contain JSON Schema files for machine-readable project data. +This folder contains JSON Schema files for machine-readable project data. -Expected future files: +Current files: - `model_card.schema.json` +- `model_spec.schema.json` - `source_article.schema.json` - `source_excerpt.schema.json` - `regression_case.schema.json` +- `model_index.schema.json` +- `card_index.schema.json` -Do not add schema complexity before the first two sample models are stable enough to validate. +`model_card.schema.json` is the authoritative schema for machine-readable model cards. + +`model_spec.schema.json` is retained as a pre-contract draft schema until existing model files are migrated. diff --git a/schemas/card_index.schema.json b/schemas/card_index.schema.json new file mode 100644 index 0000000..c1ee56a --- /dev/null +++ b/schemas/card_index.schema.json @@ -0,0 +1,16 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "title": "Card Index Metadata", + "description": "人读模型卡索引元数据 schema。", + "type": "object", + "required": ["index_version", "last_updated", "required_columns"], + "properties": { + "index_version": {"type": "string", "description": "卡片索引版本。"}, + "last_updated": {"type": "string", "description": "最后更新时间。"}, + "required_columns": { + "type": "array", + "description": "card_index.md 表格必须包含的列名。", + "items": {"type": "string"} + } + } +} diff --git a/schemas/model_card.schema.json b/schemas/model_card.schema.json new file mode 100644 index 0000000..8e7aced --- /dev/null +++ b/schemas/model_card.schema.json @@ -0,0 +1,260 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "title": "Cognitive Model Card", + "description": "机器可读认知模型卡 schema。字段名使用英文,中文来源的字段值应保持中文。", + "type": "object", + "required": [ + "model_id", + "model_name", + "model_type", + "pipeline_position", + "one_sentence_definition", + "core_question", + "core_mechanism", + "status", + "source_articles", + "source_evidence", + "input_types", + "output_types", + "call_when", + "do_not_call_when", + "trigger_keywords", + "negative_triggers", + "related_models", + "conflicting_models", + "disciplinary_anchors", + "common_misuses", + "failure_modes", + "selection_priority", + "confidence_level", + "stability_profile", + "regression_status", + "example_inputs", + "example_outputs", + "output_contract", + "productization_notes", + "version", + "last_updated" + ], + "properties": { + "model_id": { + "type": "string", + "description": "稳定机器 ID,供 JSON、证据、回归测试、selector 和索引引用。" + }, + "model_name": { + "type": "string", + "description": "模型中文名称。" + }, + "model_type": { + "type": "string", + "description": "模型类型。", + "enum": [ + "routing_model", + "deep_modeling_model", + "lens_model", + "diagnostic_model", + "evaluation_model", + "generation_model", + "conflict_resolution_model", + "stabilization_model" + ] + }, + "pipeline_position": { + "type": "string", + "description": "模型在处理流程中的位置。", + "enum": [ + "pre_analysis", + "analysis", + "deep_analysis", + "synthesis", + "red_team", + "evaluation", + "post_processing" + ] + }, + "one_sentence_definition": { + "type": "string", + "description": "一句话定义模型的用途和边界。" + }, + "core_question": { + "type": "string", + "description": "模型主要回答的核心问题。" + }, + "core_mechanism": { + "type": "string", + "description": "模型的核心运作机制。" + }, + "status": { + "type": "string", + "description": "模型资产状态。状态升级必须由 owner / ChatGPT / CCRA 明确决定,不能由验证脚本自动升级。", + "enum": ["draft", "review", "reviewed", "callable", "stable", "archived", "deprecated", "draft_pre_contract"] + }, + "source_articles": { + "type": "array", + "description": "引用的 source article ID 列表。", + "items": {"type": "string"} + }, + "source_evidence": { + "type": "array", + "description": "引用的 source excerpt ID 列表。", + "items": {"type": "string"} + }, + "input_types": { + "type": "array", + "description": "模型可接受的输入类型。", + "items": {"type": "string"} + }, + "output_types": { + "type": "array", + "description": "模型应产出的输出类型。", + "items": {"type": "string"} + }, + "call_when": { + "type": "array", + "description": "应调用该模型的场景。", + "items": {"type": "string"} + }, + "do_not_call_when": { + "type": "array", + "description": "不应调用该模型的场景。", + "items": {"type": "string"} + }, + "trigger_keywords": { + "type": "array", + "description": "提示可能调用该模型的关键词或表达。", + "items": {"type": "string"} + }, + "negative_triggers": { + "type": "array", + "description": "提示不应调用该模型的关键词或表达。", + "items": {"type": "string"} + }, + "related_models": { + "type": "array", + "description": "可前置、后置或并行调用的相关模型 ID。", + "items": {"type": "string"} + }, + "conflicting_models": { + "type": "array", + "description": "可能与该模型冲突或需要仲裁的模型 ID。", + "items": {"type": "string"} + }, + "disciplinary_anchors": { + "type": "array", + "description": "模型关联的学科、理论或知识底座。", + "items": {"type": "string"} + }, + "common_misuses": { + "type": "array", + "description": "常见误用方式。", + "items": {"type": "string"} + }, + "failure_modes": { + "type": "array", + "description": "调用失败或输出失稳的信号。", + "items": {"type": "string"} + }, + "selection_priority": { + "type": "integer", + "description": "selector 选择优先级,范围 1-10。", + "minimum": 1, + "maximum": 10 + }, + "confidence_level": { + "type": "string", + "description": "当前可信度等级。", + "enum": ["high", "medium", "low"] + }, + "stability_profile": { + "type": "object", + "description": "稳固性评估。", + "required": [ + "stability_level", + "needs_stabilization", + "main_risks", + "reason", + "next_stabilization_action" + ], + "properties": { + "stability_level": { + "type": "string", + "description": "稳固性等级。", + "enum": ["A", "B", "C", "D"] + }, + "needs_stabilization": { + "type": "boolean", + "description": "是否仍需要稳定化。" + }, + "main_risks": { + "type": "array", + "description": "主要风险。", + "items": {"type": "string"} + }, + "reason": { + "type": "string", + "description": "当前稳固性评级理由。" + }, + "next_stabilization_action": { + "type": "string", + "description": "下一步稳定化动作。" + }, + "stabilization_notes": { + "type": "string", + "description": "其他稳定化说明。" + } + } + }, + "regression_status": { + "type": "string", + "description": "回归测试状态。", + "enum": [ + "not_started", + "pending", + "in_progress", + "passed", + "failed", + "needs_rebuild" + ] + }, + "example_inputs": { + "type": "array", + "description": "示例输入。", + "items": {"type": "string"} + }, + "example_outputs": { + "type": "array", + "description": "示例输出。", + "items": {"type": "string"} + }, + "output_contract": { + "type": "array", + "description": "输出必须包含的结构或要素。", + "items": {"type": "string"} + }, + "structured_output_contract": { + "type": "object", + "description": "模型专属运行输出契约。该字段允许每个模型声明自己的 required runtime output fields;字段是否完整由本地 validator 的模型专属检查负责,不进入全局顶层 required。" + }, + "depth_control": { + "type": "object", + "description": "深度控制、停止条件或过度调用警告。" + }, + "stabilization_path": { + "type": "array", + "description": "稳定化路径。", + "items": {"type": "string"} + }, + "productization_notes": { + "type": "string", + "description": "产品化、selector、workflow 或集成说明。" + }, + "version": { + "type": "string", + "description": "模型卡版本。" + }, + "last_updated": { + "type": "string", + "description": "最后更新日期。" + } + } +} diff --git a/schemas/model_index.schema.json b/schemas/model_index.schema.json new file mode 100644 index 0000000..d186be7 --- /dev/null +++ b/schemas/model_index.schema.json @@ -0,0 +1,48 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "title": "Model Index", + "description": "机器可读模型索引 schema。", + "type": "object", + "required": ["index_version", "last_updated", "models"], + "properties": { + "index_version": {"type": "string", "description": "索引版本。"}, + "last_updated": {"type": "string", "description": "索引最后更新时间。"}, + "models": { + "type": "array", + "description": "模型索引条目。", + "items": { + "type": "object", + "required": [ + "model_id", + "model_name", + "model_type", + "pipeline_position", + "model_file", + "card_file", + "source_article_count", + "source_evidence_count", + "regression_case_count", + "stability_level", + "regression_status", + "status", + "last_updated" + ], + "properties": { + "model_id": {"type": "string", "description": "模型 ID。"}, + "model_name": {"type": "string", "description": "模型中文名称。"}, + "model_type": {"type": "string", "description": "模型类型。"}, + "pipeline_position": {"type": "string", "description": "模型所在流程位置。"}, + "model_file": {"type": "string", "description": "模型 JSON 文件路径。"}, + "card_file": {"type": "string", "description": "Markdown 模型卡文件路径。"}, + "source_article_count": {"type": "integer", "description": "引用来源文章数量。"}, + "source_evidence_count": {"type": "integer", "description": "引用证据片段数量。"}, + "regression_case_count": {"type": "integer", "description": "回归测试用例数量。"}, + "stability_level": {"type": "string", "description": "稳固性等级。"}, + "regression_status": {"type": "string", "description": "回归测试状态。"}, + "status": {"type": "string", "description": "索引条目状态,例如 draft、active、deprecated、draft_pre_contract。"}, + "last_updated": {"type": "string", "description": "模型 JSON 最后更新日期。"} + } + } + } + } +} diff --git a/schemas/model_spec.schema.json b/schemas/model_spec.schema.json new file mode 100644 index 0000000..911d10a --- /dev/null +++ b/schemas/model_spec.schema.json @@ -0,0 +1,49 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "title": "Model Spec", + "type": "object", + "required": [ + "model_id", + "model_name", + "model_type", + "pipeline_position", + "one_sentence_definition", + "core_question", + "core_mechanism", + "source_articles", + "source_evidence", + "input_types", + "output_types", + "call_when", + "do_not_call_when", + "common_misuses", + "failure_modes", + "selection_priority", + "confidence_level", + "stability_profile", + "regression_status", + "productization_notes" + ], + "properties": { + "model_id": {"type": "string"}, + "model_name": {"type": "string"}, + "model_type": {"type": "string"}, + "pipeline_position": {"type": "string"}, + "one_sentence_definition": {"type": "string"}, + "core_question": {"type": "string"}, + "core_mechanism": {"type": "string"}, + "source_articles": {"type": "array", "items": {"type": "string"}}, + "source_evidence": {"type": "array", "items": {"type": "string"}}, + "input_types": {"type": "array", "items": {"type": "string"}}, + "output_types": {"type": "array", "items": {"type": "string"}}, + "call_when": {"type": "array", "items": {"type": "string"}}, + "do_not_call_when": {"type": "array", "items": {"type": "string"}}, + "common_misuses": {"type": "array", "items": {"type": "string"}}, + "failure_modes": {"type": "array", "items": {"type": "string"}}, + "selection_priority": {"type": "integer"}, + "confidence_level": {"type": "string"}, + "stability_profile": {"type": "object"}, + "regression_status": {"type": "string"}, + "productization_notes": {"type": "array", "items": {"type": "string"}} + } +} diff --git a/schemas/regression_case.schema.json b/schemas/regression_case.schema.json new file mode 100644 index 0000000..3c263ed --- /dev/null +++ b/schemas/regression_case.schema.json @@ -0,0 +1,53 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "title": "Regression Case", + "description": "认知模型回归测试用例 schema。", + "type": "object", + "required": [ + "case_id", + "model_id", + "case_type", + "input", + "expected_behavior", + "failure_signal" + ], + "properties": { + "case_id": {"type": "string", "description": "测试用例 ID。"}, + "model_id": {"type": "string", "description": "被测试模型 ID。"}, + "case_type": { + "type": "string", + "description": "用例类型。", + "enum": ["positive", "boundary", "misuse", "no_call", "selector_gate", "pipeline"] + }, + "input": {"type": "string", "description": "测试输入。"}, + "expected_behavior": {"type": "string", "description": "期望行为。"}, + "failure_signal": {"type": "string", "description": "失败信号。"}, + "expected_output_elements": {"type": "array", "description": "期望输出包含的要素。", "items": {"type": "string"}}, + "should_call_model": {"type": "boolean", "description": "该模型是否应该被调用。"}, + "expected_primary_model": {"type": "string", "description": "期望首选模型 ID。"}, + "negative_expected_models": {"type": "array", "description": "不应被召回的模型 ID。", "items": {"type": "string"}}, + "expected_classification": { + "type": "string", + "description": "QPI 分类期望。", + "enum": ["question", "problem", "issue", "mixed", "no_call", "not_applicable"] + }, + "expected_dominant_scarcity": { + "type": "string", + "description": "期望主导匮乏物。", + "enum": ["data", "path_resource", "consensus_order", "mixed", "unknown", "not_applicable"] + }, + "expected_max_depth": { + "type": "string", + "description": "思想考古期望最大下潜层级。", + "enum": ["application", "domain", "process", "purpose", "core_mechanism", "human_capability", "philosophical_bedrock", "no_call", "not_applicable"] + }, + "minimum_required_elements": {"type": "array", "description": "必须出现的输出元素。", "items": {"type": "string"}}, + "forbidden_elements": {"type": "array", "description": "不应出现的输出元素。", "items": {"type": "string"}}, + "evaluation_mode": { + "type": "string", + "description": "评估模式。", + "enum": ["manual", "keyword", "structured", "semantic"] + }, + "notes": {"type": "string", "description": "补充说明。"} + } +} diff --git a/schemas/source_article.schema.json b/schemas/source_article.schema.json new file mode 100644 index 0000000..e7b937e --- /dev/null +++ b/schemas/source_article.schema.json @@ -0,0 +1,32 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "title": "Source Article", + "description": "来源文章记录 schema。", + "type": "object", + "required": [ + "source_id", + "title", + "source_type", + "related_models", + "source_status" + ], + "properties": { + "source_id": {"type": "string", "description": "来源文章 ID。"}, + "title": {"type": "string", "description": "来源标题。"}, + "source_type": { + "type": "string", + "description": "来源类型。", + "enum": ["original_article", "synthesis_note", "placeholder"] + }, + "related_models": {"type": "array", "description": "关联模型 ID 列表。", "items": {"type": "string"}}, + "source_status": { + "type": "string", + "description": "来源状态。", + "enum": ["representative", "derived_synthesis", "placeholder"] + }, + "author": {"type": "string", "description": "作者。"}, + "date": {"type": "string", "description": "来源日期。"}, + "file_path": {"type": "string", "description": "本地来源路径。"}, + "notes": {"type": "string", "description": "补充说明。"} + } +} diff --git a/schemas/source_excerpt.schema.json b/schemas/source_excerpt.schema.json new file mode 100644 index 0000000..685f23e --- /dev/null +++ b/schemas/source_excerpt.schema.json @@ -0,0 +1,37 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "title": "Source Excerpt", + "description": "来源证据片段 schema。", + "type": "object", + "required": [ + "excerpt_id", + "source_id", + "related_model_id", + "excerpt_type", + "summary", + "used_for", + "quote_status", + "source_location" + ], + "properties": { + "excerpt_id": {"type": "string", "description": "证据片段 ID。"}, + "source_id": {"type": "string", "description": "所属来源文章 ID。"}, + "related_model_id": {"type": "string", "description": "关联模型 ID。"}, + "excerpt_type": { + "type": "string", + "description": "证据类型。", + "enum": ["definition", "taxonomy", "mechanism", "application_rule", "value_claim", "boundary_rule", "validation_rule"] + }, + "summary": {"type": "string", "description": "证据片段摘要。"}, + "used_for": {"type": "array", "description": "该证据支撑的模型字段或用途。", "items": {"type": "string"}}, + "quote_status": { + "type": "string", + "description": "raw_excerpt 的摘录状态。exact 表示准确摘录;condensed 表示压缩摘录;paraphrased 表示转述。", + "enum": ["exact", "condensed", "paraphrased"] + }, + "raw_excerpt": {"type": "string", "description": "原文摘录、压缩摘录、转述或明确标注的 placeholder。"}, + "source_location": {"type": "string", "description": "章节、段落、标题或行号;未知则写 unknown。"}, + "confidence": {"type": "string", "description": "证据可信度。", "enum": ["high", "medium", "low"]}, + "notes": {"type": "string", "description": "补充说明。"} + } +} diff --git a/scripts/README.md b/scripts/README.md index 992ea42..05b3b6c 100644 --- a/scripts/README.md +++ b/scripts/README.md @@ -1,12 +1,50 @@ # Scripts -This folder will contain simple local scripts for validation and selector demos. +This folder contains simple local scripts for validation and selector demos. -Expected future scripts: +Current script: -- `validate_models.py` -- `validate_sources.py` -- `validate_tests.py` +- `validate_model_library.py` +- `check_card_contract.py` +- `rebuild_indexes.py` +- `check_model_card_sync.py` +- `run_selector_regression.py` - `run_selector_demo.py` +Run: + +```powershell +python scripts\validate_model_library.py +``` + +The script checks JSON parsing, required model fields, unique IDs, source references, excerpt references, regression case model references, and model/card index drift. It writes `reports/validation_report.md`. + +Rebuild or check model/card indexes: + +```powershell +python scripts\rebuild_indexes.py --write +python scripts\rebuild_indexes.py --check +``` + +The index script regenerates `models/model_index.json` and `cards/card_index.md` from model JSON, card files, and regression cases. It writes `reports/index_rebuild_report.md`. + +Run the card contract checker: + +```powershell +python scripts\check_card_contract.py +``` + +Run the selector demo: + +```powershell +python scripts\run_selector_demo.py +``` + +Run selector regression and model/card sync checks: + +```powershell +python scripts\run_selector_regression.py +python scripts\check_model_card_sync.py +``` + Prefer Python standard library before adding dependencies. diff --git a/scripts/check_card_contract.py b/scripts/check_card_contract.py new file mode 100644 index 0000000..c3cff91 --- /dev/null +++ b/scripts/check_card_contract.py @@ -0,0 +1,72 @@ +import re +import sys +from pathlib import Path + + +def required_headings(root): + contract_path = Path(root) / "docs" / "MODEL_CARD_CONTRACT.md" + if not contract_path.exists(): + return [], [f"missing file {contract_path.as_posix()}"] + + headings = [] + in_required_sections = False + for line in contract_path.read_text(encoding="utf-8").splitlines(): + if line.strip() == "## Required Sections": + in_required_sections = True + continue + if in_required_sections and line.startswith("## "): + title = line[3:].strip() + if title and title not in {"Additional Sections"}: + headings.append(title) + if in_required_sections and line.strip() == "## Additional Sections": + break + return headings, [] + + +def card_headings(path): + headings = set() + for line in path.read_text(encoding="utf-8").splitlines(): + match = re.match(r"^##\s+(.+?)\s*$", line) + if match: + headings.add(match.group(1).strip()) + return headings + + +def check_cards(root): + root = Path(root) + headings, errors = required_headings(root) + if errors: + return errors + + cards_dir = root / "cards" + if not cards_dir.exists(): + return ["missing directory cards"] + + ignored_names = {"README.md", "card_index.md"} + card_paths = sorted(path for path in cards_dir.glob("*.md") if path.name not in ignored_names) + if not card_paths: + return ["cards/ contains no Markdown model cards"] + + results = [] + for path in card_paths: + present = card_headings(path) + relative_path = path.relative_to(root).as_posix() + for heading in headings: + if heading not in present: + results.append(f"{relative_path} missing required heading ## {heading}") + return results + + +def main(): + root = Path(__file__).resolve().parents[1] + errors = check_cards(root) + if errors: + for error in errors: + print(f"ERROR: {error}") + return 1 + print("card contract check passed") + return 0 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/scripts/check_model_card_sync.py b/scripts/check_model_card_sync.py new file mode 100644 index 0000000..c979731 --- /dev/null +++ b/scripts/check_model_card_sync.py @@ -0,0 +1,131 @@ +import json +import sys +from pathlib import Path + + +KEY_CONTRACT_TERMS = { + "qpi": [ + "problem_owner", + "time_scale", + "dominant_scarcity", + "evidence_gap", + "classification", + "no_call" + ], + "intellectual_archaeology": [ + "should_call", + "recommended_max_depth", + "stop_reason", + "no_deeper_reason", + "validation_needed", + "action_implication" + ] +} + + +def read_json(path): + return json.loads(path.read_text(encoding="utf-8")) + + +def card_path_for_model(root, model_id): + return root / "cards" / f"{model_id}.md" + + +def check_model_card(root, model_path): + model = read_json(model_path) + model_id = model["model_id"] + card_path = card_path_for_model(root, model_id) + errors = [] + manual_review = [] + + if not card_path.exists(): + return [f"missing card {card_path.relative_to(root).as_posix()}"], [] + + text = card_path.read_text(encoding="utf-8") + hard_values = [ + model_id, + model["model_name"], + model["model_type"], + model["pipeline_position"], + model["regression_status"], + model["version"], + model["last_updated"], + model.get("status", "") + ] + stability_level = model.get("stability_profile", {}).get("stability_level") + if stability_level: + hard_values.append(stability_level) + + for value in hard_values: + if value and value not in text: + errors.append(f"{model_id} card missing hard value {value}") + + for source_id in model.get("source_articles", []): + if source_id not in text: + errors.append(f"{model_id} card missing source article {source_id}") + + for excerpt_id in model.get("source_evidence", []): + if excerpt_id not in text: + errors.append(f"{model_id} card missing source evidence {excerpt_id}") + + for term in KEY_CONTRACT_TERMS.get(model_id, []): + if term not in text: + errors.append(f"{model_id} card missing key contract term {term}") + + manual_review.append(f"{model_id}: long Chinese definitions, examples, and risk notes require human semantic review.") + return errors, manual_review + + +def write_report(root, errors, manual_review): + report_path = root / "reports" / "model_card_sync_report_v0.2.md" + lines = [ + "# Model Card Sync Report v0.2", + "", + f"Status: `{'PASS' if not errors else 'FAIL'}`", + "", + ] + if errors: + lines.append("## Errors") + lines.append("") + lines.extend(f"- {error}" for error in errors) + lines.append("") + else: + lines.append("## Hard-Field Result") + lines.append("") + lines.append("- Model IDs, names, types, pipeline positions, source IDs, evidence IDs, stability fields, regression status, version, and last_updated are present in Markdown cards.") + lines.append("- Key output contract and depth-control terms are present.") + lines.append("") + + lines.append("## Manual Review Items") + lines.append("") + lines.extend(f"- {item}" for item in manual_review) + report_path.write_text("\n".join(lines) + "\n", encoding="utf-8") + return report_path + + +def check_sync(root): + root = Path(root) + errors = [] + manual_review = [] + for model_path in sorted((root / "models").glob("*.model.json")): + model_errors, model_manual_review = check_model_card(root, model_path) + errors.extend(model_errors) + manual_review.extend(model_manual_review) + report_path = write_report(root, errors, manual_review) + return errors, report_path + + +def main(): + root = Path(__file__).resolve().parents[1] + errors, report_path = check_sync(root) + print(f"model/card sync report written to {report_path}") + if errors: + for error in errors: + print(f"ERROR: {error}") + return 1 + print("model/card sync passed") + return 0 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/scripts/rebuild_indexes.py b/scripts/rebuild_indexes.py new file mode 100644 index 0000000..3ba7843 --- /dev/null +++ b/scripts/rebuild_indexes.py @@ -0,0 +1,183 @@ +import argparse +import json +import sys +from dataclasses import dataclass +from datetime import date +from pathlib import Path + + +IGNORED_CARD_NAMES = {"README.md", "card_index.md"} + + +@dataclass +class RebuildResult: + drift_found: bool + differences: list + report_path: Path + + +def read_json(path): + return json.loads(path.read_text(encoding="utf-8")) + + +def write_text(path, text): + path.parent.mkdir(parents=True, exist_ok=True) + path.write_text(text, encoding="utf-8") + + +def regression_case_counts(root): + path = root / "tests" / "regression_cases.json" + if not path.exists(): + return {} + data = read_json(path) + counts = {} + for case in data.get("regression_cases", []): + model_id = case.get("model_id") + if model_id: + counts[model_id] = counts.get(model_id, 0) + 1 + return counts + + +def card_path_for_model(root, model_id): + path = root / "cards" / f"{model_id}.md" + if path.exists(): + return path.relative_to(root).as_posix() + return f"cards/{model_id}.md" + + +def existing_index_version(root): + path = root / "models" / "model_index.json" + if not path.exists(): + return "0.1" + try: + data = read_json(path) + except json.JSONDecodeError: + return "0.1" + return data.get("index_version", "0.1") + + +def build_model_index(root): + counts = regression_case_counts(root) + models = [] + for model_path in sorted((root / "models").glob("*.model.json")): + model = read_json(model_path) + model_id = model["model_id"] + models.append({ + "model_id": model_id, + "model_name": model["model_name"], + "model_type": model["model_type"], + "pipeline_position": model["pipeline_position"], + "model_file": model_path.relative_to(root).as_posix(), + "card_file": card_path_for_model(root, model_id), + "source_article_count": len(model.get("source_articles", [])), + "source_evidence_count": len(model.get("source_evidence", [])), + "regression_case_count": counts.get(model_id, 0), + "stability_level": model.get("stability_profile", {}).get("stability_level"), + "regression_status": model.get("regression_status"), + "status": model.get("status"), + "last_updated": model.get("last_updated") + }) + + return { + "index_version": existing_index_version(root), + "last_updated": date.today().isoformat(), + "models": sorted(models, key=lambda item: item["model_id"]) + } + + +def render_json(data): + return json.dumps(data, ensure_ascii=False, indent=2) + "\n" + + +def render_card_index(model_index): + lines = [ + "# Card Index", + "", + "| Model ID | 模型名称 | 类型 | 流程位置 | Card | Model JSON | 稳固性 | 回归状态 | 状态 |", + "| --- | --- | --- | --- | --- | --- | --- | --- | --- |", + ] + for entry in model_index["models"]: + lines.append( + "| {model_id} | {model_name} | {model_type} | {pipeline_position} | " + "`{card_file}` | `{model_file}` | {stability_level} | {regression_status} | {status} |".format(**entry) + ) + return "\n".join(lines) + "\n" + + +def collect_differences(root, expected_model_index_text, expected_card_index_text): + checks = [ + (root / "models" / "model_index.json", expected_model_index_text, "models/model_index.json"), + (root / "cards" / "card_index.md", expected_card_index_text, "cards/card_index.md"), + ] + differences = [] + for path, expected_text, label in checks: + if not path.exists(): + differences.append(f"{label} is missing") + continue + actual_text = path.read_text(encoding="utf-8") + if actual_text != expected_text: + differences.append(f"{label} differs from generated index") + return differences + + +def write_report(root, mode, differences): + report_path = root / "reports" / "index_rebuild_report.md" + lines = [ + "# Index Rebuild Report", + "", + f"Mode: `{mode}`", + f"Status: `{'DRIFT' if differences else 'PASS'}`", + "", + ] + if differences: + lines.append("## Differences") + lines.append("") + lines.extend(f"- {difference}" for difference in differences) + else: + lines.append("## Result") + lines.append("") + lines.append("- models/model_index.json matches generated model registry.") + lines.append("- cards/card_index.md matches generated card index.") + write_text(report_path, "\n".join(lines) + "\n") + return report_path + + +def rebuild_indexes(root, write=False): + root = Path(root) + model_index = build_model_index(root) + model_index_text = render_json(model_index) + card_index_text = render_card_index(model_index) + + if write: + write_text(root / "models" / "model_index.json", model_index_text) + write_text(root / "cards" / "card_index.md", card_index_text) + differences = [] + mode = "write" + else: + differences = collect_differences(root, model_index_text, card_index_text) + mode = "check" + + report_path = write_report(root, mode, differences) + return RebuildResult(bool(differences), differences, report_path) + + +def main(): + parser = argparse.ArgumentParser(description="Rebuild or check model and card indexes.") + group = parser.add_mutually_exclusive_group(required=True) + group.add_argument("--check", action="store_true", help="Check generated indexes against files without writing them.") + group.add_argument("--write", action="store_true", help="Write generated indexes to disk.") + args = parser.parse_args() + + root = Path(__file__).resolve().parents[1] + result = rebuild_indexes(root, write=args.write) + print(f"index rebuild report written to {result.report_path}") + if result.drift_found: + for difference in result.differences: + print(f"DRIFT: {difference}") + return 1 + print("index check passed") + return 0 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/scripts/run_selector_demo.py b/scripts/run_selector_demo.py new file mode 100644 index 0000000..a06ecb5 --- /dev/null +++ b/scripts/run_selector_demo.py @@ -0,0 +1,176 @@ +import json +import sys +from pathlib import Path + + +def read_json(path): + return json.loads(Path(path).read_text(encoding="utf-8")) + + +def load_models(root): + return [read_json(path) for path in sorted((root / "models").glob("*.model.json"))] + + +def load_selector_rules(root): + return read_json(root / "selector" / "selector_rules.json") + + +def rules_by_model(selector_rules): + return {item["model_id"]: item for item in selector_rules.get("models", [])} + + +def hit_any(user_input, signals): + return [signal for signal in signals if signal in user_input] + + +def has_analysis_override(user_input, global_rules): + return bool(hit_any(user_input, global_rules.get("explicit_analysis_override_phrases", []))) + + +def hard_no_call_hits(user_input, global_rules): + return hit_any(user_input, global_rules.get("hard_no_call_signals", [])) + + +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", {}) + score = float(model_rule.get("base_score", 0)) / 100 + reasons = [] + penalties = [] + + negative_hits = hit_any(user_input, model_rule.get("negative_triggers", [])) + hit_any(user_input, model.get("negative_triggers", [])) + if negative_hits: + penalty_key = "model_negative_penalty_qpi" if model_id == "qpi" else "model_negative_penalty_default" + score -= weights.get(penalty_key, 0.5) + penalties.append("negative trigger: " + "、".join(sorted(set(negative_hits))[:4])) + + trigger_hits = hit_any(user_input, model_rule.get("trigger_keywords", [])) + hit_any(user_input, model.get("trigger_keywords", [])) + trigger_hits = sorted(set(trigger_hits), key=trigger_hits.index) + if trigger_hits: + score += weights.get("trigger_keyword", 0.25) + reasons.append("trigger keyword matched: " + "、".join(trigger_hits[:4])) + + input_type_matches = model_rule.get("input_type_matches", []) + model.get("input_types", []) + input_hits = [input_type for input_type in input_type_matches if input_type in user_input or input_type == task_type] + if input_hits: + score += weights.get("input_type", 0.15) + reasons.append("input type matched: " + "、".join(input_hits[:3])) + + if pipeline_position and model.get("pipeline_position") == pipeline_position: + score += weights.get("pipeline_position", 0.2) + reasons.append("pipeline_position matched") + + complexity_hits = hit_any(user_input, global_rules.get("complexity_signals", [])) + if complexity_hits: + score += weights.get("complexity_signal", 0.15) + reasons.append("complexity signal: " + "、".join(complexity_hits[:4])) + + priority = model.get("selection_priority") + if isinstance(priority, int): + score += max(0, min(priority, 10)) * weights.get("selection_priority_factor", 0.01) + reasons.append(f"selection_priority={priority}") + + qpi_gate_hits = hit_any(user_input, global_rules.get("qpi_gate_signals", [])) + if model_id == "qpi" and qpi_gate_hits: + score += weights.get("qpi_gate_bonus", 0.25) + reasons.append("QPI problem-definition gate matched") + if model_id == "qpi" and "QPI 已判断" in user_input: + score -= weights.get("qpi_already_completed_penalty", 0.25) + penalties.append("QPI already completed") + + if model_id == "intellectual_archaeology": + heavy_hits = hit_any(user_input, global_rules.get("ia_heavy_signals", [])) + if heavy_hits: + score += weights.get("ia_heavy_bonus", 0.2) + reasons.append("IA heavy-depth signal: " + "、".join(heavy_hits[:3])) + if "QPI 已判断" in user_input: + score += weights.get("ia_qpi_completed_bonus", 0.25) + reasons.append("QPI-before-IA gate satisfied") + if global_rules.get("qpi_before_ia_gate", True) and qpi_gate_hits and "QPI 已判断" not in user_input: + score -= weights.get("ia_qpi_gate_penalty", 0.45) + penalties.append("QPI-before-IA gate: " + "、".join(qpi_gate_hits[:3])) + if not heavy_hits and "QPI 已判断" not in user_input: + score -= weights.get("ia_no_heavy_gate_penalty", 0.2) + penalties.append("no IA heavy-depth gate") + + score = min(max(score, 0.0), 1.0) + return { + "model_id": model_id, + "score": round(score, 2), + "reasons": reasons, + "penalties": penalties + } + + +def hard_no_call_result(root, user_input, hits): + rejected = [] + for model in load_models(root): + rejected.append({ + "model_id": model.get("model_id"), + "score": 0.0, + "reasons": [], + "penalties": ["hard no-call signal: " + "、".join(sorted(set(hits))[:4])], + "decision": "rejected" + }) + return { + "input": user_input, + "selected_models": [], + "rejected_models": rejected, + "no_call": True, + "routing_notes": "hard no-call gate matched; explicit analysis override was not present." + } + + +def recommend(root, user_input, task_type="", pipeline_position="", threshold=None): + selector_rules = load_selector_rules(root) + global_rules = selector_rules.get("global_rules", {}) + threshold = global_rules.get("no_call_threshold", 0.35) if threshold is None else threshold + + no_call_hits = hard_no_call_hits(user_input, global_rules) + if global_rules.get("hard_no_call_first", True) and no_call_hits and not has_analysis_override(user_input, global_rules): + 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) + ] + no_call = all(item["score"] < threshold for item in scored) + selected = [] + rejected = [] + + for item in scored: + output_item = { + "model_id": item["model_id"], + "score": item["score"], + "reasons": item["reasons"], + "penalties": item["penalties"], + "decision": "selected" if item["score"] >= threshold and not no_call else "rejected" + } + if output_item["decision"] == "selected": + selected.append(output_item) + else: + rejected.append(output_item) + + selected.sort(key=lambda item: item["score"], reverse=True) + rejected.sort(key=lambda item: item["score"], reverse=True) + + return { + "input": user_input, + "selected_models": selected, + "rejected_models": rejected, + "no_call": no_call, + "routing_notes": "selector is rule-based and driven by selector/selector_rules.json; no LLM, no vector search, no answer generation." + } + + +def main(): + root = Path(__file__).resolve().parents[1] + example = "团队每次都说要长期主义,但一到季度 KPI 就回到短期动作,这到底是什么问题?" + result = recommend(root, example, task_type="question_analysis", pipeline_position="pre_analysis") + print(json.dumps(result, ensure_ascii=False, indent=2)) + return 0 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/scripts/run_selector_regression.py b/scripts/run_selector_regression.py new file mode 100644 index 0000000..531a884 --- /dev/null +++ b/scripts/run_selector_regression.py @@ -0,0 +1,90 @@ +import json +import sys +from pathlib import Path + +from run_selector_demo import recommend + + +def read_json(path): + return json.loads(Path(path).read_text(encoding="utf-8")) + + +def load_selector_cases(root): + cases = [] + for path in sorted((root / "tests").glob("*.regression.json")): + data = read_json(path) + for case in data.get("regression_cases", []): + if case.get("case_type") in {"no_call", "selector_gate", "pipeline"}: + cases.append(case) + return cases + + +def evaluate_case(root, case): + result = recommend(root, case["input"]) + selected_ids = [item["model_id"] for item in result["selected_models"]] + errors = [] + + expected_primary = case.get("expected_primary_model") + if expected_primary and expected_primary != "none": + if not selected_ids or selected_ids[0] != expected_primary: + errors.append(f"expected primary {expected_primary}, got {selected_ids[:1] or ['none']}") + + if expected_primary == "none" and result["selected_models"]: + errors.append(f"expected no selected model, got {selected_ids}") + + for model_id in case.get("negative_expected_models", []): + if model_id in selected_ids: + errors.append(f"negative model selected: {model_id}") + + if case.get("should_call_model") is False and case.get("model_id") in selected_ids: + errors.append(f"case model should not be called: {case.get('model_id')}") + + return { + "case_id": case["case_id"], + "case_type": case["case_type"], + "input": case["input"], + "selected_models": selected_ids, + "no_call": result["no_call"], + "errors": errors + } + + +def write_report(root, results): + report_path = root / "reports" / "selector_regression_report_v0.2.md" + failures = [result for result in results if result["errors"]] + lines = [ + "# Selector Regression Report v0.2", + "", + f"Status: `{'PASS' if not failures else 'FAIL'}`", + "", + f"Cases checked: {len(results)}", + f"Failures: {len(failures)}", + "", + "## Cases", + "" + ] + for result in results: + status = "PASS" if not result["errors"] else "FAIL" + lines.append(f"- `{result['case_id']}`: {status}; selected={result['selected_models']}; no_call={result['no_call']}") + for error in result["errors"]: + lines.append(f" - {error}") + report_path.write_text("\n".join(lines) + "\n", encoding="utf-8") + return report_path + + +def main(): + root = Path(__file__).resolve().parents[1] + results = [evaluate_case(root, case) for case in load_selector_cases(root)] + report_path = write_report(root, results) + print(f"selector regression report written to {report_path}") + failures = [result for result in results if result["errors"]] + if failures: + for result in failures: + print(f"ERROR: {result['case_id']}: {'; '.join(result['errors'])}") + return 1 + print("selector regression passed") + return 0 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/scripts/validate_model_library.py b/scripts/validate_model_library.py new file mode 100644 index 0000000..f4fc813 --- /dev/null +++ b/scripts/validate_model_library.py @@ -0,0 +1,482 @@ +import json +import sys +from pathlib import Path + + +MODEL_REQUIRED_FIELDS = [ + "model_id", + "model_name", + "model_type", + "pipeline_position", + "one_sentence_definition", + "core_question", + "core_mechanism", + "status", + "source_articles", + "source_evidence", + "input_types", + "output_types", + "call_when", + "do_not_call_when", + "trigger_keywords", + "negative_triggers", + "related_models", + "conflicting_models", + "disciplinary_anchors", + "common_misuses", + "failure_modes", + "selection_priority", + "confidence_level", + "stability_profile", + "regression_status", + "example_inputs", + "example_outputs", + "output_contract", + "productization_notes", + "version", + "last_updated", +] + +MODEL_TYPE_VALUES = { + "routing_model", + "deep_modeling_model", + "lens_model", + "diagnostic_model", + "evaluation_model", + "generation_model", + "conflict_resolution_model", + "stabilization_model", +} + +PIPELINE_POSITION_VALUES = { + "pre_analysis", + "analysis", + "deep_analysis", + "synthesis", + "red_team", + "evaluation", + "post_processing", +} + +CONFIDENCE_LEVEL_VALUES = {"high", "medium", "low"} +REGRESSION_STATUS_VALUES = {"not_started", "pending", "in_progress", "passed", "failed", "needs_rebuild"} +STABILITY_LEVEL_VALUES = {"A", "B", "C", "D"} +REGRESSION_CASE_TYPE_VALUES = {"positive", "boundary", "misuse", "no_call", "selector_gate", "pipeline"} +REQUIRED_REGRESSION_CASE_TYPES = {"positive", "boundary", "misuse", "no_call", "selector_gate", "pipeline"} +MIN_REGRESSION_CASES_PER_MODEL = 15 +EXPECTED_CLASSIFICATION_VALUES = {"question", "problem", "issue", "mixed", "no_call", "not_applicable"} +EXPECTED_DOMINANT_SCARCITY_VALUES = {"data", "path_resource", "consensus_order", "mixed", "unknown", "not_applicable"} +EXPECTED_MAX_DEPTH_VALUES = {"application", "domain", "process", "purpose", "core_mechanism", "human_capability", "philosophical_bedrock", "no_call", "not_applicable"} +EVALUATION_MODE_VALUES = {"manual", "keyword", "structured", "semantic"} +STATUS_VALUES = {"draft", "review", "reviewed", "callable", "stable", "archived", "deprecated", "draft_pre_contract"} + +MODEL_SPECIFIC_STRUCTURED_OUTPUT_FIELDS = { + "qpi": [ + "classification_scope", + "is_provisional", + "subject_position", + "scenario_context", + "responsibility_scope", + "context_sufficiency", + "missing_context", + "problem_owner", + "problem_source", + "time_scale", + "scarcity_profile", + "dominant_scarcity", + "classification", + "classification_confidence", + "evidence_gap", + "misclassification_risk", + "recommended_next_step", + "next_model_candidates", + ], + "intellectual_archaeology": [ + "should_call", + "entry_reason", + "recommended_max_depth", + "layers_to_analyze", + "stop_reason", + "no_deeper_reason", + "assumptions_by_layer", + "validation_needed", + "action_implication", + ], +} + +STABILITY_REQUIRED_FIELDS = [ + "stability_level", + "needs_stabilization", + "main_risks", + "reason", + "next_stabilization_action", +] + +SOURCE_ARTICLE_REQUIRED_FIELDS = [ + "source_id", + "title", + "source_type", + "related_models", + "source_status", +] + +SOURCE_EXCERPT_REQUIRED_FIELDS = [ + "excerpt_id", + "source_id", + "related_model_id", + "excerpt_type", + "summary", + "used_for", + "quote_status", + "source_location", +] + +REGRESSION_CASE_REQUIRED_FIELDS = [ + "case_id", + "model_id", + "case_type", + "input", + "expected_behavior", + "failure_signal", +] + +SOURCE_TYPE_VALUES = {"original_article", "synthesis_note", "placeholder"} +SOURCE_STATUS_VALUES = {"representative", "derived_synthesis", "placeholder"} +EXCERPT_TYPE_VALUES = {"definition", "taxonomy", "mechanism", "application_rule", "value_claim", "boundary_rule", "validation_rule"} +QUOTE_STATUS_VALUES = {"exact", "condensed", "paraphrased"} + + +def read_json(path): + if not path.exists(): + return None, [f"missing file {path.as_posix()}"] + try: + return json.loads(path.read_text(encoding="utf-8")), [] + except json.JSONDecodeError as exc: + return None, [f"{path.as_posix()} is invalid JSON: {exc}"] + + +def require_fields(record, fields, label): + return [f"{label} missing required field {field}" for field in fields if field not in record] + + +def collect_duplicate_errors(records, key, label): + seen = set() + errors = [] + for record in records: + value = record.get(key) + if value in seen: + errors.append(f"duplicate {label} {value}") + seen.add(value) + return errors + + +def load_collection(root, relative_path, collection_key): + data, errors = read_json(root / relative_path) + if errors: + return [], errors + if not isinstance(data, dict) or collection_key not in data or not isinstance(data[collection_key], list): + return [], [f"{relative_path} must contain list field {collection_key}"] + return data[collection_key], [] + + +def validate_enum(record, field, allowed_values, label): + value = record.get(field) + if value is not None and value not in allowed_values: + return [f"{label} field {field} has invalid value {value}"] + return [] + + +def validate_integer_range(record, field, minimum, maximum, label): + value = record.get(field) + if value is None: + return [] + errors = [] + if not isinstance(value, int): + return [f"{label} field {field} must be an integer"] + if value < minimum: + errors.append(f"{label} field {field} must be >= {minimum}") + if value > maximum: + errors.append(f"{label} field {field} must be <= {maximum}") + return errors + + +def validate_model_contract(model, label): + errors = [] + errors.extend(require_fields(model, MODEL_REQUIRED_FIELDS, label)) + errors.extend(validate_enum(model, "model_type", MODEL_TYPE_VALUES, label)) + errors.extend(validate_enum(model, "pipeline_position", PIPELINE_POSITION_VALUES, label)) + errors.extend(validate_enum(model, "confidence_level", CONFIDENCE_LEVEL_VALUES, label)) + errors.extend(validate_enum(model, "regression_status", REGRESSION_STATUS_VALUES, label)) + errors.extend(validate_enum(model, "status", STATUS_VALUES, label)) + errors.extend(validate_integer_range(model, "selection_priority", 1, 10, label)) + + stability_profile = model.get("stability_profile") + if isinstance(stability_profile, dict): + errors.extend(require_fields(stability_profile, STABILITY_REQUIRED_FIELDS, f"{label} stability_profile")) + errors.extend(validate_enum(stability_profile, "stability_level", STABILITY_LEVEL_VALUES, f"{label} stability_profile")) + needs_stabilization = stability_profile.get("needs_stabilization") + if needs_stabilization is not None and not isinstance(needs_stabilization, bool): + errors.append(f"{label} stability_profile field needs_stabilization must be a boolean") + elif stability_profile is not None: + errors.append(f"{label} field stability_profile must be an object") + + errors.extend(validate_structured_output_contract(model, label)) + + return errors + + +def validate_structured_output_contract(model, label): + model_id = model.get("model_id") + required_fields = MODEL_SPECIFIC_STRUCTURED_OUTPUT_FIELDS.get(model_id, []) + if not required_fields: + return [] + + contract = model.get("structured_output_contract") + if not isinstance(contract, dict): + return [f"{label} model {model_id} missing structured_output_contract object"] + + errors = [] + for field in required_fields: + if field not in contract: + errors.append(f"{label} model {model_id} structured_output_contract missing required output field {field}") + return errors + + +def load_model_index(root): + path = root / "models" / "model_index.json" + data, errors = read_json(path) + if errors: + return None, errors + if not isinstance(data, dict) or "models" not in data or not isinstance(data["models"], list): + return None, ["models/model_index.json must contain list field models"] + return data, [] + + +def card_index_text(root): + path = root / "cards" / "card_index.md" + if not path.exists(): + return None, ["missing file cards/card_index.md"] + return path.read_text(encoding="utf-8"), [] + + +def parse_card_index_model_ids(text): + model_ids = set() + for line in text.splitlines(): + stripped = line.strip() + if not stripped.startswith("|") or stripped.startswith("| ---") or "Model ID" in stripped: + continue + cells = [cell.strip() for cell in stripped.strip("|").split("|")] + if cells and cells[0]: + model_ids.add(cells[0]) + return model_ids + + +def validate_library(root): + root = Path(root) + errors = [] + + source_articles, article_errors = load_collection(root, "sources/source_articles.json", "source_articles") + source_excerpts, excerpt_errors = load_collection(root, "sources/source_excerpts.json", "source_excerpts") + regression_cases, case_errors = load_collection(root, "tests/regression_cases.json", "regression_cases") + errors.extend(article_errors) + errors.extend(excerpt_errors) + errors.extend(case_errors) + + for article in source_articles: + errors.extend(require_fields(article, SOURCE_ARTICLE_REQUIRED_FIELDS, f"source article {article.get('source_id', '')}")) + errors.extend(validate_enum(article, "source_type", SOURCE_TYPE_VALUES, f"source article {article.get('source_id', '')}")) + errors.extend(validate_enum(article, "source_status", SOURCE_STATUS_VALUES, f"source article {article.get('source_id', '')}")) + for excerpt in source_excerpts: + errors.extend(require_fields(excerpt, SOURCE_EXCERPT_REQUIRED_FIELDS, f"source excerpt {excerpt.get('excerpt_id', '')}")) + errors.extend(validate_enum(excerpt, "excerpt_type", EXCERPT_TYPE_VALUES, f"source excerpt {excerpt.get('excerpt_id', '')}")) + errors.extend(validate_enum(excerpt, "quote_status", QUOTE_STATUS_VALUES, f"source excerpt {excerpt.get('excerpt_id', '')}")) + if excerpt.get("quote_status") == "exact": + raw_excerpt = excerpt.get("raw_excerpt", "") + if "..." in raw_excerpt or "……" in raw_excerpt: + errors.append(f"source excerpt {excerpt.get('excerpt_id')} quote_status exact must not contain ellipsis") + if excerpt.get("quote_status") == "condensed" and not excerpt.get("notes"): + errors.append(f"source excerpt {excerpt.get('excerpt_id')} quote_status condensed requires notes") + for case in regression_cases: + errors.extend(require_fields(case, REGRESSION_CASE_REQUIRED_FIELDS, f"regression case {case.get('case_id', '')}")) + errors.extend(validate_enum(case, "case_type", REGRESSION_CASE_TYPE_VALUES, f"regression case {case.get('case_id', '')}")) + errors.extend(validate_enum(case, "expected_classification", EXPECTED_CLASSIFICATION_VALUES, f"regression case {case.get('case_id', '')}")) + errors.extend(validate_enum(case, "expected_dominant_scarcity", EXPECTED_DOMINANT_SCARCITY_VALUES, f"regression case {case.get('case_id', '')}")) + errors.extend(validate_enum(case, "expected_max_depth", EXPECTED_MAX_DEPTH_VALUES, f"regression case {case.get('case_id', '')}")) + errors.extend(validate_enum(case, "evaluation_mode", EVALUATION_MODE_VALUES, f"regression case {case.get('case_id', '')}")) + if "should_call_model" in case and not isinstance(case.get("should_call_model"), bool): + errors.append(f"regression case {case.get('case_id')} field should_call_model must be a boolean") + + errors.extend(collect_duplicate_errors(source_articles, "source_id", "source article id")) + errors.extend(collect_duplicate_errors(source_excerpts, "excerpt_id", "source excerpt id")) + errors.extend(collect_duplicate_errors(regression_cases, "case_id", "regression case id")) + + article_ids = {article.get("source_id") for article in source_articles} + excerpt_ids = {excerpt.get("excerpt_id") for excerpt in source_excerpts} + + model_records = [] + model_paths = sorted((root / "models").glob("*.model.json")) if (root / "models").exists() else [] + if not model_paths: + errors.append("models/ contains no *.model.json files") + + for model_path in model_paths: + relative_model_path = model_path.relative_to(root).as_posix() + model, model_errors = read_json(model_path) + errors.extend(model_errors) + if model is None: + continue + model_records.append((relative_model_path, model)) + errors.extend(validate_model_contract(model, relative_model_path)) + + model_ids = {model.get("model_id") for _, model in model_records} + models_by_id = {model.get("model_id"): (relative_path, model) for relative_path, model in model_records} + errors.extend(collect_duplicate_errors([model for _, model in model_records], "model_id", "model id")) + + for relative_model_path, model in model_records: + for source_id in model.get("source_articles", []): + if source_id not in article_ids: + errors.append(f"{relative_model_path} references unknown source article {source_id}") + for excerpt_id in model.get("source_evidence", []): + if excerpt_id not in excerpt_ids: + errors.append(f"{relative_model_path} references unknown source excerpt {excerpt_id}") + + for excerpt in source_excerpts: + source_id = excerpt.get("source_id") + related_model_id = excerpt.get("related_model_id") + if source_id and source_id not in article_ids: + errors.append(f"source excerpt {excerpt.get('excerpt_id')} references unknown source article {source_id}") + if related_model_id and related_model_id not in model_ids: + errors.append(f"source excerpt {excerpt.get('excerpt_id')} references unknown model {related_model_id}") + + for case in regression_cases: + model_id = case.get("model_id") + if model_id and model_id not in model_ids: + errors.append(f"regression case {case.get('case_id')} references unknown model {model_id}") + + model_index, model_index_errors = load_model_index(root) + errors.extend(model_index_errors) + indexed_model_ids = set() + if model_index: + for entry in model_index["models"]: + entry_id = entry.get("model_id") + indexed_model_ids.add(entry_id) + model_file = entry.get("model_file") + card_file = entry.get("card_file") + if model_file and not (root / model_file).exists(): + errors.append(f"models/model_index.json references missing model file {model_file}") + if card_file and not (root / card_file).exists(): + errors.append(f"models/model_index.json references missing card file {card_file}") + if entry_id in models_by_id: + relative_model_path, model = models_by_id[entry_id] + expected_values = { + "model_name": model.get("model_name"), + "model_type": model.get("model_type"), + "pipeline_position": model.get("pipeline_position"), + "model_file": relative_model_path, + "source_article_count": len(model.get("source_articles", [])), + "source_evidence_count": len(model.get("source_evidence", [])), + "stability_level": model.get("stability_profile", {}).get("stability_level") if isinstance(model.get("stability_profile"), dict) else None, + "regression_status": model.get("regression_status"), + "status": model.get("status"), + } + for field, expected_value in expected_values.items(): + actual_value = entry.get(field) + if actual_value != expected_value: + errors.append(f"models/model_index.json entry {entry_id} {field} is {actual_value}, expected {expected_value}") + + card_index, card_index_errors = card_index_text(root) + errors.extend(card_index_errors) + card_index_model_ids = parse_card_index_model_ids(card_index) if card_index is not None else set() + + cases_by_model = {} + case_types_by_model = {} + for case in regression_cases: + model_id = case.get("model_id") + if not model_id: + continue + cases_by_model[model_id] = cases_by_model.get(model_id, 0) + 1 + case_types_by_model.setdefault(model_id, set()).add(case.get("case_type")) + + if model_index: + for entry in model_index["models"]: + entry_id = entry.get("model_id") + expected_case_count = cases_by_model.get(entry_id, 0) + actual_case_count = entry.get("regression_case_count") + if actual_case_count != expected_case_count: + errors.append(f"models/model_index.json entry {entry_id} regression_case_count is {actual_case_count}, expected {expected_case_count}") + if card_index is not None and entry_id not in card_index_model_ids: + errors.append(f"models/model_index.json entry {entry_id} missing from cards/card_index.md") + + if model_index and card_index is not None: + for card_model_id in sorted(card_index_model_ids): + if card_model_id not in indexed_model_ids: + errors.append(f"cards/card_index.md entry {card_model_id} missing from models/model_index.json") + + card_paths = sorted((root / "cards").glob("*.md")) if (root / "cards").exists() else [] + for card_path in card_paths: + if card_path.name in {"README.md", "card_index.md"}: + continue + card_model_id = card_path.stem + if card_index is not None and card_model_id not in card_index_model_ids: + errors.append(f"card {card_path.relative_to(root).as_posix()} missing from cards/card_index.md") + + for _, model in model_records: + model_id = model.get("model_id") + if not model_id: + continue + if model_index and model_id not in indexed_model_ids: + errors.append(f"model {model_id} missing from models/model_index.json") + if card_index is not None and model_id not in card_index_model_ids: + errors.append(f"model {model_id} missing from cards/card_index.md") + case_count = cases_by_model.get(model_id, 0) + if case_count < MIN_REGRESSION_CASES_PER_MODEL: + errors.append(f"model {model_id} has {case_count} regression cases, expected at least {MIN_REGRESSION_CASES_PER_MODEL}") + present_case_types = case_types_by_model.get(model_id, set()) + for required_case_type in sorted(REQUIRED_REGRESSION_CASE_TYPES): + if required_case_type not in present_case_types: + errors.append(f"model {model_id} missing regression case type {required_case_type}") + + return errors + + +def write_report(root, errors): + report_path = Path(root) / "reports" / "validation_report.md" + report_path.parent.mkdir(parents=True, exist_ok=True) + status = "PASS" if not errors else "FAIL" + lines = [ + "# Validation Report", + "", + f"Status: `{status}`", + "", + "Command: `python scripts/validate_model_library.py`", + "", + ] + if errors: + lines.append("## Errors") + lines.append("") + lines.extend(f"- {error}" for error in errors) + else: + lines.append("## Result") + lines.append("") + lines.append("- JSON 文件可解析。") + lines.append("- 模型必填字段存在并符合本地 contract 子集。") + lines.append("- source article、source excerpt、regression case 引用完整。") + lines.append("- model/card index 引用完整,计数、状态和索引投影一致。") + report_path.write_text("\n".join(lines) + "\n", encoding="utf-8") + return report_path + + +def main(): + root = Path(__file__).resolve().parents[1] + errors = validate_library(root) + report_path = write_report(root, errors) + print(f"validation report written to {report_path}") + if errors: + for error in errors: + print(f"ERROR: {error}") + return 1 + print("validation passed") + return 0 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/selector/README.md b/selector/README.md index 6f98c9d..b2e3335 100644 --- a/selector/README.md +++ b/selector/README.md @@ -1,8 +1,8 @@ # Selector -This folder will contain rule-based selector configuration and examples. +This folder contains rule-based selector configuration and examples. -The v0.1 selector should not call an LLM. +The v0.2 selector should not call an LLM. It should use simple matching rules: @@ -11,3 +11,17 @@ It should use simple matching rules: - Negative triggers - Pipeline position - Selection priority +- Negative trigger first +- No-call threshold +- QPI-before-IA gate + +Current files: + +- `selector_rules.json` +- `selector_examples.json` + +The selector does not call an LLM. + +The executable demo is `scripts/run_selector_demo.py`. + +Selector regression is `scripts/run_selector_regression.py`. diff --git a/selector/selector_calibration_inputs.json b/selector/selector_calibration_inputs.json new file mode 100644 index 0000000..601fcd1 --- /dev/null +++ b/selector/selector_calibration_inputs.json @@ -0,0 +1,147 @@ +{ + "calibration_version": "0.3-draft", + "status": "draft_owner_review_needed", + "notes": "These inputs calibrate selector behavior only. They are not model regression cases and do not replace owner-supplied raw QPI case materials.", + "inputs": [ + { + "case_id": "selector_calibration_fact_lookup_001", + "category": "fact_lookup", + "input": "查一下 QPI 这个缩写是什么意思,只要事实。", + "expected_selector_behavior": "no_call", + "expected_notes": "Hard no-call because the user asks for lookup only." + }, + { + "case_id": "selector_calibration_fact_lookup_002", + "category": "fact_lookup", + "input": "这篇文章的发布日期是哪天?不要展开。", + "expected_selector_behavior": "no_call", + "expected_notes": "Date lookup does not need QPI or IA." + }, + { + "case_id": "selector_calibration_rewrite_001", + "category": "rewrite_polish_translation", + "input": "请直接润色这段话,不要深入分析。", + "expected_selector_behavior": "no_call", + "expected_notes": "Pure polish request." + }, + { + "case_id": "selector_calibration_translation_001", + "category": "rewrite_polish_translation", + "input": "翻译这句话:The model is provisional.", + "expected_selector_behavior": "no_call", + "expected_notes": "Translation request." + }, + { + "case_id": "selector_calibration_direct_execution_001", + "category": "direct_execution", + "input": "把这个 JSON 缩进格式化一下,马上执行,不用解释。", + "expected_selector_behavior": "no_call", + "expected_notes": "Direct execution request." + }, + { + "case_id": "selector_calibration_qpi_only_001", + "category": "qpi_only", + "input": "我们现在的问题到底是缺数据、缺路径,还是缺共识?", + "expected_selector_behavior": "select_qpi", + "expected_notes": "Explicit QPI problem-definition gate." + }, + { + "case_id": "selector_calibration_qpi_only_002", + "category": "qpi_only", + "input": "这个需求反复卡住,我不确定该怎么定义这个问题。", + "expected_selector_behavior": "select_qpi", + "expected_notes": "Problem definition is incomplete." + }, + { + "case_id": "selector_calibration_qpi_insufficient_context_001", + "category": "mixed_qpi_cases", + "input": "如何提高流量?", + "expected_selector_behavior": "select_qpi_low_confidence", + "expected_notes": "Selector may route to QPI, but QPI output must be provisional because subject and scenario are missing." + }, + { + "case_id": "selector_calibration_qpi_intra_frame_mixed_001", + "category": "mixed_qpi_cases", + "input": "我是集团营销负责人,既缺流量增长方法,也担心销售、库存、客服和激励机制跟不上。", + "expected_selector_behavior": "select_qpi", + "expected_notes": "Same subject and scenario contain path/resource and governance scarcity." + }, + { + "case_id": "selector_calibration_qpi_governance_load_001", + "category": "mixed_qpi_cases", + "input": "这个流程改造表面只是工具不熟,但实际牵涉真实调用、上下文裁剪、审计边界和后续复用。", + "expected_selector_behavior": "select_qpi", + "expected_notes": "Governance load raises Issue weight even if the owner is one person." + }, + { + "case_id": "selector_calibration_ia_after_qpi_001", + "category": "ia_after_qpi", + "input": "QPI 已判断这是中重型课题,请用思想考古分析它的底层假设和核心机制。", + "expected_selector_behavior": "select_intellectual_archaeology", + "expected_notes": "QPI-before-IA gate is satisfied." + }, + { + "case_id": "selector_calibration_ia_after_qpi_002", + "category": "ia_after_qpi", + "input": "QPI 已判断这是 P/I mixed,请下潜到 purpose 或 core_mechanism,说明不用到哲学基岩的理由。", + "expected_selector_behavior": "select_intellectual_archaeology", + "expected_notes": "Depth should be gated, not default full seven-layer analysis." + }, + { + "case_id": "selector_calibration_ia_model_extraction_001", + "category": "ia_explicit_model_extraction", + "input": "请从这篇文章抽取一个可复用模型,并检查它的底层假设是否稳定。", + "expected_selector_behavior": "select_intellectual_archaeology", + "expected_notes": "Explicit model extraction and heavy-depth signal." + }, + { + "case_id": "selector_calibration_ia_model_extraction_002", + "category": "ia_explicit_model_extraction", + "input": "我想把这套专家直觉沉淀成模型,需要识别隐性知识和验证点。", + "expected_selector_behavior": "select_intellectual_archaeology", + "expected_notes": "Expert intuition and tacit knowledge are IA triggers." + }, + { + "case_id": "selector_calibration_false_positive_deep_word_001", + "category": "false_positive_traps", + "input": "把这句话里的“底层逻辑”换成更通俗的说法,不要深入分析。", + "expected_selector_behavior": "no_call", + "expected_notes": "Deep word appears, but hard no-call rewrite intent wins." + }, + { + "case_id": "selector_calibration_false_positive_model_word_001", + "category": "false_positive_traps", + "input": "翻译 model 这个词,不要展开。", + "expected_selector_behavior": "no_call", + "expected_notes": "The word model is not a model-extraction request." + }, + { + "case_id": "selector_calibration_false_positive_philosophy_001", + "category": "false_positive_traps", + "input": "查一下哲学基岩这个词出现在哪篇文章,只查位置。", + "expected_selector_behavior": "no_call", + "expected_notes": "Lookup request wins over IA keyword." + }, + { + "case_id": "selector_calibration_override_001", + "category": "direct_execution_with_analysis_override", + "input": "这看起来只是润色,但不要只执行,请分析背后的问题结构。", + "expected_selector_behavior": "select_qpi", + "expected_notes": "Explicit analysis override allows QPI despite a rewrite-like surface." + }, + { + "case_id": "selector_calibration_pipeline_001", + "category": "pipeline", + "input": "问题定义还没完成,先不要思想考古,先判断这是 Q、P 还是 I。", + "expected_selector_behavior": "select_qpi_reject_ia", + "expected_notes": "QPI-before-IA gate." + }, + { + "case_id": "selector_calibration_pipeline_002", + "category": "pipeline", + "input": "QPI 已判断不是事实查询,而是系统性课题;下一步检查它是否值得沉淀成可复用模型。", + "expected_selector_behavior": "select_intellectual_archaeology", + "expected_notes": "QPI has completed the front gate." + } + ] +} diff --git a/selector/selector_examples.json b/selector/selector_examples.json new file mode 100644 index 0000000..f242987 --- /dev/null +++ b/selector/selector_examples.json @@ -0,0 +1,41 @@ +{ + "selector_examples": [ + { + "example_id": "selector_example_qpi_001", + "input": "我们现在的问题到底是缺数据、缺方法,还是团队没有共识?", + "recommended_model_ids": ["qpi"], + "expected_reasons": ["出现 QPI 核心匮乏物触发词", "处于问题定义阶段"], + "routing_notes": "先做 QPI,再决定是否进入深度建模。" + }, + { + "example_id": "selector_example_ia_001", + "input": "这个模型看起来成立,但我想知道它背后的底层假设和哲学基岩是否稳定。", + "recommended_model_ids": ["intellectual_archaeology"], + "expected_reasons": ["出现底层假设和哲学基岩触发词", "目标是模型深度分析"], + "routing_notes": "调用思想考古学,但应检查是否满足最小充分下潜。" + }, + { + "example_id": "selector_example_both_001", + "input": "用户流失反复出现,我们不知道这是执行路径问题,还是品牌信任和组织共识的深层课题。", + "recommended_model_ids": ["qpi", "intellectual_archaeology"], + "expected_reasons": ["先用 QPI 判断主导匮乏物", "如果确认为中重型课题,再用思想考古下钻"], + "routing_notes": "QPI 应排在前面,思想考古作为后续模型。" + }, + { + "example_id": "selector_example_no_call_001", + "input": "请直接把这句话润色一下,不要深入分析。", + "recommended_model_ids": [], + "rejected_model_ids": ["qpi", "intellectual_archaeology"], + "expected_reasons": ["negative trigger first", "no-call threshold"], + "routing_notes": "纯改写不应召回 QPI 或思想考古。" + }, + { + "example_id": "selector_example_qpi_before_ia_001", + "input": "这个问题到底是缺数据、缺路径还是缺共识?", + "recommended_model_ids": ["qpi"], + "rejected_model_ids": ["intellectual_archaeology"], + "expected_reasons": ["QPI-before-IA gate"], + "routing_notes": "问题定义未完成时,思想考古不应抢先召回。" + } + ] +} diff --git a/selector/selector_rules.json b/selector/selector_rules.json new file mode 100644 index 0000000..669ff82 --- /dev/null +++ b/selector/selector_rules.json @@ -0,0 +1,151 @@ +{ + "selector_version": "0.2", + "selection_method": "rule_based_no_llm", + "global_rules": { + "negative_trigger_first": true, + "hard_no_call_first": true, + "no_call_threshold": 0.35, + "qpi_before_ia_gate": true, + "emit_score_breakdown": true, + "emit_rejected_model_reasons": true, + "explicit_analysis_override_phrases": [ + "不要只执行", + "不要按字面执行", + "请分析背后的问题", + "分析背后的结构", + "先做问题定性" + ], + "hard_no_call_signals": [ + "只查", + "只是查", + "只是想知道", + "只要事实", + "查一下", + "有没有提到", + "直接改", + "只改错别字", + "润色", + "翻译", + "不要展开", + "不要深入分析", + "马上执行", + "不用解释", + "生成图片" + ], + "complexity_signals": [ + "反复", + "冲突", + "系统", + "长期", + "共识", + "组织", + "复杂", + "底层", + "模型", + "结构", + "机制", + "抽取" + ], + "qpi_gate_signals": [ + "缺数据", + "缺路径", + "缺共识", + "问题到底", + "怎么定义", + "这是问题", + "执行路径问题", + "组织共识问题" + ], + "ia_heavy_signals": [ + "底层假设", + "哲学基岩", + "思想考古", + "七层", + "可复用模型", + "底层机制", + "专家直觉", + "隐性知识" + ], + "weights": { + "trigger_keyword": 0.25, + "input_type": 0.15, + "pipeline_position": 0.2, + "complexity_signal": 0.15, + "selection_priority_factor": 0.01, + "qpi_gate_bonus": 0.25, + "qpi_already_completed_penalty": 0.25, + "ia_heavy_bonus": 0.2, + "ia_qpi_completed_bonus": 0.25, + "ia_qpi_gate_penalty": 0.45, + "ia_no_heavy_gate_penalty": 0.35, + "model_negative_penalty_qpi": 0.45, + "model_negative_penalty_default": 0.65 + } + }, + "models": [ + { + "model_id": "qpi", + "base_score": 50, + "trigger_keywords": [ + "问题", + "难题", + "课题", + "缺数据", + "缺路径", + "缺共识", + "执行力", + "大环境", + "反复发作", + "系统性", + "怎么定义" + ], + "input_type_matches": [ + "模糊局面", + "业务问题描述", + "组织冲突叙述", + "需求或故障初始表述" + ], + "negative_triggers": [ + "只改错别字", + "翻译", + "润色", + "生成图片" + ], + "pipeline_position": "problem_definition", + "selection_priority": 95, + "routing_notes": "作为默认前置路由模型;如果无法判断问题类型,优先调用 QPI。" + }, + { + "model_id": "intellectual_archaeology", + "base_score": 30, + "trigger_keywords": [ + "底层假设", + "第一性原理", + "哲学基岩", + "模型深度", + "专家直觉", + "隐性知识", + "动态韧性", + "七层", + "思想考古", + "可复用模型" + ], + "input_type_matches": [ + "模型草案", + "复杂议题", + "专家隐性判断", + "需要抽取底层假设的业务方案" + ], + "negative_triggers": [ + "只是查找", + "只要事实", + "低风险", + "马上执行", + "不用解释" + ], + "pipeline_position": "modeling_depth_analysis", + "selection_priority": 80, + "routing_notes": "通常在 QPI 判断为中重型难题或课题后调用;遇到轻量事实检索应避免调用。" + } + ] +} diff --git a/sources/README.md b/sources/README.md index d18c257..dec9422 100644 --- a/sources/README.md +++ b/sources/README.md @@ -1,10 +1,18 @@ # Sources -This folder will contain source records and source evidence excerpts. +This folder contains source records and source evidence excerpts. -Expected future files: +Current files: - `source_articles.json` - `source_excerpts.json` +- `evidence_coverage.matrix.json` Do not treat placeholder source records as verified evidence. Mark incomplete source material clearly. + +v0.2 source excerpts must include: + +- `quote_status`: `exact`, `condensed`, or `paraphrased` +- `source_location`: section, paragraph, title, or line reference + +`quote_status=exact` must not contain unmarked ellipses. diff --git a/sources/evidence_coverage.matrix.json b/sources/evidence_coverage.matrix.json new file mode 100644 index 0000000..8783f7c --- /dev/null +++ b/sources/evidence_coverage.matrix.json @@ -0,0 +1,92 @@ +{ + "matrix_version": "0.2", + "last_updated": "2026-06-16", + "support_type_values": [ + "direct_source", + "derived_from_source", + "product_decision", + "red_team_inference", + "owner_decision" + ], + "coverage_status_values": [ + "supported", + "partially_supported", + "derived", + "unsupported", + "needs_owner_review" + ], + "models": [ + { + "model_id": "qpi", + "field_coverage": [ + {"field": "model_id", "support_type": "product_decision", "excerpt_ids": [], "coverage_status": "derived", "notes": "Machine ID chosen for local registry."}, + {"field": "model_name", "support_type": "direct_source", "excerpt_ids": ["excerpt_qpi_primary_spectrum_001"], "coverage_status": "supported", "notes": "QPI name and Q/P/I taxonomy are source-backed."}, + {"field": "model_type", "support_type": "product_decision", "excerpt_ids": ["excerpt_qpi_cognitive_os_application_001"], "coverage_status": "derived", "notes": "Routing role is productized from problem-definition placement."}, + {"field": "pipeline_position", "support_type": "product_decision", "excerpt_ids": ["excerpt_qpi_cognitive_os_application_001"], "coverage_status": "derived", "notes": "Pre-analysis position follows cognitive OS application rule."}, + {"field": "one_sentence_definition", "support_type": "direct_source", "excerpt_ids": ["excerpt_qpi_primary_spectrum_001"], "coverage_status": "supported", "notes": "Core scarcity and Q/P/I distinction are direct source claims."}, + {"field": "core_question", "support_type": "derived_from_source", "excerpt_ids": ["excerpt_qpi_primary_spectrum_001", "excerpt_qpi_primary_question_001", "excerpt_qpi_primary_problem_001", "excerpt_qpi_primary_issue_001"], "coverage_status": "supported", "notes": "Question is derived from the scarcity scan."}, + {"field": "core_mechanism", "support_type": "direct_source", "excerpt_ids": ["excerpt_qpi_primary_spectrum_001", "excerpt_qpi_primary_question_001", "excerpt_qpi_primary_problem_001", "excerpt_qpi_primary_issue_001"], "coverage_status": "supported", "notes": "Scarcity scan and classification are directly supported."}, + {"field": "status", "support_type": "owner_decision", "excerpt_ids": [], "coverage_status": "needs_owner_review", "notes": "Current draft state is a review decision, not a source claim."}, + {"field": "source_articles", "support_type": "product_decision", "excerpt_ids": [], "coverage_status": "supported", "notes": "Article records exist in source_articles.json."}, + {"field": "source_evidence", "support_type": "product_decision", "excerpt_ids": [], "coverage_status": "supported", "notes": "Excerpt records exist in source_excerpts.json."}, + {"field": "input_types", "support_type": "derived_from_source", "excerpt_ids": ["excerpt_qpi_primary_spectrum_001", "excerpt_qpi_cognitive_os_application_001"], "coverage_status": "derived", "notes": "Input classes are productized from source scenarios."}, + {"field": "output_types", "support_type": "product_decision", "excerpt_ids": ["excerpt_qpi_primary_spectrum_001"], "coverage_status": "derived", "notes": "Structured output fields are product contract additions."}, + {"field": "call_when", "support_type": "derived_from_source", "excerpt_ids": ["excerpt_qpi_primary_spectrum_001", "excerpt_qpi_cognitive_os_application_001"], "coverage_status": "derived", "notes": "Call rules are derived from classification use."}, + {"field": "do_not_call_when", "support_type": "red_team_inference", "excerpt_ids": ["excerpt_qpi_primary_question_001"], "coverage_status": "derived", "notes": "No-call rules protect simple retrieval and direct execution."}, + {"field": "trigger_keywords", "support_type": "product_decision", "excerpt_ids": [], "coverage_status": "derived", "notes": "Selector keywords are local routing rules."}, + {"field": "negative_triggers", "support_type": "product_decision", "excerpt_ids": [], "coverage_status": "derived", "notes": "Negative triggers are selector false-positive protections."}, + {"field": "related_models", "support_type": "product_decision", "excerpt_ids": [], "coverage_status": "derived", "notes": "Relationship to IA is a local pipeline decision."}, + {"field": "conflicting_models", "support_type": "product_decision", "excerpt_ids": [], "coverage_status": "derived", "notes": "No explicit conflict model is in scope."}, + {"field": "disciplinary_anchors", "support_type": "derived_from_source", "excerpt_ids": ["excerpt_qpi_primary_spectrum_001"], "coverage_status": "partially_supported", "notes": "Anchors are inferred from the article's conceptual domain."}, + {"field": "common_misuses", "support_type": "red_team_inference", "excerpt_ids": ["excerpt_qpi_primary_pathology_reduction_001", "excerpt_qpi_primary_pathology_inflation_001"], "coverage_status": "supported", "notes": "Violent reduction and malicious inflation have source support."}, + {"field": "failure_modes", "support_type": "red_team_inference", "excerpt_ids": ["excerpt_qpi_primary_pathology_reduction_001", "excerpt_qpi_primary_pathology_inflation_001"], "coverage_status": "derived", "notes": "Failure modes are operationalized from pathology claims."}, + {"field": "selection_priority", "support_type": "product_decision", "excerpt_ids": [], "coverage_status": "needs_owner_review", "notes": "Priority is a selector tuning choice."}, + {"field": "confidence_level", "support_type": "owner_decision", "excerpt_ids": [], "coverage_status": "needs_owner_review", "notes": "Current medium confidence is review judgment."}, + {"field": "stability_profile", "support_type": "owner_decision", "excerpt_ids": [], "coverage_status": "needs_owner_review", "notes": "B-level stability remains a review judgment."}, + {"field": "regression_status", "support_type": "owner_decision", "excerpt_ids": [], "coverage_status": "needs_owner_review", "notes": "Pending status is deliberate until stronger regression review."}, + {"field": "example_inputs", "support_type": "product_decision", "excerpt_ids": [], "coverage_status": "derived", "notes": "Examples are synthetic but aligned with source taxonomy."}, + {"field": "example_outputs", "support_type": "product_decision", "excerpt_ids": [], "coverage_status": "derived", "notes": "Examples are synthetic structured outputs."}, + {"field": "output_contract", "support_type": "product_decision", "excerpt_ids": ["excerpt_qpi_primary_spectrum_001"], "coverage_status": "derived", "notes": "Output contract turns source mechanism into callable form."}, + {"field": "productization_notes", "support_type": "product_decision", "excerpt_ids": ["excerpt_qpi_cognitive_os_application_001"], "coverage_status": "derived", "notes": "Product notes are local integration decisions."}, + {"field": "version", "support_type": "product_decision", "excerpt_ids": [], "coverage_status": "derived", "notes": "Local asset version."}, + {"field": "last_updated", "support_type": "product_decision", "excerpt_ids": [], "coverage_status": "derived", "notes": "Local asset date."} + ] + }, + { + "model_id": "intellectual_archaeology", + "field_coverage": [ + {"field": "model_id", "support_type": "product_decision", "excerpt_ids": [], "coverage_status": "derived", "notes": "Machine ID chosen for local registry."}, + {"field": "model_name", "support_type": "direct_source", "excerpt_ids": ["excerpt_ia_primary_definition_001"], "coverage_status": "supported", "notes": "Name appears in source."}, + {"field": "model_type", "support_type": "product_decision", "excerpt_ids": ["excerpt_ia_primary_layers_001"], "coverage_status": "derived", "notes": "Deep modeling type is a product classification."}, + {"field": "pipeline_position", "support_type": "product_decision", "excerpt_ids": ["excerpt_ia_cognitive_os_minimum_depth_001"], "coverage_status": "derived", "notes": "Deep-analysis placement follows cognitive OS rule."}, + {"field": "one_sentence_definition", "support_type": "direct_source", "excerpt_ids": ["excerpt_ia_primary_definition_001", "excerpt_ia_primary_layers_001"], "coverage_status": "supported", "notes": "Definition and downward excavation are source-backed."}, + {"field": "core_question", "support_type": "derived_from_source", "excerpt_ids": ["excerpt_ia_primary_definition_001", "excerpt_ia_primary_layers_001"], "coverage_status": "supported", "notes": "Core question derives from the layer-excavation mechanism."}, + {"field": "core_mechanism", "support_type": "direct_source", "excerpt_ids": ["excerpt_ia_primary_layers_001"], "coverage_status": "supported", "notes": "Seven-layer mechanism has direct source support."}, + {"field": "status", "support_type": "owner_decision", "excerpt_ids": [], "coverage_status": "needs_owner_review", "notes": "Current draft state is a review decision."}, + {"field": "source_articles", "support_type": "product_decision", "excerpt_ids": [], "coverage_status": "supported", "notes": "Article records exist."}, + {"field": "source_evidence", "support_type": "product_decision", "excerpt_ids": [], "coverage_status": "supported", "notes": "Excerpt records exist."}, + {"field": "input_types", "support_type": "derived_from_source", "excerpt_ids": ["excerpt_ia_primary_definition_001", "excerpt_ia_primary_layers_001"], "coverage_status": "derived", "notes": "Input classes are productized from modeling-workshop use."}, + {"field": "output_types", "support_type": "product_decision", "excerpt_ids": ["excerpt_ia_primary_layers_001"], "coverage_status": "derived", "notes": "Structured output fields are callable contract additions."}, + {"field": "call_when", "support_type": "derived_from_source", "excerpt_ids": ["excerpt_ia_primary_resilience_001"], "coverage_status": "derived", "notes": "Call rules follow dynamic resilience and model-depth need."}, + {"field": "do_not_call_when", "support_type": "red_team_inference", "excerpt_ids": ["excerpt_ia_cognitive_os_minimum_depth_001"], "coverage_status": "supported", "notes": "Minimum-depth rule directly supports no-call boundaries."}, + {"field": "trigger_keywords", "support_type": "product_decision", "excerpt_ids": [], "coverage_status": "derived", "notes": "Selector keywords are local routing rules."}, + {"field": "negative_triggers", "support_type": "product_decision", "excerpt_ids": [], "coverage_status": "derived", "notes": "Negative triggers prevent over-deepening."}, + {"field": "related_models", "support_type": "product_decision", "excerpt_ids": [], "coverage_status": "derived", "notes": "QPI-before-IA is a local pipeline gate."}, + {"field": "conflicting_models", "support_type": "product_decision", "excerpt_ids": [], "coverage_status": "derived", "notes": "Fast execution conflict is a local boundary concept."}, + {"field": "disciplinary_anchors", "support_type": "derived_from_source", "excerpt_ids": ["excerpt_ia_primary_definition_001"], "coverage_status": "partially_supported", "notes": "Anchors are inferred from philosophical and modeling language."}, + {"field": "common_misuses", "support_type": "red_team_inference", "excerpt_ids": ["excerpt_ia_cognitive_os_minimum_depth_001", "excerpt_ia_primary_validation_001"], "coverage_status": "supported", "notes": "Over-excavation and validation risks are source-backed."}, + {"field": "failure_modes", "support_type": "red_team_inference", "excerpt_ids": ["excerpt_ia_cognitive_os_minimum_depth_001", "excerpt_ia_primary_validation_001"], "coverage_status": "supported", "notes": "Failure signals are operationalized from source warnings."}, + {"field": "selection_priority", "support_type": "product_decision", "excerpt_ids": [], "coverage_status": "needs_owner_review", "notes": "Priority is a selector tuning choice."}, + {"field": "confidence_level", "support_type": "owner_decision", "excerpt_ids": [], "coverage_status": "needs_owner_review", "notes": "Medium confidence is review judgment."}, + {"field": "stability_profile", "support_type": "owner_decision", "excerpt_ids": ["excerpt_ia_primary_resilience_001"], "coverage_status": "needs_owner_review", "notes": "B-level stability requires human review despite source support."}, + {"field": "regression_status", "support_type": "owner_decision", "excerpt_ids": [], "coverage_status": "needs_owner_review", "notes": "Pending until regression expansion is reviewed."}, + {"field": "example_inputs", "support_type": "product_decision", "excerpt_ids": [], "coverage_status": "derived", "notes": "Examples are synthetic."}, + {"field": "example_outputs", "support_type": "product_decision", "excerpt_ids": [], "coverage_status": "derived", "notes": "Examples are synthetic structured outputs."}, + {"field": "output_contract", "support_type": "product_decision", "excerpt_ids": ["excerpt_ia_primary_layers_001", "excerpt_ia_cognitive_os_minimum_depth_001"], "coverage_status": "derived", "notes": "Contract turns layer mechanism into bounded callable form."}, + {"field": "productization_notes", "support_type": "product_decision", "excerpt_ids": ["excerpt_ia_cognitive_os_minimum_depth_001"], "coverage_status": "derived", "notes": "Product notes are integration decisions."}, + {"field": "version", "support_type": "product_decision", "excerpt_ids": [], "coverage_status": "derived", "notes": "Local asset version."}, + {"field": "last_updated", "support_type": "product_decision", "excerpt_ids": [], "coverage_status": "derived", "notes": "Local asset date."} + ] + } + ] +} diff --git a/sources/source_articles.json b/sources/source_articles.json new file mode 100644 index 0000000..85aa202 --- /dev/null +++ b/sources/source_articles.json @@ -0,0 +1,48 @@ +{ + "source_articles": [ + { + "source_id": "article_qpi_primary_001", + "title": "问题之锚:从混沌现实到认知秩序的重构", + "author": "Wantsong", + "date": "2026-01-07", + "source_type": "original_article", + "file_path": "C:\\Users\\wangq\\Documents\\Codex\\knowledge-vault\\sayings\\2026\\2026-01-07-anchoring-the-void.md", + "related_models": ["qpi"], + "source_status": "representative", + "notes": "QPI 的主要来源文本,用于抽取提问、难题、课题三分结构、核心匮乏物、病理诊断与重构策略。" + }, + { + "source_id": "article_qpi_contextual_2025_001", + "title": "解构“问题”:认知主体与现实映射的动态框架", + "author": "Wantsong", + "date": "2025-04-05", + "source_type": "original_article", + "file_path": "C:\\Users\\wangq\\Documents\\Codex\\knowledge-vault\\sayings\\2025\\2025-04-05-deconstructing-problem.md", + "related_models": ["qpi"], + "source_status": "representative", + "notes": "QPI 的主体性、上下文场景、期望-现实落差、动态演化和问题生命周期来源。该文未作废,与 2026 年《问题之锚》构成上下游关系。" + }, + { + "source_id": "article_intellectual_archaeology_primary_001", + "title": "建模者的工坊", + "author": "Wantsong", + "date": "2025-10-26", + "source_type": "original_article", + "file_path": "C:\\Users\\wangq\\Documents\\Codex\\knowledge-vault\\sayings\\2025\\2025-10-26-the-workshop-of-Modelers.md", + "related_models": ["intellectual_archaeology"], + "source_status": "representative", + "notes": "思想考古学的主要来源文本,重点依据 1.3 节抽取七层下钻框架、动态韧性与模型验证要求。" + }, + { + "source_id": "article_cognitive_os_synthesis_001", + "title": "Wantsong认知操作系统", + "author": "Wantsong", + "date": "unknown", + "source_type": "synthesis_note", + "file_path": "C:\\Users\\wangq\\Documents\\Codex\\knowledge-vault\\rules\\cognitive-science\\综合认知模型\\Wantsong认知操作系统.md", + "related_models": ["qpi", "intellectual_archaeology"], + "source_status": "derived_synthesis", + "notes": "既有应用说明和模型化表达,用于补充 QPI 在流程中的位置、思想考古的最小充分原则和操作边界。" + } + ] +} diff --git a/sources/source_excerpts.json b/sources/source_excerpts.json new file mode 100644 index 0000000..6e82135 --- /dev/null +++ b/sources/source_excerpts.json @@ -0,0 +1,199 @@ +{ + "source_excerpts": [ + { + "excerpt_id": "excerpt_qpi_primary_spectrum_001", + "source_id": "article_qpi_primary_001", + "related_model_id": "qpi", + "excerpt_type": "definition", + "summary": "QPI 的核心分类不是难度分级,而是按照核心匮乏物区分提问、难题和课题。", + "used_for": ["one_sentence_definition", "core_mechanism", "output_types"], + "quote_status": "exact", + "raw_excerpt": "我们将这三条光谱命名为:提问 (Question)、难题 (Problem) 与 课题 (Issue)。区分它们的关键,不在于其表象的规模大小,而在于其内核中 “核心匮乏物 (Core Scarcity)” 的差异。", + "source_location": "1. 光谱层:QPI 三元结构,约第 48 行", + "confidence": "high", + "notes": "来自 QPI 原文第一章。" + }, + { + "excerpt_id": "excerpt_qpi_primary_question_001", + "source_id": "article_qpi_primary_001", + "related_model_id": "qpi", + "excerpt_type": "taxonomy", + "summary": "提问对应数据匮乏,应通过搜索、检索、自动化和标准化信息流处理。", + "used_for": ["core_mechanism", "call_when", "regression_cases"], + "quote_status": "exact", + "raw_excerpt": "在这一层级,世界是简单或线性因果的。解决“提问”不需要创造新的路径,也不需要协调价值观的冲突,只需要执行搜索或检索的动作。", + "source_location": "1.1 光谱 A:提问,约第 59 行", + "confidence": "high", + "notes": "用于定义 Q 类输入和正例。" + }, + { + "excerpt_id": "excerpt_qpi_primary_problem_001", + "source_id": "article_qpi_primary_001", + "related_model_id": "qpi", + "excerpt_type": "taxonomy", + "summary": "难题对应路径、方法和资源匮乏;目标清晰但桥梁断裂,理论上可通过工程求解闭环。", + "used_for": ["core_mechanism", "call_when", "regression_cases"], + "quote_status": "exact", + "raw_excerpt": "与“提问”不同,“难题”不仅仅是信息的缺失。我们清楚地知道现在的状态(A点),也无比渴望到达理想的状态(B点),但我们发现连接A与B的桥梁断裂了,或者根本不存在现成的道路。", + "source_location": "1.2 光谱 B:难题,约第 65 行", + "confidence": "high", + "notes": "用于定义 P 类输入和正例。" + }, + { + "excerpt_id": "excerpt_qpi_primary_issue_001", + "source_id": "article_qpi_primary_001", + "related_model_id": "qpi", + "excerpt_type": "taxonomy", + "summary": "课题对应确定性因果与共识匮乏;不追求终结式解决,而追求动态平衡与演化。", + "used_for": ["core_mechanism", "do_not_call_when", "regression_cases"], + "quote_status": "exact", + "raw_excerpt": "对于“课题”,我们追求的不是完结,而是系统的动态平衡与演化。", + "source_location": "1.3 光谱 C:课题,约第 82 行", + "confidence": "high", + "notes": "用于定义 I 类输入、误用和边界。" + }, + { + "excerpt_id": "excerpt_qpi_primary_pathology_reduction_001", + "source_id": "article_qpi_primary_001", + "related_model_id": "qpi", + "excerpt_type": "boundary_rule", + "summary": "暴力降维通常来自权力上位者,将系统性课题压缩成具体执行难题以规避系统责任。", + "used_for": ["common_misuses", "failure_modes", "regression_cases"], + "quote_status": "exact", + "raw_excerpt": "这通常来自权力的上位者。当面对一个复杂的、系统性的“课题 (Issue)”时,承认其复杂性意味着承认管理者在系统设计上的无能或失职。", + "source_location": "3.2 病理学:暴力降维,约第 160 行", + "confidence": "high", + "notes": "用于 QPI 误用和防降维测试。" + }, + { + "excerpt_id": "excerpt_qpi_primary_pathology_inflation_001", + "source_id": "article_qpi_primary_001", + "related_model_id": "qpi", + "excerpt_type": "boundary_rule", + "summary": "恶意升维通常来自执行层,将职责范围内的具体难题放大为不可抗力课题。", + "used_for": ["common_misuses", "failure_modes", "regression_cases"], + "quote_status": "exact", + "raw_excerpt": "这通常来自权力的下位者或执行层。当面对一个具体的、属于自己职责范围内的“难题 (Problem)”时,为了掩盖自身的失误或懒惰,执行者会试图将这个 P 恶意放大为一个不可抗力的 I。", + "source_location": "3.2 病理学:恶意升维,约第 170 行", + "confidence": "high", + "notes": "用于 QPI 误用和防升维测试。" + }, + { + "excerpt_id": "excerpt_qpi_cognitive_os_application_001", + "source_id": "article_cognitive_os_synthesis_001", + "related_model_id": "qpi", + "excerpt_type": "application_rule", + "summary": "QPI 在认知操作系统中位于问题定义阶段,用于先确认问题拥有者、来源和时间尺度,再做三元定性。", + "used_for": ["pipeline_position", "input_types", "selection_rules"], + "quote_status": "condensed", + "raw_excerpt": "扫除前置迷雾后,使用 Wantsong QPI 统一理论 对问题进行精准定性,直接决定后续的资源调度与干预范式。", + "source_location": "2.2 光谱定位:QPI 三元定性,约第 115 行", + "confidence": "medium", + "notes": "这是综合文档中的应用层表达,Markdown 标记已压缩,不作为原始定义唯一来源。" + }, + { + "excerpt_id": "excerpt_qpi_contextual_subjectivity_001", + "source_id": "article_qpi_contextual_2025_001", + "related_model_id": "qpi", + "excerpt_type": "boundary_rule", + "summary": "QPI 定性必须基于上下文场景和认知主体差异,不能把问题当作脱离主体的客观文本实体。", + "used_for": ["one_sentence_definition", "core_mechanism", "output_contract"], + "quote_status": "exact", + "raw_excerpt": "基于上下文场景,我们需要明确认识到问题的颗粒度;", + "source_location": "序,思考列表", + "confidence": "high", + "notes": "用于 QPI v0.3 的上下文充足度门。" + }, + { + "excerpt_id": "excerpt_qpi_contextual_gap_001", + "source_id": "article_qpi_contextual_2025_001", + "related_model_id": "qpi", + "excerpt_type": "definition", + "summary": "问题本质是认知主体期望与现实之间的落差,不同主体会对同一落差形成不同框定。", + "used_for": ["core_question", "core_mechanism", "structured_output_contract"], + "quote_status": "exact", + "raw_excerpt": "问题的本质实际上是期望与现实的差距;", + "source_location": "序,思考列表", + "confidence": "high", + "notes": "用于 expectation_reality_gap 字段。" + }, + { + "excerpt_id": "excerpt_qpi_contextual_dynamic_001", + "source_id": "article_qpi_contextual_2025_001", + "related_model_id": "qpi", + "excerpt_type": "mechanism", + "summary": "问题框架会随时间和新信息演化,Q/P/I 判断应标记动态阶段和可能轨迹。", + "used_for": ["core_mechanism", "structured_output_contract", "regression_cases"], + "quote_status": "exact", + "raw_excerpt": "问题的框架不是一个静态事件,而是一个随着时间推移展开的过程,可能遵循具有明显阶段性的生命周期。", + "source_location": "第四章:时间维度", + "confidence": "high", + "notes": "用于 dynamic_stage 和 possible_trajectory 字段。" + }, + { + "excerpt_id": "excerpt_ia_primary_definition_001", + "source_id": "article_intellectual_archaeology_primary_001", + "related_model_id": "intellectual_archaeology", + "excerpt_type": "definition", + "summary": "思想考古学是一种严谨艰苦的智力活动,要求从表层现象层层下钻到哲学基岩。", + "used_for": ["one_sentence_definition", "core_question", "core_mechanism"], + "quote_status": "exact", + "raw_excerpt": "工坊的日常运作是在“炼金”,那么其成功的根基,则深植于一项更为严谨、更为艰苦的智力活动——我们称之为 “思想考古学”(Intellectual Archaeology)。", + "source_location": "1.3 建模的深度:作为思想考古的多层框架,约第 66 行", + "confidence": "high", + "notes": "来自原文 1.3 节开头。" + }, + { + "excerpt_id": "excerpt_ia_primary_layers_001", + "source_id": "article_intellectual_archaeology_primary_001", + "related_model_id": "intellectual_archaeology", + "excerpt_type": "mechanism", + "summary": "思想考古学以七层同心圆下钻:应用层、领域层、过程层、目的层、核心机理层、人类能力层、哲学基岩层。", + "used_for": ["core_mechanism", "output_types", "regression_cases"], + "quote_status": "condensed", + "raw_excerpt": "我们构建的,是一个七层同心圆式的模型:第一层(应用层)...第七层(哲学基岩层):问题模型。", + "source_location": "1.3 七层同心圆模型,约第 70-80 行", + "confidence": "high", + "notes": "已压缩原文七条列表,因此 quote_status=condensed;完整文本见 source article。" + }, + { + "excerpt_id": "excerpt_ia_primary_resilience_001", + "source_id": "article_intellectual_archaeology_primary_001", + "related_model_id": "intellectual_archaeology", + "excerpt_type": "value_claim", + "summary": "思想考古的价值在于让模型拥有稳定深刻的内核和灵活适应变化的外壳,从而提升动态韧性。", + "used_for": ["call_when", "stability_profile", "productization_notes"], + "quote_status": "exact", + "raw_excerpt": "一个模型的价值,不在于其永不改变,而在于其拥有一个稳定、深刻的“内核”,以及一个能够灵活适应变化的“外壳”。思想考古的深度,直接决定了这个内核的稳固程度。", + "source_location": "1.3 动态韧性说明,约第 88 行", + "confidence": "high", + "notes": "用于说明何时调用思想考古。" + }, + { + "excerpt_id": "excerpt_ia_cognitive_os_minimum_depth_001", + "source_id": "article_cognitive_os_synthesis_001", + "related_model_id": "intellectual_archaeology", + "excerpt_type": "boundary_rule", + "summary": "思想考古容易过度挖掘,必须遵守最小充分下潜原则:继续下潜不再改变判断和行动时停止。", + "used_for": ["do_not_call_when", "common_misuses", "failure_modes", "regression_cases"], + "quote_status": "exact", + "raw_excerpt": "思想考古极易导致过度挖掘。并非所有问题都需要下潜到“哲学基岩”。下潜的唯一停止标准是:是否足以改变判断和行动?", + "source_location": "3.1 纵向下潜:思想考古与最小充分原则,约第 166 行", + "confidence": "medium", + "notes": "来自综合应用文档,作为产品化边界规则。" + }, + { + "excerpt_id": "excerpt_ia_primary_validation_001", + "source_id": "article_intellectual_archaeology_primary_001", + "related_model_id": "intellectual_archaeology", + "excerpt_type": "validation_rule", + "summary": "思想考古产出的模型必须经过内部有效性、动态压力和外部有效性验证,不能只依靠内部自洽。", + "used_for": ["regression_status", "failure_modes", "productization_notes"], + "quote_status": "exact", + "raw_excerpt": "内部逻辑的自洽,绝不等于外部现实的有效。一枚在无风实验室里指向精准的罗盘,未必能经受住真实海洋中磁暴的考验。", + "source_location": "第四幕:验证,约第 215 行", + "confidence": "high", + "notes": "来自第四幕验证段落。" + } + ] +} diff --git a/tests/README.md b/tests/README.md index bd535ff..905b0d4 100644 --- a/tests/README.md +++ b/tests/README.md @@ -9,3 +9,22 @@ Each core model should eventually include: - Positive cases - Boundary cases - Misuse cases + +Current v0.2 regression data lives in: + +- `qpi.regression.json` +- `intellectual_archaeology.regression.json` +- `regression_cases.json` + +The per-model files are the human-review source of truth. The aggregate file is used by validation scripts. + +Each core model should include at least 15 cases covering: + +- Positive cases +- Boundary cases +- Misuse cases +- No-call cases +- Selector gate cases +- Pipeline cases + +Python unit tests for local validation live beside the product regression data. They test repository scripts, not cognitive model behavior directly. diff --git a/tests/intellectual_archaeology.regression.json b/tests/intellectual_archaeology.regression.json new file mode 100644 index 0000000..2c0c6eb --- /dev/null +++ b/tests/intellectual_archaeology.regression.json @@ -0,0 +1,22 @@ +{ + "model_id": "intellectual_archaeology", + "regression_cases": [ + {"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。"} + ] +} diff --git a/tests/qpi.regression.json b/tests/qpi.regression.json new file mode 100644 index 0000000..67afb0d --- /dev/null +++ b/tests/qpi.regression.json @@ -0,0 +1,22 @@ +{ + "model_id": "qpi", + "regression_cases": [ + {"case_id": "case_qpi_positive_question_001", "model_id": "qpi", "case_type": "positive", "input": "我不知道这次服务器宕机的错误码是什么,也不知道日志在哪里。", "expected_behavior": "应识别为提问,核心匮乏物是数据,建议先检索日志和错误码。", "failure_signal": "把它升维为组织课题,或直接给出复杂治理建议。", "expected_output_elements": ["classification=question", "dominant_scarcity=data", "recommended_next_step=检索"], "should_call_model": true, "expected_primary_model": "qpi", "negative_expected_models": ["intellectual_archaeology"], "expected_classification": "question", "expected_dominant_scarcity": "data", "expected_max_depth": "not_applicable", "minimum_required_elements": ["problem_owner", "scarcity_profile", "evidence_gap"], "forbidden_elements": ["philosophical_bedrock"], "evaluation_mode": "structured", "notes": "Q 类正例。"}, + {"case_id": "case_qpi_positive_question_002", "model_id": "qpi", "case_type": "positive", "input": "竞争对手上个月的定价策略我没有资料,先帮我判断这是什么缺口。", "expected_behavior": "应识别为提问,缺少事实资料。", "failure_signal": "进入思想考古或组织治理。", "expected_output_elements": ["question", "data_scarcity=high"], "should_call_model": true, "expected_primary_model": "qpi", "negative_expected_models": ["intellectual_archaeology"], "expected_classification": "question", "expected_dominant_scarcity": "data", "expected_max_depth": "not_applicable", "minimum_required_elements": ["classification_confidence", "recommended_next_step"], "forbidden_elements": ["七层下钻"], "evaluation_mode": "structured", "notes": "Q 类正例。"}, + {"case_id": "case_qpi_positive_question_003", "model_id": "qpi", "case_type": "positive", "input": "我只是不知道季度报表在哪里,这算不算复杂问题?", "expected_behavior": "应识别为提问或 no_call 边界,建议检索位置,不做深层分析。", "failure_signal": "把它解释成系统性课题。", "expected_output_elements": ["data_scarcity=high", "recommended_next_step=检索"], "should_call_model": true, "expected_primary_model": "qpi", "negative_expected_models": ["intellectual_archaeology"], "expected_classification": "question", "expected_dominant_scarcity": "data", "expected_max_depth": "not_applicable", "minimum_required_elements": ["classification", "evidence_gap"], "forbidden_elements": ["哲学基岩"], "evaluation_mode": "structured", "notes": "轻量 Q 类。"}, + {"case_id": "case_qpi_positive_problem_001", "model_id": "qpi", "case_type": "positive", "input": "我们知道目标是三个月内提升留存,但现有团队缺少增长实验方法和数据分析资源。", "expected_behavior": "应识别为难题,核心匮乏物是路径、方法与资源。", "failure_signal": "只要求团队开会达成共识,忽略路径和资源缺口。", "expected_output_elements": ["classification=problem", "dominant_scarcity=path_resource"], "should_call_model": true, "expected_primary_model": "qpi", "negative_expected_models": [], "expected_classification": "problem", "expected_dominant_scarcity": "path_resource", "expected_max_depth": "not_applicable", "minimum_required_elements": ["recommended_next_step=工程拆解"], "forbidden_elements": [], "evaluation_mode": "structured", "notes": "P 类正例。"}, + {"case_id": "case_qpi_positive_problem_002", "model_id": "qpi", "case_type": "positive", "input": "我们要把模型库做出来,目标清楚,但不知道文件结构、schema 和验证脚本怎么排。", "expected_behavior": "应识别为难题,缺路径和工程拆解。", "failure_signal": "误判为课题或哲学问题。", "expected_output_elements": ["problem", "path_or_resource_scarcity=high"], "should_call_model": true, "expected_primary_model": "qpi", "negative_expected_models": ["intellectual_archaeology"], "expected_classification": "problem", "expected_dominant_scarcity": "path_resource", "expected_max_depth": "not_applicable", "minimum_required_elements": ["problem_owner", "recommended_next_step"], "forbidden_elements": ["philosophical_bedrock"], "evaluation_mode": "structured", "notes": "工程路径正例。"}, + {"case_id": "case_qpi_positive_problem_003", "model_id": "qpi", "case_type": "positive", "input": "销售团队知道要触达老客户,但缺少名单清洗流程和跟进节奏。", "expected_behavior": "应识别为难题,建议工程拆解和资源配置。", "failure_signal": "把它归为价值观冲突。", "expected_output_elements": ["problem", "工程拆解"], "should_call_model": true, "expected_primary_model": "qpi", "negative_expected_models": [], "expected_classification": "problem", "expected_dominant_scarcity": "path_resource", "expected_max_depth": "not_applicable", "minimum_required_elements": ["scarcity_profile"], "forbidden_elements": [], "evaluation_mode": "structured", "notes": "P 类正例。"}, + {"case_id": "case_qpi_positive_issue_001", "model_id": "qpi", "case_type": "positive", "input": "公司各部门对增长目标、品牌定位和用户价值完全没有共识,每个方案都会引发新的抵抗。", "expected_behavior": "应识别为课题,核心匮乏物是共识、确定性与动态秩序。", "failure_signal": "把它简化成某个员工执行力不足或单一预算不足。", "expected_output_elements": ["classification=issue", "dominant_scarcity=consensus_order"], "should_call_model": true, "expected_primary_model": "qpi", "negative_expected_models": [], "expected_classification": "issue", "expected_dominant_scarcity": "consensus_order", "expected_max_depth": "not_applicable", "minimum_required_elements": ["misclassification_risk"], "forbidden_elements": [], "evaluation_mode": "structured", "notes": "I 类正例。"}, + {"case_id": "case_qpi_positive_issue_002", "model_id": "qpi", "case_type": "positive", "input": "长期主义和季度 KPI 反复冲突,团队每次都回到短期动作。", "expected_behavior": "应识别为课题或 mixed 偏 issue,指出时间尺度冲突和共识秩序缺口。", "failure_signal": "只给执行清单。", "expected_output_elements": ["issue", "time_scale=mixed"], "should_call_model": true, "expected_primary_model": "qpi", "negative_expected_models": [], "expected_classification": "issue", "expected_dominant_scarcity": "consensus_order", "expected_max_depth": "not_applicable", "minimum_required_elements": ["time_scale", "problem_source"], "forbidden_elements": [], "evaluation_mode": "structured", "notes": "组织时间尺度课题。"}, + {"case_id": "case_qpi_positive_issue_003", "model_id": "qpi", "case_type": "positive", "input": "教育资源不公平不是一个项目能终结的,但我们需要判断该怎么定义它。", "expected_behavior": "应识别为课题,强调动态治理而非终结式解决。", "failure_signal": "承诺单一解决方案。", "expected_output_elements": ["issue", "动态平衡"], "should_call_model": true, "expected_primary_model": "qpi", "negative_expected_models": [], "expected_classification": "issue", "expected_dominant_scarcity": "consensus_order", "expected_max_depth": "not_applicable", "minimum_required_elements": ["recommended_next_step=共识协调"], "forbidden_elements": ["一次性解决"], "evaluation_mode": "structured", "notes": "社会系统课题。"}, + {"case_id": "case_qpi_boundary_mixed_001", "model_id": "qpi", "case_type": "boundary", "input": "用户流失率升高,既缺少分群数据,也不确定是产品路径问题还是品牌信任问题。", "expected_behavior": "应先标出混合状态,建议补齐数据后再判断主导匮乏物。", "failure_signal": "直接断言这是课题或难题,且不给出证据缺口。", "expected_output_elements": ["classification=mixed", "evidence_gap"], "should_call_model": true, "expected_primary_model": "qpi", "negative_expected_models": [], "expected_classification": "mixed", "expected_dominant_scarcity": "mixed", "expected_max_depth": "not_applicable", "minimum_required_elements": ["evidence_gap", "dominant_scarcity"], "forbidden_elements": [], "evaluation_mode": "structured", "notes": "mixed 边界。"}, + {"case_id": "case_qpi_boundary_mixed_002", "model_id": "qpi", "case_type": "boundary", "input": "产品上线失败,可能是缺数据、缺发布流程,也可能是团队对价值主张不一致。", "expected_behavior": "应标 mixed,并要求补充证据以判断主导匮乏物。", "failure_signal": "强行单标签。", "expected_output_elements": ["mixed", "补充上下文"], "should_call_model": true, "expected_primary_model": "qpi", "negative_expected_models": [], "expected_classification": "mixed", "expected_dominant_scarcity": "mixed", "expected_max_depth": "not_applicable", "minimum_required_elements": ["scarcity_profile"], "forbidden_elements": [], "evaluation_mode": "structured", "notes": "三类匮乏物混合。"}, + {"case_id": "case_qpi_boundary_mixed_003", "model_id": "qpi", "case_type": "boundary", "input": "团队说这是战略课题,但实际只看到客户跟进表长期没人维护。", "expected_behavior": "应警惕恶意升维,先切回可验证的路径/责任问题。", "failure_signal": "接受战略课题叙事。", "expected_output_elements": ["恶意升维", "problem"], "should_call_model": true, "expected_primary_model": "qpi", "negative_expected_models": ["intellectual_archaeology"], "expected_classification": "problem", "expected_dominant_scarcity": "path_resource", "expected_max_depth": "not_applicable", "minimum_required_elements": ["misclassification_risk"], "forbidden_elements": ["哲学基岩"], "evaluation_mode": "structured", "notes": "边界加误用。"}, + {"case_id": "case_qpi_misuse_inflation_001", "model_id": "qpi", "case_type": "misuse", "input": "我没有跟进客户不是我的问题,是大环境不好,客户都没预算。", "expected_behavior": "应警惕恶意升维,要求从宏大 Issue 中切割出当前可执行、可衡量的 Problem。", "failure_signal": "完全接受大环境叙事,放弃执行责任拆解。", "expected_output_elements": ["恶意升维", "具体障碍"], "should_call_model": true, "expected_primary_model": "qpi", "negative_expected_models": ["intellectual_archaeology"], "expected_classification": "problem", "expected_dominant_scarcity": "path_resource", "expected_max_depth": "not_applicable", "minimum_required_elements": ["problem_source", "misclassification_risk"], "forbidden_elements": ["不可抗力所以无需行动"], "evaluation_mode": "structured", "notes": "恶意升维。"}, + {"case_id": "case_qpi_misuse_reduction_001", "model_id": "qpi", "case_type": "misuse", "input": "组织创新乏力就是员工不够努力,给他们加 KPI 就行。", "expected_behavior": "应识别暴力降维,提示系统性课题被压缩成个人执行难题。", "failure_signal": "接受单一执行力解释。", "expected_output_elements": ["暴力降维", "issue"], "should_call_model": true, "expected_primary_model": "qpi", "negative_expected_models": [], "expected_classification": "issue", "expected_dominant_scarcity": "consensus_order", "expected_max_depth": "not_applicable", "minimum_required_elements": ["misclassification_risk"], "forbidden_elements": ["只加 KPI"], "evaluation_mode": "structured", "notes": "暴力降维。"}, + {"case_id": "case_qpi_no_call_direct_edit_001", "model_id": "qpi", "case_type": "no_call", "input": "请直接把这句话改得更顺,不要分析原因。", "expected_behavior": "应 no_call,不进入 QPI 分析。", "failure_signal": "输出问题类型判断。", "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": ["recommended_next_step=不调用"], "forbidden_elements": ["dominant_scarcity=data"], "evaluation_mode": "structured", "notes": "纯改写 no-call。"}, + {"case_id": "case_qpi_selector_gate_fact_001", "model_id": "qpi", "case_type": "selector_gate", "input": "只查一下 QPI 这三个字母是什么意思,不要展开。", "expected_behavior": "selector 应低分或 no_call,思想考古必须被拒绝。", "failure_signal": "因为出现 QPI 或模型词而召回 IA。", "expected_output_elements": ["no_call"], "should_call_model": false, "expected_primary_model": "none", "negative_expected_models": ["intellectual_archaeology"], "expected_classification": "no_call", "expected_dominant_scarcity": "not_applicable", "expected_max_depth": "not_applicable", "minimum_required_elements": ["rejected_models"], "forbidden_elements": ["七层"], "evaluation_mode": "structured", "notes": "selector 防误召回。"}, + {"case_id": "case_qpi_pipeline_before_ia_001", "model_id": "qpi", "case_type": "pipeline", "input": "我们不知道这是执行路径问题还是组织共识问题,后面可能要深挖。", "expected_behavior": "应先调用 QPI,再决定是否进入思想考古。", "failure_signal": "直接调用思想考古。", "expected_output_elements": ["qpi first"], "should_call_model": true, "expected_primary_model": "qpi", "negative_expected_models": [], "expected_classification": "mixed", "expected_dominant_scarcity": "mixed", "expected_max_depth": "not_applicable", "minimum_required_elements": ["next_model_candidates"], "forbidden_elements": [], "evaluation_mode": "structured", "notes": "QPI-before-IA pipeline gate。"} + ] +} diff --git a/tests/regression_cases.json b/tests/regression_cases.json new file mode 100644 index 0000000..81d5c4e --- /dev/null +++ b/tests/regression_cases.json @@ -0,0 +1,38 @@ +{ + "regression_cases": [ + {"case_id": "case_qpi_positive_question_001", "model_id": "qpi", "case_type": "positive", "input": "我不知道这次服务器宕机的错误码是什么,也不知道日志在哪里。", "expected_behavior": "应识别为提问,核心匮乏物是数据,建议先检索日志和错误码。", "failure_signal": "把它升维为组织课题,或直接给出复杂治理建议。", "expected_output_elements": ["classification=question", "dominant_scarcity=data", "recommended_next_step=检索"], "should_call_model": true, "expected_primary_model": "qpi", "negative_expected_models": ["intellectual_archaeology"], "expected_classification": "question", "expected_dominant_scarcity": "data", "expected_max_depth": "not_applicable", "minimum_required_elements": ["problem_owner", "scarcity_profile", "evidence_gap"], "forbidden_elements": ["philosophical_bedrock"], "evaluation_mode": "structured", "notes": "Q 类正例。"}, + {"case_id": "case_qpi_positive_question_002", "model_id": "qpi", "case_type": "positive", "input": "竞争对手上个月的定价策略我没有资料,先帮我判断这是什么缺口。", "expected_behavior": "应识别为提问,缺少事实资料。", "failure_signal": "进入思想考古或组织治理。", "expected_output_elements": ["question", "data_scarcity=high"], "should_call_model": true, "expected_primary_model": "qpi", "negative_expected_models": ["intellectual_archaeology"], "expected_classification": "question", "expected_dominant_scarcity": "data", "expected_max_depth": "not_applicable", "minimum_required_elements": ["classification_confidence", "recommended_next_step"], "forbidden_elements": ["七层下钻"], "evaluation_mode": "structured", "notes": "Q 类正例。"}, + {"case_id": "case_qpi_positive_question_003", "model_id": "qpi", "case_type": "positive", "input": "我只是不知道季度报表在哪里,这算不算复杂问题?", "expected_behavior": "应识别为提问或 no_call 边界,建议检索位置,不做深层分析。", "failure_signal": "把它解释成系统性课题。", "expected_output_elements": ["data_scarcity=high", "recommended_next_step=检索"], "should_call_model": true, "expected_primary_model": "qpi", "negative_expected_models": ["intellectual_archaeology"], "expected_classification": "question", "expected_dominant_scarcity": "data", "expected_max_depth": "not_applicable", "minimum_required_elements": ["classification", "evidence_gap"], "forbidden_elements": ["哲学基岩"], "evaluation_mode": "structured", "notes": "轻量 Q 类。"}, + {"case_id": "case_qpi_positive_problem_001", "model_id": "qpi", "case_type": "positive", "input": "我们知道目标是三个月内提升留存,但现有团队缺少增长实验方法和数据分析资源。", "expected_behavior": "应识别为难题,核心匮乏物是路径、方法与资源。", "failure_signal": "只要求团队开会达成共识,忽略路径和资源缺口。", "expected_output_elements": ["classification=problem", "dominant_scarcity=path_resource"], "should_call_model": true, "expected_primary_model": "qpi", "negative_expected_models": [], "expected_classification": "problem", "expected_dominant_scarcity": "path_resource", "expected_max_depth": "not_applicable", "minimum_required_elements": ["recommended_next_step=工程拆解"], "forbidden_elements": [], "evaluation_mode": "structured", "notes": "P 类正例。"}, + {"case_id": "case_qpi_positive_problem_002", "model_id": "qpi", "case_type": "positive", "input": "我们要把模型库做出来,目标清楚,但不知道文件结构、schema 和验证脚本怎么排。", "expected_behavior": "应识别为难题,缺路径和工程拆解。", "failure_signal": "误判为课题或哲学问题。", "expected_output_elements": ["problem", "path_or_resource_scarcity=high"], "should_call_model": true, "expected_primary_model": "qpi", "negative_expected_models": ["intellectual_archaeology"], "expected_classification": "problem", "expected_dominant_scarcity": "path_resource", "expected_max_depth": "not_applicable", "minimum_required_elements": ["problem_owner", "recommended_next_step"], "forbidden_elements": ["philosophical_bedrock"], "evaluation_mode": "structured", "notes": "工程路径正例。"}, + {"case_id": "case_qpi_positive_problem_003", "model_id": "qpi", "case_type": "positive", "input": "销售团队知道要触达老客户,但缺少名单清洗流程和跟进节奏。", "expected_behavior": "应识别为难题,建议工程拆解和资源配置。", "failure_signal": "把它归为价值观冲突。", "expected_output_elements": ["problem", "工程拆解"], "should_call_model": true, "expected_primary_model": "qpi", "negative_expected_models": [], "expected_classification": "problem", "expected_dominant_scarcity": "path_resource", "expected_max_depth": "not_applicable", "minimum_required_elements": ["scarcity_profile"], "forbidden_elements": [], "evaluation_mode": "structured", "notes": "P 类正例。"}, + {"case_id": "case_qpi_positive_issue_001", "model_id": "qpi", "case_type": "positive", "input": "公司各部门对增长目标、品牌定位和用户价值完全没有共识,每个方案都会引发新的抵抗。", "expected_behavior": "应识别为课题,核心匮乏物是共识、确定性与动态秩序。", "failure_signal": "把它简化成某个员工执行力不足或单一预算不足。", "expected_output_elements": ["classification=issue", "dominant_scarcity=consensus_order"], "should_call_model": true, "expected_primary_model": "qpi", "negative_expected_models": [], "expected_classification": "issue", "expected_dominant_scarcity": "consensus_order", "expected_max_depth": "not_applicable", "minimum_required_elements": ["misclassification_risk"], "forbidden_elements": [], "evaluation_mode": "structured", "notes": "I 类正例。"}, + {"case_id": "case_qpi_positive_issue_002", "model_id": "qpi", "case_type": "positive", "input": "长期主义和季度 KPI 反复冲突,团队每次都回到短期动作。", "expected_behavior": "应识别为课题或 mixed 偏 issue,指出时间尺度冲突和共识秩序缺口。", "failure_signal": "只给执行清单。", "expected_output_elements": ["issue", "time_scale=mixed"], "should_call_model": true, "expected_primary_model": "qpi", "negative_expected_models": [], "expected_classification": "issue", "expected_dominant_scarcity": "consensus_order", "expected_max_depth": "not_applicable", "minimum_required_elements": ["time_scale", "problem_source"], "forbidden_elements": [], "evaluation_mode": "structured", "notes": "组织时间尺度课题。"}, + {"case_id": "case_qpi_positive_issue_003", "model_id": "qpi", "case_type": "positive", "input": "教育资源不公平不是一个项目能终结的,但我们需要判断该怎么定义它。", "expected_behavior": "应识别为课题,强调动态治理而非终结式解决。", "failure_signal": "承诺单一解决方案。", "expected_output_elements": ["issue", "动态平衡"], "should_call_model": true, "expected_primary_model": "qpi", "negative_expected_models": [], "expected_classification": "issue", "expected_dominant_scarcity": "consensus_order", "expected_max_depth": "not_applicable", "minimum_required_elements": ["recommended_next_step=共识协调"], "forbidden_elements": ["一次性解决"], "evaluation_mode": "structured", "notes": "社会系统课题。"}, + {"case_id": "case_qpi_boundary_mixed_001", "model_id": "qpi", "case_type": "boundary", "input": "用户流失率升高,既缺少分群数据,也不确定是产品路径问题还是品牌信任问题。", "expected_behavior": "应先标出混合状态,建议补齐数据后再判断主导匮乏物。", "failure_signal": "直接断言这是课题或难题,且不给出证据缺口。", "expected_output_elements": ["classification=mixed", "evidence_gap"], "should_call_model": true, "expected_primary_model": "qpi", "negative_expected_models": [], "expected_classification": "mixed", "expected_dominant_scarcity": "mixed", "expected_max_depth": "not_applicable", "minimum_required_elements": ["evidence_gap", "dominant_scarcity"], "forbidden_elements": [], "evaluation_mode": "structured", "notes": "mixed 边界。"}, + {"case_id": "case_qpi_boundary_mixed_002", "model_id": "qpi", "case_type": "boundary", "input": "产品上线失败,可能是缺数据、缺发布流程,也可能是团队对价值主张不一致。", "expected_behavior": "应标 mixed,并要求补充证据以判断主导匮乏物。", "failure_signal": "强行单标签。", "expected_output_elements": ["mixed", "补充上下文"], "should_call_model": true, "expected_primary_model": "qpi", "negative_expected_models": [], "expected_classification": "mixed", "expected_dominant_scarcity": "mixed", "expected_max_depth": "not_applicable", "minimum_required_elements": ["scarcity_profile"], "forbidden_elements": [], "evaluation_mode": "structured", "notes": "三类匮乏物混合。"}, + {"case_id": "case_qpi_boundary_mixed_003", "model_id": "qpi", "case_type": "boundary", "input": "团队说这是战略课题,但实际只看到客户跟进表长期没人维护。", "expected_behavior": "应警惕恶意升维,先切回可验证的路径/责任问题。", "failure_signal": "接受战略课题叙事。", "expected_output_elements": ["恶意升维", "problem"], "should_call_model": true, "expected_primary_model": "qpi", "negative_expected_models": ["intellectual_archaeology"], "expected_classification": "problem", "expected_dominant_scarcity": "path_resource", "expected_max_depth": "not_applicable", "minimum_required_elements": ["misclassification_risk"], "forbidden_elements": ["哲学基岩"], "evaluation_mode": "structured", "notes": "边界加误用。"}, + {"case_id": "case_qpi_misuse_inflation_001", "model_id": "qpi", "case_type": "misuse", "input": "我没有跟进客户不是我的问题,是大环境不好,客户都没预算。", "expected_behavior": "应警惕恶意升维,要求从宏大 Issue 中切割出当前可执行、可衡量的 Problem。", "failure_signal": "完全接受大环境叙事,放弃执行责任拆解。", "expected_output_elements": ["恶意升维", "具体障碍"], "should_call_model": true, "expected_primary_model": "qpi", "negative_expected_models": ["intellectual_archaeology"], "expected_classification": "problem", "expected_dominant_scarcity": "path_resource", "expected_max_depth": "not_applicable", "minimum_required_elements": ["problem_source", "misclassification_risk"], "forbidden_elements": ["不可抗力所以无需行动"], "evaluation_mode": "structured", "notes": "恶意升维。"}, + {"case_id": "case_qpi_misuse_reduction_001", "model_id": "qpi", "case_type": "misuse", "input": "组织创新乏力就是员工不够努力,给他们加 KPI 就行。", "expected_behavior": "应识别暴力降维,提示系统性课题被压缩成个人执行难题。", "failure_signal": "接受单一执行力解释。", "expected_output_elements": ["暴力降维", "issue"], "should_call_model": true, "expected_primary_model": "qpi", "negative_expected_models": [], "expected_classification": "issue", "expected_dominant_scarcity": "consensus_order", "expected_max_depth": "not_applicable", "minimum_required_elements": ["misclassification_risk"], "forbidden_elements": ["只加 KPI"], "evaluation_mode": "structured", "notes": "暴力降维。"}, + {"case_id": "case_qpi_no_call_direct_edit_001", "model_id": "qpi", "case_type": "no_call", "input": "请直接把这句话改得更顺,不要分析原因。", "expected_behavior": "应 no_call,不进入 QPI 分析。", "failure_signal": "输出问题类型判断。", "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": ["recommended_next_step=不调用"], "forbidden_elements": ["dominant_scarcity=data"], "evaluation_mode": "structured", "notes": "纯改写 no-call。"}, + {"case_id": "case_qpi_selector_gate_fact_001", "model_id": "qpi", "case_type": "selector_gate", "input": "只查一下 QPI 这三个字母是什么意思,不要展开。", "expected_behavior": "selector 应低分或 no_call,思想考古必须被拒绝。", "failure_signal": "因为出现 QPI 或模型词而召回 IA。", "expected_output_elements": ["no_call"], "should_call_model": false, "expected_primary_model": "none", "negative_expected_models": ["intellectual_archaeology"], "expected_classification": "no_call", "expected_dominant_scarcity": "not_applicable", "expected_max_depth": "not_applicable", "minimum_required_elements": ["rejected_models"], "forbidden_elements": ["七层"], "evaluation_mode": "structured", "notes": "selector 防误召回。"}, + {"case_id": "case_qpi_pipeline_before_ia_001", "model_id": "qpi", "case_type": "pipeline", "input": "我们不知道这是执行路径问题还是组织共识问题,后面可能要深挖。", "expected_behavior": "应先调用 QPI,再决定是否进入思想考古。", "failure_signal": "直接调用思想考古。", "expected_output_elements": ["qpi first"], "should_call_model": true, "expected_primary_model": "qpi", "negative_expected_models": [], "expected_classification": "mixed", "expected_dominant_scarcity": "mixed", "expected_max_depth": "not_applicable", "minimum_required_elements": ["next_model_candidates"], "forbidden_elements": [], "evaluation_mode": "structured", "notes": "QPI-before-IA pipeline gate。"}, + {"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。"} + ] +} diff --git a/tests/regression_index.json b/tests/regression_index.json new file mode 100644 index 0000000..4be3196 --- /dev/null +++ b/tests/regression_index.json @@ -0,0 +1,34 @@ +{ + "index_version": "0.2", + "last_updated": "2026-06-16", + "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_type_counts": { + "positive": 9, + "boundary": 3, + "misuse": 2, + "no_call": 1, + "selector_gate": 1, + "pipeline": 1 + } + }, + { + "model_id": "intellectual_archaeology", + "regression_file": "tests/intellectual_archaeology.regression.json", + "case_count": 17, + "case_type_counts": { + "positive": 5, + "boundary": 3, + "misuse": 3, + "no_call": 3, + "selector_gate": 2, + "pipeline": 1 + } + } + ] +} diff --git a/tests/test_card_contract.py b/tests/test_card_contract.py new file mode 100644 index 0000000..22eb9a7 --- /dev/null +++ b/tests/test_card_contract.py @@ -0,0 +1,37 @@ +import importlib.util +import tempfile +import unittest +from pathlib import Path + + +def load_card_checker(): + script_path = Path(__file__).resolve().parents[1] / "scripts" / "check_card_contract.py" + spec = importlib.util.spec_from_file_location("check_card_contract", script_path) + module = importlib.util.module_from_spec(spec) + spec.loader.exec_module(module) + return module + + +class CardContractTests(unittest.TestCase): + def test_missing_required_heading_is_reported(self): + checker = load_card_checker() + with tempfile.TemporaryDirectory() as tmp: + root = Path(tmp) + (root / "docs").mkdir() + (root / "cards").mkdir() + (root / "docs" / "MODEL_CARD_CONTRACT.md").write_text( + "# Model Card Contract\n\n## Required Sections\n\n## 模型名称\n\n## 调用关键词\n", + encoding="utf-8" + ) + (root / "cards" / "qpi.md").write_text( + "# QPI\n\n## 模型名称\n\nQPI\n", + encoding="utf-8" + ) + + errors = checker.check_cards(root) + + self.assertEqual(errors, ["cards/qpi.md missing required heading ## 调用关键词"]) + + +if __name__ == "__main__": + unittest.main() diff --git a/tests/test_rebuild_indexes.py b/tests/test_rebuild_indexes.py new file mode 100644 index 0000000..210ad5c --- /dev/null +++ b/tests/test_rebuild_indexes.py @@ -0,0 +1,77 @@ +import importlib.util +import json +import tempfile +import unittest +from pathlib import Path + + +def load_rebuilder(): + script_path = Path(__file__).resolve().parents[1] / "scripts" / "rebuild_indexes.py" + spec = importlib.util.spec_from_file_location("rebuild_indexes", script_path) + module = importlib.util.module_from_spec(spec) + spec.loader.exec_module(module) + return module + + +class RebuildIndexesTests(unittest.TestCase): + def write_json(self, root, relative_path, data): + path = root / relative_path + path.parent.mkdir(parents=True, exist_ok=True) + path.write_text(json.dumps(data, ensure_ascii=False, indent=2), encoding="utf-8") + + def write_library_without_indexes(self, root): + self.write_json(root, "models/qpi.model.json", { + "model_id": "qpi", + "model_name": "QPI 三元定性模型", + "model_type": "routing_model", + "pipeline_position": "pre_analysis", + "status": "draft", + "source_articles": ["article_qpi_primary_001"], + "source_evidence": ["excerpt_qpi_001"], + "stability_profile": {"stability_level": "B"}, + "regression_status": "pending", + "version": "0.1", + "last_updated": "2026-06-16" + }) + (root / "cards").mkdir(parents=True, exist_ok=True) + (root / "cards" / "qpi.md").write_text("# QPI\n", encoding="utf-8") + self.write_json(root, "tests/regression_cases.json", { + "regression_cases": [ + {"case_id": "case_1", "model_id": "qpi"}, + {"case_id": "case_2", "model_id": "qpi"} + ] + }) + + def test_write_rebuilds_model_and_card_indexes(self): + rebuilder = load_rebuilder() + with tempfile.TemporaryDirectory() as tmp: + root = Path(tmp) + self.write_library_without_indexes(root) + + result = rebuilder.rebuild_indexes(root, write=True) + + self.assertFalse(result.drift_found) + model_index = json.loads((root / "models" / "model_index.json").read_text(encoding="utf-8")) + self.assertEqual(model_index["models"][0]["model_id"], "qpi") + self.assertEqual(model_index["models"][0]["regression_case_count"], 2) + self.assertEqual(model_index["models"][0]["status"], "draft") + card_index = (root / "cards" / "card_index.md").read_text(encoding="utf-8") + self.assertIn("| qpi | QPI 三元定性模型 | routing_model | pre_analysis |", card_index) + self.assertTrue((root / "reports" / "index_rebuild_report.md").exists()) + + def test_check_reports_drift_without_writing(self): + rebuilder = load_rebuilder() + with tempfile.TemporaryDirectory() as tmp: + root = Path(tmp) + self.write_library_without_indexes(root) + (root / "models" / "model_index.json").write_text("{}\n", encoding="utf-8") + (root / "cards" / "card_index.md").write_text("# stale\n", encoding="utf-8") + + result = rebuilder.rebuild_indexes(root, write=False) + + self.assertTrue(result.drift_found) + self.assertEqual((root / "models" / "model_index.json").read_text(encoding="utf-8"), "{}\n") + + +if __name__ == "__main__": + unittest.main() diff --git a/tests/test_validate_model_library.py b/tests/test_validate_model_library.py new file mode 100644 index 0000000..3b397ba --- /dev/null +++ b/tests/test_validate_model_library.py @@ -0,0 +1,458 @@ +import importlib.util +import json +import tempfile +import unittest +from pathlib import Path + + +def load_validator(): + script_path = Path(__file__).resolve().parents[1] / "scripts" / "validate_model_library.py" + spec = importlib.util.spec_from_file_location("validate_model_library", script_path) + module = importlib.util.module_from_spec(spec) + spec.loader.exec_module(module) + return module + + +class ValidateModelLibraryTests(unittest.TestCase): + def write_json(self, root, relative_path, data): + path = root / relative_path + path.parent.mkdir(parents=True, exist_ok=True) + path.write_text(json.dumps(data, ensure_ascii=False, indent=2), encoding="utf-8") + + def test_valid_library_has_no_errors(self): + validator = load_validator() + with tempfile.TemporaryDirectory() as tmp: + root = Path(tmp) + self.write_minimal_library(root) + + errors = validator.validate_library(root) + + self.assertEqual(errors, []) + + def test_missing_source_reference_is_reported(self): + validator = load_validator() + with tempfile.TemporaryDirectory() as tmp: + root = Path(tmp) + self.write_json(root, "sources/source_articles.json", {"source_articles": []}) + self.write_json(root, "sources/source_excerpts.json", {"source_excerpts": []}) + self.write_json(root, "models/qpi.model.json", { + "model_id": "qpi", + "model_name": "QPI 三元定性模型", + "model_type": "routing", + "pipeline_position": "problem_definition", + "one_sentence_definition": "用于判断输入缺的是数据、路径还是共识。", + "core_question": "当前输入到底是提问、难题还是课题?", + "core_mechanism": "扫描核心匮乏物并匹配干预范式。", + "source_articles": ["missing_article"], + "source_evidence": ["missing_excerpt"], + "input_types": ["ambiguous_situation"], + "output_types": ["classification"], + "call_when": ["需要先判断问题类型"], + "do_not_call_when": ["事实检索已经足够"], + "common_misuses": ["把所有复杂局面都升维为课题"], + "failure_modes": ["误判核心匮乏物"], + "selection_priority": 90, + "confidence_level": "medium", + "stability_profile": {"status": "draft", "main_risks": ["样本仍少"]}, + "regression_status": "draft", + "productization_notes": ["v0.1 样板模型"] + }) + self.write_json(root, "tests/regression_cases.json", {"regression_cases": []}) + + errors = validator.validate_library(root) + + self.assertIn("models/qpi.model.json references unknown source article missing_article", errors) + self.assertIn("models/qpi.model.json references unknown source excerpt missing_excerpt", errors) + + def write_minimal_library(self, root, model_overrides=None, index_overrides=None): + model = { + "model_id": "qpi", + "model_name": "QPI 三元定性模型", + "model_type": "routing_model", + "pipeline_position": "pre_analysis", + "one_sentence_definition": "用于判断输入缺的是数据、路径还是共识。", + "core_question": "当前输入到底是提问、难题还是课题?", + "core_mechanism": "扫描核心匮乏物并匹配干预范式。", + "status": "draft", + "source_articles": ["article_qpi_primary_001"], + "source_evidence": ["excerpt_qpi_001"], + "input_types": ["模糊局面"], + "output_types": ["分类"], + "call_when": ["需要先判断问题类型"], + "do_not_call_when": ["事实检索已经足够"], + "trigger_keywords": ["这是什么问题"], + "negative_triggers": ["只查事实"], + "related_models": [], + "conflicting_models": [], + "disciplinary_anchors": ["问题定义理论"], + "common_misuses": ["把所有复杂局面都升维为课题"], + "failure_modes": ["误判核心匮乏物"], + "selection_priority": 9, + "confidence_level": "medium", + "stability_profile": { + "stability_level": "B", + "needs_stabilization": True, + "main_risks": ["样本仍少"], + "reason": "结构清晰但边界案例不足。", + "next_stabilization_action": "补充混合问题测试。" + }, + "regression_status": "pending", + "example_inputs": ["这到底是什么问题?"], + "example_outputs": ["偏 Question,因为缺事实。"], + "output_contract": ["输出分类和理由"], + "structured_output_contract": { + "classification_scope": ["subject_contextual", "multi_perspective", "insufficient_context", "no_call"], + "is_provisional": "boolean", + "subject_position": "string | unknown", + "scenario_context": "string | unknown", + "responsibility_scope": ["individual_learning", "team_execution", "cross_function_governance", "owner_governance", "unknown"], + "context_sufficiency": ["high", "medium", "low"], + "missing_context": "array", + "problem_owner": "string | unknown", + "problem_source": "string | unknown", + "time_scale": ["short_term", "mid_term", "long_term", "mixed", "unknown"], + "scarcity_profile": { + "data_scarcity": ["high", "medium", "low", "unknown"], + "path_or_resource_scarcity": ["high", "medium", "low", "unknown"], + "consensus_or_order_scarcity": ["high", "medium", "low", "unknown"] + }, + "dominant_scarcity": ["data", "path_resource", "consensus_order", "mixed", "unknown"], + "classification": ["question", "problem", "issue", "mixed", "no_call"], + "classification_confidence": ["high", "medium", "low"], + "evidence_gap": "array", + "misclassification_risk": "array", + "recommended_next_step": ["检索", "工程拆解", "共识协调", "补充上下文", "不调用"], + "next_model_candidates": "array" + }, + "productization_notes": "作为前置路由模型。", + "version": "0.1", + "last_updated": "2026-06-16" + } + if model_overrides: + for key, value in model_overrides.items(): + if value == "__DELETE__": + model.pop(key, None) + else: + model[key] = value + + index = { + "index_version": "0.1", + "last_updated": "2026-06-16", + "models": [{ + "model_id": "qpi", + "model_name": "QPI 三元定性模型", + "model_type": "routing_model", + "pipeline_position": "pre_analysis", + "model_file": "models/qpi.model.json", + "card_file": "cards/qpi.md", + "source_article_count": 1, + "source_evidence_count": 1, + "regression_case_count": 15, + "stability_level": "B", + "regression_status": "pending", + "status": "draft" + }] + } + if index_overrides: + index["models"][0].update(index_overrides) + + self.write_json(root, "sources/source_articles.json", { + "source_articles": [{ + "source_id": "article_qpi_primary_001", + "title": "问题之锚:从混沌现实到认知秩序的重构", + "source_type": "original_article", + "related_models": ["qpi"], + "source_status": "representative" + }] + }) + self.write_json(root, "sources/source_excerpts.json", { + "source_excerpts": [{ + "excerpt_id": "excerpt_qpi_001", + "source_id": "article_qpi_primary_001", + "related_model_id": "qpi", + "excerpt_type": "definition", + "summary": "QPI 将问题区分为提问、难题、课题。", + "used_for": ["core_mechanism"], + "quote_status": "exact", + "source_location": "test fixture" + }] + }) + self.write_json(root, "models/qpi.model.json", model) + self.write_json(root, "models/model_index.json", index) + (root / "cards").mkdir(parents=True, exist_ok=True) + (root / "cards" / "qpi.md").write_text("# QPI\n", encoding="utf-8") + (root / "cards" / "card_index.md").write_text( + "| Model ID | Card |\n| --- | --- |\n| qpi | `cards/qpi.md` |\n", + encoding="utf-8" + ) + self.write_json(root, "tests/regression_cases.json", { + "regression_cases": [ + { + "case_id": "case_qpi_positive_001", + "model_id": "qpi", + "case_type": "positive", + "input": "我不知道错误码是什么。", + "expected_behavior": "识别为提问。", + "failure_signal": "输出难题或课题。" + }, + { + "case_id": "case_qpi_boundary_001", + "model_id": "qpi", + "case_type": "boundary", + "input": "既缺数据也缺路径。", + "expected_behavior": "标出混合状态。", + "failure_signal": "单标签武断判断。" + }, + { + "case_id": "case_qpi_misuse_001", + "model_id": "qpi", + "case_type": "misuse", + "input": "大环境不好所以我不用跟进客户。", + "expected_behavior": "识别恶意升维。", + "failure_signal": "接受甩锅叙事。" + }, + { + "case_id": "case_qpi_positive_002", + "model_id": "qpi", + "case_type": "positive", + "input": "目标明确但缺少实现路径。", + "expected_behavior": "识别为难题。", + "failure_signal": "输出提问或课题。" + }, + { + "case_id": "case_qpi_boundary_002", + "model_id": "qpi", + "case_type": "boundary", + "input": "团队既缺共识也有明确技术瓶颈。", + "expected_behavior": "标出主导匮乏物待判定。", + "failure_signal": "忽略混合状态。" + }, + { + "case_id": "case_qpi_no_call_001", + "model_id": "qpi", + "case_type": "no_call", + "input": "请只改错别字。", + "expected_behavior": "不调用 QPI。", + "failure_signal": "过度分析。", + "should_call_model": False + }, + { + "case_id": "case_qpi_selector_gate_001", + "model_id": "qpi", + "case_type": "selector_gate", + "input": "快速查一下定义。", + "expected_behavior": "低分或不调用。", + "failure_signal": "误召回。", + "negative_expected_models": ["intellectual_archaeology"] + }, + { + "case_id": "case_qpi_pipeline_001", + "model_id": "qpi", + "case_type": "pipeline", + "input": "这是问题定义阶段。", + "expected_behavior": "QPI 位于前置路由。", + "failure_signal": "跳过 QPI。", + "expected_primary_model": "qpi" + }, + { + "case_id": "case_qpi_positive_003", + "model_id": "qpi", + "case_type": "positive", + "input": "只缺一份报告。", + "expected_behavior": "识别为提问。", + "failure_signal": "过度升维。" + }, + { + "case_id": "case_qpi_positive_004", + "model_id": "qpi", + "case_type": "positive", + "input": "目标清楚但没资源。", + "expected_behavior": "识别为难题。", + "failure_signal": "误判。" + }, + { + "case_id": "case_qpi_positive_005", + "model_id": "qpi", + "case_type": "positive", + "input": "组织没有共识。", + "expected_behavior": "识别为课题。", + "failure_signal": "误判。" + }, + { + "case_id": "case_qpi_boundary_003", + "model_id": "qpi", + "case_type": "boundary", + "input": "缺数据也缺共识。", + "expected_behavior": "识别混合。", + "failure_signal": "单标签。" + }, + { + "case_id": "case_qpi_misuse_002", + "model_id": "qpi", + "case_type": "misuse", + "input": "员工离职都是个人不忠诚。", + "expected_behavior": "识别暴力降维风险。", + "failure_signal": "接受降维叙事。" + }, + { + "case_id": "case_qpi_no_call_002", + "model_id": "qpi", + "case_type": "no_call", + "input": "翻译这句话。", + "expected_behavior": "不调用。", + "failure_signal": "过度分析。" + }, + { + "case_id": "case_qpi_pipeline_002", + "model_id": "qpi", + "case_type": "pipeline", + "input": "QPI 先判断,再决定后续模型。", + "expected_behavior": "保持前置路由。", + "failure_signal": "跳过路由。" + } + ] + }) + + def test_missing_trigger_keywords_is_reported(self): + validator = load_validator() + with tempfile.TemporaryDirectory() as tmp: + root = Path(tmp) + self.write_minimal_library(root, {"trigger_keywords": "__DELETE__"}) + + errors = validator.validate_library(root) + + self.assertIn("models/qpi.model.json missing required field trigger_keywords", errors) + + def test_invalid_selection_priority_is_reported(self): + validator = load_validator() + with tempfile.TemporaryDirectory() as tmp: + root = Path(tmp) + self.write_minimal_library(root, {"selection_priority": 95}) + + errors = validator.validate_library(root) + + self.assertIn("models/qpi.model.json field selection_priority must be <= 10", errors) + + def test_missing_status_is_reported(self): + validator = load_validator() + with tempfile.TemporaryDirectory() as tmp: + root = Path(tmp) + self.write_minimal_library(root, {"status": "__DELETE__"}) + + errors = validator.validate_library(root) + + self.assertIn("models/qpi.model.json missing required field status", errors) + + def test_invalid_model_type_is_reported(self): + validator = load_validator() + with tempfile.TemporaryDirectory() as tmp: + root = Path(tmp) + self.write_minimal_library(root, {"model_type": "routing"}) + + errors = validator.validate_library(root) + + self.assertIn("models/qpi.model.json field model_type has invalid value routing", errors) + + def test_missing_stability_reason_is_reported(self): + validator = load_validator() + with tempfile.TemporaryDirectory() as tmp: + root = Path(tmp) + self.write_minimal_library(root, { + "stability_profile": { + "stability_level": "B", + "needs_stabilization": True, + "main_risks": ["样本仍少"], + "next_stabilization_action": "补充测试。" + } + }) + + errors = validator.validate_library(root) + + self.assertIn("models/qpi.model.json stability_profile missing required field reason", errors) + + def test_model_index_missing_file_is_reported(self): + validator = load_validator() + with tempfile.TemporaryDirectory() as tmp: + root = Path(tmp) + self.write_minimal_library(root, index_overrides={"model_file": "models/missing.model.json"}) + + errors = validator.validate_library(root) + + self.assertIn("models/model_index.json references missing model file models/missing.model.json", errors) + + def test_model_index_count_drift_is_reported(self): + validator = load_validator() + with tempfile.TemporaryDirectory() as tmp: + root = Path(tmp) + self.write_minimal_library(root, index_overrides={ + "source_article_count": 2, + "source_evidence_count": 2, + "regression_case_count": 99 + }) + + errors = validator.validate_library(root) + + self.assertIn("models/model_index.json entry qpi source_article_count is 2, expected 1", errors) + self.assertIn("models/model_index.json entry qpi source_evidence_count is 2, expected 1", errors) + self.assertIn("models/model_index.json entry qpi regression_case_count is 99, expected 15", errors) + + def test_model_index_state_drift_is_reported(self): + validator = load_validator() + with tempfile.TemporaryDirectory() as tmp: + root = Path(tmp) + self.write_minimal_library(root, index_overrides={ + "stability_level": "A", + "regression_status": "passed", + "status": "stable" + }) + + errors = validator.validate_library(root) + + self.assertIn("models/model_index.json entry qpi stability_level is A, expected B", errors) + self.assertIn("models/model_index.json entry qpi regression_status is passed, expected pending", errors) + self.assertIn("models/model_index.json entry qpi status is stable, expected draft", errors) + + def test_regression_case_coverage_is_reported(self): + validator = load_validator() + with tempfile.TemporaryDirectory() as tmp: + root = Path(tmp) + self.write_minimal_library(root) + self.write_json(root, "tests/regression_cases.json", { + "regression_cases": [{ + "case_id": "case_qpi_positive_001", + "model_id": "qpi", + "case_type": "positive", + "input": "我不知道错误码是什么。", + "expected_behavior": "识别为提问。", + "failure_signal": "输出难题或课题。" + }] + }) + + errors = validator.validate_library(root) + + self.assertIn("model qpi has 1 regression cases, expected at least 15", errors) + self.assertIn("model qpi missing regression case type boundary", errors) + self.assertIn("model qpi missing regression case type misuse", errors) + self.assertIn("model qpi missing regression case type no_call", errors) + self.assertIn("model qpi missing regression case type pipeline", errors) + self.assertIn("model qpi missing regression case type selector_gate", errors) + + def test_qpi_missing_structured_output_contract_field_is_reported(self): + validator = load_validator() + with tempfile.TemporaryDirectory() as tmp: + root = Path(tmp) + self.write_minimal_library(root) + model = json.loads((root / "models" / "qpi.model.json").read_text(encoding="utf-8")) + model["structured_output_contract"].pop("classification_scope") + self.write_json(root, "models/qpi.model.json", model) + + errors = validator.validate_library(root) + + self.assertIn( + "models/qpi.model.json model qpi structured_output_contract missing required output field classification_scope", + errors + ) + + +if __name__ == "__main__": + unittest.main()