Přeskočit na obsah

Tato stránka byla automaticky přeložena z angličtiny, jediného jazyka, ve kterém se tento web píše. Číst originál.

HTTP API: gates

Dokončení jako stav, o kterém rozhoduje repozitář, a ne tvrzení, které vyslovuje pracovník: validační kontroly, které tento repozitář deklaruje ve svém modelu CI, které z nich vybere vlastní sada změn úlohy, co každá naposledy ohlásila, zda tento verdikt stále popisuje strom, nad nímž vznikl, a tedy zda lze úlohu označit za dokončenou. Kontrola, která nikdy nic neohlásila, je `queued`, ne `pass`, běh, jehož soubory se od té doby změnily, je `stale` a odmítá přesně jako selhání, a kontrola, kterou změna nemůže ovlivnit, je `exempt`, ne neznámá.

Vykresleno z docs/generated/openapi.json, který spustitelný soubor generuje ze svého registru schopností a CI jej odmítne, je-li zastaralý. Surový dokument je na /openapi.json; běžící server servíruje stejný dokument na vlastní /openapi.json a Swagger UI na /swagger.

kontroly

Dokončení jako stav, o kterém rozhoduje repozitář, a ne tvrzení, které vyslovuje pracovník: validační kontroly, které tento repozitář deklaruje ve svém modelu CI, které z nich vybere vlastní sada změn úlohy, co každá naposledy ohlásila, zda tento verdikt stále popisuje strom, nad nímž vznikl, a tedy zda lze úlohu označit za dokončenou. Kontrola, která nikdy nic neohlásila, je `queued`, ne `pass`, běh, jehož soubory se od té doby změnily, je `stale` a odmítá přesně jako selhání, a kontrola, kterou změna nemůže ovlivnit, je `exempt`, ne neznámá.

GET /api/v1/gates gates.model

Model CI

Každá validační kontrola, kterou tento repozitář deklaruje — job, který ji spouští, příkaz, který spouští, co dokazuje, zda ji vybírá každý plán a zda lze její runner vůbec získat na požádání — s třídami cest, které rozhodují, která změna vybírá kterou kontrolu, a pathspecy, nad kterými se berou důkazy každé kontroly, odvozenými z těchto tříd.

  • query
  • behaviorally_verified
  • vyžaduje se měření výkonu
  • proces cache (max_entries=4, ttl_seconds=5)
  • nástroj MCP majordomus_gates
  • Zdroj MCP {"name": "gates", "uri": "majordomus://gates"}

Žádné parametry.

Vyzkoušejte

Port je ten, který server zalogoval; 8741 je ten, o který žádá jako první. Hodnoty jsou první příklad operace.

curl -s "http://127.0.0.1:8741/api/v1/gates"

Testováno v apps/majordomus-cli/tests/http_serve.rs, který přehrává routu s těmito hodnotami proti serveru na skutečném socketu.

Odpovědi

statustělovýznam
200 GateModelReport Model CI: výsledek.
400 ErrorBody invalid_input: Vstup neodpovídá schématu: parametr špatného typu, neznámý parametr nebo hodnota, kterou schopnost odmítne.
404 ErrorBody not_found: Vstup pojmenovává něco, co repozitář nemá.
500 ErrorBody internal: Schopnost selhala z vlastního důvodu; zpráva ho pojmenovává.
výchozí ErrorBody Jakékoli jiné selhání, které transport hlásí: 405 method_not_allowed pro jinou metodu na této cestě, 400 invalid_input pro tělo, které není objektem JSON.
GET /api/v1/gates/completion gates.completion

Zda lze tuto úlohu označit za hotovou

