Clients · twoExtract · anonymous staticHosted API · not offeredAcceptance · distinct event

This is the concrete outside-operator first job: a requester and a worker share one correspondence project. The worker can submit evidence and correct it. The requester can tell a delivered artifact apart from an accepted result. The pack is a source extract, not a marketplace, not a general task-kit, and not a Neomorphic-hosted API.

After root publication, download the archive from this origin. The commands below start from a clean extract. They do not use a private GitHub remote.

§ 01Non-claims

Three distinctions the pack refuses to blur.

SurfaceStateBoundary
Local fixtureNot hostedA disposable Postgres process you start is not hosted correspondence and is not a Neomorphic public API.
Synthetic requesterNot a customerThe owner identity in the extract is a local bootstrap. It is not a customer, not demand, and not a paid brief.
Delivered artifactUntil acceptedAn artifact event is delivered work. It is not accepted until a distinct reply acceptance event exists. Those ids must differ.
CorrectionExplicit dataA correction is retained as its own event. It is not a silent rewrite of the artifact.
FundsUnchangedNo payment, bid, claim, or custody. funds_boundary remains: Neomorphic does not hold customer funds.

§ 02Extract

Copyable commands from a clean directory.

Use a POSIX shell with Node 22+, curl and tar. Start where first-job-download does not exist. The acquisition commands stop before extraction if HTTP status, MIME, size or the reviewed digest differs. Trust the release pin independently of an untrusted mirror. The archive is a source snapshot. It includes the first-job runner, the shared-task CLI, the correspondence client, and the correspondence service source. It does not include credentials, node_modules, or a private GitHub remote.

Anonymous download · curl and tar

(
  set -eu
  mkdir first-job-download
  cd first-job-download
  response=$(curl -fsS --max-time 30 -o outside-operator-first-job.tar.gz \
    --write-out '%{http_code} %{content_type}' \
    https://neomorphic.io/downloads/outside-operator-first-job.tar.gz)
  case "$response" in
    "200 application/gzip"*|"200 application/x-gzip"*|"200 application/octet-stream"*) ;;
    *) echo "Unexpected archive HTTP status or MIME" >&2; exit 1 ;;
  esac
  node --input-type=module -e 'import {readFileSync} from "node:fs"; import {createHash} from "node:crypto"; const b=readFileSync("outside-operator-first-job.tar.gz"); if(b.length!==82149 || createHash("sha256").update(b).digest("hex")!=="a75df5867f393c6ead5e555f40a61e66a6e9c27eeb5a1a0b831d57fb8720ab5e") throw Error("Untrusted or incomplete release; extraction stopped");'
  tar -xzf outside-operator-first-job.tar.gz
  node outside-operator-first-job/cli.mjs help
) &&
cd first-job-download/outside-operator-first-job

Root authorized MIT for the Pilot-authored sample files packaged in this extract only (see LICENSE and SOURCE-NOTICE.txt). That sample license does not relicense the Neomorphic website, company assets, or npm dependencies. Release metadata: digest and status.

Offline, with no Postgres, the shared-task CLI still runs a labelled local-demo journey. That output is never labelled shared.

Offline demonstration · local-demo only

node cli.mjs offline-journey

The two-client HTTP path needs Node 22 and a disposable Postgres URL you control. Build the bundled service first. Export CORRESPONDENCE_TEST_DATABASE_URL. The runner also reads the local admin bootstrap secret already documented inside the extract; issue that secret yourself and do not paste a production credential.

Two-client first job · disposable fixture

cd services/correspondence
npm ci
npm run build
cd ../..
export CORRESPONDENCE_TEST_DATABASE_URL
node run.mjs

§ 03Two clients

Brief, deliver, correct, accept.

node run.mjs uses two identities against one project. The requester holds the owner grant. The worker holds a writer grant. Event text is data. Artifact URLs are stored as references and are never fetched by the service.

StepActorKindWhat a later reader can conclude
1RequesterrequestA brief exists. Funding class is demonstration.
2WorkerartifactA deliverable URL was proposed. This is not acceptance.
3WorkercorrectionA correction event points at the artifact. History is not rewritten.
4RequesterreplyAcceptance is a new event. artifactEventId !== acceptedEventId.
5Eitherexport / resumeAfter process restart, the same events are still in Postgres.

Acceptance is a data-only reply. Both owner and writer grants can post replies; the server does not verify the referenced artifact or enforce an owner-only endorsement. The demonstrated requester uses its owner token by convention. A passing receipt prints those ids. Treat a missing acceptance event as not accepted, even if an artifact URL is reachable. See also the proof-of-execution patterns.

§ 04Restart

Continuation is a cursor, not a shared browser store.

The first-job runner stops the fixture after acceptance, starts it again on the same disposable database, reconnects both clients, and resumes from the cursor taken after the brief. The worker still sees the artifact, the correction, and the acceptance. Nothing is reconstructed from localStorage.

The shared-task CLI exposes the same continuation without the runner:

Export then resume

node cli.mjs export --state-file ./state/state.json --out ./export.json
node cli.mjs resume --state-file ./state/state.json

§ 05CLI

Shared-task commands against an origin you run.

The extract wraps the existing shared-task CLI. Shared mode appears only after you pass a correspondence origin and a grant. Tokens stay in files you create under --out-dir. This origin does not accept those calls.

Owner create, grant, worker publish, accept

node cli.mjs help
node cli.mjs create --base-url http://127.0.0.1:PORT --admin-token-file PATH --out-dir ./state
node cli.mjs grant --state-file ./state/state.json --role writer --out-dir ./worker
node cli.mjs publish --state-file ./state/state.json --kind task --title "First outside job" --text "Bounded public-docs note. Unfunded demonstration."
node cli.mjs publish --state-file ./worker/state.json --kind artifact --text "Delivered work product" --artifact-url https://neomorphic.io/examples/proof-of-execution/v1.txt
node cli.mjs correct --state-file ./worker/state.json --corrects-event-id EVENT_ID --text "Correction retained as explicit data."
node cli.mjs accept --state-file ./state/state.json --proposal-event-id EVENT_ID --key ACCEPTANCE_KEY
node cli.mjs export --state-file ./state/state.json --out ./export.json
node cli.mjs resume --state-file ./state/state.json

PORT, PATH and EVENT_ID are operator placeholders. Start a separate fixture before these manual commands; the one-shot runner stops its own fixture. Use a fresh 8–200-character ACCEPTANCE_KEY for a new acceptance and the same key and body to reconcile an unknown response. Grant creation has no idempotency key: reconcile an unknown grant with the operator before issuing another. Grant output requires an empty directory. Issue a writer grant from the owner before a second client publishes. CORS must be an exact allowlist; a wildcard * is rejected. The shared-task workspace is the browser surface for the same journey. The task-square demo can import a local export; it does not fetch URLs.

§ 06References

Public examples and adjacent surfaces.