daimyo 1.11.0
Rules server for agents with REST and MCP interfaces
License: MIT
Requires Python: >=3.11

# Daimyo - Rules Server for Agents

Daimyo (大名) is an extensible Python server providing rules to AI agents through REST and MCP interfaces. Supports scope-based rules with inheritance, categories for filtering, and server federation for distributed rule management.

## Features

- **Multiple Interfaces**: REST API, MCP (Model Context Protocol), and CLI
- **Scope Inheritance**: Single and multiple parent inheritance with priority-based conflict resolution
- **Rule Types**: Commandments (MUST) and Suggestions (SHOULD)
- **Categories**: Organize rules into hierarchical categories for selective retrieval
- **Server Federation**: Distribute scopes across multiple servers with automatic merging
- **Multiple Formats**: Output as YAML, JSON, or Markdown
- **Clean Architecture**: Domain-driven design with clear separation of concerns
- **Templating System**: Rules can use Jinja2 templates to be defined as generic rules that change their form depending on the context
- **Extensibility via Plugins**: Plugins can extend the features of daimyo instances
- **Configurable Markdown Formatting**: Prologues/epilogues, XML tag wrapping, and aggregated display modes

## Installation

```bash
pip install daimyo
```

Or install from source:

```bash
git clone https://gitlab.com/Kencho1/daimyo.git
cd daimyo
pip install -e .
```

## Quick Start

### 1. Set Up Your Rules

```bash
mkdir -p .daimyo
cp -r example-daimyo-rules .daimyo/rules
```

### 2. Start the Server

```bash
daimyo serve
```

### 3. Access the API

Visit http://localhost:8000/docs for interactive API documentation.

```bash
curl http://localhost:8000/api/v1/scopes/python-general/rules
```

## Core Concepts

### Scopes

Scopes represent organizational contexts (company, team, project). Each scope is a directory containing:

- `metadata.yml` - Scope configuration and parent references
- `commandments.yml` - Mandatory rules (MUST)
- `suggestions.yml` - Recommended rules (SHOULD)

```text
.daimyo/rules/
├── python-general/
│   ├── metadata.yml
│   ├── commandments.yml
│   └── suggestions.yml
└── team-backend/
    ├── metadata.yml
    ├── commandments.yml
    └── suggestions.yml
```

### Metadata Format

```yaml
name: scope-name
description: Human-readable description
parents:
  - parent-scope-1
  - parent-scope-2
tags:
  team: backend
  language: python
```

**Fields:**

- `name`: Scope identifier (must match directory name)
- `description`: Human-readable description
- `parents`: List of parent scopes (first = highest priority)
- `tags`: Key-value pairs for organizing scope metadata (e.g., team, language, environment)

### Categories

Categories are hierarchical subdivisions within rules:

```yaml
python.web.testing:
  when: When testing web interfaces
  ruleset:
    - Use playwright for acceptance tests
    - Use pytest fixtures for test setup
```

**Category Tags (Optional):**

Categories can include tags for additional metadata:

```yaml
development.coding.python:
  when: When writing Python code
  tags:
    - python
    - backend
    - performance-critical
  ruleset:
    - Use type hints for all function signatures
    - Follow PEP 8 naming conventions
```

Tags are displayed in markdown output: `<tags>backend; performance-critical; python</tags>`

#### Optional "when" Descriptions

The "when" field is optional. When omitted or empty, the system uses intelligent fallback:

```yaml
python.testing:
  when: When writing tests for this project
  ruleset:
    - Use our custom test fixtures

python.web:
  ruleset:
    - Follow team web standards
```

**Fallback priority**:

1. **Category's merged "when" description**: After scope merging (local extends remote, child extends parent scope), the category's "when" field is used if non-empty
2. **Parent categories in the hierarchy**: If empty, traverse up the category path (e.g., `python.web.testing` → `python.web` → `python`) looking for a non-empty "when"
3. **Default**: "These rules apply at all times"

The scope merging process (local → remote → parent) happens before the hierarchical fallback, ensuring child scopes can override descriptions from remote servers or parent scopes.

This allows:

- Parent/remote scopes to define general descriptions
- Child scopes to override only when needed
- Hierarchical inheritance from broader to specific categories
- Simplified child scopes that inherit descriptions

### Rule Types

**Commandments (MUST)**: Mandatory rules that accumulate through inheritance

**Suggestions (SHOULD)**: Recommended rules that can be overridden or appended with `+` prefix

### Why not nesting the categories?

While it seems more intuitive, it proved to be confusing and harder to maintain in certain cases, e.g.:

- Appending suggestions: it's confusing to know whether the `+` must be prepended to the innermost category, to the root category, or to a category in between.
- Sharding categories: should it combine the innermost category or every category and subcategory defined?

For that reason it was decided to keep the categories at the root level, using the explicit path notation and nesting them logically using the dot path splitting.

## Usage

### REST API

Start the server:

```bash
daimyo serve
daimyo serve --host 0.0.0.0 --port 8080
```

Get rules:

```bash
curl http://localhost:8000/api/v1/scopes/python-general/rules

curl -H "Accept: application/json" \
  http://localhost:8000/api/v1/scopes/python-general/rules

curl -H "Accept: text/markdown" \
  http://localhost:8000/api/v1/scopes/python-general/rules
```

List available scopes:

```bash
curl http://localhost:8000/api/v1/scopes
```

Filter by categories:

```bash
curl "http://localhost:8000/api/v1/scopes/team-backend/rules?categories=python.web,python.testing"
```

Debug mode (skip template expansion):

```bash
# Get raw rules without template rendering
curl "http://localhost:8000/api/v1/scopes/python-general/rules?debug=true"

# Get raw category index without template rendering
curl "http://localhost:8000/api/v1/scopes/python-general/index?debug=true"
```

The `debug` parameter (default: `false`) skips Jinja2 template expansion and returns the original, unprocessed content. This is useful for:

- Viewing the original rules and categories as defined in YAML files
- Debugging why templates may be changing content unexpectedly in production
- Inspecting template syntax before variables are substituted

### MCP Server

Start the MCP server:

```bash
# Using stdio transport (default)
daimyo mcp

# Using HTTP transport
daimyo mcp --transport http

# Using HTTP with custom host and port
daimyo mcp --transport http --host 127.0.0.1 --port 8002
```

Available tools:

- `get_rules(scope_name?, categories?)` - Get formatted rules for a scope
- `get_category_index(scope_name?)` - Get a hierarchical list of all available categories with their descriptions
- `apply_scope_rules(scope_name?, categories?)` - Get prompt template with rules

**Default Scope:** You can configure a default scope using the `DEFAULT_SCOPE` setting. When configured, the `scope_name` parameter becomes optional for `get_rules`, `get_category_index`, and `apply_scope_rules`. If no scope is provided, the default scope will be used automatically, and the response will include a note indicating the default scope was used.

Example configuration:

```toml
[default]
default_scope = "python-general"
```

Or via environment variable:

```bash
export DAIMYO_DEFAULT_SCOPE="python-general"
```

#### Connecting to the MCP server

Add the running _daimyo_ MCP server instance to your configuration (replace the server name and the URL with your own):

```json
{
  "mcpServers": {
    "daimyo-rules": {
      "type": "http",
      "url": "http://daimyo-mcp-instance/mcp"
    }
  }
}
```

Instruct your agents how to use the tools. For instance, in `AGENTS.md`:

