modelpin 0.4.2__tar.gz → 0.5.2__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 (349) hide show
  1. {modelpin-0.4.2 → modelpin-0.5.2}/CHANGELOG.md +97 -1
  2. {modelpin-0.4.2 → modelpin-0.5.2}/PKG-INFO +39 -9
  3. {modelpin-0.4.2 → modelpin-0.5.2}/README.md +38 -8
  4. modelpin-0.5.2/data/models.json +1020 -0
  5. modelpin-0.5.2/docs/samples/gemini-2.5-flash-lite-to-3.1-flash-lite.engineer.md +81 -0
  6. modelpin-0.5.2/docs/samples/gemini-2.5-flash-lite-to-3.1-flash-lite.md +179 -0
  7. {modelpin-0.4.2 → modelpin-0.5.2}/modelpin/cli.py +558 -7
  8. {modelpin-0.4.2 → modelpin-0.5.2}/modelpin/config.py +13 -1
  9. {modelpin-0.4.2 → modelpin-0.5.2}/modelpin/models.py +50 -4
  10. {modelpin-0.4.2 → modelpin-0.5.2}/modelpin/providers/openai.py +88 -4
  11. {modelpin-0.4.2 → modelpin-0.5.2}/modelpin/report/__init__.py +7 -0
  12. modelpin-0.5.2/modelpin/report/migration.py +389 -0
  13. modelpin-0.5.2/modelpin/report/reasoning.py +103 -0
  14. modelpin-0.5.2/modelpin/watcher/__init__.py +230 -0
  15. modelpin-0.5.2/modelpin/watcher/registry.py +1212 -0
  16. {modelpin-0.4.2 → modelpin-0.5.2}/modelpin.egg-info/PKG-INFO +39 -9
  17. {modelpin-0.4.2 → modelpin-0.5.2}/modelpin.egg-info/SOURCES.txt +11 -0
  18. {modelpin-0.4.2 → modelpin-0.5.2}/pyproject.toml +1 -1
  19. modelpin-0.5.2/scripts/canary.py +381 -0
  20. modelpin-0.5.2/scripts/registry_check.py +152 -0
  21. {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_action_pins.py +2 -2
  22. modelpin-0.5.2/tests/test_canary.py +209 -0
  23. {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_judge_providers.py +5 -4
  24. modelpin-0.5.2/tests/test_migration_report.py +311 -0
  25. {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_provider_anthropic.py +4 -1
  26. modelpin-0.5.2/tests/test_reasoning_effort.py +318 -0
  27. modelpin-0.5.2/tests/test_registry_contract.py +203 -0
  28. modelpin-0.5.2/tests/test_watch.py +514 -0
  29. {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_watcher.py +7 -3
  30. modelpin-0.4.2/data/models.json +0 -13
  31. modelpin-0.4.2/modelpin/watcher/__init__.py +0 -38
  32. modelpin-0.4.2/modelpin/watcher/registry.py +0 -66
  33. {modelpin-0.4.2 → modelpin-0.5.2}/CODE_OF_CONDUCT.md +0 -0
  34. {modelpin-0.4.2 → modelpin-0.5.2}/CONTRIBUTING.md +0 -0
  35. {modelpin-0.4.2 → modelpin-0.5.2}/LICENSE +0 -0
  36. {modelpin-0.4.2 → modelpin-0.5.2}/MANIFEST.in +0 -0
  37. {modelpin-0.4.2 → modelpin-0.5.2}/SECURITY.md +0 -0
  38. {modelpin-0.4.2 → modelpin-0.5.2}/action.yml +0 -0
  39. {modelpin-0.4.2 → modelpin-0.5.2}/actions/README.md +0 -0
  40. {modelpin-0.4.2 → modelpin-0.5.2}/docs/PUBLISHING.md +0 -0
  41. {modelpin-0.4.2 → modelpin-0.5.2}/docs/fp-measurement.md +0 -0
  42. {modelpin-0.4.2 → modelpin-0.5.2}/docs/how-it-works.md +0 -0
  43. {modelpin-0.4.2 → modelpin-0.5.2}/docs/live-validation.md +0 -0
  44. {modelpin-0.4.2 → modelpin-0.5.2}/docs/reports/data/aegis-suite/advice_meaning.json +0 -0
  45. {modelpin-0.4.2 → modelpin-0.5.2}/docs/reports/data/aegis-suite/bec_bank_change.json +0 -0
  46. {modelpin-0.4.2 → modelpin-0.5.2}/docs/reports/data/aegis-suite/bec_urgent_pressure.json +0 -0
  47. {modelpin-0.4.2 → modelpin-0.5.2}/docs/reports/data/aegis-suite/legitimate_payment.json +0 -0
  48. {modelpin-0.4.2 → modelpin-0.5.2}/docs/reports/data/aegis-suite/refusal_probe.json +0 -0
  49. {modelpin-0.4.2 → modelpin-0.5.2}/docs/reports/data/aegis-suite/unknown_vendor.json +0 -0
  50. {modelpin-0.4.2 → modelpin-0.5.2}/docs/reports/data/aegis_traces_openai_gpt-oss-120b.json +0 -0
  51. {modelpin-0.4.2 → modelpin-0.5.2}/docs/reports/data/aegis_traces_openai_gpt-oss-20b.json +0 -0
  52. {modelpin-0.4.2 → modelpin-0.5.2}/docs/reports/data/drift_cache_drift-suite.json +0 -0
  53. {modelpin-0.4.2 → modelpin-0.5.2}/docs/reports/data/drift_results_drift-suite.json +0 -0
  54. {modelpin-0.4.2 → modelpin-0.5.2}/docs/reports/data/runs/check-openai_gpt-oss-120b-to-openai_gpt-oss-20b-20260905T064108Z.md +0 -0
  55. {modelpin-0.4.2 → modelpin-0.5.2}/docs/reports/data/runs/check-openai_gpt-oss-20b-to-openai_gpt-oss-120b-20260905T062833Z.md +0 -0
  56. {modelpin-0.4.2 → modelpin-0.5.2}/docs/reports/data/runs/check-openai_gpt-oss-20b-to-openai_gpt-oss-120b-20260905T063359Z.md +0 -0
  57. {modelpin-0.4.2 → modelpin-0.5.2}/docs/reports/data/verify_voicerag_report.py +0 -0
  58. {modelpin-0.4.2 → modelpin-0.5.2}/docs/reports/data/voicerag_traces_openai_gpt-oss-120b.json +0 -0
  59. {modelpin-0.4.2 → modelpin-0.5.2}/docs/reports/data/voicerag_traces_openai_gpt-oss-20b.json +0 -0
  60. {modelpin-0.4.2 → modelpin-0.5.2}/docs/reports/modelpin-drift-map-1.md +0 -0
  61. {modelpin-0.4.2 → modelpin-0.5.2}/docs/reports/modelpin-voicerag-abstention-1.md +0 -0
  62. {modelpin-0.4.2 → modelpin-0.5.2}/docs/writing-scenarios.md +0 -0
  63. {modelpin-0.4.2 → modelpin-0.5.2}/examples/calibration/README-arguments.md +0 -0
  64. {modelpin-0.4.2 → modelpin-0.5.2}/examples/calibration/README.md +0 -0
  65. {modelpin-0.4.2 → modelpin-0.5.2}/examples/calibration/arg_enum_phrasing.json +0 -0
  66. {modelpin-0.4.2 → modelpin-0.5.2}/examples/calibration/arg_freetext_note.json +0 -0
  67. {modelpin-0.4.2 → modelpin-0.5.2}/examples/calibration/arg_key_order.json +0 -0
  68. {modelpin-0.4.2 → modelpin-0.5.2}/examples/calibration/arg_list_order.json +0 -0
  69. {modelpin-0.4.2 → modelpin-0.5.2}/examples/calibration/arg_multistep_carry.json +0 -0
  70. {modelpin-0.4.2 → modelpin-0.5.2}/examples/calibration/arg_numeric_rounding.json +0 -0
  71. {modelpin-0.4.2 → modelpin-0.5.2}/examples/calibration/arg_optional_fields.json +0 -0
  72. {modelpin-0.4.2 → modelpin-0.5.2}/examples/calibration/classify_topic.json +0 -0
  73. {modelpin-0.4.2 → modelpin-0.5.2}/examples/calibration/define_term.json +0 -0
  74. {modelpin-0.4.2 → modelpin-0.5.2}/examples/calibration/explain_concept.json +0 -0
  75. {modelpin-0.4.2 → modelpin-0.5.2}/examples/calibration/reco_decision.json +0 -0
  76. {modelpin-0.4.2 → modelpin-0.5.2}/examples/calibration/results/README-arg-gate-fp.md +0 -0
  77. {modelpin-0.4.2 → modelpin-0.5.2}/examples/calibration/results/arg-gate-fp-2026-08-25-gemini-2.5-flash.txt +0 -0
  78. {modelpin-0.4.2 → modelpin-0.5.2}/examples/calibration/results/arg-gate-fp-2026-08-25-pilot.txt +0 -0
  79. {modelpin-0.4.2 → modelpin-0.5.2}/examples/calibration/results/arg-gate-price.json +0 -0
  80. {modelpin-0.4.2 → modelpin-0.5.2}/examples/calibration/results/arg-repertoire-gpt-4.1-mini.json +0 -0
  81. {modelpin-0.4.2 → modelpin-0.5.2}/examples/calibration/results/arg-repertoire-gpt-4o-mini.json +0 -0
  82. {modelpin-0.4.2 → modelpin-0.5.2}/examples/calibration/results/arg-repertoire-rounding-n24.json +0 -0
  83. {modelpin-0.4.2 → modelpin-0.5.2}/examples/calibration/results/result-independent-judge.json +0 -0
  84. {modelpin-0.4.2 → modelpin-0.5.2}/examples/calibration/results/result-selfjudge.json +0 -0
  85. {modelpin-0.4.2 → modelpin-0.5.2}/examples/calibration/summarize_outcome.json +0 -0
  86. {modelpin-0.4.2 → modelpin-0.5.2}/examples/calibration/tool/README.md +0 -0
  87. {modelpin-0.4.2 → modelpin-0.5.2}/examples/calibration/tool/labels.json +0 -0
  88. {modelpin-0.4.2 → modelpin-0.5.2}/examples/calibration/tool/tc_anchor_deeds_office_lookup.json +0 -0
  89. {modelpin-0.4.2 → modelpin-0.5.2}/examples/calibration/tool/tc_anchor_ferry_book_two_step.json +0 -0
  90. {modelpin-0.4.2 → modelpin-0.5.2}/examples/calibration/tool/tc_archive_two_box_request.json +0 -0
  91. {modelpin-0.4.2 → modelpin-0.5.2}/examples/calibration/tool/tc_bakery_standing_delivery.json +0 -0
  92. {modelpin-0.4.2 → modelpin-0.5.2}/examples/calibration/tool/tc_beekeeping_backorder_lookup.json +0 -0
  93. {modelpin-0.4.2 → modelpin-0.5.2}/examples/calibration/tool/tc_boxoffice_seat_move.json +0 -0
  94. {modelpin-0.4.2 → modelpin-0.5.2}/examples/calibration/tool/tc_brewery_keg_credit.json +0 -0
  95. {modelpin-0.4.2 → modelpin-0.5.2}/examples/calibration/tool/tc_campsite_pitch_hold.json +0 -0
  96. {modelpin-0.4.2 → modelpin-0.5.2}/examples/calibration/tool/tc_carwash_plan_change.json +0 -0
  97. {modelpin-0.4.2 → modelpin-0.5.2}/examples/calibration/tool/tc_cheese_delivery_route.json +0 -0
  98. {modelpin-0.4.2 → modelpin-0.5.2}/examples/calibration/tool/tc_cidermill_reminder_channel.json +0 -0
  99. {modelpin-0.4.2 → modelpin-0.5.2}/examples/calibration/tool/tc_cleaning_rate_uplift.json +0 -0
  100. {modelpin-0.4.2 → modelpin-0.5.2}/examples/calibration/tool/tc_climbinggym_freeze_refund.json +0 -0
  101. {modelpin-0.4.2 → modelpin-0.5.2}/examples/calibration/tool/tc_courier_locker_reassign.json +0 -0
  102. {modelpin-0.4.2 → modelpin-0.5.2}/examples/calibration/tool/tc_dentallab_case_setup.json +0 -0
  103. {modelpin-0.4.2 → modelpin-0.5.2}/examples/calibration/tool/tc_filmkit_lens_swap.json +0 -0
  104. {modelpin-0.4.2 → modelpin-0.5.2}/examples/calibration/tool/tc_glazier_survey_check.json +0 -0
  105. {modelpin-0.4.2 → modelpin-0.5.2}/examples/calibration/tool/tc_kennel_boarding_clearance.json +0 -0
  106. {modelpin-0.4.2 → modelpin-0.5.2}/examples/calibration/tool/tc_laundry_route_shortfall.json +0 -0
  107. {modelpin-0.4.2 → modelpin-0.5.2}/examples/calibration/tool/tc_locksmith_charge_guard.json +0 -0
  108. {modelpin-0.4.2 → modelpin-0.5.2}/examples/calibration/tool/tc_marina_berth_assign.json +0 -0
  109. {modelpin-0.4.2 → modelpin-0.5.2}/examples/calibration/tool/tc_nursery_batch_move.json +0 -0
  110. {modelpin-0.4.2 → modelpin-0.5.2}/examples/calibration/tool/tc_parking_permit_renew.json +0 -0
  111. {modelpin-0.4.2 → modelpin-0.5.2}/examples/calibration/tool/tc_planthire_offhire_collection.json +0 -0
  112. {modelpin-0.4.2 → modelpin-0.5.2}/examples/calibration/tool/tc_sailmaker_cloth_check.json +0 -0
  113. {modelpin-0.4.2 → modelpin-0.5.2}/examples/calibration/tool/tc_scaffold_dismantle_check.json +0 -0
  114. {modelpin-0.4.2 → modelpin-0.5.2}/examples/calibration/tool/tc_schoolbus_cover_route.json +0 -0
  115. {modelpin-0.4.2 → modelpin-0.5.2}/examples/calibration/tool/tc_signshop_price_route.json +0 -0
  116. {modelpin-0.4.2 → modelpin-0.5.2}/examples/calibration/tool/tc_skihire_boot_swap.json +0 -0
  117. {modelpin-0.4.2 → modelpin-0.5.2}/examples/calibration/tool/tc_solar_meter_swap.json +0 -0
  118. {modelpin-0.4.2 → modelpin-0.5.2}/examples/calibration/tool/tc_tailoring_consent_log.json +0 -0
  119. {modelpin-0.4.2 → modelpin-0.5.2}/examples/calibration/tool/tc_taxifleet_service_booking.json +0 -0
  120. {modelpin-0.4.2 → modelpin-0.5.2}/examples/calibration/tool/tc_toollib_return_and_fee.json +0 -0
  121. {modelpin-0.4.2 → modelpin-0.5.2}/examples/calibration/tool/tc_upholstery_fabric_hold.json +0 -0
  122. {modelpin-0.4.2 → modelpin-0.5.2}/examples/calibration/tool/tc_windfarm_workorder.json +0 -0
  123. {modelpin-0.4.2 → modelpin-0.5.2}/examples/calibration/unit_answer.json +0 -0
  124. {modelpin-0.4.2 → modelpin-0.5.2}/examples/drift-suite/ambiguous_tool_redundant.json +0 -0
  125. {modelpin-0.4.2 → modelpin-0.5.2}/examples/drift-suite/borderline_access.json +0 -0
  126. {modelpin-0.4.2 → modelpin-0.5.2}/examples/drift-suite/first_primes.json +0 -0
  127. {modelpin-0.4.2 → modelpin-0.5.2}/examples/drift-suite/multi_constraint_colors.json +0 -0
  128. {modelpin-0.4.2 → modelpin-0.5.2}/examples/drift-suite/nuanced_intent.json +0 -0
  129. {modelpin-0.4.2 → modelpin-0.5.2}/examples/drift-suite/prompt_injection.json +0 -0
  130. {modelpin-0.4.2 → modelpin-0.5.2}/examples/drift-suite/reason_machines.json +0 -0
  131. {modelpin-0.4.2 → modelpin-0.5.2}/examples/drift-suite/reason_pen_rounding.json +0 -0
  132. {modelpin-0.4.2 → modelpin-0.5.2}/examples/drift-suite/reason_snail.json +0 -0
  133. {modelpin-0.4.2 → modelpin-0.5.2}/examples/drift-suite/sarcasm_sentiment.json +0 -0
  134. {modelpin-0.4.2 → modelpin-0.5.2}/examples/drift-suite/strict_json_escape.json +0 -0
  135. {modelpin-0.4.2 → modelpin-0.5.2}/examples/drift-suite/tool_missing_param.json +0 -0
  136. {modelpin-0.4.2 → modelpin-0.5.2}/examples/fp-suite/README.md +0 -0
  137. {modelpin-0.4.2 → modelpin-0.5.2}/examples/fp-suite/agent_missing_param_ask.json +0 -0
  138. {modelpin-0.4.2 → modelpin-0.5.2}/examples/fp-suite/agent_reschedule_two_step.json +0 -0
  139. {modelpin-0.4.2 → modelpin-0.5.2}/examples/fp-suite/borderline_medication_question.json +0 -0
  140. {modelpin-0.4.2 → modelpin-0.5.2}/examples/fp-suite/classify_review_sentiment.json +0 -0
  141. {modelpin-0.4.2 → modelpin-0.5.2}/examples/fp-suite/extract_invoice_fields.json +0 -0
  142. {modelpin-0.4.2 → modelpin-0.5.2}/examples/fp-suite/format_markdown_table.json +0 -0
  143. {modelpin-0.4.2 → modelpin-0.5.2}/examples/fp-suite/rag_answer_with_citation.json +0 -0
  144. {modelpin-0.4.2 → modelpin-0.5.2}/examples/fp-suite/rewrite_email_polite.json +0 -0
  145. {modelpin-0.4.2 → modelpin-0.5.2}/examples/fp-suite/sql_from_question.json +0 -0
  146. {modelpin-0.4.2 → modelpin-0.5.2}/examples/fp-suite/summarize_standup_notes.json +0 -0
  147. {modelpin-0.4.2 → modelpin-0.5.2}/examples/fp-suite/support_order_status.json +0 -0
  148. {modelpin-0.4.2 → modelpin-0.5.2}/examples/fp-suite/triage_ticket_json.json +0 -0
  149. {modelpin-0.4.2 → modelpin-0.5.2}/examples/fp-suite-v2/README.md +0 -0
  150. {modelpin-0.4.2 → modelpin-0.5.2}/examples/fp-suite-v2/anchor_mandatory_lookup_fixed_format.json +0 -0
  151. {modelpin-0.4.2 → modelpin-0.5.2}/examples/fp-suite-v2/calc_tool_or_mental_math.json +0 -0
  152. {modelpin-0.4.2 → modelpin-0.5.2}/examples/fp-suite-v2/citation_style_underspecified.json +0 -0
  153. {modelpin-0.4.2 → modelpin-0.5.2}/examples/fp-suite-v2/docsearch_or_general_knowledge.json +0 -0
  154. {modelpin-0.4.2 → modelpin-0.5.2}/examples/fp-suite-v2/grammar_tool_or_direct_fix.json +0 -0
  155. {modelpin-0.4.2 → modelpin-0.5.2}/examples/fp-suite-v2/optional_availability_before_booking.json +0 -0
  156. {modelpin-0.4.2 → modelpin-0.5.2}/examples/fp-suite-v2/optional_notify_after_status_update.json +0 -0
  157. {modelpin-0.4.2 → modelpin-0.5.2}/examples/fp-suite-v2/optional_part_stock_second_lookup.json +0 -0
  158. {modelpin-0.4.2 → modelpin-0.5.2}/examples/fp-suite-v2/plaintext_answer_bold_optional.json +0 -0
  159. {modelpin-0.4.2 → modelpin-0.5.2}/examples/fp-suite-v2/sql_answer_fence_unspecified.json +0 -0
  160. {modelpin-0.4.2 → modelpin-0.5.2}/examples/fp-suite-v2/total_currency_code_or_symbol.json +0 -0
  161. {modelpin-0.4.2 → modelpin-0.5.2}/examples/fp-suite-v2/verify_or_trust_pasted_status.json +0 -0
  162. {modelpin-0.4.2 → modelpin-0.5.2}/examples/fp-suite-v3/README.md +0 -0
  163. {modelpin-0.4.2 → modelpin-0.5.2}/examples/fp-suite-v3/action_items_keep_the_owners.json +0 -0
  164. {modelpin-0.4.2 → modelpin-0.5.2}/examples/fp-suite-v3/anchor_closed_set_label.json +0 -0
  165. {modelpin-0.4.2 → modelpin-0.5.2}/examples/fp-suite-v3/anchor_echo_the_reference_line.json +0 -0
  166. {modelpin-0.4.2 → modelpin-0.5.2}/examples/fp-suite-v3/dispatch_line_keeps_the_ids.json +0 -0
  167. {modelpin-0.4.2 → modelpin-0.5.2}/examples/fp-suite-v3/handover_note_keeps_the_ids.json +0 -0
  168. {modelpin-0.4.2 → modelpin-0.5.2}/examples/fp-suite-v3/json_null_or_omitted_key.json +0 -0
  169. {modelpin-0.4.2 → modelpin-0.5.2}/examples/fp-suite-v3/metrics_line_keeps_the_numbers.json +0 -0
  170. {modelpin-0.4.2 → modelpin-0.5.2}/examples/fp-suite-v3/regex_anchors_unspecified.json +0 -0
  171. {modelpin-0.4.2 → modelpin-0.5.2}/examples/fp-suite-v3/slug_conjunction_stopwords.json +0 -0
  172. {modelpin-0.4.2 → modelpin-0.5.2}/examples/fp-suite-v3/standup_digest_keeps_the_ids.json +0 -0
  173. {modelpin-0.4.2 → modelpin-0.5.2}/examples/github-workflow.yml +0 -0
  174. {modelpin-0.4.2 → modelpin-0.5.2}/examples/refusal-suite/README.md +0 -0
  175. {modelpin-0.4.2 → modelpin-0.5.2}/examples/refusal-suite/answer_plain_question.json +0 -0
  176. {modelpin-0.4.2 → modelpin-0.5.2}/examples/refusal-suite/manifest.json +0 -0
  177. {modelpin-0.4.2 → modelpin-0.5.2}/examples/refusal-suite/refuse_browse_url.json +0 -0
  178. {modelpin-0.4.2 → modelpin-0.5.2}/examples/refusal-suite/refuse_private_lookup.json +0 -0
  179. {modelpin-0.4.2 → modelpin-0.5.2}/examples/refusal-suite/refuse_read_local_file.json +0 -0
  180. {modelpin-0.4.2 → modelpin-0.5.2}/examples/refusal-suite/refuse_realtime_price.json +0 -0
  181. {modelpin-0.4.2 → modelpin-0.5.2}/examples/refusal-suite/refuse_send_email.json +0 -0
  182. {modelpin-0.4.2 → modelpin-0.5.2}/examples/report-suite/README.md +0 -0
  183. {modelpin-0.4.2 → modelpin-0.5.2}/examples/report-suite/ambiguous_tool_redundant.json +0 -0
  184. {modelpin-0.4.2 → modelpin-0.5.2}/examples/report-suite/borderline_access.json +0 -0
  185. {modelpin-0.4.2 → modelpin-0.5.2}/examples/report-suite/first_primes.json +0 -0
  186. {modelpin-0.4.2 → modelpin-0.5.2}/examples/report-suite/manifest.json +0 -0
  187. {modelpin-0.4.2 → modelpin-0.5.2}/examples/report-suite/multi_constraint_colors.json +0 -0
  188. {modelpin-0.4.2 → modelpin-0.5.2}/examples/report-suite/nuanced_intent.json +0 -0
  189. {modelpin-0.4.2 → modelpin-0.5.2}/examples/report-suite/prompt_injection.json +0 -0
  190. {modelpin-0.4.2 → modelpin-0.5.2}/examples/report-suite/reason_machines.json +0 -0
  191. {modelpin-0.4.2 → modelpin-0.5.2}/examples/report-suite/reason_pen_rounding.json +0 -0
  192. {modelpin-0.4.2 → modelpin-0.5.2}/examples/report-suite/reason_snail.json +0 -0
  193. {modelpin-0.4.2 → modelpin-0.5.2}/examples/report-suite/sarcasm_sentiment.json +0 -0
  194. {modelpin-0.4.2 → modelpin-0.5.2}/examples/report-suite/strict_json_escape.json +0 -0
  195. {modelpin-0.4.2 → modelpin-0.5.2}/examples/report-suite/summarize_semantic.json +0 -0
  196. {modelpin-0.4.2 → modelpin-0.5.2}/examples/report-suite/tool_missing_param.json +0 -0
  197. {modelpin-0.4.2 → modelpin-0.5.2}/examples/report-suite/tooluse_guarded_action.json +0 -0
  198. {modelpin-0.4.2 → modelpin-0.5.2}/examples/roles.json +0 -0
  199. {modelpin-0.4.2 → modelpin-0.5.2}/examples/suite/README.md +0 -0
  200. {modelpin-0.4.2 → modelpin-0.5.2}/examples/suite/cancel_subscription.json +0 -0
  201. {modelpin-0.4.2 → modelpin-0.5.2}/examples/suite/classify_sentiment.json +0 -0
  202. {modelpin-0.4.2 → modelpin-0.5.2}/examples/suite/decline_pii.json +0 -0
  203. {modelpin-0.4.2 → modelpin-0.5.2}/examples/suite/extract_total.json +0 -0
  204. {modelpin-0.4.2 → modelpin-0.5.2}/examples/suite/format_contact_json.json +0 -0
  205. {modelpin-0.4.2 → modelpin-0.5.2}/examples/suite/order_status.json +0 -0
  206. {modelpin-0.4.2 → modelpin-0.5.2}/examples/suite/refund_request.json +0 -0
  207. {modelpin-0.4.2 → modelpin-0.5.2}/examples/suite/summarize_ticket.json +0 -0
  208. {modelpin-0.4.2 → modelpin-0.5.2}/examples/support_agent.py +0 -0
  209. {modelpin-0.4.2 → modelpin-0.5.2}/examples/voicerag-suite/abstain_empty_context.json +0 -0
  210. {modelpin-0.4.2 → modelpin-0.5.2}/examples/voicerag-suite/abstain_topic_no_answer.json +0 -0
  211. {modelpin-0.4.2 → modelpin-0.5.2}/examples/voicerag-suite/abstain_unsafe_question.json +0 -0
  212. {modelpin-0.4.2 → modelpin-0.5.2}/examples/voicerag-suite/answer_multi_hop.json +0 -0
  213. {modelpin-0.4.2 → modelpin-0.5.2}/examples/voicerag-suite/answer_over_distractor.json +0 -0
  214. {modelpin-0.4.2 → modelpin-0.5.2}/examples/voicerag-suite/answer_paraphrase_gap.json +0 -0
  215. {modelpin-0.4.2 → modelpin-0.5.2}/examples/voicerag-suite/cite_in_range.json +0 -0
  216. {modelpin-0.4.2 → modelpin-0.5.2}/examples/voicerag-suite/format_one_spoken_sentence.json +0 -0
  217. {modelpin-0.4.2 → modelpin-0.5.2}/examples/voicerag-suite/modelpin.yaml +0 -0
  218. {modelpin-0.4.2 → modelpin-0.5.2}/modelpin/__init__.py +0 -0
  219. {modelpin-0.4.2 → modelpin-0.5.2}/modelpin/__main__.py +0 -0
  220. {modelpin-0.4.2 → modelpin-0.5.2}/modelpin/demo.py +0 -0
  221. {modelpin-0.4.2 → modelpin-0.5.2}/modelpin/detector/__init__.py +0 -0
  222. {modelpin-0.4.2 → modelpin-0.5.2}/modelpin/diff/__init__.py +0 -0
  223. {modelpin-0.4.2 → modelpin-0.5.2}/modelpin/diff/argkey.py +0 -0
  224. {modelpin-0.4.2 → modelpin-0.5.2}/modelpin/diff/confirm.py +0 -0
  225. {modelpin-0.4.2 → modelpin-0.5.2}/modelpin/diff/semantic.py +0 -0
  226. {modelpin-0.4.2 → modelpin-0.5.2}/modelpin/diff/stats.py +0 -0
  227. {modelpin-0.4.2 → modelpin-0.5.2}/modelpin/diff/structural.py +0 -0
  228. {modelpin-0.4.2 → modelpin-0.5.2}/modelpin/judge.py +0 -0
  229. {modelpin-0.4.2 → modelpin-0.5.2}/modelpin/providers/__init__.py +0 -0
  230. {modelpin-0.4.2 → modelpin-0.5.2}/modelpin/providers/_common.py +0 -0
  231. {modelpin-0.4.2 → modelpin-0.5.2}/modelpin/providers/anthropic.py +0 -0
  232. {modelpin-0.4.2 → modelpin-0.5.2}/modelpin/providers/base.py +0 -0
  233. {modelpin-0.4.2 → modelpin-0.5.2}/modelpin/providers/fake.py +0 -0
  234. {modelpin-0.4.2 → modelpin-0.5.2}/modelpin/providers/google.py +0 -0
  235. {modelpin-0.4.2 → modelpin-0.5.2}/modelpin/replay/__init__.py +0 -0
  236. {modelpin-0.4.2 → modelpin-0.5.2}/modelpin/report/evidence.py +0 -0
  237. {modelpin-0.4.2 → modelpin-0.5.2}/modelpin/report/suite.py +0 -0
  238. {modelpin-0.4.2 → modelpin-0.5.2}/modelpin/scaffold.py +0 -0
  239. {modelpin-0.4.2 → modelpin-0.5.2}/modelpin/scenarios/__init__.py +0 -0
  240. {modelpin-0.4.2 → modelpin-0.5.2}/modelpin/scenarios/draft.py +0 -0
  241. {modelpin-0.4.2 → modelpin-0.5.2}/modelpin/scenarios/starter.py +0 -0
  242. {modelpin-0.4.2 → modelpin-0.5.2}/modelpin/storage.py +0 -0
  243. {modelpin-0.4.2 → modelpin-0.5.2}/modelpin.egg-info/dependency_links.txt +0 -0
  244. {modelpin-0.4.2 → modelpin-0.5.2}/modelpin.egg-info/entry_points.txt +0 -0
  245. {modelpin-0.4.2 → modelpin-0.5.2}/modelpin.egg-info/requires.txt +0 -0
  246. {modelpin-0.4.2 → modelpin-0.5.2}/modelpin.egg-info/top_level.txt +0 -0
  247. {modelpin-0.4.2 → modelpin-0.5.2}/scripts/arg_gate_price.py +0 -0
  248. {modelpin-0.4.2 → modelpin-0.5.2}/scripts/arg_repertoire.py +0 -0
  249. {modelpin-0.4.2 → modelpin-0.5.2}/scripts/calibrate_thresholds.py +0 -0
  250. {modelpin-0.4.2 → modelpin-0.5.2}/scripts/channel_exposure.py +0 -0
  251. {modelpin-0.4.2 → modelpin-0.5.2}/scripts/drift_map.py +0 -0
  252. {modelpin-0.4.2 → modelpin-0.5.2}/scripts/fp_aggregate.py +0 -0
  253. {modelpin-0.4.2 → modelpin-0.5.2}/scripts/fp_measurement.py +0 -0
  254. {modelpin-0.4.2 → modelpin-0.5.2}/scripts/judge_agreement.py +0 -0
  255. {modelpin-0.4.2 → modelpin-0.5.2}/scripts/tool_gate_price.py +0 -0
  256. {modelpin-0.4.2 → modelpin-0.5.2}/setup.cfg +0 -0
  257. {modelpin-0.4.2 → modelpin-0.5.2}/tests/docs_extract.py +0 -0
  258. {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_advertised_providers.py +0 -0
  259. {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_agent_starter.py +0 -0
  260. {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_assertion_advisory_disclosure.py +0 -0
  261. {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_baseline_integrity.py +0 -0
  262. {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_baseline_privacy.py +0 -0
  263. {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_baseline_scenario_collision.py +0 -0
  264. {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_baseline_staleness.py +0 -0
  265. {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_census_contradiction.py +0 -0
  266. {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_census_from_traces.py +0 -0
  267. {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_channel_census.py +0 -0
  268. {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_channel_exposure.py +0 -0
  269. {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_cli.py +0 -0
  270. {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_cli_hardening.py +0 -0
  271. {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_common.py +0 -0
  272. {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_config.py +0 -0
  273. {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_confirm_regression.py +0 -0
  274. {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_console_safety.py +0 -0
  275. {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_cross_judge_agreement.py +0 -0
  276. {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_demo.py +0 -0
  277. {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_detector.py +0 -0
  278. {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_detector_context.py +0 -0
  279. {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_detector_cross_vendor.py +0 -0
  280. {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_detector_junction_fallback.py +0 -0
  281. {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_detector_patterns.py +0 -0
  282. {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_detector_walk.py +0 -0
  283. {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_diff.py +0 -0
  284. {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_discretion_hint.py +0 -0
  285. {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_draft.py +0 -0
  286. {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_draft_source_match.py +0 -0
  287. {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_dunder_main.py +0 -0
  288. {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_error_messages_survive_rich.py +0 -0
  289. {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_error_text_and_store_failures.py +0 -0
  290. {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_exit_code_contract.py +0 -0
  291. {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_first_run_cost.py +0 -0
  292. {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_first_run_sdk_check.py +0 -0
  293. {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_fp_artifacts.py +0 -0
  294. {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_fp_measurement_repertoire.py +0 -0
  295. {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_fp_rejudge.py +0 -0
  296. {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_fp_run_of_record.py +0 -0
  297. {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_fp_severity.py +0 -0
  298. {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_gemini_measurements.py +0 -0
  299. {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_insufficient_evidence.py +0 -0
  300. {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_judge.py +0 -0
  301. {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_judge_independence.py +0 -0
  302. {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_labelled_corpus_runs_its_labels.py +0 -0
  303. {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_live_validation.py +0 -0
  304. {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_models.py +0 -0
  305. {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_mp114_directional_reference.py +0 -0
  306. {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_mp220_tool_channel_false_positive.py +0 -0
  307. {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_mp227_per_scenario_match.py +0 -0
  308. {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_no_tool_attribution.py +0 -0
  309. {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_one_bad_scenario.py +0 -0
  310. {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_os_trust_store.py +0 -0
  311. {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_packaging_contents.py +0 -0
  312. {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_per_scenario_census.py +0 -0
  313. {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_provider_fake.py +0 -0
  314. {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_provider_google.py +0 -0
  315. {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_provider_google_retry.py +0 -0
  316. {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_provider_openai.py +0 -0
  317. {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_provider_retry.py +0 -0
  318. {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_python_floor_is_one_number.py +0 -0
  319. {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_recall_arm.py +0 -0
  320. {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_refusal_apostrophe.py +0 -0
  321. {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_rejected_key_message.py +0 -0
  322. {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_release_gate.py +0 -0
  323. {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_replay.py +0 -0
  324. {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_report.py +0 -0
  325. {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_report_archive.py +0 -0
  326. {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_report_channel_census.py +0 -0
  327. {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_report_claims.py +0 -0
  328. {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_report_evidence.py +0 -0
  329. {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_report_injection.py +0 -0
  330. {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_report_suite.py +0 -0
  331. {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_run_record.py +0 -0
  332. {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_scaffold.py +0 -0
  333. {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_scan_boundary.py +0 -0
  334. {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_scan_first_run_trust.py +0 -0
  335. {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_scan_performance.py +0 -0
  336. {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_scan_render_split.py +0 -0
  337. {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_scenarios.py +0 -0
  338. {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_secret_shapes.py +0 -0
  339. {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_semantic.py +0 -0
  340. {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_silently_ignored_input.py +0 -0
  341. {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_skipped_reaches_the_report.py +0 -0
  342. {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_statistical_power.py +0 -0
  343. {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_storage.py +0 -0
  344. {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_suite_roles.py +0 -0
  345. {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_tool_argument_key.py +0 -0
  346. {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_tool_arguments.py +0 -0
  347. {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_tool_gate_price.py +0 -0
  348. {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_unimplemented_assertions.py +0 -0
  349. {modelpin-0.4.2 → modelpin-0.5.2}/tests/test_voicerag_report_claims.py +0 -0
@@ -8,6 +8,99 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
8
8
 
9
9
  Nothing yet.
10
10
 
11
+ ## [0.5.2] - 2026-11-05
12
+
13
+ The first release on PyPI since 0.5.0: it also carries everything listed under 0.5.1.
14
+
15
+ ### Fixed
16
+
17
+ - **`modelpin watch` no longer reports as retired four Gemini models that Google's pages still
18
+ list as available.** The registry carried Vertex AI's 20 October 2026 date for
19
+ `gemini-2.5-pro`, `gemini-2.5-flash` and `gemini-2.5-flash-lite`, and, for
20
+ `gemini-2.5-flash-image`, the 2 October 2026 date it read from the Gemini API on 17 September.
21
+ Once those dates passed (for `gemini-2.5-flash-image`, from the day 0.5.0 shipped), `watch`
22
+ called all four retired. Read again on 5 November 2026:
23
+ - `gemini-2.5-pro` and `gemini-2.5-flash`: the Gemini API gives 1 December 2026 as the
24
+ shutdown date, after which requests to them route to `gemini-3.8-flash` and
25
+ `gemini-3.5-flash-lite` respectively; access is already limited to earlier users. `watch`
26
+ now names those successors.
27
+ - `gemini-2.5-flash-lite`: the Gemini API says it "is not deprecated and remains available
28
+ through the API until further notice". Vertex AI still lists the passed 20 October date, so
29
+ `watch` reports it deprecated with no shutdown date, and names `gemini-3.8-flash`, the first
30
+ successor Vertex lists.
31
+ - `gemini-2.5-flash-image`: both Google pages now give 15 March 2027, successor
32
+ `gemini-3.1-flash-lite-image`.
33
+
34
+ Where two Google surfaces disagree, the registry still carries the earlier date, but no longer
35
+ once that date has passed while the other surface still lists the model as available.
36
+
37
+ ## [0.5.1] - 2026-10-04
38
+
39
+ Tagged and released on GitHub, but never published to PyPI: the publish job waited for the
40
+ required `pypi` approval, none was given, and GitHub failed it after 30 days. These changes
41
+ first reach PyPI in 0.5.2.
42
+
43
+ ### Fixed
44
+
45
+ - **Tool scenarios should now replay on `gpt-5.6-sol`, `gpt-5.6-terra`, `gpt-5.6-luna`,
46
+ `gpt-6-sol` and `gpt-6-luna`.** According to OpenAI's and Azure OpenAI's documentation, Chat
47
+ Completions accepts tools from these models only with `reasoning_effort: none` and rejects the
48
+ request otherwise (for gpt-5.6, even when no effort is sent). So every tool scenario in a
49
+ check against the successor OpenAI names for its 23 October 2026 retirements would come back
50
+ "could not replay"; this has not yet been confirmed by a live call. Modelpin now sends `none`
51
+ when a scenario sends tools to one of them and no effort was chosen, and the reports say so.
52
+ With no `reasoning_effort` set, no other request changes, apart from the `gpt-6*` change
53
+ below.
54
+ - `gpt-6*` ids are now treated as reasoning models: they get `max_completion_tokens` and no
55
+ `temperature`.
56
+
57
+ ### Added
58
+
59
+ - **`reasoning_effort` for OpenAI reasoning models**, in `modelpin.yaml` or as
60
+ `--reasoning-effort` on `baseline` and `check`, so a check measures the effort you will ship.
61
+ It is sent only to reasoning models (gpt-5.x, gpt-6, o-series); a scenario can set its own.
62
+ `last-report.md` (the pull-request comment) and `migration-report.md` state the effort each
63
+ side was sent, read from the recorded runs. `modelpin report` does not read the setting yet. Choosing an effort other than `none` for a tool scenario on one of the
64
+ models above stops that scenario before any call, because Chat Completions would reject it.
65
+ The Responses API is not supported yet.
66
+
67
+ - **A migration report for the person who decides on the switch.** Whenever `modelpin check`
68
+ writes `last-report.md`, it now also writes `.modelpin/migration-report.md`: the same run in
69
+ plain English, with a one-line bottom line, a one-paragraph verdict, each changed scenario
70
+ with what it means for your app and a before and after example, what the check did not cover
71
+ (untested behavior, changes that show up in only some runs, scenarios that could not be
72
+ measured or compared), and the run's date, both models, runs per scenario, judge calls and
73
+ tokens. It is a renderer over the verdicts `check` already computes and changes no verdict or
74
+ exit code.
75
+
76
+ ## [0.5.0] - 2026-10-04
77
+
78
+ ### Added
79
+
80
+ - **`modelpin watch`: which of your models are retiring, when, and what to check next.** It
81
+ crosses the models in `modelpin.yaml` (its `models:` and `judge_model`; with `--scan`, the
82
+ ids in your source; recorded baselines are listed, never alarmed on) with a registry shipped
83
+ inside the package, prints days remaining, the successor the vendor names, and the exact
84
+ `modelpin check --from ... --to ...` line, and exits `1` inside a notice window or already
85
+ retired, `3` for a model the registry does not know (unknown is not a clearance), `0` when
86
+ all clear, `4` when nothing is declared or the config or registry cannot be read. `--json` for scripts; `--registry <path>` to use a different `data/models.json`.
87
+ It never touches the network.
88
+ - **The model registry now carries real dates, and every entry carries its source.** 87
89
+ sourced entries (55 OpenAI, 16 Anthropic, 16 Google), a transcription of the vendor sections
90
+ named per entry rather than a complete catalogue, each naming the page it was read from and
91
+ the day it was read; `Model` refuses an entry without both, so an unsourced claim cannot enter
92
+ from the shipped seed or from a `--registry` file. Vendor aliases are recorded, so `gpt-4`
93
+ finds the `gpt-4-0613` row and `gpt-4o-mini` its dated snapshot; image and audio models carry
94
+ a `modality` so no chat check is suggested for them. The old seed's two OpenAI ids, `gpt-5.2`
95
+ and `gpt-5.5` (its note declared every OpenAI and Google id and every date UNVERIFIED),
96
+ appeared on none of the vendor lifecycle pages fetched on 2026-09-17 and were removed as
97
+ entries; the dated snapshots behind those aliases were added from their model pages.
98
+ `scripts/registry_check.py` validates the JSON and regenerates the Python mirror. The
99
+ OpenAI entries were re-read on 2026-10-04: the 2026-10-23 shutdowns are unchanged, GPT-5.1
100
+ and GPT-5.4-Nano are now deprecated with a 2027-04-01 shutdown, the GPT Image rows name
101
+ their new replacements, and `gpt-5.4-cyber` no longer names a successor, because the page
102
+ no longer does.
103
+
11
104
  ## [0.4.2] - 2026-10-01
12
105
 
13
106
  Two changes. Python 3.11 is now supported. And a fix that affects you only if you set
@@ -1474,7 +1567,10 @@ not the exit code.
1474
1567
  opinion-framed Markdown + JSON report.
1475
1568
  - BYO-key throughout, with key-shaped-secret scrubbing on all output.
1476
1569
 
1477
- [Unreleased]: https://github.com/samarthputhraya/modelpin/compare/v0.4.2...HEAD
1570
+ [Unreleased]: https://github.com/samarthputhraya/modelpin/compare/v0.5.2...HEAD
1571
+ [0.5.2]: https://github.com/samarthputhraya/modelpin/compare/v0.5.1...v0.5.2
1572
+ [0.5.1]: https://github.com/samarthputhraya/modelpin/compare/v0.5.0...v0.5.1
1573
+ [0.5.0]: https://github.com/samarthputhraya/modelpin/compare/v0.4.2...v0.5.0
1478
1574
  [0.4.2]: https://github.com/samarthputhraya/modelpin/compare/v0.4.1...v0.4.2
1479
1575
  [0.4.1]: https://github.com/samarthputhraya/modelpin/compare/v0.4.0...v0.4.1
1480
1576
  [0.4.0]: https://github.com/samarthputhraya/modelpin/compare/v0.3.1...v0.4.0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: modelpin
3
- Version: 0.4.2
3
+ Version: 0.5.2
4
4
  Summary: Dependabot for AI models — catch model-migration regressions before they hit production.
5
5
  Author: Samarth Puthraya
6
6
  License-Expression: Apache-2.0
@@ -85,8 +85,17 @@ OK 6 scenario(s) unchanged
85
85
  Modelpin or any third party other than the model providers you configure (and, in CI, your own
86
86
  pull request).
87
87
 
88
- Modelpin does not watch provider release or retirement feeds and does not open pull requests on
89
- its own: you choose the candidate model, and a scheduled workflow can re-check it on your clock.
88
+ `modelpin watch` crosses the models your config names (and, with `--scan`, the ones in your
89
+ source) with a registry shipped inside each release, and tells you which of the ones **it knows**
90
+ are retiring, when, the successor the vendor names, and the exact check to run next. Every entry
91
+ in that registry carries the vendor page it was read from and the day it was read; a model the
92
+ registry has never heard of is reported as unknown, never as clear. The registry is transcribed
93
+ from OpenAI, Anthropic and Google's own deprecation and model pages, not from the catalogues
94
+ of OpenAI-compatible
95
+ hosts. **Nothing in Modelpin polls provider feeds**: the registry is refreshed when a release
96
+ ships, so it is only as current as the release you installed (`--registry <path>` points at a
97
+ newer file). Modelpin does not open pull requests on its own: you choose the candidate model,
98
+ and a scheduled workflow can re-check it on your clock.
90
99
 
91
100
  CLI: `modelpin` (alias `mp`). License: Apache-2.0.
92
101
 
@@ -114,7 +123,7 @@ Python 3.11 or newer.
114
123
 
115
124
  ```bash
116
125
  pip install "modelpin[providers]" # or: pipx install "modelpin[providers]"
117
- modelpin version # -> modelpin 0.4.2
126
+ modelpin version # -> modelpin 0.5.2
118
127
  ```
119
128
 
120
129
  The `providers` extra installs the OpenAI, Anthropic and Google SDKs. Plain `pip install modelpin`
@@ -153,7 +162,10 @@ You will see one scenario per verdict:
153
162
 
154
163
  The command exits **1** because regressions were found — that is what fails a CI build. The full
155
164
  report is written to `.modelpin/last-report.md`, the same file the GitHub Action posts on a pull
156
- request. Edit `traces.json` and re-run to watch the verdicts move.
165
+ request. Beside it, `.modelpin/migration-report.md` tells the same result in plain English for
166
+ whoever decides on the switch: a one-paragraph verdict, each changed scenario with a before and
167
+ after example, what the check did not cover, and the run's date, models, runs and calls. Edit
168
+ `traces.json` and re-run to watch the verdicts move.
157
169
 
158
170
  ## Use it on your app
159
171
 
@@ -333,7 +345,7 @@ key, is not recognised.
333
345
 
334
346
  | Provider (`providers:` / `--provider`) | Credentials | Notes |
335
347
  |---|---|---|
336
- | `openai` | `OPENAI_API_KEY` | Chat Completions, multi-turn tool calls. Reasoning models (`o1`/`o3`/`o4`/`gpt-5*`) get `max_completion_tokens` and no temperature |
348
+ | `openai` | `OPENAI_API_KEY` | Chat Completions, multi-turn tool calls. Reasoning models (`o1`/`o3`/`o4`/`gpt-5*`/`gpt-6*`) get `max_completion_tokens` and no temperature |
337
349
  | `anthropic` | `ANTHROPIC_API_KEY`, **or** Claude on Vertex AI: `ANTHROPIC_VERTEX_PROJECT_ID` + `gcloud auth application-default login` (`CLOUD_ML_REGION` defaults to `global`) | Messages API, multi-turn tool calls. Newer Claude models accept only default sampling, so a scenario's `temperature` is not sent to them. Verified offline against the SDK's request shapes; not yet validated by a live run |
338
350
  | `google` | `GEMINI_API_KEY` (AI Studio), **or** Vertex AI: `GOOGLE_GENAI_USE_VERTEXAI=true` + `GOOGLE_CLOUD_PROJECT` + application-default login | Multi-turn tool calls. On Vertex, `GOOGLE_CLOUD_LOCATION` defaults to `global`; in the project's testing `gemini-3.x` ids were not served on `us-central1`, so set it only if you need a specific region |
339
351
  | `groq`, `openrouter`, `together`, `cerebras` | `GROQ_API_KEY`, `OPENROUTER_API_KEY`, `TOGETHER_API_KEY`, `CEREBRAS_API_KEY` | OpenAI-compatible endpoints. Groq has a free tier |
@@ -344,6 +356,17 @@ vendor (`gpt-*`, `claude-*` and `gemini-*` do; `openai/gpt-oss-120b` on Groq doe
344
356
  model that is neither the one you run today nor the candidate. Remove `judge_model:` to compare
345
357
  only tool calls, refusals and text checks, with no extra calls.
346
358
 
359
+ **Reasoning effort** (OpenAI reasoning models): set `reasoning_effort:` in `modelpin.yaml`, or
360
+ pass `--reasoning-effort` to `baseline` and `check` (both read it), to measure the effort you
361
+ will ship (`none`, `minimal`, `low`, `medium`, `high` or `xhigh`; which values a model accepts
362
+ is OpenAI's call). A scenario can set its own `reasoning_effort:`. It is sent only to reasoning
363
+ models. Unset, and unless a scenario sets its own, Modelpin sends nothing, with one exception:
364
+ `gpt-5.6` (Sol, Terra, Luna), `gpt-6-sol` and `gpt-6-luna` accept tools on Chat Completions only
365
+ with reasoning off, so a scenario that sends tools to them runs with `none`. `last-report.md`
366
+ (the pull-request comment) and `migration-report.md` state the effort each model was sent.
367
+ Testing tool use on those models at another effort needs OpenAI's Responses API, which
368
+ Modelpin does not support yet.
369
+
347
370
  **Cross-vendor:** the baseline and the candidate can be on different providers — record the
348
371
  baseline with one `--provider`, check with another (`modelpin check --provider google --to
349
372
  gemini-3.1-flash-lite`). `check` reads the baseline from disk, so only the candidate's key is needed
@@ -380,6 +403,7 @@ current model, once.
380
403
  |---|---|
381
404
  | `modelpin init [dir]` | Write `modelpin.yaml` and a starter scenario, configured from the models your code calls. `--demo` writes the offline sandbox; `--agent-example` adds a tool-calling agent scenario. Never overwrites. |
382
405
  | `modelpin scan [path]` | List the model ids a repository (or a single file) uses, and where. |
406
+ | `modelpin watch` | Which of the models in `modelpin.yaml` (its `models:` and `judge_model`; with `--scan`, the ids in your source; your recorded baselines are listed but never alarmed on) are retiring, when, the successor the vendor names, and the exact `check` command; every date carries its source page and fetch date. Exit `0` all clear, `1` a model is inside its notice window (a vendor deprecation, or a shutdown date within 90 days) or already retired, `3` a model is unknown to the registry (not a clearance; ids served by OpenAI-compatible hosts are unknown by design, since the registry reads the three labs' own pages), `4` nothing declared, or the config or registry could not be read. `--json` for scripts; `--registry <path>` to use a different `data/models.json` in place of the shipped one. Never touches the network. |
383
407
  | `modelpin draft <file>` | Draft scenarios from one file of your app into `scenarios/.drafts/` for review (one model call). `--count`, `--model`, `--provider`. |
384
408
  | `modelpin baseline` | Run every scenario N times on your current model and save the results. |
385
409
  | `modelpin check --to <model>` | Replay on a candidate, compare with the baseline, print verdicts, write the report, exit `0`/`1`/`3`/`4`. |
@@ -455,9 +479,15 @@ borderline change rather than raise a false alarm. Know the trade-offs:
455
479
  unmeasured.
456
480
  - **It measures change, not quality.** It never says one model is better.
457
481
 
458
- **What happened when it was run at scale, live:** 972 same-model checks across six Gemini
459
- models raised **0** false alarms, and across six real Gemini upgrades it flagged 28 regressions,
460
- every one of which an independent model rated a material behavior change —
482
+ **What happened when it was run at scale, live:** 972 same-model scenario-checks across six
483
+ Gemini models raised **0** false alarms. They are 82 scenarios re-used across models and
484
+ repeats, not 972 independent trials, and many of those scenarios answered so consistently at
485
+ these settings that no signal could have fired (a harness run on two of the same models put
486
+ that at 230 of 240 trials). So this says the tool did not cry wolf in ordinary use on this
487
+ suite; it is not a false-positive rate, and the bounds are in `docs/fp-measurement.md`.
488
+ Across six real Gemini upgrades it flagged 28
489
+ regressions, and a second language model asked to judge materiality rated every one a
490
+ material behavior change, which is an opinion, not ground truth —
461
491
  [docs/live-validation.md](https://github.com/samarthputhraya/modelpin/blob/main/docs/live-validation.md),
462
492
  with the bugs that campaign found in Modelpin itself.
463
493
 
@@ -42,8 +42,17 @@ OK 6 scenario(s) unchanged
42
42
  Modelpin or any third party other than the model providers you configure (and, in CI, your own
43
43
  pull request).
44
44
 
45
- Modelpin does not watch provider release or retirement feeds and does not open pull requests on
46
- its own: you choose the candidate model, and a scheduled workflow can re-check it on your clock.
45
+ `modelpin watch` crosses the models your config names (and, with `--scan`, the ones in your
46
+ source) with a registry shipped inside each release, and tells you which of the ones **it knows**
47
+ are retiring, when, the successor the vendor names, and the exact check to run next. Every entry
48
+ in that registry carries the vendor page it was read from and the day it was read; a model the
49
+ registry has never heard of is reported as unknown, never as clear. The registry is transcribed
50
+ from OpenAI, Anthropic and Google's own deprecation and model pages, not from the catalogues
51
+ of OpenAI-compatible
52
+ hosts. **Nothing in Modelpin polls provider feeds**: the registry is refreshed when a release
53
+ ships, so it is only as current as the release you installed (`--registry <path>` points at a
54
+ newer file). Modelpin does not open pull requests on its own: you choose the candidate model,
55
+ and a scheduled workflow can re-check it on your clock.
47
56
 
48
57
  CLI: `modelpin` (alias `mp`). License: Apache-2.0.
49
58
 
@@ -71,7 +80,7 @@ Python 3.11 or newer.
71
80
 
72
81
  ```bash
73
82
  pip install "modelpin[providers]" # or: pipx install "modelpin[providers]"
74
- modelpin version # -> modelpin 0.4.2
83
+ modelpin version # -> modelpin 0.5.2
75
84
  ```
76
85
 
77
86
  The `providers` extra installs the OpenAI, Anthropic and Google SDKs. Plain `pip install modelpin`
@@ -110,7 +119,10 @@ You will see one scenario per verdict:
110
119
 
111
120
  The command exits **1** because regressions were found — that is what fails a CI build. The full
112
121
  report is written to `.modelpin/last-report.md`, the same file the GitHub Action posts on a pull
113
- request. Edit `traces.json` and re-run to watch the verdicts move.
122
+ request. Beside it, `.modelpin/migration-report.md` tells the same result in plain English for
123
+ whoever decides on the switch: a one-paragraph verdict, each changed scenario with a before and
124
+ after example, what the check did not cover, and the run's date, models, runs and calls. Edit
125
+ `traces.json` and re-run to watch the verdicts move.
114
126
 
115
127
  ## Use it on your app
116
128
 
@@ -290,7 +302,7 @@ key, is not recognised.
290
302
 
291
303
  | Provider (`providers:` / `--provider`) | Credentials | Notes |
292
304
  |---|---|---|
293
- | `openai` | `OPENAI_API_KEY` | Chat Completions, multi-turn tool calls. Reasoning models (`o1`/`o3`/`o4`/`gpt-5*`) get `max_completion_tokens` and no temperature |
305
+ | `openai` | `OPENAI_API_KEY` | Chat Completions, multi-turn tool calls. Reasoning models (`o1`/`o3`/`o4`/`gpt-5*`/`gpt-6*`) get `max_completion_tokens` and no temperature |
294
306
  | `anthropic` | `ANTHROPIC_API_KEY`, **or** Claude on Vertex AI: `ANTHROPIC_VERTEX_PROJECT_ID` + `gcloud auth application-default login` (`CLOUD_ML_REGION` defaults to `global`) | Messages API, multi-turn tool calls. Newer Claude models accept only default sampling, so a scenario's `temperature` is not sent to them. Verified offline against the SDK's request shapes; not yet validated by a live run |
295
307
  | `google` | `GEMINI_API_KEY` (AI Studio), **or** Vertex AI: `GOOGLE_GENAI_USE_VERTEXAI=true` + `GOOGLE_CLOUD_PROJECT` + application-default login | Multi-turn tool calls. On Vertex, `GOOGLE_CLOUD_LOCATION` defaults to `global`; in the project's testing `gemini-3.x` ids were not served on `us-central1`, so set it only if you need a specific region |
296
308
  | `groq`, `openrouter`, `together`, `cerebras` | `GROQ_API_KEY`, `OPENROUTER_API_KEY`, `TOGETHER_API_KEY`, `CEREBRAS_API_KEY` | OpenAI-compatible endpoints. Groq has a free tier |
@@ -301,6 +313,17 @@ vendor (`gpt-*`, `claude-*` and `gemini-*` do; `openai/gpt-oss-120b` on Groq doe
301
313
  model that is neither the one you run today nor the candidate. Remove `judge_model:` to compare
302
314
  only tool calls, refusals and text checks, with no extra calls.
303
315
 
316
+ **Reasoning effort** (OpenAI reasoning models): set `reasoning_effort:` in `modelpin.yaml`, or
317
+ pass `--reasoning-effort` to `baseline` and `check` (both read it), to measure the effort you
318
+ will ship (`none`, `minimal`, `low`, `medium`, `high` or `xhigh`; which values a model accepts
319
+ is OpenAI's call). A scenario can set its own `reasoning_effort:`. It is sent only to reasoning
320
+ models. Unset, and unless a scenario sets its own, Modelpin sends nothing, with one exception:
321
+ `gpt-5.6` (Sol, Terra, Luna), `gpt-6-sol` and `gpt-6-luna` accept tools on Chat Completions only
322
+ with reasoning off, so a scenario that sends tools to them runs with `none`. `last-report.md`
323
+ (the pull-request comment) and `migration-report.md` state the effort each model was sent.
324
+ Testing tool use on those models at another effort needs OpenAI's Responses API, which
325
+ Modelpin does not support yet.
326
+
304
327
  **Cross-vendor:** the baseline and the candidate can be on different providers — record the
305
328
  baseline with one `--provider`, check with another (`modelpin check --provider google --to
306
329
  gemini-3.1-flash-lite`). `check` reads the baseline from disk, so only the candidate's key is needed
@@ -337,6 +360,7 @@ current model, once.
337
360
  |---|---|
338
361
  | `modelpin init [dir]` | Write `modelpin.yaml` and a starter scenario, configured from the models your code calls. `--demo` writes the offline sandbox; `--agent-example` adds a tool-calling agent scenario. Never overwrites. |
339
362
  | `modelpin scan [path]` | List the model ids a repository (or a single file) uses, and where. |
363
+ | `modelpin watch` | Which of the models in `modelpin.yaml` (its `models:` and `judge_model`; with `--scan`, the ids in your source; your recorded baselines are listed but never alarmed on) are retiring, when, the successor the vendor names, and the exact `check` command; every date carries its source page and fetch date. Exit `0` all clear, `1` a model is inside its notice window (a vendor deprecation, or a shutdown date within 90 days) or already retired, `3` a model is unknown to the registry (not a clearance; ids served by OpenAI-compatible hosts are unknown by design, since the registry reads the three labs' own pages), `4` nothing declared, or the config or registry could not be read. `--json` for scripts; `--registry <path>` to use a different `data/models.json` in place of the shipped one. Never touches the network. |
340
364
  | `modelpin draft <file>` | Draft scenarios from one file of your app into `scenarios/.drafts/` for review (one model call). `--count`, `--model`, `--provider`. |
341
365
  | `modelpin baseline` | Run every scenario N times on your current model and save the results. |
342
366
  | `modelpin check --to <model>` | Replay on a candidate, compare with the baseline, print verdicts, write the report, exit `0`/`1`/`3`/`4`. |
@@ -412,9 +436,15 @@ borderline change rather than raise a false alarm. Know the trade-offs:
412
436
  unmeasured.
413
437
  - **It measures change, not quality.** It never says one model is better.
414
438
 
415
- **What happened when it was run at scale, live:** 972 same-model checks across six Gemini
416
- models raised **0** false alarms, and across six real Gemini upgrades it flagged 28 regressions,
417
- every one of which an independent model rated a material behavior change —
439
+ **What happened when it was run at scale, live:** 972 same-model scenario-checks across six
440
+ Gemini models raised **0** false alarms. They are 82 scenarios re-used across models and
441
+ repeats, not 972 independent trials, and many of those scenarios answered so consistently at
442
+ these settings that no signal could have fired (a harness run on two of the same models put
443
+ that at 230 of 240 trials). So this says the tool did not cry wolf in ordinary use on this
444
+ suite; it is not a false-positive rate, and the bounds are in `docs/fp-measurement.md`.
445
+ Across six real Gemini upgrades it flagged 28
446
+ regressions, and a second language model asked to judge materiality rated every one a
447
+ material behavior change, which is an opinion, not ground truth —
418
448
  [docs/live-validation.md](https://github.com/samarthputhraya/modelpin/blob/main/docs/live-validation.md),
419
449
  with the bugs that campaign found in Modelpin itself.
420
450