F10 Writing a plugin
- Area
- F — Extensibility
- Audience
- operator
- Kind
- feature
- Status
- accepted
- Maturity
- built
- Labels
- extensibility, cli, verification
- Requires
- F3
The feature in the specification · Read at
Requirements
The published manifest schema MUST be fetchable with every release, and MUST be sufficient to validate a manifest without running lemonfiber.
Authoring MUST NOT require a language-specific library, and the generated schema MUST be the only description of the manifest format published to authors; a second, hand-maintained description MUST NOT be published beside it.
Validating, rehearsing and proving MUST each work against a local path, with no catalogue and no network involved.
A plugin's declared proofs MUST be runnable against recorded responses, so that neither authoring nor the catalogue's CI requires a live instance of the service.
Recorded responses MUST be readable data, reviewable in the same way the manifest is.
A proof run against recordings MUST be reported as such, and MUST NOT be presented as a proof against the service.
A template plugin MUST exist that validates and proves unmodified, and its CI MUST run the same commands the catalogue's CI runs.
- locked by
- 0.16.0 met
- recorded done
- lemonfibercrates/lemonfiber-core/src/app/plugins.rs
- recorded partial
- lemonfiber-pluginsregistry/check.pyjustfile
- cited by
- lemonfiber@74863ecba7lemonfiber-plugins@a54b64d1fa
The sets an author may name — adapters, core capabilities, and what a manifest may require of lemonfiber — MUST each be readable non-interactively.
- locked by
- 0.16.0 met
- recorded done
- lemonfibercontract/extension-points.jsoncontract/plugin-manifest.schema.json
- cited by
- lemonfiber@553353f26e
Publishing a plugin MUST require no infrastructure beyond a git repository.
- locked by
- 0.16.0 met
- recorded done
- lemonfiberlemonfiber-plugins:.github/workflows/registry.yml
- cited by
- lemonfiber-plugins@1314510f32
An authoring failure MUST name its location in the manifest and what was expected, and MUST report every violation in one pass.
- locked by
- 0.16.0 uncited
- recorded done
- lemonfibercrates/lemonfiber-plugin/src/conforming.rs
- F10-R11superseded
Superseded by F10-R12–F10-R16: an assertion failing where its declaration says it does is reported as failing as declared, not as passed. The number is not reused.
- replaced by
- F10-R12
- locked by
- no version locks it yet
A declared proof and a contributed check MAY each declare, against a recorded response it names, that it fails there on one constraint of its expectation, which the declaration MUST name. Every such declaration MUST carry a reason, and a declaration without one, naming a recording that does not exist, naming a constraint its assertion does not make, or naming any verdict other than failing MUST be refused by name.
- locked by
- 0.17.0 met
- recorded done
- lemonfibercrates/lemonfiber-plugin/src/schema/evidence.rscrates/lemonfiber-plugin/src/extension.rscrates/lemonfiber-plugin/src/refusing/failing.rscrates/lemonfiber-core/src/plugin/claimed/asserting.rscrates/lemonfiber-core/src/plugin/judging.rscrates/lemonfiber-core/src/app/plugins/proving.rs
- cited by
- lemonfiber@950df25bcclemonfiber@8ae60d4127
Proving against recordings MUST run an assertion against every recording a declaration names and judge every constraint of its expectation there. One whose declared constraint is judged false there while every other constraint holds MUST be reported as failing as declared, apart from passed and from failed, naming the declared constraint, what the answer held there, and the declaration's reason. It MUST NOT be reported or counted as passed, and MUST NOT by itself fail the proving run.
- locked by
- 0.17.0 met
- recorded done
- lemonfibercrates/lemonfiber-plugin/src/schema/evidence.rscrates/lemonfiber-plugin/src/extension.rscrates/lemonfiber-plugin/src/refusing/failing.rscrates/lemonfiber-core/src/plugin/claimed/asserting.rscrates/lemonfiber-core/src/plugin/judging.rscrates/lemonfiber-core/src/app/plugins/proving.rs
- recorded partial
- lemonfiber-plugins.github/reader/reader.py.github/reader/test_reader.py::test_every_declaration_an_assertion_failed_as_is_named
- cited by
- lemonfiber@950df25bcclemonfiber@8ae60d4127lemonfiber-plugins@dfe97e31c6
An assertion whose failure on a declared recording is not the one declared MUST be reported as failed and MUST fail the proving run: where the declared constraint holds, naming the declaration as stale; where a constraint the declaration does not name is judged false, naming the declared constraint and every constraint that failed.
- locked by
- 0.17.0 met
- recorded done
- lemonfibercrates/lemonfiber-plugin/src/schema/evidence.rscrates/lemonfiber-plugin/src/extension.rscrates/lemonfiber-plugin/src/refusing/failing.rscrates/lemonfiber-core/src/plugin/claimed/asserting.rscrates/lemonfiber-core/src/plugin/judging.rscrates/lemonfiber-core/src/app/plugins/proving.rs
- cited by
- lemonfiber@950df25bcclemonfiber@8ae60d4127
A declaration MUST apply only to the recording it names. Against any other recording and against the live service, the assertion MUST be held to its own expectation, and the declaration MUST NOT change its verdict.
- locked by
- 0.17.0 met
- recorded done
- lemonfibercrates/lemonfiber-plugin/src/schema/evidence.rscrates/lemonfiber-plugin/src/extension.rscrates/lemonfiber-plugin/src/refusing/failing.rscrates/lemonfiber-core/src/plugin/claimed/asserting.rscrates/lemonfiber-core/src/plugin/judging.rscrates/lemonfiber-core/src/app/plugins/proving.rs
- cited by
- lemonfiber@950df25bcclemonfiber@8ae60d4127
An assertion MUST be reported as failing as declared only where it was run against the named recording and its expectation was judged false there. One that could not be run there MUST be reported unproven, and a declaration MUST NOT stand in for a run.
- locked by
- 0.17.0 met
- recorded done
- lemonfibercrates/lemonfiber-plugin/src/schema/evidence.rscrates/lemonfiber-plugin/src/extension.rscrates/lemonfiber-plugin/src/refusing/failing.rscrates/lemonfiber-core/src/plugin/claimed/asserting.rscrates/lemonfiber-core/src/plugin/judging.rscrates/lemonfiber-core/src/app/plugins/proving.rs
- cited by
- lemonfiber@950df25bcclemonfiber@8ae60d4127
The template plugin's manifest MUST name, in the form an editor reads, the manifest schema of the lemonfiber its targets.toml names — the schema published with that release, or the schema committed at that commit — and its CI MUST refuse the two naming different ones.
A plugin's targets.toml MUST name exactly one lemonfiber to be proved against: a release, as lemonfiber = "X.Y.Z", or a commit of lemonfiber's main, in full, as commit. The reader MUST refuse by name a file naming neither or both, a commit not in full, and a commit main does not hold, and MUST build and ask nothing when it refuses.
Where targets.toml names a commit, the reader MUST build lemonfiber at that commit the way the release train's gate builds its candidate — the dist profile, the toolchain the commit pins, its committed lockfile and every submodule it embeds — MUST keep that build under the commit and ask the kept build thereafter, and MUST ask it every question it asks a release. The report it writes MUST name the commit where it would name a release.
- locked by
- 0.18.0 met
- recorded done
- lemonfiber-plugins.github/reader/reader.py.github/reader/test_reader.py::test_a_commit_on_main_is_built_as_the_gate_builds_its_candidate_and_kept_under_it.github/reader/test_reader.py::test_the_report_names_the_commit_that_answered
- cited by
- lemonfiber-plugins@745d2b1c84