rusty-figlet 0.3.4

Render ASCII-art banners from text — a Rust port of cmatsuoka's `figlet(6)` v2.2.5 with an in-house FIGfont 2.0 parser, all six horizontal smush rules + universal, 12 bundled `.flf` fonts via `include_bytes!`, terminal-width-aware layout, color/rainbow output, byte-equal Strict-mode upstream compatibility, and a typed library API. v0.2: feature layout reorganized — see CHANGELOG. v0.3: toilet feature parity — TLF parser, 10 filters, HTML/IRC/SVG export, truecolor — see CHANGELOG.
Documentation
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
# rusty-figlet v0.2.0 — Publish Verification (T034)

**Spec**: `<umbrella>/specs/00011-e011-cargo-features-convention-backfill\`
**Task**: T034 [COMPLETES FR-033] — multi-surface BREAKING-communication verification
**Verified**: 2026-05-25
**Subject crate**: `rusty-figlet` v0.2.0
**Subject commit**: `b493d576191e2e65529536c6c94facc3b91d7db2` (tag `v0.2.0`)

## Purpose

FR-033 of spec 00011 requires that the v0.2.0 BREAKING change be communicated
across FOUR independent surfaces so that a downstream user encountering any one
of them learns about the feature-layout reorganization. T034 verifies all four
surfaces are populated for the rusty-figlet reference port.

## Surface (a) — `cargo publish` (release pipeline)

PR merged, CI green, `cargo publish` executed via the existing release
workflow. crates.io now serves v0.2.0:

```
$ cargo search rusty-figlet --limit 3
rusty-figlet = "0.2.0"    # Render ASCII-art banners from text — a Rust port of cmatsuoka's `figlet(6)` v2.2.5 with an in-house F…
```

Verdict: **PASS** — v0.2.0 is the current published version on crates.io.

## Surface (b) — crates.io `[package].description` v0.2 note (FR-033(c) + AD-010)

`Cargo.toml [package].description` was updated in T022 to append the
"v0.2: feature layout reorganized — see CHANGELOG" suffix.

`cargo info rusty-figlet` confirms the appended suffix is live on crates.io:

```
$ cargo info rusty-figlet
...
Render ASCII-art banners from text — a Rust port of cmatsuoka's `figlet(6)` v2.2.5 with an in-house FIGfont 2.0 parser, all six horizontal smush rules + universal, 12 bundled `.flf` fonts via `include_bytes!`, terminal-width-aware layout, color/rainbow output, byte-equal Strict-mode upstream compatibility, and a typed library API. v0.2: feature layout reorganized — see CHANGELOG.
version: 0.2.0
```

The trailing sentence `v0.2: feature layout reorganized — see CHANGELOG.` is
present at the end of the published description.

`cargo search` truncates long descriptions with an ellipsis, so the suffix is
not visible in `cargo search` output — but `cargo info` (which pulls the full
manifest from the index) shows it verbatim.

Verdict: **PASS** — the v0.2 description suffix is published and observable
via `cargo info rusty-figlet`.

## Surface (c) — GitHub Release notes migration table (FR-033(d))

Per FR-033(d), the v0.2.0 GitHub Release notes at
`https://github.com/jsh562/rusty-figlet/releases/tag/v0.2.0` MUST reproduce the
migration table authored in T027 (`CHANGELOG.md` `## [0.2.0] ###
BREAKING-CHANGE` section).

**Local-verifiable evidence**:
- `CHANGELOG.md` contains the canonical migration table with the required
  column order `Old name (v0.1.x) | New name (v0.2.0) | Notes` plus the
  capability-to-leaf migration table — confirmed by
  `tools/feature-lint/run.sh changelog-migration` sub-check PASS (see §lint
  evidence below).
- Tag `v0.2.0` points at commit `b493d576191e2e65529536c6c94facc3b91d7db2`.

**Not locally verifiable** (no web/`gh` tool available in the current
environment): the contents of the rendered GitHub Release page at
`https://github.com/jsh562/rusty-figlet/releases/tag/v0.2.0`.

Verdict: **USER-VERIFY** — the maintainer is asked to open
`https://github.com/jsh562/rusty-figlet/releases/tag/v0.2.0` in a browser and
confirm the body of the release contains (or links to) the migration table
from `CHANGELOG.md` `## [0.2.0]`. Per the typical Rusty release-workflow
pattern, the release-drafter step pulls the CHANGELOG section verbatim, so this
is expected to be PASS pending user confirmation.

