{"id":"b94b3aad-a008-43c1-a708-d4cf230d642d","shortId":"KnCpvp","kind":"skill","title":"wiki-lint","tagline":"Health check the Obsidian wiki vault. Finds orphan pages, dead wikilinks, stale claims, missing cross-references, frontmatter gaps, and empty sections. Creates or updates Dataview dashboards. Generates canvas maps. Triggers on: \"lint\", \"health check\", \"clean up wiki\", \"check the ","description":"# wiki-lint: Wiki Health Check\n\nRun lint after every 10-15 ingests, or weekly. Ask before auto-fixing anything. Output a lint report to `wiki/meta/lint-report-YYYY-MM-DD.md`.\n\n---\n\n## Lint Checks\n\nWork through these in order:\n\n1. **Orphan pages**. Wiki pages with no inbound wikilinks. They exist but nothing points to them.\n2. **Dead links**. Wikilinks that reference a page that does not exist.\n3. **Stale claims**. Assertions on older pages that newer sources have contradicted or updated.\n4. **Missing pages**. Concepts or entities mentioned in multiple pages but lacking their own page.\n5. **Missing cross-references**. Entities mentioned in a page but not linked.\n6. **Frontmatter gaps**. Pages missing required fields (type, status, created, updated, tags).\n7. **Empty sections**. Headings with no content underneath.\n8. **Stale index entries**. Items in `wiki/index.md` pointing to renamed or deleted pages.\n9. **Address validity** (DragonScale Mechanism 2). For every page that has an `address:` frontmatter field, validate the format. See the **Address Validation** section below.\n10. **Semantic tiling** (DragonScale Mechanism 3, opt-in). Flag candidate duplicate pages (across all scanned types, not just concepts) via embedding cosine similarity. See the **Semantic Tiling** section below.\n\n---\n\n## Lint Report Format\n\nCreate at `wiki/meta/lint-report-YYYY-MM-DD.md`:\n\n```markdown\n---\ntype: meta\ntitle: \"Lint Report YYYY-MM-DD\"\ncreated: YYYY-MM-DD\nupdated: YYYY-MM-DD\ntags: [meta, lint]\nstatus: developing\n---\n\n# Lint Report: YYYY-MM-DD\n\n## Summary\n- Pages scanned: N\n- Issues found: N\n- Auto-fixed: N\n- Needs review: N\n\n## Orphan Pages\n- [[Page Name]]: no inbound links. Suggest: link from [[Related Page]] or delete.\n\n## Dead Links\n- [[Missing Page]]: referenced in [[Source Page]] but does not exist. Suggest: create stub or remove link.\n\n## Missing Pages\n- \"concept name\": mentioned in [[Page A]], [[Page B]], [[Page C]]. Suggest: create a concept page.\n\n## Frontmatter Gaps\n- [[Page Name]]: missing fields: status, tags\n\n## Stale Claims\n- [[Page Name]]: claim \"X\" may conflict with newer source [[Newer Source]].\n\n## Cross-Reference Gaps\n- [[Entity Name]] mentioned in [[Page A]] without a wikilink.\n```\n\n---\n\n## Naming Conventions\n\nEnforce these during lint:\n\n| Element | Convention | Example |\n|---------|-----------|---------|\n| Filenames | Title Case with spaces | `Machine Learning.md` |\n| Folders | lowercase with dashes | `wiki/data-models/` |\n| Tags | lowercase, hierarchical | `#domain/architecture` |\n| Wikilinks | match filename exactly | `[[Machine Learning]]` |\n\nFilenames must be unique across the vault. Wikilinks work without paths only if filenames are unique.\n\n---\n\n## Writing Style Check\n\nDuring lint, flag pages that violate the style guide:\n\n- Not declarative present tense (\"X basically does Y\" instead of \"X does Y\")\n- Missing source citations where claims are made\n- Uncertainty not flagged with `> [!gap]`\n- Contradictions not flagged with `> [!contradiction]`\n\n---\n\n## Dataview Dashboard\n\nCreate or update `wiki/meta/dashboard.md` with these queries:\n\n````markdown\n---\ntype: meta\ntitle: \"Dashboard\"\nupdated: YYYY-MM-DD\n---\n# Wiki Dashboard\n\n## Recent Activity\n```dataview\nTABLE type, status, updated FROM \"wiki\" SORT updated DESC LIMIT 15\n```\n\n## Seed Pages (Need Development)\n```dataview\nLIST FROM \"wiki\" WHERE status = \"seed\" SORT updated ASC\n```\n\n## Entities Missing Sources\n```dataview\nLIST FROM \"wiki/entities\" WHERE !sources OR length(sources) = 0\n```\n\n## Open Questions\n```dataview\nLIST FROM \"wiki/questions\" WHERE answer_quality = \"draft\" SORT created DESC\n```\n````\n\n---\n\n## Canvas Map\n\nCreate or update `wiki/meta/overview.canvas` for a visual domain map:\n\n```json\n{\n  \"nodes\": [\n    {\n      \"id\": \"1\",\n      \"type\": \"file\",\n      \"file\": \"wiki/overview.md\",\n      \"x\": 0, \"y\": 0,\n      \"width\": 300, \"height\": 140,\n      \"color\": \"1\"\n    }\n  ],\n  \"edges\": []\n}\n```\n\nAdd one node per domain page. Connect domains that have significant cross-references. Colors map to the CSS scheme: 1=blue, 2=purple, 3=yellow, 4=orange, 5=green, 6=red.\n\n---\n\n## Address Validation (DragonScale Mechanism 2 MVP)\n\n**Opt-in feature.** Address Validation runs only if the vault is using DragonScale, detected by:\n\n```bash\nif [ -x ./scripts/allocate-address.sh ] && [ -f ./.vault-meta/address-counter.txt ]; then\n  DRAGONSCALE_ADDRESSES=1\nelse\n  DRAGONSCALE_ADDRESSES=0\nfi\n```\n\nWhen `DRAGONSCALE_ADDRESSES=0`, skip this entire section. Missing `address:` fields are not flagged, not even informationally. Pages that happen to have an `address:` field are passed through unvalidated (treat as user-managed metadata).\n\nWhen `DRAGONSCALE_ADDRESSES=1`, proceed with the rollout baseline and checks below.\n\nRollout baseline: **2026-04-23** (Phase 2 ship date in vaults that adopted DragonScale on that day). Vaults that adopted DragonScale later should override this baseline by setting the earliest `created:` date of any addressed page as their personal rollout date. Record the chosen baseline at the top of `.vault-meta/legacy-pages.txt` as a commented line: `# rollout: YYYY-MM-DD`.\n\n### Classification rule (applied per page)\n\nBefore validating anything, classify the page:\n\n| Classification | Criteria |\n|---|---|\n| **Meta / fold / excluded** | File is in `wiki/folds/` OR filename in `{_index.md, index.md, log.md, hot.md, overview.md, dashboard.md, dashboard.base, Wiki Map.md, getting-started.md}`. Address not required. |\n| **Post-rollout (must have address)** | `type` is not meta/fold AND frontmatter `created:` date is >= 2026-04-23 AND file path is NOT in the legacy baseline manifest. |\n| **Legacy (backfill-eligible)** | `type` is not meta/fold AND frontmatter `created:` date is < 2026-04-23 OR file path IS in the legacy baseline manifest. Address not required until backfill. |\n\n**Legacy baseline manifest**: optional file at `.vault-meta/legacy-pages.txt`, one relative path per line. Pages listed there are treated as legacy regardless of `created:` date. Use this to grandfather pages whose `created:` metadata is wrong or missing.\n\n### Validation checks (run in order)\n\n1. **Format check**: any page with `address:` set must match one of:\n   - `^c-[0-9]{6}$` — post-rollout creation address.\n   - `^l-[0-9]{6}$` — legacy-backfill address.\n   - Pages under `wiki/folds/` use `fold_id`, not `address`; do not apply the `c-`/`l-` regex there.\n\n2. **Uniqueness check**: no two pages share the same address value. Report both paths.\n\n3. **Counter consistency**: `./scripts/allocate-address.sh --peek` returns the next counter value. Every observed `c-NNNNNN` must satisfy `NNNNNN < peek_value`. Violation = counter drift.\n\n4. **Post-rollout enforcement**: every page classified as \"post-rollout (must have address)\" that LACKS the `address:` field is a lint **error**, not informational. This prevents the silent-regression path where a new page skips address assignment.\n\n5. **Legacy identification**: every page classified as \"legacy\" that LACKS an address is informational. The lint report lists them under \"Pending backfill\" with total count.\n\n6. **Address-map consistency** (`.raw/.manifest.json`): for every page path in `address_map`, the page must exist and its frontmatter `address` must match the mapping. Mismatches are errors (either a rename dropped the map update, or a manual edit diverged).\n\n### Lint posture summary\n\n- Pages that HAVE an address with bad format: **error**.\n- Pages that HAVE colliding addresses: **error**.\n- Pages classified **post-rollout** WITHOUT an address: **error**.\n- Pages classified **legacy** WITHOUT an address: **informational** (expected).\n- Meta and fold pages without `address`: **ignored** (not applicable).\n- Counter drift (observed counter >= peek): **error**.\n- Address-map mismatch: **error**.\n\nLint only observes. Do NOT auto-assign missing addresses during lint. Assignment is `wiki-ingest`'s responsibility only.\n\n### Output section in the lint report\n\n```markdown\n## Address Validation\n\n- Counter state: `$(./scripts/allocate-address.sh --peek)`\n- Highest c- address observed: c-XXXXXX\n- Post-rollout pages checked: N (X passing, Y errors)\n- Legacy pages pending backfill: M\n\n### Errors\n- [[Page Name]]: invalid address format `{value}`. Expected `c-NNNNNN` or `l-NNNNNN`.\n- [[Page A]] and [[Page B]] share address `c-000042`.\n- [[Post-Rollout Page]]: missing address. Page created 2026-04-25 (post-rollout); address required. Run wiki-ingest or manually run `./scripts/allocate-address.sh` and add to frontmatter.\n- [[Page Name]] has address `c-000100` but counter peek is `50`. Counter drift; run `./scripts/allocate-address.sh --rebuild`.\n- `.raw/.manifest.json` maps `wiki/foo.md` -> `c-000010` but page frontmatter has `c-000012`. Resolve mismatch.\n\n### Pending backfill (informational)\n- M legacy pages without addresses. See `.vault-meta/legacy-pages.txt` for the canonical legacy set, or filter by `created:` < 2026-04-23.\n```\n\n---\n\n## Semantic Tiling (DragonScale Mechanism 3 MVP, opt-in)\n\n**Opt-in feature.** Semantic tiling flags candidate duplicate *pages* (not just concept pages — see Scope below) using embedding cosine similarity. Local ollama only by default; remote endpoints require an explicit override flag.\n\n### Detection and delegation\n\n```bash\nif [ -x ./scripts/tiling-check.py ] && command -v python3 >/dev/null 2>&1; then\n  ./scripts/tiling-check.py --peek > /tmp/tiling-peek.json 2>/dev/null\n  PEEK_EXIT=$?\n  case $PEEK_EXIT in\n    0)  TILING_READY=1 ;;                                  # ready\n    2)  TILING_READY=0 ; echo \"tiling ERROR: usage error (exit 2); inspect /tmp/tiling-peek.json\" ;;\n    3)  TILING_READY=0 ; echo \"tiling ERROR: cache corrupt (exit 3); inspect .vault-meta/tiling-cache.json\" ;;\n    4)  TILING_READY=0 ; echo \"tiling ERROR: vault exceeds scale hard-fail (exit 4); batching required\" ;;\n    10) TILING_READY=0 ; echo \"tiling skipped: ollama not reachable (exit 10)\" ;;\n    11) TILING_READY=0 ; echo \"tiling skipped: run 'ollama pull nomic-embed-text' to enable (exit 11)\" ;;\n    *)  TILING_READY=0 ; echo \"tiling ERROR: unexpected exit code $PEEK_EXIT from tiling-check.py --peek\" ;;\n  esac\nelse\n  TILING_READY=0\n  echo \"tiling skipped: scripts/tiling-check.py or python3 not available\"\nfi\n```\n\nInspect `/tmp/tiling-peek.json` (structured diagnostics: script path, python interpreter, ollama URL, cache state, thresholds state) whenever the status is ambiguous. Never collapse unknown exits into \"unknown status\" silently.\n\nWhen `TILING_READY=1`:\n\n```bash\n./scripts/tiling-check.py --report wiki/meta/tiling-report-YYYY-MM-DD.md\nREPORT_EXIT=$?\ncase $REPORT_EXIT in\n  0)  echo \"tiling report written\" ;;\n  2)  echo \"tiling ERROR: usage error during --report\" ;;\n  3)  echo \"tiling ERROR: cache corrupt during --report\" ;;\n  4)  echo \"tiling ERROR: scale hard-fail during --report\" ;;\n  10) echo \"tiling ERROR: ollama became unreachable between --peek and --report\" ;;\n  11) echo \"tiling ERROR: model became unavailable between --peek and --report\" ;;\n  *)  echo \"tiling ERROR: unexpected exit code $REPORT_EXIT from tiling-check.py --report\" ;;\nesac\n```\n\n### Scope (what the helper scans)\n\n- Includes: every `.md` under `wiki/` **except** the exclusion set below. The scope is \"candidate tileable pages,\" not just `type: concept`.\n- Excludes (path): anything under `wiki/folds/` or `wiki/meta/`.\n- Excludes (filename): `_index.md`, `index.md`, `log.md`, `hot.md`, `overview.md`, `dashboard.md`, `Wiki Map.md`, `getting-started.md`.\n- Excludes (frontmatter): `type: meta` or `type: fold`.\n- Excludes (security): symlinks. Any page file that is a symlink, or whose resolved path escapes the vault root, is skipped.\n\nIf you place a real concept under `wiki/meta/` it will be excluded by path regardless of content. Keep concepts in their canonical folders.\n\n### How the helper works\n\n- Computes one embedding per included page via the ollama `nomic-embed-text` model by default.\n- Caches embeddings at `.vault-meta/tiling-cache.json`, keyed on `sha256(model + body)` so model drift auto-invalidates. Frontmatter is not part of the hash or the embedding input — pure frontmatter edits (tag changes, status bumps) do not trigger recomputation.\n- Orphans are GC'd: when a cached page path no longer exists on disk, its entry is dropped on save.\n- Concurrent-safe: exclusive flock on `.vault-meta/.tiling.lock` around cache I/O; per-PID temp file for atomic writes.\n\n### Security posture\n\n- Defaults to `http://127.0.0.1:11434`. `OLLAMA_URL` env override is accepted **only** with `--allow-remote-ollama` because page bodies are POSTed as embedding input.\n- Symlinks and vault-root escapes are rejected.\n\n### Default bands (conservative seeds, NOT calibrated)\n\n| Band | Similarity | Report section |\n|---|---|---|\n| Error | `>= 0.90` | **Errors** — strong near-duplicate, likely the same concept |\n| Review | `0.80 - 0.90` | **Review** — possible tile overlap; human judgement needed |\n| Pass | `< 0.80` | not emitted |\n\n**These values are conservative seeds, not literature-backed interpolation.** Published reference points: Sentence Transformers `community_detection` defaults to 0.75; Quora-duplicate calibrations land around 0.7715-0.8352 depending on objective. The 0.80 review floor is already stricter than at least one cited Quora optimum, so expect **false negatives** against those baselines. Reduce the review floor during calibration if you want more sensitivity.\n\n### Calibration procedure (manual, one-time per vault)\n\n1. Run the helper with defaults. Capture the **Review** band pairs.\n2. Temporarily lower `bands.review` to `0.70` in `.vault-meta/tiling-thresholds.json` to surface a wider sample. Aim for >=50 pairs spanning 0.70-0.95.\n3. Label each pair: `duplicate`, `similar`, `distinct`.\n4. Pick bands such that: (a) the `error` band contains >= 95% true duplicates; (b) the `review` band captures `similar` pairs without swamping the report with `distinct` ones.\n5. Edit `.vault-meta/tiling-thresholds.json`: set new `bands.error` and `bands.review`, set `calibrated: true`, set `calibration_pairs_labeled` to the label count.\n6. Re-run lint. Report footer now says `calibrated: true`.\n\n### Scale\n\n- Cold-cache cost is O(N) POSTs to ollama. Warm-cache cost is O(N^2) cosines in pure Python.\n- Helper prints a warning at > 500 pages and hard-fails (exit 4) at > 5000. Revisit the implementation (batching, vectorized cosine, or external tooling) before exceeding either limit.\n\n### Lint report embed\n\n```markdown\n## Semantic Tiling\nSee [[tiling-report-YYYY-MM-DD]] for the full pair listing.\n- Errors (>=0.90): N pairs\n- Review (0.80-0.90): M pairs\n- Calibrated: true|false\n```\n\n### Invariants\n\n- Read-only. `tiling-check.py` never modifies wiki pages.\n- No auto-merge. Duplicates are listed, never resolved.\n- Cache is incremental and model-scoped. Unchanged pages are not re-embedded.\n- Exit codes: `0` ok, `2` usage error, `3` cache corrupt, `4` scale hard-fail, `10` ollama unreachable, `11` model missing. Surface all of them; do not collapse into a single \"unknown\" bucket.\n\n---\n\n## Before Auto-Fixing\n\nAlways show the lint report first. Ask: \"Should I fix these automatically, or do you want to review each one?\"\n\nSafe to auto-fix:\n- Adding missing frontmatter fields with placeholder values\n- Creating stub pages for missing entities\n- Adding wikilinks for unlinked mentions\n\nNeeds review before fixing:\n- Deleting orphan pages (they might be intentionally isolated)\n- Resolving contradictions (requires human judgment)\n- Merging duplicate pages","tags":["wiki","lint","claude","obsidian","agricidaniel","agent-skills","ai-second-brain","autonomous-research","claude-code","claude-code-skill","claude-plugin","karpathy-llm-wiki"],"capabilities":["skill","source-agricidaniel","skill-wiki-lint","topic-agent-skills","topic-ai-second-brain","topic-autonomous-research","topic-claude-code","topic-claude-code-skill","topic-claude-plugin","topic-karpathy-llm-wiki","topic-knowledge-graph","topic-knowledge-management","topic-llm","topic-multi-agent","topic-obsidian"],"categories":["claude-obsidian"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/AgriciDaniel/claude-obsidian/wiki-lint","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"cli":"npx skills add AgriciDaniel/claude-obsidian","source_repo":"https://github.com/AgriciDaniel/claude-obsidian","install_from":"skills.sh"}},"qualityScore":"0.700","qualityRationale":"deterministic score 0.70 from registry signals: · indexed on github topic:agent-skills · 5150 github stars · SKILL.md body (15,526 chars)","verified":false,"liveness":"unknown","lastLivenessCheck":null,"agentReviews":{"count":0,"score_avg":null,"cost_usd_avg":null,"success_rate":null,"latency_p50_ms":null,"narrative_summary":null,"summary_updated_at":null},"enrichmentModel":"deterministic:skill-github:v1","enrichmentVersion":1,"enrichedAt":"2026-05-18T18:52:44.578Z","embedding":null,"createdAt":"2026-05-18T12:53:57.800Z","updatedAt":"2026-05-18T18:52:44.578Z","lastSeenAt":"2026-05-18T18:52:44.578Z","tsv":"'-0.8352':1853 '-0.90':2073 '-0.95':1930 '-000010':1247 '-000012':1253 '-000042':1198 '-000100':1232 '-04':682,793,819,1208,1279 '-15':55 '-23':683,794,820,1280 '-25':1209 '-9':892,901 '/.tiling.lock':1745 '/.vault-meta/address-counter.txt':622 '/dev/null':1333,1341 '/legacy-pages.txt':731,844,1268 '/scripts/allocate-address.sh':620,940,1151,1222,1241 '/scripts/tiling-check.py':1329,1337,1489 '/tiling-cache.json':1381,1682 '/tiling-thresholds.json':1918,1970 '/tmp/tiling-peek.json':1339,1365,1458 '0':519,553,555,630,635,891,900,1348,1356,1369,1385,1402,1414,1431,1447,1498,2113 '0.70':1913,1929 '0.75':1845 '0.7715':1852 '0.80':1813,1823,1858,2072 '0.90':1802,1814,2068 '1':78,547,561,583,626,670,878,1335,1351,1487,1897 '10':54,205,1399,1410,1529,2126 '11':1411,1428,1540,2129 '11434':1762 '127.0.0.1':1761 '140':559 '15':492 '2':94,186,585,599,685,923,1334,1340,1353,1363,1503,1908,2016,2115 '2026':681,792,818,1207,1278 '3':106,210,587,937,1285,1366,1376,1511,1931,2118 '300':557 '4':120,589,960,1382,1396,1519,1938,2033,2121 '5':135,591,1000,1965 '50':1237,1926 '500':2026 '5000':2035 '6':148,593,893,902,1025,1987 '7':160 '8':168 '9':181 '95':1948 'accept':1768 'across':218,404 'activ':480 'ad':2173,2186 'add':563,1224 'address':182,193,201,595,605,625,629,634,641,655,669,713,774,782,830,884,898,906,914,932,974,978,998,1011,1027,1036,1045,1072,1081,1090,1097,1105,1116,1129,1147,1155,1179,1196,1204,1213,1230,1263 'address-map':1026,1115 'adopt':691,698 'aim':1924 'allow':1772 'allow-remote-ollama':1771 'alreadi':1862 'alway':2148 'ambigu':1475 'answer':527 'anyth':64,748,1590 'appli':743,917 'applic':1108 'around':1746,1851 'asc':506 'ask':59,2154 'assert':109 'assign':999,1127,1132 'atom':1755 'auto':62,280,1126,1692,2090,2146,2171 'auto-assign':1125 'auto-fix':61,279,2145,2170 'auto-invalid':1691 'auto-merg':2089 'automat':2159 'avail':1455 'b':327,1194,1951 'back':1834 'backfil':807,834,905,1021,1173,1257 'backfill-elig':806 'bad':1074 'band':1792,1797,1906,1940,1946,1954 'bands.error':1973 'bands.review':1911,1975 'baselin':675,680,704,723,803,828,836,1877 'bash':617,1326,1488 'basic':433 'batch':1397,2039 'becam':1534,1545 'blue':584 'bodi':1687,1777 'bucket':2143 'bump':1711 'c':329,890,919,950,1154,1158,1184,1197,1231,1246,1252 'c-nnnnnn':949,1183 'c-xxxxxx':1157 'cach':1373,1467,1515,1676,1722,1747,2001,2011,2097,2119 'calibr':1796,1849,1883,1889,1977,1980,1996,2076 'candid':215,1297,1581 'canon':1271,1654 'canva':32,533 'captur':1903,1955 'case':380,1344,1494 'chang':1709 'check':5,38,42,49,72,418,677,874,880,925,1164 'chosen':722 'citat':443 'cite':1868 'claim':16,108,344,347,445 'classif':741,752 'classifi':749,967,1005,1084,1093 'clean':39 'code':1437,1556,2112 'cold':2000 'cold-cach':1999 'collaps':1477,2138 'collid':1080 'color':560,577 'command':1330 'comment':734 'communiti':1841 'comput':1660 'concept':123,224,320,333,1302,1587,1638,1651,1811 'concurr':1737 'concurrent-saf':1736 'conflict':350 'connect':569 'conserv':1793,1829 'consist':939,1029 'contain':1947 'content':166,1649 'contradict':117,453,457,2204 'convent':370,376 'corrupt':1374,1516,2120 'cosin':227,1309,2017,2041 'cost':2002,2012 'count':1024,1986 'counter':938,945,958,1109,1112,1149,1234,1238 'creat':26,157,238,251,313,331,460,531,535,709,789,815,859,867,1206,1277,2180 'creation':897 'criteria':753 'cross':19,138,357,575 'cross-refer':18,137,356,574 'css':581 'd':1719 'dash':388 'dashboard':30,459,471,478 'dashboard.base':770 'dashboard.md':769,1602 'dataview':29,458,481,497,510,522 'date':687,710,719,790,816,860 'day':695 'dd':250,255,260,271,476,740,2061 'dead':13,95,300 'declar':429 'default':1315,1675,1759,1791,1843,1902 'deleg':1325 'delet':179,299,2195 'depend':1854 'desc':490,532 'detect':615,1323,1842 'develop':265,496 'diagnost':1460 'disk':1729 'distinct':1937,1963 'diverg':1064 'domain':542,567,570 'domain/architecture':393 'draft':529 'dragonscal':184,208,597,614,624,628,633,668,692,699,1283 'drift':959,1110,1239,1690 'drop':1056,1733 'duplic':216,1298,1807,1848,1935,1950,2092,2209 'earliest':708 'echo':1357,1370,1386,1403,1415,1432,1448,1499,1504,1512,1520,1530,1541,1551 'edg':562 'edit':1063,1707,1966 'either':1053,2047 'element':375 'elig':808 'els':627,1444 'emb':1423,1671,2051 'embed':226,1308,1662,1677,1703,1781,2110 'emit':1825 'empti':24,161 'enabl':1426 'endpoint':1317 'enforc':371,964 'entir':638 'entiti':125,140,360,507,2185 'entri':171,1731 'env':1765 'error':983,1052,1076,1082,1091,1114,1119,1169,1175,1359,1361,1372,1388,1434,1506,1508,1514,1522,1532,1543,1553,1801,1803,1945,2067,2117 'esac':1443,1562 'escap':1627,1788 'even':647 'everi':53,188,947,965,1003,1032,1569 'exact':397 'exampl':377 'exceed':1390,2046 'except':1573 'exclud':756,1588,1595,1606,1613,1644 'exclus':1575,1739 'exist':88,105,311,1041,1727 'exit':1343,1346,1362,1375,1395,1409,1427,1436,1439,1479,1493,1496,1555,1558,2032,2111 'expect':1099,1182,1872 'explicit':1320 'extern':2043 'f':621 'fail':1394,1526,2031,2125 'fals':1873,2078 'featur':604,1293 'fi':631,1456 'field':154,195,340,642,656,979,2176 'file':549,550,757,796,822,839,1618,1753 'filenam':378,396,400,413,762,1596 'filter':1275 'find':10 'first':2153 'fix':63,281,2147,2157,2172,2194 'flag':214,421,450,455,645,1296,1322 'flock':1740 'floor':1860,1881 'fold':755,911,1102,1612 'folder':385,1655 'footer':1993 'format':198,237,879,1075,1180 'found':277 'frontmatt':21,149,194,335,788,814,1044,1226,1250,1607,1694,1706,2175 'full':2064 'gap':22,150,336,359,452 'gc':1718 'generat':31 'getting-started.md':773,1605 'grandfath':864 'green':592 'guid':427 'happen':651 'hard':1393,1525,2030,2124 'hard-fail':1392,1524,2029,2123 'hash':1700 'head':163 'health':4,37,48 'height':558 'helper':1566,1658,1900,2021 'hierarch':392 'highest':1153 'hot.md':767,1600 'human':1819,2206 'i/o':1748 'id':546,912 'identif':1002 'ignor':1106 'implement':2038 'inbound':85,291 'includ':1568,1664 'increment':2099 'index':170 'index.md':764,765,1597,1598 'inform':648,985,1013,1098,1258 'ingest':56,1136,1218 'input':1704,1782 'inspect':1364,1377,1457 'instead':436 'intent':2201 'interpol':1835 'interpret':1464 'invalid':1178,1693 'invari':2079 'isol':2202 'issu':276 'item':172 'json':544 'judgement':1820 'judgment':2207 'keep':1650 'key':1683 'l':899,920,1188 'l-nnnnnn':1187 'label':1932,1982,1985 'lack':131,976,1009 'land':1850 'later':700 'learn':399 'learning.md':384 'least':1866 'legaci':802,805,827,835,856,904,1001,1007,1094,1170,1260,1272 'legacy-backfil':903 'length':517 'like':1808 'limit':491,2048 'line':735,849 'link':96,147,292,294,301,317 'lint':3,36,46,51,67,71,235,245,263,266,374,420,982,1015,1065,1120,1131,1144,1991,2049,2151 'list':498,511,523,851,1017,2066,2094 'literatur':1833 'literature-back':1832 'local':1311 'log.md':766,1599 'longer':1726 'lower':1910 'lowercas':386,391 'm':1174,1259,2074 'machin':383,398 'made':447 'manag':665 'manifest':804,829,837 'manual':1062,1220,1891 'map':33,534,543,578,1028,1037,1049,1058,1117,1244 'map.md':772,1604 'markdown':241,467,1146,2052 'match':395,887,1047 'may':349 'md':1570 'mechan':185,209,598,1284 'mention':126,141,322,362,2190 'merg':2091,2208 'meta':243,262,469,730,754,843,1100,1267,1380,1609,1681,1744,1917,1969 'meta/fold':786,812 'metadata':666,868 'might':2199 'mismatch':1050,1118,1255 'miss':17,121,136,152,302,318,339,441,508,640,872,1128,1203,2131,2174,2184 'mm':249,254,259,270,475,739,2060 'model':1544,1673,1686,1689,2102,2130 'model-scop':2101 'modifi':2085 'multipl':128 'must':401,780,886,952,972,1040,1046 'mvp':600,1286 'n':275,278,282,285,1165,2005,2015,2069 'name':289,321,338,346,361,369,1177,1228 'near':1806 'near-dupl':1805 'need':283,495,1821,2191 'negat':1874 'never':1476,2084,2095 'new':995,1972 'newer':114,352,354 'next':944 'nnnnnn':951,954,1185,1189 'node':545,565 'nomic':1422,1670 'nomic-embed-text':1421,1669 'noth':90 'o':2004,2014 'object':1856 'observ':948,1111,1122,1156 'obsidian':7 'ok':2114 'older':111 'ollama':1312,1406,1419,1465,1533,1668,1763,1774,2008,2127 'one':564,845,888,1661,1867,1893,1964,2167 'one-tim':1892 'open':520 'opt':212,602,1288,1291 'opt-in':211,601,1287,1290 'optimum':1870 'option':838 'orang':590 'order':77,877 'orphan':11,79,286,1716,2196 'output':65,1140 'overlap':1818 'overrid':702,1321,1766 'overview.md':768,1601 'page':12,80,82,101,112,122,129,134,144,151,180,189,217,273,287,288,297,303,307,319,324,326,328,334,337,345,364,422,494,568,649,714,745,751,850,865,882,907,928,966,996,1004,1033,1039,1068,1077,1083,1092,1103,1163,1171,1176,1190,1193,1202,1205,1227,1249,1261,1299,1303,1583,1617,1665,1723,1776,2027,2087,2105,2182,2197,2210 'pair':1907,1927,1934,1957,1981,2065,2070,2075 'part':1697 'pass':658,1167,1822 'path':410,797,823,847,936,992,1034,1462,1589,1626,1646,1724 'peek':941,955,1113,1152,1235,1338,1342,1345,1438,1442,1537,1548 'pend':1020,1172,1256 'per':566,744,848,1663,1750,1895 'per-pid':1749 'person':717 'phase':684 'pick':1939 'pid':1751 'place':1635 'placehold':2178 'point':91,175,1838 'possibl':1816 'post':778,895,962,970,1086,1161,1200,1211,1779,2006 'post-rollout':777,894,961,969,1085,1160,1199,1210 'postur':1066,1758 'present':430 'prevent':987 'print':2022 'procedur':1890 'proceed':671 'publish':1836 'pull':1420 'pure':1705,2019 'purpl':586 'python':1463,2020 'python3':1332,1453 'qualiti':528 'queri':466 'question':521 'quora':1847,1869 'quora-dupl':1846 'raw/.manifest.json':1030,1243 're':1989,2109 're-embed':2108 're-run':1988 'reachabl':1408 'read':2081 'read-on':2080 'readi':1350,1352,1355,1368,1384,1401,1413,1430,1446,1486 'real':1637 'rebuild':1242 'recent':479 'recomput':1715 'record':720 'red':594 'reduc':1878 'refer':20,99,139,358,576,1837 'referenc':304 'regardless':857,1647 'regex':921 'regress':991 'reject':1790 'relat':296,846 'remot':1316,1773 'remov':316 'renam':177,1055 'report':68,236,246,267,934,1016,1145,1490,1492,1495,1501,1510,1518,1528,1539,1550,1557,1561,1799,1961,1992,2050,2058,2152 'requir':153,776,832,1214,1318,1398,2205 'resolv':1254,1625,2096,2203 'respons':1138 'return':942 'review':284,1812,1815,1859,1880,1905,1953,2071,2165,2192 'revisit':2036 'rollout':674,679,718,736,779,896,963,971,1087,1162,1201,1212 'root':1630,1787 'rule':742 'run':50,607,875,1215,1221,1240,1418,1898,1990 'safe':1738,2168 'sampl':1923 'satisfi':953 'save':1735 'say':1995 'scale':1391,1523,1998,2122 'scan':220,274,1567 'scheme':582 'scope':1305,1563,1579,2103 'script':1461 'scripts/tiling-check.py':1451 'section':25,162,203,233,639,1141,1800 'secur':1614,1757 'see':199,229,1264,1304,2055 'seed':493,503,1794,1830 'semant':206,231,1281,1294,2053 'sensit':1888 'sentenc':1839 'set':706,885,1273,1576,1971,1976,1979 'sha256':1685 'share':929,1195 'ship':686 'show':2149 'signific':573 'silent':990,1483 'silent-regress':989 'similar':228,1310,1798,1936,1956 'singl':2141 'skill' 'skill-wiki-lint' 'skip':636,997,1405,1417,1450,1632 'sort':488,504,530 'sourc':115,306,353,355,442,509,515,518 'source-agricidaniel' 'space':382 'span':1928 'stale':15,107,169,343 'state':1150,1468,1470 'status':156,264,341,484,502,1473,1482,1710 'stricter':1863 'strong':1804 'structur':1459 'stub':314,2181 'style':417,426 'suggest':293,312,330 'summari':272,1067 'surfac':1920,2132 'swamp':1959 'symlink':1615,1622,1783 'tabl':482 'tag':159,261,342,390,1708 'temp':1752 'temporarili':1909 'tens':431 'text':1424,1672 'threshold':1469 'tile':207,232,1282,1295,1349,1354,1358,1367,1371,1383,1387,1400,1404,1412,1416,1429,1433,1445,1449,1485,1500,1505,1513,1521,1531,1542,1552,1817,2054,2057 'tileabl':1582 'tiling-check.py':1441,1560,2083 'tiling-report-yyyy-mm-dd':2056 'time':1894 'titl':244,379,470 'tool':2044 'top':726 'topic-agent-skills' 'topic-ai-second-brain' 'topic-autonomous-research' 'topic-claude-code' 'topic-claude-code-skill' 'topic-claude-plugin' 'topic-karpathy-llm-wiki' 'topic-knowledge-graph' 'topic-knowledge-management' 'topic-llm' 'topic-multi-agent' 'topic-obsidian' 'total':1023 'transform':1840 'treat':661,854 'trigger':34,1714 'true':1949,1978,1997,2077 'two':927 'type':155,221,242,468,483,548,783,809,1586,1608,1611 'unavail':1546 'uncertainti':448 'unchang':2104 'underneath':167 'unexpect':1435,1554 'uniqu':403,415,924 'unknown':1478,1481,2142 'unlink':2189 'unreach':1535,2128 'unvalid':660 'updat':28,119,158,256,462,472,485,489,505,537,1059 'url':1466,1764 'usag':1360,1507,2116 'use':613,861,910,1307 'user':664 'user-manag':663 'v':1331 'valid':183,196,202,596,606,747,873,1148 'valu':933,946,956,1181,1827,2179 'vault':9,406,611,689,696,729,842,1266,1379,1389,1629,1680,1743,1786,1896,1916,1968 'vault-meta':728,841,1265,1378,1679,1742,1915,1967 'vault-root':1785 'vector':2040 'via':225,1666 'violat':424,957 'visual':541 'want':1886,2163 'warm':2010 'warm-cach':2009 'warn':2024 'week':58 'whenev':1471 'whose':866,1624 'wider':1922 'width':556 'wiki':2,8,41,45,47,81,477,487,500,771,1135,1217,1572,1603,2086 'wiki-ingest':1134,1216 'wiki-lint':1,44 'wiki/data-models':389 'wiki/entities':513 'wiki/folds':760,909,1592 'wiki/foo.md':1245 'wiki/index.md':174 'wiki/meta':1594,1640 'wiki/meta/dashboard.md':463 'wiki/meta/lint-report-yyyy-mm-dd.md':70,240 'wiki/meta/overview.canvas':538 'wiki/meta/tiling-report-yyyy-mm-dd.md':1491 'wiki/overview.md':551 'wiki/questions':525 'wikilink':14,86,97,368,394,407,2187 'without':366,409,1088,1095,1104,1262,1958 'work':73,408,1659 'write':416,1756 'written':1502 'wrong':870 'x':348,432,438,552,619,1166,1328 'xxxxxx':1159 'y':435,440,554,1168 'yellow':588 'yyyi':248,253,258,269,474,738,2059 'yyyy-mm-dd':247,252,257,268,473,737","prices":[{"id":"a7a5a0e9-aaaa-40b1-b1a7-859531572c98","listingId":"b94b3aad-a008-43c1-a708-d4cf230d642d","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"AgriciDaniel","category":"claude-obsidian","install_from":"skills.sh"},"createdAt":"2026-05-18T12:53:57.800Z"}],"sources":[{"listingId":"b94b3aad-a008-43c1-a708-d4cf230d642d","source":"github","sourceId":"AgriciDaniel/claude-obsidian/wiki-lint","sourceUrl":"https://github.com/AgriciDaniel/claude-obsidian/tree/main/skills/wiki-lint","isPrimary":false,"firstSeenAt":"2026-05-18T12:53:57.800Z","lastSeenAt":"2026-05-18T18:52:44.578Z"}],"details":{"listingId":"b94b3aad-a008-43c1-a708-d4cf230d642d","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"AgriciDaniel","slug":"wiki-lint","github":{"repo":"AgriciDaniel/claude-obsidian","stars":5150,"topics":["agent-skills","ai","ai-second-brain","autonomous-research","claude-code","claude-code-skill","claude-plugin","karpathy-llm-wiki","knowledge-graph","knowledge-management","llm","multi-agent","obsidian","obsidian-ai","obsidian-plugin","open-source","pkm","rag","second-brain","wiki"],"license":"mit","html_url":"https://github.com/AgriciDaniel/claude-obsidian","pushed_at":"2026-04-24T10:21:48Z","description":"Claude + Obsidian knowledge companion. Persistent, compounding wiki vault based on Karpathy's LLM Wiki pattern. /wiki /save /autoresearch","skill_md_sha":"554ff890bfda3e73a205d351d2ce7c05b78c1d1b","skill_md_path":"skills/wiki-lint/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/AgriciDaniel/claude-obsidian/tree/main/skills/wiki-lint"},"layout":"multi","source":"github","category":"claude-obsidian","frontmatter":{"name":"wiki-lint","description":"Health check the Obsidian wiki vault. Finds orphan pages, dead wikilinks, stale claims, missing cross-references, frontmatter gaps, and empty sections. Creates or updates Dataview dashboards. Generates canvas maps. Triggers on: \"lint\", \"health check\", \"clean up wiki\", \"check the wiki\", \"wiki maintenance\", \"find orphans\", \"wiki audit\"."},"skills_sh_url":"https://skills.sh/AgriciDaniel/claude-obsidian/wiki-lint"},"updatedAt":"2026-05-18T18:52:44.578Z"}}