STEP 5 OF 8
Skills & Code
From any engineer's profile, Customize opens /agents/{id}/edit
(frontend/src/app/(dashboard)/agents/[id]/edit/page.tsx) — this is the current, real location
for per-agent skill and code editing. It supersedes an older, now-deleted top-level
/agent-workspace route; there is no such route in the codebase anymore.
This page is gated to tenant admins/owners (user.role in ('admin','owner') or
super_admin). Everyone else sees a permission notice instead of the editor.
Customizations layer on top of stock, never mutate it
Everything you change on this page is a customization — a separate record layered on top of the stock engineer, scoped tenant-wide or to one engagement via the Engagement scope selector in the header. The stock engineer definition is never mutated; delete the customization and the agent falls back to stock exactly as it was.
# Read the current customization (tenant-wide, or scoped to one engagement)
curl "https://your-control-plane-host/api/v1/workforce/agents/{agent_id}/customization?engagement_id={engagement_id}" \
-H "Authorization: Bearer $TOKEN"
# Save changes
curl -X PUT https://your-control-plane-host/api/v1/workforce/agents/{agent_id}/customization \
-H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
-d '{
"persona_prompt_override": "...",
"code_override": "...",
"llm_model_override": "claude-opus-4-7",
"temperature_override": 0.4,
"tools_override": ["web_search", "code_exec"],
"removed_skill_credential_ids": [],
"added_skills": [{"skill": "Snowflake Migration", "level": 2}]
}'
The four tabs
- Persona — a Monaco markdown editor for the system-prompt-equivalent persona. Check Show
stock vs. your override to render both side by side plus a real diff (
DiffViewer,components/monitoring/DiffViewer.tsx). - Skills — click a skill chip to remove it (masked for your tenant, not deleted upstream), or add a new one with a name, a tier (1–4), and an evidence URL.
- Code — a Monaco Python editor for the agent's
code_override, with the same stock-vs-override diff toggle as Persona. - Behavior — override the LLM model (
claude-sonnet-4-6,claude-opus-4-7, orgpt-4o), temperature (slider), and the tool list. Tools default to inherit from stock; click "Take ownership of tool list" to start editing your own list, sourced from the real tool catalog (GET /api/v1/workforce/tool-catalog).
Test before you save
The "Sanity-check your engineer" panel at the bottom sends one live Claude Sonnet 4.6 message using your merged spec (stock + in-progress overrides) — it does not persist anything:
curl -X POST https://your-control-plane-host/api/v1/workforce/agents/{agent_id}/test \
-H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
-d '{"message": "In one sentence, what is your role?"}'
Promoting engagement-learned skills to the master agent
If you're editing an engagement-scoped customization and it has skills added during that
engagement, a "Promote learned skills to the master agent" panel appears. Promoting turns those
engagement-specific skills into permanent SkillCredential rows on the stock engineer — every
future engagement starts from that upgraded baseline. This is audit-logged:
curl -X POST https://your-control-plane-host/api/v1/workforce/agents/{agent_id}/promote-skills \
-H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
-d '{"engagement_id": "<engagement_id>"}'
# -> { "agent_id": "...", "promoted_count": N, "promoted_skills": [...] }
Export in your own framework
Export & Deploy (/export-harness) publishes the whole harness as one signed zip, and the
Export tab's Framework selector adds runnable code for the stack your team already uses —
generated from the same runtime spec (agents/<slug>/agent.json) the Vouchstone runtime executes:
| Flavor | What you get | Workflows |
|---|---|---|
| Native (default) | The harness tree as-is — what the data-plane runtime runs | All, via the runtime |
| LangGraph | A compiled ReAct agent per spec (exports/langgraph/agents/*.py) | A StateGraph module per linear agent workflow; anything unmappable is listed in the README as runtime-only, with the reason |
| Claude Agent SDK | An agent per spec driven through Anthropic's Claude Agent SDK, platform tools served over an in-process MCP server | Agents only (stated in the README) |
| Microsoft Agent Framework | An agent_framework.Agent per spec (Anthropic or OpenAI chat client) | Agents only (stated in the README) |
Every flavor keeps governance and memory real: the generated code registers only the tools the
spec permits (local enforcement), and KG-scoped retrieval, gateway approvals, autonomy, budget
caps, the signed ledger, and the 5-layer memory pipeline all stay enforced server-side on the
control-plane calls — the flavor README carries the exact guarantees table. Generated files land
under exports/ in the Code tab, hand-editable like everything else; your edits win over
regeneration.
What's next
Step 6 — Workflows: chain multiple agents (with whatever customizations you've made) into a step-by-step, drag-and-drop workflow.