Skip to content

Commit a2e945d

Browse files
committed
Remove em dashes and emojis across SDK
- Replace all em dashes with double hyphens - Remove emojis from release_notes.md
1 parent 1c7d58b commit a2e945d

7 files changed

Lines changed: 22 additions & 22 deletions

File tree

CHANGELOG.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
# Changelog
22

3-
## 0.0.20 Real-Client MITM Validation
3+
## 0.0.20 -- Real-Client MITM Validation
44

55
**Release date:** 2026-03-14
66

77
This release marks the transition from "structurally validated" to "live MITM validated." The HTTPS interception path has been proven end-to-end with real HTTP clients through a trusted local CA.
88

9-
### HTTPS MITM Now Real-Client Validated
9+
### HTTPS MITM -- Now Real-Client Validated
1010

1111
- Validated with **curl**, **requests**, and **httpx** using a trusted local CA
1212
- 24 MITM live-validation tests covering: clean forward, blocked request, untrusted CA failure, secret in URL/header/body, binary passthrough, gzip body scanning, large body forwarding

release_notes.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
1-
#### **🚀 What's New?**
1+
#### **What's New**
22
* **Verified Distribution:** Switched to OIDC (OpenID Connect) Trusted Publishing. Users can now verify the provenance of the package directly from our GitHub source.
33
* **Project Metadata:** Added official links for documentation and issue tracking to improve developer support.
44
* **Version Sync:** Standardized versioning across the SDK and PyPI.
55

6-
#### **🔒 Security Improvements**
6+
#### **Security Improvements**
77
* **CI/CD Hardening:** Automated the release pipeline via GitHub Actions to ensure build integrity.
88
* **Dependency Audit:** Verified `pyyaml` and `rich` requirements for the core scanner engine.
99

10-
#### **🛠 How to Update**
10+
#### **How to Update**
1111
`pip install --upgrade quanttape`

src/quanttape/proxy/README.md

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# QuantTape Guard Proxy Module Technical Reference
1+
# QuantTape Guard -- Proxy Module Technical Reference
22

33
## Overview
44

@@ -82,7 +82,7 @@ When `cryptography` is not installed or cert generation fails:
8282
Client ◀──TCP──▶ _blind_tunnel() ◀──TCP──▶ Upstream
8383
```
8484

85-
Bidirectional byte relay with no inspection. Data passes through unmodified. This is the graceful degradation path Guard still runs but HTTPS content is opaque.
85+
Bidirectional byte relay with no inspection. Data passes through unmodified. This is the graceful degradation path -- Guard still runs but HTTPS content is opaque.
8686

8787
---
8888

@@ -97,7 +97,7 @@ scan_request(url, headers, body, rules=None, mode="agent") -> List[Finding]
9797

9898
**How it differs from the scanner:**
9999
- No AST parsing (HTTP payloads aren't Python source)
100-
- No file I/O operates on in-memory strings
100+
- No file I/O -- operates on in-memory strings
101101
- Scans URL, each header value, and each body line independently
102102
- Same regex patterns + Shannon entropy (threshold: 4.5, min length: 20 chars)
103103
- Sources are tagged as `url`, `header:{name}`, or `body:L{n}`
@@ -137,9 +137,9 @@ scan_request(url, headers, body, rules=None, mode="agent") -> List[Finding]
137137
```
138138

139139
**Stats tracking (in-memory):**
140-
- `requests_scanned` total requests evaluated
141-
- `requests_blocked` requests denied
142-
- `rules_triggered` total individual rule hits
140+
- `requests_scanned` -- total requests evaluated
141+
- `requests_blocked` -- requests denied
142+
- `rules_triggered` -- total individual rule hits
143143

144144
---
145145

@@ -189,8 +189,8 @@ The user must explicitly trust the CA cert. `quanttape setup-certs` prints platf
189189
- Minimal dependency footprint: only `httpx` for HTTP forwarding, `cryptography` for certs
190190

191191
**Key classes:**
192-
- `GuardConfig` dataclass: port, host, mode, config_path, no_verify
193-
- `GuardProxy` main proxy handler with connection routing
192+
- `GuardConfig` -- dataclass: port, host, mode, config_path, no_verify
193+
- `GuardProxy` -- main proxy handler with connection routing
194194