Vlastní sada změn aktivní úlohy — od commitu, ve kterém začala, po pracovní strom včetně necommitnutých souborů — projitá modelem CI: které kontroly vybírá a proč, co každá z nich naposledy hlásila a nad jakými soubory, které verdikty zastaraly, protože se strom pod nimi pohnul, které požadované kontroly nikdy nic nenahlásily a jaké povinnosti změna implikuje, ať je úloha deklarovala, nebo ne. `finishable` je false jen tehdy, když je požadovaná kontrola známě neúspěšná, zastaralá nebo blokovaná jinou takovou; absence verdiktu se hlásí jako neověřeno, nikoli tiše přijímá.

  • query
  • behaviorally_verified
  • vyžaduje se měření výkonu
  • cache vypnuta
  • Nástroj MCP majordomus_completion
  • Zdroj MCP {"name": "completion", "uri": "majordomus://gates/completion"}

Parametry dotazu

názevtyppovinnépopispříklady
změněno array of string ne Změněné cesty, relativní k repozitáři. Chybějící znamená vlastní sadu změn úlohy: vše mezi commitem, na kterém úloha začala, a pracovním stromem. a-document: ["docs/CLI.md"]everything-on-demand: [".ai/repo/ci/gates.yaml"]one-source-file: ["apps/majordomus-cli/src/lib.rs"]
základ string ne Commit k porovnání, když se nechce vlastní startovní commit úlohy.
on_demand boolean ne Plánovat také kontroly, které model označuje jako na požádání. Ve výchozím stavu vypnuto, protože plán, který vybere kontrolu s nedostupným runnerem, je plán, jehož verdikt nikdy nedorazí. everything-on-demand: true

Vyzkoušejte

Port je ten, který server zalogoval; 8741 je ten, o který žádá jako první. Hodnoty jsou první příklad operace.

curl -s "http://127.0.0.1:8741/api/v1/gates/completion?changed=%5B%22docs%2FCLI.md%22%5D&on_demand=true"

Testováno v apps/majordomus-cli/tests/http_serve.rs, který přehrává routu s těmito hodnotami proti serveru na skutečném socketu.

Odpovědi

statustělovýznam
200 Dokončení Zda lze úlohu označit za dokončenou: výsledek.
400 ErrorBody invalid_input: Vstup neodpovídá schématu: parametr špatného typu, neznámý parametr nebo hodnota, kterou schopnost odmítne.
404 ErrorBody not_found: Vstup pojmenovává něco, co repozitář nemá.
500 ErrorBody internal: Schopnost selhala z vlastního důvodu; zpráva ho pojmenovává.
výchozí ErrorBody Jakékoli jiné selhání, které transport hlásí: 405 method_not_allowed pro jinou metodu na této cestě, 400 invalid_input pro tělo, které není objektem JSON.

Schémata

Komponenty, které používají jen operace tohoto tagu. Každý řádek je pole daného typu, jeho doc komentář je popis; typ vlastněný jinou stránkou na ni odkazuje.

Dokončení

object
use majordomus_cli::gates::Completion;

// the document every surface reads, as `gates.completion` answers with it. The property
// that matters is the one asserted here: a gate that never reported leaves the task
// finishable and *unverified*, which is a different thing from a task that passed.
let c: Completion = serde_json::from_value(serde_json::json!({
    "present": true,
    "model": ".ai/repo/ci/gates.yaml",
    "plan": { "mode": "affected", "reason": "1 path in 1 class", "changed": ["docs/CLI.md"],
              "classes": [], "unclassified": [], "selected": {}, "excluded": {} },
    "finishable": true,
    "unverified": ["reference-check"],
    "tallies": { "queued": 1 },
    "gates": [],
    "obligations": [],
    "questions": []
}))
.unwrap();
assert!(c.finishable, "absence of a verdict does not refuse");
assert_eq!(c.unverified, ["reference-check"], "and it is never silently accepted");
assert!(c.blocking.is_empty());

Zda smí být aktivní úloha označena za hotovou, a vše, na čem odpověď stojí.

