Communitygithub.com

Lucasuiii/cumcm-workflow

面向竞赛的、以证据为中心的CUMCM工作流程,适用于Codex和Claude Code。

cumcm-workflow 是什么?

该技能为参加中国大学生数学建模竞赛(CUMCM)的用户提供了一个系统化的、基于证据的工作流程,适用于Codex和Claude Code等AI编码代理。它通过将机器记录的客观事实(如运行结果、哈希值)与用户的主观判断(如模型选择、论文结论)严格分离,确保所有关键声明都可追溯至官方来源和实际执行。技能支持“工作模式”(快速探索与调试)和“定稿模式”(冻结结果并正式审核)两种模式,通过状态文件、证据门控和审核点来管理项目进度。关键特性包括:基于证据的模型选择(而非主观意见)、不可变运行记录、正式结果索引、以及自动化的重新规划与依赖性分析。该技能在保留Markdown结构的基础上,将原有英文文档完整翻译为中文,并确保所有技术术语(如`record_run.py`、`CROSS_QUESTION_LEDGER.json`、`SHA-256`)和代码块保持原样。

兼容平台✓Claude Code✓Codex CLI~Cursor
npx skills add Lucasuiii/cumcm-workflow

在你喜欢的 AI 中提问

打开一个已预加载此 Agent Skill 的新对话。

文档

CUMCM 工作流程

使重要的声明可追溯至官方来源和实际执行结果,同时避免将每一版草稿都变成审计报告。

以下两条规则决定了所有内容:

  1. 工具记录机器事实;你负责判断。 永远不要手动输入哈希值、页数、退出码、源代码快照或结果值。record_run.py、index_result.py、record_compile.py 和 refresh_evidence.py 负责记录这些。你负责编写问题事实、模型、声明和论文。
  2. 模型的选择是在后期进行的,并且是通过努力赢得的。 工作模式接受一份草稿模型合约。你需列举候选模型,说明哪些证据可以区分它们,通过低成本的探索性运行进行评估,然后才选择其中一个并冻结合约。

开始或恢复

  1. 找到 .cumcm/state.json。恢复一个确切的 0.6.0 项目。不支持旧版工作区;请从官方文件开始一个新项目。
  2. 如果状态文件不存在,且用户提供了官方文件,请阅读 01-intake.md,选择一个安全的目标,并为他们运行 scripts/init_project.py。不要让用户自己拼装命令。
  3. 在跨阶段时,只阅读当前阶段的指南和 handoffs.md。新任务先阅读其交接文档,而非整个工作区。
  4. 保持六项职责清晰:协调者、建模、计算、验证、论文、交付。不要通过发明许多小技能来模拟职责分离。

两个旋钮

mode(在状态文件中)决定哪些内容必须完成。--gate-mode 决定是否需要人工关卡。

  • working(工作模式):快速建模、探索性计算、调试。强制要求官方输入保护、真实执行、精确结果定位器和不捏造。一份草稿模型合约就足够了;CROSS_QUESTION_LEDGER.json 是可选的;阶段排序仅供参考。此模式下的 enforce 报告 working_ready,而非正式的批准。
  • finalizing(定稿模式):冻结包含声明的结果。模型合约必须完整,其验证计划必须映射到官方运行记录的断言。需要当前阶段的决策和快照、最新的交接文档、有限的独立评审、论文/PDF质量保证和交付绑定。除非通过请求的阶段为止的所有阶段都是 passed 状态并包含当前接受的决策,否则 enforce 无法通过。

使用 scripts/set_mode.py 切换。v0.6 中没有 strict/sprint 配置;适用单一规则集。

需要人工介入的环节

三个检查点,每个区块一个,并且每个检查点都会记录呈现给用户的内容,而不仅仅是他们的决定。如果没有任何内容被呈现,该决定不能证明有人审阅过。它们位于三个成本步骤之前:拒绝模型选择需要一次对话,拒绝结论需要一次重新计算,拒绝完成的论文需要一次重写。

  • MODEL_CONTRACT.selection_check,在候选模型变为 selected 之前:判断标准、每个候选模型的 discriminating_evidence 以及获胜者将主张的 scope。presented_candidate_ids 必须覆盖所有候选模型 (MODEL-E018)——只展示获胜者不构成比较。
  • CLAIM_LEDGER.conclusion_check,在 validation-paper 之前:结论本身——声明文本、scope、证据状态、开放的 P0/P1。无需运行ID或哈希值。presented_claim_ids 必须覆盖所有已声明的声明 (CLAIM-E023)。这是听取反对意见的低成本环节;同样的反对意见在交付时提出将导致论文重写。
  • DELIVERY_MANIFEST.final_check,在提交之前:完成的对象——渲染的页面、每个子问题的答案、开放的发现。presented_pages 必须覆盖所有渲染的页面 (DELIVERY-E020),并且当没有任何内容被呈现时,human_user 不可声称 (DELIVERY-E019)。

