omegaprompt 2.1.2__tar.gz → 2.2.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (273) hide show
  1. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/CHANGELOG.md +9 -0
  2. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/PKG-INFO +18 -15
  3. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/README.md +17 -14
  4. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/README_KR.md +11 -8
  5. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/ci/ship-gate.yml +2 -2
  6. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/pyproject.toml +1 -1
  7. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/src/omegaprompt/__init__.py +1 -1
  8. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/src/omegaprompt/commands/calibrate.py +3 -0
  9. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/src/omegaprompt/core/walkforward.py +12 -1
  10. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/src/omegaprompt/mcp/server.py +6 -0
  11. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/src/omegaprompt/preflight/adaptation.py +3 -0
  12. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/src/omegaprompt/preflight/contracts.py +7 -0
  13. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/src/omegaprompt/runtime.py +25 -0
  14. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/src/omegaprompt/targets/prompt_target.py +125 -14
  15. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/.gitignore +0 -0
  16. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/AGENT_TRIGGERS.md +0 -0
  17. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/AUTHORS.md +0 -0
  18. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/IP_DEFENSE_CHECKLIST.md +0 -0
  19. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/LICENSE +0 -0
  20. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/NOTICE +0 -0
  21. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/PRE_EXISTING_IP.md +0 -0
  22. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/README.md +0 -0
  23. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/_demo_output.txt +0 -0
  24. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/code_review/README.md +0 -0
  25. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/code_review/_mainline_outputs/V0_baseline.txt +0 -0
  26. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/code_review/_mainline_outputs/V1_role_terse.txt +0 -0
  27. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/code_review/_mainline_outputs/V2_xml_format.txt +0 -0
  28. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/code_review/_mainline_outputs/V3prime_rules_format.txt +0 -0
  29. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/code_review/_mainline_outputs/V5_no_issue_guard.txt +0 -0
  30. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/code_review/_subagent_outputs/V0_baseline.txt +0 -0
  31. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/code_review/_subagent_outputs/V1_role_terse.txt +0 -0
  32. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/code_review/_subagent_outputs/V2_xml_format.txt +0 -0
  33. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/code_review/_subagent_outputs/V3prime_rules_format.txt +0 -0
  34. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/code_review/_subagent_outputs/V5_no_issue_guard.txt +0 -0
  35. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/code_review/_subagent_prompts/V0_baseline.txt +0 -0
  36. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/code_review/_subagent_prompts/V1_role_terse.txt +0 -0
  37. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/code_review/_subagent_prompts/V2_xml_format.txt +0 -0
  38. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/code_review/_subagent_prompts/V3prime_rules_format.txt +0 -0
  39. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/code_review/_subagent_prompts/V5_no_issue_guard.txt +0 -0
  40. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/code_review/backtest.log +0 -0
  41. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/code_review/backtest.py +0 -0
  42. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/code_review/backtest_gemma4.log +0 -0
  43. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/code_review/backtest_results.json +0 -0
  44. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/code_review/backtest_results_gemma4.json +0 -0
  45. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/code_review/backtest_results_v2.json +0 -0
  46. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/code_review/backtest_results_v2_gemma4.json +0 -0
  47. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/code_review/backtest_results_v3.json +0 -0
  48. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/code_review/backtest_results_v3_gemma4.json +0 -0
  49. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/code_review/backtest_v2.log +0 -0
  50. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/code_review/backtest_v2_gemma4.log +0 -0
  51. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/code_review/backtest_v3.log +0 -0
  52. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/code_review/backtest_v3_gemma4.log +0 -0
  53. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/code_review/claude_full_validation_results.json +0 -0
  54. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/code_review/claude_validation_outputs.json +0 -0
  55. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/code_review/mainline_results.json +0 -0
  56. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/code_review/production_variant.json +0 -0
  57. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/code_review/quality_review.json +0 -0
  58. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/code_review/quality_review_claude_full.json +0 -0
  59. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/code_review/quality_review_mainline.json +0 -0
  60. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/code_review/quality_review_v2.json +0 -0
  61. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/code_review/quality_review_v3.json +0 -0
  62. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/code_review/rubric.json +0 -0
  63. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/code_review/score_and_write.py +0 -0
  64. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/code_review/test.jsonl +0 -0
  65. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/code_review/train.jsonl +0 -0
  66. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/code_review/validation_archive.json +0 -0
  67. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/code_review/variant_0_texts.txt +0 -0
  68. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/code_review/variant_1_texts.txt +0 -0
  69. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/code_review/variant_2_texts.txt +0 -0
  70. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/code_review/variant_3_texts.txt +0 -0
  71. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/code_review/variant_4_texts.txt +0 -0
  72. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/code_review/variants.json +0 -0
  73. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/code_review/variants_v2.json +0 -0
  74. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/code_review/variants_v3.json +0 -0
  75. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/code_writing/README.md +0 -0
  76. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/code_writing/_subagent_outputs/V0_baseline.txt +0 -0
  77. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/code_writing/_subagent_outputs/V1_role_terse.txt +0 -0
  78. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/code_writing/_subagent_outputs/V2_format.txt +0 -0
  79. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/code_writing/_subagent_outputs/V3prime_rules.txt +0 -0
  80. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/code_writing/_subagent_outputs/V4_guard.txt +0 -0
  81. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/code_writing/_subagent_prompts/V0_baseline.txt +0 -0
  82. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/code_writing/_subagent_prompts/V1_role_terse.txt +0 -0
  83. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/code_writing/_subagent_prompts/V2_format.txt +0 -0
  84. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/code_writing/_subagent_prompts/V3prime_rules.txt +0 -0
  85. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/code_writing/_subagent_prompts/V4_guard.txt +0 -0
  86. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/code_writing/claude_results.json +0 -0
  87. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/code_writing/quality_review.json +0 -0
  88. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/code_writing/rubric.json +0 -0
  89. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/code_writing/train.jsonl +0 -0
  90. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/code_writing/variants.json +0 -0
  91. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/commit_message/README.md +0 -0
  92. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/commit_message/_subagent_outputs/V0_baseline.txt +0 -0
  93. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/commit_message/_subagent_outputs/V1_role_terse.txt +0 -0
  94. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/commit_message/_subagent_outputs/V2_format.txt +0 -0
  95. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/commit_message/_subagent_outputs/V3prime_rules.txt +0 -0
  96. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/commit_message/_subagent_outputs/V4_guard.txt +0 -0
  97. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/commit_message/_subagent_prompts/V0_baseline.txt +0 -0
  98. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/commit_message/_subagent_prompts/V1_role_terse.txt +0 -0
  99. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/commit_message/_subagent_prompts/V2_format.txt +0 -0
  100. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/commit_message/_subagent_prompts/V3prime_rules.txt +0 -0
  101. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/commit_message/_subagent_prompts/V4_guard.txt +0 -0
  102. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/commit_message/claude_results.json +0 -0
  103. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/commit_message/quality_review.json +0 -0
  104. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/commit_message/rubric.json +0 -0
  105. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/commit_message/train.jsonl +0 -0
  106. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/commit_message/variants.json +0 -0
  107. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/debugging/README.md +0 -0
  108. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/debugging/_subagent_outputs/V0_baseline.txt +0 -0
  109. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/debugging/_subagent_outputs/V1_role_terse.txt +0 -0
  110. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/debugging/_subagent_outputs/V2_format.txt +0 -0
  111. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/debugging/_subagent_outputs/V3prime_rules.txt +0 -0
  112. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/debugging/_subagent_outputs/V4_guard.txt +0 -0
  113. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/debugging/_subagent_prompts/V0_baseline.txt +0 -0
  114. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/debugging/_subagent_prompts/V1_role_terse.txt +0 -0
  115. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/debugging/_subagent_prompts/V2_format.txt +0 -0
  116. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/debugging/_subagent_prompts/V3prime_rules.txt +0 -0
  117. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/debugging/_subagent_prompts/V4_guard.txt +0 -0
  118. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/debugging/claude_results.json +0 -0
  119. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/debugging/quality_review.json +0 -0
  120. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/debugging/rubric.json +0 -0
  121. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/debugging/train.jsonl +0 -0
  122. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/debugging/variants.json +0 -0
  123. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/demo_calibration.py +0 -0
  124. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/demo_replay.py +0 -0
  125. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/explanation/README.md +0 -0
  126. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/explanation/_subagent_outputs/V0_baseline.txt +0 -0
  127. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/explanation/_subagent_outputs/V1_role_terse.txt +0 -0
  128. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/explanation/_subagent_outputs/V2_format.txt +0 -0
  129. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/explanation/_subagent_outputs/V3prime_rules.txt +0 -0
  130. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/explanation/_subagent_outputs/V4_guard.txt +0 -0
  131. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/explanation/_subagent_prompts/V0_baseline.txt +0 -0
  132. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/explanation/_subagent_prompts/V1_role_terse.txt +0 -0
  133. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/explanation/_subagent_prompts/V2_format.txt +0 -0
  134. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/explanation/_subagent_prompts/V3prime_rules.txt +0 -0
  135. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/explanation/_subagent_prompts/V4_guard.txt +0 -0
  136. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/explanation/claude_results.json +0 -0
  137. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/explanation/quality_review.json +0 -0
  138. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/explanation/rubric.json +0 -0
  139. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/explanation/train.jsonl +0 -0
  140. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/explanation/variants.json +0 -0
  141. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/refactoring/README.md +0 -0
  142. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/refactoring/_subagent_outputs/V0_baseline.txt +0 -0
  143. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/refactoring/_subagent_outputs/V1_role_terse.txt +0 -0
  144. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/refactoring/_subagent_outputs/V2_format.txt +0 -0
  145. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/refactoring/_subagent_outputs/V3prime_rules.txt +0 -0
  146. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/refactoring/_subagent_outputs/V4_guard.txt +0 -0
  147. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/refactoring/_subagent_prompts/V0_baseline.txt +0 -0
  148. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/refactoring/_subagent_prompts/V1_role_terse.txt +0 -0
  149. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/refactoring/_subagent_prompts/V2_format.txt +0 -0
  150. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/refactoring/_subagent_prompts/V3prime_rules.txt +0 -0
  151. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/refactoring/_subagent_prompts/V4_guard.txt +0 -0
  152. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/refactoring/claude_results.json +0 -0
  153. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/refactoring/quality_review.json +0 -0
  154. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/refactoring/rubric.json +0 -0
  155. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/refactoring/train.jsonl +0 -0
  156. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/refactoring/variants.json +0 -0
  157. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/reference/README.md +0 -0
  158. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/reference/golden_manifest.json +0 -0
  159. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/reference/reference_adaptation_plan.json +0 -0
  160. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/reference/reference_artifact.json +0 -0
  161. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/reference/reference_diff_regression.json +0 -0
  162. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/reference/reference_fail_hard_gates.json +0 -0
  163. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/reference/reference_fail_kc4_gate.json +0 -0
  164. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/reference/reference_preflight_report.json +0 -0
  165. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/reference/reference_provider_degradation.json +0 -0
  166. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/reference/reproduce_preflight_demo.py +0 -0
  167. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/reference/reproduce_reference_artifact.py +0 -0
  168. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/rubric_example.json +0 -0
  169. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/sample_dataset.jsonl +0 -0
  170. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/summarization/README.md +0 -0
  171. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/summarization/_subagent_outputs/V0_baseline.txt +0 -0
  172. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/summarization/_subagent_outputs/V1_role_terse.txt +0 -0
  173. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/summarization/_subagent_outputs/V2_format.txt +0 -0
  174. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/summarization/_subagent_outputs/V3prime_rules.txt +0 -0
  175. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/summarization/_subagent_outputs/V4_guard.txt +0 -0
  176. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/summarization/_subagent_prompts/V0_baseline.txt +0 -0
  177. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/summarization/_subagent_prompts/V1_role_terse.txt +0 -0
  178. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/summarization/_subagent_prompts/V2_format.txt +0 -0
  179. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/summarization/_subagent_prompts/V3prime_rules.txt +0 -0
  180. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/summarization/_subagent_prompts/V4_guard.txt +0 -0
  181. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/summarization/claude_results.json +0 -0
  182. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/summarization/quality_review.json +0 -0
  183. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/summarization/rubric.json +0 -0
  184. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/summarization/train.jsonl +0 -0
  185. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/summarization/variants.json +0 -0
  186. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/test_writing/README.md +0 -0
  187. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/test_writing/_subagent_outputs/V0_baseline.txt +0 -0
  188. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/test_writing/_subagent_outputs/V1_role_terse.txt +0 -0
  189. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/test_writing/_subagent_outputs/V2_format.txt +0 -0
  190. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/test_writing/_subagent_outputs/V3prime_rules.txt +0 -0
  191. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/test_writing/_subagent_outputs/V4_guard.txt +0 -0
  192. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/test_writing/_subagent_prompts/V0_baseline.txt +0 -0
  193. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/test_writing/_subagent_prompts/V1_role_terse.txt +0 -0
  194. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/test_writing/_subagent_prompts/V2_format.txt +0 -0
  195. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/test_writing/_subagent_prompts/V3prime_rules.txt +0 -0
  196. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/test_writing/_subagent_prompts/V4_guard.txt +0 -0
  197. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/test_writing/claude_results.json +0 -0
  198. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/test_writing/quality_review.json +0 -0
  199. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/test_writing/rubric.json +0 -0
  200. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/test_writing/train.jsonl +0 -0
  201. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/test_writing/variants.json +0 -0
  202. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/translation/README.md +0 -0
  203. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/translation/_subagent_outputs/V0_baseline.txt +0 -0
  204. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/translation/_subagent_outputs/V1_role_terse.txt +0 -0
  205. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/translation/_subagent_outputs/V2_format.txt +0 -0
  206. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/translation/_subagent_outputs/V3prime_rules.txt +0 -0
  207. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/translation/_subagent_outputs/V4_guard.txt +0 -0
  208. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/translation/_subagent_prompts/V0_baseline.txt +0 -0
  209. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/translation/_subagent_prompts/V1_role_terse.txt +0 -0
  210. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/translation/_subagent_prompts/V2_format.txt +0 -0
  211. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/translation/_subagent_prompts/V3prime_rules.txt +0 -0
  212. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/translation/_subagent_prompts/V4_guard.txt +0 -0
  213. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/translation/claude_results.json +0 -0
  214. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/translation/quality_review.json +0 -0
  215. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/translation/rubric.json +0 -0
  216. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/translation/train.jsonl +0 -0
  217. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/translation/variants.json +0 -0
  218. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/variants_example.json +0 -0
  219. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/src/omegacal/__init__.py +0 -0
  220. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/src/omegacal/__main__.py +0 -0
  221. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/src/omegacal/cli.py +0 -0
  222. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/src/omegaprompt/__main__.py +0 -0
  223. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/src/omegaprompt/api.py +0 -0
  224. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/src/omegaprompt/cli.py +0 -0
  225. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/src/omegaprompt/commands/__init__.py +0 -0
  226. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/src/omegaprompt/commands/check_artifact.py +0 -0
  227. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/src/omegaprompt/commands/diff.py +0 -0
  228. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/src/omegaprompt/commands/gate.py +0 -0
  229. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/src/omegaprompt/commands/report.py +0 -0
  230. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/src/omegaprompt/core/__init__.py +0 -0
  231. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/src/omegaprompt/core/artifact.py +0 -0
  232. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/src/omegaprompt/core/artifact_integrity.py +0 -0
  233. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/src/omegaprompt/core/fitness.py +0 -0
  234. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/src/omegaprompt/core/gate.py +0 -0
  235. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/src/omegaprompt/core/overfit.py +0 -0
  236. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/src/omegaprompt/core/profiles.py +0 -0
  237. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/src/omegaprompt/core/risk.py +0 -0
  238. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/src/omegaprompt/core/sensitivity.py +0 -0
  239. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/src/omegaprompt/dataset.py +0 -0
  240. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/src/omegaprompt/domain/__init__.py +0 -0
  241. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/src/omegaprompt/domain/dataset.py +0 -0
  242. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/src/omegaprompt/domain/enums.py +0 -0
  243. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/src/omegaprompt/domain/judge.py +0 -0
  244. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/src/omegaprompt/domain/params.py +0 -0
  245. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/src/omegaprompt/domain/profiles.py +0 -0
  246. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/src/omegaprompt/domain/result.py +0 -0
  247. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/src/omegaprompt/fitness.py +0 -0
  248. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/src/omegaprompt/judge.py +0 -0
  249. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/src/omegaprompt/judges/__init__.py +0 -0
  250. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/src/omegaprompt/judges/base.py +0 -0
  251. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/src/omegaprompt/judges/ensemble_judge.py +0 -0
  252. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/src/omegaprompt/judges/llm_judge.py +0 -0
  253. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/src/omegaprompt/judges/rule_judge.py +0 -0
  254. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/src/omegaprompt/mcp/__init__.py +0 -0
  255. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/src/omegaprompt/mcp/__main__.py +0 -0
  256. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/src/omegaprompt/preflight/__init__.py +0 -0
  257. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/src/omegaprompt/prompts.py +0 -0
  258. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/src/omegaprompt/providers/__init__.py +0 -0
  259. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/src/omegaprompt/providers/anthropic_provider.py +0 -0
  260. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/src/omegaprompt/providers/base.py +0 -0
  261. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/src/omegaprompt/providers/factory.py +0 -0
  262. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/src/omegaprompt/providers/gemini_provider.py +0 -0
  263. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/src/omegaprompt/providers/local_provider.py +0 -0
  264. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/src/omegaprompt/providers/ollama_provider.py +0 -0
  265. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/src/omegaprompt/providers/openai_provider.py +0 -0
  266. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/src/omegaprompt/reporting/__init__.py +0 -0
  267. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/src/omegaprompt/reporting/html.py +0 -0
  268. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/src/omegaprompt/reporting/markdown.py +0 -0
  269. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/src/omegaprompt/reporting/summary.py +0 -0
  270. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/src/omegaprompt/schema.py +0 -0
  271. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/src/omegaprompt/target.py +0 -0
  272. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/src/omegaprompt/targets/__init__.py +0 -0
  273. {omegaprompt-2.1.2 → omegaprompt-2.2.0}/src/omegaprompt/targets/base.py +0 -0
