rastrillo / fiesta Public

Carry Lucide's whole licence, and refuse a stylesheet with no baseline

Review of Task 2, Important 1 and Minor 1.

The Lucide notice was a hybrid: upstream's "ISC License" heading over
the older copyright sentence SEED's icons.go quotes, which names
Feather (MIT) but does not carry the MIT licence. Ten of the twelve
icons are on Lucide's list of glyphs derived from Feather, and MIT
wants its notice in every copy, so the notice has to travel with the
files. icons/LICENSE-lucide.txt is now Lucide's LICENSE verbatim, from
the lucide-static 1.31.0 package (sha256 b495047b...), which is byte
for byte the file estilo carries as brand/LICENSE.lucide on its main.
The icon bytes and the CSS are untouched; only the notice's line in
hack/seed/README.md changes.

TestTheLicenseIsMPL now pins the MIT section by its heading, "The MIT
License (MIT)", its copyright line, "Copyright (c) 2013-present Cole
Bemis", and its grant, "Permission is hereby granted, free of charge".
The review suggested bare "MIT" and "Cole Bemis", but the old file
already contained both, in "Feather (MIT)" and "held by Cole Bemis",
so that control stayed green; the three phrases above turned it red on
the old file and green on the new one.

TestTheSourceIsTheSyncedBaseline named its five files, which guards
against an empty css/, but a sixth file beside them shipped with no
baseline and no complaint. It now also walks css/ and fails on any
file its map does not name. Control: css/extra.css in a scratch copy
fails with "css/extra.css has no baseline twin".
Human

Prompt

Task 2 fix round 1: replace icons/LICENSE-lucide.txt with Lucide's licence verbatim and pin its MIT section in the test; make the baseline test fail on a file under css/ it does not name.

From this commit's own message. The prompt ledger has no entries for it — which is what a squashed, rebased or amended commit looks like, and what every commit looks like in a repo without a ledger.

Summary

Replaces icons/LICENSE-lucide.txt with upstream's LICENSE (ISC plus the Feather list and MIT notice), pins the MIT notice in TestTheLicenseIsMPL, re-hashes it in hack/seed/README.md, and makes TestTheSourceIsTheSyncedBaseline walk css/ and fail on any file outside its map.
Agent notes
The reviewer's suggested strings, bare MIT and Cole Bemis, were already in the old hybrid file and left the test green, so the test pins the MIT heading, copyright line and grant instead.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
claude agent, operated by paul@keymail.dev a06d9e8683492422a99f07d2304b1a20025556b9 parent 0e9be0f
4 files changed, +71 −8
  • check/baseline_test.go +25 −0
  • fiesta_test.go +12 −1
  • hack/seed/README.md +1 −1
  • icons/LICENSE-lucide.txt +33 −6
