grift-cli 0.5.8__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.
- grift_cli-0.7.2/.github/workflows/ci.yml +456 -0
- grift_cli-0.7.2/.github/workflows/publish.yml +277 -0
- grift_cli-0.7.2/.github/workflows/v060-provider-live.yml +161 -0
- grift_cli-0.7.2/.gitignore +27 -0
- grift_cli-0.7.2/CHANGELOG.md +465 -0
- grift_cli-0.7.2/PKG-INFO +428 -0
- grift_cli-0.7.2/README.en.md +481 -0
- grift_cli-0.7.2/README.md +404 -0
- grift_cli-0.7.2/action.yml +151 -0
- grift_cli-0.7.2/benchmarks/v060/IMPLEMENTATION-AGENT-INSTRUCTIONS.md +321 -0
- grift_cli-0.7.2/benchmarks/v060/README.md +51 -0
- grift_cli-0.7.2/benchmarks/v060/data/alignment_cases.jsonl +2 -0
- grift_cli-0.7.2/benchmarks/v060/data/gharchive_daily_summary.csv +56 -0
- grift_cli-0.7.2/benchmarks/v060/data/gharchive_events_2024-01-15_to_21.ndjson +554 -0
- grift_cli-0.7.2/benchmarks/v060/data/gharchive_repository_summary.csv +9 -0
- grift_cli-0.7.2/benchmarks/v060/data/independent_repo_actor_audit_2026-08-30.json +172 -0
- grift_cli-0.7.2/benchmarks/v060/data/metric_catalog.csv +18 -0
- grift_cli-0.7.2/benchmarks/v060/data/role_ground_truth_sample.csv +41 -0
- grift_cli-0.7.2/benchmarks/v060/data/role_label_counts.csv +6 -0
- grift_cli-0.7.2/benchmarks/v060/data/tracker_lifecycle_fixture.csv +9 -0
- grift_cli-0.7.2/benchmarks/v060/expected/tracker_fixture_expected.json +16 -0
- grift_cli-0.7.2/benchmarks/v060/golden/expected/actor-partition.json +1 -0
- grift_cli-0.7.2/benchmarks/v060/golden/fixtures/actor-partition-repo.json +58 -0
- grift_cli-0.7.2/benchmarks/v060/golden/manifest.json +1 -0
- grift_cli-0.7.2/benchmarks/v060/golden/migrations.json +1 -0
- grift_cli-0.7.2/benchmarks/v060/quality-report.md +47 -0
- grift_cli-0.7.2/benchmarks/v060/schemas/benchmark-manifest.schema.json +16 -0
- grift_cli-0.7.2/benchmarks/v060/schemas/event-observation.schema.json +19 -0
- grift_cli-0.7.2/benchmarks/v060/schemas/role-validation.schema.json +24 -0
- grift_cli-0.7.2/benchmarks/v060/sources.json +535 -0
- grift_cli-0.7.2/docs/CORPUS-CANDIDATES-v2026.11-20260822.md +116 -0
- grift_cli-0.7.2/docs/EVIDENCE-v056-smoke-raw.log +31 -0
- grift_cli-0.7.2/docs/EVIDENCE-v058-smoke-raw.log +21 -0
- grift_cli-0.7.2/docs/EVIDENCE-v058b-smoke-raw.log +43 -0
- grift_cli-0.7.2/docs/EVIDENCE-v059-smoke-raw.log +20 -0
- grift_cli-0.7.2/docs/EVIDENCE-v059b-smoke-raw.log +12 -0
- grift_cli-0.7.2/docs/PLAN-v060-20260825.md +144 -0
- grift_cli-0.7.2/docs/READERS-GUIDE-draft-20260822.md +30 -0
- grift_cli-0.7.2/docs/REQUIREMENTS-v060.md +171 -0
- grift_cli-0.7.2/docs/RESEARCH-v060.md +27 -0
- grift_cli-0.7.2/docs/V060-CLOSURE-LEDGER-20260831.md +120 -0
- grift_cli-0.7.2/docs/alignment-schema.md +105 -0
- grift_cli-0.7.2/docs/contribute-intake-design-20260822.md +131 -0
- grift_cli-0.7.2/docs/coverage-map.md +57 -0
- grift_cli-0.7.2/docs/en/coverage-map.md +63 -0
- {grift_cli-0.5.8 → grift_cli-0.7.2}/docs/en/identity-schema.md +20 -1
- {grift_cli-0.5.8 → grift_cli-0.7.2}/docs/en/metrics-guide.md +83 -4
- grift_cli-0.7.2/docs/en/norms.md +123 -0
- grift_cli-0.7.2/docs/en/persona-answers.md +51 -0
- grift_cli-0.7.2/docs/evidence/v060/attest-portfolio.md +77 -0
- grift_cli-0.7.2/docs/evidence/v060/grift-2055-audit.md +98 -0
- {grift_cli-0.5.8 → grift_cli-0.7.2}/docs/identity-schema.md +20 -1
- grift_cli-0.7.2/docs/input-export-schema.md +157 -0
- {grift_cli-0.5.8 → grift_cli-0.7.2}/docs/metrics-guide.md +85 -5
- grift_cli-0.7.2/docs/migration-v060.md +183 -0
- grift_cli-0.7.2/docs/migration-v070.md +387 -0
- grift_cli-0.7.2/docs/migration-v071.md +453 -0
- grift_cli-0.7.2/docs/migration-v072.md +540 -0
- grift_cli-0.7.2/docs/norms.md +189 -0
- {grift_cli-0.5.8 → grift_cli-0.7.2}/docs/persona-answers.md +43 -23
- grift_cli-0.7.2/docs/project-schema.md +48 -0
- grift_cli-0.7.2/docs/report-v2.md +202 -0
- grift_cli-0.7.2/docs/rereview-checklist-template.md +50 -0
- {grift_cli-0.5.8 → grift_cli-0.7.2}/golden/README.md +4 -0
- {grift_cli-0.5.8 → grift_cli-0.7.2}/golden/coverage.md +15 -8
- grift_cli-0.7.2/golden/identity/G1-click.toml +15 -0
- {grift_cli-0.5.8 → grift_cli-0.7.2}/pyproject.toml +30 -2
- grift_cli-0.7.2/scripts/action_contract_guard.py +386 -0
- grift_cli-0.7.2/scripts/build_library_prevalence.py +190 -0
- {grift_cli-0.5.8 → grift_cli-0.7.2}/scripts/gen_coverage_table.py +9 -3
- grift_cli-0.7.2/scripts/intake_contract_parity.py +793 -0
- grift_cli-0.7.2/scripts/package_smoke.py +1253 -0
- grift_cli-0.7.2/scripts/v060_blind_pilot.py +1116 -0
- grift_cli-0.7.2/scripts/v060_golden.py +968 -0
- grift_cli-0.7.2/scripts/v060_golden_baseline.py +210 -0
- grift_cli-0.7.2/scripts/v060_provider_live_gate.py +2331 -0
- grift_cli-0.7.2/scripts/v060_scenario_matrix.py +2255 -0
- grift_cli-0.7.2/scripts/v070_benchmark.py +782 -0
- grift_cli-0.7.2/src/tep_cli/__main__.py +1113 -0
- grift_cli-0.7.2/src/tep_cli/benchmark_cmd.py +105 -0
- grift_cli-0.7.2/src/tep_cli/options.py +897 -0
- grift_cli-0.7.2/src/tep_cli/output.py +75 -0
- grift_cli-0.7.2/src/tep_cli/subject.py +1295 -0
- grift_cli-0.7.2/src/tep_core/actor_artifacts.py +1329 -0
- grift_cli-0.7.2/src/tep_core/actor_basis.py +89 -0
- grift_cli-0.7.2/src/tep_core/actor_directory.py +229 -0
- grift_cli-0.7.2/src/tep_core/ai_identity.py +160 -0
- grift_cli-0.7.2/src/tep_core/alignment.py +686 -0
- grift_cli-0.7.2/src/tep_core/analyze.py +420 -0
- grift_cli-0.7.2/src/tep_core/analyze_v2.py +964 -0
- grift_cli-0.7.2/src/tep_core/archive_events.py +318 -0
- grift_cli-0.7.2/src/tep_core/attest.py +1417 -0
- grift_cli-0.7.2/src/tep_core/attribution.py +887 -0
- grift_cli-0.7.2/src/tep_core/benchmark.py +343 -0
- grift_cli-0.7.2/src/tep_core/benchmark_assets/v060/data/alignment_cases.jsonl +2 -0
- grift_cli-0.7.2/src/tep_core/benchmark_assets/v060/data/gharchive_daily_summary.csv +56 -0
- grift_cli-0.7.2/src/tep_core/benchmark_assets/v060/data/gharchive_events_2024-01-15_to_21.ndjson +554 -0
- grift_cli-0.7.2/src/tep_core/benchmark_assets/v060/data/gharchive_repository_summary.csv +9 -0
- grift_cli-0.7.2/src/tep_core/benchmark_assets/v060/data/independent_repo_actor_audit_2026-08-30.json +172 -0
- grift_cli-0.7.2/src/tep_core/benchmark_assets/v060/data/metric_catalog.csv +18 -0
- grift_cli-0.7.2/src/tep_core/benchmark_assets/v060/data/role_ground_truth_sample.csv +41 -0
- grift_cli-0.7.2/src/tep_core/benchmark_assets/v060/data/role_label_counts.csv +6 -0
- grift_cli-0.7.2/src/tep_core/benchmark_assets/v060/data/tracker_lifecycle_fixture.csv +9 -0
- grift_cli-0.7.2/src/tep_core/benchmark_assets/v060/expected/tracker_fixture_expected.json +16 -0
- grift_cli-0.7.2/src/tep_core/benchmark_assets/v060/schemas/benchmark-manifest.schema.json +16 -0
- grift_cli-0.7.2/src/tep_core/benchmark_assets/v060/schemas/event-observation.schema.json +19 -0
- grift_cli-0.7.2/src/tep_core/benchmark_assets/v060/schemas/role-validation.schema.json +24 -0
- grift_cli-0.7.2/src/tep_core/benchmark_assets/v060/sources.json +535 -0
- {grift_cli-0.5.8 → grift_cli-0.7.2}/src/tep_core/cochange.py +8 -4
- grift_cli-0.7.2/src/tep_core/complementarity.py +207 -0
- {grift_cli-0.5.8 → grift_cli-0.7.2}/src/tep_core/context_profile.py +103 -26
- grift_cli-0.7.2/src/tep_core/contribute.py +582 -0
- grift_cli-0.7.2/src/tep_core/contribution_v2.py +2599 -0
- grift_cli-0.7.2/src/tep_core/coordination.py +125 -0
- grift_cli-0.7.2/src/tep_core/data/prevalence/v2026.09/library_prevalence.json +2131 -0
- grift_cli-0.7.2/src/tep_core/dates.py +48 -0
- grift_cli-0.7.2/src/tep_core/dependency_manifest.py +215 -0
- grift_cli-0.7.2/src/tep_core/digest.py +18 -0
- grift_cli-0.7.2/src/tep_core/event_rhythm.py +214 -0
- grift_cli-0.7.2/src/tep_core/experience.py +1361 -0
- grift_cli-0.7.2/src/tep_core/experience_collect.py +675 -0
- {grift_cli-0.5.8 → grift_cli-0.7.2}/src/tep_core/export.py +1 -3
- grift_cli-0.7.2/src/tep_core/forge.py +395 -0
- grift_cli-0.7.2/src/tep_core/forge_public.py +711 -0
- grift_cli-0.7.2/src/tep_core/gitutil.py +256 -0
- grift_cli-0.7.2/src/tep_core/identity.py +510 -0
- grift_cli-0.7.2/src/tep_core/local_inputs.py +118 -0
- {grift_cli-0.5.8 → grift_cli-0.7.2}/src/tep_core/origin.py +19 -4
- grift_cli-0.7.2/src/tep_core/outcome.py +202 -0
- grift_cli-0.7.2/src/tep_core/path_surface.py +99 -0
- grift_cli-0.7.2/src/tep_core/portfolio.py +1252 -0
- grift_cli-0.7.2/src/tep_core/prevalence.py +172 -0
- grift_cli-0.7.2/src/tep_core/project.py +248 -0
- grift_cli-0.7.2/src/tep_core/public_evidence.py +1126 -0
- grift_cli-0.7.2/src/tep_core/public_fetch.py +400 -0
- {grift_cli-0.5.8 → grift_cli-0.7.2}/src/tep_core/report.py +48 -16
- grift_cli-0.7.2/src/tep_core/report_v2.py +861 -0
- grift_cli-0.7.2/src/tep_core/revision.py +220 -0
- {grift_cli-0.5.8 → grift_cli-0.7.2}/src/tep_core/rework.py +6 -3
- grift_cli-0.7.2/src/tep_core/rhythm.py +134 -0
- grift_cli-0.7.2/src/tep_core/role_lens.py +104 -0
- grift_cli-0.7.2/src/tep_core/role_profile.py +259 -0
- grift_cli-0.7.2/src/tep_core/role_validation.py +167 -0
- grift_cli-0.7.2/src/tep_core/schema.py +1764 -0
- grift_cli-0.7.2/src/tep_core/schema_v2.py +805 -0
- grift_cli-0.7.2/src/tep_core/schemas/__init__.py +1 -0
- grift_cli-0.7.2/src/tep_core/schemas/v060-contracts.schema.json +4080 -0
- {grift_cli-0.5.8 → grift_cli-0.7.2}/src/tep_core/scope.py +14 -2
- grift_cli-0.7.2/src/tep_core/secrets_guard.py +81 -0
- grift_cli-0.7.2/src/tep_core/secure_output.py +375 -0
- grift_cli-0.7.2/src/tep_core/source_binding.py +319 -0
- grift_cli-0.7.2/src/tep_core/surface_profile.py +199 -0
- grift_cli-0.7.2/src/tep_core/tagset.py +133 -0
- grift_cli-0.7.2/src/tep_core/tendency.py +265 -0
- grift_cli-0.7.2/src/tep_core/tracker.py +581 -0
- grift_cli-0.7.2/src/tep_core/tracker_lifecycle.py +372 -0
- grift_cli-0.7.2/src/tep_core/v2_constants.py +167 -0
- grift_cli-0.7.2/src/tep_core/verification_profile.py +155 -0
- grift_cli-0.7.2/src/tep_core/verify.py +1015 -0
- grift_cli-0.7.2/src/tep_core/version.py +17 -0
- {grift_cli-0.5.8 → grift_cli-0.7.2}/tests/coverage_matrix.py +28 -12
- grift_cli-0.7.2/tests/fixtures/v060/forge.json +14 -0
- grift_cli-0.7.2/tests/fixtures/v060/p0-results.json +475 -0
- grift_cli-0.7.2/tests/fixtures/v060/project-declared.json +73 -0
- grift_cli-0.7.2/tests/fixtures/v060/project-init.toml +21 -0
- grift_cli-0.7.2/tests/fixtures/v060/project.toml +20 -0
- grift_cli-0.7.2/tests/fixtures/v060/repo-smoke-head.json +34 -0
- grift_cli-0.7.2/tests/fixtures/v060/run_p0_falsify.py +1824 -0
- grift_cli-0.7.2/tests/fixtures/v060/tracker.json +14 -0
- grift_cli-0.7.2/tests/test_action_contract.py +432 -0
- grift_cli-0.7.2/tests/test_benchmark_pack_v060.py +667 -0
- grift_cli-0.7.2/tests/test_cli_v060.py +376 -0
- {grift_cli-0.5.8 → grift_cli-0.7.2}/tests/test_contribute.py +23 -8
- {grift_cli-0.5.8 → grift_cli-0.7.2}/tests/test_coverage.py +29 -1
- grift_cli-0.7.2/tests/test_gloss_gates.py +210 -0
- {grift_cli-0.5.8 → grift_cli-0.7.2}/tests/test_golden.py +43 -8
- grift_cli-0.7.2/tests/test_intake_contract_parity.py +162 -0
- {grift_cli-0.5.8 → grift_cli-0.7.2}/tests/test_intake_disclosure.py +13 -8
- grift_cli-0.7.2/tests/test_migration_v060.py +122 -0
- grift_cli-0.7.2/tests/test_package_contract.py +2022 -0
- grift_cli-0.7.2/tests/test_publish_baseline_pin.py +73 -0
- {grift_cli-0.5.8 → grift_cli-0.7.2}/tests/test_ux_v057.py +26 -19
- {grift_cli-0.5.8 → grift_cli-0.7.2}/tests/test_v058_gates.py +16 -28
- grift_cli-0.7.2/tests/test_v060_actor_account_source_binding_cli.py +300 -0
- grift_cli-0.7.2/tests/test_v060_actor_artifacts.py +639 -0
- grift_cli-0.7.2/tests/test_v060_actor_partition.py +400 -0
- grift_cli-0.7.2/tests/test_v060_actor_public_directory.py +105 -0
- grift_cli-0.7.2/tests/test_v060_alignment.py +160 -0
- grift_cli-0.7.2/tests/test_v060_attest_core.py +788 -0
- grift_cli-0.7.2/tests/test_v060_attest_input_binding.py +451 -0
- grift_cli-0.7.2/tests/test_v060_attest_portfolio_cli.py +877 -0
- grift_cli-0.7.2/tests/test_v060_binding_quality.py +327 -0
- grift_cli-0.7.2/tests/test_v060_blind_pilot.py +328 -0
- grift_cli-0.7.2/tests/test_v060_bound_export_observations.py +316 -0
- grift_cli-0.7.2/tests/test_v060_complete.py +498 -0
- grift_cli-0.7.2/tests/test_v060_contribute_atomic_consent.py +311 -0
- grift_cli-0.7.2/tests/test_v060_contribution_profiles.py +1693 -0
- grift_cli-0.7.2/tests/test_v060_cross_repo.py +734 -0
- grift_cli-0.7.2/tests/test_v060_determinism.py +107 -0
- grift_cli-0.7.2/tests/test_v060_docs_parity.py +108 -0
- grift_cli-0.7.2/tests/test_v060_emit_robustness.py +262 -0
- grift_cli-0.7.2/tests/test_v060_experience_collect.py +295 -0
- grift_cli-0.7.2/tests/test_v060_experience_incomplete.py +104 -0
- grift_cli-0.7.2/tests/test_v060_experience_product_cli.py +565 -0
- grift_cli-0.7.2/tests/test_v060_experience_role.py +797 -0
- grift_cli-0.7.2/tests/test_v060_forge_evidence.py +1708 -0
- grift_cli-0.7.2/tests/test_v060_golden_runner.py +474 -0
- grift_cli-0.7.2/tests/test_v060_historical_exact_head.py +172 -0
- grift_cli-0.7.2/tests/test_v060_identity_v2.py +205 -0
- grift_cli-0.7.2/tests/test_v060_independent_audit.py +539 -0
- grift_cli-0.7.2/tests/test_v060_inputs.py +135 -0
- grift_cli-0.7.2/tests/test_v060_large_repo_degradation.py +248 -0
- grift_cli-0.7.2/tests/test_v060_no_false_zero.py +134 -0
- grift_cli-0.7.2/tests/test_v060_observed_compare.py +605 -0
- grift_cli-0.7.2/tests/test_v060_p0_runner.py +65 -0
- grift_cli-0.7.2/tests/test_v060_portfolio_core.py +594 -0
- grift_cli-0.7.2/tests/test_v060_provider_live_gate.py +816 -0
- grift_cli-0.7.2/tests/test_v060_provider_live_workflow.py +197 -0
- grift_cli-0.7.2/tests/test_v060_public_actor_presentation.py +436 -0
- grift_cli-0.7.2/tests/test_v060_public_evidence_contract.py +111 -0
- grift_cli-0.7.2/tests/test_v060_public_registry_export.py +479 -0
- grift_cli-0.7.2/tests/test_v060_release_consistency.py +461 -0
- grift_cli-0.7.2/tests/test_v060_report_deep_schema.py +202 -0
- grift_cli-0.7.2/tests/test_v060_report_strict_producer.py +227 -0
- grift_cli-0.7.2/tests/test_v060_revision.py +193 -0
- grift_cli-0.7.2/tests/test_v060_rhythm.py +96 -0
- grift_cli-0.7.2/tests/test_v060_scenario_matrix.py +752 -0
- grift_cli-0.7.2/tests/test_v060_schema.py +231 -0
- grift_cli-0.7.2/tests/test_v060_schema_contracts.py +1171 -0
- grift_cli-0.7.2/tests/test_v060_subject_source_binding_cli.py +479 -0
- grift_cli-0.7.2/tests/test_v060_surfaces.py +129 -0
- grift_cli-0.7.2/tests/test_v060_verify_fixed_revision.py +124 -0
- grift_cli-0.7.2/tests/test_v060_verify_inferred_actor.py +155 -0
- grift_cli-0.7.2/tests/test_v070_actor_time_phase.py +144 -0
- grift_cli-0.7.2/tests/test_v070_align_share.py +280 -0
- grift_cli-0.7.2/tests/test_v070_benchmark.py +363 -0
- grift_cli-0.7.2/tests/test_v070_cli_surface.py +281 -0
- grift_cli-0.7.2/tests/test_v070_complementarity.py +539 -0
- grift_cli-0.7.2/tests/test_v070_dependency_attribution.py +149 -0
- grift_cli-0.7.2/tests/test_v070_dependency_experience.py +210 -0
- grift_cli-0.7.2/tests/test_v070_dependency_manifest.py +152 -0
- grift_cli-0.7.2/tests/test_v070_history_incomplete.py +266 -0
- grift_cli-0.7.2/tests/test_v070_intake_contract.py +145 -0
- grift_cli-0.7.2/tests/test_v070_library_prevalence.py +469 -0
- grift_cli-0.7.2/tests/test_v070_norms_link.py +199 -0
- grift_cli-0.7.2/tests/test_v070_outcome.py +387 -0
- grift_cli-0.7.2/tests/test_v070_project_min_share.py +128 -0
- grift_cli-0.7.2/tests/test_v070_scale_denominator.py +95 -0
- grift_cli-0.7.2/tests/test_v071_bot_accounts.py +240 -0
- grift_cli-0.7.2/tests/test_v071_gate_failure_detail.py +142 -0
- grift_cli-0.7.2/tests/test_v071_response_completeness.py +239 -0
- grift_cli-0.7.2/tests/test_v072_empty_actor.py +231 -0
- {grift_cli-0.5.8 → grift_cli-0.7.2}/tests/test_verify.py +32 -2
- grift_cli-0.5.8/.github/workflows/ci.yml +0 -45
- grift_cli-0.5.8/.github/workflows/publish.yml +0 -41
- grift_cli-0.5.8/.gitignore +0 -18
- grift_cli-0.5.8/.grift/contribution.json +0 -256
- grift_cli-0.5.8/CHANGELOG.md +0 -190
- grift_cli-0.5.8/PKG-INFO +0 -168
- grift_cli-0.5.8/README.en.md +0 -164
- grift_cli-0.5.8/README.md +0 -145
- grift_cli-0.5.8/action.yml +0 -78
- grift_cli-0.5.8/docs/coverage-map.md +0 -35
- grift_cli-0.5.8/docs/en/coverage-map.md +0 -38
- grift_cli-0.5.8/docs/en/norms.md +0 -69
- grift_cli-0.5.8/docs/en/persona-answers.md +0 -33
- grift_cli-0.5.8/docs/norms.md +0 -101
- grift_cli-0.5.8/golden/identity/G1-click.toml +0 -15
- grift_cli-0.5.8/src/tep_cli/__main__.py +0 -662
- grift_cli-0.5.8/src/tep_core/analyze.py +0 -144
- grift_cli-0.5.8/src/tep_core/contribute.py +0 -156
- grift_cli-0.5.8/src/tep_core/gitutil.py +0 -112
- grift_cli-0.5.8/src/tep_core/identity.py +0 -141
- grift_cli-0.5.8/src/tep_core/schema.py +0 -543
- grift_cli-0.5.8/src/tep_core/verify.py +0 -133
- grift_cli-0.5.8/src/tep_core/version.py +0 -7
- {grift_cli-0.5.8 → grift_cli-0.7.2}/.github/workflows/kpi-monthly.yml +0 -0
- {grift_cli-0.5.8 → grift_cli-0.7.2}/LICENSE +0 -0
- {grift_cli-0.5.8 → grift_cli-0.7.2}/corpus/AD-PILOT-20260822.md +0 -0
- {grift_cli-0.5.8 → grift_cli-0.7.2}/corpus/DISCRIMINANT-v2026.09.md +0 -0
- {grift_cli-0.5.8 → grift_cli-0.7.2}/corpus/DISCRIMINANT-v2026.11.md +0 -0
- {grift_cli-0.5.8 → grift_cli-0.7.2}/corpus/ad-pilot.json +0 -0
- {grift_cli-0.5.8 → grift_cli-0.7.2}/corpus/manifest.toml +0 -0
- {grift_cli-0.5.8 → grift_cli-0.7.2}/corpus/pins-v2026.09.toml +0 -0
- {grift_cli-0.5.8 → grift_cli-0.7.2}/corpus/pins-v2026.11.toml +0 -0
- {grift_cli-0.5.8 → grift_cli-0.7.2}/corpus/v2026.09/distributions.json +0 -0
- {grift_cli-0.5.8 → grift_cli-0.7.2}/corpus/v2026.11/distributions.json +0 -0
- {grift_cli-0.5.8 → grift_cli-0.7.2}/docs/corpus-protocol.md +0 -0
- {grift_cli-0.5.8 → grift_cli-0.7.2}/docs/en/corpus-protocol.md +0 -0
- {grift_cli-0.5.8 → grift_cli-0.7.2}/docs/en/export-schema.md +0 -0
- {grift_cli-0.5.8 → grift_cli-0.7.2}/docs/en/report-schema.md +0 -0
- {grift_cli-0.5.8 → grift_cli-0.7.2}/docs/export-schema.md +0 -0
- {grift_cli-0.5.8 → grift_cli-0.7.2}/docs/report-schema.md +0 -0
- {grift_cli-0.5.8 → grift_cli-0.7.2}/golden/expected/G1-click.json +0 -0
- {grift_cli-0.5.8 → grift_cli-0.7.2}/golden/expected/G10-scvi-tools.json +0 -0
- {grift_cli-0.5.8 → grift_cli-0.7.2}/golden/expected/G11-kilo.json +0 -0
- {grift_cli-0.5.8 → grift_cli-0.7.2}/golden/expected/G12-httpx.json +0 -0
- {grift_cli-0.5.8 → grift_cli-0.7.2}/golden/expected/G13-voicevox.json +0 -0
- {grift_cli-0.5.8 → grift_cli-0.7.2}/golden/expected/G2-gitignore.json +0 -0
- {grift_cli-0.5.8 → grift_cli-0.7.2}/golden/expected/G3-spoon-knife.json +0 -0
- {grift_cli-0.5.8 → grift_cli-0.7.2}/golden/expected/G4-express.json +0 -0
- {grift_cli-0.5.8 → grift_cli-0.7.2}/golden/expected/G5-typer.json +0 -0
- {grift_cli-0.5.8 → grift_cli-0.7.2}/golden/expected/G6-claude-code.json +0 -0
- {grift_cli-0.5.8 → grift_cli-0.7.2}/golden/expected/G7-axios.json +0 -0
- {grift_cli-0.5.8 → grift_cli-0.7.2}/golden/expected/G8-co.json +0 -0
- {grift_cli-0.5.8 → grift_cli-0.7.2}/golden/expected/G9-pyscript.json +0 -0
- {grift_cli-0.5.8 → grift_cli-0.7.2}/golden/identity/example.toml +0 -0
- {grift_cli-0.5.8 → grift_cli-0.7.2}/golden/pins.toml +0 -0
- {grift_cli-0.5.8 → grift_cli-0.7.2}/scripts/admission_v2026_11.py +0 -0
- {grift_cli-0.5.8 → grift_cli-0.7.2}/scripts/build_dist_v2026_11.py +0 -0
- {grift_cli-0.5.8 → grift_cli-0.7.2}/scripts/build_distributions.py +0 -0
- {grift_cli-0.5.8 → grift_cli-0.7.2}/scripts/check_forbidden_vocab.py +0 -0
- {grift_cli-0.5.8 → grift_cli-0.7.2}/scripts/corpus_ad_pilot.py +0 -0
- {grift_cli-0.5.8 → grift_cli-0.7.2}/scripts/corpus_run.py +0 -0
- {grift_cli-0.5.8 → grift_cli-0.7.2}/scripts/discriminant_v2026.py +0 -0
- {grift_cli-0.5.8 → grift_cli-0.7.2}/scripts/discriminant_v2026_11.py +0 -0
- {grift_cli-0.5.8 → grift_cli-0.7.2}/scripts/gen_golden_expected.py +0 -0
- {grift_cli-0.5.8 → grift_cli-0.7.2}/scripts/hygiene_grep.py +0 -0
- {grift_cli-0.5.8 → grift_cli-0.7.2}/src/tep_cli/__init__.py +0 -0
- {grift_cli-0.5.8 → grift_cli-0.7.2}/src/tep_core/__init__.py +0 -0
- {grift_cli-0.5.8 → grift_cli-0.7.2}/src/tep_core/activity.py +0 -0
- {grift_cli-0.5.8 → grift_cli-0.7.2}/src/tep_core/core_period.py +0 -0
- {grift_cli-0.5.8 → grift_cli-0.7.2}/src/tep_core/data/v2026.09/distributions.json +0 -0
- {grift_cli-0.5.8 → grift_cli-0.7.2}/src/tep_core/data/v2026.11/distributions.json +0 -0
- {grift_cli-0.5.8 → grift_cli-0.7.2}/src/tep_core/lineage.py +0 -0
- {grift_cli-0.5.8 → grift_cli-0.7.2}/src/tep_core/observation.py +0 -0
- {grift_cli-0.5.8 → grift_cli-0.7.2}/src/tep_core/paths.py +0 -0
- {grift_cli-0.5.8 → grift_cli-0.7.2}/src/tep_core/reference.py +0 -0
- {grift_cli-0.5.8 → grift_cli-0.7.2}/src/tep_core/survival.py +0 -0
- {grift_cli-0.5.8 → grift_cli-0.7.2}/src/tep_core/tests_observed.py +0 -0
- {grift_cli-0.5.8 → grift_cli-0.7.2}/tests/conftest.py +0 -0
- {grift_cli-0.5.8 → grift_cli-0.7.2}/tests/git_fixture.py +0 -0
- {grift_cli-0.5.8 → grift_cli-0.7.2}/tests/test_activity.py +0 -0
- {grift_cli-0.5.8 → grift_cli-0.7.2}/tests/test_cli.py +0 -0
- {grift_cli-0.5.8 → grift_cli-0.7.2}/tests/test_cochange.py +0 -0
- {grift_cli-0.5.8 → grift_cli-0.7.2}/tests/test_context_profile.py +0 -0
- {grift_cli-0.5.8 → grift_cli-0.7.2}/tests/test_default_report_path.py +0 -0
- {grift_cli-0.5.8 → grift_cli-0.7.2}/tests/test_discriminant_claims.py +0 -0
- {grift_cli-0.5.8 → grift_cli-0.7.2}/tests/test_export.py +0 -0
- {grift_cli-0.5.8 → grift_cli-0.7.2}/tests/test_export_recipe.py +0 -0
- {grift_cli-0.5.8 → grift_cli-0.7.2}/tests/test_forbidden_vocab.py +0 -0
- {grift_cli-0.5.8 → grift_cli-0.7.2}/tests/test_gitutil.py +0 -0
- {grift_cli-0.5.8 → grift_cli-0.7.2}/tests/test_h5_swarm.py +0 -0
- {grift_cli-0.5.8 → grift_cli-0.7.2}/tests/test_hygiene.py +0 -0
- {grift_cli-0.5.8 → grift_cli-0.7.2}/tests/test_identity_validation.py +0 -0
- {grift_cli-0.5.8 → grift_cli-0.7.2}/tests/test_lifecycle_v2.py +0 -0
- {grift_cli-0.5.8 → grift_cli-0.7.2}/tests/test_not_observed.py +0 -0
- {grift_cli-0.5.8 → grift_cli-0.7.2}/tests/test_origin.py +0 -0
- {grift_cli-0.5.8 → grift_cli-0.7.2}/tests/test_persona_answers.py +0 -0
- {grift_cli-0.5.8 → grift_cli-0.7.2}/tests/test_release_gate.py +0 -0
- {grift_cli-0.5.8 → grift_cli-0.7.2}/tests/test_report.py +0 -0
- {grift_cli-0.5.8 → grift_cli-0.7.2}/tests/test_rework.py +0 -0
- {grift_cli-0.5.8 → grift_cli-0.7.2}/tests/test_schema.py +0 -0
- {grift_cli-0.5.8 → grift_cli-0.7.2}/tests/test_scope.py +0 -0
- {grift_cli-0.5.8 → grift_cli-0.7.2}/tests/test_shared_block.py +0 -0
- {grift_cli-0.5.8 → grift_cli-0.7.2}/tests/test_survival.py +0 -0
- {grift_cli-0.5.8 → 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
|