Use before creating, editing or restructuring any page under wiki/ — the Obsidian vault for the whole monorepo. Covers where edits must be made, the syntax skill to load, what renders on GitHub as well as in Obsidian, required frontmatter, linking a new page into the map, and how to write a measured number.
70
88%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
Passed
No findings from the security scan
Every page under wiki/ is read in two places: Obsidian, and GitHub. Follow each step before you finish the edit.
Write pages with Edit or Write in the current worktree. Never use the Obsidian MCP write tools (create_vault_file, patch_vault_file, search_and_replace, …) or obsidian create / append / property:set: both target the main worktree's wiki/, not your branch.
The folders mirror the monorepo. Choose by who the page is about, not what kind of page it is:
| Folder | Holds |
|---|---|
osn/, musubi/, pulse/, cire/, zap/ | Everything about that product: its overview (<product>/<product>.md, or osn-core.md, social.md), systems, architecture, runbooks, and <product>-development.md for its build rules |
shared/ | What applies to more than one product: backend and frontend patterns, shared packages, platform systems (D1, rate limiting, email), deploys and free-tier limits. shared/observability/ holds logging, tracing and metrics |
conventions/ | How we work: tests, comments, commands, pull requests, issues, agent tooling |
decisions/ | One record per choice made between named alternatives, plus deferred-decisions.md |
compliance/ | The legal programme, across products |
Product folders stay flat; the page's tags say whether it is a system or a runbook. Filenames stay unique across the whole vault, so a product page that could collide takes the product prefix (cire-auth, pulse-onboarding). The one exception is a folder's index or README: both names exist twice, and a bare [[index]] or [[README]] resolves to the page at the vault root. A page that starts in one product and later applies to two moves to shared/.
Moving a page keeps a bare [[page-name]] link working, because it resolves by filename. A link written with a folder, such as [[dpia/cire-guest-data]], breaks, and so does every repo path that cites the page — code comments, skills, AGENTS.md and issue bodies. bun scripts/check-wikilinks.ts finds the broken wikilinks; find the repo paths with grep -rn "wiki/<old-folder>/<name>" .. Fix both in the same pull request.
Invoke obsidian:obsidian-markdown before writing. It is the syntax authority for this vault — wikilinks ([[Note#Heading]], [[Note#^block-id]], [[Note|alias]]), embeds, callouts, properties, nested tags, %%comments%%, ==highlights==, and mermaid nodes that link to notes. Half of it is not CommonMark, so do not guess.
| Feature | Obsidian | GitHub |
|---|---|---|
| Tables, mermaid, footnotes | Yes | Yes |
Callouts note, tip, important, warning, caution | Yes | Yes (GitHub alerts, same syntax) |
Other callout types, [[wikilinks]], embeds, block IDs, ==highlight== | Yes | No — literal text |
.base and .canvas files | Yes | No — raw YAML/JSON |
Use tables and mermaid for anything a GitHub reader needs. A .base or .canvas adds to a page's prose and never replaces it: remote and CI sessions only have grep.
title, tags, related and last-reviewed. Set last-reviewed to today on every page you touch, except where the only change is a mechanical find-and-replace across many pages: nobody read those pages, so their date stays.[[wikilinks]], never relative markdown links. Link to a source file with a relative markdown link from the page's directory. Cire pages carry a cire- prefix where a bare name would collide.wiki/index.md, in the right section. Product-specific build rules go in wiki/<product>/<product>-development.md, never a nested AGENTS.md or CLAUDE.md; a fact true of more than one product belongs in frontend-patterns, backend-patterns or testing-patterns.A page says what is true now. No "used to", "was moved", "the first attempt" — git log holds history. A reason that stops a mistake stays.
When an edit changes one fact in a sentence or table row, the other claims in that sentence or row are yours to check too. Either check each one against the code, or narrow the edit to the words that change. Four misses from a branch that rewrote the production deploy path:
shared/production-deploy.md §3.4 named three builds that read the Turnstile sitekey. Only one does. Following the list breaks sign-in.cire/cire.md kept "cire-web / organiser Pages" and two archived migrations.shared/production-deploy.md §4.3 kept "dev and staging, which no CI job touches". CI now migrates dev.zap.cireweddings.com.Each one sat in a line the branch had already rewritten. Re-read the whole sentence or row before you finish.
Two kinds, written differently.
A documented ceiling is a provider's published limit. Leave it in prose and name the pricing page.
A measured figure is ours, and nobody can check it without running something. Put the command and date on the line under it, as visible italic text — an HTML comment renders on neither surface:
A full dev rebuild costs **8,007 D1 rows written**.
*Measured 2026-09-10 — `bunx wrangler d1 insights cire-db-dev --time-period=7d --sort-by=writes`*Where no single command produces it, name the method (Measured 2026-08-31 — latency probe from a Sydney client, n=25). Where the method or date is unknown, write *Unverified — …*, say what you do know, and leave the figure alone. Never invent a command.
last-reviewed means someone read the page, not that its numbers are true; the measured marker is what a reader re-runs.
englishstreetventures/osn
6786570
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.