195195
**Methods:**
196196
| Method | Role |
@@ -216,8 +216,8 @@ Modes filter which rules are active:
216216

217217
| Mode | Categories loaded | Use case |
218218
|---|---|---|
219-
| `agent` | `credential` | AI agent egress catches secrets, skips trading logic |
220-
| `trading` | `credential`, `broker`, `trading_logic` | Trading bot egress full broker key + logic checks |
219+
| `agent` | `credential` | AI agent egress -- catches secrets, skips trading logic |
220+
| `trading` | `credential`, `broker`, `trading_logic` | Trading bot egress -- full broker key + logic checks |
221221
| `all` | Everything | No filter, all rules active |
222222

223223
Mode filtering happens in `rules.get_rules_for_mode()`. The bridge calls this when no explicit rule list is provided.
@@ -242,7 +242,7 @@ Mode filtering happens in `rules.get_rules_for_mode()`. The bridge calls this wh
242242
- Rules are compiled once per `scan_request()` call, not per line
243243
- Entropy check only runs on tokens >= 20 chars matching `[A-Za-z0-9/+=_-]{20,}`
244244
- HTTP forwarding uses httpx async client with connection pooling
245-
- Per-host certs are cached to disk only generated once per hostname
245+
- Per-host certs are cached to disk -- only generated once per hostname
246246
- No disk I/O in the hot path (scan is pure in-memory regex)
247247
- **Measured latency (localhost, httpx client, 20 iterations per scenario):**
248248

src/quanttape/proxy/server.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@ async def _read_body(reader, content_length: int, headers: dict) -> tuple:
106106
return b"", None
107107

108108
if not _is_text_content(headers):
109-
return body_bytes, None # binary content skip scanning
109+
return body_bytes, None # binary content -- skip scanning
110110

111111
body_text = _decode_body(body_bytes, headers)
112112
return body_bytes, body_text
@@ -325,7 +325,7 @@ async def _handle_connect(self, reader, writer, target):
325325
server_ctx.load_cert_chain(host_cert_path, host_key_path)
326326

327327
# Upgrade the existing client connection to TLS using start_tls.
328-
# Reuse the existing protocol/reader start_tls reconnects them
328+
# Reuse the existing protocol/reader -- start_tls reconnects them
329329
# to the new TLS transport automatically. This approach works
330330
# correctly on both Windows (ProactorEventLoop) and Unix.
331331
loop = asyncio.get_event_loop()

tests/benchmark_proxy.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
"""QuantTape Guard Proxy Benchmark Harness.
1+
"""QuantTape Guard -- Proxy Benchmark Harness.
22
33
Measures latency overhead across dimensions:
44
- Protocol: HTTP vs HTTPS (MITM)
@@ -305,7 +305,7 @@ async def cleanup():
305305

306306
# ── Report ────────────────────────────────────────────────────
307307
print("\n" + "=" * 90)
308-
print(" QUANTTAPE GUARD BENCHMARK REPORT")
308+
print(" QUANTTAPE GUARD -- BENCHMARK REPORT")
309309
print("=" * 90)
310310

311311
print(f"\n Baseline (direct HTTP, no proxy): "

tests/test_mitm_live.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -690,7 +690,7 @@ def print_matrix():
690690
return
691691

692692
print("\n" + "=" * 80)
693-
print(" QUANTTAPE GUARD REAL-CLIENT MITM VALIDATION MATRIX")
693+
print(" QUANTTAPE GUARD -- REAL-CLIENT MITM VALIDATION MATRIX")
694694
print("=" * 80)
695695

696696
clients = {}

tests/test_proxy_e2e.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -252,7 +252,7 @@ def test_binary_content_passes_through(self):
252252
body=binary_body,
253253
)
254254
)
255-
# Should forward successfully (200 from upstream) not blocked
255+
# Should forward successfully (200 from upstream) -- not blocked
256256
self.assertEqual(status, 200)
257257

258258
def test_gzip_body_scanned(self):

0 commit comments

Comments
 (0)