* fix(commands): stop hardcoding the visual-type count
Integrates the final reviewed diff from PR #112.
* docs(high-level): correct effective width checklist
Integrates the final reviewed diff from PR #105.
* fix(commands): quote profile argument hint
Integrates the final reviewed diff from PR #126.
* test(sankey): gate conservation and ribbon geometry
Integrates the final reviewed diff from PR #103.
* feat(tooling): add doctor diagnostics gate
Integrates the final reviewed diff from PR #132.
* feat(scripts): lint diagrams as rendered
Integrates the final reviewed diff from PR #18.
* feat(types): add quantitative polar chart
Integrates the final reviewed diff from PR #101.
* chore(release): consolidate reviewed changes in 2.6.0
Documents every combined gate and synchronizes Claude, Codex, and Factory metadata for the 39-type release.
* fix(doctor): support installed-skill projects
---------
Co-authored-by: mysoniw <soniw1@gmail.com>
Co-authored-by: thang <76550342+thangldw@users.noreply.github.com>
Co-authored-by: YinShaokun <yinshaokun@didiglobal.com>
Co-authored-by: 0xDarkMatter <0xDarkMatter@users.noreply.github.com>
Co-authored-by: Rupam Pal <rupam.pal@euromonitor.com>
Co-authored-by: Yuvraj3905 <yuvraj202001@gmail.com>
* fix(treemap): verify every cell's area, including cells too small to label
Closes#89.
The area check derived its basis from in-cell labels, so a cell with no
label was excluded from it. That is precisely the sliver -- the cell a
4px grid distorts most, and the one that shipped 24% undersized during
review of #87. On current main, widening Oceania from 16px to 24px, a
50% area distortion, still reports OK.
Every cell now declares `data-share`, its percentage of the whole, and
the verifier checks all of them against it. Cells without it are
reported rather than skipped: a treemap whose cells cannot be parsed is
not a passing treemap, it is an unchecked one, and answering OK to it is
the defect. The label and the metadata are also cross-checked, because
two statements of one fact is a new way for the picture to lie while the
gate stays green.
Adversarial tests gain the oversized and undersized unlabelled sliver
(both pass on current main and fail here), a fail-closed case for
missing metadata, and a label/metadata divergence case.
SKILL.md `metadata.version` said 2.4 against 2.5.0 manifests. The
manifests are bumped by a script and that field is hand-maintained, so
nothing read both numbers and nothing could notice. verify-plugin-package
now asserts it tracks the manifest MAJOR.MINOR. The package test's
fixture gains the field with it -- a SKILL.md without one is not a valid
package, and a fixture missing it would only prove the gate can be
tripped by its own test data.
The examples regained the `PARTS ROUNDED, MAY NOT SUM` disclosure the
type reference requires: displayed parts round up to 8.10B against a
stated 8.09B. It was dropped when the examples were rebuilt around the
legend block. The anti-pattern list, which still forbade outright what
the honest-data rule permits once disclosed, now agrees with it.
Also nudges the info mark onto the label row of its neighbours rather
than the vertical centre of its own cell, so the bottom row reads as one
row.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* fix(treemap): reject ambiguous share metadata
---------
Co-authored-by: 0xDarkMatter <0xDarkMatter@users.noreply.github.com>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* fix(lint): enforce viewBox presence and title length cap
- Add a11y check: non-decorative <svg> must carry a viewBox attribute
with exactly four numeric tokens and positive width/height dimensions.
- Add a11y check: <title> text must be 60 characters or fewer, closing
the gap between the CONTRIBUTING.md spec and linter enforcement.
- Update VALID_SVG in test-lint-a11y.py to include viewBox so all
existing passing cases remain valid after the new checks land.
- Add three adversarial cases: missing-viewbox, invalid-viewbox,
title-too-long — all verified against the gate suite (47/47 OK).
* fix(lint): accept SVG comma separators and reject non-finite viewBox values
- Re-split viewBox on [\s,]+ so comma-separated values (e.g. 0,0,800,600)
are accepted as valid SVG
- Guard each component with math.isfinite() so values like inf and nan are
rejected rather than passing the > 0 size check
- Add adversarial test cases: viewbox-comma-separated (pass),
viewbox-nonfinite-width, viewbox-nonfinite-height (both fail)
- Bump plugin manifests to 2.4.1
* fix(lint): reject viewBox numbers with Python-only underscore separators
* test(lint): cover remaining viewBox cases
---------
Co-authored-by: Rupam Pal <rupam.pal@euromonitor.com>