Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
79 commits
Select commit Hold shift + click to select a range
ca091a6
QA: agent-middleware examples/mcp-client/
PetrefiedThunder Oct 8, 2026
bd20cc6
deps(py): update fastapi requirement in /gateway (#4)
dependabot[bot] Oct 10, 2026
3f99d5f
fix(ci): pin pydantic<2.14 and scope gitleaks to HEAD to restore gree…
PetrefiedThunder Oct 10, 2026
0c4737e
deps(py): update uvicorn requirement in /gateway (#5)
dependabot[bot] Oct 11, 2026
e003d6f
deps(py): update pyjwt requirement from >=2.15.0 to >=2.15.1 in /gate…
dependabot[bot] Oct 11, 2026
b6b8800
deps(py): update python-dotenv requirement in /gateway (#9)
dependabot[bot] Oct 11, 2026
0208e46
deps(py): update mypy requirement from >=2.3.1 to >=2.4.0 in /gateway…
dependabot[bot] Oct 11, 2026
80f785e
deps(py): update stripe requirement in /gateway (#8)
dependabot[bot] Oct 11, 2026
9e7bd50
deps(npm): bump @types/node from 22.20.5 to 26.6.4 in /sdk/typescript…
dependabot[bot] Oct 11, 2026
0ce3b26
ci(gitleaks): allowlist 16 reviewed test-fixture/idempotency-key find…
PetrefiedThunder Oct 17, 2026
72b2ec5
deps(py): update mcp requirement in /sdk/python (#94)
dependabot[bot] Oct 17, 2026
c5f9f37
[audit-high] Fix gateway auth 500 on odd keys and expiry race in key …
PetrefiedThunder Oct 17, 2026
36538cc
[audit-high] Failure lab fail-closed breaks: verifier counts, observa…
PetrefiedThunder Oct 17, 2026
89ec934
[audit-low] Default CORS is wildcard (#41)
PetrefiedThunder Oct 17, 2026
12bbc59
[qa] Money services QA: negative sponsor seed fix plus 72 gap tests (…
PetrefiedThunder Oct 17, 2026
5e4f0ba
[audit-high] Block private addresses the URL guard treated as public …
PetrefiedThunder Oct 17, 2026
d9588f4
[qa] Gateway: money-route auth and cross-wallet test matrix (#16)
PetrefiedThunder Oct 17, 2026
071559e
[audit-low] Close existence probing via uniform 404 error shapes (#42)
PetrefiedThunder Oct 17, 2026
4e53baf
[qa] Deep QA for gateway core and db: 134 new tests plus 4 small fixe…
PetrefiedThunder Oct 17, 2026
8e276fe
[qa] TypeScript receipt verifier: tests plus five small parity fixes …
PetrefiedThunder Oct 17, 2026
7a70bcb
[qa] Spec examples validated against schemas and gateway emissions (#52)
PetrefiedThunder Oct 17, 2026
d02b256
[audit-high] Honest money copy and one shared Stripe webhook check (#76)
PetrefiedThunder Oct 17, 2026
7f640ed
[audit-high] Fix SDK demo risks: localhost default URL, sync client, …
PetrefiedThunder Oct 17, 2026
a64e7ab
ci: bump the actions group with 5 updates (#88)
dependabot[bot] Oct 17, 2026
25f99ff
deps(py): update sqlmodel requirement in /gateway (#89)
dependabot[bot] Oct 17, 2026
cd8053d
deps(py): update asyncpg requirement in /gateway (#91)
dependabot[bot] Oct 17, 2026
88648f9
deps(py): update fastapi requirement in /gateway (#92)
dependabot[bot] Oct 17, 2026
139639c
[qa] Offline receipt verifier rejects tampering, TS key-length fix (#55)
PetrefiedThunder Oct 18, 2026
7008910
[audit-high] CrewAI tool dropped call fields and receipt ids (#67)
PetrefiedThunder Oct 18, 2026
bb61656
[audit-high] Fix buyer-facing examples: install path, golden demo, sa…
PetrefiedThunder Oct 18, 2026
86292c9
deps(py): update pydantic requirement from <2.14,>=2.13.5 to >=2.14.1…
dependabot[bot] Oct 18, 2026
3727cc4
[audit-high] Prove Postgres race tests in CI and pin test posture gap…
PetrefiedThunder Oct 18, 2026
24eefe6
[audit-high] Gateway: enforce policy risk-tier ceiling and fail close…
PetrefiedThunder Oct 18, 2026
c1e1dd9
Gateway refuses to boot without all trust tables (#17)
PetrefiedThunder Oct 18, 2026
e1abe47
[audit-high] Receipt test vectors miss revoked keys and lying envelop…
PetrefiedThunder Oct 18, 2026
c5264a7
chore: gitleaks-ignore Ed25519PrivateKey annotations in vector genera…
PetrefiedThunder Oct 18, 2026
19f0c2f
[audit-medium] Gateway: pin validated IP for sandbox and browser fetc…
PetrefiedThunder Oct 18, 2026
9213456
[audit-high] Gateway: Bind x402 settlements to the permit recipient (…
PetrefiedThunder Oct 18, 2026
1bd3d37
fix(ci): scope generic-api-key off test paths in gitleaks (line-scope…
PetrefiedThunder Oct 18, 2026
0b34f9e
[audit-high] SDK sent unsafe headers and trusted mismatched receipts …
PetrefiedThunder Oct 18, 2026
9432588
QA: agent-middleware spec/ (#21)
PetrefiedThunder Oct 18, 2026
611fdf3
[audit-high] Tampered receipt algorithm was called unsupported (#22)
PetrefiedThunder Oct 19, 2026
c0743e4
SEL-295: Refresh burns the old token before checks/insert of the succ…
PetrefiedThunder Oct 19, 2026
f504861
[audit-low] Gateway low audit fixes, CORS default, opaque blob refs, …
PetrefiedThunder Oct 19, 2026
700501d
SEL-283: `framework_integrations` install line points at a requiremen…
PetrefiedThunder Oct 19, 2026
89cbb13
[foundation] Run the skipped Postgres proofs in CI and fail loudly on…
PetrefiedThunder Oct 19, 2026
248b23b
SEL-293: Idempotent replay of a permit request fails once its expiry …
PetrefiedThunder Oct 19, 2026
b9fee07
SEL-273: Gateway runtime deps live only in requirements.txt; pyprojec…
PetrefiedThunder Oct 19, 2026
da85539
SEL-272: Type-checker version unpinned while the linter is pinned (#130)
PetrefiedThunder Oct 19, 2026
1370606
SEL-274: TypeScript SDK: no lint/build scripts; exports points at .ts…
PetrefiedThunder Oct 19, 2026
374ceec
SEL-278: require_scope wrapper mis-typed, hidden by ignore (#132)
PetrefiedThunder Oct 19, 2026
cecf39e
SEL-277: _UnimplementedBlob overrides drop all parameter annotations …
PetrefiedThunder Oct 19, 2026
227e0dd
SEL-279: AuthContext.scopes typed non-Optional but defaults to None (…
PetrefiedThunder Oct 19, 2026
21a3279
SEL-284: Documented SDK build command does not build this package (#136)
PetrefiedThunder Oct 19, 2026
a2d4db3
SEL-281: No lint/type hooks in pre-commit; CI gates run only on Pytho…
PetrefiedThunder Oct 19, 2026
d2d1b97
SEL-288: Python verifier vectors are outside CI coverage (#141)
PetrefiedThunder Oct 19, 2026
63c1a55
SEL-296: `b2a-verify-receipt` exits with the "tampered" code (1) when…
PetrefiedThunder Oct 19, 2026
dfd94b3
Fix gateway mypy hook environment (#150)
PetrefiedThunder Oct 19, 2026
d433680
SEL-294: Re-revoking a permit or API key overwrites the original revo…
PetrefiedThunder Oct 19, 2026
7372d14
[audit-high] operator docs pointed at missing key rotation and revoca…
PetrefiedThunder Oct 19, 2026
6e7a70a
[foundation] Money and permit services enforce caller ownership thems…
PetrefiedThunder Oct 19, 2026
24f25f0
Break AMW gateway policy and governance (#37)
PetrefiedThunder Oct 19, 2026
9b76cce
Break AMW gateway middleware (#35)
PetrefiedThunder Oct 19, 2026
c1bbd0d
Break AMW gateway MCP standard routes (#34)
PetrefiedThunder Oct 19, 2026
6f51d23
Break AMW gateway billing and wallets (#30)
PetrefiedThunder Oct 19, 2026
dc41290
SEL-286: Gateway images omit `b2a_sdk`, so app import crashes (#127)
PetrefiedThunder Oct 19, 2026
6e09e06
SEL-276: Published Python SDK is never type-checked; default mypy fin…
PetrefiedThunder Oct 19, 2026
823f217
[audit-high] Gateway receipts accept bad outcomes and charged denials…
PetrefiedThunder Oct 19, 2026
2548bbb
SEL-280: Money/ledger models excluded from type checking (#139)
PetrefiedThunder Oct 19, 2026
d146973
SEL-292: Ordinary test cleanup can erase an inherited database (#147)
PetrefiedThunder Oct 19, 2026
8f14dc0
SEL-287: MCP extra's `serve` command does not match the pinned FastMC…
PetrefiedThunder Oct 19, 2026
027837c
fix: preserve ownership denial replay response (#151)
PetrefiedThunder Oct 19, 2026
c932f45
[foundation] Fail-closed shared webhook signature checks for all inbo…
PetrefiedThunder Oct 19, 2026
31487ea
ci: add trust release gate as non-required CI job (SEL-290) (#148)
PetrefiedThunder Oct 19, 2026
d51399b
[audit-high] SDK accepts forged receipts, bad checkouts, and injected…
PetrefiedThunder Oct 19, 2026
836b4a9
examples: verify successful MCP retry before reporting receipts
PetrefiedThunder Oct 19, 2026
991ee6f
examples: retain original PR 56 ancestry on current main
PetrefiedThunder Oct 19, 2026
f835cea
test: reject receipt copies without an outcome
PetrefiedThunder Oct 19, 2026
67f4592
Preserve wire MCP receipt metadata in retry example
PetrefiedThunder Oct 19, 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
74 changes: 74 additions & 0 deletions .dockerignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
# Image builds use the repository root as the context. See gateway/Dockerfile.
.git
.github
.agents
**/.agents
.claude
**/.claude
.envrc
**/.envrc
.vercel
**/.vercel
.railway
**/.railway
.venv
**/.venv
.venv-local
**/.venv-local
venv
**/venv
env
**/env
node_modules
**/node_modules
.aws
**/.aws
.ssh
**/.ssh
.netrc
**/.netrc
.npmrc
**/.npmrc
.pypirc
**/.pypirc
.pytest_cache
**/.pytest_cache
.ruff_cache
**/.ruff_cache
__pycache__
**/__pycache__
*.py[cod]
**/*.py[cod]
*.pyo
**/*.pyo
*.pyd
**/*.pyd
.env
**/.env
.env.*
**/.env.*
*.db
**/*.db
*.db-wal
**/*.db-wal
*.db-shm
**/*.db-shm
*.log
**/*.log
*.pem
**/*.pem
*.key
**/*.key
railway.json
**/railway.json
railway.toml
**/railway.toml
gateway/tests
gateway/data
gateway/docker-compose.yml
gateway/docker-compose.prod.yml
sdk/typescript
integrations
examples
spec
verifier
96 changes: 96 additions & 0 deletions .github/scripts/smoke_gateway_image.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
#!/usr/bin/env bash
# Build both gateway images and import the modules needed at app startup.
set -euo pipefail

if [[ -e .build_commit_sha || -L .build_commit_sha ]]; then
echo '.build_commit_sha already exists; refusing to replace it' >&2
exit 1
fi

canary_paths=(
gateway/data/quickstart/signing-seed.b64
.amw-image-smoke.db-wal
gateway/.amw-image-smoke.db-shm
gateway/.amw-image-smoke.log
gateway/.amw-image-smoke.pem
gateway/.agents/amw-image-smoke.txt
gateway/.claude/amw-image-smoke.txt
gateway/.envrc
sdk/python/.amw-image-smoke.key
)
for path in "${canary_paths[@]}"; do
if [[ -e "$path" || -L "$path" ]]; then
echo "Canary path already exists: $path" >&2
exit 1
fi
done

created_dirs=()
created_files=()
stamp_created=false
cleanup() {
if [[ "$stamp_created" == true ]]; then rm -f .build_commit_sha; fi
for path in "${created_files[@]}"; do rm -f "$path"; done
for ((i=${#created_dirs[@]}-1; i>=0; i--)); do
rmdir "${created_dirs[i]}" 2>/dev/null || true
done
}
trap cleanup EXIT

for dir in gateway/data gateway/data/quickstart gateway/.agents gateway/.claude; do
if [[ -L "$dir" ]]; then
echo "Canary parent is a symlink: $dir" >&2
exit 1
fi
if [[ ! -d "$dir" ]]; then
mkdir "$dir"
created_dirs+=("$dir")
fi
done
for path in "${canary_paths[@]}"; do
printf 'synthetic image context canary\n' > "$path"
created_files+=("$path")
done

# A named COPY of an ignored canary must fail before creating any layer.
for path in "${canary_paths[@]}"; do
if printf 'FROM scratch\nCOPY %s /probe/\n' "$path" | docker build -f - . >/dev/null 2>&1; then
echo "Docker context unexpectedly includes $path" >&2
exit 1
fi
done

image_canaries=(
/app/data/quickstart/signing-seed.b64
/app/.amw-image-smoke.db-shm
/app/.amw-image-smoke.log
/app/.amw-image-smoke.pem
/app/.agents/amw-image-smoke.txt
/app/.claude/amw-image-smoke.txt
/app/.envrc
/sdk/python/.amw-image-smoke.key
)
stamp="$(git rev-parse HEAD)"
printf '%s\n' "$stamp" > .build_commit_sha
stamp_created=true

docker build -f gateway/Dockerfile -t amw-gateway:ci-release .
docker run --rm --network none --read-only --entrypoint python amw-gateway:ci-release -c '
import sys
from pathlib import Path
import app.main
import b2a_sdk.receipt_verifier
assert Path("/app/.build_commit_sha").read_text().strip() == sys.argv[1]
assert all(not Path(path).exists() for path in sys.argv[2:])
' "$stamp" "${image_canaries[@]}"

rm .build_commit_sha
docker build -f gateway/Dockerfile.dev -t amw-gateway:ci-dev .
docker run --rm --network none --read-only --entrypoint python amw-gateway:ci-dev -c '
import sys
from pathlib import Path
import app.main
import b2a_sdk.receipt_verifier
assert not Path("/app/.build_commit_sha").exists()
assert all(not Path(path).exists() for path in sys.argv[1:])
' "${image_canaries[@]}"
Loading
Loading