finishable je pole, podle kterého volající jedná, a jediná věc, kterou žádný povrch nesmí přepočítávat: čtou ho check a finish shellového nástroje, servíruje ho HTTP API, vykresluje ho Cockpit a všechny čtou tento jeden execution.

vlastnosttyppovinnépopis
přítomno boolean ano Pravda, pokud byl v tomto checkoutu nalezen záznam úlohy.
úloha ActiveTask | null → ActiveTask ne Úloha tak, jak ji deklaruje její záznam.
model string ano Model CI, vůči kterému se posuzovalo.
plan GatePlan → GatePlan ano Dotčené nebo úplné a proč.
lze dokončit boolean ano False, když je o nutné kontrole známo, že selhává, je zastaralá nebo ji blokuje taková, která selhává. Absence verdiktu to neznamená false — znamená to, že unverified je neprázdné.
blokující array of string ne Povinné kontroly, jejichž stav odmítá dokončení.
neověřeno array of string ne Povinné kontroly, které nikdy nehlásily nebo je zde nelze posoudit. Úloha dokončená přes ně je dokončena neověřeně a záznam to říká.
součty mapa celých čísel (uint) ano Kolik kontrol stojí v každém stavu, podle slova.
kontroly pole Gate → Gate ano Každá kontrola modelu, co odmítá první.
závazky pole ImpliedObligation → ImpliedObligation ano Které povinnosti sada změn implikuje a zda je úloha slíbila. Posouzení deklarované povinnosti patří obligations.closure, ne tomuto modulu.
otázky pole DoneQuestion → DoneQuestion ano Invariant hotovo: otázky, na které musí úloha odpovědět, než ji kdokoli smí označit za dokončenou, každá se zdrojem, který odpověděl, a důkazy, které přečetl. Skládá se z uzávěru povinností, kontrol, sady změn, konvergence repozitáře a závěrečných čtení; otázka, ke které se zde nic nedostane, je unknown a pojmenovává příkaz, který by odpověděl.
zjištění array of string ne Co se nepodařilo zjistit, každé jako jeden řádek. Nikdy prázdné, když se něco přeskočilo: mezera se hlásí, nenechává se dovodit.

Používá gates.completion

DoneQuestion

object
use majordomus_cli::gates::{DoneQuestion, GateStatus};

let q = DoneQuestion {
    id: "pushed".into(),
    question: "Has the commit reached the remote?".into(),
    status: GateStatus::Queued,
    evidence: "the obligation is owed".into(),
    source: "obligation push (obligations.closure)".into(),
    remediation: "git push".into(),
};
// every question names what answered it and what would settle it: a question with
// neither is a checklist line, which is the artifact this type exists instead of
assert!(!q.source.is_empty() && !q.remediation.is_empty());
assert!(q.status.unverified());

Jedna otázka invariantu hotovo a co na ni odpovědělo.

vlastnosttyppovinnépopis
id string ano Identita otázky, stabilní napříč reporty.
otázka string ano Otázka, jak by se jí zeptal člověk.
status GateStatus → GateStatus ano Odpověď ve stejném slovníku, který používá každá kontrola.
evidence string ano Co bylo skutečně přečteno — nikdy ne přeformulování stavu.
zdroj string ano Co odpovědělo: token povinnosti, id kontroly nebo schopnost, která by odpověděla.
náprava string ano Co by to vyřešilo, jako příkaz.

Používá Completion

Kontrola

object
use majordomus_cli::gates::{Gate, GateStatus};

let gate = Gate {
    id: "rust-check".into(),
    title: "the crate builds, is formatted and passes its tests".into(),
    scope: "apps/majordomus-cli".into(),
    required: true,
    status: GateStatus::Queued,
    reason: "the plan selects it and no run has ever reported".into(),
    remediation: "majordomus evidence --gate rust-check --exit 0".into(),
    source: "the plan".into(),
    evidence: None,
    inputs: vec!["apps/majordomus-cli/**".into()],
    inputs_hash: "3f0a".into(),
    evaluated_at: "2026-01-01T00:00:00Z".into(),
};
// silence does not refuse and is not a pass either: it is a debt, reported as one
assert!(!gate.status.refuses());
assert!(gate.status.unverified());
assert!(gate.evidence.is_none());

