mcptask runner – AI vývojár na vašom stroji. Dotiahne úlohy až do zlúčeného PR.
mcptask_runner premení vaše coding CLI — Claude Code, Codex CLI alebo OpenCode — na samostatného člena tímu. Funguje s Claude, Kimi, DeepSeek, lokálnou ollamou alebo akýmkoľvek modelom — bez vendor lock-inu. Vyberie úlohu, napíše kód aj testy a otvorí PR. V režimoch auto-squash ho po zelenom CI zlúči; v manuálnych režimoch nechá PR otvorené na vašu kontrolu. Zadáte večer dobre špecifikovanú prácu, ráno ju nájdete hotovú.
30 dní zadarmo. Bez kreditnej karty. Kedykoľvek zrušíte.
Plný autonómny harness nad vaším coding CLI
mcptask_runner je jedna statická binárka bez runtime závislostí — riadi coding CLI na vašom stroji a beží celý agentný cyklus: nájde úlohu → posúdi zložitosť → zvolí model → spustí coding CLI → stráži beh watchdogom → dodrží dennú kvótu → (voliteľne) po CI zlúči PR. Funguje s akýmkoľvek projektom, ktorý používa git, na GitHube, na Bitbucket Cloude, alebo na GitLabe — nič v ceste vykonávania nevyžaduje Ruby, bundler ani Gemfile, metadáta projektu sa berú z CLAUDE.md a `bin/ci` je konvencia (žiadny `bin/ci` → preskočí sa). Žiadny prompt, ktorý runner skladá, už nemenuje príkaz konkrétneho frameworku: projekt, ktorý sa pred browser testami potrebuje pripraviť, si to povie sám — vo svojom CLAUDE.md, alebo v príkaze, ktorý odovzdá `/test-runner`.
Nie je to len „tupý spúšťač" coding CLI. Pridáva orchestráciu, dohľad, zotavenie a riadenie kvality, ktoré holé CLI nemá.
Vyberte CLI, ktoré bude riadiť váš projekt
Harness je coding CLI, ktoré runner riadi. V binárke sú tri profily — Claude Code, Codex CLI a OpenCode — a vlastný profil žije v ~/.mcptask/harnesses/. Voľba sa robí raz pre každý stroj a projekt, urobí ju init a zapíše harness: do config/mcptask_runner.yml. Ten súbor je per-stroj a je v .gitignore, takže dvaja vývojári nad rovnakým repozitárom môžu riadiť rozdielne CLI.
mcptask_runner init --cli codexTri pribalené profily
Claude Code
mcptask_runner init --cli claude- Skills
- 12 v .claude/skills
- MCP konfigurácia
- .mcp.json
- Instrukcie
- CLAUDE.md
- Modely
- aliasy opus / sonnet / haiku
- Oprávnenia
- .claude/settings.local.json
Codex CLI
mcptask_runner init --cli codex- Skills
- 9 v .agents/skills
- MCP konfigurácia
- .codex/config.toml
- Instrukcie
- ukazovateľ v AGENTS.md
- Modely
- gpt-6-astra, gpt-5.6-terra, gpt-5.6-luna
- Preflight
- codex login status musí prejsť
OpenCode
mcptask_runner init --cli opencode- Skills
- 9 v .claude/skills
- MCP konfigurácia
- opencode.json
- Instrukcie
- CLAUDE.md
- Modely
- provider/model
- Oprávnenia
- permission mapu vloží runner
Žiadny default neexistuje
Projekt, ktorý CLI nikdy nepomenoval, runner odmietne menom — nepredpokladá ticho Claude Code. launcher.command zostáva override samotného argv a je krížovo kontrolovaný proti harness: — nemôže pretlačiť iné CLI, než aké projekt deklaroval.
Čo je na všetkých troch rovnaké
Profil drží binárku, argv, resume flag, literály zlyhania, mená nástrojov a skillov a to, čo zapisuje init. Všetko, čo robí runner runnerom, je nad profilom a s voľbou CLI sa nemení.
Limity, povedané naplno
Fork skills sú len na Claude Code
discover, memory-search a mcptask-read forkujú lacného subagenta, aby sa surový výstup nikdy nedostal do rodičovského kontextu. To vie iba Claude Code, takže profily Codex a OpenCode majú deväť skillov namiesto dvanástich. Deväť helper skriptov je na všetkých troch rovnakých.
Codex potrebuje funkčný login
codex login status musí prejsť, než beh začne. Preflight radšej odmietne, než aby spotreboval kvótu na CLI, ktoré spadne pri prvom volaní.
OpenCode nemá read-only flag
Nie je čo predať, takže runner namiesto toho vloží permission mapu. Read-only garancia je rovnaká; mechanizmus nie.
Overené, nie len tvrdené
Conformance a chaos suity bežia v CI proti všetkým trom dialektom a profily nie sú funkcia na papieri: reálny beh na Codexe dokončil úlohu 9. 9. 2026 a OpenCode má za sebou vlastné reálne behy.
Na vašom stroji, proti realite
Cloud agenti bežia v očistených sandboxoch. Runner beží vo vašom reálnom projekte.
Reálna databáza
Hovorí s databázou, ktorú váš projekt už používa — schému, seed dáta aj migračnú históriu, ktorá ju formovala. (PostgreSQL je jeden konkrétny príklad; runner riadi to, čo beží vo vašom projekte.)
Reálne system testy
Bežia vstupné body testov vášho projektu, end-to-end — Capybara/Selenium proti vašej reálnej aplikácii ako jeden konkrétny príklad, so screenshotmi a prehliadačovými kontrolami, ktoré dokazujú, že sa zmena naozaj dostala do produkcie.
Reálne commity a PR
Vetvy, commity a pull requesty žijú vo vašom repu, s vaším CI, pod vašou Git históriou — na GitHube, na Bitbucket Cloude, alebo na GitLabe, a na všetkých ich otvára `mcptask_runner pr`. Runner spúšťa to, čo spúšťa váš `bin/ci`.
Pull requesty na GitHube, na Bitbuckete alebo na GitLabe
Runner pracuje s repozitárom na GitHube, na Bitbucket Cloude alebo na GitLabe (gitlab.com aj self-managed) a pull request na všetkých otvára jeden príkaz: mcptask_runner pr. Žiadny prompt ani pribalený skill už nemenuje CLI konkrétneho hosta — binárka sa hosta spýta sama, takže rovnaké instrukcie fungujú bez ohľadu na to, kde váš repozitár žije.
PR neotvorí nič iné než mcptask_runner pr
Je to piaty verejný subcommand. Každý subcommand vypíše na stdout jeden JSON objekt, chyby idú na stderr s nenulovým exit kódom a --git-host prepíše hosta pre jedno zavolanie. Samotné git_host: je nepovinné — runner ho odvodí z git remote get-url origin a init --git-host bitbucket|gitlab je tu pre aliasy, mirrory a self-managed inštancie.
Šesť subcommandov
pr createOtvorí pull request pre aktuálnu vetvu.
pr listVypíše pull requesty, filtrované cez --task, --branch, --open alebo --state.
pr viewPrečíta jeden pull request ako JSON.
pr reviewsPrečíta review, ktoré na pull requeste zostali.
pr mergeZlúči ho — --squash a --delete-branch sú default, pretože práve to auto-squash znamená.
pr checksSpýta sa hosta, čo jeho checky hovoria o head commite.
Traja hostia, tri modely prihlásenia
GitHub
Autentizácia cez gh a jeho vlastný login. Šablóna pull requestu sa číta z .github/pull_request_template.md, čo je cesta, ktorú pozná len GitHub.
Bitbucket Cloud
REST API 2.0, s jedným z dvoch prihlásení a nikdy s oboma: BITBUCKET_ACCESS_TOKEN pre stroj (Bearer), alebo BITBUCKET_EMAIL a BITBUCKET_API_TOKEN pre človeka (Basic). App passwords sú odmietnuté — Atlassian ich 9. 6. 2026 ukončil. init zapíše ~/.mcptask_env.d/bitbucket_credentials s právami 0600 (kontrola práv sa na Windows preskakuje), nikdy neprepíše existujúcu hodnotu ničím a nikdy prihlasovací údaj nevypíše. Mimo GitHubu sa šablóna deklaruje ako pr_template: path:.
GitLab
Riadi ho CLI glab, ktoré si drží vlastné prihlásenie — glab auth login, a runner si žiadny GitLab credential neukladá. Funguje gitlab.com aj self-managed inštancie: self-managed projekt deklaruje git_host: gitlab (mcptask_runner init --git-host gitlab), pretože jeho origin URL nie je gitlab.com, a runner od vás URL inštancie nikdy nepýta — glab už vie, kam je prihlásený. To, čo tam pr create otvorí, je merge request.
Auto-squash sa pred zlúčením spýta hosta
Zlúčenie nie je nádej, že CI bolo zelené. Runner si najprv prečíta checky hosta pre head commit: FAILED ukončí beh ako ci_failed a PR nechá otvorené, IN_PROGRESS skúsi desaťkrát po dvoch minútach a NONE — repozitár, ktorý u hosta žiadne checky nemá — spadne na lokálnu gate. GitLab hlási jeden stav pipeline na merge request, takže výpis checkov je tam jeden riadok, nie zoznam.
GitHub Enterprise nie je GitHub a je odmietnutý menom
Host sa rozpoznáva podľa presného hostname, takže inštanciu GitHub Enterprise runner odmietne so správou, ktorá to hovorí, namiesto toho, aby ju považoval za github.com. PR otvorené proti nesprávnemu API hosta je horšie než beh, ktorý odmietne začať.
Kde končí runner a začína mcptask.online
Tu ide o runner pracujúci s repozitárom na Bitbucket Cloude — nie o Bitbucket integráciu na úrovni mcptask.online. Párovanie commitov a pull requestov späť na pieces beží na webhookoch a tie zostávajú GitHub a GitLab.
Slučka berie úlohy, cieľ ich dokončuje
mcptask_runner spája pracovnú slučku (berie úlohu za úlohou z fronty) s cieľom (dokončí každú úlohu až do zeleného PR, nielen k „nejakým úpravám"). Zvoľte režim podľa toho, ako dlho má bežať:
| Tvar slučky | Režim | Auto-squash vs manuál | Povinný prepínač |
|---|---|---|---|
| Spustí jedného vykonávateľa a skončí | once | manuál | — |
once_dry | manuál | — | |
once_auto_squash | auto-squash | — | |
review | manuál | — | |
| Iteruje, kým nenastane stop-status | today | manuál | — |
today_auto_squash | auto-squash | — | |
queue_manualaliasy: queue | manuál | — | |
queue_auto_squash | auto-squash | — | |
workflow | manuál | — | |
reviews | manuál | — | |
| Prejde podúlohy story | story_manualaliasy: story | manuál | --story-id |
story_auto_squash | auto-squash | --story-id | |
task_manualaliasy: task | manuál | --task-id | |
task_auto_squash | auto-squash | --task-id | |
| Robí to celý deň, každý deň | daily | manuál | — |
Niektoré režimy sa správajú inak, než napovedá tvar, v ktorom sú zaradené
- once_dry je jediný režim, ktorý úplne preskočí triage — len ukáže ďalšiu úlohu a skončí.
- workflow má dve fázy: najprv revízie (PR blokuje človeka), potom dnešné úlohy.
- daily sa nikdy sám nevráti — slučku ukončí len pád, signál alebo nepodarené odovzdanie. Cestou do nočnej pauzy sa navyše môže odovzdať novšej binárke, ktorú už má na disku (pozri samoaktualizácia nižšie); slučka, ktorá sa zajtra zobudí, je stále tá istá slučka, len beží na novšom kóde.
- queue_manual a queue_auto_squash nemajú časovú bránu; bežia, kým prichádzajú úlohy.
Čo robí autonómiu skutočne autonómiou
Nižšie je technický detail za tvrdením, že runner je „viac než spúšťač". Každá vlastnosť existuje preto, že by sa bez nej reálny beh rozsypal.
Keď narazí na cudzí bug, založí naň úlohu a pozastaví sa
Ak runner behom práce narazí na URGENTNÝ bug, ktorý nesúvisí s aktuálnou úlohou, commitne a pushne rozrobenú prácu na feature vetvu, prepne na main (čistý strom), založí novú urgentnú bug úlohu a vráti jej id a názov. Runner si bug pripne do súboru tmp/mcptask_runner/urgent_pin.txt v adresári projektu (pin prežije pád a nemôže kolidovať medzi projektmi), takže aj po reštarte ide najprv opraviť bug a až potom sa vracia k pôvodnej úlohe. Chaos z „narazil som na niečo cudzie" sa zmení na sledovateľnú, vlastnenú úlohu.
Zotavenie po zaplnení kontextu alebo prerušení
Keď beh skončí kvôli preplneniu kontextu, kvóte alebo zásahu urgent bugu, úloha zostane in_progress a nedokončená práca zostáva na feature vetve. Ďalší beh ju naviaže: prečíta git log + stav vetvy, fetchne a zlúči origin/main, preskočí hotové kroky a povýši model na najsilnejšiu nakonfigurovanú úroveň, aby úlohu dokončil silnejší model. Dlhá úloha prežije naprieč behmi. Ako sa overflow deteguje a aký tlak na kontext runner meria, popisuje sekcia o overflow.
Watchdog a detekcia zaseknutia
Watchdog na nečinnosť killne beh po 20 minútach bez postupu, soft-warn na zamrznutý proces po 3 minútach a má nástrojovo špecifický strop na zaseknuté príkazy; absolútny backstop ticha je 50 minút, s 45-minútovým tool-floor, ktorý sa adaptívne zvyšuje podľa zaznamenaných dĺžok až po 90-minútový strop. Detektor zaseknutia číta stream CLI — dekódovaný podľa harnessu, takže rovnaký detektor funguje na Claude Code, Codex CLI aj OpenCode — riadok po riadku a spozná „točenie sa dokola" — opakované chyby Edit, opakované chyby Bash alebo rovnaký podpis nástroja opakovane naprieč slučkami; dlhé pomocné príkazy ako CI wait a test wait sú explicitne vyňaté. Pri zaseknutí proces zabije; úloha zostane in_progress a nabudúce sa resumuje na najsilnejšej úrovni. Brány denného rozpočtu nájdete v sekcii o kvóte a log behu v sekcii o observability.
Triage a voľba modelu (tri role)
Pred prácou prebehne Triage: posúdi zložitosť úlohy a odporučí rolu modelu. Tri role: najsilnejšia úroveň (ťažké kódovanie), stredná úroveň (triage, review) a najrýchlejšia úroveň (len čítanie). Runner sa dodáva s predvoleným nastavením na Anthropic hostiteľovi — CLI generické aliasy prekladá za behu, takže konkrétne ID modelov môžu byť vymenené bez prepisovania retry reťazcov. Codex CLI a OpenCode mapujú rovnaké tri role na svoje vlastné ID — gpt-6-astra / gpt-5.6-terra / gpt-5.6-luna, respektíve provider/model — takže triage sa s voľbou CLI nemení.
Kvalita: testy, CI, auto-merge
Plný workflow beží end-to-end: vetva → kód → unit testy → screenshoty → system testy → push → `mcptask_runner pr create` → lokálne CI → `mcptask_runner pr merge`. Úloha nie je hotová, kým neprejde CI, a zlúčenie sa najprv spýta na checky hosta. V režimoch auto-squash runner po zelenom CI PR sám squash-merge; v manuálnych režimoch zostane PR otvorené na �udskú revíziu. Runner vie aj spracovať review feedback na existujúcom PR. Úplnú tabuľku režimov nájdete v sekcii loop a goal.
Jedno číslo, tri miesta, kde sa overuje
Runner nikdy neverí vlastnému odhadu. Každé rozhodnutie o kvóte číta živé číslo z mcptask.online cez REST a vynucuje ho pred, medzi a počas úloh.
Odkiaľ sa číslo berie
Denný rozpočet sa načítava živo z mcptask.online cez REST (GET /api/{account}/users/current/time_status). Runner nikdy neodhaduje rozpočet cez agenta a nikdy nečíta cache — účet je jediný zdroj pravdy.
Tri brány, v tomto poradí
| Kedy | Čo sa kontroluje |
|---|---|
PRED BEHOM (po triazi) | Znovu sa opýta živého REST endpointu po triagi. Triage sama trvá minúty; čerstvý dotaz zachytí čokoľvek, čo používateľ minul, zatiaľ čo runner úlohu triedil. |
MEDZI ÚLOHAMI (decider) | Zastaví slučku pri akomkoľvek zlyhaní úlohy, mid-task kvóta-kille alebo vyčerpanom dennom rozpočte. Žiadny tretí pokus o rovnaký deň. |
POČAS ÚLOHY (každých 360 s) | Pýta sa každý DefaultQuotaPollInterval. Pri prekročení zabije child a ukončí slučku s quota_exceeded_mid_task — bez retry. Kill streak (DefaultQuotaFailureKillStreak = 3) absorbuje asi 18-minútový REST výpadok, kým to runner vzdá. |
Zámerný fail-closed / fail-open strih
Dve otázky sa neodpovedajú rovnako schválne. „Bola kvóta prekročená?" zlyháva ako CLOSED; „Môžem dnes pracovať?" zlyháva ako OPEN. Jedna chyba zablokuje beh; druhá nechá beh začať.
Keď sa pýtame „už sme dnes minuli rozpočet?" a REST nevie odpovedať, odpoveď je NIE. Lepšie je preskočiť úlohu, než prečerpať.
Keď sa pýtame „zostáva mi dnes rozpočet?" a REST nevie odpovedať, odpoveď je ÁNO. Lepšie je spustiť beh, než premárniť pracovný deň kvôli prechodnému výpadku.
Výpadok vs vyčerpaný rozpočet
REST výpadok, ktorý zabil zdravú prácu, je iný bug než vyčerpaný denný rozpočet. Runner ich zámerne rozlišuje (ErrQuotaPollOutage) — jedno nie je nikoho vina, druhé je 20-minútový incident hodný založenia ticketu.
| Scenár | Čo runner urobí |
|---|---|
| Denný rozpočet vyčerpaný | Decider medzi úlohami zastaví slučku. Žiadny bug. |
| Výpadok REST (pod kill streak) | Retry na ďalšom intervale. Slučka pokračuje. |
| Výpadok REST (nad kill streak, ~18 min) | Ukončí slučku fail-closed so statusom error a vlastnou termináciou quota_poll_outage — nie s quota_exceeded_mid_task. Tá terminácia nie je na zozname mäkkých ukončení, takže bug úloha sa založí vždy, aby sa ten dvadsaťminútový incident sledoval. |
--ignore-quota preskočí všetky tri brány. Runner sa nikdy nepýta REST a nikdy neodmietne úlohu; operátor preberá zodpovednosť za spend.
Čo prežije, keď sa kontext pretečie
SESSION sa nedá obnoviť. PRÁCA áno — pretože práca je vetva a commity na disku. Dva nezávislé mechanizmy nesú zvyšok vpred a tretí verdikt hovorí harnessu, aby prestal zakladať šum.
Prežije
Čo runner odovzdá ďalšiemu pokusu
Git vetva a jej commity
Samotná práca je vetva s commitmi na disku. Aj keď sa stratí každý bajt kontextu session, diff je stále reviewovateľný, PR stále otvárateľné a zmeny stále obnoviteľné.
Posledné 3 akcie (restart vnútri procesu)
Keď je rozpočet čerstvý a proces sa reštartuje na mieste, preamble reštartu nesie posledné tri akcie (RecentActionsCap = 3) a namerané závery o cene kontextu, takže nový pokus pokračuje s hybnosťou, nie naslepo.
Rulebook ContextBudget
Každý reštart zdedí zdieľané pravidlá handoff.ContextBudget() — čo sa počíta do limitu, čo nie, a ako runner rozhodne, že je ďalší pokus bezpečné spustiť.
Stratené
Čo žiadny mechanizmus nezachráni
Celý kontext konverzácie
--continue by znovu načítal rovnaký prerastený kontext, takže SESSION je neobnoviteľná. V preamble reštartu idú len posledné tri akcie; všetko predtým je preč.
Dva nezávislé mechanizmy
| Mechanizmus | Rozsah | Čo sa nesie ďalej |
|---|---|---|
| In-process fresh restart | Vnútri toho istého runner procesu (retry.go, handleContextOverflow) | Rozpočet = 1 reštart na proces (maxOverflowRestarts = 1, zámerne — preskúmané v tasku #11474, ponechané na 1 v commite f6bce1e). Nový pokus číta posledné 3 akcie, cenové nálezy a rulebook rozpočtu. |
| Cross-process TaskHandoff | internal/handoff/ — jedna poznámka na úlohu (engine.go, recordTaskHandoff) | Zapíše log/handoffs/task_<id>.json na OBOCH vetvách — reštart aj terminálna (terminálna koniec tohto procesu, nie úlohy). Ďalší NOVÝ proces ju číta ako preamble promptu pre prvý pokus — nikdy na --continue retry. overflow_count sa akumuluje NAPRIEČ runner procesmi. Poznámky sa vyradia, hneď ako beh skončí inak, a prerezávajú sa po 30 dňoch. |
Tretí verdikt: overflow_pr_open
Keď je rozpočet reštartu vyčerpaný A existuje otvorené PR k úlohe, status je overflow_pr_open, NIE error. PR je deliverable; otvorené PR so zelenými checkmi znamená, že práca prešla. Zakladať tu error stojí celý denný loop na úlohe, ktorá je už hotová (úloha #11466 stratila 79a6f6aa + PR #1659 + zvyšok dňa presne nad týmto nesprávnym zaradením, ktoré jej navyše automaticky založilo bug #11467, aký si nezaslúžila).
| overflow_pr_open (nie error) | error (čo to bývalo) |
|---|---|
| rozpočet reštartu vyčerpaný + PR otvorené → overflow_pr_open | rozpočet reštartu vyčerpaný + bez PR → error |
Prečo to nie je kúzlo
Štyri concerns bežia súčasne: child vo vlastnej process group, čítačka streamu, watchdog a event stream. Stavový automat pod nimi má desať pomenovaných stavov a explicitný allow-list - zamietnutý prechod je varovanie, nikdy dôvod na zastavenie.
Child vo vlastnej process group
Runner spúšťa coding CLI v novej process group (syscall.SysProcAttr{Setpgid: true}, internal/executor/process_unix.go, configureProcessGroup), takže SIGTERM a SIGKILL z runnera zasiahnu celý strom a nikdy neprebublajú k rodičovi. Čitateľské joiny sú obmedzené na 30 s (engine.go, stderrJoinTimeout + defaultStdoutJoinTimeout), aby zaseknutý child nemohol zablokovať shutdown.
Čítačka streamu
Číta výstup CLI (stream-json) riadok po riadku, ako vzniká, v tom dialekte, ktorý deklaruje profil harnessu. Parsuje eventy, hľadá TASKRUNNER_RESULT completion contract a kŕmi StallDetector. Nečaká na koniec procesu — reaguje priebežne na každý riadok, ktorý pristane.
Watchdog
Nezávislé strážiace vlákno s 30-sekundovým heartbeatom. Kill po 20 minútach nečinnosti, soft-warn na frozen po 3 minútach, strohy zaseknutých nástrojov (quick / long), absolútny backstop a live REST quota poll každých 6 minút. Jediný externý dozorca nad child procesom.
Event stream
Perzistentný WebSocket na mcptask.online cez ActionCable (RunnerSessionChannel). Snapshoty throttlované na ~0,5 s; zmena stavu FSM pretlačí okamžite. Pri výpadku asynchrónny reconnect s throttlom 30 s a grace okno 0,5 s na finálnom „closed" snímku, aby živá karta nezamrzla na starom stave. Premenná MCPTASK_RUNNER_DISABLE nie je len vypínač streamu — je to globálny kill switch celej prevádzky na mcptask.online: stream, polly kvót aj hlásenia chýb (internal/mcptask/endpoint.go, DisableEnv).
Stavový automat pod tým
schema verzia 3Desať pomenovaných stavov. Každý prechod je na allow-liste; čokoľvek iné sa zapíše ako warning a práca beží ďalej. Frozen, pending, stalled a closed sú vždy povolené ciele prechodu z ľubovoľného stavu; vynucuje ich watchdog (frozen, pending), detektor zaseknutia (stalled) a uzavretie session v slučke (closed).
Stavy
Allow-list (ukážka)
Pár prechodov, ktoré slučka používa každú minútu — a vynútené prechody, ktoré odpaľujú watchdogy samé od seba.
| z | do | kým | poznámka |
|---|---|---|---|
| starting | triage | slučka | Po spawne, než sa vyberie prvý úloha |
| triage | processing | slučka | Úloha zvolená, kontext odovzdaný CLI |
| processing | waiting | slučka | Backoff medzi pokusmi o tú istú úlohu |
| processing | stalled | detektor zaseknutia | Opakované chyby nástroja Edit, opakované rovnaké chyby Bashu alebo ten istý podpis nástroja v kĺzavom okne |
| ľubovoľný | frozen | watchdog | Nečinnosť cez FROZEN_WARN_THRESHOLD, žiadne aktívne nástroje |
| ľubovoľný | pending | watchdog | Jeden nástroj cez svoj warn strop |
| ľubovoľný | closed | slučka | end_session — finálny snímok |
Čo je viditeľné počas behu
Tri nezávislé plochy — run log na disku, prevádzkový log procesu a živá karta cez ActionCable — plus explicitné opt-out premenné. Sú best-effort zo svojej podstaty: samotné pozorovanie — snapshoty a logy — beh nikdy nepreruší.
Run log — jeden JSON súbor na spustenie child procesu
Najužitočnejšia plocha, keď je otázka „prečo runner visí už deväťdesiat minút". Súbor sa otvorí IHNED pri spawne, takže aj okamžitý pád zanechá niečo čitateľné.
log/runs/run_*.json (jeden súbor na spustenie child procesu)Otvorený
Pri spawne — skôr, než sa prečíta prvý riadok stream-json
Heartbeat
Obnovuje stream_events, inactive_s a stream_quiet_s každý tick, takže zaseknutý beh zanechá svoj in-flight stav na disku
Finalizácia
Orazítkuje, prečo pokus skončil
Zmení „prečo runner visí už 90 minút" z grepu nad 268 000 riadkami stream logu na prečítanie jedného súboru.
Prevádzkový log procesu — širší než run log
Nie je to ľudsky formátovaná kópia JSON run logu. Je to chronologický textový log celého procesu: každý podsystém doň zapisuje svoje volania Debug/Info/Warn/Error, takže obsahuje aj to, čo sa v žiadnom run logu neobjaví — a naopak nenesie polia run logu ako session_id či stream_events.
log/mcptask_runner_YYYYMMDD_HHMMSS.log[timestamp] SEVERITY - message (internal/observe/logger.go)Živá karta — jeden ActionCable WebSocket
Jeden perzistentný WebSocket nesie celé snapshoty, nikdy jednotlivé udalosti. Stratený frame stojí čerstvosť, nie správnosť, a reconnect nepotrebuje replay.
| Kanál | Payload | Throttle | Timeouty |
|---|---|---|---|
| RunnerSessionChannel (internal/eventstream/eventstream.go, channelIdentifier) | Iba celé snapshoty — žiadny replay udalostí | 500 ms snapshot, 30 s reconnect throttle, 500 ms final-frame grace | 10 s subscribe + dial |
Ukončená karta: Zostane 60 s po konci loopu (snapshotCloseTTL)
Bez tokenu: Runner spustený bez tokenu to povie raz, nahlas, pri štarte — nikdy ticho neprepustí prvú udalosť
Hranica — a opt-outy
Každá z týchto plôch je best-effort zo svojej podstaty. Odchádzajúce pozorovanie beh nikdy nepreruší; nil *Log je fungujúci no-op. Dve premenné prostredia úložiská čisto vypnú.
| Run log | Task handoff |
|---|---|
MCPTASK_RUN_LOG=0 — Vypne JSON run log | MCPTASK_TASK_HANDOFF=0 — Vypne cross-process poznámku task-handoff |
Jediná výnimka — preradenie: Kanál RunnerSessionChannel je obojsmerný: popri odchádzajúcich snapshotoch prijíma aj riadiace udalosti piece_assigned a set_aside_cleared (internal/eventstream/eventstream.go). Preradenie úlohy je cez abandonReassigned (internal/runner/loop.go) zapojené do AbandonReassigned v engine — zabije bežiaceho potomka a jeho smrť preklasifikuje na preradenie. Je to jediná, zámerná riadiaca rola tohto kanála.
Čo to NEZNAMENÁ: Žiadna z pozorovacích plôch — run log, prevádzkový log, odchádzajúce snapshoty — nemôže beh zastaviť, reštartovať ani klasifikovať. Vlastnosť best-effort je presná hranica no-fallbacks premisy projektu: jediné miesto, kde sa degraduje, a hovorí to nahlas.
Flotila runnerov: Všetky inštancie runnera v účte sú navyše na stránke Flotila runnerov (používateľské menu): jeden riadok na stroj a projekt s CLI, modelom, stavom, poslednou nahlásenou úlohou, dnešnými hodinami oproti dennému limitu a verziou runnera, živo aktualizované. Manažéri účtu a vlastníci firmy vidia všetky runnery, členovia projektu runnery svojich projektov.
Keď nastane tvrdý pád, bug piece sa založí sám
Žiadny manuálny príkaz spúšťať nemusíte. Keď nastane tvrdý pád, runner zaň automaticky založí bug piece. Skutočný pád sa stane úlohou, ktorú niekto môže zdvihnúť — nie tichou medzerou, ktorú nikto nehľadá.
Kedy sa bug piece založí
Za tvrdý pád sa počíta len status error, status crash alebo status anomaly. To sú tri hodnoty v hardStatuses (internal/bugreport/runner_error.go). Každý iný výsledok — success, stalled_for_genius, urgent_bug_pending alebo graceful quota bail — znamená, že runner pracuje ako má, a nezakladá nič.
Založí sa
status error, status crash, status anomalyČo je anomaly
vlastná poistka runneru, ktorá v behu neplatila, a beh napriek tomu pokračoval — nič nespadlo, denná práca šla ďalej a zvonku nie je čo vidieť. Error sa ohlási tým, že ukončí beh, a crash tým, že zabije proces; anomaly sa neohlási nikomu, a práve preto dostane piece.
NEzakladá sa
success, stalled_for_genius, urgent_bug_pending, graceful quota bail — to sú verdikty „pracuje ako má"
Mäkká výnimka
quota kill v strede úlohy, vyčerpané rate-limit okno aj odobratie piece počas behu prichádzajú so statusom error a nezakladajú sa (softTerminations = {"quota", "rate_limited", "reassigned"}, internal/bugreport/runner_error.go)
Čo bug piece nesie so sebou
K založenému piece sa priložia tri artefakty (internal/bugreport/runner_error.go, attachArtifacts), aby ten, kto ho zdvihne, mohol čítať pád bez nového spustenia.
Run log zlyhaného pokusu
JSON, s ktorým on-disk run log skončil
Chvost stream logu
najnovší stream log, orezaný na 512 KB (internal/bugreport/runner_error.go, streamTailBytes)
Redigované configy
.mcp.json, .claude/settings.json, .claude/settings.local.json — tokeny vystrihnuté (mcptask/piece.go, ConfigFiles + Redact)
Jedna udalosť je jeden piece
Identické pády sa ofingerprintujú, throttleujú a nahlásia len raz. Bez toho by tesná slučka založila ten istý bug 200× skôr, než si toho niekto všimne.
| Fingerprint | Normalizácia | Throttle okno | Stamp sa nárokuje pred založením |
|---|---|---|---|
| sha256 nad termination + normalizovaná správa + task id + projekt, orezaný na 16 hex znakov (internal/bugreport/runner_error.go, fingerprint) | odstraňuje cesty, hex stringy a desatinné čísla — čo vyzerá ako rovnaký pád s iným timestampom, počíta sa ako rovnaký pád | šesť hodín (internal/bugreport/runner_error.go, throttleWindow + claim) — druhý rovnaký fingerprint v okne sa zahodí | fingerprint stamp sa nárokuje PRED založením piece a UVOĽNÍ sa, ak sa piece nikdy nezaloží (commit 3ae0d6e). Pád, ktorý najpravdepodobnejšie rozbije CreatePiece, je práve ten, ktorý by retry inak ticho potlačil |
Panicy — re-raised, so stack trace
Panic je tvrdý pád so stopou pre forenznú analýzu. Piece dostane trace; loop si panic ponechá (loop.go, reportPanic, commit 1681e79). Inak by panic recovery trace zožrala a ten, kto piece zdvihne, by o ňu prišiel.
Fail-safe všade
Každá reportovacia cesta prehĺta vlastné chyby, vrátane vlastného panicu (internal/bugreport/runner_error.go, MaybeReport defer/recover). Chyba reportéra nikdy nesmie ukončiť run. Celá premisa stojí na tom, že najhorší reportér je ten, ktorý stojí najmenej — prehltnutý riadok v logu, nie zmeškaný pád.
Slepé miesto, otvorene povedané
Reportér sa autentizuje rovnakým tokenom ako všetko ostatné, takže NEMÔŽE založiť bug, ktorý hovorí, že token chýba. Chýbajúci alebo nenastavený token reportéra ticho preskočí — OutcomeSkippedDisabled nezapíše žiadny chybový riadok, takže to nesie len vlastný exit code a log runnera. Token, ktorý server odmietne, je naopak hlasitá cesta: OutcomeRefused zaloguje chybu, ktorá token pomenuje (internal/bugreport/runner_error.go). Alternatívou bolo medzeru skryť; voľba tu je ju pomenovať.
Model-agnostický cez konfiguráciu
Tri úrovne si namapujete na ľubovoľného poskytovateľa aj na ľubovoľné z troch coding CLI. Runner nasmerujete na akýkoľvek endpoint kompatibilný s Anthropic API — doloženým príkladom je lokálna Ollama — zmenou launchera a modelovej sekcie.
Sekcia models: je voliteľná. Bez nej každý harness používa svoje vlastné všeobecné aliasy, ktoré si dané CLI preloží za behu: opus / sonnet / haiku na Claude Code, gpt-6-astra / gpt-5.6-terra / gpt-5.6-luna na Codex CLI a ID v tvare provider/model na OpenCode. Pripnite konkrétne ID len keď chcete deterministické retry, alebo keď prevádzkujete runner cez ne-Anthropic backend — a akonáhle to urobíte, JE TO VŠETKO ALEBO NIČ: všetky tri úrovne genius / smart / primitive musia byť nastavené, inak forkovaní subagenti spadnú s chybou "model may not exist".
# models: je voliteľná. Bez nej každý harness použije všeobecné aliasy,
# ktoré si jeho vlastné CLI preloží za behu.
# Claude Code
models:
genius: opus
smart: sonnet
primitive: haiku
# Codex CLI
models:
genius: gpt-6-astra
smart: gpt-5.6-terra
primitive: gpt-5.6-luna
# OpenCode — každé ID je provider/model
models:
genius: /
smart: /
primitive: /
models:
genius: minimax-m3:cloud
smart: kimi-k2.7-code:cloud
primitive: deepseek-v4-flash:cloud
launcher:
# Lokálna ollama
command: [env, "ANTHROPIC_BASE_URL=http://localhost:11434", "ANTHROPIC_AUTH_TOKEN=ollama", "claude"]
ID nižšie sú jeden príklad, nie odporúčanie — starnú najrýchlejšie zo všetkého na tejto stránke. Dôležitý je tvar.
flagy launcher.command (launcher.go, Flag* constants): null flag sa z argv VYNECHÁ, value flag bez tokenu sa odovzdá POZIČNE.
Loader nikdy nezlyhá
Chýbajúci, prázdny alebo poškodený config/mcptask_runner.yml sa berie ako "žiadna konfigurácia" (config.go, LoadFile) a použijú sa vstavané defaulty. Neexistuje exit kód "súbor nenájdený" — runner nabehne v oboch prípadoch.
Žiadny pin
Žiadny dodávaný skill nedeklaruje `model:` — ForkModelEnv preto dosiahne na každý forkovaný subagent, vrátane bežiacich na ne-Anthropic launcheri.
Konfigurácia žije v config/mcptask_runner.yml, resolved relatívne k pracovnému adresáru launchera (config.go, FileName; README.md) — rovnaký súbor, aký číta Ruby gem, s rovnakou sémantikou. Môžete tam nastaviť aj ďalšie voľby, napríklad cieľový Epic pre automaticky nájdené bugy alebo stratégiu čakania medzi behmi.
GEM — presná cesta k súboru, presná sémantika
update --self a zámerne chýbajúca automatika
Runner je statický binárny súbor inštalovaný stiahnutím, nie gem, ktorý sa posunie pri každom bundle. Binárkou hýbu dva príkazy: update --self stiahne novší release a vymení ho, update --check oznámi, či nejaký existuje, a nič viac neurobí. Tretie rozhodnutie — či sa runner vôbec smie presunúť sám pred naplánovaným behom — je to, ktoré zámerne neautomatizujeme.
Ako update --self vymení binárku
Nová binárka pristane v rovnakom adresári ako tá existujúca a tanec premenovania ju posunie na miesto (selfupdate.go). Tento postup je dôležitejší, než vyzerá: premenovanie je atomické len v rámci JEDNÉHO súborového systému a /tmp ním zvyčajne nie je, takže sa nový súbor pripraví vedľa, neprepíše sa z iného miesta. Zlyhalo alebo nesedí kontrolný súčet, k výmene vôbec nedôjde — binárka na disku zostane nedotknutá a príkaz skončí nenulovo.
1. Stiahnutie z verejného mirroru vydaní
binárka pre dané GOOS/GOARCH sa stiahne z jchsoft/mcptask-releases (selfupdate.go, DefaultRepo). Zdrojový repozitár je súkromný, takže verejný mirror je jediné miesto, odkiaľ môže stiahnutie prísť bez tokenu
2. Overenie proti checksums.txt vydania
sha256 assetu sa porovná s hodnotou, ktorú zverejnilo vydanie (selfupdate.go, verify). Nezhoda zruší beh skôr, než sa do inštalačného adresára vôbec niečo zapíše
3. Pripraviť vedľa, bežiacu binárku premenovať nabok
nová binárka sa zapíše vedľa bežiacej, potom sa bežiaca premenuje na susedný názov. Tento krok je zároveň to, čo celé funguje na Windows — prepísanie súboru, ktorý je namapovaný na spúšťanie, na Windows zlyhá a premenovanie nabok to obchádza
4. Pripravenú binárku atomicky premenovať na miesto
záverečné os.Rename na rovnakom súborovom systéme presunie pripravenú binárku do inštalačnej cesty. Atomické v rámci toho súborového systému. Príkaz skončí 0 až po výmene
update --check — len dotaz na tag, žiadne sťahovanie
update --check zistí tag najnovšieho vydania, porovná ho s bežiacou verziou, oznámi výsledok a skončí. Nesťahuje žiadny asset a neoveruje žiadny kontrolný súčet — ani jeden zo štyroch krokov vyššie sa nevykoná. Binárka na disku zostane nedotknutá. Je to správny príkaz, ak si chcete do nočného jobu pridať upozornenie bez inštalácie.
Zámerne chýbajúca funkcia
Runner sa pred naplánovaným behom NEaktualizuje sám. Ak existuje novší release, vypíše jednoriadkový hint a nič iné neurobí, pretože jedno zlé vydanie nesmie o 08:05 zasiahnuť každý host bez obsluhy. Upgrade zostáva rozhodnutím operátora — toto uistenie stojí za to vysloviť nahlas každému, kto nechá binárku bežať bez dozoru.
Čo hint robí
selfupdate.Hint vypíše jeden riadok, keď existuje novší release (hint.go, hintTimeout + hintInterval). Limit 2 s, cache 24 h, ignoruje každú chybu — výpadok siete alebo rate-limit sa k behu nikdy nedostane
Ako hint vypnúť
nastavte MCPTASK_NO_UPDATE_CHECK=1 v prostredí hosta. To je to, čo chce host vo vzduchoprázdne alebo s meraným pripojením, a kontrola sa umlčí skôr, než sa vôbec číta cache
Jedna z dvoch ciest, ktoré re-exec povoľujú — bundle adoption
BUNDLE ADOPTION (commit 00ced53, task #11478): iba pri run, ak Gemfile.lock projektu sám menuje novšiu verziu wrapper-gemu, než je bežiaca binárka, run sa na tej binárke re-execne. NIC NESTAHUJE — operátor to rozhodol už tým, že merg-ol lockfile. Host o 08:05 číta lock, ktorý si stiahol z mainu, a beží na tom, čo lock hovorí.
MCPTASK_ADOPTED
nastavený v prostredí re-execovaného potomka, zastaví adoption, aby sa z neho stal exec loop (adopt.go, EnvMarker). Binárka, ktorá hlási staršiu verziu, než hovorí lock, by inak adoptovala, exec-la, zase seba zhodnotila ako zastaralú a zacyklila sa
MCPTASK_NO_ADOPT
nastavte na 1 pre pripnutie nainštalovanej binárky bez ohľadu na to, čo nesú projekty. Host, ktorý chce jednu verziu runneru naprieč všetkými projektmi, to nastaví raz a má pokoj
Druhá cesta — daily sa cestou na lôžko odovzdá sám sebe
Cestou do nočnej pauzy daily run skontroluje, či je binárka na disku stále tá, s ktorou vybehol. Ak nie, uvoľní instance lock a spustí execom nainštalovanú binárku — restartOnCurrentBinary (restart.go). Ani táto výmena NIC NESŤAHUJE — len preberá to, čo na disk už skôr dal update --self alebo operátor. Na poradí krokov záleží: denná práca je hotová, takže nebeží žiadny potomok a žiadny pracovný strom nie je rozpísaný, a proces, ktorý sa zajtra zobudí, je ten, čo dnes večer vybehol.
Prečo to existuje
všetko, čo si všimne novú verziu, sa odohrá len raz, pri štarte. Daily proces sa spustí raz a nikdy neskončí, takže by host bez obsluhy inak držal binárku, s ktorou náhodou vybehol, nech prebehne akokoľvek veľa vydaní — presne ten host, na ktorý sa nikto nepozerá. Ukončiť namiesto toho daily sa zvažovalo a bolo zamietnuté (task #11728): runner, ktorý zmizne, je runner, ktorý chýbajúci alebo nenačítaný naplánovaný job už nikdy nevráti
ErrLockLost — tretí koniec
restart.go deklaruje ErrLockLost — výmenu, ktorá sa vzdala instance locku a potom si ho nedokázala vziať späť. Tento koniec slučku SKUTOČNE ukončí, zámerne a nahlas — pokračovať bez locku by druhému naplánovanému štartu dovolilo pustiť druhý runner do rovnakého checkoutu
Aktualizácie skillov bez straty vašich úprav
Nainštalovaný projekt sa rozchádza s runnerom, ako runner priberá skilly. Jeden príkaz ho zosynchronizuje: mcptask_runner update. Porovná každý skill a helper proti inštalačnému manifestu, pri každom oznámi, čo s ním urobil, a odmietne prepísať čokoľvek, čo ste si upravili sami. Je to aj spôsob, ako nainštalovaný projekt prestane volať `gh`: pribalené skilly prešli na `mcptask_runner pr` a práve `update` túto migráciu donesie do projektu nainštalovaného predtým.
Príkaz
mcptask_runner updatePäť výsledkov, jeden na súbor
Updater si drží obsahový hash každého súboru, ktorý nainštaloval. Každý skill a helper proti tomuto manifestu zaradí a výsledok vypíše — päť výsledkov, nie tiché prepísanie.
addedSúbor na disku nie je. Updater ho zapíše. Takto pristávajú nové schopnosti runnera bez toho, aby ste si o ne museli povedať menom.
up-to-dateSúbor na disku má rovnaký hash ako záznam v manifeste. Nič sa nezapisuje. Host nainštalovaný cez gem sa tejto binárke javí ako aktuálny — overené priamo proti súboru, nie odvodené z inštalačného kanála.
updatedSúbor zodpovedá staršiemu záznamu v manifeste, takže je to dodávaná verzia a vy ste sa jej nikdy nedotkli. Je bezpečné ho nahradiť — a nahradí sa.
conflict-skippedHash súboru nezodpovedá ani aktuálnej, ani žiadnej známej dodávanej verzii — upravili ste ho. Updater ho nechá presne tak, ako je, a povie to. Toto je predvolené správanie a práve preto je bezpečné príkaz spustiť na projekte, ktorý ste si prispôsobili.
force-updatedTen istý konflikt, vyriešený opačne, pretože ste o to požiadali. Dosiahnuteľné len s --force alebo FORCE=1.
Prepísanie konfliktu s cestou späť
mcptask_runner update --force--force (alebo FORCE=1) lokálne upravené súbory namiesto preskočenia prepíše — a ku každému prepísanému nechá .bak. Vaše úpravy sa nemažú; odsunú sa nabok, kde si ich môžete porovnať.
Čoho sa obyčajné update zámerne nedotkne
update siaha LEN na skilly a helpery. Všetko ostatné, čo inštalátor kedysi zapísal, zostáva presne tam, kde je. Táto zdržanlivosť je prednosť, nie opomenutie: zosynchronizovanie skillov nesmie potichu znova aktivovať plánovanú úlohu ani prepísať konfiguračný súbor, ktorý ste si ručne doladili.
Plánovaná úloha
LaunchAgent, používateľský systemd timer ani úloha v Task Scheduleri sa negenerujú znova a znova sa nezapínajú. Keď ju chcete naozaj vygenerovať znova, použite init --schedule.
.mcp.json
Vaša konfigurácia MCP klienta sa neotvára, neprepisuje ani nedegraduje. Transport aj názov tokenovej premennej, ktoré ste deklarovali, aktualizáciu prežijú nedotknuté.
Konfiguračné sekcie
config/mcptask_runner.yml si ponechá hodnoty, ktoré ste nastavili — pracovné okno, príkaz launchera, hodinu konca pracovného dňa. update na ne nemá názor.
Aktualizácia binárky je samostatné rozhodnutie
update zosynchronizuje projekt. Nehýbe binárkou, ktorá tú synchronizáciu vykonala. Robia to dva iné príkazy a ani jeden z nich sa nespustí sám: mcptask_runner update --self vymení novší release a mcptask_runner update --check len oznámi, či nejaký existuje, a nič nezmení.
Runner sa pred behom nikdy neaktualizuje sám
Na začiatku behu runner môže vypísať jeden riadok o tom, že existuje novší release. To je celá tá funkcia — strop 2 s, cache na 24 h, každá chyba ignorovaná a úplne sa umlčí cez MCPTASK_NO_UPDATE_CHECK=1. Rozhodnutie o povýšení zostáva na operátorovi, pretože runner, ktorý by sa pred plánovaným behom posunul sám, by bez opýtania menil to, čo tú prácu robí. To je podstatné, ak necháte binárku bežať bez dozoru.
Chybné stiahnutie sa k výmene nikdy nedostane
update --self sťahuje z verejného mirroru jchsoft/mcptask-releases a overuje súbor proti checksums.txt daného release. Neúspešné alebo nesúhlasiace stiahnutie skončí skôr, než akýkoľvek zápis siahne do inštalačného adresára: binárka na disku zostáva nedotknutá a príkaz skončí nenulovým návratovým kódom.
Celá sekvencia výmeny — a prečo práve premenovávací tanec zaisťuje funkčnosť na Windows — patrí na stránku Runner.
Prečítať mechaniku self-updatePäť verejných subcommandov, dva persistent flagy, tri exit kódy
Runner je jeden binárny súbor na cobra root: run, init, update, version, pr. Šiesty subcommand internal je skrytý pred --help, pretože ho volajú vygenerované launcher skripty, nie operátor: internal launcher-log-name je to, čím si windowsový launcher pomenuje vlastný log. Skrytý neznamená dočasný — launcher na ňom za behu stojí. Dva persistent flagy --verbose a --ignore-quota sa čítajú case-insensitive z príslušnej env premennej (verbose=true, ignore_quota=true). Flag-y jednotlivých subcommandov sú vypísané pri každom príkaze nižšie. Exit kód je 0 pri úspechu, 3 pre nenaimplementovaný mód, 1 pre čokoľvek iné a 128+N pri signáli. Trojka je navrhnutá poistka, nie koniec, na ktorý dnes dosiahnete: každý mód je naimplementovaný, takže ErrModeNotImplemented nikto nevráti.
Subcommandy
runSpustí work-loop mód. Mód je povinný; aliasy queue, story a task sa rozvíjajú na queue_manual, story_manual a task_manual.
initNainštaluje na tomto hoste. Zapíše skilly, helpery, oprávnenia, token, .mcp.json záznam, sekcie configu a scheduled job.
updateObnoví bundled skilly a helpery. --self prehodí binárku na mieste; --check oznámi verziu bez inštalácie.
versionVypíše banner (verzia a resolved konfigurácia) a skončí.
prOtvorí, vypíše, prečíta, zreviduje, zlúči alebo skontroluje pull request na GitHube, na Bitbucket Cloude alebo na GitLabe. Jeden JSON objekt na stdout za zavolanie.
Persistent flagy
Tieto dva flagy žijú na root commande a platia pre každý subcommand. Každý má ekvivalent v env premennej, ktorá sa číta case-insensitive na doslova reťazec "true".
--verboseverbose=true
Vypíše každý stream riadok namiesto filtrovaného pohľadu.
--ignore-quotaignore_quota=true
Preskočí všetky kontroly kvóty.
run — spustí work-loop mód
Vyberie mód a spustí ho. Mód je povinný; aliasy queue, story a task sa rozvíjajú na queue_manual, story_manual a task_manual. --story-id vyžadujú story_manual a story_auto_squash; --task-id vyžadujú task_manual a task_auto_squash. Po štarte runner vypíše banner s verziou, zdrojom modelov, zdrojom launcheru, cieľom bug reportov, stratégiou čakania, pracovným oknom a dnešným skip listom, za ním súhrn rozpustenej konfigurácie, potom kontrolu bundle adoption, update hint, token preflight, single-instance lock a signal handler — v tomto poradí — a až potom spustí samotnú slučku.
--story-id N-
Vyžadujú story_manual a story_auto_squash; bez čísla je odmietnutý.
--task-id N-
Vyžadujú task_manual a task_auto_squash; bez čísla je odmietnutý.
init — nainštaluje na tomto hoste
Zapíše bundled skilly — dvanásť pre Claude Code, deväť pre Codex CLI a OpenCode — deklaráciu testov v .claude/test-commands.json, ktorú bundled test skilly čítajú, deväť helper skriptov (deviaty, runner-log, je jediný, ktorý operátor píše sám v shelli), baseline oprávnenia, výmenu tokenu, mcptask-online záznam v .mcp.json, blok bug_destination v config/mcptask_runner.yml, defaulty waiting_strategy a scheduled job. --at a --until pinujú čas behu a end-of-workday hodinu; --schedule vygeneruje iba scheduled job. init sa interaktívne pýta na dve veci — do ktorého Epicu padajú automaticky nájdené chyby a aký mód scheduled job spúšťa — a --epic-id, --epic-name a --mode na ne odpovedia bez terminálu, pretože binárka, ktorú inštaluje provisioning skript, musí byť inštalovateľná aj bez neho. --cli pomenuje coding CLI, ktoré tento projekt riadi, a je povinné pri prvom init, bez akéhokoľvek defaultu; --git-host pripne hosta PR, keď to URL originu nedokáže povedať. --helper-bin-dir a --home-dir presmerujú to, čo init zapisuje, --force prepíše, čo už na hoste je. Scheduled job sa vygeneruje, ale nikdy neaktivuje — zapnutie jobu, ktorý každé ráno míňa kvótu, je rozhodnutie operátora.
--cli NÁZOV-
Ktoré coding CLI tento projekt riadi — claude, codex, alebo opencode. Povinné pri prvom init; žiadny default neexistuje a projekt, ktorý CLI nikdy nepomenoval, runner odmietne menom. Zapíše sa do config/mcptask_runner.yml ako harness:.
--git-host HOST-
github, bitbucket, alebo gitlab, zapísaný ako git_host:. Nepovinné — runner ho odvodí z git remote get-url origin; toto je pre aliasy, mirrory a self-managed inštancie GitLabu, ktorých origin URL nie je gitlab.com. Runner od vás URL GitLabu nikdy nepýta: inštanciu si drží glab, do ktorého ste prihlásení.
--at HH:MMMCPTASK_RUN_AT
Čas, kedy scheduled job beží. Default 08:00. Hodnota, ktorá nie je časom dňa, je odmietnutá, nikdy zaokrúhlená.
--until HH:MMMCPTASK_WORKDAY_UNTIL
End-of-workday hodina zapísaná do configu pod work_window.end_of_workday_hour. Nedefinované znamená žiadny koniec dňa. Neskôr editovateľné bez regenerácie schedule.
--schedule-
Vygeneruje znovu iba scheduled job — skilly, permissions, token a sekcie configu zostanú presne tak, ako sú.
--mode MÓD-
Mód work-loopu, ktorý scheduled job spúšťa, napr. today_auto_squash. Zadaný odpovie na otázku na mód, ktorú by sa init inak pýtal.
--epic-id N-
Epic na mcptask.online, do ktorého padajú automaticky nájdené chyby; 0 ich nechá v roote projektu. Zadaný odpovie na otázku na Epic.
--epic-name NÁZOV-
Zobrazovaný názov zapísaný vedľa --epic-id, aby config hovoril, ktorý Epic to číslo je.
--helper-bin-dir CESTA-
Kam sa inštalujú helper skripty pre CI a testy. Default ~/.claude/bin.
--home-dir CESTA-
Presmeruje adresár s tokenom, shellový rc súbor aj scheduled job. Default je vlastný home používateľa.
--forceFORCE=1
Prepíše to, čo už na hoste je — skilly, sekcie configu aj scheduled job. Širšie než --force pri update, ktoré prepisuje len upravené skilly a necháva .bak.
update — obnoví skilly a helpery
Holý update sa dotkne len bundled skillov (dvanásť pre Claude Code, deväť pre Codex CLI a OpenCode) a deviatich helper skriptov; zámerne nechá scheduled job, .mcp.json a sekcie configu na pokoji. --self stiahne najnovší release a prehodí binárku na mieste (rovnaký filesystem, rename dance); --check oznámi, či existuje novšia binárka, a nič nezmení. --force prepíše lokálne upravené skilly a nechá pri nich .bak. Bundle adoption je jedna z dvoch ciest, kedy sa run re-execne — iba pri run, a len keď Gemfile.lock projektu ukazuje na novší wrapper-gem než bežiaca binárka. Tou druhou je daily, ktoré sa cestou do nočnej pauzy odovzdá novšej binárke, ktorú už má na disku.
--self-
Stiahne najnovší release, overí proti checksums.txt a prehodí binárku na mieste. Neúspešný alebo nezhodujúci sa download sa nikdy nedostane k prehodeniu.
--check-
Zistí tag najnovšieho vydania, porovná verzie, oznámi výsledok a skončí. Žiadne sťahovanie, žiadne overenie kontrolného súčtu. Binárka na disku zostane nedotknutá.
--forceFORCE=1
Prepíše lokálne upravené skilly a nechá pri nich .bak vedľa prepísaného súboru.
version — vypíše banner a resolved konfiguráciu
Vypíše banner (verzia + resolved modely + zdroj launcheru + bug destination + waiting strategy + pracovné okno + dnešný skip list) a za ním blok so zhrnutím výslednej konfigurácie — ten istý, ktorý vypíše init na konci inštalácie — a skončí. Verzia pochádza z ldflags pečiatky, fallback na verziu modulu a nakoniec 0.0.0-dev, keď bola binárka zostavená bez pečiatky.
pr — otvorí, prečíta a zlúči pull request
Jediná vec, ktorá otvorí pull request. Šesť subcommandov — create, list, view, reviews, merge a checks — a každý vypíše na stdout jeden JSON objekt; chyby idú na stderr s nenulovým exit kódom, takže ich volajúci rozlíši bez čítania vety. merge má vo výchozom stave --squash --delete-branch. Host je GitHub, Bitbucket Cloud, alebo GitLab (gitlab.com aj self-managed, riadený cez CLI glab), odvodený z git remote get-url origin, ak git_host: nehovorí inak, a --git-host ho prepíše pre jedno zavolanie. Host sa rozpoznáva podľa presného hostname, takže GitHub Enterprise runner odmietne menom, nie že by ho ticho považoval za GitHub.
--git-host HOST-
Prepíše hosta PR pre toto zavolanie — github, bitbucket, alebo gitlab. Bez neho host pochádza z git_host:, alebo z URL originu.
--task N-
Len pri list: pull requesty otvorené pre jednu úlohu na mcptask.online.
--branch NÁZOV-
Len pri list: pull requesty, ktorých head je táto vetva.
--open / --state STAV-
Len pri list: obmedzí výber podľa stavu. --open je skratka pre otvorené.
Exit kódy
0Úspech — vrátane runu, ktorého úloha skončila s {"status":"error"}.
1Čokoľvek iné.
3Nenaimplementovaný mód (ErrModeNotImplemented) — navrhnutá poistka; každý mód je naimplementovaný, takže na ňu dnes nič nedosiahne.
128+NZabitý signálom N.
Konformančné scenáre a CI matrix
Dôkaz za každým tvrdením o spoľahlivosti na tejto stránke. Obnova, watchdog, detekcia zaseknutia aj kvóta sú všade uvádzané bez jediného dôkazu; táto sekcia sú tie účtenky.
Štrnásť konformančných scenárov
Každý scenár je zaznamenaný rozhovor s claude CLI plus správanie, ktoré musí runner pri prehrávaní predviesť. Scenáre sú implementačne neutrálne: čisté YAML plus kontrakt v conformance/README.md, ani riadka Go alebo Ruby. Spúšťa sa cez `go run ./cmd/conformance {list,run --impl go}`.
Každý režim pádu, o ktorom runner tvrdí, že ho prežije, má vlastný zaznamenaný scenár v conformance/scenarios/. Obe implementácie spúšťajú rovnaké súbory; Ruby gem je vyslúžilá, zmrazená referenčná implementácia, proti ktorej sa dá suite porovnať, a bránou je zelená Go suite.
| Scenáre | |
|---|---|
01 — success | šťastná cesta: čistý run skončí zeleným verdiktom, bez retry, a vetva pripravená na push |
02 — missing_marker_retry | run log nikdy nezafixuje marker; runner retryuje, kým mu nedôjde budget, a potom skončí verdiktom namiesto zaseknutia |
03 — context_overflow_fresh_restart | pretečenie kontextu, keď engine ešte beží — prácu nesie ďalej in-process restart a run zostane nažive |
04 — context_overflow_terminal | pretečenie kontextu potom, čo engine skončil — carry-forward mechanizmus odovzdá súbor novému procesu a len tak sa run dostane von |
05 — api_overload_529 | upstream vráti 529 — runner cúvne, run zostane na správnej úlohe a marker na prechodnom stave nepostúpi |
06 — tool_not_enabled_fresh_restart | nástroj, ktorý run potrebuje, chýba na prvom pokuse; `--continue` ho spustí ako fresh restart a run sa zotaví |
07 — tool_not_enabled_terminal | ten istý nástroj chýba aj po fresh restarte — run skončí verdiktom, nie zaseknutím |
08 — stall_edit_failures | engine edituje súbor, ktorý harness sleduje; edity sa rozchádzajú a watchdog to chytí skôr, než marker postúpi na základe lži |
09 — inactivity_kill_then_recover | child process prestane komunikovať — watchdog ho zabije, debug dump zostane na disku a ďalší pokus zdvihne tú istú úlohu |
10 — recoverable_retries_exhausted | každý recoverable retry je vyčerpaný a run stále nie je hotový — to je verdikt, a verdikt je jediný bezpečný výsledok |
11 — quota_mid_task | budget sa vyčerpá uprostred editu — pristane soft kill, run uloží čistý stav a polnočný strop ďalšieho okna odštartuje čerstvý pokus |
12 — stream_closed | upstream zatvorí stream v polovici turnu — runner zatvorenie detekuje, run vyhodnotí ako neúplný a ďalší pokus odvodí stav z disku, nie z preč zmiznutého streamu |
13 — hung_tool_kill | nástroj, ktorý engine zavolal, prestal odpovedať — watchdog zabije child signálom kill-on-hang a run zostane znovu-spuštiteľný |
14 — triage_unverified_pick | next-task picker vráti úlohu, ktorá nebola overená — runner ju odmietne naštartovať, nezaloží nič a počká na overeného kandidáta, namiesto aby slepo niečo vybral |
Binárka nenesie žiadny vlastný test hook
Runner je nasmerovaný na mock CLI cez bežný override `launcher.command` (README.md) — rovnaká per-host konfigurácia, ktorú vývojár použije na riadenie skutočného CLI. Suity bežia vo všetkých troch dialektoch harnessu (Claude Code, Codex CLI, OpenCode) a konformančný projekt na Bitbucket Cloude a jeden na gitlab.com pokrývajú zvyšných dvoch hostov PR, takže zelený run nie je zelený run na jednom dialekte proti jednému hostovi. Technický čitateľ v tom spoznáva signál kvality — v binárke nie je žiadna test-only code path, o ktorú by sa konformančná suite opierala, takže zelený run tu je rovnaký kód, aký si používateľ nainštaluje.
CI matrix
Každý commit prejde 3-OS x 2-Go-verzia matrixom (ubuntu / macos / windows x 1.25.x / stable), go vet, race-detector testami na Unixe + stable, bin/smoke na BUILT binárke, gofmt, golangci-lint, goreleaser config check plus šesť-cielový cross-compile a celú konformančnú suite (.github/workflows/ci.yml). Matrix existuje, pretože runner sa inštaluje na vývojárske stroje — každá desktopová platforma musí prejsť buildom aj testami.
Úprimná polovica
Zelený LOKÁLNY run vypíše, čo NEPokryl — "Tento stroj len: <goos>/<goarch>" — pretože jeden OS, jedna architektúra a jedna verzia Go nie je to, čo beží v CI (bin/ci). Zelená lokálne je nutná, nie dostatočná. Porovnanie proti Ruby je referenčná kontrola, nie brána: keď vyslúžilý gem nie je checkoutnutý, preskočí sa, nevyfailuje — stroj, ktorý sa k referencii nedostane, by mal vedieť skontrolovať aspoň svoju vlastnú prácu.
Hranica, pomenovaná
Konformančný harness spúšťa jeden runner proces na scenár, takže nedokáže vyjadriť cross-process polovicu prežitia pretečenia; to pokrývajú testy, ktoré idú dva enginy za sebou a zdieľajú len súbor (README.md). Porovnanie proti Ruby sa preskočí, nevyfailuje, keď vyslúžilý gem nie je checkoutnutý, a merge tak či tak nedrží.
Technické FAQ
Krátke odpovede na otázky, ktoré táto stránka otvára, ale neodpovedá priamo v texte. Každá odpoveď odkazuje na vlastnícku sekciu a duplicitne ju neopakuje.
Potrebuje runner Ruby, bundler alebo Gemfile?
Nie. Metadáta projektu číta z CLAUDE.md a konfiguráciu z config/mcptask_runner.yml — ani jeden z nich neprechádza cez Ruby. Viď sekcia 1. Žiadny prompt nemenuje ani príkaz konkrétneho frameworku: projekt, ktorý pred browser testami potrebuje build krok, si ho deklaruje vo vlastnom CLAUDE.md.
Funguje na ne-Rails projekte?
Áno — ľubovoľný projekt pod gitom, na GitHube, na Bitbucket Cloude, alebo na GitLabe (gitlab.com aj self-managed), s jedným z troch podporovaných coding CLI na hoste a s CLAUDE.md, ktorá deklaruje account_code a project_relative_id. Žiadne predvolené CLI neexistuje: vyberá ho init --cli claude|codex|opencode, launcher.command prepisuje len argv a je krížovo kontrolovaný proti harness:. Viď sekcia 2.
Môžu dva runnery zdieľať jeden checkout?
Nie. Druhý runner odmietne naštartovať; lock.go (AcquireInstanceLock) vynucuje jeden runner na checkout. Viď sekcia 1.
Čo sa stane, keď denná kvóta dôjde uprostred úlohy?
Aktuálny pokus skončí ako soft termination (status error, nikdy sa nevygeneruje bug piece) a slučka počká na ďalšiu bránu. Viď sekcia 6.
Čo po páde zostane a kto sa to dozvie?
Hard failure (status error, status crash alebo status anomaly — vlastná poistka runneru, ktorá v behu neplatila, a beh napriek tomu pokračoval) založí vlastný bug piece s pripojeným run logom, otlačkovaný a throttlovaný po dobu šiestich hodín. Reportér nemôže nahlásiť bug, ktorý hovorí, že chýba jeho vlastný token — ten sa prejaví exit kódom a logom. Viď sekcia 9 a 10.
Aktualizuje sa sám bez dozoru?
Nie, zámerne. `update` sa v predvolenom stave dotýka len skills a helpers; `update --self` aktualizuje binárku v termináli používateľa, nie v background slučke. Viď sekcia 12.
Na ktorých OS beží a čo nepokryje zelený lokálny test run?
macOS (launchd), Linux (systemd user timer) a Windows (Task Scheduler) majú každý vlastnú naplánovanú úlohu. Zelený lokálny test run pokryje unit a system testy na hosťovej verzii Go; nepokryje troj-OS × dvoch-Go verzií maticu ani štrnásť conformance scenárov, ktoré bránia release. Viď sekcia 14.
Ráno zapnite stroj
mcptask_runner nenahrádza váš tím — násobí ho. Jeden statický binárny súbor, jeden inštalačný riadok, a váš backlog sa hýbe sám.
30 dní zadarmo. Bez kreditnej karty. Kedykoľvek zrušíte.