Announcing framework releases
Skill vemodalen-x/VEMO_SKILLS/skills/governance/announcing-framework-releases
Announce a governance framework's formal version release to the team chat as a Feishu (Lark) interactive card — framework name + code, old→new version, change-class summary (Added / Changed / ⚠️ BREAKING) extracted from its CHANGELOG, a one-line consumer-impact verdict (sync now? breaking?), repo + CHANGELOG links, maintainer, plus an optional 🏆 cumulative contribution leaderboard (instance-gated by include_leaderboard, computed from the same hub ledger as announcing-skills). Use after a framework release is tagged and push-verified. Identity-decoupled — group and the maintainer/contributor open_id maps are instance values; repo URL is resolved at runtime from the submodule remote.From its SKILL.md
npx -y skills add vemodalen-x/VEMO_SKILLS --skill announcing-framework-releasesAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
One thing to look at
- 0 stars0 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
11.2 KB, ~2.8k tokens by cl100k_base, as published. Nobody here has run it
Announcing Framework Releases
After a governance framework cuts a formal version release (a new version tag, pushed and verified), post a
version-update card to the team chat: which framework, old→new version, a change-class summary pulled from its
CHANGELOG, a one-line consumer-impact verdict, the repo / CHANGELOG links + maintainer, and — when the instance
opts in — an optional 🏆 cumulative contribution leaderboard. This is a governance-meta skill — it operates on
the framework ecosystem, alongside syncing-frameworks / announcing-skills / publishing-skills.
Boundary vs announcing-skills: announcing-skills celebrates skill-hub 上新 (新 skill); this skill
announces a framework version update (framework / version / change-class / consumer-impact). Different trigger,
data, and core payload. Both carry the same optional 🏆 leaderboard — a per-user ruling (2026-06-11): a
contribution shows up wherever it is announced, so the leaderboard rides both cards, computed from the one hub
ledger (contributors.yaml) and gated by the instance toggle. PR-sourced contributions count only once their PR is
merged (user ruling 2026-06-11); unmerged PRs are excluded from the ledger and the leaderboard. (This reverses the skill's original "no leaderboard"
design; see the CHANGELOG.) The leaderboard block is identical in shape to announcing-skills' — see
references/card-format.md.
Triggers
- Prompt / keyword, run post-release (after the framework's release tag is cut and push-verified): "公告框架版本更新" / "announce framework release" / "发框架升级公告" / "框架版本公告".
- Inputs from the caller: which framework released + its old→new version. Not automatic — it is a step run in the version-gate flow after a verified release.
Model (read first)
- Render, don't author. The change summary is extracted from the released framework's CHANGELOG top entry
(
## [X.Y.Z]… its### Added/Changed/Fixed/BREAKINGsections) — the CHANGELOG is the single source of the change text. This skill classifies + links; it never rewrites the change prose. - Framework-agnostic (decoupling — skill_spec §9). No framework name is hardcoded. Which framework released
comes from the caller's input; its repo / CHANGELOG URL is resolved at runtime from the pinned submodule's
remote (
git -C <submodule> remote get-url origin) — the same patternsyncing-frameworksuses. (Note the divergence fromannouncing-skills, which reads an instancerepo_urlfor the single hub; a framework announce targets many frameworks, so URL resolution is runtime, not instance.) - Two homes for identity. The group chat id and the maintainer→open_id map are org-instance facts
(
project_profile.yaml -> framework_announce, with the group reused fromskill_hub.announce.group_chat_id— single source, same group). Nothing identity-bearing is hardcoded in this skill. - Leaderboard reuses the hub's single ledger + maps (no second ledger). The optional leaderboard is computed from
the same hub
contributors.yamlasannouncing-skills, and resolves @-mentions via the same instance mapsskill_hub.announce.contributor_open_id+pr_account_map— not redeclared underframework_announce(single source, the same wayframework_announcereusesgroup_chat_id). A per-user ruling (2026-06-11): the leaderboard is "contributions made visible", not a taxonomy — so both cards read one ledger and may show the same ranking. Gated byframework_announce.include_leaderboard. - Card surface, not post. The change-class summary is a real table, so the message is a Lark interactive card
(
--msg-type interactive). The send mechanism (lark-cli,send_as, idempotency) is shared withannouncing-skills/publishing-deliverables; only the payload differs — seereferences/card-format.md(this skill's own card reference; the change-class table is this card's distinctive part, plus the same optional leaderboard block asannouncing-skills).
Inputs (all instance-read / runtime-resolved; zero hardcode)
- From the caller: the released framework (its code, e.g. the submodule id) + old→new version.
- From
project_profile.yaml -> framework_announce:send_as(user|bot) ·maintainer_open_id(framework code → open_id) ·include_leaderboard(bool — render the 🏆 leaderboard section or skip it). Group chat id: read at runtime fromskill_hub.announce.group_chat_id(same group, single source — not redeclared inframework_announce). - For the leaderboard (only if
include_leaderboard): the hubcontributors.yamlledger (same oneannouncing-skillsreads) + the instanceskill_hub.announce.contributor_open_idandpr_account_mapmaps (reused, not redeclared underframework_announce— single source). - Resolved at runtime: the framework's repo URL and CHANGELOG URL via
git -C <submodule> remote get-url origin(build the CHANGELOG link from the remote + the repo's CHANGELOG path). - From the framework: its CHANGELOG.md top
[X.Y.Z]entry (the released version's change text).
Procedure
- Read the released framework's CHANGELOG top entry (
## [<NEW_VER>]): collect its### Added/### Changed/### Fixed/### BREAKING(or⚠️ BREAKING) sections. This is the authoritative change text — extract, don't rewrite. - Classify the changes into the change-class table rows (one row per present class; ⚠️ BREAKING row first if present).
- Derive the consumer-impact verdict (deterministic rule — see below).
- Resolve repo + CHANGELOG URLs at runtime from the submodule remote.
- Resolve the maintainer:
maintainer_open_id[<framework-code>]→ou_xxxfor the card<at>. Missing (e.g. an external maintainer not in the group) → render the maintainer as plain text, skip the@(do not fail). - Compute the leaderboard (only if
include_leaderboardis true and thecontributor_open_idmap is non-empty — either condition unmet → skip this step and the leaderboard block in step 7; no error). Read (do not write) the hubcontributors.yaml: per contributor,count = len(contributions); sort by count desc; assign 🥇🥈🥉 to the top three (then4.,5., …); collect each person's item list. Resolve each label's<at>via the reusedskill_hub.announce.contributor_open_id(andpr_account_mapfor PR-sourced rows). This is the same ledger and same mapsannouncing-skillsuses — a single source, so the two cards' leaderboards may match. (Adding framework-contribution entries to the ledger is a separate ledger-maintenance step, not done by this skill.) - Build the card per
references/card-format.md(fill{FRAMEWORK}/{CODE}/{OLD_VER}/{NEW_VER}/{REPO_URL}/{CHANGELOG_URL}/{IMPACT}/{CHANGE_ROWS}/{MAINTAINER_AT}/{DATE}; if the leaderboard is on, also fill{RANKING}and include thehr+ ranking-heading + Table ② block; else omit that block; honor the field-tested hard constraints). - Confirm, then send (outward-facing — sending to a group publishes).
lark-cli im +messages-send --as <send_as> --chat-id <group_chat_id> --msg-type interactive --content '<card-json>' --idempotency-key <framework>-<NEW_VER>.--contentdoes not accept@file— inline the JSON. - Record. Write the announcement (framework + old→new version + group) into the consuming project's
flow_log.md.
Consumer-impact verdict (deterministic rule — checkable, not free prose)
Do not key "breaking" solely on a textual
⚠️ BREAKINGmarker — external frameworks' CHANGELOGs may not use it (e.g. one that only has### Added/Changed). Use a framework-agnostic fallback signal: a semver major bump.
IF CHANGELOG top entry contains "⚠️ BREAKING" / "### BREAKING" OR major-version bump (X increases, e.g. 1.x → 2.0)
→ IMPACT = "⚠️ 破坏性更新:sync 前请评估对本项目的影响,可能需要适配。"
ELIF only recognized non-breaking sections (Added / Changed / Fixed) AND not a major bump
→ IMPACT = "✅ 向后兼容:可在下一个版本门照常 sync 升级。"
ELSE (no recognized sections / unparseable)
→ IMPACT = "ℹ️ 变更类型待确认:请查阅 CHANGELOG 评估影响。" # do not guess
- Semver-major is the universal signal; the textual marker is a supplement, not the sole trigger.
Rules
- Decoupling red line (skill_spec §9): zero hardcoded framework name / repo / identity. Group + maintainer map are
instance-owned (
framework_announce, group reused fromskill_hub.announce); the leaderboard ledger + contributor maps are reused from the hub /skill_hub.announce(single source, not redeclared); repo/CHANGELOG URL resolved at runtime from the submodule remote. The CHANGELOG is the single source of change text. - Leaderboard is instance-gated, single-ledger — render the 🏆 section only when
include_leaderboardis true and thecontributor_open_idmap is non-empty; either unmet → omit silently (no error). It reads the one hub ledger (contributors.yaml) — it never writes a second one. The same block appears onannouncing-skills' card. - Card, not post — the change-class table needs the interactive surface;
<at>syntax is card-specific (references/card-format.md), distinct from a post's{"tag":"at"}. - Announce-after-push — run only after the release tag is cut and push-verified; never pre-announce.
- Outward-facing — sending to a group publishes; confirm with the user before sending.
Never touched
- The framework's repo / tags / CHANGELOG — read-only; this skill announces a release, it does not cut one.
- The
maintainer_open_id/contributor_open_id/pr_account_map/group_chat_id— instance values, read not written. - The hub
contributors.yamlledger — read-only here (this skill ranks from it; adding framework-contribution entries is a separate ledger-maintenance step, not this skill's job).
References
references/card-format.md— this skill's own Lark interactive-card reference (the version-update card: a change-class table + impact line + maintainer, plus the same optional 🏆 leaderboard block asannouncing-skills, instance-gated).
What ships with it: 1 file
7.5 KB alongside SKILL.md
references/
- card-format.md7.5 KB