--- name: audit-world description: Audit a world for consistency, D&D 5e 2024 rule compliance, broken links, orphaned entities, and connection gaps. Provides detailed reports and can auto-fix issues. argument-hint: "[world] [--fix] [--check links|stats|orphans|images|circular] [--category Type]" --- # Audit World Audit world: $ARGUMENTS ## Overview This skill performs comprehensive audits on worldbuilding projects to ensure: - **Entity Linking:** All `[[wikilinks]]` point to real entities - **Bidirectional Connections:** If A links to B, B should link back to A - **D&D 5e 2024 Compliance:** Stat blocks are mechanically correct - **Template Compliance:** Entities use correct templates for their type - **Orphan Detection:** No entities exist without incoming links - **Consistency:** Cross-entity references make logical sense ## Instructions ### Step 1: Parse Arguments Extract from arguments: 1. **World name** - Required. Check `Worlds/` for existing worlds. 2. **--fix flag** - Optional. If present, automatically fix issues where possible. 3. **--category [type]** - Optional. Only audit specific category (Characters, Settlements, etc.) 4. **--check [type]** - Optional. Run specific check only (links, stats, orphans, connections, templates, images, circular) If world name not provided, list available worlds and ask which to audit. ### Step 2: Scan World Structure 1. **Verify directory structure:** ``` Worlds/[World Name]/ ├── World Overview.md ├── Characters/ ├── Settlements/ ├── Items/ ├── Creatures/ ├── Organizations/ ├── Concepts/ ├── History/ └── Geography/ ``` 2. **Build entity index:** - Scan all `.md` files in the world - Extract entity names from filenames - Extract entity names from YAML `name:` field - Build lookup table: `{entity_name: file_path}` 3. **Count entities by category:** ``` Category | Count ----------------|------ Characters | X Settlements | X Items | X Creatures | X Organizations | X Concepts | X History | X Geography | X ----------------|------ TOTAL | X ``` --- ## Audit Checks ### Check 1: Wikilink Validation **Goal:** Verify all `[[Entity Name]]` links point to real entities. **Process:** 1. For each entity file: - Extract all `[[...]]` patterns using regex: `\[\[([^\]]+)\]\]` - For each link, check if target exists in entity index - Track: `{source_file, broken_link, line_number}` 2. **Ignore false positives:** - Links to D&D rules: `[[D&D 5e...]]`, `[[Stat Block...]]` - Links to images: `[[...png]]`, `[[...jpg]]` - Obsidian system links 3. **Report:** ``` ## Broken Links Report Found X broken links across Y entities. ### [Entity Name] - Line XX: [[Missing Entity 1]] - Line XX: [[Missing Entity 2]] ### [Entity Name 2] ... ``` 4. **Auto-fix options (if --fix):** - Offer to create stub entities for missing links - Offer to remove broken links - Offer fuzzy match suggestions for typos --- ### Check 2: Bidirectional Connection Audit **Goal:** Ensure connections are reciprocal. **Process:** 1. For each entity, extract its `## Connections` section 2. Parse all outgoing links 3. For each outgoing link, check if target links back 4. Track one-way connections **Reciprocal Relationship Matrix:** See [[Connection Matrix]] for complete bidirectional linking rules. | Source Links To | Target Should Have | |-----------------|-------------------| | Settlement (as location) | Characters > Residents/Notable NPCs | | Organization (as member) | Characters > Members | | Region (as parent) | Settlements/Geography > Contains | | Deity (as patron) | Characters > Worshippers | | Character (as ally) | Characters > Allies | | Character (as enemy) | Characters > Rivals/Enemies | | Government (as ruler) | Characters > Leadership | | Settlement (as HQ) | Organizations > Based Here | | Parent Geography | Child Geography > Part Of | | Historical Event | Locations > Site Of | | Military (as army) | Government > Armed Forces | | Criminal Organization (as operating) | Government > Criminal Elements | | Creature (as habitat) | Geography > Native Wildlife/Monsters | **Report:** ``` ## One-Way Connection Report Found X connections missing reciprocal links. ### [Entity A] → [Entity B] - A links to B in: Connections > Organizations > Member - B should link back in: Characters > Members - Status: MISSING ### [Entity C] → [Entity D] ... ``` **Auto-fix (if --fix):** - Add reciprocal links to target entities - Use appropriate section based on relationship type --- ### Check 3: D&D 5e 2024 Stat Block Validation **Goal:** Verify all stat blocks are mechanically correct. **Applies to:** Characters (Protagonist, Antagonist, Support Character), Creatures (Monster, Animal, Insect) #### 3-Pre: Stat Block Mode Detection (Characters Only) Before validating characters, detect which stat block mode they use: | Condition | Mode | Validation | |-----------|------|------------| | `level:` filled, `challenge_rating:` empty | **PC-style** | Use level-based proficiency, class features | | `challenge_rating:` filled, `level:` empty | **NPC-style** | Use CR-based proficiency, monster rules | | Both filled | **WARNING** | Ambiguous mode - flag for manual review | | Neither filled | **WARNING** | Missing stat block info - flag for manual review | **PC-style validation applies:** - Proficiency from level (Check 3B) - HP from class hit dice + CON (Check 3F) - Spell slots from class progression - Features match class/subclass **NPC-style validation applies:** - Proficiency from CR (Check 3A) - HP from size hit dice + CON (Check 3F) - CR/XP correlation (Check 3A) - Legendary features for high CR (Check 3G) **Note:** Creatures (Monster, Animal, Insect) always use NPC-style validation with `challenge_rating:`. --- #### 3A: Challenge Rating & XP Verify CR matches XP using official table: | CR | XP | Proficiency | |----|-----|-------------| | 0 | 0 or 10 | +2 | | 1/8 | 25 | +2 | | 1/4 | 50 | +2 | | 1/2 | 100 | +2 | | 1 | 200 | +2 | | 2 | 450 | +2 | | 3 | 700 | +2 | | 4 | 1,100 | +2 | | 5 | 1,800 | +3 | | 6 | 2,300 | +3 | | 7 | 2,900 | +3 | | 8 | 3,900 | +3 | | 9 | 5,000 | +4 | | 10 | 5,900 | +4 | | 11 | 7,200 | +4 | | 12 | 8,400 | +4 | | 13 | 10,000 | +5 | | 14 | 11,500 | +5 | | 15 | 13,000 | +5 | | 16 | 15,000 | +5 | | 17 | 18,000 | +6 | | 18 | 20,000 | +6 | | 19 | 22,000 | +6 | | 20 | 25,000 | +6 | | 21 | 33,000 | +7 | | 22 | 41,000 | +7 | | 23 | 50,000 | +7 | | 24 | 62,000 | +7 | | 25 | 75,000 | +8 | | 26 | 90,000 | +8 | | 27 | 105,000 | +8 | | 28 | 120,000 | +8 | | 29 | 135,000 | +9 | | 30 | 155,000 | +9 | **Check:** `experience_points` in YAML matches CR from table. #### 3B: Proficiency Bonus **By Level (Characters):** | Level | Proficiency | |-------|-------------| | 1-4 | +2 | | 5-8 | +3 | | 9-12 | +4 | | 13-16 | +5 | | 17-20 | +6 | **By CR (Monsters):** Use CR table above. **Check:** `proficiency_bonus` matches level/CR. #### 3C: Ability Modifiers **Formula:** `modifier = floor((score - 10) / 2)` | Score | Modifier | |-------|----------| | 1 | -5 | | 2-3 | -4 | | 4-5 | -3 | | 6-7 | -2 | | 8-9 | -1 | | 10-11 | +0 | | 12-13 | +1 | | 14-15 | +2 | | 16-17 | +3 | | 18-19 | +4 | | 20-21 | +5 | | 22-23 | +6 | | 24-25 | +7 | | 26-27 | +8 | | 28-29 | +9 | | 30 | +10 | **Check:** Modifiers in ability score tables are calculated correctly. #### 3D: Attack Bonuses **Formula:** `attack_bonus = proficiency_bonus + ability_modifier` - Melee: Usually STR (or DEX for finesse) - Ranged: Usually DEX (or STR for thrown) **Check:** Attack bonus in action descriptions matches formula. #### 3E: Spell Save DC **Formula:** `spell_save_DC = 8 + proficiency_bonus + spellcasting_ability_modifier` | Class | Spellcasting Ability | |-------|---------------------| | Bard | Charisma | | Cleric | Wisdom | | Druid | Wisdom | | Paladin | Charisma | | Ranger | Wisdom | | Sorcerer | Charisma | | Warlock | Charisma | | Wizard | Intelligence | **Check:** Spell save DC in spellcasting section matches formula. #### 3F: Hit Points **Formula for Characters:** ``` HP = (hit_die_max + CON_mod) + ((level - 1) × (hit_die_avg + CON_mod)) ``` **Hit Die by Class:** | Class | Hit Die | Average | |-------|---------|---------| | Barbarian | d12 | 7 | | Fighter, Paladin, Ranger | d10 | 6 | | Bard, Cleric, Druid, Monk, Rogue, Warlock | d8 | 5 | | Sorcerer, Wizard | d6 | 4 | **Formula for Monsters:** ``` HP = hit_dice_count × hit_die_average + (hit_dice_count × CON_mod) ``` **Hit Die by Size:** | Size | Hit Die | Average | |------|---------|---------| | Tiny | d4 | 2.5 | | Small | d6 | 3.5 | | Medium | d8 | 4.5 | | Large | d10 | 5.5 | | Huge | d12 | 6.5 | | Gargantuan | d20 | 10.5 | **Check:** HP matches hit dice formula with CON modifier. #### 3G: Legendary Features (CR 5+) For creatures CR 5 and above, check for: - Legendary Resistance (3/Day) for CR 10+ - Legendary Actions for bosses - Lair Actions if lair is defined **Report:** ``` ## D&D 5e Stat Block Errors Found X errors across Y entities. ### [Monster Name] (CR 5) - ERROR: XP is 1500, should be 1800 for CR 5 - ERROR: Proficiency bonus is +2, should be +3 for CR 5 - WARNING: CR 5+ creature missing Legendary Actions (optional but recommended) ### [Character Name] (Level 8) - ERROR: Proficiency bonus is +2, should be +3 for level 8 - ERROR: Spell Save DC is 14, should be 15 (8 + 3 + 4) - ERROR: Attack bonus is +5, should be +7 (proficiency 3 + STR 4) ``` **Auto-fix (if --fix):** - Recalculate and update XP, proficiency, modifiers - Update attack bonuses and spell save DCs - Flag HP for manual review (hit dice formula) --- ### Check 4: Orphan Entity Detection **Goal:** Find entities with no incoming links. **Process:** 1. Build incoming link count for each entity 2. Entities with 0 incoming links are orphans 3. Exception: World Overview.md (always root) **Report:** ``` ## Orphan Entities Found X entities with no incoming links. ### Characters - [[Forgotten NPC]] - 0 incoming links ### Geography - [[Unnamed Valley]] - 0 incoming links ``` **Auto-fix (if --fix):** - Suggest parent entities to link from - Offer to add to World Overview Quick Reference - Offer to delete if truly orphaned --- ### Check 5: Template Compliance **Goal:** Verify entities match their templates. **Process:** 1. Determine entity type from: - File location (folder) - YAML tags - Content structure 2. Compare against expected template structure: - Required YAML fields present - Required sections present - Section ordering correct **Template Requirements by Category:** **Characters (All):** - YAML: `name`, `status`, `tags` containing character type - Sections: Overview, Connections **Characters (Protagonist/Antagonist/Support Character):** - YAML: `species`, `class`, `armor_class`, `hit_points` - YAML (Stat Block Mode): `level` OR `challenge_rating` (one required, not both) - Sections: Stat Block, Ability Scores, Combat Statistics, Personality, Background **Creatures (Monster):** - YAML: `size`, `creature_type`, `challenge_rating`, `experience_points` - Sections: Stat Block, Classification, Ability Scores, Traits, Actions **Settlements:** - YAML: `settlement_type`, `population`, `government_type` - Sections: Overview, Districts/Areas, Notable Locations **Organizations:** - YAML: `organization_type` or appropriate tag - Sections: Overview, Leadership, Goals, Resources **Geography:** - YAML: `terrain_type` or geographic tag - Sections: Overview, Features, Inhabitants **Report:** ``` ## Template Compliance Issues Found X compliance issues across Y entities. ### [Entity Name] (Characters/Protagonist.md) - AMBIGUOUS YAML: Both `level` and `challenge_rating` are filled (use only one) - MISSING SECTION: ## Ability Scores - WRONG FOLDER: Located in Items/, should be Characters/ ### [Entity Name] (Characters/Antagonist.md) - MISSING YAML: Neither `level` nor `challenge_rating` (one required for stat block) - WARNING: Cannot validate proficiency bonus without level/CR ### [Entity Name] (Settlements/City.md) - MISSING YAML: `population` - EMPTY SECTION: ## Districts ``` **Auto-fix (if --fix):** - Add missing YAML fields with placeholder values - Add missing section headers - Suggest moving misplaced files --- ### Check 6: Cross-Entity Consistency **Goal:** Verify logical consistency across entities. **Checks:** 1. **Religious Consistency:** - Temples reference deities that exist - Religious orders serve established deities - Characters with deity patrons link to real deities 2. **Political Consistency:** - Settlements reference governments that exist - Military organizations belong to real governments - Rulers are linked to their domains 3. **Geographic Consistency:** - Settlements are in regions that exist - Rivers flow from mountains to bodies of water - Roads connect real settlements - Terrain types match climate of parent region 4. **Historical Consistency:** - Events reference locations that exist - Battles are part of wars that exist - Dynasties connect to governments - Characters in historical events existed at that time 5. **Economic Consistency:** - Currency matches issuing government - Trade agreements connect trading partners - Shops sell goods appropriate to region **Report:** ``` ## Cross-Entity Consistency Issues ### Religious Inconsistencies - Temple of [[Nonexistent God]] references deity not in pantheon - Religious Order [[Knights of X]] serves [[Y]] but Y's domain doesn't match order purpose ### Political Inconsistencies - [[City A]] claims to be capital of [[Kingdom B]] but B lists different capital - [[Military X]] serves [[Government Y]] but Y doesn't list X in armed forces ### Geographic Inconsistencies - [[River A]] claims to flow from [[Desert B]] (deserts don't have river sources) - [[Settlement A]] is in [[Region B]] but B's climate is tundra, A's description is tropical ``` --- ### Check 7: Image Prompt Validation **Goal:** Verify image prompt sections are properly filled for `/generate-image` readiness. **Process:** 1. For each entity file, locate the Image Prompts section (usually near the end) 2. Find all `**Prompt:**` fields 3. Check if they contain actual content vs template placeholders **Template Placeholder Patterns to Detect:** - Empty field: `**Prompt:**` followed by nothing or whitespace - Unfilled brackets: `**Prompt:** [describe scene here]` - Generic text: `**Prompt:** Describe the scene...` - Template instructions: `**Prompt:** Write a detailed prompt for...` **Valid Prompt Patterns:** - Specific descriptions: `**Prompt:** A weathered dwarven blacksmith...` - Detailed scenes: `**Prompt:** Interior of a dimly lit tavern...` - Minimum 20 characters of descriptive content **Report:** ``` ## Image Prompt Status ### Ready for Image Generation | Entity | Prompts Filled | Status | |--------|----------------|--------| | [[Lord Varic]] | 2/2 | ✓ Ready | | [[Ironhold City]] | 2/2 | ✓ Ready | ### Missing or Incomplete Prompts | Entity | Issue | Line | |--------|-------|------| | [[The Sunken Palace]] | Empty prompt field | 245 | | [[Captain Alonzo]] | Placeholder text only | 189 | | [[Mountain Pass]] | Missing Image Prompts section | - | Summary: - Entities with complete prompts: X - Entities with incomplete prompts: Y - Entities missing Image Prompts section: Z ``` **Auto-fix (if --fix):** - Cannot auto-fill image prompts (requires creative content) - Flag entities needing attention - Suggest running `/create-entity` to regenerate Image Prompts section --- ### Check 8: Circular Reference Detection **Goal:** Detect potentially problematic circular reference chains. **Process:** 1. Build a directed graph of entity relationships 2. For each relationship type, check for cycles 3. Categorize cycles as valid (expected) or warning (potential error) **Valid Circular Patterns:** | Pattern | Example | Why Valid | |---------|---------|-----------| | Mutual relationship | A → B (ally), B → A (ally) | Symmetric relationship | | Parent-child | Region → City (contains), City → Region (part of) | Bidirectional by design | | Organization loop | Org → Member, Member → Org | Membership is bidirectional | **Warning Patterns:** | Pattern | Example | Why Problematic | |---------|---------|-----------------| | Geographic containment loop | A contains B contains C contains A | Impossible geography | | Temporal causation loop | Event A caused B caused C caused A | Paradox | | Hierarchical loop | God A serves B serves C serves A | Impossible hierarchy | | "Part of" chain loop | Region A part of B part of C part of A | Invalid nesting | **Detection Algorithm:** ``` 1. Extract relationships by type: - containment: "contains", "part of", "in" - hierarchy: "serves", "reports to", "rules" - causation: "caused", "led to", "resulted in" - temporal: "before", "after", "during" 2. For each relationship type: - Build directed graph - Run cycle detection (DFS-based) - Classify each cycle found 3. Report cycles by severity ``` **Report:** ``` ## Circular Reference Analysis ### Valid Bidirectional Links: X (These are expected and correct) ### Warning: Potential Problematic Cycles #### Geographic Containment Loop [[Region A]] → contains → [[Region B]] → contains → [[Region C]] → contains → [[Region A]] Severity: HIGH - Geographic impossibility Suggestion: Review containment relationships; one link is likely incorrect #### Hierarchical Loop [[Organization X]] → parent of → [[Organization Y]] → parent of → [[Organization X]] Severity: MEDIUM - Circular hierarchy Suggestion: Determine which org is truly the parent No auto-fix available for circular references - requires manual review. ``` --- ## Summary Report After all checks, provide comprehensive summary: ``` # World Audit Report: [World Name] ## Overview - **Total Entities:** X - **Audit Date:** YYYY-MM-DD - **Issues Found:** X (Y critical, Z warnings) ## Entity Count | Category | Count | Issues | |----------|-------|--------| | Characters | X | Y | | Settlements | X | Y | | Items | X | Y | | Creatures | X | Y | | Organizations | X | Y | | Concepts | X | Y | | History | X | Y | | Geography | X | Y | | **TOTAL** | **X** | **Y** | ## Issue Summary ### Critical Issues (Must Fix) | Issue Type | Count | Example | |------------|-------|---------| | Broken Links | X | [[Missing Entity]] in Entity.md | | Stat Block Errors | X | Wrong XP for CR in Monster.md | | Orphan Entities | X | Forgotten NPC.md | ### Warnings (Should Review) | Issue Type | Count | Example | |------------|-------|---------| | One-Way Links | X | A→B without B→A | | Missing Sections | X | No Connections in Entity.md | | Consistency Issues | X | Temple references wrong deity | ## Connection Statistics - **Total Wikilinks:** X - **Average Links Per Entity:** X.X - **Most Connected Entity:** [[Entity]] (X links) - **Least Connected Entity:** [[Entity]] (X links) ## Recommendations ### High Priority 1. Fix X broken links in Y entities 2. Add reciprocal links for Z one-way connections 3. Correct stat block errors in W creatures ### Medium Priority 1. Review X orphan entities for relevance 2. Fill missing sections in Y entities 3. Resolve Z consistency issues ### Low Priority 1. Increase connections in sparse entities 2. Add missing optional YAML fields 3. Consider additional entities for coverage gaps ## Next Steps - Run `/audit-world [world] --fix` to auto-repair issues - Use `/create-entity` to fill coverage gaps - Review orphan entities for deletion or integration ``` --- ## Auto-Fix Mode (--fix) When `--fix` is specified: 1. **Ask before each fix category:** - "Found X broken links. Fix by creating stubs? (y/n)" - "Found X one-way connections. Add reciprocal links? (y/n)" - "Found X stat errors. Auto-correct calculations? (y/n)" 2. **Create backup before modifying:** - Copy modified files to `.audit-backup/` folder - Log all changes made 3. **Report changes:** ``` ## Auto-Fix Results ### Files Modified: X - Entity1.md: Added 3 reciprocal links - Entity2.md: Corrected XP (1500 → 1800) - Entity3.md: Added missing YAML fields ### Files Created: X - Missing Entity (stub).md: Created from broken link ### Backup Location: .audit-backup/[timestamp]/ ``` --- ## Rollback & Restore Procedure If auto-fix made unwanted changes, you can restore from backup: ### Backup Structure ``` Worlds/[World Name]/.audit-backup/ └── [YYYY-MM-DD_HH-MM-SS]/ ├── manifest.json # List of all modified files ├── Characters/ │ └── [backed up files] ├── Settlements/ │ └── [backed up files] └── ... ``` ### Manual Restore Steps 1. **Find the backup timestamp:** ```bash ls Worlds/[World Name]/.audit-backup/ ``` 2. **Review what was changed:** Read the manifest file to see what was modified: ```bash cat Worlds/[World Name]/.audit-backup/[timestamp]/manifest.json ``` 3. **Restore specific files:** ```bash # Copy backed up file over current version cp "Worlds/[World Name]/.audit-backup/[timestamp]/Characters/Lord Varic.md" \ "Worlds/[World Name]/Characters/Lord Varic.md" ``` 4. **Restore all files from a backup:** ```bash # Restore entire backup (overwrite current files) cp -r "Worlds/[World Name]/.audit-backup/[timestamp]/"* "Worlds/[World Name]/" ``` ### Backup Retention - Backups are kept for 7 days by default - Each `--fix` run creates a new timestamped backup - Old backups can be manually deleted from `.audit-backup/` ### Partial Restore To restore only certain changes: 1. Open the backed-up file 2. Compare with current file (use diff tool or Obsidian) 3. Manually copy specific sections you want to restore --- ## Integration with Other Skills ### After `/generate-world` Run `/audit-world [world]` to: - Verify all generated entities are linked - Check stat blocks on generated monsters - Ensure no orphans from generation ### After `/create-entity` Reciprocal link logic in create-entity should prevent most issues, but audit can catch edge cases. ### Before `/generate-image` Audit can verify image prompt sections are filled before batch image generation. --- ## Usage Examples ``` # Full audit /audit-world Eldoria # Audit with auto-fix /audit-world Eldoria --fix # Only check links /audit-world Eldoria --check links # Only check D&D stats /audit-world Eldoria --check stats # Only audit Characters /audit-world Eldoria --category Characters # Combination /audit-world Eldoria --category Creatures --check stats --fix ```