docs LEMCSSH.md

LEMCSSH field guide

LEMCSSH exposes the reviewed LEMC command surface through stock OpenSSH. It is a restricted application endpoint, not a shell, bastion, SCP/SFTP service, or host login. Use it to register for the demo, discover authorized actions, run them, and inspect proof.

Register for the demo

No beta request is required. Register for the public demo at demo.letemcook.dev with stock OpenSSH, use LEMCSSH to run one reviewed Tool, and contact us after the demo only if your team wants LEMC installed on its own infrastructure.

Do not guess a host key or accept a changed fingerprint. Verify it out of band before the first connection.

Register for demo.letemcook.dev with SSH

Generate a distinct key, keep the private file local at mode 0600, and register only its public half through the LEMCSSH registration screen.

ssh-keygen -t ed25519 -a 64 -f ~/.ssh/lemc-demo
chmod 600 ~/.ssh/lemc-demo

# Verify the host-key fingerprint out of band.
# Register only ~/.ssh/lemc-demo.pub.

ssh -t -p 22 \
  -i ~/.ssh/lemc-demo \
  -o IdentitiesOnly=yes \
  demo.letemcook.dev

LEMCSSH registration → Create demo account

The registration screen cannot run jobs, read product data, open a shell, or read storage. After the account is created, reconnect with the exact username from the confirmation.

Keep one verified SSH host configuration

Host demo.letemcook.dev
    HostName demo.letemcook.dev
    Port 22
    User YOUR_EXACT_USERNAME
    IdentityFile ~/.ssh/lemc-demo
    IdentitiesOnly yes
    StrictHostKeyChecking yes

Use this host configuration for every later command. A key is bound to one exact user and account; use a separate key and host configuration for another account.

Verify identity and discover actions

ssh demo.letemcook.dev auth whoami --format=json
ssh demo.letemcook.dev apps list --format=json
ssh demo.letemcook.dev jobs surface app \
  --uuid APP_UUID \
  --scope individual \
  --format=json
  • auth whoami confirms the effective username and account.
  • apps list returns only apps authorized for this key.
  • jobs surface returns the page, scope, recipe, stable action ID, and declared inputs.
  • Discovery does not grant permission. The server checks current authority again when the job is admitted.

Run and follow one reviewed action

ssh demo.letemcook.dev jobs run app \
  --uuid APP_UUID \
  --action ACTION_ID \
  --set environment=production \
  --follow \
  --render json

Use only the action ID and declared form values returned by the surface. Do not select a runner, execution mode, host path, or arbitrary command. LEMC owns admission, isolation, scheduling, event persistence, and cleanup.

Inspect durable proof

ssh demo.letemcook.dev jobs status app \
  --uuid APP_UUID \
  --page 1 \
  --scope individual \
  --task-id TASK_ID \
  --format=json

ssh demo.letemcook.dev jobs logs app \
  --uuid APP_UUID \
  --page 1 \
  --scope individual \
  --recipe "check release readiness" \
  --task-id TASK_ID

ssh demo.letemcook.dev jobs artifacts list app \
  --uuid APP_UUID \
  --page 1 \
  --scope individual \
  --task-id TASK_ID

A complete caller checks the task ID, terminal status, terminal reason, system and recipe steps, logs, rendered output, artifacts, and cleanup result.

Build through the governed boundary

Accepted teams use the server-owned Builder through LEMCSSH. The agent never receives a Docker socket, host shell, or general container control plane. The agent sends a Dockerfile or source through bounded stdin. The Runner builds and tests in fresh jailed guests and returns managed image identity—including an immutable digest for cookbook pins.

  1. Discover contracts: ssh HOST help --all --format=json, then ssh HOST builder images --help.
  2. List managed images: ssh HOST builder images list --format=json.
  3. Compile and test with an explicit image and revision identity, for example builder images compile-run IMAGE_UUID --expected-revision REVISION_UUID --idempotency-key REQUEST_UUID --follow, and send Dockerfile or source on bounded stdin.
  4. Record the immutable digest the Builder returns. Cookbook YAML must pin that digest later.
  5. In recipe steps write image: registry/.../name@sha256:<hex> (or the managed-digest form LEMC returns). Do not use :latest, :main, or any other mutable tag for hosted-untrusted runs.
ssh demo.letemcook.dev builder images --help
ssh demo.letemcook.dev builder images list --format=json
ssh demo.letemcook.dev builder images compile-run IMAGE_UUID \
  --expected-revision REVISION_UUID \
  --idempotency-key REQUEST_UUID \
  --follow

Hosted-untrusted jobs require a digest-pinned image (@sha256:…). A local Docker tag or remote :latest is not production-ready. The SSH host is not a bastion, SCP/SFTP endpoint, or administrative login—only the published Builder and job commands apply. Full first-image steps: Create the first Development Image.

Recipe secrets stay write-only and author-owned. The original cookbook author binds each declared name in their User Secrets catalog; values never appear in YAML. At job time LEMC injects each bound value as a process environment variable with that exact name (for example $TEAM1_GCP_SERVICE_ACCOUNT_JSON). Namespace multi-team keys so two credentials never share one generic name. Supply a value only through the write-only secret surface or bounded stdin where the remote contract allows it; never put it in a prompt, URL, argument list, log, or artifact. See Secrets become environment variables and form fields → env.

Minimal agent loop

request beta access
  → register the invited key through LEMCSSH
    → verify the exact account
      → list authorized apps
        → inspect the action surface
          → run the returned action
            → follow events to terminal state
              → report the task ID and evidence

Keep planning and execution separate. The model can explain why it chose an action; LEMC supplies the evidence for what that action did.