opencode-skills-collection 4.0.48 → 4.0.49

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (60) hide show
  1. package/bundled-skills/.antigravity-install-manifest.json +11 -1
  2. package/bundled-skills/agent-qa-authoring/SKILL.md +3 -1
  3. package/bundled-skills/agy-delegate/SKILL.md +1 -1
  4. package/bundled-skills/aider-delegate/SKILL.md +1 -1
  5. package/bundled-skills/api-rate-limit-handler/SKILL.md +1 -1
  6. package/bundled-skills/atlas-cloud-media/SKILL.md +52 -18
  7. package/bundled-skills/babysit-pr/SKILL.md +1 -1
  8. package/bundled-skills/boost-asio-pro/references/pre-cpp20.md +8 -1
  9. package/bundled-skills/check-identity-pack/SKILL.md +88 -0
  10. package/bundled-skills/claude-delegate/SKILL.md +1 -1
  11. package/bundled-skills/cline-delegate/SKILL.md +1 -1
  12. package/bundled-skills/codex-delegate/SKILL.md +1 -1
  13. package/bundled-skills/commandcode-delegate/SKILL.md +1 -1
  14. package/bundled-skills/copilot-delegate/SKILL.md +1 -1
  15. package/bundled-skills/cursor-delegate/SKILL.md +1 -1
  16. package/bundled-skills/detect-ai-text/SKILL.md +91 -0
  17. package/bundled-skills/docs/integrations/jetski-cortex.md +3 -3
  18. package/bundled-skills/docs/integrations/jetski-gemini-loader/README.md +1 -1
  19. package/bundled-skills/docs/maintainers/repo-growth-seo.md +1 -1
  20. package/bundled-skills/docs/maintainers/skills-update-guide.md +1 -1
  21. package/bundled-skills/docs/users/aas-core.md +1 -1
  22. package/bundled-skills/docs/users/bundles.md +1 -1
  23. package/bundled-skills/docs/users/claude-code-skills.md +1 -1
  24. package/bundled-skills/docs/users/gemini-cli-skills.md +1 -1
  25. package/bundled-skills/docs/users/kiro-integration.md +1 -1
  26. package/bundled-skills/docs/users/usage.md +3 -3
  27. package/bundled-skills/docs/users/visual-guide.md +4 -4
  28. package/bundled-skills/extract-document-data/SKILL.md +99 -0
  29. package/bundled-skills/find-matching-tenders/SKILL.md +100 -0
  30. package/bundled-skills/grok-delegate/SKILL.md +1 -1
  31. package/bundled-skills/inngest/SKILL.md +2 -0
  32. package/bundled-skills/kimi-delegate/SKILL.md +1 -1
  33. package/bundled-skills/liuguang-banlan-ui/SKILL.md +6 -4
  34. package/bundled-skills/liuguang-banlan-ui/scripts/manifest_parser.py +178 -0
  35. package/bundled-skills/liuguang-banlan-ui/scripts/measure_preview.py +14 -17
  36. package/bundled-skills/liuguang-banlan-ui/scripts/validate_manifest.py +12 -16
  37. package/bundled-skills/lovable-cleanup/SKILL.md +32 -6
  38. package/bundled-skills/lovable-cleanup/references/favicon-vercel-cleanup.md +106 -0
  39. package/bundled-skills/lovable-cleanup/scripts/write-transparent-favicon.js +88 -0
  40. package/bundled-skills/multi-source-search/scripts/validate_report.py +5 -0
  41. package/bundled-skills/omp-delegate/SKILL.md +1 -1
  42. package/bundled-skills/opencode-delegate/SKILL.md +1 -1
  43. package/bundled-skills/pentest-tools/references/pentest-ai-agents-matrix.md +8 -5
  44. package/bundled-skills/pi-delegate/SKILL.md +1 -1
  45. package/bundled-skills/prompt-caching/SKILL.md +3 -1
  46. package/bundled-skills/qoder-delegate/SKILL.md +1 -1
  47. package/bundled-skills/screen-adverse-media/SKILL.md +100 -0
  48. package/bundled-skills/slideops/SKILL.md +201 -0
  49. package/bundled-skills/trigger-dev/SKILL.md +2 -0
  50. package/bundled-skills/unsloth-finetuning/SKILL.md +45 -2
  51. package/bundled-skills/upstash-qstash/SKILL.md +1 -1
  52. package/bundled-skills/upstash-ratelimit/SKILL.md +186 -0
  53. package/bundled-skills/upstash-redis/SKILL.md +156 -0
  54. package/bundled-skills/verify-citations/SKILL.md +88 -0
  55. package/bundled-skills/verify-document/SKILL.md +94 -0
  56. package/bundled-skills/vibe-delegate/SKILL.md +1 -1
  57. package/bundled-skills/warp-delegate/SKILL.md +1 -1
  58. package/bundled-skills/zcode-delegate/SKILL.md +1 -1
  59. package/package.json +1 -1
  60. package/skills_index.json +347 -21
