promptcheckup 1.0.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 (276) hide show
  1. promptcheckup-1.0.0/.github/workflows/ci.yml +24 -0
  2. promptcheckup-1.0.0/.github/workflows/release.yml +45 -0
  3. promptcheckup-1.0.0/.gitignore +11 -0
  4. promptcheckup-1.0.0/CHANGELOG.md +33 -0
  5. promptcheckup-1.0.0/CITATION.cff +79 -0
  6. promptcheckup-1.0.0/DESIGN.md +549 -0
  7. promptcheckup-1.0.0/LICENSE +202 -0
  8. promptcheckup-1.0.0/PKG-INFO +291 -0
  9. promptcheckup-1.0.0/README.md +265 -0
  10. promptcheckup-1.0.0/benchmarks/charts.py +414 -0
  11. promptcheckup-1.0.0/benchmarks/results/checkup_simulation.csv +10401 -0
  12. promptcheckup-1.0.0/benchmarks/results/checkup_timeline.svg +150 -0
  13. promptcheckup-1.0.0/benchmarks/results/false_positive.csv +49 -0
  14. promptcheckup-1.0.0/benchmarks/results/false_positive.svg +194 -0
  15. promptcheckup-1.0.0/benchmarks/results/naive_vs_paired.csv +3 -0
  16. promptcheckup-1.0.0/benchmarks/results/naive_vs_paired.svg +42 -0
  17. promptcheckup-1.0.0/benchmarks/results/power.csv +16 -0
  18. promptcheckup-1.0.0/benchmarks/results/power.svg +87 -0
  19. promptcheckup-1.0.0/benchmarks/run_checkup_simulation.py +432 -0
  20. promptcheckup-1.0.0/benchmarks/run_gate_benchmark.py +148 -0
  21. promptcheckup-1.0.0/docs/connect-your-agent.md +447 -0
  22. promptcheckup-1.0.0/examples/connect/anthropic_sdk/README.md +12 -0
  23. promptcheckup-1.0.0/examples/connect/anthropic_sdk/anthropic_agent.py +12 -0
  24. promptcheckup-1.0.0/examples/connect/anthropic_sdk/cases/manual.jsonl +3 -0
  25. promptcheckup-1.0.0/examples/connect/anthropic_sdk/promptcheckup.toml +25 -0
  26. promptcheckup-1.0.0/examples/connect/anthropic_sdk/prompts/system.md +1 -0
  27. promptcheckup-1.0.0/examples/connect/coding-agent-instructions.md +6 -0
  28. promptcheckup-1.0.0/examples/connect/doctor-output.txt +9 -0
  29. promptcheckup-1.0.0/examples/connect/node_cmd/README.md +11 -0
  30. promptcheckup-1.0.0/examples/connect/node_cmd/agent.mjs +5 -0
  31. promptcheckup-1.0.0/examples/connect/node_cmd/cases/manual.jsonl +20 -0
  32. promptcheckup-1.0.0/examples/connect/node_cmd/input.json +1 -0
  33. promptcheckup-1.0.0/examples/connect/node_cmd/node_score.py +5 -0
  34. promptcheckup-1.0.0/examples/connect/node_cmd/output.json +1 -0
  35. promptcheckup-1.0.0/examples/connect/node_cmd/promptcheckup.toml +20 -0
  36. promptcheckup-1.0.0/examples/connect/node_cmd/prompts/system.md +1 -0
  37. promptcheckup-1.0.0/examples/connect/openai_sdk/README.md +11 -0
  38. promptcheckup-1.0.0/examples/connect/openai_sdk/cases/manual.jsonl +3 -0
  39. promptcheckup-1.0.0/examples/connect/openai_sdk/openai_agent.py +13 -0
  40. promptcheckup-1.0.0/examples/connect/openai_sdk/promptcheckup.toml +25 -0
  41. promptcheckup-1.0.0/examples/connect/openai_sdk/prompts/system.md +1 -0
  42. promptcheckup-1.0.0/examples/connect/plain/README.md +12 -0
  43. promptcheckup-1.0.0/examples/connect/plain/after.py +8 -0
  44. promptcheckup-1.0.0/examples/connect/plain/before.py +8 -0
  45. promptcheckup-1.0.0/examples/connect/plain/cases/manual.jsonl +20 -0
  46. promptcheckup-1.0.0/examples/connect/plain/first-gate.sh +5 -0
  47. promptcheckup-1.0.0/examples/connect/plain/old-system.md +1 -0
  48. promptcheckup-1.0.0/examples/connect/plain/plain_agent.py +14 -0
  49. promptcheckup-1.0.0/examples/connect/plain/promptcheckup.toml +20 -0
  50. promptcheckup-1.0.0/examples/connect/plain/prompts/system.md +1 -0
  51. promptcheckup-1.0.0/examples/connect/plain/recording.py +19 -0
  52. promptcheckup-1.0.0/examples/connect/testing/README.md +9 -0
  53. promptcheckup-1.0.0/examples/connect/testing/test_no_lookahead.py +14 -0
  54. promptcheckup-1.0.0/examples/connect/testing/test_prompt_change.py +15 -0
  55. promptcheckup-1.0.0/examples/planted/README.md +19 -0
  56. promptcheckup-1.0.0/examples/planted/planted.py +59 -0
  57. promptcheckup-1.0.0/examples/support-bot/README.md +61 -0
  58. promptcheckup-1.0.0/examples/support-bot/bot/__init__.py +0 -0
  59. promptcheckup-1.0.0/examples/support-bot/bot/agent.py +56 -0
  60. promptcheckup-1.0.0/examples/support-bot/cases/recorded.jsonl +30 -0
  61. promptcheckup-1.0.0/examples/support-bot/promptcheckup.toml +29 -0
  62. promptcheckup-1.0.0/examples/support-bot/prompts/old-system.md +1 -0
  63. promptcheckup-1.0.0/examples/support-bot/prompts/system.md +1 -0
  64. promptcheckup-1.0.0/examples/support-bot/results/report-claude-haiku-5-5.md +21 -0
  65. promptcheckup-1.0.0/examples/support-bot/results/report-claude-opus-5-5.md +21 -0
  66. promptcheckup-1.0.0/examples/support-bot/results/report-claude-sonnet-5-5.md +21 -0
  67. promptcheckup-1.0.0/examples/trading/README.md +159 -0
  68. promptcheckup-1.0.0/examples/trading/cases/cases.jsonl +60 -0
  69. promptcheckup-1.0.0/examples/trading/check_policies.py +86 -0
  70. promptcheckup-1.0.0/examples/trading/data/market.csv +2401 -0
  71. promptcheckup-1.0.0/examples/trading/market.py +101 -0
  72. promptcheckup-1.0.0/examples/trading/pnl.py +39 -0
  73. promptcheckup-1.0.0/examples/trading/promptcheckup.toml +20 -0
  74. promptcheckup-1.0.0/examples/trading/prompts/old-policy.md +3 -0
  75. promptcheckup-1.0.0/examples/trading/prompts/policy.md +5 -0
  76. promptcheckup-1.0.0/examples/trading/record.py +63 -0
  77. promptcheckup-1.0.0/examples/trading/recordings/claude-haiku-5-5/3612022f3c95bbd1/01bd7c2ac042.json +1 -0
  78. promptcheckup-1.0.0/examples/trading/recordings/claude-haiku-5-5/3612022f3c95bbd1/067b11c15fb8.json +1 -0
  79. promptcheckup-1.0.0/examples/trading/recordings/claude-haiku-5-5/3612022f3c95bbd1/0f0ac4cd3644.json +1 -0
  80. promptcheckup-1.0.0/examples/trading/recordings/claude-haiku-5-5/3612022f3c95bbd1/100416484f40.json +1 -0
  81. promptcheckup-1.0.0/examples/trading/recordings/claude-haiku-5-5/3612022f3c95bbd1/13512bc73b80.json +1 -0
  82. promptcheckup-1.0.0/examples/trading/recordings/claude-haiku-5-5/3612022f3c95bbd1/161acf3ae713.json +1 -0
  83. promptcheckup-1.0.0/examples/trading/recordings/claude-haiku-5-5/3612022f3c95bbd1/166cb1d5d2d5.json +1 -0
  84. promptcheckup-1.0.0/examples/trading/recordings/claude-haiku-5-5/3612022f3c95bbd1/17a5bd38e9f3.json +1 -0
  85. promptcheckup-1.0.0/examples/trading/recordings/claude-haiku-5-5/3612022f3c95bbd1/1c2960a75dc3.json +1 -0
  86. promptcheckup-1.0.0/examples/trading/recordings/claude-haiku-5-5/3612022f3c95bbd1/1df6ba6c1055.json +1 -0
  87. promptcheckup-1.0.0/examples/trading/recordings/claude-haiku-5-5/3612022f3c95bbd1/22e44e71c342.json +1 -0
  88. promptcheckup-1.0.0/examples/trading/recordings/claude-haiku-5-5/3612022f3c95bbd1/245fd3e6d75a.json +1 -0
  89. promptcheckup-1.0.0/examples/trading/recordings/claude-haiku-5-5/3612022f3c95bbd1/2841cf9d151f.json +1 -0
  90. promptcheckup-1.0.0/examples/trading/recordings/claude-haiku-5-5/3612022f3c95bbd1/2b35866a8ffa.json +1 -0
  91. promptcheckup-1.0.0/examples/trading/recordings/claude-haiku-5-5/3612022f3c95bbd1/2b7ed9847839.json +1 -0
  92. promptcheckup-1.0.0/examples/trading/recordings/claude-haiku-5-5/3612022f3c95bbd1/34683277cc35.json +1 -0
  93. promptcheckup-1.0.0/examples/trading/recordings/claude-haiku-5-5/3612022f3c95bbd1/3dd0fa562137.json +1 -0
  94. promptcheckup-1.0.0/examples/trading/recordings/claude-haiku-5-5/3612022f3c95bbd1/4008e49a9ed7.json +1 -0
  95. promptcheckup-1.0.0/examples/trading/recordings/claude-haiku-5-5/3612022f3c95bbd1/449e478647ce.json +1 -0
  96. promptcheckup-1.0.0/examples/trading/recordings/claude-haiku-5-5/3612022f3c95bbd1/4959b2c662f7.json +1 -0
  97. promptcheckup-1.0.0/examples/trading/recordings/claude-haiku-5-5/3612022f3c95bbd1/4c1eeeda85f1.json +1 -0
  98. promptcheckup-1.0.0/examples/trading/recordings/claude-haiku-5-5/3612022f3c95bbd1/4cdd4bb99f8e.json +1 -0
  99. promptcheckup-1.0.0/examples/trading/recordings/claude-haiku-5-5/3612022f3c95bbd1/4d2541303368.json +1 -0
  100. promptcheckup-1.0.0/examples/trading/recordings/claude-haiku-5-5/3612022f3c95bbd1/5038b1751c2e.json +1 -0
  101. promptcheckup-1.0.0/examples/trading/recordings/claude-haiku-5-5/3612022f3c95bbd1/58ebfe6c9b81.json +1 -0
  102. promptcheckup-1.0.0/examples/trading/recordings/claude-haiku-5-5/3612022f3c95bbd1/614bdd2af8fa.json +1 -0
  103. promptcheckup-1.0.0/examples/trading/recordings/claude-haiku-5-5/3612022f3c95bbd1/6346f029f65a.json +1 -0
  104. promptcheckup-1.0.0/examples/trading/recordings/claude-haiku-5-5/3612022f3c95bbd1/63c06acd5d03.json +1 -0
  105. promptcheckup-1.0.0/examples/trading/recordings/claude-haiku-5-5/3612022f3c95bbd1/667a94c09acb.json +1 -0
  106. promptcheckup-1.0.0/examples/trading/recordings/claude-haiku-5-5/3612022f3c95bbd1/7086b7c80810.json +1 -0
  107. promptcheckup-1.0.0/examples/trading/recordings/claude-haiku-5-5/3612022f3c95bbd1/7af22a918efc.json +1 -0
  108. promptcheckup-1.0.0/examples/trading/recordings/claude-haiku-5-5/3612022f3c95bbd1/7cb92c3422a4.json +1 -0
  109. promptcheckup-1.0.0/examples/trading/recordings/claude-haiku-5-5/3612022f3c95bbd1/87e4bcbd9c8b.json +1 -0
  110. promptcheckup-1.0.0/examples/trading/recordings/claude-haiku-5-5/3612022f3c95bbd1/88c46c040b42.json +1 -0
  111. promptcheckup-1.0.0/examples/trading/recordings/claude-haiku-5-5/3612022f3c95bbd1/8920712d2c53.json +1 -0
  112. promptcheckup-1.0.0/examples/trading/recordings/claude-haiku-5-5/3612022f3c95bbd1/892c8f4cac1e.json +1 -0
  113. promptcheckup-1.0.0/examples/trading/recordings/claude-haiku-5-5/3612022f3c95bbd1/8fcd60da9f0c.json +1 -0
  114. promptcheckup-1.0.0/examples/trading/recordings/claude-haiku-5-5/3612022f3c95bbd1/922ac044fcd2.json +1 -0
  115. promptcheckup-1.0.0/examples/trading/recordings/claude-haiku-5-5/3612022f3c95bbd1/a0346a176e5a.json +1 -0
  116. promptcheckup-1.0.0/examples/trading/recordings/claude-haiku-5-5/3612022f3c95bbd1/aa77760b43f9.json +1 -0
  117. promptcheckup-1.0.0/examples/trading/recordings/claude-haiku-5-5/3612022f3c95bbd1/ae3fa636c0ba.json +1 -0
  118. promptcheckup-1.0.0/examples/trading/recordings/claude-haiku-5-5/3612022f3c95bbd1/afd2ae123d66.json +1 -0
  119. promptcheckup-1.0.0/examples/trading/recordings/claude-haiku-5-5/3612022f3c95bbd1/b0577dce0228.json +1 -0
  120. promptcheckup-1.0.0/examples/trading/recordings/claude-haiku-5-5/3612022f3c95bbd1/b297c58a46ac.json +1 -0
  121. promptcheckup-1.0.0/examples/trading/recordings/claude-haiku-5-5/3612022f3c95bbd1/b9675d4e266c.json +1 -0
  122. promptcheckup-1.0.0/examples/trading/recordings/claude-haiku-5-5/3612022f3c95bbd1/c0fa4b2720d4.json +1 -0
  123. promptcheckup-1.0.0/examples/trading/recordings/claude-haiku-5-5/3612022f3c95bbd1/c1e3a020557f.json +1 -0
  124. promptcheckup-1.0.0/examples/trading/recordings/claude-haiku-5-5/3612022f3c95bbd1/c88fb70201ff.json +1 -0
  125. promptcheckup-1.0.0/examples/trading/recordings/claude-haiku-5-5/3612022f3c95bbd1/d0bf1c87a46b.json +1 -0
  126. promptcheckup-1.0.0/examples/trading/recordings/claude-haiku-5-5/3612022f3c95bbd1/d0f7ad1fc6ac.json +1 -0
  127. promptcheckup-1.0.0/examples/trading/recordings/claude-haiku-5-5/3612022f3c95bbd1/d3f4b81f7e6d.json +1 -0
  128. promptcheckup-1.0.0/examples/trading/recordings/claude-haiku-5-5/3612022f3c95bbd1/d5b6b0f5954d.json +1 -0
  129. promptcheckup-1.0.0/examples/trading/recordings/claude-haiku-5-5/3612022f3c95bbd1/dc2fa3b3f502.json +1 -0
  130. promptcheckup-1.0.0/examples/trading/recordings/claude-haiku-5-5/3612022f3c95bbd1/e8acda23a199.json +1 -0
  131. promptcheckup-1.0.0/examples/trading/recordings/claude-haiku-5-5/3612022f3c95bbd1/ecdfcd980f56.json +1 -0
  132. promptcheckup-1.0.0/examples/trading/recordings/claude-haiku-5-5/3612022f3c95bbd1/ecf1f2ea83ce.json +1 -0
  133. promptcheckup-1.0.0/examples/trading/recordings/claude-haiku-5-5/3612022f3c95bbd1/eecc0dd052cb.json +1 -0
  134. promptcheckup-1.0.0/examples/trading/recordings/claude-haiku-5-5/3612022f3c95bbd1/f70f5bdee783.json +1 -0
  135. promptcheckup-1.0.0/examples/trading/recordings/claude-haiku-5-5/3612022f3c95bbd1/f85a7e1cec8a.json +1 -0
  136. promptcheckup-1.0.0/examples/trading/recordings/claude-haiku-5-5/3612022f3c95bbd1/ff151ec1d50c.json +1 -0
  137. promptcheckup-1.0.0/examples/trading/recordings/claude-haiku-5-5/3f4b4b039d36e74a/01bd7c2ac042.json +1 -0
  138. promptcheckup-1.0.0/examples/trading/recordings/claude-haiku-5-5/3f4b4b039d36e74a/067b11c15fb8.json +1 -0
  139. promptcheckup-1.0.0/examples/trading/recordings/claude-haiku-5-5/3f4b4b039d36e74a/0f0ac4cd3644.json +1 -0
  140. promptcheckup-1.0.0/examples/trading/recordings/claude-haiku-5-5/3f4b4b039d36e74a/100416484f40.json +1 -0
  141. promptcheckup-1.0.0/examples/trading/recordings/claude-haiku-5-5/3f4b4b039d36e74a/13512bc73b80.json +1 -0
  142. promptcheckup-1.0.0/examples/trading/recordings/claude-haiku-5-5/3f4b4b039d36e74a/161acf3ae713.json +1 -0
  143. promptcheckup-1.0.0/examples/trading/recordings/claude-haiku-5-5/3f4b4b039d36e74a/166cb1d5d2d5.json +1 -0
  144. promptcheckup-1.0.0/examples/trading/recordings/claude-haiku-5-5/3f4b4b039d36e74a/17a5bd38e9f3.json +1 -0
  145. promptcheckup-1.0.0/examples/trading/recordings/claude-haiku-5-5/3f4b4b039d36e74a/1c2960a75dc3.json +1 -0
  146. promptcheckup-1.0.0/examples/trading/recordings/claude-haiku-5-5/3f4b4b039d36e74a/1df6ba6c1055.json +1 -0
  147. promptcheckup-1.0.0/examples/trading/recordings/claude-haiku-5-5/3f4b4b039d36e74a/22e44e71c342.json +1 -0
  148. promptcheckup-1.0.0/examples/trading/recordings/claude-haiku-5-5/3f4b4b039d36e74a/245fd3e6d75a.json +1 -0
  149. promptcheckup-1.0.0/examples/trading/recordings/claude-haiku-5-5/3f4b4b039d36e74a/2841cf9d151f.json +1 -0
  150. promptcheckup-1.0.0/examples/trading/recordings/claude-haiku-5-5/3f4b4b039d36e74a/2b35866a8ffa.json +1 -0
  151. promptcheckup-1.0.0/examples/trading/recordings/claude-haiku-5-5/3f4b4b039d36e74a/2b7ed9847839.json +1 -0
  152. promptcheckup-1.0.0/examples/trading/recordings/claude-haiku-5-5/3f4b4b039d36e74a/34683277cc35.json +1 -0
  153. promptcheckup-1.0.0/examples/trading/recordings/claude-haiku-5-5/3f4b4b039d36e74a/3dd0fa562137.json +1 -0
  154. promptcheckup-1.0.0/examples/trading/recordings/claude-haiku-5-5/3f4b4b039d36e74a/4008e49a9ed7.json +1 -0
  155. promptcheckup-1.0.0/examples/trading/recordings/claude-haiku-5-5/3f4b4b039d36e74a/449e478647ce.json +1 -0
  156. promptcheckup-1.0.0/examples/trading/recordings/claude-haiku-5-5/3f4b4b039d36e74a/4959b2c662f7.json +1 -0
  157. promptcheckup-1.0.0/examples/trading/recordings/claude-haiku-5-5/3f4b4b039d36e74a/4c1eeeda85f1.json +1 -0
  158. promptcheckup-1.0.0/examples/trading/recordings/claude-haiku-5-5/3f4b4b039d36e74a/4cdd4bb99f8e.json +1 -0
  159. promptcheckup-1.0.0/examples/trading/recordings/claude-haiku-5-5/3f4b4b039d36e74a/4d2541303368.json +1 -0
  160. promptcheckup-1.0.0/examples/trading/recordings/claude-haiku-5-5/3f4b4b039d36e74a/5038b1751c2e.json +1 -0
  161. promptcheckup-1.0.0/examples/trading/recordings/claude-haiku-5-5/3f4b4b039d36e74a/58ebfe6c9b81.json +1 -0
  162. promptcheckup-1.0.0/examples/trading/recordings/claude-haiku-5-5/3f4b4b039d36e74a/614bdd2af8fa.json +1 -0
  163. promptcheckup-1.0.0/examples/trading/recordings/claude-haiku-5-5/3f4b4b039d36e74a/6346f029f65a.json +1 -0
  164. promptcheckup-1.0.0/examples/trading/recordings/claude-haiku-5-5/3f4b4b039d36e74a/63c06acd5d03.json +1 -0
  165. promptcheckup-1.0.0/examples/trading/recordings/claude-haiku-5-5/3f4b4b039d36e74a/667a94c09acb.json +1 -0
  166. promptcheckup-1.0.0/examples/trading/recordings/claude-haiku-5-5/3f4b4b039d36e74a/7086b7c80810.json +1 -0
  167. promptcheckup-1.0.0/examples/trading/recordings/claude-haiku-5-5/3f4b4b039d36e74a/7af22a918efc.json +1 -0
  168. promptcheckup-1.0.0/examples/trading/recordings/claude-haiku-5-5/3f4b4b039d36e74a/7cb92c3422a4.json +1 -0
  169. promptcheckup-1.0.0/examples/trading/recordings/claude-haiku-5-5/3f4b4b039d36e74a/87e4bcbd9c8b.json +1 -0
  170. promptcheckup-1.0.0/examples/trading/recordings/claude-haiku-5-5/3f4b4b039d36e74a/88c46c040b42.json +1 -0
  171. promptcheckup-1.0.0/examples/trading/recordings/claude-haiku-5-5/3f4b4b039d36e74a/8920712d2c53.json +1 -0
  172. promptcheckup-1.0.0/examples/trading/recordings/claude-haiku-5-5/3f4b4b039d36e74a/892c8f4cac1e.json +1 -0
  173. promptcheckup-1.0.0/examples/trading/recordings/claude-haiku-5-5/3f4b4b039d36e74a/8fcd60da9f0c.json +1 -0
  174. promptcheckup-1.0.0/examples/trading/recordings/claude-haiku-5-5/3f4b4b039d36e74a/922ac044fcd2.json +1 -0
  175. promptcheckup-1.0.0/examples/trading/recordings/claude-haiku-5-5/3f4b4b039d36e74a/a0346a176e5a.json +1 -0
  176. promptcheckup-1.0.0/examples/trading/recordings/claude-haiku-5-5/3f4b4b039d36e74a/aa77760b43f9.json +1 -0
  177. promptcheckup-1.0.0/examples/trading/recordings/claude-haiku-5-5/3f4b4b039d36e74a/ae3fa636c0ba.json +1 -0
  178. promptcheckup-1.0.0/examples/trading/recordings/claude-haiku-5-5/3f4b4b039d36e74a/afd2ae123d66.json +1 -0
  179. promptcheckup-1.0.0/examples/trading/recordings/claude-haiku-5-5/3f4b4b039d36e74a/b0577dce0228.json +1 -0
  180. promptcheckup-1.0.0/examples/trading/recordings/claude-haiku-5-5/3f4b4b039d36e74a/b297c58a46ac.json +1 -0
  181. promptcheckup-1.0.0/examples/trading/recordings/claude-haiku-5-5/3f4b4b039d36e74a/b9675d4e266c.json +1 -0
  182. promptcheckup-1.0.0/examples/trading/recordings/claude-haiku-5-5/3f4b4b039d36e74a/c0fa4b2720d4.json +1 -0
  183. promptcheckup-1.0.0/examples/trading/recordings/claude-haiku-5-5/3f4b4b039d36e74a/c1e3a020557f.json +1 -0
  184. promptcheckup-1.0.0/examples/trading/recordings/claude-haiku-5-5/3f4b4b039d36e74a/c88fb70201ff.json +1 -0
  185. promptcheckup-1.0.0/examples/trading/recordings/claude-haiku-5-5/3f4b4b039d36e74a/d0bf1c87a46b.json +1 -0
  186. promptcheckup-1.0.0/examples/trading/recordings/claude-haiku-5-5/3f4b4b039d36e74a/d0f7ad1fc6ac.json +1 -0
  187. promptcheckup-1.0.0/examples/trading/recordings/claude-haiku-5-5/3f4b4b039d36e74a/d3f4b81f7e6d.json +1 -0
  188. promptcheckup-1.0.0/examples/trading/recordings/claude-haiku-5-5/3f4b4b039d36e74a/d5b6b0f5954d.json +1 -0
  189. promptcheckup-1.0.0/examples/trading/recordings/claude-haiku-5-5/3f4b4b039d36e74a/dc2fa3b3f502.json +1 -0
  190. promptcheckup-1.0.0/examples/trading/recordings/claude-haiku-5-5/3f4b4b039d36e74a/e8acda23a199.json +1 -0
  191. promptcheckup-1.0.0/examples/trading/recordings/claude-haiku-5-5/3f4b4b039d36e74a/ecdfcd980f56.json +1 -0
  192. promptcheckup-1.0.0/examples/trading/recordings/claude-haiku-5-5/3f4b4b039d36e74a/ecf1f2ea83ce.json +1 -0
  193. promptcheckup-1.0.0/examples/trading/recordings/claude-haiku-5-5/3f4b4b039d36e74a/eecc0dd052cb.json +1 -0
  194. promptcheckup-1.0.0/examples/trading/recordings/claude-haiku-5-5/3f4b4b039d36e74a/f70f5bdee783.json +1 -0
  195. promptcheckup-1.0.0/examples/trading/recordings/claude-haiku-5-5/3f4b4b039d36e74a/f85a7e1cec8a.json +1 -0
  196. promptcheckup-1.0.0/examples/trading/recordings/claude-haiku-5-5/3f4b4b039d36e74a/ff151ec1d50c.json +1 -0
  197. promptcheckup-1.0.0/examples/trading/results/report-claude-haiku-5-5.md +19 -0
  198. promptcheckup-1.0.0/examples/trading/trader.py +133 -0
  199. promptcheckup-1.0.0/pyproject.toml +59 -0
  200. promptcheckup-1.0.0/src/promptcheckup/__init__.py +7 -0
  201. promptcheckup-1.0.0/src/promptcheckup/checkup/__init__.py +62 -0
  202. promptcheckup-1.0.0/src/promptcheckup/checkup/checkup.py +336 -0
  203. promptcheckup-1.0.0/src/promptcheckup/checkup/evaluate.py +264 -0
  204. promptcheckup-1.0.0/src/promptcheckup/checkup/evolve.py +178 -0
  205. promptcheckup-1.0.0/src/promptcheckup/checkup/failures.py +65 -0
  206. promptcheckup-1.0.0/src/promptcheckup/checkup/ledger.py +82 -0
  207. promptcheckup-1.0.0/src/promptcheckup/checkup/report.py +390 -0
  208. promptcheckup-1.0.0/src/promptcheckup/checkup/snapshot.py +81 -0
  209. promptcheckup-1.0.0/src/promptcheckup/cli/__init__.py +5 -0
  210. promptcheckup-1.0.0/src/promptcheckup/cli/checkup.py +107 -0
  211. promptcheckup-1.0.0/src/promptcheckup/cli/config.py +218 -0
  212. promptcheckup-1.0.0/src/promptcheckup/cli/doctor.py +316 -0
  213. promptcheckup-1.0.0/src/promptcheckup/cli/evolve.py +93 -0
  214. promptcheckup-1.0.0/src/promptcheckup/cli/gate.py +117 -0
  215. promptcheckup-1.0.0/src/promptcheckup/cli/init.py +42 -0
  216. promptcheckup-1.0.0/src/promptcheckup/cli/main.py +91 -0
  217. promptcheckup-1.0.0/src/promptcheckup/cli/project.py +103 -0
  218. promptcheckup-1.0.0/src/promptcheckup/cli/prompts.py +91 -0
  219. promptcheckup-1.0.0/src/promptcheckup/cli/templates/example.jsonl +3 -0
  220. promptcheckup-1.0.0/src/promptcheckup/cli/templates/promptcheckup-checkup.yml +75 -0
  221. promptcheckup-1.0.0/src/promptcheckup/cli/templates/promptcheckup-gate.yml +35 -0
  222. promptcheckup-1.0.0/src/promptcheckup/cli/templates/promptcheckup.toml +34 -0
  223. promptcheckup-1.0.0/src/promptcheckup/data/__init__.py +6 -0
  224. promptcheckup-1.0.0/src/promptcheckup/data/cases.py +113 -0
  225. promptcheckup-1.0.0/src/promptcheckup/data/record.py +56 -0
  226. promptcheckup-1.0.0/src/promptcheckup/errors.py +42 -0
  227. promptcheckup-1.0.0/src/promptcheckup/llm/__init__.py +39 -0
  228. promptcheckup-1.0.0/src/promptcheckup/llm/client.py +162 -0
  229. promptcheckup-1.0.0/src/promptcheckup/llm/grade.py +36 -0
  230. promptcheckup-1.0.0/src/promptcheckup/llm/judge.py +178 -0
  231. promptcheckup-1.0.0/src/promptcheckup/llm/patterns.py +50 -0
  232. promptcheckup-1.0.0/src/promptcheckup/llm/prompting.py +66 -0
  233. promptcheckup-1.0.0/src/promptcheckup/llm/propose.py +94 -0
  234. promptcheckup-1.0.0/src/promptcheckup/llm/starter.py +42 -0
  235. promptcheckup-1.0.0/src/promptcheckup/runner/__init__.py +28 -0
  236. promptcheckup-1.0.0/src/promptcheckup/runner/agents.py +101 -0
  237. promptcheckup-1.0.0/src/promptcheckup/runner/replay.py +174 -0
  238. promptcheckup-1.0.0/src/promptcheckup/stats/__init__.py +5 -0
  239. promptcheckup-1.0.0/src/promptcheckup/stats/gate.py +175 -0
  240. promptcheckup-1.0.0/src/promptcheckup/testing.py +102 -0
  241. promptcheckup-1.0.0/tests/benchmarks/test_checkup_simulation.py +203 -0
  242. promptcheckup-1.0.0/tests/checkup/test_checkup.py +593 -0
  243. promptcheckup-1.0.0/tests/checkup/test_checkup_report.py +77 -0
  244. promptcheckup-1.0.0/tests/checkup/test_evaluate.py +305 -0
  245. promptcheckup-1.0.0/tests/checkup/test_evolve.py +268 -0
  246. promptcheckup-1.0.0/tests/checkup/test_ledger.py +96 -0
  247. promptcheckup-1.0.0/tests/checkup/test_report.py +134 -0
  248. promptcheckup-1.0.0/tests/checkup/test_snapshot.py +81 -0
  249. promptcheckup-1.0.0/tests/cli/test_checkup.py +211 -0
  250. promptcheckup-1.0.0/tests/cli/test_confidence.py +70 -0
  251. promptcheckup-1.0.0/tests/cli/test_config.py +191 -0
  252. promptcheckup-1.0.0/tests/cli/test_doctor.py +429 -0
  253. promptcheckup-1.0.0/tests/cli/test_evolve.py +188 -0
  254. promptcheckup-1.0.0/tests/cli/test_main.py +388 -0
  255. promptcheckup-1.0.0/tests/data/test_cases.py +149 -0
  256. promptcheckup-1.0.0/tests/data/test_record.py +242 -0
  257. promptcheckup-1.0.0/tests/examples/test_planted.py +37 -0
  258. promptcheckup-1.0.0/tests/examples/test_support_bot.py +78 -0
  259. promptcheckup-1.0.0/tests/examples/test_trading.py +367 -0
  260. promptcheckup-1.0.0/tests/examples/test_trading_results.py +110 -0
  261. promptcheckup-1.0.0/tests/llm/test_client.py +336 -0
  262. promptcheckup-1.0.0/tests/llm/test_grade.py +143 -0
  263. promptcheckup-1.0.0/tests/llm/test_judge.py +446 -0
  264. promptcheckup-1.0.0/tests/llm/test_patterns.py +54 -0
  265. promptcheckup-1.0.0/tests/llm/test_propose.py +115 -0
  266. promptcheckup-1.0.0/tests/llm/test_starter.py +45 -0
  267. promptcheckup-1.0.0/tests/runner/test_agents.py +208 -0
  268. promptcheckup-1.0.0/tests/runner/test_replay.py +170 -0
  269. promptcheckup-1.0.0/tests/runner/test_run_prompts.py +41 -0
  270. promptcheckup-1.0.0/tests/stats/test_gate.py +206 -0
  271. promptcheckup-1.0.0/tests/test_connect_examples.py +133 -0
  272. promptcheckup-1.0.0/tests/test_errors.py +104 -0
  273. promptcheckup-1.0.0/tests/test_public_api.py +6 -0
  274. promptcheckup-1.0.0/tests/test_readme.py +70 -0
  275. promptcheckup-1.0.0/tests/test_release.py +34 -0
  276. promptcheckup-1.0.0/tests/test_testing.py +140 -0
