grift-cli 0.5.9__tar.gz → 0.7.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 (357) hide show
  1. grift_cli-0.7.2/.github/workflows/ci.yml +456 -0
  2. grift_cli-0.7.2/.github/workflows/publish.yml +277 -0
  3. grift_cli-0.7.2/.github/workflows/v060-provider-live.yml +161 -0
  4. grift_cli-0.7.2/.gitignore +27 -0
  5. grift_cli-0.7.2/CHANGELOG.md +465 -0
  6. grift_cli-0.7.2/PKG-INFO +428 -0
  7. grift_cli-0.7.2/README.en.md +481 -0
  8. grift_cli-0.7.2/README.md +404 -0
  9. grift_cli-0.7.2/action.yml +151 -0
  10. grift_cli-0.7.2/benchmarks/v060/IMPLEMENTATION-AGENT-INSTRUCTIONS.md +321 -0
  11. grift_cli-0.7.2/benchmarks/v060/README.md +51 -0
  12. grift_cli-0.7.2/benchmarks/v060/data/alignment_cases.jsonl +2 -0
  13. grift_cli-0.7.2/benchmarks/v060/data/gharchive_daily_summary.csv +56 -0
  14. grift_cli-0.7.2/benchmarks/v060/data/gharchive_events_2024-01-15_to_21.ndjson +554 -0
  15. grift_cli-0.7.2/benchmarks/v060/data/gharchive_repository_summary.csv +9 -0
  16. grift_cli-0.7.2/benchmarks/v060/data/independent_repo_actor_audit_2026-08-30.json +172 -0
  17. grift_cli-0.7.2/benchmarks/v060/data/metric_catalog.csv +18 -0
  18. grift_cli-0.7.2/benchmarks/v060/data/role_ground_truth_sample.csv +41 -0
  19. grift_cli-0.7.2/benchmarks/v060/data/role_label_counts.csv +6 -0
  20. grift_cli-0.7.2/benchmarks/v060/data/tracker_lifecycle_fixture.csv +9 -0
  21. grift_cli-0.7.2/benchmarks/v060/expected/tracker_fixture_expected.json +16 -0
  22. grift_cli-0.7.2/benchmarks/v060/golden/expected/actor-partition.json +1 -0
  23. grift_cli-0.7.2/benchmarks/v060/golden/fixtures/actor-partition-repo.json +58 -0
  24. grift_cli-0.7.2/benchmarks/v060/golden/manifest.json +1 -0
  25. grift_cli-0.7.2/benchmarks/v060/golden/migrations.json +1 -0
  26. grift_cli-0.7.2/benchmarks/v060/quality-report.md +47 -0
  27. grift_cli-0.7.2/benchmarks/v060/schemas/benchmark-manifest.schema.json +16 -0
  28. grift_cli-0.7.2/benchmarks/v060/schemas/event-observation.schema.json +19 -0
  29. grift_cli-0.7.2/benchmarks/v060/schemas/role-validation.schema.json +24 -0
  30. grift_cli-0.7.2/benchmarks/v060/sources.json +535 -0
  31. grift_cli-0.7.2/docs/CORPUS-CANDIDATES-v2026.11-20260822.md +116 -0
  32. grift_cli-0.7.2/docs/EVIDENCE-v056-smoke-raw.log +31 -0
  33. grift_cli-0.7.2/docs/EVIDENCE-v058-smoke-raw.log +21 -0
  34. grift_cli-0.7.2/docs/EVIDENCE-v058b-smoke-raw.log +43 -0
  35. grift_cli-0.7.2/docs/EVIDENCE-v059-smoke-raw.log +20 -0
  36. grift_cli-0.7.2/docs/EVIDENCE-v059b-smoke-raw.log +12 -0
  37. grift_cli-0.7.2/docs/PLAN-v060-20260825.md +144 -0
  38. grift_cli-0.7.2/docs/READERS-GUIDE-draft-20260822.md +30 -0
  39. grift_cli-0.7.2/docs/REQUIREMENTS-v060.md +171 -0
  40. grift_cli-0.7.2/docs/RESEARCH-v060.md +27 -0
  41. grift_cli-0.7.2/docs/V060-CLOSURE-LEDGER-20260831.md +120 -0
  42. grift_cli-0.7.2/docs/alignment-schema.md +105 -0
  43. grift_cli-0.7.2/docs/contribute-intake-design-20260822.md +131 -0
  44. grift_cli-0.7.2/docs/coverage-map.md +57 -0
  45. grift_cli-0.7.2/docs/en/coverage-map.md +63 -0
  46. {grift_cli-0.5.9 → grift_cli-0.7.2}/docs/en/identity-schema.md +20 -1
  47. {grift_cli-0.5.9 → grift_cli-0.7.2}/docs/en/metrics-guide.md +83 -4
  48. grift_cli-0.7.2/docs/en/norms.md +123 -0
  49. grift_cli-0.7.2/docs/en/persona-answers.md +51 -0
  50. grift_cli-0.7.2/docs/evidence/v060/attest-portfolio.md +77 -0
  51. grift_cli-0.7.2/docs/evidence/v060/grift-2055-audit.md +98 -0
  52. {grift_cli-0.5.9 → grift_cli-0.7.2}/docs/identity-schema.md +20 -1
  53. grift_cli-0.7.2/docs/input-export-schema.md +157 -0
  54. {grift_cli-0.5.9 → grift_cli-0.7.2}/docs/metrics-guide.md +84 -4
  55. grift_cli-0.7.2/docs/migration-v060.md +183 -0
  56. grift_cli-0.7.2/docs/migration-v070.md +387 -0
  57. grift_cli-0.7.2/docs/migration-v071.md +453 -0
  58. grift_cli-0.7.2/docs/migration-v072.md +540 -0
  59. grift_cli-0.7.2/docs/norms.md +189 -0
  60. {grift_cli-0.5.9 → grift_cli-0.7.2}/docs/persona-answers.md +43 -23
  61. grift_cli-0.7.2/docs/project-schema.md +48 -0
  62. grift_cli-0.7.2/docs/report-v2.md +202 -0
  63. grift_cli-0.7.2/docs/rereview-checklist-template.md +50 -0
  64. {grift_cli-0.5.9 → grift_cli-0.7.2}/golden/README.md +4 -0
  65. {grift_cli-0.5.9 → grift_cli-0.7.2}/golden/coverage.md +15 -8
  66. grift_cli-0.7.2/golden/identity/G1-click.toml +15 -0
  67. {grift_cli-0.5.9 → grift_cli-0.7.2}/pyproject.toml +30 -2
  68. grift_cli-0.7.2/scripts/action_contract_guard.py +386 -0
  69. grift_cli-0.7.2/scripts/build_library_prevalence.py +190 -0
  70. {grift_cli-0.5.9 → grift_cli-0.7.2}/scripts/gen_coverage_table.py +9 -3
  71. grift_cli-0.7.2/scripts/intake_contract_parity.py +793 -0
  72. grift_cli-0.7.2/scripts/package_smoke.py +1253 -0
  73. grift_cli-0.7.2/scripts/v060_blind_pilot.py +1116 -0
  74. grift_cli-0.7.2/scripts/v060_golden.py +968 -0
  75. grift_cli-0.7.2/scripts/v060_golden_baseline.py +210 -0
  76. grift_cli-0.7.2/scripts/v060_provider_live_gate.py +2331 -0
  77. grift_cli-0.7.2/scripts/v060_scenario_matrix.py +2255 -0
  78. grift_cli-0.7.2/scripts/v070_benchmark.py +782 -0
  79. grift_cli-0.7.2/src/tep_cli/__main__.py +1113 -0
  80. grift_cli-0.7.2/src/tep_cli/benchmark_cmd.py +105 -0
  81. grift_cli-0.7.2/src/tep_cli/options.py +897 -0
  82. grift_cli-0.7.2/src/tep_cli/output.py +75 -0
  83. grift_cli-0.7.2/src/tep_cli/subject.py +1295 -0
  84. grift_cli-0.7.2/src/tep_core/actor_artifacts.py +1329 -0
  85. grift_cli-0.7.2/src/tep_core/actor_basis.py +89 -0
  86. grift_cli-0.7.2/src/tep_core/actor_directory.py +229 -0
  87. grift_cli-0.7.2/src/tep_core/ai_identity.py +160 -0
  88. grift_cli-0.7.2/src/tep_core/alignment.py +686 -0
  89. grift_cli-0.7.2/src/tep_core/analyze.py +420 -0
  90. grift_cli-0.7.2/src/tep_core/analyze_v2.py +964 -0
  91. grift_cli-0.7.2/src/tep_core/archive_events.py +318 -0
  92. grift_cli-0.7.2/src/tep_core/attest.py +1417 -0
  93. grift_cli-0.7.2/src/tep_core/attribution.py +887 -0
  94. grift_cli-0.7.2/src/tep_core/benchmark.py +343 -0
  95. grift_cli-0.7.2/src/tep_core/benchmark_assets/v060/data/alignment_cases.jsonl +2 -0
  96. grift_cli-0.7.2/src/tep_core/benchmark_assets/v060/data/gharchive_daily_summary.csv +56 -0
  97. grift_cli-0.7.2/src/tep_core/benchmark_assets/v060/data/gharchive_events_2024-01-15_to_21.ndjson +554 -0
  98. grift_cli-0.7.2/src/tep_core/benchmark_assets/v060/data/gharchive_repository_summary.csv +9 -0
  99. grift_cli-0.7.2/src/tep_core/benchmark_assets/v060/data/independent_repo_actor_audit_2026-08-30.json +172 -0
  100. grift_cli-0.7.2/src/tep_core/benchmark_assets/v060/data/metric_catalog.csv +18 -0
  101. grift_cli-0.7.2/src/tep_core/benchmark_assets/v060/data/role_ground_truth_sample.csv +41 -0
  102. grift_cli-0.7.2/src/tep_core/benchmark_assets/v060/data/role_label_counts.csv +6 -0
  103. grift_cli-0.7.2/src/tep_core/benchmark_assets/v060/data/tracker_lifecycle_fixture.csv +9 -0
  104. grift_cli-0.7.2/src/tep_core/benchmark_assets/v060/expected/tracker_fixture_expected.json +16 -0
  105. grift_cli-0.7.2/src/tep_core/benchmark_assets/v060/schemas/benchmark-manifest.schema.json +16 -0
  106. grift_cli-0.7.2/src/tep_core/benchmark_assets/v060/schemas/event-observation.schema.json +19 -0
  107. grift_cli-0.7.2/src/tep_core/benchmark_assets/v060/schemas/role-validation.schema.json +24 -0
  108. grift_cli-0.7.2/src/tep_core/benchmark_assets/v060/sources.json +535 -0
  109. {grift_cli-0.5.9 → grift_cli-0.7.2}/src/tep_core/cochange.py +8 -4
  110. grift_cli-0.7.2/src/tep_core/complementarity.py +207 -0
  111. {grift_cli-0.5.9 → grift_cli-0.7.2}/src/tep_core/context_profile.py +103 -26
  112. grift_cli-0.7.2/src/tep_core/contribute.py +582 -0
  113. grift_cli-0.7.2/src/tep_core/contribution_v2.py +2599 -0
  114. grift_cli-0.7.2/src/tep_core/coordination.py +125 -0
  115. grift_cli-0.7.2/src/tep_core/data/prevalence/v2026.09/library_prevalence.json +2131 -0
  116. grift_cli-0.7.2/src/tep_core/dates.py +48 -0
  117. grift_cli-0.7.2/src/tep_core/dependency_manifest.py +215 -0
  118. grift_cli-0.7.2/src/tep_core/digest.py +18 -0
  119. grift_cli-0.7.2/src/tep_core/event_rhythm.py +214 -0
  120. grift_cli-0.7.2/src/tep_core/experience.py +1361 -0
  121. grift_cli-0.7.2/src/tep_core/experience_collect.py +675 -0
  122. {grift_cli-0.5.9 → grift_cli-0.7.2}/src/tep_core/export.py +1 -3
  123. grift_cli-0.7.2/src/tep_core/forge.py +395 -0
  124. grift_cli-0.7.2/src/tep_core/forge_public.py +711 -0
  125. grift_cli-0.7.2/src/tep_core/gitutil.py +256 -0
  126. grift_cli-0.7.2/src/tep_core/identity.py +510 -0
  127. grift_cli-0.7.2/src/tep_core/local_inputs.py +118 -0
  128. {grift_cli-0.5.9 → grift_cli-0.7.2}/src/tep_core/origin.py +19 -4
  129. grift_cli-0.7.2/src/tep_core/outcome.py +202 -0
  130. grift_cli-0.7.2/src/tep_core/path_surface.py +99 -0
  131. grift_cli-0.7.2/src/tep_core/portfolio.py +1252 -0
  132. grift_cli-0.7.2/src/tep_core/prevalence.py +172 -0
  133. grift_cli-0.7.2/src/tep_core/project.py +248 -0
  134. grift_cli-0.7.2/src/tep_core/public_evidence.py +1126 -0
  135. grift_cli-0.7.2/src/tep_core/public_fetch.py +400 -0
  136. {grift_cli-0.5.9 → grift_cli-0.7.2}/src/tep_core/report.py +13 -0
  137. grift_cli-0.7.2/src/tep_core/report_v2.py +861 -0
  138. grift_cli-0.7.2/src/tep_core/revision.py +220 -0
  139. {grift_cli-0.5.9 → grift_cli-0.7.2}/src/tep_core/rework.py +6 -3
  140. grift_cli-0.7.2/src/tep_core/rhythm.py +134 -0
  141. grift_cli-0.7.2/src/tep_core/role_lens.py +104 -0
  142. grift_cli-0.7.2/src/tep_core/role_profile.py +259 -0
  143. grift_cli-0.7.2/src/tep_core/role_validation.py +167 -0
  144. grift_cli-0.7.2/src/tep_core/schema.py +1764 -0
  145. grift_cli-0.7.2/src/tep_core/schema_v2.py +805 -0
  146. grift_cli-0.7.2/src/tep_core/schemas/__init__.py +1 -0
  147. grift_cli-0.7.2/src/tep_core/schemas/v060-contracts.schema.json +4080 -0
  148. {grift_cli-0.5.9 → grift_cli-0.7.2}/src/tep_core/scope.py +14 -2
  149. grift_cli-0.7.2/src/tep_core/secrets_guard.py +81 -0
  150. grift_cli-0.7.2/src/tep_core/secure_output.py +375 -0
  151. grift_cli-0.7.2/src/tep_core/source_binding.py +319 -0
  152. grift_cli-0.7.2/src/tep_core/surface_profile.py +199 -0
  153. grift_cli-0.7.2/src/tep_core/tagset.py +133 -0
  154. grift_cli-0.7.2/src/tep_core/tendency.py +265 -0
  155. grift_cli-0.7.2/src/tep_core/tracker.py +581 -0
  156. grift_cli-0.7.2/src/tep_core/tracker_lifecycle.py +372 -0
  157. grift_cli-0.7.2/src/tep_core/v2_constants.py +167 -0
  158. grift_cli-0.7.2/src/tep_core/verification_profile.py +155 -0
  159. grift_cli-0.7.2/src/tep_core/verify.py +1015 -0
  160. grift_cli-0.7.2/src/tep_core/version.py +17 -0
  161. {grift_cli-0.5.9 → grift_cli-0.7.2}/tests/coverage_matrix.py +28 -12
  162. grift_cli-0.7.2/tests/fixtures/v060/forge.json +14 -0
  163. grift_cli-0.7.2/tests/fixtures/v060/p0-results.json +475 -0
  164. grift_cli-0.7.2/tests/fixtures/v060/project-declared.json +73 -0
  165. grift_cli-0.7.2/tests/fixtures/v060/project-init.toml +21 -0
  166. grift_cli-0.7.2/tests/fixtures/v060/project.toml +20 -0
  167. grift_cli-0.7.2/tests/fixtures/v060/repo-smoke-head.json +34 -0
  168. grift_cli-0.7.2/tests/fixtures/v060/run_p0_falsify.py +1824 -0
  169. grift_cli-0.7.2/tests/fixtures/v060/tracker.json +14 -0
  170. grift_cli-0.7.2/tests/test_action_contract.py +432 -0
  171. grift_cli-0.7.2/tests/test_benchmark_pack_v060.py +667 -0
  172. grift_cli-0.7.2/tests/test_cli_v060.py +376 -0
  173. {grift_cli-0.5.9 → grift_cli-0.7.2}/tests/test_contribute.py +23 -8
  174. {grift_cli-0.5.9 → grift_cli-0.7.2}/tests/test_coverage.py +29 -1
  175. {grift_cli-0.5.9 → grift_cli-0.7.2}/tests/test_golden.py +43 -8
  176. grift_cli-0.7.2/tests/test_intake_contract_parity.py +162 -0
  177. {grift_cli-0.5.9 → grift_cli-0.7.2}/tests/test_intake_disclosure.py +13 -8
  178. grift_cli-0.7.2/tests/test_migration_v060.py +122 -0
  179. grift_cli-0.7.2/tests/test_package_contract.py +2022 -0
  180. grift_cli-0.7.2/tests/test_publish_baseline_pin.py +73 -0
  181. {grift_cli-0.5.9 → grift_cli-0.7.2}/tests/test_ux_v057.py +15 -13
  182. {grift_cli-0.5.9 → grift_cli-0.7.2}/tests/test_v058_gates.py +16 -28
  183. grift_cli-0.7.2/tests/test_v060_actor_account_source_binding_cli.py +300 -0
  184. grift_cli-0.7.2/tests/test_v060_actor_artifacts.py +639 -0
  185. grift_cli-0.7.2/tests/test_v060_actor_partition.py +400 -0
  186. grift_cli-0.7.2/tests/test_v060_actor_public_directory.py +105 -0
  187. grift_cli-0.7.2/tests/test_v060_alignment.py +160 -0
  188. grift_cli-0.7.2/tests/test_v060_attest_core.py +788 -0
  189. grift_cli-0.7.2/tests/test_v060_attest_input_binding.py +451 -0
  190. grift_cli-0.7.2/tests/test_v060_attest_portfolio_cli.py +877 -0
  191. grift_cli-0.7.2/tests/test_v060_binding_quality.py +327 -0
  192. grift_cli-0.7.2/tests/test_v060_blind_pilot.py +328 -0
  193. grift_cli-0.7.2/tests/test_v060_bound_export_observations.py +316 -0
  194. grift_cli-0.7.2/tests/test_v060_complete.py +498 -0
  195. grift_cli-0.7.2/tests/test_v060_contribute_atomic_consent.py +311 -0
  196. grift_cli-0.7.2/tests/test_v060_contribution_profiles.py +1693 -0
  197. grift_cli-0.7.2/tests/test_v060_cross_repo.py +734 -0
  198. grift_cli-0.7.2/tests/test_v060_determinism.py +107 -0
  199. grift_cli-0.7.2/tests/test_v060_docs_parity.py +108 -0
  200. grift_cli-0.7.2/tests/test_v060_emit_robustness.py +262 -0
  201. grift_cli-0.7.2/tests/test_v060_experience_collect.py +295 -0
  202. grift_cli-0.7.2/tests/test_v060_experience_incomplete.py +104 -0
  203. grift_cli-0.7.2/tests/test_v060_experience_product_cli.py +565 -0
  204. grift_cli-0.7.2/tests/test_v060_experience_role.py +797 -0
  205. grift_cli-0.7.2/tests/test_v060_forge_evidence.py +1708 -0
  206. grift_cli-0.7.2/tests/test_v060_golden_runner.py +474 -0
  207. grift_cli-0.7.2/tests/test_v060_historical_exact_head.py +172 -0
  208. grift_cli-0.7.2/tests/test_v060_identity_v2.py +205 -0
  209. grift_cli-0.7.2/tests/test_v060_independent_audit.py +539 -0
  210. grift_cli-0.7.2/tests/test_v060_inputs.py +135 -0
  211. grift_cli-0.7.2/tests/test_v060_large_repo_degradation.py +248 -0
  212. grift_cli-0.7.2/tests/test_v060_no_false_zero.py +134 -0
  213. grift_cli-0.7.2/tests/test_v060_observed_compare.py +605 -0
  214. grift_cli-0.7.2/tests/test_v060_p0_runner.py +65 -0
  215. grift_cli-0.7.2/tests/test_v060_portfolio_core.py +594 -0
  216. grift_cli-0.7.2/tests/test_v060_provider_live_gate.py +816 -0
  217. grift_cli-0.7.2/tests/test_v060_provider_live_workflow.py +197 -0
  218. grift_cli-0.7.2/tests/test_v060_public_actor_presentation.py +436 -0
  219. grift_cli-0.7.2/tests/test_v060_public_evidence_contract.py +111 -0
  220. grift_cli-0.7.2/tests/test_v060_public_registry_export.py +479 -0
  221. grift_cli-0.7.2/tests/test_v060_release_consistency.py +461 -0
  222. grift_cli-0.7.2/tests/test_v060_report_deep_schema.py +202 -0
  223. grift_cli-0.7.2/tests/test_v060_report_strict_producer.py +227 -0
  224. grift_cli-0.7.2/tests/test_v060_revision.py +193 -0
  225. grift_cli-0.7.2/tests/test_v060_rhythm.py +96 -0
  226. grift_cli-0.7.2/tests/test_v060_scenario_matrix.py +752 -0
  227. grift_cli-0.7.2/tests/test_v060_schema.py +231 -0
  228. grift_cli-0.7.2/tests/test_v060_schema_contracts.py +1171 -0
  229. grift_cli-0.7.2/tests/test_v060_subject_source_binding_cli.py +479 -0
  230. grift_cli-0.7.2/tests/test_v060_surfaces.py +129 -0
  231. grift_cli-0.7.2/tests/test_v060_verify_fixed_revision.py +124 -0
  232. grift_cli-0.7.2/tests/test_v060_verify_inferred_actor.py +155 -0
  233. grift_cli-0.7.2/tests/test_v070_actor_time_phase.py +144 -0
  234. grift_cli-0.7.2/tests/test_v070_align_share.py +280 -0
  235. grift_cli-0.7.2/tests/test_v070_benchmark.py +363 -0
  236. grift_cli-0.7.2/tests/test_v070_cli_surface.py +281 -0
  237. grift_cli-0.7.2/tests/test_v070_complementarity.py +539 -0
  238. grift_cli-0.7.2/tests/test_v070_dependency_attribution.py +149 -0
  239. grift_cli-0.7.2/tests/test_v070_dependency_experience.py +210 -0
  240. grift_cli-0.7.2/tests/test_v070_dependency_manifest.py +152 -0
  241. grift_cli-0.7.2/tests/test_v070_history_incomplete.py +266 -0
  242. grift_cli-0.7.2/tests/test_v070_intake_contract.py +145 -0
  243. grift_cli-0.7.2/tests/test_v070_library_prevalence.py +469 -0
  244. grift_cli-0.7.2/tests/test_v070_norms_link.py +199 -0
  245. grift_cli-0.7.2/tests/test_v070_outcome.py +387 -0
  246. grift_cli-0.7.2/tests/test_v070_project_min_share.py +128 -0
  247. grift_cli-0.7.2/tests/test_v070_scale_denominator.py +95 -0
  248. grift_cli-0.7.2/tests/test_v071_bot_accounts.py +240 -0
  249. grift_cli-0.7.2/tests/test_v071_gate_failure_detail.py +142 -0
  250. grift_cli-0.7.2/tests/test_v071_response_completeness.py +239 -0
  251. grift_cli-0.7.2/tests/test_v072_empty_actor.py +231 -0
  252. {grift_cli-0.5.9 → grift_cli-0.7.2}/tests/test_verify.py +32 -2
  253. grift_cli-0.5.9/.github/workflows/ci.yml +0 -45
  254. grift_cli-0.5.9/.github/workflows/publish.yml +0 -41
  255. grift_cli-0.5.9/.gitignore +0 -18
  256. grift_cli-0.5.9/.grift/contribution.json +0 -256
  257. grift_cli-0.5.9/CHANGELOG.md +0 -197
  258. grift_cli-0.5.9/PKG-INFO +0 -172
  259. grift_cli-0.5.9/README.en.md +0 -172
  260. grift_cli-0.5.9/README.md +0 -149
  261. grift_cli-0.5.9/action.yml +0 -78
  262. grift_cli-0.5.9/docs/coverage-map.md +0 -35
  263. grift_cli-0.5.9/docs/en/coverage-map.md +0 -38
  264. grift_cli-0.5.9/docs/en/norms.md +0 -69
  265. grift_cli-0.5.9/docs/en/persona-answers.md +0 -33
  266. grift_cli-0.5.9/docs/norms.md +0 -101
  267. grift_cli-0.5.9/golden/identity/G1-click.toml +0 -15
  268. grift_cli-0.5.9/src/tep_cli/__main__.py +0 -662
  269. grift_cli-0.5.9/src/tep_core/analyze.py +0 -144
  270. grift_cli-0.5.9/src/tep_core/contribute.py +0 -156
  271. grift_cli-0.5.9/src/tep_core/gitutil.py +0 -112
  272. grift_cli-0.5.9/src/tep_core/identity.py +0 -141
  273. grift_cli-0.5.9/src/tep_core/schema.py +0 -543
  274. grift_cli-0.5.9/src/tep_core/verify.py +0 -133
  275. grift_cli-0.5.9/src/tep_core/version.py +0 -7
  276. {grift_cli-0.5.9 → grift_cli-0.7.2}/.github/workflows/kpi-monthly.yml +0 -0
  277. {grift_cli-0.5.9 → grift_cli-0.7.2}/LICENSE +0 -0
  278. {grift_cli-0.5.9 → grift_cli-0.7.2}/corpus/AD-PILOT-20260822.md +0 -0
  279. {grift_cli-0.5.9 → grift_cli-0.7.2}/corpus/DISCRIMINANT-v2026.09.md +0 -0
  280. {grift_cli-0.5.9 → grift_cli-0.7.2}/corpus/DISCRIMINANT-v2026.11.md +0 -0
  281. {grift_cli-0.5.9 → grift_cli-0.7.2}/corpus/ad-pilot.json +0 -0
  282. {grift_cli-0.5.9 → grift_cli-0.7.2}/corpus/manifest.toml +0 -0
  283. {grift_cli-0.5.9 → grift_cli-0.7.2}/corpus/pins-v2026.09.toml +0 -0
  284. {grift_cli-0.5.9 → grift_cli-0.7.2}/corpus/pins-v2026.11.toml +0 -0
  285. {grift_cli-0.5.9 → grift_cli-0.7.2}/corpus/v2026.09/distributions.json +0 -0
  286. {grift_cli-0.5.9 → grift_cli-0.7.2}/corpus/v2026.11/distributions.json +0 -0
  287. {grift_cli-0.5.9 → grift_cli-0.7.2}/docs/corpus-protocol.md +0 -0
  288. {grift_cli-0.5.9 → grift_cli-0.7.2}/docs/en/corpus-protocol.md +0 -0
  289. {grift_cli-0.5.9 → grift_cli-0.7.2}/docs/en/export-schema.md +0 -0
  290. {grift_cli-0.5.9 → grift_cli-0.7.2}/docs/en/report-schema.md +0 -0
  291. {grift_cli-0.5.9 → grift_cli-0.7.2}/docs/export-schema.md +0 -0
  292. {grift_cli-0.5.9 → grift_cli-0.7.2}/docs/report-schema.md +0 -0
  293. {grift_cli-0.5.9 → grift_cli-0.7.2}/golden/expected/G1-click.json +0 -0
  294. {grift_cli-0.5.9 → grift_cli-0.7.2}/golden/expected/G10-scvi-tools.json +0 -0
  295. {grift_cli-0.5.9 → grift_cli-0.7.2}/golden/expected/G11-kilo.json +0 -0
  296. {grift_cli-0.5.9 → grift_cli-0.7.2}/golden/expected/G12-httpx.json +0 -0
  297. {grift_cli-0.5.9 → grift_cli-0.7.2}/golden/expected/G13-voicevox.json +0 -0
  298. {grift_cli-0.5.9 → grift_cli-0.7.2}/golden/expected/G2-gitignore.json +0 -0
  299. {grift_cli-0.5.9 → grift_cli-0.7.2}/golden/expected/G3-spoon-knife.json +0 -0
  300. {grift_cli-0.5.9 → grift_cli-0.7.2}/golden/expected/G4-express.json +0 -0
  301. {grift_cli-0.5.9 → grift_cli-0.7.2}/golden/expected/G5-typer.json +0 -0
  302. {grift_cli-0.5.9 → grift_cli-0.7.2}/golden/expected/G6-claude-code.json +0 -0
  303. {grift_cli-0.5.9 → grift_cli-0.7.2}/golden/expected/G7-axios.json +0 -0
  304. {grift_cli-0.5.9 → grift_cli-0.7.2}/golden/expected/G8-co.json +0 -0
  305. {grift_cli-0.5.9 → grift_cli-0.7.2}/golden/expected/G9-pyscript.json +0 -0
  306. {grift_cli-0.5.9 → grift_cli-0.7.2}/golden/identity/example.toml +0 -0
  307. {grift_cli-0.5.9 → grift_cli-0.7.2}/golden/pins.toml +0 -0
  308. {grift_cli-0.5.9 → grift_cli-0.7.2}/scripts/admission_v2026_11.py +0 -0
  309. {grift_cli-0.5.9 → grift_cli-0.7.2}/scripts/build_dist_v2026_11.py +0 -0
  310. {grift_cli-0.5.9 → grift_cli-0.7.2}/scripts/build_distributions.py +0 -0
  311. {grift_cli-0.5.9 → grift_cli-0.7.2}/scripts/check_forbidden_vocab.py +0 -0
  312. {grift_cli-0.5.9 → grift_cli-0.7.2}/scripts/corpus_ad_pilot.py +0 -0
  313. {grift_cli-0.5.9 → grift_cli-0.7.2}/scripts/corpus_run.py +0 -0
  314. {grift_cli-0.5.9 → grift_cli-0.7.2}/scripts/discriminant_v2026.py +0 -0
  315. {grift_cli-0.5.9 → grift_cli-0.7.2}/scripts/discriminant_v2026_11.py +0 -0
  316. {grift_cli-0.5.9 → grift_cli-0.7.2}/scripts/gen_golden_expected.py +0 -0
  317. {grift_cli-0.5.9 → grift_cli-0.7.2}/scripts/hygiene_grep.py +0 -0
  318. {grift_cli-0.5.9 → grift_cli-0.7.2}/src/tep_cli/__init__.py +0 -0
  319. {grift_cli-0.5.9 → grift_cli-0.7.2}/src/tep_core/__init__.py +0 -0
  320. {grift_cli-0.5.9 → grift_cli-0.7.2}/src/tep_core/activity.py +0 -0
  321. {grift_cli-0.5.9 → grift_cli-0.7.2}/src/tep_core/core_period.py +0 -0
  322. {grift_cli-0.5.9 → grift_cli-0.7.2}/src/tep_core/data/v2026.09/distributions.json +0 -0
  323. {grift_cli-0.5.9 → grift_cli-0.7.2}/src/tep_core/data/v2026.11/distributions.json +0 -0
  324. {grift_cli-0.5.9 → grift_cli-0.7.2}/src/tep_core/lineage.py +0 -0
  325. {grift_cli-0.5.9 → grift_cli-0.7.2}/src/tep_core/observation.py +0 -0
  326. {grift_cli-0.5.9 → grift_cli-0.7.2}/src/tep_core/paths.py +0 -0
  327. {grift_cli-0.5.9 → grift_cli-0.7.2}/src/tep_core/reference.py +0 -0
  328. {grift_cli-0.5.9 → grift_cli-0.7.2}/src/tep_core/survival.py +0 -0
  329. {grift_cli-0.5.9 → grift_cli-0.7.2}/src/tep_core/tests_observed.py +0 -0
  330. {grift_cli-0.5.9 → grift_cli-0.7.2}/tests/conftest.py +0 -0
  331. {grift_cli-0.5.9 → grift_cli-0.7.2}/tests/git_fixture.py +0 -0
  332. {grift_cli-0.5.9 → grift_cli-0.7.2}/tests/test_activity.py +0 -0
  333. {grift_cli-0.5.9 → grift_cli-0.7.2}/tests/test_cli.py +0 -0
  334. {grift_cli-0.5.9 → grift_cli-0.7.2}/tests/test_cochange.py +0 -0
  335. {grift_cli-0.5.9 → grift_cli-0.7.2}/tests/test_context_profile.py +0 -0
  336. {grift_cli-0.5.9 → grift_cli-0.7.2}/tests/test_default_report_path.py +0 -0
  337. {grift_cli-0.5.9 → grift_cli-0.7.2}/tests/test_discriminant_claims.py +0 -0
  338. {grift_cli-0.5.9 → grift_cli-0.7.2}/tests/test_export.py +0 -0
  339. {grift_cli-0.5.9 → grift_cli-0.7.2}/tests/test_export_recipe.py +0 -0
  340. {grift_cli-0.5.9 → grift_cli-0.7.2}/tests/test_forbidden_vocab.py +0 -0
  341. {grift_cli-0.5.9 → grift_cli-0.7.2}/tests/test_gitutil.py +0 -0
  342. {grift_cli-0.5.9 → grift_cli-0.7.2}/tests/test_gloss_gates.py +0 -0
  343. {grift_cli-0.5.9 → grift_cli-0.7.2}/tests/test_h5_swarm.py +0 -0
  344. {grift_cli-0.5.9 → grift_cli-0.7.2}/tests/test_hygiene.py +0 -0
  345. {grift_cli-0.5.9 → grift_cli-0.7.2}/tests/test_identity_validation.py +0 -0
  346. {grift_cli-0.5.9 → grift_cli-0.7.2}/tests/test_lifecycle_v2.py +0 -0
  347. {grift_cli-0.5.9 → grift_cli-0.7.2}/tests/test_not_observed.py +0 -0
  348. {grift_cli-0.5.9 → grift_cli-0.7.2}/tests/test_origin.py +0 -0
  349. {grift_cli-0.5.9 → grift_cli-0.7.2}/tests/test_persona_answers.py +0 -0
  350. {grift_cli-0.5.9 → grift_cli-0.7.2}/tests/test_release_gate.py +0 -0
  351. {grift_cli-0.5.9 → grift_cli-0.7.2}/tests/test_report.py +0 -0
  352. {grift_cli-0.5.9 → grift_cli-0.7.2}/tests/test_rework.py +0 -0
  353. {grift_cli-0.5.9 → grift_cli-0.7.2}/tests/test_schema.py +0 -0
  354. {grift_cli-0.5.9 → grift_cli-0.7.2}/tests/test_scope.py +0 -0
  355. {grift_cli-0.5.9 → grift_cli-0.7.2}/tests/test_shared_block.py +0 -0
  356. {grift_cli-0.5.9 → grift_cli-0.7.2}/tests/test_survival.py +0 -0
  357. {grift_cli-0.5.9 → grift_cli-0.7.2}/tests/test_verb_semantics.py +0 -0
