From rtl-agent-team
Implements Phase 4 RTL for 6 video codec blocks (entropy,tq,me,mc,intra,filter) in parallel git worktrees with team coordination, upstream-first merges, and contract tests. Requires Phase 2 interfaces and Phase 3 uArch.
npx claudepluginhub babyworm/rtl-agent-team --plugin rtl-agent-teamThis skill is limited to using the following tools:
<Purpose>
Generates design tokens/docs from CSS/Tailwind/styled-components codebases, audits visual consistency across 10 dimensions, detects AI slop in UI.
Records polished WebM UI demo videos of web apps using Playwright with cursor overlay, natural pacing, and three-phase scripting. Activates for demo, walkthrough, screen recording, or tutorial requests.
Delivers idiomatic Kotlin patterns for null safety, immutability, sealed classes, coroutines, Flows, extensions, DSL builders, and Gradle DSL. Use when writing, reviewing, refactoring, or designing Kotlin code.
<Use_When>
<Do_Not_Use_When>
Phase 2 interface freeze and Phase 3 uArch completion required:
rtl/pkg/codec_if_pkg.sv must exist (Phase 2 interface package)docs/phase-3-uarch/ must exist# Soft advisory check — WARNING + fallback, NOT hard block
if not Glob("rtl/pkg/codec_if_pkg.sv"):
print("WARNING: rtl/pkg/codec_if_pkg.sv not found — Phase 2 interfaces missing.")
print("Falling back to rtl-p4-implement (sequential, non-team).")
Skill(skill="rtl-agent-team:rtl-p4-implement", prompt=ARGUMENTS)
return
if not Glob("docs/phase-3-uarch/*.md"):
print("WARNING: docs/phase-3-uarch/ has no uArch specs — Phase 3 incomplete.")
print("Falling back to rtl-p4-implement (sequential, non-team).")
Skill(skill="rtl-agent-team:rtl-p4-implement", prompt=ARGUMENTS)
return
Before starting fresh, check for existing state:
# === Phase 0: Resume Check ===
state_path = ".rat/state/block-parallel-state.json"
state = Read(state_path) # Returns None if not found
if state:
# Verify safety conditions for resume
current_hash = Bash("find rtl/pkg/ rtl/intf/ docs/phase-3-uarch/ -name '*.sv' -o -name '*.md' | sort | xargs sha256sum | sha256sum | cut -d' ' -f1")
if current_hash != state["frozen_hash"]:
print("WARNING: Design freeze hash mismatch. Starting fresh.")
state = None
if state:
base_ok = Bash(f"git merge-base --is-ancestor {state['base_commit']} HEAD && echo yes || echo no")
if base_ok.strip() != "yes":
print("WARNING: Base commit not ancestor of HEAD. Starting fresh.")
state = None
if state:
for block, info in state["blocks"].items():
if info.get("worktree_path") and info["status"] != "merged":
wt_exists = Bash(f"test -d \"{info['worktree_path']}\" && echo yes || echo no")
if wt_exists.strip() != "yes":
print(f"WARNING: Worktree for {block} missing. Starting fresh.")
state = None
break
Both resume and fresh paths need a team (teams are session-scoped, not persistent).
# ALL-OR-NOTHING: if TeamCreate fails, fall back entirely to sequential.
# At this point no worktrees or tasks have been created in THIS session, so cleanup is clean.
try:
TeamCreate(team_name="p4-block-parallel", description="6-block parallel RTL implementation with worktree isolation")
except:
print("WARNING: TeamCreate failed. Falling back to rtl-p4-implement (sequential, non-team).")
Skill(skill="rtl-agent-team:rtl-p4-implement", prompt=ARGUMENTS)
return
## Common Step 2: Write team-config.json
Write(".rat/state/team-config.json", json.dumps({
"team_mode": true,
"team_name": "p4-block-parallel",
"leader_session_id": "<current_session_id>",
"coordinator_name": "coordinator",
"worker_count": 6,
"phase": "p4",
"created_at": ISO_TIMESTAMP
}))
if state:
# === RESUME PATH ===
# Restore runtime variables from saved state (worktrees already exist from prior session)
blocks = list(state["blocks"].keys())
merge_order = blocks
frozen_hash = state["frozen_hash"]
base_commit = state["base_commit"]
project_root = Bash("git rev-parse --show-toplevel").strip()
print(f"Resuming from phase: {state['phase']}, "
f"blocks completed: {sum(1 for b in state['blocks'].values() if b['status'] == 'merged')}/6")
# Re-create task graph (tasks are session-scoped, not persistent across sessions)
for block in blocks:
TaskCreate(
subject=f"Implement: {block}",
description=f"Implement {block} block in worktree {state['blocks'][block]['worktree_path']}. "
f"Status from prior session: {state['blocks'][block]['status']}.",
owner=f"worker-{block}"
)
else:
# === FRESH START PATH ===
## Step 3: Design Freeze Snapshot
frozen_hash = Bash("find rtl/pkg/ rtl/intf/ docs/phase-3-uarch/ -name '*.sv' -o -name '*.md' 2>/dev/null | sort | xargs sha256sum 2>/dev/null | sha256sum | cut -d' ' -f1").strip()
base_commit = Bash("git rev-parse HEAD").strip()
project_root = Bash("git rev-parse --show-toplevel").strip()
Write(".rat/state/design-freeze.json", json.dumps({
"frozen_hash": frozen_hash,
"base_commit": base_commit,
"frozen_paths": ["rtl/pkg/", "rtl/intf/", "docs/phase-3-uarch/"],
"created_at": ISO_TIMESTAMP
}))
## Step 4: Prepare Directories
Bash("mkdir -p reviews/phase-4-rtl docs/phase-4-rtl .rat/scratch/phase-4")
## Step 5: Initialize State
blocks = ["entropy", "tq", "me", "mc", "intra", "filter"]
merge_order = ["entropy", "tq", "me", "mc", "intra", "filter"]
state = {
"phase": "implement",
"created_at": ISO_TIMESTAMP,
"leader_session_id": "<current_session_id>",
"base_commit": base_commit,
"frozen_hash": frozen_hash,
"merge_frontier_commit": base_commit,
"blocks": {
block: {
"status": "pending",
"worktree_path": None,
"worktree_branch": None,
"lint_pass": false,
"unit_test_pass": false,
"contract_test_pass": false,
"merge_commit": None
} for block in blocks
},
"merge_order": merge_order,
"current_merge_index": 0
}
Write(".rat/state/block-parallel-state.json", json.dumps(state))
## Step 6: Create Worktrees
# ALL-OR-NOTHING: if any worktree fails, clean up all and fall back
# Team exists at this point, so TeamDelete is valid in cleanup
worktree_ok = True
for block in blocks:
branch = f"p4-block-{block}"
wt_path = f"{project_root}/.worktrees/p4-{block}" # Absolute path
Bash(f"mkdir -p \"{project_root}/.worktrees\"")
result = Bash(f"git worktree add -b {branch} \"{wt_path}\" HEAD 2>&1")
if result.returncode != 0:
worktree_ok = False
break
state["blocks"][block]["worktree_path"] = wt_path
state["blocks"][block]["worktree_branch"] = branch
state["blocks"][block]["status"] = "worktree-ready"
if not worktree_ok:
for block in blocks:
if state["blocks"][block].get("worktree_path"):
Bash(f"git worktree remove --force \"{state['blocks'][block]['worktree_path']}\" 2>/dev/null")
Bash("rm -f .rat/state/block-parallel-state.json")
TeamDelete()
Bash("rm -f .rat/state/team-config.json")
print("WARNING: Worktree creation failed. Falling back to rtl-p4-implement (sequential, non-team).")
Skill(skill="rtl-agent-team:rtl-p4-implement", prompt=ARGUMENTS)
return
Write(".rat/state/block-parallel-state.json", json.dumps(state))
## Step 7: Initial Task Graph
# Create task graph AFTER TeamCreate so team context is available,
# and BEFORE spawning agents so tasks exist when workers start
for block in blocks:
TaskCreate(
subject=f"Implement: {block}",
description=f"Implement {block} block in worktree {state['blocks'][block]['worktree_path']}. "
f"Read docs/phase-3-uarch/{block}.md, spawn domain expert, "
f"delegate to rtl-coder, run lint, create unit tests. "
f"Report ready-for-merge when complete.",
owner=f"worker-{block}"
)
# === END fresh-start / resume branch ===
# From here on, both paths converge: spawn agents → monitor
Agent(team_name="p4-block-parallel",
subagent_type="rtl-agent-team:p4-block-parallel-coordinator",
name="coordinator",
description="Block-parallel coordination: 6-block task graph + merge sequencing",
prompt="You are the Phase 4 block-parallel coordinator in team 'p4-block-parallel'. "
"Manage the 6-block task graph using TaskCreate/TaskList/TaskUpdate. "
"Direct workers via SendMessage. "
"Read .rat/state/block-parallel-state.json for worktree assignments. "
"Orchestrate upstream-first merge sequence after all blocks complete. "
"Signal leader when integration gate passes. User input: $ARGUMENTS")
block_descriptions = {
"entropy": "Entropy coding block (CABAC/CAVLC, syntax elements). No upstream dependency.",
"tq": "Transform/quantization block (DCT, Hadamard, QP mapping). Depends on entropy interface.",
"me": "Motion estimation block (block matching, SAD/SATD, search patterns). Uses dpb_stub for references.",
"mc": "Motion compensation block (interpolation, sub-pixel, bi-prediction). Depends on me + dpb_stub.",
"intra": "Intra prediction block (angular, planar, DC modes). Independent for merge.",
"filter": "Deblocking filter block (boundary strength, filtering decisions). Depends on reconstruction.",
}
for block in blocks:
Agent(team_name="p4-block-parallel",
subagent_type="rtl-agent-team:p4-block-worker",
name=f"worker-{block}",
description=f"P4 block worker: {block}",
prompt=f"Your assigned block: {block}. "
f"Description: {block_descriptions[block]} "
f"Worktree path: {state['blocks'][block]['worktree_path']}. "
f"Worktree branch: {state['blocks'][block]['worktree_branch']}. "
f"Use the worktree_path above as absolute path for ALL file operations "
f"(RTL coding, lint, unit tests). cd into worktree_path or use absolute paths. "
f"You run in main CWD for coordination (SendMessage, TaskUpdate), but "
f"spawn rtl-coder/lint/test subagents with worktree_path in their prompt. "
f"Read {state['blocks'][block]['worktree_path']}/docs/phase-3-uarch/{block}.md for uArch spec. "
f"Read frozen interfaces from {state['blocks'][block]['worktree_path']}/rtl/intf/ and "
f"{state['blocks'][block]['worktree_path']}/rtl/pkg/codec_if_pkg.sv. "
f"DO NOT modify files under rtl/pkg/ or rtl/intf/ (frozen). "
f"Report completion to coordinator via SendMessage. "
f"Naming: i_/o_ prefixes, snake_case, clk/{{domain}}_clk, rst_n/{{domain}}_rst_n.")
while True:
tasks = TaskList()
all_done = all(t.status == "completed" for t in tasks)
if all_done:
break
# Read state for progress tracking
state = Read(".rat/state/block-parallel-state.json")
# Check for MERGE_BLOCKED escalations
for block, info in state["blocks"].items():
if info["status"] == "merge-blocked":
# Escalate to user
AskUserQuestion(f"Block {block} merge is blocked after 3 contract test failures. "
f"Review the failure details and decide: retry, skip, or abort?")
# Continue polling
The coordinator drives upstream-first merge sequence:
Merge order: entropy -> tq -> me -> mc -> intra -> filter
At each merge point:
git merge --no-ff p4-block-{block}merge_frontier_commit, advance current_merge_index# Remove worktrees
for block in blocks:
wt_path = state["blocks"][block]["worktree_path"]
branch = state["blocks"][block]["worktree_branch"]
if wt_path:
Bash(f"git worktree remove \"{wt_path}\" 2>/dev/null")
if branch:
Bash(f"git branch -d {branch} 2>/dev/null")
# Team cleanup
TeamDelete()
Bash("rm -f .rat/state/team-config.json")
Bash("rm -rf .rat/scratch/phase-4/")
Full state is maintained at .rat/state/block-parallel-state.json:
{
"phase": "merge",
"created_at": "2026-03-15T10:00:00Z",
"leader_session_id": "session-abc123",
"base_commit": "abc1234",
"frozen_hash": "sha256:deadbeef...",
"merge_frontier_commit": "def5678",
"blocks": {
"entropy": {
"status": "merged",
"worktree_path": "/abs/path/to/project/.worktrees/p4-entropy",
"worktree_branch": "p4-block-entropy",
"lint_pass": true,
"unit_test_pass": true,
"contract_test_pass": true,
"merge_commit": "aaa1111"
},
"tq": {
"status": "implementing",
"worktree_path": "/abs/path/to/project/.worktrees/p4-tq",
"worktree_branch": "p4-block-tq",
"lint_pass": false,
"unit_test_pass": false,
"contract_test_pass": false,
"merge_commit": null
}
},
"merge_order": ["entropy", "tq", "me", "mc", "intra", "filter"],
"current_merge_index": 1
}
State is updated by both the coordinator (block status) and the skill (merge progress).
ALL-OR-NOTHING: Per agents/lib/team-fallback.md contract:
rtl-p4-implement (sequential, non-team)rtl-p4-implement (sequential, non-team)