$ /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  error (ignored): SQLite database '/var/cache/private/nix-ci-worker/eval-cache-v6/8ceed62d0b1a6b31696e43d1d018c42608618d599f107bd80bcb171d1bc88fcb.sqlite' is busy Downloading cached source from https://cache.nix-ci.com Progress: 1 of 1 downloaded from cache  Downloading cached git-2.51.2-doc from https://cache.nix-ci.com Downloading cached iana-etc from https://cache.nix-ci.com Downloading cached mailcap from https://cache.nix-ci.com Downloading cached perl5.40.0-Digest-HMAC from https://cache.nix-ci.com Downloading cached perl5.40.0-FCGI-ProcManager from https://cache.nix-ci.com Downloading cached perl5.40.0-HTML-TagCloud from https://cache.nix-ci.com Downloading cached perl5.40.0-URI from https://cache.nix-ci.com Downloading cached perl5.40.0-libnet from https://cache.nix-ci.com Downloading cached tzdata from https://cache.nix-ci.com Downloading cached bash from https://cache.nix-ci.com Downloading cached expat from https://cache.nix-ci.com Downloading cached gawk from https://cache.nix-ci.com Downloading cached gnu-config-2024-01 from https://cache.nix-ci.com Downloading cached perl5.40.0-Encode-Locale from https://cache.nix-ci.com Downloading cached perl5.40.0-HTML-Tagset from https://cache.nix-ci.com Downloading cached perl5.40.0-IO-HTML from https://cache.nix-ci.com Progress: 0 of 8 built, 1 of 97 downloaded from cache (15 downloading) Downloading cached alejandra from https://cache.nix-ci.com Progress: 0 of 8 built, 2 of 97 downloaded from cache (15 downloading) Downloading cached bzip2-1.0.8-bin from https://cache.nix-ci.com Progress: 0 of 8 built, 3 of 97 downloaded from cache (15 downloading) Downloading cached curl from https://cache.nix-ci.com Progress: 0 of 8 built, 4 of 97 downloaded from cache (15 downloading) Downloading cached ed from https://cache.nix-ci.com Progress: 0 of 8 built, 5 of 97 downloaded from cache (15 downloading) Downloading cached file from https://cache.nix-ci.com Progress: 0 of 8 built, 6 of 97 downloaded from cache (15 downloading) Downloading cached gdbm-1.26-lib from https://cache.nix-ci.com Progress: 0 of 8 built, 7 of 97 downloaded from cache (15 downloading) Downloading cached gmp-with-cxx from https://cache.nix-ci.com Progress: 0 of 8 built, 8 of 97 downloaded from cache (15 downloading) Downloading cached gmp-with-cxx from https://cache.nix-ci.com Progress: 0 of 8 built, 9 of 97 downloaded from cache (15 downloading) Downloading cached git-lfs from https://cache.nix-ci.com Progress: 0 of 8 built, 10 of 97 downloaded from cache (15 downloading) Downloading cached gnugrep from https://cache.nix-ci.com Progress: 0 of 8 built, 11 of 97 downloaded from cache (15 downloading) Downloading cached gnumake from https://cache.nix-ci.com Progress: 0 of 8 built, 12 of 97 downloaded from cache (15 downloading) Downloading cached gnused from https://cache.nix-ci.com Progress: 0 of 8 built, 13 of 97 downloaded from cache (15 downloading) Downloading cached gnutar from https://cache.nix-ci.com Progress: 0 of 8 built, 14 of 97 downloaded from cache (15 downloading) Downloading cached icu4c from https://cache.nix-ci.com Progress: 0 of 7 built, 15 of 97 downloaded from cache (15 downloading) Downloading cached gettext from https://cache.nix-ci.com Progress: 0 of 7 built, 16 of 97 downloaded from cache (15 downloading) Downloading cached gzip from https://cache.nix-ci.com Progress: 0 of 7 built, 17 of 97 downloaded from cache (15 downloading) Downloading cached json-c from https://cache.nix-ci.com Progress: 0 of 7 built, 18 of 97 downloaded from cache (15 downloading) Downloading cached keep-sorted from https://cache.nix-ci.com Progress: 0 of 7 built, 19 of 97 downloaded from cache (15 downloading) Downloading cached libffi from https://cache.nix-ci.com Progress: 0 of 7 built, 20 of 97 downloaded from cache (15 downloading) Downloading cached libuv from https://cache.nix-ci.com Progress: 0 of 7 built, 21 of 97 downloaded from cache (15 downloading) Downloading cached libxcrypt from https://cache.nix-ci.com Progress: 0 of 7 built, 22 of 97 downloaded from cache (15 downloading) Downloading cached mpdecimal from https://cache.nix-ci.com Progress: 0 of 7 built, 23 of 97 downloaded from cache (15 downloading) Downloading cached ncurses from https://cache.nix-ci.com Progress: 0 of 7 built, 24 of 97 downloaded from cache (15 downloading) Downloading cached coreutils from https://cache.nix-ci.com Progress: 0 of 7 built, 25 of 97 downloaded from cache (15 downloading) Downloading cached numactl from https://cache.nix-ci.com Progress: 0 of 7 built, 26 of 97 downloaded from cache (15 downloading) Downloading cached openssl-3.6.1-bin from https://cache.nix-ci.com Progress: 0 of 7 built, 27 of 97 downloaded from cache (15 downloading) Downloading cached patch from https://cache.nix-ci.com Progress: 0 of 7 built, 28 of 97 downloaded from cache (15 downloading) Downloading cached patchelf from https://cache.nix-ci.com Progress: 0 of 7 built, 29 of 97 downloaded from cache (15 downloading) Downloading cached perl5.40.0-Clone from https://cache.nix-ci.com Progress: 0 of 6 built, 30 of 97 downloaded from cache (15 downloading) Downloading cached perl5.40.0-Crypt-URandom from https://cache.nix-ci.com Progress: 0 of 6 built, 31 of 97 downloaded from cache (15 downloading) Downloading cached perl5.40.0-FCGI from https://cache.nix-ci.com Progress: 0 of 6 built, 32 of 97 downloaded from cache (15 downloading) Downloading cached elfutils from https://cache.nix-ci.com Progress: 0 of 6 built, 33 of 97 downloaded from cache (15 downloading) Downloading cached perl5.40.0-LWP-MediaTypes from https://cache.nix-ci.com Progress: 0 of 6 built, 34 of 97 downloaded from cache (15 downloading) Downloading cached perl5.40.0-Mozilla-CA from https://cache.nix-ci.com Progress: 0 of 6 built, 35 of 97 downloaded from cache (15 downloading) Downloading cached perl5.40.0-Net-HTTP from https://cache.nix-ci.com Progress: 0 of 6 built, 36 of 97 downloaded from cache (15 downloading) Downloading cached libuv-1.51.0-dev from https://cache.nix-ci.com Progress: 0 of 6 built, 37 of 97 downloaded from cache (15 downloading) Downloading cached perl5.40.0-Net-SSLeay from https://cache.nix-ci.com Progress: 0 of 6 built, 38 of 97 downloaded from cache (15 downloading) Downloading cached perl5.40.0-TermReadKey from https://cache.nix-ci.com Progress: 0 of 6 built, 39 of 97 downloaded from cache (15 downloading) Downloading cached perl5.40.0-Test-Needs from https://cache.nix-ci.com Progress: 0 of 6 built, 40 of 97 downloaded from cache (15 downloading) Downloading cached diffutils from https://cache.nix-ci.com Progress: 0 of 6 built, 41 of 97 downloaded from cache (15 downloading) Downloading cached findutils from https://cache.nix-ci.com Progress: 0 of 6 built, 42 of 97 downloaded from cache (15 downloading) Downloading cached perl from https://cache.nix-ci.com Progress: 0 of 6 built, 43 of 97 downloaded from cache (15 downloading) Downloading cached openssl-3.6.1-dev from https://cache.nix-ci.com Progress: 0 of 6 built, 44 of 97 downloaded from cache (15 downloading) Downloading cached perl5.40.0-Test-RequiresInternet from https://cache.nix-ci.com Progress: 0 of 6 built, 45 of 97 downloaded from cache (15 downloading) Downloading cached perl5.40.0-Authen-SASL from https://cache.nix-ci.com Progress: 0 of 6 built, 46 of 97 downloaded from cache (15 downloading) Downloading cached perl5.40.0-TimeDate from https://cache.nix-ci.com Progress: 0 of 6 built, 47 of 97 downloaded from cache (15 downloading) Downloading cached perl5.40.0-Try-Tiny from https://cache.nix-ci.com Progress: 0 of 6 built, 48 of 97 downloaded from cache (15 downloading) Downloading cached perl5.40.0-WWW-RobotRules from https://cache.nix-ci.com Progress: 0 of 6 built, 49 of 97 downloaded from cache (15 downloading) Downloading cached shfmt from https://cache.nix-ci.com Progress: 0 of 6 built, 50 of 97 downloaded from cache (15 downloading) Downloading cached shellcheck-0.11.0-bin from https://cache.nix-ci.com Progress: 0 of 6 built, 51 of 97 downloaded from cache (15 downloading) Downloading cached sqlite-3.50.4-bin from https://cache.nix-ci.com Progress: 0 of 6 built, 52 of 97 downloaded from cache (15 downloading) Downloading cached perl5.40.0-IO-Socket-SSL from https://cache.nix-ci.com Progress: 0 of 6 built, 53 of 97 downloaded from cache (15 downloading) Downloading cached readline from https://cache.nix-ci.com Progress: 0 of 6 built, 54 of 97 downloaded from cache (15 downloading) Downloading cached treefmt from https://cache.nix-ci.com Progress: 0 of 6 built, 55 of 97 downloaded from cache (15 downloading) Downloading cached update-autotools-gnu-config-scripts-hook from https://cache.nix-ci.com Progress: 0 of 6 built, 56 of 97 downloaded from cache (15 downloading) Downloading cached perl5.40.0-HTTP-Date from https://cache.nix-ci.com Progress: 0 of 6 built, 57 of 97 downloaded from cache (15 downloading) Downloading cached util-linux-minimal-2.41.3-lib from https://cache.nix-ci.com Progress: 0 of 6 built, 58 of 97 downloaded from cache (15 downloading) Downloading cached xz-5.8.1-bin from https://cache.nix-ci.com Progress: 0 of 6 built, 59 of 97 downloaded from cache (15 downloading) Downloading cached zlib-1.3.1-dev from https://cache.nix-ci.com Progress: 0 of 6 built, 60 of 97 downloaded from cache (15 downloading) Downloading cached zlib-ng from https://cache.nix-ci.com Progress: 0 of 6 built, 61 of 97 downloaded from cache (15 downloading) Downloading cached perl5.40.0-Test-Fatal from https://cache.nix-ci.com Progress: 0 of 6 built, 62 of 97 downloaded from cache (15 downloading) Downloading cached perl5.40.0-Net-SMTP-SSL from https://cache.nix-ci.com Progress: 0 of 6 built, 63 of 97 downloaded from cache (15 downloading) Progress: 0 of 6 built, 64 of 97 downloaded from cache (14 downloading) Downloading cached sqlite-3.50.4-dev from https://cache.nix-ci.com Progress: 0 of 6 built, 65 of 97 downloaded from cache (14 downloading) Progress: 0 of 6 built, 66 of 97 downloaded from cache (13 downloading) Downloading cached perl5.40.0-File-Listing from https://cache.nix-ci.com Downloading cached perl5.40.0-HTTP-CookieJar from https://cache.nix-ci.com Downloading cached perl5.40.0-HTTP-Message from https://cache.nix-ci.com Progress: 0 of 6 built, 67 of 97 downloaded from cache (15 downloading) Progress: 0 of 6 built, 68 of 97 downloaded from cache (14 downloading) Downloading cached stdenv-linux from https://cache.nix-ci.com Progress: 0 of 6 built, 69 of 97 downloaded from cache (14 downloading) Downloading cached bash-interactive from https://cache.nix-ci.com Progress: 0 of 6 built, 70 of 97 downloaded from cache (14 downloading) Progress: 0 of 6 built, 71 of 97 downloaded from cache (13 downloading) Downloading cached python3 from https://cache.nix-ci.com Progress: 0 of 6 built, 72 of 97 downloaded from cache (13 downloading) Progress: 0 of 6 built, 73 of 97 downloaded from cache (12 downloading) Progress: 0 of 6 built, 74 of 97 downloaded from cache (11 downloading) Progress: 0 of 6 built, 75 of 97 downloaded from cache (10 downloading) Progress: 0 of 6 built, 76 of 97 downloaded from cache (9 downloading) Progress: 0 of 6 built, 77 of 97 downloaded from cache (8 downloading) Progress: 0 of 6 built, 78 of 97 downloaded from cache (7 downloading) Progress: 0 of 6 built, 79 of 97 downloaded from cache (6 downloading) Downloading cached perl5.40.0-HTML-Parser from https://cache.nix-ci.com Downloading cached perl5.40.0-HTTP-Cookies from https://cache.nix-ci.com Downloading cached perl5.40.0-HTTP-Daemon from https://cache.nix-ci.com Downloading cached perl5.40.0-HTTP-Negotiate from https://cache.nix-ci.com Progress: 0 of 6 built, 80 of 97 downloaded from cache (9 downloading) Progress: 0 of 5 built, 81 of 97 downloaded from cache (8 downloading) Progress: 0 of 4 built, 82 of 97 downloaded from cache (7 downloading) Progress: 0 of 4 built, 83 of 97 downloaded from cache (6 downloading) Progress: 0 of 4 built, 84 of 97 downloaded from cache (5 downloading) Progress: 0 of 4 built, 85 of 97 downloaded from cache (4 downloading) Progress: 0 of 4 built, 86 of 97 downloaded from cache (3 downloading) Downloading cached perl5.40.0-CGI from https://cache.nix-ci.com Progress: 0 of 4 built, 87 of 97 downloaded from cache (3 downloading) Downloading cached perl5.40.0-CGI-Fast from https://cache.nix-ci.com Progress: 0 of 4 built, 88 of 97 downloaded from cache (3 downloading) Progress: 0 of 4 built, 89 of 97 downloaded from cache (2 downloading) Downloading cached icu4c-76.1-dev from https://cache.nix-ci.com Progress: 0 of 4 built, 90 of 97 downloaded from cache (2 downloading) Downloading cached nodejs from https://cache.nix-ci.com Progress: 0 of 4 built, 91 of 97 downloaded from cache (2 downloading) Downloading cached perl5.40.0-libwww-perl from https://cache.nix-ci.com Progress: 0 of 4 built, 92 of 97 downloaded from cache (2 downloading) Progress: 0 of 4 built, 93 of 97 downloaded from cache (1 downloading) Downloading cached git from https://cache.nix-ci.com Progress: 0 of 4 built, 94 of 97 downloaded from cache (1 downloading) Downloading cached prettier from https://cache.nix-ci.com Progress: 0 of 4 built, 95 of 97 downloaded from cache (1 downloading) Progress: 0 of 3 built, 96 of 97 downloaded from cache Downloading cached treefmt.toml from https://cache.nix-ci.com Progress: 0 of 3 built, 97 of 97 downloaded from cache Building treefmt [post-build-hook] Uploading to cachix cache "sellout": /nix/store/ym27pkkkqpacc3hwbh0xsfiry1f0yhbc-treefmt [post-build-hook] Nothing to push - all store paths are already on Cachix. [post-build-hook] Uploading to the NixCI cache: /nix/store/ym27pkkkqpacc3hwbh0xsfiry1f0yhbc-treefmt [post-build-hook] warning: 'warn-short-path-literals' is deprecated, use 'lint-short-path-literals = ignore' instead [post-build-hook] copying 0 paths... [post-build-hook] warning: 'warn-short-path-literals' is deprecated, use 'lint-short-path-literals = ignore' instead [post-build-hook] copying 0 paths... Progress: 1 of 3 built, 97 of 97 downloaded from cache 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 391ms [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: 1 of 2 built (1 failed), 97 of 97 downloaded from cache 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 391ms > 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