Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
15 changes: 15 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,21 @@
All notable changes to Sunglasses are documented here.


## [0.2.62] — 2026-06-06

### Added (V2 SHIP #8 — discovery_file_poisoning continued + FP credibility fix)

- **25 new patterns** — `GLS-DFP-026` through `GLS-DFP-050` (continued expansion of the `discovery_file_poisoning` category). These patterns extend coverage of agent-policy poisoning in discovery and convention files (`robots.txt`, `llms.txt`, `sitemap.xml`, `security.txt`, `.well-known/` manifests, and feed carriers) with hardened regexes that require real poison/authority-injection signal — eliminating false positives on legitimate discovery files. Pattern count: 981 → **1,006**. Keywords: 6,946 → **7,171**. Categories: 64 (unchanged).
- **FP credibility fix:** tightened all `discovery_file_poisoning` patterns to require affirmative injection evidence rather than file-presence alone. Clean `robots.txt`, `llms.txt`, `security.txt`, and `sitemap.xml` now pass cleanly; poisoned variants still block. Clean-corpus gate: 46 → **0** false positives (general clean-text corpus from the prior PR #50 fix).
- **New blogs:**
- [Discovery File Poisoning and Runtime Trust: What robots.txt Can't Actually Do](https://sunglasses.dev/blog/discovery-file-poisoning-runtime-trust)
- [Discovery File Poisoning, Security Metadata, and Runtime Trust](https://sunglasses.dev/blog/discovery-file-poisoning-security-metadata-runtime-trust)

### Context

The `discovery_file_poisoning` category ships in two waves: GLS-DFP-001..025 (v0.2.61) established the category; GLS-DFP-026..050 (v0.2.62) harden detection precision and eliminate scanner false positives on normal discovery files — a credibility prerequisite for the category's launch blog.


## [0.2.61] — 2026-06-06

### Added (V2 SHIP #7 — discovery_file_poisoning)
Expand Down
10 changes: 5 additions & 5 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -139,8 +139,8 @@ result = scanner.scan_auto("any_file.ext")
|--------|-------|
| Average text scan | <1ms (avg 0.26ms on M3 Max, single-threaded) |
| Throughput | ~3,800 scans/sec (single-threaded, M3 Max) |
| Patterns | 981 |
| Keywords | 6,946 |
| Patterns | 1006 |
| Keywords | 7,171 |
| Languages | 23 |
| Attack categories | 64 |
| Normalization techniques | 17 |
Expand All @@ -151,15 +151,15 @@ result = scanner.scan_auto("any_file.ext")
| Core dependencies | Zero for text scan; optional deps for media |
| Platforms | Mac, Windows, Linux — anywhere Python runs |

_All performance numbers verified against `stats/current.json` (v0.2.61, updated Jun 6, 2026). Measured on Apple M3 Max, 48GB RAM, single-threaded Python 3.11. Your hardware will differ._
_All performance numbers verified against `stats/current.json` (v0.2.62, updated Jun 6, 2026). Measured on Apple M3 Max, 48GB RAM, single-threaded Python 3.11. Your hardware will differ._

## 23 Languages

English, Spanish, Portuguese, French, German, Italian, Dutch, Russian, Ukrainian, Polish, Czech, Turkish, Azerbaijani, Arabic, Hebrew, Persian, Chinese, Japanese, Korean, Hindi, Bengali, Indonesian, Vietnamese — plus normalization handles romanization, Unicode confusables, and 17 other obfuscation techniques. Community language contributions welcome.

## What Works Today (v0.2.61)
## What Works Today (v0.2.62)

- ✅ Text scanning: 981 patterns, 6,946 keywords, 23 languages, 64 attack categories
- ✅ Text scanning: 1006 patterns, 7,171 keywords, 23 languages, 64 attack categories
- ✅ Negation handling: "do NOT run rm -rf" correctly downgrades severity
- ✅ Multi-stage pipeline: normalization (17 techniques) → pattern match → decision
- ✅ Image scanning: OCR + EXIF metadata + hidden text detection (requires Tesseract)
Expand Down
2 changes: 1 addition & 1 deletion setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

setup(
name="sunglasses",
version="0.2.61",
version="0.2.62",
description="Sunglasses for AI agents. Protection layer + neighborhood watch.",
long_description=open("README.md").read(),
long_description_content_type="text/markdown",
Expand Down
10 changes: 5 additions & 5 deletions stats/current.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"version": "0.2.61",
"patterns": 981,
"keywords": 6946,
"version": "0.2.62",
"patterns": 1006,
"keywords": 7171,
"categories": 64,
"languages": 23,
"normalization_techniques": 17,
Expand All @@ -16,8 +16,8 @@
"media_types": 6,
"reports_published": 3,
"team_size": 5,
"last_updated": "2026-06-06T00:20:00-07:00",
"last_updated_by": "boss-direct-ship-v0.2.61",
"last_updated": "2026-06-06T22:59:14-0:700",
"last_updated_by": "sunglasses-publish-sh",
"_note": "THIS IS THE SINGLE SOURCE OF TRUTH. All pages, JSON-LD, meta tags, llms.txt, and sitemap must read from this file. Do NOT hardcode numbers anywhere else.",
"released": "2026-06-06"
}
2 changes: 1 addition & 1 deletion sunglasses/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,4 +4,4 @@
#
# "Don't let your agents get fooled."

__version__ = "0.2.61"
__version__ = "0.2.62"
Loading
Loading