# Ownership Matrix Reference

This document provides detailed patterns for configuring the ownership matrix in `check-ownership.py`.

## Pattern Syntax

The ownership matrix uses Python regular expressions (regex) to match file paths.

### Common Patterns

| Pattern | Matches | Example Files |
|---------|---------|---------------|
| `^src/cli\.py$` | Exact file | `src/cli.py` |
| `^src/.*/cli\.py$` | Any subdirectory | `src/app/cli.py`, `src/core/cli.py` |
| `^src/core/` | Directory prefix | `src/core/main.py`, `src/core/utils/helper.py` |
| `^tests/` | All tests | `tests/test_main.py`, `tests/unit/test_foo.py` |
| `^docs/.*\.md$` | Markdown in docs | `docs/api.md`, `docs/guides/setup.md` |
| `\.py$` | All Python files | Any `.py` file |

### Regex Cheat Sheet

| Symbol | Meaning | Example |
|--------|---------|---------|
| `^` | Start of string | `^src/` matches paths starting with `src/` |
| `$` | End of string | `\.py$` matches paths ending with `.py` |
| `.` | Any character | `a.c` matches `abc`, `a1c`, etc. |
| `\.` | Literal dot | `\.py` matches `.py` |
| `*` | Zero or more | `a*` matches ``, `a`, `aa`, `aaa` |
| `+` | One or more | `a+` matches `a`, `aa`, `aaa` |
| `.*` | Any characters | `src/.*` matches anything starting with `src/` |
| `[abc]` | Character class | `[abc]` matches `a`, `b`, or `c` |
| `\w` | Word character | `\w+` matches words |
| `\d` | Digit | `\d+` matches numbers |
| `(a\|b)` | Alternation | `(foo\|bar)` matches `foo` or `bar` |

## Project-Specific Examples

### Python Project

```python
OWNERSHIP_MATRIX: Dict[str, str] = {
    # Claude - Core application
    r"^src/app/": "claude",
    r"^src/core/": "claude",
    r"^src/.*/cli\.py$": "claude",
    r"^CLAUDE\.md$": "claude",
    r"^AGENTS\.md$": "claude",
    r"^GUARDRAILS\.md$": "claude",

    # Gemini - APIs and documentation
    r"^src/.*/api/": "gemini",
    r"^src/.*/integrations/": "gemini",
    r"^docs/": "gemini",
    r"^GEMINI\.md$": "gemini",

    # Codex - Testing and utilities
    r"^tests/": "codex",
    r"^src/.*/models\.py$": "codex",
    r"^src/.*/utils/": "codex",
    r"^CODEX\.md$": "codex",
}
```

### TypeScript Project

```python
OWNERSHIP_MATRIX: Dict[str, str] = {
    # Claude - Core application
    r"^src/app/": "claude",
    r"^src/core/": "claude",
    r"^src/index\.ts$": "claude",
    r"^CLAUDE\.md$": "claude",

    # Gemini - APIs and documentation
    r"^src/api/": "gemini",
    r"^src/services/": "gemini",
    r"^docs/": "gemini",
    r"^GEMINI\.md$": "gemini",

    # Codex - Testing and utilities
    r"^tests/": "codex",
    r"^__tests__/": "codex",
    r"^src/.*/.*\.test\.ts$": "codex",
    r"^src/types/": "codex",
    r"^src/utils/": "codex",
    r"^CODEX\.md$": "codex",
}
```

### Monorepo Project

```python
OWNERSHIP_MATRIX: Dict[str, str] = {
    # Claude - Core packages
    r"^packages/core/": "claude",
    r"^packages/cli/": "claude",
    r"^CLAUDE\.md$": "claude",

    # Gemini - API packages
    r"^packages/api/": "gemini",
    r"^packages/sdk/": "gemini",
    r"^docs/": "gemini",
    r"^GEMINI\.md$": "gemini",

    # Codex - Testing and shared
    r"^packages/testing/": "codex",
    r"^packages/shared/": "codex",
    r"^packages/.*/tests/": "codex",
    r"^CODEX\.md$": "codex",
}
```

## Shared Files Configuration

Files that require coordination between agents:

```python
SHARED_FILES: Set[str] = {
    # Package configuration
    r"^pyproject\.toml$",
    r"^package\.json$",
    r"^Cargo\.toml$",

    # Build configuration
    r"^Makefile$",
    r"^Dockerfile$",
    r"^docker-compose\.ya?ml$",

    # CI/CD
    r"^\.github/workflows/",
    r"^\.gitlab-ci\.yml$",
    r"^\.circleci/",

    # Project planning
    r"^PROJECT_PLAN\.md$",
    r"^ROADMAP\.md$",
    r"^CHANGELOG\.md$",
}
```

## Unrestricted Files Configuration

Files any agent can modify:

```python
UNRESTRICTED_FILES: Set[str] = {
    # Agent state
    r"^\.agent-state/",

    # Git configuration
    r"^\.gitignore$",
    r"^\.gitattributes$",

    # Editor configuration
    r"^\.vscode/",
    r"^\.idea/",

    # Documentation
    r"^README\.md$",
    r"^CONTRIBUTING\.md$",
    r"^LICENSE$",

    # Pre-commit
    r"^\.pre-commit-config\.yaml$",
}
```

## Custom Agent Example

Adding a custom agent (e.g., "designer"):

```python
# 1. Add to valid agents
VALID_AGENTS = {"claude", "gemini", "codex", "human", "designer"}

# 2. Add ownership patterns
OWNERSHIP_MATRIX: Dict[str, str] = {
    # ... existing patterns ...

    # Designer - UI and styles
    r"^src/components/": "designer",
    r"^src/styles/": "designer",
    r"^src/.*/.*\.css$": "designer",
    r"^src/.*/.*\.scss$": "designer",
    r"^DESIGNER\.md$": "designer",
}

# 3. Update commit message pattern in check_commit_message()
pattern = r"^\[(Claude|Gemini|Codex|Human|Designer|CI)\]\s+\w+(\([^)]+\))?:\s+.+"
```

## Testing Patterns

Test your patterns using Python:

```python
import re

def test_pattern(pattern: str, test_paths: list) -> None:
    """Test a regex pattern against multiple paths."""
    for path in test_paths:
        match = re.match(pattern, path)
        print(f"{path}: {'MATCH' if match else 'NO MATCH'}")

# Example
test_pattern(r"^src/.*/cli\.py$", [
    "src/cli.py",           # NO MATCH (no subdirectory)
    "src/app/cli.py",       # MATCH
    "src/core/cli.py",      # MATCH
    "src/a/b/cli.py",       # MATCH
])
```

## Debugging Tips

1. **Pattern not matching?**
   - Check for literal dots (use `\.` not `.`)
   - Verify start `^` and end `$` anchors
   - Test with simple paths first

2. **Pattern too broad?**
   - Add more specific path components
   - Use `$` to anchor end of pattern
   - Add file extension matching

3. **Multiple agents matching?**
   - First match wins
   - Order patterns from specific to general
   - Use more specific patterns for exceptions

---

*Customize the ownership matrix for your specific project structure.*