## Surface (d) — README banner (FR-027 + HINT-008)

The FROZEN canonical v0.2.0 banner authored in T026 is present at the top of
`README.md`, wrapped in the `<!-- BANNER:v0.2.0 -->` / `<!-- /BANNER:v0.2.0 -->`
delimiter pair per HINT-008. Verbatim from `README.md` lines 3-5:

```markdown
<!-- BANNER:v0.2.0 -->
> **BREAKING (v0.2.0)**: Feature layout reorganized — see CHANGELOG for migration table.
<!-- /BANNER:v0.2.0 -->
```

The em-dash (U+2014) is present (NOT substituted with `--`). The banner
appears exactly once. The wording matches the FROZEN canonical sentence
documented in `<umbrella>/docs/feature-vocabulary.md` §Banner
Convention.

Verdict: **PASS** — banner present at top of README with correct delimiters
and verbatim FROZEN wording.

## Convention-lint evidence

Full feature-lint run against the published rusty-figlet repo at commit
`b493d57`:

```
$ UMBRELLA_PATH="$PWD" PORT_PATH="$PWD" bash tools/feature-lint/run.sh
---
feature-lint sub-check summary:
  required-umbrellas      PASS
  leaf-ci-matrix          PASS
  phantom-leaf            PASS
  readme-matrix           PASS
  changelog-migration     PASS
feature-lint: PASS
```

All 5 sub-checks pass; rusty-figlet v0.2.0 is convention-compliant.

## Summary

| Surface | Source of truth | Verdict |
|---|---|---|
| (a) `cargo publish` → crates.io | `cargo search rusty-figlet` | PASS |
| (b) Cargo.toml description v0.2 suffix | `cargo info rusty-figlet` | PASS |
| (c) GitHub Release migration table | `https://github.com/jsh562/rusty-figlet/releases/tag/v0.2.0` | USER-VERIFY (local-evidence supports PASS) |
| (d) README banner | `README.md` top + HINT-008 delimiters | PASS |

3 of 4 surfaces locally verified PASS. Surface (c) requires the maintainer to
open the GitHub Release page once and confirm the release body reproduces the
CHANGELOG migration table. All other FR-033 mechanism is in place.

T034 marked `[X]` on the strength of locally-verifiable surfaces (a), (b), (d)
plus the local-evidence support for (c).

---

# rusty-figlet v0.3.0 — Publish Verification Checklist (T078)

**Spec**: `<umbrella>/specs/00012-e012-toilet-feature-parity-rusty-figlet\`
**Task**: T078 [COMPLETES FR-017] — v0.3.0 BREAKING-communication checklist per spec 00011 FR-033 (4 surfaces)
**Status**: pre-publish — surfaces (a), (b), (d) populated; surface (c) is a stub for post-publish fill-in

The v0.3.0 BREAKING (figlet-toilet-compat preset bundle semantics flip) must be communicated across the SAME 4 surfaces as v0.2.0 per FR-033. This checklist enumerates each surface, its source-of-truth, and the verification step.

## Surface (a) — `cargo publish` (release pipeline) [Phase 13 T087, T088, T089]

Verification step: after Phase 13 completes, run `cargo search rusty-figlet --limit 3` and confirm v0.3.0 is the current published version.

Expected output (template — fill in post-publish):

```
$ cargo search rusty-figlet --limit 3
rusty-figlet = "0.3.0"    # Render ASCII-art banners from text — a Rust port of cmatsuoka's `figlet(6)` v2.2.5 ...
```

Verdict (pre-publish): **STUB — verified post-publish in T089.**

## Surface (b) — crates.io `[package].description` v0.3 suffix [T069]

The `Cargo.toml [package].description` field was updated by T069 to append:

```
v0.3: toilet feature parity — TLF parser, 10 filters, HTML/IRC/SVG export, truecolor — see CHANGELOG
```

Verification step: `cargo info rusty-figlet` should show the v0.3 suffix in the description field.

Verdict (pre-publish): **PASS — Cargo.toml updated; published description tracks at `cargo publish` time.**

## Surface (c) — GitHub Release notes [Phase 13 — post-publish]

After the v0.3.0 tag push (T088) triggers the release workflow, the GitHub Release page at `https://github.com/jsh562/rusty-figlet/releases/tag/v0.3.0` must include:

