docs: CI green and deployed — record the verified production state
deploy / test (push) Successful in 4m37s
deploy / build (push) Successful in 56s

Run 498 passed and deployed. Confirmed on gw-04: 53 skills, 11 templates,
zero unresolved bindings, self-authoring announced ENABLED, the new
gateway_preflight answering, and migration 0080 applied.

Also records that run 497 was cancelled by the concurrency guard rather
than failing, and that the stream-json runtime image is still NOT shipped by
this pipeline.

Co-Authored-By: Claude Opus 5 <[email protected]>
This commit is contained in:
Omar Sobh
2026-08-20 08:06:24 -07:00
co-authored by Claude Opus 5
parent 689a5e14a3
commit ac4fa0b8f7
+40 -26
View File
@@ -10,44 +10,58 @@ Read `CAPABILITY-REVIEW.md` for the system picture,
`merge/upstream-v0.8.4` is at `db1c50966`. The local suite is green — 106 test `merge/upstream-v0.8.4` is at `db1c50966`. The local suite is green — 106 test
binaries, zero build errors, frontend builds. binaries, zero build errors, frontend builds.
## CI: root cause found — an apostrophe ## CI green, deployed to production 2026-08-20
Runs 490–496 all failed. Two distinct causes, both now fixed: Run **498 passed and deployed**. Verified on gw-04 after the recreate:
```
skill_self_authoring: ENABLED — agents apply their own skill drafts without human approval
skills_loader: loaded 53 builtin skill(s)
team_template_loader: loaded 11 builtin team template(s) # 0 unresolved
gateway_preflight: http://clawmates-runtime:42617 answered
missions.retain_events_until # migration 0080 applied
```
107 test binaries green in CI. So everything in this block is now **live**,
including self-authoring with no human click and the PreToolUse gate installing
into every microVM mission.
### Why runs 490–496 failed (two causes, both fixed)
- **490** — two runs overlapped. Every run began by removing the *shared* - **490** — two runs overlapped. Every run began by removing the *shared*
container `cm-ci-pg`, so run 491 deleted run 490's database mid-suite. Fixed container `cm-ci-pg`, so run 491 deleted run 490's database mid-suite. Fixed
with a `concurrency` group and a run-scoped container name. with a `concurrency` group and a run-scoped name. (497 was later *cancelled*
by that guard, which is correct behaviour, not a failure.)
- **491–496** — a **single apostrophe**. The Rust step is - **491–496** — a **single apostrophe**. The Rust step is
`docker run … sh -c '…'`, and a comment inside that single-quoted block read `docker run … sh -c '…'`, and a comment inside it read `cm-api's
`cm-api's vm_tool_gate`. The quote closed, bash died with *"unexpected EOF vm_tool_gate`. The quote closed; bash died with *"unexpected EOF"* **before
while looking for matching quote"* **before running anything** — hence an running anything** — hence an empty log, a breadcrumb showing the step
empty log, a breadcrumb showing the step entered and produced nothing, and entered and produced nothing, and three wrong theories. I introduced it in
three wrong theories. I introduced it in the commit that fixed 490. the commit that fixed 490.
`tests/workflow_shell_syntax.rs` now `bash -n`s every `run:` block, so this `tests/workflow_shell_syntax.rs` now `bash -n`s every `run:` block, so this
class fails locally instead of six runs later. Negative-controlled. class fails locally rather than six runs later. Negative-controlled.
**Verify the deploy landed.** A run was in flight at session end: ### Still worth having
The Gitea actions-log API returns **403** for the token in
`deploy/compose/.env`, and the server is behind Cloudflare on a host not on the
tailnet. Every step now writes to `/tmp/ci-logs` on the runner host as a
workaround (`ssh gw-04 'cat /tmp/ci-logs/STEP; tail -40 /tmp/ci-logs/rust-step.log'`),
but **a token with the `actions` scope** would have made the whole detour
unnecessary.
### Watch the first real mission
Nothing has yet confirmed end to end that the PreToolUse gate behaves in a real
guest, or that `tool.call` rows appear. The `stream-json` runtime image is
**still not deployed** — it is a separate image (`clawmates-runtime:streamjson`,
built locally) and this pipeline does not ship it.
``` ```
ssh gw-04 'curl -s "https://git.redclaw.dev/api/v1/repos/osobh/clawmates/actions/tasks?limit=4" | python3 -m json.tool | grep -E "run_number|status|name"' ssh gw-04 'cat /root/toolgate/denied.jsonl' # inside a mission VM
ssh gw-04 'cat /tmp/ci-logs/STEP; tail -40 /tmp/ci-logs/rust-step.log'
``` ```
If `build` succeeds, gw-04's 60s timer deploys within a minute — **that is the
first time these 12 commits reach production**, including self-authoring ON by
default and the PreToolUse gate installing into every microVM mission. Watch
the first mission after it.
If `test` fails again, read `/tmp/ci-logs/rust-step.log` — it now captures the
docker command's own stdout and stderr on the host, which is what was missing
the whole time. Do not infer a cause without it.
Note the Gitea actions-log API returns **403** for the token in
`deploy/compose/.env`, and the Gitea server is behind Cloudflare on a host not
on the tailnet. **A token with the `actions` scope would have made this entire
detour unnecessary** — it is the single highest-value thing to obtain.
## Then, in order ## Then, in order
1. **Prove the PreToolUse gate in a real VM.** `vm_tool_gate` is unit-tested and 1. **Prove the PreToolUse gate in a real VM.** `vm_tool_gate` is unit-tested and