Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
6 changes: 3 additions & 3 deletions .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.25.2"
current_version = "0.25.3"
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 Expand Up @@ -72,8 +72,8 @@ replace = "- [ ] `pyproject.toml` version matches the tag (`{new_version}`)"

[[tool.bumpversion.files]]
filename = "RELEASE.md"
search = 'git tag -s -S -m "Release v{current_version}" v{current_version}'
replace = 'git tag -s -S -m "Release v{new_version}" v{new_version}'
search = 'git tag -s -m "Release v{current_version}" v{current_version}'
replace = 'git tag -s -m "Release v{new_version}" v{new_version}'


[[tool.bumpversion.files]]
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.25.2"
placeholder: "0.25.3"
validations:
required: true

Expand Down
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.25.2
# rev: v0.25.3
# hooks:
# - id: zenzic-verify # quality gate — corrisponde a `just verify` lato zenzic
# - id: zenzic-guard # fast staged-file credential scan
Expand Down
10 changes: 8 additions & 2 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,13 +11,20 @@ Versions follow [Semantic Versioning](https://semver.org/).

## [Unreleased]

## [0.25.3] - 2026-07-26

### Added

- **AST Reference Link Definition Extraction (`CORE-FIX-001`)**: Upgraded `PolyglotExtractor` to natively extract Markdown Reference Link Definitions (`[label]: dest`) with CommonMark §4.7 first-definition-wins semantics and full code fence masking (`_mask_fences`), eliminating false-positive `Z405` (Unused Asset) findings.
- **Zensical Framework Feature Parity (`ADAPTER-002`/`ADAPTER-003`)**: Upgraded `ZensicalAdapter` with preserved static asset URL mapping, route classification for root/directory index pages (`index.md`) and dynamic blog routes (`<blog_dir>/posts/`), and theme asset metadata extraction (`favicon`, `logo`, `extra_css`, `extra_javascript`).


## [0.25.2] - 2026-07-26

### Fixed

- **Path Traversal Security Parity (`LSP-FIX-012`)**: Hardened `Z202`/`Z203` path traversal evaluation in `IncrementalAnalysisEngine._run_urp_checks()` by replacing absolute OS filesystem depth checks (`len(path.parents)`) with `docs_root`-boundary escape detection (`os.path.normpath` + `is_relative_to(resolved_docs_root)`). This guarantees 100% security parity between CLI and LSP mode.


## [0.25.1] - 2026-07-26

### Added
Expand All @@ -29,7 +36,6 @@ Versions follow [Semantic Versioning](https://semver.org/).

- **Inline HTML Suppression LSP Parity (`LSP-FIX-011`)**: Updated `IncrementalAnalysisEngine._run_urp_checks()` to pass the active `SuppressionTracker` when evaluating Polyglot Extractor nodes. Suppressed HTML elements (`data-zenzic-ignore`) are now correctly marked as consumed, eliminating spurious `Z603` (Dead Suppression) warnings in editor sessions.


## [0.25.0] - 2026-07-25

### Added
Expand Down
2 changes: 1 addition & 1 deletion CITATION.cff
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ 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.25.2
version: 0.25.3
date-released: 2026-07-26
url: "https://zenzic.dev"
repository-code: "https://github.com/PythonWoods/zenzic"
Expand Down
2 changes: 1 addition & 1 deletion CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ Zenzic is structured across three independent, dedicated repositories:

**If you want to contribute to the core analysis engine** (new checks, adapters, bug fixes, CLI features, or performance improvements) — you are in the right place!

> **Brand System** — The visual identity and color palette reference live at
> **Brand System** — The visual identity and color palette reference live at
> <https://zenzic.dev/assets/brand/zenzic-brand-system.html>

---
Expand Down
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -143,7 +143,7 @@ Zenzic Core is headless and emits standardized **SARIF** JSON, ensuring seamless
"tool": {
"driver": {
"name": "zenzic",
"version": "0.25.2",
"version": "0.25.3",
"rules": [
{
"id": "Z101",
Expand Down Expand Up @@ -215,7 +215,7 @@ uv tool upgrade zenzic
To run a specific version ephemerally without altering your global environment:

```bash
uvx zenzic@0.25.2 check all
uvx zenzic@0.25.3 check all
```

---
Expand Down
8 changes: 4 additions & 4 deletions RELEASE.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@

| Field | Value |
| :------- | :--------- |
| Version | v0.25.2 |
| Version | v0.25.3 |
| Codename | Magnetite |
| Date | 2026-07-26 |
| Status | Stable |
Expand All @@ -21,7 +21,7 @@ Before tagging, every item must be green:
- [ ] `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.25.2`)
- [ ] `pyproject.toml` version matches the tag (`0.25.3`)
- [ ] `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 @@ -53,12 +53,12 @@ git checkout main
git pull origin main

# 3. Tag the main branch and push
git tag -s -S -m "Release v0.25.2" v0.25.2
git tag -s -m "Release v0.25.3" v0.25.3
git push origin main --tags

```

- [ ] Create GitHub Release from the tag, using the `## [0.25.2]` CHANGELOG section as the release body.
- [ ] Create GitHub Release from the tag, using the `## [0.25.3]` CHANGELOG section as the release body.

## Changelog Reference

Expand Down
2 changes: 2 additions & 0 deletions docs/blog/posts/2026-07-25-zenzic-v0250-lsp-stabilization.md
Original file line number Diff line number Diff line change
Expand Up @@ -69,11 +69,13 @@ class BaseAdapter(ABC):
If you maintain a custom third-party adapter subclassing `BaseAdapter`:

1. Update your class definition to override `watched_config_files`:

```python
@property
def watched_config_files(self) -> frozenset[str]:
return frozenset({"my-framework.config.json"})
```

2. First-party adapters (`MkDocsAdapter`, `ZensicalAdapter`) have been updated natively.

---
Expand Down
1 change: 0 additions & 1 deletion docs/developers/how-to/contribute/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,6 @@ In this section, we guide you through our processes.

</div>


[report a bug]: report-a-bug.md
[report a docs issue]: report-a-docs-issue.md
[request a change]: request-a-change.md
Expand Down
1 change: 0 additions & 1 deletion docs/developers/how-to/contribute/report-a-bug.md
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,6 @@ the issue.
| :material-close: __Unclear__ | Anchor validation doesn't work |
| :material-close: __Useless__ | Help |


### Context <small>optional</small> {#context}

Provide additional context to help us understand what you were trying to
Expand Down
20 changes: 10 additions & 10 deletions docs/developers/reference/ast-foundations.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,23 +17,23 @@ Zenzic replaces text matching with a **Lossless Abstract Syntax Tree (AST) Compi

<div class="grid cards" markdown>

- :material-text-search:{ .lg .middle } **Unstructured Text Linter**
- :material-text-search:{ .lg .middle } **Unstructured Text Linter**

---

- Treats Markdown as plain text regex lines
- Cannot verify cross-file link targets or heading anchors
- Fails to track directory indexes or navigation topology
- Produces false positives and non-reproducible runs
- Treats Markdown as plain text regex lines
- Cannot verify cross-file link targets or heading anchors
- Fails to track directory indexes or navigation topology
- Produces false positives and non-reproducible runs

- :material-graph-outline:{ .lg .middle } **Zenzic Topological Graph Engine**
- :material-graph-outline:{ .lg .middle } **Zenzic Topological Graph Engine**

---

- Compiles Lossless ASTs and computes a Directed Graph (VSM)
- Verifies link targets, anchor references, and nav contracts statically
- Enforces hard security boundaries (SAST credential scanner)
- Delivers 100% bit-for-bit deterministic execution across platforms
- Compiles Lossless ASTs and computes a Directed Graph (VSM)
- Verifies link targets, anchor references, and nav contracts statically
- Enforces hard security boundaries (SAST credential scanner)
- Delivers 100% bit-for-bit deterministic execution across platforms

</div>

Expand Down
2 changes: 1 addition & 1 deletion docs/developers/reference/zenzic-style.md
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,7 @@ Every icon in the documentation MUST be rendered using native Material for MkDoc
```

Examples:

- `:material-bug-outline:`
- `:material-file-document-edit-outline:`
- `:material-sparkles:`
Expand All @@ -79,7 +80,6 @@ Examples:
- **Semantic consistency**: If an icon represents "Contribute" on one page, it must be the same icon on every page.
- **Uniform syntax**: Every icon in a card grid uses native `:material-*: / :octicons-*:` shortcodes.


---

## 4. Anchor ID Protocol (ZRT-DOC-004) {#anchor-ids}
Expand Down
1 change: 0 additions & 1 deletion docs/editor/vscode.md
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,6 @@ If you use a custom virtual environment or isolated installation, configure `zen
}
```


### Supported Settings

| Setting | Type | Default | Description |
Expand Down
1 change: 0 additions & 1 deletion docs/explanation/architecture.md
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,6 @@ flowchart TD
!!! note "ADR-084 Invariant: Centralized Core Governance"
`directory_policies` and `per_file_ignores` are evaluated centrally in `zenzic.core.governance` to ensure bit-for-bit parity between CLI and LSP verification suites.


### Pass 1 -- Harvest and Credential Scan {#pass-1}

Pass 1 reads every `.md` and `.md` file under `docs/` and performs three coordinated operations:
Expand Down
1 change: 0 additions & 1 deletion docs/explanation/community-index.md
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,6 @@ ecosystem tools referenced in this documentation are third-party projects.

</div>


## License {#license}

<!-- SPDX-FileCopyrightText: 2026 PythonWoods <dev@pythonwoods.dev> -->
Expand Down
1 change: 0 additions & 1 deletion docs/how-to/configure-ci-cd.md
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,6 @@ Zenzic enforces a non-negotiable exit code contract across all operating systems

=== "GitHub Action Wrapper (Recommended)"


The official [`PythonWoods/zenzic-action`](https://github.com/PythonWoods/zenzic-action) provides zero-config integration with automatic SARIF upload:

```yaml title=".github/workflows/zenzic.yml"
Expand Down
1 change: 0 additions & 1 deletion docs/how-to/install.md
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,6 @@ environment. They are not needed. The linting environment has one dependency: `z
uvx zenzic check all
```


!!! note "Third-party engine adapters"
Third-party adapters (e.g. a hypothetical `zenzic-hugo-adapter`) are separate
installable packages — not extras of `zenzic` itself. No extra is required for
Expand Down
7 changes: 5 additions & 2 deletions docs/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ description: "Zenzic is a deterministic document integrity engine and SAST for M
<!-- SPDX-FileCopyrightText: 2026 PythonWoods <dev@pythonwoods.dev> -->
<!-- SPDX-License-Identifier: Apache-2.0 -->

## Treat your Markdown documentation like production code.
## Treat your Markdown documentation like production code

Zenzic detects broken links, orphaned pages, credential leaks, and structural integrity issues before they reach production. Every run is bit-for-bit deterministic, zero-LLM, and backed by a non-backtracking RE2 regex engine.

Expand All @@ -26,7 +26,6 @@ Zenzic is structured into three dedicated delivery mechanisms to support your en
- **[VS Code Extension](https://github.com/PythonWoods/zenzic-vscode)**: Real-time LSP client providing sub-50ms inline diagnostics, automated Quick Fixes, and DQS status bar streaming.
- **[GitHub Action](https://github.com/PythonWoods/zenzic-action)**: Zero-config CI/CD quality gate with SARIF upload directly to GitHub Code Scanning and PR annotations.


---

## 🚀 Deterministic 3-Step Quickstart (< 60 Seconds)
Expand Down Expand Up @@ -59,13 +58,17 @@ FAILED: Hard errors detected. Exit code 1 is mandatory.
## 🛡️ Why Zenzic?

### 100% Determinism

Every Zenzic run is a pure function of its inputs. Given the same repository state and `.zenzic.toml`, the output — finding codes, severity levels, exit code, SARIF structure — is **bit-for-bit identical** across machines, platforms, and time. No probabilistic guessing, no LLM sampling, no network dependencies.

### Documentation Security (SAST)

Zenzic treats documentation as a **security surface**. The tiered code model enforces a hard boundary between quality findings (suppressible, exit 1) and security findings (non-suppressible, exit 2/3):

- **Z201 — Credential Scanner:** Hardcoded tokens, API keys, and secret patterns detected before reaching PRs.
- **Z202 / Z203 — Path Traversal Guard:** Filesystem boundary security violations caught at scan boundaries.
- **Suppression CAP:** Configurable ceiling on total active `zenzic:ignore` suppressions.

### Zero Hallucinations

Zenzic reports only what is **statically verifiable** in the repository at scan time. Every finding is a falsifiable, reproducible fact — suitable as audit evidence for security reviewers and compliance teams.
1 change: 0 additions & 1 deletion docs/reference/cli.md
Original file line number Diff line number Diff line change
Expand Up @@ -128,7 +128,6 @@ Select a command tab to view its execution flags, default behaviors, and usage e

## Shared Execution Flags


## Global flags {#global-flags}

These flags control Zenzic's signal-to-noise profile across routine scans, CI gates,
Expand Down
20 changes: 10 additions & 10 deletions docs/reference/suppression-policy.md
Original file line number Diff line number Diff line change
Expand Up @@ -19,23 +19,23 @@ Zenzic replaces unmonitored ignore tags with a **Managed Technical Debt Governan

<div class="grid cards" markdown>

- :material-shield-check:{ .lg .middle } **Managed Technical Debt (Clean/Bounded)**
- :material-shield-check:{ .lg .middle } **Managed Technical Debt (Clean/Bounded)**

---

- Explicitly declared exceptions with audit trails
- Bounded by the strict `suppression_cap` ceiling
- Emits `[MANAGED DEBT]` audit status in CLI & CI
- Deducts Quality Score points to reflect true visibility
- Explicitly declared exceptions with audit trails
- Bounded by the strict `suppression_cap` ceiling
- Emits `[MANAGED DEBT]` audit status in CLI & CI
- Deducts Quality Score points to reflect true visibility

- :material-alert-decagram:{ .lg .middle } **Uncontrolled Architectural Drift**
- :material-alert-decagram:{ .lg .middle } **Uncontrolled Architectural Drift**

---

- Unmonitored ignore tags scattered across codebases
- Hidden security vulnerabilities (credentials, path traversals)
- Zero audit trails or visibility into debt growth
- Causes silent PR breakages and customer-facing 404s
- Unmonitored ignore tags scattered across codebases
- Hidden security vulnerabilities (credentials, path traversals)
- Zero audit trails or visibility into debt growth
- Causes silent PR breakages and customer-facing 404s

</div>

Expand Down
2 changes: 1 addition & 1 deletion mkdocs.yml
Original file line number Diff line number Diff line change
Expand Up @@ -224,7 +224,7 @@ extra:
# ADR-037: No hardcoded SemVer in any .html or .md source.
# CI pipeline passes the current version at build time, e.g.:
# uv run mkdocs build --extra zenzic_version=0.14.1
zenzic_version: "0.25.2" # release sync
zenzic_version: "0.25.3" # release sync
social:
- icon: fontawesome/brands/github
link: https://github.com/PythonWoods/zenzic
Expand Down
2 changes: 1 addition & 1 deletion 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.25.2"
version = "0.25.3"
description = "Deterministic Document Integrity Engine and SAST for Markdown/MDX graphs."
readme = "README.md"
requires-python = ">=3.10"
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.25.2"
__version__ = "0.25.3"
__version_name__ = "Basalt" # Release codename stored separately from the package version.
2 changes: 1 addition & 1 deletion src/zenzic/cli/_standalone.py
Original file line number Diff line number Diff line change
Expand Up @@ -1588,7 +1588,7 @@ def _scaffold_plugin(repo_root: Path, plugin_name: str, force: bool) -> None:
description = "Custom Zenzic plugin rule package"
readme = "README.md"
requires-python = ">=3.11"
dependencies = ["zenzic>=0.25.2"]
dependencies = ["zenzic>=0.25.3"]

[project.entry-points."zenzic.rules"]
{project_slug} = "{module_name}.rules:{class_name}"
Expand Down
Loading
Loading