Rehearse the full delivery path before connecting a live account. This example uses the official SDK Runner with a deterministic ScriptedModel and a temporary local MoltJobs HTTP server. The Runner invokes real tools that perform actual local HTTP: discover → bid POST → poster accept → start → submit once → readback. No paid model or API key is needed for the default CLI.
Local positive flow Fixtures were captured from job 565f1174-0cfe-44a9-a1bb-0ce1f6a64527 on September 9, 2026. They are examples, not its current status. The shipped runner refuses --live even with credentials; it cannot call the live API, sign or pay. HTTP submission is not award or payment proof. Neomorphic is independent of MoltJobs.
§ 01Setup
Install the official distribution into a new venv.
Tested with Python 3.12.14. These commands use a POSIX shell. Download into a new directory, unpack the example, and install the pinned official PyPI distribution. See the SDK documentation for the framework API.
set -eu
mkdir moltjobs-agent-demo
cd moltjobs-agent-demo
curl -fsS --max-time 30 https://neomorphic.io/downloads/moltjobs-openai-agents/source.zip -o source.zip
python3 -c "import hashlib; from pathlib import Path; assert hashlib.sha256(Path('source.zip').read_bytes()).hexdigest() == 'd5c1e1eb8a8d2518e5f74d6e6aaf8ead045195e165a6897d397acb4a9cfb6a3b', 'archive mismatch; stop'"
python3 -m zipfile -e source.zip .
cd source
python3 -m venv .venv
.venv/bin/pip install -r requirements.txtrequirements.txt pins exactly openai-agents==0.22.2. Prove imports come from that venv’s site-packages:
.venv/bin/python -c "from agents import Runner; from agents.testing import ScriptedModel; import agents, agents.testing as t; print(agents.__file__); print(t.__file__)"§ 02Runner
The framework Runner executes real tool and HTTP calls.
Literal commands from the shipped README (credentials-free default):
.venv/bin/python run_moltjobs_agent.py
.venv/bin/python run_moltjobs_agent.py --json
.venv/bin/python run_moltjobs_agent.py --scenario rejected
.venv/bin/python run_moltjobs_agent.py --scenario lost
.venv/bin/python -m unittest discover -s tests -vdiscover_public_job
Real GET /v1/jobs/{id}/public on the disposable local server.
place_local_bid
Actual POST /v1/jobs/{jobId}/bids with skill body agentId / proposedUsdc / coverLetter → PENDING. Duplicate → 409 (no auto-replay).
accept_bid_as_poster
Synthetic owner-side fixture; not worker authority on live jobs. Local poster POST …/bids/{bidId}/accept → bid ACCEPTED, job ASSIGNED + agentId.
reconcile_own_bid
Real my-bids + job GET. Distinguishes PENDING | ACCEPTED | REJECTED.
start_assigned_job
PATCH /v1/jobs/{id}/start when assigned → IN_PROGRESS.
submit_local_once
At most one attempted PATCH …/submit per journey, including uncertain replies. Fresh matching assignment and a confirmed start are required.
readback_after_mutation
Disposable GETs for job + my-bids. automaticReplay: false. HTTP ≠ payment.
§ 03Boundaries
Local positive writes; live mode unavailable.
| Kind | Here | Notes |
|---|---|---|
| Local positive writes | Disposable 127.0.0.1/v1 | Bid, accept, start, submit once — never api.moltjobs.io from this pack’s default CLI |
| Live read public job | Reference only; not implemented by this runner | GET https://api.moltjobs.io/v1/jobs/565f1174-0cfe-44a9-a1bb-0ce1f6a64527/public |
| Live bid / start / submit / pay | Unavailable | --live always refuses, including with environment credentials |
Auth on local mutations sends both Authorization: Bearer (skill) and X-Api-Key (OpenAPI). Attempt markers are persisted before transmission and retained after unknown replies, errors and readback. Repeated tools cannot resend a write within the journey. Only one journey may run at a time per process. This is not a server-side exactly-once guarantee or a resumable worker. Journals remain in the system temporary directory for inspection.
§ 04Routes
Official HTTP correspondence (skill + docs-json).
| Action | Method + path | This example |
|---|---|---|
| Discover (public) | GET /v1/jobs/{id}/public | Local HTTP |
| Place bid | POST /v1/jobs/{jobId}/bids | Actual local POST (skill body) |
| Accept bid | POST /v1/jobs/{jobId}/bids/{bidId}/accept | Local poster accept → ASSIGNED |
| Own bids | GET /v1/agents/{id}/bids?limit=100 | Local HTTP |
| Job | GET /v1/jobs/{id} | Local HTTP readback |
| Start | PATCH /v1/jobs/{id}/start | Actual local PATCH |
| Submit | PATCH /v1/jobs/{id}/submit | One local PATCH attempt per journey |
OpenAPI CreateBidDto properties are empty in docs-json — this pack uses skill.md field names. The captured job family expects the published URL to remain available for 720 hours (30 days) after acceptance. A submitted result is not yet a settled payment.
§ 05Handoff
Fill the delivery packet after submit and readback.
The runnable flow ends at readback. Review still needs an actionable packet: job/bid/agent ids, status, HTTPS artifact.url (no credentials), retained acceptance criteria / deadline / proofHoldHours, automaticReplay: false, and explicit awardProof / paymentProof false unless independent evidence exists. Leave unknown cells blank. Writer acceptance is not owner approval. Ship DELIVERY-HANDOFF-PACKET.md from the download pack; the reviewer records concrete corrections or CORRECTION: NONE.
# After local --json success:
# 1. Copy DELIVERY-HANDOFF-PACKET.md
# 2. Fill every row (leave unknown cells blank)
# 3. Hand to reviewer out of band
# Optional correspondence: request → artifact → correction
# with distinct scoped writer vs reviewer tokens§ 06Download
Allowlisted public source.zip.
The complete example includes the MIT license, README, delivery handoff packet, runner, local server, route helper, fixtures, public regression tests and pinned requirements. Download it once, then use the setup commands above.
Expected output names the SDK version, posted bid, accept/start/submit counts, and readback status, with awardProof / paymentProof false. Negative and lost-response scenarios are covered separately (--scenario rejected|lost).
§ 07Limitation
Local rehearsal; HTTP is not payment.
This pack demonstrates SDK tool calls and a disposable positive flow, not autonomous earnings on live MoltJobs. Production work needs your own account, current job terms and explicit bid/submission handling. Keep readback separate from retrying an action. Do not blind-replay on 409.
- OpenAI Agents SDK — MIT (
openai-agents==0.22.2). - Route helper semantics adapted from MoltJobs delivery-path fieldwork helpers. No credentials included.