TopMark stable 1.x roadmap¶
Motivation / Why this matters¶
TopMark 1.0 has completed its stabilization and release-readiness cycle. The major architecture refactors, contract-freeze decisions, CI/release workflow stabilization, documentation governance work, late-beta validation passes, release-candidate validation, final 1.0 release preparation, and initial 1.0.1 patch-release hardening have been completed. The roadmap now focuses on preserving stable 1.x behavior, tracking explicit post-1.0 deferrals, and recording future evolution areas without reopening frozen 1.0 contracts.
This roadmap now serves two purposes:
- a release-governance record for the frozen 1.0 contracts, explicit deferrals, and stable 1.x maintenance posture;
- a strategic planning reference for broad future directions that are intentionally not yet actionable issue scope.
This roadmap is not the canonical backlog. Actionable work belongs in GitHub issues and pull
requests; release outcomes belong in CHANGELOG.md; detailed 1.0 stabilization history belongs in
Road to TopMark 1.0. The roadmap should only keep context that helps maintainers
understand stable-line scope boundaries, deferred architecture directions, and why broad future work
should not be treated as unplanned stable-line maintenance.
After the final 1.0.0 release and first 1.0.1 patch-release preparation, this roadmap remains a
concise governance reference. Detailed achievements and design decisions are tracked in
Road to TopMark 1.0, so this file can remain focused on stable 1.x maintenance,
compatibility preservation, and post-1.0 scope.
A key deferred post-1.0 opportunity remains support for data that is not naturally file-backed: generated code, editor buffers, CI-provided snippets, or API-driven integrations. Today, almost all of TopMark's processing pipeline assumes filesystem I/O, which makes testing heavier, limits reuse, and complicates future integrations. This broader direction is now tracked as the future streaming pipeline architecture work, initiated while fixing issue #52.
Future in-memory pipeline support would enable:
- Faster, more isolated tests without filesystem setup/teardown
- Cleaner API boundaries (pipeline as a pure transformation)
- Future integrations (editors, LSPs, CI bots) without temporary files
- Clearer separation between what TopMark does and how input is obtained
For the stable 1.x line, the priority is to keep the already-refactored system stable, predictable, well-documented, reproducible in CI/release environments, and operationally transparent while continuing to treat new integration scope as post-1.0 evolution.
Roadmap governance¶
Use this page as a maintainer-facing planning document, not as a parallel issue tracker.
Roadmap content should be limited to:
- stable-line maintenance posture and compatibility boundaries;
- strategic directions that are too broad or early for a single GitHub issue;
- explicit deferrals that explain why work is out of scope for the current stable line;
- links to canonical issues, pull requests, release notes, or design documents when details already live elsewhere.
Do not use this page for:
- task-level backlog items that can be tracked as GitHub issues;
- release-note history that belongs in
CHANGELOG.md; - completed stabilization narrative that belongs in Road to TopMark 1.0;
- duplicated acceptance criteria from open issues or pull requests.
When a roadmap item becomes actionable, create or update a GitHub issue and keep only a concise strategic note here. When an item is completed, either remove it from the active roadmap or move any lasting rationale to the appropriate design, release, or historical document.
Stable 1.x baseline¶
The 0.12 development line, 1.0 alpha/beta series, 1.0.0rc1 validation, final 1.0 release
preparation, and initial stable-line patch-release work completed the major stabilization work
needed for the 1.x line. Detailed historical achievements and design decisions belong in
Road to TopMark 1.0, CHANGELOG.md, and the closed GitHub issues and pull
requests that implemented them.
This roadmap keeps only the maintainer-facing baseline that affects stable 1.x governance:
- registry, resolution, and file-type identity contracts are explicit, namespace-aware, and compatibility-governed;
- configuration loading follows the TOML → layered configuration → runtime overlay split, with discovery anchors and source identity handled as part of the documented configuration contract;
- filesystem identity semantics now cover symlinked workspace roots, configuration-source identity, public API compatibility boundaries, and hard-link blocking for mutation targets;
- CLI behavior, exit codes, command applicability, STDIN handling, human output, and machine-readable output remain treated as externally observable contracts;
- documentation conventions, documentation-pipeline validation, changelog hygiene, and prose consistency are established as ongoing governance mechanisms;
- CI and release workflow hardening, including Windows symlink coverage and GitHub Actions pin-audit repair support, are handled through focused issues and pull requests rather than roadmap-level task tracking;
- in-memory and streaming pipeline support, richer staged diagnostics exposure, registry query/filter commands, schema versioning, generated command-help documentation, Markdown output refactoring, and broader workflow factoring remain explicitly deferred beyond the current stable maintenance scope.
Recent post-1.0 governance and maintenance work confirms that TopMark now operates primarily through GitHub issue and pull-request tracking. The roadmap should therefore avoid repeating completed issue scope, PR summaries, or release-note history. It should instead explain why the stable 1.x line is constrained, which broad future directions are intentionally deferred, and where contributors should look for actionable work.
Breaking changes introduced so far¶
This section summarizes the externally relevant breaking changes introduced during the 0.12 refactor series and the 1.0 alpha/beta stabilization line. It is retained in the roadmap for final 1.0 release validation because downstream users, plugin authors, documentation readers, and automation consumers may still need to compare older alpha/beta behavior with the frozen 1.0 contracts.
For the full historical stabilization narrative, see Road to TopMark 1.0.
Registry, resolution, and file-type identity¶
TopMark no longer relies on implicit processor registration, decorator-based bootstrap behavior, or legacy registry entry points. Registry behavior is now explicit and split by responsibility:
- file-type registration;
- processor registration;
- binding file types to processors.
Downstream integrations must use the explicit registry/binding model instead of older bootstrap
helpers such as register_all_processors() or implicit processor discovery.
File-type identity is now namespace-aware:
- canonical identity uses qualified keys such as
topmark:python; - local identifiers such as
pythonare accepted only when unambiguous; - ambiguous local identifiers require the qualified form;
- machine output, registry output, diagnostics, configuration normalization, and policy lookup use canonical qualified identifiers where a resolved identity is available.
Result: registry and resolution behavior is deterministic and plugin-ready, but callers using older registry helpers, local-only identifiers, or processor-grouped binding views must update.
Configuration, TOML, and runtime boundaries¶
Configuration is no longer treated as a single mixed layer. The 1.0 architecture separates:
- TOML parsing and whole-source validation;
- layered configuration merge and provenance;
- per-path effective runtime configuration;
- execution-time runtime options.
Runtime-only behavior such as apply/preview and STDIN handling is modeled separately from layered
configuration. TOML-authored runtime sections such as [writer] remain outside layered
configuration while still appearing in configuration output snapshots.
The public configuration surface changed in several important ways:
[config].strictis the finalized configuration-loading strictness option;add_only/update_onlywere replaced byheader_mutation_mode;skip_compliant/skip_unsupportedwere replaced byreport;policy_by_type,include_file_types, andexclude_file_typesshare the same qualified/local file-type identifier contract;- resolved runtime
policy_by_typemaps use canonical qualified file-type keys; - staged validation remains primarily internal, with flattened compatibility diagnostics exposed at exception, presentation, and machine-readable output boundaries.
Result: configuration behavior is clearer, typed, and reproducible, but callers relying on older helper locations, older policy tokens, or local-only file-type keys must update.
CLI behavior, runtime execution, and human output¶
The CLI behavior contract was narrowed and stabilized for 1.0.
Important changes include:
TEXTis the canonical plain human-output format; legacyDEFAULToutput naming was removed;- human rendering is separated from CLI runtime and printing;
- verbosity, quiet, and color controls are command-level concerns rather than root-only global behavior;
-v/--verboseand-q/--quietapply only to TEXT output where supported;- Markdown output is document-oriented and ignores TEXT-oriented verbosity and quiet controls;
- JSON/NDJSON output is machine-readable and ignores human presentation controls;
- pure informational commands such as
version,config defaults,config init, and registry commands do not expose--quiet.
Command applicability is stricter:
striprejects check-only mutation, insertion, and generated-header formatting options;proberejects mutation, write-mode, diff, summary/reporting, and generated-header controls;- path-processing commands intentionally do not expose a
--stdinoption flag; - content STDIN uses
-plus--stdin-filename; - file-agnostic commands reject positional paths and file-processing STDIN modes.
The CLI exit-code contract is now enum-backed, documented, and tested. Notable stable outcomes include:
check/stripuseWOULD_CHANGE (3)for dry-run would-change results;- explicit missing literal inputs produce
FILE_NOT_FOUND (66); - unmatched globs are soft discovery diagnostics for
check/strip; probereports unresolved, unsupported, filtered, and unmatched-glob semantic outcomes withUNSUPPORTED_FILE_TYPE (69).
Several low-level runtime helpers now return typed result objects rather than positional tuples. Internal and advanced callers should consume named fields instead of relying on tuple positions.
Result: CLI behavior is more explicit, scriptable, and stable, but existing invocation habits, output snapshots, and low-level runtime integrations may need adjustment.
Machine-readable output contracts¶
Machine-readable output is now schema-driven, domain-scoped, and separated from human presentation.
Breaking output-contract changes include:
- pipeline summaries use explicit flat
(outcome, reason, count)rows; config checkuses the explicitconfig_checkpayload/record kind;config dump --show-layersemits layered provenance before the final flattened runtime configuration payload;- registry JSON output uses flattened domain-specific envelopes for file types, processors, and bindings;
detail_levelreflects projection depth in machine output where emitted;- registry, configuration, resolution, and probe payloads emit canonical qualified file-type identifiers where a resolved identity is available;
- probe machine output uses per-path probe records and includes filtered explicit inputs;
- JSON/NDJSON payloads do not imply process status, which remains the CLI exit code.
Result: machine-readable formats are more stable and automation-friendly, but downstream consumers that relied on older payload names, outcome-keyed summaries, or older registry shapes must update.
Documentation and generated-site behavior¶
Documentation validation is stricter than before. Generated API/reference pages, strict MkDocs builds, built-site link checks, documentation hygiene, code-prose hygiene, and changelog heading validation are now part of the local and release validation ecosystem.
Important behavior changes include:
- generated API/reference pages are part of the docs build contract;
- built-site link checking gates release-artifact creation on tag pushes;
- documentation hygiene validates snippet includes, include paths, section separators, heading conventions, accidental macOS resource files, and changelog heading shape;
- Python code-prose hygiene validates comments, docstrings, and prose-oriented string literals;
- the terminology glossary moved from
docs/dev/terminology.mdtodocs/terminology.md; - repeated terminology notes now use
_snippets/terminology.md.
Result: documentation is more accurate and better governed, but docs contributors must follow the stricter generated-site, snippet, heading, and prose-hygiene rules.
Developer tooling, dependency management, and release workflow¶
The contributor and release workflow changed significantly:
- tox was removed; contributors and CI now use nox with uv-backed environments;
uv.lockis the canonical lock artifact;- committed
requirements*.txt/constraints.txtfiles are no longer the primary dependency management model; - package versions are derived from Git tags through
setuptools-scm; - release publishing no longer builds from repository source in the privileged workflow;
- CI builds release artifacts on tag pushes;
- the privileged release workflow downloads, verifies, and publishes CI-built artifacts;
- compact PEP 440 prerelease tags are preferred (
vX.Y.ZaN,vX.Y.ZbN,vX.Y.ZrcN).
CI behavior also changed:
- pull-request jobs are gated more aggressively by changed-file buckets;
- supported and canonical Python versions are derived through
nox -s print_python_matrix; - compatibility-matrix and canonical single-version jobs consume resolved metadata rather than duplicated workflow literals;
- release workflows retain explicit release-tooling Python versions while reporting non-blocking drift warnings against canonical CI metadata;
- uv cache ownership is centralized through explicit
actions/cacheintegration rather than mixed ownership withsetup-uvbuilt-in caching.
Runtime dependency metadata was tightened after isolated-environment validation revealed implicit
runtime imports. In particular, typing-extensions and packaging are now treated as runtime
dependencies where required.
Result: the workflow is more secure, reproducible, and observable, but maintainers and contributors must use the uv/nox/artifact-based release model rather than older tox, manual-version, or source-build-in-release assumptions.
Overall impact¶
The 1.0 breaking changes are not isolated helper removals; they reflect a new system shape:
- explicit registry and binding model;
- namespace-aware file-type identity;
- layered TOML/configuration/runtime boundaries;
- explicit preview/apply runtime behavior;
- schema-driven machine output;
- separated human presentation;
- stricter CLI applicability and exit-code contracts;
- uv/nox-based tooling;
- artifact-based release publication;
- and stricter documentation/prose governance.
These changes are now treated as frozen 1.0 contracts. Final release preparation should preserve and validate those contracts rather than introduce new breaking changes.
Active strategic directions¶
The large architectural redesign, contract-freeze work, documentation-governance effort, machine-output stabilization, CI/release workflow hardening, typing cleanup, late-beta validation, final 1.0 release, and first stable-line hardening passes are complete.
Remaining roadmap content should be limited to broad directions that are intentionally too large or too early for a single actionable issue. When a direction becomes actionable, track the concrete work in GitHub issues and leave only the stable-line rationale here.
Stable 1.x maintenance posture¶
Stable 1.x maintenance is limited to:
- post-release validation in realistic environments;
- downstream ecosystem and automation compatibility observation;
- targeted hardening from concrete post-release findings;
- preserving documentation and output-contract consistency;
- monitoring CI, release, dependency, and workflow health through focused maintenance issues;
- and maintaining explicit post-1.0 scope boundaries.
Stable 1.x maintenance is not expected to introduce broad architectural redesign, new output contracts, new configuration semantics, or new filesystem identity semantics unless a concrete compatibility or correctness issue requires it.
Deferred architecture directions¶
The following remain strategic post-1.0 directions rather than active stable-line maintenance:
- in-memory and streaming pipeline architecture for generated code, editor buffers, CI-provided snippets, API-driven integrations, and lighter-weight tests;
- richer registry query/filter and introspection commands;
- explicit configuration schema versioning;
- broader staged-validation exposure where it would improve public diagnostics without leaking internal implementation details;
- generated command-help documentation and help-layout refinements;
- Markdown output refactoring where it naturally follows from presentation-layer evolution;
- broader workflow factoring or infrastructure extraction once repeated maintenance work justifies it.
These directions should become GitHub issues only when their intended scope, compatibility impact, and acceptance criteria are clear enough for reviewable implementation.
Frozen 1.x contract areas¶
The following areas are frozen for 1.x and should now primarily receive compatibility validation, documentation clarification, focused confidence-building tests, downstream-consumer verification, or concrete correctness fixes:
- registry and file-type identity semantics;
- CLI applicability, STDIN, verbosity, quiet, and exit-code behavior;
- TOML/config/runtime layering and staged-validation boundaries;
- filesystem identity, path serialization, configuration-source identity, symlink, and hard-link semantics;
- machine-readable output schemas and naming conventions;
- TEXT and Markdown human-output behavior;
- artifact-based CI → release publication;
- uv/nox-based tooling and metadata-driven CI Python-version handling;
- and documentation/prose-governance validation.
Stable-line validation checklist¶
TopMark 1.x follows a contract-first maintenance strategy: externally observable behavior should remain stable, documented, reproducible, and tested.
Use this checklist as a stable-line validation reminder, not as a task tracker:
- CLI, presentation, API, and runtime/core responsibilities are separated and documented
- TOML → configuration → runtime layering is stabilized
- public/internal API boundaries are reviewed and documented
- filesystem-backed execution is accepted for stable 1.x
- in-memory and streaming pipeline support is explicitly deferred beyond the current stable maintenance scope
- namespace-aware file-type identity and registry binding semantics are frozen
- symlink, hard-link, canonical path, and configuration-source identity semantics are documented and regression-tested where practical
- CLI applicability, STDIN behavior, exit-code behavior, and human-output behavior are frozen
- JSON/NDJSON machine-readable output schemas and path serialization rules are stabilized
- documentation conventions, snippet governance, documentation-pipeline validation, prose hygiene, and changelog hygiene are part of the maintenance workflow
- uv/nox tooling, metadata-driven CI Python-version handling, and artifact-based release publication are established
- Windows symlink-dependent CI coverage is enforced rather than silently skipped
- CI/tooling maintenance items are handled through focused GitHub issues and pull requests
The stable 1.x maintenance path should avoid introducing new broad scope, architectural churn, or output-contract redesign unless a concrete compatibility or correctness issue requires it.