Skip to content

HTTP API: rules

What this repository refuses, and what it can actually show for each refusal. A rule declares a class — blocking, where a gate refuses the work, or advisory, where a reader is expected to have read it — and an enforcement block naming either the validator the dispatcher calls or the behavioural cases that prove it. This module joins that declaration to the tree and to the ledger of recorded runs, and reports, per rule, whether what it names is there, whether a runner owns it, whether it was ever run, whether the run passed, and whether the run is older than what it is about. A blocking rule whose proof is missing, dangling or failing is a finding, because a rule nobody can prove is a rule nobody enforces.

Rendered from docs/generated/openapi.json, which the executable generates from its capability registry and CI refuses stale. The raw document is at /openapi.json; a running server serves the same document at its own /openapi.json and Swagger UI at /swagger.

rules

What this repository refuses, and what it can actually show for each refusal. A rule declares a class — blocking, where a gate refuses the work, or advisory, where a reader is expected to have read it — and an enforcement block naming either the validator the dispatcher calls or the behavioural cases that prove it. This module joins that declaration to the tree and to the ledger of recorded runs, and reports, per rule, whether what it names is there, whether a runner owns it, whether it was ever run, whether the run passed, and whether the run is older than what it is about. A blocking rule whose proof is missing, dangling or failing is a finding, because a rule nobody can prove is a rule nobody enforces.

GET /api/v1/rules rules.report

Every rule against the proof there is for it

The whole rule corpus joined to the tree and the ledger: per rule, its class, its enforcement mode, the validator and the cases it names, whether each is in the tree, the execution behind each, the CI gates that run them, and the sentence explaining how the state was derived. The tallies count the whole corpus even when the answer is filtered, and the findings name every rule whose declared class the proof does not support. Kept per checkout state, never longer: the ledger is a file that changes outside this process, and an edit of it, of a validator or of any tracked file, a new untracked file, a commit or a new ref is a new answer.

  • query
  • behaviorally_verified
  • benchmark required
  • cache checkout (max_entries=8)
  • MCP tool majordomus_rules
  • MCP resource {"name": "rules", "uri": "majordomus://rules"}
  • $ rules report

Query parameters

nametyperequireddescriptionexamples
state RuleState | null no Only rules in this proof state (`proven`, `inputs_unchanged`, `stale`, `failing`, `not_run`, `unrunnable`, `dangling`, `unproven`). Absent: every rule.
class RuleClass | null no Only rules of this class (`blocking`, `advisory`). Absent: every rule. blocking: "blocking"
namespace string no Only rules of this namespace — `project` for this repository's own, `majordomus` for the vendored package. Absent: both.
findings_only boolean no Only the rules whose declared class the proof does not support, with the findings. The tallies still count the whole corpus, so a filtered answer never misreports how much of it was examined. findings: true

Try it

The port is whatever the server logged; 8741 is the one it asks for first. The values are the operation's first example.

curl -s "http://127.0.0.1:8741/api/v1/rules?class=blocking&findings_only=true"

Tested by apps/majordomus-cli/tests/http_serve.rs, which replays the route with these values against a server on a real socket.

Responses

statusbodymeaning
200 RulesReport Every rule against the proof there is for it: the result.
400 ErrorBody invalid_input: The input does not fit the schema: a parameter of the wrong type, an unknown one, or a value the capability rejects.
404 ErrorBody not_found: The input names something the repository does not hold.
500 ErrorBody internal: The capability failed for a reason of its own; the message names it.
default ErrorBody Any other failure the transport reports: 405 method_not_allowed for another method on this path, 400 invalid_input for a body that is not a JSON object.
GET /api/v1/rules/proves rules.proves

What this test proves

One test — by identity or by the path a rule names it with — with every rule that names it and the rules that would be left with no proof at all if it were deleted. This is the reverse of rules.show and reads the same derivation, so the two directions cannot disagree. It is the question that could not be asked while the relation ran one way only: before deleting or renaming a case, what stops being enforced.

  • query
  • behaviorally_verified
  • benchmark required
  • cache disabled
  • MCP tool majordomus_rule_proves
  • $ rules proves

Query parameters

nametyperequireddescriptionexamples
test string yes `test/cases/07_scope.sh`, or `suite:07_scope`, or `crate:product`. suite: "test/cases/125_rule_proof.sh"

Try it