@@ -1,5 +1,14 @@
1
1
  # Changelog
2
2
 
3
+ ## [2.2.0] - 2026-10-28
4
+
5
+ - Invalidate evaluation caches when public context changes, provide explicit fresh evaluation and cache invalidation, and keep boundary-clamp verdicts distinct.
6
+ - Bound submitted item results to max_workers and stream input-order aggregation. Account attempted calls and returned usage even on failure; never cache incomplete evaluations.
7
+ - Reject nonfinite gate inputs and contradictory disjoint IDs; calibrate reports input errors with exit 2 before provider calls for split overlap.
8
+ - Add explicit PreflightReport measurement_status/probe_accounting. Failed or insufficient measurements require manual review; old reports retain unknown state.
9
+ - Preserve CLI aliases, artifact schema 2.0, and default auto mode. classify_traps gains optional paired/disjoint inputs for mini-antemortem-cli 0.11.0+.
10
+ - Retain advisory-only adaptation controls as advisory. See docs/release/2.2.0.md for measured scope and migration.
11
+
3
12
  ## [2.1.2] - 2026-10-08
4
13
 
5
14
  Bound FastMCP to SDK >=1,<2 to fix clean MCP installs. Pin the Action default to this package version. Add standalone artifact inspection and explicit preflight data handoff; remove unsupported framework comparisons.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: omegaprompt