论文报告本身不包含任何批准:content_report 和 layout_report 是报告。审稿人的选择被记录,但不被确认——职责分离来自两个切换过渡(references/handoffs.md)。

阶段状态为 not_started、in_progress、passed、needs_revision。

角色与交接

职责主要参考输出交接
建模02-problem-analysis.md、03-model-design.mdmodeling-computation
计算04-computation.mdcomputation-validation
验证05-validation.mdvalidation-paper
论文06-paper-writing.md、latex-template.mdpaper-delivery
交付07-compile-delivery.md最终打包

使用 scripts/build_handoff.py 构建交接文档。它们包含规范路径、紧凑的下游负载和上游摘要。切勿复制完整的日志、失败的运行、调试历史或旧的审核对话。过期的摘要需要重建。

选择模型

模型设计并非选择一个模型。它提出候选模型,并说明如何解决选择问题:

"candidates": [
  {"candidate_id": "CAND-ENUM", "method": "complete enumeration",
   "why_considered": "the declared policy class is finite and small",
   "discriminating_evidence": ["whether the greedy pick equals the enumerated minimum"],
   "status": "under_evaluation"},
  {"candidate_id": "CAND-GREEDY", "method": "greedy first-fit",
   "why_considered": "constant time, adequate if the set is already ordered by cost",
   "discriminating_evidence": ["whether the greedy pick equals the enumerated minimum"],
   "status": "under_evaluation"}
]

然后通过证据而非意见来解决:

python3 scripts/record_run.py --project <p> --candidate CAND-ENUM   -- python3 code/enum.py
python3 scripts/record_run.py --project <p> --candidate CAND-GREEDY -- python3 code/greedy.py

将获胜者状态设为 status: "selected",其他设为 "rejected",为每个模型提供引用这些运行所显示内容的 decision_rationale,并在 evaluation_run_ids 中列出这些运行。只有这样,选定的模型才能进行正式运行。

检查器会坚持这一点:恰好一个候选模型最终为 selected (MODEL-E013),一个选择必须引用评估过它的运行 (MODEL-W014),被选择或拒绝的候选模型需要记录原因 (MODEL-E014),一个没有任何区分信息的候选模型会被标记 (MODEL-W012)。在 working 模式下,这些是警告;冻结时会变为错误。cumcm_check.py 在 model_candidates 下打印比较结果。

有两件事是刻意不做的:它不要求当一个候选模型明显正确时提供多个候选模型(这是 MODEL-W007,一个警告),也不判断哪个候选模型更好——它只坚持选择是基于记录的证据做出的。

记录计算

# 探索性运行,记录成本为零
python3 scripts/record_run.py --project <p> -- python3 code/try.py

# 为正式结果冻结运行,需要少量声明
python3 scripts/record_run.py --project <p> --official \
  --capability CAP-Q1-001 --source code/solve.py \
  --input data/q1.csv:formal --output results/q1.json:claim \
  --assert "feasibility=pass" -- python3 code/solve.py

# 从输出中读取值,绝不手动转录
python3 scripts/index_result.py --project <p> --result-id RES-Q1-001 \
  --run RUN-Q1-001 --locator results/q1.json#/minimum_cost \
  --name "Minimum cost" --unit CNY --scope "declared candidates only"

# 重新运行会追加一个后续版本;父运行及其证据保持不变
python3 scripts/record_run.py --project <p> --rerun RUN-Q1-001 --official
python3 scripts/index_result.py --project <p> --follow-lineage

探索性运行被记录,但从不被信任,也从不阻塞:其中的失败断言或非零退出码是关于实验的事实,而非关于正式链条的。只有一次成功的 official_run: true 运行才能支持正式结果。

运行是只追加的。--rerun 会追加 RUN-Q1-002,其 parent_run_id: RUN-Q1-001;它从不覆盖,因为父运行是被取代运行所执行和产生的内容的唯一记录。每次运行都会将其声明的源代码和输出冻结到 runs/<id>/source/… 和 runs/<id>/outputs/… 中,镜像原始布局,并哈希这些副本——因此无论工作区如何变化,保存的运行始终保持可验证性,并且 output_locator 指向一个不可变文件。

一次运行只能声明它产生和验证的内容:记录器会比较执行过程中每个声明输出的时间戳,拒绝将遗留文件记录为该运行的主张性证据,并且重新运行永远不会继承其父运行的断言结论。只有一次成功的官方重新运行才能取代其父运行,并且每个正式消费者都通过相同的代码解析当前运行。