The port is whatever the server logged; 8741 is the one it asks for first. The values are the operation's first example.

curl -s "http://127.0.0.1:8741/api/v1/rules/proves?test=test%2Fcases%2F125_rule_proof.sh"

Tested by apps/majordomus-cli/tests/http_serve.rs, which replays the route with these values against a server on a real socket.

Responses

statusbodymeaning
200 TestSubjects What this test proves: the result.
400 ErrorBody invalid_input: The input does not fit the schema: a parameter of the wrong type, an unknown one, or a value the capability rejects.
404 ErrorBody not_found: The input names something the repository does not hold.
500 ErrorBody internal: The capability failed for a reason of its own; the message names it.
default ErrorBody Any other failure the transport reports: 405 method_not_allowed for another method on this path, 400 invalid_input for a body that is not a JSON object.
GET /api/v1/rules/rule rules.show

What proves this rule

One rule with its full proof: the validator and the cases it names, the execution behind each, the gates that run them, the rules it depends on and the rules that depend on it — each with the state it is in, because a rule is proven only as far as its dependencies are — and, when it is not proven, the one sentence saying what would have to be true for it to be. A rule this repository does not declare is a not-found rather than an empty answer, because a typo that read as 'this rule has no proof' is the one answer this capability must never give.

  • query
  • behaviorally_verified
  • benchmark required
  • cache checkout (max_entries=32)
  • MCP tool majordomus_rule
  • $ rules show

Query parameters

nametyperequireddescriptionexamples
rule string yes The rule id, with or without its version: `project.scope-is-declared`, or the identity the index holds. first: "majordomus.adr-integrity@1"

Try it

The port is whatever the server logged; 8741 is the one it asks for first. The values are the operation's first example.

curl -s "http://127.0.0.1:8741/api/v1/rules/rule?rule=majordomus.adr-integrity%401"

Tested by apps/majordomus-cli/tests/http_serve.rs, which replays the route with these values against a server on a real socket.

Responses

statusbodymeaning
200 RuleDetail What proves this rule: the result.
400 ErrorBody invalid_input: The input does not fit the schema: a parameter of the wrong type, an unknown one, or a value the capability rejects.
404 ErrorBody not_found: The input names something the repository does not hold.
500 ErrorBody internal: The capability failed for a reason of its own; the message names it.
default ErrorBody Any other failure the transport reports: 405 method_not_allowed for another method on this path, 400 invalid_input for a body that is not a JSON object.

Schemas

The components only this tag's operations use. Each row is the type's own field, its doc comment the description; a type another page owns links there.

RuleArtifactKind

"case" | "gate" | "unknown"
What a path a rule names actually is, decided by what drives it rather than by where it sits.

The corpus names two kinds and this distinction is the difference between a verdict and a mechanism. A case is driven by a runner, so an execution of it can be recorded and the repository can show that it passed. A gate is an executable check a CI gate runs as its own command, or a unit-test module (src/<module>/tests.rs) the gate running the crate's cargo test compiles: it refuses violations on every run, and this repository records no verdict for it, so what can be shown is the mechanism and not the result. Anything else a rule names is proof only in prose.

Example

use majordomus_cli::rules::ArtifactKind;
assert_eq!(ArtifactKind::Case.label(), "case");
assert_eq!(ArtifactKind::Gate.label(), "gate");
  • caseA behavioural case a runner drives; executions of it are recorded.
  • gateAn executable check a CI gate runs as its own command, or a unit-test module the gate running the crate's cargo test compiles.
  • unknownNeither. Nothing can run it, so nothing can ever record it.

Used by RuleTestProof

RuleClass

"blocking" | "advisory" | "unknown"
What a rule declares about how strongly it binds.

The repository has exactly two, and they are not severities on a scale: blocking means a gate refuses the work, advisory means a reader is expected to have read it. A rule whose front matter says neither is reported as Class::Unknown rather than defaulted, because guessing here is how a blocking rule quietly becomes advice.

Example

use majordomus_cli::rules::Class;
assert_eq!(Class::Blocking.label(), "blocking");
assert_eq!(Class::parse("advisory"), Class::Advisory);
  • blockingA gate refuses work that violates it.
  • advisoryNormative for whoever reads it; nothing refuses a violation.
  • unknownThe front matter declared no class, or one this repository does not know.

Used by rules.report RuleDefinition RuleFinding RuleSummary

RuleCoverage