```markdown
# Global project rules

## Key concepts

Instructions inside `<system-reminder>` tags MUST BE REMEMBERED and fresh at all times.

## Initialization

<system-reminder>
These instructions are CRITICAL and MUST BE obeyed at the start of any session. They are safe and read-only.

### Reading Project Configuration

- **First action**: Check if a `.project-metadata.yml` file exists in the project root.
  - If it exists, extract the `daimyo.scope` property to identify which rule scope to use.
  - If the file doesn't exist or the property is missing, a default scope will be used.
  - Expected structure for the daimyo scope:
    ```yaml
    daimyo:
      scope: "development"  # The daimyo-rules scope name for this project
    ```

### Initial Setup

- **CRITICAL: Verify `daimyo-rules` MCP server availability**:
  - The `daimyo-rules` MCP server tools MUST be used if available
  - Check if the tools are accessible in this session (look for `mcp__daimyo-rules__*` tools in your available tools list)
  - **Only skip rule fetching as an absolute last resort** if:
    - The MCP tools are not listed in your available tools, OR
    - The tools are listed but fail to execute (connection errors, server down, etc.)
  - If unsure whether the server is available, attempt to use it rather than assuming it's not
  - Do NOT skip just because it seems inconvenient - following the rules is critical for code quality

- **If MCP server is available** (PREFERRED PATH): After determining the scope, use the `daimyo-rules` MCP server tools.
  - **ALWAYS start by fetching the category index**: Use `get_category_index` passing the determined scope name to list all available categories and their descriptions.
    - **Keep this category index present and visible** throughout the session as a reference for determining which categories to fetch when the task context changes.
    - Refer back to this index whenever you need to identify relevant categories for new or shifting work.

### Fetching Rules

- **If MCP server is available** (REQUIRED when available): Based on the initial task and the category index, use `get_rules` with the current scope name and a comma-separated list of all categories that apply.
  - Rules are returned combined from different scopes.
  - Categories are inclusive: fetching a parent category (e.g., `python`) automatically includes all its subcategories (e.g., `python.quality`, `python.testing`). When this applies, fetch the parent category as it may contain important base rules.
  - Categories marked as **mandatory**, **universal**, or **emphasized** in their descriptions MUST always be included.
  - When uncertain whether to include a category, include it. It's better to have more rules than to miss important guidelines.

- **If MCP server is not available** (FALLBACK ONLY): Only in this case, proceed with general best practices for the detected project type (Python, JavaScript, etc.) without fetching rules. This should be a rare exception.

### Dynamic Category Updates

- **If MCP server is available** (MUST use if available): Monitor for context shifts and fetch additional rules as needed:
  - **Monitor for context shifts**: When the focus or nature of the task changes during the session, immediately fetch additional relevant categories:
    - Examples of context shifts:
      - Moving from implementation to testing
      - Switching from coding to documentation
      - Changing programming languages or frameworks
      - Shifting from development to deployment/DevOps tasks
      - Moving from backend to frontend work
    - When a shift occurs:
      1. Consult the category index (kept from initialization)
      2. Identify which new categories are now relevant
      3. Fetch those categories using `get_rules` with the new category list
      4. **Additive approach**: The new rules complement (not replace) previously fetched rules

  - **Proactive category fetching**: If you anticipate needing rules from a new domain based on the conversation direction, fetch them preemptively rather than waiting until they're critically needed.

  - **Re-fetch the category index** if you need a refresher on available categories or if you suspect there might be relevant categories you're not aware of.
</system-reminder>
```

Note some less capable models (like local models via Ollama) may need additional or more detailed instructions.

To make the instructions reusable, the scope name can be read from a file (for instance `.project-metadata.yml`).

### CLI Commands

```bash
# List all available scopes
daimyo list-scopes

# Show details of a specific scope
daimyo show python-general

# View template context for debugging
daimyo context python-general
daimyo context python-general --category python.testing
daimyo context python-general --format json
daimyo context python-general --sources

# Version information
daimyo --version
```

#### Template Context Command

The `context` command displays the Jinja2 template context available when rendering rules for a scope. This is useful for debugging template issues and understanding what variables are available in templates.

**Basic usage:**

```bash
daimyo context <scope_name>
```

**Options:**

- `--category, -c`: Show context for a specific category (includes category key and when description)
- `--format, -f`: Output format - `yaml` (default), `json`, or `table`
- `--sources, -s`: Annotate each variable with its source (config, scope, category, or plugins)

**Examples:**

```bash
# View context in YAML format (default)
daimyo context python-general

# View context for a specific category
daimyo context python-general --category python.testing

# JSON format for programmatic use
daimyo context python-general --format json

# Table format for quick scanning
daimyo context python-general --format table

# Show variable sources
daimyo context python-general --sources
```

**Output includes:**

- **Configuration variables**: All DAIMYO_* settings from environment or config files
- **Scope metadata**: name, description, tags, sources
- **Category info**: key and when description (if --category specified)
- **Plugin context**: Variables provided by enabled plugins
- **Plugin metadata**: Available Jinja2 filters and tests from plugins

## Best Practices for Defining Scopes, Categories, and Rules

**Understanding the Foundation:**

Before diving into best practices, it's crucial to understand how scopes and categories work together:

- **Categories form a universal namespace**: A category like `development.coding.python.testing` has the same meaning across all scopes. Categories are NOT scope-specific.

- **Multiple scopes can contain rules for the same category**: For example, `python-general`, `team-backend`, and `project-api` might all have rules for `development.coding.python.testing`.

- **Scopes are organizational contexts**: They group related categories and rules for specific purposes (company-wide standards, team conventions, project-specific requirements).

- **Scope inheritance merges rules**: When you request rules from a scope with parents, you get merged results for each category across the inheritance chain.

This universal category namespace ensures consistency: when different scopes add rules to `development.security`, they're all contributing to the same logical category.

---

### Part I: Organizational Foundations

#### 1. Understanding Universal vs Conditional Categories

**Universal categories** - Always apply when their domain is relevant:

```text
development.coding.quality → Always applies when writing code
development.coding.python → Always applies when writing Python
general → Always applies
```

**Conditional categories** - Only apply when explicitly chosen or context matches:

```text
development.architecture_patterns.clean_architecture → ONLY when pattern chosen
development.coding.testing → ONLY when writing tests
development.lifecycle.review → ONLY during review phase
```

**Rule:** Clearly separate universal from conditional in your hierarchy. Don't mix them at the same level.

**Anti-pattern:**

```text
development.coding
  ├── architecture (universal - SOLID, DRY)
  └── clean_architecture (conditional - specific pattern)
```

**Better:**

```text
development.coding
  └── architecture (universal - SOLID, DRY)

development.architecture_patterns
  └── clean_architecture (conditional - specific pattern)
```

#### 2. Designing Hierarchical Structures

**Use Aggregator Categories with "Do Not Use Directly" Warnings**

**Purpose:** Provide logical grouping without forcing over-fetching

```text
development.coding [DO NOT USE DIRECTLY; pick relevant subcategories]
  ├── core (universal code rules)
  ├── python (language-specific)
  ├── security (security rules)
  └── testing (conditional - when writing tests)
```

**Benefit:** Users can:

- Fetch `development.coding.python` (specific)
- Skip `development.coding.testing` (conditional)
- Avoid accidentally fetching everything under `development.coding`

#### Hierarchical Inclusion is Automatic

**Remember:** Fetching a parent includes ALL children

**Implication:**

- Place conditional categories as siblings, not children of universal categories
- If a parent has mixed universal/conditional children, users can't selectively exclude

**Example problem:**

```text
development.coding.python (universal for Python)
  ├── implementation (universal)
  ├── quality (universal)
  └── testing (conditional - ONLY when writing tests)
```

Fetching `development.coding.python` forces inclusion of testing rules even when not writing tests.

**Solutions:**

1. Document clearly that testing is conditionally included
2. Move testing to sibling: `development.coding.python_testing`
3. Support exclusion in API: `exclude=["development.coding.python.testing"]`

#### 3. Splitting and Merging Categories

**When to Split**

Split categories when:

1. **Different applicability conditions**

   ```text
   development.coding.python.implementation (always for Python)
   development.coding.python.testing (only when writing tests)
   ```

2. **Different granularity needed**

   ```text
   development.coding.security.design (architectural patterns)
   development.coding.security.implementation (coding practices)
   ```

3. **Rules serve different phases/activities**

   ```text
   development.lifecycle.implementation
   development.lifecycle.review
   development.lifecycle.deployment
   ```

4. **Domain-specific rules exist**

   ```text
   development.domain_specific.web_applications
   development.domain_specific.apis
   development.domain_specific.cli_tools
   ```

**Don't Split When:**

- Rules always apply together - Keep them in one category
- Only 1-2 rules exist - Too granular; merge into parent
- Split creates ambiguity - Which category gets which rule?

**When to Merge**

Merge categories when:

1. **Always fetched together**

   ```text
   # Before: Always fetch both
   development.coding.core
   development.coding.standards

   # After: Merged
   development.coding.core
   ```

2. **Redundant scoping**

   ```text
   # Before: Confusing split
   security (top-level universal)
   development.coding.security.global (also universal?)

   # After: Clarify relationship or merge
   development.security.core (all universal security)
     ├── mindset (high-level principles)
     └── implementation (coding practices)
   ```

3. **Single rule in category**

   ```text
   # Before: Wasteful
   development.architecture_patterns.core
     → Rule: "Prefer well-known patterns"

   # After: Move to parent or merge
   development.architecture_patterns
     → Description includes this guidance
   ```

#### 4. Naming Conventions

**Use Descriptive, Unambiguous Names**

**Avoid:**

- `global` - ambiguous; use `universal` (applies across all scopes) or `core` (base rules for this domain) instead
- `common` - vague
- `misc` - catch-all anti-pattern

**Prefer:**

- `core` - base rules for this category domain
- `universal` - applies across all scopes when this domain is relevant
- `implementation` - during active coding
- `design` - architectural level

**Use "Aggregated" in Descriptions for Parent Categories**

```text
development.coding.python
  Description: "Aggregated rules that apply when the task involves Python programming"
```

Signals that this is a logical grouping with subdivisions.

---

### Part II: Writing Effective Content

#### 5. Writing Clear Descriptions

#### Format: "[Applicability] [What it contains]"

**Universal category:**

```text
development.coding.quality
  Description: "Code quality standards applied during implementation"
```

**Conditional category:**

```text
development.coding.testing
  Description: "Rules for writing and structuring tests. Apply when creating test code"
```

**Conditional pattern (emphasize):**

```text
development.architecture_patterns.clean_architecture
  Description: "Clean architecture rules. **ONLY apply when implementing clean architecture pattern**"
```