@@ -1,13 +1,15 @@
1
1
  ---
2
2
  name: lovable-cleanup
3
- description: "Audits and strips Lovable scaffolding from Vite + React projects — removes lovable-tagger, swaps placeholder assets, prunes unused Radix deps, and cleans generated docs so the codebase ships as yours."
3
+ description: "Audits and strips Lovable scaffolding from Vite + React projects — removes lovable-tagger, swaps placeholder assets, prunes unused Radix deps, cleans generated docs, and neutralizes stale favicon/CDN caching so the codebase ships as yours."
4
4
  risk: safe
5
5
  source: community
6
6
  source_repo: whoisabhishekadhikari/lovable-cleanup
7
7
  source_type: community
8
8
  author: whoisabhishekadhikari
9
9
  date_added: "2026-06-13"
10
- tags: [lovable, cleanup, vite, react, shadcn, devtools]
10
+ date_updated: "2026-08-31"
11
+ version: "2.0.0"
12
+ tags: [lovable, cleanup, vite, react, shadcn, devtools, vercel, favicon]
11
13
  tools: [claude, cursor, codex, antigravity, gemini-cli]
12
14
  ---
13
15
 
@@ -23,7 +25,7 @@ tools: [claude, cursor, codex, antigravity, gemini-cli]
23
25
  Lovable (lovable.dev) bootstraps Vite + React + shadcn/ui projects with its own tagger
24
26
  dependency, branding, placeholder assets, and generated markdown docs baked in. Most
25
27
  developers export from Lovable and want a clean, ownable codebase before shipping or
26
- open-sourcing. This skill covers all 14 areas where Lovable leaves fingerprints.
28
+ open-sourcing. This skill covers all 15 areas where Lovable leaves fingerprints.
27
29
 
28
30
  ---
29
31
 
@@ -75,6 +77,8 @@ shadcn components via the `asChild` prop.
75
77
  6. Environment & Git (Areas 9 & 12) — security sweep
76
78
  7. SEO / deploy (Area 11) — usually a no-op; confirm and move on
77
79
  8. Unused deps (Area 13) — safe to defer until after ship if on a deadline
80
+ 9. Favicon / CDN cache (Area 15) — do ASAP after assets are swapped; browser
81
+ or CDN caching can keep the old icon visible, so verify the live response
78
82
 
79
83
  ---
80
84
 
@@ -137,7 +141,7 @@ Replace these files (keep filenames, swap content):
137
141
 
138
142
  | File | Action |
139
143
  |---|---|
140
- | `favicon.ico` | Replace with real icon |
144
+ | `favicon.ico` | Overwrite with real icon — do NOT just delete, see Area 15 |
141
145
  | `favicon.png` | Replace with real icon |
142
146
  | `og-image.png` / `logo.png` | Replace with real brand assets |
143
147
  | `placeholder.svg` | Usually unused — safe to delete |
@@ -292,6 +296,17 @@ grep -in "lovable" components.json eslint.config.js
292
296
 
293
297
  ---
294
298
 
299
+ ### Area 15 · Favicon removal & stale CDN caches (Vercel)
300
+
301
+ Lovable ships a default `favicon.ico` that browsers auto-request from site root
302
+ and that can remain visible after cleanup through browser or CDN caching. Handle
303
+ the four steps — replace the path, link all icon flavours, keep unversioned icon
304
+ URLs revalidatable, and verify after deploy — then purge the confirmed Vercel
305
+ project cache only if the live response stays stale. Full commands/JSON live in
306
+ [references/favicon-vercel-cleanup.md](references/favicon-vercel-cleanup.md).
307
+
308
+ ---
309
+
295
310
  ## Master Scan Command
