# 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
> **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
| (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
> **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.