build checks.x86_64-linux.formatter

  1. 0.04 s $ /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=f6b35bb45791aad5df3ee05b49627d7bda9a8291#checks.x86_64-linux.formatter --print-build-logs
  2. 0.07 s warning: ignoring untrusted flake configuration setting 'allow-import-from-derivation'.
  3. 0.07 s Pass '--accept-flake-config' to trust it
  4. 0.07 s warning: ignoring untrusted flake configuration setting 'extra-experimental-features'.
  5. 0.07 s Pass '--accept-flake-config' to trust it
  6. 0.07 s warning: ignoring untrusted flake configuration setting 'extra-substituters'.
  7. 0.07 s Pass '--accept-flake-config' to trust it
  8. 0.07 s warning: ignoring untrusted flake configuration setting 'extra-trusted-public-keys'.
  9. 0.07 s Pass '--accept-flake-config' to trust it
  10. 0.07 s warning: ignoring untrusted flake configuration setting 'sandbox'.
  11. 0.07 s Pass '--accept-flake-config' to trust it
  12. 0.07 s warning: ignoring untrusted flake configuration setting 'use-registries'.
  13. 0.07 s Pass '--accept-flake-config' to trust it
  14. 0.07 s
  15. 0.20 s Building treefmt-check
  16. 0.66 s [treefmt-check] treefmt v2.4.0traversed 66 files
  17. 0.66 s [treefmt-check] emitted 52 files for processing
  18. 0.66 s [treefmt-check] formatted 52 files (4 changed) in 347ms
  19. 0.67 s [treefmt-check] M docs/CONTRIBUTING.md
  20. 0.67 s [treefmt-check] M docs/CONTRIBUTING/haskell.md
  21. 0.67 s [treefmt-check] M docs/haskell-release-process.md
  22. 0.67 s [treefmt-check] M docs/haskell-strict-PVP.md
  23. 0.67 s [treefmt-check] diff --git a/docs/CONTRIBUTING.md b/docs/CONTRIBUTING.md
  24. 0.67 s [treefmt-check] index 2b499f5..5465a5d 100644
  25. 0.67 s [treefmt-check] --- a/docs/CONTRIBUTING.md
  26. 0.67 s [treefmt-check] +++ b/docs/CONTRIBUTING.md
  27. 0.67 s [treefmt-check] @@ -25,10 +25,10 @@ All contributions are welcome, we love improvements to docs and tests.
  28. 0.67 s [treefmt-check] ### terminology
  29. 0.67 s [treefmt-check]
  30. 0.67 s [treefmt-check] | generic | Haskell | Nix | Rust | versioned |
  31. 0.67 s [treefmt-check] -|------------|---------------|------------|-----------|-----------|
  32. 0.67 s [treefmt-check] -| repository | | | | ✔ |
  33. 0.67 s [treefmt-check] +| ---------- | ------------- | ---------- | --------- | --------- |
  34. 0.67 s [treefmt-check] +| repository | | | | ✔ |
  35. 0.67 s [treefmt-check] | project | Cabal project | flake | workspace | |
  36. 0.67 s [treefmt-check] -| package | Cabal package | derivation | crate | ✔ |
  37. 0.67 s [treefmt-check] +| package | Cabal package | derivation | crate | ✔ |
  38. 0.67 s [treefmt-check] | component | Cabal stanza | | | |
  39. 0.67 s [treefmt-check]
  40. 0.67 s [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.
  41. 0.67 s [treefmt-check] diff --git a/docs/CONTRIBUTING/haskell.md b/docs/CONTRIBUTING/haskell.md
  42. 0.67 s [treefmt-check] index 963d786..4592132 100644
  43. 0.67 s [treefmt-check] --- a/docs/CONTRIBUTING/haskell.md
  44. 0.67 s [treefmt-check] +++ b/docs/CONTRIBUTING/haskell.md
  45. 0.67 s [treefmt-check] @@ -50,7 +50,7 @@ Documentation is very important, but it shouldn’t detract from good naming. Th
  46. 0.67 s [treefmt-check]
  47. 0.67 s [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.
  48. 0.67 s [treefmt-check]
  49. 0.67 s [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.
  50. 0.67 s [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.
  51. 0.67 s [treefmt-check]
  52. 0.67 s [treefmt-check] #### guidelines
  53. 0.67 s [treefmt-check]
  54. 0.67 s [treefmt-check] @@ -93,7 +93,7 @@ name foo
  55. 0.67 s [treefmt-check] library
  56. 0.67 s [treefmt-check] ```
  57. 0.67 s [treefmt-check]
  58. 0.67 s [treefmt-check] -``` cabal
  59. 0.67 s [treefmt-check] +```cabal
  60. 0.67 s [treefmt-check] name: foo-hedgehog
  61. 0.67 s [treefmt-check]
  62. 0.67 s [treefmt-check] library
  63. 0.67 s [treefmt-check] diff --git a/docs/haskell-release-process.md b/docs/haskell-release-process.md
  64. 0.67 s [treefmt-check] index c761703..e08874f 100644
  65. 0.67 s [treefmt-check] --- a/docs/haskell-release-process.md
  66. 0.67 s [treefmt-check] +++ b/docs/haskell-release-process.md
  67. 0.67 s [treefmt-check] @@ -20,7 +20,7 @@ Don’t lump documentation & testing improvements into a breaking change just be
  68. 0.67 s [treefmt-check]
  69. 0.67 s [treefmt-check] ### format the PR title as a CHANGELOG entry
  70. 0.67 s [treefmt-check]
  71. 0.67 s [treefmt-check] -__TODO__: How does this work when there are multiple packages?
  72. 0.67 s [treefmt-check] +**TODO**: How does this work when there are multiple packages?
  73. 0.67 s [treefmt-check]
  74. 0.67 s [treefmt-check] ## release updates
  75. 0.68 s [treefmt-check]
  76. 0.68 s [treefmt-check] @@ -37,7 +37,6 @@ In as far as the release is automated, the changes should be made in the merge c
  77. 0.68 s [treefmt-check]
  78. 0.68 s [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.
  79. 0.68 s [treefmt-check]
  80. 0.68 s [treefmt-check] -
  81. 0.68 s [treefmt-check] ## Hackage info
  82. 0.68 s [treefmt-check]
  83. 0.68 s [treefmt-check] Hackage allows you to optionally tag a release as “preferred” or ”deprecated”.
  84. 0.68 s [treefmt-check] diff --git a/docs/haskell-strict-PVP.md b/docs/haskell-strict-PVP.md
  85. 0.68 s [treefmt-check] index 3a74ff8..78079d7 100644
  86. 0.68 s [treefmt-check] --- a/docs/haskell-strict-PVP.md
  87. 0.68 s [treefmt-check] +++ b/docs/haskell-strict-PVP.md
  88. 0.68 s [treefmt-check] @@ -2,10 +2,10 @@
  89. 0.68 s [treefmt-check]
  90. 0.68 s [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.
  91. 0.68 s [treefmt-check]
  92. 0.68 s [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).
  93. 0.68 s [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).
  94. 0.68 s [treefmt-check]
  95. 0.68 s [treefmt-check] 1. TOC
  96. 0.68 s [treefmt-check] -{:toc}
  97. 0.68 s [treefmt-check] + {:toc}
  98. 0.68 s [treefmt-check]
  99. 0.68 s [treefmt-check] ## terminology
  100. 0.68 s [treefmt-check]
  101. 0.68 s [treefmt-check] @@ -54,6 +54,7 @@ This largely follows the [Haskell Package Versioning Policy](https://pvp.haskell
  102. 0.68 s [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/).
  103. 0.68 s [treefmt-check]
  104. 0.68 s [treefmt-check] [^1]: A mnemonic for the version components in strict PVP:
  105. 0.68 s [treefmt-check] +
  106. 0.68 s [treefmt-check] - bumping `A` affects **A**ll dependencies,
  107. 0.68 s [treefmt-check] - bumping `B` **B**reaks something,
  108. 0.68 s [treefmt-check] - bumping `C` is a **C**ompatible change, and
  109. 0.68 s [treefmt-check] @@ -116,11 +117,11 @@ Each of these cases is covered in the following sections with justifications, bu
  110. 0.68 s [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
  111. 0.68 s [treefmt-check]
  112. 0.68 s [treefmt-check] | | add | remove | syntax-only[^2] | note |
  113. 0.68 s [treefmt-check] -|-----------------------------------------:|-------------|---------|-----------------|------------------------------------------------------------------------------------------------------------|
  114. 0.68 s [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 |
  115. 0.68 s [treefmt-check] +| ---------------------------------------: | ----------- | ------- | --------------- | ---------------------------------------------------------------------------------------------------------- |
  116. 0.68 s [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 |
  117. 0.68 s [treefmt-check] | [`instance`](#instances) | `A`/`C` | `A` | | only when applied to persisting types & classes, `C` when it’s part of a new module |
  118. 0.68 s [treefmt-check] -| [`module`](#modules) | `C` | `A`/`B` | ✔ | `B` when the removed module had _zero_ imports |
  119. 0.68 s [treefmt-check] -| `-Werror` | `A`* | `D` | | **NB**: If you use `-Werror`, any change to the package is an `A` change |
  120. 0.68 s [treefmt-check] +| [`module`](#modules) | `C` | `A`/`B` | ✔ | `B` when the removed module had _zero_ imports |
  121. 0.68 s [treefmt-check] +| `-Werror` | `A`\* | `D` | | **NB**: If you use `-Werror`, any change to the package is an `A` change |
  122. 0.68 s [treefmt-check] | `-fpackage-trust` | `A` | `D` | | |
  123. 0.68 s [treefmt-check] | [constructor](#constructors) | `B`/`C` | `B` | | only when applied to persisting type, `C` when there were previously no exported constructors for the type |
  124. 0.68 s [treefmt-check] | field | `B` | `B` | | only when applied to persisting type |
  125. 0.68 s [treefmt-check] @@ -137,9 +138,9 @@ Each of these cases is covered in the following sections with justifications, bu
  126. 0.68 s [treefmt-check] | Haddock | `D` | `D` | | |
  127. 0.68 s [treefmt-check]
  128. 0.68 s [treefmt-check] | | tighten | weaken | syntax-only[^2] | note |
  129. 0.68 s [treefmt-check] -|-----------------------------------:|---------|---------|-----------------|------------------------------------------------------------------------------------------|
  130. 0.68 s [treefmt-check] +| ---------------------------------: | ------- | ------- | --------------- | ---------------------------------------------------------------------------------------- |
  131. 0.68 s [treefmt-check] | license | `A` | `C` | | |
  132. 0.68 s [treefmt-check] -| [dependency bound](#dependencies) | `D` | `A`/`D` | ✔ | `A` when new `A` or non-strict `B` version is supported, and for certain other libraries |
  133. 0.68 s [treefmt-check] +| [dependency bound](#dependencies) | `D` | `A`/`D` | ✔ | `A` when new `A` or non-strict `B` version is supported, and for certain other libraries |
  134. 0.68 s [treefmt-check] | [compiler bound](#compiler-bounds) | `B`/`D` | `D` | | `D` when “guarded” by a corresponding non-reinstallable dependency tightening |
  135. 0.68 s [treefmt-check] | [constraint](#constraints) | `B` | `D` | | **TODO**: type variable defaulting may be an issue here |
  136. 0.68 s [treefmt-check] | `type role` | `B` | `D` | ? | “inferred” should be treated as between `representational` and `phantom` |
  137. 0.68 s [treefmt-check] @@ -286,7 +287,7 @@ Haskell does type resolution independently of constraints. It then sees if the t
  138. 0.68 s [treefmt-check]
  139. 0.68 s [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.
  140. 0.68 s [treefmt-check]
  141. 0.68 s [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.
  142. 0.68 s [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.
  143. 0.68 s [treefmt-check]
  144. 0.68 s [treefmt-check] ## incompatible extensions
  145. 0.68 s [treefmt-check]
  146. 0.69 s Progress: 0 of 1 built (1 failed)
  147. 0.69 s Cannot build '/nix/store/frnlvb7k9m08i4ln26r9dmp09rf9p7pl-treefmt-check.drv'.
  148. 0.69 s Reason: builder failed with exit code 1.
  149. 0.69 s Output paths:
  150. 0.69 s /nix/store/58c5vcv88kilhkdqpif4cyrri1y00wmv-treefmt-check
  151. 0.69 s Last 130 log lines:
  152. 0.69 s > treefmt v2.4.0traversed 66 files
  153. 0.69 s > emitted 52 files for processing
  154. 0.69 s > formatted 52 files (4 changed) in 347ms
  155. 0.69 s > M docs/CONTRIBUTING.md
  156. 0.69 s > M docs/CONTRIBUTING/haskell.md
  157. 0.69 s > M docs/haskell-release-process.md
  158. 0.69 s > M docs/haskell-strict-PVP.md
  159. 0.69 s > diff --git a/docs/CONTRIBUTING.md b/docs/CONTRIBUTING.md
  160. 0.69 s > index 2b499f5..5465a5d 100644
  161. 0.69 s > --- a/docs/CONTRIBUTING.md
  162. 0.69 s > +++ b/docs/CONTRIBUTING.md
  163. 0.69 s > @@ -25,10 +25,10 @@ All contributions are welcome, we love improvements to docs and tests.
  164. 0.69 s > ### terminology
  165. 0.69 s >
  166. 0.69 s > | generic | Haskell | Nix | Rust | versioned |
  167. 0.69 s > -|------------|---------------|------------|-----------|-----------|
  168. 0.69 s > -| repository | | | | ✔ |
  169. 0.69 s > +| ---------- | ------------- | ---------- | --------- | --------- |
  170. 0.69 s > +| repository | | | | ✔ |
  171. 0.69 s > | project | Cabal project | flake | workspace | |
  172. 0.69 s > -| package | Cabal package | derivation | crate | ✔ |
  173. 0.69 s > +| package | Cabal package | derivation | crate | ✔ |
  174. 0.69 s > | component | Cabal stanza | | | |
  175. 0.69 s >
  176. 0.69 s > 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.
  177. 0.69 s > diff --git a/docs/CONTRIBUTING/haskell.md b/docs/CONTRIBUTING/haskell.md
  178. 0.69 s > index 963d786..4592132 100644
  179. 0.69 s > --- a/docs/CONTRIBUTING/haskell.md
  180. 0.69 s > +++ b/docs/CONTRIBUTING/haskell.md
  181. 0.69 s > @@ -50,7 +50,7 @@ Documentation is very important, but it shouldn’t detract from good naming. Th
  182. 0.69 s >
  183. 0.69 s > 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.
  184. 0.69 s >
  185. 0.69 s > -__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.
  186. 0.69 s > +**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.
  187. 0.69 s >
  188. 0.69 s > #### guidelines
  189. 0.69 s >
  190. 0.69 s > @@ -93,7 +93,7 @@ name foo
  191. 0.69 s > library
  192. 0.69 s > ```
  193. 0.69 s >
  194. 0.69 s > -``` cabal
  195. 0.69 s > +```cabal
  196. 0.69 s > name: foo-hedgehog
  197. 0.69 s >
  198. 0.69 s > library
  199. 0.69 s > diff --git a/docs/haskell-release-process.md b/docs/haskell-release-process.md
  200. 0.69 s > index c761703..e08874f 100644
  201. 0.69 s > --- a/docs/haskell-release-process.md
  202. 0.69 s > +++ b/docs/haskell-release-process.md
  203. 0.69 s > @@ -20,7 +20,7 @@ Don’t lump documentation & testing improvements into a breaking change just be
  204. 0.69 s >
  205. 0.69 s > ### format the PR title as a CHANGELOG entry
  206. 0.69 s >
  207. 0.69 s > -__TODO__: How does this work when there are multiple packages?
  208. 0.69 s > +**TODO**: How does this work when there are multiple packages?
  209. 0.69 s >
  210. 0.69 s > ## release updates
  211. 0.69 s >
  212. 0.69 s > @@ -37,7 +37,6 @@ In as far as the release is automated, the changes should be made in the merge c
  213. 0.69 s >
  214. 0.69 s > [^1]: This is delicate, because the CI build matrix doesn’t do a good job of solving for other versions of local packages.
  215. 0.69 s >
  216. 0.69 s > -
  217. 0.69 s > ## Hackage info
  218. 0.69 s >
  219. 0.69 s > Hackage allows you to optionally tag a release as “preferred” or ”deprecated”.
  220. 0.69 s > diff --git a/docs/haskell-strict-PVP.md b/docs/haskell-strict-PVP.md
  221. 0.69 s > index 3a74ff8..78079d7 100644
  222. 0.69 s > --- a/docs/haskell-strict-PVP.md
  223. 0.69 s > +++ b/docs/haskell-strict-PVP.md
  224. 0.69 s > @@ -2,10 +2,10 @@
  225. 0.69 s >
  226. 0.69 s > 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.
  227. 0.69 s >
  228. 0.69 s > -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).
  229. 0.69 s > +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).
  230. 0.69 s >
  231. 0.69 s > 1. TOC
  232. 0.69 s > -{:toc}
  233. 0.69 s > + {:toc}
  234. 0.69 s >
  235. 0.69 s > ## terminology
  236. 0.69 s >
  237. 0.69 s > @@ -54,6 +54,7 @@ This largely follows the [Haskell Package Versioning Policy](https://pvp.haskell
  238. 0.69 s > 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/).
  239. 0.69 s >
  240. 0.69 s > [^1]: A mnemonic for the version components in strict PVP:
  241. 0.69 s > +
  242. 0.69 s > - bumping `A` affects **A**ll dependencies,
  243. 0.69 s > - bumping `B` **B**reaks something,
  244. 0.69 s > - bumping `C` is a **C**ompatible change, and
  245. 0.69 s > @@ -116,11 +117,11 @@ Each of these cases is covered in the following sections with justifications, bu
  246. 0.69 s > - 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
  247. 0.69 s >
  248. 0.69 s > | | add | remove | syntax-only[^2] | note |
  249. 0.69 s > -|-----------------------------------------:|-------------|---------|-----------------|------------------------------------------------------------------------------------------------------------|
  250. 0.69 s > -| [`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 |
  251. 0.69 s > +| ---------------------------------------: | ----------- | ------- | --------------- | ---------------------------------------------------------------------------------------------------------- |
  252. 0.69 s > +| [`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 |
  253. 0.69 s > | [`instance`](#instances) | `A`/`C` | `A` | | only when applied to persisting types & classes, `C` when it’s part of a new module |
  254. 0.69 s > -| [`module`](#modules) | `C` | `A`/`B` | ✔ | `B` when the removed module had _zero_ imports |
  255. 0.69 s > -| `-Werror` | `A`* | `D` | | **NB**: If you use `-Werror`, any change to the package is an `A` change |
  256. 0.69 s > +| [`module`](#modules) | `C` | `A`/`B` | ✔ | `B` when the removed module had _zero_ imports |
  257. 0.69 s > +| `-Werror` | `A`\* | `D` | | **NB**: If you use `-Werror`, any change to the package is an `A` change |
  258. 0.69 s > | `-fpackage-trust` | `A` | `D` | | |
  259. 0.69 s > | [constructor](#constructors) | `B`/`C` | `B` | | only when applied to persisting type, `C` when there were previously no exported constructors for the type |
  260. 0.69 s > | field | `B` | `B` | | only when applied to persisting type |
  261. 0.69 s > @@ -137,9 +138,9 @@ Each of these cases is covered in the following sections with justifications, bu
  262. 0.69 s > | Haddock | `D` | `D` | | |
  263. 0.69 s >
  264. 0.69 s > | | tighten | weaken | syntax-only[^2] | note |
  265. 0.69 s > -|-----------------------------------:|---------|---------|-----------------|------------------------------------------------------------------------------------------|
  266. 0.69 s > +| ---------------------------------: | ------- | ------- | --------------- | ---------------------------------------------------------------------------------------- |
  267. 0.69 s > | license | `A` | `C` | | |
  268. 0.69 s > -| [dependency bound](#dependencies) | `D` | `A`/`D` | ✔ | `A` when new `A` or non-strict `B` version is supported, and for certain other libraries |
  269. 0.69 s > +| [dependency bound](#dependencies) | `D` | `A`/`D` | ✔ | `A` when new `A` or non-strict `B` version is supported, and for certain other libraries |
  270. 0.69 s > | [compiler bound](#compiler-bounds) | `B`/`D` | `D` | | `D` when “guarded” by a corresponding non-reinstallable dependency tightening |
  271. 0.69 s > | [constraint](#constraints) | `B` | `D` | | **TODO**: type variable defaulting may be an issue here |
  272. 0.69 s > | `type role` | `B` | `D` | ? | “inferred” should be treated as between `representational` and `phantom` |
  273. 0.69 s > @@ -286,7 +287,7 @@ Haskell does type resolution independently of constraints. It then sees if the t
  274. 0.69 s >
  275. 0.69 s > 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.
  276. 0.69 s >
  277. 0.69 s > -**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.
  278. 0.69 s > +**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.
  279. 0.69 s >
  280. 0.69 s > ## incompatible extensions
  281. 0.69 s >
  282. 0.69 s For full logs, run:
  283. 0.69 s nix log /nix/store/frnlvb7k9m08i4ln26r9dmp09rf9p7pl-treefmt-check.drv