Jedna kontrola dokončení: co je zač, zda se uplatní, co řekla a co dělat.

vlastnosttyppovinnépopis
id string ano Identita kontroly v modelu.
název string ano Jeden řádek, který to pojmenovává, z vlastního shrnutí modelu.
scope string ano Nad čím je kontrolou: job CI, který ji spouští.
povinné boolean ano Pravda, když ji plán vybere a její verdikt tedy rozhoduje o dokončení. Nepravda pro kontrolu, kterou plán vynechal, a pro kontrolu, jejíž runner je dostupný jen na vyžádání.
status GateStatus → GateStatus ano Co je o něm známo.
důvod string ano Proč je v tomto stavu, slovy, podle kterých pracovník může jednat.
náprava string ano Co by to vyřešilo, jako příkaz.
zdroj string ano Kde je kontrola deklarována: model a příkaz, který spouští.
evidence GateRun | null → GateRun ne Běh, který naposledy hlásil, když nějaký je.
vstupy array of string ne Pathspec, přes které se berou jeho důkazy, odvozené z modelu.
inputs_hash string ne Hash těchto souborů, jak stojí nyní, pokud jej bylo možné pořídit.
evaluated_at string ano Kdy bylo toto posouzení učiněno, RFC 3339 UTC. Posouzení se vztahuje k okamžiku.

Používá Completion

GateClass

object
use majordomus_cli::gates::GateClass;

// one path class as the CI model declares it: which paths select which gates
let class: GateClass = serde_json::from_value(serde_json::json!({
    "id": "docs",
    "paths": ["docs/**"],
    "gates": ["reference-check"]
}))
.unwrap();
assert_eq!(class.id, "docs");
assert_eq!(class.paths, ["docs/**"]);

Jedna třída cest: cesty, které pokrývá, a kontroly, které změna v nich vybere.

vlastnosttyppovinnépopis
id string ano Identita třídy.
cesty array of string ne Pathspecs, které pokrývá, v podmnožině, kterou definuje záhlaví modelu.
kromě array of string ne Jednotlivé cesty, které jeho vzory pokrývají a třída ne: datový soubor pod eskalujícím adresářem, čtený jen pojmenovanými kontrolami. Každá je cesta, nikdy vzor, takže soubor, který se pod adresářem objeví zítra, do něj stále spadá.
kontroly GateClassSelects | null → GateClassSelects ne full nebo kontroly, které jmenuje.

Používá GateModelReport

GateClassMatch

object
use majordomus_cli::gates::GateClassMatch;

let hit = GateClassMatch { id: "docs".into(), paths: vec!["docs/CLI.md".into()] };
// the class, and the files of the change that put it in the plan — never the class alone,
// because a plan a reader cannot check is a plan a reader has to believe
assert_eq!(hit.paths.len(), 1);

Jedna třída, do které změna spadla, a cesty, které ji tam zařadily.

vlastnosttyppovinnépopis
id string ano Identita třídy.
cesty array of string ano Změněné cesty, které tato třída pokrývá.

Používá GatePlan

GateClassSelects

string | pole stringů
Co třída vybírá: slovo full, nebo kontroly, které jmenuje.

Používá GateClass

GateModelEntry

object
use majordomus_cli::capability::builtin::gates::GateModelEntry;
use majordomus_cli::gates::GateDecl;

let decl: GateDecl = serde_json::from_value(serde_json::json!({
    "id": "site-check",
    "job": "site",
    "runs": "scripts/site-check",
    "summary": "the site is whole"
}))
.unwrap();
let entry = GateModelEntry { declared: decl, inputs: vec!["site/**".into()] };
// the declaration as the file carries it, plus the paths its evidence is taken over —
// derived from the classes that select it, never written down a second time
assert_eq!(entry.declared.id, "site-check");
assert_eq!(entry.inputs, ["site/**"]);

