Checklist P0
| Voce | Stato | Dove |
|---|---|---|
Shim di compatibilità cargo; eseguibile di gestione qrust |
fatto | src/cli.rs, src/session.rs · tests/compat.rs |
| Engine sicuro contro la ricorsione (COMP-021, COMP-022) | fatto: il Cargo della toolchain stessa; una toolchain collegata il cui cargo è QuickRust viene rifiutata |
src/engine.rs · test0268_recursion_is_refused…, test0269_an_unreachable_dist_server… |
Toolchain: +toolchain, RUSTUP_TOOLCHAIN, file di toolchain, predefinita (COMP-012, COMP-020) |
fatto: QuickRust installa e seleziona da sé le toolchain (deviazione 6) | src/toolchain/ · qa003_*, test0238_toolchain_programs_run_through_quickrusts_proxies, test0237_builds_and_their_build_scripts_get_quickrusts_toolchain…, test0271_environment_reaches_build_scripts_unchanged |
| Inoltro di argv / stdin / stdout / stderr / segnali, exit status esatto | fatto | src/proc.rs · qa022, qa023, test0253_stdin_and_exit_codes… |
| Sottocomandi esterni, alias, flag sconosciuti | fatto | qa019, qa020, qa030 |
| Nessuna interferenza con la configurazione e l’ambiente di Cargo | fatto | test0271_environment_reaches_build_scripts_unchanged, test0233_no_rebuild_when_alternating… |
| Invocazioni annidate + opt-out | fatto, tramite PATH e $CARGO; vedi deviazione 1 |
qa019, test0237_builds_and_their_build_scripts_get_quickrusts_toolchain… |
| Fingerprint di workspace, toolchain e ambiente (FR-010) | fatto | src/discover.rs · qa002, test0188_report_follows… |
| Raccoglitore degli eventi JSON di Cargo | fatto, quando l’utente richiede JSON su una pipe | qa018 |
| Raccoglitore tramite wrapper di rustc; composizione con un wrapper esistente | fatto | src/wrapper.rs · qa010_qa011_qa012, test0250_wrapper_configured_in_cargo_config… |
| DAG osservato delle unità di build; percorso critico (FR-030) | fatto | test di unità in src/analyze.rs |
| Classificatore di ricompilazioni / invalidazioni (FR-040) | fatto | test di unità in src/waste.rs · test0189_rebuild_causes…, test0190_toolchain_change… |
| Duplicazione di versioni; varianti di feature/profilo/target (FR-050) | fatto | test di unità in src/waste.rs |
| Analisi degli script di build (FR-060); identificazione delle macro procedurali (FR-070) | fatto | qa007_qa008_qa009, test0191_build_script_without_rerun… |
| Visibilità su linker / generazione del codice (FR-080) | fatto | qrust analyze codegen |
| Valutatore della politica incrementale (FR-090) | fatto | test0204_sccache_policy… |
| Integrazione e report di sccache (FR-100) | fatto | src/cache.rs · test0204_sccache_policy…, qa026 |
Inventario degli artefatti, recuperabilità, GC (FR-110): qrust gc mantiene la cache entro i suoi limiti, --dry-run mostra un’anteprima |
fatto | src/inventory.rs, src/space.rs · test0194_inventory_and_its_stale_plan_are_read_only…, test0199_the_stale_plan_is_blocked_while_a_build_is_running, test0196_quickrusts_cache_removes_what_is_gone_then_the_least_recently_used… |
cargo clean esattamente come upstream |
fatto | qa016 |
| Identificazione dei worktree (FR-120) | fatto | test0203_worktrees_report… |
| Esecutore di scenari (FR-020); confronto (FR-160); esperimenti | fatto | src/bench.rs, src/compare.rs · benchmark_*, experiment_* |
| Motore di raccomandazioni (FR-150) | fatto | test di unità in src/recommend.rs |
| Anteprima sicura degli interventi correttivi (FR-170) | fatto; la classe safe può anche essere applicata e annullata |
src/remedy.rs |
| Schema del sidecar JSON | fatto | report-schema.md |
| Budget di regressione per la CI (FR-130) | fatto | test0193_budgets_gate_ci… |
| Oscuramento di segreti / percorsi | fatto | test0192_secrets_never_reach…, qa021 |
| Astrazione dei processi multipiattaforma | fatto; su Windows un’esecuzione smoke (setup, build, esecuzione, test) | src/proc.rs |
| Corpus di compatibilità QA-001…030 | fatto tranne QA-024 (Windows) | tests/compat.rs |
| Test dell’overhead prestazionale | fatto | test0273_dispatch_overhead_stays_within_budget |
Documentazione di migrazione / disinstallazione; doctor; via d’uscita |
fatto | Come adottare QuickRust gradualmente, Come installare QuickRust · test0208_doctor_setup_and_uninstall |
Non in questa release (P1 e successivi nella specifica)
Esecuzione controllata del GC, amministrazione della cache remota e modalità di cache in sola
lettura, servizio centrale e politiche dell’organizzazione, annotazioni sulle PR, analisi dei
container (FR-140), il protocollo dei plugin (FR-180), gli adattatori nightly per --unit-graph /
-Zbuild-analysis / tempi per sezione, l’esperimento di incorporamento dei metadati e la
telemetria di rete / I/O su disco. Le funzionalità nightly vengono rilevate ed elencate in
toolchain.capabilities; nulla dipende da esse.
Deviazioni e decisioni
-
CARGOè ilcargodi QuickRust (COMP-030), eseguendo Cargo sotto un altro nome. Cargo passa a tutto ciò che avvia (sottocomandi esterni, script di build,env!("CARGO"), binari di test) il proprio percorso, e accetta invece unCARGOereditato solo quando il suo eseguibile non si chiamacargo(Cargo 1.86 e successivi), oppure, in subordine, il percorso nel suoargv[0]quando questo si chiamacargo. QuickRust esegue quindi un hard link delcargodella toolchain,bin/.qrust-engine, conargv[0]eCARGOimpostati a~/.qrust/bin/cargo(Windows non ha unargv[0]separato: lì l’help di Cargo nomina il link,.qrust-engine.exe): una build annidata tramite$CARGO(quella di Clippy, di nextest, dicargo llvm-cov) è una sessione QuickRust collegata alla sessione genitore (COMP-031), con le impostazioni di QuickRust, come una tramitePATH. Da entrambe ci si può sottrarre conQRUST_NESTED=upstream(COMP-032).qrust upstreamesegue ilcargodella toolchain come sé stesso, e una toolchain collegata non viene mai modificata, quindi lì le build annidate tramite$CARGOraggiungono direttamente quel Cargo; le loro invocazioni di rustc vengono comunque osservate, perchéRUSTC_WRAPPERviene ereditato. -
Lo stato delle esecuzioni risiede in
~/.qrust, non nel repository. L’esempio di configurazione della specifica scrive i report in.qrust/runs/. Creare file in un repository a ognicargo buildnon è una cosa che un sostituto diretto dovrebbe fare, quindi la registrazione va inQRUST_HOMEe un percorso di report nel repository è opzionale (measurement.report,QRUST_REPORT). -
L’analisi è lazy per impostazione predefinita. Per mantenere l’overhead di dispatch entro NFR-PERF-001/003, il percorso di build si limita a registrare; i report vengono prodotti su richiesta, o in modo sincrono quando sono stati richiesti un report o l’applicazione di un budget. Un’esecuzione analizzata dopo esecuzioni successive conserva tutto ciò che è stato registrato al momento della build (unità, tempi, revisione) e riporta i metadati del workspace, lo stato di modifica e l’ingombro degli artefatti come non disponibili, invece di descrivere l’albero di oggi.
-
Le unità aggiornate richiedono lo stream JSON di Cargo. Su una toolchain stabile, nient’altro indica quali unità Cargo ha considerato aggiornate. QuickRust osserva lo stream solo quando l’utente lo ha già richiesto e stdout non è un terminale, così il comportamento sul terminale non viene mai alterato; altrimenti
units_freshènullcon un motivo. -
Il tempo di esecuzione degli script di build si ricava dai file che Cargo scrive attorno all’esecuzione (
invoked.timestamp, poistderr/root-output). Cargo retrodataoutputal momento dell’invocazione, quindi non può essere usato. -
È QuickRust a gestire le toolchain (decisione del 2026-10-12), non rustup (COMP-020). La specifica risolve un Cargo upstream tramite
PATHe rustup. QuickRust invece installa le toolchain dal dist server di Rust in~/.qrust/toolchainse le seleziona nell’ordine documentato da rustup (+toolchain,RUSTUP_TOOLCHAIN, file di toolchain, predefinita; gli override per directory di rustup non hanno equivalente). Ogni comando esegue il Cargo di quella toolchain con la Cargo home di QuickRust (~/.qrust/cargo).QRUST_REAL_CARGOecompatibility.real-cargonon esistono più: una toolchain compilata altrove si usa conqrust toolchain link. -
Gli errori di configurazione valgono per ogni comando. Un file
.qrust/config.tomlnon valido bloccacargo --versioncomecargo build, indicando il campo e il file;qrust upstreamnon ne è influenzato. -
Nessuna impostazione
cache.modeoartifacts.gc. La configurazione di esempio della specifica le elenca, ma con l’amministrazione della cache remota e l’esecuzione del GC escluse da questa release ciascuna avrebbe esattamente un solo valore ammesso. Una modalità di cache in sola lettura che un server sccache in esecuzione potrebbe non rispettare sarebbe inoltre una falsa garanzia. Le chiavi vengono rifiutate come sconosciute invece di essere accettate e ignorate. -
L’identità portabile di un’unità include il contenuto dei sorgenti. Cargo calcola l’hash dei membri del workspace in base al loro percorso relativo al workspace, quindi due worktree condividono gli hash delle unità anche su branch diversi. I duplicati tra worktree vengono contati solo quando anche gli input sono identici.
-
L’ordine dei messaggi JSON non fa parte dell’oracolo. Cargo upstream emette unità indipendenti in un ordine diverso da un’esecuzione all’altra, quindi il test di compatibilità confronta l’insieme dei messaggi byte per byte, non la loro sequenza.
-
Veloce per impostazione predefinita (revisione della specifica del 2026-10-11). Nel valore predefinito
mode = "fast", QuickRust cambia ciò che Cargo upstream compilerebbe in modi che mantengono identico il comportamento del programma: le impostazioni delle informazioni di debug, il frontend parallelo di rustc per le unità compilate da zero, una cache degli artefatti globale e il proprio output sul terminale.mode = "compat"produce esattamente le build di upstream; i test dell’oracolo byte per byte del corpus di compatibilità girano in modalità compat, e la fast mode ha test propri (le impostazioni cedono il passo a quelle dell’utente, il frontend parallelo non raggiunge mai una ricompilazione incrementale,#![feature]resta rifiutato su un compilatore stabile, la cache ripristina correttamente e non serve mai un sorgente modificato, la fast mode e upstream mantengono artefatti separati invece di ricompilarsi a vicenda). Ogni leva viene misurata dallo speed index e verificata con le suite di test dei carichi di lavoro dei benchmark prima di diventare predefinita. -
RUSTC_BOOTSTRAPper le leve-Z. Il compilatore stabile contiene il frontend parallelo e la selezione del linker che QuickRust usa dietro-Z. Il wrapper di QuickRust impostaRUSTC_BOOTSTRAP=1per i processi del compilatore delle unità pianificate da Cargo, con-Zallow-features=in modo che#![feature]venga rifiutato come sul canale stabile (con l’errore “not in the list of allowed features” di rustc invece di quello del canale stabile). Mai per gli script di build o per le sonde del compilatore che eseguono, così i crate non passano a percorsi di codice nightly. Un compilatore nightly accetta comunque i flag-Ze#![feature], quindi lì non viene aggiunto alcun-Zallow-features=. Nessuna di queste leve si applica quando l’utente impostaRUSTC_BOOTSTRAPda sé. -
Il driver del compilatore di QuickRust compila le unità pianificate da Cargo (fast mode,
fast.early-cutoff). Il driver è il rustc della toolchain stessa (librustc_driver, il suo LLVM, la sua release) eseguito tramite le callback di QuickRust, compilato una volta per toolchain contro il suo componenterustc-dev. Senza callback attive i suoi output sono byte per byte quelli di rustc (testtest0276_quickrusts_compiler_driver_builds_byte_for_byte_what_rustc_builds). In fast mode tre cose differiscono dalle build di upstream, nessuna nel comportamento del programma: l’hash del crate di una libreria (SVH) viene calcolato a partire da ciò che i suoi dipendenti possono osservare, quindi i metadati e le rlib delle librerie differiscono da quelli di rustc (l’hash è un identificatore; nulla lo confronta tra compilatori diversi); gli output vengono collegati prima che rustc salvi il suo stato incrementale, che completa dopo che Cargo è andato avanti; e i file oggetto dei binari vengono conservati (hard link accanto all’output) in modo che un binario il cui codice non è cambiato venga ricollegato invece che ricompilato. Le unità ripristinate e ricollegate vengono verificate confrontandole con la compilazione da zero dello stesso sorgente tramiteqrust-bench cutoff(modifiche casuali sui carichi di lavoro dei benchmark, byte per byte; registrate inbenchmarks/cutoff-gate.jsonl). I programmi che Cargo esegue al posto di rustc (clippy-driver come wrapper del workspace, il wrapper di un utente) girano così come sono; un crate su cui il driver fallisce viene compilato da rustc. -
Nessuna
target/nel progetto (decisione del 2026-10-12). Cargo upstream compila in<workspace>/targetse non gli viene detto altrimenti; QuickRust glielo dice per ogni comando: ogni workspace (come lo nominacargo locate-project --workspace) compila in~/.qrust/cache/builds/<name>-<id>/, passata a Cargo e a ogni strumento sotto di esso tramiteCARGO_TARGET_DIReCARGO_BUILD_BUILD_DIR, così anchecargo metadatala riporta. Una directory di target scelta dall’utente (--target-dir,--config build.target-dir,CARGO_TARGET_DIR/CARGO_BUILD_TARGET_DIR) viene usata così com’è;build.target-dirin un file di configurazione di Cargo viene sovrascritto. Gli script che codificano./target/…devono invece chiedere aqrust path. Test:test0239_builds_go_to_quickrusts_cache_and_never_into_the_project,test0241_a_target_directory_the_user_chose_is_used…,test0242_a_build_script_building_another_workspace….
Decisioni aperte della specifica, come risolte qui
| Decisione | |
|---|---|
| OQ-001 Rust/Cargo minimi | QuickRust dichiara rust-version = 1.80, compilato e testato esattamente con 1.80 in CI a partire dal lockfile (cargo install --locked); delega a qualunque Cargo sia selezionato e richiede solo il formato 1 di cargo metadata e RUSTC_WRAPPER |
| OQ-002 piattaforme | macOS e Linux bloccanti per la release; le suite passano su macOS e Linux x86_64 in CI; Windows ha un’esecuzione smoke in CI, le suite sono solo Unix |
| OQ-003 servizio centrale | nessuno; tutti i contratti sono file locali |
| OQ-004 provider della cache | quello con cui è configurato sccache |
| OQ-005 fail-open o fail-closed | cache.fail, predefinito open |
| OQ-006 fiducia negli interventi correttivi | solo la configurazione di QuickRust stessa è safe |
| OQ-007, OQ-008 | misurati e riportati; nessuna emulazione delle funzionalità di upstream |