Sparsity-preserving skill versioning via Pijul patches with GF(3) projection gates
/plugin marketplace add plurigrid/asi/plugin install asi-skills@asi-skillsThis skill inherits all available tools. When active, it can use any tool Claude has access to.
Sparsity-preserving skill versioning where changes are stored as morphisms, not materialized states.
Trit: 0 (ERGODIC) - Coordinator role for projection gate decisions
┌─────────────────────────────────────────────────────────┐
│ SPARSE (default) │
│ - Changes stored as patches (morphisms) │
│ - No materialization unless required │
│ - Lazy evaluation of skill state │
│ - Minimal storage footprint │
└─────────────────────────────────────────────────────────┘
| Trigger | Description | GF(3) |
|---|---|---|
--materialize | Explicit flag | Any |
trit == 0 | ERGODIC coordination point | 0 |
--archive | Explicit archive | Any |
| Conflict | Resolution requires full state | Any |
Ob(C) = { skill states }
Mor(C) = { patches transforming states }
For patches p, q:
p ⊥ q (independent) ⟹ p;q = q;p (commute)
# Sparse representation (default)
struct SparseSkill
base_hash::UInt64 # Root state reference
patches::Vector{Patch} # Morphism chain, not applied
end
# Materialized only on demand
function materialize(s::SparseSkill)
foldl(apply, s.patches; init=load(s.base_hash))
end
function should_project(skill::Skill, flags::Flags)::Bool
# Explicit materialization requested
flags.materialize && return true
# ERGODIC trit forces coordination checkpoint
skill.trit == 0 && return true
# Explicit archive
flags.archive && return true
# Conflict requires full state
has_conflicts(skill) && return true
# Otherwise: stay sparse
return false
end
trit = -1 (MINUS/Validator):
→ Verify patch integrity without materializing
→ Check commutativity conditions
→ Validate GF(3) conservation
trit = 0 (ERGODIC/Coordinator):
→ PROJECT: Create materialized checkpoint
→ Coordinate merge points
→ Synchronize distributed states
trit = +1 (PLUS/Generator):
→ Generate new patches
→ Create without materializing target
→ Lazy forward references
cd .agents/skills/my-skill
# Edit SKILL.md
echo "new content" >> SKILL.md
# Record as patch (NOT materialized)
pijul record -m "Add GF(3) section"
# Stores: Patch{add_lines: [...], hash: 0x...}
# Pull only patch metadata
pijul pull --partial origin
# View pending patches without applying
pijul log --pending
# Apply lazily (on access)
cat SKILL.md # Materializes only this file
# Explicit checkpoint
pijul reset --materialize
# Or via trit-aware tool
skill-checkpoint my-skill --trit 0
;; Install pijul via flox MCP
(flox-install "pijul")
;; Record skill change
(shell "pijul" "record" "-m" (str "Update " skill-name))
;; Sparse pull from upstream
(shell "pijul" "pull" "--partial" upstream-url)
# Tree decomposition of skill graph
tree = decompose(skill_graph)
# Each bag gets sparse representation
for bag in tree.bags
bag.skills = map(to_sparse, bag.skills)
end
# Sheaf gluing respects sparsity
glue!(tree) # Only materializes at boundaries
using Gay
# Patch hash → color for visual diff
function patch_color(patch::Patch)
seed = reinterpret(UInt64, patch.hash)
Gay.color_at(seed, 1)
end
# GF(3) conservation across patch chain
function verify_chain(patches::Vector{Patch})
trits = [patch.trit for patch in patches]
sum(trits) % 3 == 0
end
Pijul Patch ≅ Delta-CRDT Update
Both:
- Commutative when independent
- Compose via join semilattice
- Support partial replication
skills/
├── .pijul/
│ ├── patches/ # Merkle tree of patches
│ ├── sparse-index/ # Hash → patch mapping
│ └── projection-log # When/why materialized
pijul-sparse status
# Output:
# my-skill: SPARSE (3 pending patches)
# other-skill: MATERIALIZED (checkpoint 2024-01-07)
pijul-sparse project my-skill --reason "coordination checkpoint"
pijul-sparse verify-gf3
# Output:
# Chain: patch_a(-1) + patch_b(0) + patch_c(+1) = 0 ✓
pijul-sparse-skills (0) + pijul (-1) + skill-creator (+1) = 0 ✓
Coordinator Validator Generator
This skill coordinates the projection decision while pijul validates patches and skill-creator generates new content.