update
Skill2 starsChanged 2 months agoMITView on GitHub
Use when the user runs /ren:update to upgrade the framework. Drives the migration state machine — fetches latest version, classifies the bump, snapshots the wiki, runs migrations, verifies via verify.json, shows diffs for approval, applies, and re-verifies. Snapshot/rollback is built in. Never silent on MAJOR bumps.
61 other projects use a version of this.
Adopted by
Most recently taken up by
- orgiggly/claude-plugintheir own version, first seen Nov 8, 2026
- ljchang/mechatheir own version, first seen Nov 8, 2026
- onetapstudiogames/1f3d9-citylifetheir own version, first seen Nov 8, 2026
- patrickjaja/claude-desktop-extratheir own version, first seen Nov 6, 2026
- egregore-labs/egregoretheir own version, first seen Nov 6, 2026
- buildomator/buildomatortheir own version, first seen Nov 4, 2026
Used with
Projects with it also use end, create and 8 more.
Other files people use alongside this one.
Files found in the same public projects as a version of this one, more often than they turn up anywhere else. Each project counts once, large collections count for less, and this file's own repository is left out.
torarnvSkillend
Wrap up a work session. Updates memory files, logs decisions and lessons, appends to the session log.
Also in 3 projects that use this
MicrosoftSkillcreate
Also in 4 projects that use this
bitwize-music-studioSkilltutorial
Provides interactive guided album creation for new users. Use when the user is new to the plugin or asks for a walkthrough of the album creation process.
Also in 3 projects that use this
MicrosoftSkillnote
Use this skill to record progress, partial findings, hypotheses, and page-anchored evidence while investigating a long document. Call Note aggressively — any time you read a page and confirm, narrow, or update your understanding of the user's question. Triggers include "jot that down", "save this finding", "note that page 7 says X", or (more often) implicit internal signals — you just learned something and want it recoverable later. Notes persist in the session and Review can select among them. Never paraphrase notes back from memory; write them as you go.
Also in 4 projects that use this
kv0906Skillinbox
Quick capture mode (with content) or batch processing mode (no content). GTD-style routing of inbox items to proper folders. Use "/inbox thought to capture" or "/inbox" to process.
Also in 4 projects that use this
SidUSkilltoday
Plan today's work using this repo's workflow. Use when the user asks for /today or phrases like "plan my day", "today's plan", "set my priorities", or "start my day".
Also in 3 projects that use this
- +2 more from microsoft
Other versions61 projects use a version of this.
Word for word · 0
None found.
Edited · 0
None found.
Wrote their own version · 61
- anthropics/knowledge-work-plugins★ 35ksame name
- Q00/ouroboros★ 6.3ksame name
- vellum-ai/vellum-assistant★ 1.5ksame name
- patrickjaja/claude-desktop-extra★ 734same name
- me2resh/apexyard★ 542same name
- daloopa/investing★ 488same name
- TokenRollAI/cc-plugin★ 483same name
- egregore-labs/egregore★ 293same name
- k1p1l0/claude-telegram-supercharged★ 144same name
- kv0906/pm-kit★ 138same name
51 more not listed
How matches are found. Word for word: the exact same text. Edited: shares passages with this file (“99% same” means 99% of its five-word phrases also appear here; 10% or more counts). Their own version: similar meaning, or, weakest, the same name. We can’t tell which project had it first. Projects are counted among the 200 most-starred candidates, and mentions are links to the repository we found, up to 50 per site, so both counts are a floor.
In this repository19 other files it gives its agents.
- CLAUDE.mdCLAUDE.md
- backupSkill
- bootstrap-projectSkill
- code-mapSkill
- distillSkill
- doctorSkill
- ingest-projectSkill
- installSkill
- interviewSkill
- metric-watchSkill
- pinSkill
- recallSkill
- rememberSkill
- retrospectiveSkill
- routine-initSkill
- suggestionsSkill
- wiki-healthSkill
- wiki-migrationSkill
- wrapSkill
The file
We split this skill into the rules it gives an agent
2 rules. 0 are common, 0 are distinctive, and 2 are very specific to this project.
0
Common
Most of the 59 edited versions we read keep these.
0
Distinctive
This author's own choices. Worth a look.
2
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Very specific: line 164
Read each page's frontmatter type.
- Very specific: line 185
Verify each migrated page with verify_page( Path("migrations/l2-map-1-to-2/verify.json"), <page_path>) (same import) before counting it as …
“Common” is measured: kept by at least 6 in 10 of the 59 edited versions of this file we could read. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
update
Carried near-verbatim from donor skills/update/ (Task 7.3) — the migration state machine's snapshot/restore/version-compare substrate. Renamed identifiers only: SF_WIKI_ROOT → REN_WIKI_ROOT, SF_SNAPSHOT_MODE → REN_SNAPSHOT_MODE, ~/.startup-framework/ → ~/.renos/.
Scripts (carried, unchanged behavior)
scripts/snapshot.sh <from-version>— copies the wiki to~/.claude/plugins/data/renos/wiki-snapshots/v\<from\>-pre-update-\<ISO8601\>/(snapshot root overridable viaREN_SNAPSHOT_ROOT; never derived fromCLAUDE_PLUGIN_DATA— issue #34), prunes beyondCLAUDE_PLUGIN_OPTION_SNAPSHOTRETAIN(default 3), logs the snapshot towiki/log.md.scripts/restore.sh {--list|--whole <snap>|--page <snap> <rel>}— lists snapshots, restores the whole wiki (stashing the pre-restore state first), or restores a single page.scripts/prune-snapshots.sh [<N>] [--dry-run]— retention enforcement for both normal snapshots andSTASH-broken-*dirs (created byrestore.sh --whole).scripts/version-compare.sh <A> <B>/--bump <A> <B>— strict semver comparison + bump classification (patch/minor/major/downgrade/equal/prerelease). No CC-marketplace dependency; the framework owns semver semantics since the marketplace treatsversionas an opaque string.
When to use this skill
- Friend invokes
/ren:updateto check for and apply a framework version bump - Friend invokes
/ren:update --dry-runto preview the migration plan with zero writes - Friend invokes
/ren:update --restore-snapshotto interactively restore from a prior snapshot
What this skill does NOT do
- Decide WHICH migrations exist or their chain order — that's
skills/wiki-migration's registry (this skill calls into it, doesn't own it). - Auto-rollback on new post-update doctor issues. The snapshot is retained and named; the human decides whether to restore.
- Force-push or touch the backup remote. That's
skills/backup's scope entirely.
0.3 update notes
- queue-governance 2→3 (Task 10): a friend upgrading past 0.3 has queue
entries left
pendingfor the OLD reason (0.2 gated every write) rather than the new one (v2.2's instruction-plane/contradiction holds only). Runmigrations/queue-governance-2-to-3/migrate.pyonce as a post-update step after the version bump lands — it is NOT part of theskills/wiki-migrationpage-type chain (it walks queue state understate_dir()/queue/, not wiki pages), so/ren:doctor's schema-drift check does not surface it; invoke it directly.--checkpreviews what would be released with zero writes. Idempotent — safe to (re-)run even if a friend already updated once without it. See that migration's README.md for the shape-decision rationale.
0.5.1 update notes
- trust-backfill-1 (Task 10a): a friend upgrading from before 0.5.1 has
pre-0.5.1 wiki pages with no
ren_trustfrontmatter (the trust taxonomy 0.5.1 Task 6 started stamping at the single write door). Runmigrations/trust-backfill-1/migrate.pyonce as a post-update step after the version bump lands, gated byskills.update.lib.should_run_trust_backfill( <old-version>, <new-version>)—Truewhen the update crosses the 0.5.1 boundary. Likequeue-governance-2-to-3, this is NOT part of theskills/wiki-migrationpage-type chain (it walks the whole wiki tree, not a single page type keyed byschema_version) — seeskills/wiki-migration/schemas.json'sglobal_migrationsnote and that migration's README.md for the shape-decision rationale.--checkpreviews what would be stamped with zero writes. Idempotent — safe to (re-)run even if a friend already updated once without it.
0.6.2 update notes
- project-knowledge-1 (issue #20): a friend upgrading from before 0.6.2
may have flat
.mdpages directly underprojects/<slug>/(pre-0.6.2 ingest had no sanctioned durable subtree). Runmigrations/project-knowledge-1/migrate.pyonce as a post-update step after the version bump lands, gated byskills.update.lib.should_run_project_knowledge_1(<old-version>, <new-version>)—Truewhen the update crosses the 0.6.2 boundary. Standalone global migration (walks wholeprojects/<slug>/directories, not a schema_version-keyed page type) — seeskills/wiki-migration/schemas.json'sglobal_migrationsnote and that migration's README.md. Dry-run is the DEFAULT (--applywrites); show the friend the dry-run plan before applying. Idempotent — safe to (re-)run. It also reports anyprojects/<slug>/missing aschema.md; relocating pages is the script's job, but organizing them into a taxonomy (nestedknowledge/subtrees, hubs,schema.md) is model-work — offer the friend a follow-up session per project (or a re-run of/ren:ingest-project, which now produces the hierarchical shape natively).
0.6.3 update notes
- foreign-remint-1 (issue #22): a friend upgrading from before 0.6.3 may
have ingest-drafted knowledge pages mis-stamped
ren_trust: "foreign"(pre-#22trust_classminted "foreign" for everyproducer="ingest"write, which held the ingested project's L2 map out of wake-up unconditionally). Runmigrations/foreign-remint-1/migrate.pyonce as a post-update step after the version bump lands, gated byskills.update.lib.should_run_foreign_remint_1(<old-version>, <new-version>)—Truewhen the update crosses the 0.6.3 boundary. Standalone global migration (walks the whole wiki tree, restamps only foreign pages with a known non-humanren_writer; quarantine banners are untouched) — seeskills/wiki-migration/schemas.json'sglobal_migrationsnote and that migration's README.md.--checkpreviews what would be reminted with zero writes. Idempotent — safe to (re-)run even if a friend already updated once without it.
0.7.0 update notes
- l2-map-1-to-2 (issue #53): a friend upgrading from before 0.7.0 has L2
pointer-maps still in schema 1 — arrow-form wiki pointers
(
- [Topic] → path (write_id)) instead of Obsidian-native markdown links (- [Topic](path) (write_id)). Unlike the standalone global migrations above, this one IS part ofskills/wiki-migration's ordinary page-type chain (l2-mapis a registered page type inskills/wiki-migration/schemas.json, currently at schema 2), so it's driven the same way/ren:doctor'scheck_schema_versionsdiscovers pending work, not a one-off script invoked by hand. Walk it as follows, under the update flow's existing pre-migration snapshot (REN_SNAPSHOT_DIRalready pointed at that run'swiki-snapshots/v<from>-pre-update-<ISO8601>/):- Enumerate wiki pages via
wiki_root.rglob("*.md"), skippingprojects/<slug>/raw/(write-once source material — never a migration target;lib.ren_paths.in_project_rawis the existing predicate, seeskills/doctor/lib/check_schema_versionsfor the same walk). - Read each page's frontmatter
type. The masterwiki/index.mdistype: l2-maptoo — it is NOT special-cased out of this walk, per- project maps (projects/<slug>/map.md) and the master index are migrated the same way. - For pages whose
typeisl2-map, readschema_version; an absent value means the page predates schema-stamping (issue #20) — treat it as1, not as "skip me". - Compute
migration_chain("l2-map", <version>)— viaimportlib.import_module("skills.wiki-migration.lib"), same as/ren:doctor'scheck_schema_versions— for that page. A non-empty chain today is always exactly["l2-map-1-to-2"]. - For each pending page, run
run_migration(Path("migrations/l2-map-1-to-2"), <page_path>, wiki_root, snapshot_dir)(sameskills.wiki-migration.libimport) — same primitive/ren:doctorverifies against, sameSF_*/REN_*env-mapping shim. Inspect the returnedMigrationRunResult:skipped=True(stdout carriedSKIP) means transform.py itself declined (wrong type, no frontmatter, or already at schema 2 — seemigrations/l2-map-1-to-2/README.md); a non-zeroreturncodewithskipped=Falseis a genuine transform failure (page left untouched, rolled back from the snapshot like any other failed page). - Verify each migrated page with
verify_page( Path("migrations/l2-map-1-to-2/verify.json"), <page_path>)(same import) before counting it as applied. - Show the friend the per-page diff summary, per this skill's usual
diff-approval contract, before the migrated content is treated as
final.
Idempotent — re-running is always safe:
migrate.sh(viatransform.py)SKIPs any page already atschema_version: 2, scoped to the frontmatter block only (a body line that happens to readschema_version: 2cannot false-SKIP a stale page). Seemigrations/l2-map-1-to-2/README.mdfor the full transform contract.
- Enumerate wiki pages via
- Global migration: folder-note-hubs-1. Gate:
should_run_folder_note_hubs_1()fromskills.update.lib. If true — show the friend the pending rename list (the gate's paths), get approval (this is a MAJOR-classified structural change), then runUV_PROJECT_ENVIRONMENT="$HOME/.renos/.envs/<version>" uv run python migrations/folder-note-hubs-1/migrate.pyfollowed byUV_PROJECT_ENVIRONMENT="$HOME/.renos/.envs/<version>" uv run python migrations/folder-note-hubs-1/verify.py— these also run from the versioned plugin cache dir, so redirect uv's project environment the same way (#40;ren_paths.envs_dir()) rather than letting a.venvland inside that immutable cache dir. On verify success, callskills.install.lib.write_default_graph_config()(the new Obsidian tier view written during the migration). On verify failure: stop, show the FAIL lines, offer whole-wiki restore viaskills/update/scripts/restore.sh --whole <snapshot>(the snapshot taken at the start of this update). Never proceed to the closing summary with a failed verify.
0.8.0 update notes
- distiller-watermark seed (spec §3.5): a friend upgrading from before
0.8.0 has no distiller watermark yet. Initialize the watermark as a
post-update step after the version bump lands, gated by
skills.update.lib.should_run_distiller_watermark_seed(<old-version>, <new-version>)—Truewhen the update crosses the 0.8.0 boundary. Callskills.distill.lib.write_watermark("2026-08-03T00:00:00Z")ONLY ifskills.distill.lib.watermark_path()doesn't exist yet (idempotent — safe to (re-)run even if a friend already updated once without it). Seedocs/superpowers/specs/2026-08-18-knowledge-flows-train-design.md's §3.5 for the backlog-rescue acceptance run.
0.8.1 update notes
frontmatter-type-1 (issues #74, #77): a friend upgrading from before 0.8.1 has wiki pages created before the write door derived a frontmatter
type:from the page path, so those pages carry none — and every one of them keeps tripping wiki-health'smissing-frontmatter-typerule, filing a fresh suggestion per page per sweep. Runmigrations/frontmatter-type-1/migrate.pyonce as a post-update step after the version bump lands, gated byskills.update.lib.should_run_frontmatter_type_1(<old-version>, <new-version>)—Truewhen the update crosses the 0.8.1 boundary. Standalone global migration (walks the whole wiki tree callinglib.memory.page_types.ensure_type, not aschema_version-keyed page type) — seeskills/wiki-migration/schemas.json'sglobal_migrationsnote and that migration's README.md.--checkpreviews what would be stamped with zero writes; show the friend that preview before applying. Idempotent — safe to (re-)run even if a friend already updated once without it. It never overrides an existingtype:(invariant I1) and leaves any path the derivation table doesn't recognize untouched (I2).Run it before the friend's next
/ren:distillor/ren:wrap. Until a page is typed, a re-propose of unchanged content against it no longer normalizes equal — the proposal carriestype:and the page on disk does not — so each untyped page costs one extra self-healing write and a distillerWRITE_CAPslot. Running the migration first avoids that burst entirely.
Overlap note: snapshot substrate vs. Task 1.2's per-write snapshots
lib/memory/snapshot.py (Task 1.2, G9) is a DIFFERENT snapshot mechanism: per-write-id, page-granularity snapshots for the write-safety substrate (revert a single memory write in one step). scripts/snapshot.sh here is whole-wiki, version-bump-granularity, for migration rollback. They serve genuinely different purposes at different granularities — this skill's carried snapshot logic is NOT rewritten to unify with Task 1.2's substrate; that unification (if it's ever worth doing) is a 0.3-scoped ADR decision, not something to improvise here. Noted per the task brief's explicit instruction not to rewrite working carried code.
Closing steps (after re-verify)
- Re-render project CLAUDE.md blocks — call
skills.update.lib.rerender_all_project_claude_md()after migrations complete. The queue's post-apply hook andrevert's post-revert hook (lib.adapter.claude_md.rerender_for_page) each re-render only the ONE project touched by a single instructions.md write; an update can change the block's FORMAT (adapter changes, doctrine index refresh) for every project at once without touching instructions.md at all — this closes that spec §3(b) gap (#64). Best-effort per slug — the returned{slug: "ok" | "error: <msg>"}dict is informational, never a gate. AnUnknownreturn means the project registry could not be read: say so and name.reason, rather than reporting zero projects re-rendered. - Re-render the global CLAUDE.md block — call
lib.adapter.claude_md.write_global_claude_md(). The global block's doctrine index holds absolute paths pinned to the running plugin version (.../cache/ren-os/ren/<version>/doctrine/*.md), so a version bump leaves every one of them naming the PREVIOUS version — live only until that cache dir is GC'd, then dead links in a file injected into every session. The project-tier call above cannot cover this: it iterates projects with aninstructions.md, and the global block belongs to no project. Same shape as #64 one tier up. Best-effort like its project-tier sibling — report the returned status (added/updated/unchanged/conflict), never gate the update on it. Aconflictmeans torn markers in the friend's ownCLAUDE.md: say so and leave the file untouched. - Report what changed — build the "what changed in your RenOS" digest:
skills.update.lib.changelog_digest(<old-version>, <new-version>, <plugin-root>/CHANGELOG.md)(plugin root =$CLAUDE_PLUGIN_ROOT, falling back to the framework root). Print it verbatim under a "What changed in your RenOS" heading.""means the range is genuinely empty — say the update landed with no changelog entries in range. AnUnknownmeans the digest could not be produced at all: say so, name.reason, and point at CHANGELOG.md. The digest is a courtesy, never a gate — but a courtesy that cannot run should not read as a courtesy that found nothing. - Offer new companions — call
lib.companions.pending_offers(). If non-empty, say: "This update recommends companions you haven't decided on:" and list each (title — pitch — install hint). Same rules as install Stage 6: accepted tools are installed for them and recorded (record_choice(cid, "accepted")); accepted plugins get the hint + a restart note; declines are recorded and never re-asked; no answer records nothing. Nothing installs without an explicit yes in chat. - Re-warm the fast-path interpreter — call
skills.update.lib.rewarm_interpreter().warm_environment()runs at install and never at update, so the recorded interpreter kept naming the cache dir the update just superseded; the wake-up hook then falls through to colduvevery session, silently, because it fails safe. This also deletes the pre-0.8.3 record atstate_dir()/interpreter.json— that location is inside the wiki and therefore inside/ren:backup's push, so it carried one machine's absolute paths to every machine restoring the wiki. The record now lives inren_paths.machine_state_dir(), which is never backed up; that is what retired theplatform.node()comparison guarding it (macOS returns an IP-derived node name on some networks, so the guard rejected the machine's own valid record after any network change). Best-effort, never a gate — report the returnedstatus. - GC stale uv envs — call
skills.update.lib.gc_stale_envs(). It removesframework_root()/.envs/<v>dirs whose version is no longer in the plugin cache (#40 — the versions this same update just made stale) and returns the removed version list; report it if non-empty, silent otherwise. If it returnsUnknown, say the GC did not run and name.reason— silence there would report a sweep that never happened as a clean one. Best-effort, never a gate.
References
skills/wiki-migration/— the migration registry + verify/apply primitive this skill drivesmigrations/queue-governance-2-to-3/— the standalone (non-chain) queue-state migration named in the 0.3 update notes abovemigrations/trust-backfill-1/— the standalone (non-chain) wiki-wide migration named in the 0.5.1 update notes abovemigrations/l2-map-1-to-2/— the ordinary page-type-chain migration named in the 0.7.0 update notes abovelib/memory/snapshot.py(Task 1.2) — the OTHER snapshot mechanism (per-write, not whole-wiki); see overlap note aboveskills/doctor/— the post-update health check this skill's flow ends with
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