3
- Version: 2.1.2
3
+ Version: 2.2.0
4
4
  Summary: Provider-neutral prompt calibration engine with sensitivity-ranked meta-axes, hard-gate x soft-score fitness, walk-forward ship gates, guarded/expedition profiles, and explicit capability/risk reporting across Anthropic, OpenAI, Gemini, and local OpenAI-compatible backends. Optional sub-tools (mini-omega-lock, mini-antemortem-cli) distribute separately and plug in via the omegaprompt.preflight interface.
5
5
  Project-URL: Homepage, https://github.com/hibou04-ops/omegaprompt
6
6
  Project-URL: Repository, https://github.com/hibou04-ops/omegaprompt
@@ -246,7 +246,7 @@ Description-Content-Type: text/markdown
246
246
 
247
247
  # omegaprompt
248
248
 
249
- **The overfit gate for your prompts.** Your prompt aced your eval set — that's exactly why you can't trust it yet. `omegaprompt` re-tests the winning prompt on examples it never tuned on, and **fails your CI build** if it doesn't hold up.
249
+ **Provider-neutral prompt calibration with explicit gates.** Search configurations on training data, score the winner on a separately supplied test slice, and inspect declared gap, hard-gate and profile checks. Paired replay measures repeat consistency; independent holdout needs cases excluded from selection.
250
250
 
