Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
32 commits
Select commit Hold shift + click to select a range
b3c2bdb
M0-M7: Full enforcement core, ops stack, console, and fleet hub (#1)
chaksaray Jul 6, 2026
d0609c3
Config hardening, testing guide, and no-.env policy (#2)
chaksaray Jul 8, 2026
f722d52
Wire the multiplexer, fix hub enroll/console concurrency, real README…
chaksaray Jul 9, 2026
494b8eb
Chore: verifiable-hygiene pass (badges, disclosure policy, governance…
chaksaray Jul 10, 2026
afeffba
Chore: add Matt Pocock skills (#7)
chaksaray Jul 10, 2026
51ccbe1
fix: resolve conflic
chaksaray Jul 10, 2026
592d2e7
Add CI security scan pipeline (code, dependency, secret) (#13)
chaksaray Jul 11, 2026
105cc5b
Implement PyPI packaging; fix an install-breaking schema-path bug (#12)
chaksaray Oct 8, 2026
82b87eb
chore: issue templates, PR template, CODEOWNERS, contributing rules (…
chaksaray Oct 10, 2026
7e1ea48
fix scoreboard
chaksaray Oct 10, 2026
13c27d2
fix: MCP surface coverage for provenance tagging (#21)
chaksaray Oct 11, 2026
95d84d0
docs: README decision pipeline diagram (#23)
chaksaray Oct 11, 2026
5d63efc
docs: restructure README opening; add usage walkthrough and command t…
chaksaray Oct 11, 2026
973d83c
docs: restructure README opening; add usage walkthrough and command t…
chaksaray Oct 11, 2026
7c5a04a
docs: show README badges under the title; un-hide the status section …
chaksaray Oct 11, 2026
451cd3c
doc: unhide badges
chaksaray Oct 11, 2026
bb976a1
docs: remove the unclosed details block from README; fit code blocks …
chaksaray Oct 11, 2026
4720b07
unhide badges
chaksaray Oct 11, 2026
a067bac
docs: pip install from PyPI; record the 0.1.0 release (#37)
chaksaray Oct 11, 2026
c77335f
docs: narrow the manifest signing identity open question in DESIGN.md…
chaksaray Oct 11, 2026
a3b9c5e
docs: absolute README links for PyPI; bump to 0.1.1 (#40)
chaksaray Oct 11, 2026
3511db2
pin version
chaksaray Oct 15, 2026
7c39bed
docs: ADR 0001, audit chain construction diverges from ACS v0.1.0 (#47)
chaksaray Oct 16, 2026
05ad472
docs: correct README claims the code does not back; bring #45 into de…
chaksaray Oct 16, 2026
df99064
docs(design): mark the 14.3 credential model specified, not implement…
chaksaray Oct 16, 2026
8558964
docs: state what the hub does today and what is pending (#52)
chaksaray Oct 16, 2026
f5ef15f
doc: hub pending
chaksaray Oct 16, 2026
d61829c
docs: point the status badge at the Status heading anchor (#61)
chaksaray Oct 17, 2026
a196d0b
ci: pin every action to a commit SHA, scope publish.yml token permiss…
chaksaray Oct 17, 2026
8c01354
docs: use bawbel.io@gmail.com as the security and conduct contact (#68)
chaksaray Oct 18, 2026
899459d
docs: route AVE matters to aveproject/ave and scanner matters to bawb…
chaksaray Oct 18, 2026
5a0ceb7
docs: correct gate milestone status, AVE facts, Flow C, and stale hos…
chaksaray Oct 18, 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 .claude/skills/ave-record-authoring/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -62,4 +62,4 @@ it is not a record yet; generalize to the class or stop.
- A record is published when CI validates it and PiranhaDB serves it; `?schema=1.1`
must strip 1.2 fields, and the contract test for both versions must stay green.
- Backfill lands as reviewed PR batches; each batch updates the triage counter on
ave.bawbel.io.
aveproject.org.
6 changes: 3 additions & 3 deletions .github/workflows/code-scan.yml
Original file line number Diff line number Diff line change
Expand Up @@ -17,12 +17,12 @@ jobs:
contents: read
security-events: write
steps:
- uses: actions/checkout@v7
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
- name: Initialize CodeQL
uses: github/codeql-action/init@v3
uses: github/codeql-action/init@ce5e7eeac396d720fe2d802714996c8ce561e311 # v3.39.0
with:
languages: python
- name: Perform CodeQL analysis
uses: github/codeql-action/analyze@v3
uses: github/codeql-action/analyze@ce5e7eeac396d720fe2d802714996c8ce561e311 # v3.39.0
with:
category: "/language:python"
6 changes: 3 additions & 3 deletions .github/workflows/dependency-scan.yml
Original file line number Diff line number Diff line change
Expand Up @@ -18,13 +18,13 @@ jobs:
contents: read
pull-requests: write
steps:
- uses: actions/checkout@v7
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
- name: Dependency Review
uses: actions/dependency-review-action@v5
uses: actions/dependency-review-action@a1d282b36b6f3519aa1f3fc636f609c47dddb294 # v5.0.0
with:
fail-on-severity: high
- name: Set up Python
uses: actions/setup-python@v7
uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0
with:
python-version: "3.11"
- name: Audit installed dependencies for known vulnerabilities
Expand Down
21 changes: 12 additions & 9 deletions .github/workflows/publish.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,16 @@ on:
release:
types: [published]

permissions:
contents: read

jobs:
test:
name: Verify Tests
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v7
- uses: actions/setup-python@v7
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
- uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0
with:
python-version: "3.11"
- name: Install package with dev dependencies
Expand All @@ -25,8 +28,8 @@ jobs:
needs: [test]
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v7
- uses: actions/setup-python@v7
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
- uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0
with:
python-version: "3.11"
- name: Install build
Expand All @@ -39,7 +42,7 @@ jobs:
/tmp/verify-venv/bin/pip install dist/*.whl
/tmp/verify-venv/bin/bawbel-gate --version
- name: Store distributions
uses: actions/upload-artifact@v7
uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
with:
name: python-package-distributions
path: dist/
Expand All @@ -55,12 +58,12 @@ jobs:
id-token: write # mandatory for trusted publishing; no API token stored
steps:
- name: Download distributions
uses: actions/download-artifact@v4
uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4.3.0
with:
name: python-package-distributions
path: dist/
- name: Publish to TestPyPI
uses: pypa/gh-action-pypi-publish@release/v1
uses: pypa/gh-action-pypi-publish@dc37677b2e1c63e2034f94d8a5b11f265b73ba33 # v1.14.2
with:
repository-url: https://test.pypi.org/legacy/
skip-existing: true
Expand All @@ -80,9 +83,9 @@ jobs:
id-token: write # mandatory for trusted publishing; no API token stored
steps:
- name: Download distributions
uses: actions/download-artifact@v4
uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4.3.0
with:
name: python-package-distributions
path: dist/
- name: Publish to PyPI
uses: pypa/gh-action-pypi-publish@release/v1
uses: pypa/gh-action-pypi-publish@dc37677b2e1c63e2034f94d8a5b11f265b73ba33 # v1.14.2
8 changes: 4 additions & 4 deletions .github/workflows/scorecard.yml
Original file line number Diff line number Diff line change
Expand Up @@ -18,25 +18,25 @@ jobs:

steps:
- name: "Checkout code"
uses: actions/checkout@v7
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
persist-credentials: false

- name: "Run analysis"
uses: ossf/scorecard-action@v2.5.0
uses: ossf/scorecard-action@fa7117db83c52d787ae5a89f350999701505d78e # v2.5.0
with:
results_file: results.sarif
results_format: sarif
publish_results: true

- name: "Upload artifact"
uses: actions/upload-artifact@v7
uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
with:
name: SARIF file
path: results.sarif
retention-days: 5

- name: "Upload to code-scanning"
uses: github/codeql-action/upload-sarif@v4.38.2
uses: github/codeql-action/upload-sarif@2892aa5e19bbd11bc0cff5427e3b750a04d9e3c2 # v4.38.2
with:
sarif_file: results.sarif
2 changes: 1 addition & 1 deletion .github/workflows/secret-scan.yml
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ jobs:
permissions:
contents: read
steps:
- uses: actions/checkout@v7
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
fetch-depth: 0
- name: Run Gitleaks
Expand Down
67 changes: 42 additions & 25 deletions ARCHITECTURE.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ versioned, public interface. No layer reaches around another.
│ LAYER 5b bawbel platform [PLANNED] │ │ │
│ multi-org SaaS, ingest at scale │ │ │
├────────────────────────────────────────────────────────┤ │ │
│ LAYER 5a bawbel-hub [DESIGN → M7] │ │ │
│ LAYER 5a bawbel-hub [M7 partial] │ │ │
│ self-hosted fleet console, one org/team, │ │ │
│ 5-50 gates · FIRST PAID TIER │ │ │
├────────────────────────────────────────────────────────┤ │ │
Expand All @@ -31,14 +31,14 @@ versioned, public interface. No layer reaches around another.
│ api.piranha.bawbel.io │ │ │
│ queryable AVE corpus, mitigation endpoint │ │ │
├────────────────────────────────────────────────────────┤ ▼ │
│ LAYER 2.5 bawbel-gate [DESIGN → M1] │ classes findings
│ LAYER 2.5 bawbel-gate [alpha 0.1.0] │ classes findings
│ runtime enforcement: manifests, taint, │ → rules → decisions
│ trifecta invariant, audit chain │ → stanzas → audit chains
├────────────────────────────────────────────────────────┤ → pins → new class
│ LAYER 2 bawbel-scanner [LIVE v1.3.0] │ │ candidates
│ static detection: CLI, pre-commit, CI │ │ │
├────────────────────────────────────────────────────────┤ │ │
│ LAYER 1 AVE [LIVE, 51 records] │ ▼ │
│ LAYER 1 AVE [LIVE, 87 records] │ ▼ │
│ the standard: behavioral vulnerability │ │
│ classes for agentic systems, AIVSS-scored │ ────────────────┘
└────────────────────────────────────────────────────────┘
Expand Down Expand Up @@ -67,15 +67,15 @@ flowchart TB
end
subgraph L2["Layers 2 / 2.5 · detection and enforcement"]
SCN["bawbel-scanner<br/>v1.3.0 · LIVE"]
GATE["bawbel-gate<br/>DESIGN → M1"]
GATE["bawbel-gate<br/>alpha 0.1.0 · M5, M7 partial"]
end
subgraph EDGE["edge surfaces"]
IDE["vscode-bawbel"]
BMCP["bawbel-mcp"]
CI["bawbel-integrations"]
end
subgraph L5A["Layer 5a · team tier, first paid product"]
HUB["bawbel-hub<br/>DESIGN → M7 · self-hosted"]
HUB["bawbel-hub<br/>M7 partial · self-hosted"]
end
subgraph PLAN["planned layers"]
REG["Layer 4 · Registry"]
Expand All @@ -89,7 +89,7 @@ flowchart TB
PDB --> BMCP
SCN -->|"findings, SARIF"| CI
SCN -->|"diagnostics"| IDE
GATE -->|"Flow D · audit chain, push-only mTLS"| HUB
GATE -->|"Flow D · audit chain, push-only mTLS (specified)"| HUB
HUB -.->|"federated rollup, planned"| PLAT
REG -.->|"signed manifest baselines"| GATE
PLAT -.->|"deny patterns → class candidates"| AVE
Expand Down Expand Up @@ -151,6 +151,10 @@ flowchart LR
B -.->|"audit evidence"| R
```

Status: AVE records do not carry `capability_mitigation` yet (0 of 87 on aveproject/ave
main, 2026-10-18), so the record-to-stanza step is planned. Today `harden --ave` reads
stanzas from gate's own `mitigations/ave-mitigations.json` (2 entries).

### Flow D · Telemetry: evidence, upward

```
Expand All @@ -173,22 +177,28 @@ patterns across teams are the eventual pipeline for new AVE class candidates via
federated platform, which closes the loop back to Flow A, but that hop is planned,
not required for the hub to deliver its value today.

Status: the hub side of Flow D (ingest, per-session chain verification, fleet state) is
implemented. The gate-side push and the per-gate mTLS channel are specified, not
implemented (DESIGN.md 14.3). See the bawbel-hub project entry below.

## 3. Projects

Each project: what it is, what it consumes, what it produces, and the interface it is
held to.

### ave (Layer 1, live: schema 1.2, 51 records)
### ave (Layer 1, independent project aveproject/ave; live: schema 1.1.0, 87 records)

The standard. CWE-shaped behavioral class definitions for agentic-system
vulnerabilities, scored with OWASP AIVSS v0.8. Since schema 1.2, records carry a
provenance vector (where in the context supply chain the class enters), a trifecta
profile (which legs make it exploitable), and an executable mitigation stanza.
The standard, governed separately from Bawbel. CWE-shaped behavioral class definitions
for agentic-system vulnerabilities, scored with OWASP AIVSS v0.8. Records carry a
provenance vector (where in the context supply chain the class enters; 87 of 87) and a
trifecta profile (which legs make it exploitable; 77 of 87). The executable mitigation
stanza (`capability_mitigation`) is defined but populated in 0 of 87.

- **Consumes:** research, incident reports, fleet deny patterns (Flow D).
- **Produces:** versioned JSON records; JSON Schemas for records and capability
manifests.
- **Interface:** git repo + `schemas/ave-1.2.json`; docs at ave.bawbel.io.
- **Interface:** git repo (github.com/aveproject/ave) +
`schema/ave-record-1.1.0.schema.json`; site at aveproject.org.
- **Strategic gate:** second independent implementer before OWASP/MITRE outreach.

### bawbel-scanner (Layer 2, live: v1.3.0, PyPI)
Expand All @@ -203,7 +213,7 @@ hook, and CI job; emits JSON and SARIF.
- **Interface:** CLI contract + SARIF 2.1.0; secret-detector set shared with the gate
as a library, not forked.

### bawbel-gate (Layer 2.5, DESIGN.md complete, M1 next)
### bawbel-gate (Layer 2.5, alpha 0.1.0 on PyPI, M5 and M7 partial)

Runtime enforcement. MCP multiplexer proxy enforcing capability manifests, session
taint, and the rule-of-two trifecta invariant, with a hash-chained audit log,
Expand All @@ -216,10 +226,11 @@ embedded console (v1.2).
- **Interface:** capability-manifest/v1 schema; Console API (DESIGN.md 13.1); ingest
protocol (DESIGN.md 13.2).

### piranhadb (Layer 3, live: Railway)
### piranhadb (Layer 3, offline)

Read-only corpus API at `api.piranha.bawbel.io`. Serves AVE records with schema
negotiation, the per-record mitigation endpoint, and (post-backfill) posture queries.
The hosted API at `api.piranha.bawbel.io` is offline: the host does not resolve. AVE
records are served by `api.aveproject.org/records`. As built, it was a read-only corpus
API with schema negotiation, a per-record mitigation endpoint, and posture queries.

- **Consumes:** ave repo on deploy (CI publishes validated records).
- **Produces:** `GET /records`, `GET /records/{id}/mitigation`, `?schema=`,
Expand All @@ -239,7 +250,7 @@ trifecta-minimal: no private-data tools, no egress tools.
### vscode-bawbel (Layer 2 edge, live: v1.1.1, Marketplace)

IDE surface. Inline diagnostics from scanner findings while editing agent code and
MCP configs; each diagnostic links to its AVE record on ave.bawbel.io.
MCP configs; each diagnostic links to its AVE record.

- **Consumes:** bawbel-scanner output (local invocation).
- **Produces:** editor diagnostics, quick links, quick-fix hints where a stanza
Expand Down Expand Up @@ -267,22 +278,28 @@ entries are signed; `harden` and `learn synthesize` consume them as baselines.
- **Interface:** HTTPS + sigstore-style verification (open design question: signing
identity, see DESIGN.md 12).

### bawbel-hub (Layer 5a, DESIGN.md 14 complete, M7 next, first paid tier)
### bawbel-hub (Layer 5a, DESIGN.md 14 complete, M7 partial, first paid tier)

Self-hosted fleet console for one team or org: 5-50 gates, one console. Every
developer's gate pushes its audit chain to the hub over mTLS; the hub replays it into
fleet state and serves the posture view, per-developer drill-down, and the CISO
report fleet-wide. No command channel: the hub cannot decide approvals, cannot reach
into a gate, and cannot push configuration. bawbel-gate (including its own embedded
developer's gate is specified to push its audit chain to the hub over mTLS; the hub
replays it into fleet state and serves the posture view, per-developer drill-down, and
the CISO report fleet-wide. No command channel: the hub cannot decide approvals, cannot
reach into a gate, and cannot push configuration. bawbel-gate (including its own embedded
console, 13.1) stays free and fully standalone; the hub is the paid line, drawn at
"more than one gate."

- **Consumes:** gate audit chains (push, mTLS); manifest repo (read, for drift
cross-check).
- **Consumes:** gate audit chains (push over mTLS, specified; gates do not send yet);
manifest repo (read, for drift cross-check).
- **Produces:** fleet posture, per-gate config-drift flags, fleet-wide CISO posture
report.
- **Interface:** ingest protocol 13.2 (same protocol the M6 stub server proves);
enrollment via single-use token, gate identity via per-gate mTLS client cert.
enrollment via single-use token (implemented); gate identity via per-gate mTLS client
cert (specified, not implemented).
- **Status:** implemented on the hub side: ingest with per-session chain verification,
SQLite fleet state, single-use enrollment tokens, `GET /v1/fleet/state`. Not
implemented: the gate-side sender, per-gate identity (ingest authenticates with the
hub's shared admin token, and `gate_id` comes from the request path), TLS, and
enrollment token expiry.

### bawbel platform (Layer 5b, planned)

Expand Down
2 changes: 1 addition & 1 deletion CODE_OF_CONDUCT.md
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ is officially representing the project in public spaces.
## Enforcement

Instances of abusive, harassing, or otherwise unacceptable behavior may be
reported to **security@bawbel.io**. All complaints will be reviewed and
reported to **bawbel.io@gmail.com**. All complaints will be reviewed and
investigated promptly and fairly.

The maintainer is obligated to respect the privacy and security of the reporter
Expand Down
5 changes: 3 additions & 2 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -150,9 +150,10 @@ Do not open a public issue or PR that demonstrates a security bypass. See
## Scope boundaries with other Bawbel repos

- Changes to the AVE record schema or the capability-manifest schema itself:
propose in the `ave` repository, since bawbel-gate is a consumer of that
propose in [aveproject/ave](https://github.com/aveproject/ave), an independent
project (aveproject.org@gmail.com), since bawbel-gate is a consumer of that
schema, not its owner (see ARCHITECTURE.md §4.3, interface freeze points).
- Detection rule changes: `bawbel-scanner`.
- Detection rule changes: [bawbel/scanner](https://github.com/bawbel/scanner).
- Fleet console / multi-gate features: DESIGN.md §14 (bawbel-hub) describes the
boundary between what ships free in the gate's embedded console and what is
hub-only; check there before adding fleet-shaped functionality to this repo.
Expand Down
Loading
Loading