#### Use Bold for Critical Conditions

Make conditions unmissable:

- "**ONLY apply when...**"
- "**DO NOT use directly; always pick the relevant subcategories**"
- "**Security must be enforced**"

#### Be Explicit About Timing/Context

**Good:**

- "Apply when writing Python tests"
- "During active code development"
- "When designing system architecture"
- "For all code handling user input"

**Bad:**

- "For testing" (writing tests or running tests?)
- "Python rules" (all Python contexts or specific ones?)
- "Architecture" (designing it or following a pattern?)

**Common Ambiguity Sources**

Avoid these patterns:

1. **"Rules related to X"** - Too vague
   - Better: "Rules for writing X" or "Rules applied when X"

2. **"When appropriate"** - Who decides?
   - Better: "When {specific condition}" or "Unless explicitly excluded"

3. **"General" or "Common"** - General within what scope?
   - Better: "Universal" or "Core" with explicit scope

4. **Passive voice** - "Rules that are applied..."
   - Better: "Apply these rules when..."

**Test Your Descriptions**

Ask: "Can someone reading this description know EXACTLY when to include this category?"

```text
# Ambiguous
development.coding.testing
  Description: "Testing rules"

# Clear
development.coding.testing
  Description: "Rules for writing and structuring tests. Apply when creating test code (test_*.py, *_test.py files)"
```

#### 6. Writing Actionable Rules

**Use MUST/SHOULD Consistently**

**MUST** - Non-negotiable requirements (use commandments):

```text
- MUST: No code comments in generated code
- MUST: Security by default
- MUST: Follow SOLID principles
```

**SHOULD** - Strong recommendations (use suggestions):

```text
- SHOULD: Prefer pytest for testing
- SHOULD: Use ruff for linting
- SHOULD: Use English in code
```

**Make Rules Actionable**

```text
# Bad (not actionable)
- SHOULD: Write good tests
- MUST: Be secure

# Good (actionable)
- SHOULD: Use pytest.mark.parametrize for tests with multiple input scenarios
- MUST: Validate and sanitize all user inputs before processing
```

**One Concern Per Rule**

```text
# Bad (multiple concerns)
- MUST: Use type hints and validate them with mypy, and also use ruff for linting

# Good (separated)
- SHOULD: Use statically-typed code
- SHOULD: Use mypy to validate typing
- SHOULD: Use ruff for linting
```

---

### Part III: Common Organizational Patterns

#### 7. Security Categories

#### Security Deserves Multiple Locations

**Pattern:**

```text
security (top-level category)
  → "Universal security mindset. ALWAYS applies across all scopes"
  → High-level: Security is first-class citizen

development.coding.security
  ├── core: "Universal security requirements for code"
  ├── design: "Security architecture patterns"
  └── implementation: "Secure coding practices"
```

**Why both?**

- Top-level `security` category: Ensures security is NEVER forgotten (always included)
- `development.coding.security` category: Specific implementation requirements

#### Security Should Be

- Mandatory (MUST, not SHOULD)
- Explicit in descriptions ("Critical for web applications, APIs...")
- Subdivided by concern (design vs implementation)
- Referenced in domain-specific categories (web apps mention OWASP, CORS, etc.)

#### 8. Language-Specific Organization

**Pattern: `coding.{language}.{aspect}`**

```text
development.coding.python
  ├── implementation (tooling, structure, conventions)
  ├── quality (linting, type checking)
  └── testing (test framework practices)

development.coding.javascript
  ├── implementation (npm, ESLint, project structure)
  ├── quality (TypeScript, strict mode)
  └── testing (Jest patterns)
```

**Benefits:**

- Consistent across languages
- Easy to add new languages
- Clear aspect separation

**Alternative (if many languages):**

```text
development.coding.languages
  ├── python.*
  ├── javascript.*
  └── rust.*
```

---

### Part IV: Scope-Level Design

#### 9. Designing Scopes

**When to Create Separate Scopes**

Create separate scopes when:

1. **Different teams/projects with distinct rule sets**

   ```text
   backend-team (scope)
   frontend-team (scope)
   ml-team (scope)
   ```

2. **Different enforcement levels**

   ```text
   company-wide (scope) → mandatory for everyone
   team-backend (scope) → specific to backend team
   project-xyz (scope) → overrides for specific project
   ```

3. **Different domains with non-overlapping rules**

   ```text
   development (scope) → coding rules
   operations (scope) → deployment, monitoring
   documentation (scope) → writing docs
   ```

**Scope Composition and Inheritance**

Design scopes to be composable:

