Skip to content

release: v1.2.0 — preview rules now gate (consolidation 2026-06-26)#83

Merged
tachyon-beep merged 7 commits into
mainfrom
release/consolidation-2026-06-26
Jun 29, 2026
Merged

release: v1.2.0 — preview rules now gate (consolidation 2026-06-26)#83
tachyon-beep merged 7 commits into
mainfrom
release/consolidation-2026-06-26

Conversation

@tachyon-beep

Copy link
Copy Markdown
Collaborator

Lands the release/consolidation-2026-06-26 consolidation branch on main and ships v1.2.0.

Headline (v1.2.0) — preview-maturity rules now gate

Soundness fix (wardline-4ada23bb09): the --fail-on gate predicate silently excluded maturity: preview findings, so six ERROR-severity rules — 118 (SQL injection), 119 (degenerate trust boundary), 120 (stored taint), 121 (XXE), 122 (SSTI), 124 (native-library load) — fired as active ERROR defects but wardline scan --fail-on ERROR passed green (would_trip_at: null). maturity is now purely informational; preview rules gate and are baselineable exactly like stable rules, matching the long-documented contract.

Behavior change (minor bump): a repo that scans clean today but contains one of these flows now correctly fails --fail-on. Under the secure default, baseline/waive clears the gate only with --trust-suppressions; CI should scope with --new-since <merge-base>. WARN preview rules (116/117/123/126) and INFO (125) also now gate at their thresholds. See CHANGELOG [1.2.0] + UPGRADING.md.

Review

Three independent reviewers audited the new delta before this PR:

  • Gate/FP-soundness — confirmed the preview-decoupling is complete across all 5 gate sites with no half-fixed gate; escape hatches verified empirically.
  • Correctness + bundled feature — confirmed the gate fix and the co-landed analyzed_paths delta-coverage feature are sound and genuinely tested; caught a CHANGELOG regression (a swallowed [1.1.0] header) since fixed.
  • Citation accuracy — verified all 34 run.py/scan.py doc citations bind to the right source lines.

All findings addressed in 25097041.

Verification

  • Full suite: 4559 passed, 1 skipped (e2e excluded — needs live binaries).
  • ruff + mypy clean.
  • Universal regression pin (tests/unit/core/test_preview_gating.py) guards every preview rule in the registry against recurrence.

🤖 Generated with Claude Code

John Morrissey and others added 7 commits June 29, 2026 19:24
… installs don't drop it

`uv tool install wardline[loomweave]` REPLACES extras (it does not merge), so a bare
`loomweave = ["blake3>=1.0"]` dropped the scanner deps and broke `wardline init`/`scan`
— users whack-a-moled scanner<->loomweave. Mirror the `rust` extra and self-include
`wardline[scanner]` (loomweave's taint-store writes fire only during `wardline scan`, so
it genuinely needs the pipeline). Broaden the doctor `loomweave.dep` remediation to name
`uv tool install` vs `pip install`, and add a regression guard pinning that scan-pipeline
extras self-include scanner.

Fixes wardline-c8d7e020e8.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
… shared helper

Extends the install-context wording from the loomweave.dep doctor check (87f13b0) to
every extra-install hint — the scanner-extra CLI guard, the rust tree-sitter loader, the
loomweave blake3 loader, and the optional_deps scanner message — through a single
`extra_install_hint(extra)` helper in core.optional_deps. A uv-tool user must reinstall
via `uv tool install` (pip targets the wrong env, and uv tool replaces rather than merges
extras); the helper names both forms so the hint is right whichever installer is in use.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…clude scanner; PDR-0010

- PDR-0010: loomweave extra self-includes wardline[scanner] (uv-tool whack-a-mole fix);
  shared install-hint helper; regression guard. Within grant; PyPI publish owner-gated.
- metrics.md: dated G4 reading (per-release extras re-check; base stays 0-dep; no trigger).
- current-state.md: PR #69 scope + provenance updated; Now bet (seam probe) unchanged.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…ot configured"

`_resolve_probe_target` only ever finds a filigree *daemon* URL, so a project configured in
ethereal mode (no daemon) — or with the daemon down — collapsed to the misleading
"filigree not configured; nothing to verify", reading as "filigree absent" when it is fully
set up. Read `.weft/filigree/config.json` mode: ethereal -> tell the user to put filigree in
daemon mode (`filigree install --mode server`, then `filigree server start`); configured but
no daemon reachable -> `filigree server start`; genuinely absent -> unchanged message.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…ine-4ada23bb09)

