Communitygithub.com

Lucasuiii/cumcm-workflow

專為競賽設計、以證據為核心的 CUMCM 工作流程,適用於 Codex 和 Claude Code。

cumcm-workflow 是什麼?

此技能提供了一套專為中國大學生數學建模競賽(CUMCM)設計的結構化工作流程,深度整合於 Codex 和 Claude Code 等 AI 編碼代理中。其核心原則是將機器可記錄的事實(如程式碼執行結果、雜湊值)與人類的判斷(如問題分析、模型選擇、論文撰寫)分離,確保競賽論文的每個主張都可追溯至官方來源與實際執行,而無需將每個草稿變成審計檔案。 工作流程透過精確的狀態機管理專案進度,區分「working」(快速建模與探索)與「finalizing」(凍結結果)兩種模式,並在模型選擇、結論審查與最終交付三個關鍵節點設置人為關卡,要求記錄展示給人類的內容,而不僅僅是他們的決定。此外,流程強調模型選擇必須基於實驗證據而非主觀意見,並透過一系列檢查器(如 `cumcm_check.py`)強制執行不變量,防止偽造資料、未經批准的審查或過時的依賴關係,確保最終提交的論文、可編輯的 LaTeX 原始碼與計算原始碼之間的一致性。

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

在你喜歡的 AI 中提問

開啟一個已預先載入此 Agent Skill 的新對話。

說明文件

CUMCM Workflow

讓重要的主張能夠追溯至官方來源與實際執行,而不必將每個草稿變成審計檔案。

以下兩個規則定義了所有流程:

  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。

…

[為翻譯而截斷]

相關技能