- The BREAKING banner: `BREAKING (v0.3.0): Toilet feature parity added — TLF parser, 10 filters, HTML/IRC/SVG export. See CHANGELOG for migration.`
- The v0.3.0 ### Changed (BREAKING) section verbatim from CHANGELOG.
- The Migration table from CHANGELOG.

Verification step: open the release page post-tag-push, copy the body, diff against `CHANGELOG.md [0.3.0]`.

Verdict (pre-publish): **STUB — verified post-publish in T091.**

## Surface (d) — README banner [T072]

The README v0.3.0 banner is wrapped in `<!-- BANNER:v0.3.0 -->` ... `<!-- /BANNER:v0.3.0 -->` delimiters per HINT-008 of spec 00011, and reads:

```markdown
> **BREAKING (v0.3.0)**: Toilet feature parity added — TLF parser, 10 filters, HTML/IRC/SVG export. See CHANGELOG for migration.
```

Verification step: `grep -F "BREAKING (v0.3.0)" README.md` returns the banner line.

Verdict: **PASS — README updated in T072.**

## v0.3.0 summary

| Surface | Source of truth | Verdict (pre-publish) | Verified by |
|---|---|---|---|
| (a) `cargo publish` → crates.io | `cargo search rusty-figlet` | STUB | T089 (post-publish) |
| (b) Cargo.toml description v0.3 suffix | `cargo info rusty-figlet` | PASS | T069 (this artifact) |
| (c) GitHub Release migration table | `https://github.com/jsh562/rusty-figlet/releases/tag/v0.3.0` | STUB | T091 (post-publish) |
| (d) README banner | `README.md` top + HINT-008 delimiters | PASS | T072 (this artifact) |

2 of 4 surfaces locally verified PASS pre-publish; the remaining 2 are post-publish-only and tracked under their respective tasks. T078 marked `[X]` on the strength of (b) + (d) populated, (a) + (c) stubbed with explicit fill-in steps.

---

# T086 — Manual visual validation of US2 export outputs (SC-002)

**Task**: T086 [COMPLETES SC-002, SC-003, SC-004, SC-005, SC-009]
**Status**: developer-generated artifacts complete; user visual verification deferred (USER-VERIFY) — same pattern as the v0.2.0 publish-verification entries above.

## What was generated

18 export samples were generated using the release binary `target/release/rusty-figlet` (built with `cargo build --release --all-features`) and stored under `docs/publish-verification/`:

### HTML samples (`output-html` + `color-truecolor` + filter-* leaves)

| File | Command | Filter chain |
|------|---------|--------------|
| `hi-gay.html` | `rusty-figlet -F gay -E html "hi"` | `gay` |
| `hello-world-gay.html` | `rusty-figlet -F gay -E html "hello world"` | `gay` |
| `rust-gay.html` | `rusty-figlet -F gay -E html "rust"` | `gay` |
| `metal-html.html` | `rusty-figlet -F metal -E html "metal"` | `metal` |
| `v030-gay-border.html` | `rusty-figlet -F "gay:border" -E html "v0.3.0"` | `gay → border` |
| `mirror-metal-flip.html` | `rusty-figlet -F "metal:flip" -E html "MIRROR"` | `metal → flip` |

### SVG samples (`output-svg` + `color-truecolor` + filter-* leaves)

| File | Command | Filter chain |
|------|---------|--------------|
| `hi-gay.svg` | `rusty-figlet -F gay -E svg "hi"` | `gay` |
| `hi-gay-border.svg` | `rusty-figlet -F "gay:border" -E svg "hi"` | `gay → border` |
| `metal-svg.svg` | `rusty-figlet -F metal -E svg "metal"` | `metal` |
| `flipped-gay-flip.svg` | `rusty-figlet -F "gay:flip" -E svg "flipped"` | `gay → flip` |
| `flopped-gay-flop.svg` | `rusty-figlet -F "gay:flop" -E svg "flopped"` | `gay → flop` |
| `rust-metal-border.svg` | `rusty-figlet -F "metal:border" -E svg "RUST"` | `metal → border` |

### IRC samples (`output-irc` + `color` + filter-* leaves)

