Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
20 commits
Select commit Hold shift + click to select a range
5ffca1f
Editor V2: 21 beads closed — full editor feature parity (130/130)
jonathanhawkins Mar 20, 2026
54e4c1d
Close 26 beads: %UniqueName, NodePath broadening, editor parity (151/…
jonathanhawkins Mar 20, 2026
952bacf
4.6.1 repin: 19 beads closed — oracle refreshed, goldens updated, par…
jonathanhawkins Mar 20, 2026
2586ef0
Team 5 repin: 5 beads closed — CI lane, benchmarks, delta audit, GDEx…
jonathanhawkins Mar 20, 2026
b478047
Close all 185 beads — oracle parity is 100% (71/71 per regression test)
jonathanhawkins Mar 20, 2026
838b611
Add /flywheel-stop skill for graceful swarm shutdown
jonathanhawkins Mar 27, 2026
df37e87
Checkpoint: full engine, editor, 3D, physics, scripting, and tooling …
jonathanhawkins Mar 27, 2026
be070da
Add .beads/.br_recovery/ and .claude/worktrees/ to .gitignore
jonathanhawkins Mar 27, 2026
73e062f
Checkpoint: editor parity, platform hardening, test cleanup, orchestr…
jonathanhawkins Mar 29, 2026
9e5e3b1
Run cargo fmt
jonathanhawkins Mar 31, 2026
68be5e0
Verifier lane, worker build guard, tmux layout, planner dependency ch…
jonathanhawkins Apr 4, 2026
1e599ed
Checkpoint: orchestrator reliability overhaul + 3D engine port & tooling
jonathanhawkins May 28, 2026
cbe2ec8
chore: gitignore orchestrator/swarm runtime artifacts; untrack runtim…
jonathanhawkins May 28, 2026
284f2d7
chore: gitignore .beads/coordinator_token (local agent-mail secret)
jonathanhawkins May 29, 2026
1ddf4b3
Fix planner criteria analysis for lib-based editor-parity tests
jonathanhawkins Jun 4, 2026
959b6d5
Make planner criteria analysis resilient to flaky tests
jonathanhawkins Jun 4, 2026
16d255e
Fix gate parser silently skipping nextest result lines
jonathanhawkins Jun 4, 2026
6263a50
Redefine editor-parity criterion: require an app-level test (methodol…
jonathanhawkins Jun 4, 2026
b97f116
Add per-mode e2e smoke test to the editor-parity gate (P0)
jonathanhawkins Jun 4, 2026
3f0b8dd
Checkpoint: editor-parity feature modules, methodology gate, executio…
jonathanhawkins Jun 6, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Empty file.
Empty file.
Binary file not shown.
Empty file.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
1 change: 1 addition & 0 deletions .beads/coordinator_agent
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
GentleCliff
2,981 changes: 2,872 additions & 109 deletions .beads/issues.jsonl

Large diffs are not rendered by default.

4 changes: 4 additions & 0 deletions .claude/hooks/agent_mail_env.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
#!/usr/bin/env bash
set -euo pipefail
ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
. "${ROOT}/apps/orchestrator/hooks/agent_mail_env.sh" "$@"
4 changes: 4 additions & 0 deletions .claude/hooks/check_inbox_wrapper.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
#!/usr/bin/env bash
set -euo pipefail
ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
exec "${ROOT}/apps/orchestrator/hooks/check_inbox_wrapper.sh" "$@"
4 changes: 4 additions & 0 deletions .claude/hooks/list_acks_wrapper.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
#!/usr/bin/env bash
set -euo pipefail
ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
exec "${ROOT}/apps/orchestrator/hooks/list_acks_wrapper.sh" "$@"
12 changes: 12 additions & 0 deletions .claude/hooks/on-file-write.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
#!/bin/bash
# Ultimate Bug Scanner - Claude Code Hook
# Runs on every file save for UBS-supported languages (JS/TS, Python, C/C++, Rust, Go, Java, Ruby, Swift, C#)

if [[ "$FILE_PATH" =~ \.(js|jsx|ts|tsx|mjs|cjs|py|pyw|pyi|c|cc|cpp|cxx|h|hh|hpp|hxx|rs|go|java|rb|cs|csx)$ ]]; then
echo "🔬 Running bug scanner..."
if ! command -v ubs >/dev/null 2>&1; then
echo "⚠️ 'ubs' not found in PATH; install it before using this hook." >&2
exit 0
fi
ubs "${PROJECT_DIR}" --ci 2>&1 | head -50
fi
4 changes: 4 additions & 0 deletions .claude/hooks/session_start_mail.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
#!/usr/bin/env bash
set -euo pipefail
ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
exec "${ROOT}/apps/orchestrator/hooks/session_start_mail.sh" "$@"
9 changes: 6 additions & 3 deletions .claude/settings.json
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
},
{
"type": "command",
"command": "cd '/Users/bone/dev/games/patina/mcp_agent_mail' && uv run python -m mcp_agent_mail.cli acks pending '/Users/bone/dev/games/patina' 'YOUR_AGENT_NAME' --limit 20"
"command": "cd '/Users/bone/dev/games/patina/mcp_agent_mail' && uv run python -m mcp_agent_mail.cli acks pending '/Users/bone/dev/games/patina' \"$AGENT_NAME\" --limit 20"
}
]
}
Expand All @@ -32,7 +32,7 @@
"hooks": [
{
"type": "command",
"command": "AGENT_MAIL_PROJECT='/Users/bone/dev/games/patina' AGENT_MAIL_AGENT='YOUR_AGENT_NAME' AGENT_MAIL_URL='http://127.0.0.1:8765/api/' AGENT_MAIL_TOKEN='2682e5cd154ab3ea2d8fcce03861f1fc49ac12583721c00efa54a8dd1b7c3c3c' AGENT_MAIL_INTERVAL='120' '/Users/bone/dev/games/patina/.claude/hooks/check_inbox.sh'"
"command": "AGENT_MAIL_PROJECT='/Users/bone/dev/games/patina' AGENT_MAIL_AGENT=\"$AGENT_NAME\" AGENT_MAIL_URL='http://127.0.0.1:8765/api/' AGENT_MAIL_TOKEN='2682e5cd154ab3ea2d8fcce03861f1fc49ac12583721c00efa54a8dd1b7c3c3c' AGENT_MAIL_INTERVAL='120' '/Users/bone/dev/games/patina/.claude/hooks/check_inbox.sh'"
}
]
},
Expand All @@ -41,7 +41,7 @@
"hooks": [
{
"type": "command",
"command": "cd '/Users/bone/dev/games/patina/mcp_agent_mail' && uv run python -m mcp_agent_mail.cli list-acks --project '/Users/bone/dev/games/patina' --agent 'YOUR_AGENT_NAME' --limit 10"
"command": "cd '/Users/bone/dev/games/patina/mcp_agent_mail' && uv run python -m mcp_agent_mail.cli list-acks --project '/Users/bone/dev/games/patina' --agent \"$AGENT_NAME\" --limit 10"
}
]
},
Expand All @@ -55,5 +55,8 @@
]
}
]
},
"enabledPlugins": {
"code-review@claude-plugins-official": true
}
}
56 changes: 56 additions & 0 deletions .claude/skills/deploy-orchestrator/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
---
name: deploy-orchestrator
description: Build, test, and deploy the orchestrator binary. Rebuilds the release binary, runs tests, and triggers an assignment cycle so idle workers pick up work immediately.
trigger: "deploy orchestrator", "restart orchestrator", "rebuild orchestrator", "redeploy orchestrator"
---

