Skip to content

feat(core): release v0.6.1 'Obsidian Glass' stable#69

Merged
PythonWoods-Dev merged 13 commits intomainfrom
release/v0.6.1
Apr 21, 2026
Merged

feat(core): release v0.6.1 'Obsidian Glass' stable#69
PythonWoods-Dev merged 13 commits intomainfrom
release/v0.6.1

Conversation

@PythonWoods-Dev
Copy link
Copy Markdown
Contributor

Final stable release of the v0.6.1 series.
This PR consolidates the "Obsidian Glass" vision, realigning the core with
official engine specifications and introducing the Obsidian Seal of integrity.

Key Highlights:

  • Obsidian Seal: New UI standard with Zxxx finding codes and throughput metrics.
  • Guardians Audit: Fixed Docusaurus v3 versioning and absolute slug logic.
  • Transparent Proxy: Seamless Zensical-to-MkDocs bridge.
  • Zenzic Lab: Interactive 9-act showroom for onboarding.
  • Standalone Mode: Rebranded and honest standalone Markdown audit.
  • Dependency Shield: All core libraries updated to latest secure versions.

Verified with 1,130 tests. Zero-trust, subprocess-free.

Consolidates the v0.6.1 series, establishing Zenzic as a truly engine-agnostic
documentation linter. This stable release bridges the gap between MkDocs
and Zensical, while providing enterprise-grade support for Docusaurus v3.

Key Features:
- Zensical Transparent Proxy: native fallback to mkdocs.yml when zensical.toml is absent.
- Docusaurus v3 Multi-versioning: support for versioned_docs/ and versions.json.
- Path Resolution: @site/ alias support for Docusaurus project-relative links.
- Offline Mode: --offline flag to force flat .html URL structure (ignoring directory slugs).
- Sentinel Banner: transparent UI notifications for proxy and offline states.

Stability & Compliance:
- Fixed Docusaurus routeBasePath default to match official engine behavior (/docs/).
- Full REUSE 3.3 compliance and metadata synchronization (CITATION.cff, pyproject.toml).
- Bilingual (EN/IT) changelog and readme parity.
- Resolved all linting violations via ruff hardening.

Adheres to Zenzic Pillars: Lint the Source, No Subprocesses, Pure Functions First.
This commit marks the completion of the Guardians of Quality audit,
realigning the framework with official engine specifications.

Key Structural Improvements:
- Docusaurus Adapter: Fixed 'latest' version mapping to exclude URL prefixes.
- Docusaurus Adapter: Absolute slugs now correctly append to routeBasePath.
- Docusaurus Adapter: Implemented Smart Collapsing for README.md and {Folder}.md.
- Resolver: Native support for @site/ alias resolution across all adapters.
- Offline Mode: Global --offline flag for flat .html URL generation.
- Zensical Proxy: Automated bridge for mkdocs.yml compatibility.

Quality & Metadata:
- Updated 1,126 tests; added docusaurus_truth.py with official spec-tests.
- Synchronized EN/IT CHANGELOGs, READMEs, and CITATION.cff.
- Full REUSE 3.3 compliance and pre-commit hardening.

The Safe Harbor is now  aligned with Docusaurus v3, MkDocs, and Zensical.
- README.md: fix [docs-cicd] → /docs/guides/ci-cd/ and
  [docs-arch] → /docs/internals/architecture-overview/
- CONTRIBUTING.md / CONTRIBUTING.it.md: fix ADR 003 link path
  (003-discovery-logic → discovery-logic/)
- README.it.md: fix six reference-link definitions using incorrect
  /docs/it/ prefix (correct Docusaurus locale pattern: /it/docs/)
- pyproject.toml: add trailing slash to Documentation URL;
  replace non-existent /docs/changelog with canonical GitHub CHANGELOG
…adapters

Extends the BaseAdapter protocol with a new discovery-phase method:

    provides_index(directory_path: Path) -> bool

Each adapter implements engine-specific index-detection logic:
- DocusaurusAdapter: checks index.md/mdx, README.md/mdx; reads
  _category_.json for "link": {"type": "generated-index"}
- MkDocsAdapter: checks index.md or README.md
- ZensicalAdapter: checks index.md
- ZensicalLegacyProxy: delegates to inner MkDocsAdapter
- VanillaAdapter: checks index.md

This is the only BaseAdapter method permitted to perform disk I/O
(Path.exists()). It is called once per directory during the discovery
phase — never inside per-link or per-file hot loops (Core Law 1).

Part of the Directory Index Integrity feature (MISSING_DIRECTORY_INDEX).
New public function that identifies documentation subdirectories
containing .md/.mdx source files but no engine-provided landing page:

    find_missing_directory_indices(
        docs_root, exclusion_manager, *, repo_root, config
    ) -> list[Path]

Implementation notes:
- Resolves the active adapter via get_adapter()
- Discovers candidate directories through walk_files() with the
  mandatory LayeredExclusionManager (Core Law 3)
- docs_root itself is excluded — only subdirectories are checked
- Calls adapter.provides_index() once per candidate directory
- Returns paths relative to docs_root, sorted lexicographically
- Short-circuits on empty docs tree (returns [] immediately)

No I/O occurs inside the walk loop beyond the single provides_index()
call per directory (Core Law 1 preserved).

