Configuration¶
Settings live in fledge.toml in the project directory. Configure only the
constraints that apply to your submission; nothing is assumed by default. For
example:
main = "main.tex"
max_pages = 10 # replace with your venue's limit, including references and appendices
[manuscript_checks]
required_metadata = ["title", "author"]
fledge init /path/to/paper writes a commented starter file. The report’s
execution.config_path records which file was used (null means none). The
example configuration shows the
defaults and a few alternatives. fledge COMMAND --help lists the common options
first and the advanced ones after them.
Start from a preset¶
A preset is a commented settings file that switches on existing generic checks for a common situation. Each one is a starting point, not a certification of venue compliance: values such as the page limit, ZIP size, identity terms and image resolution stay as placeholders for you to fill in.
Preset |
Switches on |
|---|---|
|
Embedded fonts; private-comment, secret, shell-escape and unused-file scans; a required generated |
|
Embedded fonts, no attachments; identity-hint, private-comment, secret and unused-file scans; layout-manipulation and float-structure checks. Placeholders: page limit, identity terms, image-metadata terms, ZIP size, review line numbers |
|
Embedded fonts without Type 3, consistent page size, no encryption, JavaScript or attachments; title and author metadata, ORCID, float structure and hygiene scans. Placeholders: page limit and size, document class, image resolution, declarations, PDF metadata, forbidden line numbers, TeX Live year, figure color space |
fledge init --list
fledge init /path/to/paper --preset arxiv
fledge check /path/to/paper --preset arxiv
fledge init [DIRECTORY] writes fledge.toml in the directory (default: the
current one): the preset’s text with --preset, otherwise a minimal starter. It
refuses to replace an existing fledge.toml unless you add --force, and warns
when a higher-priority file such as .fledge.toml would shadow the new one.
--preset NAME on inspect, check and prepare applies a preset without
writing a file. The preset is the lowest layer: your settings file overrides it
and command-line options override both. Tables merge key by key, so a file’s
[submission_checks] replaces only the keys it names and the preset’s other keys
stay in effect. Top-level keys and arrays replace the preset’s value outright.
The JSON report records the preset in execution.preset. The arxiv preset’s
comment removal (source_transforms.comment_policy = "private") affects only
prepare.
Choose checks¶
Every check has a code, and the catalogue shows which run by default and which are opt-in. Filter them in the configuration file or on the command line:
[checks]
select = ["TEX", "BIB1"]
ignore = ["TEX001", "BIB108"]
fledge inspect /path/to/paper --ignore TEX001
fledge check /path/to/paper --select TEX --select BIB1
--select replaces checks.select from the file; --ignore adds to
checks.ignore. Both are repeatable and available on inspect, check and
prepare. An unknown selector stops the run as a request error (exit code 4) and
suggests the closest codes.
select defaults to ["ALL"] and ignore to []. A selector is ALL, an
exact code such as TEX001, a family such as TEX, or a family plus numeric
prefix such as BIB1; it must match at least one registered code. The name of one
check stands for its code: the dotted name that reports show (source.edit_marker)
and the hyphenated name of earlier releases (source-edit-marker) both select
TEX001, in the file and on the command line, and fledge rule explains a check
by any of its names. Selectors are case-sensitive, and empty strings, partial
family names such as TE and unknown codes are errors. select = [] disables
every selectable check.
The most specific matching selector wins, regardless of list order, and ignore
wins ties. For example, select = ["ALL", "TEX001"] with ignore = ["TEX"] keeps
the TODO-marker check while excluding the other TEX checks.
Selection only filters what the command would run. It does not invent policy:
Selecting
PDFsupplies no page limit, region, font policy or expected metadata; configure those values.Selecting
NETgrants no network access; online checks still need--onlineand their individual switches.Selecting transformation codes changes nothing; edits still need their options.
Always-enforced guards stay on, and ignoring their code does not bypass them. JSON reports list them under
execution.check_selection.always_enforced_when_applicable.
Checks that are off do not become passes. Terminal reports end with a short
Not checked line naming the opt-in areas that did not run, so a clean result
is not mistaken for a full audit. JSON reports list the same areas in
execution.not_checked, each with its codes and the settings that enable them.
Some default checks concern submission readiness: a note, listed only with
--show-passed, when no generated .bbl is shipped for services that do not
run BibTeX or Biber, such as arXiv (TEX009;
submission_checks.require_bbl = true makes it a warning), packages
declared before hyperref that must follow it (TEX010), EPS figures in a PDF
build (TEX011) and private-note markers in comments (PRV007).
Related opt-in policies check review line numbers (MAN017), figure color
spaces (PDF313), the TeX Live release (BLD105), whether a shipped .bbl
covers every cited key (BIB109) and whether a shipped biblatex .bbl has the
format version the receiving service expects (BIB110,
submission_checks.biblatex_bbl_format_version).
Discovery and precedence¶
Discovery starts at the input directory, or at the parent directory of a ZIP or PDF input; configuration inside a ZIP is never loaded. The nearest directory with a configuration file wins. Within one directory the first of these that exists is used, and the others are ignored:
.fledge.tomlfledge.toml.latex-prep.tomllatex-prep.tomlpyproject.tomlcontaining[tool.fledge](or the older[tool.latex-prep])
The two latex-prep file names are the older spellings; see
migrating from latex-prep. They rank
above pyproject.toml, so a leftover latex-prep.toml shadows a [tool.fledge]
table beside it. A pyproject.toml without a [tool.fledge] or [tool.latex-prep]
table is skipped, but one that is not valid TOML stops the run with “Cannot read
settings”: Fledge cannot know that the file was not meant for it. Repair the file,
or choose a settings file with --config or skip discovery with --isolated.
Discovery stops at a repository root (a directory containing .git or .hg).
Discovery never climbs into your home directory, the system temporary directory or
the filesystem root, so there is no user-wide configuration, and a file another user
left in /tmp cannot configure a project that lies inside it. It reads such a
directory only when you named it yourself: when the input is that directory, or is a
ZIP or PDF file lying directly in it (fledge inspect /tmp/paper.zip reads
/tmp/fledge.toml). Nothing above that directory is read, and a project folder such as
/tmp/paper does not read the configuration of /tmp. Only one file is used; files from
different directories are not merged.
Precedence, from highest to lowest: command-line options, the selected settings
file, a --preset, and the built-in defaults. Negative options such as
--no-format and --offline override the file too.
fledge inspect paper --config review.toml
fledge inspect paper --isolated --jobs 1
--config FILE uses exactly that file and skips discovery. --isolated skips
discovery and uses the defaults plus command-line options; it cannot be combined
with --config. Relative paths inside a file, such as template references,
resolve from that file’s directory. Invalid TOML, unknown settings, wrong types
and unknown selectors stop the run before it starts. The message names the file
or option the value came from and suggests the closest valid setting. An invalid file is never silently replaced by an
ancestor’s.
Use pyproject.toml¶
Only the [tool.fledge] table and its subtables are loaded; unrelated project and tool settings are ignored. An
explicitly supplied pyproject.toml must contain it.
[tool.fledge]
jobs = 2
max_pages = 10
[tool.fledge.checks]
select = ["ALL"]
ignore = ["TEX001"]
[tool.fledge.manuscript_checks]
required_metadata = ["title", "author"]
For a dedicated settings file, omit the tool.fledge prefix:
jobs = 2
max_pages = 10
[checks]
select = ["ALL"]
ignore = ["TEX001"]
[manuscript_checks]
required_metadata = ["title", "author"]
Thresholds, identity terms, expected values, transformations, and network options
keep their existing typed tables. See the check catalogue,
constraint settings, and
additional check settings for supported policies.
Size, time and memory limits¶
Fledge bounds what one job may import, write and run. The defaults suit ordinary papers; raise a limit when an error message names it.
Setting |
Default |
What it bounds |
|---|---|---|
|
10000 |
Files and folders together in an imported project or ZIP |
|
32 |
Folder levels in an imported project or ZIP |
|
268435456 (256 MiB) |
The default of |
|
|
Combined size of all files in a project folder or ZIP import, of the copy each build makes of the sources, and of the prepared archive when it is extracted again to verify it |
|
|
Size of any one file a tool may write, and the largest PDF or image a tool opens |
|
120 |
One tool command ( |
|
600 |
The whole job ( |
|
1024 |
Memory of one build command |
|
2048 |
Memory shared by all running tools; it must allow |
|
2147483648 (2 GiB) |
Temporary data of the whole job |
max_bytes is the one number that older settings files use for both byte limits,
and it keeps working: set alone, it gives max_import_bytes and
max_generated_file_bytes the same value. An explicit max_import_bytes or
max_generated_file_bytes wins for its own purpose, and the other limit keeps
following max_bytes. The two limits answer different questions, so a large
data-heavy project can raise the import total without letting a runaway tool write a
file of that size:
max_bytes = 268435456 # default for both limits below: 256 MiB
max_import_bytes = 1073741824 # projects, ZIP files and build copies up to 1 GiB
max_generated_file_bytes = 268435456 # no tool file above 256 MiB
A tool workspace may hold at most four times max_generated_file_bytes in total, and
that includes the copy of your sources. Fledge therefore rejects settings in which
max_import_bytes is more than four times max_generated_file_bytes, and the error
names both. The example is the largest import total that 256 MiB per file allows. A limit
you leave unset follows max_bytes, so lowering max_generated_file_bytes alone also
needs a lower max_import_bytes (or a lower max_bytes). A job that exceeds a limit
stops with a finding that names it. Reports record all three byte settings under
settings; max_import_bytes and max_generated_file_bytes are null when you did not
set them.
Similar names, different checks¶
A few settings look alike but belong to different checks. They are independent: set whichever applies, or both with different values.
min_stroke_width_ptexists in two places. Under[pdf_checks]it enablesPDF213, which reads the stroke width that MuPDF reports for each drawn stroke and scales it by the placement transform, but only where that transform is uniform; hairlines and nonuniform transforms are not measured. Under[rendered_pdf_artwork]and[included_figure_artwork]it enablesPDF309, which measures the thickness of each straight segment perpendicular to its direction after a full affine transform, so it also catches a figure that was stretched in one direction (curves and text still need a uniform transform).rendered_pdf_artworkapplies it to the final PDF andincluded_figure_artworkto each included PDF figure.require_embedded_fontsis a top-level setting that requires every font in the final PDF to be embedded (PDF104).require_embedded_figure_fonts, under[pdf_checks], applies the same requirement to each PDF figure you include (PDF212).
Renamed settings¶
Three settings have clearer names. Their former names are still accepted, but a settings file or preset layer must not use both spellings of one setting. Reports record the current names.
Former name |
Current name |
|---|---|
|
|
|
|
|
|
Package contents¶
prepare ships the inputs the build needs, using the build trace and the literal
dependency graph. Unrelated files are left out of the copy, and --no-cleanup
does not retain them.
List extra files that must ship even when the build never reads them:
[package]
include = ["extras/cover-letter.txt", "data/results.csv"]
Entries are exact paths relative to the input project (or the selected document’s
source directory); globs are rejected. They follow the flat filename map, so keep
them source-relative with --layout flat. include is a packaging choice, not a
check: it ships the files whatever the check selection, and a listed file that is
missing or unsafe blocks preparation.
To also verify that a file is present and has the expected kind, use
submission_checks.required_deliverables (PKG104). Its files, and
project-side template_references files, are still retained for compatibility,
but [package] include is the recommended way to ship extras.
[submission_checks]
required_deliverables = { "extras/cover-letter.txt" = "text", "data/results.csv" = "file" }
# template_references = { "styles/template.cls" = "../approved/template.cls" }
Supported deliverable kinds are file, text, pdf, and zip; presence/type
checks do not assess content adequacy. External template-reference paths resolve
from the settings file’s directory.
For workflow.documents, include globs restrict the candidate inputs available
to that document. They do not force unused matches into the archive; include the
dependencies and any listed extras in that candidate set. Omitting the patterns
makes all files in the source directory candidates, not automatic deliverables.
A missing or incomplete build trace blocks preparation. The
workflow reference
describes the selection and verification sequence.
Select online evidence deliberately¶
Offline is the default. An individual remote check and network permission are separate choices:
[online_checks]
online = true
online_metadata = true
# online_contact_email = "you@example.org"
--onlineand--offlineoninspect,check,prepareandbib checkoverride permission only; they do not select checks. A selected check without permission is reported as skipped, and with no check selected no request is made.Requests disclose DOI/URL targets to the destination and selected reference titles to Crossref for searches. Manuscript and bibliography files are not uploaded.
Entries come from the
.bibresources the selected document declares, so an unused backup copy spends no requests; without a resolvable declaration every.bibfile in the project is used.online_max_requests(default 40, at most 1000) is one budget shared by all selected online checks of a document. Entries beyond it reportrequest_limitand are never treated as verified.online_contact_emailaddsmailto:to theUser-Agentheader of requests toapi.crossref.orgonly, which lets Crossref use its polite pool. Requests to every other host, such as a DOI resolver or a linked site, never carry it. No finding contains it, and the settings that the JSON report, the HTML report and the diagnostics bundle record show"<set>"instead of the address, so a shared report does not reveal it.A normal
preparechecks the final archive extraction once, after transformations, so it inspects the references in the prepared package; if preparation stops earlier, an infoonline.not_reachednote says the selected checks did not run.inspect,check,bib checkandprepare --dry-runcheck the initial snapshot. Preparation spends no second request budget on the baseline.Remote failures remain advisory evidence, never successful validation or permission to apply automatic corrections.