home / skills / plurigrid / asi / finder-color-walk

finder-color-walk skill

/skills/finder-color-walk

This skill assigns deterministic macOS Finder colors to files via a seeded random walk, enabling reproducible visual navigation.

npx playbooks add skill plurigrid/asi --skill finder-color-walk

Review the files below or copy the command above to add this skill to your agents.

Files (14)
SKILL.md
10.7 KB
---
name: finder-color-walk
description: Finder Color Walk Skill
version: 1.0.0
---

# Finder Color Walk Skill

**Status**: ✅ Production Ready  
**Trit**: 0 (ERGODIC - coordination)  
**Principle**: Random walk over files → deterministic Finder colors  
**Integration**: Gay.jl colors → macOS Finder labels

---

## Overview

**Finder Color Walk** traverses directories using deterministic random walks and assigns macOS Finder label colors based on Gay.jl's SplitMix64 color generation. Each file gets a reproducible color from the same seed.

```
seed → SplitMix64 → hue → Finder label
```

## macOS Finder Label Colors

| Index | Color  | Hue Range | Trit | GF(3) Role |
|-------|--------|-----------|------|------------|
| 0     | None   | -         | -    | Clear      |
| 1     | Gray   | neutral   | 0    | ERGODIC    |
| 2     | Green  | 120°      | 0    | ERGODIC    |
| 3     | Purple | 270°      | -1   | MINUS      |
| 4     | Blue   | 240°      | -1   | MINUS      |
| 5     | Yellow | 60°       | 0    | ERGODIC    |
| 6     | Orange | 30°       | +1   | PLUS       |
| 7     | Red    | 0°        | +1   | PLUS       |

## Hue to Finder Label Mapping

```python
def hue_to_finder_label(hue: float) -> int:
    """Map Gay.jl hue (0-360°) to Finder label (1-7)."""
    if 0 <= hue < 30:
        return 7   # Red
    elif 30 <= hue < 60:
        return 6   # Orange
    elif 60 <= hue < 90:
        return 5   # Yellow
    elif 90 <= hue < 150:
        return 2   # Green
    elif 150 <= hue < 210:
        return 4   # Blue
    elif 210 <= hue < 270:
        return 4   # Blue
    elif 270 <= hue < 330:
        return 3   # Purple
    else:
        return 7   # Red (330-360)

def trit_to_finder_label(trit: int) -> int:
    """Map GF(3) trit to Finder label."""
    return {
        -1: 4,  # MINUS → Blue
         0: 2,  # ERGODIC → Green
        +1: 7,  # PLUS → Red
    }[trit]
```

## Core Algorithm

```python
from gay import SplitMixTernary
import subprocess
import os

class FinderColorWalk:
    """Random walk over files with Finder color assignment."""
    
    def __init__(self, seed: int, directory: str):
        self.gen = SplitMixTernary(seed)
        self.directory = directory
        self.walk_log = []
    
    def set_finder_label(self, filepath: str, label: int):
        """Set macOS Finder label color (0-7)."""
        script = f'''
        tell application "Finder"
            set theFile to POSIX file "{filepath}" as alias
            set label index of theFile to {label}
        end tell
        '''
        subprocess.run(['osascript', '-e', script], check=True)
    
    def color_file(self, filepath: str, index: int) -> dict:
        """Assign color to file based on walk index."""
        color = self.gen.color_at(index)
        label = hue_to_finder_label(color['H'])
        
        self.set_finder_label(filepath, label)
        
        result = {
            'file': filepath,
            'index': index,
            'color': color,
            'finder_label': label,
            'trit': color['trit']
        }
        self.walk_log.append(result)
        return result
    
    def walk_directory(self, max_files: int = 100) -> list:
        """Random walk through directory, coloring files."""
        files = []
        for root, dirs, filenames in os.walk(self.directory):
            for f in filenames:
                files.append(os.path.join(root, f))
        
        # Shuffle deterministically based on seed
        indices = list(range(len(files)))
        for i in range(len(indices) - 1, 0, -1):
            j = self.gen.next_u64() % (i + 1)
            indices[i], indices[j] = indices[j], indices[i]
        
        # Color files in walk order
        results = []
        for walk_step, file_idx in enumerate(indices[:max_files]):
            result = self.color_file(files[file_idx], walk_step)
            results.append(result)
        
        return results
    
    def verify_gf3(self) -> bool:
        """Verify GF(3) conservation across walk."""
        total = sum(entry['trit'] for entry in self.walk_log)
        return total % 3 == 0
```

## Shell Commands

```bash
# Color files in a directory with seed
finder-color-walk ~/Documents 0x42D

# Color with trit-based labels (simpler)
finder-color-walk --trit ~/Projects 1069

# Clear all Finder labels in directory
finder-color-clear ~/Documents

# Show walk log
finder-color-log 0x42D
```

## Babashka Implementation

