sync-team-profiles — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited sync-team-profiles (Agent Skill) and scored it 96/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 1 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 1 flagged
The text {match} tells the agent to skip the normal "ask the user first" gate. Used adversarially it removes the human-in-the-loop check before destructive or sensitive actions, turning a normally-gated agent into a fire-and-forget executor.
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.
Wraps bin/sync-team-profiles.sh. On first run it shallow-clones each registered team-profile source (git clone --depth=1); on subsequent runs it does a shallow fetch (git fetch --depth=1) and git reset --hard FETCH_HEAD to advance to the latest commit. Every profile under the cache is then validated against profiles/_schema.json, and valid profiles are registered under <source-name>/<profile-name>.
~/.claude/nyann/config.json must have at least oneentry in team_profile_sources[]. If empty, route to add-team-source first.
"force refresh" / "ignore the interval" / "pull now", pass --force.
team profiles"), pass --name <source> so unrelated sources don't get pulled.
bin/sync-team-profiles.sh \
[--user-root <dir>] \
[--force] \
[--name <source>]Network operation. Expect up to a few seconds per source. The backend is resilient — a failing source logs the error and moves on to the next.
Top-level shape is four arrays (see schemas/team-sync-result.schema.json):
synced[] — sources that pulled this run. Each entry: {name, synced_at}.skipped[] — sources within their interval window. Each entry:{name, reason: "within-interval", next_due}. Tell the user the next-due timestamp; they can re-run with --force if they need to pull immediately.
registered[] — every profile that passed schema validation.Each entry: {source, name, namespaced, path}. The namespaced field is what to use with bootstrap-project --profile <namespaced>.
invalid[] — anything that didn't make it through (fetchfailure, clone failure, hand-edited config with a bad ref/url, TOCTOU on the cache dir, profile that fails schema validation). Each entry: {name|source, kind, error} where kind is one of invalid-name, invalid-ref, invalid-url, fetch-failed, clone-failed, toctou, invalid-schema. Show these but don't treat any single one as fatal — the script logs and moves on to the next source.
inspect-profile <source>/<name> to see what a specificteam profile does.
bootstrap-project --profile <source>/<name> to applyone to a repo.
git clone / git fetch failures are usually auth or networkissues and surface in invalid[] with kind: clone-failed or fetch-failed. The error string passes through nyann::redact_url before reaching the JSON, so any embedded https://<token>@host credentials are scrubbed — safe to relay verbatim. Don't try to auth-fix on the user's behalf.
<user-root>/cache/<source>/ contains partialdata) — safe to delete the cache dir and re-run. Confirm before deleting; it's a file-system mutation.
add-team-source.user + team profiles can shadow starters. Clarify which version will win (user > team > starter) and let the user decide if the shadow is intentional.
remote?" → that's check-team-drift (separate backend; not in this skill's scope).
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.