Jedna kontrola modelu s tím, co o ní model implikuje.

vlastnosttyppovinnépopis
id string ano Identita kontroly, jedinečná v modelu.
úloha string ano Úloha CI, která jej spouští.
runs string ano Příkaz, který spouští.
summary string ne Jeden řádek říkající, co dokazuje.
vždy boolean ne Pravda, když ji vybere každý plán, ať se změnilo cokoli.
na vyžádání boolean ne Pravda, jen když ji vybere plán, který o ni žádá: její runner nelze získat na požádání, takže plánovat ji při každém pushi je plánovat verdikt, který nikdy nedorazí.
při dokončení boolean ne Pravda, když kontrola měří nasazení, ne strom, takže ji žádná změna žádného souboru nemůže vybrat a třídy cest se k ní nikdy nedostanou. Místo toho se ptá finish: otázka „je to, co se veřejnosti poskytuje, stále projekcí trunku“ nemá odpověď, kterou by mohl dát commit, a její okamžik nastává, když relace tvrdí, že je hotova.
implikuje array of string ne Kontroly, které jsou vybrány vždy, když je vybrána tato.
vyžaduje array of string ne Kontroly, bez kterých tato nemůže běžet.
vstupy array of string ano Pathspecy, nad nimiž je běh této kontroly důkazem, odvozené z tříd, které ji vybírají. Změna kterékoli z nich činí zaznamenaný běh zastaralým.

Používá GateModelReport

GateModelReport

object
Model CI, který tento repozitář deklaruje: co smí změnu odmítnout a co každou kontrolu vybírá.

Dvě věci o této zprávě je dobré vědět, než se přečte. count se měří z gates, ne zapisuje, takže se obojí nikdy nemůže rozejít tak, jak se rozchází ručně udržovaný součet. A unreadable je způsob, jak čtenář pozná „tento repozitář nedeklaruje žádný model CI“ od „volání selhalo“: repozitář vrstvy není povinen deklarovat kontroly, takže prázdný model je odpověď a říká, proč je prázdný.

use majordomus_cli::capability::builtin::gates::GateModelReport;
use serde_json::json;

// the shape every surface serves: `unreadable` is skipped when the model was read
let r: GateModelReport = serde_json::from_value(json!({
    "version": 1,
    "source": ".ai/repo/ci/gates.yaml",
    "count": 0,
    "on_demand": [],
    "gates": [],
    "classes": [],
})).unwrap();
assert_eq!(r.count, r.gates.len(), "the total is measured, never declared");
assert!(r.unreadable.is_none(), "read, and it declares nothing");

// and the other empty answer, which a reader must not confuse with that one
let absent: GateModelReport = serde_json::from_value(json!({
    "version": 0,
    "source": ".ai/repo/ci/gates.yaml",
    "count": 0,
    "on_demand": [],
    "gates": [],
    "classes": [],
    "unreadable": "no such file",
})).unwrap();
assert_eq!(absent.unreadable.as_deref(), Some("no such file"));
vlastnosttyppovinnépopis
verze integer (uint32) ano Verze schématu, kterou soubor uvádí.
zdroj string ano Odkud byl přečten, relativně k repozitáři.
počet integer (uint) ano Kolik kontrol deklaruje; změřeno, ne napsáno.
on_demand array of string ano Kontroly, jejichž runner nelze mít na požádání, takže je žádný rutinní plán nevybírá. Kontrola, která nikdy neběží, nic nechrání, a tady se to říká nahlas.
kontroly pole GateModelEntry → GateModelEntry ano Každá kontrola v pořadí deklarace s pathspecy, nad nimiž se berou její důkazy.
třídy pole GateClass → GateClass ano Každá třída cest v pořadí deklarace.
nečitelné string | null ne Proč není co hlásit, když žádný model neexistuje. Repozitář vrstvy nemusí deklarovat model CI a čtenář má nárok na rozdíl mezi „tento repozitář nedeklaruje žádné kontroly“ a „toto volání selhalo“.

