BREAKING feat/t0-dependency-inventory #2 / 2
42 days ago · Jun 11, 2026 · Diff

Land Scooling Lab T0/T2 training contract and seven-tier tests

sha256:2313b6a6353294a0ca08ff579624198da250b99163a86215aed31a905912e360 sha
+290 ~13 −48 symbols
31 changed · 36 in snapshot files
sha256:2002f0731003b1a048d72c531e167e7d80ea1a5a821829817354064a83053a7d snapshot
+290
symbols added
~13
symbols modified
−48
symbols removed
31
files changed
36
files in snapshot
0
dead code introduced
Semantic Changes 351 symbols
~ DEPENDENCIES.md .md 2 symbols added
+ Scooling Lab Dependency Inventory section Scooling Lab Dependency Inventory L1–13
+ table section table L7–10
~ docs/LEGAL-REVIEW-CHECKLIST.md .md 5 symbols added
+ Legal Review Checklist section Legal Review Checklist L1–43
+ Pre-Paid-GPU Checklist section Pre-Paid-GPU Checklist L21–33
+ Pre-Private-Data Checklist section Pre-Private-Data Checklist L8–21
+ Required Seven-Tier Evidence section Required Seven-Tier Evidence L33–43
+ Simple Summary section Simple Summary L3–8
~ docs/TRAINING-API-CONTRACT.md .md 9 symbols added
+ Training API Contract section Training API Contract L1–81
+ Audit Event Names section Audit Event Names L69–81
+ Fixture Queue And Quota Policy section Fixture Queue And Quota Policy L63–69
+ Routes section Routes L9–16
+ Safe Error Codes section Safe Error Codes L49–63
+ Simple Summary section Simple Summary L3–9
+ State Machine section State Machine L36–49
+ table section table L38–45
+ createTrainingJob Request section createTrainingJob Request L16–36
~ docs/UNSLOTH-LICENSE-EVIDENCE.md .md 8 symbols added
+ Unsloth License Evidence section Unsloth License Evidence L1–51
+ Approved For Later Evaluation Only section Approved For Later Evaluation Only L31–36
+ Byte-For-Byte CI Preservation section Byte-For-Byte CI Preservation L47–51
+ Candidate section Candidate L8–19
+ No-Go List section No-Go List L36–47
+ Preserved License Notice section Preserved License Notice L19–31
+ code[text] variable variable code[text] L23–27
+ Simple Summary section Simple Summary L3–8
~ src/scooling_lab/api.py .py 17 symbols added
+ MAX_BODY_BYTES variable variable MAX_BODY_BYTES L17–17
+ ApiError import import ApiError L12–12
+ BaseHTTPRequestHandler import import BaseHTTPRequestHandler L7–7
+ Callable import import Callable L9–9
+ ErrorCode import import ErrorCode L12–12
+ HTTPStatus import import HTTPStatus L6–6
+ Path import import Path L8–8
+ ThreadingHTTPServer import import ThreadingHTTPServer L7–7
+ TrainingApiService import import TrainingApiService L13–13
+ TrainingJobStore import import TrainingJobStore L14–14
+ annotations import import annotations L3–3
+ error_payload import import error_payload L12–12
+ json import import json L5–5
+ urlparse import import urlparse L10–10
+ make_handler function function make_handler L37–125
+ parse_job_route function function parse_job_route L20–34
+ run_server function function run_server L128–133
~ src/scooling_lab/bom.py .py 20 symbols added
+ SKIP_AUDIT_DIRS variable variable SKIP_AUDIT_DIRS L19–35
+ audit_repository_paths function function audit_repository_paths L123–130
+ build_parser function function build_parser L173–181
+ collect_entries function function collect_entries L114–120
+ dependency_entries function function dependency_entries L66–97
+ BomEntry import import BomEntry L11–11
+ LicensePolicyError import import LicensePolicyError L11–11
+ Path import import Path L9–9
+ annotations import import annotations L3–3
+ argparse import import argparse L5–5
+ sys import import sys L6–6
+ time import import time L7–7
+ tomllib import import tomllib L8–8
+ validate_entries import import validate_entries L11–11
+ validate_source_path import import validate_source_path L11–11
+ main function function main L184–205
+ parse_lock_metadata function function parse_lock_metadata L100–111
+ project_entry function function project_entry L38–63
+ render_markdown function function render_markdown L144–170
+ should_skip_path function function should_skip_path L133–141
~ src/scooling_lab/errors.py .py 8 symbols added
+ ApiError class class ApiError L35–45
+ message method method message L42–45
+ ErrorCode class class ErrorCode L9–19
+ SAFE_ERROR_MESSAGES variable variable SAFE_ERROR_MESSAGES L22–31
+ error_payload function function error_payload L48–56
+ Enum import import Enum L6–6
+ annotations import import annotations L3–3
+ dataclass class import dataclass L5–5
~ src/scooling_lab/fake_worker.py .py 16 symbols added
+ FIXTURE_DATASET_RESOURCE variable variable FIXTURE_DATASET_RESOURCE L12–12
+ FakeTrainingWorker class class FakeTrainingWorker L48–77
+ __init__ method method __init__ L51–54
+ run_job method method run_job L56–77
+ fixture_dataset_bytes function function fixture_dataset_bytes L15–22
+ fixture_dataset_hash function function fixture_dataset_hash L25–28
+ ArtifactMetadata import import ArtifactMetadata L10–10
+ TrainingJobRecord import import TrainingJobRecord L10–10
+ TrainingJobStatus import import TrainingJobStatus L9–9
+ TrainingJobStore import import TrainingJobStore L10–10
+ annotations import import annotations L3–3
+ hashlib import import hashlib L5–5
+ resources import import importlib.resources L6–6
+ json import import json L7–7
+ utc_now_iso import import utc_now_iso L10–10
+ placeholder_artifact_hash function function placeholder_artifact_hash L31–45
~ src/scooling_lab/service.py .py 10 symbols added
+ TrainingApiService class class TrainingApiService L10–47
+ __init__ method method __init__ L13–18
+ cancel_training_job method method cancel_training_job L34–41
+ create_training_job method method create_training_job L20–27
+ get_training_job method method get_training_job L29–32
+ list_artifacts method method list_artifacts L43–47
+ FakeTrainingWorker import import FakeTrainingWorker L6–6
+ TrainingJobRequest import import TrainingJobRequest L5–5
+ TrainingJobStore import import TrainingJobStore L7–7
+ annotations import import annotations L3–3
~ src/scooling_lab/state_machine.py .py 8 symbols added
+ TRANSITION_TABLE variable variable TRANSITION_TABLE L11–33
+ cancel function function cancel L48–53
+ ApiError import import ApiError L8–8
+ ErrorCode import import ErrorCode L8–8
+ MappingProxyType import import MappingProxyType L5–5
+ TrainingJobStatus import import TrainingJobStatus L7–7
+ annotations import import annotations L3–3
+ transition function function transition L36–45
~ src/scooling_lab/store.py .py 31 symbols added
+ ArtifactMetadata class class ArtifactMetadata L23–53
+ from_dict method method from_dict L44–53
+ to_dict method method to_dict L32–41
+ TrainingJobRecord class class TrainingJobRecord L57–117
+ from_persisted_dict method method from_persisted_dict L97–117
+ to_persisted_dict method method to_persisted_dict L78–94
+ to_public_dict method method to_public_dict L67–76
+ TrainingJobStore class class TrainingJobStore L120–229
+ __init__ method method __init__ L123–131
+ _load method method _load L215–229
+ _save method method _save L200–213
+ active_count method method active_count L190–198
+ create method method create L133–146
+ get method method get L148–155
+ list_artifacts method method list_artifacts L184–188
+ register_artifact method method register_artifact L171–182
+ update_status method method update_status L157–169
+ ApiError import import ApiError L12–12
+ ErrorCode import import ErrorCode L12–12
+ Path import import Path L9–9
+ TrainingJobRequest import import TrainingJobRequest L11–11
+ TrainingJobStatus import import TrainingJobStatus L11–11
+ UTC import import UTC L8–8
+ annotations import import annotations L3–3
+ dataclass class import dataclass L7–7
+ datetime import import datetime L8–8
+ field import import field L7–7
+ json import import json L5–5
+ threading import import threading L6–6
+ transition import import transition L13–13
+ utc_now_iso function function utc_now_iso L16–19
~ tests/scooling_lab_helpers.py .py 6 symbols added
+ PROJECT_ROOT variable variable PROJECT_ROOT L8–8
+ SRC_ROOT variable variable SRC_ROOT L9–9
+ Path import import Path L6–6
+ annotations import import annotations L3–3
+ sys import import sys L5–5
+ valid_payload function function valid_payload L14–27
~ tests/test_data_integrity.py .py 13 symbols added
+ EXPECTED_UNSLOTH_NOTICE variable variable EXPECTED_UNSLOTH_NOTICE L16–19
+ ScoolingLabDataIntegrityTests class class ScoolingLabDataIntegrityTests L22–53
+ test_data_integrity_job_and_artifact_hashes_survive_restart method method test_data_integrity_job_and_artifact_hashes_survive_restart L25–44
+ test_data_integrity_unsloth_evidence_preserved_byte_for_byte method method test_data_integrity_unsloth_evidence_preserved_byte_for_byte L46–53
+ PROJECT_ROOT import import PROJECT_ROOT L9–9
+ Path import import Path L7–7
+ TrainingApiService import import TrainingApiService L12–12
+ TrainingJobStore import import TrainingJobStore L13–13
+ annotations import import annotations L3–3
+ fixture_dataset_hash import import fixture_dataset_hash L11–11
+ tempfile import import tempfile L5–5
+ unittest import import unittest L6–6
+ valid_payload import import valid_payload L9–9
~ tests/test_e2e.py .py 16 symbols added
+ ScoolingLabE2ETests class class ScoolingLabE2ETests L18–52
+ test_e2e_ci_workflow_runs_lab_chain method method test_e2e_ci_workflow_runs_lab_chain L44–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
+ PROJECT_ROOT import import PROJECT_ROOT L11–11
+ ThreadingHTTPServer import import ThreadingHTTPServer L9–9
+ TrainingApiService import import TrainingApiService L14–14
+ TrainingJobStore import import TrainingJobStore L15–15
+ annotations import import annotations L3–3
+ json import import json L5–5
+ make_handler import import make_handler L13–13
+ threading import import threading L6–6
+ unittest import import unittest L7–7
+ request import import urllib.request L8–8
+ valid_payload import import valid_payload L11–11
+ post_json function function post_json L55–68
~ tests/test_integration.py .py 11 symbols added
+ ScoolingLabIntegrationTests class class ScoolingLabIntegrationTests L14–43
+ test_integration_api_to_fake_worker_lifecycle method method test_integration_api_to_fake_worker_lifecycle L17–34
+ test_integration_bom_generation_over_real_project_files method method test_integration_bom_generation_over_real_project_files L36–43
+ PROJECT_ROOT import import PROJECT_ROOT L7–7
+ TrainingApiService import import TrainingApiService L10–10
+ TrainingJobStore import import TrainingJobStore L11–11
+ annotations import import annotations L3–3
+ collect_entries import import collect_entries L9–9
+ render_markdown import import render_markdown L9–9
+ unittest import import unittest L5–5
+ valid_payload import import valid_payload L7–7
~ tests/test_performance.py .py 11 symbols added
+ ScoolingLabPerformanceTests class class ScoolingLabPerformanceTests L15–51
+ test_performance_bom_scan_runs_inside_ci_budget method method test_performance_bom_scan_runs_inside_ci_budget L33–51
+ test_performance_status_and_list_artifacts_are_bounded method method test_performance_status_and_list_artifacts_are_bounded L18–31
+ PROJECT_ROOT import import PROJECT_ROOT L8–8
+ TrainingApiService import import TrainingApiService L11–11
+ TrainingJobStore import import TrainingJobStore L12–12
+ annotations import import annotations L3–3
+ bom_main import import bom_main L10–10
+ time import import time L5–5
+ unittest import import unittest L6–6
+ valid_payload import import valid_payload L8–8
~ tests/test_security.py .py 14 symbols added
+ ScoolingLabSecurityTests class class ScoolingLabSecurityTests L15–75
+ test_security_agpl_package_and_blocked_paths_are_rejected method method test_security_agpl_package_and_blocked_paths_are_rejected L53–75
+ test_security_rejects_path_traversal_command_and_url_injection method method test_security_rejects_path_traversal_command_and_url_injection L18–41
+ test_security_secret_scan_and_bom_audit_are_wired method method test_security_secret_scan_and_bom_audit_are_wired L43–51
+ ApiError import import ApiError L11–11
+ BomEntry import import BomEntry L12–12
+ LicensePolicyError import import LicensePolicyError L12–12
+ PROJECT_ROOT import import PROJECT_ROOT L7–7
+ TrainingJobRequest import import TrainingJobRequest L10–10
+ annotations import import annotations L3–3
+ audit_repository_paths import import audit_repository_paths L9–9
+ unittest import import unittest L5–5
+ valid_payload import import valid_payload L7–7
+ validate_entry import import validate_entry L12–12
~ tests/test_stress.py .py 11 symbols added
+ ScoolingLabStressTests class class ScoolingLabStressTests L15–44
+ test_stress_concurrent_duplicate_create_is_deduplicated method method test_stress_concurrent_duplicate_create_is_deduplicated L18–31
+ test_stress_many_fixture_jobs_respect_queue_limit method method test_stress_many_fixture_jobs_respect_queue_limit L33–44
+ ApiError import import ApiError L10–10
+ ErrorCode import import ErrorCode L10–10
+ TrainingApiService import import TrainingApiService L11–11
+ TrainingJobStore import import TrainingJobStore L12–12
+ annotations import import annotations L3–3
+ futures import import concurrent.futures L5–5
+ unittest import import unittest L6–6
+ valid_payload import import valid_payload L8–8
~ tests/test_unit.py .py 18 symbols added
+ ScoolingLabUnitTests class class ScoolingLabUnitTests L15–95
+ test_unit_error_model_does_not_echo_payload_or_paths method method test_unit_error_model_does_not_echo_payload_or_paths L87–95
+ test_unit_invalid_state_transition_raises_safe_error method method test_unit_invalid_state_transition_raises_safe_error L34–39
+ test_unit_license_policy_blocks_agpl_and_blocked_paths method method test_unit_license_policy_blocks_agpl_and_blocked_paths L54–85
+ test_unit_schema_rejects_unsafe_fields_and_unapproved_models method method test_unit_schema_rejects_unsafe_fields_and_unapproved_models L41–52
+ test_unit_state_transitions_are_explicit_and_idempotent method method test_unit_state_transitions_are_explicit_and_idempotent L18–32
+ ApiError import import ApiError L10–10
+ BomEntry import import BomEntry L11–11
+ ErrorCode import import ErrorCode L10–10
+ LicensePolicyError import import LicensePolicyError L11–11
+ TrainingJobRequest import import TrainingJobRequest L9–9
+ TrainingJobStatus import import TrainingJobStatus L9–9
+ annotations import import annotations L3–3
+ error_payload import import error_payload L10–10
+ transition import import transition L12–12
+ unittest import import unittest L5–5
+ valid_payload import import valid_payload L7–7
+ validate_entry import import validate_entry L11–11
~ tests/test_contracts.py .py 9 symbols removed
TrainingContractTests class class TrainingContractTests L13–62
test_blank_required_fields_are_reported_deterministically method method test_blank_required_fields_are_reported_deterministically L33–58
test_training_status_values_are_stable method method test_training_status_values_are_stable L60–62
test_valid_training_job_request_has_no_errors method method test_valid_training_job_request_has_no_errors L16–31
TestCase import import TestCase L3–3
TrainingDatasetRef import import TrainingDatasetRef L5–5
TrainingJobRequest import import TrainingJobRequest L5–5
TrainingJobStatus import import TrainingJobStatus L5–5
validate_training_job_request import import validate_training_job_request L5–5
~ tests/test_license_policy.py .py 9 symbols removed
LicensePolicyTests class class LicensePolicyTests L13–42
test_agpl_component_paths_are_blocked method method test_agpl_component_paths_are_blocked L21–24
test_audit_splits_accepted_and_rejected_entries method method test_audit_splits_accepted_and_rejected_entries L26–42
test_permissive_license_ids_are_allowed method method test_permissive_license_ids_are_allowed L16–19
DependencyEntry import import DependencyEntry L5–5
TestCase import import TestCase L3–3
audit_dependency_entries import import audit_dependency_entries L5–5
is_allowed_source_path import import is_allowed_source_path L5–5
is_approved_license import import is_approved_license L5–5
~ docs/CROSS-REPO-STATUS.md .md 3 symbols added, 10 symbols removed, 2 symbols modified
Current Remote Policy section Current Remote Policy L103–117
code[text] variable variable code[text] L107–114
Current Repo Roles section Current Repo Roles L16–62
Knowtation section Knowtation L33–48
Scooling section Scooling L18–33
Scooling Lab section Scooling Lab L48–62
Recommended Next Build Order section Recommended Next Build Order L93–103
What Can Continue Now section What Can Continue Now L72–82
What Is Blocked section What Is Blocked L62–72
Work That Must Be Tested Together section Work That Must Be Tested Together L82–93
+ Incident Record: T0/T2 Relocation (2026-06) section Incident Record: T0/T2 Relocation (2026-06) L29–45
+ Technical Status section Technical Status L9–21
+ Untouched Boundaries section Untouched Boundaries L21–29
~ docs/DEPENDENCY-POLICY.md .md 4 symbols added, 1 symbol modified
+ Current State section Current State L22–29
+ No-Go List section No-Go List L29–39
+ Simple Summary section Simple Summary L3–10
+ Technical Policy section Technical Policy L10–22
~ docs/SECURITY.md .md 5 symbols added, 3 symbols removed
Security section Security L1–21
Reporting section Reporting L16–21
Rules section Rules L5–16
+ Scooling Lab Security section Scooling Lab Security L1–39
+ Blocked Until Later Review section Blocked Until Later Review L23–35
+ Review Requirement section Review Requirement L35–39
+ Simple Summary section Simple Summary L3–9
+ Technical Controls section Technical Controls L9–23
~ pyproject.toml .toml 11 symbols added, 4 symbols modified
+ build-system section build-system L0–0
+ build-backend variable variable build-backend L0–0
+ requires variable variable requires L0–0
+ bom section bom L0–0
+ ci_time_budget_seconds variable variable ci_time_budget_seconds L0–0
+ setuptools section setuptools L0–0
+ package-data section package-data L0–0
+ scooling_lab variable variable scooling_lab L0–0
+ packages section packages L0–0
+ find section find L0–0
+ where variable variable where L0–0
~ tool
~ src/scooling_lab/__init__.py .py 1 symbol removed, 3 symbols modified
TrainingDatasetRef import import TrainingDatasetRef L3–3
~ src/scooling_lab/contracts.py .py 23 symbols added, 5 symbols removed, 3 symbols modified
AdapterKind variable variable AdapterKind L20–20
ModelLocationPolicy variable variable ModelLocationPolicy L21–21
TrainingDatasetRef class class TrainingDatasetRef L25–31
Literal import import Literal L7–7
validate_training_job_request function function validate_training_job_request L45–63
+ ALLOWED_DATASET_IDS variable variable ALLOWED_DATASET_IDS L27–27
+ ALLOWED_MODEL_IDS variable variable ALLOWED_MODEL_IDS L26–26
+ ALLOWED_REQUEST_KEYS variable variable ALLOWED_REQUEST_KEYS L28–36
+ FORBIDDEN_KEY_TERMS variable variable FORBIDDEN_KEY_TERMS L37–47
+ FORBIDDEN_STRING_RE variable variable FORBIDDEN_STRING_RE L50–52
+ REQUESTER_RE variable variable REQUESTER_RE L49–49
+ SAFE_IDENTIFIER_RE variable variable SAFE_IDENTIFIER_RE L48–48
+ fingerprint method method fingerprint L103–116
+ from_mapping method method from_mapping L74–101
+ stable_job_id method method stable_job_id L118–122
+ to_public_dict method method to_public_dict L124–132
+ ApiError import import ApiError L13–13
+ ErrorCode import import ErrorCode L13–13
+ Mapping import import Mapping L11–11
+ MappingProxyType import import MappingProxyType L10–10
+ field import import field L8–8
+ hashlib import import hashlib L5–5
+ json import import json L6–6
+ re import import re L7–7
+ reject_forbidden_keys function function reject_forbidden_keys L135–143
+ require_requester function function require_requester L156–163
+ require_safe_identifier function function require_safe_identifier L146–153
+ validate_training_parameters function function validate_training_parameters L166–195
~ src/scooling_lab/license_policy.py .py 10 symbols added, 11 symbols removed
APPROVED_LICENSES variable variable APPROVED_LICENSES L10–10
DISALLOWED_PATH_PREFIXES variable variable DISALLOWED_PATH_PREFIXES L11–11
DependencyEntry class class DependencyEntry L15–20
LicenseAuditResult class class LicenseAuditResult L24–34
ok method method ok L31–34
audit_dependency_entries function function audit_dependency_entries L58–70
Iterable import import Iterable L7–7
PurePosixPath import import PurePosixPath L6–6
is_allowed_source_path function function is_allowed_source_path L49–55
is_approved_license function function is_approved_license L43–46
normalize_license_id function function normalize_license_id L37–40
+ ALLOWED_LICENSES variable variable ALLOWED_LICENSES L8–17
+ BLOCKED_LICENSES variable variable BLOCKED_LICENSES L19–31
+ BLOCKED_PATH_SEGMENTS variable variable BLOCKED_PATH_SEGMENTS L33–33
+ BomEntry class class BomEntry L41–48
+ LicensePolicyError class class LicensePolicyError L36–37
+ normalize_source_path function function normalize_source_path L51–57
+ validate_entries function function validate_entries L94–100
+ validate_entry function function validate_entry L81–91
+ validate_license function function validate_license L71–78
+ validate_source_path function function validate_source_path L60–68
Files Changed
+22 ~7 −2
36 in snapshot

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:2313b6a6353294a0ca08ff579624198da250b99163a86215aed31a905912e360 --body "your comment"