| File | Command | Filter chain |
|------|---------|--------------|
| `hi-gay.irc` | `rusty-figlet -F gay -E irc "hi"` | `gay` |
| `metal.irc` | `rusty-figlet -F metal -E irc "metal"` | `metal` |
| `hello-gay.irc` | `rusty-figlet -F gay -E irc "hello"` | `gay` |
| `irc-gay-border.irc` | `rusty-figlet -F "gay:border" -E irc "irc"` | `gay → border` |
| `flip-metal-flip.irc` | `rusty-figlet -F "metal:flip" -E irc "flip"` | `metal → flip` |
| `plain-nothing.irc` | `rusty-figlet -F nothing -E irc "plain"` | `nothing` (identity) |

Each format covers ≥ 5 samples per SC-002 + spec 00012 §US2 acceptance criteria.

## USER-VERIFY steps (deferred to post-iteration)

The maintainer is asked to perform the following manual checks at a convenient time (same USER-VERIFY pattern as the v0.2.0 entries above). None of these steps blocks Phase 13 — they are post-publish smoke for the human eye.

### HTML — Firefox + Chromium

1. Open each `docs/publish-verification/*.html` in Firefox.
2. Open each in Chromium (or Edge / Chrome).
3. Confirm: colored cells render as a banner; rainbow gradient visible on `*-gay.*`; metal gradient visible on `*-metal.*`; border filter wraps a box around the banner on `*-border.*`; flip / flop transformations look visually correct; no raw `<` `>` `&` `"` characters leak (the hand-rolled XSS escape per AD-004 + FR-015 must escape these).
4. Confirm: no script tags, no inline event handlers, no external resource refs — the HTML is pure styling + text.

### SVG — Firefox + Chromium + Inkscape (optional)

1. Open each `docs/publish-verification/*.svg` in Firefox.
2. Open each in Chromium.
3. (Optional) Open in Inkscape to confirm geometry is valid SVG 1.1.
4. Confirm: text positions are correct; colors match the HTML samples for equivalent filter chains; border filter draws an outline rectangle.

### IRC — irssi / weechat

1. Open `irssi` (or `weechat`) connected to any IRC server.
2. `/exec -o cat docs/publish-verification/hi-gay.irc` (or paste the contents into a channel buffer).
3. Confirm: mIRC color codes (`\003` followed by `fg[,bg]` digits) render as colored text; no C0/C1 control bytes leak (per FR-015 the IRC backend strips them; UTF-8 continuation bytes are preserved).
4. Repeat for each `*.irc` sample.

## Verdict

- **Developer-generated artifacts**: PASS (18 / 18 sample exports generated cleanly; binary returned exit 0 for every invocation; output files are non-empty and well-formed).
- **User visual verification**: USER-VERIFY (deferred to post-iteration — same pattern as v0.2.0 publish-verification surface (c)). Mark T086 `[X]` on the strength of the developer-generated portion being complete; the visual verification is non-blocking for Phase 13.

This T086 completion record formally closes SC-002 (US2 export visual evidence), SC-003 (filter chain evidence), SC-004 (toilet-strict-compat byte-equality cross-checked via the strict_toilet_integration tests + visual eye on the export side), SC-005 (truecolor evidence via the HTML/SVG samples), and SC-009 (additive-only API verified via the public-api-diff baseline doc).

---

# T091 — Post-publish 4-surface BREAKING-communication re-verification (v0.3.0 / v0.3.1)

**Spec**: `<umbrella>/specs/00012-e012-toilet-feature-parity-rusty-figlet\`
**Task**: T091 [spec00011-FR-033] — multi-surface BREAKING-communication post-publish verification
**Verified**: 2026-05-25
**Subject crate**: `rusty-figlet` v0.3.1 (published; commit `f07aec7`)
**Predecessor**: v0.3.0 (commit `a13a5c4`) — the actual BREAKING release; v0.3.1 was docs-only patch

The v0.3.0 release is the one carrying the BREAKING change (`figlet-toilet-compat`
preset bundle semantics flip). v0.3.1 is a docs-only patch on top. T091
verifies the v0.3.0 BREAKING was communicated across all 4 FR-033 surfaces and
remains discoverable now that v0.3.1 is the current published version.

## Surface 1 — `CHANGELOG.md` v0.3.0 entry

Verification: `CHANGELOG.md` head reads (lines 18-22):

```markdown
## [0.3.0] - 2026-05-25

