example-portal — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited example-portal (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
⚠️ This is a template, not a working portal. Itscli/returns clearly-labelled example data so you can run it end-to-end and see the contract. To add a real portal, copy this whole directory to.agents/skills/<portal-name>/and implement real fetching incli/index.ts.
.agents/skills/ and not .claude/skills/?Per ADR-0004, structured portal adapters are a Plane-2 extension: each portal is a self-contained CLI tool that the country-agnostic job-scraper skill calls out to, with web search (site:<portal>) as the universal fallback. They live under .agents/skills/ deliberately — that path is not the Claude Code skill auto-load directory (.claude/skills/), so an adapter is invoked as a CLI (via bun run), never silently activated as a chat skill. This keeps the core framework clean and lets any market contribute an adapter without changing core code.
.agents/skills/<portal-name>/
├── SKILL.md # this file — trigger keywords + contract
├── cli/
│ ├── package.json # dependencies + start script (Bun/TypeScript)
│ └── index.ts # CLI entry point implementing the contract below
└── url-reference.md # optional — the portal's search-URL patterns| Runtime | Bun (TypeScript). node/npx tsx also work for this template. |
| Input | CLI flags: --keywords "<terms>", --location "<place>", --date-range <days> |
| Output | A JSON array on stdout, one object per posting: { title, company, location, url, date, snippet } |
| Exit code | 0 on success (even with zero results — emit []), 1 on error (message on stderr) |
The job-scraper skill runs the adapter like:
bun run .agents/skills/<portal-name>/cli/index.ts \
--keywords "data engineer" --location "Remote" --date-range 14…then parses the JSON array, dedupes against seen_jobs.json, quick-rates fit, and presents results exactly as it does for web-search hits.
.agents/skills/<portal-name>/.cli/index.ts, replace the example data with a real fetch (the portal's publicsearch/API, or HTML parsing) that honours the input/output/exit-code contract.
url-reference.md.search-queries.md so job-scraper knows to use it.found, with real URLs. This template clearly labels its output as example data.
bun install).~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.