Používá gates.model

GatePlan

object
use majordomus_cli::gates::{GateClassMatch, GatePlan, GatePlanMode};
use std::collections::BTreeMap;

let plan = GatePlan {
    mode: GatePlanMode::Affected,
    reason: "3 path(s) fall in 1 class".into(),
    changed: vec!["docs/CLI.md".into()],
    classes: vec![GateClassMatch { id: "docs".into(), paths: vec!["docs/CLI.md".into()] }],
    unclassified: Vec::new(),
    selected: BTreeMap::from([("reference-check".to_string(), "class docs".to_string())]),
    excluded: BTreeMap::new(),
};
// the plan says what it selected and why, so a reader can check it rather than believe it
assert_eq!(plan.selected["reference-check"], "class docs");
assert!(!plan.selected.contains_key("rust-check"), "a document change cannot break the crate");

Které kontroly musí změna projít a proč je každá zahrnuta nebo vyloučena.

vlastnosttyppovinnépopis
režim GatePlanMode → GatePlanMode ano Dotčené, nebo plné.
důvod string ano Proč, slovy.
změněno array of string ano Změněné cesty, nad kterými byl plán vypočítán, seřazené.
třídy pole GateClassMatch → GateClassMatch ano Třídy, do kterých spadají.
nezařazeno array of string ano Změněné cesty, které nepokrývá žádná třída modelu; každá z nich plán eskaluje.
vybráno mapa řetězců ano Id kontroly na důvod, proč byla vybrána, pro kontroly v plánu.
vyloučeno mapa řetězců ano Id kontroly k důvodu, proč byla vynechána, pro kontroly, které nejsou zahrnuty.

Používá Completion

GatePlanMode

"affected" | "full"
use majordomus_cli::gates::GatePlanMode;

// a plan is either the gates the change selects, or everything the runners allow
assert_eq!(GatePlanMode::Affected.as_str(), "affected");
assert_eq!(GatePlanMode::Full.as_str(), "full");
assert_ne!(GatePlanMode::Affected, GatePlanMode::Full);

Proč plán vybírá to, co vybírá.

  • affectedKontroly tříd, do nichž změněné cesty spadají.
  • fullKaždá kontrola kromě těch na vyžádání: vyžádaná, nebo eskalovaná.

Používá GatePlan

GateRun

object
use majordomus_cli::gates::GateRun;

// what `majordomus evidence --gate` writes: a run, and the tree it was taken over
let run = GateRun {
    recorded_at: "2026-01-01T00:00:00Z".into(),
    head: "9b1e2d4".into(),
    branch: "master".into(),
    exit: 0,
    command: "scripts/rust-check --ci".into(),
    inputs_hash: "3f0a".into(),
    session: "s-1".into(),
};
// the hash is what makes a run go stale rather than merely old: the same run read
// against a different tree is evidence about a tree that no longer exists
assert_eq!(run.exit, 0);
assert_ne!(run.inputs_hash, "0000");

Řádek knihy task.gate, který naposledy hlásil kontrolu, tak jak jej kniha drží.

vlastnosttyppovinnépopis
recorded_at string ano Kdy byl zaznamenán, RFC 3339 UTC.
head string ano Commit, který na něj obálka účetní knihy vyrazila.
větev string ano Větev, na které byl zaznamenán.
ukončení celé číslo (int64) ano Návratový kód, který kontrola ohlásila. 0 je průchod.
command string ne Příkaz, který to vytvořil — vyprávění není důkaz.
inputs_hash string ne Hash souborů, které kontrolu vybírají, jak stály, když běžela.
session string ne Relace, která to zaznamenala.

