← The board

F3 Plugin manifests

Area
F — Extensibility
Audience
operator
Kind
feature
Status
accepted
Maturity
building
Labels
extensibility, verification, wiring
Requires
F1F2C1G4
Relates to
F4F5F6F7F8B3C3C9E4

The feature in the specification · Read at

Requirements

  1. F3-R1acceptedMUST

    A plugin MUST be expressed as declarative data — the service, its capabilities, its wiring, its recipes, its declared secrets and overrides, and its proofs — never as executable code.

    locked by
    0.16.0 met
    recorded done
    lemonfibercrates/lemonfiber-plugin/src/refusing/carried.rs
    cited by
    lemonfiber@899d58744dlemonfiber@172a24e1b2
  2. F3-R2acceptedMUST

    Every manifest MUST be validated against a published schema before lemonfiber acts on it, and a non-conforming manifest MUST be rejected outright.

    locked by
    0.16.0 met
    recorded done
    lemonfibercrates/lemonfiber-plugin/src/refusing/carried.rs
    cited by
    lemonfiber@687d9be304lemonfiber@172a24e1b2
  3. F3-R3acceptedMUST

    A plugin's declared proofs MUST be runnable by the existing verification engine, the same way the bundled proofs are run.

    locked by
    0.16.0 met
    recorded done
    lemonfibercrates/lemonfiber-core/src/plugin/judging.rscrates/lemonfiber-core/src/app/putting_back.rs
    cited by
    lemonfiber@269c149f22
  4. F3-R4acceptedMUST

    A plugin whose declared proofs do not pass MUST NOT be installed.

    locked by
    0.16.0 met
    recorded done
    lemonfibercrates/lemonfiber-core/src/plugin/judging.rscrates/lemonfiber-core/src/app/putting_back.rs
    cited by
    lemonfiber@269c149f22
  5. F3-R5acceptedMUST

    A declared proof that cannot be run MUST be reported as unproven and MUST NOT be treated as passed.

    locked by
    0.16.0 met
    recorded done
    lemonfibercrates/lemonfiber-core/src/plugin/judging.rscrates/lemonfiber-core/src/app/putting_back.rs
    cited by
    lemonfiber@269c149f22lemonfiber-media-stack@b26d477c7d
  6. F3-R6acceptedMUST

    Contributed code MUST NOT be executed, and no opt-in, sandbox or capability grant may make it executable.

    locked by
    0.16.0 met
    recorded done
    lemonfiberdeny.tomlcrates/lemonfiber/tests/architecture/nothing_here_runs_what_somebody_sent.rs
    cited by
    lemonfiber@eadfa9c159
  7. F3-R7acceptedMUST

    Arbitrary native plugins MUST NOT be a supported extension mechanism.

    locked by
    0.16.0 met
    recorded done
    lemonfiberdeny.tomlcrates/lemonfiber/tests/architecture/nothing_here_runs_what_somebody_sent.rs
    cited by
    lemonfiber@eadfa9c159
  8. F3-R8acceptedMUST

    A referenced image MUST be named by an immutable digest, and one named by tag alone MUST be refused.

    locked by
    0.16.0 met
    recorded done
    lemonfibercrates/lemonfiber-plugin/src/refusing/carried.rs
    cited by
    lemonfiber@172a24e1b2
  9. F3-R9acceptedMUST

    The manifest schema MUST be validated in the catalogue's CI so malformed contributions are caught before merge.

    locked by
    0.16.0 met
    recorded done
    lemonfiber-pluginsregistry/check.py.github/reader/test_reader.py::test_the_schema_of_the_targeted_release_passes
    cited by
    lemonfiber@d038179c0blemonfiber-plugins@f8d2fa8013
  10. F3-R10acceptedMUST

    A manifest MUST review as a readable diff, with no opaque or obfuscated content required to understand what it does.

    locked by
    0.16.0 met
    recorded done
    lemonfibercrates/lemonfiber-plugin/src/refusing/carried.rs
    cited by
    lemonfiber@8254d2b85alemonfiber@172a24e1b2
  11. F3-R11acceptedMUST

    A plugin MUST NOT reach beyond what its manifest declares, and one that over-reaches MUST be rejected rather than confined.

    locked by
    0.16.0 met
    recorded done
    lemonfibercrates/lemonfiber-core/src/app/plugins/occupied.rscrates/lemonfiber/tests/architecture/nothing_here_runs_what_somebody_sent.rs
    cited by
    lemonfiber@6a68df7cef
  12. F3-R12acceptedMUST

    A plugin's provenance MUST be verifiable rather than taken on trust.

    locked by
    0.16.0 met
    recorded done
    lemonfibercrates/lemonfiber-plugin/src/refusing/carried.rs
    cited by
    lemonfiber@172a24e1b2
  13. F3-R13acceptedMUST

    Fetching, validating, rehearsing and proving a plugin MUST each be reachable non-interactively with a meaningful exit status.

    locked by
    0.16.0 met
    recorded done
    lemonfibercrates/lemonfiber/tests/integration/every_plugin_step_runs_unattended.rscrates/lemonfiber/src/exit/reports.rs
    cited by
    lemonfiber@7d4d153a39
  14. F3-R14acceptedMUST

    A plugin that conflicts with the bundled topology MUST surface the conflict at validation rather than silently overriding it.

    locked by
    0.16.0 met
    recorded done
    lemonfibercrates/lemonfiber-core/src/app/plugins/occupied.rscrates/lemonfiber/tests/architecture/nothing_here_runs_what_somebody_sent.rs
    cited by
    lemonfiber@96521f15a2lemonfiber@8254d2b85alemonfiber@6a68df7cef
  15. F3-R15withdrawn

    Withdrawn — carried to F8-R1 when recipes became their own feature. The number is not reused.

    locked by
    no version locks it yet
  16. F3-R16withdrawn

    Withdrawn — carried to F8-R10 when recipes became their own feature. The number is not reused.

    locked by
    no version locks it yet
  17. F3-R17acceptedMUST

    Every secret a plugin will hold MUST be declared in its manifest, and capturing an undeclared value MUST fail validation.

    locked by
    0.16.0 met
    recorded done
    lemonfibercrates/lemonfiber-core/src/app/plugins/occupied.rscrates/lemonfiber/tests/architecture/nothing_here_runs_what_somebody_sent.rs
    cited by
    lemonfiber@6a68df7cef
  18. F3-R18acceptedMUST

    Every bundled thing a plugin will override MUST be declared in its manifest, and changing an undeclared one MUST fail validation.

    locked by
    0.16.0 met
    recorded done
    lemonfibercrates/lemonfiber-core/src/app/plugins/occupied.rscrates/lemonfiber/tests/architecture/nothing_here_runs_what_somebody_sent.rs
    cited by
    lemonfiber@6a68df7cef
  19. F3-R19withdrawn

    Withdrawn — carried to F8-R11 when recipes became their own feature. The number is not reused.

    locked by
    no version locks it yet
  20. F3-R20withdrawn

    Withdrawn — carried to F8-R12 when recipes became their own feature. The number is not reused.

    locked by
    no version locks it yet
  21. F3-R21acceptedMUST

    A manifest MUST declare the capabilities it requires of lemonfiber, and an unmet requirement MUST be refused by naming the capability rather than a version.

    locked by
    0.16.0 met
    recorded done
    lemonfibercrates/lemonfiber-plugin/src/refusing/carried.rscrates/lemonfiber-plugin/src/refusing.rscrates/lemonfiber-core/src/app/plugins.rs
    cited by
    lemonfiber@172a24e1b2
  22. F3-R22acceptedMUST

    Manifest validation MUST report every violation in one pass, each named with its location.

    locked by
    0.16.0 met
    recorded done
    lemonfibercrates/lemonfiber-plugin/src/refusing/carried.rs
    cited by
    lemonfiber@172a24e1b2lemonfiber@6da5cfe2b5lemonfiber@3ec56ad9e7
  23. F3-R23acceptedMUST

    A plugin MUST NOT supply a container definition, and lemonfiber MUST generate one from what the plugin declares.

    locked by
    0.16.0 met
    recorded done
    lemonfibercrates/lemonfiber-core/src/plugin/container.rs
    cited by
    lemonfiber@899d58744dlemonfiber@5403cacdb0
  24. F3-R24acceptedMUST

    What a plugin's service may reach of the machine MUST be fixed by lemonfiber rather than chosen by the plugin — no mount beyond the data root and its own configuration directory, no device, no kernel capability, no network mode, no privileged container and no user override — and a manifest asking for any of them MUST be refused by name.

    locked by
    0.16.0 met
    recorded done
    lemonfibercrates/lemonfiber-core/src/plugin/container.rs
    cited by
    lemonfiber@8254d2b85alemonfiber@899d58744dlemonfiber@5403cacdb0
  25. F3-R25acceptedMUST

    Where a registry offers a signature for a referenced image it MUST be verified, and one that does not verify MUST be refused. Where none is offered the image MUST be reported as unproven, and an unproven image MUST NOT be reported as verified.

    locked by
    0.16.0 unmarked
    recorded partial
    lemonfiber
    cited by
    lemonfiber@899d58744dlemonfiber@93dd368b75
  26. F3-R26acceptedMUST

    A plugin MAY declare contributions to lemonfiber's own behaviour, and every contribution MUST be data an engine lemonfiber already runs interprets, in that engine's existing vocabulary. A contribution that would require an interpreter lemonfiber does not already have MUST NOT be declarable.

    locked by
    0.16.0 met
    recorded done
    lemonfibercrates/lemonfiber-core/src/doctor/contributed.rs
    cited by
    lemonfiber@57edbd54c8
  27. F3-R27acceptedMUST

    A declared contribution MUST be run or rendered by that engine exactly as its bundled entries are — the same evaluation, the same verdicts, the same bounds — and MUST be attributed to the plugin that declared it wherever it appears.

    locked by
    0.16.0 met
    recorded done
    lemonfibercrates/lemonfiber-core/src/app/engine/diagnosis.rscrates/lemonfiber-core/src/plugin/installed.rs
    cited by
    lemonfiber@594ee8df12lemonfiber@57edbd54c8
  28. F3-R28acceptedMUST

    A declared contribution that cannot be run or rendered MUST be reported as unrun, naming it and the plugin, and MUST NOT be reported as passed, as satisfied, or by being omitted.

    locked by
    0.16.0 met
    recorded done
    lemonfibercrates/lemonfiber-core/src/app/engine/diagnosis.rscrates/lemonfiber-core/src/plugin/installed.rs
    cited by
    lemonfiber@594ee8df12lemonfiber@57edbd54c8
  29. F3-R29acceptedMUST

    A contributed remedy MUST be text in the error model's shape, rendered and never executed; a contribution that would act on the operator's system MUST be refused as a remedy and MUST be declared as a recipe or not at all.

    locked by
    0.16.0 met
    recorded done
    lemonfibercrates/lemonfiber-core/src/doctor/contributed.rs
    cited by
    lemonfiber@57edbd54c8
  30. F3-R30acceptedMUST

    A plugin's contributions MUST be withdrawn when the plugin is removed, and lemonfiber with no plugin installed MUST answer exactly as it does with none ever declared.

    locked by
    0.16.0 met
    recorded done
    lemonfibercontract/web-api/index.jsoncontract/web-api-surface/index.jsoncrates/lemonfiber-core/src/app/plugins.rscrates/lemonfiber-core/src/app/plugins/removing.rs
    cited by
    lemonfiber@8639dde376lemonfiber@57edbd54c8
  31. F3-R31acceptedMUST

    An installed plugin's service MUST be reachable through the stack's own proxy and visible on its dashboard on the same terms as a bundled service in the same binding tier, written by lemonfiber from what the manifest declares; a plugin MUST NOT supply that wiring, and MUST NOT be able to obtain it for a service bound to loopback.

    locked by
    0.16.0 met
    recorded done
    lemonfibercrates/lemonfiber-core/src/app/plugins/occupied.rscrates/lemonfiber/tests/architecture/nothing_here_runs_what_somebody_sent.rscrates/lemonfiber-core/src/plugin/fronting.rscrates/lemonfiber-core/src/region.rscrates/lemonfiber-core/src/journal.rscrates/lemonfiber-core/src/app/bounded.rs
    cited by
    lemonfiber@899d58744dlemonfiber@9fd0586162lemonfiber@604aa970e0
  32. F3-R32acceptedMUST

    A plugin's service MUST be able to declare where inside its container its one configuration directory is mounted, so that an image keeping its state somewhere other than the conventional path is installable without its state being left unmounted.

    locked by
    0.16.0 met
    recorded done
    lemonfibercontract/plugin-manifest.schema.jsoncontract/web-api/index.jsoncontract/web-api-surface/index.jsoncrates/lemonfiber-core/src/app.rs
    cited by
    lemonfiber@4c2ae3797d
  33. F3-R33acceptedMUST

    A plugin's contributions MUST be declared in its manifest, each naming the published extension point it is made at and carrying exactly the row that point declares, and a row missing a required field or carrying one outside the point's set MUST be refused naming the field and the point.

    locked by
    0.16.0 met
    recorded done
    lemonfibercontract/extension-points.jsoncontract/plugin-manifest.schema.json
    cited by
    lemonfiber@553353f26e
  34. F3-R34acceptedMUST

    Every contributed check MUST carry at least one contributed remedy, and one declared without a remedy MUST be refused naming the check.

    locked by
    0.16.0 met
    recorded done
    lemonfibercontract/extension-points.jsoncontract/plugin-manifest.schema.json
    cited by
    lemonfiber@553353f26e
  35. F3-R35acceptedMUST

    A recipe MUST be declarable in the manifest and statically checkable without being run, and a manifest declaring one MUST require the capability that runs it by name, so that a lemonfiber which cannot run recipes refuses the manifest by naming that capability rather than by ignoring the block.

    locked by
    0.16.0 met
    recorded done
    lemonfibercrates/lemonfiber-core/src/plugin/claimed.rscrates/lemonfiber-plugin/Cargo.tomlcrates/lemonfiber-plugin/src/conforming.rscrates/lemonfiber-plugin/src/error.rs
    cited by
    lemonfiber@172a24e1b2lemonfiber@553353f26e