Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[RFC 0127] Nixpkgs "problem" infrastructure #127

Merged
merged 25 commits into from
Jul 12, 2023
Merged
Changes from 16 commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
60cb23d
[RFC 0127] Nixpkgs issues and warnings (#127)
piegamesde Jun 11, 2022
ee72999
Add URLs as structured information
piegamesde Jun 15, 2022
c109c31
Update rfcs/0127-issues-warnings.md
piegamesde Sep 12, 2022
ff2e2d4
Update rfcs/0127-issues-warnings.md
piegamesde Sep 12, 2022
f83067a
Update rfcs/0127-issues-warnings.md
piegamesde Sep 13, 2022
2daf978
Update rfcs/0127-issues-warnings.md
piegamesde Sep 13, 2022
2b63424
Update rfcs/0127-issues-warnings.md
piegamesde Sep 13, 2022
e5c0e13
Update rfcs/0127-issues-warnings.md
piegamesde Sep 13, 2022
3212d31
RFC 127 update shepherds
piegamesde Sep 13, 2022
ecdbe2c
RFC 127 rework
piegamesde Sep 13, 2022
c907adb
Point out that the previous warnings system was not documented
piegamesde Sep 13, 2022
d232a2d
Rework ignore mechanism
piegamesde Sep 17, 2022
ff6e33d
Update rfcs/0127-issues-warnings.md
piegamesde Oct 14, 2022
6ffce6d
Update rfcs/0127-issues-warnings.md
piegamesde Oct 14, 2022
24a8985
Remove "resolved" attribute again
piegamesde Oct 15, 2022
1b1424e
Incorporate review feedback
piegamesde Oct 15, 2022
1e6725e
Rewrite (again)
piegamesde Dec 12, 2022
81564e6
Rename throw->error, trace->warn
piegamesde Jan 21, 2023
c5c64ec
Make meta.problems an attrset
piegamesde Jan 31, 2023
2a78241
Rewrite *again*, most change is in the configuration options
piegamesde Apr 28, 2023
4f311de
Review update (WIP)
piegamesde May 15, 2023
b253df1
Review update
piegamesde May 30, 2023
7939f49
Update shepherds list
piegamesde Jun 1, 2023
33ec9a6
Meeting update
piegamesde Jun 19, 2023
83319ec
Typos
piegamesde Jun 19, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
199 changes: 199 additions & 0 deletions rfcs/0127-issues-warnings.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,199 @@
---
feature: issues-warnings
start-date: 2022-06-11
author: piegames
co-authors: —
shepherd-team: @lheckemann, @mweinelt, @fgaz
piegamesde marked this conversation as resolved.
Show resolved Hide resolved
shepherd-leader: @mweinelt
related-issues: https://github.com/NixOS/nixpkgs/pull/177272
---

# RFC: Nixpkgs issues and warnings

## Summary
[summary]: #summary

Inspired by the derivation checks for broken and insecure packages, a new system called "warnings" is introduced. It is planned to eventually replace the previously mentioned systems, as well as the current – undocumented – "warnings" (which currently only prints a trace message for unmaintained packages). `meta.issues` is added to derivations, which can be used to let the evaluation of individual packages fail with a custom message. This will then be used to warn users about packages that are in need of maintenance. Packages that have an open issue for a long time should eventually be removed, although doing so is not part of the RFC.

## Motivation
[motivation]: #motivation

Nixpkgs has the problem that it is often treated as "append-only", i.e. packages only get added but not removed. There are a lot of packages that are broken for a long time, have end-of-life dependencies with known security vulnerabilities or that are otherwise unmaintained.

Let's take the end of life of Python 2 as an example. (This applies to other ecosystems as well, and will come up again and again in the future.) It has sparked a few bulk package removal actions by dedicated persons, but those are pretty work intensive and prone to burn out maintainers. A goal of this RFC is to provide a way to notify all users of a package about the outstanding issues. This will hopefully draw more attention to abandoned packages, and spread the work load. It can also help soften the removal of packages by providing a period for users to migrate away at their own pace.
piegamesde marked this conversation as resolved.
Show resolved Hide resolved

Apart from that, there is need for a general per-package warning mechanism in nixpkgs – one that is stronger than `builtins.trace`.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

there is

Who needs it and why? What use case is not served by lib.warn?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

lib.warn can only be used in a limited fashion due to ofborg's clean eval requirement (no warning messages may be printed when doing the normal eval check iirc). We could of course lift this requirement as an alternative.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

(Real) warnings are an important feature, and ofborg must not stop us from using it.

We can make ofborg pass a Nixpkgs config flag to suppress expected warnings. This could be implemented as a list (or nested attrset) of attribute paths that have known issues, that cause ofborg to skip those attributes in its clean eval. aliases.nix can already serve as such a list, combined with a separate list for other issues such as described in this RFC.


## Detailed design
[design]: #detailed-design

### Package issues

A new attribute is added to the `meta` section of a package: `issues`. If present, it is a list of attrsets which each have at least the following fields:
piegamesde marked this conversation as resolved.
Show resolved Hide resolved

- `kind`: Required. If present, the resulting warning will be printed as `kind: message`.
- `message`: Required. A string message describing the issue with the package.
piegamesde marked this conversation as resolved.
Show resolved Hide resolved
- `name`: Optional but recommended. Give the issue a custom name for more easy filtering
- `date`: Required. An ISO 8601 `yyyy-mm-dd`-formatted date from when the issue was added.
- `urls`: Optional, list of strings. Can be used to link issues, pull requests and other related items.
piegamesde marked this conversation as resolved.
Show resolved Hide resolved

Other attributes are allowed. Some message kinds may specify additional required attributes.
piegamesde marked this conversation as resolved.
Show resolved Hide resolved

Example values:

```nix
meta.issues = [
{
name = "python2-eol";
kind = "deprecated";
message = "This package depends on Python 2, which has reached end of life.";
date = "1970-01-01";
urls = [ "https://github.com/NixOS/nixpkgs/issues/148779" ];
}
{
kind = "removal";
message = "The application has been abandoned upstream, use libfoo instead";
piegamesde marked this conversation as resolved.
Show resolved Hide resolved
date = "1970-01-01";
}
];
```

### nixpkgs integration

The following new config options are added to nixpkgs: `config.ignoreWarnings` and `config.traceIgnoredWarnings`. The undocumented option `config.showDerivationWarnings` will be removed. A new environment variable is defined, `NIXPKGS_IGNORE_WARNINGS`.

`ignoreWarnings` is a list of string of the format `packageName.warningKind`. A wildcard '\*' may be used before or after the dot, to ignore all warnings of one kind or all warnings of a package. For issues that have a name, `packageName.issueName` is allowed too. If an issue spans multiple packages, it is recommended to use the same name everywhere so that one may ignore all with `*.issueName`.
piegamesde marked this conversation as resolved.
Show resolved Hide resolved

Similarly to broken, insecure and unfree packages, evaluating a package with an unignored warning fails evaluation. Ignoring resolved warnings results in a trace warning at evaluation time.
piegamesde marked this conversation as resolved.
Show resolved Hide resolved

The previous undocumented warnings system in `check-meta.nix` is removed, together with `showDerivationWarnings`. Instead, ignored warnings are printed with `builtins.trace` depending on the new option `traceIgnoredWarnings`.

### Warning kinds

At the moment, the following values for the `kind` field of a warning are known:

- `removal`: The package is scheduled for removal some time in the future.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'd argue that scheduled removals should not cause an error like this RFC is seemingly proposing. Or why should they?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Think of it as removing a package by adding a removal problem, and then users get some grace period where the package is still available for some time.

- `deprecated`: The package has been abandoned upstream or has end of life dependencies.
piegamesde marked this conversation as resolved.
Show resolved Hide resolved
Copy link
Member

@infinisil infinisil May 15, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't think packages that have EOL dependencies should be marked as deprecated, they can still be maintained while having EOL dependencies.

Suggested change
- `deprecated`: The package has been abandoned upstream or has end of life dependencies.
- `deprecated`: The package is deprecated or abandoned upstream.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The general concept here is correct, although I agree that the name may be misleading. The representative use case for "deprecated" is the Python 2 EOL: some packages can be fixed by upgrading to Python 3 or otherwise removing the Python 2 dependency, others are probably hopeless and doomed.

they can still be maintained while having EOL dependencies.

IMO it's the other way around: packages with EOL dependencies are in need of maintenance

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Also, EOL packages receive security fixes or maintenance only via paid subscriptions usually.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

(But I'm open to an EOL explicit flag.)

Copy link

@bew bew Jun 19, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hello, came to read the rfc after fcp was announced, this is the only thing that bugged me while reading..

It seems there was no conclusion to this comment.

The distinction can be hard to grasp, but I think deprecated and eol/obsolete are clearly different and should be handled differently.

Mozilla's JS docs uses deprecated/obsolete here:

deprecated: still available but planned for removal
obsolete: no longer usable

To me (french, not english-native), obsolete also means that something else took its place. eol would be stronger and wouldn't mean that.

Random guy on english stackexchange says:

Deprecated is more or less a "marker", saying that it should not be used, something else that has the same effect has been created, and it is soon to be deleted. It may still work as expected, but it will vanish soon.
Obsolete means that it no longer works as expected, or doesn't do anything at all.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@bew, I don't see how this distinction is relevant in this context. The idea behind "deprecation" is, that some package has a problem related to software for which upstream dropped support, and thus needs fixing or removal. Whether or not it currently works is not relevant to me, since this is from a maintainer perspective and not a user perspective.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

While I wanted also a distinction, I feel like it's not that important from a maintainer perspective, and I agree with @bew ; though, if, in practice, we found ourselves wanting more, we can always discuss this after extensive experience with that RFC in production.

Copy link

@bew bew Jun 21, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ok for the distinction between deprecated/obsolete/eol.

I'm now also thinking about the wording vs semantic difference between removal and deprecated.

Something that is marked for removal should not be used anymore, this actually looks like the definition of deprecated 🤔

Might be confusing, maybe we can rename:

  • removal to deprecated (or don't use rhe word deprecated at all?)
  • deprecated to obsolete/eol

What do you think? @piegamesde @RaitoBezarius

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm fine with changing names as long as we keep the originally intended semantics. I'd prefer to keep "removal" because it's for things "that are about to be removed" so I find it quite fitting. "removal" is a least resort measure, and "deprecated" would be too weak of a word for it.

I'd be fine with renaming "deprecated" to "obsolete" or "eol". Personally I don't mind "deprecated" and don't think the alternatives are a big improvement, but they're fine so if people prefer it we can do that.

- `maintainerless`: `meta.maintainers` is empty
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This feels a bit weird, because the user could declare problems with this kind, but this should never be done, it's entirely automated. Should users maybe not be allowed to declare this problem kind? And should the name maintainerless be reserved so there's nobody trying to declare their own maintainerless problem with a different kind? Because if not, what should happen when there's already a problem with that name defined but then meta.maintainers becomes empty? Should problems maybe not be declared automatically at all to make sure there's no name inconsistencies?

I feel like this needs a bit more thought.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good point. How about specifying that some kinds are not allowed for manual declaration in meta.problems? I'd nominate maintainerless, broken and unsupported (the latter two are not currently in use either way, they are just reserved for future work)

- `insecure`: The package has some security vulnerabilities
- `broken`: The package is marked as broken
piegamesde marked this conversation as resolved.
Show resolved Hide resolved
piegamesde marked this conversation as resolved.
Show resolved Hide resolved
- `unsupported`: The package is not expected to build on this platform
piegamesde marked this conversation as resolved.
Show resolved Hide resolved

Not all values make sense as issues (i.e. within `meta.issues`): Some warnings may be automatically generated from other `meta` attributes (for example `maintainerless`). New kinds may be added in the future.

## Examples and Interactions
[examples-and-interactions]: #examples-and-interactions

### Package removal

There are two ways issues interact with the removal of packages: Either they get an issue because they are going to be removed, or they are removed because they have an open issue for a prolonged period of time.

- Instead of removing a package directly, it should first get an issue announcing the planned removal. This will allow users to migrate away beforehand. `removal` must be used as `kind` (This will facilitate automation in the future).
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Currently we have the informal "mark it as broken, wait, add alias" system. How is this better for that? rg 'broken\s=true' is easy. Would that be an automatically-generated warning? More future potential.. (more room for metadata → r-ryantm style bot that removes packages that have had certain issues added to them → it can also make those issues)

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That informal system is so informal that I've never heard of it or encountered it in practice, at least not for the use case of removing outdated packages that still technically work otherwise.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I tried to look for references when I posted that but timed out after a minute to continue with the review. Left it here as a future TODO, something for the future work subheading?

- Before branch-off for a new release, all (leaf) packages with issues that predate the previous branch-off are deemed safe for removal via `throw` (unless stated otherwise). If a package is removed based on its issue, the issue's message becomes part of the new `throw` alias.

### Propagation across transitive dependencies

When a package has an issue, all packages that depend on it will fail to evaluate until that package is ignored or the issue resolved. Sometimes, this is sufficient.

When the issue requires actions on dependents however, it does not sufficiently inform about all packages that need action. Marking all dependents with that issue is not a good idea either though: it would require users to go through some potentially long dependency chains. Instead, only applications, leaf packages or packages with very few dependents should get the issue.

As an example, take `gksu` with the `gksu` → `libgksu` → `libglade` → `python2` dependency chain (for the sake of the example, ignore that it also depends on EOL Gtk 2). Obviously, `python2` should get an issue. As a leaf/application, `gksu` should get one too (it could be the same, or with an adpated message). For the packages in between, it depends on whether they require individual action or not.
piegamesde marked this conversation as resolved.
Show resolved Hide resolved

### Backporting

New issues generally should not be added to stable branches if possible, and also not be backported to them, since this breaks evaluation. The same rule applies to other changes to a pacakge's `meta` which may generate a warning and thus lead to evaluation failure too. A notable exception are warnings of kind `insecure`, if there is no fix that can be backported.

## Drawbacks
[drawbacks]: #drawbacks

- People have voiced strong negative opinions about the prospect of removing packages from nixpkgs at all, especially when they still *technically* work.
- We do not want to encourage the use of unmaintained software likely to contain security vulnerabilities, and we do not have the bandwidth to maintain packages deprecated by upstream. Nothing is lost though, because we have complete binary cache coverage of old nixpkgs versions, providing a comparatively easy way to pin old very package versions.
piegamesde marked this conversation as resolved.
Show resolved Hide resolved
Copy link

@ghost ghost Jan 21, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We do not want to encourage the use of unmaintained software

This "unmaintained" boogeyman is a problem endemic to poorly-scoped software. Cough cough browsers cough.

dnscache, tinydns, and runit have been "unmaintained" for over a decade and work better than most of their competitors. The same is true of unfs3, but its alternatives (i.e. in-kernel nfs) can't be run in an unprivileged sandbox, which turns the whole unmainained==insecure on its head.

Is this RFC going to affect their presence in nixpkgs?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is not the kind of "unmaintained" the sentence is referring to. Yes, eventually people may start to enforce maintainers != [] using the features provided by this RFC if they want to, but this will be a new and separate discussion for sure.

This sentence is about all a) packages that are effectively unmaintained, i.e. they require some work to keep going but there is nobody and b) packages that are unmaintained or abandoned by upstream with no hope of fixing.

And no, "unmaintained" does not imply it's insecure by any means. Personally, I'd like to get to a point where we treat "end of life" as kind-of insecure. And this is not only about security, but also about workload: I do not want us to patch things on software if it is end of life, instead we should have a graceful way of removing it from nixpkgs.

- This change is a general improvement in the ecosystem even if we do not end up using it to remove any packages.
- There is a slight long-term maintenance burden. It is expected to be similar to or slightly greater than the maintenance of our deprecation aliases.
piegamesde marked this conversation as resolved.
Show resolved Hide resolved
- We expect that in the long term, having a defined process for removing unmaintained and obsolete packages, especially compared to deciding on a case-by-case basis, is likely to reduce the overall maintenance burden.
piegamesde marked this conversation as resolved.
Show resolved Hide resolved
- Some of the example interactions are built on the premise that parts of nixpkgs are under-maintained, and that most users are at least somewhat involved in the nixpkgs development process. At the time of writing this RFC this is most certainly true, but the effects on this in the future are unknown.
- We hope that drawing attention to packages in need of maintenance can encourage new maintainers -- both from the existing pool of nixpkgs contributors and from non-contributor users -- to step up.
piegamesde marked this conversation as resolved.
Show resolved Hide resolved

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
- "in-band" maintenance of this data means that users have to upgrade their nixpkgs to become aware of new issues.
- The proposed approach has significantly less overhead than designing and maintaining a separate database along with tools to combine its data with nixpkgs. We are open to an alternative approach in the future, but do not want to incur such high maintenance costs at this time.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Add as sub-point: out of band warnings would be impure if they stopped evaluation like they currently do.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I imagine such a tool not blocking evaluation at all, but providing the metadata, comparing it to local policy, annotating the drvs produced with said metadata, and (when used interactively) providing a "continue anyway" knob if anything happens that's not already permitted by local policy.

I don't count that as an impurity, since I don't want it to be able to modify the evaluation results at all -- only observe evaluation and decide what to do afterwards (which also allows getting all the warnings at once, and displaying all those that local policy considers as "blocking" at once).

## Alternatives
piegamesde marked this conversation as resolved.
Show resolved Hide resolved
[alternatives]: #alternatives

An alternative design would be to have issues as a separate list (not part of the package). ~~Instead of allowing individual packages, one could ignore individual warnings (they'd need an identifying number for that). The advantage of doing this is that one could have one issue and apply it for a lot of packages (e.g. "Python 2 is deprecated"). The main drawback there is that it is more complex.~~ The advantages of that approach have been integrated while keeping the downsides small: Warnings are ignored with a per-kind granularity, but one may give some of them a name to allow finer control where necessary.

A few other sketches about how the declaration syntax might look like in different scenarios:

```nix
{
# As proposed in the RFC
meta.issues = [{
kind = "deprecated";
name = "python2-eol";
message = "deprecation: Python 2 is EOL. #12345";
# (Other fields omitted for brevity)
}];

# Issues are defined elsewhere in some nixpkgs-global table, only get referenced in packages
meta.issues = [ "1234-python-deprecation" ];

# Attempt to unify both approaches to allow both ad-hoc and cross-package declaration
meta.issues = {
"1234-python-deprecation" = {
message = "deprecation: Python 2 is deprecated #12345";
};
};

# Proposal by @matthiasbeyer
meta.issues = [
{ transitive = pkgs.python2.issues }
];
}
```

## Unresolved questions
[unresolved]: #unresolved-questions

- ~~From above: "Ignoring a package without issues (i.e. they have all been resolved) results in a warning at evaluation time". How could this be implemented, and efficiently?~~
- ~~More generally, how do we tell users that their ignored warning can be removed, so that they won't accidentally miss future warnings?~~
- ~~Issues have a `resolved` attribute that may be used for that purpose.~~
- Properly implementing this turned out to be non-trivial, so this feature was cut for the sake of simplicity as it was not of hight importance anyways.
- The ignore mechanism has been refined so that there is less risk of missing future warnings.
- ~~Should issues be a list or an attrset?~~·
- We are using a list ~~for now, there is always the possibility to also allow attrsets in the future.~~
- ~~A lot of bike shedding. (See below)~~
- Packages may have "issues" that generate "warnings" that have to be "ignored". Issues are explicitly added to packages in `meta.issues`, whereas warnings can be generated automatically from other sources, like other `meta` attributes.

## Future work
[future]: #future-work

- Issues are designed in a way that they supersede a lot of our "insecure"/"unfree"/"unsupported" packages infrastructure. There is a lot of code duplication between them. In theory, we could migrate some of these to make use of issues. At the very least, we hope that issues are general enough so that no new similar features will have to be added in the future anymore.
- `meta.knownVulnerabilities` is the first candidate to go
- Unfree package handling will probably be out of scope, since we already have some custom filtering based on licences.
- Inspired by the automation of aliases, managing issues can be helped by tooling as well. This is deemed out of scope of this RFC because only real world usage will tell which actions will be worthwhile automating, but it should definitely considered in the future.
- There will likely be need for tooling that lists issues on all nixpkgs packages, filtered by kind or sorted chronologically.
- Automatically removing packages based on time will likely require providing more information whether it is safe to do so or not.
- > If the advisories were a list, and we also added them for modules, maybe we could auto-generate most release notes, and move release notes closer to the code they change. [[source]](https://discourse.nixos.org/t/pre-rfc-package-advisories/19509/4)
- Issues can certainly be automatically integrated into the release notes somehow. However, this alone would not allow us to move most of our release notes into the packages, because for many release entries breaking eval would be overkill.

## Bike shedding
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

"Flag"?

I don't like that "issue" collides with nixpkgs's github-based issue tracking.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thinking outside the box here. Perhaps these terms might be useful?

gate, inhibitor, flaw, condition, concern

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

How about calling the nixpkgs config option simply by what it does, maybe something like checkMetaHandler? Because I think this is the only user-facing place where this entire "feature" needs a name. (For the package side, I still think "issues" is the least bad name so far)


*Note: the bike shedding phase is considered over.*
piegamesde marked this conversation as resolved.
Show resolved Hide resolved

Here are a few naming proposals, and how well they would be suited to describe different conditions. "broken" and "unsupported" must be acknowledged but – unlike the others – don't imply some required user action. "unfree" is somewhat out of scope because it is unlikely to be replaced anytime soon.

| Kind | Currently | "Issue" | "Warning" | "Problem" | "Advisory" |
|-------------|-----------|---------|-----------|-----------|------------|
|insecure | `meta.knownVulnerabilities` |✅|✅|✅|✅|
|unmaintained | `meta.maintainers = []` |✅|✅|❓|❓|
|deprecated | n/a |✅|✅|✅|❓|
|removal | n/a |❓|✅|✅|❓|
|||||||
|broken | `meta.broken` |✅|❌|✅|❌|
|unsupported | `meta.platforms` |✅|❓|✅|❌|
|||||||
|unfree | `meta.license` |✅|✅|❌|❓|


"Advisory" was initially chosen based on the notion of security advisories, but was later dismissed as the project grew in scope. "Issue" and "Problem" are similar words, of which the former is a well-known technical term¹ which should be preferred here.

"Issue" and "Warning" are both good candidates, of which the former implies some required action whereas the latter merely wants to inform. In the end, we decided that packages should have *issues* which should produce *warnings* that can be *ignored*. While this distinction may be a bit unintuitive, it will make it easier to generate warnings from things that are not explicitly marked as issues (e.g. missing maintainers).

¹ Non-native speakers: look up the difference between "issue" and "problem" in English :)