Community程式設計與開發github.com

ctoth/correctness-oracles

引導從實際保證與觀察中設計可執行的正確性預言。用於當偵錯檢查僅捕捉崩潰、忽略狀態影響、依賴不確定的參考、或將跳過的比較與成功檢查混淆時,包括依賴 process exit、unhandled rejections、uncaughtException、測試執行器狀態、錯誤邊界、onRecoverableError、StrictMode、console 錯誤或 Playwright pageerror 的 JavaScript/TypeScript、Node 與 React 測試框架。

correctness-oracles 是什麼?

此技能提供設計可執行正確性預言的結構化方法,確保軟體測試中的檢查能有效反駁系統的預期行為。它說明如何從實際邊界推導檢查,並保持觀察與可疑行為之間的獨立性,以避免檢查與目標共享相同錯誤假設。該技能支援多種平台,包括 JavaScript/TypeScript、Node、React 與 Playwright,並涵蓋如 SQLite 的完整性檢查、NoREC 比較以及 Elle 的歷史模型等具體範例。理解這個概念對於建立能夠區分故意違規與允許行為的測試非常重要,同時也能辨識狀態效果、錯誤處理與部分觀察中的盲點。

相容平台~Claude Code~Codex CLI~Cursor
Part ofReact
npx skills add https://github.com/ctoth/computational-bugfinding-skills-plugin/tree/HEAD/plugins/bugfinding/skills/correctness-oracles

Installed? Explore more 程式設計與開發 skills: steipete/bluebubbles, steipete/eightctl, steipete/blucli · View all 6 →

在你喜歡的 AI 中提問

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

說明文件

正確性預言(Correctness Oracles)

選擇一個能夠反駁承諾行為的觀察。具體說明成功檢查留下的未測試部分:計數比較、結構檢查與依賴見證者會觀察到不同的屬性(NoREC 實作、SQLite 完整性檢查、Elle §4.3)。

從實際邊界推導檢查

閱讀目標的啟用配置、公開生產者與治理合約。識別合法的起始狀態、操作前提、允許的錯誤與承諾的邊界:一次操作、陳述式、交易、復原或觀察到的歷史。在 SQLite 中,ABORT 會復原一條陳述式,而延遲外部鍵「直到交易嘗試 COMMIT 時才會被檢查」(SQLite ABORT、延遲外部鍵)。盡可能查詢有效設定;例如 SQLite 的外部鍵設定「在交易內是空操作」(SQLite foreign_keys)。

在擴展搜索之前,撰寫一個具體的候選觀察:

  • 承諾: 明確禁止的結果或效果,附帶合約引用。
  • 觀察: 實際回傳的內容、狀態或見證者,能區分該違規與允許行為。
  • 前提與盲點: 支援的配置、有效狀態、遺漏的資訊與無法區分的執行。
  • 重現證據: 輸入與初始狀態、操作順序、有效配置與原始觀察。

這是一個精簡的設計慣例,而非必要的架構。其目的是揭露提議檢查所遺失的資訊;Elle 的觀察模型說明為何僅靠生成更多歷史無法恢復隱藏的依賴:盲目暫存器寫入會「破壞歷史」(Elle §§3–4.3)。閱讀合約範例以了解已處理的邊界。

在 JavaScript 中,process exit 碼、測試執行器狀態或乾淨的 console 就是這樣的觀察:其意義取決於有效模式、已安裝的監聽器、執行器配置與建構。在安裝了 uncaughtException 處理程式的情況下,Node 的 process「將以 0 退出」,除非該處理程式設定了 process.exitCode(Node process, uncaughtException)。閱讀 JavaScript 觀察通道 以了解關於 Node、測試執行器、React 與 Playwright 的通道。

保持觀察獨立於可疑行為

追蹤預期值或不變量是如何取得的。識別可能讓目標與檢查者同意相同錯誤答案的共享程式碼與假設。偏好有根據的抽象模型、獨立指定的不變量或有效的關係,而非複製的生產演算法。第二個實作是一種選項:SQLite 的 SQL Logic Test 會在多個引擎上執行陳述式,並檢查「它們是否都得到相同的答案」。相同引擎的關係則是另一種:SQLite 使用停用最佳化的方式重新執行測試套件,而 SQLancer 的 NoREC 則比較最佳化查詢與未最佳化查詢(SQLite 測試 §2、§9、NoREC 實作)。

測量實際比較的資訊。相等的列數並不能建立列的同一性;健康的 integrity_check 並不能建立參考完整性,因為它「不會發現 FOREIGN KEY 錯誤」。保留有效的部分檢查,且僅在目標保證需要時才添加互補的觀察(NoREC 實作、SQLite 完整性檢查)。在選擇參考、正規化或見證者時,閱讀部分觀察。

檢查允許的錯誤及其影響

獨立於回傳狀態推導允許的後續狀態。SQLite 的 ABORT 與 FAIL 都會回傳約束錯誤,但 ABORT 會復原失敗的陳述式,而 FAIL「不會復原失敗 SQL 陳述式中先前的變更」。僅以錯誤為基礎的斷言可能會遺漏錯誤的影響;全面的回滾斷言則可能拒絕合法的行為(SQLite 衝突策略)。

為實際承諾選擇一個觀察者,並具有有效的前提。對於 SQLite 參考性檢查,使用適用的外部鍵觀察、有效的強制設定與合法的 NULL 語義;不要替換為通用的完整性結果(SQLite 外部鍵、foreign_key_check)。這些是已處理的合約,而非任意 API 的預設值。

保留檢查的結果與限制

每當該差異影響結論時,區分已評估的屬性與被拒絕的輸入、預期錯誤、跳過的檢查與不足的觀察。NoREC 在任一計數為其 -1 哨兵值(例如,在預期查詢錯誤後)時跳過比較,而不是將其計為相等,並將意外的錯誤報告為失敗。Elle 的完整性取決於記錄的資訊,且「觀察很少是完整的」(NoREC 實作、Elle §4.3)。

使用 harness-sensitivity 來建立觀察能夠到達並拒絕一個具有代表性且獨立正當的違規。保留原始見證者以進行 evidence-based-triage:Elle 本身的文件建議「手動檢查報告的異常」,而不是將標籤視為最終權威(Elle README)。一般的搜索分配應屬於 bugfinding-campaign。

將所選的專業推理路由到 semantic-differential-testing、metamorphic-testing、linearizability-checking、transactional-history-testing、numerical-oracles、resource-complexity-testing 或 liveness-testing;此技能擁有合約到觀察的決策權。閱讀常見錯誤以了解誤導性的捷徑。

回傳可用的預言

回傳生產者、引用的保證、有效的前提、可執行的觀察與結果解讀,並附帶已處理的允許/禁止區分。說明哪些是不可觀察的,以及哪些證據必須在重現時保持完整。一個有見證的矛盾僅支持實際檢查的保證與假設(Elle §§4.3 與 9)。

Individual skills in this repo

This repo contains 2 individual skills — each has its own dedicated page.

相關技能