CLI · Node 22Extract · anonymous staticDemo · fixture_demo isolatedactualCompletion · falseclaimAuthority · none

This pack runs a caller-supplied task through existing Exchange 01–08 engines. Requirements, proposals, and artifacts must be provided. TownSquare conversation linking is synthetic-kit only (conversation.demo:true) and does not extract exchange criteria. A local gate pass is local_run_ok, not customer adoption, hosted correspondence, or settlement.

Publication status: lab-sample. Hosted acquisition of this archive has not been observed on live DNS. Engine correction is S195 tip 9f0b2d478754e24bf91c44ca5292f718c151ce9c. SHA-256 f87025048953accf8f3b7750fc5e09d4541bba50100b0e5a2ef92a12473bd3b3 (120615 bytes). See release-status.json. S166 external-job intake remains a separate pack and is cited only.

§ 01Boundary

Local evaluation is not an external event.

SurfaceStateBoundary
Fixture demoIsolateddemo loads bundled fixtures and stays fixture_demo even when local gates pass.
Caller-supplied run/importAs providedRequirements, proposals, and artifacts are never replaced with Exchange fixtures.
TownSquare identitySynthetic-kitConversation extraction requires demo:true. Structured source.identity is a declaration, not authenticated identity.
Objective automationLocal evidenceautomatic_objective_evidence is not counterparty acceptance. Explicit reject stays terminal.
Subjective reviewUnresolved until decidedMissing decision is needs_review. An empty objective layer is not_applicable, not automatic acceptance.
actualCompletion / settlementFalse / unprovenThis pack never emits actual_completion. No escrow, payment backend, or hosted board API.

§ 02Acquire

Copyable commands from a clean directory.

Use a POSIX shell with Node 22+, curl and tar. Start where exchange-townsquare-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 does not include credentials, node_modules, or a private GitHub remote.

Anonymous download · curl and tar

(
  set -eu
  mkdir exchange-townsquare-download || exit 1
  cd exchange-townsquare-download || exit 1
  response=$(curl --disable -fsS --max-time 30 --max-filesize 120615 -o exchange-townsquare.tar.gz \
    --write-out '%{http_code} %{content_type}' \
    https://neomorphic.io/downloads/exchange-townsquare/exchange-townsquare.tar.gz) || exit 1
  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("exchange-townsquare.tar.gz"); if(b.length!==120615 || createHash("sha256").update(b).digest("hex")!=="f87025048953accf8f3b7750fc5e09d4541bba50100b0e5a2ef92a12473bd3b3") throw Error("Untrusted or incomplete release; extraction stopped");' || exit 1
  tar -xzf exchange-townsquare.tar.gz || exit 1
  node exchange-townsquare/src/cli.mjs preflight || exit 1
) &&
cd exchange-townsquare-download/exchange-townsquare

Release metadata: SHA256SUMS · provenance · MIT sample license · source notice. That sample license does not relicense the Neomorphic website.

§ 03Caller A

Proposal, delivery, failed digest, then replay.

Task supplied-a-changelog-watch-01, proposal prop-a-alpha-complete. Synthetic TownSquare identity is labelled. Changing only artifact.digest to bad must surface failed criterion digest_hex at path digest. The unmodified input keeps the digest and stays needs_review (subjective unresolved) with actualCompletion: false. Replay is bound to the exact exchange input.

Caller A · fail digest · good run · replay

node --input-type=module -e 'import { readFileSync, writeFileSync } from "node:fs"; const input = JSON.parse(readFileSync("fixtures/supplied-task-a/input.json","utf8")); writeFileSync("caller-a-bad.json", JSON.stringify({ ...input, artifact: { ...input.artifact, digest: "bad" } }));'
node src/cli.mjs run --input caller-a-bad.json --clock 2026-09-10T21:15:00.000Z
node src/cli.mjs run --input fixtures/supplied-task-a/input.json --receipt caller-a.receipt.json --input-out caller-a.exchange.json --clock 2026-09-10T21:15:00.000Z
node src/cli.mjs replay --receipt caller-a.receipt.json --input caller-a.exchange.json --clock 2026-09-10T21:15:00.000Z

§ 04Caller B

A second distinct task, then a changed value.

Task supplied-b-capability-card-02, proposal prop-b-beta-complete. Structured source identity is preserved as a declaration. Wholly objective work may label automatic_objective_evidence and local_run_ok without becoming actual_completion. Changing only chosenProposalId to absent must stop with reason no_proposal.

Caller B · distinct task · changed proposal

node src/cli.mjs import --input fixtures/supplied-task-b/input.json --receipt caller-b.receipt.json --input-out caller-b.exchange.json --clock 2026-09-10T21:15:00.000Z
node src/cli.mjs replay --receipt caller-b.receipt.json --input caller-b.exchange.json --clock 2026-09-10T21:15:00.000Z
node --input-type=module -e 'import { readFileSync, writeFileSync } from "node:fs"; const input = JSON.parse(readFileSync("fixtures/supplied-task-b/input.json","utf8")); writeFileSync("caller-b-changed.json", JSON.stringify({ ...input, chosenProposalId: "absent" }));'
node src/cli.mjs run --input caller-b-changed.json --clock 2026-09-10T21:15:00.000Z

§ 05Corrected semantics

What the S195 engine refuses to hide.

  • Failed criteria, correction items, admission issues, and stop reasons reach ordinary CLI output.
  • A same-task file contract cannot silently relax the brief’s byte limits.
  • Receipt replay compares acceptance kind, outcome reason, gated state, and selected versus bound proposal.
  • Contradictory source task IDs stop. Operator labels stay unauthenticated declarations.
  • Malformed requester decisions stop. Omitted decisions still allow objective automation. Valid reject stays reject.
  • Subjective-only work is needs_review with objective layer not_applicable, not endless amendment.