296
311
 
297
312
  <!-- security-allowlist: recursive grep across project directory, read-only, no network -->
@@ -342,6 +357,9 @@ Agent:
342
357
  - ✅ **Do:** Run dep removal (Areas 2 & 7) before touching source files
343
358
  - ✅ **Do:** Skim Lovable-generated docs before deleting — may contain useful arch notes
344
359
  - ✅ **Do:** Verify `npm run build` passes after every batch of changes
360
+ - ✅ **Do:** Replace favicons at the existing paths (Area 15), then verify the
361
+ live response and purge only the confirmed project if it remains stale
362
+ - ✅ **Do:** Deploy replacement favicon content and cache headers in the same commit
345
363
  - ✅ **Do:** Replace OG image before launch — it directly affects social sharing previews
346
364
  - ❌ **Don't:** Remove `@radix-ui/react-slot` — it's an indirect dep of most shadcn components
347
365
  - ❌ **Don't:** Leave empty env vars like `LOVABLE_PROJECT_ID=` — delete the whole line
@@ -350,8 +368,8 @@ Agent:
350
368
 
351
369
  ## Limitations
352
370
 
353
- - This skill does not create or source brand assets (favicons, OG images) it only flags
354
- what needs replacing. The user must supply real assets.
371
+ - This skill does not create or source real brand assets (favicons, OG images). Area 15
372
+ generates a transparent placeholder ICO only — the user must supply genuine artwork.
355
373
  - Dep pruning (Area 13) is safe but not foolproof — some Radix packages are indirect deps
356
374
  not caught by a direct `grep`. Always verify with `npm run build`.
357
375
  - The skill does not modify `components.json` aliases automatically — it only scans and
@@ -380,6 +398,14 @@ the `from '@radix-ui/...'` import to find which component depends on it.
380
398
  **Solution:** Check for a `<Helmet>` or `<Head>` component in `src/App.tsx` or a layout
381
399
  wrapper — React-level title tags override `index.html` at runtime.
382
400
 
401
+ ### Problem: Old favicon still serving after deletion (Vercel)
402
+
403
+ **Symptoms:** `curl -sI https://<domain>/favicon.ico` returns the old ETag with
404
+ `x-vercel-cache: HIT` after the replacement deployment.
405
+ **Solution:** Overwrite `public/favicon.ico` with replacement content (a transparent
406
+ 1×1 ICO if no real asset yet), verify the custom domain, then use the explicit
407
+ Vercel CDN purge only if the response remains stale — see Area 15.
408
+
383
409
  ---
384
410
 
385
411
  ## Related Skills