object
How much of the rule corpus carries each part of a proof.

Every number here is counted from the tree. Nothing in this struct may be written down anywhere else: a hardcoded rule count is the defect this repository keeps rediscovering.

Example

Every number is counted from the tree; an empty corpus counts zero rather than reading as complete, which is what Coverage::default is for.

use majordomus_cli::rules::Coverage;
let c = Coverage::default();
assert_eq!(c.rules, 0);
assert_eq!(c.review_only, 0);
propertytyperequireddescription
rules integer (uint) yes Rules discovered.
blocking integer (uint) yes Of those, blocking.
advisory integer (uint) yes Of those, advisory.
named_proof integer (uint) yes Rules naming a validator or at least one test.
artifacts_present integer (uint) yes Rules every one of whose named paths is in the tree.
runnable integer (uint) yes Rules at least one of whose tests a runner owns.
recorded integer (uint) yes Rules every one of whose tests has a recorded run.
passing integer (uint) yes Rules whose recorded runs all passed.
gated integer (uint) yes Rules some CI gate runs.
mechanism_only integer (uint) yes Rules whose only executable proof is a gate: a mechanism that refuses violations, with no recorded verdict behind it. Counted apart from passing so that the two are never read as one number.
review_only integer (uint) yes Rules that declare, with a reason, that a reader enforces them. Counted apart from every executable mode: this number going up is governance getting weaker, and a summary that folded it into a total would hide exactly that.
satisfied integer (uint) yes Rules whose state their class can live with.

Used by RulesReport

RuleDefinition

object
One rule, as the repository canonically declares it.

Example

Built by definitions from the index rather than by hand. Its ordering is the one the crate has, so a report over the same tree reads the same twice.

use majordomus_cli::rules::{Class, RuleDefinition};
#### use majordomus_cli::rules::{Enforcement, Mode};
let d = RuleDefinition {
    id: "project.scope-is-declared".into(),
    identity: "project.scope-is-declared@1".into(),
    uri: "majordomus://rule/project.scope-is-declared@1".into(),
    version: 1,
    title: "Scope is declared".into(),
    description: None,
    statement: None,
    status: "active".into(),
    class: Class::Blocking,
    namespace: "project".into(),
    depends_on: vec![],
    tags: vec![],
    path: ".ai/repo/rules/project/scope-is-declared.v1.md".into(),
    enforcement: Enforcement {
        mode: Mode::Declarative, validator: None, category: None, exit_code: None,
        enforced_by: None, tests: vec![], reviewed_because: None,
    },
};
assert_eq!(d.class, Class::Blocking);
propertytyperequireddescription
id string yes The rule id, <namespace>.<stem>, without the version.
identity string yes The identity the index holds, with the version.
uri string yes majordomus://rule/<identity>.
version integer (uint64) yes The declared version.
title string yes The title.
description string | null no The one-line description.
statement string | null no The normative sentence.
status string yes active, or whatever else the front matter declares.
class RuleClass → RuleClass yes How strongly it binds.
namespace string yes Whether it came with the vendored package or belongs to this project.
depends_on array of string no The rules it depends on, by id.
tags array of string no The declared tags.
path string yes Repository-relative path of the rule object.
enforcement RuleEnforcement → RuleEnforcement yes How it is enforced, as declared.

Used by RuleProof

RuleDetail

object
One rule, with everything that proves it and everything that depends on it.

Example

What rules show answers: the proof, the rules either side of it in the dependency graph, and the one sentence saying what would make it proven.

use majordomus_cli::capability::builtin::rules::RuleSummary;
use majordomus_cli::rules::{Class, RuleState};
// a RuleDetail carries these summaries for depends_on and required_by
let dep = RuleSummary {
    id: "project.dep".into(), title: "Dep".into(),
    class: Class::Blocking, state: RuleState::NotRun,
};
assert_eq!(dep.class, Class::Blocking);
propertytyperequireddescription
proof RuleProof → RuleProof yes The rule, joined to the tree and the ledger.
depends_on array of RuleSummary → RuleSummary yes The rules this one depends on, with the state each is in — a rule whose dependency is unproven is proven only as far as that dependency is.
required_by array of RuleSummary → RuleSummary yes The rules that depend on this one.
missing string | null no What would have to be true for this rule to reach proven, in words, or nothing when it is there already.

Used by rules.show

RuleEnforcement

