Repository navigation
Release v2.0.0
TopMark 2.0.0
TopMark 2.0 is a major release that makes command-line behavior,
machine-readable output, configuration, and file-type contracts more explicit
and portable.
Highlights
- Python 3.15 support across packaging, CI, release tooling, and published-artifact validation.
- Consistent CLI/API reporting, machine-readable output, and filesystem-identity behavior.
- Explicit file-type activation policies and safer filename-rule validation.
- Zensical documentation pipeline and a dedicated 1.x-to-2.0 migration guide.
- Strengthened release, CI, pre-commit, cross-platform filesystem, and published-package validation.
Breaking changes
Review Upgrading to TopMark 2.0 before updating automation, output parsers, or custom file-type providers.
Key changes include:
WOULD_CHANGEis now exit code3; parser usage errors use2.- Machine-readable paths are POSIX-formatted and diffs use structured JSON/NDJSON payloads.
- CLI choice values are lowercase kebab-case; option-like file paths require
--. FileType.skip_processingis replaced byFileTypeActivation.NEVER.- Public
check()andstrip()default toreport="actionable".
Full changelog: v1.0.1...v2.0.0
What's Changed
- refactor(cli): replace yachalk with rich presentation backend by @shutterfreak in #59
- refactor(cli): adopt rich-click for help rendering by @shutterfreak in #62
- fix(cli): trap underscored option spellings consistently by @shutterfreak in #64
- cleanup(tooling): remove stale tox references by @shutterfreak in #69
- fix(cli): hide long file-type compatibility aliases from help by @shutterfreak in #70
- Improve CLI validation diagnostic formatting by @shutterfreak in #71
- Refactor CLI option metadata for diagnostics by @shutterfreak in #76
- Centralize CLI option applicability groups by @shutterfreak in #80
- build(deps): bump ruff from 0.15.14 to 0.15.15 by @dependabot[bot] in #77
- build(deps): bump hypothesis from 6.152.9 to 6.155.0 by @dependabot[bot] in #78
- build(deps): bump uv from 0.11.16 to 0.11.17 by @dependabot[bot] in #79
- Fix misleading synthetic probe results for explicit inputs by @shutterfreak in #82
- fix(cli): preserve config diagnostics on strict validation failures by @shutterfreak in #83
- Reserve exit code 2 for Click parser errors and move WOULD_CHANGE to 3 by @shutterfreak in #85
- Fix unknown option handling for path commands by @shutterfreak in #86
- Fix canonical path casing for built-in file fields by @shutterfreak in #87
- fix(machine): normalize processing result paths to POSIX by @shutterfreak in #95
- Normalize and validate FileType filename rules by @shutterfreak in #96
- Centralize path rendering helpers by @shutterfreak in #97
- Normalize config path serialization by @shutterfreak in #98
- chore(tooling): align editor and pre-commit workflows by @shutterfreak in #99
- Expand cross-platform path and discovery regression coverage by @shutterfreak in #100
- Define filesystem identity policy by @shutterfreak in #101
- Block hard-linked processing targets by @shutterfreak in #110
- Clarify compatibility boundaries by @shutterfreak in #111
- docs(config): document resolved discovery-anchor behavior by @shutterfreak in #113
- Deduplicate resolved TOML source identities by @shutterfreak in #118
- build(deps): bump actions/checkout from 6.0.2 to 6.0.3 by @dependabot[bot] in #115
- build(deps): bump uv from 0.11.18 to 0.11.19 by @dependabot[bot] in #116
- build(deps): bump ruff from 0.15.15 to 0.15.16 by @dependabot[bot] in #117
- build(deps): bump astral-sh/setup-uv from 8.1.0 to 8.2.0 by @dependabot[bot] in #114
- feat(ci): add repair mode to GitHub Actions pin audit by @shutterfreak in #121
- Clarify filesystem-identity compatibility boundaries by @shutterfreak in #122
- test(ci): require symlink-dependent filesystem tests in CI by @shutterfreak in #123
- Expose discovery anchor in configuration provenance by @shutterfreak in #124
- docs: complete documentation consistency review by @shutterfreak in #125
- Clarify roadmap ownership and stable-line planning scope by @shutterfreak in #127
- ci(workflows): reduce superseded PR runs by @shutterfreak in #128
- Add targeted runtime coverage for issue 129 by @shutterfreak in #130
- Establish pipeline memory/allocation baselines by @shutterfreak in #142
- Implement typed pipeline view-consumer pruning lifecycle by @shutterfreak in #143
- perf(pipeline): reduce duplicate diff-preview allocations (#138) by @shutterfreak in #144
- Close #135 and #136 with repeatable updated-content composition by @shutterfreak in #145
- Stream updated content through WriterStep by @shutterfreak in #146
- docs: record Track B conclusions and output-streaming audit results by @shutterfreak in #149
- Add durable processing result primitives by @shutterfreak in #150
- Refactor outcome classification to support durable ProcessingResult snapshots by @shutterfreak in #151
- Refactor pipeline result snapshots to preserve execution mode by @shutterfreak in #155
- Add batch processing-result reduction boundary by @shutterfreak in #156
- Make pipeline report filtering compatible with durable processing results by @shutterfreak in #158
- build(deps): bump ruff from 0.15.16 to 0.15.17 by @dependabot[bot] in #152
- build(deps): bump uv from 0.11.19 to 0.11.21 by @dependabot[bot] in #153
- build(deps): bump hypothesis from 6.155.1 to 6.155.2 by @dependabot[bot] in #154
- Update ruff in pre-commit hooks by @shutterfreak in #159
- Add durable ProcessingDetailSnapshot to ProcessingResult by @shutterfreak in #160
- Package check and strip results from durable snapshots by @shutterfreak in #161
- Render check strip output from processing results by @shutterfreak in #162
- Refine ProcessingContext/ProcessingResult ownership and release lifecycle by @shutterfreak in #163
- Migrate probe output to durable results by @shutterfreak in #164
- Refactor pipeline intent modelling around explicit catalogue and selection objects by @shutterfreak in #168
- Introduce streaming-capable reduction runtime path by @shutterfreak in #172
- Complete probe durable-result runtime path by @shutterfreak in #173
- Clarify PipelineSelection and RunOptions ownership by @shutterfreak in #175
- docs: document pipeline catalogue compatibility and extension guidance by @shutterfreak in #176
- Issue #167: Add structured diff metadata and shadow-validation renderer by @shutterfreak in #181
- Prefer structured diff for single-edit patches by @shutterfreak in #182
- Reduce comparison and patch materialization using structured edit metadata by @shutterfreak in #184
- build(deps): bump actions/checkout from 6.0.3 to 7.0.0 by @dependabot[bot] in #177
- build(deps): bump hypothesis from 6.155.2 to 6.155.6 by @dependabot[bot] in #178
- build(deps): bump pytest from 9.0.3 to 9.1.1 by @dependabot[bot] in #179
- build(deps): bump uv from 0.11.21 to 0.11.22 by @dependabot[bot] in #180
- Align report-scope semantics across CLI and API by @shutterfreak in #197
- Omit empty Markdown files section by @shutterfreak in #198
- Suppress empty diff sections in human reports by @shutterfreak in #199
- Redesign machine-readable diff output and CLI output contracts by @shutterfreak in #200
- Align CLI errors with Click exit code typing by @shutterfreak in #201
- Refresh tooling dependency baselines by @shutterfreak in #202
- Harden Rich-aware output assertions by @shutterfreak in #212
- build(deps): bump actions/setup-python from 6.2.0 to 6.3.0 by @dependabot[bot] in #208
- build(deps): bump actions/cache from 5.0.5 to 6.0.0 by @dependabot[bot] in #209
- build(deps): bump softprops/action-gh-release from 3.0.0 to 3.0.1 by @dependabot[bot] in #210
- build(deps): bump pymdown-extensions from 10.21.3 to 11.0 by @dependabot[bot] in #211
- Adopt pytest importlib mode and package the test hierarchy by @shutterfreak in #214
- Normalize pytest marker usage by @shutterfreak in #216
- Add local pre-PR validation gate by @shutterfreak in #218
- Expand
topmark.presentationrendering contract coverage by @shutterfreak in #219 - Document machine-output compatibility policy by @shutterfreak in #220
- Clarify stream-routing ownership by @shutterfreak in #221
- Consolidate shared pipeline summary rendering by @shutterfreak in #222
- Add repository-scale pipeline memory benchmark suite by @shutterfreak in #223
- Clarify durable diff ownership across reduction boundary by @shutterfreak in #224
- Define public streaming event contracts by @shutterfreak in #226
- Add public streaming API entry points by @shutterfreak in #227
- Add reusable stream collectors for durable batch reconstruction by @shutterfreak in #228
- Emit NDJSON from internal pipeline stream events by @shutterfreak in #229
- Stream human check/strip output through event bridge by @shutterfreak in #230
- Migrate check/strip orchestration onto streaming engine by @shutterfreak in #231
- refactor(cli): stream probe command output by @shutterfreak in #232
- Migrate JSON output onto durable-result stream collectors by @shutterfreak in #238
- Complete durable-result streaming architecture cleanup by @shutterfreak in #239
- build(deps): bump actions/cache from 6.0.0 to 6.1.0 by @dependabot[bot] in #233
- build(deps): bump dorny/paths-filter from 4.0.1 to 4.0.2 by @dependabot[bot] in #234
- build(deps): bump pymdown-extensions from 11.0 to 11.0.1 by @dependabot[bot] in #235
- build(deps): bump typing-extensions from 4.15.0 to 4.16.0 by @dependabot[bot] in #236
- build(deps): bump pydoclint from 0.8.7 to 0.9.1 by @dependabot[bot] in #237
- chore(deps): update pre-commit hooks by @shutterfreak in #240
- Strengthen machine-readable contract coverage by @shutterfreak in #242
- Improve CLI contract coverage for lower-covered helper and command seams by @shutterfreak in #245
- Fix
--files-fromas sole CLI path input by @shutterfreak in #246 - Strengthen configuration contract coverage by @shutterfreak in #247
- Strengthen core contract coverage for #241 by @shutterfreak in #249
- Fix Python runtime upper-bound validation by @shutterfreak in #251
- Improve filetype contract coverage by @shutterfreak in #252
- Strengthen registry contract coverage by @shutterfreak in #254
- Strengthen resolver contract coverage for issue #241 by @shutterfreak in #255
- Reorganize resolution test tree by @shutterfreak in #256
- build(deps): bump astral-sh/setup-uv from 8.2.0 to 8.3.2 by @dependabot[bot] in #257
- build(deps): bump lycheeverse/lychee-action from 2.8.0 to 2.9.0 by @dependabot[bot] in #258
- build(deps): bump build from 1.5.0 to 1.5.1 by @dependabot[bot] in #259
- build(deps): bump uv from 0.11.24 to 0.11.28 by @dependabot[bot] in #260
- build(deps): bump ruff from 0.15.20 to 0.15.21 by @dependabot[bot] in #261
- test(pipeline): strengthen context contracts by @shutterfreak in #264
- test(pipeline): add adapter contracts and fix file-type diagnostics by @shutterfreak in #265
- test(pipeline): add direct contract tests for pipeline kind literals by @shutterfreak in #266
- test(pipeline): strengthen engine orchestration contracts by @shutterfreak in #267
- test(pipeline): strengthen outcome classification contracts by @shutterfreak in #268
- test(pipeline): cover synthetic context contracts by @shutterfreak in #269
- test(pipeline): strengthen whitespace policy contracts by @shutterfreak in #270
- build: promote Python 3.14 and harden documentation tooling by @shutterfreak in #271
- test(pipeline): strengthen resolver step contracts by @shutterfreak in #272
- fix(pipeline): strengthen sniffer contracts and terminal handling by @shutterfreak in #273
- fix(pipeline): strengthen reader contracts and terminal handling by @shutterfreak in #274
- fix(pipeline): strengthen scanner contracts and correct malformed-field hints by @shutterfreak in #275
- Strengthen builder step contracts and generation coverage by @shutterfreak in #276
- fix(pipeline): strengthen renderer contracts and empty-selection handling by @shutterfreak in #277
- Strengthen stripper contracts and terminal failure handling by @shutterfreak in #278
- fix(pipeline): strengthen planner contracts and preview hints by @shutterfreak in #279
- test(pipeline): strengthen writer sink contracts by @shutterfreak in #280
- test(pipeline): strengthen base step lifecycle contracts by @shutterfreak in #281
- fix(pipeline): strengthen comparer and view-pruning contracts by @shutterfreak in #282
- fix(pipeline): compare rendered empty headers against missing content by @shutterfreak in #283
- fix(pipeline): strengthen patcher failure contracts by @shutterfreak in #284
- test(pipeline): strengthen prober contracts by @shutterfreak in #285
- Strengthen public API contracts and stream validation by @shutterfreak in #286
- fix(processors): strengthen processor contracts and XML placement by @shutterfreak in #291
- fix(toml): preserve config-init template formatting by @shutterfreak in #292
- fix(toml): strengthen source loading and extraction contracts by @shutterfreak in #293
- fix(version): strengthen conversion and fallback contracts by @shutterfreak in #294
- test(utils): strengthen filesystem and timestamp contracts by @shutterfreak in #295
- build(deps): bump softprops/action-gh-release from 3.0.1 to 3.0.2 by @dependabot[bot] in #287
- build(deps): bump hypothesis from 6.155.7 to 6.156.6 by @dependabot[bot] in #288
- build(deps): bump tomlkit from 0.15.0 to 0.15.1 by @dependabot[bot] in #289
- build(deps): bump uv from 0.11.28 to 0.11.29 by @dependabot[bot] in #290
- test(types): establish protocol conformance contracts by @shutterfreak in #296
- refactor(machine): standardize output format handling by @shutterfreak in #297
- refactor(policy): remove unsupported reader hooks by @shutterfreak in #300
- feat(policy): add BOM-before-shebang remediation by @shutterfreak in #302
- feat(cli)!: enforce kebab-case enum values by @shutterfreak in #304
- feat(cli)!: enforce lowercase choice values by @shutterfreak in #305
- feat(policy): preserve mixed line endings by @shutterfreak in #312
- build(deps): bump pypa/gh-action-pypi-publish from 1.14.0 to 1.14.1 by @dependabot[bot] in #308
- build(deps): bump mkdocs-material from 9.7.6 to 9.7.7 by @dependabot[bot] in #310
- build(deps): bump nox from 2026.4.10 to 2026.7.11 by @dependabot[bot] in #311
- build(deps): bump actions/setup-python from 6.3.0 to 7.0.0 by @dependabot[bot] in #306
- build(deps): bump astral-sh/setup-uv from 8.3.2 to 9.0.0 by @dependabot[bot] in #307
- build(deps): bump ruff from 0.15.21 to 0.16.0 by @dependabot[bot] in #309
- test(api): strengthen public API snapshot coverage by @shutterfreak in #313
- chore(qa): enable Ruff annotation checks by @shutterfreak in #314
- docs(config): clarify enforced Pyright rules by @shutterfreak in #315
- Add Codecov coverage reporting and README badge by @shutterfreak in #316
- docs(ci): document Codecov coverage reporting by @shutterfreak in #317
- ci: add GitHub dependency review workflow by @shutterfreak in #318
- docs(deps): formalize dependency baseline maintenance by @shutterfreak in #319
- Refresh locked dependencies and pre-commit hooks by @shutterfreak in #320
- Configure Codecov project coverage checks and reporting by @shutterfreak in #321
- Validate hosted documentation links against local builds by @shutterfreak in #322
- docs(contrib): add repository agent guidance by @shutterfreak in #323
- fix(processors): validate header fields before rendering by @shutterfreak in #328
- docs(design): specify multiline header field serialization by @shutterfreak in #329
- feat(processors): support literal multiline header fields by @shutterfreak in #330
- docs(design): specify deterministic header field wrapping by @shutterfreak in #331
- feat(formatting): add deterministic header field wrapping by @shutterfreak in #332
- Chore/update deps by @shutterfreak in #341
- docs(design): revise multiline header field rendering by @shutterfreak in #340
- feat(headers): simplify multiline field rendering by @shutterfreak in #342
- build(deps): bump actions/checkout from 7.0.0 to 7.0.1 by @dependabot[bot] in #333
- build(deps): bump uv from 0.11.32 to 0.11.33 by @dependabot[bot] in #334
- build(deps): bump twine from 6.2.0 to 7.0.0 by @dependabot[bot] in #335
- build(deps): bump pypa/gh-action-pypi-publish from 1.14.1 to 1.14.2 by @dependabot[bot] in #337
- build(deps): bump dorny/paths-filter from 4.0.2 to 4.0.3 by @dependabot[bot] in #338
- build(deps): bump hypothesis from 6.161.6 to 6.168.0 by @dependabot[bot] in #336
- build(deps): upgrade uv to 0.12 by @shutterfreak in #343
- fix(deps): raise rich-click compatibility floor by @shutterfreak in #344
- docs(ci): clarify combined matrix coverage by @shutterfreak in #345
- build(deps): bump codecov/codecov-action from 7.0.0 to 7.1.0 by @dependabot[bot] in #346
- build(deps): bump pymdown-extensions from 11.0.2 to 12.0 by @dependabot[bot] in #347
- build(deps): bump softprops/action-gh-release from 3.0.2 to 3.0.3 by @dependabot[bot] in #349
- build(deps): bump astral-sh/setup-uv from 9.0.0 to 10.1.0 by @dependabot[bot] in #348
- build(deps): bump codecov/codecov-action from 7.1.0 to 7.1.1 by @dependabot[bot] in #350
- build(deps): bump pymdown-extensions from 12.0 to 12.0.1 by @dependabot[bot] in #353
- build(deps): bump uv from 0.12.15 to 0.12.17 by @dependabot[bot] in #351
- build(deps): bump astral-sh/setup-uv from 10.1.0 to 10.2.0 by @dependabot[bot] in #352
- chore(deps): update dependencies and pre-commit hooks by @shutterfreak in #354
- docs: add Zensical compatibility pilot by @shutterfreak in #356
- ci: skip duplicate project-link check in release_full by @shutterfreak in #359
- docs: adopt api-autonav for module references by @shutterfreak in #361
- docs: consolidate documentation terminology by @shutterfreak in #362
- test: replace TOPMARK_VALIDATE runtime checks by @shutterfreak in #363
- build(deps): bump pydoclint from 0.9.1 to 0.10.1 by @dependabot[bot] in #364
- build(deps): bump mkdocs-api-autonav from 0.3.1 to 0.4.0 by @dependabot[bot] in #365
- build(deps): bump uv from 0.12.19 to 0.12.20 by @dependabot[bot] in #366
- build: manage Nox through uv project dependencies by @shutterfreak in #367
- ci: enforce Conventional Commit titles by @shutterfreak in #369
- docs: clarify commit body formatting by @shutterfreak in #370
- feat(docs): migrate production pipeline to Zensical by @shutterfreak in #373
- fix(docs): publish Zensical site on Read the Docs by @shutterfreak in #375
- fix(docs): invoke uv module in Read the Docs jobs by @shutterfreak in #376
- fix(docs): invoke Zensical module on Read the Docs by @shutterfreak in #377
- fix(docs): preserve RTD version metadata by @shutterfreak in #379
- docs: add 2.0 upgrade guidance by @shutterfreak in #380
- docs: update upgrade entry points by @shutterfreak in #381
- docs(release): document release milestone workflow by @shutterfreak in #385
- build: add Python 3.15 support by @shutterfreak in #393
- build(deps): bump pydoclint from 0.10.1 to 0.11.0 by @dependabot[bot] in #389
- build(deps): bump ruff from 0.16.9 to 0.16.10 by @dependabot[bot] in #391
- build(deps): bump hypothesis from 6.168.3 to 6.168.5 by @dependabot[bot] in #390
- feat(machine): add Python runtime metadata by @shutterfreak in #396
- ci: pin release runner images and cover Ubuntu 26.04 by @shutterfreak in #398
- build(ci): audit Python lifecycle transitions by @shutterfreak in #400
- fix(headers): make repository self-check compliant by @shutterfreak in #401
- docs(release): complete 2.0 migration guidance by @shutterfreak in #402
- feat(registry): add file-type activation policies by @shutterfreak in #408
- docs(agents): refine contributor guidance by @shutterfreak in #409
- feat(tooling): add changed-lines coverage diagnostic by @shutterfreak in #411
- fix(registry): bind JSONC-detected JSON to slash processor by @shutterfreak in #412
- fix(pipeline): preserve multiline field whitespace by @shutterfreak in #413
- chore(deps): refresh locked tools and hooks by @shutterfreak in #414
- test(ci): add marker-driven smoke suite by @shutterfreak in #415
- chore(tooling): align uv and validation workflows by @shutterfreak in #416
- refactor(build): centralize validation orchestration in nox by @shutterfreak in #417
- test: organize repository tooling tests by @shutterfreak in #419
- test: restore tooling test discovery by @shutterfreak in #421
- test: report skipped tests by default by @shutterfreak in #422
- docs(ci): clarify coverage policy roles by @shutterfreak in #423
- ci(coverage): add separate tooling reporting by @shutterfreak in #424
- test(tools): improve repository tooling coverage by @shutterfreak in #432
- build(deps): bump actions/github-script from 373c709c69115d41ff229c7e5df9f8788daa9553 to 3a2844b7e9c422d3c10d287c895573f7108da1b3 by @dependabot[bot] in #428
- build(deps): bump actions/download-artifact from 8.0.1 to 8.0.2 by @dependabot[bot] in #429
- build(deps): bump astral-sh/setup-uv from 10.2.0 to 10.3.0 by @dependabot[bot] in #430
- build(deps): bump uv from 0.12.24 to 0.13.0 by @dependabot[bot] in #431
- ci: promote Linux runners to Ubuntu 26.04 by @shutterfreak in #433
- test(cli): add metadata-driven command contracts by @shutterfreak in #434
- ci(coverage): adopt tooling coverage policy by @shutterfreak in #435
- test(cli): add command contracts to smoke suite by @shutterfreak in #436
- docs(roadmap): realign 2.x planning documentation by @shutterfreak in #437
- feat(cli): improve command help discoverability by @shutterfreak in #439
- fix(registry): render declared activation consistently by @shutterfreak in #441
- ci: restore canonical Python for TopMark hooks by @shutterfreak in #442
- docs(changelog): curate TopMark 2.0 release notes by @shutterfreak in #443
Full Changelog: v1.0.1...v2.0.0