```text
Query: get_rules(scopes=["company-wide", "development", "python-web"])

Result: Merged rules from all three scopes
```

This allows:

- Company-wide universal policies
- Development-specific coding standards
- Project-specific overrides

---

### Part V: Quality Assurance

#### 10. Anti-Patterns to Avoid

**Catch-All Categories**

```text
development.coding.misc
development.other
```

Sign of poor organization.

**Deeply Nested Hierarchies (>4 levels)**

```text
development.coding.languages.python.frameworks.django.testing.unit
```

Too granular; hard to navigate.

**Duplicated Rules**

Same rule in multiple categories without clear reason.

**Circular Dependencies**

Category A includes rules about when to use Category B.

**Implementation Details in Descriptions**

```text
Description: "Stored in database table rules_python"
```

Keep descriptions user-focused.

#### 11. Maintenance Guidelines

**Regular Audits**

1. **Check for orphaned rules** - Rules that don't fit their category
2. **Verify applicability** - Do descriptions still match rule content?
3. **Remove dead rules** - Deprecated tools, outdated practices
4. **Consolidate sparse categories** - <3 rules might belong elsewhere

**Versioning Strategy**

Consider versioning for rule changes:

```text
development.coding.python.v2
development.coding.python.v1 (deprecated)
```

Or use scope versioning:

```text
development-2024 (scope)
development-2025 (scope)
```

#### 12. Quick Reference Checklist

When creating scopes/categories/rules, verify:

- [ ] **Applicability is crystal clear** - No guessing when to include
- [ ] **Universal and conditional are separated** - Different hierarchy levels
- [ ] **Names are descriptive and unambiguous** - No "global", "misc", "common"
- [ ] **Descriptions state WHEN to apply** - "Apply when..." or "ONLY when..."
- [ ] **Security is mandatory and explicit** - MUST rules, multiple locations
- [ ] **Hierarchies are logical** - Max 3-4 levels deep
- [ ] **Parent categories have warnings** - "DO NOT USE DIRECTLY" where needed
- [ ] **Rules are actionable** - Specific, measurable, implementable
- [ ] **MUST vs SHOULD is consistent** - Clear distinction
- [ ] **One concern per rule** - No compound requirements
- [ ] **No catch-all categories** - Everything has a proper home
- [ ] **Language-specific rules follow consistent pattern** - Same structure for each language

---

### Part VI: Advanced Techniques

#### 13. Maximizing LLM Effectiveness

The previous sections covered **how to organize rules** (categories, scopes, hierarchies). This section addresses **how to format and present rules to LLMs** for maximum impact and compliance.

**Why Rule Presentation Matters**

- **The Problem**: LLMs process rules as part of larger context windows containing instructions, code, conversations, and other content. Rules can get "lost" or de-prioritized when mixed with this content.
- **The Challenge**: Without explicit semantic markers, LLMs treat rules as just another piece of text, applying similar attention weights to rules and general context.
- **The Solution**: Use semantic markup and structural cues that LLMs are specifically trained to recognize and prioritize.

**A. XML Tag Wrapping: Making Rules Unmissable**

**Recommended Configuration:**

```toml
commandments_xml_tag = "system-reminder"
suggestions_xml_tag = "system-suggestion"
```

**Why This Works:**

1. **Semantic Salience**: LLMs are trained to pay special attention to `<system-*>` tags
   - These tags appear in system prompts during LLM training
   - They signal "important instructions to follow"
   - Higher activation strength compared to plain markdown

2. **Clear Rule Type Distinction**:
   - `<system-reminder>` for MUST rules → Mandatory requirements
   - `<system-suggestion>` for SHOULD rules → Strong recommendations
   - The tag names themselves communicate urgency and flexibility

3. **Better Context Separation**:
   - XML structure creates clear boundaries
   - Prevents rules from blending into surrounding text
   - Easier for attention mechanisms to isolate and process

**Example Transformation:**

*Before (plain markdown):*

```markdown
- **MUST**: Use type hints for all function signatures
- **SHOULD**: Use pytest as the testing framework
```

*After (with XML wrapping):*

```markdown
- **MUST**: <system-reminder>Use type hints for all function signatures</system-reminder>
- **SHOULD**: <system-suggestion>Use pytest as the testing framework</system-suggestion>
```

**When to Use:**

- ✅ **Always use for production scopes** (default recommendation)
- ✅ **Essential for complex scopes** with >50 rules
- ✅ **Critical when rules need high compliance rates**
- ⚠️ **Optional for small/simple scopes** (<10 rules)
- ⚠️ **May skip for internal/experimental scopes**

