Ctrl K
ComunidadGuías…

docs/compatibility.md

Rama main · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
# Compatibility and versioning

What you can rely on across versions, what is free to change, and how changes
are announced. Written before 1.0 on purpose: the moment to fix a promise is
while `0.x` still allows it.

## The public surface

A change here is **breaking** and needs a major version (or, before 1.0, a
CHANGELOG entry that says so):

| Surface | What it is | Where it is defined |
|---|---|---|
| CLI flags | names, arguments, semantics | [docs/cli.md](cli.md), `--help` |
| Exit codes | `0` nothing serious, `1` high/medium findings, `2` errors | [docs/cli.md](cli.md) |
| JSON report | `schemaVersion: 1`, top-level keys, types | `--schema`, `src/schema.js` |
| Finding codes | the stable identity (`disk/full`, `fs/btrfs-errors`) | [docs/checks.md](checks.md), pinned by `tests/codes-registry.test.js` |
| Config file | documented keys in `~/.config/linux-doctor/config.json` (ignore list, thresholds) | [docs/configuration.md](configuration.md) |
| Threshold names | the keys accepted by the config and `--thresholds-set` | [docs/configuration.md](configuration.md) |
| Check (plugin) shape | `id`, `title`, `category`, `appliesTo`, `run(ctx)` and the finding fields | [docs/configuration.md](configuration.md#plugins-custom-checks) |
| Pro loader contract | `init(core) → { checks, licensing }` | [CONTRIBUTING.md](../CONTRIBUTING.md) |
| Support bundle | `kind: "support-bundle"`, `schemaVersion: 1` | [docs/integrations.md](integrations.md) |

**Finding codes deserve their own sentence.** They are what `--ignore-code`,
the history diff (`new` / `fixed`) and the dashboard's saved state key on. A
renamed code silently breaks a user's ignore list and marks an old problem as
new again, so a rename is a breaking change even though it looks cosmetic.

### The JSON report

The schema ships with the tool (`linux-doctor --schema`) and its policy is
already enforced in code (`src/schema.js`):

- **Additive changes do not bump `schemaVersion`.** New optional properties are
  fine; consumers must ignore unknown properties.
- **Adding a required property, removing one, or narrowing a type** bumps the
  version and updates the schema document in the same change.
- Every emitted top-level key stays documented, and
  `tests/output-drift.test.js` fails when the report and the schema disagree.

## What is internal

No promise is made about these, in any release:

- anything under `src/` that is not listed above (module layout, helper names);
- the wording of `detail`, `fix` and `evidence` (they are prose, and improve
  over time);
- the layout and ordering of the terminal report, and `--help` text;
- run durations, `--profile` numbers, and anything in `--debug` output;
- the check list itself: checks are added, and a check may change its
  thresholds as evidence accumulates.

## Versioning

- **`0.x` (today).** Anything may change, as SemVer allows. Breaking changes
  are still called out in the CHANGELOG under `Changed` or `Removed` with a
  one-line migration note, because a surprise is a bug even when it is allowed.
- **From `1.0`.** Semantic Versioning: patch = fixes, minor = additive,
  major = breaking with a migration note in the release.

## Deprecation

When something public has to go:

1. announce it in the CHANGELOG;
2. keep it working, with a one-line warning on stderr, for at least one minor
   release;
3. remove it only in a major (before 1.0, in a minor whose CHANGELOG entry says
   it is breaking).

This applies to flags, config keys, finding codes and schema fields alike.

## Release trains

- **Fixes ship when they are ready.** A wrong finding, a security issue or a
  crash is not held back for a cadence: a diagnostic that lies is worse than a
  version number that is a few days early. See the checklist in
  [RELEASING.md](RELEASING.md).
- **Features are batched** into minors, from the `[Unreleased]` section, on the
  order of weeks.
- **Majors are rare** and carry a migration section.

## What we will not do

- Rename a finding code because a prettier name exists.
- Add a required field to the JSON, or narrow a type, without bumping
  `schemaVersion`.
- Change a plugin's shape or the Pro loader contract in a patch.
- Treat "it is only `0.x`" as licence to break things quietly. The label is
  permission to move fast, not to surprise people.