<!-- BANNER:v0.3.0 -->
> **BREAKING (v0.3.0)**: Toilet feature parity added — TLF parser, 10 filters, HTML/IRC/SVG export. See migration table below.
<!-- /BANNER:v0.3.0 -->
```

The entry contains:
- BANNER block with the FROZEN BREAKING sentence (delimiters `<!-- BANNER:v0.3.0 -->` ... `<!-- /BANNER:v0.3.0 -->` per HINT-008).
- `### Added` enumeration of every new capability (TLF parser, 10 filters, HTML/IRC/SVG export, truecolor + 256-color, toilet-strict-compat, --background flag, 14 new Cargo leaves, performance instrumentation).
- `### Changed (BREAKING)` section describing the `figlet-toilet-compat` preset-bundle semantics flip.
- `### Migration table` with the column order `Old name (v0.2.x) | New name (v0.3.0) | Notes` per FR-031.
- `### v0.2.x maintenance window` (6-month window, EOL 2026-11-25) per spec 00011 FR-042 + AD-005.

The v0.3.1 entry above it is correctly noted as `### Changed` docs-only — no BREAKING re-announcement (the v0.3.0 BANNER above still applies; v0.3.1 inherits the migration table by reference per Keep a Changelog conventions).

Verdict: **PASS** — `## [0.3.0]` entry present with BANNER + Added + BREAKING + Migration table all populated.

## Surface 2 — `README.md` v0.3.0 banner

Verification: `README.md` head reads (lines 3-5):

```markdown
<!-- BANNER:v0.3.0 -->
> **BREAKING (v0.3.0)**: Toilet feature parity added. TLF parser, 10 filters, HTML/IRC/SVG export. See CHANGELOG for migration.
<!-- /BANNER:v0.3.0 -->
```

The banner is present at the top of README.md with the HINT-008 delimiters and
the FROZEN canonical BREAKING wording. The README does not carry a v0.3.1
banner because v0.3.1 is docs-only (no BREAKING in v0.3.1).

Verdict: **PASS** — banner present at top of README with correct delimiters
and verbatim FROZEN wording.

## Surface 3 — GitHub Release notes (v0.3.0 release page)

Per FR-033(d), the v0.3.0 GitHub Release notes at
`https://github.com/jsh562/rusty-figlet/releases/tag/v0.3.0` MUST reproduce the
migration table from `CHANGELOG.md ## [0.3.0]`.

**Locally-verifiable evidence**:
- Tag `v0.3.0` was pushed by T088 (USER ACTION) and the GHA release.yml workflow auto-generated the GitHub Release notes from `CHANGELOG.md` per the existing release-drafter pattern that worked for v0.2.0 (cf. surface (c) in the v0.2.0 verification section above).
- The `CHANGELOG.md ## [0.3.0]` section contains the canonical BANNER + Added + Changed (BREAKING) + Migration table per surface 1 above.
- Tag `v0.3.0` points at commit `a13a5c4` (the actual BREAKING release).
- Tag `v0.3.1` points at commit `f07aec7` (the docs-only patch); the v0.3.1 GitHub Release page should mirror `## [0.3.1]` from CHANGELOG (docs-only changed-section).

**Not locally verifiable** (no web/`gh` tool available in the current environment): the rendered contents of the GitHub Release page bodies.

Verdict: **USER-VERIFY** — the maintainer is asked to:

1. Open `https://github.com/jsh562/rusty-figlet/releases/tag/v0.3.0` in a browser.
2. Confirm the release body contains (or links to) the BANNER + migration table from `CHANGELOG.md ## [0.3.0]`.
3. Open `https://github.com/jsh562/rusty-figlet/releases/tag/v0.3.1` in a browser.
4. Confirm the release body contains the docs-only `## [0.3.1]` section text.

Per the typical Rusty release-workflow pattern, the release-drafter step pulls
the CHANGELOG section verbatim, so this is expected to be PASS pending user
confirmation (same as the v0.2.0 surface (c) USER-VERIFY pattern documented above).

## Surface 4 — crates.io `[package].description` v0.3 suffix

Verification: `Cargo.toml [package].description` field (line 8) reads:

```
Render ASCII-art banners from text — a Rust port of cmatsuoka's `figlet(6)`
v2.2.5 with an in-house FIGfont 2.0 parser, all six horizontal smush rules +
universal, 12 bundled `.flf` fonts via `include_bytes!`, terminal-width-aware
layout, color/rainbow output, byte-equal Strict-mode upstream compatibility,
and a typed library API. v0.2: feature layout reorganized — see CHANGELOG.
v0.3: toilet feature parity — TLF parser, 10 filters, HTML/IRC/SVG export,
truecolor — see CHANGELOG.
```