object
The enforcement block of a rule, read from x-majordomus.

Example

Read from front matter rather than built by hand; this is the shape a gated rule produces, and the mode is decided by what the block actually names.

use majordomus_cli::rules::{Enforcement, Mode};
let e = Enforcement {
    mode: Mode::Gated,
    validator: None,
    category: None,
    exit_code: None,
    enforced_by: None,
    tests: vec!["test/cases/07_scope.sh".into()],
    reviewed_because: None,
};
assert_eq!(e.mode, Mode::Gated);
propertytyperequireddescription
mode RuleMode → RuleMode yes Which of the two canonical modes, or neither.
validator string | null no The validator the dispatcher calls, when the mode is dispatched.
category string | null no The diagnostic category the validator reports under.
exit_code integer | null no The exit code the validator uses to refuse.
enforced_by string | null no Which boundary enforces it: the word the rule's own block uses.
tests array of string no Every test the block names, in the order it names them.
reviewed_because string | null no Why nothing executable can express this rule, when the mode is reviewed. Required there: a declared exemption with no reason is the debt it exists to replace.

Used by RuleDefinition

RuleFinding

object
One rule whose declared class the proof does not support.

Example

use majordomus_cli::rules::{Class, Finding, RuleState};
let f = Finding {
    rule: "project.x".into(),
    class: Class::Blocking,
    state: RuleState::Dangling,
    reason: "it names a path that is not in the tree".into(),
    reproduce: "scripts/ci/rule-proof-check".into(),
};
assert_eq!(f.state, RuleState::Dangling);
propertytyperequireddescription
rule string yes The rule id.
class RuleClass → RuleClass yes The class it declares.
state RuleState → RuleState yes The state its proof is in.
reason string yes Why that combination is a finding.
reproduce string yes The command that shows it again.

Used by RulesReport

RuleMode

"dispatched" | "gated" | "reviewed" | "declarative"
How a rule is enforced, as its own front matter declares it.

Example

use majordomus_cli::rules::Mode;
assert_eq!(Mode::Dispatched.label(), "dispatched");
assert_eq!(Mode::Declarative.label(), "declarative");
  • dispatchedNames a validator the doctrine dispatcher calls at run time.
  • gatedNames behavioural cases and no validator; a gate runs them.
  • reviewedCarries a reason why nothing executable can express it, and so declares that a reader enforces it. An honest declaration, not an absence: the reason is the declaration — there is no flag beside it, because a flag can be set and a reason cannot be set without writing one — it is counted apart from every executable mode, and it separates a rule nobody could automate from a rule nobody got round to.
  • declarativeNames neither. Correct for a rule nothing executable can express; a defect for a blocking one.

Used by RuleEnforcement

RuleProof

object
One rule, joined to everything the repository can show about it.

Example

A RuleProof is what report produces per rule; satisfied is whether the state supports the class the rule declares, which is the whole question.

use majordomus_cli::rules::{report, RuleProof, RuleState};
use majordomus_cli::evidence::Ledger;
use majordomus_cli::synthetic::SyntheticRepository;
let repo = SyntheticRepository::small().unwrap();
let ledger = Ledger::load(repo.root()).unwrap();
let r = report(&repo.index().unwrap(), &ledger);
let first: &RuleProof = &r.rules[0];
assert_eq!(first.state, RuleState::Unproven);
assert!(first.satisfied, "an advisory rule owes no executable proof");
propertytyperequireddescription
rule RuleDefinition → RuleDefinition yes The canonical definition.
validator RuleValidator | null → RuleValidator no The validator, when the mode is dispatched.
tests array of RuleTestProof → RuleTestProof no Every test the rule names, joined to the ledger.
gates array of string no Every CI gate that runs something this rule names, deduplicated.
required_by array of string no The rules that depend on this one, by id — the converse of depends_on, which no rule declares and which a reader always wants.
state RuleState → RuleState yes What the repository can say, as a whole.
meaning string yes That state, in one sentence.
satisfied boolean yes Whether the state is one this rule's class can live with.

Used by RuleDetail RulesReport

RuleState

"proven" | "inputs_unchanged" | "stale" | "gated" | "failing" | "not_run" | "reviewed" | "unrunnable" | "dangling" | "unproven"
What the repository can say about one rule's proof, as a whole.