# Deploy Orchestrator

Build, test, and hot-deploy the Rust orchestrator binary. The orchestrator is invoked per-cycle (not a long-running daemon), so rebuilding the release binary is sufficient — the next cycle picks up the new code automatically. An immediate assignment cycle is triggered to avoid waiting.

## Steps

1. **Compile-check via the build-slot wrapper** (NOT raw `cargo`). The wrapper holds the single build-slot lock so a verifier run doesn't collide with this deploy:
```bash
./scripts/rust_task.sh check -p patina-orchestrator 2>&1 | tail -5
```
If `check` fails, stop and fix before deploying. Do NOT run `cargo test` here — the verifier lane is the sole test runner; running the full suite inline would (a) fight the verifier for the build slot and (b) burn 5–10 min before the user sees the binary update.

2. **Build release binary** through the same wrapper:
```bash
./scripts/rust_task.sh build --release -p patina-orchestrator 2>&1 | tail -5
```

3. **Find the coordinator identity** — read the canonical pointer file (the orchestrator writes this on every coordinator startup):
```bash
cat /Users/bone/dev/games/patina/.beads/coordinator_agent 2>/dev/null
```
This is the single source of truth. Do NOT grep logs, do NOT guess names like `IvoryTower`/`liveTower`, do NOT inspect tmux pane scrollback. If the file is missing or empty, the coordinator isn't running — surface that and stop, don't fabricate a name.

