一键导入
concept-roundtrip
對特定程式透過 Semorphe 管線執行目標性 round-trip 測試。 驗證:原始碼 → lift → SemanticTree → generate → 原始碼 → 執行 → 比較 stdout。 用於驗證特定概念、除錯已知失敗或回歸測試。支援任何語言。
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
菜单
對特定程式透過 Semorphe 管線執行目標性 round-trip 測試。 驗證:原始碼 → lift → SemanticTree → generate → 原始碼 → 執行 → 比較 stdout。 用於驗證特定概念、除錯已知失敗或回歸測試。支援任何語言。
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
基于 SOC 职业分类
研究程式語言的函式庫、標準標頭檔或語言特性。從文件和網路資源中探索函式簽名、 常見用法模式,按 Topic 層級樹分類,並依 Semorphe 慣例提出概念命名。 用於新增任何語言的函式庫、標頭檔或語言特性支援時。
為概念探索報告中定義的概念產生 BlockSpec JSON、程式碼產生器、提升器和渲染映射。 產生在 Semorphe 語義樹管線中支援新概念所需的所有產出物。 在 /concept.discover 之後使用,用於建立實作產出物。支援任何語言。
新 Semorphe 概念的最終整合關卡。執行所有驗證步驟 (TypeScript 編譯、單元測試、round-trip 測試、模糊測試), 然後將通過的概念整合到程式碼庫中並完成正確的註冊。 在 /concept.generate 之後作為最終步驟使用。支援任何語言。
為 Semorphe 新增概念的端到端管線。 串接全部 5 個概念 skill:discover → generate → roundtrip → fuzz → integrate。 當你想從「我要支援 <特性>」到完全整合的概念,用一個指令完成時使用。 支援任何語言。
審計、修復並重構 Semorphe 已有的語言概念實作。 偵測四路完備性缺口、信心等級違規、雙重註冊、死概念, 並自動修復缺失的產出物。用於清理技術債和確保第一性原理合規性。 支援任何語言。
為 Semorphe 的程式碼↔積木管線產生資訊隔離的模糊測試。 使用雙代理架構:Agent A(不知道實作)寫真實程式, Agent B 驗證 round-trip 正確性和編譯器/直譯器輸出等價性。 用於找出實作感知測試會遺漏的邊界案例和 bug。支援任何語言。
| name | concept-roundtrip |
| description | 對特定程式透過 Semorphe 管線執行目標性 round-trip 測試。 驗證:原始碼 → lift → SemanticTree → generate → 原始碼 → 執行 → 比較 stdout。 用於驗證特定概念、除錯已知失敗或回歸測試。支援任何語言。 |
| user-invocable | true |
語言指示:所有輸出文件(報告、摘要、註解)必須使用當前對話的語言撰寫。下方模板僅為結構參考,實際用語應配合使用者的語言設定。
此 skill 必須透過 Skill tool 調用,不可手動替代。當由 /concept.pipeline 編排時,pipeline 會使用 Skill tool 調用此 skill。
完成時必須輸出完成標記(見最後一節)。
$ARGUMENTS
參數可以是:
{lang} {concept_name} 格式(例如 cpp if、python while_loop){lang} {difficulty} 格式(例如 cpp easy、python hard){lang} all 測試該語言所有支援的概念不同於 /concept.fuzz(使用資訊隔離的代理進行探索),此 skill 執行目標性的、感知實作的 round-trip 測試。你可以完整存取 Semorphe 的原始碼,並應利用這些知識來製作精確的測試案例,涵蓋特定的程式碼路徑。
閱讀以下檔案以理解目前的管線:
src/core/types.ts — SemanticNode、ConceptId、所有型別定義src/languages/{lang}/core/blocks.json 和 src/languages/{lang}/std/*/blocks.json — 所有 block spec JSON 檔案(了解支援的概念)src/languages/{lang}/core/generators/ — 程式碼產生器(了解輸出格式)src/languages/{lang}/core/lifters/ — 提升器(了解輸入處理)src/core/projection/code-generator.ts — 主要的產生入口點src/core/lift/pattern-lifter.ts — 主要的提升入口點根據 $ARGUMENTS,決定語言和要測試的程式:
如果是程式碼片段或檔案路徑:
.cpp、.py、.java、.js)或語法推斷語言如果是概念名稱:
如果是難度等級:
getVisibleConcepts(topic, enabledBranches) 取得對應分支的可見概念集如果是 all:
對每個測試程式,使用對應語言的工具鏈編譯/執行:
mkdir -p /tmp/semorphe-roundtrip/
# 寫入檔案、編譯(如需要)、執行、記錄 stdout
timeout 5 {run_command} > /tmp/semorphe-roundtrip/test_{id}_expected.txt 2>&1
如果執行失敗,報告錯誤並跳過(測試程式本身無效)。
建立 Node.js runner 腳本來執行 lift→generate round-trip。先閱讀專案既有的測試基礎設施,了解如何初始化該語言的管線:
# 檢查既有的測試模式
grep -r "Lifter\|PatternLifter\|register" tests/ --include="*.ts" -l
然後建立並執行 round-trip 腳本:
npx tsx /tmp/semorphe-roundtrip/runner.ts
對每個產生的檔案,用同樣的語言工具鏈編譯/執行,記錄 stdout。
對每個測試,執行三個層級的比較:
層級一 — Stdout 等價性(最重要):
diff /tmp/semorphe-roundtrip/test_{id}_expected.txt /tmp/semorphe-roundtrip/test_{id}_actual.txt
層級二 — 語義樹完整性(P1 投影定理):
confidence: 'raw_code'(除非該概念確實不支援)var_declare 等通用概念)。此驗證防止 lifter 用錯誤概念但碰巧生成正確程式碼的假陽性。範例:
// ❌ 只驗證輸出字串(可能用錯概念但碰巧生成正確程式碼)
expect(gen).toContain('int* ptr = &x')
// ✅ 同時驗證語義樹使用了正確的概念
const ptrs = findConcepts(sem!, 'cpp_pointer_declare')
expect(ptrs.length).toBeGreaterThan(0)
expect(ptrs[0].properties.type).toBe('int')
raw_code/unresolved 節點佔總節點的比例high/warning/inferred/raw_code)。如果有 composite pattern 匹配但 warning 為 0,標記為可疑(P1 §2.1 合規性警告)。在報告中輸出:
信心分布:high={N} | warning={N} | inferred={N} | raw_code={N}
層級三 — 多分支鷹架行為(P4 漸進式揭露):
enabledBranches 集合產生程式碼(例如只啟用根節點、啟用到第一層、啟用全部分支)層級四 — 層級轉換穩定性(§2.4):
層級五 — 積木-程式碼一致性(§1.4 Sc4):
層級六 — 程式碼結構比較(僅供參考):
分類每個測試結果:
| 結果 | 符號 | 意義 |
|---|---|---|
| PASS | ✅ | Stdout 匹配,乾淨的語義樹 |
| STDOUT_DIFF | ❌ | Stdout 不同 — 語義 bug |
| COMPILE_FAIL | ❌ | 產生的程式碼無法執行 — generator bug |
| LIFT_FAIL | ⚠️ | Lifter 當掉或產生 null 樹 |
| DEGRADED | 🟡 | 程式碼被降級為 raw_code — 覆蓋缺口 |
| SCAFFOLD_LEAK | ❌ | 低層級輸出包含高層級概念語法 — P4 違規 |
| ROUNDTRIP_DRIFT | ❌ | 二次 round-trip 語義樹結構不同 — P1 違規 |
| WRONG_CONCEPT | ❌ | 語義樹使用了錯誤的概念(如指標宣告用了 var_declare 而非 cpp_pointer_declare)— 概念身分違規 |
| TIMEOUT | ❌ | 產生的程式碼掛住 — 可能的無窮迴圈 |
| STRUCTURE_DIFF | 🔵 | Stdout 匹配但程式碼結構顯著不同 |
將報告儲存到 tests/reports/roundtrip-{lang}-{concept|difficulty}-{timestamp}.md(目錄不存在時自行建立),同時印出摘要表格:
## Round-Trip 測試結果({language})
| # | 程式 | 概念 | 結果 | 細節 |
|---|------|------|------|------|
| 1 | basic_if | if, compare, print | ✅ PASS | |
| 2 | nested_loop | while_loop, count_loop | ❌ STDOUT_DIFF | 缺少遞增 |
摘要:8/10 PASS、1 STDOUT_DIFF、1 LIFT_FAIL
對每個失敗,包含:原始程式碼、語義樹、產生的程式碼、diff、根本原因假設。
所有測試案例都必須留存為可重複執行的 Vitest 測試檔,不可用完即丟。
tests/integration/ 建立測試檔(檔名 roundtrip-{lang}-{concept}.test.ts),包含所有 PASS 的測試程式作為 round-trip 回歸測試。每個測試必須同時驗證:
var_declare)。使用 findConcepts(sem, 'expected_concept_id') 斷言節點存在且屬性正確。roundtrip- 前綴),但用 it.skip 或 it.todo 標記,附上失敗原因註解,待修復後啟用。/tmp/ 下的臨時 runner 僅用於探索性執行。最終驗證結果必須轉化為 Vitest 測試案例,確保 CI 可重複捕捉回歸。tests/integration/cmath-roundtrip.test.ts),將新案例追加到既有檔案中,避免重複建檔。執行 npm test 確認新測試通過。
發現 bug 就必須修復,或嚴格註記以確保後續必修。
it.todo / it.skip 轉為正式 it(...) 測試並驗證通過。it.todo 都應在當次修復。快速迭代時,對單一片段執行最小 round-trip:
/concept.roundtrip `int main() { int x = 5; if (x > 3) { cout << "yes"; } return 0; }`
/concept.roundtrip `print("hello" if True else "bye")`
跳過報告產生,直接顯示:PASS/FAIL + 如果失敗則顯示 diff。
/tmp/semorphe-roundtrip/此 skill 完成後,必須輸出以下格式的完成標記:
🏁 SKILL_COMPLETE: concept-roundtrip | {lang} | {target} | {N}/{M} PASS | 測試檔:{test_file_path}
如果未輸出此標記,pipeline 不會繼續下一階段。