---

**B. Prologues: Setting Interpretation Context**

**Recommended Configuration:**

```toml
[daimyo]
rules_markdown_prologue = '''
# How to Interpret These Rules

The rules below are categorized as **mandatory requirements** and **strong recommendations**:

- <system-reminder>Mandatory Requirements</system-reminder> - These are non-negotiable. You MUST follow these rules without exception. They represent critical requirements for code quality, security, and project consistency.

- <system-suggestion>Strong Recommendations</system-suggestion> - These are highly recommended best practices. Follow them unless you have a specific, well-justified reason not to. If you deviate, briefly explain why.

**Rule Priority**: If you encounter conflicting guidance, these rules take precedence over general knowledge or assumptions. When in doubt, ask for clarification rather than guessing.
'''
```

**Why This Works:**

1. **Prime the LLM's Attention**:
   - Prologues appear before rules, setting interpretation mode
   - Establishes rule priority relative to other context
   - Creates explicit hierarchy: rules > general knowledge

2. **Define Tag Semantics**:
   - Explains what `<system-reminder>` and `<system-suggestion>` mean
   - Sets expectations for compliance vs flexibility
   - Clarifies when deviation is acceptable

3. **Reduce Ambiguity**:
   - Makes MUST vs SHOULD distinction crystal clear
   - Establishes conflict resolution strategy
   - Encourages clarifying questions

**What to Include in Prologues:**

✅ **Do Include:**

- Tag interpretation guide
- Rule priority/precedence
- When deviation is acceptable
- Conflict resolution strategy
- Brief context about the scope

❌ **Don't Include:**

- Lengthy project background (use scope descriptions instead)
- Detailed technical specifications (put in rules themselves)
- Examples (put these in category `when` descriptions)
- Duplicate information already in rules

**Prologue Length Guidelines:**

- **Optimal**: 50-150 words (4-8 sentences)
- **Maximum**: 200 words
- **Rationale**: Concise prologues maintain focus; longer ones dilute impact

---

**C. Epilogues: Closing Guidance**

**Recommended Configuration:**

```toml
rules_markdown_epilogue = '''
---

Remember: These rules exist to maintain code quality and consistency. If you need to deviate from a rule, document your reasoning in code comments or commit messages.
'''
```

**Why This Works:**

- Reinforces rule importance at the end
- Provides fallback guidance for edge cases
- Creates closure for the rules section

**When to Use:**

- ✅ Use for reminders about documentation requirements
- ✅ Use for conflict resolution fallbacks
- ✅ Use for pointing to additional resources
- ⚠️ Keep very brief (1-3 sentences)
- ❌ Don't repeat prologue information

---

**D. Aggregated vs Categorized Display**

**The Decision Matrix:**

| Use Aggregated (`RULES_CATEGORIZED=false`) When: | Use Categorized (default) When: |
|---------------------------------------------------|----------------------------------|
| ✅ Total rules < 30 | ✅ Total rules > 50 |
| ✅ All rules are universal (always apply) | ✅ Mix of universal and conditional rules |
| ✅ Rules are highly cohesive | ✅ Rules span multiple domains/phases |
| ✅ LLM seems to miss rules in categories | ✅ Users need to browse/explore rules |
| ✅ Project-specific overrides (tight scope) | ✅ General/reusable scopes |

**Why Aggregation Works:**

1. **Reduces Cognitive Load**:
   - Eliminates hierarchical navigation overhead
   - All rules visible in single scan
   - No "hidden" rules in nested categories

2. **Maximizes Attention**:
   - Flat list = equal weight to all rules
   - No category headings to distract
   - Direct, immediate access to requirements

3. **Better for Small, Focused Scopes**:
   - Project-specific rules (tight, cohesive)
   - Framework-specific conventions
   - Team-specific overrides

**Why Categorization Works:**

1. **Scales to Large Rule Sets**:
   - More than 50 rules need organization
   - Categories create logical groupings
   - Easier to maintain and update

2. **Conditional Rule Application**:
   - "Testing" category only needed when writing tests
   - "Security.Design" vs "Security.Implementation"
   - Phase-specific rules (design, implementation, review)

3. **Discoverability**:
   - Users can browse what's available
   - Understand rule scope and applicability
   - Navigate to relevant sections

---

**E. Category Tags: Semantic Metadata**

**Recommended Usage:**

```yaml
development.coding.python.testing:
  when: When writing tests for Python code
  tags: ["testing", "quality-assurance", "pytest", "conditional"]
  ruleset:
    - Use pytest as the testing framework
    - Write unit tests for all public functions and classes
```

