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.
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/CHANGELOG.md +9 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/PKG-INFO +18 -15
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/README.md +17 -14
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/README_KR.md +11 -8
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/ci/ship-gate.yml +2 -2
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/pyproject.toml +1 -1
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/src/omegaprompt/__init__.py +1 -1
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/src/omegaprompt/commands/calibrate.py +3 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/src/omegaprompt/core/walkforward.py +12 -1
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/src/omegaprompt/mcp/server.py +6 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/src/omegaprompt/preflight/adaptation.py +3 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/src/omegaprompt/preflight/contracts.py +7 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/src/omegaprompt/runtime.py +25 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/src/omegaprompt/targets/prompt_target.py +125 -14
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/.gitignore +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/AGENT_TRIGGERS.md +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/AUTHORS.md +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/IP_DEFENSE_CHECKLIST.md +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/LICENSE +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/NOTICE +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/PRE_EXISTING_IP.md +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/README.md +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/_demo_output.txt +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/code_review/README.md +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/code_review/_mainline_outputs/V0_baseline.txt +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/code_review/_mainline_outputs/V1_role_terse.txt +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/code_review/_mainline_outputs/V2_xml_format.txt +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/code_review/_mainline_outputs/V3prime_rules_format.txt +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/code_review/_mainline_outputs/V5_no_issue_guard.txt +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/code_review/_subagent_outputs/V0_baseline.txt +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/code_review/_subagent_outputs/V1_role_terse.txt +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/code_review/_subagent_outputs/V2_xml_format.txt +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/code_review/_subagent_outputs/V3prime_rules_format.txt +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/code_review/_subagent_outputs/V5_no_issue_guard.txt +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/code_review/_subagent_prompts/V0_baseline.txt +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/code_review/_subagent_prompts/V1_role_terse.txt +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/code_review/_subagent_prompts/V2_xml_format.txt +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/code_review/_subagent_prompts/V3prime_rules_format.txt +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/code_review/_subagent_prompts/V5_no_issue_guard.txt +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/code_review/backtest.log +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/code_review/backtest.py +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/code_review/backtest_gemma4.log +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/code_review/backtest_results.json +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/code_review/backtest_results_gemma4.json +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/code_review/backtest_results_v2.json +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/code_review/backtest_results_v2_gemma4.json +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/code_review/backtest_results_v3.json +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/code_review/backtest_results_v3_gemma4.json +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/code_review/backtest_v2.log +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/code_review/backtest_v2_gemma4.log +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/code_review/backtest_v3.log +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/code_review/backtest_v3_gemma4.log +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/code_review/claude_full_validation_results.json +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/code_review/claude_validation_outputs.json +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/code_review/mainline_results.json +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/code_review/production_variant.json +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/code_review/quality_review.json +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/code_review/quality_review_claude_full.json +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/code_review/quality_review_mainline.json +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/code_review/quality_review_v2.json +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/code_review/quality_review_v3.json +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/code_review/rubric.json +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/code_review/score_and_write.py +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/code_review/test.jsonl +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/code_review/train.jsonl +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/code_review/validation_archive.json +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/code_review/variant_0_texts.txt +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/code_review/variant_1_texts.txt +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/code_review/variant_2_texts.txt +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/code_review/variant_3_texts.txt +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/code_review/variant_4_texts.txt +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/code_review/variants.json +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/code_review/variants_v2.json +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/code_review/variants_v3.json +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/code_writing/README.md +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/code_writing/_subagent_outputs/V0_baseline.txt +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/code_writing/_subagent_outputs/V1_role_terse.txt +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/code_writing/_subagent_outputs/V2_format.txt +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/code_writing/_subagent_outputs/V3prime_rules.txt +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/code_writing/_subagent_outputs/V4_guard.txt +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/code_writing/_subagent_prompts/V0_baseline.txt +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/code_writing/_subagent_prompts/V1_role_terse.txt +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/code_writing/_subagent_prompts/V2_format.txt +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/code_writing/_subagent_prompts/V3prime_rules.txt +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/code_writing/_subagent_prompts/V4_guard.txt +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/code_writing/claude_results.json +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/code_writing/quality_review.json +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/code_writing/rubric.json +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/code_writing/train.jsonl +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/code_writing/variants.json +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/commit_message/README.md +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/commit_message/_subagent_outputs/V0_baseline.txt +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/commit_message/_subagent_outputs/V1_role_terse.txt +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/commit_message/_subagent_outputs/V2_format.txt +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/commit_message/_subagent_outputs/V3prime_rules.txt +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/commit_message/_subagent_outputs/V4_guard.txt +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/commit_message/_subagent_prompts/V0_baseline.txt +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/commit_message/_subagent_prompts/V1_role_terse.txt +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/commit_message/_subagent_prompts/V2_format.txt +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/commit_message/_subagent_prompts/V3prime_rules.txt +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/commit_message/_subagent_prompts/V4_guard.txt +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/commit_message/claude_results.json +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/commit_message/quality_review.json +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/commit_message/rubric.json +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/commit_message/train.jsonl +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/commit_message/variants.json +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/debugging/README.md +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/debugging/_subagent_outputs/V0_baseline.txt +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/debugging/_subagent_outputs/V1_role_terse.txt +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/debugging/_subagent_outputs/V2_format.txt +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/debugging/_subagent_outputs/V3prime_rules.txt +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/debugging/_subagent_outputs/V4_guard.txt +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/debugging/_subagent_prompts/V0_baseline.txt +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/debugging/_subagent_prompts/V1_role_terse.txt +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/debugging/_subagent_prompts/V2_format.txt +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/debugging/_subagent_prompts/V3prime_rules.txt +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/debugging/_subagent_prompts/V4_guard.txt +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/debugging/claude_results.json +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/debugging/quality_review.json +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/debugging/rubric.json +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/debugging/train.jsonl +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/debugging/variants.json +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/demo_calibration.py +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/demo_replay.py +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/explanation/README.md +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/explanation/_subagent_outputs/V0_baseline.txt +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/explanation/_subagent_outputs/V1_role_terse.txt +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/explanation/_subagent_outputs/V2_format.txt +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/explanation/_subagent_outputs/V3prime_rules.txt +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/explanation/_subagent_outputs/V4_guard.txt +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/explanation/_subagent_prompts/V0_baseline.txt +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/explanation/_subagent_prompts/V1_role_terse.txt +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/explanation/_subagent_prompts/V2_format.txt +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/explanation/_subagent_prompts/V3prime_rules.txt +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/explanation/_subagent_prompts/V4_guard.txt +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/explanation/claude_results.json +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/explanation/quality_review.json +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/explanation/rubric.json +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/explanation/train.jsonl +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/explanation/variants.json +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/refactoring/README.md +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/refactoring/_subagent_outputs/V0_baseline.txt +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/refactoring/_subagent_outputs/V1_role_terse.txt +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/refactoring/_subagent_outputs/V2_format.txt +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/refactoring/_subagent_outputs/V3prime_rules.txt +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/refactoring/_subagent_outputs/V4_guard.txt +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/refactoring/_subagent_prompts/V0_baseline.txt +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/refactoring/_subagent_prompts/V1_role_terse.txt +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/refactoring/_subagent_prompts/V2_format.txt +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/refactoring/_subagent_prompts/V3prime_rules.txt +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/refactoring/_subagent_prompts/V4_guard.txt +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/refactoring/claude_results.json +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/refactoring/quality_review.json +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/refactoring/rubric.json +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/refactoring/train.jsonl +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/refactoring/variants.json +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/reference/README.md +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/reference/golden_manifest.json +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/reference/reference_adaptation_plan.json +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/reference/reference_artifact.json +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/reference/reference_diff_regression.json +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/reference/reference_fail_hard_gates.json +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/reference/reference_fail_kc4_gate.json +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/reference/reference_preflight_report.json +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/reference/reference_provider_degradation.json +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/reference/reproduce_preflight_demo.py +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/reference/reproduce_reference_artifact.py +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/rubric_example.json +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/sample_dataset.jsonl +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/summarization/README.md +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/summarization/_subagent_outputs/V0_baseline.txt +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/summarization/_subagent_outputs/V1_role_terse.txt +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/summarization/_subagent_outputs/V2_format.txt +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/summarization/_subagent_outputs/V3prime_rules.txt +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/summarization/_subagent_outputs/V4_guard.txt +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/summarization/_subagent_prompts/V0_baseline.txt +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/summarization/_subagent_prompts/V1_role_terse.txt +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/summarization/_subagent_prompts/V2_format.txt +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/summarization/_subagent_prompts/V3prime_rules.txt +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/summarization/_subagent_prompts/V4_guard.txt +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/summarization/claude_results.json +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/summarization/quality_review.json +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/summarization/rubric.json +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/summarization/train.jsonl +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/summarization/variants.json +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/test_writing/README.md +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/test_writing/_subagent_outputs/V0_baseline.txt +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/test_writing/_subagent_outputs/V1_role_terse.txt +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/test_writing/_subagent_outputs/V2_format.txt +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/test_writing/_subagent_outputs/V3prime_rules.txt +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/test_writing/_subagent_outputs/V4_guard.txt +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/test_writing/_subagent_prompts/V0_baseline.txt +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/test_writing/_subagent_prompts/V1_role_terse.txt +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/test_writing/_subagent_prompts/V2_format.txt +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/test_writing/_subagent_prompts/V3prime_rules.txt +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/test_writing/_subagent_prompts/V4_guard.txt +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/test_writing/claude_results.json +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/test_writing/quality_review.json +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/test_writing/rubric.json +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/test_writing/train.jsonl +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/test_writing/variants.json +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/translation/README.md +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/translation/_subagent_outputs/V0_baseline.txt +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/translation/_subagent_outputs/V1_role_terse.txt +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/translation/_subagent_outputs/V2_format.txt +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/translation/_subagent_outputs/V3prime_rules.txt +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/translation/_subagent_outputs/V4_guard.txt +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/translation/_subagent_prompts/V0_baseline.txt +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/translation/_subagent_prompts/V1_role_terse.txt +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/translation/_subagent_prompts/V2_format.txt +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/translation/_subagent_prompts/V3prime_rules.txt +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/translation/_subagent_prompts/V4_guard.txt +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/translation/claude_results.json +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/translation/quality_review.json +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/translation/rubric.json +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/translation/train.jsonl +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/translation/variants.json +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/examples/variants_example.json +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/src/omegacal/__init__.py +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/src/omegacal/__main__.py +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/src/omegacal/cli.py +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/src/omegaprompt/__main__.py +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/src/omegaprompt/api.py +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/src/omegaprompt/cli.py +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/src/omegaprompt/commands/__init__.py +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/src/omegaprompt/commands/check_artifact.py +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/src/omegaprompt/commands/diff.py +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/src/omegaprompt/commands/gate.py +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/src/omegaprompt/commands/report.py +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/src/omegaprompt/core/__init__.py +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/src/omegaprompt/core/artifact.py +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/src/omegaprompt/core/artifact_integrity.py +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/src/omegaprompt/core/fitness.py +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/src/omegaprompt/core/gate.py +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/src/omegaprompt/core/overfit.py +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/src/omegaprompt/core/profiles.py +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/src/omegaprompt/core/risk.py +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/src/omegaprompt/core/sensitivity.py +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/src/omegaprompt/dataset.py +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/src/omegaprompt/domain/__init__.py +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/src/omegaprompt/domain/dataset.py +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/src/omegaprompt/domain/enums.py +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/src/omegaprompt/domain/judge.py +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/src/omegaprompt/domain/params.py +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/src/omegaprompt/domain/profiles.py +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/src/omegaprompt/domain/result.py +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/src/omegaprompt/fitness.py +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/src/omegaprompt/judge.py +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/src/omegaprompt/judges/__init__.py +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/src/omegaprompt/judges/base.py +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/src/omegaprompt/judges/ensemble_judge.py +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/src/omegaprompt/judges/llm_judge.py +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/src/omegaprompt/judges/rule_judge.py +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/src/omegaprompt/mcp/__init__.py +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/src/omegaprompt/mcp/__main__.py +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/src/omegaprompt/preflight/__init__.py +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/src/omegaprompt/prompts.py +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/src/omegaprompt/providers/__init__.py +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/src/omegaprompt/providers/anthropic_provider.py +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/src/omegaprompt/providers/base.py +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/src/omegaprompt/providers/factory.py +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/src/omegaprompt/providers/gemini_provider.py +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/src/omegaprompt/providers/local_provider.py +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/src/omegaprompt/providers/ollama_provider.py +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/src/omegaprompt/providers/openai_provider.py +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/src/omegaprompt/reporting/__init__.py +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/src/omegaprompt/reporting/html.py +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/src/omegaprompt/reporting/markdown.py +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/src/omegaprompt/reporting/summary.py +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/src/omegaprompt/schema.py +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/src/omegaprompt/target.py +0 -0
- {omegaprompt-2.1.2 → omegaprompt-2.2.0}/src/omegaprompt/targets/__init__.py +0 -0
- {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.
|
|
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
|
-
**
|
|
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
|
[](https://github.com/hibou04-ops/omegaprompt/actions/workflows/ci.yml)
|
|
252
252
|
[](LICENSE)
|
|
@@ -257,6 +257,8 @@ Description-Content-Type: text/markdown
|
|
|
257
257
|
[](#103-mcp-server-claude-code-cursor)
|
|
258
258
|
[](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.
|
|
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.
|
|
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`;
|
|
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
|
|
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
|
-
>
|
|
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
|
-
**
|
|
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.
|
|
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
|
-
- **
|
|
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
|
|
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
|
|
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.
|
|
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
|
|
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
|
-
**
|
|
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
|
[](https://github.com/hibou04-ops/omegaprompt/actions/workflows/ci.yml)
|
|
6
6
|
[](LICENSE)
|
|
@@ -11,6 +11,8 @@
|
|
|
11
11
|
[](#103-mcp-server-claude-code-cursor)
|
|
12
12
|
[](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.
|
|
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.
|
|
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`;
|
|
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
|
|
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
|
-
>
|
|
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
|
-
**
|
|
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.
|
|
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
|
-
- **
|
|
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
|
|
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
|
|
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.
|
|
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
|
|
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
|
-
|
|
3
|
+
**명시적 gate를 갖춘 provider 중립 프롬프트 보정.** train 데이터에서 설정을 선택하고 별도로 제공한 test 데이터에서 gap·hard gate·실행 정책을 검사합니다. paired 재측정은 반복 일관성이며, 독립 holdout은 선택에 사용하지 않은 사례가 필요합니다.
|
|
4
4
|
|
|
5
5
|
[](https://github.com/hibou04-ops/omegaprompt/actions/workflows/ci.yml)
|
|
6
6
|
[](LICENSE)
|
|
@@ -11,6 +11,8 @@
|
|
|
11
11
|
[](https://github.com/hibou04-ops/omegaprompt/blob/main/README.md#103-mcp-server-claude-code-cursor)
|
|
12
12
|
[](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.
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
-
|
|
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.
|
|
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.
|
|
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.
|
|
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"
|
|
@@ -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
|
|