一键导入
temperpaw-agent
TemperPaw agent operating manual — platform API, sandbox tools, and execution patterns
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
菜单
TemperPaw agent operating manual — platform API, sandbox tools, and execution patterns
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
基于 SOC 职业分类
Discover installed apps and capabilities — and design new ones when what you need doesn't exist
Build Temper apps when you need a new capability — your primary way to extend the platform
Lead agent review and delegation patterns for multi-agent coordination
Guide users through TemperPaw setup — check what's configured, help with what's missing
Act first with available tools — never ask the human to do what you can do yourself
Research-first planning methodology — investigate before implementing
| name | temperpaw-agent |
| description | TemperPaw agent operating manual — platform API, sandbox tools, and execution patterns |
Your execute tool runs Python in a sandboxed REPL. You have two objects: temper (platform API) and sandbox (remote shell + files). All calls are synchronous — no await needed.
Your capabilities are dynamic — they come from installed apps, not from a fixed tool list. Before assuming what you can or can't do, introspect the platform.
# What entity types are registered? This is the live truth.
specs = temper.specs()
# What's running right now?
sessions = temper.list_sessions()
agents = temper.list("Agents", "Status eq 'Active'")
The temper.* methods you see (create, list, action, get, patch) are generic — they operate on whatever entity types are installed. temper.specs() tells you what those are.
New capabilities are Temper-native apps — entity specs + Cedar policies + optional WASM modules. Not shell scripts. Not CLI tools. Use temper.submit_specs() to register new entity types, temper.submit_policy() for access rules, and temper.upload_wasm() for integration logic. See the platform-awareness skill for the full pattern.
Check whether the app providing that entity type is installed: temper.specs(). If it's missing, search Genesis with temper.search_apps(...) and install a pinned ref with temper.install_app({"app_ref":"owner/name@hash","follow_policy":"pinned"}).
If the app is installed but wrong, repair the app itself. Find the owning
Genesis app, edit the package in a workspace, call temper.update_app(...) or
temper.publish_app(...), install the returned pinned ref, and verify the
broken entity/action. Report the old ref, new ref, and smoke result. Do not
create a side queue item for app install or patch mirrored app folders by hand.
1. Research — Understand before acting.
temper.web_search("query") — search the web for docs, tutorials, APIstemper.web_fetch("url") — read a specific pagesandbox.bash("cat file") — read code you'll modifytemper.search_history("pattern") — check what was said earlier in this same conversationtemper.recall_memory("topic") — search persisted memory from earlier work2. Plan — Write a concrete plan and submit it for review.
plan = temper.create("Plans", {
"description": "Brief summary of the plan",
"plan_text": full_plan_text,
"author_agent_id": temper.get_agent_id()
})
plan_id = plan["entity_id"]
temper.action("Plans", plan_id, "SubmitForReview", {
"reviewer_agent_id": "<lead_agent_id or empty>"
})
temper.done("Plan submitted for review: " + plan_id)
temper.done(). Wait for approval before implementing.3. Implement (only after plan is Approved) — Execute the plan step by step.
sandbox.bash("pip install -r requirements.txt") works — use itsandbox.bash("python3 app.py &") to run servers in background4. Verify — Confirm the change works end-to-end.
5. Complete — Signal you're done.
temper.done("Summary of what was accomplished") — this completes your sessionYour sandbox is a full Linux VM (Ubuntu 24.04). You can:
sandbox.bash("pip install anything") — install Python packagessandbox.bash("npm install") — install Node packagessandbox.bash("git clone ...") — clone repossandbox.bash("curl ...") — make HTTP requests to any URLsandbox.bash("python3 script.py &") — run processes in backgroundsandbox.read(path) / sandbox.write(path, content) / sandbox.edit(path, old, new)The sandbox has: Python 3.12, Node.js v24, git, curl, pip, npm. Rust is NOT pre-installed but you can install it: sandbox.bash("curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y")
temper.create(entity_set, fields_dict) # create entity
temper.get(entity_set, entity_id) # get by ID
temper.list(entity_set, filter_str) # list with OData $filter
temper.action(entity_set, id, action, params)# dispatch action
temper.patch(entity_set, id, fields_dict) # partial update
temper.spawn_session(task, soul_id=None, model=None, background=False, max_turns=None)
temper.list_sessions(filter=None)
temper.abort_session(session_id)
temper.steer_session(session_id, message)
temper.save_memory(key, content, memory_type="project") # persist knowledge
temper.recall_memory(query) # search persisted memory
temper.get_secret(key) # read API keys from vault (e.g. "dd_api_key", "github_token")
temper.web_search(query) # search the web, returns results
temper.web_fetch(url) # fetch and read a web page
temper.submit_specs(files_dict) # hot-load specs; include model.csdl.xml and one or more *.ioa.toml files
temper.upload_wasm(module_name, wasm_base64) # upload WASM module
temper.submit_policy(policy_id, cedar_text) # create Cedar policy
temper.search_apps({query?, owner?, status?, registry_url?}) # search Genesis
temper.install_app({app_ref, tenant?, registry_url?, registry_tenant?, follow_policy?, reason?}) # install pinned Genesis ref; default follow_policy is pinned
temper.publish_app({path, owner, name, registry_url?, registry_tenant?, message?}) # push app bytes to Genesis and verify latest
temper.update_app({path, app_ref_or_name, registry_url?, registry_tenant?, message?}) # push next version and verify latest
temper.get_decisions() # list pending decisions
temper.poll_decision(decision_id) # check decision status
temper.approve_decision(id, scope) # approve (Cedar-gated)
temper.deny_decision(id) # deny (Cedar-gated)
temper.read(path) # read file content by path (including SKILL.md)
temper.write(path, content) # write file by path (auto-creates workspace/dirs)
# Skills are listed in your system prompt as <skill name="..." path="..." />
# Load full content: temper.read("/system/skills/platform-awareness/SKILL.md")
# Scope paths: /system/skills/, /agents/{id}/skills/, /projects/{id}/skills/
temper.specs() # all registered entity types, states, actions
temper.show_spec(entity_type) # inspect a single entity type in detail
temper.get_trajectories(failed_only=True) # failed intents (evolution data)
temper.get_insights() # system improvement recommendations
temper.list_policies() # active Cedar policies
temper.ls(path) # list directory
temper.grep(pattern, path) # search file contents
temper.glob(pattern, path?) # find files by pattern
temper.edit(path, old_string, new_string) # search-and-replace in file
temper.rename(old_path, new_path) # rename/move file
temper.search_history(pattern) # search this conversation history
temper.run_coding_agent({agent_type: "...", task: "...", workdir: "/path", background: False})
temper.datadog_query({query_kind: "monitor_status"|"metrics_query"|"logs_query"|"trace_query"|"llmobs_query"|"dbm_query"|"profiling_query", ...})
temper.railway({action: "deployment_status"|"redeploy", ...})
temper.vercel({action: "deployment_status"|"list_deployments", ...})
Datadog is the operational source of truth for live TemperPaw behavior. Use it with Temper entity state, not as a disconnected graph. The same fields should be readable by humans and agents.
Search for the session root span temperpaw.agent.session, then pivot by
session_id, managed_session_id, inner_session_id, dd.trace_id, and
dd.span_id. A good session trace is chronological, expandable, and
non-redundant: it shows turns, context preparation, entity actions, WASM
integrations, LLM calls, tool calls, sandbox exec/file operations, approvals,
recovery, Postgres DBM spans, and terminal state without a flood of tiny
duplicate spans.
For WASM diagnosis, use wasm_module, workflow_step, progress.kind,
wasm_guest.progress, and the host-boundary spans
wasm.host.get_secret, wasm.host.evaluate_spec,
wasm.host.connect_call, wasm.host.http_stream,
wasm.host.cache_contains, wasm.host.cache_to_stream,
wasm.host.cache_from_stream, wasm.host.read_field, and
wasm.host.hash_stream. These are deliberate host-side boundary spans and
events, not inside-WASM APM spans.
service:temperpaw, env, version, and
owner tags. Use monitors to find scope, then move into traces or logs.tenant, entity_type, entity_id,
action_name, state, session_id, managed_session_id,
inner_session_id, workspace_id, file_id, content_hash, tool.name,
gen_ai.operation.name, dd.trace_id, and dd.span_id.dd.trace_id and dd.span_id to pivot between APM, logs, and
entity/action state. Prefer span events or structured logs for high-frequency
detail.observability_event=temperpaw.blob
or observability_event=temperpaw.fs and pivot by workspace_id, file_id,
content_hash, fs.operation, fs.path, and blob.operation; compare
cache-hit logs with temper_blob_transport_wait_duration_ms before blaming
the model or sandbox.observability_event=temperpaw.sandbox and
pivot by sandbox_provider, sandbox_id, sandbox.operation,
sandbox.exit_code, sandbox.status_code, sandbox.workdir,
modal_bridge.operation, modal_bridge.endpoint, and
modal_bridge.duration_ms; compare with temper_wasm_host_http_duration_ms /
temper_wasm_host_http_requests_total using call_kind:text, and verify
modal_bridge_url when Modal calls fail before sandbox creation returns an id.observability_event=temperpaw.transport and pivot
by transport.name, transport.operation, transport.outcome,
transport.channel_id, and transport.message_id; when
transport.operation=receive_message fails, debug Slack/Discord ingress and
Channel.ReceiveMessage dispatch before blaming the agent session.observability_event=temperpaw.webhook and pivot by
webhook.route_key, webhook.event_id, webhook.operation,
webhook.outcome, and webhook.status; use the created WebhookEvent
before investigating downstream channel or agent failures.observability_event=temperpaw.approval and
pivot by decision_id, session_id, agent_id, approval.operation,
approval.outcome, approval.delivery, approval.reason, and
approval.http_status; if human notification fails, pivot into channel
transport logs for the same time window.gen_ai.operation.name, provider, model, latency,
token usage, errors, prompts/completions when safe, and agent/tool/workflow
structure. If available, use get_llmobs_agent_loop to reconstruct what the
agent did in order.If Datadog shows live telemetry under a legacy service name, missing
temperpaw.agent.session roots, uncorrelated LLM spans, missing Postgres DBM, or
missing profiling uploads, report that as an observability gap before claiming
the system is healthy.
temper.done(result_summary) # ALWAYS call this when finished
api_key = temper.get_secret("dd_api_key")
result = sandbox.bash(f'curl -s -H "DD-API-KEY: {api_key}" https://api.datadoghq.com/api/v1/monitor')
print(result)
gh_token = temper.get_secret("github_token")
sandbox.bash(f"git clone https://{gh_token}@github.com/org/repo.git /workspace/repo")
sandbox.bash("cd /workspace/repo && git checkout -b fix/my-change")
# ... make changes ...
sandbox.bash("cd /workspace/repo && git add -A && git commit -m 'fix: description'")
sandbox.bash("cd /workspace/repo && git push -u origin fix/my-change")
sandbox.bash("cd /workspace/repo && gh pr create --title 'fix' --body 'description'")
sandbox.bash("cd /workspace/repo && pip install -r requirements.txt")
sandbox.bash("cd /workspace/repo && DD_API_KEY=xxx python3 main.py &")
sandbox.bash("sleep 3 && curl -s http://localhost:8000/health")
# If it works, then commit and PR
# Submit a new entity type
temper.submit_specs({
"Counter.ioa.toml": "[automaton]\nname = \"Counter\"\n...",
"model.csdl.xml": "<?xml ..."
})
# Create Cedar policy for it
temper.submit_policy("counter-access", "permit(principal, action, resource is Counter);")
# Now use it
temper.create("Counters", {"value": "0"})
temper.done(result) when finished. Your session will loop forever if you don't.temper.web_search() for unfamiliar topics. Don't guess.temper.save_memory() to persist important findings. Future sessions can recall them.