36b - §8, §9 and §14's decisions move to docs/decisions.md #136

Merged
lilleman merged 4 commits from 36b into main 2026-09-28 10:23:08 +02:00
2 changed files with 3 additions and 5 deletions
Showing only changes of commit e5771bc60b - Show all commits
+2 -4
View File
@@ -210,8 +210,7 @@ switches on `code` with no `default`.
`unsupported-node-shape` — since a code no input reaches is one no consumer can switch on `unsupported-node-shape` — since a code no input reaches is one no consumer can switch on
(2026-09-20). (2026-09-20).
- A refusal no spelling recovers from is a gap in the flavour rather than a code: give the flavour - A refusal no spelling recovers from is a gap in the flavour rather than a code: give the flavour
the spelling and the code goes, which the freeze is the last moment for (`unspellable-link`, the spelling and the code goes (`unspellable-link`, 2026-09-13). A cause the carry answers gets no code: a mark no spelling writes rides the carry
2026-09-13). A cause the carry answers gets no code: a mark no spelling writes rides the carry
with its node. with its node.
## Which code a cause takes ## Which code a cause takes
@@ -268,8 +267,7 @@ token.
`package.json` version on `main` is the source of truth. CI on `main`: tests green and version `package.json` version on `main` is the source of truth. CI on `main`: tests green and version
differs from npm → publish and tag `vX.Y.Z`. No bump, no deploy; the bump is each shipping PR's differs from npm → publish and tag `vX.Y.Z`. No bump, no deploy; the bump is each shipping PR's
deliberate semver judgment. `publish.sh` is that job, and `private: true` stops it before it reads deliberate semver judgment. `publish.sh` is that job.
the token, so the pipeline is live and silent until the maintainer's first bump drops the field.
The publish and the tag each observe their own end state — the version on npm, the tag on the The publish and the tag each observe their own end state — the version on npm, the tag on the
remote — and neither gates the other, so a run that dies between them converges on the next push remote — and neither gates the other, so a run that dies between them converges on the next push
+1 -1
View File
@@ -25,7 +25,7 @@ function calledCodes(): string[] {
return [...called].sort() return [...called].sort()
} }
// The list is frozen at 0.1.0 (docs/decisions.md §The code list), so a code outliving its cause is a removal that costs a MAJOR. // Removing a code is breaking (docs/decisions.md §The code list), so a code must not outlive its cause.
test('every ConvertErrorCode is the code of a production call site, and every call site names a declared one', () => { test('every ConvertErrorCode is the code of a production call site, and every call site names a declared one', () => {
assert.deepEqual(calledCodes(), declaredCodes()) assert.deepEqual(calledCodes(), declaredCodes())
}) })