4. **Trigger an immediate assignment cycle** to prompt idle workers. Read the coordinator name from the file (do not hard-code):
```bash
COORDINATOR="$(cat /Users/bone/dev/games/patina/.beads/coordinator_agent)"
AGENT_NAME="$COORDINATOR" ORCH_SESSION=patina-fly \
./apps/orchestrator/crate/target/release/patina-orchestrator assign --session patina-fly 2>&1
```

5. **Verify** workers are picking up work:
```bash
tail -5 /tmp/patina-orchestrator.log
```
Look for "Assigning", "Queuing prompt", and "pane done ok=true" lines.

## Notes

- The orchestrator binary lives at `apps/orchestrator/crate/target/release/patina-orchestrator`
- It's invoked per poll/assign cycle from the coordinator Claude in `patina-fly:0.1`
- No process restart needed — rebuilding the binary is the deployment
- The `assign` subcommand runs a single idle-fill + prompt submission cycle
- The `poll` subcommand processes pending completions and reassigns workers

## Hard Rules

- NEVER run raw `cargo test`, `cargo build`, `cargo check`, `cargo nextest` from this skill. Always go through `./scripts/rust_task.sh` so the build-slot lock prevents collision with the verifier lane.
- NEVER run `cargo test` (full suite) during a deploy. The verifier lane runs tests; this skill ships the binary.
- NEVER hard-code a coordinator agent name. Always read `.beads/coordinator_agent`. If it's missing, the coordinator isn't running — say so, don't guess.
- NEVER grep tmux scrollback or log files to "discover" the coordinator name when the canonical pointer file exists.
163 changes: 163 additions & 0 deletions .claude/skills/editor-parity/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,163 @@
---
name: editor-parity
description: Compare the Patina editor against Godot 4.6.1 visually. Takes screenshots of both editors, identifies UX gaps, and creates beads for differences.
argument-hint: [area-to-compare]
trigger: "editor parity", "compare editors", "compare to godot", "visual parity", "editor diff", "how does it compare"
---

# Editor Parity Checker

Visually compare the Patina editor against Godot 4.6.1 and create beads for differences.

## How It Works

Claude uses multimodal vision to semantically compare both editors — no pixel-diffing, just intelligent visual analysis of layout, controls, styling, and behavior.

## Steps

### 1. Ensure both editors are visible

Check browser tabs for the Patina editor:
```
mcp__claude-in-chrome__tabs_context_mcp
```

If Patina editor isn't open, navigate to `http://localhost:8080/editor` in a new tab.

Ask the user to have Godot 4.6.1 open to the same view/state if it's not already visible. The user may also provide screenshots directly.

### 2. Capture Patina editor screenshot

Use Claude-in-Chrome to screenshot the Patina editor tab:
```
mcp__claude-in-chrome__computer action=screenshot tabId=<patina_tab_id>
```

If `$ARGUMENTS` specifies an area (e.g. "inspector", "scene tree", "viewport", "toolbar"), zoom into that region:
```
mcp__claude-in-chrome__computer action=zoom tabId=<patina_tab_id> region=[x0,y0,x1,y1]
```

### 3. Get Godot reference

Options (try in order):
1. **User provides screenshot** — if the user attached an image of Godot, use that
2. **Godot is in another tab** — screenshot it via Claude-in-Chrome
3. **Reference from memory** — use knowledge of Godot 4.6.1's editor layout (Claude has trained on Godot editor screenshots extensively)

### 4. Visual comparison

Compare the two editors across these dimensions, reporting each as a table:

#### A. Layout & Panels
| Element | Godot 4.6.1 | Patina | Match? |
|---------|-------------|--------|--------|
| Scene tree position | left dock | ? | |
| Inspector position | right dock | ? | |
| Viewport position | center | ? | |
| Bottom panels | Output/Debugger/Audio/Animation/Shader | ? | |
| FileSystem dock | left bottom with full browser | ? | |
| Toolbar | top with icon buttons | ? | |
| Menu bar | Scene/Import above tree | ? | |

