Co to znamená
Výsledek živého scénáře popisuje jeden strom, na jednom stroji, v jedné minutě. CI jej nedokáže reprodukovat, takže s ním nic navazujícího nesmí zacházet jako s reprodukovatelnými důkazy:
majordomus usecase runbez argumentů spouští fixtury a jen fixtury a pro zbytek vypíšelive (run it with --live), takže to, co CI rozumí holým během, se nezmění pod repozitářem, který přidá živý scénář;--liveje přidá a pojmenování id jej spustí bez ohledu na jeho režim;- živé důkazy se zapisují do
.ai/local/evidence/live/<id>.json, které lokální polovina ignoruje, ne vedle commitnutých fixture důkazů pod.ai/local/evidence/use-cases/; usecase coveragepočítá živý scénář jako ten, který své příkazy pojmenovává, a nikdy jako ten, který je pokrývá, takže příkaz, který cvičí jen živý scénář, zůstávápartial;- závazek, který repozitář nesplnil, se hlásí jako
unmet, nefail.
Poslední rozlišení je smyslem oddělení: selhávající scénář fixture je závada nástroje a nesplněný závazek je nevykonaná práce. Hlásit obojí stejným slovem by jedno z toho učinilo nečitelným.
Princip
mj_uc_selected v lib/usecase.sh vrací false pro živý scénář, pokud nebyl jmenován nebo nebylo zadáno --live. mj_uc_cmd_run nastaví MJ_UC_LIVE_EVIDENCE na $MJ_AI_LOCAL_DIR/evidence/live, spouští živé scénáře po jednom po fixturách a živý exit 10 počítá do unmet, a ne do failed; souhrnný řádek i dokument JSON nesou oba počty zvlášť. mj_uc_coverage_rows zvyšuje počet spustitelných jen tehdy, když scénář není živý, takže mj_uc_status_of se z živých scénářů samotných nemůže nikdy dostat na covered.
Jak to vidět
majordomus usecase run # live scenarios are listed, not run
majordomus usecase run --live # exit 10 when an obligation is unmet
jq '.mode, .result' .ai/local/evidence/live/know-whether-this-work-is-finished.json
majordomus usecase coverage --json | jq '.rows[] | select(.status == "partial")'
bash test/run.sh 359_live_scenarios
test/cases/359_live_scenarios.sh dokazuje každou polovinu: že holý běh nezapisuje žádné živé důkazy, že --live je zapíše tam, kde je git ignoruje, a sledovaný strom nechá nedotčený, že nesplněný závazek se počítá jako unmet a ne jako failed, a že příkaz, který spouští živý scénář, zůstává v pokrytí partial.
Co nepokrývá
Drží důkazy živého běhu mimo sledovaný strom; netrvanlivěji je neukládá. .ai/local/evidence/live/ patří tomuto checkoutu, takže jiný worktree, jiný stroj i čerstvý klon začínají bez nich a nic je nereplikuje. Důkaz, který musí checkout přežít, je spuštění v účetní knize, které zapisuje evidence record.
Omezuje, kde se odpověď zapisuje, ne jak dlouho platí. Živá odpověď popisuje repozitář v okamžiku, kdy se na ni zeptali; nic zde ji neprošetřuje ani nezaznamená, že se strom od té doby pohnul. Zastaralost je otázka subsystému důkazů a proof-is-an-execution je místo, kde se na ni odpovídá.
A nedělá ze živého scénáře započítaný scénář. Živý běh zůstává z konstrukce partial v pokrytí, takže příkaz, jehož jediný scénář je živý, se hlásí jako ne plně pokrytý — to je zamýšlené čtení, ne mezera, kterou toto tvrzení zavírá.
Proč existuje
Případ užití, který klade své otázky repozitáři, v němž byl vyvolán, produkuje odpověď o něčí rozdělané práci a prvním místem, kam by taková odpověď přistála, byly vlastní publikované důkazy repozitáře — kde by se četla jako vlastnost projektu, a ne jednoho stroje v jedné minutě. Zápis pod .ai/local/, který vrstva už deklaruje jako nikdy nepublikovaný, drží živou odpověď dostupnou tomu, kdo se ptal, a neviditelnou pro všechny, kdo repozitář čtou.