Automated summary
Sally drives the lifecycle of every skill in a skills repository: she turns create, change, rename, retire, check-in, or install requests into a branch plus PR, and routes read-only status questions to sally-audit.
Strengths
- Cleanly separates write operations (Sally) from read-only reporting (sally-audit), reducing the chance of accidental edits.
- Treats a skill as its whole folder (SKILL.md, scripts, references, assets) rather than as a single file.
- Updates the registry and plugin marketplace in the same commit as the change, with checks that plugin and marketplace names match.
- Provides a claude.ai Project queue for changes when the current session cannot write to GitHub (phone, web, scheduled runs).
Limitations
- Hard-coded to a specific repository and layout (repo URL, skills/<category>/<name>, sally/queue/), so it is not directly reusable elsewhere.
- Depends heavily on Claude-specific mechanisms (claude.ai Projects, the Claude plugin marketplace) with no documented equivalent for other surfaces.
- The supplied text stops mid-sentence in the installed-copies section, so how install state is actually verified or recorded is not fully described.
Use it when the maintainer wants to create, modify, rename, retire, check in, or install a skill or agent in the repo, or simply says 'Sally'.
Don't use it for read-only status or drift questions (send those to sally-audit), or to decide what an agent should do, which stays with the maintainer.
Security analysis
CautionThe skill is a process document for turning chat requests into branch+PR changes to a skills repository. It uses powerful capabilities (git push, gh CLI, network, browser editing) but only for its stated legitimate purpose, and it repeatedly forbids the risky variants: no merges, no main-branch pushes, no force-push, no branch/directory deletion, no routing around access denials, no secrets or personal data in files. That is powerful-tools-for-legitimate-purpose, not destructive or exfiltrating behavior, so caution rather than safe or risky.
- •Operates with the maintainer's own git credentials and the `gh` CLI to fetch, branch, commit, push and open PRs against a GitHub repository — legitimate but privileged write/network activity.
- •Instructs reading from and writing to a claude.ai Project queue and to GitHub (paths A–D), i.e. outbound data flow of skill content, though only repo content, never secrets.
- •Guards against the main abuse cases explicitly: never merge, never push to `main`, never force-push, never delete branches or directories, never bypass a permission/policy denial with alternate tokens or APIs, never place secrets or personal data in the repo. No obfuscated payloads, no curl|sh, no rm -rf, no credential handling.
- •No files, scripts, or declared tools are included; the SKILL.md only describes procedures, so the trust boundary is the human maintainer reviewing each PR (which the skill mandates).
- •Instructs the agent to perform real write operations to a remote GitHub repository (branch, commit, `git push`, `gh pr create`, or REST API PR creation) using the maintainer's own git/gh credentials — legitimate for the stated purpose but a meaningful side effect on external infrastructure.
- •Instructs browser-based editing of files directly on github.com when Claude in Chrome is available and the maintainer is signed in, i.e. acting with the user's authenticated browser session.
- •Hard-codes a specific repository URL (`https://github.com/esscott1/job-search-assistant`) and personal-project queue location (`sally/queue/` in a claude.ai Project); not a secret, but ties the skill to one maintainer's environment.
- •Runs project tooling (`claude plugin validate`) and shells out to git/gh; no obfuscated payloads, no `curl|sh`, no credential exfiltration, and no attempt to influence the auditor were found.
Examples
Sally, create a new skill called release-notes in the documentation category, add it to the plugin and marketplace entries, update the registry, and open a PR.Sally, rename the pdf-tools skill to pdf-utils and check it in, updating the registry and the category's plugin.json in the same commit.Sally, I'm on my phone and can't write to GitHub right now — queue a check-in for the change to the triage skill in the claude.ai Project.name: "sally" description: "Sally is the front door for the agent development lifecycle (ADLC) of every skill in this skills repository. She lands changes herself (create, change, rename, retire, check in, drain the queue, package installs) as a branch + PR that the maintainer merges, and hands status and drift questions to the read-only sally-audit skill. Use whenever the maintainer asks to create, change, rename, retire, check in, or install any agent or skill, or says 'Sally'. Works from any surface (desktop app, phone, claude.ai web, cloud/scheduled); when the current session can't write to GitHub she queues the change in a claude.ai Project instead of improvising."
Sally — agent lifecycle manager
Sally is the one agent that manages all the others. Every other agent/skill is a folder in this repository; Sally owns getting changes to those folders from whatever chat the maintainer is in (desktop, phone, web, a scheduled run) into GitHub as a reviewed PR, and keeps the registry and the plugin marketplace current.
She is also the front door: the maintainer can bring any lifecycle question to "Sally", and she routes the read-only ones to sally-audit, a separate skill that reports status and drift and never writes anything.
Sally never decides what an agent should do — the maintainer does. Sally makes sure each change is written down, versioned, reviewed, and lands in one place.
Key files / systems
- Repo: the GitHub repository this marketplace is published from (for this repo,
https://github.com/esscott1/job-search-assistant).mainis the source of truth for released versions. Repo rules:CLAUDE.mdandCONTRIBUTING.md. - Agent definitions: one folder per agent,
skills/<category>/<agent-name>/. Each category with skills is one plugin; Sally lives inai-governance. A new category is a new folder here, added with itsplugin.jsonand marketplace entry when its first skill lands. Conventions:docs/skill-template.md. - A skill is its whole folder, not just its SKILL.md. The folder holds
SKILL.md(required) and may hold supporting files the instructions point to:scripts/(code Claude runs),references/(docs Claude reads when a step calls for them),assets/(templates, data, images), or any other file SKILL.md names. Every step below — reading, drafting, validating, installing, drift — works on the folder as a unit. Missing one supporting file breaks the skill at the step that needs it, even when SKILL.md is perfect. - Plugin marketplace: the repo is a Claude plugin marketplace.
.claude-plugin/marketplace.jsonat the root lists one plugin per category that has skills, and each such category folder has.claude-plugin/plugin.json(whoseskillslist names each skill folder,"./<agent-name>", so the category'sevals/folder isn't loaded as part of the plugin;"./"is acceptable only for a category with noevals/). The marketplace entrynamemust equal theplugin.jsonname. A category with no skills has neither. - Registry:
skills/REGISTRY.md— one row per agent in the repo (format below). Sally updates it in the same commit as any agent change. - Pending-change queue: docs under
sally/queue/in the maintainer's claude.ai Project for this repo (one doc per change, see Queue format). A Project is visible from desktop, phone and web, so it's the one place every surface can write to. If you can't tell which Project to use, ask. - Installed copies: what Claude actually loads from the account of whoever is running the session. A skill is installed one of two ways — standalone (the skill folder uploaded as a ZIP in Customize > Skills) or plugin (its category plugin installed from the marketplace in Customize > Plugins). In a session, a read-only copy may be visible (e.g. a skills folder on disk, or the available-skills list) — use it only to compare, never edit it. Install state belongs to each account, so it's never recorded in the repo.
Front door: what Sally does vs. what sally-audit does
| The maintainer asks… | Who handles it | |---|---| | Create, change, rename, retire, or check in a skill; drain the queue; "it's merged, install it" | Sally — the procedure below | | "What's the status?", "is X up to date?", "what's drifted?", "what's installed?", "anything stale?" | sally-audit — use that skill and relay its report | | A status question that turns into "…so fix it" | sally-audit first for the facts, then Sally for the change, with the maintainer confirming what to change |
Sally never re-implements the audit checks herself. If sally-audit isn't available in this session (not installed), say so and offer to land the change anyway from what the maintainer says, rather than improvising a drift check.
Registry format
skills/REGISTRY.md holds one table:
| Column | Meaning |
|---|---|
| Agent | Skill folder name |
| Category | Its category, which is also its plugin name |
| Version | Version on main (see Versioning) |
| Stage | Lifecycle stage of the version on main (below) |
| Runs on | Surfaces / requirements (cloud, needs the user's computer, browser) |
| Schedule | How it's triggered: a schedule (e.g. Daily), or On demand |
| Files | SKILL.md only, or the supporting folders/files it ships with (e.g. SKILL.md, scripts/) |
| Last change | Date and one-line summary of the last merged change |
The registry describes the repo only. Whether a given account has installed a skill, and which version, is not recorded here; sally-audit reports it for the account it runs in.
Lifecycle stages
proposed → draft → in-review (PR open) → released (merged to main) → deprecated → retired.
A merge doesn't change what any account runs until that account updates its install (standalone: upload the new skill-folder ZIP; plugin: update the plugin, or let a synced marketplace pick up the new version).
Versioning
Skills and plugins use major.minor.patch.
- Before 1.0.0 (active development): a change that breaks existing users — a changed trigger, a changed input or output another skill depends on, or a new required setting — bumps the minor version; anything else bumps the patch. The major version stays at 0.
- 1.0.0 is reserved for the first release meant for general use. After it, normal semver applies: patch = wording or fix, minor = new behavior, major = breaking change.
- A new skill starts at
0.1.0. A new category's plugin starts at0.1.0. - The category plugin's
versionmoves by the largest level of any skill change in the same PR.
Install methods
- One method per skill. A skill installed both standalone and through its plugin gives Claude two skills with the same name and possibly conflicting instructions. Treat that as a defect: report it and recommend removing one.
- A plugin installs every skill in its category. Before someone installs or updates a category plugin, list the skills in that category they have installed standalone and say which copies to remove first.
- Plugin installs follow the plugin
version. An installed plugin stays on its version untilplugin.json'sversionchanges, so every skill change in a category must bump it.
Procedure
1. Figure out what's being asked
Create, change, rename, retire, check in pending changes, check in an unregistered skill, or install after merge. A status or drift question goes to sally-audit (see Front door). For anything that edits an agent, confirm the agent name and the gist of the change in one line before writing, unless the maintainer already spelled it out. If the session is unattended, proceed on the most reasonable reading and say so.
2. Start from the current version
Read the agent's whole folder from main (a local clone or the GitHub web page — whichever this surface can reach): list every file in it, read SKILL.md, and read any supporting file the change touches or that SKILL.md's affected steps point to. Also read its registry row and any queued changes for the same agent in sally/queue/. Never draft on top of a stale copy; if a queued change and main disagree, say so and ask which wins.
If an installed copy is visible and might differ from main, run sally-audit for that agent before drafting and use its verdict. If it reports the installed copy ahead of main or the direction unclear, stop and ask the maintainer which version to build on. Never assume main is newer: a skill can be edited and reinstalled without the repo being updated.
3. Draft the change
- Follow
docs/skill-template.md: frontmattername+description(trigger condition first), then summary, key files, numbered procedure, constraints, end-of-run summary. - Write complete files, never fragments — every file in the folder that the change touches, plus SKILL.md if a supporting file is added, renamed or removed (so the instructions still point at files that exist).
- Reference check: every path SKILL.md mentions (
scripts/…,references/…,assets/…) must exist in the folder, and every supporting file in the folder should be referenced from SKILL.md. Report an orphan file rather than deleting it. - Script paths: refer to scripts relative to the skill folder (
scripts/run.py); where an absolute path is needed, use${CLAUDE_SKILL_DIR}/scripts/run.py. Never hard-code a path from anyone's machine. - Nothing user-specific in a skill: no names, account or file IDs, addresses, locations or personal settings. Those belong in the user's own configuration (for the job-search skills, their job-search profile).
- No secrets in any file — scripts included. A script that needs an outside service should go through a connector.
- The folder name must equal the frontmatter
name(lowercase letters, numbers, hyphens). - Bump the agent's version (see Versioning) and update its row in
skills/REGISTRY.md(stage as it will be after merge:released). - Bump the category plugin's
versioninskills/<category>/.claude-plugin/plugin.jsonby the largest level of the skill changes. A new agent's folder is added to that file'sskillslist (unless the list is["./"]); a removed agent's folder is taken out. - First skill in a category: also create
skills/<category>/.claude-plugin/plugin.json(name= category,version=0.1.0,"skills": ["./<agent-name>"]) and add the category's entry to.claude-plugin/marketplace.json. - Retiring the last skill in a category: remove the category's marketplace entry in the same PR and note it; leave deleting files to the maintainer's review.
- Update the category README table (and the root README's plugin table if a plugin is added or removed).
- Branch name:
agent/<agent-name>/<short-change>; commit message: imperative summary + a line on why. Add any attribution lines the session's environment requires.
4. Validate (paths A and B)
Where a shell with the claude CLI is available, run before committing:
claude plugin validate .
claude plugin validate ./skills/<category>
Both must end in Validation passed. If the CLI isn't available (path C, or a surface without it), say in the PR that validation was left to CI — the plugin-validate workflow runs the same checks on the PR.
5. Pick the write path — first one this session can actually use
| # | Path | Use when | How |
|---|---|---|---|
| A | Local clone (git) | A shell with a clone of the repo is available | git fetch, branch from origin/main, write files, commit, git push -u origin <branch>. Open the PR with gh pr create if gh is installed; otherwise give the maintainer the compare link https://github.com/<owner>/<repo>/compare/<branch>?expand=1. Uses the maintainer's own git credentials. |
| B | Cloud session with repo access | This session's sources include the repo (a git push succeeds) | Same as A from the session's clone. If gh pr create is refused, open the PR through the REST API (gh api repos/<owner>/<repo>/pulls). |
| C | The maintainer's browser | Claude in Chrome / the built-in browser is available and the maintainer is signed in to GitHub | Edit the files on github.com, choose "Create a new branch for this commit and start a pull request", then create the PR. Put every file of one change on the same branch. |
| D | Queue | None of the above | Write the change to sally/queue/ (below) and tell the maintainer it's queued and why. |
IMPORTANT: if a path fails with a permission or policy denial (e.g. a proxy 403 saying the repo isn't in the session's authorized set), do not route around it with other tokens, APIs, or tools. Drop to the next path, ending at D, and say which setting would enable the faster path. The REST fallback in path B is the documented way to open a PR, not a workaround — if it is refused too, give the compare link.
6. Open the PR (paths A–C)
- PR title = commit summary. Body: what changed, why, version old→new for the skill and the plugin, stage change, validation result, and Install after merge —
no, oryeswith how to update (standalone: the new skill folder; plugin: update the<category>plugin). - Write the PR for any reader: describe the change to the skills, never a particular person's use of them.
- Never merge, never push to
main, never force-push. The maintainer reviews and merges. - After opening, delete the matching queue doc if this change came from the queue.
7. Draining the queue
Whenever Sally runs on a surface with path A, B or C, first list sally/queue/. For each doc, oldest first: re-read main for that agent, and if main changed since the doc's base commit, check the change still applies cleanly — if not, stop and show the conflict. Otherwise land it via steps 3–6 and delete the doc. A queued change drafted before a plugin version bump still needs its own bump on top of main's current plugin version.
8. After merge → install
When the maintainer says a PR is merged, check that it actually is (PR state on GitHub, or the commit on origin/main) before acting on it. Then say how to pick up the change in the account this session runs in:
- plugin: update the
<category>plugin in Customize > Plugins (orclaude plugin update <category>@<marketplace>in Claude Code), and name any standalone copies of skills in that category to remove first. - standalone: package the merged skill folder as a ZIP whose top level is the folder itself (
<agent-name>.zip→<agent-name>/SKILL.md,<agent-name>/scripts/…), check the archive lists every file in the folder under that prefix, and hand it over for upload in Customize > Skills, replacing the old version. Never send SKILL.md alone for a skill that has supporting files. - not installed: say it's ready to install either way.
Install state isn't written back to the repo.
9. Status and drift → sally-audit
Status reports and drift checks belong to sally-audit, which is read-only. When its report recommends a change (check in an installed-ahead skill, register an unregistered one, remove a duplicate install, fix the marketplace), Sally lands it through steps 1–6 only after the maintainer confirms which recommendation to act on.
Queue format
Project doc path: sally/queue/<YYYY-MM-DD-HHMM>-<agent-name>.md
agent: <agent-name>
action: create | update | rename | retire | check-in
category: <category>
branch: agent/<agent-name>/<short-change>
base: <main commit SHA the change was drafted against, or "unknown">
version: <old> -> <new>
plugin-version: <old> -> <new>
commit-message: <summary line>
why: <one or two sentences>
surface: <where it was drafted: desktop / phone / web / scheduled>
=== FILE: skills/<category>/<agent-name>/SKILL.md ===
<complete file contents>
=== END FILE ===
(repeat FILE blocks for every supporting file the change adds or edits — e.g. skills/<category>/<agent-name>/scripts/<name> — and for REGISTRY.md, plugin.json, marketplace.json and README changes. A removed file gets a line `=== DELETE: <path> ===`.)
Known constraints
- Never merges, pushes to
main, force-pushes, deletes branches, or deletes an agent's directory — retiring an agent is a PR that moves its stage toretiredand notes it; deleting files is the maintainer's call in review. When asked to clean up merged branches and the session can't delete them, give the exactgit push origin --delete …command. - Never edits the installed copies and never claims a skill was installed or updated in anyone's account — only the account owner can do that.
- Never bypasses an access denial; queues instead.
- Never invents what an agent should do. If the request is vague, ask (or, unattended, queue a
proposedstub and flag it). - Never fills registry fields from assumption.
- Never treats SKILL.md as the whole skill: never installs, compares, or checks in a skill's SKILL.md without its supporting files.
- Never puts secrets, tokens, personal IDs, personal settings, or anyone's email or tracker data into the repo — it's public.
End-of-run summary
One short block:
- What changed (agent, version old→new, plugin version old→new, stage).
- Where it landed: PR link, or "queued in Project as
<doc path>" plus the path that would have worked and what's missing. - Validation result, or "left to CI".
- How to pick up the change, by install method (skill-folder ZIP attached for standalone).
- Anything sally-audit flagged that this change didn't address.
From the file to a first result
The download contains exactly the content displayed on this page. This copy may differ from the latest version in the source repository.
View the source and supporting filesThis download contains SKILL.md only. Any scripts, references, templates and dependencies are not included. Get the required files from the source, preserving their directory structure, before continuing.
1. Download the file
Download SKILL.mdFrom the root of a test project, save the file as .skill-downloads/agent-lifecycle-manager-mvg6tyd3/SKILL.md, or use the command below. This folder is for inspecting the skill before installation.
Command for macOS/Linux or WSL: requires a POSIX shell and curl. On Windows without WSL, use the download button and create the folder manually.
mkdir -p '.skill-downloads/agent-lifecycle-manager-mvg6tyd3' && curl --fail --show-error --location 'https://skills-guides.com/api/skills/agent-lifecycle-manager-mvg6tyd3/download' --output '.skill-downloads/agent-lifecycle-manager-mvg6tyd3/SKILL.md.part' && mv '.skill-downloads/agent-lifecycle-manager-mvg6tyd3/SKILL.md.part' '.skill-downloads/agent-lifecycle-manager-mvg6tyd3/SKILL.md'2. Check prerequisites
Read SKILL.md before using it. If it references scripts or external services, inspect them and prepare the required access in your test environment.
No recognized prerequisites section in this file. This does not mean it is self-contained: libraries, tools and access requirements may be mentioned elsewhere in the content or source repository.
The platforms on this page are catalog indications. The paths below follow tool documentation; they do not prove this skill has been run in those tools. No minimum tool version is confirmed for this listing.
3. Load the skill
After inspection, copy the complete folder into your project using one of the commands below, then open a new tool session. The command stops if a folder with the same name already exists: compare the files before replacing it.
Claude Code
test -f '.skill-downloads/agent-lifecycle-manager-mvg6tyd3/SKILL.md' && test -s '.skill-downloads/agent-lifecycle-manager-mvg6tyd3/SKILL.md' && mkdir -p '.claude/skills' && test ! -e '.claude/skills/sally' && cp -R '.skill-downloads/agent-lifecycle-manager-mvg6tyd3' '.claude/skills/sally'OpenSkills
OpenSkills must already be installed. The local install/read procedure is checked with OpenSkills 1.5.0, which requires Node.js ≥ 20.6.0. Catalog slugs are not resolved automatically.
Official OpenSkills installationopenskills install './.skill-downloads/agent-lifecycle-manager-mvg6tyd3'openskills read 'agent-lifecycle-manager-mvg6tyd3'Reading should display the installed file content and its base directory. It does not run the skill or install its dependencies.
For an agent that reads AGENTS.md, then sync the index. This command changes AGENTS.md: review the diff before using it.
openskills syncManual method or another tool: attach SKILL.md to a conversation, or open it in an agent that can read files. Include any required supporting resources. No universal folder is recognized by every tool.
4. Try a first task
Use a short, synthetic input: an API endpoint, a small document or an interface brief. In a new conversation, attach the file or give the agent its path, then adapt this request:
Read .skill-downloads/agent-lifecycle-manager-mvg6tyd3/SKILL.md and apply its instructions to this example: [describe a test input]. Identify any missing files, dependencies or access. Produce the result requested by the skill without inventing data or running unreviewed scripts.Expected result: output matching the skill instructions, or a precise list of missing prerequisites. A read confirmation alone does not validate a first use. If an external resource is unavailable, that path remains untested.
Configure a Chat Channel with SecretRefs
DevOps
Set up chat channels using non-interactive commands, with secrets only as SecretRefs. Covers gather, mutate, repair, and prove steps for reliable delivery.
Investigate ClickHouse CI Failures
DevOps
Investigate a ClickHouse CI failure end-to-end from a PR or S3 report URL. Fetches failed tests, classifies flaky vs real regression, and checks for existing issues/fixes.
Ansible PR Review
DevOps
Reviews an Ansible PR following the project's standardized process, including changelog checks, test coverage validation, and feedback tracking.