Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
90 commits
Select commit Hold shift + click to select a range
ab09786
fix: stop repo gitignore hiding discovered source
Jun 21, 2026
e73124b
fix: prevent stdlib submodule spoof taints
Jun 21, 2026
c0de30c
fix: reject MCP doctor caller filigree URLs
Jun 21, 2026
7d16b55
fix: harden rekey snapshot provenance
Jun 21, 2026
b1a9de3
fix: preserve rust command shadow rebinds
Jun 21, 2026
0a30f62
fix: drop untrusted MCP sibling URLs
Jun 21, 2026
d7ecb90
fix: bound delta caller seed expansion
Jun 21, 2026
09eae7a
fix: preserve explicit sibling loopback pins
Jun 21, 2026
cddc421
Add `yaml.unsafe_load` and `yaml.full_load` to serialization sinks
google-labs-jules[bot] Jun 21, 2026
c4cf7c8
chore(deps): bump pypa/gh-action-pypi-publish
dependabot[bot] Jun 21, 2026
4ad7776
chore(deps): bump actions/configure-pages from 5 to 6
dependabot[bot] Jun 21, 2026
36c2ea3
chore(deps): bump actions/deploy-pages from 4 to 5
dependabot[bot] Jun 21, 2026
646ff0f
chore(deps): bump actions/checkout from 4 to 7
dependabot[bot] Jun 21, 2026
4e8e107
chore(deps): bump astral-sh/setup-uv from 7.6.0 to 8.2.0
dependabot[bot] Jun 21, 2026
cbd287d
fix: gate waiver_add entity_symbol resolve under MCP network policy
Jun 22, 2026
6d9172c
fix: eliminate cubic candidate-set merge blowup (scan DoS)
Jun 22, 2026
504cf87
docs: consolidate Wardline release materials
Jun 22, 2026
b5bdb7d
docs: consolidate Wardline release materials
Jun 23, 2026
073ec2f
Fix git core.fsmonitor local execution vulnerabilities
google-labs-jules[bot] Jun 23, 2026
8418c77
Fix git core.fsmonitor local execution vulnerabilities
google-labs-jules[bot] Jun 23, 2026
f6cf5e7
fix(doctor): preserve filigree probe provenance
Jun 23, 2026
bc96534
fix(filigree): soft-fail unsafe mint token reads
Jun 23, 2026
eff7c7c
fix(scanner): bound l2 taint analysis work
Jun 23, 2026
5113b44
fix(filigree): avoid response body amplification
Jun 24, 2026
42e2bab
fix(site): pin site-kit fetch in pages build
Jun 24, 2026
e27ed1b
fix(mcp): advertise scan integration effects
Jun 24, 2026
de1509d
fix(mcp): gate rekey cache-dir writes
Jun 24, 2026
9747831
fix(rust): isolate mount overlay prepass failures
Jun 24, 2026
751af16
fix(fingerprint): bind singleton suppressions to source body
Jun 24, 2026
3e1db6b
fix(rust): surface invalid trust markers
Jun 24, 2026
5b30a2f
fix(fingerprint): include full call spans
Jun 24, 2026
e4e4b20
fix(gitignore): track wardline suppression state
Jun 24, 2026
27ec91e
fix(doctor): preserve resolved url provenance
Jun 24, 2026
eca642c
fix(scan): guard explicit output paths
Jun 24, 2026
f42875d
fix(scan): preserve raw hashes for CRLF files
Jun 24, 2026
1e3e0d6
fix(filigree): require confirmed legacy identity
Jun 24, 2026
a0d28f6
fix(rust): tolerate invalid UTF-8 manifests
Jun 24, 2026
edf852d
fix(install): repair mismatched filigree loopback urls
Jun 24, 2026
8f603b3
fix(rust): track args and captured format taint
Jun 24, 2026
31e03a4
fix(rust): normalize nested cfg predicates
Jun 24, 2026
4fbe585
fix(rust): avoid recursive inline module indexing
Jun 24, 2026
84f01cf
fix(discovery): keep nested Rust target modules
Jun 24, 2026
9638114
fix(install): avoid quadratic foreign fence scan
Jun 24, 2026
5924d7f
fix(filigree): redact diagnostic URLs
Jun 24, 2026
22a21ca
Merge branch 'fix/candidate-set-merge-dos' into release/consolidation…
Jun 24, 2026
e511f0c
Merge branch 'origin/release/consolidation-2026-06-23' into release/c…
Jun 24, 2026
9fd2ac0
Merge branch 'origin/dependabot/github_actions/actions/checkout-7' in…
Jun 24, 2026
8b2a534
Merge branch 'origin/dependabot/github_actions/actions/configure-page…
Jun 24, 2026
312151d
Merge branch 'origin/dependabot/github_actions/actions/deploy-pages-5…
Jun 24, 2026
c415619
Merge branch 'origin/dependabot/github_actions/actions-minor-patch-8d…
Jun 24, 2026
fa3a292
Merge branch 'origin/dependabot/github_actions/astral-sh/setup-uv-8.2…
Jun 24, 2026
4e5ba38
Merge branch 'origin/sentinel-git-fsmonitor-fix-12815921081369848082'…
Jun 24, 2026
05f956a
Merge branch 'origin/sentinel/yaml-serialization-sinks-17995805523521…
Jun 24, 2026
8def1a4
docs: spec for project-root-anchored scan artifacts + doctor hygiene
Jun 25, 2026
e55501c
docs: revise project-root-anchored artifacts spec per panel review
Jun 25, 2026
5b2146f
docs: capture _ensure_weft_config ordering hazard in artifacts spec
Jun 25, 2026
0670360
docs: resolve MCP doctor delete posture to 'MCP can delete too'
Jun 25, 2026
9096ff0
docs: TDD implementation plan for project-root-anchored artifacts
Jun 25, 2026
f2b1833
docs: revise plan per plan-review (advisory DoctorCheck status contract)
Jun 25, 2026
86759ac
feat(paths): project_root_for + artifacts_dir helpers (own DEFAULT_AR…
Jun 25, 2026
125a9de
feat(artifacts): anchor default scan artifacts to the weft-project root
Jun 25, 2026
998c367
fix(run): drop stale 'output defaults under the subdirectory' clause …
Jun 25, 2026
41e6ced
test(scan): pin project-root artifact anchoring end-to-end
Jun 25, 2026
a4018e8
refactor(discovery): expose WALK_SKIP_DIRS for the doctor sweep
Jun 25, 2026
bcc0a91
feat(doctor): DoctorCheck carries removed/review payload lists
Jun 25, 2026
eeec30f
feat(doctor): _check_gitignore — advisory, idempotent, CRLF-safe mana…
Jun 25, 2026
822f0d4
feat(doctor): _sweep_stray_artifacts — confined, no-follow, nested-ro…
Jun 25, 2026
ce1cd43
feat(doctor): wire gitignore+sweep into doctor; anchor to project_roo…
Jun 25, 2026
e8926c4
fix(artifacts): restore dir-level symlink guard lost in the project-r…
Jun 25, 2026
2cf95ef
feat(mcp): doctor repair:true deletes strays; advertise destructiveHi…
Jun 25, 2026
134dbd3
docs: project-root-anchored artifacts + doctor hygiene (CHANGELOG + g…
Jun 25, 2026
3a57bf4
fix(doctor): always protect default .wardline; align symlink exit cod…
Jun 25, 2026
b3db52a
Merge feat/project-root-anchored-artifacts into release/consolidation…
Jun 25, 2026
0a8b8d4
docs(weft): weft-seam conformance program plan + reusable kit spec
Jun 25, 2026
aff3761
feat(conformance): P0 enforceable weft seam registry + fail-closed gate
Jun 25, 2026
5b0dcf2
refactor(federation): extract shared WeftHttp transport (wardline-184…
Jun 25, 2026
9f0c4d1
refactor(federation): single-source the federation-status envelope (w…
Jun 25, 2026
861e6cf
feat(conformance): SEI(loomweave->wardline) reaches at_bar via consum…
Jun 25, 2026
cf248a5
feat(conformance): qualname parity reaches at_bar (live oracle + both…
Jun 25, 2026
4b9561d
feat(conformance): 3 consumer seams reach at_bar + harden the keyston…
Jun 25, 2026
461e25f
feat(conformance): MCP B1/B2 reaches at_bar via one-sided golden-sche…
Jun 25, 2026
dd82307
feat(conformance): suppression-filter seam reaches at_bar (wardline-a…
Jun 25, 2026
54c6582
feat(conformance): scan-results emission/intake reaches at_bar (cross…
Jun 25, 2026
00f1f83
feat(conformance): finding-identity wire reaches at_bar (cross-repo)
Jun 25, 2026
b714296
feat(conformance): taint-fact store wire reaches at_bar (cross-repo, …
Jun 25, 2026
5903b45
feat(conformance): vocabulary-descriptor wire reaches at_bar (cross-r…
Jun 25, 2026
78bd22e
feat(conformance): G1 wardline->legis scan-artifact wire reaches at_b…
Jun 25, 2026
5de9e23
feat(conformance): peer_conformant verdict + dispose the 7 legis peer…
Jun 25, 2026
0729a86
fix(conformance): downgrade SEI-wire-transport peer_conformant -> gap…
Jun 25, 2026
808e497
Merge weft-seam-conformance into release/consolidation-2026-06-26
Jun 25, 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
24 changes: 12 additions & 12 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -21,10 +21,10 @@ jobs:
runs-on: ubuntu-latest
if: github.event_name != 'schedule'
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v7
with:
persist-credentials: false
- uses: astral-sh/setup-uv@37802adc94f370d6bfd71619e3f0bf239e1f3b78 # v7
- uses: astral-sh/setup-uv@fac544c07dec837d0ccb6301d7b5580bf5edae39 # v8.2.0
with:
enable-cache: true
python-version: "3.13"
Expand All @@ -42,10 +42,10 @@ jobs:
runs-on: ubuntu-latest
if: github.event_name != 'schedule'
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v7
with:
persist-credentials: false
- uses: astral-sh/setup-uv@37802adc94f370d6bfd71619e3f0bf239e1f3b78 # v7
- uses: astral-sh/setup-uv@fac544c07dec837d0ccb6301d7b5580bf5edae39 # v8.2.0
with:
enable-cache: true
python-version: "3.13"
Expand All @@ -60,10 +60,10 @@ jobs:
matrix:
python-version: ["3.12", "3.13"]
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v7
with:
persist-credentials: false
- uses: astral-sh/setup-uv@37802adc94f370d6bfd71619e3f0bf239e1f3b78 # v7
- uses: astral-sh/setup-uv@fac544c07dec837d0ccb6301d7b5580bf5edae39 # v8.2.0
with:
enable-cache: true
python-version: ${{ matrix.python-version }}
Expand All @@ -76,10 +76,10 @@ jobs:
needs: test
if: github.event_name != 'schedule'
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v7
with:
persist-credentials: false
- uses: astral-sh/setup-uv@37802adc94f370d6bfd71619e3f0bf239e1f3b78 # v7
- uses: astral-sh/setup-uv@fac544c07dec837d0ccb6301d7b5580bf5edae39 # v8.2.0
with:
enable-cache: true
python-version: "3.13"
Expand Down Expand Up @@ -120,10 +120,10 @@ jobs:
runs-on: ubuntu-latest
if: github.event_name == 'schedule'
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v7
with:
persist-credentials: false
- uses: astral-sh/setup-uv@37802adc94f370d6bfd71619e3f0bf239e1f3b78 # v7
- uses: astral-sh/setup-uv@fac544c07dec837d0ccb6301d7b5580bf5edae39 # v8.2.0
with:
enable-cache: true
python-version: "3.13"
Expand Down Expand Up @@ -163,10 +163,10 @@ jobs:
- name: Warpline
marker: warpline_e2e
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v7
with:
persist-credentials: false
- uses: astral-sh/setup-uv@37802adc94f370d6bfd71619e3f0bf239e1f3b78 # v7
- uses: astral-sh/setup-uv@fac544c07dec837d0ccb6301d7b5580bf5edae39 # v8.2.0
with:
enable-cache: true
python-version: "3.13"
Expand Down
13 changes: 9 additions & 4 deletions .github/workflows/deploy-site.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
# copied verbatim into the build output). It consumes the shared @weft/site-kit,
# which lives in a SUBDIRECTORY of a DIFFERENT repo (foundryside-dev/weft).
# npm cannot install a git subdirectory as a file: dep directly, so the build
# sparse-fetches packages/site-kit into site/vendor/site-kit first
# sparse-fetches a pinned packages/site-kit commit into site/vendor/site-kit first
# (scripts/fetch-site-kit.mjs), then `npm install` resolves the file: dep and
# `astro build` compiles it. The fetch also runs as a preinstall hook, but the
# explicit step keeps the order legible.
Expand All @@ -29,6 +29,11 @@ concurrency:
group: pages
cancel-in-progress: false

env:
# Privileged Pages builds must consume an immutable site-kit revision. Update
# this SHA deliberately when promoting a new foundryside-dev/weft site kit.
WEFT_SITE_KIT_REF: a8f9a6a77458d2ec697cfbc1f71dd88a51962cb7

jobs:
build:
runs-on: ubuntu-latest
Expand All @@ -37,13 +42,13 @@ jobs:
working-directory: site
steps:
- name: Checkout
uses: actions/checkout@v4
uses: actions/checkout@v7

- name: Configure Pages
# Pin the Pages source to GitHub Actions (build_type=workflow); enables
# Pages if needed. Without this, deploy-pages fails when the repo is
# still set to "Deploy from a branch".
uses: actions/configure-pages@v5
uses: actions/configure-pages@v6
with:
enablement: true

Expand Down Expand Up @@ -78,4 +83,4 @@ jobs:
steps:
- name: Deploy to GitHub Pages
id: deployment
uses: actions/deploy-pages@v4
uses: actions/deploy-pages@v5
6 changes: 3 additions & 3 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -12,10 +12,10 @@ jobs:
name: Build distributions
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
with:
persist-credentials: false
- uses: astral-sh/setup-uv@37802adc94f370d6bfd71619e3f0bf239e1f3b78 # v7
- uses: astral-sh/setup-uv@fac544c07dec837d0ccb6301d7b5580bf5edae39 # v8.2.0
with:
enable-cache: true
python-version: "3.13"
Expand Down Expand Up @@ -59,4 +59,4 @@ jobs:
# twine reject it ("Unknown distribution format") and blocks the release.
# Verification above already consumed it.
run: rm -f dist/SHA256SUMS
- uses: pypa/gh-action-pypi-publish@ed0c53931b1dc9bd32cbe73a98c7f6766f8a527e # v1.13.0
- uses: pypa/gh-action-pypi-publish@cef221092ed1bacb1cc03d23a2d87d1d172e277b # v1.14.0
7 changes: 6 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,12 @@ output/
# port (a live, never-committed runtime artifact, not tracked state).
.weft/*/ephemeral.port

# Local sibling tool stores are runtime/tooling state for this checkout. Keep
# wardline's own .weft/wardline/ suppression state visible and auditable.
.weft/filigree/
.weft/loomweave/
.weft/warpline/

# Filigree issue tracker
.filigree/
.env
Expand All @@ -56,7 +62,6 @@ coverage.json
loomweave.yaml

# Filigree issue tracker
.weft/
.filigree.conf
.agents/skills/loomweave-workflow/.fingerprint
.agents/skills/loomweave-workflow/SKILL.md
Expand Down
9 changes: 9 additions & 0 deletions .jules/sentinel.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
## 2025-02-14 - Prevent Git Config Code Execution
**Vulnerability:** Invoking `git` via `subprocess` against untrusted directories without overriding config can allow malicious repositories to execute code via `.git/config` hooks like `core.fsmonitor`.
**Learning:** `git` uses configurations from the `.git/config` file in the current working directory or `cwd` argument, which could be controlled by an attacker when analyzing untrusted codebases.
**Prevention:** Explicitly pass `("-c", "core.fsmonitor=false")` as `_SAFE_GIT_CONFIG` to all `git` subprocess commands in the codebase.

## 2026-06-21 - [Add Unsafe PyYAML Loaders to Taint Tracking]
**Vulnerability:** The static analyzer was missing `yaml.unsafe_load` and `yaml.full_load` in its `_SERIALISATION_SINKS` mapping, potentially leading to false negatives when tracking untrusted data flowing into these dangerous deserialization functions.
**Learning:** Even if functions are listed in rule specifications (like `_SINK_SPECS`), they also need to be properly categorized in the core taint propagation logic (`_SERIALISATION_SINKS`) to ensure the analyzer correctly sheds validation provenance (converting output to `UNKNOWN_RAW`).
**Prevention:** When adding new sinks to rule definitions, always verify if they need to be added to core propagation mappings like `_SERIALISATION_SINKS` or `_PROPAGATING_BUILTINS`.
30 changes: 30 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,35 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

## [Unreleased]

### Changed
- Default scan artifacts now anchor to the weft-project root (the `weft.toml` directory)
rather than the scan cwd, so a subdirectory scan writes to `<project-root>/.wardline/`.
Retention is therefore project-root-wide across heterogeneous subdir/root scans sharing
one `.wardline/`. **Migration:** the artifact moves to the project root; `wardline doctor
--repair` sweeps now-stale per-subdir `.wardline/` dirs — update any CI/automation reading
a hardcoded `<subdir>/.wardline/*-findings.jsonl` path.

### Added
- `wardline doctor --repair` gitignores the artifacts dir and sweeps stray managed
artifacts; deletion is available on both the CLI and the MCP `doctor` tool (`repair:true`,
advertised `destructiveHint: true`), bounded to managed (timestamped) files inside
non-standard `.wardline/` dirs under the project root; emptied dirs are removed
best-effort (non-empty dirs are left in place).

### Fixed
- **Candidate-set merge no longer scales cubically (scan DoS).** The Level-2
branch-join merges for lambda bindings (`_merge_branch_bindings`) and
receiver-type candidates (`_merge_branch_types`) deduplicated with a nested
linear scan of the growing candidate list — O(bucket²) per merge, O(N³)
across a chain of `N` one-armed branches rebinding the same name. An
attacker-authored file (~1100 such branches) could drive a default-gate scan
to ~15s and exhaust CPU on every local and CI run. Both merges now dedup via
an identity/equality set (O(bucket) per merge, O(N²) cumulative), preserving
the exact candidate set and insertion order; the demonstrated 1100-branch case
drops from seconds to milliseconds. No analysis behavior changes — the
candidate sets are identical, so no false negative is introduced.
Reviewed regression source: `eff4eed2` (wardline-c797baf28b).

## [1.0.7] - 2026-06-24

### Fixed
Expand Down Expand Up @@ -1353,6 +1382,7 @@ for Python — enterprise-class trust-boundary analysis at small-team weight.
- **Packaging** — MIT-licensed; optional extras `scanner` (config + CLI) and
`weft` (HTTP integrations).

[Unreleased]: https://github.com/foundryside-dev/wardline/compare/v1.0.6...HEAD
[1.0.6]: https://github.com/foundryside-dev/wardline/compare/v1.0.5...v1.0.6
[1.0.5]: https://github.com/foundryside-dev/wardline/compare/v1.0.4...v1.0.5
[1.0.4]: https://github.com/foundryside-dev/wardline/compare/v1.0.3...v1.0.4
Expand Down
2 changes: 1 addition & 1 deletion CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ see `CLAUDE.md`).

- **TDD.** Write the failing test first.
- Keep PRs focused — one logical change per PR.
- New behavior needs tests. New `wardline.yaml` keys need a `config_schema.py` update.
- New behavior needs tests. New `[wardline]` keys in `weft.toml` need a `config_schema.py` update.
- No back-compat shims for unreleased specs — make clean changes.
- Wardline scans its own source as a CI gate; keep the tree finding-clean (or baselined).

Expand Down
41 changes: 21 additions & 20 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ def build_record(req):

```console
$ wardline scan . --fail-on ERROR
scanned 1 file(s); 3 finding(s) — 0 suppressed (0 baseline / 0 waiver / 0 judged), 1 active -> .wardline/20260620T153012Z-findings.jsonl
scanned 1 file(s); 2 finding(s) — 0 suppressed (0 baseline / 0 waiver / 0 judged), 1 active -> .wardline/20260620T153012Z-findings.jsonl
$ echo $?
1
```
Expand All @@ -33,8 +33,8 @@ The gate trips (exit 1) and the findings land in timestamped JSON Lines under
`.wardline/` by default (`--output PATH` writes to an exact path; `--format
sarif` emits SARIF for GitHub code scanning). Wardline is agent-first — you
don't read that file by hand. Your coding agent does: ask it *"why did the scan
fail?"* and it surfaces the one active defect (the other two findings are
`NONE`-severity engine facts):
fail?"* and it surfaces the one active defect (the other finding is a
`NONE`-severity engine fact):

> **`demo.build_record`** declares return trust `ASSURED` but actually returns
> `EXTERNAL_RAW` (less trusted) — untrusted data reaches a trusted producer.
Expand Down Expand Up @@ -137,7 +137,7 @@ Prefer `weft_markers` in application code. Wardline still recognizes
| `scanner` | pyyaml, jsonschema, click | the `wardline` CLI and `wardline mcp` server |
| `loomweave` | blake3 | persisting taint facts to a Loomweave store |
| `rust` | scanner extra, tree-sitter, tree-sitter-rust | `wardline scan --lang rust` |
| `docs` | mkdocs, mkdocs-material | building the documentation site |
| `docs` | mkdocs, mkdocs-material | a local MkDocs render of `docs/` |

The LLM triage judge (`wardline judge`) is dependency-free (stdlib `urllib` →
OpenRouter) and needs no extra.
Expand All @@ -150,8 +150,9 @@ wardline install

This injects a hash-fenced instruction block into `CLAUDE.md`/`AGENTS.md`,
installs the `wardline-gate` skill, merges a `wardline` entry into `.mcp.json`,
and writes Codex's `~/.codex/config.toml` MCP entry. Agents then run the scan →
explain → fix-at-boundary → rescan loop natively. The `wardline mcp` server
writes Codex's `~/.codex/config.toml` MCP entry, detects Loomweave/Filigree
siblings, mints an attest signing key, and adds pre-commit hook config. Agents
then run the scan → explain → fix-at-boundary → rescan loop natively. The `wardline mcp` server
exposes the primary tool surface over JSON-RPC with no SDK, including scan,
filtered findings, explain-taint, fix, judge, baseline/waiver, doctor, rekey,
assure, attest, dossier, and Filigree filing tools.
Expand Down Expand Up @@ -196,23 +197,23 @@ It is **not** the right tool when you need:

## Documentation

Full documentation lives at **<https://foundryside-dev.github.io/wardline/>**.
Full documentation lives in the [`docs/`](https://github.com/foundryside-dev/wardline/tree/main/docs) tree.

| Document | Description |
|----------|-------------|
| [Getting Started](https://foundryside-dev.github.io/wardline/getting-started/) | Install, decorate, first scan |
| [Taint & Trust Model](https://foundryside-dev.github.io/wardline/concepts/model/) | The lattice, decorators, and propagation |
| [Rules](https://foundryside-dev.github.io/wardline/concepts/rules/) | The boundary, exception-flow, and sink rules |
| [Configuration](https://foundryside-dev.github.io/wardline/guides/configuration/) | `weft.toml` `[wardline]`: rules, severity, excludes |
| [Suppression](https://foundryside-dev.github.io/wardline/guides/suppression/) | Baselines and waivers |
| [LLM Triage Judge](https://foundryside-dev.github.io/wardline/guides/judge/) | Opt-in TRUE/FALSE-positive labelling |
| [Rust Support](https://foundryside-dev.github.io/wardline/guides/rust-preview/) | Preview Rust command-injection frontend |
| [Weft Integration](https://foundryside-dev.github.io/wardline/guides/weft/) | SARIF, Filigree, Loomweave, and sibling URL resolution |
| [Assurance Posture](https://foundryside-dev.github.io/wardline/guides/assurance-posture/) | Coverage posture, attestations, and trust-surface evidence |
| [Loomweave Taint Store](https://foundryside-dev.github.io/wardline/guides/loomweave-taint-store/) | Persisting taint facts |
| [CLI Reference](https://foundryside-dev.github.io/wardline/reference/cli/) | Every command and flag |
| [Trust Vocabulary](https://foundryside-dev.github.io/wardline/reference/vocabulary/) | The decorators and their arguments |
| [Agent Integration](https://foundryside-dev.github.io/wardline/guides/agents/) | Using Wardline from a coding agent |
| [Getting Started](https://github.com/foundryside-dev/wardline/blob/main/docs/getting-started.md) | Install, decorate, first scan |
| [Taint & Trust Model](https://github.com/foundryside-dev/wardline/blob/main/docs/concepts/model.md) | The lattice, decorators, and propagation |
| [Rules](https://github.com/foundryside-dev/wardline/blob/main/docs/concepts/rules.md) | The boundary, exception-flow, and sink rules |
| [Configuration](https://github.com/foundryside-dev/wardline/blob/main/docs/guides/configuration.md) | `weft.toml` `[wardline]`: rules, severity, excludes |
| [Suppression](https://github.com/foundryside-dev/wardline/blob/main/docs/guides/suppression.md) | Baselines and waivers |
| [LLM Triage Judge](https://github.com/foundryside-dev/wardline/blob/main/docs/guides/judge.md) | Opt-in TRUE/FALSE-positive labelling |
| [Rust Support](https://github.com/foundryside-dev/wardline/blob/main/docs/guides/rust-preview.md) | Preview Rust command-injection frontend |
| [Weft Integration](https://github.com/foundryside-dev/wardline/blob/main/docs/guides/weft.md) | SARIF, Filigree, Loomweave, and sibling URL resolution |
| [Assurance Posture](https://github.com/foundryside-dev/wardline/blob/main/docs/guides/assurance-posture.md) | Coverage posture, attestations, and trust-surface evidence |
| [Loomweave Taint Store](https://github.com/foundryside-dev/wardline/blob/main/docs/guides/loomweave-taint-store.md) | Persisting taint facts |
| [CLI Reference](https://github.com/foundryside-dev/wardline/blob/main/docs/reference/cli.md) | Every command and flag |
| [Trust Vocabulary](https://github.com/foundryside-dev/wardline/blob/main/docs/reference/vocabulary.md) | The decorators and their arguments |
| [Agent Integration](https://github.com/foundryside-dev/wardline/blob/main/docs/guides/agents.md) | Using Wardline from a coding agent |

## Development

Expand Down
14 changes: 8 additions & 6 deletions ROADMAP.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,24 +5,26 @@ a direction sketch, not a commitment — dates are deliberately omitted.

## Where we are

**0.3.0 — shipped.** The staged build (SP0–SP9) is complete:
**1.0.6 — shipped.** The staged build (SP0–SP9) is complete:

- Function-, variable-, and project-level taint over an inter-module call graph
(L1–L2 with an L3 fixed point).
- The NG-25 trust vocabulary and three opt-in decorators.
- Four policy rules (PY-WL-101..104), severity/enable config, baselines + waivers.
- 26 Python policy rules (PY-WL-101..126) plus Rust preview rules
(RS-WL-108/112), severity/enable config, baselines + waivers.
- JSONL + SARIF + native Filigree emit.
- Dependency-free MCP-over-stdio server (`wardline mcp`).
- Opt-in LLM triage judge (`wardline judge`).
- `wardline install` agent enablement.
- Opt-in Loomweave taint-store integration.
- Published to PyPI; docs site live; CI dogfoods Wardline on its own source.
- Published to PyPI; CI dogfoods Wardline on its own source.

## Scope

Wardline is deliberately **L1–L2 with an L3 project fixed point**, not an
exhaustive path-sensitive whole-program prover, and Python-only. We favor a
small, precise, opt-in rule set over broad SAST coverage.
exhaustive path-sensitive whole-program prover, and Python-first (with a Rust
preview, `wardline scan --lang rust`). We favor a small, precise, opt-in rule
set over broad SAST coverage.

## Near-term threads

Expand All @@ -39,6 +41,6 @@ Tracked in the project's Filigree issues:

## Out of scope (for now)

- Languages other than Python.
- Broad multi-language coverage beyond the Python core and Rust preview.
- A general-purpose, dozens-of-rules SAST suite.
- A hosted/cloud service — Wardline stays local-first.
1 change: 1 addition & 0 deletions docs/concepts/model.md
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,7 @@ emit the canonical list:

```console
$ wardline vocab
schema: wardline.vocabulary/v1
version: wardline-generic-2
entries:
- canonical_name: external_boundary
Expand Down
3 changes: 2 additions & 1 deletion docs/concepts/rules.md
Original file line number Diff line number Diff line change
Expand Up @@ -258,7 +258,8 @@ handler to the specific exception you expect (`except ValueError:`).

### PY-WL-104 — silently swallowed exception in a trusted-tier function

Fires on a handler whose body only `pass`/`...`/`continue`/`break` — it discards
Fires on a handler whose body is only `pass`/`...`/`continue`/`break` or a bare
constant expression (a docstring-like string literal or a number) — it discards
the error with no logging, re-raise, or recovery. The failure vanishes
silently.

Expand Down
Loading
Loading