Používá Gate

GateStatus

"pass" | "fail" | "stale" | "blocked" | "queued" | "exempt" | "unknown"
use majordomus_cli::gates::GateStatus;

// the three answers a reader is entitled to, and they are different answers
assert!(GateStatus::Fail.refuses(), "a run that failed refuses");
assert!(GateStatus::Queued.unverified(), "asked and unanswered is a debt");
assert!(!GateStatus::Exempt.refuses() && !GateStatus::Exempt.unverified());

// and the one that is neither: a run whose tree has moved proves nothing about this one
assert!(GateStatus::Stale.refuses());
assert_eq!(GateStatus::Stale.as_str(), "stale");

Co je známo o jedné kontrole. Každé slovo už nesou designové tokeny tohoto repozitáře (share/design/tokens.yaml, status.states), takže ho plocha vykreslí, aniž by se musela učit šestý slovník, a kontrola designu ho neodmítne.

  • passProběhlo to nad těmito vstupy a uspělo. Jediné slovo, které cokoli vyřizuje.
  • failBěžela nad těmito vstupy a selhala. Dokončení se odmítá.
  • staleBěželo to a soubory, které ho vybírají, se od té doby změnily; co to dokázalo, se týká stromu, který už neexistuje. Dokončení je odmítnuto, protože alternativou je zacházet s tvrzením o minulosti jako s tvrzením o přítomnosti.
  • blockedNěco, bez čeho nemůže běžet, neprošlo, takže její vlastní mlčení nic neznamená.
  • queuedPlán ji vybírá a žádný běh nikdy nehlásil. Ne unknown: otázka byla položena a odpověď nepřišla, což je dluh, který někdo dluží, a ne pass, což je omyl, který toto slovo existuje proto, aby ho znemožnilo.
  • exemptPlán ji nevybírá: nic, co úloha změnila, ji nemůže učinit pravdivou ani nepravdivou.
  • unknownZde ho nelze posoudit vůbec — žádný model, žádný git, ledger, který se nedal přečíst. Poctivá mezera, nikdy ne úspěch.

Používá DoneQuestion Gate

ImpliedObligation

object
use majordomus_cli::gates::ImpliedObligation;

let owed = ImpliedObligation {
    id: "tests".into(),
    title: "The cases the change obliges were run".into(),
    applicable: true,
    declared: false,
    reason: "lib/check.sh is an input of this obligation".into(),
    because: vec!["lib/check.sh".into()],
    remediation: "majordomus start --requires tests".into(),
};
// applicable and undeclared is the gap nothing else reports: the change owes it and
// the task promised nothing, so no validator holds anybody to it
assert!(owed.applicable && !owed.declared);

Jedna povinnost, kterou sada změn implikuje, a zda ji úloha slíbila.

Použitelnost se odvozuje a nic jiného: vlastní inputs tokenu v share/obligations.yaml jmenují soubory, kterých se týká, takže změna jednoho z nich způsobí, že token je dlužen. Token bez inputs jmenuje fakt mimo strom — push, publikaci, nasazení — který žádná změna stromu nemůže implikovat, takže jsou dlužny, když je úloha deklaruje, a hlášeny jako nepoužitelné, když ne.

vlastnosttyppovinnépopis
id string ano Token.
název string ano Závazek jako nadpis ze slovníku.
použitelné boolean ano Pravda, když ji změnová sada nebo vlastní deklarace úlohy činí povinnou.
deklarováno boolean ano Pravda, když jej requires úlohy jmenuje, takže finish už úlohu k tomu drží.
důvod string ano Proč se uplatňuje, nebo proč ne.
protože array of string ne Změněné cesty, které to implikovaly, když to cesty byly.
náprava string ano Co by to splnilo.

Používá Completion

Prohledává názvy a popisy všech stránek, které tento web publikuje.