## Fontbakery report Fontbakery version: 0.7.15
[29] Family checks
INFO: Do we have the latest version of FontBakery installed? * [com.google.fonts/check/fontbakery_version](https://font-bakery.readthedocs.io/en/latest/fontbakery/profiles/universal.html#com.google.fonts/check/fontbakery_version) * ℹ **INFO** fontbakery (0.7.15) - Well designed Font QA tool, written in Python 3 INSTALLED: 0.7.15 (latest) * 🍞 **PASS** Font Bakery is up-to-date
🍞 PASS: Does font file include unacceptable control character glyphs? * [com.google.fonts/check/family/control_chars](https://font-bakery.readthedocs.io/en/latest/fontbakery/profiles/googlefonts.html#com.google.fonts/check/family/control_chars)
--- Rationale ---

Use of some unacceptable control characters in the U+0000 - U+001F range can
lead to rendering issues on some platforms.

Acceptable control characters are defined as .null (U+0000) and CR (U+000D) for
this test.


* 🍞 **PASS** Unacceptable control characters were not identified.
🍞 PASS: Checking all files are in the same directory. * [com.google.fonts/check/family/single_directory](https://font-bakery.readthedocs.io/en/latest/fontbakery/profiles/universal.html#com.google.fonts/check/family/single_directory)
--- Rationale ---

If the set of font files passed in the command line is not all in the same
directory, then we warn the user since the tool will interpret the set of files
as belonging to a single family (and it is unlikely that the user would store
the files from a single family spreaded in several separate directories).


* 🍞 **PASS** All files are in the same directory.
🍞 PASS: Is the command `ftxvalidator` (Apple Font Tool Suite) available? * [com.google.fonts/check/ftxvalidator_is_available](https://font-bakery.readthedocs.io/en/latest/fontbakery/profiles/universal.html#com.google.fonts/check/ftxvalidator_is_available)
--- Rationale ---

There's no reasonable (and legal) way to run the command `ftxvalidator` of the
Apple Font Tool Suite on a non-macOS machine. I.e. on GNU+Linux or Windows etc.

If Font Bakery is not running on an OSX machine, the machine running Font
Bakery could access `ftxvalidator` on OSX, e.g. via ssh or a remote procedure
call (rpc).

There's an ssh example implementation at:
https://github.com/googlefonts/fontbakery/blob/master/prebuilt/workarounds/ftxvalidator/ssh-implementation/ftxvalidator


* 🍞 **PASS** ftxvalidator is available.
🍞 PASS: Each font in a family must have the same vertical metrics values. * [com.google.fonts/check/family/vertical_metrics](https://font-bakery.readthedocs.io/en/latest/fontbakery/profiles/universal.html#com.google.fonts/check/family/vertical_metrics)
--- Rationale ---

We want all fonts within a family to have the same vertical metrics so their
line spacing is consistent across the family.


* 🍞 **PASS** Vertical metrics are the same across the family
🍞 PASS: Fonts have equal unicode encodings? * [com.google.fonts/check/family/equal_unicode_encodings](https://font-bakery.readthedocs.io/en/latest/fontbakery/profiles/cmap.html#com.google.fonts/check/family/equal_unicode_encodings) * 🍞 **PASS** Fonts have equal unicode encodings.
🍞 PASS: Make sure all font files have the same version value. * [com.google.fonts/check/family/equal_font_versions](https://font-bakery.readthedocs.io/en/latest/fontbakery/profiles/head.html#com.google.fonts/check/family/equal_font_versions) * 🍞 **PASS** All font files have the same version.
🍞 PASS: Fonts have consistent PANOSE proportion? * [com.google.fonts/check/family/panose_proportion](https://font-bakery.readthedocs.io/en/latest/fontbakery/profiles/os2.html#com.google.fonts/check/family/panose_proportion) * 🍞 **PASS** Fonts have consistent PANOSE proportion.
🍞 PASS: Fonts have consistent PANOSE family type? * [com.google.fonts/check/family/panose_familytype](https://font-bakery.readthedocs.io/en/latest/fontbakery/profiles/os2.html#com.google.fonts/check/family/panose_familytype) * 🍞 **PASS** Fonts have consistent PANOSE family type.
🍞 PASS: Fonts have consistent underline thickness? * [com.google.fonts/check/family/underline_thickness](https://font-bakery.readthedocs.io/en/latest/fontbakery/profiles/post.html#com.google.fonts/check/family/underline_thickness)
--- Rationale ---

Dave C Lemon (Adobe Type Team) recommends setting the underline thickness to be
consistent across the family.

If thicknesses are not family consistent, words set on the same line which have
different styles look strange.

See also:
https://twitter.com/typenerd1/status/690361887926697986


* 🍞 **PASS** Fonts have consistent underline thickness.
🍞 PASS: Verify that each group of fonts with the same nameID 1 has maximum of 4 fonts * [com.adobe.fonts/check/family/max_4_fonts_per_family_name](https://font-bakery.readthedocs.io/en/latest/fontbakery/profiles/name.html#com.adobe.fonts/check/family/max_4_fonts_per_family_name)
--- Rationale ---

Per the OpenType spec:
'The Font Family name ... should be shared among at most four fonts that differ
only in weight or style ...'


* 🍞 **PASS** There were no more than 4 fonts per family name.
💤 SKIP: Check METADATA.pb parse correctly. * [com.google.fonts/check/metadata/parses](https://font-bakery.readthedocs.io/en/latest/fontbakery/profiles/googlefonts.html#com.google.fonts/check/metadata/parses)
--- Rationale ---

The purpose of this check is to ensure that the METADATA.pb file is not
malformed.


* 💤 **SKIP** Font family at 'font_betas' lacks a METADATA.pb file.
💤 SKIP: Font designer field in METADATA.pb must not be 'unknown'. * [com.google.fonts/check/metadata/unknown_designer](https://font-bakery.readthedocs.io/en/latest/fontbakery/profiles/googlefonts.html#com.google.fonts/check/metadata/unknown_designer) * 💤 **SKIP** Unfulfilled Conditions: family_metadata
💤 SKIP: Multiple values in font designer field in METADATA.pb must be separated by commas. * [com.google.fonts/check/metadata/designer_values](https://font-bakery.readthedocs.io/en/latest/fontbakery/profiles/googlefonts.html#com.google.fonts/check/metadata/designer_values)
--- Rationale ---

We must use commas instead of forward slashes because the server-side code at
the fonts.google.com directory will segment the string on the commas into a
list of names and display the first item in the list as the "principal
designer" while the remaining names are identified as "contributors".

See eg https://fonts.google.com/specimen/Rubik


* 💤 **SKIP** Unfulfilled Conditions: family_metadata
💤 SKIP: Does METADATA.pb copyright field contain broken links? * [com.google.fonts/check/metadata/broken_links](https://font-bakery.readthedocs.io/en/latest/fontbakery/profiles/googlefonts.html#com.google.fonts/check/metadata/broken_links) * 💤 **SKIP** Unfulfilled Conditions: family_metadata
💤 SKIP: Ensure METADATA.pb lists all font binaries. * [com.google.fonts/check/metadata/undeclared_fonts](https://font-bakery.readthedocs.io/en/latest/fontbakery/profiles/googlefonts.html#com.google.fonts/check/metadata/undeclared_fonts)
--- Rationale ---

The set of font binaries available must match exactly those declared on the
METADATA.pb file.

Also, to avoid confusion, we expect that font files are not placed on
subdirectories.


* 💤 **SKIP** Unfulfilled Conditions: family_metadata
💤 SKIP: Check font has a license. * [com.google.fonts/check/family/has_license](https://font-bakery.readthedocs.io/en/latest/fontbakery/profiles/googlefonts.html#com.google.fonts/check/family/has_license) * 💤 **SKIP** Unfulfilled Conditions: gfonts_repo_structure
💤 SKIP: METADATA.pb: check if fonts field only has unique "full_name" values. * [com.google.fonts/check/metadata/unique_full_name_values](https://font-bakery.readthedocs.io/en/latest/fontbakery/profiles/googlefonts.html#com.google.fonts/check/metadata/unique_full_name_values) * 💤 **SKIP** Unfulfilled Conditions: family_metadata
💤 SKIP: METADATA.pb: check if fonts field only contains unique style:weight pairs. * [com.google.fonts/check/metadata/unique_weight_style_pairs](https://font-bakery.readthedocs.io/en/latest/fontbakery/profiles/googlefonts.html#com.google.fonts/check/metadata/unique_weight_style_pairs) * 💤 **SKIP** Unfulfilled Conditions: family_metadata
💤 SKIP: METADATA.pb license is "APACHE2", "UFL" or "OFL"? * [com.google.fonts/check/metadata/license](https://font-bakery.readthedocs.io/en/latest/fontbakery/profiles/googlefonts.html#com.google.fonts/check/metadata/license) * 💤 **SKIP** Unfulfilled Conditions: family_metadata
💤 SKIP: METADATA.pb should contain at least "menu" and "latin" subsets. * [com.google.fonts/check/metadata/menu_and_latin](https://font-bakery.readthedocs.io/en/latest/fontbakery/profiles/googlefonts.html#com.google.fonts/check/metadata/menu_and_latin) * 💤 **SKIP** Unfulfilled Conditions: family_metadata
💤 SKIP: METADATA.pb subsets should be alphabetically ordered. * [com.google.fonts/check/metadata/subsets_order](https://font-bakery.readthedocs.io/en/latest/fontbakery/profiles/googlefonts.html#com.google.fonts/check/metadata/subsets_order) * 💤 **SKIP** Unfulfilled Conditions: family_metadata
💤 SKIP: METADATA.pb: Copyright notice is the same in all fonts? * [com.google.fonts/check/metadata/copyright](https://font-bakery.readthedocs.io/en/latest/fontbakery/profiles/googlefonts.html#com.google.fonts/check/metadata/copyright) * 💤 **SKIP** Unfulfilled Conditions: family_metadata
💤 SKIP: Check that METADATA.pb family values are all the same. * [com.google.fonts/check/metadata/familyname](https://font-bakery.readthedocs.io/en/latest/fontbakery/profiles/googlefonts.html#com.google.fonts/check/metadata/familyname) * 💤 **SKIP** Unfulfilled Conditions: family_metadata
💤 SKIP: METADATA.pb: According Google Fonts standards, families should have a Regular style. * [com.google.fonts/check/metadata/has_regular](https://font-bakery.readthedocs.io/en/latest/fontbakery/profiles/googlefonts.html#com.google.fonts/check/metadata/has_regular) * 💤 **SKIP** Unfulfilled Conditions: family_metadata
💤 SKIP: METADATA.pb: Regular should be 400. * [com.google.fonts/check/metadata/regular_is_400](https://font-bakery.readthedocs.io/en/latest/fontbakery/profiles/googlefonts.html#com.google.fonts/check/metadata/regular_is_400) * 💤 **SKIP** Unfulfilled Conditions: family_metadata, has_regular_style
💤 SKIP: METADATA.pb: Font filenames match font.filename entries? * [com.google.fonts/check/metadata/filenames](https://font-bakery.readthedocs.io/en/latest/fontbakery/profiles/googlefonts.html#com.google.fonts/check/metadata/filenames) * 💤 **SKIP** Unfulfilled Conditions: family_metadata
💤 SKIP: All tabular figures must have the same width across the RIBBI-family. * [com.google.fonts/check/family/tnum_horizontal_metrics](https://font-bakery.readthedocs.io/en/latest/fontbakery/profiles/googlefonts.html#com.google.fonts/check/family/tnum_horizontal_metrics)
--- Rationale ---

Tabular figures need to have the same metrics in all styles in order to allow
tables to be set with proper typographic control, but to maintain the placement
of decimals and numeric columns between rows.

Here's a good explanation of this:
https://www.typography.com/techniques/fonts-for-financials/#tabular-figs


* 💤 **SKIP** Unfulfilled Conditions: RIBBI_ttFonts
💤 SKIP: Check that OS/2.fsSelection bold & italic settings are unique for each NameID1 * [com.adobe.fonts/check/family/bold_italic_unique_for_nameid1](https://font-bakery.readthedocs.io/en/latest/fontbakery/profiles/os2.html#com.adobe.fonts/check/family/bold_italic_unique_for_nameid1)
--- Rationale ---

Per the OpenType spec: name ID 1 'is used in combination with Font Subfamily
name (name ID 2), and should be shared among at most four fonts that differ
only in weight or style...

This four-way distinction should also be reflected in the OS/2.fsSelection
field, using bits 0 and 5.


* 💤 **SKIP** Unfulfilled Conditions: RIBBI_ttFonts

[132] recursive-MONO_CASL_wght_slnt_ital--full_gsub--2019_11_19-19_44.ttf
💔 ERROR: Version number has increased since previous release on Google Fonts? * [com.google.fonts/check/version_bump](https://font-bakery.readthedocs.io/en/latest/fontbakery/profiles/googlefonts.html#com.google.fonts/check/version_bump) * 💔 **ERROR** The condition had an error: BadCertificateSetupException: You probably installed official Mac python from python.org but forgot to also install the certificates. There is a note in the installer Readme about that. Check the Python folder in the Applications directory, you should find a shell script to install the certificates.
💔 ERROR: Check variable font instances have correct coordinate values * [com.google.fonts/check/varfont_instance_coordinates](https://font-bakery.readthedocs.io/en/latest/fontbakery/profiles/googlefonts.html#com.google.fonts/check/varfont_instance_coordinates) * 💔 **ERROR** Failed with KeyError: 'MONO'
💔 ERROR: Checking with ftxvalidator. * [com.google.fonts/check/ftxvalidator](https://font-bakery.readthedocs.io/en/latest/fontbakery/profiles/universal.html#com.google.fonts/check/ftxvalidator) * 💔 **ERROR** ftxvalidator returned an error code. Output follows: objc[66091]: Objective-C garbage collection is no longer supported.
🔥 FAIL: Checking file is named canonically. * [com.google.fonts/check/canonical_filename](https://font-bakery.readthedocs.io/en/latest/fontbakery/profiles/googlefonts.html#com.google.fonts/check/canonical_filename)
--- Rationale ---

A font's filename must be composed in the following manner:
<familyname>-<stylename>.ttf

- Nunito-Regular.ttf,
- Oswald-BoldItalic.ttf

Variable fonts must list the axis tags in alphabetical order in square brackets
and separated by commas:

- Roboto[wdth,wght].ttf
- Familyname-Italic[wght].ttf


* 🔥 **FAIL** font filename "font_betas/recursive-MONO_CASL_wght_slnt_ital--full_gsub--2019_11_19-19_44.ttf" is invalid. It must not contain underscore characters! [code: invalid-char]
🔥 FAIL: Checking OS/2 fsType does not impose restrictions. * [com.google.fonts/check/fstype](https://font-bakery.readthedocs.io/en/latest/fontbakery/profiles/googlefonts.html#com.google.fonts/check/fstype)
--- Rationale ---

The fsType in the OS/2 table is a legacy DRM-related field. Fonts in the Google
Fonts collection must have it set to zero (also known as "Installable
Embedding"). This setting indicates that the fonts can be embedded in documents
and permanently installed by applications on remote systems.

More detailed info is available at:
https://docs.microsoft.com/en-us/typography/opentype/spec/os2#fstype


* 🔥 **FAIL** In this font fsType is set to 4 meaning that: The font may be embedded, and temporarily loaded on the remote system, but documents that use it must not be editable. No such DRM restrictions can be enabled on the Google Fonts collection, so the fsType field must be set to zero (Installable Embedding) instead. [code: drm]
🔥 FAIL: Check copyright namerecords match license file. * [com.google.fonts/check/name/license](https://font-bakery.readthedocs.io/en/latest/fontbakery/profiles/googlefonts.html#com.google.fonts/check/name/license) * 🔥 **FAIL** Font lacks NameID 13 (LICENSE DESCRIPTION). A proper licensing entry must be set. [code: missing]
🔥 FAIL: License URL matches License text on name table? * [com.google.fonts/check/name/license_url](https://font-bakery.readthedocs.io/en/latest/fontbakery/profiles/googlefonts.html#com.google.fonts/check/name/license_url) * 🔥 **FAIL** A known license URL must be provided in the NameID 14 (LICENSE INFO URL) entry. Currently accepted licenses are Apache: 'http://www.apache.org/licenses/LICENSE-2.0' or Open Font License: 'http://scripts.sil.org/OFL' For a small set of legacy families the Ubuntu Font License 'https://www.ubuntu.com/legal/terms-and-policies/font-licence' may be acceptable as well. When in doubt, please choose OFL for new font projects. [code: no-license-found]
🔥 FAIL: Is the Grid-fitting and Scan-conversion Procedure ('gasp') table set to optimize rendering? * [com.google.fonts/check/gasp](https://font-bakery.readthedocs.io/en/latest/fontbakery/profiles/googlefonts.html#com.google.fonts/check/gasp)
--- Rationale ---

Traditionally version 0 'gasp' tables were set so that font sizes below 8 ppem
had no grid fitting but did have antialiasing. From 9-16 ppem, just grid
fitting. And fonts above 17ppem had both antialiasing and grid fitting toggled
on. The use of accelerated graphics cards and higher resolution screens make
this approach obsolete. Microsoft's DirectWrite pushed this even further with
much improved rendering built into the OS and apps.

In this scenario it makes sense to simply toggle all 4 flags ON for all font
sizes.


* 🔥 **FAIL** Font is missing the 'gasp' table. Try exporting the font with autohinting enabled. If you are dealing with an unhinted font, it can be fixed by running the fonts through the command 'gftools fix-nonhinting' GFTools is available at https://pypi.org/project/gftools/ [code: lacks-gasp]
🔥 FAIL: Check name table: TYPOGRAPHIC_SUBFAMILY_NAME entries. * [com.google.fonts/check/name/typographicsubfamilyname](https://font-bakery.readthedocs.io/en/latest/fontbakery/profiles/googlefonts.html#com.google.fonts/check/name/typographicsubfamilyname) * 🔥 **FAIL** TYPOGRAPHIC_SUBFAMILY_NAME for Win "Sans Linear A" is incorrect. It must be "Light". [code: bad-typo-win]
🔥 FAIL: Font enables smart dropout control in "prep" table instructions? * [com.google.fonts/check/smart_dropout](https://font-bakery.readthedocs.io/en/latest/fontbakery/profiles/googlefonts.html#com.google.fonts/check/smart_dropout)
--- Rationale ---

This setup is meant to ensure consistent rendering quality for fonts across all
devices (with different rendering/hinting capabilities).

Below is the snippet of instructions we expect to see in the fonts:
B8 01 FF    PUSHW 0x01FF
85          SCANCTRL (unconditinally turn on
                      dropout control mode)
B0 04       PUSHB 0x04
8D          SCANTYPE (enable smart dropout control)

"Smart dropout control" means activating rules 1, 2 and 5:
Rule 1: If a pixel's center falls within the glyph outline,
        that pixel is turned on.
Rule 2: If a contour falls exactly on a pixel's center,
        that pixel is turned on.
Rule 5: If a scan line between two adjacent pixel centers
        (either vertical or horizontal) is intersected
        by both an on-Transition contour and an off-Transition
        contour and neither of the pixels was already turned on
        by rules 1 and 2, turn on the pixel which is closer to
        the midpoint between the on-Transition contour and
        off-Transition contour. This is "Smart" dropout control.

For more detailed info (such as other rules not enabled in this snippet),
please refer to the TrueType Instruction Set documentation.


* 🔥 **FAIL** The 'prep' table does not contain TrueType instructions enabling smart dropout control. To fix, export the font with autohinting enabled, or run ttfautohint on the font, or run the `gftools fix-nonhinting` script. [code: lacks-smart-dropout]
🔥 FAIL: Variable font weight coordinates must be multiples of 100. * [com.google.fonts/check/varfont_weight_instances](https://font-bakery.readthedocs.io/en/latest/fontbakery/profiles/googlefonts.html#com.google.fonts/check/varfont_weight_instances)
--- Rationale ---

The named instances on the weight axis of a variable font must have coordinates
that are multiples of 100 on the design space.


* 🔥 **FAIL** Found a variable font instance with 'wght'=696.7742. This should instead be a multiple of 100. [code: bad-coordinate] * 🔥 **FAIL** Found a variable font instance with 'wght'=696.7742. This should instead be a multiple of 100. [code: bad-coordinate] * 🔥 **FAIL** Found a variable font instance with 'wght'=696.7742. This should instead be a multiple of 100. [code: bad-coordinate] * 🔥 **FAIL** Found a variable font instance with 'wght'=696.7742. This should instead be a multiple of 100. [code: bad-coordinate] * 🔥 **FAIL** Found a variable font instance with 'wght'=696.7742. This should instead be a multiple of 100. [code: bad-coordinate] * 🔥 **FAIL** Found a variable font instance with 'wght'=696.7742. This should instead be a multiple of 100. [code: bad-coordinate] * 🔥 **FAIL** Found a variable font instance with 'wght'=696.7742. This should instead be a multiple of 100. [code: bad-coordinate] * 🔥 **FAIL** Found a variable font instance with 'wght'=696.7742. This should instead be a multiple of 100. [code: bad-coordinate]
🔥 FAIL: Check variable font instances have correct names * [com.google.fonts/check/varfont_instance_names](https://font-bakery.readthedocs.io/en/latest/fontbakery/profiles/googlefonts.html#com.google.fonts/check/varfont_instance_names) * 🔥 **FAIL** Instance name "Mono Linear Light" is incorrect. It should be "Light" [code: bad-name] * 🔥 **FAIL** Instance name "Mono Linear Light Italic" is incorrect. It should be "Light Italic" [code: bad-name] * 🔥 **FAIL** Instance name "Mono Casual Light" is incorrect. It should be "Light" [code: bad-name] * 🔥 **FAIL** Instance name "Mono Casual Light Italic" is incorrect. It should be "Light Italic" [code: bad-name] * 🔥 **FAIL** Instance name "Mono Linear Regular" is incorrect. It should be "Regular" [code: bad-name] * 🔥 **FAIL** Instance name "Mono Linear Italic" is incorrect. It should be "Italic" [code: bad-name] * 🔥 **FAIL** Instance name "Mono Casual Regular" is incorrect. It should be "Regular" [code: bad-name] * 🔥 **FAIL** Instance name "Mono Casual Italic" is incorrect. It should be "Italic" [code: bad-name] * 🔥 **FAIL** Instance name "Mono Linear Medium" is incorrect. It should be "Medium" [code: bad-name] * 🔥 **FAIL** Instance name "Mono Linear Medium Italic" is incorrect. It should be "Medium Italic" [code: bad-name] * 🔥 **FAIL** Instance name "Mono Casual Medium" is incorrect. It should be "Medium" [code: bad-name] * 🔥 **FAIL** Instance name "Mono Casual Medium Italic" is incorrect. It should be "Medium Italic" [code: bad-name] * 🔥 **FAIL** Instance name "Mono Linear SemiBold" is incorrect. It should be "SemiBold" [code: bad-name] * 🔥 **FAIL** Instance name "Mono Linear SemiBold Italic" is incorrect. It should be "SemiBold Italic" [code: bad-name] * 🔥 **FAIL** Instance name "Mono Casual SemiBold" is incorrect. It should be "SemiBold" [code: bad-name] * 🔥 **FAIL** Instance name "Mono Casual SemiBold Italic" is incorrect. It should be "SemiBold Italic" [code: bad-name] * 🔥 **FAIL** Instance name "Mono Linear Bold" is incorrect. It should be "Bold" [code: bad-name] * 🔥 **FAIL** Instance name "Mono Linear Bold Italic" is incorrect. It should be "Bold Italic" [code: bad-name] * 🔥 **FAIL** Instance name "Mono Casual Bold" is incorrect. It should be "Bold" [code: bad-name] * 🔥 **FAIL** Instance name "Mono Casual Bold Italic" is incorrect. It should be "Bold Italic" [code: bad-name] * 🔥 **FAIL** Instance name "Mono Linear ExtraBold" is incorrect. It should be "ExtraBold" [code: bad-name] * 🔥 **FAIL** Instance name "Mono Linear ExtraBold Italic" is incorrect. It should be "ExtraBold Italic" [code: bad-name] * 🔥 **FAIL** Instance name "Mono Casual ExtraBold" is incorrect. It should be "ExtraBold" [code: bad-name] * 🔥 **FAIL** Instance name "Mono Casual ExtraBold Italic" is incorrect. It should be "ExtraBold Italic" [code: bad-name] * 🔥 **FAIL** Instance name "Mono Linear Black" is incorrect. It should be "Black" [code: bad-name] * 🔥 **FAIL** Instance name "Mono Linear Black Italic" is incorrect. It should be "Black Italic" [code: bad-name] * 🔥 **FAIL** Instance name "Mono Casual Black" is incorrect. It should be "Black" [code: bad-name] * 🔥 **FAIL** Instance name "Mono Casual Black Italic" is incorrect. It should be "Black Italic" [code: bad-name] * 🔥 **FAIL** Instance name "Mono Linear ExtraBlack" is incorrect. It should be "Black" [code: bad-name] * 🔥 **FAIL** Instance name "Mono Linear ExtraBlack Italic" is incorrect. It should be "Black Italic" [code: bad-name] * 🔥 **FAIL** Instance name "Mono Casual ExtraBlack" is incorrect. It should be "Black" [code: bad-name] * 🔥 **FAIL** Instance name "Mono Casual ExtraBlack Italic" is incorrect. It should be "Black Italic" [code: bad-name] * 🔥 **FAIL** Instance name "Sans Linear Light" is incorrect. It should be "Light" [code: bad-name] * 🔥 **FAIL** Instance name "Sans Linear Light Italic" is incorrect. It should be "Light Italic" [code: bad-name] * 🔥 **FAIL** Instance name "Sans Casual Light" is incorrect. It should be "Light" [code: bad-name] * 🔥 **FAIL** Instance name "Sans Casual Light Italic" is incorrect. It should be "Light Italic" [code: bad-name] * 🔥 **FAIL** Instance name "Sans Linear Regular" is incorrect. It should be "Regular" [code: bad-name] * 🔥 **FAIL** Instance name "Sans Linear Italic" is incorrect. It should be "Italic" [code: bad-name] * 🔥 **FAIL** Instance name "Sans Casual Regular" is incorrect. It should be "Regular" [code: bad-name] * 🔥 **FAIL** Instance name "Sans Casual Italic" is incorrect. It should be "Italic" [code: bad-name] * 🔥 **FAIL** Instance name "Sans Linear Medium" is incorrect. It should be "Medium" [code: bad-name] * 🔥 **FAIL** Instance name "Sans Linear Medium Italic" is incorrect. It should be "Medium Italic" [code: bad-name] * 🔥 **FAIL** Instance name "Sans Casual Medium" is incorrect. It should be "Medium" [code: bad-name] * 🔥 **FAIL** Instance name "Sans Casual Medium Italic" is incorrect. It should be "Medium Italic" [code: bad-name] * 🔥 **FAIL** Instance name "Sans Linear SemiBold" is incorrect. It should be "SemiBold" [code: bad-name] * 🔥 **FAIL** Instance name "Sans Linear SemiBold Italic" is incorrect. It should be "SemiBold Italic" [code: bad-name] * 🔥 **FAIL** Instance name "Sans Casual SemiBold" is incorrect. It should be "SemiBold" [code: bad-name] * 🔥 **FAIL** Instance name "Sans Casual SemiBold Italic" is incorrect. It should be "SemiBold Italic" [code: bad-name] * 🔥 **FAIL** Instance name "Sans Linear Bold" is incorrect. It should be "Bold" [code: bad-name] * 🔥 **FAIL** Instance name "Sans Linear Bold Italic" is incorrect. It should be "Bold Italic" [code: bad-name] * 🔥 **FAIL** Instance name "Sans Casual Bold" is incorrect. It should be "Bold" [code: bad-name] * 🔥 **FAIL** Instance name "Sans Casual Bold Italic" is incorrect. It should be "Bold Italic" [code: bad-name] * 🔥 **FAIL** Instance name "Sans Linear ExtraBold" is incorrect. It should be "ExtraBold" [code: bad-name] * 🔥 **FAIL** Instance name "Sans Linear ExtraBold Italic" is incorrect. It should be "ExtraBold Italic" [code: bad-name] * 🔥 **FAIL** Instance name "Sans Casual ExtraBold" is incorrect. It should be "ExtraBold" [code: bad-name] * 🔥 **FAIL** Instance name "Sans Casual ExtraBold Italic" is incorrect. It should be "ExtraBold Italic" [code: bad-name] * 🔥 **FAIL** Instance name "Sans Linear Black" is incorrect. It should be "Black" [code: bad-name] * 🔥 **FAIL** Instance name "Sans Linear Black Italic" is incorrect. It should be "Black Italic" [code: bad-name] * 🔥 **FAIL** Instance name "Sans Casual Black" is incorrect. It should be "Black" [code: bad-name] * 🔥 **FAIL** Instance name "Sans Casual Black Italic" is incorrect. It should be "Black Italic" [code: bad-name] * 🔥 **FAIL** Instance name "Sans Linear ExtraBlack" is incorrect. It should be "Black" [code: bad-name] * 🔥 **FAIL** Instance name "Sans Linear ExtraBlack Italic" is incorrect. It should be "Black Italic" [code: bad-name] * 🔥 **FAIL** Instance name "Sans Casual ExtraBlack" is incorrect. It should be "Black" [code: bad-name] * 🔥 **FAIL** Instance name "Sans Casual ExtraBlack Italic" is incorrect. It should be "Black Italic" [code: bad-name] * 🔥 **FAIL** This will cause problems with some of the Google Fonts systems that look up fonts by their style names. This must be fixed! [code: bad-instance-names]
🔥 FAIL: Checking OS/2 usWinAscent & usWinDescent. * [com.google.fonts/check/family/win_ascent_and_descent](https://font-bakery.readthedocs.io/en/latest/fontbakery/profiles/universal.html#com.google.fonts/check/family/win_ascent_and_descent)
--- Rationale ---

A font's winAscent and winDescent values should be greater than the head
table's yMax, abs(yMin) values. If they are less than these values, clipping
can occur on Windows platforms
(https://github.com/RedHatBrand/Overpass/issues/33).

If the font includes tall/deep writing systems such as Arabic or Devanagari,
the winAscent and winDescent can be greater than the yMax and abs(yMin) to
accommodate vowel marks.

When the win Metrics are significantly greater than the upm, the linespacing
can appear too loose. To counteract this, enabling the OS/2 fsSelection bit 7
(Use_Typo_Metrics), will force Windows to use the OS/2 typo values instead.
This means the font developer can control the linespacing with the typo values,
whilst avoiding clipping by setting the win values to values greater than the
yMax and abs(yMin).


* 🔥 **FAIL** OS/2.usWinAscent value should be equal or greater than 1125, but got 950 instead [code: ascent] * 🔥 **FAIL** OS/2.usWinDescent value should be equal or greater than 363, but got 250 instead [code: descent]
🔥 FAIL: Checking OS/2 Metrics match hhea Metrics. * [com.google.fonts/check/os2_metrics_match_hhea](https://font-bakery.readthedocs.io/en/latest/fontbakery/profiles/universal.html#com.google.fonts/check/os2_metrics_match_hhea)
--- Rationale ---

When OS/2 and hhea vertical metrics match, the same linespacing results on
macOS, GNU+Linux and Windows. Unfortunately as of 2018, Google Fonts has
released many fonts with vertical metrics that don't match in this way. When we
fix this issue in these existing families, we will create a visible change in
line/paragraph layout for either Windows or macOS users, which will upset some
of them.

But we have a duty to fix broken stuff, and inconsistent paragraph layout is
unacceptably broken when it is possible to avoid it.

If users complain and prefer the old broken version, they have the freedom to
take care of their own situation.


* 🔥 **FAIL** OS/2 sTypoAscender (750) and hhea ascent (950) must be equal. [code: ascender]
🔥 FAIL: Are there unwanted tables? * [com.google.fonts/check/unwanted_tables](https://font-bakery.readthedocs.io/en/latest/fontbakery/profiles/universal.html#com.google.fonts/check/unwanted_tables)
--- Rationale ---

Some font editors store source data in their own SFNT tables, and these can
sometimes sneak into final release files, which should only have OpenType spec
tables.


* 🔥 **FAIL** The following unwanted font tables were found: Table: MVAR Reason: Produces a bug in DirectWrite which causes https://bugzilla.mozilla.org/show_bug.cgi?id=1492477, https://github.com/google/fonts/issues/2085 They can be removed by using fonttools/ttx.
🔥 FAIL: Glyph names are all valid? * [com.google.fonts/check/valid_glyphnames](https://font-bakery.readthedocs.io/en/latest/fontbakery/profiles/universal.html#com.google.fonts/check/valid_glyphnames)
--- Rationale ---

Microsoft's recommendations for OpenType Fonts states the following:

'NOTE: The PostScript glyph name must be no longer than 31 characters, include
only uppercase or lowercase English letters, European digits, the period or the
underscore, i.e. from the set [A-Za-z0-9_.] and should start with a letter,
except the special glyph name ".notdef" which starts with a period.'

https://docs.microsoft.com/en-us/typography/opentype/spec/recom#post-table


* 🔥 **FAIL** The following glyph names do not comply with naming conventions: gnrl:hyphen, thai:baht, gmtr:diamondblack, gmtr:diamondwhite, numbersign_numbersign_numbersign.code, numbersign_numbersign_numbersign_numbersign.code and ampersand_ampersand_ampersand.code A glyph name may be up to 31 characters in length, must be entirely comprised of characters from the following set: A-Z a-z 0-9 .(period) _(underscore). and must not start with a digit or period. There are a few exceptions such as the special character ".notdef". The glyph names "twocents", "a1", and "_" are all valid, while "2cents" and ".twocents" are not. [code: found-invalid-names]
🔥 FAIL: Checking font version fields (head and name table). * [com.google.fonts/check/font_version](https://font-bakery.readthedocs.io/en/latest/fontbakery/profiles/head.html#com.google.fonts/check/font_version) * 🔥 **FAIL** head version is "1.005" while name version string (for platform 3, encoding 1) is "Version 1.024". [code: mismatch]
🔥 FAIL: Does the font have a DSIG table? * [com.google.fonts/check/dsig](https://font-bakery.readthedocs.io/en/latest/fontbakery/profiles/dsig.html#com.google.fonts/check/dsig)
--- Rationale ---

Some programs expect fonts to have a digital signature declared in their DSIG
table in order to work properly.

This checks verifies that such signature is available in the font.

Typically, even a fake signature would be enough to make the fonts work. If
needed, such dummy-placeholder can be added to the font by using the `gftools
fix-dsig` script available at https://github.com/googlefonts/gftools


* 🔥 **FAIL** This font lacks a digital signature (DSIG table). Some applications may require one (even if only a dummy placeholder) in order to work properly. You can add a DSIG table by running the `gftools fix-dsig` script. [code: lacks-signature]
WARN: Stricter unitsPerEm criteria for Google Fonts. * [com.google.fonts/check/unitsperem_strict](https://font-bakery.readthedocs.io/en/latest/fontbakery/profiles/googlefonts.html#com.google.fonts/check/unitsperem_strict)
--- Rationale ---

Even though the OpenType spec allows unitsPerEm to be any value between 16 and
16384, the Google Fonts project aims at a narrower set of reasonable values.

The spec suggests usage of powers of two in order to get some performance
improvements on legacy renderers, so those values are acceptable.

But value of 500 or 1000 are also acceptable, with the added benefit that it
makes upm math easier for designers, while the performance hit of not using a
power of two is most likely negligible nowadays.

Another acceptable value is 2000. Since TT outlines are all integers (no
floats), then instances in a VF suffer rounding compromises, and therefore a
1000 UPM is to small because it forces too many such compromises.

Therefore 2000 is a good 'new VF standard', because 2000 is a simple 2x
conversion from existing fonts drawn on a 1000 UPM, and anyone who knows what
10 units can do for 1000 UPM will know what 20 units does too.

Additionally, values above 2048 would result in filesize increases with not
much added benefit.


* ⚠ **WARN** Even though unitsPerEm (1000) in this font is reasonable. It is strongly advised to consider changing it to 2000, since it will likely improve the quality of Variable Fonts by avoiding excessive rounding of coordinates on interpolations. [code: legacy-value]
WARN: Are there caret positions declared for every ligature? * [com.google.fonts/check/ligature_carets](https://font-bakery.readthedocs.io/en/latest/fontbakery/profiles/googlefonts.html#com.google.fonts/check/ligature_carets)
--- Rationale ---

All ligatures in a font must have corresponding caret (text cursor) positions
defined in the GDEF table, otherwhise, users may experience issues with caret
rendering.


* ⚠ **WARN** This font lacks caret position values for ligature glyphs on its GDEF table. [code: lacks-caret-pos]
WARN: Is there kerning info for non-ligated sequences? * [com.google.fonts/check/kerning_for_non_ligated_sequences](https://font-bakery.readthedocs.io/en/latest/fontbakery/profiles/googlefonts.html#com.google.fonts/check/kerning_for_non_ligated_sequences)
--- Rationale ---

Fonts with ligatures should have kerning on the corresponding non-ligated
sequences for text where ligatures aren't used (eg
https://github.com/impallari/Raleway/issues/14).


* ⚠ **WARN** GPOS table lacks kerning info for the following non-ligated sequences: - f + i.italic - i.italic + l.italic [code: lacks-kern-info]
WARN: Checking Vertical Metric Linegaps. * [com.google.fonts/check/linegaps](https://font-bakery.readthedocs.io/en/latest/fontbakery/profiles/hhea.html#com.google.fonts/check/linegaps) * ⚠ **WARN** OS/2 sTypoLineGap is not equal to 0. [code: OS/2]
💤 SKIP: Does DESCRIPTION file contain broken links? * [com.google.fonts/check/description/broken_links](https://font-bakery.readthedocs.io/en/latest/fontbakery/profiles/googlefonts.html#com.google.fonts/check/description/broken_links)
--- Rationale ---

The snippet of HTML in the DESCRIPTION.en_us.html file is added to the font
family webpage on the Google Fonts website. For that reason, all hyperlinks in
it must be properly working. 


* 💤 **SKIP** Unfulfilled Conditions: description
💤 SKIP: Does DESCRIPTION file contain a upstream Git repo URL? * [com.google.fonts/check/description/git_url](https://font-bakery.readthedocs.io/en/latest/fontbakery/profiles/googlefonts.html#com.google.fonts/check/description/git_url)
--- Rationale ---

The contents of the DESCRIPTION.en-us.html file are displayed on the Google
Fonts website in the about section of each font family specimen page.

Since all of the Google Fonts collection is composed of libre-licensed fonts,
this check enforces a policy that there must be a hypertext link in that page
directing users to the repository where the font project files are made
available.

Such hosting is typically done on sites like Github, Gitlab, GNU Savannah or
any other git-based version control service.


* 💤 **SKIP** Unfulfilled Conditions: description
💤 SKIP: Does DESCRIPTION file mention when a family is available as variable font? * [com.google.fonts/check/description/variable_font](https://font-bakery.readthedocs.io/en/latest/fontbakery/profiles/googlefonts.html#com.google.fonts/check/description/variable_font)
--- Rationale ---

Families with variable fonts do not always mention that in their descriptions.
Therefore, this check ensures that a standard boilerplate sentence is present
in the DESCRIPTION.en_us.html files for all those families which are available
as variable fonts.


* 💤 **SKIP** Unfulfilled Conditions: description
💤 SKIP: Is this a proper HTML snippet? * [com.google.fonts/check/description/valid_html](https://font-bakery.readthedocs.io/en/latest/fontbakery/profiles/googlefonts.html#com.google.fonts/check/description/valid_html)
--- Rationale ---

When packaging families for being pushed to the `google/fonts` git repo, if
there is no DESCRIPTION.en_us.html file, some older versions of the
`add_font.py` tool insert a dummy description file which contains invalid html.

This file needs to either be replaced with an existing description file or
edited by hand.


* 💤 **SKIP** Unfulfilled Conditions: descfile
💤 SKIP: DESCRIPTION.en_us.html must have more than 200 bytes. * [com.google.fonts/check/description/min_length](https://font-bakery.readthedocs.io/en/latest/fontbakery/profiles/googlefonts.html#com.google.fonts/check/description/min_length) * 💤 **SKIP** Unfulfilled Conditions: description
💤 SKIP: DESCRIPTION.en_us.html must have less than 1000 bytes. * [com.google.fonts/check/description/max_length](https://font-bakery.readthedocs.io/en/latest/fontbakery/profiles/googlefonts.html#com.google.fonts/check/description/max_length) * 💤 **SKIP** Unfulfilled Conditions: description
💤 SKIP: Font has ttfautohint params? * [com.google.fonts/check/has_ttfautohint_params](https://font-bakery.readthedocs.io/en/latest/fontbakery/profiles/googlefonts.html#com.google.fonts/check/has_ttfautohint_params) * 💤 **SKIP** Font appears to our heuristic as not hinted using ttfautohint. [code: not-hinted]
💤 SKIP: METADATA.pb: Fontfamily is listed on Google Fonts API? * [com.google.fonts/check/metadata/listed_on_gfonts](https://font-bakery.readthedocs.io/en/latest/fontbakery/profiles/googlefonts.html#com.google.fonts/check/metadata/listed_on_gfonts) * 💤 **SKIP** Unfulfilled Conditions: family_metadata
💤 SKIP: Checks METADATA.pb font.name field matches family name declared on the name table. * [com.google.fonts/check/metadata/nameid/family_name](https://font-bakery.readthedocs.io/en/latest/fontbakery/profiles/googlefonts.html#com.google.fonts/check/metadata/nameid/family_name) * 💤 **SKIP** Unfulfilled Conditions: font_metadata
💤 SKIP: Checks METADATA.pb font.post_script_name matches postscript name declared on the name table. * [com.google.fonts/check/metadata/nameid/post_script_name](https://font-bakery.readthedocs.io/en/latest/fontbakery/profiles/googlefonts.html#com.google.fonts/check/metadata/nameid/post_script_name) * 💤 **SKIP** Unfulfilled Conditions: font_metadata
💤 SKIP: METADATA.pb font.full_name value matches fullname declared on the name table? * [com.google.fonts/check/metadata/nameid/full_name](https://font-bakery.readthedocs.io/en/latest/fontbakery/profiles/googlefonts.html#com.google.fonts/check/metadata/nameid/full_name) * 💤 **SKIP** Unfulfilled Conditions: font_metadata
💤 SKIP: METADATA.pb font.name value should be same as the family name declared on the name table. * [com.google.fonts/check/metadata/nameid/font_name](https://font-bakery.readthedocs.io/en/latest/fontbakery/profiles/googlefonts.html#com.google.fonts/check/metadata/nameid/font_name) * 💤 **SKIP** Unfulfilled Conditions: font_metadata, style
💤 SKIP: METADATA.pb font.full_name and font.post_script_name fields have equivalent values ? * [com.google.fonts/check/metadata/match_fullname_postscript](https://font-bakery.readthedocs.io/en/latest/fontbakery/profiles/googlefonts.html#com.google.fonts/check/metadata/match_fullname_postscript) * 💤 **SKIP** Unfulfilled Conditions: font_metadata
💤 SKIP: METADATA.pb font.filename and font.post_script_name fields have equivalent values? * [com.google.fonts/check/metadata/match_filename_postscript](https://font-bakery.readthedocs.io/en/latest/fontbakery/profiles/googlefonts.html#com.google.fonts/check/metadata/match_filename_postscript) * 💤 **SKIP** Unfulfilled Conditions: font_metadata, not is_variable_font
💤 SKIP: METADATA.pb font.name field contains font name in right format? * [com.google.fonts/check/metadata/valid_name_values](https://font-bakery.readthedocs.io/en/latest/fontbakery/profiles/googlefonts.html#com.google.fonts/check/metadata/valid_name_values) * 💤 **SKIP** Unfulfilled Conditions: style, font_metadata
💤 SKIP: METADATA.pb font.full_name field contains font name in right format? * [com.google.fonts/check/metadata/valid_full_name_values](https://font-bakery.readthedocs.io/en/latest/fontbakery/profiles/googlefonts.html#com.google.fonts/check/metadata/valid_full_name_values) * 💤 **SKIP** Unfulfilled Conditions: style, font_metadata
💤 SKIP: METADATA.pb font.filename field contains font name in right format? * [com.google.fonts/check/metadata/valid_filename_values](https://font-bakery.readthedocs.io/en/latest/fontbakery/profiles/googlefonts.html#com.google.fonts/check/metadata/valid_filename_values) * 💤 **SKIP** Unfulfilled Conditions: style, family_metadata
💤 SKIP: METADATA.pb font.post_script_name field contains font name in right format? * [com.google.fonts/check/metadata/valid_post_script_name_values](https://font-bakery.readthedocs.io/en/latest/fontbakery/profiles/googlefonts.html#com.google.fonts/check/metadata/valid_post_script_name_values) * 💤 **SKIP** Unfulfilled Conditions: font_metadata
💤 SKIP: Copyright notices match canonical pattern in METADATA.pb * [com.google.fonts/check/metadata/valid_copyright](https://font-bakery.readthedocs.io/en/latest/fontbakery/profiles/googlefonts.html#com.google.fonts/check/metadata/valid_copyright) * 💤 **SKIP** Unfulfilled Conditions: font_metadata
💤 SKIP: Copyright notice on METADATA.pb should not contain 'Reserved Font Name'. * [com.google.fonts/check/metadata/reserved_font_name](https://font-bakery.readthedocs.io/en/latest/fontbakery/profiles/googlefonts.html#com.google.fonts/check/metadata/reserved_font_name) * 💤 **SKIP** Unfulfilled Conditions: font_metadata
💤 SKIP: METADATA.pb: Copyright notice shouldn't exceed 500 chars. * [com.google.fonts/check/metadata/copyright_max_length](https://font-bakery.readthedocs.io/en/latest/fontbakery/profiles/googlefonts.html#com.google.fonts/check/metadata/copyright_max_length) * 💤 **SKIP** Unfulfilled Conditions: font_metadata
💤 SKIP: METADATA.pb font.style "italic" matches font internals? * [com.google.fonts/check/metadata/italic_style](https://font-bakery.readthedocs.io/en/latest/fontbakery/profiles/googlefonts.html#com.google.fonts/check/metadata/italic_style) * 💤 **SKIP** Unfulfilled Conditions: font_metadata
💤 SKIP: METADATA.pb font.style "normal" matches font internals? * [com.google.fonts/check/metadata/normal_style](https://font-bakery.readthedocs.io/en/latest/fontbakery/profiles/googlefonts.html#com.google.fonts/check/metadata/normal_style) * 💤 **SKIP** Unfulfilled Conditions: font_metadata
💤 SKIP: METADATA.pb font.name and font.full_name fields match the values declared on the name table? * [com.google.fonts/check/metadata/nameid/family_and_full_names](https://font-bakery.readthedocs.io/en/latest/fontbakery/profiles/googlefonts.html#com.google.fonts/check/metadata/nameid/family_and_full_names) * 💤 **SKIP** Unfulfilled Conditions: font_metadata
💤 SKIP: METADATA.pb: Check if fontname is not camel cased. * [com.google.fonts/check/metadata/fontname_not_camel_cased](https://font-bakery.readthedocs.io/en/latest/fontbakery/profiles/googlefonts.html#com.google.fonts/check/metadata/fontname_not_camel_cased) * 💤 **SKIP** Unfulfilled Conditions: font_metadata
💤 SKIP: METADATA.pb: Check font name is the same as family name. * [com.google.fonts/check/metadata/match_name_familyname](https://font-bakery.readthedocs.io/en/latest/fontbakery/profiles/googlefonts.html#com.google.fonts/check/metadata/match_name_familyname) * 💤 **SKIP** Unfulfilled Conditions: family_metadata, font_metadata
💤 SKIP: METADATA.pb: Check that font weight has a canonical value. * [com.google.fonts/check/metadata/canonical_weight_value](https://font-bakery.readthedocs.io/en/latest/fontbakery/profiles/googlefonts.html#com.google.fonts/check/metadata/canonical_weight_value) * 💤 **SKIP** Unfulfilled Conditions: font_metadata
💤 SKIP: Checking OS/2 usWeightClass matches weight specified at METADATA.pb. * [com.google.fonts/check/metadata/os2_weightclass](https://font-bakery.readthedocs.io/en/latest/fontbakery/profiles/googlefonts.html#com.google.fonts/check/metadata/os2_weightclass) * 💤 **SKIP** Unfulfilled Conditions: font_metadata
💤 SKIP: METADATA.pb weight matches postScriptName. * [com.google.fonts/check/metadata/match_weight_postscript](https://font-bakery.readthedocs.io/en/latest/fontbakery/profiles/googlefonts.html#com.google.fonts/check/metadata/match_weight_postscript) * 💤 **SKIP** Unfulfilled Conditions: font_metadata
💤 SKIP: METADATA.pb: Font styles are named canonically? * [com.google.fonts/check/metadata/canonical_style_names](https://font-bakery.readthedocs.io/en/latest/fontbakery/profiles/googlefonts.html#com.google.fonts/check/metadata/canonical_style_names) * 💤 **SKIP** Unfulfilled Conditions: font_metadata
💤 SKIP: Glyphs are similiar to Google Fonts version? * [com.google.fonts/check/production_glyphs_similarity](https://font-bakery.readthedocs.io/en/latest/fontbakery/profiles/googlefonts.html#com.google.fonts/check/production_glyphs_similarity) * 💤 **SKIP** Unfulfilled Conditions: api_gfonts_ttFont
💤 SKIP: Checking OS/2 fsSelection value. * [com.google.fonts/check/fsselection](https://font-bakery.readthedocs.io/en/latest/fontbakery/profiles/googlefonts.html#com.google.fonts/check/fsselection) * 💤 **SKIP** Unfulfilled Conditions: style
💤 SKIP: Checking post.italicAngle value. * [com.google.fonts/check/italic_angle](https://font-bakery.readthedocs.io/en/latest/fontbakery/profiles/googlefonts.html#com.google.fonts/check/italic_angle)
--- Rationale ---

The 'post' table italicAngle property should be a reasonable amount, likely not
more than -20°, never more than -30°, and never greater than 0°. Note that in
the OpenType specification, the value is negative for a lean rightwards.

https://docs.microsoft.com/en-us/typography/opentype/spec/post


* 💤 **SKIP** Unfulfilled Conditions: style
💤 SKIP: Checking head.macStyle value. * [com.google.fonts/check/mac_style](https://font-bakery.readthedocs.io/en/latest/fontbakery/profiles/googlefonts.html#com.google.fonts/check/mac_style)
--- Rationale ---

The values of the flags on the macStyle entry on the 'head' OpenType table that
describe whether a font is bold and/or italic must be coherent with the actual
style of the font as inferred by its filename.


* 💤 **SKIP** Unfulfilled Conditions: style
💤 SKIP: Check if each glyph has the recommended amount of contours. * [com.google.fonts/check/contour_count](https://font-bakery.readthedocs.io/en/latest/fontbakery/profiles/googlefonts.html#com.google.fonts/check/contour_count)
--- Rationale ---

Visually QAing thousands of glyphs by hand is tiring. Most glyphs can only be
constructured in a handful of ways. This means a glyph's contour count will
only differ slightly amongst different fonts, e.g a 'g' could either be 2 or 3
contours, depending on whether its double story or single story.

However, a quotedbl should have 2 contours, unless the font belongs to a
display family.

This check currently does not cover variable fonts because there's plenty of
alternative ways of constructing glyphs with multiple outlines for each feature
in a VarFont. The expected contour count data for this check is currently
optimized for the typical construction of glyphs in static fonts.


* 💤 **SKIP** Unfulfilled Conditions: not is_variable_font
💤 SKIP: Copyright field for this font on METADATA.pb matches all copyright notice entries on the name table ? * [com.google.fonts/check/metadata/nameid/copyright](https://font-bakery.readthedocs.io/en/latest/fontbakery/profiles/googlefonts.html#com.google.fonts/check/metadata/nameid/copyright) * 💤 **SKIP** Unfulfilled Conditions: font_metadata
💤 SKIP: Font has all mandatory 'name' table entries? * [com.google.fonts/check/name/mandatory_entries](https://font-bakery.readthedocs.io/en/latest/fontbakery/profiles/googlefonts.html#com.google.fonts/check/name/mandatory_entries) * 💤 **SKIP** Unfulfilled Conditions: style
💤 SKIP: Check name table: FONT_FAMILY_NAME entries. * [com.google.fonts/check/name/familyname](https://font-bakery.readthedocs.io/en/latest/fontbakery/profiles/googlefonts.html#com.google.fonts/check/name/familyname)
--- Rationale ---

Checks that the family name infered from the font filename matches the string
at nameID 1 (NAMEID_FONT_FAMILY_NAME) if it conforms to RIBBI and otherwise
checks that nameID 1 is the family name + the style name.


* 💤 **SKIP** Unfulfilled Conditions: style
💤 SKIP: Check name table: FULL_FONT_NAME entries. * [com.google.fonts/check/name/fullfontname](https://font-bakery.readthedocs.io/en/latest/fontbakery/profiles/googlefonts.html#com.google.fonts/check/name/fullfontname) * 💤 **SKIP** Unfulfilled Conditions: style_with_spaces
💤 SKIP: Check name table: POSTSCRIPT_NAME entries. * [com.google.fonts/check/name/postscriptname](https://font-bakery.readthedocs.io/en/latest/fontbakery/profiles/googlefonts.html#com.google.fonts/check/name/postscriptname) * 💤 **SKIP** Unfulfilled Conditions: style
💤 SKIP: Check name table: TYPOGRAPHIC_FAMILY_NAME entries. * [com.google.fonts/check/name/typographicfamilyname](https://font-bakery.readthedocs.io/en/latest/fontbakery/profiles/googlefonts.html#com.google.fonts/check/name/typographicfamilyname) * 💤 **SKIP** Unfulfilled Conditions: style
💤 SKIP: PPEM must be an integer on hinted fonts. * [com.google.fonts/check/integer_ppem_if_hinted](https://font-bakery.readthedocs.io/en/latest/fontbakery/profiles/googlefonts.html#com.google.fonts/check/integer_ppem_if_hinted)
--- Rationale ---

Hinted fonts must have head table flag bit 3 set.

Per https://docs.microsoft.com/en-us/typography/opentype/spec/head, bit 3 of
Head::flags decides whether PPEM should be rounded. This bit should always be
set for hinted fonts.

Note:
Bit 3 = Force ppem to integer values for all internal scaler math;
        May use fractional ppem sizes if this bit is clear;


* 💤 **SKIP** Unfulfilled Conditions: is_hinted
💤 SKIP: Directory name in GFonts repo structure must match NameID 1 of the regular. * [com.google.fonts/check/repo/dirname_matches_nameid_1](https://font-bakery.readthedocs.io/en/latest/fontbakery/profiles/googlefonts.html#com.google.fonts/check/repo/dirname_matches_nameid_1) * 💤 **SKIP** Unfulfilled Conditions: gfonts_repo_structure, not is_variable_font
💤 SKIP: Check if the vertical metrics of a family are similar to the same family hosted on Google Fonts. * [com.google.fonts/check/vertical_metrics_regressions](https://font-bakery.readthedocs.io/en/latest/fontbakery/profiles/googlefonts.html#com.google.fonts/check/vertical_metrics_regressions)
--- Rationale ---

If the family already exists on Google Fonts, we need to ensure that the
checked family's vertical metrics are similar. This check will test the
following schema which was outlined in Fontbakery issue #1162 [1]:

- The family should visually have the same vertical metrics as the
  Regular style hosted on Google Fonts.
- If the family on Google Fonts has differing hhea and typo metrics,
  the family being checked should use the typo metrics for both the
  hhea and typo entries.
- If the family on Google Fonts has use typo metrics not enabled and the
  family being checked has it enabled, the hhea and typo metrics
  should use the family on Google Fonts winAscent and winDescent values.
- If the upms differ, the values must be scaled so the visual appearance
  is the same.

[1] https://github.com/googlefonts/fontbakery/issues/1162


* 💤 **SKIP** Unfulfilled Conditions: remote_styles
💤 SKIP: Is the CFF subr/gsubr call depth > 10? * [com.adobe.fonts/check/cff_call_depth](https://font-bakery.readthedocs.io/en/latest/fontbakery/profiles/cff.html#com.adobe.fonts/check/cff_call_depth)
--- Rationale ---

Per "The Type 2 Charstring Format, Technical Note #5177", the "Subr nesting,
stack limit" is 10.


* 💤 **SKIP** Unfulfilled Conditions: is_cff
💤 SKIP: Is the CFF2 subr/gsubr call depth > 10? * [com.adobe.fonts/check/cff2_call_depth](https://font-bakery.readthedocs.io/en/latest/fontbakery/profiles/cff.html#com.adobe.fonts/check/cff2_call_depth)
--- Rationale ---

Per "The CFF2 CharString Format", the "Subr nesting, stack limit" is 10.


* 💤 **SKIP** Unfulfilled Conditions: is_cff2
💤 SKIP: CFF table FontName must match name table ID 6 (PostScript name). * [com.adobe.fonts/check/name/postscript_vs_cff](https://font-bakery.readthedocs.io/en/latest/fontbakery/profiles/name.html#com.adobe.fonts/check/name/postscript_vs_cff)
--- Rationale ---

The PostScript name entries in the font's 'name' table should match the
FontName string in the 'CFF ' table.

The 'CFF ' table has a lot of information that is duplicated in other tables.
This information should be consistent across tables, because there's no
guarantee which table an app will get the data from.


* 💤 **SKIP** Unfulfilled Conditions: is_cff
💤 SKIP: Monospace font has hhea.advanceWidthMax equal to each glyph's advanceWidth? * [com.google.fonts/check/monospace_max_advancewidth](https://font-bakery.readthedocs.io/en/latest/fontbakery/profiles/hhea.html#com.google.fonts/check/monospace_max_advancewidth) * 💤 **SKIP** Font is not monospaced.
💤 SKIP: The variable font 'wght' (Weight) axis coordinate must be 400 on the 'Regular' instance. * [com.google.fonts/check/varfont/regular_wght_coord](https://font-bakery.readthedocs.io/en/latest/fontbakery/profiles/fvar.html#com.google.fonts/check/varfont/regular_wght_coord)
--- Rationale ---

According to the Open-Type spec's registered design-variation tag 'wght'
available at
https://docs.microsoft.com/en-gb/typography/opentype/spec/dvaraxistag_wght

If a variable font has a 'wght' (Weight) axis, then the coordinate of its
'Regular' instance is required to be 400.


* 💤 **SKIP** Unfulfilled Conditions: regular_wght_coord
💤 SKIP: The variable font 'wdth' (Width) axis coordinate must be 100 on the 'Regular' instance. * [com.google.fonts/check/varfont/regular_wdth_coord](https://font-bakery.readthedocs.io/en/latest/fontbakery/profiles/fvar.html#com.google.fonts/check/varfont/regular_wdth_coord)
--- Rationale ---

According to the Open-Type spec's registered design-variation tag 'wdth'
available at
https://docs.microsoft.com/en-gb/typography/opentype/spec/dvaraxistag_wdth

If a variable font has a 'wdth' (Width) axis, then the coordinate of its
'Regular' instance is required to be 100.


* 💤 **SKIP** Unfulfilled Conditions: regular_wdth_coord
💤 SKIP: The variable font 'slnt' (Slant) axis coordinate must be zero on the 'Regular' instance. * [com.google.fonts/check/varfont/regular_slnt_coord](https://font-bakery.readthedocs.io/en/latest/fontbakery/profiles/fvar.html#com.google.fonts/check/varfont/regular_slnt_coord)
--- Rationale ---

According to the Open-Type spec's registered design-variation tag 'slnt'
available at
https://docs.microsoft.com/en-gb/typography/opentype/spec/dvaraxistag_slnt

If a variable font has a 'slnt' (Slant) axis, then the coordinate of its
'Regular' instance is required to be zero.


* 💤 **SKIP** Unfulfilled Conditions: regular_slnt_coord
💤 SKIP: The variable font 'ital' (Italic) axis coordinate must be zero on the 'Regular' instance. * [com.google.fonts/check/varfont/regular_ital_coord](https://font-bakery.readthedocs.io/en/latest/fontbakery/profiles/fvar.html#com.google.fonts/check/varfont/regular_ital_coord)
--- Rationale ---

According to the Open-Type spec's registered design-variation tag 'ital'
available at
https://docs.microsoft.com/en-gb/typography/opentype/spec/dvaraxistag_ital

If a variable font has a 'ital' (Italic) axis, then the coordinate of its
'Regular' instance is required to be zero.


* 💤 **SKIP** Unfulfilled Conditions: regular_ital_coord
💤 SKIP: The variable font 'opsz' (Optical Size) axis coordinate should be between 9 and 13 on the 'Regular' instance. * [com.google.fonts/check/varfont/regular_opsz_coord](https://font-bakery.readthedocs.io/en/latest/fontbakery/profiles/fvar.html#com.google.fonts/check/varfont/regular_opsz_coord)
--- Rationale ---

According to the Open-Type spec's registered design-variation tag 'opsz'
available at
https://docs.microsoft.com/en-gb/typography/opentype/spec/dvaraxistag_opsz

If a variable font has a 'opsz' (Optical Size) axis, then the coordinate of its
'Regular' instance is recommended to be a value in the range 9 to 13.


* 💤 **SKIP** Unfulfilled Conditions: regular_opsz_coord
💤 SKIP: The variable font 'wght' (Weight) axis coordinate must be 700 on the 'Bold' instance. * [com.google.fonts/check/varfont/bold_wght_coord](https://font-bakery.readthedocs.io/en/latest/fontbakery/profiles/fvar.html#com.google.fonts/check/varfont/bold_wght_coord)
--- Rationale ---

The Open-Type spec's registered design-variation tag 'wght' available at
https://docs.microsoft.com/en-gb/typography/opentype/spec/dvaraxistag_wght does
not specify a required value for the 'Bold' instance of a variable font.

But Dave Crossland suggested that we should enforce a required value of 700 in
this case.


* 💤 **SKIP** Unfulfilled Conditions: bold_wght_coord
INFO: Show hinting filesize impact. * [com.google.fonts/check/hinting_impact](https://font-bakery.readthedocs.io/en/latest/fontbakery/profiles/googlefonts.html#com.google.fonts/check/hinting_impact)
--- Rationale ---

This check is merely informative, displaying and useful comparison of filesizes
after ttfautohint usage versus unhinted font files.


* ℹ **INFO** Hinting filesize impact: | | font_betas/recursive-MONO_CASL_wght_slnt_ital--full_gsub--2019_11_19-19_44.ttf | |:--- | ---:| | Dehinted Size | 1.3Mb | | Hinted Size | 1.3Mb | | Increase | -572 bytes | | Change | -0.0 % | [code: size-impact]
INFO: Font has old ttfautohint applied? * [com.google.fonts/check/old_ttfautohint](https://font-bakery.readthedocs.io/en/latest/fontbakery/profiles/googlefonts.html#com.google.fonts/check/old_ttfautohint)
--- Rationale ---

This check finds which version of ttfautohint was used, by inspecting name
table entries and then finds which version of ttfautohint is currently
installed in the system.


* ℹ **INFO** Could not detect which version of ttfautohint was used in this font. It is typically specified as a comment in the font version entries of the 'name' table. Such font version strings are currently: ['Version 1.024'] [code: version-not-detected]
INFO: EPAR table present in font? * [com.google.fonts/check/epar](https://font-bakery.readthedocs.io/en/latest/fontbakery/profiles/googlefonts.html#com.google.fonts/check/epar)
--- Rationale ---

The EPAR table is/was a way of expressing common licensing permissions and
restrictions in metadata; while almost nothing supported it, Dave Crossland
wonders that adding it to everything in Google Fonts could help make it more
popular.

More info is available at:
https://davelab6.github.io/epar/


* ℹ **INFO** EPAR table not present in font. To learn more see https://github.com/googlefonts/fontbakery/issues/818 [code: lacks-EPAR]
INFO: Check for font-v versioning. * [com.google.fonts/check/fontv](https://font-bakery.readthedocs.io/en/latest/fontbakery/profiles/googlefonts.html#com.google.fonts/check/fontv)
--- Rationale ---

The git sha1 tagging and dev/release features of Source Foundry `font-v` tool
are awesome and we would love to consider upstreaming the approach into
fontmake someday. For now we only emit a WARN if a given font does not yet
follow the experimental versioning style, but at some point we may start
enforcing it.


* ℹ **INFO** Version string is: "Version 1.024" The version string must ideally include a git commit hash and either a "dev" or a "release" suffix such as in the example below: "Version 1.3; git-0d08353-release" [code: bad-format]
INFO: Font contains all required tables? * [com.google.fonts/check/required_tables](https://font-bakery.readthedocs.io/en/latest/fontbakery/profiles/universal.html#com.google.fonts/check/required_tables)
--- Rationale ---

Depending on the typeface and coverage of a font, certain tables are
recommended for optimum quality. For example, the performance of a non-linear
font is improved if the VDMX, LTSH, and hdmx tables are present. Non-monospaced
Latin fonts should have a kern table. A gasp table is necessary if a designer
wants to influence the sizes at which grayscaling is used under Windows. A DSIG
table containing a digital signature helps ensure the integrity of the font
file. Etc.


* ℹ **INFO** This font contains the following optional tables [GPOS, loca, GSUB] * 🍞 **PASS** Font contains all required tables.
INFO: Font follows the family naming recommendations? * [com.google.fonts/check/family_naming_recommendations](https://font-bakery.readthedocs.io/en/latest/fontbakery/profiles/name.html#com.google.fonts/check/family_naming_recommendations) * ℹ **INFO** Font does not follow some family naming recommendations: | Field | Value | Recommendation | |:----- |:----- |:-------------- | | PostScript Name | RecursiveBeta_1_024-SansLinearA | May contain only a-zA-Z0-9 characters and an hyphen. | | PostScript Name | RecursiveBeta_1_024-SansLinearA | exceeds max length (29) | [code: bad-entries]
🍞 PASS: Checking OS/2 achVendID. * [com.google.fonts/check/vendor_id](https://font-bakery.readthedocs.io/en/latest/fontbakery/profiles/googlefonts.html#com.google.fonts/check/vendor_id) * 🍞 **PASS** OS/2 VendorID 'ARRW' looks good!
🍞 PASS: Check `Google Fonts Latin Core` glyph coverage. * [com.google.fonts/check/glyph_coverage](https://font-bakery.readthedocs.io/en/latest/fontbakery/profiles/googlefonts.html#com.google.fonts/check/glyph_coverage)
--- Rationale ---

Google Fonts expects that fonts in its collection support at least the minimal
set of characters defined in the `GF-latin-core` glyph-set.


* 🍞 **PASS** OK
🍞 PASS: Substitute copyright, registered and trademark symbols in name table entries. * [com.google.fonts/check/name/unwanted_chars](https://font-bakery.readthedocs.io/en/latest/fontbakery/profiles/googlefonts.html#com.google.fonts/check/name/unwanted_chars) * 🍞 **PASS** No need to substitute copyright, registered and trademark symbols in name table entries of this font.
🍞 PASS: Checking OS/2 usWeightClass. * [com.google.fonts/check/usweightclass](https://font-bakery.readthedocs.io/en/latest/fontbakery/profiles/googlefonts.html#com.google.fonts/check/usweightclass) * 🍞 **PASS** OS/2 usWeightClass value looks good!
🍞 PASS: Description strings in the name table must not exceed 200 characters. * [com.google.fonts/check/name/description_max_length](https://font-bakery.readthedocs.io/en/latest/fontbakery/profiles/googlefonts.html#com.google.fonts/check/name/description_max_length)
--- Rationale ---

An old FontLab version had a bug which caused it to store copyright notices in
nameID 10 entries.

In order to detect those and distinguish them from actual legitimate usage of
this name table entry, we expect that such strings do not exceed a reasonable
length of 200 chars.

Longer strings are likely instances of the FontLab bug.


* 🍞 **PASS** All description name records have reasonably small lengths.
🍞 PASS: Version format is correct in 'name' table? * [com.google.fonts/check/name/version_format](https://font-bakery.readthedocs.io/en/latest/fontbakery/profiles/googlefonts.html#com.google.fonts/check/name/version_format) * 🍞 **PASS** Version format in NAME table entries is correct.
🍞 PASS: Make sure family name does not begin with a digit. * [com.google.fonts/check/name/familyname_first_char](https://font-bakery.readthedocs.io/en/latest/fontbakery/profiles/googlefonts.html#com.google.fonts/check/name/familyname_first_char)
--- Rationale ---

Font family names which start with a numeral are often not discoverable in
Windows applications.


* 🍞 **PASS** Font family name first character is not a digit.
🍞 PASS: Are there non-ASCII characters in ASCII-only NAME table entries? * [com.google.fonts/check/name/ascii_only_entries](https://font-bakery.readthedocs.io/en/latest/fontbakery/profiles/googlefonts.html#com.google.fonts/check/name/ascii_only_entries)
--- Rationale ---

The OpenType spec requires ASCII for the POSTSCRIPT_NAME (nameID 6).

For COPYRIGHT_NOTICE (nameID 0) ASCII is required because that string should be
the same in CFF fonts which also have this requirement in the OpenType spec.

Note:
A common place where we find non-ASCII strings is on name table entries with
NameID > 18, which are expressly for localising the ASCII-only IDs into Hindi /
Arabic / etc.


* 🍞 **PASS** None of the ASCII-only NAME table entries contain non-ASCII characteres.
🍞 PASS: Copyright notices match canonical pattern in fonts * [com.google.fonts/check/font_copyright](https://font-bakery.readthedocs.io/en/latest/fontbakery/profiles/googlefonts.html#com.google.fonts/check/font_copyright) * 🍞 **PASS** Name Table entry: Copyright field 'Copyright 2019 The Recursive Project Authors (github.com/arrowtype/recursive)' matches canonical pattern. * 🍞 **PASS** Name table copyright entries are good
🍞 PASS: Check name table: FONT_SUBFAMILY_NAME entries. * [com.google.fonts/check/name/subfamilyname](https://font-bakery.readthedocs.io/en/latest/fontbakery/profiles/googlefonts.html#com.google.fonts/check/name/subfamilyname) * 🍞 **PASS** FONT_SUBFAMILY_NAME entries are all good.
🍞 PASS: Length of copyright notice must not exceed 500 characters. * [com.google.fonts/check/name/copyright_length](https://font-bakery.readthedocs.io/en/latest/fontbakery/profiles/googlefonts.html#com.google.fonts/check/name/copyright_length)
--- Rationale ---

This is an arbitrary max length for the copyright notice field of the name
table. We simply don't want such notices to be too long. Typically such notices
are actually much shorter than this with a length of roughly 70 or 80
characters.


* 🍞 **PASS** All copyright notice name entries on the 'name' table are shorter than 500 characters.
🍞 PASS: Familyname must be unique according to namecheck.fontdata.com * [com.google.fonts/check/fontdata_namecheck](https://font-bakery.readthedocs.io/en/latest/fontbakery/profiles/googlefonts.html#com.google.fonts/check/fontdata_namecheck)
--- Rationale ---

We need to check names are not already used, and today the best place to check
that is http://namecheck.fontdata.com


* 🍞 **PASS** Font familyname seems to be unique.
🍞 PASS: Check a static ttf can be generated from a variable font. * [com.google.fonts/check/varfont/generate_static](https://font-bakery.readthedocs.io/en/latest/fontbakery/profiles/googlefonts.html#com.google.fonts/check/varfont/generate_static)
--- Rationale ---

Google Fonts may serve static fonts which have been generated from variable
fonts. This test will attempt to generate a static ttf using fontTool's varLib
mutator.

The target font will be the mean of each axis e.g:

**VF font axes**

- min weight, max weight = 400, 800
- min width, max width = 50, 100

**Target Instance**

- weight = 600
- width = 75


* 🍞 **PASS** fontTools.varLib.mutator generated a static font instance
🍞 PASS: Check that variable fonts have an HVAR table. * [com.google.fonts/check/varfont/has_HVAR](https://font-bakery.readthedocs.io/en/latest/fontbakery/profiles/googlefonts.html#com.google.fonts/check/varfont/has_HVAR)
--- Rationale ---

Not having a HVAR table can lead to costly text-layout operations on some
platforms, which we want to avoid.

So, all variable fonts on the Google Fonts collection should have an HVAR with
valid values.

More info on the HVAR table can be found at:
https://docs.microsoft.com/en-us/typography/opentype/spec/otvaroverview#variation-data-tables-and-miscellaneous-requirements


* 🍞 **PASS** This variable font contains an HVAR table.
🍞 PASS: There must not be VTT Talk sources in the font. * [com.google.fonts/check/vttclean](https://font-bakery.readthedocs.io/en/latest/fontbakery/profiles/googlefonts.html#com.google.fonts/check/vttclean)
--- Rationale ---

The goal here is to reduce filesizes and improve pageloading when dealing with
webfonts.

The VTT Talk sources are not necessary at runtime and endup being just dead
weight when left embedded in the font binaries. The sources should be kept on
the project files but stripped out when building release binaries.


* 🍞 **PASS** There are no tables with VTT Talk sources embedded in the font.
🍞 PASS: Are there unwanted Apple tables? * [com.google.fonts/check/aat](https://font-bakery.readthedocs.io/en/latest/fontbakery/profiles/googlefonts.html#com.google.fonts/check/aat)
--- Rationale ---

Apple's TrueType reference manual [1] describes SFNT tables not in the
Microsoft OpenType specification [2] and these can sometimes sneak into final
release files, but Google Fonts should only have OpenType tables.

[1] https://developer.apple.com/fonts/TrueType-Reference-Manual/RM06/Chap6.html
[2] https://docs.microsoft.com/en-us/typography/opentype/spec/


* 🍞 **PASS** There are no unwanted AAT tables.
🍞 PASS: All name entries referenced by fvar instances exist on the name table? * [com.google.fonts/check/fvar_name_entries](https://font-bakery.readthedocs.io/en/latest/fontbakery/profiles/googlefonts.html#com.google.fonts/check/fvar_name_entries)
--- Rationale ---

The purpose of this check is to make sure that all name entries referenced by
variable font instances do exist in the name table.


* 🍞 **PASS** OK
🍞 PASS: A variable font must have named instances. * [com.google.fonts/check/varfont_has_instances](https://font-bakery.readthedocs.io/en/latest/fontbakery/profiles/googlefonts.html#com.google.fonts/check/varfont_has_instances)
--- Rationale ---

Named instances must be present in all variable fonts in order not to frustrate
the users' typical expectations of a traditional static font workflow.


* 🍞 **PASS** OK
🍞 PASS: Combined length of family and style must not exceed 27 characters. * [com.google.fonts/check/name/family_and_style_max_length](https://font-bakery.readthedocs.io/en/latest/fontbakery/profiles/googlefonts.html#com.google.fonts/check/name/family_and_style_max_length)
--- Rationale ---

According to a GlyphsApp tutorial [1], in order to make sure all versions of
Windows recognize it as a valid font file, we must make sure that the
concatenated length of the familyname (NameID.FONT_FAMILY_NAME) and style
(NameID.FONT_SUBFAMILY_NAME) strings in the name table do not exceed 20
characters.

After discussing the problem in more detail at `FontBakery issue #2179 [2] we
decided that allowing up to 27 chars would still be on the safe side, though.

[1]
https://glyphsapp.com/tutorials/multiple-masters-part-3-setting-up-instances
[2] https://github.com/googlefonts/fontbakery/issues/2179


* 🍞 **PASS** All name entries are good.
🍞 PASS: Name table records must not have trailing spaces. * [com.google.fonts/check/name/trailing_spaces](https://font-bakery.readthedocs.io/en/latest/fontbakery/profiles/universal.html#com.google.fonts/check/name/trailing_spaces) * 🍞 **PASS** No trailing spaces on name table entries.
🍞 PASS: Checking with ots-sanitize. * [com.google.fonts/check/ots](https://font-bakery.readthedocs.io/en/latest/fontbakery/profiles/universal.html#com.google.fonts/check/ots) * 🍞 **PASS** ots-sanitize passed this file
🍞 PASS: Font contains .notdef as first glyph? * [com.google.fonts/check/mandatory_glyphs](https://font-bakery.readthedocs.io/en/latest/fontbakery/profiles/universal.html#com.google.fonts/check/mandatory_glyphs)
--- Rationale ---

The OpenType specification v1.8.2 recommends that the first glyph is the
.notdef glyph without a codepoint assigned and with a drawing.

https://docs.microsoft.com/en-us/typography/opentype/spec/recom#glyph-0-the-notdef-glyph

Pre-v1.8, it was recommended that a font should also contain a .null, CR and
space glyph. This might have been relevant for applications on MacOS 9.


* 🍞 **PASS** Font contains the .notdef glyph as the first glyph, it does not have a Unicode value assigned and contains a drawing.
🍞 PASS: Font contains glyphs for whitespace characters? * [com.google.fonts/check/whitespace_glyphs](https://font-bakery.readthedocs.io/en/latest/fontbakery/profiles/universal.html#com.google.fonts/check/whitespace_glyphs) * 🍞 **PASS** Font contains glyphs for whitespace characters.
🍞 PASS: Font has **proper** whitespace glyph names? * [com.google.fonts/check/whitespace_glyphnames](https://font-bakery.readthedocs.io/en/latest/fontbakery/profiles/universal.html#com.google.fonts/check/whitespace_glyphnames) * 🍞 **PASS** Font has **proper** whitespace glyph names.
🍞 PASS: Whitespace glyphs have ink? * [com.google.fonts/check/whitespace_ink](https://font-bakery.readthedocs.io/en/latest/fontbakery/profiles/universal.html#com.google.fonts/check/whitespace_ink) * 🍞 **PASS** There is no whitespace glyph with ink.
🍞 PASS: Font contains unique glyph names? * [com.google.fonts/check/unique_glyphnames](https://font-bakery.readthedocs.io/en/latest/fontbakery/profiles/universal.html#com.google.fonts/check/unique_glyphnames)
--- Rationale ---

Duplicate glyph names prevent font installation on Mac OS X.


* 🍞 **PASS** Font contains unique glyph names.
🍞 PASS: Checking with fontTools.ttx * [com.google.fonts/check/ttx-roundtrip](https://font-bakery.readthedocs.io/en/latest/fontbakery/profiles/universal.html#com.google.fonts/check/ttx-roundtrip) * 🍞 **PASS** Hey! It all looks good!
🍞 PASS: Check all glyphs have codepoints assigned. * [com.google.fonts/check/all_glyphs_have_codepoints](https://font-bakery.readthedocs.io/en/latest/fontbakery/profiles/cmap.html#com.google.fonts/check/all_glyphs_have_codepoints) * 🍞 **PASS** All glyphs have a codepoint value assigned.
🍞 PASS: Checking unitsPerEm value is reasonable. * [com.google.fonts/check/unitsperem](https://font-bakery.readthedocs.io/en/latest/fontbakery/profiles/head.html#com.google.fonts/check/unitsperem)
--- Rationale ---

According to the OpenType spec:

The value of unitsPerEm at the head table must be a value between 16 and 16384.
Any value in this range is valid.

In fonts that have TrueType outlines, a power of 2 is recommended as this
allows performance optimizations in some rasterizers.

But 1000 is a commonly used value. And 2000 may become increasingly more common
on Variable Fonts.


* 🍞 **PASS** The unitsPerEm value (1000) on the 'head' table is reasonable.
🍞 PASS: Check if OS/2 xAvgCharWidth is correct. * [com.google.fonts/check/xavgcharwidth](https://font-bakery.readthedocs.io/en/latest/fontbakery/profiles/os2.html#com.google.fonts/check/xavgcharwidth) * 🍞 **PASS** OS/2 xAvgCharWidth value is correct.
🍞 PASS: Check if OS/2 fsSelection matches head macStyle bold and italic bits. * [com.adobe.fonts/check/fsselection_matches_macstyle](https://font-bakery.readthedocs.io/en/latest/fontbakery/profiles/os2.html#com.adobe.fonts/check/fsselection_matches_macstyle)
--- Rationale ---

The bold and italic bits in OS/2.fsSelection must match the bold and italic
bits in head.macStyle per the OpenType spec.


* 🍞 **PASS** The OS/2.fsSelection and head.macStyle bold and italic settings match.
🍞 PASS: Check code page character ranges * [com.google.fonts/check/code_pages](https://font-bakery.readthedocs.io/en/latest/fontbakery/profiles/os2.html#com.google.fonts/check/code_pages)
--- Rationale ---

At least some programs (such as Word and Sublime Text) under Windows 7 do not
recognize fonts unless code page bits are properly set on the ulCodePageRange1
(and/or ulCodePageRange2) fields of the OS/2 table.

More specifically, the fonts are selectable in the font menu, but whichever
Windows API these applications use considers them unsuitable for any character
set, so anything set in these fonts is rendered with a fallback font of Arial.

This check currently does not identify which code pages should be set.
Auto-detecting coverage is not trivial since the OpenType specification leaves
the interpretation of whether a given code page is "functional" or not open to
the font developer to decide.

So here we simply detect as a FAIL when a given font has no code page declared
at all.


* 🍞 **PASS** At least one code page is defined.
🍞 PASS: Font has correct post table version (2 for TTF, 3 for OTF)? * [com.google.fonts/check/post_table_version](https://font-bakery.readthedocs.io/en/latest/fontbakery/profiles/post.html#com.google.fonts/check/post_table_version) * 🍞 **PASS** Font has post table version 2.
🍞 PASS: Check name table for empty records. * [com.adobe.fonts/check/name/empty_records](https://font-bakery.readthedocs.io/en/latest/fontbakery/profiles/name.html#com.adobe.fonts/check/name/empty_records)
--- Rationale ---

Check the name table for empty records, as this can cause problems in Adobe
apps.


* 🍞 **PASS** No empty name table records found.
🍞 PASS: Description strings in the name table must not contain copyright info. * [com.google.fonts/check/name/no_copyright_on_description](https://font-bakery.readthedocs.io/en/latest/fontbakery/profiles/name.html#com.google.fonts/check/name/no_copyright_on_description) * 🍞 **PASS** Description strings in the name table do not contain any copyright string.
🍞 PASS: Checking correctness of monospaced metadata. * [com.google.fonts/check/monospace](https://font-bakery.readthedocs.io/en/latest/fontbakery/profiles/name.html#com.google.fonts/check/monospace)
--- Rationale ---

There are various metadata in the OpenType spec to specify if a font is
monospaced or not. If the font is not trully monospaced, then no monospaced
metadata should be set (as sometimes they mistakenly are...)

Monospace fonts must:

* post.isFixedWidth "Set to 0 if the font is proportionally spaced, non-zero if
the font is not proportionally spaced (monospaced)"
  www.microsoft.com/typography/otspec/post.htm

* hhea.advanceWidthMax must be correct, meaning no glyph's width value is
greater.
  www.microsoft.com/typography/otspec/hhea.htm

* OS/2.panose.bProportion must be set to 9 (monospace). Spec says: "The PANOSE
definition contains ten digits each of which currently describes up to sixteen
variations. Windows uses bFamilyType, bSerifStyle and bProportion in the font
mapper to determine family type. It also uses bProportion to determine if the
font is monospaced."
  www.microsoft.com/typography/otspec/os2.htm#pan
  monotypecom-test.monotype.de/services/pan2

* OS/2.xAverageWidth must be set accurately.
  "OS/2.xAverageWidth IS used when rendering monospaced fonts, at least by
Windows GDI"
  http://typedrawers.com/discussion/comment/15397/#Comment_15397

Also we should report an error for glyphs not of average width


* 🍞 **PASS** Font is not monospaced and all related metadata look good. [code: good]
🍞 PASS: Name table entries should not contain line-breaks. * [com.google.fonts/check/name/line_breaks](https://font-bakery.readthedocs.io/en/latest/fontbakery/profiles/name.html#com.google.fonts/check/name/line_breaks) * 🍞 **PASS** Name table entries are all single-line (no line-breaks found).
🍞 PASS: Does full font name begin with the font family name? * [com.google.fonts/check/name/match_familyname_fullfont](https://font-bakery.readthedocs.io/en/latest/fontbakery/profiles/name.html#com.google.fonts/check/name/match_familyname_fullfont) * 🍞 **PASS** Full font name begins with the font family name.
🍞 PASS: Name table strings must not contain the string 'Reserved Font Name'. * [com.google.fonts/check/name/rfn](https://font-bakery.readthedocs.io/en/latest/fontbakery/profiles/name.html#com.google.fonts/check/name/rfn) * 🍞 **PASS** None of the name table strings contain "Reserved Font Name".
🍞 PASS: Name table ID 6 (PostScript name) must be consistent across platforms. * [com.adobe.fonts/check/name/postscript_name_consistency](https://font-bakery.readthedocs.io/en/latest/fontbakery/profiles/name.html#com.adobe.fonts/check/name/postscript_name_consistency)
--- Rationale ---

The PostScript name entries in the font's 'name' table should be consistent
across platforms.

This is the TTF/CFF2 equivalent of the CFF 'postscript_name_cff_vs_name' check.


* 🍞 **PASS** Entries in the "name" table for ID 6 (PostScript name) are consistent.
🍞 PASS: Does the number of glyphs in the loca table match the maxp table? * [com.google.fonts/check/loca/maxp_num_glyphs](https://font-bakery.readthedocs.io/en/latest/fontbakery/profiles/loca.html#com.google.fonts/check/loca/maxp_num_glyphs) * 🍞 **PASS** 'loca' table matches numGlyphs in 'maxp' table.
🍞 PASS: MaxAdvanceWidth is consistent with values in the Hmtx and Hhea tables? * [com.google.fonts/check/maxadvancewidth](https://font-bakery.readthedocs.io/en/latest/fontbakery/profiles/hhea.html#com.google.fonts/check/maxadvancewidth) * 🍞 **PASS** MaxAdvanceWidth is consistent with values in the Hmtx and Hhea tables.
🍞 PASS: Whitespace and non-breaking space have the same width? * [com.google.fonts/check/whitespace_widths](https://font-bakery.readthedocs.io/en/latest/fontbakery/profiles/hmtx.html#com.google.fonts/check/whitespace_widths) * 🍞 **PASS** Whitespace and non-breaking space have the same width.
🍞 PASS: Does GPOS table have kerning information? * [com.google.fonts/check/gpos_kerning_info](https://font-bakery.readthedocs.io/en/latest/fontbakery/profiles/gpos.html#com.google.fonts/check/gpos_kerning_info) * 🍞 **PASS** GPOS table has got kerning information.
🍞 PASS: Is there a "kern" table declared in the font? * [com.google.fonts/check/kern_table](https://font-bakery.readthedocs.io/en/latest/fontbakery/profiles/kern.html#com.google.fonts/check/kern_table)
--- Rationale ---

Even though all fonts should have their kerning implemented in the GPOS table,
there may be kerning info at the kern table as well.

Some applications such as MS PowerPoint require kerning info on the kern table.
More specifically, they require a format 0 kern subtable from a kern table
version 0, which is the only one that Windows understands (and which is also
the simplest and more limited of all the kern subtables).

Google Fonts ingests fonts made for download and use on desktops, and does all
web font optimizations in the serving pipeline (using libre libraries that
anyone can replicate.)

Ideally, TTFs intended for desktop users (and thus the ones intended for Google
Fonts) should have both KERN and GPOS tables.

Given all of the above, we currently treat kerning on a v0 kern table as a
good-to-have (but optional) feature.


* 🍞 **PASS** Font does not declare an optional "kern" table.
🍞 PASS: Is there any unused data at the end of the glyf table? * [com.google.fonts/check/glyf_unused_data](https://font-bakery.readthedocs.io/en/latest/fontbakery/profiles/glyf.html#com.google.fonts/check/glyf_unused_data) * 🍞 **PASS** There is no unused data at the end of the glyf table.
🍞 PASS: Check for points out of bounds. * [com.google.fonts/check/points_out_of_bounds](https://font-bakery.readthedocs.io/en/latest/fontbakery/profiles/glyf.html#com.google.fonts/check/points_out_of_bounds) * 🍞 **PASS** All glyph paths have coordinates within bounds!
🍞 PASS: The variable font 'wght' (Weight) axis coordinate must be within spec range of 1 to 1000 on all instances. * [com.google.fonts/check/varfont/wght_valid_range](https://font-bakery.readthedocs.io/en/latest/fontbakery/profiles/fvar.html#com.google.fonts/check/varfont/wght_valid_range)
--- Rationale ---

According to the Open-Type spec's registered design-variation tag 'wght'
available at
https://docs.microsoft.com/en-gb/typography/opentype/spec/dvaraxistag_wght

On the 'wght' (Weight) axis, the valid coordinate range is 1-1000.


* 🍞 **PASS** OK
🍞 PASS: The variable font 'wdth' (Weight) axis coordinate must be within spec range of 1 to 1000 on all instances. * [com.google.fonts/check/varfont/wdth_valid_range](https://font-bakery.readthedocs.io/en/latest/fontbakery/profiles/fvar.html#com.google.fonts/check/varfont/wdth_valid_range)
--- Rationale ---

According to the Open-Type spec's registered design-variation tag 'wdth'
available at
https://docs.microsoft.com/en-gb/typography/opentype/spec/dvaraxistag_wdth

On the 'wdth' (Width) axis, the valid coordinate range is 1-1000


* 🍞 **PASS** OK
🍞 PASS: The variable font 'slnt' (Slant) axis coordinate specifies positive values in its range? * [com.google.fonts/check/varfont/slnt_range](https://font-bakery.readthedocs.io/en/latest/fontbakery/profiles/fvar.html#com.google.fonts/check/varfont/slnt_range)
--- Rationale ---

The OpenType spec says at
https://docs.microsoft.com/en-us/typography/opentype/spec/dvaraxistag_slnt
that:

[...] the scale for the Slant axis is interpreted as the angle of slant in
counter-clockwise degrees from upright. This means that a typical,
right-leaning oblique design will have a negative slant value. This matches the
scale used for the italicAngle field in the post table.


* 🍞 **PASS** Looks good!

### Summary | 💔 ERROR | 🔥 FAIL | ⚠ WARN | 💤 SKIP | ℹ INFO | 🍞 PASS | 🔎 DEBUG | |:-----:|:----:|:----:|:----:|:----:|:----:|:----:| | 3 | 15 | 4 | 72 | 7 | 60 | 0 | | 2% | 9% | 2% | 45% | 4% | 37% | 0% |