communicate — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited communicate (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.
Steward's job is alignment across the AgentCulture mesh; that surfaces in four distinct channels:
API, a divergent skill, a documentation ask) where an agent on the other side needs to act, and the ask should outlive the conversation. → post-issue.sh (GitHub).
question, or a "this is done" note on an issue that's already open. → post-comment.sh (GitHub).
sibling repo so a brief or plan can inline what's there instead of saying "see issue #N." → fetch-issues.sh (GitHub).
for merge" notice on a Culture mesh channel where the audience is already listening. → mesh-message.sh (Culture IRC).
All four live under one skill because they share the same audience (sibling-repo agents) and the same red flag (don't double-post the same ask across post + mesh — pick one).
The three GitHub verbs (post-issue.sh, post-comment.sh, fetch-issues.sh) are thin wrappers around the agtag CLI (agtag issue post|reply|fetch). agtag handles auto-signature resolution from the local culture.yaml (falling back to repo basename), JSON output mode, and a uniform exit-code policy. Read agtag learn for the agent-facing self-teaching prompt and agtag explain agtag / agtag explain issue for the surface docs — this SKILL.md does not re-document agtag's flags.
mesh-message.sh stays a culture channel message wrapper for now; agtag mesh transport is slated for v0.2.
post-issue.sh)wire-format compat fix, divergent skill, documentation ask).
stack — "set it up", "align it", "update it with our stack", "set up the pipelines". The deliverable is an issue with a self-contained brief, never files written into that repo**. In steward, quote steward's docs/sibling-pattern.md (required artifacts) and docs/skill-sources.md (the skill set to vendor) into the brief so it stands alone; steward's CLAUDE.md "Steward's lane" section is the canonical statement. Downstream vendors of this skill don't onboard siblings — those steward-side docs don't exist in your repo, so skip this bullet.
than ephemeral chat.
steward announce-skill-update).claude/skills/<name>/ and the change ismore than identifier-only or doc-only — downstream consumers will benefit from re-vendoring.
steward announce-skill-updateverb (steward-cli) renders the canonical six-section form (what's stale, cite locations, what's in upstream now, recipe, acceptance criteria, references) from the live state of .claude/skills/<name>/scripts/, the CHANGELOG.md, and docs/skill-sources.md's downstream column. Then it pipes through this skill's post-issue.sh per consumer (so the auto-signature stays consistent with hand-authored briefs).
mesh-message.sh)for merge", "starting nightly corpus scan").
is listening on the channel right now.
post-comment.sh)maintainer's question, a "this is shipped" note pointing at a PR.
agtag issue post you sent earlier andthe resolution belongs on the same thread (audit trail beats a separate ping).
fetch-issues.sh)one or more sibling-repo issues (body + comments) instead of saying "see issue #N."
comments in one shot for context.
gh issue view "Projects (classic) deprecated" error bypassing --json explicitly to GitHub.
gh issue create directly, orwork them through the cicd skill.
cicd skill (which alreadyauto-signs replies).
criteria belongs in an issue, not a channel message.
The receiving agent must not need steward-side context to act. Inline the relevant content; do not say "see steward's plan."
A brief that says "see steward#NN" is a bug. The receiving agent will look at it, get lost in steward-specific context that's irrelevant to them, and either ask for clarification (slow round-trip) or guess wrong (worse). Inline the ask, the rationale, and concrete acceptance criteria. Quote source-of-truth files (path + line numbers + small excerpts) when their shape matters to the ask.
| Channel | Signature | Why |
|---|---|---|
| GitHub issues / comments | - <nick> (Claude) — agtag resolves <nick> from the local culture.yaml, falling back to repo basename | Cross-repo audit trail — readers can tell at a glance which sibling and that it came from an AI. |
| Culture mesh | none — unsigned | The IRC nick already identifies the speaker. A trailing - <nick> (Claude) would be visual noise that the nick already supplies. |
Vendors do not need to edit a literal — agtag does the resolution. --as NICK overrides if a vendor needs to sign as something other than its culture.yaml suffix. Mesh messages stay unsigned across all vendors.
<verb> <thing> (unblocks <consumer>) — e.g., Vendor portability-lint into <repo> (unblocks steward 0.7 doctor --apply). The parenthetical tells the receiving repo's maintainers what's waiting on them. Drop the parenthetical only when the ask isn't blocking anything.
bash .claude/skills/communicate/scripts/post-issue.sh \
--repo agentculture/<sibling> \
--title "Vendor portability-lint into <sibling> (unblocks steward 0.7)" \
--body-file /tmp/brief.mdOr pass the body on stdin:
bash .claude/skills/communicate/scripts/post-issue.sh \
--repo agentculture/<sibling> \
--title "..." <<'EOF'
<brief body here, multi-paragraph, with all the inline context the receiving agent needs>
EOFThe script prints the issue URL on success — capture it for cross-references in your spec / plan / PR description. agtag appends the signature - <nick> (Claude) (resolved from culture.yaml).
This is steward's role specifically — the verb lives in steward-cli, not in this skill's scripts/. Downstream vendors of communicate (cfafi, culture, auntiepypi, …) do not get a broadcast wrapper because they don't broadcast — they only use the primitives above (post-issue.sh, fetch-issues.sh, mesh-message.sh).
# Default: read consumers from docs/skill-sources.md "Downstream copies"
# cell for <skill>; render the six-section brief; pipe to post-issue.sh
# for each consumer.
steward announce-skill-update --skill cicd --since 0.6.0
# Override the consumer list (skips the ledger lookup entirely):
steward announce-skill-update --skill cicd \
--to agentculture/auntiepypi --to agentculture/cfafi
# Preview without posting:
steward announce-skill-update --skill cicd \
--to agentculture/auntiepypi --dry-run
# Just print the consumer list (for ledger sanity-checks):
steward announce-skill-update --skill cicd --list--since VERSION controls which CHANGELOG entries get inlined (every entry from the top down to but not including the cutoff version). Without it, the verb keyword-filters CHANGELOG entries to those mentioning the skill name. --note-file PATH appends free-text under the upstream script list for skill-specific gotchas the generic template can't anticipate (e.g. "this skill's post-issue.sh hard-codes a signature literal — your vendor must change it"). The brief is rendered once and reused across consumers; per-consumer failures stream to stderr and the verb exits 1 if any failed. The template lives at scripts/templates/skill-update-brief.md so future supplier-role repos can render their own briefs from the same shape.
#### Fast recipe — "brief sibling-repo Z on skill X"
This shape of ask is a recipe, not a planning question. Skip plan mode. The call site:
steward announce-skill-update \
--skill <name> --to <owner>/<repo> \
--since <last-stable-version> \
[--note-file /tmp/note.md] --dry-runEyeball the rendered brief; drop --dry-run to post. The verb prints the issue URL on success and exits non-zero on failure — that is the verification. Don't write parallel gh issue list / gh issue view checks unless the verb itself is what you're testing. --to overrides the ledger, so non-ledger consumers don't require a ledger edit first; they enter the ledger later when they confirm their vendored shape.
bash .claude/skills/communicate/scripts/post-comment.sh \
--repo agentculture/<sibling> \
--number 42 \
--body-file /tmp/follow-up.mdOr pipe the body in:
bash .claude/skills/communicate/scripts/post-comment.sh \
--repo agentculture/<sibling> \
--number 42 <<'EOF'
PR #87 has shipped — closing the loop on this thread.
EOFAuto-signed by agtag from culture.yaml; do not hand-author the trailing nick.
bash .claude/skills/communicate/scripts/mesh-message.sh \
--channel "#general" \
--body "PR #42 — all review threads addressed. Ready for merge."Body can also come from --body-file PATH or stdin. The script wraps culture channel message <target> <text> and forwards exit codes unchanged, so failures (no Culture server, agent not connected) surface verbatim. No signature is appended — the IRC nick is the speaker.
bash .claude/skills/communicate/scripts/fetch-issues.sh 191 --repo agentculture/culture
bash .claude/skills/communicate/scripts/fetch-issues.sh 191-197 --repo agentculture/culture
bash .claude/skills/communicate/scripts/fetch-issues.sh 191 195 197Output is one JSON object per issue (separated by header bars) with number, title, state, labels, body, and comments. Without --repo, gh resolves the repo from the current git remote. Failures on a single issue print ERROR: Could not fetch issue #N and continue with the next one.
Steward is not a registered mesh agent today (see the cicd SKILL.md note). The script works once steward has been registered and started via culture agent register + culture start spark-steward; until then, calling it will fail with whatever error the Culture CLI returns, which is the right behavior — fix the registration, don't paper over it.
| Script | Purpose |
|---|---|
scripts/post-issue.sh | Create a new issue on a target repo. Wraps agtag issue post; auto-signs from culture.yaml. |
scripts/post-comment.sh | Comment on an existing issue. Wraps agtag issue reply; auto-signs from culture.yaml. |
scripts/fetch-issues.sh | Fetch one or more issues (single / range / list) with body + comments. Wraps agtag issue fetch. |
scripts/mesh-message.sh | Send a message to a Culture mesh channel. Unsigned (IRC nick is the speaker). |
scripts/templates/skill-update-brief.md | The Markdown template consumed by steward announce-skill-update (the broadcast verb lives in steward-cli, not in this skill). Six fixed sections; placeholder syntax {{NAME}}. |
More scripts can land here as the communication footprint grows — mesh-ask.sh for question-shaped pings via culture channel ask, agtag-mesh wrappers once agtag message ships in v0.2, etc. Add them when there's a second concrete need; do not pre-build for hypotheticals.
Never:
it. Handing off / onboarding is an issue, not an edit — a direct "set them up" is still an instruction to file the brief. (In steward this is the "Steward's lane" rule; the principle holds for any vendor of this skill.)
content. Briefs must be self-contained.
--no-signature flag.
- <nick> (Claude). The nick already sayswho you are.
gh issue create or thecicd skill instead.
- <nick> (Claude) at the end of an issue or commentbody — agtag appends it. Manual typing creates double-signatures.
Tracked → issue. Ephemeral → mesh.
receiving agent has to decide "did I do this right?", you owe them an issue.
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.