Skip to contentWitnora
Menu
Start / Updated 2026-09-06

Two-hour design-partner path

Run one privacy-preserving covered action path in an isolated sandbox.

Run one bounded action through approval, controlled execution, a separate read-only observation, and offline evidence verification. The first run uses a synthetic local GitHub emulator, not GitHub itself. It needs no real GitHub token, performs no production write, and does not connect a Hosted project. Use Get started for the Hosted onboarding path.

1. Check prerequisites and initialize

You need Node.js 20 or newer, npm, Python 3.10 or newer with pip, and Docker with Compose v2 running Linux containers. The host ports 4311 and 4312 must be available. Initialization downloads the published package; a private Witnora source checkout and a global CLI installation are not required.

The commands below use the tested release 0.20.13. Start in a writable customer directory, then enter the generated kit and run all remaining commands there:

npx --yes witnora@0.20.13 design-partner init github-pr-merge --out witnora-design-partner
cd witnora-design-partner

Expected result: QUICKSTART.md, docker/, verifiers/python/, trust/, secrets/, and .env.example are generated. The runtime and verifier are bundled in the kit. Keep secrets/ and .env out of source control. Compare the pinned root fingerprint with the reviewer through a separate channel; accepting a root from the same packet is not independent trust verification.

2. Load the local emulator configuration

The generated .env.example contains dummy local-only credentials. Copy it to .env and load it into the terminal. Do not substitute live provider keys for this first run.

Bash or zsh:

cp .env.example .env
set -a
. ./.env
set +a

PowerShell:

Copy-Item .env.example .env
Get-Content .env | ForEach-Object {
  if ($_ -match '^([A-Z][A-Z0-9_]*)=(.*)$') {
    [Environment]::SetEnvironmentVariable($Matches[1], $Matches[2], 'Process')
  }
}

Create a Python virtual environment:

python -m venv .venv

Activate it with . .venv/bin/activate in Bash or zsh, or .venv\Scripts\Activate.ps1 in PowerShell, then install the bundled verifier:

python -m pip install ./verifiers/python

3. Authorize and inspect before writing

Issue the short-lived approval and single-use execution Grant locally. Signing private keys stay in secrets/; the runtime uses only its assigned keys.

node docker/runtime/dist/cli.js design-partner authorization issue --dir .
docker compose --env-file .env -f docker/compose.yml up -d --build target-sandbox probe
node docker/runtime/dist/cli.js design-partner doctor --dir .
node docker/runtime/dist/cli.js design-partner privacy inspect --dir .
node docker/runtime/dist/cli.js design-partner trust inspect --dir .
node docker/runtime/dist/cli.js design-partner dry-run --dir . --target-url http://127.0.0.1:4311

Expected result: the configuration checks pass and dry-run reports No target write performed. Stop at an incomplete check and use its diagnostic before acceptance. The explicit --env-file supplies Compose; loading .env in the terminal supplies the host CLI commands.

The Probe receives a read credential and its own signing secret. The Gateway receives a separate write credential and its assigned signing secrets. The root private key is not mounted into a runtime container.

4. Execute one sandbox action and verify its packet

docker compose --env-file .env -f docker/compose.yml --profile acceptance run --rm gateway-acceptance
docker compose --env-file .env -f docker/compose.yml --profile acceptance run --rm offline-verifier
node docker/runtime/dist/cli.js design-partner verify-offline --dir . --packet acceptance/witnora-evidence-packet-v0.2.json --root trust/pinned-root.json --revocation-journal trust/revocation-journal.json
python -m witnora_verifier.cli evidence acceptance/witnora-evidence-packet-v0.2.json --root trust/pinned-root.json --revocation-journal trust/revocation-journal.json
node docker/runtime/dist/cli.js design-partner collect-support-bundle --dir .
node docker/runtime/dist/cli.js design-partner pilot-report --dir .

Expected result: one target transition, one separately observed outcome, and TypeScript and Python verifier PASS. The container verifier runs without network access or private signing keys. The packet is already exported under acceptance/; no private source tree or manual volume-copy command is needed.

Read the packet's limitations: recording, controlled execution, observed outcome, and signature integrity are different claims. INTERNAL review is not an external certification. This emulator result does not prove a live GitHub merge, Shopify cancellation, or Stripe refund occurred.

After reviewing the retained evidence, stop this kit's services:

docker compose --env-file .env -f docker/compose.yml down

5. Optional live GitHub read-only preflight

This separate path inspects one dedicated sandbox pull request. It does not merge, mutate, or produce live execution acceptance evidence. GitHub's merge endpoint cannot atomically enforce the signed base SHA, required-check set, and Witnora Grant at the write boundary, so v0.2 exposes no live write command.

Place a real read-only WITNORA_GITHUB_READ_CREDENTIAL in your local secret store. Set WITNORA_LIVE_GITHUB_ALLOWLIST to the exact owner/repository and WITNORA_LIVE_GITHUB_PREFLIGHT to 1 in the invoking process. The pull request's base must be neither main nor master. Never paste credentials into evidence or a support message.

node docker/runtime/dist/cli.js design-partner prepare-live-github --dir . --repository owner/dedicated-sandbox --pull-request 7

This changes the kit's declared target to the inspected live snapshot. Keep that kit separate from the synthetic acceptance kit. The snapshot is for operator review; it is not a Grant or proof that a later merge used that state. Connecting another real provider requires its own controlled write binding and separate read-only verification, reviewed for that exact workflow.