$ /nix/store/vzx1mi9c0xfadmsm9dhd83d005cb1qs9-coreutils-9.8/bin/timeout --kill-after=15s 1800s /nix/store/99b1z08awpxj8b6mzggn59gp1shljnff-nix-2.34.5/bin/nix --extra-experimental-features nix-command --extra-experimental-features flakes --log-format internal-json build --no-link git+https://github.com/sellout/flaky?ref=docs&rev=a96b4cd7cf38ec7286758e03fd2e4dacc2befe62#checks.x86_64-linux.formatter --print-build-logs warning: ignoring untrusted flake configuration setting 'allow-import-from-derivation'. Pass '--accept-flake-config' to trust it warning: ignoring untrusted flake configuration setting 'extra-experimental-features'. Pass '--accept-flake-config' to trust it warning: ignoring untrusted flake configuration setting 'extra-substituters'. Pass '--accept-flake-config' to trust it warning: ignoring untrusted flake configuration setting 'extra-trusted-public-keys'. Pass '--accept-flake-config' to trust it warning: ignoring untrusted flake configuration setting 'sandbox'. Pass '--accept-flake-config' to trust it warning: ignoring untrusted flake configuration setting 'use-registries'. Pass '--accept-flake-config' to trust it  Building treefmt-check [treefmt-check] treefmt v2.4.0traversed 66 files [treefmt-check] emitted 52 files for processing [treefmt-check] formatted 52 files (4 changed) in 351ms [treefmt-check]  M docs/CONTRIBUTING.md [treefmt-check]  M docs/CONTRIBUTING/haskell.md [treefmt-check]  M docs/haskell/release-process.md [treefmt-check]  M docs/haskell/strict-PVP.md [treefmt-check] diff --git a/docs/CONTRIBUTING.md b/docs/CONTRIBUTING.md [treefmt-check] index 2b499f5..5465a5d 100644 [treefmt-check] --- a/docs/CONTRIBUTING.md [treefmt-check] +++ b/docs/CONTRIBUTING.md [treefmt-check] @@ -25,10 +25,10 @@ All contributions are welcome, we love improvements to docs and tests. [treefmt-check]  ### terminology [treefmt-check]   [treefmt-check]  | generic | Haskell | Nix | Rust | versioned | [treefmt-check] -|------------|---------------|------------|-----------|-----------| [treefmt-check] -| repository | | | | ✔ | [treefmt-check] +| ---------- | ------------- | ---------- | --------- | --------- | [treefmt-check] +| repository | | | | ✔ | [treefmt-check]  | project | Cabal project | flake | workspace | | [treefmt-check] -| package | Cabal package | derivation | crate | ✔ | [treefmt-check] +| package | Cabal package | derivation | crate | ✔ | [treefmt-check]  | component | Cabal stanza | | | | [treefmt-check]   [treefmt-check]  There is usually one project per repository, but sometimes a project may be split across multiple repositories. It’s unlikely that more than one project would be in the same repository. [treefmt-check] diff --git a/docs/CONTRIBUTING/haskell.md b/docs/CONTRIBUTING/haskell.md [treefmt-check] index d62443d..210aff7 100644 [treefmt-check] --- a/docs/CONTRIBUTING/haskell.md [treefmt-check] +++ b/docs/CONTRIBUTING/haskell.md [treefmt-check] @@ -50,7 +50,7 @@ Documentation is very important, but it shouldn’t detract from good naming. Th [treefmt-check]   [treefmt-check]  Documentation is written using [Haddock](https://haskell-haddock.readthedocs.io/), and it’s helpful to add Doctest examples, as described in the “testing” section below. [treefmt-check]   [treefmt-check] -__NB__: Haddock isn’t Markdown! But the similarities can make it easy to forget sometimes. Please try to review your doc changes using [`cabal haddock-project`](https://cabal.readthedocs.io/en/stable/cabal-commands.html#cabal-haddock-project) before submitting them. [treefmt-check] +**NB**: Haddock isn’t Markdown! But the similarities can make it easy to forget sometimes. Please try to review your doc changes using [`cabal haddock-project`](https://cabal.readthedocs.io/en/stable/cabal-commands.html#cabal-haddock-project) before submitting them. [treefmt-check]   [treefmt-check]  #### guidelines [treefmt-check]   [treefmt-check] @@ -93,7 +93,7 @@ name foo [treefmt-check]  library [treefmt-check]  ``` [treefmt-check]   [treefmt-check] -``` cabal [treefmt-check] +```cabal [treefmt-check]  name: foo-hedgehog [treefmt-check]   [treefmt-check]  library [treefmt-check] diff --git a/docs/haskell/release-process.md b/docs/haskell/release-process.md [treefmt-check] index c761703..e08874f 100644 [treefmt-check] --- a/docs/haskell/release-process.md [treefmt-check] +++ b/docs/haskell/release-process.md [treefmt-check] @@ -20,7 +20,7 @@ Don’t lump documentation & testing improvements into a breaking change just be [treefmt-check]   [treefmt-check]  ### format the PR title as a CHANGELOG entry [treefmt-check]   [treefmt-check] -__TODO__: How does this work when there are multiple packages? [treefmt-check] +**TODO**: How does this work when there are multiple packages? [treefmt-check]   [treefmt-check]  ## release updates [treefmt-check]   [treefmt-check] @@ -37,7 +37,6 @@ In as far as the release is automated, the changes should be made in the merge c [treefmt-check]   [treefmt-check]  [^1]: This is delicate, because the CI build matrix doesn’t do a good job of solving for other versions of local packages. [treefmt-check]   [treefmt-check] - [treefmt-check]  ## Hackage info [treefmt-check]   [treefmt-check]  Hackage allows you to optionally tag a release as “preferred” or ”deprecated”. [treefmt-check] diff --git a/docs/haskell/strict-PVP.md b/docs/haskell/strict-PVP.md [treefmt-check] index 3a74ff8..78079d7 100644 [treefmt-check] --- a/docs/haskell/strict-PVP.md [treefmt-check] +++ b/docs/haskell/strict-PVP.md [treefmt-check] @@ -2,10 +2,10 @@ [treefmt-check]   [treefmt-check]  This is a versioning system that’s compatible with [the Haskell Package Versioning Policy](https://pvp.haskell.org/), but tries to prevent more issues with dependencies. [treefmt-check]   [treefmt-check] -The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in [RFC 2119](https://datatracker.ietf.org/doc/html/rfc2119). [treefmt-check] +The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in [RFC 2119](https://datatracker.ietf.org/doc/html/rfc2119). [treefmt-check]   [treefmt-check]  1. TOC [treefmt-check] -{:toc} [treefmt-check] + {:toc} [treefmt-check]   [treefmt-check]  ## terminology [treefmt-check]   [treefmt-check] @@ -54,6 +54,7 @@ This largely follows the [Haskell Package Versioning Policy](https://pvp.haskell [treefmt-check]  The package version always has four components, `A.B.C.D`[^1]. The first three correspond to those required by PVP, while the fourth matches the “patch” component from [Semantic Versioning](https://semver.org/). [treefmt-check]   [treefmt-check]  [^1]: A mnemonic for the version components in strict PVP: [treefmt-check] + [treefmt-check]  - bumping `A` affects **A**ll dependencies, [treefmt-check]  - bumping `B` **B**reaks something, [treefmt-check]  - bumping `C` is a **C**ompatible change, and [treefmt-check] @@ -116,11 +117,11 @@ Each of these cases is covered in the following sections with justifications, bu [treefmt-check]  - a “persisting” type or class means that the type or class existed in a release prior to the addition, or continues to exist in the release containing the removal [treefmt-check]   [treefmt-check]  | | add | remove | syntax-only[^2] | note | [treefmt-check] -|-----------------------------------------:|-------------|---------|-----------------|------------------------------------------------------------------------------------------------------------| [treefmt-check] -| [`import`](#imports) | `A`/`C`/`D` | `A`/`D` | ✔ | `C` when it’s part of a new module, `D` when there is persisting import for the same module | [treefmt-check] +| ---------------------------------------: | ----------- | ------- | --------------- | ---------------------------------------------------------------------------------------------------------- | [treefmt-check] +| [`import`](#imports) | `A`/`C`/`D` | `A`/`D` | ✔ | `C` when it’s part of a new module, `D` when there is persisting import for the same module | [treefmt-check]  | [`instance`](#instances) | `A`/`C` | `A` | | only when applied to persisting types & classes, `C` when it’s part of a new module | [treefmt-check] -| [`module`](#modules) | `C` | `A`/`B` | ✔ | `B` when the removed module had _zero_ imports | [treefmt-check] -| `-Werror` | `A`* | `D` | | **NB**: If you use `-Werror`, any change to the package is an `A` change | [treefmt-check] +| [`module`](#modules) | `C` | `A`/`B` | ✔ | `B` when the removed module had _zero_ imports | [treefmt-check] +| `-Werror` | `A`\* | `D` | | **NB**: If you use `-Werror`, any change to the package is an `A` change | [treefmt-check]  | `-fpackage-trust` | `A` | `D` | | | [treefmt-check]  | [constructor](#constructors) | `B`/`C` | `B` | | only when applied to persisting type, `C` when there were previously no exported constructors for the type | [treefmt-check]  | field | `B` | `B` | | only when applied to persisting type | [treefmt-check] @@ -137,9 +138,9 @@ Each of these cases is covered in the following sections with justifications, bu [treefmt-check]  | Haddock | `D` | `D` | | | [treefmt-check]   [treefmt-check]  | | tighten | weaken | syntax-only[^2] | note | [treefmt-check] -|-----------------------------------:|---------|---------|-----------------|------------------------------------------------------------------------------------------| [treefmt-check] +| ---------------------------------: | ------- | ------- | --------------- | ---------------------------------------------------------------------------------------- | [treefmt-check]  | license | `A` | `C` | | | [treefmt-check] -| [dependency bound](#dependencies) | `D` | `A`/`D` | ✔ | `A` when new `A` or non-strict `B` version is supported, and for certain other libraries | [treefmt-check] +| [dependency bound](#dependencies) | `D` | `A`/`D` | ✔ | `A` when new `A` or non-strict `B` version is supported, and for certain other libraries | [treefmt-check]  | [compiler bound](#compiler-bounds) | `B`/`D` | `D` | | `D` when “guarded” by a corresponding non-reinstallable dependency tightening | [treefmt-check]  | [constraint](#constraints) | `B` | `D` | | **TODO**: type variable defaulting may be an issue here | [treefmt-check]  | `type role` | `B` | `D` | ? | “inferred” should be treated as between `representational` and `phantom` | [treefmt-check] @@ -286,7 +287,7 @@ Haskell does type resolution independently of constraints. It then sees if the t [treefmt-check]   [treefmt-check]  This is a good example of the difference between “additions to the API” and “non-breaking changes to the API”. This makes a function applicable in more situations, but doesn’t add anything to the API. [treefmt-check]   [treefmt-check] -**FIXME**: I think this might not be true with [type variable defaulting](https://downloads.haskell.org/ghc/latest/docs/users_guide/exts/type_defaulting.html). For example, if you weaken a constraint from `RealFloat` to `Num`, and a consumer is using `default (Natural, Double)`, the switch from resolving `Double` to resolving `Natural` can then introduce a runtime failure when they call `negate`. There are mechanisms to disable defaulting, like `default ()` or requiring `-Werror=type-defaults`, but those must be applied in the consumer, not the definer. [treefmt-check] +**FIXME**: I think this might not be true with [type variable defaulting](https://downloads.haskell.org/ghc/latest/docs/users_guide/exts/type_defaulting.html). For example, if you weaken a constraint from `RealFloat` to `Num`, and a consumer is using `default (Natural, Double)`, the switch from resolving `Double` to resolving `Natural` can then introduce a runtime failure when they call `negate`. There are mechanisms to disable defaulting, like `default ()` or requiring `-Werror=type-defaults`, but those must be applied in the consumer, not the definer. [treefmt-check]   [treefmt-check]  ## incompatible extensions [treefmt-check]   Progress: 0 of 1 built (1 failed) Cannot build '/nix/store/cphzr48kdqahlws1qlbqd4mfdd4018d6-treefmt-check.drv'. Reason: builder failed with exit code 1. Output paths: /nix/store/s4bvgaq37kvkamvw1x93dnzm077g0wfq-treefmt-check Last 130 log lines: > treefmt v2.4.0traversed 66 files > emitted 52 files for processing > formatted 52 files (4 changed) in 351ms > M docs/CONTRIBUTING.md > M docs/CONTRIBUTING/haskell.md > M docs/haskell/release-process.md > M docs/haskell/strict-PVP.md > diff --git a/docs/CONTRIBUTING.md b/docs/CONTRIBUTING.md > index 2b499f5..5465a5d 100644 > --- a/docs/CONTRIBUTING.md > +++ b/docs/CONTRIBUTING.md > @@ -25,10 +25,10 @@ All contributions are welcome, we love improvements to docs and tests. > ### terminology >  > | generic | Haskell | Nix | Rust | versioned | > -|------------|---------------|------------|-----------|-----------| > -| repository | | | | ✔ | > +| ---------- | ------------- | ---------- | --------- | --------- | > +| repository | | | | ✔ | > | project | Cabal project | flake | workspace | | > -| package | Cabal package | derivation | crate | ✔ | > +| package | Cabal package | derivation | crate | ✔ | > | component | Cabal stanza | | | | >  > There is usually one project per repository, but sometimes a project may be split across multiple repositories. It’s unlikely that more than one project would be in the same repository. > diff --git a/docs/CONTRIBUTING/haskell.md b/docs/CONTRIBUTING/haskell.md > index d62443d..210aff7 100644 > --- a/docs/CONTRIBUTING/haskell.md > +++ b/docs/CONTRIBUTING/haskell.md > @@ -50,7 +50,7 @@ Documentation is very important, but it shouldn’t detract from good naming. Th >  > Documentation is written using [Haddock](https://haskell-haddock.readthedocs.io/), and it’s helpful to add Doctest examples, as described in the “testing” section below. >  > -__NB__: Haddock isn’t Markdown! But the similarities can make it easy to forget sometimes. Please try to review your doc changes using [`cabal haddock-project`](https://cabal.readthedocs.io/en/stable/cabal-commands.html#cabal-haddock-project) before submitting them. > +**NB**: Haddock isn’t Markdown! But the similarities can make it easy to forget sometimes. Please try to review your doc changes using [`cabal haddock-project`](https://cabal.readthedocs.io/en/stable/cabal-commands.html#cabal-haddock-project) before submitting them. >  > #### guidelines >  > @@ -93,7 +93,7 @@ name foo > library > ``` >  > -``` cabal > +```cabal > name: foo-hedgehog >  > library > diff --git a/docs/haskell/release-process.md b/docs/haskell/release-process.md > index c761703..e08874f 100644 > --- a/docs/haskell/release-process.md > +++ b/docs/haskell/release-process.md > @@ -20,7 +20,7 @@ Don’t lump documentation & testing improvements into a breaking change just be >  > ### format the PR title as a CHANGELOG entry >  > -__TODO__: How does this work when there are multiple packages? > +**TODO**: How does this work when there are multiple packages? >  > ## release updates >  > @@ -37,7 +37,6 @@ In as far as the release is automated, the changes should be made in the merge c >  > [^1]: This is delicate, because the CI build matrix doesn’t do a good job of solving for other versions of local packages. >  > - > ## Hackage info >  > Hackage allows you to optionally tag a release as “preferred” or ”deprecated”. > diff --git a/docs/haskell/strict-PVP.md b/docs/haskell/strict-PVP.md > index 3a74ff8..78079d7 100644 > --- a/docs/haskell/strict-PVP.md > +++ b/docs/haskell/strict-PVP.md > @@ -2,10 +2,10 @@ >  > This is a versioning system that’s compatible with [the Haskell Package Versioning Policy](https://pvp.haskell.org/), but tries to prevent more issues with dependencies. >  > -The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in [RFC 2119](https://datatracker.ietf.org/doc/html/rfc2119). > +The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in [RFC 2119](https://datatracker.ietf.org/doc/html/rfc2119). >  > 1. TOC > -{:toc} > + {:toc} >  > ## terminology >  > @@ -54,6 +54,7 @@ This largely follows the [Haskell Package Versioning Policy](https://pvp.haskell > The package version always has four components, `A.B.C.D`[^1]. The first three correspond to those required by PVP, while the fourth matches the “patch” component from [Semantic Versioning](https://semver.org/). >  > [^1]: A mnemonic for the version components in strict PVP: > + > - bumping `A` affects **A**ll dependencies, > - bumping `B` **B**reaks something, > - bumping `C` is a **C**ompatible change, and > @@ -116,11 +117,11 @@ Each of these cases is covered in the following sections with justifications, bu > - a “persisting” type or class means that the type or class existed in a release prior to the addition, or continues to exist in the release containing the removal >  > | | add | remove | syntax-only[^2] | note | > -|-----------------------------------------:|-------------|---------|-----------------|------------------------------------------------------------------------------------------------------------| > -| [`import`](#imports) | `A`/`C`/`D` | `A`/`D` | ✔ | `C` when it’s part of a new module, `D` when there is persisting import for the same module | > +| ---------------------------------------: | ----------- | ------- | --------------- | ---------------------------------------------------------------------------------------------------------- | > +| [`import`](#imports) | `A`/`C`/`D` | `A`/`D` | ✔ | `C` when it’s part of a new module, `D` when there is persisting import for the same module | > | [`instance`](#instances) | `A`/`C` | `A` | | only when applied to persisting types & classes, `C` when it’s part of a new module | > -| [`module`](#modules) | `C` | `A`/`B` | ✔ | `B` when the removed module had _zero_ imports | > -| `-Werror` | `A`* | `D` | | **NB**: If you use `-Werror`, any change to the package is an `A` change | > +| [`module`](#modules) | `C` | `A`/`B` | ✔ | `B` when the removed module had _zero_ imports | > +| `-Werror` | `A`\* | `D` | | **NB**: If you use `-Werror`, any change to the package is an `A` change | > | `-fpackage-trust` | `A` | `D` | | | > | [constructor](#constructors) | `B`/`C` | `B` | | only when applied to persisting type, `C` when there were previously no exported constructors for the type | > | field | `B` | `B` | | only when applied to persisting type | > @@ -137,9 +138,9 @@ Each of these cases is covered in the following sections with justifications, bu > | Haddock | `D` | `D` | | | >  > | | tighten | weaken | syntax-only[^2] | note | > -|-----------------------------------:|---------|---------|-----------------|------------------------------------------------------------------------------------------| > +| ---------------------------------: | ------- | ------- | --------------- | ---------------------------------------------------------------------------------------- | > | license | `A` | `C` | | | > -| [dependency bound](#dependencies) | `D` | `A`/`D` | ✔ | `A` when new `A` or non-strict `B` version is supported, and for certain other libraries | > +| [dependency bound](#dependencies) | `D` | `A`/`D` | ✔ | `A` when new `A` or non-strict `B` version is supported, and for certain other libraries | > | [compiler bound](#compiler-bounds) | `B`/`D` | `D` | | `D` when “guarded” by a corresponding non-reinstallable dependency tightening | > | [constraint](#constraints) | `B` | `D` | | **TODO**: type variable defaulting may be an issue here | > | `type role` | `B` | `D` | ? | “inferred” should be treated as between `representational` and `phantom` | > @@ -286,7 +287,7 @@ Haskell does type resolution independently of constraints. It then sees if the t >  > This is a good example of the difference between “additions to the API” and “non-breaking changes to the API”. This makes a function applicable in more situations, but doesn’t add anything to the API. >  > -**FIXME**: I think this might not be true with [type variable defaulting](https://downloads.haskell.org/ghc/latest/docs/users_guide/exts/type_defaulting.html). For example, if you weaken a constraint from `RealFloat` to `Num`, and a consumer is using `default (Natural, Double)`, the switch from resolving `Double` to resolving `Natural` can then introduce a runtime failure when they call `negate`. There are mechanisms to disable defaulting, like `default ()` or requiring `-Werror=type-defaults`, but those must be applied in the consumer, not the definer. > +**FIXME**: I think this might not be true with [type variable defaulting](https://downloads.haskell.org/ghc/latest/docs/users_guide/exts/type_defaulting.html). For example, if you weaken a constraint from `RealFloat` to `Num`, and a consumer is using `default (Natural, Double)`, the switch from resolving `Double` to resolving `Natural` can then introduce a runtime failure when they call `negate`. There are mechanisms to disable defaulting, like `default ()` or requiring `-Werror=type-defaults`, but those must be applied in the consumer, not the definer. >  > ## incompatible extensions >  For full logs, run: nix log /nix/store/cphzr48kdqahlws1qlbqd4mfdd4018d6-treefmt-check.drv