The --fail-on gate predicate silently skipped Maturity.PREVIEW findings, so six
ERROR-severity rules — 118 (SQL injection), 119 (degenerate trust boundary), 120
(stored taint), 121 (XXE), 122 (SSTI), 124 (native-lib load) — fired as active
ERROR defects but `wardline scan --fail-on ERROR` passed green (would_trip_at=None).
A G2 false-green soundness hole, present in 1.1.0. maturity is now purely
informational; preview rules gate AND are baselineable exactly like stable rules,
matching the long-standing documented contract (docs/concepts/rules.md:60).

Removed the preview-exclusion at all 5 sites: suppression.gate_trips,
suppression.gate_breakdown, run.baseline_migration_hint, run._gate_reason,
baseline._is_baselineable_finding. New universal regression pin
(tests/unit/core/test_preview_gating.py) asserts every preview rule in the registry
gates at its base severity, plus end-to-end scan->gate pins for 118/119. Inverted
the two tests that encoded the old behavior (test_baseline, test_default_registry).
CHANGELOG [Unreleased] + UPGRADING note the build-behavior change (a repo clean
today with one of these flows now correctly fails --fail-on; recommend a minor bump).

Also carried here (one shared working tree; run.py co-modified, so the hunks could
not be split into separate commits): a concurrent session's `analyzed_paths`
delta-coverage work (src/wardline/cli/scan.py, ScanResult.analyzed_paths in run.py,
tests/unit/cli/test_scan_artifacts.py, uv.lock) and the glossary line-anchor
reconciliation it required (tests/docs/test_glossary_vocabulary.py,
docs/reference/finding-lifecycle-vocabulary.md run.py + scan.py citations).

Full suite green (4557 passed); ruff + mypy clean.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Minor bump: preview-maturity rules now participate in the --fail-on gate
(see [1.2.0] Fixed). This newly fails CI on repositories that scan green today
but contain a previously-non-gating preview finding (118 SQLi / 119 / 120 /
121 XXE / 122 SSTI / 124 native-load at ERROR; 116/117/123/126 WARN; 125 INFO)
— a deliberate, documented behavior change.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
… change

Three reviewers (gate/FP-soundness, correctness+feature, citation-accuracy) audited
the unpushed delta. The gate fix and the bundled analyzed_paths feature were both
confirmed sound; these are the follow-ups they raised.

CHANGELOG (CRITICAL — reviewer-found): the v1.2.0 edit had swallowed the published
`## [1.1.0] - 2026-06-29` header, orphaning 1.1.0's Changed/Added body (attest-v2,
FastAPI taint, pack-bridge, doctor checks) under [1.2.0] — and v1.1.0 is a released
tag on origin. Restored the [1.1.0] section; [1.2.0] now carries ONLY the preview-gate
Fixed entry. Dropped the now-inaccurate "(unreleased contract)" qualifier from the
released attest entry.

Secure-default remediation guidance (F1, CHANGELOG + UPGRADING): the "baseline/waive
the finding" advice was wrong for CI — under the secure default the gate evaluates the
unsuppressed population, so a committed baseline/waiver clears it only under
--trust-suppressions (trusted local checkout). CI must scope with --new-since; a
baselined/waived finding alone will not green the build. Corrected both docs to match
the CLI's own reason/hint wording.

baseline_ops docstring (F2): collect_and_write_baseline's docstring still said
"EXCLUDING preview findings that never gate" — contradicts the fix (preview defects
are now baselineable). Corrected, and added the missing e2e pin that the orchestration
actually baselines a preview defect.

Test hardening (F3/F4): added a gate_breakdown coherence pin (preview ERROR defect
counts as (1 active, 0 suppressed) — guards against a future regression that trips the
gate while the reason says "0 defects"); added precondition asserts to the universal
invariant so a future NONE-severity / non-DEFECT preview rule fails cleanly instead of
raising KeyError in gate_trips.

Full suite green (4559 passed); ruff + mypy clean.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@tachyon-beep tachyon-beep merged commit e541ff0 into main Jun 29, 2026
7 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