Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
19 commits
Select commit Hold shift + click to select a range
1a79144
refactor(docs): enforce zero-dbt, rebuild landing page, purify toolch…
PythonWoods-Dev Jun 14, 2026
1b41de4
feat(cli): differentiate info/punitive issues and improve scan progress
PythonWoods-Dev Jun 14, 2026
cff6475
chore: complete Docusaurus deprecation and finalize engine-neutral ar…
PythonWoods-Dev Jun 17, 2026
17e28bf
Merge branch 'feature/engine-agnostic-transition' into 'release/0.13.…
PythonWoods-Dev Jun 17, 2026
ba3a1ef
chore(release): synchronize changelog for 0.13.0-prep
PythonWoods-Dev Jun 17, 2026
4c70e0d
chore(release): archive legacy changelogs and consolidate 0.13.0 notes
PythonWoods-Dev Jun 17, 2026
3536ddc
chore(release): document actual code changes in 0.13.0 changelog
PythonWoods-Dev Jun 17, 2026
c4261fc
fix(core): reorder toml templates to prevent root keys from being swa…
PythonWoods-Dev Jun 17, 2026
2aa428d
feat(core): implement strict TOML schema validation to intercept swal…
PythonWoods-Dev Jun 17, 2026
e68f678
test(core): add pyproject.toml namespace isolation audit for strict v…
PythonWoods-Dev Jun 17, 2026
c697e94
docs: update changelog for 0.13.0 with TOML validation features
PythonWoods-Dev Jun 17, 2026
5b721e9
chore: bump version to 0.13.0
PythonWoods-Dev Jun 17, 2026
5e936bc
fix(cli): enhance inspect codes observability and purge stale metadata
PythonWoods-Dev Jun 19, 2026
dc9066e
fix(cli): enhance inspect codes readability and inject DQS score into…
PythonWoods-Dev Jun 19, 2026
a4d1462
docs(reference): define fatal/halt penalty semantics and update chang…
PythonWoods-Dev Jun 19, 2026
489a190
feat(core): implement PrebuiltVSMAdapter and update roadmap for ADR-080
PythonWoods-Dev Jun 19, 2026
d6d5473
fix(cli): enforce fatal/halt semantic parity in diff command output
PythonWoods-Dev Jun 19, 2026
6139f4e
chore(release): finalize release metadata and citation for v0.13.0
PythonWoods-Dev Jun 19, 2026
8638dc2
fix(tests): add python 3.10 compatibility fallback for tomllib
PythonWoods-Dev Jun 19, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .bumpversion.toml
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
# SPDX-License-Identifier: Apache-2.0