@@ -0,0 +1,456 @@
1
+ name: ci
2
+
3
+ on:
4
+ push:
5
+ branches: [main]
6
+ pull_request:
7
+ schedule:
8
+ - cron: "0 6 * * 1"
9
+ workflow_dispatch:
10
+
11
+ permissions:
12
+ contents: read
13
+
14
+ jobs:
15
+ test:
16
+ runs-on: ubuntu-latest
17
+ strategy:
18
+ matrix:
19
+ python-version: ["3.11", "3.12"]
20
+ steps:
21
+ # Full history: the checked-in scenario registry binds its evidence to
22
+ # the source-tree commit that produced it, and the unit tests verify
23
+ # that binding by reading the recorded commit from this clone.
24
+ #
25
+ # Checked out under `sender/` so the public intake can sit beside it as a
26
+ # real sibling. actions/checkout refuses a path outside the workspace, so
27
+ # the alternative -- receiver inside the working tree -- would leave an
28
+ # untracked repository in the tree the tests analyse.
29
+ - uses: actions/checkout@v4
30
+ with:
31
+ fetch-depth: 0
32
+ path: sender
33
+ # tests/test_v070_intake_contract.py compares this repository's PURPOSES
34
+ # against the schema the public intake actually enforces, and skips when
35
+ # the receiver is absent. It was absent here, so the comparison never ran
36
+ # in CI -- which is how v0.7.0 shipped a purpose the intake rejects.
37
+ # Pinned to the same immutable SHA as the intake-contract-parity job.
38
+ - uses: actions/checkout@v4
39
+ with:
40
+ repository: Cor-Incorporated/tep-contributions
41
+ ref: 173fac600f3ce64e6df1ca86565f427a391810cc
42
+ path: tep-contributions
43
+ fetch-depth: 0
44
+ persist-credentials: false
45
+ - uses: actions/setup-python@v5
46
+ with:
47
+ python-version: ${{ matrix.python-version }}
48
+ - name: Install
49
+ working-directory: sender
50
+ run: |
51
+ python -m pip install --upgrade pip
52
+ python -m pip install -e ".[dev]"
53
+ - name: Unit tests
54
+ working-directory: sender
55
+ run: python -m pytest tests -m "not golden"
56
+ # A skipped cross-repository test is indistinguishable from a passing one
57
+ # in the job summary. This step fails the build on the skip itself, so a
58
+ # checkout that stops resolving is loud instead of silently green.
59
+ - name: The intake comparison must run, not skip
60
+ working-directory: sender
61
+ env:
62
+ INTAKE_RUN_LOG: ${{ runner.temp }}/intake-not-skipped.log
63
+ run: |
64
+ set -euo pipefail
65
+ python -m pytest tests/test_v070_intake_contract.py -rs -q \
66
+ | tee "$INTAKE_RUN_LOG"
67
+ if grep -q "SKIPPED" "$INTAKE_RUN_LOG"; then
68
+ echo "::error::the public intake checkout is not visible to" \
69
+ "tests/test_v070_intake_contract.py; the purpose comparison did" \
70
+ "not run" >&2
71
+ grep "SKIPPED" "$INTAKE_RUN_LOG" >&2
72
+ exit 1
73
+ fi
74
+
75
+ p0-falsify:
76
+ # The P0 falsification suite is the norms gate: it proves that missing
77
+ # input is reported as a reasoned not_observed instead of a refusal or a
78
+ # fabricated zero. It ran only in publish.yml, so v0.7.0 and v0.7.1 both
79
+ # shipped with `grift actor <actor with no commits>` exiting 2, and the
80
+ # failure was first seen in the release run (34069987423) rather than on
81
+ # the pull request that caused it. Running it here moves that discovery
82
+ # left of the tag.
83
+ #
84
+ # H5-PAIR: publish.yml baseline pin ↔ this job's baseline pin;
85
+ # mutation=changing one pin alone is red in
86
+ # tests/test_publish_baseline_pin.py.
87
+ runs-on: ubuntu-latest
88
+ timeout-minutes: 30
89
+ permissions:
90
+ contents: read
91
+ steps:
92
+ - uses: actions/checkout@v4
93
+ with:
94
+ fetch-depth: 0
95
+ persist-credentials: false
96
+ # Same immutable commit and same env var name as publish.yml, so a green
97
+ # CI run and a green release run mean the same thing.
98
+ # tests/test_publish_baseline_pin.py links the pins in the two files.
99
+ - name: Checkout frozen v0.5.9 compatibility baseline
100
+ uses: actions/checkout@v4
101
+ with:
102
+ repository: Cor-Incorporated/grift-cli
103
+ ref: 6711a3cdcb71f2a2a84276ac5e7a5abd4a7bf79f
104
+ path: .release-baselines/grift-cli-v059
105
+ fetch-depth: 1
106
+ persist-credentials: false
107
+ - uses: actions/setup-python@v5
108
+ with:
109
+ python-version: "3.12"
110
+ - name: Install
111
+ run: |
112
+ python -m pip install --upgrade pip
113
+ python -m pip install -e ".[dev]"
114
+ - name: P0 falsification suite
115
+ env:
116
+ GRIFT_V059_ROOT: ${{ github.workspace }}/.release-baselines/grift-cli-v059
117
+ run: |
118
+ set -euo pipefail
119
+ mkdir -p p0-evidence
120
+ test "$(git -C "$GRIFT_V059_ROOT" rev-parse HEAD)" = \
121
+ "6711a3cdcb71f2a2a84276ac5e7a5abd4a7bf79f"
122
+ python tests/fixtures/v060/run_p0_falsify.py
123
+ cp /tmp/grift-v060-falsify/p0-results.json p0-evidence/p0-results.json
124
+ - name: Upload P0 falsification evidence
125
+ if: always()
126
+ uses: actions/upload-artifact@v4
127
+ with:
128
+ name: p0-falsify-${{ github.event.pull_request.head.sha || github.sha }}
129
+ path: p0-evidence/
130
+ if-no-files-found: error
131
+
132
+ intake-contract-parity:
133
+ # H5-guard: yes
134
+ # H5-NEGATIVE: six of eight real sender->receiver cases must fail closed
135
+ # (masked/raw public door, digest, replay, authority, GitLab linkage).
136
+ # H5-LEDGER: every case and both immutable commits are written to
137
+ # guard-ledger.jsonl and uploaded even when the gate fails.
138
+ # H5-RETIRE: retire only after the public intake is versioned in the same
139
+ # release artifact and three consecutive exact-SHA replacement runs pass.
140
+ # H5-PAIR: immutable checkout refs ↔ expected-SHA runtime enforcement;
141
+ # mutation=floating ref, shallow checkout, or omitted expected SHA is red.
142
+ if: github.event_name != 'schedule'
143
+ needs: test
144
+ runs-on: ubuntu-latest
145
+ timeout-minutes: 15
146
+ permissions:
147
+ contents: read
148
+ env:
149
+ SENDER_SHA: ${{ github.event.pull_request.head.sha || github.sha }}
150
+ COMPANION_SHA: 173fac600f3ce64e6df1ca86565f427a391810cc
151
+ steps:
152
+ - name: Checkout immutable sender
153
+ uses: actions/checkout@v4
154
+ with:
155
+ ref: ${{ github.event.pull_request.head.sha || github.sha }}
156
+ path: sender
157
+ fetch-depth: 0
158
+ persist-credentials: false
159
+ - name: Checkout immutable intake receiver
160
+ uses: actions/checkout@v4
161
+ with:
162
+ repository: Cor-Incorporated/tep-contributions
163
+ ref: 173fac600f3ce64e6df1ca86565f427a391810cc
164
+ path: receiver
165
+ fetch-depth: 0
166
+ persist-credentials: false
167
+ - uses: actions/setup-python@v5
168
+ with:
169
+ python-version: "3.12"
170
+ - name: Run real sender to receiver parity under socket denial
171
+ working-directory: sender
172
+ env:
173
+ INTAKE_EVIDENCE: ${{ runner.temp }}/intake-contract-evidence
174
+ run: |
175
+ set -euo pipefail
176
+ mkdir -p "$INTAKE_EVIDENCE"
177
+ python scripts/intake_contract_parity.py \
178
+ --companion-root ../receiver \
179
+ --expected-sender-sha "$SENDER_SHA" \
180
+ --expected-companion-sha "$COMPANION_SHA" \
181
+ --require-companion-clean \
182
+ --result "$INTAKE_EVIDENCE/result.json" \
183
+ --ledger "$INTAKE_EVIDENCE/guard-ledger.jsonl" \
184
+ | tee "$INTAKE_EVIDENCE/run.log"
185
+ - name: Upload intake parity evidence
186
+ if: always()
187
+ uses: actions/upload-artifact@v4
188
+ with:
189
+ name: intake-contract-parity-${{ github.event.pull_request.head.sha || github.sha }}
190
+ path: ${{ runner.temp }}/intake-contract-evidence/
191
+ if-no-files-found: error
192
+
193
+ exact-pr-head:
194
+ # The normal pull_request jobs intentionally test GitHub's merge ref.
195
+ # This independent gate proves the same suite on the immutable PR head.
196
+ if: github.event_name == 'pull_request'
197
+ runs-on: ubuntu-latest
198
+ timeout-minutes: 30
199
+ permissions:
200
+ contents: read
201
+ steps:
202
+ - uses: actions/checkout@v4
203
+ with:
204
+ ref: ${{ github.event.pull_request.head.sha }}
205
+ fetch-depth: 0
206
+ persist-credentials: false
207
+ - uses: actions/setup-python@v5
208
+ with:
209
+ python-version: "3.12"
210
+ - name: Bind execution to the exact PR head
211
+ env:
212
+ EXPECTED_HEAD_SHA: ${{ github.event.pull_request.head.sha }}
213
+ EXACT_HEAD_EVIDENCE: ${{ runner.temp }}/exact-head-evidence
214
+ run: |
215
+ set -euo pipefail
216
+ actual_head_sha="$(git rev-parse HEAD)"
217
+ test "$actual_head_sha" = "$EXPECTED_HEAD_SHA"
218
+ mkdir -p "$EXACT_HEAD_EVIDENCE"
219
+ python - << 'PY'
220
+ import json
221
+ import os
222
+ import subprocess
223
+ from pathlib import Path
224
+
225
+ actual = subprocess.check_output(
226
+ ["git", "rev-parse", "HEAD"], text=True
227
+ ).strip()
228
+ expected = os.environ["EXPECTED_HEAD_SHA"]
229
+ Path(os.environ["EXACT_HEAD_EVIDENCE"]).joinpath("head.json").write_text(
230
+ json.dumps(
231
+ {
232
+ "schema_version": "grift-exact-head-v1",
233
+ "expected_head_sha": expected,
234
+ "actual_head_sha": actual,
235
+ "status": "VERIFIED" if actual == expected else "MISMATCH",
236
+ },
237
+ sort_keys=True,
238
+ )
239
+ + "\n",
240
+ encoding="utf-8",
241
+ )
242
+ PY
243
+ - name: Install exact-head test dependencies
244
+ run: |
245
+ python -m pip install --upgrade pip
246
+ python -m pip install -e ".[dev]"
247
+ - name: Unit tests on exact PR head
248
+ run: python -m pytest tests -m "not golden"
249
+ - name: Analyze and verify the exact PR head
250
+ env:
251
+ EXPECTED_HEAD_SHA: ${{ github.event.pull_request.head.sha }}
252
+ EXACT_HEAD_EVIDENCE: ${{ runner.temp }}/exact-head-evidence
253
+ run: |
254
+ set -euo pipefail
255
+ collection="$EXACT_HEAD_EVIDENCE/self-analysis"
256
+ grift repo . \
257
+ --rev "$EXPECTED_HEAD_SHA" \
258
+ --actors \
259
+ --format both \
260
+ --out "$collection" \
261
+ > "$EXACT_HEAD_EVIDENCE/repo.log"
262
+ grift verify "$collection" --repo . \
263
+ | tee "$EXACT_HEAD_EVIDENCE/verify.log"
264
+ python - << 'PY'
265
+ import hashlib
266
+ import json
267
+ import os
268
+ from pathlib import Path
269
+
270
+ root = Path(os.environ["EXACT_HEAD_EVIDENCE"])
271
+ manifest_path = root / "self-analysis" / "collection-manifest.json"
272
+ index_path = root / "self-analysis" / "actor-index.json"
273
+ manifest = json.loads(manifest_path.read_text(encoding="utf-8"))
274
+ index = json.loads(index_path.read_text(encoding="utf-8"))
275
+ expected = os.environ["EXPECTED_HEAD_SHA"]
276
+ actual = manifest["target"]["oid"]["value"]
277
+ if actual != expected:
278
+ raise SystemExit(
279
+ f"self-analysis target mismatch: expected {expected}, got {actual}"
280
+ )
281
+ proof = {
282
+ "schema_version": "grift-exact-head-self-analysis-v1",
283
+ "status": "VERIFIED",
284
+ "expected_head_sha": expected,
285
+ "analyzed_oid": manifest["target"]["oid"],
286
+ "full_actor_count": index["population"]["actor_count"],
287
+ "selected_actor_count": index["selection"]["selected_count"],
288
+ "manifest_sha256": hashlib.sha256(manifest_path.read_bytes()).hexdigest(),
289
+ "actor_index_sha256": hashlib.sha256(index_path.read_bytes()).hexdigest(),
290
+ }
291
+ (root / "self-analysis.json").write_text(
292
+ json.dumps(proof, sort_keys=True) + "\n",
293
+ encoding="utf-8",
294
+ )
295
+ PY
296
+ - name: Upload exact-head evidence
297
+ if: always()
298
+ uses: actions/upload-artifact@v4
299
+ with:
300
+ name: exact-pr-head-${{ github.event.pull_request.head.sha }}
301
+ path: ${{ runner.temp }}/exact-head-evidence/
302
+ if-no-files-found: error
303
+
304
+ golden:
305
+ if: github.event_name == 'schedule' || github.event_name == 'workflow_dispatch'
306
+ runs-on: ubuntu-latest
307
+ needs: test
308
+ steps:
309
+ - uses: actions/checkout@v4
310
+ - uses: actions/setup-python@v5
311
+ with:
312
+ python-version: "3.12"
313
+ - name: Install
314
+ run: |
315
+ python -m pip install --upgrade pip
316
+ python -m pip install -e ".[dev]"
317
+ - name: Golden corpus (G1-G5 + schema/export parity)
318
+ env:
319
+ TEP_GOLDEN: "1"
320
+ run: python -m pytest -m golden
321
+
322
+ v060-golden:
323
+ # Declaration: the closed fixture/hash manifest and D0-D4 drift policy.
324
+ # Enforcement: execute the installed CLI against a newly materialized Git
325
+ # repository, then verify and compare every registered output artifact.
326
+ runs-on: ubuntu-latest
327
+ timeout-minutes: 10
328
+ needs: test
329
+ steps:
330
+ - uses: actions/checkout@v4
331
+ with:
332
+ fetch-depth: 0
333
+ persist-credentials: false
334
+ - uses: actions/setup-python@v5
335
+ with:
336
+ python-version: "3.12"
337
+ - name: Install
338
+ run: |
339
+ python -m pip install --upgrade pip
340
+ python -m pip install -e ".[dev]"
341
+ - name: Replay v0.6 CLI golden fixture
342
+ run: |
343
+ set -euo pipefail
344
+ mkdir -p golden-evidence
345
+ python scripts/v060_golden.py \
346
+ --result golden-evidence/v060-golden-result.json \
347
+ | tee golden-evidence/v060-golden.log
348
+ - name: Verify sanitized public scenario digest registry
349
+ run: |
350
+ set -euo pipefail
351
+ python scripts/v060_scenario_matrix.py \
352
+ --verify-registry \
353
+ --digest-only \
354
+ --output-root evidence/v060/scenarios-public \
355
+ | tee golden-evidence/v060-public-registry.log
356
+ - name: Upload v0.6 golden evidence
357
+ if: always()
358
+ uses: actions/upload-artifact@v4
359
+ with:
360
+ name: v060-golden-${{ github.sha }}
361
+ path: golden-evidence/
362
+ if-no-files-found: error
363
+
364
+ action-dogfood:
365
+ # Read-only proof boundary: invoke the shipped composite action for
366
+ # scope=repo, install-source=checkout, comment=false; exercise the complete
367
+ # history preflight; and require non-empty report artifacts. This job does
368
+ # not prove the PyPI install or PR-comment paths. Those remain separate
369
+ # post-publish/trusted-workflow gates.
370
+ # RETIRE: remove the local input guard only after 3 consecutive successful
371
+ # pinned-PyPI canary runs and a replacement-guard PR records their run URLs.
372
+ if: github.event_name != 'schedule'
373
+ runs-on: ubuntu-latest
374
+ permissions:
375
+ contents: read
376
+ steps:
377
+ - uses: actions/checkout@v4
378
+ with:
379
+ fetch-depth: 0
380
+ persist-credentials: false
381
+ - uses: actions/setup-python@v5
382
+ with:
383
+ python-version: "3.12"
384
+ - name: Verify action input guard and write its ledger
385
+ run: |
386
+ set -euo pipefail
387
+ python scripts/action_contract_guard.py \
388
+ --ledger action-evidence/guard-ledger.jsonl
389
+ - name: Run the composite action against this repo
390
+ uses: ./
391
+ with:
392
+ scope: repo
393
+ install-source: checkout
394
+ # PR-controlled code never receives a write token. Comment delivery
395
+ # must be exercised by a trusted post-workflow, not this job.
396
+ comment: false
397
+ - name: Assert the action produced the expected artifacts
398
+ shell: bash
399
+ run: |
400
+ set -euo pipefail
401
+ test -s .grift/report.md
402
+ test -s .grift/report.json
403
+ test -s .grift/shared-block.md
404
+ python3 - << 'EOF'
405
+ import json
406
+ report = json.load(open('.grift/report.json'))
407
+ assert report['schema_version'] == 'report-v1'
408
+ print(
409
+ 'action-dogfood: composite action ran, '
410
+ 'report-v1 OK, shared block OK'
411
+ )
412
+ EOF
413
+ - name: Upload action guard evidence
414
+ if: always()
415
+ uses: actions/upload-artifact@v4
416
+ with:
417
+ name: action-guard-${{ github.sha }}
418
+ path: action-evidence/guard-ledger.jsonl
419
+ if-no-files-found: error
420
+
421
+ package-smoke:
422
+ # Declaration: pyproject sdist/wheel allowlists. Enforcement: this job
423
+ # builds from a deliberately dirty source tree, inventories every member,
424
+ # and installs the two artifacts in independent clean virtualenvs.
425
+ if: github.event_name != 'schedule'
426
+ runs-on: ubuntu-latest
427
+ timeout-minutes: 30
428
+ steps:
429
+ - uses: actions/checkout@v4
430
+ with:
431
+ fetch-depth: 0
432
+ persist-credentials: false
433
+ - uses: actions/setup-python@v5
434
+ with:
435
+ python-version: "3.12"
436
+ - name: Install package verification dependencies
437
+ run: |
438
+ python -m pip install --upgrade pip
439
+ python -m pip install -e ".[dev]"
440
+ - name: Dirty-source build and clean-install smoke
441
+ run: |
442
+ set -euo pipefail
443
+ mkdir -p package-evidence
444
+ python scripts/package_smoke.py \
445
+ --out package-dist \
446
+ --ledger package-evidence/guard-ledger.jsonl \
447
+ | tee package-evidence/package-smoke.log
448
+ - name: Upload package guard evidence
449
+ if: always()
450
+ uses: actions/upload-artifact@v4
451
+ with:
452
+ name: package-guard-${{ github.sha }}
453
+ path: |
454
+ package-dist/
455
+ package-evidence/
456
+ if-no-files-found: error