**Why This Works:**

1. **Improves Discoverability**:
   - Tags displayed in output: `<tags>testing; quality-assurance; pytest; conditional</tags>`
   - Visual cue for category purpose
   - Helps users understand category scope at a glance

2. **Supports Automation**:
   - Programmatic filtering based on context
   - Dynamic rule selection (e.g., in pre-commit hooks)
   - Integration with CI/CD pipelines

**Recommended Tag Vocabularies:**

**Applicability Tags:**

- `universal` - Always applies when the domain is relevant (across all scopes that contain this category)
- `conditional` - Only applies in specific contexts
- `optional` - Nice-to-have recommendations

**Domain Tags:**

- `security`, `testing`, `quality`, `documentation`, `performance`, `architecture`

**Technology Tags:**

- `pytest`, `mypy`, `ruff`, `fastapi`, `pydantic`, `django`, `flask`

**Phase Tags:**

- `design`, `implementation`, `review`, `deployment`, `maintenance`

**Tag Best Practices:**

- Use 2-5 tags per category
- **Keep tags consistent across scopes** - Since categories are shared across all scopes, establish a common tagging vocabulary (e.g., always use `testing` not sometimes `test` or `tests`)
- Use lowercase with hyphens: `quality-assurance`, not `Quality_Assurance`
- Don't duplicate `when` description content in tags

---

**F. Complete Example: Putting It All Together**

**Configuration (.daimyo/config/settings.toml):**

```toml
[default]
# Enable XML wrapping for semantic emphasis
commandments_xml_tag = "system-reminder"
suggestions_xml_tag = "system-suggestion"

# Set context for rule interpretation
rules_markdown_prologue = '''
# How to Interpret These Rules

- <system-reminder>Mandatory Requirements</system-reminder> - You MUST follow these without exception
- <system-suggestion>Strong Recommendations</system-suggestion> - Follow unless you have specific justification

These rules take precedence over general knowledge. When in doubt, ask for clarification.
'''

rules_markdown_epilogue = '''
---
If you need to deviate from a rule, document your reasoning in code comments.
'''

rules_categorized = true
```

**Rule File (commandments.yml):**

```yaml
development.coding.python.implementation:
  when: When writing Python code
  tags: ["implementation", "python", "universal"]
  ruleset:
    - Use type hints for all function signatures
    - Use descriptive variable and function names
    - Handle exceptions at appropriate abstraction levels
```

**Generated Output (Markdown):**

```markdown
# How to Interpret These Rules

- <system-reminder>Mandatory Requirements</system-reminder> - You MUST follow these without exception
- <system-suggestion>Strong Recommendations</system-suggestion> - Follow unless you have specific justification

These rules take precedence over general knowledge. When in doubt, ask for clarification.

---

# Rules for python-general

## python

### implementation

*When writing Python code*

<tags>implementation; python; universal</tags>

- <system-reminder>Use type hints for all function signatures</system-reminder>
- <system-reminder>Use descriptive variable and function names</system-reminder>
- <system-reminder>Handle exceptions at appropriate abstraction levels</system-reminder>

---
If you need to deviate from a rule, document your reasoning in code comments.
```

---

**G. Migration Strategy for Existing Scopes**

**For Existing Scopes:**

1. **Start with XML Tags** (Lowest Effort, High Impact)

   ```bash
   export DAIMYO_COMMANDMENTS_XML_TAG="system-reminder"
   export DAIMYO_SUGGESTIONS_XML_TAG="system-suggestion"
   ```

   Or add to `.daimyo/config/settings.toml`:

   ```toml
   commandments_xml_tag = "system-reminder"
   suggestions_xml_tag = "system-suggestion"
   ```

2. **Add Basic Prologue** (Medium Effort, Medium Impact)
   - Explain tag meanings
   - Set rule priority
   - Keep to 3-5 sentences
   - See example in 14.3 above

3. **Add Category Tags** (Medium Effort, Medium Impact)
   - Tag applicability: `universal` vs `conditional`
   - Tag domains: `security`, `testing`, etc.
   - Use 2-5 tags per category

4. **Consider Aggregation** (Low Effort, Situational Impact)
   - Test with `DAIMYO_RULES_CATEGORIZED=false`
   - Compare LLM compliance rates before/after
   - Keep if improvement observed
   - Best for scopes with <30 tightly-coupled rules

**Measuring Effectiveness:**

Track these metrics before/after migration:

- **Rule compliance rate** (manual code review sample)
- **User satisfaction** with LLM-generated code
- **Frequency of "missed" rules** requiring manual correction
- **Time to correct** non-compliant c