diff --git a/check/baseline_test.go b/check/baseline_test.go
index f05edee..f4318b5 100644
--- a/check/baseline_test.go
+++ b/check/baseline_test.go
@@ -2,6 +2,7 @@ package check
import (
"bytes"
+ "io/fs"
"os"
"path/filepath"
"testing"
@@ -49,4 +50,28 @@ func TestTheSourceIsTheSyncedBaseline(t *testing.T) {
t.Errorf("css/%s differs from its baseline check/testdata/seed/%s (%d bytes vs %d); the CSS is frozen at the synced commit, so either revert it or sync the baseline with it", src, seed, len(got), len(want))
}
}
+
+ // The other direction: every file under css/ is one of the five.
+ // A stylesheet added beside them would ship with no baseline, and
+ // nothing above would notice it.
+ root := filepath.Join("..", "css")
+ err := filepath.WalkDir(root, func(path string, d fs.DirEntry, err error) error {
+ if err != nil {
+ return err
+ }
+ if d.IsDir() {
+ return nil
+ }
+ rel, err := filepath.Rel(root, path)
+ if err != nil {
+ return err
+ }
+ if _, ok := baseline[filepath.ToSlash(rel)]; !ok {
+ t.Errorf("css/%s has no baseline twin under check/testdata/seed/; every file in css/ is synced from rastrillo and named in this test", filepath.ToSlash(rel))
+ }
+ return nil
+ })
+ if err != nil {
+ t.Fatalf("walking css/: %v", err)
+ }
}
diff --git a/fiesta_test.go b/fiesta_test.go
index a038675..a1e4186 100644
--- a/fiesta_test.go
+++ b/fiesta_test.go
@@ -217,8 +217,19 @@ func TestTheLicenseIsMPL(t *testing.T) {
if embedded := readFS(t, "LICENSE"); !bytes.Equal(lic, embedded) {
t.Errorf("License() differs from FS()'s LICENSE")
}
+ // Lucide's licence is two notices: ISC for Lucide, and Feather's
+ // MIT for the glyphs Lucide took from it, which is ten of these
+ // twelve. Both must travel with the files.
lucide := readFS(t, "icons/LICENSE-lucide.txt")
- for _, want := range []string{"Lucide", "ISC", "Permission to use, copy, modify, and/or distribute"} {
+ // The MIT strings are the notice's own heading, copyright line and
+ // grant, not bare "MIT" and "Cole Bemis": a sentence that merely
+ // mentions Feather (MIT) and names its author carries both of those
+ // without carrying the licence.
+ for _, want := range []string{
+ "Lucide", "ISC", "Permission to use, copy, modify, and/or distribute",
+ "The MIT License (MIT)", "Copyright (c) 2013-present Cole Bemis",
+ "Permission is hereby granted, free of charge",
+ } {
if !bytes.Contains(lucide, []byte(want)) {
t.Errorf("icons/LICENSE-lucide.txt does not mention %q", want)
}
diff --git a/hack/seed/README.md b/hack/seed/README.md
index 6abd193..1c61df9 100644
--- a/hack/seed/README.md
+++ b/hack/seed/README.md
@@ -26,7 +26,7 @@ da0813b4a16af03006d48e6b62a9d0b85531c08167df2e35f17f46b859b859d9 icons/plus.svg
3c6870ab04139a574300d840c08ee2d5dc80c3a79c6111b0fc391c2b6a3b49f2 icons/search.svg
8ff0b67e4566ac9fd6b5caabd226f720452c1d366303fe7b79a6767b6dd47827 icons/x-circle.svg
3c2fa6c229a10acfe4a1f06910dccbc88867e94e0e5a840d33c3a35dc037f6b4 icons/x.svg
-d3b1b8463443c9294de0e37a009106d2d31fb31616aa382951de221f5b47b213 icons/LICENSE-lucide.txt
+b495047bd93a9b06913511076f504daba17d5bbeb3e0650f3bb53a4220329c57 icons/LICENSE-lucide.txt
2deaa9f663d9929cfa9238d60ed0e532dc552313d5838b8e0d076f9991b4907f check/testdata/seed/day.css
c2df2e8ce4fb193ba16dfc058257defd27daf9ac2a0e5309fee4ae30efb5e62a check/testdata/seed/plain.css
566f7dfb5f3907f12b7de92d133e5430ad4537892e9e55578665a849353fb108 check/testdata/seed/shell.css
diff --git a/icons/LICENSE-lucide.txt b/icons/LICENSE-lucide.txt
index 5095901..718bb3f 100644
--- a/icons/LICENSE-lucide.txt
+++ b/icons/LICENSE-lucide.txt
@@ -1,16 +1,43 @@
ISC License
-Copyright (c) for portions of Lucide are held by Cole Bemis 2013-2022 as
-part of Feather (MIT). All other copyright (c) for Lucide are held by
-Lucide Contributors 2022.
+Copyright (c) 2026 Lucide Icons and Contributors
Permission to use, copy, modify, and/or distribute this software for any
purpose with or without fee is hereby granted, provided that the above
-copyright notice and this permission notice appear in all copies. THE
-SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
-REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+copyright notice and this permission notice appear in all copies.
+
+THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+---
+
+The following Lucide icons are derived from the Feather project:
+
+airplay, alert-circle, alert-octagon, alert-triangle, aperture, arrow-down-circle, arrow-down-left, arrow-down-right, arrow-down, arrow-left-circle, arrow-left, arrow-right-circle, arrow-right, arrow-up-circle, arrow-up-left, arrow-up-right, arrow-up, at-sign, calendar, cast, check, chevron-down, chevron-left, chevron-right, chevron-up, chevrons-down, chevrons-left, chevrons-right, chevrons-up, circle, clipboard, clock, code, columns, command, compass, corner-down-left, corner-down-right, corner-left-down, corner-left-up, corner-right-down, corner-right-up, corner-up-left, corner-up-right, crosshair, database, divide-circle, divide-square, dollar-sign, download, external-link, feather, frown, hash, headphones, help-circle, info, italic, key, layout, life-buoy, link-2, link, loader, lock, log-in, log-out, maximize, meh, minimize, minimize-2, minus-circle, minus-square, minus, monitor, moon, more-horizontal, more-vertical, move, music, navigation-2, navigation, octagon, pause-circle, percent, plus-circle, plus-square, plus, power, radio, rss, search, server, share, shopping-bag, sidebar, smartphone, smile, square, table-2, tablet, target, terminal, trash-2, trash, triangle, tv, type, upload, x-circle, x-octagon, x-square, x, zoom-in, zoom-out
+
+The MIT License (MIT) (for the icons listed above)
+
+Copyright (c) 2013-present Cole Bemis
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.