用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
直接命令不会经过审查 Prompt;运行前请先检查来源。
npx skills add https://github.com/ucsandman/dashclaw-agent --skill instrument-agent命令会保持在同一行。复制前请横向滚动并检查完整内容。
想先保存到本地?可下载 SkillsMP 当前能够提供的文件。
基于 SOC 职业分类
正在显示 SKILL.md
| name | instrument-agent |
| description | Integrate DashClaw SDK into any agent using the 4-step governance loop |
| license | MIT |
| metadata | {"author":"ucsandman","version":"1.0.0","category":"integration"} |
Help developers add DashClaw governance to any AI agent. Walk through the 4-step governance loop with working code.
Every governed decision follows this deterministic flow:
1. Guard → "Can I do this?" (POST /api/guard)
2. Record → "I am doing this." (POST /api/actions)
3. Verify → "I believe this is true." (POST /api/assumptions)
4. Outcome → "This was the result." (PATCH /api/actions/:id)
npm install dashclaw
import { DashClaw } from 'dashclaw';
const claw = new DashClaw({
baseUrl: process.env.DASHCLAW_BASE_URL,
apiKey: process.env.DASHCLAW_API_KEY,
agentId: 'my-agent'
});
pip install dashclaw
from dashclaw import DashClaw
claw = DashClaw(
base_url=os.environ["DASHCLAW_BASE_URL"],
api_key=os.environ["DASHCLAW_API_KEY"],
agent_id="my-agent"
)
const decision = await claw.guard({
action_type: 'deploy',
declared_goal: 'Deploy build #402 to production',
risk_score: 85,
systems_touched: ['production', 'database'],
reversible: false
});
// decision.decision: 'allow' | 'warn' | 'block' | 'require_approval'
if (decision.decision === 'block') {
console.log('Blocked:', decision.reason);
return;
}
decision = claw.guard(
action_type="deploy",
declared_goal="Deploy build #402 to production",
risk_score=85,
systems_touched=["production", "database"],
reversible=False
)
if decision["decision"] == "block":
print(f"Blocked: {decision['reason']}")
return
Guard response shape:
{
"decision": "require_approval",
"action_id": "act_gd_abc123",
"reason": "Risk score exceeds org threshold",
"signals": ["Production access", "High risk score"],
"risk_score": 75,
"agent_risk_score": 85
}
const action = await claw.createAction({
action_type: 'deploy',
declared_goal: 'Deploy build #402 to production',
risk_score: 85,
reversible: false,
systems_touched: ['production']
});
// action.action_id: 'ar_abc123'
action = claw.create_action(
action_type="deploy",
declared_goal="Deploy build #402 to production",
risk_score=85,
reversible=False,
systems_touched=["production"]
)
await claw.recordAssumption({
action_id: action.action_id,
assumption: 'Staging tests passed successfully',
source: 'ci-pipeline'
});
claw.record_assumption(
action_id=action["action_id"],
assumption="Staging tests passed successfully",
source="ci-pipeline"
)
await claw.updateOutcome(action.action_id, {
status: 'completed', // or 'failed'
output_summary: 'Build #402 deployed successfully to production',
timestamp_end: new Date().toISOString()
});
claw.update_outcome(action["action_id"], {
"status": "completed",
"output_summary": "Build #402 deployed successfully to production"
})
Instead of manually passing action_id to every call, use actionContext():
const action = await claw.createAction({
action_type: 'deploy',
declared_goal: 'Deploy build #402 to production',
risk_score: 85,
reversible: false
});
// All operations auto-tagged with action.action_id
const ctx = claw.actionContext(action.action_id);
await ctx.sendMessage({ to: 'ops-agent', type: 'status', body: 'Starting deploy' });
await ctx.recordAssumption({ assumption: 'All CI checks passed' });
try {
await actualDeploy(buildId);
await ctx.updateOutcome({ status: 'completed', output_summary: 'Deployed successfully' });
} catch (err) {
await ctx.updateOutcome({ status: 'failed', output_summary: err.message });
}
action = claw.create_action(
action_type="deploy",
declared_goal="Deploy build #402 to production",
risk_score=85,
reversible=False
)
with claw.action_context(action["action_id"]) as ctx:
ctx.send_message("Starting deploy", to="ops-agent")
ctx.record_assumption({"assumption": "All CI checks passed"})
try:
actual_deploy(build_id)
ctx.update_outcome(status="completed", output_summary="Deployed successfully")
except Exception as e:
ctx.update_outcome(status="failed", output_summary=str(e))
Messages and assumptions sent through the context appear correlated in the decision timeline at /decisions/{actionId} — showing the full causal chain of guard decision → messages → action → assumptions → outcome.
import { DashClaw } from 'dashclaw';
const claw = new DashClaw({
baseUrl: process.env.DASHCLAW_BASE_URL,
apiKey: process.env.DASHCLAW_API_KEY,
agentId: 'deploy-agent'
});
async function governedDeploy(buildId) {
// 1. Guard
const decision = await claw.guard({
action_type: 'deploy',
declared_goal: `Deploy build #${buildId} to production`,
risk_score: 85,
systems_touched: ['production'],
reversible: false
});
if (decision.decision === 'block') {
console.log('Blocked:', decision.reason);
return;
}
// 2. Record
const action = await claw.createAction({
action_type: 'deploy',
declared_goal: `Deploy build #${buildId} to production`,
: ,
:
});
ctx = claw.(action.);
ctx.({ : , : , : });
ctx.({ : });
{
(buildId);
ctx.({
: ,
:
});
} (err) {
ctx.({
: ,
: err.
});
}
}
| Action Type | Risk Score | Reversible | Example |
|---|---|---|---|
| deploy | 75-90 | false | Production deployment |
| api_call | 20-40 | true | External API request |
| file_write | 15-30 | true | Local file modification |
| database | 50-80 | false | Schema migration, data deletion |
| security | 80-95 | false | Key rotation, permission changes |
| build | 10-25 | true | npm install, compilation |
| notify | 5-15 | true | Send email, Slack message |
Risk scoring rule: DashClaw uses the HIGHER of computed risk and agent-reported risk. Always report honestly — inflating risk is better than under-reporting.
When guard returns require_approval:
if (decision.decision === 'require_approval') {
console.log('Waiting for human approval...');
await claw.waitForApproval(decision.action_id, {
timeout: 300000 // 5 minutes
});
// Continues after approval, throws ApprovalDeniedError if denied
}
| Variable | Required | Description |
|---|---|---|
DASHCLAW_BASE_URL | Yes | DashClaw instance URL |
DASHCLAW_API_KEY | Yes | API authentication key |
DASHCLAW_AGENT_ID | No | Default agent identifier |
After instrumenting, run the integration validator:
node scripts/validate-integration.mjs --base-url $DASHCLAW_BASE_URL --api-key $DASHCLAW_API_KEY