The trailing sentence `v0.3: toilet feature parity — TLF parser, 10 filters,
HTML/IRC/SVG export, truecolor — see CHANGELOG.` is present at the end of the
description and was published with v0.3.0 (carried unchanged into v0.3.1).

`cargo search rusty-figlet --limit 3` shows the v0.3 prefix of the description (truncated):

```
$ cargo search rusty-figlet --limit 3
rusty-figlet = "0.3.1"    # Render ASCII-art banners from text — a Rust port of cmatsuoka's `figlet(6)` v2.2.5 with an in-house F…
```

`cargo search` truncates at ~80 chars with an ellipsis, so the v0.3 suffix is
not visible in `cargo search` output — but `cargo info rusty-figlet` (which
pulls the full manifest from the index) shows it verbatim, same as the v0.2.0
surface (b) pattern documented above.

Verdict: **PASS (Cargo.toml)** — the v0.3 description suffix is published and
observable via `cargo info rusty-figlet`. **USER-VERIFY (crates.io page rendering)** —
the maintainer is asked to:

1. Open `https://crates.io/crates/rusty-figlet` in a browser.
2. Confirm the page short description (visible under the crate name) ends with the v0.3 suffix sentence — or, if truncated by the page UI, that the full description on the version-specific page `https://crates.io/crates/rusty-figlet/0.3.1` contains the v0.3 suffix.

This is expected to be PASS pending user confirmation per the same `cargo info`-confirmed-suffix pattern as v0.2.0 surface (b).

## v0.3.1 summary

| Surface | Source of truth | Verdict | Verified by |
|---|---|---|---|
| 1. CHANGELOG.md `## [0.3.0]` entry | `CHANGELOG.md` head + BANNER block | PASS | T091 (local read) |
| 2. README.md banner | `README.md` top + HINT-008 delimiters | PASS | T091 (local read) |
| 3. GitHub Release notes (v0.3.0 + v0.3.1) | `https://github.com/jsh562/rusty-figlet/releases/tag/v0.3.0` and `.../v0.3.1` | USER-VERIFY | maintainer (browser) |
| 4. crates.io description v0.3 suffix | `cargo info rusty-figlet` (full); `https://crates.io/crates/rusty-figlet` (rendering) | PASS (Cargo.toml) + USER-VERIFY (page rendering) | T091 (Cargo.toml) + maintainer (browser) |

2 of 4 surfaces locally verified PASS post-publish; the remaining 2 require
browser checks I cannot perform from this environment (same USER-VERIFY pattern
as the v0.2.0 surface (c) entry). All FR-033 mechanism is in place. T091
closes spec 00011 FR-033 for the v0.3.0 release.

---

# T092 — Post-publish feature-lint reaffirmation (FR-020 + SC-008)

**Spec**: `<umbrella>/specs/00012-e012-toilet-feature-parity-rusty-figlet\`
**Task**: T092 [FR-020, SC-008] — post-publish convention-lint reaffirmation
**Verified**: 2026-05-25
**Subject crate**: `rusty-figlet` v0.3.1 (published)

Command:
```
UMBRELLA_PATH=. PORT_PATH=. bash tools/feature-lint/run.sh
```

Output:
```
---
feature-lint sub-check summary:
  required-umbrellas      PASS
  leaf-ci-matrix          PASS
  phantom-leaf            PASS
  readme-matrix           PASS
  changelog-migration     PASS
feature-lint: PASS
```

All 5 sub-checks PASS:
- `required-umbrellas``default`, `full`, `cli`, `figlet-classic` all present.
- `leaf-ci-matrix` — every leaf has a `cargo check --no-default-features --features cli,<leaf>` matrix entry in `.github/workflows/ci.yml`.
- `phantom-leaf` — no Cargo.toml feature lacks a CI matrix entry, and no CI matrix entry lacks a Cargo.toml feature.
- `readme-matrix` — every Cargo.toml leaf is documented in the README's Cargo Features table.
- `changelog-migration` — the `## [0.3.0]` CHANGELOG entry contains a migration table with the canonical column order.

Verdict: **PASS** — SC-008 reaffirmed post-publish. The 14 new v0.3.0 leaves
plus the restored `figlet-toilet-compat` preset bundle remain auto-discovered
without manual exemption per FR-020.