بنقرة واحدة
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.