TopMark policy guide¶
Policies control:
- whether headers may be inserted or updated
- how empty files are classified
- whether file-content probing is allowed
- how runtime-resolution behavior interacts with safety gates
- how file-type-specific runtime policy overrides interact with global policy
See also:
TopMark policies control how the runtime pipeline detects file types, classifies empty files, evaluates runtime safety gates, and determines whether headers may be inserted or updated.
Policy settings are part of the layered runtime configuration
(FrozenConfig) and are merged according to layered
discovery, normalization, precedence, and runtime overlay rules. See:
Policy semantics behave consistently across:
- discovered config files (
topmark.tomlor[tool.topmark]inpyproject.toml) - TOML configuration overlays
- command-specific CLI options
- API overlays
- effective runtime policy evaluation and runtime resolution
Policy values shown here are part of the public configuration surface.
Note
Internal runtime helper types such as
PolicyOverrides and
ConfigOverrides are not part of the user-facing
CLI or Python API contract. Public callers should use plain mapping-based inputs via config=...,
policy=..., and policy_by_type=... when using topmark.api.
In topmark.toml, policy is defined under [policy] and [policy_by_type.<file_type>]. In
pyproject.toml, the same settings live under [tool.topmark.policy] and
[tool.topmark.policy_by_type.<file_type>].
For canonical file-type identifier semantics, see Configuration discovery, precedence, and policy.
During staged configuration-loading validation, TopMark first validates each whole-source TOML fragment (unknown sections, unknown keys, malformed section shapes, etc.). Only validated layered configuration fragments contribute to runtime policy resolution.
Command-line policy options override resolved config for the current run only.
Policy layers¶
TopMark resolves policy in this order:
- defaults
- discovered config files
- explicit config overlays
- CLI or API overrides
These runtime policy layers are constructed after staged TOML-layer validation. Source-local TOML
sections (e.g. [config]) do not participate in runtime policy layering.
Per-file-type policy in policy_by_type is evaluated on top of the global policy section.
CLI, configuration, and API value spelling¶
Policy configuration keys use the same names across the CLI, API, and TOML configuration. Some
policy options accept predefined multi-word values such as add_only or whitespace_empty.
TopMark uses different spelling conventions depending on the interface: CLI examples prefer hyphenated forms for readability, while TOML configuration, Python API values, and machine-readable output use canonical underscore forms.
Note
CLI spelling vs configuration/API spelling
TopMark uses hyphenated spelling for CLI option names:
For multi-word option values, the CLI accepts both hyphenated and canonical underscore forms:
TOML configuration, Python API values, and machine-readable output use the canonical underscore form:
CLI option names themselves do not accept underscores. Use --header-mutation-mode, not
--header_mutation_mode.
Unless otherwise noted, policy values shown throughout this page use the canonical TOML/API/machine-readable underscore form.
Global policy keys¶
header_mutation_mode¶
Controls mutation behavior for topmark check.
Allowed TOML/API values:
all: insert missing headers and update existing headersadd_only: insert missing headers only; existing headers are not updatedupdate_only: update existing headers only; missing headers are not inserted
This policy affects dry-run reporting, --apply behavior, API result views, and semantic runtime
outcome bucketing. It applies only to check; strip and
probe reject generated-header mutation controls.
Runtime safety gates still take precedence. Malformed headers, unreadable files, unsupported files,
blocked filesystem states, and other non-mutable runtime conditions are not made mutable by
header_mutation_mode.
Example:
allow_header_in_empty_files¶
Controls whether TopMark may insert headers into files considered empty under the effective
empty_insert_mode.
empty_insert_mode¶
Controls which empty or empty-like files are classified as empty for insertion.
This policy affects dry-run reporting, --apply behavior, API result views, and semantic runtime
outcome bucketing.
This setting is evaluated together with allow_header_in_empty_files:
- If
allow_header_in_empty_files = false(default), files classified as empty for insertion are treated as unchanged and compliant by default. - If
allow_header_in_empty_files = true, files classified as empty for insertion may receive generated headers, subject to normal runtime safety gates.
Allowed values:
bytes_empty: only true 0-byte fileslogical_empty: true 0-byte files plus logically empty placeholders (optional BOM, optional horizontal whitespace, and at most one trailing newline)whitespace_empty: true 0-byte files plus any decoded content containing only whitespace or newlines
render_empty_header_when_no_fields is separate. It controls whether TopMark may render an
otherwise empty header when no header fields are configured.
Runtime safety gates still take precedence. Unreadable files, unsupported files, malformed headers,
blocked filesystem states, and other non-mutable runtime conditions are not made mutable by
empty_insert_mode.
render_empty_header_when_no_fields¶
Controls whether TopMark may insert an otherwise empty header when no header fields are configured.
allow_reflow¶
Controls whether TopMark may reflow content while inserting or updating a header.
This can reduce strict idempotent runtime rendering behavior in some cases.
allow_content_probe¶
Controls whether runtime file-type detection may inspect file contents when needed.
This policy applies to both check and strip.
Line-ending handling (not a policy)¶
TopMark's line-ending behavior is fixed for 1.x releases and is not configurable through policy.
- Only LF (
\n), CRLF (\r\n), and CR (\r) are recognized as physical line-ending styles. - These styles are preserved across rendering, planning, patching, and writing.
- Files with mixed recognized newline styles are skipped by the mixed-line-ending guard.
Non-standard Unicode separators such as NEL (U+0085), Line Separator (U+2028), and Paragraph
Separator (U+2029) are treated as ordinary content characters. They are not considered line
endings and do not affect newline detection or mixed-newline diagnostics.
Some file-type-specific checks (notably XML) may conservatively skip mutation when such characters appear near insertion boundaries due to idempotence concerns. This is a localized safety behavior, not an extension of newline support.
Per-file-type policy¶
TopMark accepts file type identifiers in local form, such as python, or qualified form, such as
topmark:python.
Local identifiers are accepted only when unambiguous. Internally, TopMark normalizes identifiers to canonical qualified file type identities before filtering, runtime resolution, policy evaluation, diagnostics, and registry lookup.
See file-type filtering for the full identifier contract.
Use policy_by_type.<file_type_id> to override policy for one file type while inheriting
unspecified values from the global policy section.
In pyproject.toml, this section is written as [tool.topmark.policy_by_type.<file_type>].
Both local identifiers:
and canonical qualified identifiers:
are supported when the local identifier is unambiguous.
Internally, TopMark resolves per-file-type runtime policy using canonical qualified file type identities.
Example:
[policy]
header_mutation_mode = "all"
allow_content_probe = true
[policy_by_type.python]
header_mutation_mode = "update_only"
allow_header_in_empty_files = true
In this example:
- Python files inherit
allow_content_probe = true - Python files override
header_mutation_mode - Python files additionally allow header insertion into empty files
Equivalent canonical form:
[policy_by_type."topmark:python"]
header_mutation_mode = "update_only"
allow_header_in_empty_files = true
Ambiguous, unknown, and malformed identifiers¶
Per-file-type runtime policy identifiers follow the same rules as filtering and runtime resolution.
Ambiguous local identifiers require the canonical qualified form.
Examples:
Malformed identifiers are ignored diagnostically during configuration normalization and staged configuration-loading validation.
Examples:
Policy options by command¶
topmark check¶
check supports both check-only and shared policy options.
Check-only policy options:
--header-mutation-mode--allow-header-in-empty-files / --no-allow-header-in-empty-files--empty-insert-mode--render-empty-header-when-no-fields / --no-render-empty-header-when-no-fields--allow-reflow / --no-allow-reflow
Shared policy options:
--allow-content-probe / --no-allow-content-probe
topmark strip¶
strip supports only shared runtime policy options:
--allow-content-probe / --no-allow-content-probe
Header insertion/update policies, including header_mutation_mode, do not apply to
strip and are rejected when provided.
Reporting vs policy¶
Reporting controls human-readable CLI rendering. Policy controls what the runtime pipeline is allowed to do.
Reporting examples:
--report actionable: show human-readable per-file entries that would change, changed, failed, or otherwise need attention--report noncompliant: include actionable files plus unsupported file types in human-readable per-file output
Policy example:
--header-mutation-mode add-only: allowcheckto insert missing headers but not update existing headers
These settings are independent and may be combined.
Runtime policy model¶
TopMark intentionally separates:
- staged configuration-loading validation
- layered runtime configuration resolution
- runtime applicability evaluation
- runtime probing and processor resolution
- runtime policy evaluation
- runtime mutation planning and execution
Machine-readable diagnostics and runtime behavior expose a flattened compatibility view derived from these internal runtime stages while preserving deterministic stable 1.x runtime behavior.