@@ -0,0 +1,106 @@
1
+ # Favicon removal & stale CDN caches (Vercel)
2
+
3
+ Lovable ships a default `favicon.ico`, and browsers auto-request it from site
4
+ root even when `index.html` links a different icon. Browser and CDN layers can
5
+ therefore keep showing the old icon after a replacement deployment. Treat the
6
+ cleanup as both a file-path and cache-verification problem.
7
+
8
+ ## 1 · Overwrite in place, don't delete
9
+
10
+ Prefer replacing the same path in the deployment instead of deleting it. The
11
+ production URL then keeps returning a valid icon while the new bytes establish
12
+ a new content identity; browsers that request `/favicon.ico` implicitly do not
13
+ fall back to an old cached asset merely because the HTML link changed.
14
+
15
+ If no real brand icon is ready, use the bundled helper to write a valid
16
+ transparent 1×1 ICO. It resolves the physical project root, rejects a symlinked
17
+ `public/` directory or favicon target, writes an exclusive same-directory
18
+ temporary file with no-follow semantics where available, then atomically
19
+ renames it into place.
20
+
21
+ <!-- security-allowlist: writes a 70-byte ICO into the project's public/, local only -->
22
+ ```bash
23
+ node "<skill-dir>/scripts/write-transparent-favicon.js" "$PWD"
24
+ ```
25
+
26
+ ## 2 · Link all icon flavours in `index.html`
27
+
28
+ Browsers may request `/favicon.ico` even without a link, so keep that path and
29
+ the modern/Apple entry points available:
30
+
31
+ ```html
32
+ <link rel="icon" type="image/x-icon" href="/favicon.ico" />
33
+ <link rel="icon" type="image/svg+xml" href="/favicon.svg" />
34
+ <link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png" />
35
+ ```
36
+
37
+ `apple-touch-icon.png` must be a real PNG (recommended 180×180). A solid brand-
38
+ colour square is an acceptable placeholder; flag it for later replacement.
39
+
40
+ ## 3 · Keep unversioned icon URLs revalidatable (`vercel.json`)
41
+
42
+ Vercel documents `public, max-age=0, must-revalidate` as its default response
43
+ policy and recommends long-lived `immutable` caching for content-hashed assets.
44
+ The standard favicon entry points below are not content-hashed, so keep them
45
+ revalidatable unless the HTML points at a versioned filename:
46
+
47
+ - `/favicon.ico`, `/favicon.svg`, `/apple-touch-icon.png` →
48
+ `public, max-age=0, must-revalidate`
49
+ - A content-hashed asset such as `/favicon-a1b2c3.svg` may use
50
+ `public, max-age=31536000, immutable`.
51
+
52
+ ```json
53
+ {
54
+ "headers": [
55
+ {
56
+ "source": "/favicon.ico",
57
+ "headers": [{ "key": "Cache-Control", "value": "public, max-age=0, must-revalidate" }]
58
+ },
59
+ {
60
+ "source": "/favicon.svg",
61
+ "headers": [{ "key": "Cache-Control", "value": "public, max-age=0, must-revalidate" }]
62
+ },
63
+ {
64
+ "source": "/apple-touch-icon.png",
65
+ "headers": [{ "key": "Cache-Control", "value": "public, max-age=0, must-revalidate" }]
66
+ }
67
+ ]
68
+ }
69
+ ```
70
+
71
+ Never mark an unversioned icon URL `immutable`: it tells browsers not to
72
+ revalidate for the max-age lifetime, so a replacement may not propagate for up
73
+ to a year. Use `immutable` only on content-hashed URLs.
74
+
75
+ ## 4 · Verify after deploy
76
+
77
+ <!-- security-allowlist: remote curl header check of own domain, read-only -->
78
+ ```bash
79
+ curl -sI https://YOUR-DOMAIN/favicon.ico \
80
+ | grep -i "cache-control\|etag\|x-vercel-cache"
81
+ ```
82
+
83
+ Expect the replacement ETag and `Cache-Control: public, max-age=0,
84
+ must-revalidate` on the unversioned icon URLs.
85
+
86
+ If the confirmed production domain still serves the old edge response, verify
87
+ the linked Vercel project and team first, ask for explicit approval, then purge
88
+ that project's CDN cache:
89
+
90
+ <!-- security-allowlist: explicit remote cache purge for the confirmed Vercel project; requires user approval -->
91
+ ```bash
92
+ vercel cache purge --type cdn
93
+ ```
94
+
95
+ Re-run the header check after the purge. Do not purge a project inferred only
96
+ from the current directory or a preview URL.
97
+
98
+ **Gotcha — the staging URL:** a `*.vercel.app` preview may be SSO-protected
99
+ (`_vercel_sso_nonce` 302) and wrap deploys in a provider frame that injects
100
+ platform branding. Always verify icons on the real custom domain.
101
+
102
+ ## Official references
103
+
104
+ - [Vercel Cache-Control headers](https://vercel.com/docs/caching/cache-control-headers)
105
+ - [Vercel CDN cache](https://vercel.com/docs/caching/cdn-cache)
106
+ - [Vercel cache purge CLI](https://vercel.com/docs/cli/cache)
@@ -0,0 +1,88 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+
4
+ const crypto = require("node:crypto");
5
+ const fs = require("node:fs");
6
+ const path = require("node:path");
7
+
8
+ function fail(message) {
9
+ throw new Error(`Refusing favicon write: ${message}`);
10
+ }
11
+
12
+ function existingStat(target) {
13
+ try {
14
+ return fs.lstatSync(target);
15
+ } catch (error) {
16
+ if (error && error.code === "ENOENT") return null;
17
+ throw error;
18
+ }
19
+ }
20
+
21
+ function transparentIco() {
22
+ const bytes = Buffer.alloc(6 + 16 + 40 + 8);
23
+ bytes.writeUInt16LE(1, 2);
24
+ bytes.writeUInt16LE(1, 4);
25
+ bytes.writeUInt8(1, 6);
26
+ bytes.writeUInt8(1, 7);
27
+ bytes.writeUInt16LE(1, 10);
28
+ bytes.writeUInt16LE(32, 12);
29
+ bytes.writeUInt32LE(40 + 8, 14);
30
+ bytes.writeUInt32LE(22, 18);
31
+ bytes.writeUInt32LE(40, 22);
32
+ bytes.writeInt32LE(1, 26);
33
+ bytes.writeInt32LE(2, 30);
34
+ bytes.writeUInt16LE(1, 34);
35
+ bytes.writeUInt16LE(32, 36);
36
+ bytes.writeUInt32LE(0, 38);
37
+ bytes.writeUInt32LE(8, 42);
38
+ return bytes;
39
+ }
40
+
41
+ function main() {
42
+ const requestedRoot = path.resolve(process.argv[2] || process.cwd());
43
+ const projectRoot = fs.realpathSync(requestedRoot);
44
+ const publicDirectory = path.join(projectRoot, "public");
45
+ const publicStat = fs.lstatSync(publicDirectory);
46
+ if (publicStat.isSymbolicLink() || !publicStat.isDirectory()) {
47
+ fail("public/ must be a real directory, not a symlink or special file");
48
+ }
49
+ if (fs.realpathSync(publicDirectory) !== publicDirectory) {
50
+ fail("public/ resolves outside the physical project path");
51
+ }
52
+
53
+ const target = path.join(publicDirectory, "favicon.ico");
54
+ const targetStat = existingStat(target);
55
+ if (targetStat && targetStat.isSymbolicLink()) {
56
+ fail("public/favicon.ico is a symbolic link");
57
+ }
58
+ if (targetStat && !targetStat.isFile()) {
59
+ fail("public/favicon.ico is not a regular file");
60
+ }
61
+
62
+ const temporary = path.join(
63
+ publicDirectory,
64
+ `.favicon.ico.${process.pid}.${crypto.randomBytes(8).toString("hex")}.tmp`,
65
+ );
66
+ const flags =
67
+ fs.constants.O_WRONLY |
68
+ fs.constants.O_CREAT |
69
+ fs.constants.O_EXCL |
70
+ (fs.constants.O_NOFOLLOW || 0);
71
+ let descriptor;
72
+ try {
73
+ descriptor = fs.openSync(temporary, flags, 0o600);
74
+ fs.writeFileSync(descriptor, transparentIco());
75
+ fs.fsyncSync(descriptor);
76
+ fs.fchmodSync(descriptor, 0o644);
77
+ fs.closeSync(descriptor);
78
+ descriptor = undefined;
79
+ fs.renameSync(temporary, target);
80
+ } finally {
81
+ if (descriptor !== undefined) fs.closeSync(descriptor);
82
+ const temporaryStat = existingStat(temporary);
83
+ if (temporaryStat && temporaryStat.isFile()) fs.unlinkSync(temporary);
84
+ }
85
+ process.stdout.write(`Wrote ${target}\n`);
86
+ }
87
+
88
+ main();
@@ -21,6 +21,11 @@ def canonical_url(value):
21
21
  """Return a conservative identity for an HTTP(S) URL, or None if invalid."""
22
22
  if not nonempty(value):
23
23
  return None
24
+ if any(
25
+ character.isspace() or ord(character) < 0x20 or ord(character) == 0x7F
26
+ for character in value
27
+ ):
28
+ return None
24
29
  try:
25
30
  parsed = urlsplit(value)
26
31
  hostname = parsed.hostname
@@ -2,7 +2,7 @@
2
2
  name: omp-delegate
3
3
  description: Delegate coding tasks to Oh My Pi (`omp`) only when the user explicitly
4
4
  requests it, while the orchestrator retains review and landing responsibility.
5
- risk: safe
5
+ risk: critical
6
6
  category: agent-orchestration
7
7
  source: https://github.com/amElnagdy/delegate-skills
8
8
  source_repo: amElnagdy/delegate-skills
@@ -2,7 +2,7 @@
2
2
  name: opencode-delegate
3
3
  description: Delegate coding tasks to the OpenCode CLI only when the user explicitly
4
4
  requests it, while the orchestrator retains review and landing responsibility.
5
- risk: safe
5
+ risk: critical
6
6
  category: agent-orchestration
7
7
  source: https://github.com/amElnagdy/delegate-skills
8
8
  source_repo: amElnagdy/delegate-skills
@@ -10,11 +10,14 @@
10
10
 
11
11
  ## 安装方式(外部可选)
12
12
 
13
- ```bash
14
- curl -fsSL https://raw.githubusercontent.com/0xSteph/pentest-ai-agents/main/install.sh | bash # security-allowlist: curl-pipe-bash
15
- ```
16
-
17
- 或者只参考其 prompt 模式,不实际安装。
13
+ 默认只参考其 prompt 模式,不安装外部代码。不得从可变的 `main` 分支
14
+ 下载并直接执行安装脚本,也不得把下载内容通过管道交给 shell。
15
+
16
+ 如果用户明确要求安装,先在仓库页面选择并记录一个完整的 40 位 commit
17
+ SHA,在私有审查目录中下载该 commit 的完整源码,核对仓库身份、许可证、
18
+ 文件清单、安装脚本及其后续下载。只有在展示确切变更和命令并获得单独批准
19
+ 后,才可从已审查的本地副本执行;任一依赖仍指向分支、标签、`latest` 或未审查
20
+ 远程脚本时必须停止。
18
21
 
19
22
  ---
20
23
 
@@ -2,7 +2,7 @@
2
2
  name: pi-delegate
3
3
  description: Delegate coding tasks to the Pi coding agent CLI (`pi`) only when the
4
4
  user explicitly requests it, while the orchestrator retains review and landing responsibility.
5
- risk: safe
5
+ risk: critical
6
6
  category: agent-orchestration
7
7
  source: https://github.com/amElnagdy/delegate-skills
8
8
  source_repo: amElnagdy/delegate-skills
@@ -34,7 +34,7 @@ Caching strategies for LLM prompts including Anthropic prompt caching, response
34
34
  ### Primary_tools
35
35
 
36
36
  - Anthropic Prompt Caching - Native prompt caching in Claude API
37
- - Redis - In-memory cache for responses
37
+ - Redis - In-memory cache for responses (ioredis on servers; @upstash/redis over HTTP on serverless, see `upstash-redis`)
38
38
  - OpenAI Caching - Automatic caching in OpenAI API
39
39
 
40
40
  ## Patterns
@@ -91,6 +91,8 @@ import { createHash } from 'crypto';
91
91
  import Redis from 'ioredis';
92
92
 
93
93
  const redis = new Redis(process.env.REDIS_URL);
94
+ // Serverless/edge alternative without a persistent connection:
95
+ // import { Redis } from '@upstash/redis'; const redis = Redis.fromEnv(); // then use redis.set(key, value, { ex: ttl })
94
96
 
95
97
  class ResponseCache {
96
98
  private ttl = 3600; // 1 hour default
@@ -2,7 +2,7 @@
2
2
  name: qoder-delegate
3
3
  description: Delegate coding tasks to the Qoder CLI (`qodercli`) only when the user
4
4
  explicitly requests it, while the orchestrator retains review and landing responsibility.
5
- risk: safe
5
+ risk: critical
6
6
  category: agent-orchestration
7
7
  source: https://github.com/amElnagdy/delegate-skills
8
8
  source_repo: amElnagdy/delegate-skills
@@ -0,0 +1,100 @@
1
+ ---
2
+ name: screen-adverse-media
3
+ description: Screen a person or organisation for adverse media coverage, PEP status, and sanctions exposure — corroboration-gated, returns "review" never "guilty". Use when the user asks to screen someone before onboarding, partnership, or investment; for AML/CTF flows; or for ongoing counterparty monitoring.
4
+ category: document-verification
5
+ risk: critical
6
+ source: community
7
+ source_repo: Sketchjar/stipple-agent-skills
8
+ source_type: community
9
+ date_added: "2026-08-31"
10
+ author: Sketchjar
11
+ tags: [document-verification, fact-checking, stipple, authenticity]
12
+ tools: [claude, cursor, gemini, codex]
13
+ license: "Apache-2.0"
14
+ license_source: "https://github.com/Sketchjar/stipple-agent-skills/blob/main/LICENSE"
15
+ ---
16
+
17
+ # Screen Adverse Media
18
+
19
+ Screen a person or organisation for adverse media coverage, PEP (Politically Exposed Person) status, and sanctions exposure. Every hit is **corroboration-gated**: the screen returns "review", never "guilty", and "nothing found" is never a clean record. Uses the Stipple API (free anonymous tier).
20
+
21
+ ## When to use
22
+
23
+ - AML/CTF onboarding (Tranche 2 reforms make this mandatory for more Australian businesses)
24
+ - Vendor/supplier due diligence before signing
25
+ - Investor or LP vetting
26
+ - Ongoing counterparty monitoring (re-run periodically, compare warrant IDs)
27
+
28
+ ## Instructions
29
+
30
+ 1. **Get the target.** Name of the person or organisation. For document-based screening, a PDF/image of their ID or company extract can also be submitted.
31
+
32
+ 2. **Run the screen.**
33
+
34
+ Name-based (via MCP — the REST intake is document-based):
35
+ ```bash
36
+ # Via any MCP client pointed at https://www.stipple.sh/mcp:
37
+ # tool: screen_adverse_media
38
+ # args: {"name": "John Citizen", "entity_type": "person"}
39
+ ```
40
+
41
+ Document-based (REST — screens the person/org named in the uploaded document):
42
+ ```bash
43
+ curl -X POST https://www.stipple.sh/v1/adverse-media \
44
+ -F "file=@company-extract.pdf" \
45
+ -H "Authorization: Bearer $STIPPLE_API_KEY"
46
+ ```
47
+
48
+ 3. **Interpret the response.**
49
+
50
+ - `rating` — the overall screening result ("review", "clear", etc.)
51
+ - `hits[]` — adverse media articles: date, title, source, URL, summary
52
+ - `pep[]` — PEP signals (empty = none found)
53
+ - `sanctions[]` — sanctions list signals (empty = none found)
54
+
55
+ 4. **Report with the right framing.** Non-negotiable framing rules:
56
+
57
+ | Finding | Correct framing |
58
+ |---|---|
59
+ | Hits found | "Review recommended — see articles below" (never "guilty") |
60
+ | Nothing found | "No corroborated adverse media found — this is NOT a clean record; coverage is bounded by the source list" |
61
+ | PEP signal | "PEP status identified — enhanced due diligence may apply" |
62
+
63
+ 5. **Contextualize.** Every hit is corroborated across sources before inclusion — but the screen is the start of human review, not the end of it. Date-range and source-coverage limitations are real.
64
+
65
+ ## Output format
66
+
67
+ ```
68
+ screening rating: review
69
+
70
+ adverse media hits:
71
+ - [2025-11-02] Court action over unpaid supplier debts
72
+ source: The Age https://...
73
+ - [2024-06-18] ASIC disqualification
74
+ source: ASIC media releases https://...
75
+
76
+ PEP signals: 0
77
+ sanctions list signals: 0
78
+
79
+ This screen returns "review", never "guilty" — every hit is corroboration-gated.
80
+ ```
81
+
82
+ ## Limitations and Safety
83
+
84
+ - Screening processes personal data and potentially damaging allegations through a
85
+ hosted third party. Confirm a lawful purpose, obtain any required approval, send
86
+ only the minimum identifiers needed, and verify current retention, residency,
87
+ access, and deletion terms before transmission.
88
+ - Name matches, PEP signals, sanctions hits, and media reports can be incomplete,
89
+ stale, misattributed, or false. Corroborate every consequential result with the
90
+ original source and authoritative registers; never publish an allegation as fact.
91
+ - This is not a legal AML/CTF determination. A qualified human reviewer must resolve
92
+ identity ambiguity, document the reasoning, and provide an appropriate correction
93
+ or appeal path before rejecting or restricting a person or organization.
94
+
95
+ ## Notes
96
+
97
+ - Costs 3 credits per screen; free weekly allowance applies
98
+ - For AML flows, pair with `check-identity-pack` (identity) and `verify-document` (document genuineness)
99
+ - "Nothing found" ≠ "clean record" — always state this in reports
100
+ - Free key at https://www.stipple.sh for metering beyond the anonymous allowance