Workflow reference¶
This page holds the detail behind what prepare does: how package contents are chosen, the settings tables, report formats, redaction, resource limits and the exact source syntax the scanner supports.
Implemented areas¶
Area |
Current functionality |
|---|---|
Import |
Folder or ZIP; wrapper-directory handling; traversal, link, collision and size checks; OS metadata excluded; nonportable names kept with a warning |
Sources |
Root discovery, supported dependency paths, duplicate labels and unfinished-work diagnostics |
Manuscript |
Configurable class/package policies, abstract/count/heading constraints, literal author metadata, ORCID, declarations, float captions/labels/references and figure-description presence |
Flat layout |
Deterministic mapping and explicit filename overrides; literal import/subfile contexts, selected data readers and local font paths; protected naming contracts |
Bibliography |
Local checks plus opt-in field layout/removal, cited-only proposals, explicit key/merge mappings, guarded metadata edits and preservable key ordering |
Formatting and source edits |
|
Builds |
Fresh isolated copies, controlled |
Page/text/region and artwork measurements, explicit heading expectations, bounded Type 3/structure checks, configured contrast samples, grayscale previews and text/render comparisons |
|
Privacy and bundle |
Configured identity scans, bounded image-metadata scans, guarded source metadata edits and final-PDF rechecks; filename/type/deliverable/size/template policies |
Online references |
Separately enabled DOI, Crossref metadata/candidate/notice and public-link checks with request limits; no automatic corrections |
Packaging |
Build-traced and literal dependencies plus extra files listed in |
Interface |
CLI and standalone PDF inspection; terminal/compact/JSON/HTML/CI reports, scoped review decisions, unverified diagnostic exports and a rule catalogue |
Concurrency |
Shared CPU/memory/build/render admission; overlapping PDF branches and inventories; bounded page-pair and formatting workers; serial mode |
How package contents are selected¶
Preparation combines complete, bounded build traces with the selected literal
source-dependency graph. It first selects inputs needed for the requested
transformations, retaining an explicitly selected bibliography-inlining .bbl
when applicable. After transformations it recomputes the final input set before
archiving; flattening applies to the reduced project. A missing or incomplete
build trace blocks preparation.
When the trace is complete, an incomplete or ambiguous literal graph is not
blocking: it becomes a package.dependencies warning, because the recorded inputs
are direct evidence of what the build read. Flattening and source transformations
still require a complete literal graph. If input selection fails in prepare, the
source, bibliography and manuscript checks still run on the full snapshot, and a
task skipped only because a prerequisite failed appears as an info/skipped
execution.task note instead of an error.
This is dependency-based packaging for the selected build, not a proof of the
smallest possible bundle. The exact archive must still rebuild and pass the
required comparisons before release. With workflow.documents, each named
package receives its own output subdirectory plus an aggregate report; other
document roots are verified only when selected. During prepare, filename,
type and deliverable policies are checked after dependency selection and
flattening, then again on the exact archive extraction. Supply source-relative
paths for required deliverables; flattening remaps them.
Preliminary cleanup removes OS and version-control metadata, editor backups and
rebuildable auxiliary files (.aux, .log, .out, .nav, .snm, .vrb,
.xdv, index and glossary files, and _minted* directories), never a .bbl.
When a <main>.bbl, or for biblatex <main>.run.xml, sits beside the main
file and the build read a regenerated file of that name, prepare ships the
existing file; it survives cleanup and --layout flat. The package inventory lists it under
details.generated_bibliography.
Settings tables¶
CLI options override the configuration file, which overrides a selected preset and the built-in defaults. See configuration for discovery.
Table |
Configuration scope |
|---|---|
|
Check-code/family selection and exclusions; required release and transformation guards remain enforced |
|
Citation scope, explicit entry-type fields/DOI expectations and optional bibliography heuristics |
|
Overflow tolerance in TeX points; recorder-observed |
|
Literal package declarations, abstract/heading/metadata/declaration policies and source float structure |
|
Explicit page ranges/regions, text geometry, metadata, object policies and drawing measurements |
|
Extra project files to ship although the build never reads them ( |
|
Identity terms (whole-word matching by default; |
|
Network permission, individual remote-check switches, contact address and request/response/concurrency limits; see online evidence |
|
Copy-only source edits, flat filename overrides, formatter exclusions/protected regions and blank-line policy |
|
Explicit formatting, field removal, cited-only output, key/merge mappings, guarded field edits and ordering |
|
Selected literal metadata edits/image-metadata terms, per-author grammar, rendered heading expectations and supported tagged-PDF structure |
|
Separate final-document and input-PDF artwork policies; regions refer to each inspected PDF’s own coordinates. The former names |
|
Independent document packages, repeated baselines, comparison tolerances and exact scoped review decisions |
fledge pdf check FILE reports settings that need a source project (source/PDF
metadata matching, input-figure font and artwork policies) as info “not run”
instead of blocking.
Report formats¶
The default terminal report puts blocking failures first, then incomplete checks
and warnings. Each finding shows its code, name, location, observed issue and
next step. Passed results and scope notes are counted but listed only with
--show-passed in terminal, compact and CI output; JSON and HTML always list
them. Terminal and compact output add an Evidence: excerpt: the first
three recorded items and a count of the rest. A terminal report with more than
20 changes summarizes them by kind unless --diff is given; compact output
always summarizes, and JSON lists every change. Colors are decoration only.
Every format except JSON uses the same order, shows a finding repeated in
several stages once, summarizes checks that did not run after a failed step,
and labels the statuses skipped and not_applicable as not checked and
not applicable. JSON keeps every copy and the raw status values.
Compact output writes one plain line per finding with no table, ANSI styling or
hard wrapping; embedded newlines are escaped. Progress goes to stderr, and
--quiet suppresses it. --json is an alias for --output-format json and
writes only JSON to stdout.
TEX001 warning/failed main.tex:3 | Unfinished text markers: Possible unfinished editing or placeholder text: 'TODO'. | next: Finish or remove the marked draft text after reviewing its context.
--html-report FILE writes an escaped offline report with recorded-region
diagrams, source diffs, file inventories and bounded before/after PDF pages.
Affected pages have an optional difference overlay. Eight page pairs and 12 MiB
of PNG data are shared across the run; omitted or unavailable previews are
labeled. Image bytes stay outside JSON and are embedded only in HTML. Capture
does not change comparison verdicts. See visual differences.
--output-format html writes the same document to stdout. --output-format ci
emits escaped GitHub Actions annotations. --diagnostics ZIP exports sanitized
reports and diffs as unverified diagnostic material, never a submission
package. Grayscale previews go to --preview-output DIR, or under previews/
in a successful preparation output. --report FILE saves JSON even when a run
is blocked; a successful prepare always saves report.json with its output.
Redaction¶
Known credential patterns and credential-bearing URLs are redacted in every
report format, including settings, tool inventories and diffs. A plain URL
username (ssh://git@host) or a mailto: address is not a secret, whereas
user:password@ and token-like usernames are redacted; short secrets are
replaced only as whole words. Redaction protects report handoff. It does not
remove credentials from the submitted sources; the opt-in PRV004 secret scan
finds candidates there.
Execution and resource limits¶
--jobs sets shared CPU slots; the default is 2, with one build and one
page-pair renderer at a time. --jobs 1 runs everything serially.
fledge prepare ./paper --output /tmp/prepared-paper \
--jobs 4 --render-jobs 2 --job-timeout-seconds 600
For check, baseline PDF analysis can begin while source checks continue. For
prepare, source checks and PDF analysis wait for baseline dependency
selection. PDF inventories, comparison sides and final verification branches
overlap; page pairs and formatting files use bounded workers. The baseline,
transformation, prepared build and archive rebuild gates stay ordered, and
publication waits for every required result. --build-jobs bounds overlapping
builds of independent document packages.
Every expensive step shares one CPU and memory budget. The coordinator reserves
128 MiB; render reservations account for both RGB buffers. Renderer and formatter
subprocesses each have a 128 MiB cap. One monitor samples aggregate memory and
temporary disk use; these are sampled limits that can overshoot briefly, not
operating-system guarantees. JSON execution records estimates, observed peaks,
timings and whether accounting was available.
The default whole-job deadline is 600 seconds, the per-tool timeout is 120
seconds and the temporary-data ceiling is 2 GiB. Configure memory_mb,
build_memory_mb, max_temporary_bytes and an optional fixed
source_date_epoch in TOML. Cancellation stops new work and drains running
tools before the workspace is removed. Each input PDF is frozen once per job, and
workers get separate writable directories with read-only access to the frozen
inputs. The execution design and
benchmark give the background.
Biber on macOS¶
TeX Live ships Biber on macOS as a self-extracting universal binary that cannot
unpack and run itself inside the sandbox. When bibliography_backend is auto
or biber, Fledge extracts the host-architecture slice into a folder under the
job directory, runs a sandboxed warm-up that unpacks the payload there, makes the
copy read-only and grants execution only to that sealed copy.
bibliography_backend = "bibtex" skips this, and Linux needs no preparation.
With auto, Fledge prepares Biber only when a source file (.tex, .sty,
.cls and similar) mentions biblatex, even in a comment. Otherwise the build
runs with Biber blocked. If that build still writes a .bcf file, because a
class or package loads biblatex indirectly, Fledge discards it and rebuilds once
with Biber prepared; tools.bibliography.biber_preparation in the JSON report
records either decision.
The copy costs about 175 MB of temporary space and about 10 seconds once per job.
Both count against max_temporary_bytes; keep that above about 250 MB for Biber
jobs. If preparation fails and the build needs Biber, Fledge reports a BLD202
finding instead of running Biber unconfined.
Supported source syntax¶
Flattening uses a conservative scanner for literal TeX commands, not a TeX
interpreter. It supports literal input, include, includegraphics,
graphicspath, bibliography, addbibresource and bibliographystyle, plus
literal import/subimport, constrained subfile bodies, selected data readers
and explicit local font filenames. Dynamic or unsupported path handling blocks
flattening rather than guessing. Filename maps and diffs are visible; local
class/style and main job-name contracts constrain renaming. Source merging
handles standalone literal input lines only. Bibliography inlining requires an
explicitly selected BibTeX thebibliography file.
The scanner tolerates ordinary TeX that is not a dependency. An unmatched [
(such as the interval [0,1)) does not stop parsing. \newif\ifX toggles and
template classes using \if@… do not make the dependency graph uncertain; only a
file reference inside an executed \if…\fi block does. An extensionless graphics
reference that matches several files is resolved in TeX’s lookup order, and
TEX008 names the selected file as an advisory. \color and \textcolor are
not TEX002 editing commands. TODO and label scans skip local .sty and
.cls files.
Manuscript checks report a confirmed violation as failed even when unrelated
constructs are uncertain; uncertainty is scoped to the checked region and to the
document body. An abstract word limit with unresolved macros uses a word-count
range and is decisive only when the range lies wholly inside or outside the
limit. required_sections distinguishes a missing heading from one that could
not be confirmed. The image metadata scan (PRV103) reads JPEG IPTC and extended
XMP; an EXIF MakerNote or unsupported IPTC layout is recorded as a limitation.
bib check, inspect and online checks read only the .bib resources the
selected document declares, so an unused backup .bib neither blocks nor spends
requests; without a resolvable declaration every .bib file is read. Citation
coverage stays conclusive with ordinary \newcommand and \if… constructs; only
cite-related definitions or citations inside conditionals add uncertainty.
PDF comparison uses page count, extracted text and exact RGB page renders at 144 DPI. Explicit tolerances and accepted exceptions apply only to baseline versus prepared; repeated baselines, supplied reference PDFs and archive rebuilds are compared exactly. PDF inspection supports up to 5000 pages; rendering is capped at 300 pages and 16 million pixels per page, with an inconclusive result beyond that. A figure PDF without font resources passes the figure-font policy.