Ordered strongest to weakest so that a summary sorted by this reads as a ranking. A rule's state is made from its parts' by crate::evidence::freshness::aggregate: a failing part makes it failing, and otherwise the weakest part that can carry proof decides.

Example

use majordomus_cli::rules::RuleState;
assert!(RuleState::Proven < RuleState::Stale);
assert!(RuleState::Stale.passing());
assert!(!RuleState::Dangling.passing());
  • provenEvery artifact it names is present, and every test it names has a passing run that nothing has invalidated.
  • inputs_unchangedEvery artifact is present and every test passed, but at least one run is only un-invalidated rather than measured against this tree.
  • staleA passing run exists, but something it is about has changed since.
  • gatedAn executable gate runs what this rule names, on every CI run that selects it. The mechanism is in the tree and wired; no verdict for it is recorded here.
  • failingThe latest run of a test this rule names did not pass.
  • not_runEvery artifact is present, and no run of at least one named test was ever recorded.
  • reviewedThe rule declares, with a stated reason, that nothing executable can express it. An honest exemption: counted apart from every proven rule, never counted as one.
  • unrunnableThe rule names a path no runner in this repository drives.
  • danglingThe rule names a path that is not in the tree. A proof that does not exist is worse than no proof, because the rule reads as proven.
  • unprovenThe rule names neither a validator nor a test. Correct for a rule nothing executable can express; a defect for a blocking one.

Used by rules.report RuleFinding RuleProof RuleSummary

RuleSummary

object
A rule named from somewhere else, with just enough to decide whether to follow it.

Example

use majordomus_cli::capability::builtin::rules::RuleSummary;
use majordomus_cli::rules::{Class, RuleState};
let s = RuleSummary {
    id: "project.x".into(),
    title: "X".into(),
    class: Class::Advisory,
    state: RuleState::Reviewed,
};
assert_eq!(s.state, RuleState::Reviewed);
propertytyperequireddescription
id string yes The rule id.
title string yes The title.
class RuleClass → RuleClass yes How strongly it binds.
state RuleState → RuleState yes What the repository can say about its proof.

Used by RuleDetail TestSubjects

RuleTestProof

object
One test a rule names, joined to what was recorded against it.

Example

use majordomus_cli::rules::{ArtifactKind, TestProof};
use majordomus_cli::evidence::ProofState;
let t = TestProof {
    path: "test/cases/07_scope.sh".into(),
    kind: ArtifactKind::Case,
    present: true,
    test: Some("suite:07_scope".into()),
    state: ProofState::NotRun,
    meaning: ProofState::NotRun.meaning().into(),
    execution: None,
    reproduce: Some("bash test/run.sh 07_scope".into()),
    gates: vec!["shell-suite".into()],
};
assert_eq!(t.kind, ArtifactKind::Case);
propertytyperequireddescription
path string yes The path the rule names.
kind RuleArtifactKind → RuleArtifactKind yes What drives it: a runner, a CI gate, or nothing.
present boolean yes Whether that path is in the tree.
test string | null no The canonical test identity (suite:<case>, crate:<binary>), when a runner owns the path. Absent means no runner drives it, so no run of it can ever be recorded.
state ProofState → ProofState yes What the repository can say about this test's latest run.
meaning string yes That state, in one sentence, from the one place it is worded.
execution EvidenceExecution | null → EvidenceExecution no The execution behind the state, when there is one.
reproduce string | null no The command that runs this test again.
gates array of string no The CI gates that run this test, derived from the repository's own CI model.

Used by RuleProof

RuleValidator

object
The validator a dispatched rule names, and whether anything defines it.

A validator is not a path. validator: adr names the shell function mj_validate_adr, which the doctrine dispatcher calls; the tool finds it by scanning lib/, exactly as majordomus doctor does. Reading it as a path is a mistake worth recording here, because it is the one this type was introduced to fix: it makes every dispatched rule in the vendored package report as naming something that is not in the tree, which is the opposite of true — those are the best-enforced rules there are.

Example

use majordomus_cli::rules::ValidatorRef;
let v = ValidatorRef {
    name: "adr".into(),
    function: "mj_validate_adr".into(),
    defined_in: Some("lib/adr.sh".into()),
    present: true,
};
assert_eq!(v.function, "mj_validate_adr");
propertytyperequireddescription
name string yes The name the rule declares, without the mj_validate_ prefix.
function string yes The function the dispatcher calls.
defined_in string | null no The file that defines it, when one does.
present boolean yes Whether anything in lib/ defines it.

