diff --git a/evidence/440-hosted-cli/README.md b/evidence/440-hosted-cli/README.md new file mode 100644 index 000000000..d76b21baf --- /dev/null +++ b/evidence/440-hosted-cli/README.md @@ -0,0 +1,28 @@ +# #440 hosted CLI — production evidence (2026-09-17) + +Merged as a339a1e5; released as v2.0.16 (fe8d7606); Cloud production runtime +pin moved to the v2.0.16 artifact. Every proof below ran against +`https://agentrelay.com/cloud` with an `agent-relay cloud login` credential. + +| Proof | Run / id | Result | +| --- | --- | --- | +| `flows run --cloud --sync-code --wait` (branch build) | 8701c899-c9f2-4a82-bba2-b78b3872e5c4 | `success`; gate on a file only present in the uploaded tree | +| executable bit + gitignored `.env` absent on host | 418dab2c-2b12-4b6a-aebe-849264da9683 | `success` | +| `flows deploy` / `deployments` / `undeploy` | listener 8b78c766-9b4e-44c2-b488-5486fbf729e8 | `DEPLOYED … listening` → `UNDEPLOYED` | +| listener launch from a real issue | listener 35147a1d-f576-456a-af8c-64cd7859c8c6, issue #443, run 4d9667d5-7f03-5e18-bac3-2c9275bae5c4 | run created 17 s after the issue; `workflow.completed`, 2/2 steps `success` | +| published CLI (`relayflows@2.0.16`) sync round trip | 83a6a6af-c0d4-4f0b-8da6-1e6f8dfce3a1 | `success`; `flows sync` applied `cloud.txt` — [npm-sync-roundtrip.txt](npm-sync-roundtrip.txt) | +| pinned runtime: `./run.sh` as first command word | 3d82bbd1-e139-49a7-87f9-e40f3d250d61 | `success` on `sourceCommit fe8d7606`; the same shape was refused `command_missing` on the previous runtime (fe1179db) — [pinned-runtime-command-path.txt](pinned-runtime-command-path.txt) | + +Runtime artifact: `relayflow-v2-fe8d7606…-61469ea7a484786a-linux-x64.tar.gz`, +sha256 in [artifact-sha256.txt](artifact-sha256.txt) (computed, filename and +sidecar agree; `manifest.json.sourceCommit` = fe8d7606). Published to the +production S3 stage bucket by cloud run 35269932515; the R2 publication +(35269943738) failed `Missing R2 publication credentials` — the R2 secrets are +not on the production environment yet. Previous pin, for rollback: +[pin-before.txt](pin-before.txt). + +`issue-echo.flow.ts` as recorded here single-quotes the issue text (review fix on #444); the smoke listener ran the pre-fix body, which interpolated the title through `JSON.stringify` — same behaviour for the benign title #443 carried, but an injection surface, hence the correction. + +Cloud-side observations, not fixed here: a deployment-launched run's record +carries top-level `completionReason: null` although every step and the +`workflow.completed` event say `success`; the runs API exposes no step stdout. diff --git a/evidence/440-hosted-cli/artifact-sha256.txt b/evidence/440-hosted-cli/artifact-sha256.txt new file mode 100644 index 000000000..5f4fa9642 --- /dev/null +++ b/evidence/440-hosted-cli/artifact-sha256.txt @@ -0,0 +1 @@ +61469ea7a484786a25097c392b7eade64d97aa430d0e042b765c0aba18924de7 diff --git a/evidence/440-hosted-cli/issue-echo.flow.ts b/evidence/440-hosted-cli/issue-echo.flow.ts new file mode 100644 index 000000000..f8ccec0b2 --- /dev/null +++ b/evidence/440-hosted-cli/issue-echo.flow.ts @@ -0,0 +1,13 @@ +import { flow } from "@relayflows/surface"; + +type Issue = { source: string; title: string; body: string; labels: string[]; url?: string }; +type Input = { issue: Issue; approver: string }; + +// Smoke deployment for `flows deploy`: one deterministic step, no agent. +export default flow("flows-cli-deploy-smoke", { budget: { wallclock: "5m" } }, async (f, input) => { + // Issue text is external input: single-quote it (the SURFACE.md idiom) so + // nothing from the title reaches /bin/sh unquoted. + const shellWord = (value: string): string => `'${value.replaceAll("'", "'\\''")}'`; + await f.run(`printf '%s\n' ${shellWord(`issue: ${input.issue.title} labels=${input.issue.labels.join(",")}`)}`); + f.done("success"); +}); diff --git a/evidence/440-hosted-cli/npm-sync-roundtrip.txt b/evidence/440-hosted-cli/npm-sync-roundtrip.txt new file mode 100644 index 000000000..1bd0f22f4 --- /dev/null +++ b/evidence/440-hosted-cli/npm-sync-roundtrip.txt @@ -0,0 +1,4 @@ +ACCEPTED 83a6a6af-c0d4-4f0b-8da6-1e6f8dfce3a1 (pending) +https://agentrelay.com/cloud/api/v1/workflows/runs/83a6a6af-c0d4-4f0b-8da6-1e6f8dfce3a1 +SYNCED 6 files (71073 bytes); pull changes with: flows sync 83a6a6af-c0d4-4f0b-8da6-1e6f8dfce3a1 +COMPLETED 83a6a6af-c0d4-4f0b-8da6-1e6f8dfce3a1 completionReason: success diff --git a/evidence/440-hosted-cli/pin-before.txt b/evidence/440-hosted-cli/pin-before.txt new file mode 100644 index 000000000..6dc36039a --- /dev/null +++ b/evidence/440-hosted-cli/pin-before.txt @@ -0,0 +1,3 @@ +RELAYFLOW_V2_ARTIFACT_KEY system/relayflow-v2/d28d252420959e2cbb3331ed7ff62134ab70fdacf8d4b7e43e9cec82d8e16cc5.tar.gz 2026-09-17T18:59:51Z +RELAYFLOW_V2_ARTIFACT_SHA256 d28d252420959e2cbb3331ed7ff62134ab70fdacf8d4b7e43e9cec82d8e16cc5 2026-09-17T18:59:52Z +RELAYFLOW_V2_ARTIFACT_SOURCE_COMMIT a293d0d80e5e39339b2d85ce7888c1d81c3dc074 2026-09-17T18:59:53Z diff --git a/evidence/440-hosted-cli/pin-proof.flow.yaml b/evidence/440-hosted-cli/pin-proof.flow.yaml new file mode 100644 index 000000000..ab606cc59 --- /dev/null +++ b/evidence/440-hosted-cli/pin-proof.flow.yaml @@ -0,0 +1,8 @@ +version: "0.1.0" +name: pin-proof +steps: + - id: exec + type: deterministic + command: "./run.sh" + verification: + output_contains: "published-cli-ok" diff --git a/evidence/440-hosted-cli/pinned-runtime-command-path.txt b/evidence/440-hosted-cli/pinned-runtime-command-path.txt new file mode 100644 index 000000000..7cb03a7cb --- /dev/null +++ b/evidence/440-hosted-cli/pinned-runtime-command-path.txt @@ -0,0 +1,4 @@ +ACCEPTED 3d82bbd1-e139-49a7-87f9-e40f3d250d61 (pending) +https://agentrelay.com/cloud/api/v1/workflows/runs/3d82bbd1-e139-49a7-87f9-e40f3d250d61 +SYNCED 9 files (71559 bytes); pull changes with: flows sync 3d82bbd1-e139-49a7-87f9-e40f3d250d61 +COMPLETED 3d82bbd1-e139-49a7-87f9-e40f3d250d61 completionReason: success diff --git a/evidence/440-hosted-cli/proof.flow.yaml b/evidence/440-hosted-cli/proof.flow.yaml new file mode 100644 index 000000000..29f8fcf2f --- /dev/null +++ b/evidence/440-hosted-cli/proof.flow.yaml @@ -0,0 +1,8 @@ +version: "0.1.0" +name: npm-proof +steps: + - id: exec + type: deterministic + command: "test -x run.sh && ./run.sh && test ! -e .env && printf 'from-cloud\n' > cloud.txt" + verification: + output_contains: "published-cli-ok"