251
251
  [![CI](https://github.com/hibou04-ops/omegaprompt/actions/workflows/ci.yml/badge.svg)](https://github.com/hibou04-ops/omegaprompt/actions/workflows/ci.yml)
252
252
  [![License: Apache 2.0](https://img.shields.io/pypi/l/omegaprompt?color=blue&label=license&cacheSeconds=3600)](LICENSE)
@@ -257,6 +257,8 @@ Description-Content-Type: text/markdown
257
257
  [![MCP](https://img.shields.io/badge/MCP-server-blueviolet.svg)](#103-mcp-server-claude-code-cursor)
258
258
  [![Parent framework](https://img.shields.io/badge/framework-omega--lock-blueviolet.svg)](https://github.com/hibou04-ops/omega-lock)
259
259
 
260
+ > **2.2.0 (2026-10-28): evaluation integrity and bounded work.** Context changes invalidate memoized observations. `PromptTarget.evaluate(..., use_cache=False)` performs fresh calls; cache replay adds no independent observation. Parallel evaluation retains at most `max_workers` submitted results and preserves input order. Failed target/judge attempts and returned usage remain in target accounting; no partial success is cached. Explicit disjoint mode rejects overlapping IDs. [Evidence and migration](docs/release/2.2.0.md).
261
+
260
262
  Docs: **[Easy start](https://github.com/hibou04-ops/omegaprompt/blob/main/EASY_README.md)** · [Full reference](https://github.com/hibou04-ops/omegaprompt/blob/main/README.md) · [한국어](https://github.com/hibou04-ops/omegaprompt/blob/main/README_KR.md) · [쉬운 한국어](https://github.com/hibou04-ops/omegaprompt/blob/main/EASY_README_KR.md) · [Examples gallery](examples/) · [Claim ledger (trust evidence)](docs/claims/README_CLAIMS.generated.md)
261
263
 
262
264
  Keywords: **prompt overfitting · prompt regression testing · LLM eval CI · prompt evaluation · prompt A/B test in CI · held-out validation for prompts · CI ship gate for prompts**
@@ -266,7 +268,6 @@ pip install omegaprompt # core
266
268
  pip install "omegaprompt[mcp]" # + MCP server (Claude Code / Cursor)
267
269
  ```
268
270
 
269
- > **v2.1.2 (2026-10-08)** — MCP installs retain SDK 1.x compatibility; the Action installs this exact package version by default. Standalone examples and docking instructions clarify synthetic versus live evidence. CLI/MCP names, schema 2.0 and the eight MCP tools are unchanged.
270
271
 
271
272
  <!-- public-claim-ledger:start -->
272
273
  > Claim evidence source: [docs/claims/public_claim_ledger.json](docs/claims/public_claim_ledger.json), rendered by `python tools/generate_readme_claims.py`.
@@ -285,9 +286,9 @@ Calibrate prompt configurations through omega-lock and inspect CalibrationArtifa
285
286
  Requires Python 3.11+. Installation needs internet.
286
287
 
287
288
  ```bash
288
- python -m pip install omegaprompt==2.1.2
289
+ python -m pip install omegaprompt==2.2.0
289
290
  omegaprompt --help
290
- python -c "from urllib.request import urlretrieve; urlretrieve('https://raw.githubusercontent.com/hibou04-ops/omegaprompt/v2.1.2/examples/reference/reference_artifact.json', 'artifact.json')"
291
+ python -c "from urllib.request import urlretrieve; urlretrieve('https://raw.githubusercontent.com/hibou04-ops/omegaprompt/v2.2.0/examples/reference/reference_artifact.json', 'artifact.json')"
291
292
  omegaprompt check-artifact artifact.json
292
293
  omegaprompt report artifact.json --format json
293
294
  ```
@@ -298,7 +299,7 @@ omega-lock>=0.3.0,<0.4.0 is required and installed automatically. Both mini pack
298
299
 
299
300
  [Docking contracts and runnable data handoff](https://github.com/hibou04-ops/omega-lock/blob/main/DOCKING.md) · [Full guide](README.md).
300
301
 
301
- MCP: install the distribution with `[mcp]` and use its existing server executable. FastMCP support is bounded to MCP SDK `>=1.0.0,<2.0.0`; the tool names and schemas are unchanged.
302
+ MCP: install the distribution with `[mcp]` and use its existing server executable. FastMCP support is bounded to MCP SDK `>=1.0.0,<2.0.0`; tool names are retained; classify_traps gains optional validation inputs.
302
303
 
303
304
 
304
305
  ## Your prompt is overfit to your eval set — and you don't know it
@@ -309,7 +310,7 @@ A week later, production quality is *worse* than before. Why?
309
310
 
310
311
  Because 4.8 was the score on **the exact examples you tuned against**. You didn't measure a prompt — you memorized an answer key. That's overfitting, and your eval tool reported PASS because that's all it was asked to do. ML solved this in the 1990s with a train/test split. Most prompt workflows still ship without one.
311
312
 
312
- `omegaprompt` is the 60-second check that catches this **before** you ship:
313
+ `omegaprompt` is a configurable workflow that catches this **before** you ship:
313
314
 
314
315
  1. It tunes your prompt on a **train** slice (across system prompt, few-shot, reasoning effort, output budget, response-schema mode, tool policy).
315
316
  2. It **re-tests the winner on a held-out slice it never tuned on**.
@@ -317,7 +318,7 @@ Because 4.8 was the score on **the exact examples you tuned against**. You didn'
317
318
 
318
319
  Then one line in CI makes a "small prompt tweak" fail the build if it silently degrades quality.
319
320
 
320
- > **Your eval says PASS. omegaprompt says it won't generalize.** That sentence is the whole product.
321
+ > A gate failure identifies a failed declared check on supplied data; it does not establish future production behavior.
321
322
 
322
323
  ---
323
324
 
@@ -354,7 +355,7 @@ generalization_gap: 0.00% # train vs held-out — small gap = it transferre
354
355
  kc4_status: MISSING_PER_ITEM_SCORES
355
356
  ```
356
357
 
357
- **Honest read of this demo:** the bundled demo dataset has *disjoint* train/held-out items (no shared item ids), so the per-item transfer gate cannot fire — it reports `MISSING_PER_ITEM_SCORES` and the gate degenerates to the gap check alone (which here is 0.00%). The per-item transfer gate is what *actually* fires on a real **paired** dataset (train and held-out sharing item ids). So don't read this demo's clean numbers as "the transfer gate passed" — read it as "the gap check passed and the transfer gate had nothing to score." See *How it works*.
358
+ **Demo scope:** these deterministic fixtures exercise artifact and gap-gate behavior. Missing per-item scores are unmeasured correlation. A paired replay measures repeat consistency on the same cases; an independent holdout needs cases excluded from selection. Neither proves production generalization.
358
359
 
359
360
  Turn that same artifact into a one-command CI verdict:
360
361
 
@@ -405,7 +406,7 @@ A prompt change is a code change. Gate it like one. The dedicated **`omegaprompt
405
406
 
406
407
  ```yaml
407
408
  # .github/workflows/prompt-audit.yml
408
- - uses: hibou04-ops/omegaprompt@v2.1.2
409
+ - uses: hibou04-ops/omegaprompt@v2.2.0
409
410
  with:
410
411
  artifact: artifact.json # a CalibrationArtifact you produced in a prior step
411
412
  format: json # machine-readable gate summary
@@ -476,7 +477,7 @@ You give it a **dataset + a judging rubric + candidate prompts**. It searches st
476
477
 
477
478
  Then it re-tests the winning configuration on the **held-out** slice and applies two pre-declared gates:
478
479
 
479
- - **Held-out transfer gate** (`--min-kc4`): per-item held-out scores must still track the target. If train looks great but the held-out items stop correlating, the prompt overfit — the run is flagged `FAIL_KC4_GATE`. *(This needs train and held-out to share item ids — a "paired" replay. On an ordinary disjoint split it degrades to the gap check below, which still catches overfit — that's exactly what the offline demo above shows.)*
480
+ - **Paired consistency gate** (`--min-kc4`): Pearson correlation on the same cases must meet the declared threshold. Failure means that consistency check failed, not proof of overfitting. An independent disjoint holdout has no paired correlation and uses the gap and hard-gate checks.
480
481
  - **Max gap gate** (`--max-gap`): the train↔held-out fitness gap must stay under your declared ceiling.
481
482
 
482
483
  Both thresholds are set **before** scoring. There's no lowering the bar after you see results.
@@ -816,7 +817,7 @@ Every combination in the unlocked subspace is evaluated. Each evaluation issues
816
817
 
817
818
  ### 5.5 Held-out replay
818
819
 
819
- The training-best parameters are replayed on the held-out test slice. The replay uses the *same* `PromptTarget` adapter with a different dataset; there is no leakage possible because the test slice was never seen by the searcher.
820
+ The training-best parameters are evaluated using a separate PromptTarget instance for the supplied test dataset. Independence depends on actual content and prior selection history. A paired replay deliberately reuses the same cases and is not an independent holdout.
820
821
 
821
822
  ### 5.6 Held-out transfer gate (per-item correlation)
822
823
 
@@ -824,9 +825,9 @@ The Pearson correlation between train per-item scores and test per-item scores (
824
825
 
825
826
  **Transfer-gate semantics by validation_mode (v1.5+).** The transfer gate is a per-item correlation, so it is only meaningful when train and test slices share the *same* item ids — a "paired replay". On an ordinary disjoint train/test split the slices have no shared ids and the per-item correlation is structurally unmeasurable; the gate degenerates to the gap-only check. To make this explicit, `CalibrateTuning.validation_mode` accepts:
826
827
 
827
- - `"auto"` (default, backward-compat): compute the per-item correlation only when slices share ≥3 ids; otherwise skip silently.
828
+ - `"auto"` (default, backward-compat): compute the per-item correlation only when slices share ≥3 ids; otherwise record a noncomputed status.
828
829
  - `"paired"`: caller asserts shared ids by design. Raises `ValueError` if overlap < 3 — a paired run with no overlap is a setup bug, not a free pass.
829
- - `"disjoint"`: caller asserts no shared ids by design. The per-item correlation is never computed; the gate is gap-only.
830
+ - `"disjoint"`: caller asserts no shared ids by design. Overlapping IDs raise an input error. For disjoint IDs the gate is gap-only; unmeasured correlation is not a correlation pass.
830
831
 
831
832
  If you run a normal held-out split (disjoint ids), set `validation_mode="disjoint"` to make the artifact's lack of `kc4_correlation` self-documenting. Use `"paired"` when you score two prompts on the *same* items and want the per-item correlation as a stability signal.
832
833
 
@@ -1403,7 +1404,7 @@ The default test suite runs with `pytest -q` and uses mocked provider clients ra
1403
1404
  | `judges/` | `RuleJudge` (no_refusal / non_empty / json_object / regex / duplicate-check rejection / missing-check raise); `LLMJudge` (strict-schema dispatch, payload composition, non-`JudgeResult` response raise, strict-mode ship-grade judge refusal); `EnsembleJudge` (rule-first short-circuit, LLM escalation on rule-pass, merged gate_results, non-`RuleJudge` rejection). |
1404
1405
  | `targets/` | `PromptTarget` end-to-end with mocked provider + judge; meta-axis resolution and clamping for out-of-range inputs; usage accumulation across evaluations; `evaluation_history` retention; latency measurement; degraded-capability propagation. |
1405
1406
  | `commands/` | CLI help lists `calibrate` / `report` / `diff` / `check-artifact`; `--version` shows `omegaprompt`; `report` renders schema-v2.0 artifacts; `diff` detects regressions on fitness, cost ratios, latency ratios, boundary-crossing flips; `check-artifact` performs zero-network integrity checks. |
1406
- | `preflight/` | **Plugin interface only** — no probe or classifier code inside `omegaprompt`. `contracts`: severity ordering, status enum, `PreflightReport.worst_severity` / `any_real_or_new`, Pydantic `extra="forbid"` enforcement; bounds on `JudgeQualityMeasurement.consistency` (0..1), `EndpointMeasurement.schema_reliability` (0..1). `adaptation`: noise-adaptive `min_kc4` across four thresholds; consistency-driven `rescore_count`; schema-fallback trigger; wall-time-driven `unlock_k` reduction; small-sample gap widening; variant-skip axis marking; `apply_adaptation_plan` invariants (never weakens `min_kc4`, never widens `max_gap`, never raises `unlock_k`). Sub-tool probe + classifier implementations (with their own test suites) live in the `mini-omega-lock` and `mini-antemortem-cli` repositories. |
1407
+ | `preflight/` | **Plugin interface only** — no probe or classifier code inside `omegaprompt`. `contracts`: severity ordering, status enum, `PreflightReport.worst_severity` / `any_real_or_new`, Pydantic `extra="forbid"` enforcement; bounds on `JudgeQualityMeasurement.consistency` (0..1), `EndpointMeasurement.schema_reliability` (0..1). `adaptation`: noise-adaptive `min_kc4` across four thresholds; consistency-driven `rescore_count`; schema-fallback trigger; wall-time-driven `unlock_k` reduction; small-sample manual-review escalation; variant-skip axis marking; `apply_adaptation_plan` invariants (never weakens `min_kc4`, never widens `max_gap`, never raises `unlock_k`). Sub-tool probe + classifier implementations (with their own test suites) live in the `mini-omega-lock` and `mini-antemortem-cli` repositories. |
1407
1408
  | `test_calibrate_integration.py` | **Drives the real `omega_lock.run_p1`** with a deterministic in-memory `CalibrableTarget` (no mocks on the search engine). Asserts the artifact's `calibrated_params`, `neutral_baseline_params`, `walk_forward`, and `sensitivity_ranking` match `P1Result`'s actual shape — the regression that this test catches is drift between the adapter layer and the search engine that per-module unit tests cannot reach. |
1408
1409
 
1409
1410
  Run the default no-network suite with `uv run pytest -q -m "not live"` (or `python -m pytest -q -m "not live"`). The wall-clock time is dominated by Pydantic model compilation on first import.
@@ -1948,3 +1949,5 @@ Apache 2.0. See [LICENSE](LICENSE).
1948
1949
  ## Colophon
1949
1950
 
1950
1951
  Designed, implemented, and shipped solo. Adapter layer over `omega-lock`; zero calibration-engine reimplementation. Every non-trivial change is pre-authored through `antemortem-cli`'s recon discipline. Tests run offline; no live API calls in CI.
1952
+
1953
+ 2.2.0 runtime split contract: explicit paired mode requires matching ID sets and identical input/reference content on at least three cases; explicit disjoint mode rejects overlapping IDs or exact duplicate input content before provider calls. Historical auto mode is retained and does not establish independence.
@@ -1,6 +1,6 @@
1
1
  # omegaprompt
2
2
 
3
- **The overfit gate for your prompts.** Your prompt aced your eval set — that's exactly why you can't trust it yet. `omegaprompt` re-tests the winning prompt on examples it never tuned on, and **fails your CI build** if it doesn't hold up.
3
+ **Provider-neutral prompt calibration with explicit gates.** Search configurations on training data, score the winner on a separately supplied test slice, and inspect declared gap, hard-gate and profile checks. Paired replay measures repeat consistency; independent holdout needs cases excluded from selection.
4
4
 
5
5
  [![CI](https://github.com/hibou04-ops/omegaprompt/actions/workflows/ci.yml/badge.svg)](https://github.com/hibou04-ops/omegaprompt/actions/workflows/ci.yml)
6
6
  [![License: Apache 2.0](https://img.shields.io/pypi/l/omegaprompt?color=blue&label=license&cacheSeconds=3600)](LICENSE)
@@ -11,6 +11,8 @@
11
11
  [![MCP](https://img.shields.io/badge/MCP-server-blueviolet.svg)](#103-mcp-server-claude-code-cursor)
12
12
  [![Parent framework](https://img.shields.io/badge/framework-omega--lock-blueviolet.svg)](https://github.com/hibou04-ops/omega-lock)
13
13
 
14
+ > **2.2.0 (2026-10-28): evaluation integrity and bounded work.** Context changes invalidate memoized observations. `PromptTarget.evaluate(..., use_cache=False)` performs fresh calls; cache replay adds no independent observation. Parallel evaluation retains at most `max_workers` submitted results and preserves input order. Failed target/judge attempts and returned usage remain in target accounting; no partial success is cached. Explicit disjoint mode rejects overlapping IDs. [Evidence and migration](docs/release/2.2.0.md).
15
+
14
16
  Docs: **[Easy start](https://github.com/hibou04-ops/omegaprompt/blob/main/EASY_README.md)** · [Full reference](https://github.com/hibou04-ops/omegaprompt/blob/main/README.md) · [한국어](https://github.com/hibou04-ops/omegaprompt/blob/main/README_KR.md) · [쉬운 한국어](https://github.com/hibou04-ops/omegaprompt/blob/main/EASY_README_KR.md) · [Examples gallery](examples/) · [Claim ledger (trust evidence)](docs/claims/README_CLAIMS.generated.md)
15
17
 
16
18
  Keywords: **prompt overfitting · prompt regression testing · LLM eval CI · prompt evaluation · prompt A/B test in CI · held-out validation for prompts · CI ship gate for prompts**
@@ -20,7 +22,6 @@ pip install omegaprompt # core
20
22
  pip install "omegaprompt[mcp]" # + MCP server (Claude Code / Cursor)
21
23
  ```
22
24
 
23
- > **v2.1.2 (2026-10-08)** — MCP installs retain SDK 1.x compatibility; the Action installs this exact package version by default. Standalone examples and docking instructions clarify synthetic versus live evidence. CLI/MCP names, schema 2.0 and the eight MCP tools are unchanged.
24
25
 
25
26
  <!-- public-claim-ledger:start -->
26
27
  > Claim evidence source: [docs/claims/public_claim_ledger.json](docs/claims/public_claim_ledger.json), rendered by `python tools/generate_readme_claims.py`.
@@ -39,9 +40,9 @@ Calibrate prompt configurations through omega-lock and inspect CalibrationArtifa
39
40
  Requires Python 3.11+. Installation needs internet.
40
41
 
41
42
  ```bash
42
- python -m pip install omegaprompt==2.1.2
43
+ python -m pip install omegaprompt==2.2.0
43
44
  omegaprompt --help
44
- python -c "from urllib.request import urlretrieve; urlretrieve('https://raw.githubusercontent.com/hibou04-ops/omegaprompt/v2.1.2/examples/reference/reference_artifact.json', 'artifact.json')"
45
+ python -c "from urllib.request import urlretrieve; urlretrieve('https://raw.githubusercontent.com/hibou04-ops/omegaprompt/v2.2.0/examples/reference/reference_artifact.json', 'artifact.json')"
45
46
  omegaprompt check-artifact artifact.json
46
47
  omegaprompt report artifact.json --format json
47
48
  ```
@@ -52,7 +53,7 @@ omega-lock>=0.3.0,<0.4.0 is required and installed automatically. Both mini pack
52
53
 
53
54
  [Docking contracts and runnable data handoff](https://github.com/hibou04-ops/omega-lock/blob/main/DOCKING.md) · [Full guide](README.md).
54
55
 
55
- MCP: install the distribution with `[mcp]` and use its existing server executable. FastMCP support is bounded to MCP SDK `>=1.0.0,<2.0.0`; the tool names and schemas are unchanged.
56
+ MCP: install the distribution with `[mcp]` and use its existing server executable. FastMCP support is bounded to MCP SDK `>=1.0.0,<2.0.0`; tool names are retained; classify_traps gains optional validation inputs.
56
57
 
57
58
 
58
59
  ## Your prompt is overfit to your eval set — and you don't know it
@@ -63,7 +64,7 @@ A week later, production quality is *worse* than before. Why?
63
64
 
64
65
  Because 4.8 was the score on **the exact examples you tuned against**. You didn't measure a prompt — you memorized an answer key. That's overfitting, and your eval tool reported PASS because that's all it was asked to do. ML solved this in the 1990s with a train/test split. Most prompt workflows still ship without one.
65
66
 
66
- `omegaprompt` is the 60-second check that catches this **before** you ship:
67
+ `omegaprompt` is a configurable workflow that catches this **before** you ship:
67
68
 
68
69
  1. It tunes your prompt on a **train** slice (across system prompt, few-shot, reasoning effort, output budget, response-schema mode, tool policy).
69
70
  2. It **re-tests the winner on a held-out slice it never tuned on**.
@@ -71,7 +72,7 @@ Because 4.8 was the score on **the exact examples you tuned against**. You didn'
71
72
 
72
73
  Then one line in CI makes a "small prompt tweak" fail the build if it silently degrades quality.
73
74
 
74
- > **Your eval says PASS. omegaprompt says it won't generalize.** That sentence is the whole product.
75
+ > A gate failure identifies a failed declared check on supplied data; it does not establish future production behavior.
75
76
 
76
77
  ---
77
78
 
@@ -108,7 +109,7 @@ generalization_gap: 0.00% # train vs held-out — small gap = it transferre
108
109
  kc4_status: MISSING_PER_ITEM_SCORES
109
110
  ```
110
111
 
111
- **Honest read of this demo:** the bundled demo dataset has *disjoint* train/held-out items (no shared item ids), so the per-item transfer gate cannot fire — it reports `MISSING_PER_ITEM_SCORES` and the gate degenerates to the gap check alone (which here is 0.00%). The per-item transfer gate is what *actually* fires on a real **paired** dataset (train and held-out sharing item ids). So don't read this demo's clean numbers as "the transfer gate passed" — read it as "the gap check passed and the transfer gate had nothing to score." See *How it works*.
112
+ **Demo scope:** these deterministic fixtures exercise artifact and gap-gate behavior. Missing per-item scores are unmeasured correlation. A paired replay measures repeat consistency on the same cases; an independent holdout needs cases excluded from selection. Neither proves production generalization.
112
113
 
113
114
  Turn that same artifact into a one-command CI verdict:
114
115
 
@@ -159,7 +160,7 @@ A prompt change is a code change. Gate it like one. The dedicated **`omegaprompt
159
160
 
160
161
  ```yaml
161
162
  # .github/workflows/prompt-audit.yml
162
- - uses: hibou04-ops/omegaprompt@v2.1.2
163
+ - uses: hibou04-ops/omegaprompt@v2.2.0
163
164
  with:
164
165
  artifact: artifact.json # a CalibrationArtifact you produced in a prior step
165
166
  format: json # machine-readable gate summary
@@ -230,7 +231,7 @@ You give it a **dataset + a judging rubric + candidate prompts**. It searches st
230
231
 
231
232
  Then it re-tests the winning configuration on the **held-out** slice and applies two pre-declared gates:
232
233
 
233
- - **Held-out transfer gate** (`--min-kc4`): per-item held-out scores must still track the target. If train looks great but the held-out items stop correlating, the prompt overfit — the run is flagged `FAIL_KC4_GATE`. *(This needs train and held-out to share item ids — a "paired" replay. On an ordinary disjoint split it degrades to the gap check below, which still catches overfit — that's exactly what the offline demo above shows.)*
234
+ - **Paired consistency gate** (`--min-kc4`): Pearson correlation on the same cases must meet the declared threshold. Failure means that consistency check failed, not proof of overfitting. An independent disjoint holdout has no paired correlation and uses the gap and hard-gate checks.
234
235
  - **Max gap gate** (`--max-gap`): the train↔held-out fitness gap must stay under your declared ceiling.
235
236
 
236
237
  Both thresholds are set **before** scoring. There's no lowering the bar after you see results.
@@ -570,7 +571,7 @@ Every combination in the unlocked subspace is evaluated. Each evaluation issues
570
571
 
571
572
  ### 5.5 Held-out replay
572
573
 
573
- The training-best parameters are replayed on the held-out test slice. The replay uses the *same* `PromptTarget` adapter with a different dataset; there is no leakage possible because the test slice was never seen by the searcher.
574
+ The training-best parameters are evaluated using a separate PromptTarget instance for the supplied test dataset. Independence depends on actual content and prior selection history. A paired replay deliberately reuses the same cases and is not an independent holdout.
574
575
 
575
576
  ### 5.6 Held-out transfer gate (per-item correlation)
576
577
 
@@ -578,9 +579,9 @@ The Pearson correlation between train per-item scores and test per-item scores (
578
579
 
579
580
  **Transfer-gate semantics by validation_mode (v1.5+).** The transfer gate is a per-item correlation, so it is only meaningful when train and test slices share the *same* item ids — a "paired replay". On an ordinary disjoint train/test split the slices have no shared ids and the per-item correlation is structurally unmeasurable; the gate degenerates to the gap-only check. To make this explicit, `CalibrateTuning.validation_mode` accepts:
580
581
 
581
- - `"auto"` (default, backward-compat): compute the per-item correlation only when slices share ≥3 ids; otherwise skip silently.
582
+ - `"auto"` (default, backward-compat): compute the per-item correlation only when slices share ≥3 ids; otherwise record a noncomputed status.
582
583
  - `"paired"`: caller asserts shared ids by design. Raises `ValueError` if overlap < 3 — a paired run with no overlap is a setup bug, not a free pass.
583
- - `"disjoint"`: caller asserts no shared ids by design. The per-item correlation is never computed; the gate is gap-only.
584
+ - `"disjoint"`: caller asserts no shared ids by design. Overlapping IDs raise an input error. For disjoint IDs the gate is gap-only; unmeasured correlation is not a correlation pass.
584
585
 
585
586
  If you run a normal held-out split (disjoint ids), set `validation_mode="disjoint"` to make the artifact's lack of `kc4_correlation` self-documenting. Use `"paired"` when you score two prompts on the *same* items and want the per-item correlation as a stability signal.
586
587
 
@@ -1157,7 +1158,7 @@ The default test suite runs with `pytest -q` and uses mocked provider clients ra
1157
1158
  | `judges/` | `RuleJudge` (no_refusal / non_empty / json_object / regex / duplicate-check rejection / missing-check raise); `LLMJudge` (strict-schema dispatch, payload composition, non-`JudgeResult` response raise, strict-mode ship-grade judge refusal); `EnsembleJudge` (rule-first short-circuit, LLM escalation on rule-pass, merged gate_results, non-`RuleJudge` rejection). |
1158
1159
  | `targets/` | `PromptTarget` end-to-end with mocked provider + judge; meta-axis resolution and clamping for out-of-range inputs; usage accumulation across evaluations; `evaluation_history` retention; latency measurement; degraded-capability propagation. |
1159
1160
  | `commands/` | CLI help lists `calibrate` / `report` / `diff` / `check-artifact`; `--version` shows `omegaprompt`; `report` renders schema-v2.0 artifacts; `diff` detects regressions on fitness, cost ratios, latency ratios, boundary-crossing flips; `check-artifact` performs zero-network integrity checks. |
1160
- | `preflight/` | **Plugin interface only** — no probe or classifier code inside `omegaprompt`. `contracts`: severity ordering, status enum, `PreflightReport.worst_severity` / `any_real_or_new`, Pydantic `extra="forbid"` enforcement; bounds on `JudgeQualityMeasurement.consistency` (0..1), `EndpointMeasurement.schema_reliability` (0..1). `adaptation`: noise-adaptive `min_kc4` across four thresholds; consistency-driven `rescore_count`; schema-fallback trigger; wall-time-driven `unlock_k` reduction; small-sample gap widening; variant-skip axis marking; `apply_adaptation_plan` invariants (never weakens `min_kc4`, never widens `max_gap`, never raises `unlock_k`). Sub-tool probe + classifier implementations (with their own test suites) live in the `mini-omega-lock` and `mini-antemortem-cli` repositories. |
1161
+ | `preflight/` | **Plugin interface only** — no probe or classifier code inside `omegaprompt`. `contracts`: severity ordering, status enum, `PreflightReport.worst_severity` / `any_real_or_new`, Pydantic `extra="forbid"` enforcement; bounds on `JudgeQualityMeasurement.consistency` (0..1), `EndpointMeasurement.schema_reliability` (0..1). `adaptation`: noise-adaptive `min_kc4` across four thresholds; consistency-driven `rescore_count`; schema-fallback trigger; wall-time-driven `unlock_k` reduction; small-sample manual-review escalation; variant-skip axis marking; `apply_adaptation_plan` invariants (never weakens `min_kc4`, never widens `max_gap`, never raises `unlock_k`). Sub-tool probe + classifier implementations (with their own test suites) live in the `mini-omega-lock` and `mini-antemortem-cli` repositories. |
1161
1162
  | `test_calibrate_integration.py` | **Drives the real `omega_lock.run_p1`** with a deterministic in-memory `CalibrableTarget` (no mocks on the search engine). Asserts the artifact's `calibrated_params`, `neutral_baseline_params`, `walk_forward`, and `sensitivity_ranking` match `P1Result`'s actual shape — the regression that this test catches is drift between the adapter layer and the search engine that per-module unit tests cannot reach. |
1162
1163
 
1163
1164
  Run the default no-network suite with `uv run pytest -q -m "not live"` (or `python -m pytest -q -m "not live"`). The wall-clock time is dominated by Pydantic model compilation on first import.
@@ -1702,3 +1703,5 @@ Apache 2.0. See [LICENSE](LICENSE).
1702
1703
  ## Colophon
1703
1704
 
1704
1705
  Designed, implemented, and shipped solo. Adapter layer over `omega-lock`; zero calibration-engine reimplementation. Every non-trivial change is pre-authored through `antemortem-cli`'s recon discipline. Tests run offline; no live API calls in CI.
1706
+
1707
+ 2.2.0 runtime split contract: explicit paired mode requires matching ID sets and identical input/reference content on at least three cases; explicit disjoint mode rejects overlapping IDs or exact duplicate input content before provider calls. Historical auto mode is retained and does not establish independence.
@@ -1,6 +1,6 @@
1
1
  # omegaprompt
2
2
 
3
- **당신의 prompt를 위한 overfit gate.** prompt가 당신의 eval set에서 만점을 받았다 — 바로 그것이 아직 그 prompt를 믿어선 안 되는 이유입니다. `omegaprompt`는 이긴 prompt를 그 prompt가 한 번도 튜닝하지 않은 예시들로 다시 테스트하고, 그 결과가 유지되지 않으면 **당신의 CI 빌드를 실패**시킵니다.
3
+ **명시적 gate를 갖춘 provider 중립 프롬프트 보정.** train 데이터에서 설정을 선택하고 별도로 제공한 test 데이터에서 gap·hard gate·실행 정책을 검사합니다. paired 재측정은 반복 일관성이며, 독립 holdout은 선택에 사용하지 않은 사례가 필요합니다.
4
4
 
5
5
  [![CI](https://github.com/hibou04-ops/omegaprompt/actions/workflows/ci.yml/badge.svg)](https://github.com/hibou04-ops/omegaprompt/actions/workflows/ci.yml)
6
6
  [![License: Apache 2.0](https://img.shields.io/pypi/l/omegaprompt?color=blue&label=license&cacheSeconds=3600)](LICENSE)
@@ -11,6 +11,8 @@
11
11
  [![MCP](https://img.shields.io/badge/MCP-server-blueviolet.svg)](https://github.com/hibou04-ops/omegaprompt/blob/main/README.md#103-mcp-server-claude-code-cursor)
12
12
  [![Parent framework](https://img.shields.io/badge/framework-omega--lock-blueviolet.svg)](https://github.com/hibou04-ops/omega-lock)
13
13
 
14
+ > **2.2.0 (2026-10-28): 평가 무결성과 대기 작업 상한.** 데이터·rubric·variants 등 평가 컨텍스트 변경 시 캐시를 무효화합니다. `PromptTarget.evaluate(..., use_cache=False)`는 실제 재측정이며 캐시 재생은 독립 관측으로 세지 않습니다. 병렬 대기 결과는 `max_workers`개 이하이고 입력 순서를 보존합니다. 실패한 target/judge 시도와 반환된 usage도 누적 계측하며 부분 성공은 캐시하지 않습니다. 명시적 disjoint 모드는 ID 중복을 입력 오류로 처리합니다. [검증 근거와 이행 안내](docs/release/2.2.0.md).
15
+
14
16
  문서: **[Easy start](https://github.com/hibou04-ops/omegaprompt/blob/main/EASY_README.md)** · [Full reference](https://github.com/hibou04-ops/omegaprompt/blob/main/README.md) · [한국어](https://github.com/hibou04-ops/omegaprompt/blob/main/README_KR.md) · [쉬운 한국어](https://github.com/hibou04-ops/omegaprompt/blob/main/EASY_README_KR.md) · [Examples gallery](examples/) · [Claim ledger (신뢰 근거)](docs/claims/README_CLAIMS.generated.md)
15
17
 
16
18
  키워드: **prompt overfitting · prompt regression testing · LLM eval CI · prompt evaluation · prompt A/B test in CI · held-out validation for prompts · CI ship gate for prompts**
@@ -20,7 +22,6 @@ pip install omegaprompt # core
20
22
  pip install "omegaprompt[mcp]" # + MCP server (Claude Code / Cursor)
21
23
  ```
22
24
 
23
- > **v2.1.2 (2026-10-08)** — MCP 설치는 SDK 1.x 호환 범위를 유지하고 Action은 해당 버전을 기본 설치합니다. 단독 예제와 도킹 안내에서 합성·실제 근거를 구분합니다. CLI/MCP 이름, schema 2.0, MCP 도구 8개는 유지합니다.
24
25
 
25
26
  <!-- public-claim-ledger:start -->
26
27
  > Claim evidence source: [docs/claims/public_claim_ledger.json](docs/claims/public_claim_ledger.json), rendered by `python tools/generate_readme_claims.py`.
@@ -39,16 +40,16 @@ omega-lock 엔진으로 프롬프트 설정을 보정하고 CalibrationArtifact
39
40
  Python 3.11 이상에서 실행합니다. 설치에는 인터넷이 필요합니다.
40
41
 
41
42
  ```bash
42
- python -m pip install omegaprompt==2.1.2
43
+ python -m pip install omegaprompt==2.2.0
43
44
  omegaprompt --help
44
- python -c "from urllib.request import urlretrieve; urlretrieve('https://raw.githubusercontent.com/hibou04-ops/omegaprompt/v2.1.2/examples/reference/reference_artifact.json', 'artifact.json')"
45
+ python -c "from urllib.request import urlretrieve; urlretrieve('https://raw.githubusercontent.com/hibou04-ops/omegaprompt/v2.2.0/examples/reference/reference_artifact.json', 'artifact.json')"
45
46
  omegaprompt check-artifact artifact.json
46
47
  omegaprompt report artifact.json --format json
47
48
  ```
48
49
 
49
50
  artifact 다운로드는 인터넷이 필요하며 이후 검사는 오프라인입니다. 저장된 합성 artifact의 누락된 per-item 점수는 transfer 통과를 뜻하지 않습니다. 실제 보정은 provider 설정과 비용 확인이 필요합니다. omega-lock>=0.3.0,<0.4.0은 필수이며 두 mini 도구는 선택입니다.
50
51
 
51
- [실제 연결 방식과 입력·출력](https://github.com/hibou04-ops/omega-lock/blob/main/DOCKING.md) · [전체 안내](README.md). 두 mini 도구의 현재 검증 조합은 omegaprompt 2.1.2이며, 별도 배포 패키지입니다.
52
+ [실제 연결 방식과 입력·출력](https://github.com/hibou04-ops/omega-lock/blob/main/DOCKING.md) · [전체 안내](README.md). 두 mini 도구의 현재 검증 조합은 omegaprompt 2.2.0이며, 별도 배포 패키지입니다.
52
53
 
53
54
  MCP는 해당 배포명의 `[mcp]` extras와 기존 서버 명령을 사용합니다. 기존 FastMCP 계약은 SDK `>=1.0.0,<2.0.0` 범위로 유지합니다.
54
55
 
@@ -157,7 +158,7 @@ prompt 변경은 코드 변경입니다. 코드처럼 gate하세요. 전용 **`o
157
158
 
158
159
  ```yaml
159
160
  # .github/workflows/prompt-audit.yml
160
- - uses: hibou04-ops/omegaprompt@v2.1.2
161
+ - uses: hibou04-ops/omegaprompt@v2.2.0
161
162
  with:
162
163
  artifact: artifact.json # a CalibrationArtifact you produced in a prior step
163
164
  format: json # machine-readable gate summary
@@ -568,7 +569,7 @@ unlock된 부분공간의 모든 조합이 평가됩니다. 각 평가는 datase
568
569
 
569
570
  ### 5.5 held-out replay
570
571
 
571
- training-best parameter가 held-out 테스트 슬라이스에서 replay됩니다. replay는 *같은* `PromptTarget` adapter를 다른 dataset과 함께 씁니다; 테스트 슬라이스는 searcher가 결코 보지 않았으므로 leakage가 가능하지 않습니다.
572
+ 선택한 parameter를 별도 PromptTarget 인스턴스와 제공된 test 데이터에서 평가합니다. 독립성은 실제 입력 내용과 과거 선택 이력에 달려 있습니다. paired 재측정은 동일 사례를 다시 사용하므로 독립 holdout이 아닙니다.
572
573
 
573
574
  ### 5.6 held-out transfer gate (per-item 상관)
574
575
 
@@ -576,7 +577,7 @@ train per-item 점수와 test per-item 점수 사이의(공유 dataset id 위에
576
577
 
577
578
  **validation_mode별 transfer-gate 의미(v1.5+).** transfer gate는 per-item 상관이므로, train과 test 슬라이스가 *같은* item id를 공유할 때 — "paired replay" — 에만 의미가 있습니다. 보통의 disjoint train/test split에서는 슬라이스에 공유 id가 없어 per-item 상관이 구조적으로 측정 불가능합니다; gate는 gap-only 검사로 축소됩니다. 이를 명시하기 위해 `CalibrateTuning.validation_mode`는 다음을 받습니다:
578
579
 
579
- - `"auto"`(기본값, backward-compat): 슬라이스가 ≥3개 id를 공유할 때만 per-item 상관을 계산하고; 그렇지 않으면 조용히 건너뜁니다.
580
+ - `"auto"`(기본값, backward-compat): 슬라이스가 ≥3개 id를 공유할 때만 per-item 상관을 계산하고; 그렇지 않으면 미측정 사유를 기록합니다.
580
581
  - `"paired"`: 호출자가 설계상 공유 id를 단언합니다. overlap이 3 미만이면 `ValueError`를 던집니다 — overlap 없는 paired 실행은 무료 통과가 아니라 setup 버그입니다.
581
582
  - `"disjoint"`: 호출자가 설계상 공유 id 없음을 단언합니다. per-item 상관은 결코 계산되지 않고; gate는 gap-only입니다.
582
583
 
@@ -1672,3 +1673,5 @@ Apache 2.0. [LICENSE](LICENSE)를 참고하세요.
1672
1673
  ## Colophon
1673
1674
 
1674
1675
  혼자 설계하고, 구현하고, ship했습니다. `omega-lock` 위의 adapter 계층; calibration-engine 재구현 0. 모든 non-trivial한 변경은 `antemortem-cli`의 recon 원칙을 통해 사전 작성됩니다. 테스트는 offline으로 돌고; CI에 라이브 API 호출이 없습니다.
1676
+
1677
+ 2.2.0 runtime split contract: explicit paired mode requires matching ID sets and identical input/reference content on at least three cases; explicit disjoint mode rejects overlapping IDs or exact duplicate input content before provider calls. Historical auto mode is retained and does not establish independence.
@@ -24,12 +24,12 @@ jobs:
24
24
  # the committed reference artifact path.
25
25
  - name: Ship gate
26
26
  id: ship_gate
27
- uses: hibou04-ops/omegaprompt@v2.1.2
27
+ uses: hibou04-ops/omegaprompt@v2.2.0
28
28
  with:
29
29
  artifact: examples/reference/reference_artifact.json
30
30
  format: json
31
31
  require-generalization: "true"
32
- version: "2.1.2"
32
+ version: "2.2.0"
33
33
 
34
34
  - name: Report verdict
35
35
  if: always()
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "omegaprompt"
7
- version = "2.1.2"
7
+ version = "2.2.0"
8
8
  description = "Provider-neutral prompt calibration engine with sensitivity-ranked meta-axes, hard-gate x soft-score fitness, walk-forward ship gates, guarded/expedition profiles, and explicit capability/risk reporting across Anthropic, OpenAI, Gemini, and local OpenAI-compatible backends. Optional sub-tools (mini-omega-lock, mini-antemortem-cli) distribute separately and plug in via the omegaprompt.preflight interface."
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.11"
@@ -114,7 +114,7 @@ from omegaprompt.runtime import (
114
114
  report,
115
115
  )
116
116
 
117
- __version__ = "2.1.2"
117
+ __version__ = "2.2.0"
118
118
 
119
119
  __all__ = [
120
120
  # domain
@@ -314,6 +314,9 @@ def calibrate(
314
314
  tuning=tuning,
315
315
  adaptation_plan=plan,
316
316
  )
317
+ except ValueError as exc:
318
+ typer.secho(f"INPUT_ERROR: {exc}", fg=typer.colors.RED, err=True)
319
+ raise typer.Exit(code=2) from exc
317
320
  except RuntimeError as exc:
318
321
  message = str(exc)
319
322
  if "requires omega-lock" in message or "Install with" in message:
@@ -45,7 +45,7 @@ declared thresholds) so a future reader can tell ``None`` from
45
45
 
46
46
  from __future__ import annotations
47
47
 
48
- from math import isnan
48
+ from math import isfinite, isnan
49
49
  from typing import Literal
50
50
 
51
51
  from omegaprompt.domain.result import WalkForwardResult
@@ -136,6 +136,15 @@ def evaluate_walk_forward(
136
136
  Default ``"auto"`` preserves historical behaviour: KC-4 is
137
137
  computed only when slices share >=3 ids, otherwise skipped.
138
138
  """
139
+ if validation_mode not in {"auto", "paired", "disjoint"}:
140
+ raise ValueError(f"Unknown validation_mode: {validation_mode!r}")
141
+ if not all(isfinite(v) for v in (train_best_fitness, test_fitness, max_gap, min_kc4)):
142
+ raise ValueError("fitness and gate thresholds must be finite")
143
+ if max_gap < 0 or not -1 <= min_kc4 <= 1:
144
+ raise ValueError("max_gap must be nonnegative and min_kc4 within [-1, 1]")
145
+ for scores in (per_item_train, per_item_test):
146
+ if scores is not None and not all(isfinite(v) for v in scores.values()):
147
+ raise ValueError("per-item scores must be finite")
139
148
  if train_best_fitness == 0:
140
149
  gap = float("inf")
141
150
  gap_status: GapStatus = (
@@ -152,6 +161,8 @@ def evaluate_walk_forward(
152
161
  kc4: float | None = None
153
162
  kc4_status: KC4Status
154
163
  if validation_mode == "disjoint":
164
+ if shared_ids:
165
+ raise ValueError("validation_mode='disjoint' requires disjoint item ids; overlap found")
155
166
  # Caller asserts disjoint split; do not compute KC-4 even if
156
167
  # ids happen to overlap (e.g. id collision across splits is a
157
168
  # bug to surface elsewhere, not a free pass for the gate).
@@ -300,6 +300,8 @@ def classify_traps(
300
300
  judge: str | dict,
301
301
  dataset: str,
302
302
  test: str | None = None,
303
+ validation_mode: str = "auto",
304
+ selected_few_shot_indices: list[int] | None = None,
303
305
  ) -> list[dict]:
304
306
  """Classify the calibration config against known trap patterns.
305
307
 
@@ -315,6 +317,8 @@ def classify_traps(
315
317
  judge: Judge provider.
316
318
  dataset: Path to the train dataset JSONL.
317
319
  test: Optional path to the held-out test JSONL.
320
+ validation_mode: auto/paired/disjoint; paired is repeat measurement,
321
+ not evidence of unseen-input generalization.
318
322
 
319
323
  Returns:
320
324
  List of AnalyticalFinding dicts. Each has ``trap_id``, ``label``
@@ -328,5 +332,7 @@ def classify_traps(
328
332
  judge=judge,
329
333
  dataset=dataset,
330
334
  test=test,
335
+ validation_mode=validation_mode,
336
+ selected_few_shot_indices=selected_few_shot_indices,
331
337
  )
332
338
  return [f.model_dump(mode="json") for f in findings]
@@ -201,6 +201,9 @@ def derive_adaptation_plan(
201
201
  None,
202
202
  )
203
203
  require_manual_review_reasons: list[str] = []
204
+ for metric, state in report.measurement_status.items():
205
+ if state in {"failed", "insufficient_samples"}:
206
+ require_manual_review_reasons.append(f"{metric}: measurement {state}; no quality pass established")
204
207
  if small_sample_finding is not None and small_sample_finding.severity in {
205
208
  PreflightSeverity.HIGH,
206
209
  PreflightSeverity.BLOCKER,
@@ -9,6 +9,7 @@ full sub-units must emit records conforming to these shapes.
9
9
  from __future__ import annotations
10
10
 
11
11
  from enum import Enum
12
+ from typing import Any, Literal
12
13
 
13
14
  from pydantic import BaseModel, ConfigDict, Field
14
15
 
@@ -133,6 +134,12 @@ class PreflightReport(BaseModel):
133
134
  status: PreflightStatus = PreflightStatus.PROCEED
134
135
  blocker_reasons: list[str] = Field(default_factory=list)
135
136
  warnings: list[str] = Field(default_factory=list)
137
+ # Empty maps preserve unknown historical measurement state; warnings are
138
+ # human text and must not serve as the machine-readable measurement flag.
139
+ measurement_status: dict[str, Literal[
140
+ "measured", "unmeasured", "insufficient_samples", "failed", "estimated", "not_applicable"
141
+ ]] = Field(default_factory=dict)
142
+ probe_accounting: dict[str, Any] = Field(default_factory=dict)
136
143
 
137
144
  def any_real_or_new(self) -> bool:
138
145
  return any(f.label in {"REAL", "NEW"} for f in self.analytical_findings)
@@ -14,6 +14,7 @@ Tier 2: measure_sensitivity, grade, preflight, classify_traps.
14
14
  from __future__ import annotations
15
15
 
16
16
  from pathlib import Path
17
+ from inspect import signature
17
18
  from typing import Literal, Union
18
19
 
19
20
  from pydantic import BaseModel, Field
@@ -298,6 +299,16 @@ def calibrate(
298
299
 
299
300
  train_ds = _resolve_dataset(train)
300
301
  test_ds = _resolve_dataset(test) if test is not None else None
302
+ if tuning.validation_mode == "paired":
303
+ train_items = {item.id: (item.input, item.reference) for item in train_ds.items}
304
+ test_items = {item.id: (item.input, item.reference) for item in test_ds.items} if test_ds is not None else {}
305
+ if len(train_items) < 3 or train_items != test_items:
306
+ raise ValueError("validation_mode='paired' requires the same at least 3 item ids and input/reference content")
307
+ if tuning.validation_mode == "disjoint" and test_ds is not None:
308
+ if {item.id for item in train_ds.items} & {item.id for item in test_ds.items}:
309
+ raise ValueError("validation_mode='disjoint' requires disjoint item ids; overlap found")
310
+ if {item.input for item in train_ds.items} & {item.input for item in test_ds.items}:
311
+ raise ValueError("validation_mode='disjoint' requires independent inputs; duplicate content found")
301
312
  rubric_obj = _resolve_rubric(rubric)
302
313
  variants_obj = _resolve_variants(variants)
303
314
  target_provider = _resolve_provider(target)
@@ -947,6 +958,8 @@ def classify_traps(
947
958
  judge: LLMProvider | ProviderSpec | str | dict,
948
959
  dataset: Dataset | Path | str,
949
960
  test: Dataset | Path | str | None = None,
961
+ validation_mode: Literal["auto", "paired", "disjoint"] = "auto",
962
+ selected_few_shot_indices: list[int] | None = None,
950
963
  ) -> list[AnalyticalFinding]:
951
964
  """Classify the calibration config against known trap patterns.
952
965
 
@@ -972,6 +985,17 @@ def classify_traps(
972
985
  train_dataset = _resolve_dataset(dataset)
973
986
  test_dataset = _resolve_dataset(test) if test is not None else None
974
987
 
988
+ if validation_mode not in {"auto", "paired", "disjoint"}:
989
+ raise ValueError(f"Unknown validation_mode: {validation_mode!r}")
990
+ mode_options = {}
991
+ if "validation_mode" in signature(analytical_preflight).parameters:
992
+ mode_options["validation_mode"] = validation_mode
993
+ elif validation_mode != "auto":
994
+ raise ValueError("Explicit validation_mode requires mini-antemortem-cli>=0.11.0")
995
+ if selected_few_shot_indices is not None:
996
+ if "selected_few_shot_indices" not in signature(analytical_preflight).parameters:
997
+ raise ValueError("Selected few-shot context requires mini-antemortem-cli>=0.11.0")
998
+ mode_options["selected_few_shot_indices"] = selected_few_shot_indices
975
999
  return analytical_preflight(
976
1000
  target_provider=target_provider.name,
977
1001
  target_model=target_provider.model,
@@ -981,6 +1005,7 @@ def classify_traps(
981
1005
  test_dataset=test_dataset,
982
1006
  rubric=rubric_obj,
983
1007
  variants=variants_obj,
1008
+ **mode_options,
984
1009
  )
985
1010
 
986
1011