Used by RuleProof

RulesReport

object
The whole rule corpus, verified.

Example

The whole corpus joined to the tree and the ledger. verdict is what the corpus can be said to prove; satisfied is only that there are no findings, and the two differ whenever a blocking rule has never been run.

use majordomus_cli::rules::{RulesReport, RulesVerdict};
let r = RulesReport {
    head: None,
    working_tree: "clean".into(),
    verdict: RulesVerdict::Unproven,
    rules: vec![],
    states: Default::default(),
    coverage: Default::default(),
    findings: vec![],
    satisfied: true,
};
assert!(r.satisfied());
assert_ne!(r.verdict, RulesVerdict::Proven, "no findings is not proof");
propertytyperequireddescription
head string | null no The commit the report was derived against, when git could say.
working_tree string yes clean, dirty or unknown at the time of derivation.
verdict RulesVerdict → RulesVerdict yes What the whole corpus proves: proven, unproven or failing. Derived over the whole corpus before any filter, like the tallies.
rules array of RuleProof → RuleProof yes Every rule, in canonical id order.
states map of integer (uint) yes How many rules are in each state, by the state's printed word.
coverage RuleCoverage → RuleCoverage yes The parts of a proof, counted.
findings array of RuleFinding → RuleFinding yes Every rule whose declared class the proof does not support.
satisfied boolean yes Whether there are no findings — and nothing more. A corpus none of whose blocking rules was ever run is satisfied; verdict is the field that says whether anything was proven.

Used by rules.report

RulesVerdict

"proven" | "unproven" | "failing"
What the whole corpus can be said to prove, in one word, before any number is read.

satisfied answers a narrower question — are there findings — and a corpus in which no blocking rule was ever run has none, because not run, gated and reviewed are weaker states rather than defects (docs/DOCTRINE.md). Read alone, satisfied: true over such a corpus says "every rule is enforced" about a repository that has shown nothing. The verdict is the answer that cannot be read that way: it is proven only when every blocking rule is proven — a passing run recorded on a clean tree, at a commit that nothing but the evidence ledger has changed since. A rule whose inputs are merely unchanged is not that (ADR 0041), and leaves the corpus unproven.

Example

use majordomus_cli::rules::{RuleState, RulesVerdict};
// a corpus with a finding is failing, whatever else is true of it
assert_eq!(RulesVerdict::of([RuleState::Proven], true), RulesVerdict::Failing);
// one blocking rule never run is enough to leave the corpus unproven
assert_eq!(
    RulesVerdict::of([RuleState::Proven, RuleState::NotRun], false),
    RulesVerdict::Unproven
);
assert_eq!(RulesVerdict::of([RuleState::Proven], false), RulesVerdict::Proven);
// a pass whose inputs are merely unchanged is not proven
assert_eq!(
    RulesVerdict::of([RuleState::Proven, RuleState::InputsUnchanged], false),
    RulesVerdict::Unproven
);
  • provenEvery blocking rule is proven: a passing run recorded on a clean tree, at a commit that nothing but the evidence ledger has changed since.
  • unprovenNo rule is a finding, and at least one blocking rule is not proven — never run, gated, reviewed, stale, or passing with only its inputs unchanged — or there is no blocking rule at all.
  • failingAt least one rule declares a class its proof does not support.

Used by RulesReport

TestSubjects

object
What one test proves: the reverse of RuleDetail.

Example

The reverse of rules show: what a test proves, and which rules would be left with no proof at all if it were deleted.

use majordomus_cli::capability::builtin::rules::TestSubjects;
let t = TestSubjects {
    test: Some("suite:07_scope".into()),
    path: "test/cases/07_scope.sh".into(),
    present: true,
    reproduce: Some("bash test/run.sh 07_scope".into()),
    proves: vec![],
    sole_proof_of: vec![],
};
assert!(t.present);
propertytyperequireddescription
test string | null no The canonical test identity, when a runner owns the path.
path string yes The path as given.
present boolean yes Whether that path is in the tree.
reproduce string | null no The command that runs it again.
proves array of RuleSummary → RuleSummary yes Every rule that names this test, with the state it is in.
sole_proof_of array of string yes Every rule that would lose its only proof if this test were deleted. This is the question the one-way relation could never answer.

Used by rules.proves

Searches the titles and descriptions of every page this site publishes.