Part of the Directory Index Integrity feature (MISSING_DIRECTORY_INDEX).
- Import find_missing_directory_indices from scanner
- Add directory_index_issues: list[Path] field to _AllCheckResults
  (not included in failed property — info-only, non-blocking)
- Call find_missing_directory_indices() in _collect_all_results()
- Convert results to Finding(code='MISSING_DIRECTORY_INDEX',
  severity='info') in _to_findings()
- Visible with zenzic check all --show-info; never affects exit code

Closes the Directory Index Integrity feature loop.
Add MISSING_DIRECTORY_INDEX finding and provides_index() protocol
method to the [0.6.1] — Added section in both EN and IT changelogs.

EN: 'Directory Index Integrity'
IT: 'Integrità dell'\''Indice di Directory'
- mkdocs-basic: add intentional FILE_NOT_FOUND + BROKEN_ANCHOR (fail_under=0)
- run_demo.sh: expand from 5 to 9 acts (Acts 0-8); fix header 'Seven' to 'Nine acts'
- examples/zensical-bridge: Transparent Proxy demo (engine=zensical, mkdocs.yml only)
- examples/docusaurus-v3-enterprise: versioned docs, @site/ aliases, i18n Ghost Routing
- examples/vanilla-markdown: MISSING_DIRECTORY_INDEX on bare .md tree

All examples pass `zenzic check all` with expected exit codes.
…rocess

- src/zenzic/lab.py: new CLI command — 9 acts, all bundled examples, pure Python
- src/zenzic/main.py: wire `lab` into the app under rich_help_panel='Core'
- pyproject.toml: add force-include to bundle examples/ into the PyPI wheel

Path resolution: importlib.resources.files('zenzic') for installed wheels,
fallback to repo root for editable installs. Both verified in clean-env test.

Design decisions:
- Zero subprocess: all checks run via internal _collect_all_results() API
- _apply_target() reused for single-file and custom-dir acts (Acts 4 and 5)
- model_copy(update=) for config patches — no mutation of loaded config
- Summary table at end; no typer.Exit() per-act (lab is a demo, not a CI gate)
- README.md + README.it.md: strip --pre from all install snippets and CI/CD examples
- Remove include_prereleases from PyPI badge URL
- Replace verbose venv install block with clean 3-command flow:
    pip install zenzic / zenzic lab / zenzic check all
- examples/docusaurus-v3 install.mdx (EN+IT): uvx --pre -> uvx

v0.6.1 'Obsidian Glass' is stable. No pre-release flag needed.
Streamline copilot-instructions.md to reflect current CLI shape:
- Remove stale references to pre-release --pre flag
- Align build/test commands with current justfile/noxfile
- Reflect zenzic lab, Vanilla mode, and v0.6.1 feature set
Apply CEO directives 027 and 029 to both README files:

Direttiva 027 — Precision over Magic:
- Replace 'auto-detects'/'rileva automaticamente' with deterministic
  language throughout (Try it now section + FAQ + narrative text)
- EN: 'Zenzic identifies the engine from config files present'
- IT: 'Zenzic identifica il motore dai file di configurazione presenti'

Direttiva 029 — Link Parity & Truth Audit:
- Fix README.it.md line 69: [Badge][docs-it-home] -> [docs-it-badges]
- Add missing [docs-it-badges] definition: /it/docs/usage/badges/
- Fix [docs-it-home] target: /it/docs/usage/ -> /it/docs/ (mirrors EN)
- All 4 docs-it-* refs now have exact bilingual parity with EN counterparts

Structural (both files):
- Lean 19-section mirror structure (EN 396 lines / IT 398 lines)
- Remove 350+ lines of redundant prose from previous version
- Fix DEAD_DEF warnings: add engine hyperlinks to Multi-Engine tables

zenzic check all --strict: All checks passed
…iva 036-040)

BREAKING CHANGE: engine = "vanilla" now raises ConfigurationError [Z000].
Update zenzic.toml to engine = "standalone" before upgrading.

- Rename VanillaAdapter -> StandaloneAdapter (_vanilla.py -> _standalone.py)
- Add migration guard in _factory.py: engine="vanilla" raises Z000 (sunset v0.7.0)
- Add src/zenzic/core/codes.py: Zxxx finding code registry (single source of truth)
- Normalize all Finding codes to Zxxx via _normalize_code() in cli.py
- scanner.py: _map_shield_to_finding emits Z201 instead of SHIELD
- lab.py: no-arg invocation shows act menu; positional arg runs single act
- Act 8 renamed to "Standalone Excellence"
- pyproject.toml entry-point: vanilla -> standalone
- examples/vanilla-markdown -> examples/standalone-markdown
- zenzic.toml: engine = "standalone" (dogfood self-check)
- .github/copilot-instructions.md: restored institutional memory (Direttiva 040)
- CHANGELOG.md, CHANGELOG.it.md: Breaking Changes + Added sections under [0.6.1]
- RELEASE.md: new headline, Standalone + Zxxx sections, migration note
- All test files migrated: test_vanilla_mode.py -> test_standalone_mode.py
- Test suite: 1127 passed
@PythonWoods-Dev PythonWoods-Dev merged commit 043488a into main Apr 21, 2026
11 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant