document bundled deps in licenses.yaml; record D-042

Every third-party artefact shipping in the clide binary — fonts,
Dart packages, native tools, bundled assets — now has an entry in
app/assets/licenses.yaml with name, kind, version, homepage, license
identifier, relative path to the bundled license text, and a
one-line purpose. The About screen (Tier 6) will render this file
verbatim. Seeded with the current set: JetBrainsMono, JosefinSans,
yaml, mocktail, alchemist, flutter_lints.

D-042 captures the two-step-commit rule (artefact + licenses.yaml
entry in the same changeset) alongside D-031's prefer-zero-deps
budget: preferring zero deps is the budget; licenses.yaml is the
visible consequence when the budget grows.

CLAUDE.md "Dependencies & supply chain" gains a matching guardrail
line. The per-dep license text files (OFL.txt for both fonts) are
declared as pubspec assets too so the About screen has something to
display, not just a manifest.

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
2026-04-22 08:18:39 +02:00
co-authored by Claude
parent c1ad33f1b0
commit 1b00d88a0d
5 changed files with 118 additions and 5 deletions
+27 -5
View File
@@ -18,15 +18,37 @@ heading, and (b) bumping `project.yaml` `version:` in the same commit.
### Added
- Josefin Sans bundled as `app/assets/fonts/josefin_sans/` as the
application UI face — variable-font pair (upright + italic, weight
range 100-700), OFL-licensed. Declared as the `JosefinSans` family
in `app/pubspec.yaml`. `_AppRoot` installs it as the ambient
`DefaultTextStyle` at weight `w300` (Light) per the project's
aesthetic direction; callers can still pass an explicit
`fontWeight` on `ClideText` to get bolder emphasis.
- JetBrains Mono bundled as `app/assets/fonts/jetbrains_mono/`
Regular / Italic / Bold / BoldItalic weights (OFL-licensed,
license file checked in alongside). Declared as the `JetBrainsMono`
family in `app/pubspec.yaml`. `app/lib/widgets/src/typography.dart`
exposes `clideMonoFamily` + `clideMonoFamilyFallback` for terminal
panes and any other monospace surface; fallback chain covers
macOS / Linux / Windows for the web build path and for harnesses
that don't load asset fonts. Additional weights
(Thin/Light/Medium/ExtraBold) can be added on demand.
exposes `clideUiFamily` + `clideMonoFamily` plus platform-ordered
fallback chains for both faces, for web builds and harnesses that
don't load asset fonts.
- `app/assets/licenses.yaml` — canonical manifest of every bundled
third-party artefact (fonts today; Dart packages + native tools as
they land). Schema has name, kind, version, homepage, license,
`license_file` pointer, and a one-line purpose. Bundled alongside
the per-dep license texts. The About screen (Tier 6) will render
this file verbatim. Accompanied by
[`D-042`](decisions/tooling.md#d-042-bundled-dependencies-documented-in-licensesyaml):
adding a dep is a two-step commit (artefact + `licenses.yaml`
entry in the same changeset).
### Changed
- CLAUDE.md "Dependencies & supply chain" section gains the
"document every bundled dependency" rule, pointing at
`app/assets/licenses.yaml` and `D-042`.
- `ptyc/` — the C PTY-spawn helper, peer of `pql` per
[`D-005`](decisions/architecture.md#d-005-dart-core-sidecar-dissolved-ptyc-as-pql-peer).
+1
View File
@@ -51,6 +51,7 @@ See `docs/initial-plan.md` for the full tier definitions and acceptance criteria
## Dependencies & supply chain
- **Dart (core + app):** prefer-zero-deps. Flutter-SDK widgets first; third-party packages need justification. What stays is exact-pinned in `pubspec.yaml` (no caret ranges). Advisories reviewed before every bump; `pubspec.lock` committed.
- **Document every bundled dependency.** Every third-party artefact that ships in the clide binary — Dart packages, fonts, bundled assets, native supporter tools — is listed in [`app/assets/licenses.yaml`](app/assets/licenses.yaml) with name, kind, version, homepage, license, relative path to the bundled license text, and a one-line purpose. Adding a dep is a two-step commit: add the artefact **and** the `licenses.yaml` entry in the same changeset. The About screen (Tier 6) renders the file verbatim; until then, the list being accurate is the contract. See [`D-042`](decisions/tooling.md#d-042-bundled-dependencies-documented-in-licensesyaml).
- **`ptyc` and any future native supporter tool:** no dep graph by design (libc-only for `ptyc`). "Audit" is reading the source before each bump.
- `pubspec.lock` is always committed.
- `make security` runs the Dart advisory review; `ci/security.sh` is the CI entry.
+76
View File
@@ -0,0 +1,76 @@
# clide — bundled-dependency manifest.
#
# Every third-party artefact that ships in the clide binary is listed
# here: fonts, Dart packages, native supporter tools, bundled data.
# The About screen reads this file and renders the entries verbatim.
#
# Adding a new bundled dependency is a two-step commit:
# 1. Add the dependency itself (font file, `pubspec.yaml` entry, etc.)
# 2. Add the entry below in the same commit, so the About screen stays
# accurate and the prefer-zero-deps guardrail is enforced by the
# obvious visible consequence: an extra row in the list.
#
# See CLAUDE.md "Dependencies & supply chain" for the full rule, and
# `decisions/tooling.md` for the D-record that pins it.
schema_version: 1
dependencies:
- name: JetBrains Mono
kind: font
version: "2.304"
homepage: https://github.com/JetBrains/JetBrainsMono
license: OFL-1.1
license_file: assets/fonts/jetbrains_mono/OFL.txt
purpose: >-
Monospace face for terminal panes, diff views, code editors, and
any other monospace surface.
weights_bundled: [Regular, Italic, Bold, BoldItalic]
- name: Josefin Sans
kind: font
version: "variable"
homepage: https://fonts.google.com/specimen/Josefin+Sans
license: OFL-1.1
license_file: assets/fonts/josefin_sans/OFL.txt
purpose: >-
Application UI face. Default weight Light (300); full 100-700
range available via the variable-font weight axis.
weights_bundled: [VariableFont, Italic-VariableFont]
- name: yaml
kind: dart-package
version: "3.1.3"
homepage: https://pub.dev/packages/yaml
license: MIT
purpose: >-
YAML parser for theme files and extension manifests. The one
justified exception to prefer-zero-deps; Dart-team maintained.
- name: mocktail
kind: dart-package
version: "1.0.4"
homepage: https://pub.dev/packages/mocktail
license: MIT
purpose: >-
Test-only. Mocks at IO / IPC boundaries. ChangeNotifier facades
use hand-rolled fakes instead of mocks (D-025).
scope: dev
- name: alchemist
kind: dart-package
version: "0.12.1"
homepage: https://pub.dev/packages/alchemist
license: MIT
purpose: >-
Test-only. Golden-test framework; Ahem-font rendering for
cross-platform pixel stability on widget primitives (D-024).
scope: dev
- name: flutter_lints
kind: dart-package
version: "6.0.0"
homepage: https://pub.dev/packages/flutter_lints
license: BSD-3-Clause
purpose: Test-only. Flutter-team-recommended analyzer lint set.
scope: dev
+7
View File
@@ -53,6 +53,13 @@ flutter:
assets:
- lib/kernel/src/theme/themes/
- lib/kernel/src/i18n/catalog/
# Bundled-dependency manifest — read by the About screen.
# See CLAUDE.md "Dependencies & supply chain" and D-042.
- assets/licenses.yaml
# License files referenced by licenses.yaml must be bundled too so
# the About screen can display each dependency's full license text.
- assets/fonts/jetbrains_mono/OFL.txt
- assets/fonts/josefin_sans/OFL.txt
# Bundled fonts. OFL-licensed; license files live alongside each.
#
+7
View File
@@ -18,6 +18,13 @@ Toolchain, supply chain, CI, ignore strategy.
- **Cost:** PRs don't run CI yet; `make push-check` is the gate until activation.
- **Raised by:** 2026-04-21 planning.
### D-042: Bundled dependencies documented in `licenses.yaml`
- **Date:** 2026-04-22
- **Decision:** Every third-party artefact bundled into the clide binary — Dart packages, fonts, native supporter tools, bundled data — has an entry in `app/assets/licenses.yaml` with name, kind, version, homepage, license identifier, relative path to the bundled license text, and a one-line purpose. The file is shipped as a Flutter asset and rendered by the About screen (Tier 6). Adding a bundled dependency is a two-step commit: add the artefact **and** the corresponding `licenses.yaml` entry in the same changeset.
- **Rationale:** Complements [D-031](#d-031-prefer-zero-deps-exact-pin). Prefer-zero-deps is a *budget*; `licenses.yaml` is the *visible consequence*. An extra row in the About screen is a review-time signal that the budget just grew. It also discharges the redistribution obligations bundled licenses impose (OFL, MIT, BSD all require preserving the license text alongside the binary) without ad-hoc NOTICE files.
- **Cost:** One extra edit per dep. Zero tolerance for drift — an un-listed dep is a contributor-visible bug. Until the About screen lands at Tier 6, `licenses.yaml` is accurate but not rendered; the discipline applies from now regardless so Tier 6 inherits a clean list.
- **Raised by:** 2026-04-22 planning (user-directed best practice).
### D-033: Golden-output ignore pattern — `coverage.*` excludes output, not scripts
- **Date:** 2026-04-21
- **Decision:** `.gitignore` excludes `coverage.*` (the lcov output files from `flutter test --coverage`). Coverage-related scripts are named `ci/test_coverage.sh` (not `ci/coverage.sh`) to stay outside the pattern.