#### B. Scene Tree
| Feature | Godot 4.6.1 | Patina | Match? |
|---------|-------------|--------|--------|
| Node type icons | colored by class (blue=Node2D, etc.) | ? | |
| Script indicator | scroll icon on scripted nodes | ? | |
| Warning indicator | yellow triangle | ? | |
| Visibility toggle | eye icon | ? | |
| Lock toggle | lock icon | ? | |
| Context menu | full right-click menu | ? | |
| Drag-drop reorder | yes | ? | |
| Multi-select | shift+ctrl click | ? | |

#### C. Inspector
| Feature | Godot 4.6.1 | Patina | Match? |
|---------|-------------|--------|--------|
| Property categories | grouped (Node, Node2D, CanvasItem) | ? | |
| Property editors | type-specific widgets | ? | |
| Resource toolbar | new/open/save/back/forward | ? | |
| Node class header | shows class name + icon | ? | |
| Filter properties | search box | ? | |

#### D. Viewport
| Feature | Godot 4.6.1 | Patina | Match? |
|---------|-------------|--------|--------|
| Grid rendering | fine grid with major lines | ? | |
| Node rendering | class-specific (sprites, collision shapes) | ? | |
| Selection highlight | orange outline + handles | ? | |
| Transform gizmo | move/rotate/scale handles | ? | |
| Zoom controls | mouse wheel + UI buttons | ? | |
| Rulers | top + left rulers | ? | |
| Node labels | readable names below nodes | ? | |

#### E. Styling
| Element | Godot 4.6.1 | Patina | Match? |
|---------|-------------|--------|--------|
| Color scheme | dark gray (#2d2d2d ish) | ? | |
| Font | system sans-serif | ? | |
| Button style | flat with hover highlights | ? | |
| Panel borders | subtle 1px separators | ? | |
| Icon style | monochrome with class colors | ? | |

### 5. Prioritize gaps

Categorize each difference as:
- **P1 — Broken** (functionality doesn't work — e.g. selection broken, garbled text)
- **P2 — Missing feature** (feature exists in Godot but absent in Patina)
- **P3 — Visual polish** (works but looks different from Godot)

### 6. Create beads for gaps

For each P1 and P2 gap, check if a bead already exists. Run this EXACT command and extractor — shell only, no python wrappers, no fuzzy matching:

```bash
br search "TITLE" --status open --status in_progress --status closed --json --no-auto-import --allow-stale | jq -r '.issues | length'
```

**Selection rule**: The output is a single integer N (count of matches across all statuses).
- If `N >= 1` → SKIP this gap. Do NOT create a bead. Do NOT inspect titles. Do NOT decide whether the matches are "close enough" or "really the same".
- If `N == 0` → create the bead with the command below.

Do NOT pipe `br search` into python. Do NOT define your own match predicate. Do NOT compare titles yourself — `br search` already handles substring/FTS matching, any hit means a duplicate exists.

```bash
br sync --rebuild 2>&1 | tail -1
br create "<title>" -p <priority> --type <bug|feature> --labels editor
```

### 7. Summary

Present a final report:
```
## Editor Parity Report — [area]

### Score: N/M features matching

### Gaps Found
| Priority | ID | Gap |
|----------|-----|-----|
| P1 | pat-xxx | ... |
| P2 | pat-yyy | ... |

### Already Tracked
- pat-aaa: ...
- pat-bbb: ...

### Next Steps
- [prioritized list of what to fix first]
```

## Hard Rules

- NEVER wrap `br search` (or `br ready`, `br count`, `br list`) in a python (or any) filter that defines its own match/dedup predicate. Use the shown `jq -r '.issues | length'` extractor and apply the integer rule (`>= 1` skip, `== 0` create).
- NEVER inspect candidate titles to decide if a `br search` hit is "really" a duplicate — any hit is a duplicate, period.
- NEVER skip the dedup query and create beads based on your own judgment of whether a gap is "new enough".

## Tips

- Compare the SAME scene in both editors for meaningful results
- Focus on one area at a time (scene tree, inspector, viewport) for detailed analysis
- Run this skill periodically as editor work progresses to track convergence
- The `$ARGUMENTS` can specify which area to focus on: "scene tree", "inspector", "viewport", "toolbar", "filesystem", or "full" for everything
Loading
Loading