Repairing the 55 broken skill bindings made the catalogue correct. This
makes it reachable, which it was not — for any skill, on any mission, since
the catalogue was built.
The skills had exactly ONE delivery channel: the `clawmates_skills` MCP
server. A mission claw could not reach it for three independent reasons:
1. `provision_claw` wrote the constant `["clawmates_door"]` and ignored
the template's mcp_bundles — which mission_orchestrator had already
resolved and stored on the team row.
2. The runtime config defines no `clawmates_skills` bundle. The live
local config defines no bundles at all, not even the door.
3. Mission claws run on `claude_cli`, which the runtime's own config
comments document as text-only: it cannot surface a tool call, so no
MCP server is reachable from a mission turn regardless of bundles.
And a mission turn's whole system context is two sentences synthesised from
the role slot in topology_exec::build_prompt. The template's role prose is
not used either — mission_orchestrator documents this, and it means the
role prompts describing which procedures to follow were never read.
Two doc comments in cm-runtime describe the mission path as already having
the summary-and-fetch contract. It never did. The belief was written down
twice and checked zero times, which is why nobody looked — and it is why
the Skill-Use measurement this review planned could only ever have returned
a trigger rate of zero. That would have read as a finding about the agents.
- provision_claw takes the bundles, with clawmates_door always added: a
template that forgets to list it must not get an ungated agent
- all 11 templates now request clawmates_skills; web_fetch removed, since
a list that is honoured must not name a bundle that does not exist
- the re-provision sweep re-asserts the team's own stored bundles rather
than a constant, which would have silently stripped a capability
mid-mission
- pinned skill BODIES are injected into the mission prompt, bounded and
with truncation stated. Bodies, not an index: there is no `skills.read`
tool on this path, so an index would advertise a capability that does
not exist — the exact failure this whole change is about
Three tests: the body reaches the prompt, an agent with no skills adds no
heading (an empty "Your skills" section announces skills the agent does not
have), and the composition is exercised separately from the lookup, because
`pinned_skills_text` working and `run_turn` calling it are different claims
and the second is the one that was false.
Also adds the three review documents: CAPABILITY-REVIEW (inventory, what
was repaired, what is deferred and why), PROVENANCE-ASSESSMENT (assess
only, per decision — what each store answers and the two candidate paths),
and RESEARCH-SWEEP (the fortnight's papers and what we did about each,
including the ones we deliberately did nothing about).
Full workspace suite green.
Co-Authored-By: Claude Opus 5 <[email protected]>
86 lines
3.0 KiB
TOML
86 lines
3.0 KiB
TOML
key = "gpu"
|
||
name = "GPU Programming"
|
||
description = "CUDA, Metal, ROCm from Rust — low-level GPU application development, kernel authoring, memory hierarchy tuning."
|
||
stack = ["rust", "cuda", "metal", "rocm", "gpu"]
|
||
default_topology = "pipeline"
|
||
risk_profile = "coding_readwrite"
|
||
mcp_bundles = ["clawmates_door", "clawmates_skills", "gitea_forge"]
|
||
version = 1
|
||
|
||
[[roles]]
|
||
slot = "arch_analyst"
|
||
order_idx = 0
|
||
skills = ["decompose-int-items", "gpu-coalescing-and-occupancy", "roofline-model"]
|
||
system_prompt = """
|
||
You are the ARCHITECTURE ANALYST of a GPU team.
|
||
|
||
For each INT item: identify the target architectures (SM_XX, Metal
|
||
version, GCN/RDNA gen), the compute-vs-memory-bound profile via a
|
||
rough roofline estimate, and the memory hierarchy strategy (shared,
|
||
constant, texture, unified). Hand off with target occupancy + tile
|
||
shape recommendations.
|
||
"""
|
||
brain_seed = """
|
||
# GPU arch seed
|
||
- CUDA: prefer warp-level primitives (shfl_sync) over shared mem when
|
||
data fits.
|
||
- Metal: threadgroup memory is 32KB on Apple7+; plan tiles around it.
|
||
- ROCm: LDS is 64KB; wavefront is 64 threads (vs CUDA's 32).
|
||
- Always check bandwidth-bound vs compute-bound BEFORE optimizing.
|
||
"""
|
||
|
||
[[roles]]
|
||
slot = "kernel_author"
|
||
order_idx = 1
|
||
skills = ["gpu-kernel-authoring", "workspace-repo-commit-protocol"]
|
||
system_prompt = """
|
||
You are the KERNEL AUTHOR of a GPU team.
|
||
|
||
Author the actual kernel(s) in the appropriate DSL (CUDA C++, MSL,
|
||
HIP), plus the Rust FFI wrapper. Coalesced global loads, no bank
|
||
conflicts in shared/threadgroup memory, no divergent branches on hot
|
||
paths. Prove each of those in a comment.
|
||
"""
|
||
brain_seed = """
|
||
# Kernel seed
|
||
- Coalescing rule: consecutive threads read consecutive 32/64/128-bit
|
||
words. Violating it = 10× slowdown.
|
||
- Occupancy > 50% for memory-bound kernels; can drop to 25% for
|
||
compute-bound with high ILP.
|
||
"""
|
||
|
||
[[roles]]
|
||
slot = "bench_engineer"
|
||
order_idx = 2
|
||
skills = ["gpu-profiling-workflow", "criterion-benchmarking"]
|
||
system_prompt = """
|
||
You are the BENCH ENGINEER of a GPU team.
|
||
|
||
Run Nsight Compute / Xcode GPU Frame Capture / rocprof on the target
|
||
kernel. Report: achieved bandwidth vs peak, achieved GFLOPS vs peak,
|
||
occupancy, and the ONE bottleneck to attack next.
|
||
"""
|
||
brain_seed = ""
|
||
|
||
[[roles]]
|
||
slot = "coder"
|
||
order_idx = 3
|
||
skills = ["write-rust-current-edition", "cargo-test-driven-development", "workspace-repo-commit-protocol", "int-xx-marker-protocol"]
|
||
system_prompt = """
|
||
You are the RUST-SIDE CODER. Integrate the kernel + FFI into the Rust
|
||
library, add safe wrappers, and expose ergonomic APIs. Own the
|
||
error-conversion path from GPU-side status codes to Rust `Result`s.
|
||
"""
|
||
brain_seed = ""
|
||
|
||
[[roles]]
|
||
slot = "committer"
|
||
order_idx = 4
|
||
skills = ["workspace-repo-commit-protocol", "small-focused-commits"]
|
||
system_prompt = """
|
||
You are the COMMITTER. Only run when the kernel meets the roofline
|
||
target OR a specific reason to defer is documented.
|
||
Emit COMPLETED: INT-<NN>.
|
||
"""
|
||
brain_seed = ""
|