Audit
Security audit of Guild plugin scripts — SHA256 hashes, source, network + filesystem flags. Produces a static report listing every hook script, tooling script, and MCP server with (a) file hash, (b) declared tool access / allowed-tools frontmatter, (c) any network/egress calls (fetch, http, WebFetch, WebSearch), (d) any filesystem writes outside .guild/. Per §15.1 #12, meta-skills are filesystem-restricted; only agents/researcher.md has web access by default. Per §15.2 "Arbitrary code in installed skills", the plugin is only as safe as its installed-from source — echo Anthropic's "only install from trusted sources" guidance. TRIGGER for "audit Guild scripts", "what does <script>.ts do", "show all network calls from hooks", "list SHA256 hashes for the plugin scripts", "run /guild:audit". DO NOT TRIGGER for: wiki lint (guild:wiki-lint), reviewing a run (guild:review), a security-specialist audit of the user's own application code (agents/security owns), or rolling back a skill (guild:rollback-skill).From its SKILL.md
npx -y skills add lookatitude/guild --skill auditAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
One thing to look at
- 7 stars7 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
SKILL.md
7.4 KB, as published. Nobody here has run it
guild:audit
Audits Guild plugin scripts for privacy and egress compliance: meta-skills are restricted to the filesystem; only the researcher has web access by default; /guild:audit surfaces script hashes. The plugin is only as safe as its installed-from source — install from trusted sources per Anthropic's guidance.
The audit is static — it reads source files, computes hashes, greps for egress and filesystem patterns, and writes a dated report. It does not execute any script under audit.
Scope
Audits every executable artifact that ships in the plugin:
hooks/*.tsandhooks/*.sh— SessionStart, UserPromptSubmit, PostToolUse, SubagentStop, Stop hooks per§13.2.hooks/agent-team/*.ts—TaskCreated,TaskCompleted,TeammateIdlehooks per§13.2.scripts/*.ts— tooling scripts (trace-summarize, evolve-loop, flip-report, shadow-mode, description-optimizer, rollback-walker, and any others added in P7+).mcp-servers/*— optional MCP servers per§13.3(guild-memory,guild-telemetry), audited if present.
Does not audit:
skills/**/SKILL.md— markdown, no executable code. Skill bodies are instructions to the model, not programs; they are audited by theguild:evolve-skillgate and theguild:wiki-lintskill for content, not by this skill for egress.agents/*.md— same rationale.commands/*.md— same.- user application code — that's
agents/security(the shipping specialist), not this skill.
Per-script report shape
One row per audited script, with the following fields:
path— absolute repo-relative path.sha256— hex digest of the file bytes.loc— line count.allowed_tools— from frontmatter when present (e.g. the hook hasallowed-tools:declared), elsen/a.network_evidence— list of matched lines forfetch(,http.request,https.request,WebFetch,WebSearch,axios,undici,node-fetch,got,curl(in.sh). Each match records the file:line and the surrounding 1-line context. Empty list ⇒ no evidence of egress.filesystem_write_evidence— list of matched lines forwriteFile,appendFile,createWriteStream,mkdir,rm,spawn(,exec(,execSync,>/>>/teein.sh. Each match records the file:line + the path argument literal when present.writes_outside_guild— sub-list of the above where the path literal is NOT under.guild/runs/,.guild/evolve/,.guild/skill-versions/,.guild/reflections/,.guild/wiki/,.guild/team/,.guild/audit/, or a temp dir (os.tmpdir(),/tmp). Any non-empty value here is a red flag surfaced in the summary.notes— free-form remarks (e.g. "uses child_process to shell out to git", "reads env var GUILD_TOKEN").
Trust boundary (§15.1 #12, §15.2)
State plainly in the generated report:
- Meta-skills are filesystem-restricted by convention. The meta-skills under
skills/meta/operate on.guild/and repo files only. None of them should have network-capable tools declared. Any network-evidence match in a script called by a meta-skill's hook/tooling is a red flag. - Only the
researcherrole has web access by default. It's the only specialist whose definition declaresWebFetch/WebSearch. Any new specialist requesting network access must be surfaced in this audit, and must be user-approved before it ships. The audit scans ALL THREE specialist definition surfaces — machineryagents/*.md, the shipped type templatestemplates/specialists/*.md, and the consuming repo's minted instances.guild/agents/*.md— parsing eachtools:frontmatter field, and flags any network-tool declaration that is not theresearcherrole (a minted instance inherits its template's tools; a PROJECT-EDITED instance that gained a network tool is exactly what this catches). - Plugin is only as safe as its installed-from source (§15.2). Echo Anthropic's guidance: only install Claude Code plugins from trusted sources. The report includes a one-paragraph trust-reminder section at the top, above the per-script table, so the user re-reads it every audit.
Output
Write the report to .guild/audit/<YYYY-MM-DD>.md using today's date. If the file already exists (repeat audit on the same day), append a new section rather than overwrite — audits are append-only so drift across the day is visible.
Structure:
- Trust reminder — one paragraph, per the Trust boundary section above.
- Summary table — one row per script, with
path,sha256(short, first 12 chars),network: yes/no,writes_outside_guild: yes/no,loc. - Per-script detail — the full fields from the Per-script report shape, one section per script.
- Specialists with network access — a short list across
agents/*.md+templates/specialists/*.md+.guild/agents/*.mdwhose frontmatter declaresWebFetchorWebSearch. Expected: only theresearcherrole (template and/or its minted instance). Any other entry is flagged. - Drift against previous audit — compare the sha256s against the most recent prior audit in
.guild/audit/. Any changed hash is surfaced with the old/new values and the script's path. New scripts are flagged asNEW since last audit. Deleted scripts are flagged asREMOVED since last audit.
Handoff
Emit a handoff block with the audit-run metadata and a pointer to /guild:stats for drift surfacing.
Payload fields:
audit_path— the written.guild/audit/<YYYY-MM-DD>.md.script_count— total scripts audited.network_flag_count— scripts with non-emptynetwork_evidence.write_outside_guild_count— scripts with non-emptywrites_outside_guild.nonresearcher_web_agents— list of definition files acrossagents/*.md+templates/specialists/*.md+.guild/agents/*.mdwith web access other than theresearcherrole (expected: empty list).hashes_changed_since_last_audit— list of{path, old_sha256, new_sha256}entries; empty on the first audit.prior_audit_path— the prior audit file compared against, ornullon the first audit.
/guild:stats reads the audit handoff to surface any CHANGED hashes on the next stats view so the user sees drift without re-running the audit. Hash drift is not inherently bad — edits happen — but it should never be invisible.