这并不会削弱漂移检测,反而使其更精确。RUN-E020 现在会比较冻结副本和实时文件,并指出工作树已经从支持结果的那个运行继续前进了;被取代的运行是豁免的,并且更改冻结的副本是 RUN-E021。取代关系是从父链派生的,并且永远不会写回——在旧清单上盖章会改变其哈希值并使所有绑定到它的决策失效。RESULT-E017 会捕获一个仍然引用被取代运行的结果;index_result.py --follow-lineage 会明确地重新指向它,因为哪个运行支持一个声明是判断而非机器事实。

选择一个后端

项目状态默认为 {"preferred":"matlab","fallback":"python","selection":"auto"}。使用 scripts/backend_selection.py 或相同的标准:数值方法、优化、ODE/PDE、信号处理、数据清洗、Excel/CSV、机器学习、可用工具箱、现有代码、复杂性、运行时稳定性。MATLAB 偏好仅在平局时起作用。如果首选后端不可用,可回退;如果任务 required_backend 不可用,则必须失败。实现并正式运行一种语言。除非用户要求,否则不要构建功能对等的实现。

证据门控

  • 硬性不变量 / P0:错误的数据或计算、任务不匹配(无人负责的能力,或论文自称完成时仍有未完成的能力,是机器可见的一半:CAP-E013、CAP-E014)、声明的范围超过实际验证范围的声明、代码/结果/论文不一致、与陈述条件相矛盾的假设、过时的来源追溯、捏造的批准或审核、模拟数据冒充为观察数据、最终版本不匹配。这些会阻塞。
  • 警告 / P1,在验证范围内判断:强假设、弱基线、比理想情况更弱的验证或敏感性、有限的拟合、薄弱的部分。可见,但从不阻塞。
  • 建议 / P2:措辞、布局、可选图表、额外实验。不在门控中。

独立验证使用 accepted、accepted_with_concerns、revision_required、inconclusive。仅开放的 P0 允许 revision_required。在全面审查发现 P0 问题后,下一个包默认进行针对这些发现的有针对性的重新审查。

审查包仅复制正式索引结果的规范证据,并记录 context_excluded——它物理上省略的先前推理。它并不声称审稿人没有意见。结果模板将所有独立性字段保留为 null:审稿人必须声明它们,而 null 会导致 IREVIEW-E027 失败。用户不再确认审稿人;职责分离来自切换——computation-validation 和 validation-paper 携带着构建它们的任务,而匹配的消费任务是 HANDOFF-E010。参见 references/handoffs.md。

迭代

重新打开上游阶段是一个命令,而不是手动编辑 state.json:

python3 scripts/record_decision.py --project <p> --stage model-design \
  --decision revision_requested --decision-id DEC-007 --reviewer <name> \
  --task-turn-ref <ref> --summary "Q2 model does not fit the observed regime"

这将使该阶段及其之后的所有阶段失效。要了解在进行任何重做之前更改的实际成本:

python3 scripts/plan_redo.py --project <p> --changed code/solve_q2.py

plan_redo.py 遍历 source -> official run -> result -> claim -> section -> PDF,并列出受影响的特定运行、发现和章节——以及哪些不受影响。它从不抑制检查;cumcm_check.py 仍然会验证通过请求阶段的所有内容,因为这成本低廉。昂贵的工作是重新运行、重新审查和重写,而这正是计划的范围。

竞赛不变量

  • 保留并通过字节识别官方来源。OCR 引导注意力;渲染的页面决定公式、表格和模糊符号。
  • 绝不捏造观察到的数据、批准、独立审查或成功执行。标记真实的模拟,并记录其生成器和随机种子。
  • 保持数学模型和结果合约的语言中立性。
  • 仅对证据关键的身份使用 SHA-256:官方来源、正式输入、主张性输出、紧凑快照/交接、审查包、选定的源代码树以及经过审查的最终 PDF。
  • 将内部 ID、证据状态、本地路径、运行覆盖范围和工作流语言排除在可见论文之外。
  • 论文交接限制仅来自支持的、符合论文资格的声明限制、当前的 P1 问题以及明确的适用性/假设/已知限制字段——而非矛盾的声明或模型范围。
  • 将最终 PDF 与其审查过的字节以及用于编译的确切可编辑 LaTeX 源代码快照绑定。
  • 如果缺少当前的官方规则或模板,则会阻塞交付;它不授权自主搜索或提交。
  • 最终交付包含审查过的 PDF、可编辑的 LaTeX 和计算源代码,作为三个独立的部分。

创建机器可读文件时请阅读 artifact-contracts.md,处理证据规则时请阅读 evidence-rules.md。

相关技能