Assumptions Evaluation - 24/04/2026¶
0. Repository Snapshot¶
root:
- path:
C:/Users/marco/Documenti/Programmazione/Fontshow - git_head:
5cf123337a3a57cffaf91eb1dc24e46dc7ac7bab - git_status: clean at audit start
- adr_location:
docs/decisions/ - configs:
pyproject.toml,.pre-commit-config.yaml,package.json,commitlint.config.cjs,.github/workflows/*.yml - entry_points:
pyproject.toml:50-51,src/fontshow/__main__.py:354-387 - test_structure:
tests/,tests/cli/,tests/preflight/,tests/schema/
1. ADR Summary¶
| ADR | title | status | evidence |
|---|---|---|---|
| 0001 | Base-Zero Replanning and Governance Reset | Accepted | docs/decisions/0001-base-zero-replanning.md:1-3 |
| 0002 | Planning System Formalization | Accepted | docs/decisions/0002-planning-system-formalization.md:1-3 |
| 0003 | Python and Node.js Coexistence Strategy | Accepted | docs/decisions/0003-python-node-coexistence.md:1-5 |
| 0004 | Branching Strategy Formalization | Accepted | docs/decisions/0004-branch-strategy.md:1-5 |
| 0005 | CLI error handling normalization | Accepted | docs/decisions/0005-cli-error-handling-normalization.md:1-5 |
| 0006 | CLI dispatch testability limitation | Superseded | docs/decisions/0006-cli-dispatch-testability-limit.md:1-6 |
| 0007 | Standardization of project scripts in Python | Accepted | docs/decisions/0007-standardization-project-scripts-python.md:1-4 |
| 0008 | Developer tooling is first-class project code | Accepted | docs/decisions/0008-developer-tooling-first-class-project-code.md:1-4 |
| 0009 | CLI verbosity contract | Accepted | docs/decisions/0009-cli-verbosity-contract.md:1-4 |
| 0010 | Separation between CLI verbosity and debug-only inference output | Accepted | docs/decisions/0010-separation-cli-verbosity-debug.md:1-4 |
| 0011 | CLI stdout / stderr semantics and quiet behavior | Accepted | docs/decisions/0011-cli-stdout-stderr-semantics-quiet-behavior.md:1-6 |
| 0012 | GitHub Pages deployment strategy | Accepted | docs/decisions/0012-github-pages-deployment-strategy.md:1-4 |
| 0013 | Language normalization strategy | Accepted | docs/decisions/0013-language-normalization-strategy.md:1-4 |
| 0014 | Exclude bitmap / non-OpenType fonts from inventory | Accepted | docs/decisions/0014-exclude-bitmap-non-opentype-fonts-inventory.md:1-4 |
| 0015 | ASCII-only console output | Accepted | docs/decisions/0015-ascii-console-output.md:1-4 |
| 0016 | Language Normalization and Validation Strategy | Accepted | docs/decisions/0016-language-normalization-validation-strategy.md:1-4 |
| 0017 | Ruff Linting Policy and Staged Adoption | Accepted | docs/decisions/0017-ruff-linting-policy-staged-adoption.md:1-4 |
| 0018 | TRACE Logging Architecture and Semantics | Accepted | docs/decisions/0018-trace-logging-architecture-semantics.md:1-4 |
| 0019 | Enum / JSON Boundary Invariant | Accepted | docs/decisions/0019-enum-json-boundary-invariant.md:1-4 |
| 0020 | Schema v1.2 Unification and Deprecation | Accepted | docs/decisions/0020-schema-v1-2-unification-deprecation-previous-versions.md:1-4 |
| 0021 | Authoritative Unicode Ontology | Accepted | docs/decisions/0021-authoritative-unicode-ontology.md:1-4 |
| 0022 | Specimen Inference Inputs Matrix v1.0 | Accepted | docs/decisions/0022-fontshow-specimen-inference-inputs-matrix-v1-0.md:1-4 |
| 0023 | Font skip accounting and legacy format filtering | Accepted | docs/decisions/0023-font-skip-accounting-legacy-format-filtering.md:1-4 |
| 0024 | Parse-inventory validation summary and fallback handling | Accepted | docs/decisions/0024-parse-inventory-validation-summary-fallback-handling.md:1-4 |
| 0025 | Drive Script Inference from Ontology Data | Accepted | docs/decisions/0025-drive-script-inference-ontology-data.md:1-4 |
| 0026 | Schema v1.3 nested inventory structure | Accepted | docs/decisions/0026-schema-v1-3-nested-inventory-structure-latex-validation-metadata.md:1-4 |
| 0027 | Catalog low-information specimen rendering policy | Accepted | docs/decisions/0027-catalog-low-information-specimen-rendering-policy.md:1-4 |
| 0028 | Parse-Inventory Render-Path Loadability | Accepted | docs/decisions/0028-parse-inventory-render-path-loadability.md:1-3 |
| 0029 | dump-fonts controlled discovery paths | Accepted | docs/decisions/0029-dump-fonts-controlled-discovery-paths.md:1-3 |
2. Explicit Assumptions¶
ADR_0001:
title: Base-Zero Replanning and Governance Reset
status: Accepted
decision: legacy planning archived; new planning framework under docs/planning
assumptions: new work originates from docs/planning; future governance decisions use docs/decisions
consequences: old milestones archived; new work tracked through new model
evidence:
- file: docs/decisions/0001-base-zero-replanning.md
lines: 28-76
snippet: New work MUST originate from docs/planning
ADR_0003:
title: Python and Node.js Coexistence Strategy
status: Accepted
decision: Python and Node tooling coexist in one workspace
assumptions: Node tooling is development-only; Python package discovery must be restricted
consequences: editable installs and CI builds remain stable
evidence:
- file: docs/decisions/0003-python-node-coexistence.md
lines: 19-36
snippet: Node.js tooling is considered development-only
ADR_0005:
title: CLI error handling normalization
status: Accepted
decision: exit codes 0, 1, 2 distinguish success, expected errors, internal errors
assumptions: CLI callers depend on stable exit-code semantics
consequences: internal failures detectable via exit code 2
evidence:
- file: docs/decisions/0005-cli-error-handling-normalization.md
lines: 36-99
snippet: Exit code 2
ADR_0009:
title: CLI verbosity contract
status: Accepted
decision: define --quiet, default, and --verbose
assumptions: automation relies on no stdout in quiet mode
consequences: predictable CLI behavior
evidence:
- file: docs/decisions/0009-cli-verbosity-contract.md
lines: 30-142
snippet: Produces no stdout output
ADR_0011:
title: CLI stdout / stderr semantics and quiet behavior
status: Accepted
decision: --quiet suppresses stdout but not warnings/errors on stderr
assumptions: stderr diagnostics remain valid under quiet mode
consequences: tests align with real CLI behavior
evidence:
- file: docs/decisions/0011-cli-stdout-stderr-semantics-quiet-behavior.md
lines: 54-119
snippet: stderr is allowed output
ADR_0014:
title: Exclude bitmap / non-OpenType fonts from inventory
status: Accepted
decision: exclude non-OpenType / unparseable fonts during dump-fonts
assumptions: later pipeline stages only process semantically parseable OpenType/TrueType fonts
consequences: bitmap fonts skipped; no parse/schema changes
evidence:
- file: docs/decisions/0014-exclude-bitmap-non-opentype-fonts-inventory.md
lines: 29-58
snippet: never reach later pipeline stages
ADR_0018:
title: TRACE Logging Architecture and Semantics
status: Accepted
decision: TRACE has semantic categories, activation model, output rules, performance contract
assumptions: TRACE is high-frequency and must be deterministic/filterable
consequences: logging stability guarantees and guardrails
evidence:
- file: docs/decisions/0018-trace-logging-architecture-semantics.md
lines: 24-247
snippet: TRACE MUST be used for
ADR_0021:
title: Authoritative Unicode Ontology
status: Accepted
decision: generated Unicode ontology from vendored standards
assumptions: Unicode behavior derives from vendored UCD and ISO data
consequences: deterministic Unicode behavior; generator critical
evidence:
- file: docs/decisions/0021-authoritative-unicode-ontology.md
lines: 27-86
snippet: vendored standards
ADR_0028:
title: Parse-Inventory Render-Path Loadability
status: Accepted
decision: parse-inventory refreshes render-path loadability against current install
assumptions: parse output may depend on LuaLaTeX/fontspec environment
consequences: inventories may diverge across TeX installations
evidence:
- file: docs/decisions/0028-parse-inventory-render-path-loadability.md
lines: 30-75
snippet: parse-inventory is no longer a pure JSON-only enrichment step
ADR_0029:
title: dump-fonts controlled discovery paths
status: Accepted
decision: dump-fonts --paths scans only provided directories
assumptions: invalid roots fail; no system fallback in paths mode
consequences: reproducible benchmark inputs
evidence:
- file: docs/decisions/0029-dump-fonts-controlled-discovery-paths.md
lines: 19-50
snippet: platform system discovery is not used as a fallback
3. Implicit Assumptions¶
environment:
ASSUMPTION_ENV_001:
description: Python 3.13 is the project runtime/test/tooling baseline.
category: environment
evidence:
- file: pyproject.toml
lines: 10-17
snippet: requires-python = ">=3.13"
- file: .github/workflows/ci.yml
lines: 27-38
snippet: python-version: "3.13"
confidence: high
ASSUMPTION_ENV_002:
description: Linux bare-metal is the fully supported baseline; Windows is warning-level; macOS is unsupported/error-level.
category: environment
evidence:
- file: src/fontshow/preflight/checks/environment.py
lines: 127-129
snippet: Linux bare-metal is treated as the fully supported baseline
- file: tests/preflight/test_environment_matrix.py
lines: 34-42
snippet: ("macos", "bare-metal", Severity.ERROR)
confidence: high
ASSUMPTION_ENV_003:
description: LuaLaTeX is required for catalog generation and checked through PATH plus deterministic Windows fallback paths.
category: environment
evidence:
- file: src/fontshow/preflight/checks/latex.py
lines: 4-10
snippet: LuaLaTeX engine required for catalog generation
- file: src/fontshow/preflight/checks/latex.py
lines: 395-424
snippet: shutil.which("lualatex")
confidence: high
tooling:
ASSUMPTION_TOOL_001:
description: Runtime Python distribution depends on jsonschema, language-tags, pycountry, and fonttools.
category: tooling
evidence:
- file: pyproject.toml
lines: 13-18
snippet: "fonttools>=4.61.0"
confidence: high
ASSUMPTION_TOOL_002:
description: Release automation depends on Node 20 and semantic-release.
category: tooling
evidence:
- file: .github/workflows/release.yml
lines: 29-60
snippet: node-version: 20
- file: package.json
lines: 25-33
snippet: "semantic-release": "24.2.9"
confidence: high
ASSUMPTION_TOOL_003:
description: CI quality gates are pre-commit run --all-files plus pytest with coverage.
category: tooling
evidence:
- file: .github/workflows/ci.yml
lines: 46-52
snippet: pre-commit run --all-files
confidence: high
data:
ASSUMPTION_DATA_001:
description: Current canonical inventory schema is v1.5.
category: data
evidence:
- file: src/fontshow/schema/inventory_v1_5.json
lines: 3-5
snippet: Fontshow Inventory Schema v1.5
- file: tests/test_output_schema_invariants.py
lines: 47-48
snippet: "schema_version": "1.5"
confidence: high
ASSUMPTION_DATA_002:
description: Valid inventory entries require persisted per-font LuaLaTeX loadability state including render_variants.
category: data
evidence:
- file: src/fontshow/schema/inventory_v1_5.json
lines: 393-408
snippet: "required": ["lualatex"]
- file: tests/test_output_schema_invariants.py
lines: 120-127
snippet: "render_variants": []
confidence: high
ASSUMPTION_DATA_003:
description: Unicode/ISO inference uses vendored Unicode 17.0.0 and ISO 15924 data.
category: data
evidence:
- file: src/fontshow/ontology/unicode_tables.py
lines: 1-8
snippet: Unicode version: 17.0.0
- file: src/fontshow/data/unicode/README.md
lines: 7-13
snippet: vendored to guarantee
confidence: high
ASSUMPTION_DATA_004:
description: Language inference ignores platform charset metadata and uses Unicode coverage data.
category: data
evidence:
- file: src/fontshow/inventory/infer_languages.py
lines: 15-18
snippet: Platform-specific charset metadata is intentionally ignored
- file: src/fontshow/inventory/infer_languages.py
lines: 43-45
snippet: LANGUAGE_BLOCK_COVERAGE_THRESHOLD = 0.40
confidence: high
api:
ASSUMPTION_API_001:
description: Public CLI commands are preflight, dump-fonts, parse-inventory, validate-inventory, and create-catalog.
category: api
evidence:
- file: src/fontshow/__main__.py
lines: 240-245
snippet: fontshow dump-fonts
- file: src/fontshow/__main__.py
lines: 262-273
snippet: subparsers.add_parser("preflight")
confidence: high
ASSUMPTION_API_002:
description: CLI handlers return integer-like exit codes or None; uncaught exceptions map to exit code 2.
category: api
evidence:
- file: src/fontshow/__main__.py
lines: 296-307
snippet: 2 for any other unhandled exception
- file: tests/test_main_dispatch.py
lines: 18-19
snippet: map correctly
confidence: high
workflow:
ASSUMPTION_WORKFLOW_001:
description: Documentation is built with MkDocs strict mode and deployed through GitHub Actions.
category: workflow
evidence:
- file: .github/workflows/docs-pages.yml
lines: 22-44
snippet: mkdocs build --strict
confidence: high
ASSUMPTION_WORKFLOW_002:
description: Tests intentionally ignore cache/temp directories during discovery.
category: workflow
evidence:
- file: pyproject.toml
lines: 53-64
snippet: norecursedirs
confidence: high
performance:
ASSUMPTION_PERF_001:
description: JSON formatting is deterministic and appends a trailing newline.
category: performance
evidence:
- file: src/fontshow/core/json_format.py
lines: 315-322
snippet: deterministic layout and trailing newline
- file: tests/test_deterministic_output.py
lines: 83-85
snippet: byte-stable
confidence: high
ASSUMPTION_PERF_002:
description: TRACE logging must be disabled/no-op by default and low overhead.
category: performance
evidence:
- file: src/fontshow/core/logging_utils.py
lines: 17-19
snippet: no-ops with minimal overhead
- file: src/fontshow/core/logging_utils.py
lines: 41-47
snippet: Logging is disabled by default
confidence: high
4. Coverage Matrix¶
ASSUMPTION_ENV_001 -> NONE classification: NOT_COVERED justification: Python/Node coexistence is covered by ADR_0003, but Python 3.13 baseline is not documented in a numbered ADR.
ASSUMPTION_ENV_002 -> NONE classification: NOT_COVERED justification: Platform severity matrix is enforced by preflight code/tests, but no active ADR defines Linux/Windows/macOS support levels.
ASSUMPTION_ENV_003 -> ADR_0028 classification: PARTIALLY_COVERED justification: ADR_0028 covers LuaLaTeX/fontspec environment dependence for parse-time loadability; Windows fallback probing is code/test-only.
ASSUMPTION_TOOL_001 -> ADR_0003 classification: PARTIALLY_COVERED justification: ADR_0003 covers Python packaging boundaries, not concrete runtime dependencies.
ASSUMPTION_TOOL_002 -> ADR_0003 classification: PARTIALLY_COVERED justification: ADR_0003 covers Node as development-only; Node 20 and semantic-release versions are config-only.
ASSUMPTION_TOOL_003 -> NONE classification: NOT_COVERED justification: CI gates are workflow config, not active ADR content.
ASSUMPTION_DATA_001 -> ADR_0026 classification: PARTIALLY_COVERED justification: ADR_0026 declares v1.3 authoritative; current v1.5 is not covered by a matching numbered ADR.
ASSUMPTION_DATA_002 -> ADR_0028
classification: PARTIALLY_COVERED
justification: ADR_0028 covers render_variants; v1.5 schema requirement is not separately ADR-covered.
ASSUMPTION_DATA_003 -> ADR_0021 classification: COVERED_BY_ADR justification: ADR_0021 explicitly adopts vendored generated Unicode ontology.
ASSUMPTION_DATA_004 -> ADR_0025 classification: PARTIALLY_COVERED justification: ADR_0025 covers ontology-driven inference; charset-ignore rule is explicit in code but not directly in ADR_0025.
ASSUMPTION_API_001 -> ADR_0009 classification: PARTIALLY_COVERED justification: ADR_0009 defines CLI verbosity behavior; command inventory is code/config-defined.
ASSUMPTION_API_002 -> ADR_0005 classification: COVERED_BY_ADR justification: ADR_0005 defines exit code semantics.
ASSUMPTION_WORKFLOW_001 -> ADR_0012 classification: COVERED_BY_ADR justification: ADR_0012 defines GitHub Actions documentation deployment.
ASSUMPTION_WORKFLOW_002 -> NONE classification: NOT_COVERED justification: pytest recursion exclusions are config-only.
ASSUMPTION_PERF_001 -> NONE classification: NOT_COVERED justification: deterministic output is tested and implemented but not covered by a dedicated active ADR beyond adjacent schema/logging decisions.
ASSUMPTION_PERF_002 -> ADR_0018 classification: COVERED_BY_ADR justification: ADR_0018 defines TRACE performance and stability guarantees.
5. High-Risk Hidden Assumptions¶
ASSUMPTION_ENV_002:
risk: HIGH
rationale: platform support levels affect portability and preflight correctness.
evidence:
- file: tests/preflight/test_environment_matrix.py
lines: 34-42
snippet: ("macos", "bare-metal", Severity.ERROR)
ASSUMPTION_DATA_001:
risk: HIGH
rationale: current authoritative schema is v1.5, while latest explicit schema authority ADR evidence stops at v1.3.
evidence:
- file: src/fontshow/schema/inventory_v1_5.json
lines: 3-5
snippet: Fontshow Inventory Schema v1.5
ASSUMPTION_DATA_002:
risk: HIGH
rationale: persisted loadability fields affect inventory compatibility and render correctness.
evidence:
- file: src/fontshow/schema/inventory_v1_5.json
lines: 393-408
snippet: "render_variants"
6. Suggested ADR Candidates¶
- proposed ADR title:
ADR: Platform Support and Preflight Severity Matrixrationale: codify Linux/Windows/macOS support levels currently enforced only by code/tests. - proposed ADR title:
ADR: Inventory Schema v1.5 Authority and Compatibility Contractrationale: align current schema authority with decision records and document compatibility impact. - proposed ADR title:
ADR: Persisted LuaLaTeX Loadability v1.5 Schema Contractrationale: document requiredloadability.lualatex.render_variantsbehavior as a stable inventory contract.