rounds: a fresh Desktop guest every round, re-asks only for a model flake, the release move checked on the forge (round-gate-v5 steps 2, 4, 5) #53

Open
caoer115 wants to merge 0 commits from agent/42a3569a-round-gate-v5b into main
Owner

Card: 13-16-ucc-rearchitecture tasks/round-gate-v5.md § Gate results (delta-review-3 new 16, 19, 20, 30). Head 6a77c38 off main 4660f0d: merges agent/42a3569a-desktop-fresh a46098e, agent/42a3569a-reask 2581a09, agent/42a3569a-release-ci c9c80b1. Steps.d hunks (66, 67, 80, 90) are shared with tasks/stock-seat-text.md. tooling.sh rc 0; bash -n on every changed script. Note: with this merged every Desktop stage blocks on desk-actions until cccd desktop start's send handles a freshly started Desktop (finding on the card).

Card: 13-16-ucc-rearchitecture tasks/round-gate-v5.md § Gate results (delta-review-3 new 16, 19, 20, 30). Head 6a77c38 off main 4660f0d: merges agent/42a3569a-desktop-fresh a46098e, agent/42a3569a-reask 2581a09, agent/42a3569a-release-ci c9c80b1. Steps.d hunks (66, 67, 80, 90) are shared with tasks/stock-seat-text.md. tooling.sh rc 0; bash -n on every changed script. Note: with this merged every Desktop stage blocks on desk-actions until cccd desktop start's send handles a freshly started Desktop (finding on the card).
.woodpecker/release-check.yml: the forge runs release-check.sh on every move of release
Some checks failed
ci/woodpecker/manual/release-check Pipeline failed
302c3024db
A push to release, a pull request into it, and a manual run naming a move
(RELEASE_FROM / RELEASE_TO, the replay door) run rounds/lib/release-check.sh
on a Woodpecker docker agent. rounds/lib/release-check-ci.sh names the move
per event: a push's start is the before the forge's push hook gives
(Woodpecker's compare link, or the repo activity feed's entry for a one-commit
push), not CI_PREV_COMMIT_SHA — that is the last pipeline on the branch, a pull
request's head included, and empty on the first push after activation. The
gate reads with the mrd the start's releases/current.md § pins names, fetched
from the forge package registry and hashed to the pin. Anonymous full clone
(the repo is public): both ends and their merge-base, and a start only another
head carries.

Review finding 30 (update-door review, Q5): release-check ran only on the
releaser's machine.
ZT's rule for test rounds: start a new one each time, install once, test, then delete it.
The Desktop stage ran on one long-lived guest whose ~/.claude, ~/.local/share/ucc, round dirs
and Desktop state carried over between rounds, so a first-install Desktop regression could hide.

