feat(validation): quality score, readiness estesa, transizioni blocking#390
Merged
Conversation
Gap 5 — fail_on_row_drop_exceeded (default True) in TransitionConfig: transizioni con drop eccessivo producono errori invece di warnings. check_transitions() + clean/validate + mart/validate propagate. Gap 1 — quality_score (0-100) + quality_verdict in build_validation_summary(): errors=-20, warnings=-5. Gradiente visibile anche con passed=True. Gap 3 — quality_score propagato a tutti i consumatori: write_validation_json() (disco), CLI run full, README report, _validation_summary_for_layer() (MCP), build_run_report(). Gap 2 — Readiness estesa con 3 nuovi check: - clean_columns_naming (snake_case) - validation_rules_coverage (% colonne con regole) - metadata_complete (source_id) review_readiness ora conta solo check attivi (ok=None esclusi). Warning/error text persistiti nel run record (cap 20): build_validation_summary() include errors/warnings liste. CLI run full mostra recap warnings in output. quality_verdict esposto in _validation_summary_for_layer(). Project-example aggiornato con source_id per test readiness.
Pre-existing mypy error: ResponseLike type union doesn't guarantee .close() on all variants. Same fix already applied at line 439.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Sintesi
Pipeline di validazione resa più robusta: quality score con gradiente,
transizioni bloccanti di default, readiness estesa con check di qualità.
Contesto collegato
Analisi dei gap nella validazione del toolkit (sessione 2026-06-20):
fail_on_row_drop_exceededCosa cambia
Impatto su contratti pubblici
dataset.yml(nuovo campo, cambio obbligatorietà)quality_scorein validation JSON,quality_verdict)Verifica
pytestpassa (110 test)ruff check .passamypy toolkit/passapolicy)Checklist PR
Riepilogo modifiche
core/config_models/mart.pyfail_on_row_drop_exceededin TransitionConfig (default True)core/validation.pyquality_score+quality_verdictinbuild_validation_summary(); error/warning text persistiti;check_transitions()supporta error modeclean/validate.pycheck_transitions()mart/validate.pycheck_transitions()cli/inspect/readiness_ops.pyok=Noneescluso dal conteggiocli/inspect/_helpers.pyquality_score+quality_verdictin_validation_summary_for_layer();columnserulescli/inspect/report_ops.pyquality_scorein layer validation report; fallback qualitàcli/cmd_run.pyqs=Nin output CLI; recap warnings messaggiproject-example/dataset.ymlsource_idper readinesstests/test_validate_layers.pyDettaglio nuovi campi pubblici
validation JSON su disco (
raw_validation.json,clean_validation.json,mart_validation.json):{ "quality_score": 90, "quality_verdict": "buona", "errors": ["..."], "warnings": ["..."] }Run record (
_runs/{dataset}/{year}/*.json):Note per chi revisiona
fail_on_row_drop_exceededè True di default. Chi vuole il vecchio comportamento aggiungafail_on_row_drop_exceeded: falsenel transition config.needs-reviewanche su dataset funzionanti ma con naming o coverage parziali — è il comportamento voluto.