BREAKING feat/slice-5-provenance-retention #1 / 1
42 days ago · Jun 11, 2026 · Diff

Add fixture provenance retention deletion

sha256:91e875d4a97bb1e35f37992f803988d5713931f1782d870c371c50054574af22 sha
+146 ~49 −5 symbols
19 changed · 39 in snapshot files
sha256:2f6e430403f9b56fc78e26c461042c915c9dd63e146216548b876cbedf163089 snapshot
+146
symbols added
~49
symbols modified
−5
symbols removed
19
files changed
39
files in snapshot
0
dead code introduced
Semantic Changes 200 symbols
~ src/scooling_lab/provenance.py .py 25 symbols added
+ HASH_RE variable variable HASH_RE L28–28
+ JOB_ID_RE variable variable JOB_ID_RE L29–29
+ PROVENANCE_KEYS variable variable PROVENANCE_KEYS L17–27
+ PROVENANCE_SCHEMA_VERSION variable variable PROVENANCE_SCHEMA_VERSION L16–16
+ ProvenanceRecord class class ProvenanceRecord L35–72
+ from_mapping method method from_mapping L60–72
+ to_dict method method to_dict L46–57
+ SAFE_MODEL_ID_RE variable variable SAFE_MODEL_ID_RE L30–30
+ UNSAFE_FREE_TEXT_RE variable variable UNSAFE_FREE_TEXT_RE L31–31
+ build_parser function function build_parser L141–147
+ ApiError import import ApiError L12–12
+ ErrorCode import import ErrorCode L12–12
+ Mapping import import Mapping L10–10
+ Path import import Path L9–9
+ annotations import import annotations L3–3
+ argparse import import argparse L5–5
+ dataclass class import dataclass L8–8
+ json import import json L6–6
+ parse_utc_timestamp import import parse_utc_timestamp L13–13
+ re import import re L7–7
+ load_provenance_file function function load_provenance_file L110–116
+ main function function main L150–158
+ self_check function function self_check L119–138
+ validate_provenance_mapping function function validate_provenance_mapping L75–98
+ validate_provenance_record function function validate_provenance_record L101–107
~ src/scooling_lab/retention.py .py 21 symbols added
+ RETENTION_BOUNDS variable variable RETENTION_BOUNDS L47–65
+ RetentionBounds class class RetentionBounds L23–28
+ RetentionPolicy class class RetentionPolicy L32–44
+ to_public_dict method method to_public_dict L38–44
+ RetentionPolicyClass class class RetentionPolicyClass L14–19
+ default_retention_policy function function default_retention_policy L68–75
+ expires_at function function expires_at L120–124
+ ApiError import import ApiError L11–11
+ Enum import import Enum L7–7
+ ErrorCode import import ErrorCode L11–11
+ Mapping import import Mapping L9–9
+ MappingProxyType import import MappingProxyType L8–8
+ UTC import import UTC L6–6
+ annotations import import annotations L3–3
+ dataclass class import dataclass L5–5
+ datetime import import datetime L6–6
+ timedelta import import timedelta L6–6
+ is_expired function function is_expired L127–131
+ parse_utc_timestamp function function parse_utc_timestamp L106–111
+ retention_policy_from_mapping function function retention_policy_from_mapping L78–103
+ utc_timestamp function function utc_timestamp L114–117
~ docs/ROADMAP.md .md 1 symbol added, 3 symbols modified
+ Slice 5: Fixture Provenance, Retention, And Deletion section Slice 5: Fixture Provenance, Retention, And Deletion L36–41
~ docs/TRAINING-API-CONTRACT.md .md 2 symbols added, 6 symbols modified
+ Provenance Records section Provenance Records L53–73
+ Retention And Deletion section Retention And Deletion L73–84
~ Routes
~ table
~ src/scooling_lab/api.py .py 4 symbols added, 2 symbols modified
+ ARTIFACT_ID_RE variable variable ARTIFACT_ID_RE L20–20
+ JOB_ID_RE variable variable JOB_ID_RE L19–19
+ re import import re L9–9
+ parse_artifact_route function function parse_artifact_route L40–55
~ src/scooling_lab/contracts.py .py 7 symbols added, 6 symbols modified
+ ARTIFACT_ID_RE variable variable ARTIFACT_ID_RE L58–58
+ JOB_ID_RE variable variable JOB_ID_RE L57–57
+ RetentionPolicy import import RetentionPolicy L14–14
+ default_retention_policy import import default_retention_policy L14–14
+ retention_policy_from_mapping import import retention_policy_from_mapping L14–14
+ require_artifact_id function function require_artifact_id L188–193
+ require_job_id function function require_job_id L180–185
~ src/scooling_lab/fake_worker.py .py 7 symbols added, 3 symbols modified
+ cached_fixture_dataset_hash function function cached_fixture_dataset_hash L54–57
+ ApiError import import ApiError L11–11
+ ErrorCode import import ErrorCode L11–11
+ ProvenanceRecord import import ProvenanceRecord L12–12
+ cache import import cache L8–8
+ validate_provenance_record import import validate_provenance_record L12–12
+ training_config_hash function function training_config_hash L60–74
~ src/scooling_lab/service.py .py 9 symbols added, 6 symbols modified
+ delete_artifact method method delete_artifact L69–74
+ get_provenance method method get_provenance L62–67
+ sweep_expired_artifacts method method sweep_expired_artifacts L76–79
+ verify_deleted_artifact_absence method method verify_deleted_artifact_absence L81–84
+ Iterable import import Iterable L6–6
+ TrainingJobStatus import import TrainingJobStatus L8–8
+ datetime import import datetime L5–5
+ require_artifact_id import import require_artifact_id L8–8
+ require_job_id import import require_job_id L8–8
~ src/scooling_lab/store.py .py 20 symbols added, 12 symbols modified
+ DeletionReceipt class class DeletionReceipt L77–95
+ to_dict method method to_dict L86–95
+ _delete_artifact_locked method method _delete_artifact_locked L395–412
+ _delete_expired_artifact_locked method method _delete_expired_artifact_locked L385–393
+ _find_artifact method method _find_artifact L414–420
+ _hashes_for_artifact method method _hashes_for_artifact L422–434
+ delete_artifact method method delete_artifact L324–342
+ evaluate_expiry method method evaluate_expiry L298–307
+ get_provenance method method get_provenance L288–296
+ sweep_expired method method sweep_expired L309–322
+ verify_hash_absence method method verify_hash_absence L344–373
+ Iterable import import Iterable L10–10
+ ProvenanceRecord import import ProvenanceRecord L19–19
+ RetentionPolicy import import RetentionPolicy L20–20
+ expires_at import import expires_at L20–20
+ is_expired import import is_expired L20–20
+ require_artifact_id import import require_artifact_id L12–12
+ require_job_id import import require_job_id L12–12
+ retention_policy_from_mapping import import retention_policy_from_mapping L20–20
+ validate_provenance_record import import validate_provenance_record L19–19
~ tests/scooling_lab_helpers.py .py 1 symbol modified
~ tests/test_data_integrity.py .py 4 symbols added, 1 symbol modified
+ test_data_integrity_deletion_verification_finds_zero_residue method method test_data_integrity_deletion_verification_finds_zero_residue L47–63
+ test_data_integrity_provenance_hashes_stable_across_restarts method method test_data_integrity_provenance_hashes_stable_across_restarts L26–45
+ test_data_integrity_tombstone_carries_no_content_fields method method test_data_integrity_tombstone_carries_no_content_fields L65–86
+ json import import json L5–5
~ tests/test_e2e.py .py 7 symbols added, 5 symbols removed, 1 symbol modified
ScoolingLabE2ETests class class ScoolingLabE2ETests L18–52
test_e2e_http_create_poll_completed_and_list_artifacts method method test_e2e_http_create_poll_completed_and_list_artifacts L21–42
get_json function function get_json L71–78
request import import urllib.request L8–8
post_json function function post_json L55–68
+ ScoolingLabEndToEndTests class class ScoolingLabEndToEndTests L19–126
+ _json_request method method _json_request L77–89
+ test_e2e_create_fetch_provenance_delete_and_verify_absence method method test_e2e_create_fetch_provenance_delete_and_verify_absence L22–75
+ test_e2e_http_create_poll_completed_and_list_artifacts method method test_e2e_http_create_poll_completed_and_list_artifacts L91–116
+ HTTPError import import HTTPError L9–9
+ Request import import Request L10–10
+ urlopen import import urlopen L10–10
~ tests/test_integration.py .py 8 symbols added, 2 symbols modified
+ test_integration_deletion_cascades_store_and_provenance method method test_integration_deletion_cascades_store_and_provenance L53–73
+ test_integration_fake_worker_emits_valid_provenance method method test_integration_fake_worker_emits_valid_provenance L40–51
+ test_integration_sweep_over_mixed_policy_fixtures method method test_integration_sweep_over_mixed_policy_fixtures L75–97
+ ApiError import import ApiError L11–11
+ UTC import import UTC L5–5
+ datetime import import datetime L5–5
+ timedelta import import timedelta L5–5
+ validate_provenance_record import import validate_provenance_record L12–12
~ tests/test_performance.py .py 5 symbols added, 1 symbol modified
+ test_performance_provenance_emission_is_constant_time_bounded method method test_performance_provenance_emission_is_constant_time_bounded L54–66
+ test_performance_sweep_is_bounded_over_ten_thousand_fixture_jobs method method test_performance_sweep_is_bounded_over_ten_thousand_fixture_jobs L68–83
+ UTC import import UTC L5–5
+ datetime import import datetime L5–5
+ timedelta import import timedelta L5–5
~ tests/test_security.py .py 6 symbols added, 2 symbols modified
+ test_security_forged_artifact_id_cannot_delete_another_job method method test_security_forged_artifact_id_cannot_delete_another_job L83–97
+ test_security_path_traversal_and_injection_ids_are_rejected method method test_security_path_traversal_and_injection_ids_are_rejected L99–126
+ test_security_provenance_excludes_synthetic_fixture_text_markers method method test_security_provenance_excludes_synthetic_fixture_text_markers L70–81
+ TrainingApiService import import TrainingApiService L14–14
+ TrainingJobStore import import TrainingJobStore L15–15
+ fixture_dataset_bytes import import fixture_dataset_bytes L11–11
~ tests/test_stress.py .py 5 symbols added, 1 symbol modified
+ test_stress_concurrent_delete_and_read_never_resurrects_data method method test_stress_concurrent_delete_and_read_never_resurrects_data L70–97
+ test_stress_many_jobs_interleave_deletes_and_sweeps method method test_stress_many_jobs_interleave_deletes_and_sweeps L47–68
+ UTC import import UTC L6–6
+ datetime import import datetime L6–6
+ timedelta import import timedelta L6–6
~ tests/test_unit.py .py 15 symbols added, 1 symbol modified
+ test_unit_deleted_state_transition_is_terminal method method test_unit_deleted_state_transition_is_terminal L51–63
+ test_unit_deletion_state_transition_removes_content_fields method method test_unit_deletion_state_transition_removes_content_fields L128–145
+ test_unit_provenance_schema_rejects_free_text_paths_and_urls method method test_unit_provenance_schema_rejects_free_text_paths_and_urls L78–101
+ test_unit_retention_ttl_math_is_bounded_and_deterministic method method test_unit_retention_ttl_math_is_bounded_and_deterministic L103–126
+ ProvenanceRecord import import ProvenanceRecord L13–13
+ RetentionPolicyClass class import RetentionPolicyClass L14–14
+ TrainingApiService import import TrainingApiService L20–20
+ TrainingJobStore import import TrainingJobStore L22–22
+ UTC import import UTC L5–5
+ datetime import import datetime L5–5
+ expires_at import import expires_at L14–14
+ is_expired import import is_expired L14–14
+ retention_policy_from_mapping import import retention_policy_from_mapping L14–14
+ timedelta import import timedelta L5–5
+ validate_provenance_record import import validate_provenance_record L13–13
Files Changed
+2 ~17
39 in snapshot
← Older Oldest on feat/slice-5-provenance-retention
All commits
Newer → Latest on feat/slice-5-provenance-retention

0 comments

No comments yet. Be the first to start the discussion.

To add a comment, use the Muse CLI: muse hub commit comment sha256:91e875d4a97bb1e35f37992f803988d5713931f1782d870c371c50054574af22 --body "your comment"