[tool.bumpversion]
current_version = "0.12.0"
current_version = "0.13.0"
parse = "(?P<major>\\d+)\\.(?P<minor>\\d+)\\.(?P<patch>\\d+)((?P<pre_l>a|b|rc)(?P<pre_n>\\d+))?"
serialize = [
"{major}.{minor}.{patch}{pre_l}{pre_n}",
Expand Down
2 changes: 1 addition & 1 deletion .github/ISSUE_TEMPLATE/security_vulnerability.yml
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ body:
attributes:
label: Zenzic version
description: Output of `zenzic --version`
placeholder: "0.12.0"
placeholder: "0.13.0"
validations:
required: true

Expand Down
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -187,3 +187,6 @@ Desktop.ini
# AI Agents Configuration
.github/agents/
.clinerules

# Architect Planning Sandbox
.architect/
2 changes: 1 addition & 1 deletion .pre-commit-hooks.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
#
# repos:
# - repo: https://github.com/PythonWoods/zenzic
# rev: v0.12.0
# rev: v0.13.0
# hooks:
# - id: zenzic-verify # quality gate — corrisponde a `just verify` lato zenzic
# - id: zenzic-guard # fast staged-file credential scan
Expand Down
20 changes: 9 additions & 11 deletions .zenzic.toml
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,15 @@ excluded_dirs = [
"assets",
"LICENSES",
]
# excluded_file_patterns = ["*.tmp", "*.log"]
# excluded_assets = ["favicon.ico"]
# excluded_asset_dirs = ["theme/"]
# excluded_build_artifacts = ["pdf/*.pdf"]
# included_dirs = []
# included_file_patterns = []

# --- PLUGINS (Optional) ---
# plugins = []

# --- PLACEHOLDERS & CODE SNIPPETS (Optional) ---
# Pattern matching disabled: the README, CHANGELOG, and CONTRIBUTING files
Expand Down Expand Up @@ -138,18 +147,7 @@ brand_obsolescence = [
# Governance Playbook:
# https://zenzic.dev/developers/how-to/release-governance-protocol

# --- EXCLUSION ZONES (Full bypass — use sparingly) ---
# Paths listed here are INVISIBLE to Zenzic: no findings, no audit trail.
# Prefer [governance.per_file_ignores] for targeted suppression with an audit trail.
# excluded_file_patterns = ["*.tmp", "*.log"]
# excluded_assets = ["favicon.ico"]
# excluded_asset_dirs = ["theme/"]
# excluded_build_artifacts = ["pdf/*.pdf"]
# included_dirs = []
# included_file_patterns = []

# --- PLUGINS (Optional) ---
# plugins = []

# --- CUSTOM RULES (Optional) ---
# Declares project-specific regex-based lint rules applied line-by-line.
Expand Down
36 changes: 14 additions & 22 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,40 +9,32 @@

---

## [0.12.0] - 2026-06-13

### Removed

- **Docusaurus adapter removed (`v0.12.0`)**
Forensic analysis of Docusaurus projects revealed two categories of structural invisibility incompatible with Zenzic's static analysis model:
- **React component-injected IDs**: anchors generated by components such as `<APITable>` exist only in the rendered DOM, not in Markdown source.
- **MDX partial merging**: anchors defined in imported `_partial-*.mdx` files are resolved at bundle time by Webpack, not statically traceable by a Python AST parser.

Both patterns are dominant in Docusaurus projects, not edge cases. An adapter that generates structural false positives on the primary usage patterns of its target framework is a reputational liability, not an asset.
Zenzic supports documentation engines whose anchor output is deterministically derivable from Markdown source without executing external runtime code. Docusaurus does not satisfy this criterion.

## [0.11.0] - 2026-06-13
## [0.13.0] - 2026-06-19

### Added

- **Docusaurus Native Routing Emulation:** Full support for `routeBasePath` concatenation, Frontmatter `slug` absolute/relative parsing, and Blog Date Extraction (`YYYY-MM-DD-slug`) to accurately map Docusaurus URLs into the Virtual Site Map without false positive broken links.
- **Dynamic Site Root:** Support for Docusaurus monorepos by dynamically searching upward from docs/ to repo root.
- **RE2 Glob Translator:** High-performance glob translator compiled directly to Google RE2 syntax for compatibility on Python 3.12+.
- **Partial Guard:** Logical routing exclusion of partial files (those starting with `_` or inside `_` folders) in Docusaurus.
- **Breakdown Flag:** Option `--breakdown` for `zenzic score` to show detailed category breakdowns and transparent DQS math.
- **Progress Bar:** Interactive progress indicator (`rich.progress.Progress`) during file scanning and parsing in `zenzic check all`.
- **Active Defense:** Implemented strict TOML schema validation to instantly detect and reject root keys silently swallowed by nested `[tables]` in `.zenzic.toml` and `pyproject.toml`.
- **D.I.A. Compliance:** Added the "TOML Root Key Law" documentation enforcing explicit ordering for configuration boundaries.

### Changed

- **Path-aware Exclusion Engine upgrade (.gitignore semantics):** `excluded_dirs` now evaluates against the repository-relative path if the entry contains a slash (`/`), and globally against the directory basename if it does not.
- **Severity Downgrade for Z106:** Downgraded `Z106` (circular link) severity to `note` and penalty to `0.0`, ensuring circular links never block strict pipelines.
- **Core CI gate hardening:** Removed `pull_request.paths` filters from `.github/workflows/ci.yml` so required `Audit` checks are always created for every PR and cannot remain in expected/pending due to skipped workflow runs.
- **Refined CLI UX:** `inspect codes` now displays Severity and explicit `FATAL`/`HALT` pipeline blockers instead of misleading `0.0` penalties for security and governance-gate codes. `check` command now explicitly prints the final DQS score and gate status (`DQS Final Score: X/100 (Gate Passed/Failed)`) in the report footer.
- **Engine-Neutral Configuration Templates:** Removed Docusaurus from initialized `.zenzic.toml` templates and CLI help descriptions, defaulting to `mkdocs` and `zensical`.
- **Simplification of VSM Routing:** Eradicated Docusaurus-specific slug map initialization and routing rules during Virtual Site Map (VSM) construction.
- **Improved Resolver Robustness:** Standardized site root resolution and monorepo path checks inside `InMemoryPathResolver`.
- **Full documentation migration to Zensical/MkDocs.**

### Fixed

- **REUSE compliance updates and Z-Code parity fixes across the bilingual documentation.**

---

## Historical Releases

- v0.12.x archive: [changelogs/v0.12.md](./changelogs/v0.12.md)
- v0.11.x archive: [changelogs/v0.11.md](./changelogs/v0.11.md)
- v0.10.x archive: [changelogs/v0.10.md](./changelogs/v0.10.md)
- v0.9.x archive: [changelogs/v0.9.md](./changelogs/v0.9.md)
- v0.8.x archive: [changelogs/v0.8.md](./changelogs/v0.8.md)

Check notice on line 39 in CHANGELOG.md

View workflow job for this annotation

GitHub Actions / Audit (ubuntu-latest, 3.10)

Z106

CHANGELOG.md:39: './changelogs/v0.8.md' is part of a circular link cycle

Check notice on line 39 in CHANGELOG.md

View workflow job for this annotation

GitHub Actions / Audit (ubuntu-latest, 3.14)

Z106

CHANGELOG.md:39: './changelogs/v0.8.md' is part of a circular link cycle
- v0.1.x–v0.7.x archive index: [changelogs/README.md](./changelogs/README.md)

Check notice on line 40 in CHANGELOG.md

View workflow job for this annotation

GitHub Actions / Audit (ubuntu-latest, 3.10)

Z106

CHANGELOG.md:40: './changelogs/README.md' is part of a circular link cycle

Check notice on line 40 in CHANGELOG.md

View workflow job for this annotation

GitHub Actions / Audit (ubuntu-latest, 3.14)

Z106

CHANGELOG.md:40: './changelogs/README.md' is part of a circular link cycle
4 changes: 2 additions & 2 deletions CITATION.cff
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,8 @@ abstract: >-
performs deterministic static analysis using a two-pass reference
pipeline and a RE2-backed credential scanner, with zero subprocess
calls and full SARIF 2.1.0 support for CI/CD integration.
version: 0.12.0
date-released: 2026-06-13
version: 0.13.0
date-released: 2026-06-19
url: "https://zenzic.dev"
repository-code: "https://github.com/PythonWoods/zenzic"
repository-artifact: "https://pypi.org/project/zenzic/"
Expand Down
10 changes: 5 additions & 5 deletions RELEASE.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,15 @@
<!-- SPDX-License-Identifier: Apache-2.0 -->
# Release Procedure — Zenzic Core

> **[MAINTAINER SOP]** *This document contains the Standard Operating Procedure for Core Maintainers to cut and publish a new release. If you are an end-user looking for new features, please see the [CHANGELOG](./CHANGELOG.md).*

Check notice on line 5 in RELEASE.md

View workflow job for this annotation

GitHub Actions / Audit (ubuntu-latest, 3.10)

Z106

RELEASE.md:5: './CHANGELOG.md' is part of a circular link cycle

Check notice on line 5 in RELEASE.md

View workflow job for this annotation

GitHub Actions / Audit (ubuntu-latest, 3.14)

Z106

RELEASE.md:5: './CHANGELOG.md' is part of a circular link cycle

## Release Metadata

| Field | Value |
| :------- | :--------- |
| Version | v0.12.0 |
| Version | v0.13.0 |
| Codename | Magnetite |
| Date | 2026-06-13 |
| Date | 2026-06-17 |
| Status | Stable |

## Release Checklist
Expand All @@ -21,7 +21,7 @@
- [ ] `zenzic lab all` — all 20 scenarios exit with expected code
- [ ] `zenzic score --stamp` committed — badge in README.md reflects current score
- [ ] `zenzic check all .` — zero findings in the repo root
- [ ] `pyproject.toml` version matches the tag (`0.12.0`)
- [ ] `pyproject.toml` version matches the tag (`0.13.0`)
- [ ] `CITATION.cff` version and date updated
- [ ] `CHANGELOG.md` — `[Unreleased]` section moved to the new version heading
- [ ] Update SECURITY.md support table (Add new release, demote previous to Critical/EOL).
Expand Down Expand Up @@ -54,13 +54,13 @@
git pull origin main

# 3. Tag the main branch and push
git tag v0.12.0
git tag v0.13.0
git push origin main --tags
```

- [ ] Create GitHub Release from the tag, using the `## v0.12.0` CHANGELOG section as the release body.
- [ ] Create GitHub Release from the tag, using the `## v0.13.0` CHANGELOG section as the release body.

## Changelog Reference

For a detailed list of changes, see [CHANGELOG.md](./CHANGELOG.md).

Check notice on line 65 in RELEASE.md

View workflow job for this annotation

GitHub Actions / Audit (ubuntu-latest, 3.10)

Z106

RELEASE.md:65: './CHANGELOG.md' is part of a circular link cycle

Check notice on line 65 in RELEASE.md

View workflow job for this annotation

GitHub Actions / Audit (ubuntu-latest, 3.14)

Z106

RELEASE.md:65: './CHANGELOG.md' is part of a circular link cycle
For full history, see [Historical Archives](./changelogs/README.md).

Check notice on line 66 in RELEASE.md

View workflow job for this annotation

GitHub Actions / Audit (ubuntu-latest, 3.10)

Z106

RELEASE.md:66: './changelogs/README.md' is part of a circular link cycle

Check notice on line 66 in RELEASE.md

View workflow job for this annotation

GitHub Actions / Audit (ubuntu-latest, 3.14)

Z106

RELEASE.md:66: './changelogs/README.md' is part of a circular link cycle
10 changes: 10 additions & 0 deletions ROADMAP.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
This document describes the planned milestone trajectory for Zenzic.
Dates are targets, not commitments. All milestones are subject to revision.

For the current release history, see [CHANGELOG.md](CHANGELOG.md).

Check notice on line 13 in ROADMAP.md

View workflow job for this annotation

GitHub Actions / Audit (ubuntu-latest, 3.10)

Z106

ROADMAP.md:13: 'CHANGELOG.md' is part of a circular link cycle

Check notice on line 13 in ROADMAP.md

View workflow job for this annotation

GitHub Actions / Audit (ubuntu-latest, 3.14)

Z106

ROADMAP.md:13: 'CHANGELOG.md' is part of a circular link cycle

---

Expand Down Expand Up @@ -125,6 +125,16 @@

---

## v0.14.0 — The Bridge (planned)

**Theme:** Inversion of Control via TS Plugins.

### Planned

- **The Bridge Architecture (Inversion of Control)**: Implementation of ADR-080. Introduces the PrebuiltVSMAdapter to ingest static `.zenzic-vsm.json` routing payloads from dynamic frameworks, and initializes the `@zenzic/plugin-docusaurus` TypeScript bridge.

---

## v1.0.0 — Graphite LTS (planned)

**Theme:** Long-Term Support release. Stability, portability, and production confidence.
Expand Down
21 changes: 21 additions & 0 deletions changelogs/v0.11.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
<!-- SPDX-FileCopyrightText: 2026 PythonWoods <dev@pythonwoods.dev> -->
<!-- SPDX-License-Identifier: Apache-2.0 -->
<!-- markdownlint-disable MD024 -->
# Changelog Archive: v0.11.x

## [0.11.0] - 2026-06-13

### Added

- **Docusaurus Native Routing Emulation:** Full support for `routeBasePath` concatenation, Frontmatter `slug` absolute/relative parsing, and Blog Date Extraction (`YYYY-MM-DD-slug`) to accurately map Docusaurus URLs into the Virtual Site Map without false positive broken links.
- **Dynamic Site Root:** Support for Docusaurus monorepos by dynamically searching upward from docs/ to repo root.
- **RE2 Glob Translator:** High-performance glob translator compiled directly to Google RE2 syntax for compatibility on Python 3.12+.
- **Partial Guard:** Logical routing exclusion of partial files (those starting with `_` or inside `_` folders) in Docusaurus.
- **Breakdown Flag:** Option `--breakdown` for `zenzic score` to show detailed category breakdowns and transparent DQS math.
- **Progress Bar:** Interactive progress indicator (`rich.progress.Progress`) during file scanning and parsing in `zenzic check all`.

### Changed

- **Path-aware Exclusion Engine upgrade (.gitignore semantics):** `excluded_dirs` now evaluates against the repository-relative path if the entry contains a slash (`/`), and globally against the directory basename if it does not.
- **Severity Downgrade for Z106:** Downgraded `Z106` (circular link) severity to `note` and penalty to `0.0`, ensuring circular links never block strict pipelines.
- **Core CI gate hardening:** Removed `pull_request.paths` filters from `.github/workflows/ci.yml` so required `Audit` checks are always created for every PR and cannot remain in expected/pending due to skipped workflow runs.
16 changes: 16 additions & 0 deletions changelogs/v0.12.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
<!-- SPDX-FileCopyrightText: 2026 PythonWoods <dev@pythonwoods.dev> -->
<!-- SPDX-License-Identifier: Apache-2.0 -->
<!-- markdownlint-disable MD024 -->
# Changelog Archive: v0.12.x

## [0.12.0] - 2026-06-13

### Removed

- **Docusaurus adapter removed (`v0.12.0`)**
Forensic analysis of Docusaurus projects revealed two categories of structural invisibility incompatible with Zenzic's static analysis model:
- **React component-injected IDs**: anchors generated by components such as `<APITable>` exist only in the rendered DOM, not in Markdown source.
- **MDX partial merging**: anchors defined in imported `_partial-*.mdx` files are resolved at bundle time by Webpack, not statically traceable by a Python AST parser.

Both patterns are dominant in Docusaurus projects, not edge cases. An adapter that generates structural false positives on the primary usage patterns of its target framework is a reputational liability, not an asset.
Zenzic supports documentation engines whose anchor output is deterministically derivable from Markdown source without executing external runtime code. Docusaurus does not satisfy this criterion.
3 changes: 1 addition & 2 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ build-backend = "hatchling.build"

[project]
name = "zenzic"
version = "0.12.0"
version = "0.13.0"
description = "Engineering-grade, engine-agnostic static analyzer and credential scanner for Markdown documentation"
readme = "README.md"
requires-python = ">=3.10"
Expand Down Expand Up @@ -58,7 +58,6 @@ dependencies = [
zenzic = "zenzic.main:cli_main"

[project.entry-points."zenzic.adapters"]
docusaurus = "zenzic.core.adapters:DocusaurusAdapter"
mkdocs = "zenzic.core.adapters:MkDocsAdapter"
zensical = "zenzic.core.adapters:ZensicalAdapter"
standalone = "zenzic.core.adapters:StandaloneAdapter"
Expand Down
2 changes: 1 addition & 1 deletion src/zenzic/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,5 +2,5 @@
# SPDX-License-Identifier: Apache-2.0
"""Zenzic — engine-agnostic static analyzer and credential scanner for Markdown documentation."""

__version__ = "0.12.0"
__version__ = "0.13.0"
__version_name__ = "Basalt" # Release codename stored separately from the package version.
35 changes: 35 additions & 0 deletions src/zenzic/cli/_check.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
find_unused_assets,
scan_docs_references,
)
from zenzic.core.scorer import compute_score
from zenzic.core.sovereign_context import sovereign_context
from zenzic.core.ui import ZenzicPalette
from zenzic.core.validator import (
Expand Down Expand Up @@ -1659,6 +1660,40 @@ def check_all(
f"Credential scanner (Z201) remains active.[/]"
)

# ── DQS Score injection ────────────────────────────────────────────
_findings_counts: dict[str, int] = {}
for _f in all_findings:
_findings_counts[_f.code] = _findings_counts.get(_f.code, 0) + 1
_score_report = compute_score(
_findings_counts,
suppression_count=suppression_audit.total,
suppression_cap=suppression_audit.cap,
)
if _score_report.security_override:
_dqs_line = (
f"[bold red]DQS Final Score: 0/100[/bold red] "
f"[{ZenzicPalette.DIM}](Security Override — "
f"{_score_report.security_findings} non-suppressible finding"
f"{'s' if _score_report.security_findings != 1 else ''} detected)[/]"
)
else:
_pre_errors = sum(1 for _f in all_findings if _f.severity == "error")
_pre_breaches = sum(
1 for _f in all_findings if _f.severity in {"security_breach", "security_incident"}
)
_pre_warnings = sum(1 for _f in all_findings if _f.severity == "warning")
_gate_failed = (
_pre_breaches > 0 or _pre_errors > 0 or (effective_strict and _pre_warnings > 0)
)
_gate_label = "Gate Failed" if _gate_failed else "Gate Passed"
_gate_style = ZenzicPalette.ERROR if _gate_failed else ZenzicPalette.SUCCESS
_dqs_line = (
f"[bold {_gate_style}]DQS Final Score: "
f"{_score_report.score}/100[/bold {_gate_style}] "
f"[{ZenzicPalette.DIM}]({_gate_label})[/]"
)
_footer_lines.insert(0, _dqs_line)

errors, warnings = reporter.render(
all_findings,
version=__version__,
Expand Down
Loading
Loading