Not in the top 1,000 by GitHub stars
bpawnzZ/lemonwrench
A skill for AI coding Agents; Free OEM service manuals -> procedure, torque table, labelled figures. 69 makes, 1960-2025. Agent skill + stdlib navigator.
History
Review weekly changes to SKILL.md before updating. Dates mark the weeks in which we observed each version; checks apply to the recorded commits.
View weekly changes
SKILL.md
Week of Nov 2, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 39e0e4a73e5e
No earlier version was observed for comparison.
Heat
1.5- Star growth, last 7 daysNot available
- Star growth, last 24 hoursNot available
- Rank movement, last 7 daysNot available
- Commits, last 30 daysNot available
- Accounts asking about it through MCP, last 7 daysNot available
- Hot votes this weekNot available
Heat never changes the order by stars, and sponsorship never touches it. How heat works
Stars over time
30-day change not yet available: not enough history.
Individual skills in this repository
How it works
lemonwrench
When your agent uses it
Use when looking up car repair procedures, torque specs, diagrams or service-manual steps. Scrapes free OEM manuals by vehicle, resolves the exact trim/engine, and cross-checks parts catalogs and field sources.
What it loads into context
Frontmatter
127 tokensAlways available to the agent
SKILL.md
4,700 tokensWhen the skill is activated
Reference documents
15,635 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- The three-source rule
- The tool
- Workflow
- Figures
- Beyond the manual
- User photos of the car
- Orientation: engine frame vs car frame
- Answering rules
- Deliverable
- Gotchas
- Verify
Scripts executed separately
examples/fetch-figures.shscripts/lemon.py
Files
.github/workflows/ci.ymlasset509 bytes.gitignoreasset45 bytesAGENT.mddoc4,150 bytesLICENSEasset1,081 bytesREADME.mddoc8,698 bytesSKILL.mdcore18,274 bytesSKILL.mdcore18,274 bytesSKILL.mdcore18,274 bytesSKILL.mdcore18,274 bytesSKILL.mdcore18,274 bytesSKILL.mdcore18,274 bytesSKILL.mdcore18,274 bytesexamples/2007-pontiac-g6-3.9l-valve-cover-gaskets.mddoc18,408 bytesexamples/2011-dodge-nitro-3.7l-drive-belt.mddoc12,695 bytesexamples/fetch-figures.shruns591 bytesexamples/figures/GC0085898.jpgasset18,533 bytesexamples/figures/GC0085899.jpgasset16,171 bytesexamples/figures/GC0086435.jpgasset21,499 bytesexamples/figures/GC0127923.jpgasset20,001 bytesexamples/figures/GM1239042.pngasset14,785 bytesexamples/figures/GM1239046.pngasset14,876 bytesexamples/figures/GM1239067.pngasset21,355 bytesexamples/figures/GM1556824.pngasset12,380 bytesexamples/figures/GM1557668.pngasset15,762 bytesexamples/figures/GM1557694.pngasset9,442 bytesexamples/figures/GM1582009.pngasset7,668 bytesexamples/figures/GM1582011.pngasset18,005 bytesexamples/figures/GM1582012.pngasset11,269 bytesexamples/figures/GM1582091.pngasset10,247 bytesexamples/figures/GM1584086.pngasset15,298 bytesexamples/figures/GM1584684.pngasset21,901 bytesexamples/figures/GM1584686.pngasset15,273 bytesexamples/figures/GM1584688.pngasset16,140 bytesexamples/figures/GM1587660.pngasset14,458 bytesexamples/figures/GM1608911.pngasset17,792 bytesexamples/figures/GM1774493.pngasset36,198 bytesexamples/figures/GM1776914.pngasset52,579 bytesexamples/figures/GM190588.pngasset8,636 bytesopenspec/changes/archive/.gitkeepasset0 bytesopenspec/changes/archive/2026-10-29-robust-transport-fallback/design.mddoc2,227 bytesopenspec/changes/archive/2026-10-29-robust-transport-fallback/proposal.mddoc2,101 bytesopenspec/changes/archive/2026-10-29-robust-transport-fallback/specs/transport/spec.mddoc2,065 bytesopenspec/changes/archive/2026-10-29-robust-transport-fallback/tasks.mddoc1,156 bytesopenspec/config.yamlasset998 bytesopenspec/specs/.gitkeepasset0 bytesopenspec/specs/transport/spec.mddoc2,165 bytesreferences/repair-writeup.mddoc4,314 bytesscripts/lemon.pyruns25,660 bytes
Read SKILL.md
# LemonWrench — automotive repair research
Turns "how do I replace X on <car>" into a **procedure, a torque table, and labelled
figures** — then cross-checks it against a parts catalog and real-world field notes
so you don't chase a step the manual left out.
Primary source: **https://lemon-manuals.la** — ~10,000 US/Canada vehicles across **69 makes, 1960–2025**, free, no login. Domestic, import, orphan brands (Pontiac, Oldsmobile, Saturn, Saab, AMC, Geo, Mercury, Suzuki), Euro exotics, trucks/commercial, and modern EVs (Tesla 2012→, Rivian 2022→). Years run deep, not just recent: Toyota and Ford carry 66 straight model years. Real HTML text (torque tables, capacities, step-by-step), figures at `/images25/`. Not scanned PDFs.
Two databases per model year:
| DB | Source | Use it for |
|---|---|---|
| **LEMON** | 2025 capture | 2010+, current TSBs, complete trees, figure captions |
| **CHARM** | 2013 DVDs | 1990s–2000s, finer detail, trees truncated at depth |View the complete source on GitHubSkills included
- lemonwrench
Repository facts
- License
- MIT
- Created
- Oct 19, 2026
- Last pushed
- Oct 29, 2026
- Forks
- 0
- Open issues
- 0
- Project activity
- Active
Before you install
Network or broad shellAutomated signals, not a guarantee
Checked Nov 6, 2026
Not fully analyzed: some files were too long, unreadable or missing. This never lowers the level.
Show 6 notes
SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedSKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedSKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedSKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedSKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedSKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzed
- No broad tool permissions
- 1 dangerous shell commandin 1 file: AGENT.md:65
- 123 network referencesin 8 files: scripts/lemon.py:25 SKILL.md:20 README.md:7 and 5 more
- No hidden or obfuscated text
- No instruction overrides
- 2 executable scriptsin 2 files: examples/fetch-figures.sh:1 scripts/lemon.py:1
- 6 references to secretsin 1 file: scripts/lemon.py:25
- No requests to vote in Hot
Show all 132 signals by file
AGENT.md
- Network accessline 64
# failover still works: pin a dead host, expect a real page back (~45-90 s) rm -f ~/.cache/lemon/hosts.json LEMON_BASE=https://lemon-manuals.invalid LEMON_NOCACHE=1 python3 scripts/lemon.py get \ - Dangerous shell operationline 65
rm -f ~/.cache/lemon/hosts.json - Network accessline 65
rm -f ~/.cache/lemon/hosts.json LEMON_BASE=https://lemon-manuals.invalid LEMON_NOCACHE=1 python3 scripts/lemon.py get \ "/Pontiac/2007/G6%20V6-3.5L/Repair%20and%20Diagnosis/Starting%20and%20Charging/Charging%20System/Alternator/Service%20 - Network accessline 66
LEMON_BASE=https://lemon-manuals.invalid LEMON_NOCACHE=1 python3 scripts/lemon.py get \
README.md
- Network accessline 7
Named for [lemon-manuals.la](https://lemon-manuals.la), the source it scrapes: ~10,000 US/Canada vehicles, 1960–2025, free, no login. Two databases per year — a 2025 capture (`LEMON`) for modern cars and 2013 DVD dumps (`CHARM`) for 90s/200 - Network accessline 17
$ python3 scripts/lemon.py torque "Pontiac/2007/G6 V6-3.9L" valve cover -p 1 ## Valve Rocker Arm Cover Replacement - Left Side https://lemon-manuals.la/Pontiac/2007/G6%20V6-3.9L/.../Valve%20Rocker%20Arm%20Cover%20Replacement%20-%20Left%20Si - Network accessline 18
## Valve Rocker Arm Cover Replacement - Left Side https://lemon-manuals.la/Pontiac/2007/G6%20V6-3.9L/.../Valve%20Rocker%20Arm%20Cover%20Replacement%20-%20Left%20Side/ Tighten the bolts to 10 N.m (89 lb in). - Network accessline 19
https://lemon-manuals.la/Pontiac/2007/G6%20V6-3.9L/.../Valve%20Rocker%20Arm%20Cover%20Replacement%20-%20Left%20Side/ - Network accessline 66
git clone https://github.com/bpawnzZ/lemonwrench.git ~/.myagent/skills/lemonwrench - Network accessline 88
python3 scripts/lemon.py find "Chevrolet/2007/Impala V6-3.9L" generator bracket # local grep python3 scripts/lemon.py sub "https://lemon-manuals.la/.../Alternator/" # reveal children - Network accessline 89
python3 scripts/lemon.py sub "https://lemon-manuals.la/.../Alternator/" # reveal children - Network accessline 90
python3 scripts/lemon.py get "https://lemon-manuals.la/.../Service%20and%20Repair/" - Network accessline 100
python3 scripts/lemon.py pic https://lemon-manuals.la/images25/GM1557668/ - Network accessline 101
python3 scripts/lemon.py note https://lemon-manuals.la/images25/GM1557668/ "right rocker cover: 6-bolt ring, coil bracket above, MAP connector"
SKILL.md
- Network accessline 20
Primary source: **https://lemon-manuals.la** — ~10,000 US/Canada vehicles across **69 makes, 1960–2025**, free, no login. Domestic, import, orphan brands (Pontiac, Oldsmobile, Saturn, Saab, AMC, Geo, Mercury, Suzuki), Euro exotics, trucks/c - Network accessline 91
`read`/`get` emit `[FIGURE https://lemon-manuals.la/images25/XXXX/]` lines, with a - Network accessline 95
python3 $S pic https://lemon-manuals.la/images25/GM1557668/ # -> ~/.cache/lemon/img/GM1557668.png - Network accessline 97
python3 $S note https://lemon-manuals.la/images25/GM1557668/ "right rocker cover, bolt ring, coil bracket above" - Network accessline 250
- URLs are case-sensitive and the make spelling is the site's (`Dodge and Ram`, `Mercedes Benz`); `canon_make` handles it, manual curl does not. - Network accessline 251
`Mercedes Benz`); `canon_make` handles it, manual curl does not. - Network accessline 260
- Mirrors: `charm.li` (Operation CHARM — separate host *and* corpus, tried second), then `lemon-manuals.org.ua`, `lemon-manuals.gy`, `lemon.dogeware.me`. The script fails over automatically on a timeout, 404 or 429/5xx; `LEMON_BASE=http - Network accessline 261
then `lemon-manuals.org.ua`, `lemon-manuals.gy`, `lemon.dogeware.me`. The script fails over automatically on a timeout, 404 or 429/5xx; `LEMON_BASE=https://…` puts one host first without disabling the rest. - Network accessline 262
fails over automatically on a timeout, 404 or 429/5xx; `LEMON_BASE=https://…` puts - Network accessline 264
- **A reply that isn't a page is a failed host, not an answer.** 404 bodies and Cloudflare challenge pages become `NotFound`/`Blocked` inside `_get()`, are skipped per host, and are never written to the page cache. `fetch()` only return - Network accessline 265
Cloudflare challenge pages become `NotFound`/`Blocked` inside `_get()`, are skipped per host, and are never written to the page cache. `fetch()` only returns the `Page Not Found` sentinel when *every* host 404s — before 2.2 the first ho - Network accessline 266
per host, and are never written to the page cache. `fetch()` only returns the - Network accessline 273
before a host loses its turn, so a slow host that keeps sending bytes is never cut off. - If every host errors, `fetch()` tries an Internet Archive snapshot - Network accessline 274
off. - If every host errors, `fetch()` tries an Internet Archive snapshot (`archive.org/wayback/available`, fetched with the `if_` modifier). archive.org - Network accessline 275
- If every host errors, `fetch()` tries an Internet Archive snapshot - Network accessline 281
path and no 2010+ manuals — a 404 from it is normal and costs one round trip. When `index` is crawling at a few KB/s, don't wait it out: `get` the charm.li tree (`http://charm.li/<Make>/<Year>/<Vehicle>/Repair and Diagnosis/`, ~2.9 MB i - Network accessline 282
When `index` is crawling at a few KB/s, don't wait it out: `get` the charm.li tree (`http://charm.li/<Make>/<Year>/<Vehicle>/Repair and Diagnosis/`, ~2.9 MB in seconds) and grep it locally, then fetch only the winning pages by their abs - Network accessline 283
(`http://charm.li/<Make>/<Year>/<Vehicle>/Repair and Diagnosis/`, ~2.9 MB in seconds) and grep it locally, then fetch only the winning pages by their absolute URLs.
examples/fetch-figures.sh
- Executable scriptline 1
#!/usr/bin/env bash - Network accessline 11
| sed 's|figures/||' | sort -u | while read -r file; do id="${file%.*}" path=$(python3 "$LEMON" pic "https://lemon-manuals.la/images25/$id/" | tail -1) - Network accessline 12
id="${file%.*}" path=$(python3 "$LEMON" pic "https://lemon-manuals.la/images25/$id/" | tail -1) cp "$path" "figures/$file" - Network accessline 13
path=$(python3 "$LEMON" pic "https://lemon-manuals.la/images25/$id/" | tail -1)
openspec/changes/archive/2026-10-29-robust-transport-fallback/design.md
- Network accessline 5
Every request in the script already goes through `fetch()`, and every URL is - Network accessline 28
cached for 7 days. Both now raise inside `_get()`, are skipped per host, and are never written to the page cache. Callers that already test for `Page Not Found` in the body keep working: `fetch()` returns that sentinel only - Network accessline 29
never written to the page cache. Callers that already test for `Page Not Found` in the body keep working: `fetch()` returns that sentinel only when every host 404s. - Network accessline 30
`Page Not Found` in the body keep working: `fetch()` returns that sentinel only
openspec/changes/archive/2026-10-29-robust-transport-fallback/proposal.md
openspec/changes/archive/2026-10-29-robust-transport-fallback/tasks.md
- Network accessline 5
- [x] 1.1 Add `http://charm.li` to the mirror list. - Network accessline 8
- [x] 1.3 Raise on 404 and on Cloudflare challenge bodies inside `_get()`; treat both as "this host is no use for this page". - [x] 1.4 `fetch()`: only return the `Page Not Found` sentinel when **every** - Network accessline 9
both as "this host is no use for this page". - [x] 1.4 `fetch()`: only return the `Page Not Found` sentinel when **every** host 404s; never cache a 404 or a challenge page. - Network accessline 10
- [x] 1.4 `fetch()`: only return the `Page Not Found` sentinel when **every**
scripts/lemon.py
- Executable scriptline 1
#!/usr/bin/env python3 - Network accessline 25
[Credential-related source omitted] - Access to secretsline 25
[Credential-related source omitted] - Network accessline 26
MIRRORS = ["https://lemon-manuals.la", - Network accessline 27
"http://charm.li", # Operation CHARM: separate host + corpus - Network accessline 28
"https://lemon-manuals.org.ua", "https://lemon-manuals.gy", - Network accessline 29
"https://lemon.dogeware.me"] - Access to secretsline 33
[Credential-related source omitted] - Access to secretsline 34
[Credential-related source omitted] - Network accessline 37
HOSTS = os.path.join(CACHE, "hosts.json") # sticky host + cooldowns DOWN_FOR = 900 # a failed host sorts last for 15 min WAYBACK = "https://archive.org/wayback/available?url=" - Network accessline 38
DOWN_FOR = 900 # a failed host sorts last for 15 min WAYBACK = "https://archive.org/wayback/available?url=" CHALLENGE = "cdn-cgi/challenge-platform" # Cloudflare JS wall, not a page - Network accessline 39
WAYBACK = "https://archive.org/wayback/available?url=" - Access to secretsline 42
[Credential-related source omitted] - Access to secretsline 91
[Credential-related source omitted] - Network accessline 121
def _get(url, timeout): req = urllib.request.Request(url, headers={"User-Agent": UA}) - Network accessline 122
req = urllib.request.Request(url, headers={"User-Agent": UA}) - Network accessline 123
try: with urllib.request.urlopen(req, timeout=timeout, context=_ctx()) as r: body = r.read().decode("utf-8", "replace") - Network accessline 124
with urllib.request.urlopen(req, timeout=timeout, context=_ctx()) as r: - Network accessline 164
try: q = urllib.request.Request(WAYBACK + urllib.parse.quote(url, safe=""), - Network accessline 165
q = urllib.request.Request(WAYBACK + urllib.parse.quote(url, safe=""), - Network accessline 166
headers={"User-Agent": UA}) with urllib.request.urlopen(q, timeout=30, context=_ctx()) as r: snap = json.load(r).get("archived_snapshots", {}).get("closest") or {} - Network accessline 167
with urllib.request.urlopen(q, timeout=30, context=_ctx()) as r: - Network accessline 169
if snap.get("status") != "200" or not snap.get("url"): return None with urllib.request.urlopen( - Network accessline 170
return None with urllib.request.urlopen( urllib.request.Request(_if_raw(snap["url"]), headers={"User-Agent": UA}), - Network accessline 171
with urllib.request.urlopen( - Network accessline 172
urllib.request.Request(_if_raw(snap["url"]), headers={"User-Agent": UA}), - Network accessline 179
def fetch(url, timeout=None, nocache=False): - Network accessline 235
names = open(path, encoding="utf-8").read().split("\n") else: body = fetch(BASE + "/") - Network accessline 236
else: body = fetch(BASE + "/") names = [urllib.parse.unquote(u[len(BASE) + 1:].strip("/")) - Network accessline 237
body = fetch(BASE + "/") - Network accessline 310
v + "Repair%20and%20Diagnosis/"): try: body = fetch(BASE + urllib.parse.quote(cand, safe="/%"), nocache=refresh) - Network accessline 311
try: body = fetch(BASE + urllib.parse.quote(cand, safe="/%"), nocache=refresh) except Exception: - Network accessline 312
body = fetch(BASE + urllib.parse.quote(cand, safe="/%"), nocache=refresh) - Network accessline 322
try: lt = BASE + v + "Labor%20Times/" body = fetch(lt, nocache=refresh) - Network accessline 323
lt = BASE + v + "Labor%20Times/" body = fetch(lt, nocache=refresh) if "Page Not Found" not in body[:600] and "Labor times are only available" not in body: - Network accessline 324
body = fetch(lt, nocache=refresh) - Network accessline 369
def render(url, body=None): body = body if body is not None else fetch(url) - Network accessline 370
body = body if body is not None else fetch(url) - Network accessline 388
body = fetch(url) - Network accessline 470
continue seen.add(label) body = fetch(url) - Network accessline 471
seen.add(label) body = fetch(url) lines, target = torque_lines(text_of(body)), (url, label) - Network accessline 472
body = fetch(url) - Network accessline 474
for sub_url, sub_label in ([] if lines else sublinks(url, body)[:4]): if not lines: lines, target = (torque_lines(text_of(fetch(sub_url))), - Network accessline 475
if not lines: lines, target = (torque_lines(text_of(fetch(sub_url))), (sub_url, sub_label)) - Network accessline 476
lines, target = (torque_lines(text_of(fetch(sub_url))), - Network accessline 492
'<li><a href="X/">X</a></li><img alt="a" src="/images25/A/">' '<img src="/icons/wrench.svg">') assert imgs_of(h) == ["https://lemon-manuals.la/images25/A/"] - Network accessline 493
'<img src="/icons/wrench.svg">') assert imgs_of(h) == ["https://lemon-manuals.la/images25/A/"] assert "LEMON Manuals" not in text_of(h) and "X" in text_of(h) - Network accessline 494
assert imgs_of(h) == ["https://lemon-manuals.la/images25/A/"] - Network accessline 496
assert score("Torque Specifications", "/v/x/Torque/", ["torque"], 1) is not None assert score("Torque", "/v/x/Y/", ["brake"], 1) is None assert _swap_base("https://lemon-manuals.la/v/x/", "https://lemon.dogeware.me") \ - Network accessline 497
assert score("Torque", "/v/x/Y/", ["brake"], 1) is None assert _swap_base("https://lemon-manuals.la/v/x/", "https://lemon.dogeware.me") \ == "https://lemon.dogeware.me/v/x/" - Network accessline 498
assert _swap_base("https://lemon-manuals.la/v/x/", "https://lemon.dogeware.me") \ - Network accessline 499
== "https://lemon.dogeware.me/v/x/" - Network accessline 501
assert "http://charm.li" in _bases() - Network accessline 502
assert _swap_base("http://charm.li/v/x/", "https://lemon-manuals.la") \ - Network accessline 503
== "https://lemon-manuals.la/v/x/" - Network accessline 504
assert _ours("http://charm.li/v/x/") - Network accessline 510
global _ST _ST = {"prefer": "http://charm.li", "down": {"https://lemon-manuals.la": time.time() + 60}} - Network accessline 511
_ST = {"prefer": "http://charm.li", "down": {"https://lemon-manuals.la": time.time() + 60}} - Network accessline 512
[Credential-related source omitted] - Access to secretsline 512
[Credential-related source omitted] - Network accessline 513
b = _bases() assert b[0] == "http://charm.li" and b[-1] == "https://lemon-manuals.la", b _ST = {} - Network accessline 514
assert b[0] == "http://charm.li" and b[-1] == "https://lemon-manuals.la", b - Network accessline 515
_ST = {} assert "http://charm.li" in imgs_of('<img src="/images/X/1/">', "http://charm.li/p/")[0] assert _if_raw("http://web.archive.org/web/20190101/https://x/y/") \ - Network accessline 516
assert "http://charm.li" in imgs_of('<img src="/images/X/1/">', "http://charm.li/p/")[0] - Network accessline 517
assert _if_raw("http://web.archive.org/web/20190101/https://x/y/") \ - Network accessline 518
== "http://web.archive.org/web/20190101/if_/https://x/y/" - Network accessline 519
assert _if_raw("http://web.archive.org/web/20190101/http://x/y/") \ - Network accessline 520
== "http://web.archive.org/web/20190101/if_/http://x/y/" - Network accessline 525
assert len(torque_lines(t)) == 2, torque_lines(t) assert torque_lines("no numbers here at all") == [] b = "https://lemon-manuals.la/v/x/" - Network accessline 526
assert torque_lines("no numbers here at all") == [] b = "https://lemon-manuals.la/v/x/" assert [u for u, _ in sublinks(b, '<a href="y/">Y</a><a href="/v/x/">self</a>')] == [b + "y/"] - Network accessline 527
b = "https://lemon-manuals.la/v/x/" - Network accessline 541
elif cmd == "years": make = urllib.parse.quote(canon_make(args[0]), safe="/%") for u, label in links(BASE + f"/{make}/", fetch(BASE + f"/{make}/")): - Network accessline 542
make = urllib.parse.quote(canon_make(args[0]), safe="/%") for u, label in links(BASE + f"/{make}/", fetch(BASE + f"/{make}/")): if re.fullmatch(r"\d{4}", label): - Network accessline 543
for u, label in links(BASE + f"/{make}/", fetch(BASE + f"/{make}/")): - Network accessline 548
pat = re.compile(args[2], re.I) if len(args) > 2 else None url = BASE + f"/{make}/{year}/" body = fetch(url) - Network accessline 550
body = fetch(url) - Network accessline 607
print(render(args[0])) elif cmd == "sub": body = fetch(args[0]) - Network accessline 608
elif cmd == "sub": body = fetch(args[0]) for u, l in sublinks(args[0], body): - Network accessline 609
body = fetch(args[0]) - Network accessline 611
print(f"{u}\t{l}") elif cmd == "imgs": print("\n".join(imgs_of(fetch(args[0]), args[0]))) - Network accessline 612
elif cmd == "imgs": print("\n".join(imgs_of(fetch(args[0]), args[0]))) elif cmd == "pic": - Network accessline 613
print("\n".join(imgs_of(fetch(args[0]), args[0]))) - Network accessline 615
u = args[0] os.makedirs(IMG_DIR, exist_ok=True) req = urllib.request.Request(u, headers={"User-Agent": UA}) - Network accessline 616
os.makedirs(IMG_DIR, exist_ok=True) req = urllib.request.Request(u, headers={"User-Agent": UA}) with urllib.request.urlopen(req, timeout=120, context=_ctx()) as r: - Network accessline 617
req = urllib.request.Request(u, headers={"User-Agent": UA}) - Network accessline 618
with urllib.request.urlopen(req, timeout=120, context=_ctx()) as r:
How the signals fit together
Facts from a static read of the files at the pinned commit. They describe what the code does, not why.
Signal confidence: 132 facts
- Network access in code of documentationAGENT.md:64Low confidence
- Dangerous shell operation in code of documentationAGENT.md:65Low confidence
- Network access in code of documentationAGENT.md:65Low confidence
- Network access in code of documentationAGENT.md:66Low confidence
- Network access in prose of documentationREADME.md:7Low confidence
- Network access in code of documentationREADME.md:17Low confidence
- Network access in code of documentationREADME.md:18Low confidence
- Network access in code of documentationREADME.md:19Low confidence
- Network access in code of documentationREADME.md:66Low confidence
- Network access in code of documentationREADME.md:88Low confidence
- Network access in code of documentationREADME.md:89Low confidence
- Network access in code of documentationREADME.md:90Low confidence
- Network access in code of documentationREADME.md:100Low confidence
- Network access in code of documentationREADME.md:101Low confidence
- Network access in prose of the SKILL.mdSKILL.md:20Low confidence
- Network access in prose of the SKILL.mdSKILL.md:91Low confidence
- Network access in code of the SKILL.mdSKILL.md:95High confidence
- Network access in code of the SKILL.mdSKILL.md:97High confidence
- Network access in prose of the SKILL.mdSKILL.md:250Low confidence
- Network access in prose of the SKILL.mdSKILL.md:251Low confidence
- Network access in prose of the SKILL.mdSKILL.md:260Low confidence
- Network access in prose of the SKILL.mdSKILL.md:261Low confidence
- Network access in prose of the SKILL.mdSKILL.md:262Low confidence
- Network access in prose of the SKILL.mdSKILL.md:264Low confidence
- Network access in prose of the SKILL.mdSKILL.md:265Low confidence
- Network access in prose of the SKILL.mdSKILL.md:266Low confidence
- Network access in prose of the SKILL.mdSKILL.md:273Low confidence
- Network access in prose of the SKILL.mdSKILL.md:274Low confidence
- Network access in prose of the SKILL.mdSKILL.md:275Low confidence
- Network access in prose of the SKILL.mdSKILL.md:281Low confidence
- Network access in prose of the SKILL.mdSKILL.md:282Low confidence
- Network access in prose of the SKILL.mdSKILL.md:283Low confidence
- Executable script in code of a file that runsexamples/fetch-figures.sh:1High confidence
- Network access in code of a file that runsexamples/fetch-figures.sh:11High confidence
- Network access in code of a file that runsexamples/fetch-figures.sh:12High confidence
- Network access in code of a file that runsexamples/fetch-figures.sh:13High confidence
- Network access in prose of documentationopenspec/changes/archive/2026-10-29-robust-transport-fallback/design.md:5Low confidence
- Network access in prose of documentationopenspec/changes/archive/2026-10-29-robust-transport-fallback/design.md:28Low confidence
- Network access in prose of documentationopenspec/changes/archive/2026-10-29-robust-transport-fallback/design.md:29Low confidence
- Network access in prose of documentationopenspec/changes/archive/2026-10-29-robust-transport-fallback/design.md:30Low confidence
- Network access in prose of documentationopenspec/changes/archive/2026-10-29-robust-transport-fallback/proposal.md:5Low confidence
- Network access in prose of documentationopenspec/changes/archive/2026-10-29-robust-transport-fallback/proposal.md:24Low confidence
- Network access in prose of documentationopenspec/changes/archive/2026-10-29-robust-transport-fallback/tasks.md:5Low confidence
- Network access in prose of documentationopenspec/changes/archive/2026-10-29-robust-transport-fallback/tasks.md:8Low confidence
- Network access in prose of documentationopenspec/changes/archive/2026-10-29-robust-transport-fallback/tasks.md:9Low confidence
- Network access in prose of documentationopenspec/changes/archive/2026-10-29-robust-transport-fallback/tasks.md:10Low confidence
- Executable script in code of a file that runsscripts/lemon.py:1High confidence
- Network access in code of a file that runsscripts/lemon.py:25High confidence
- Access to secrets in code of a file that runs: a variable, placeholder or call, not a stored valuescripts/lemon.py:25Low confidence
- Network access in code of a file that runsscripts/lemon.py:26High confidence
and 82 more
Works with
| Agent | Status | Evidence | Install to |
|---|---|---|---|
| Claude Code | Compatible | Standard SKILL.md SKILL.md | .claude/skills/<skill-name>/ |
| Codex | Compatible | Standard SKILL.md SKILL.md | .agents/skills/<skill-name>/ |
| Cursor | Compatible | Standard SKILL.md SKILL.md | .cursor/skills/<skill-name>/ |
| Gemini CLI | Compatible | Standard SKILL.md SKILL.md | .gemini/skills/<skill-name>/ |
| GitHub Copilot | Compatible | Standard SKILL.md SKILL.md | .github/skills/<skill-name>/ |
| OpenCode | Compatible | Standard SKILL.md SKILL.md | .opencode/skills/<skill-name>/ |
- Native The repository ships a manifest, folder or frontmatter field for this agent.
- Compatible A standard SKILL.md that this agent can read.
- Unknown No evidence either way.
Derived automatically from paths, manifests and frontmatter. Not tested on each agent.