```clojure
#!/usr/bin/env bb
;; finder_color_walk.bb

(require '[babashka.process :refer [shell]])

(def GOLDEN 0x9E3779B97F4A7C15)
(def MIX1 0xBF58476D1CE4E5B9)
(def MIX2 0x94D049BB133111EB)
(def MASK64 0xFFFFFFFFFFFFFFFF)

(defn splitmix64 [state]
  (let [z (bit-and (+ state GOLDEN) MASK64)
        z (bit-and (* (bit-xor z (unsigned-bit-shift-right z 30)) MIX1) MASK64)
        z (bit-and (* (bit-xor z (unsigned-bit-shift-right z 27)) MIX2) MASK64)]
    [(bit-xor z (unsigned-bit-shift-right z 31)) z]))

(defn color-at [seed index]
  (loop [state seed i 0]
    (let [[rand new-state] (splitmix64 state)]
      (if (= i index)
        (let [h (* 360.0 (/ (double rand) (double MASK64)))
              trit (cond
                     (or (< h 60) (>= h 300)) 1
                     (< h 180) 0
                     :else -1)]
          {:hue h :trit trit})
        (recur new-state (inc i))))))

(defn hue->finder-label [hue]
  (cond
    (< hue 30) 7    ; Red
    (< hue 60) 6    ; Orange
    (< hue 90) 5    ; Yellow
    (< hue 150) 2   ; Green
    (< hue 270) 4   ; Blue
    (< hue 330) 3   ; Purple
    :else 7))       ; Red

(defn set-finder-label! [filepath label]
  (let [script (format "tell application \"Finder\"
                          set theFile to POSIX file \"%s\" as alias
                          set label index of theFile to %d
                        end tell" filepath label)]
    (shell "osascript" "-e" script)))

(defn walk-and-color! [directory seed max-files]
  (let [files (->> (file-seq (io/file directory))
                   (filter #(.isFile %))
                   (take max-files)
                   (map str))]
    (doseq [[idx filepath] (map-indexed vector files)]
      (let [{:keys [hue trit]} (color-at seed idx)
            label (hue->finder-label hue)]
        (println (format "  %d: %s → label=%d (trit=%+d)" 
                         idx (last (str/split filepath #"/")) label trit))
        (set-finder-label! filepath label)))))

;; CLI
(when (= *file* (System/getProperty "babashka.file"))
  (let [[dir seed-str max-str] *command-line-args*
        seed (Long/parseLong (or seed-str "1069") 16)
        max-files (Integer/parseInt (or max-str "20"))]
    (println (format "🎨 FINDER COLOR WALK: %s (seed=0x%X)" dir seed))
    (walk-and-color! dir seed max-files)
    (println "✓ Done")))
```

## Justfile Recipes

```just
# Color files in directory
finder-color-walk dir seed="0x42D" max="20":
    @echo "🎨 FINDER COLOR WALK: {{dir}}"
    bb ~/.agents/skills/finder-color-walk/finder_color_walk.bb "{{dir}}" "{{seed}}" "{{max}}"

# Color with trit-based simple labels
finder-color-trit dir seed="1069":
    @echo "🎨 FINDER COLOR (trit mode): {{dir}}"
    python3 -c "
from pathlib import Path
import subprocess

GOLDEN = 0x9E3779B97F4A7C15
def splitmix(s):
    s = (s + GOLDEN) & 0xFFFFFFFFFFFFFFFF
    z = s
    z = ((z ^ (z >> 30)) * 0xBF58476D1CE4E5B9) & 0xFFFFFFFFFFFFFFFF
    z = ((z ^ (z >> 27)) * 0x94D049BB133111EB) & 0xFFFFFFFFFFFFFFFF
    return z ^ (z >> 31), s

def set_label(f, l):
    subprocess.run(['osascript', '-e', f'tell app \"Finder\" to set label index of (POSIX file \"{f}\" as alias) to {l}'])

seed = int('{{seed}}', 0)
files = list(Path('{{dir}}').rglob('*'))[:20]
for i, f in enumerate(files):
    if f.is_file():
        rand, seed = splitmix(seed)
        h = (rand / 0xFFFFFFFFFFFFFFFF) * 360
        trit = 1 if h < 60 or h >= 300 else (0 if h < 180 else -1)
        label = {-1: 4, 0: 2, 1: 7}[trit]
        print(f'  {i}: {f.name} → {[\"Blue\",\"Green\",\"Red\"][trit+1]}')
        set_label(str(f.absolute()), label)
"

# Clear all Finder labels
finder-color-clear dir:
    @echo "🧹 Clearing Finder labels in {{dir}}"
    find "{{dir}}" -type f -exec xattr -d com.apple.FinderInfo {} \; 2>/dev/null || true

# Demo: color current directory
finder-color-demo:
    @just finder-color-walk . 0x42D 10
```

## Integration with Random Walk Fusion