@@ -0,0 +1,24 @@
1
+ name: ci
2
+
3
+ on:
4
+ push:
5
+ pull_request:
6
+
7
+ permissions:
8
+ contents: read
9
+
10
+ jobs:
11
+ test:
12
+ runs-on: ubuntu-latest
13
+ strategy:
14
+ matrix:
15
+ python-version: ["3.11", "3.12"]
16
+ steps:
17
+ - uses: actions/checkout@v4
18
+ - uses: actions/setup-python@v5
19
+ with:
20
+ python-version: ${{ matrix.python-version }}
21
+ - run: pip install pytest==9.1.1 ruff==0.17.1
22
+ - run: ruff check .
23
+ - run: ruff format --check .
24
+ - run: pytest
@@ -0,0 +1,45 @@
1
+ name: release
2
+
3
+ # Publishes to PyPI when a GitHub release is published, using trusted publishing:
4
+ # no API token is stored anywhere. One-time setup on pypi.org: add this repository,
5
+ # workflow file `release.yml` and environment `pypi` as a trusted publisher.
6
+ on:
7
+ release:
8
+ types: [published]
9
+
10
+ permissions:
11
+ contents: read
12
+
13
+ jobs:
14
+ build:
15
+ runs-on: ubuntu-latest
16
+ steps:
17
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
18
+ - uses: actions/setup-python@6d4fd22b20465ccc0f7354476588e8df7c9ca0e0 # v7.1.0
19
+ with:
20
+ python-version: "3.12"
21
+ - run: python -m pip install build==1.6.1 pytest==9.1.1
22
+ - name: Run the tests on the exact commit being released
23
+ run: python -m pytest -q
24
+ - name: Require the release tag to match the package version
25
+ run: |
26
+ version=$(python -c 'import re, pathlib; print(re.search(r"__version__ = \"(.+)\"", pathlib.Path("src/promptcheckup/__init__.py").read_text())[1])')
27
+ test "v$version" = "$GITHUB_REF_NAME" || { echo "tag $GITHUB_REF_NAME does not match version $version"; exit 1; }
28
+ - run: python -m build
29
+ - uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
30
+ with:
31
+ name: dist
32
+ path: dist/
33
+
34
+ publish:
35
+ needs: build
36
+ runs-on: ubuntu-latest
37
+ environment: pypi
38
+ permissions:
39
+ id-token: write # trusted publishing; no token secret exists
40
+ steps:
41
+ - uses: actions/download-artifact@9000827ccba6bdab643e8b6fd33ac0654aef8333 # v8.0.2
42
+ with:
43
+ name: dist
44
+ path: dist/
45
+ - uses: pypa/gh-action-pypi-publish@7245906fb61fa33a13554f9d5fb856fe61758086 # v1.14.3
@@ -0,0 +1,11 @@
1
+ .venv/
2
+ __pycache__/
3
+ *.egg-info/
4
+ dist/
5
+ .pytest_cache/
6
+ .ruff_cache/
7
+ .promptcheckup/
8
+
9
+ # Outputs from running the examples
10
+ examples/**/report.md
11
+ examples/**/result.json
@@ -0,0 +1,33 @@
1
+ # Changelog
2
+
3
+ All notable changes are listed here. The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and versions follow [Semantic Versioning](https://semver.org/).
4
+
5
+ ## [1.0.0] - 2026-11-01
6
+
7
+ The first public release.
8
+
9
+ ### Added
10
+
11
+ - **Statistical gate.** A paired 95% t confidence interval with an exact Student t quantile, at least 20 cases, and three verdicts: better, worse, or not sure yet. A skew guard refuses "better" when a few large losses hide among small gains.
12
+ - **Paired replay.** Every case runs through both prompts back to back, so shared noise cancels. Outputs are cached, calls are capped, and errors are reported, never dropped.
13
+ - **Agents in any language.** A Python `module:function`, or any command speaking JSON over stdin and stdout. `@record` captures real cases from production, with redaction.
14
+ - **LLM judge.** Pairwise, order-swapped comparisons with a self-check that compares the old prompt with itself; an unreliable judge downgrades the verdict. Untrusted data cannot close its prompt block. A judge may reason before its JSON verdict; no temperature is sent unless configured.
15
+ - **`promptcheckup gate`** compares the prompts in a pull request with its base branch, with a workflow template that comments on the pull request.
16
+ - **`promptcheckup checkup`,** the weekly check-up:
17
+ - drift against last week's snapshot, including after a prompt change;
18
+ - starter cases when none exist;
19
+ - failure patterns;
20
+ - one small proposed edit that must pass the gate;
21
+ - a workflow template that posts to one issue and opens a pull request. It never merges.
22
+ - **`promptcheckup evolve`:** repeated proposals, learned on fixed-rule learning cases and gated on held-out cases at a stricter confidence for every extra round. It never merges.
23
+ - **Trial ledger:** reports how many prompt variants were tried on the same cases and how many false "better" verdicts that many trials would produce by chance. `run.confidence` sets the base confidence.
24
+ - **`promptcheckup doctor`:** checks a project's wiring with two agent calls and at most one judge call, including whether the agent really uses the prompts it is given.
25
+ - **`promptcheckup.testing`:** `gate`, `assert_better`, `assert_not_worse` and `assert_no_lookahead`, for use in an existing test suite.
26
+ - **Examples:**
27
+ - a support-bot quickstart with real reports from three hosted judges;
28
+ - a trading agent on a seeded synthetic market, with recorded replies, a look-ahead test and outcome-blind cases;
29
+ - a planted example comparing naive and paired evaluation.
30
+ - **Benchmarks:** false-positive and power simulations of the gate, and a simulated year of weekly check-ups with planted incidents.
31
+ - **Documentation:** a guide for connecting an agent, and the full design in `DESIGN.md`.
32
+
33
+ [1.0.0]: https://github.com/gael55x/promptcheckup/releases/tag/v1.0.0
@@ -0,0 +1,79 @@
1
+ cff-version: 1.2.0
2
+ message: "If you use promptcheckup in your work, please cite it as below."
3
+ type: software
4
+ title: "promptcheckup: paired replay for deciding whether a prompt change made an AI agent better"
5
+ version: 1.0.0
6
+ license: Apache-2.0
7
+ repository-code: "https://github.com/gael55x/promptcheckup"
8
+ authors:
9
+ - family-names: Amolong
10
+ given-names: Gaille
11
+ keywords:
12
+ - large language models
13
+ - agents
14
+ - prompt engineering
15
+ - evaluation
16
+ - paired comparison
17
+ references:
18
+ - type: article
19
+ title: "MemTrial: Learning When to Trust Memory in LLM Portfolio Agents"
20
+ authors:
21
+ - family-names: Wu
22
+ given-names: Guanghao
23
+ - family-names: Cai
24
+ given-names: Zhuo
25
+ - family-names: Wang
26
+ given-names: Shoujin
27
+ year: 2026
28
+ url: "https://arxiv.org/abs/2610.11732"
29
+ notes: "The paired-replay gate: compare decisions on the same inputs so shared noise cancels."
30
+ - type: article
31
+ title: "EvolveTrade: Experience-Driven Policy Refinement for Self-Evolving LLM Trading Agents"
32
+ authors:
33
+ - family-names: Kim
34
+ given-names: Sehee
35
+ - family-names: Choi
36
+ given-names: Yumin
37
+ - family-names: Kang
38
+ given-names: Minki
39
+ - family-names: Hwang
40
+ given-names: Sung Ju
41
+ year: 2026
42
+ url: "https://arxiv.org/abs/2609.17632"
43
+ notes: "The proposer: an LLM rewrites the agent's prompt from decision traces and outcomes."
44
+ - type: article
45
+ title: "SHARP: A Self-Evolving Human-Auditable Rubric Policy for Financial Trading Agents"
46
+ authors:
47
+ - family-names: Chen
48
+ given-names: Xiwen
49
+ - family-names: Zhu
50
+ given-names: Wenhui
51
+ - family-names: Zheng
52
+ given-names: Songzhu
53
+ - family-names: Rasul
54
+ given-names: Kashif
55
+ - family-names: Deng
56
+ given-names: Yueyue
57
+ - family-names: Li
58
+ given-names: Huayu
59
+ year: 2026
60
+ url: "https://arxiv.org/abs/2605.06822"
61
+ notes: "Small, attributable rule edits with validation, and an audit trail."
62
+ - type: article
63
+ title: "ATLAS: Adaptive Trading with LLM AgentS Through Dynamic Prompt Optimization and Multi-Agent Coordination"
64
+ authors:
65
+ - family-names: Papadakis
66
+ given-names: Charidimos
67
+ - family-names: Dimitriou
68
+ given-names: Angeliki
69
+ - family-names: Filandrianos
70
+ given-names: Giorgos
71
+ - family-names: Lymperaiou
72
+ given-names: Maria
73
+ - family-names: Thomas
74
+ given-names: Konstantinos
75
+ - family-names: Stamou
76
+ given-names: Giorgos
77
+ year: 2025
78
+ url: "https://arxiv.org/abs/2510.15949"
79
+ notes: "Prior art: feedback-driven prompt optimization for a trading agent."