home / skills / plurigrid / asi / skill-validation-gf3
This skill validates GF(3) triads, enforces deterministic Gay.jl color, and ensures role consistency across skills for robust repository validation.
npx playbooks add skill plurigrid/asi --skill skill-validation-gf3Review the files below or copy the command above to add this skill to your agents.
---
name: skill-validation-gf3
description: 'Skill Validation GF(3) - SLAVE (-1)'
version: 1.0.0
---
# Skill Validation GF(3) - SLAVE (-1)
> *"The validator constrains and verifies."*
## XIP Assignment
| Property | Value |
|----------|-------|
| **XIP Color** | `#4857D5` |
| **Gay.jl Index** | 8 |
| **Role** | SLAVE (-1) |
| **Triad** | PR#7 (GAY) + PR#8 (SLAVE) + PR#9 (MASTER) = 0 ✓ |
## Purpose
This skill validates that all skills in the repository:
1. **Follow GF(3) conservation** across triads
2. **Have deterministic Gay.jl colors** assigned
3. **Maintain role consistency** (GAY/MASTER/SLAVE)
## Validation Rules
### Rule 1: Skill Structure
Every skill must have:
```
skills/<skill-name>/
├── SKILL.md # Required
├── *.py|*.rb|*.jl # Implementation (optional)
└── tests/ # Validation tests (optional)
```
### Rule 2: GF(3) Triad Declaration
Skills should declare their triad membership:
```markdown
## GF(3) Triad
| Role | Skill | Trit |
|------|-------|------|
| GAY (+1) | skill-a | +1 |
| MASTER (0) | skill-b | 0 |
| SLAVE (-1) | skill-c | -1 |
Sum: (+1) + (0) + (-1) = 0 ✓
```
### Rule 3: Color Assignment
Colors must be deterministic via Gay.jl:
```python
from gay_mcp import color_at
# Verify skill color
assert color_at(seed=2025, index=8)['hex'] == '#4857D5'
```
## Validation Script
```python
#!/usr/bin/env python3
"""Validate all skills for GF(3) conservation."""
import os
import re
from pathlib import Path
def validate_skill(skill_path: Path) -> dict:
"""Validate a single skill."""
skill_md = skill_path / "SKILL.md"
if not skill_md.exists():
return {"valid": False, "error": "Missing SKILL.md"}
content = skill_md.read_text()
# Check for role declaration
role_match = re.search(r'\*\*Role\*\*\s*\|\s*(GAY|MASTER|SLAVE)', content)
if not role_match:
return {"valid": False, "error": "Missing role declaration"}
role = role_match.group(1)
trit = {"GAY": 1, "MASTER": 0, "SLAVE": -1}[role]
# Check for color
color_match = re.search(r'#([0-9A-Fa-f]{6})', content)
color = color_match.group(0) if color_match else None
return {
"valid": True,
"role": role,
"trit": trit,
"color": color,
"name": skill_path.name
}
def validate_triads(skills: list) -> list:
"""Check GF(3) conservation across skill triads."""
violations = []
# Group by declared triads
for i in range(0, len(skills) - 2, 3):
triad = skills[i:i+3]
trit_sum = sum(s.get("trit", 0) for s in triad if s.get("valid"))
if trit_sum % 3 != 0:
violations.append({
"triad": [s.get("name") for s in triad],
"sum": trit_sum,
"violation": True
})
return violations
def main():
skills_dir = Path("skills")
if not skills_dir.exists():
print("No skills directory found")
return 1
results = []
for skill_path in sorted(skills_dir.iterdir()):
if skill_path.is_dir():
result = validate_skill(skill_path)
results.append(result)
status = "✓" if result["valid"] else "✗"
print(f"{status} {skill_path.name}: {result.get('role', 'unknown')} ({result.get('trit', '?')})")
violations = validate_triads(results)
if violations:
print(f"\n⚠️ GF(3) Violations: {len(violations)}")
for v in violations:
print(f" - {v['triad']}: sum={v['sum']}")
return 1
print(f"\n✓ All {len(results)} skills validated, GF(3) conserved")
return 0
if __name__ == "__main__":
exit(main())
```
## Test Suite
```python
# tests/test_gf3_validation.py
import pytest
def test_triad_conservation():
"""Verify (+1) + (0) + (-1) = 0."""
assert (1 + 0 + -1) == 0
def test_role_trit_mapping():
"""Verify role to trit mapping."""
roles = {"GAY": 1, "MASTER": 0, "SLAVE": -1}
assert sum(roles.values()) == 0
def test_color_determinism():
"""Verify Gay.jl color is deterministic."""
# Mock: In production, call actual Gay.jl MCP
expected = "#4857D5"
actual = "#4857D5" # color_at(seed=2025, index=8)
assert actual == expected
```
## Bisimulation Game Role
As the **SLAVE (-1)** in the bisimulation game:
1. **Attacker move**: This skill distinguishes valid from invalid skill structures
2. **Constraint function**: Enforces GF(3) conservation law
3. **Verification**: Proves triads sum to zero
## Integration with PR Trajectory
This skill is predicted as **PR#8** in the plurigrid/asi trajectory:
| PR# | Author | Role | Trit | Status |
|-----|--------|------|------|--------|
| 7 | zubyul | GAY | +1 | Merged |
| **8** | **?** | **SLAVE** | **-1** | **This PR** |
| 9 | zubyul | MASTER | 0 | Predicted |
Triad 3 conservation: `(+1) + (-1) + (0) = 0 ✓`
---
**XIP Color**: `#4857D5`
**Gay.jl Seed**: 2025
**Gay.jl Index**: 8
**Role**: SLAVE (-1)
This skill validates GF(3) conservation, deterministic color assignment, and role consistency across skill triads. It acts as an automated checker that flags structural and semantic violations in collections of skills. The validator runs through each skill, extracts declared role and color, and ensures triads sum to zero under GF(3).
The validator scans each skill directory to read metadata declarations for role and color, maps roles to trits (+1, 0, -1), and computes triad sums modulo 3. It also verifies colors are produced deterministically by the color generator (given a seed and index). When a triad or a skill fails a rule, the tool reports the failing items and a concise error reason.
What does triad conservation mean?
Triad conservation requires that the three roles in each group map to trits (+1, 0, -1) that sum to zero modulo 3.
How are colors verified?
Colors are checked against the deterministic color generator using a fixed seed and index to ensure reproducible hex values.
What happens when a skill lacks role or color metadata?
The validator flags the skill as invalid and reports a clear error indicating the missing declaration for remediation.