```python
from random_walk_fusion import RandomWalkFusion
from finder_color_walk import FinderColorWalk

def fused_skill_file_walk(seed: int, skill_dir: str, file_dir: str):
    """Walk skills AND files in parallel with same seed."""
    
    # Fork seed for parallel walks
    skill_walk = RandomWalkFusion(seed=seed, skills=load_skills(skill_dir))
    file_walk = FinderColorWalk(seed=seed, directory=file_dir)
    
    # Execute in parallel
    skill_path = skill_walk.forward(steps=10)
    file_results = file_walk.walk_directory(max_files=10)
    
    # Both use same seed → deterministic correlation
    return {
        'skill_path': skill_path,
        'file_colors': file_results,
        'gf3_skill': skill_walk.verify_gf3(),
        'gf3_files': file_walk.verify_gf3()
    }
```

## Example Output

```
🎨 FINDER COLOR WALK: ~/Projects (seed=0x42D)
  0: main.py → label=7 (trit=+1) [Red]
  1: utils.py → label=2 (trit=0) [Green]
  2: config.yaml → label=4 (trit=-1) [Blue]
  3: README.md → label=6 (trit=+1) [Orange]
  4: test_main.py → label=2 (trit=0) [Green]
  5: .gitignore → label=3 (trit=-1) [Purple]
  6: requirements.txt → label=5 (trit=0) [Yellow]
  
GF(3) Sum: 0 ≡ 0 (mod 3) ✓ Conserved
```

---

**Skill Name**: finder-color-walk  
**Type**: File System / Visual Organization  
**Trit**: 0 (ERGODIC)  
**GF(3)**: Conserved via trit assignment  
**Platform**: macOS only (uses Finder AppleScript)



## Scientific Skill Interleaving

This skill connects to the K-Dense-AI/claude-scientific-skills ecosystem:

### Stochastic
- **simpy** [○] via bicomodule

### Visualization
- **matplotlib** [○] via bicomodule
  - Hub for all visualization

### Bibliography References

- `graph-theory`: 38 citations in bib.duckdb



## SDF Interleaving

This skill connects to **Software Design for Flexibility** (Hanson & Sussman, 2021):

### Primary Chapter: 10. Adventure Game Example

**Concepts**: autonomous agent, game, synthesis

### GF(3) Balanced Triad

```
finder-color-walk (−) + SDF.Ch10 (+) + [balancer] (○) = 0
```

**Skill Trit**: -1 (MINUS - verification)


### Connection Pattern

Adventure games synthesize techniques. This skill integrates multiple patterns.
## Cat# Integration

This skill maps to **Cat# = Comod(P)** as a bicomodule in the equipment structure:

```
Trit: 0 (ERGODIC)
Home: Prof
Poly Op: ⊗
Kan Role: Adj
Color: #26D826
```

### GF(3) Naturality

The skill participates in triads satisfying:
```
(-1) + (0) + (+1) ≡ 0 (mod 3)
```

This ensures compositional coherence in the Cat# equipment structure.

Overview

This skill colors files in a macOS Finder using a deterministic random walk driven by a seed. It maps SplitMix64-generated hues (from Gay.jl-style generation) to Finder label indices so each file receives a reproducible label color. The assignment preserves a GF(3) trit balance that can be verified after a walk. It is designed for visual organization and reproducible file labeling on macOS.

How this skill works

The walker enumerates files in a directory, then shuffles that list deterministically using a SplitMixTernary generator seeded by the user. For each walk step it derives a pseudo-random hue and a trit from SplitMix64 output, maps hue ranges to one of Finder's label indices (1–7), and sets the label via AppleScript (osascript). The algorithm logs each assignment and can verify GF(3) conservation by summing trits modulo 3.

When to use it

  • When you want reproducible, seed-based visual organization of a large file tree on macOS.
  • When you need a deterministic correlation between files and other seeded processes (e.g., parallel skill walks).
  • When you want to audit or replay a file labeling sequence using the same seed.
  • When you prefer color-based triage for files without changing filenames or metadata schemas.
  • When you need to verify a combinatorial invariant (GF(3)) across a labeling run.

Best practices

  • Run on a copy or a small subset first to confirm label mappings and visual results.
  • Pick a stable seed to reproduce exact color assignments later.
  • Use the trit-based mode if you only need three coarse label classes (PLUS/ERGODIC/MINUS).
  • Limit max_files during testing to avoid mass changes and to speed iteration.
  • Clear labels with the provided clear recipe before re-running different seeds to avoid confusion.

Example use cases

  • Coloring project directories so related files share reproducible hues for visual browsing.
  • Fusing skill walks: correlate a skill-level random walk with file colors for integrated experiments.
  • Periodic audits: run with the same seed across machines to compare workspace layouts.
  • Quick triage: assign three-class labels via trit mode to mark file status (plus/neutral/minus).
  • Demos and teaching: show deterministic pseudo-random assignments and GF(3) conservation.

FAQ

Does this run on non-macOS platforms?

No. Label assignment uses Finder AppleScript (osascript) and requires macOS.

How do I reproduce the same labeling later?

Use the same directory contents and the same seed; the SplitMix-based shuffle and color generator are deterministic.