- desktop-golden.sh --tag vN --managed-settings <file> --out <dir>: builds
  tank0/vms/claude-desktop-golden@vN on rs-mia from the stock Debian 12 genericcloud image
  (sha512 from cloud.debian.org): XFCE, KasmVNC 1.5.0 desk (pinned, sha256), Claude Desktop
  2.37337.1 held (bundled Claude Code 2.1.295, the stages' Desktop pin), managed gateway
  settings from the given file, the first launch's welcome Continue, the bypass opt-in and the
  auto-mode notice seeded, a reboot proving the desk, then ~/.claude, ~/.claude.json,
  ~/.local/share/ucc, ~/work and sessions removed and the marker /etc/claude-desktop-golden.
  The guest's ssh host keys come from its serial console and ride the snapshot as
  ucc:known_hosts.
- desktop-round.sh: one Desktop stage on a clone of the golden (lock → clone → boot → fresh
  check → push stage, harness, env → desktop.sh detached on the guest → copy back → stop →
  destroy, a trap destroying on every exit unless --keep); writes <out>/guest.env, the guest's
  birth and end.
- lib/desktop-guest.sh: the guest, its lock (flock on rs-mia held by a background ssh), the
  ssh and desk waits.
- score.py: the Desktop fold refuses a folder with no guest.env, or one without a golden
  birth, an end with the clone destroyed, guest_fresh=yes, or the stage's start and end inside
  the guest's life; the record's Desktop line prints the birth and end.
The four one-time re-asks — the P1 window write (80-window-heal.sh wh_write), native-face-daemon (67-native.sh
nfd_native), the stock e2e seat (acts.sh e2e_wait) and U8's read of the seat's `ucc update` (90-u8.sh u8_seat) — each
let a zero-call or failed first attempt pass on a second. Each now reads the first attempt for a product cause first,
and the row's observable or receipt names what it read:

- transcript.py attempt: the ask's turn off what the binary recorded, never the seat's words — the turn not ended, no
  <ccc-identity> line before the answer, a SessionStart or UserPromptSubmit hook error, the ccc server removed at the
  answer or inside the turn, an error answering a ccc call; with need (the P1 write, a ccc call) ccc not yet added at
  the answer. The e2e seat runs it without need: all 43 e2e seats on record send their first request before ccc
  connects, and step 1 is a Bash call. acts.sh acts_attempt waits for the turn to end (120 s) before reading it.
- native.py first-cause: no event (the seat never started), an error naming the face, or the seat saying its ccc server
  or tools are not there — no harness writes its MCP state, so that answer is the only trace of a face that never came
  up; it withholds the re-ask and never passes a row. r283's codex run is scored on its first run.
- acts.sh u8_read: the act is the first `ucc update` ucc accepted (a run refused for its arguments is the seat's slip,
  r283); a later ok after a failed act fails U8-update with the act's answer.
- wh_write reads the row's own put: heal, heal-planted and heal-n1 share one transcript, and the put check and the
  refusal read for heal-planted and heal-n1 matched heal's put.

Replayed offline with the functions themselves (main de90156 against this branch, live helpers stubbed, the re-ask's
answer simulated by a recorded passing run): main passes all four product-flake first attempts (P1 with ccc removed at
the ask, e2e with a failed SessionStart hook, r283 codex, a failed first `ucc update` then an ok retry); this branch
fails each and names the cause, and still re-asks r282's decline, r285's zero-call turn and a plain codex decline, and
reads past r283's `--timeout=900` slip. The attempt read finds no product cause on any of the 230 recorded P1 asks or 43
e2e first turns where it would run.
lib/mia-ticket.sh holds mia_ticket_granted, the check run.sh's mia_granted made:
the ticket named for what it runs (<name>-…) and shown granted by the lock —
read live where the lock lives, else a status captured within 15 minutes — each
read kept beside the record. run.sh calls it before each rs-mia VM create;
desktop-round.sh (--mia-ticket <rNN>-…, kept as <out>/guest/mia-heavy.status,
guest.env guest_mia_ticket=) and desktop-golden.sh (--mia-ticket
golden-<tag>-…) call it before anything reaches rs-mia.

Replay with stubbed ssh/spine and a stub lock status: desktop-round refuses
rc 2 with no rs-mia call for no ticket, a ticket for another round and an
ungranted one, and goes on to the guest lock for an exclusive or shared grant;
desktop-golden likewise; run.sh refuses rc 2 with no vm create, and reaches
spine vm create once granted.
This branch is already included in the target branch. There is nothing to merge.
View command line instructions

Checkout

From your project repository, check out a new branch and test the changes.
git fetch -u origin agent/42a3569a-round-gate-v5b:agent/42a3569a-round-gate-v5b
git switch agent/42a3569a-round-gate-v5b

Merge

Merge the changes and update on Forgejo.

Warning: The "Autodetect manual merge" setting is not enabled for this repository, you will have to mark this pull request as manually merged afterwards.

git switch main
git merge --no-ff agent/42a3569a-round-gate-v5b
git switch agent/42a3569a-round-gate-v5b
git rebase main
git switch main
git merge --ff-only agent/42a3569a-round-gate-v5b
git switch agent/42a3569a-round-gate-v5b
git rebase main
git switch main
git merge --no-ff agent/42a3569a-round-gate-v5b
git switch main
git merge --squash agent/42a3569a-round-gate-v5b
git switch main
git merge --ff-only agent/42a3569a-round-gate-v5b
git switch main
git merge agent/42a3569a-round-gate-v5b
git push origin main
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
caoer115/ucc!53
No description provided.