@@ -13,13 +13,16 @@ Versions follow [Semantic Versioning](https://semver.org/).
1313
1414## [ 0.5.0a3] — 2026-04-03 — The Sentinel: Aesthetic Sprint, Parallel Anchors & Agnostic Target
1515
16- > ** Sprint 13 + 14.** Two major tracks delivered in one tag.
16+ > ** Sprint 13 + 14 + 15 .** Three tracks delivered in one tag.
1717> Track A — Performance & SDK: deterministic two-phase anchor validation, ` zenzic.rules ` public
1818> namespace, plugin scaffold command, Z001/Z002 split.
1919> Track B — Aesthetic & DX: Sentinel Palette with Slate/Indigo/Rose/Amber color identity,
2020> unified banner telemetry, agnostic target mode (` zenzic check all README.md ` or
2121> ` zenzic check all content/ ` ), ` .pre-commit-hooks.yaml ` , native Material header via
2222> ` MutationObserver ` , and two new example projects.
23+ > Track C — The Breathing Sentinel: native ` col_start ` /` match_text ` propagation replacing
24+ > fragile regex workarounds, surgical caret rendering, traceback gutter with 2-space
25+ > padding, vertical breathing between findings, and a dedicated success-state panel.
2326
2427### Added
2528
@@ -74,6 +77,12 @@ Versions follow [Semantic Versioning](https://semver.org/).
7477 - ` src/<module>/rules.py ` module-level ` BaseRule ` template
7578 - minimal docs fixture and ` zenzic.toml ` so ` zenzic check all ` can run
7679
80+ - ** Smart Initialization — ` zenzic init --pyproject ` ** — when ` pyproject.toml `
81+ exists, ` zenzic init ` interactively asks whether to embed configuration as a
82+ ` [tool.zenzic] ` table instead of creating a standalone ` zenzic.toml ` . Pass
83+ ` --pyproject ` to skip the prompt. ` --force ` overwrites an existing
84+ ` [tool.zenzic] ` section. Engine auto-detection works in both modes.
85+
7786- ` examples/plugin-scaffold-demo/ ` — living scaffold output fixture for SDK
7887 integration checks and contributor onboarding.
7988
@@ -82,6 +91,43 @@ Versions follow [Semantic Versioning](https://semver.org/).
8291
8392### Changed
8493
94+ - ** Native Data Propagation — "The Breathing Sentinel"** (` reporter.py ` ,
95+ ` validator.py ` , ` scanner.py ` , ` rules.py ` , ` cli.py ` ) — replaced the fragile
96+ ` _extract_token() ` regex workaround with native ` col_start ` /` match_text `
97+ propagation from every checker through the full pipeline to the reporter.
98+ Every regex match site now captures ` m.start() ` and ` m.group() ` at detection
99+ time and stores them in the finding dataclass — no reverse-engineering from
100+ error messages.
101+
102+ - ** ` LinkInfo ` NamedTuple** (` validator.py ` ) — new type
103+ ` (url, lineno, col_start, match_text) ` replacing plain ` tuple[str, int] `
104+ throughout the validator pipeline. ` extract_links() ` and
105+ ` extract_ref_links() ` now return ` list[LinkInfo] ` .
106+
107+ - ** Widened dataclasses** — ` LinkError ` , ` PlaceholderFinding ` , ` RuleFinding ` ,
108+ ` Violation ` , and ` Finding ` all gained ` col_start: int = 0 ` and
109+ ` match_text: str = "" ` fields, propagated end-to-end.
110+
111+ - ** Traceback Gutter** (` reporter.py ` ) — increased gutter padding to 2 spaces
112+ around the vertical line: ` 16 ❱ code ` / ` 16 │ code ` .
113+
114+ - ** Vertical Breathing** (` reporter.py ` ) — empty ` Text() ` lines inserted
115+ between different findings in the same file, before/after code snippets,
116+ after file-separator rules, and before the verdict line.
117+
118+ - ** Success State** (` reporter.py ` ) — when all checks pass, the panel renders
119+ a dedicated all-clear layout: telemetry → rule → elegant
120+ ` ✔ All checks passed. Your documentation is secure. ` message.
121+
122+ - ** Surgical Caret Rendering** (` reporter.py ` ) — ` _render_snippet() ` uses
123+ native ` col_start ` /` match_text ` to render precise ` ^^^^ ` caret underlines;
124+ carets are suppressed when ` col_start + len(match_text) > 60 ` (wrapping
125+ guard) or when ` match_text ` is empty (no position data available).
126+
127+ - ** Removed ` _extract_token() ` ** (` reporter.py ` ) — deleted the ` _TOKEN_RE `
128+ regex pattern and ` _extract_token() ` function; removed ` import re ` from the
129+ module. The reporter no longer guesses token positions from message strings.
130+
85131- ** Sentinel Gutter Reporter** (` reporter.py ` ) — source-line context block uses
86132 the Sentinel Palette consistently:
87133 - ` │ ` separators and line numbers rendered in ` SLATE `
@@ -159,6 +205,12 @@ Versions follow [Semantic Versioning](https://semver.org/).
159205
160206### Fixed
161207
208+ - ** mypy errors** — ` list[object] ` annotations on ` security_line ` and
209+ ` renderables ` changed to ` list[RenderableType] ` (imported from
210+ ` rich.console ` ); ` config.docs_dir ` (type ` Path ` ) wrapped with ` str() ` when
211+ passed to ` SentinelReporter(docs_dir=...) ` which expects ` str ` .
212+ ` mypy src/ ` — 0 errors in 30 files.
213+
162214- ** Exit-code under target mode** — ` has_failures ` now uses filtered findings
163215 (` errors > 0 ` ) rather than ` results.failed ` (which counted off-target findings
164216 such as ` zenzic.toml ` classified as an unused asset when ` docs_dir ` was patched
@@ -170,12 +222,46 @@ Versions follow [Semantic Versioning](https://semver.org/).
170222
171223### Tests
172224
225+ - ` test_validator.py ` updated: added ` _ul() ` helper to unwrap ` LinkInfo ` →
226+ ` (url, lineno) ` tuples; 13 assertion patterns updated for ` LinkInfo `
227+ compatibility; 4 destructuring patterns migrated from ` for u, _ in ` to
228+ ` for link in ` with ` .url ` attribute access.
173229- 4 new CLI integration tests for target mode:
174230 ` test_check_all_target_not_found ` , ` test_check_all_target_single_file ` ,
175231 ` test_check_all_target_file_outside_docs ` , ` test_check_all_target_directory ` .
176232- Test fixtures write ≥ 60-word bodies to avoid ` short-content ` placeholder warnings.
177- - ** 587 tests pass.** ` just preflight ` — all gates green:
178- ruff ✓ · mypy ✓ · pytest 81.49% coverage ✓ · REUSE ✓ · zenzic self-audit ✓ · mkdocs build --strict ✓.
233+
234+ #### Mutation Testing Campaign — "The Mutant War"
235+
236+ - ** Mutation score: 86.7%** (242/279 mutants killed on ` rules.py ` ) — up from
237+ 58.1% at baseline. Target was 75%; exceeded by +11.7 pp.
238+ - ** 80 new mutant-killing tests** added to ` test_rules.py ` , organised in
239+ dedicated test classes:
240+ - ` TestExtractInlineLinksWithLines ` (14 tests) — edge cases for inline link
241+ extraction including empty hrefs, escaped brackets, and multi-link lines.
242+ - ` TestVSMBrokenLinkRuleMutantKill ` (22 tests) — ` check_vsm ` path/anchor
243+ resolution logic, orphan detection, severity mapping, and ` continue ` /` break `
244+ branch coverage.
245+ - ` TestAdaptiveRuleEngineRunMutantKill ` (4 tests) — ` AdaptiveRuleEngine.run() `
246+ short-circuit and content propagation.
247+ - ` TestAdaptiveRuleEngineRunVsmMutantKill ` (6 tests) — ` run_vsm() ` VSM-specific
248+ finding collection and file iteration.
249+ - ` TestAssertPickleableMutantKill ` (2 tests) — ` assert_pickleable() ` deep-copy
250+ and ` UNREACHABLE ` assertion guard.
251+ - ` TestPluginRegistryMutantKill ` (27 tests) — ` PluginRegistry ` discovery,
252+ duplicate handling, case-sensitivity, and ` validate_rule() ` contract.
253+ - ` TestExtractLinksDeepMutantKill ` (5 tests) — fence-block skipping, reference
254+ link parsing, and empty-document edge cases.
255+ - ** 37 surviving mutants** classified as equivalent (no observable behaviour
256+ change) or framework limitations (unreachable defensive assertions).
257+ - ** Hypothesis property-based testing** integrated with three profiles:
258+ ` dev ` (50 examples), ` ci ` (500), ` purity ` (1 000).
259+ - ** mutmut 3.5.0** configured under ` [tool.mutmut] ` in ` pyproject.toml ` ;
260+ runner: ` python3 -m pytest -x ` , target: ` src/zenzic/core/rules.py ` .
261+ - ** Performance baseline** relaxed from 150 ms → 200 ms for 5 000 in-memory
262+ resolutions to accommodate CI/nox environmental variance (resolver is O(1)).
263+ - ** 706 tests pass.** ` just preflight ` — all gates green:
264+ ruff ✓ · mypy ✓ · pytest 80%+ coverage ✓ · REUSE ✓ · zenzic self-audit ✓ · mkdocs build --strict ✓.
179265
180266## [ 0.5.0a2] — 2026-04-03 — The Refined Sentinel: Lean Package & Unified Workflow
181267
0 commit comments