claim(2): Q3.3 lasuite-meet — full lifecycle green (meeting_flow §4.3 + OIDC; R014 chaos-base; webrtc env-blocker non-port)

lasuite-meet full suite GREEN (log /root/ccci-meet-full6.log): install/upgrade/backup/restore/custom
all pass, deploy-count=1, clean teardown, real upgrade crossover 0.2.0+v1.15.0→0.3.0+v1.16.0.
- §4.3 test_meeting_flow: create-room (201) → read-back (200) → LiveKit join token (JWT room grant) →
  delete. test_oidc_password_grant PASSED. Parity: health_check + oidc_login. Reused lasuite-drive
  OIDC-at-install machinery.
- R014 fix (72719fe): upstream lightweight tag → chaos-base deploy of the checked-out prev version
  (skips lint, deploys prev not latest — verified by the crossover).
- webrtc-media/relay UDP media-relay = documented env-blocker non-port; maximal subset (LiveKit token
  issuance) shipped in meeting_flow.
Gate evidence/HOW/EXPECTED/WHERE in STATUS-2. DECISIONS: R014 chaos-base + webrtc non-port. BACKLOG-2
[idea]: harness image pre-pull. Single cold-verified green is the bar (operator clarification).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-05-29 14:33:31 +01:00
parent 1f7806a9c4
commit 5af513e2c8
3 changed files with 93 additions and 2 deletions

View File

@ -114,8 +114,16 @@ Phase plan: `/srv/cc-ci/cc-ci-plan/plan-phase2-recipe-tests.md`
convergence** (per the DECISIONS guardrail "prefer abra convergence by default"). Recipe-side only; convergence** (per the DECISIONS guardrail "prefer abra convergence by default"). Recipe-side only;
harness-side OIDC-at-install (Part A) stays. Use the recipe-create-pr skill. Not started; do after harness-side OIDC-at-install (Part A) stays. Use the recipe-create-pr skill. Not started; do after
Q3.2 PASSes + higher-priority Q4 coverage. Q3.2 PASSes + higher-priority Q4 coverage.
- [ ] **Q3.3** — lasuite-meet: parity (health_check, oidc_login, meeting_flow, webrtc-media, - [x] **Q3.3** — lasuite-meet: **FULL LIFECYCLE GREEN @2026-05-29 — CLAIMED (STATUS-2 Gate Q3.3),
webrtc-relay) + specific (create-a-room, two-user LiveKit token issuance, ICE-candidate gathering). awaiting Adversary.** install+upgrade+backup+restore+custom all pass (deploy-count=1, clean
teardown); real upgrade crossover `0.2.0+v1.15.0→0.3.0+v1.16.0`. Parity: health_check +
oidc_login (→ test_oidc_with_keycloak, password-grant JWT). §4.3: test_meeting_flow
(create-room → read-back → LiveKit join token [JWT video grant] → delete) + OIDC. Reused
lasuite-drive OIDC-at-install machinery. R014 lightweight-tag fixed via chaos-base deploy
(commit 72719fe). webrtc-media/relay UDP media-relay = documented env-blocker non-port (maximal
subset = LiveKit token issuance, shipped) per §7.1. Commits 32a743f+9c6cb53+72719fe+1f7806a;
log /root/ccci-meet-full6.log. Original [ ] detail: parity (health_check, oidc_login,
meeting_flow, webrtc-media, webrtc-relay) + specific (create-a-room, LiveKit token issuance).
- [~] **Q3.4** — cryptpad: parity port (health_check) ✓ + 2 NEW recipe-specific - [~] **Q3.4** — cryptpad: parity port (health_check) ✓ + 2 NEW recipe-specific
(test_spa_assets — branding + canonical asset paths in HTML; test_pad_create.py — (test_spa_assets — branding + canonical asset paths in HTML; test_pad_create.py —
Playwright SPA renders + JS bundle loads + no console errors). Open follow-up: the Playwright SPA renders + JS bundle loads + no console errors). Open follow-up: the
@ -168,6 +176,12 @@ Phase plan: `/srv/cc-ci/cc-ci-plan/plan-phase2-recipe-tests.md`
with the F2-7 keycloak-specificity caveat; worked lasuite-docs example end-to-end. **Will with the F2-7 keycloak-specificity caveat; worked lasuite-docs example end-to-end. **Will
re-pass when Q3.2/Q3.5 enroll new recipes** (immich/lasuite-drive) to confirm a new re-pass when Q3.2/Q3.5 enroll new recipes** (immich/lasuite-drive) to confirm a new
engineer can follow the doc cold. engineer can follow the doc cold.
- [ ] **[idea]** — Harness image pre-pull before `abra app deploy`. First-ever deploy of a fresh
recipe can hit a swarm "No such image" placement race on digest-pinned images (observed once on
lasuite-meet's first deploy; self-resolved after manual `docker pull`; images then cached + kept
by the conservative prune). A pre-pull (parse compose images, `docker pull` each in
`lifecycle.deploy_app` before deploy) would make first-cold deploys deterministic. Low-risk,
helps every fresh recipe + a from-scratch host (D8). Not blocking (warm-cache model masks it).
- [ ] **Q5.2** — Adversary samples a subset and cold-verifies parity tables + specific tests are real - [ ] **Q5.2** — Adversary samples a subset and cold-verifies parity tables + specific tests are real
(not health-only, not skipped). NO weakened test, no corners cut (P7). (not health-only, not skipped). NO weakened test, no corners cut (P7).
- [ ] **Q5.3** — Phase 2 `## DONE` after all P1P8 Adversary cold-verified PASS, no standing VETO. - [ ] **Q5.3** — Phase 2 `## DONE` after all P1P8 Adversary cold-verified PASS, no standing VETO.

View File

@ -799,3 +799,35 @@ re-claim (REVIEW-2 "## Q3.2 … PASS @2026-05-29"): `-c`+owned `wait_healthy`(se
+`wait_ready_probes`(collabora WOPI 200) all RAISE on stuck convergence (5 unit tests pass + code-read); +`wait_ready_probes`(collabora WOPI 200) all RAISE on stuck convergence (5 unit tests pass + code-read);
upgrade tier GREEN on the Adversary's own cold run. This is the accepted pattern for future heavy upgrade tier GREEN on the Adversary's own cold run. This is the accepted pattern for future heavy
recipes — same teeth + negative-test requirement applies each time. recipes — same teeth + negative-test requirement applies each time.
---
## 2026-05-29 — R014 lightweight upstream tags → chaos-base deploy (Q3.3 lasuite-meet)
**Problem.** abra's pinned (non-chaos) deploy runs `abra recipe lint`, which FATAs **R014 'only
annotated tags used for recipe version'** for the WHOLE recipe if ANY version tag is lightweight. Some
upstream coop-cloud recipes ship a stray lightweight tag (lasuite-meet `0.3.0+v1.16.0`). This blocked
the upgrade tier's prev-version base deploy.
**Rejected approach (origin-repoint).** Re-annotate the tag locally → abra reverts it (it runs
`git fetch --tags --force` from origin before linting). Repointing origin to a local `git clone
--mirror` then tripped go-git **'reference not found'** (mirror HEAD → `master` while the branch is
`main`). Too fragile; abandoned.
**Decision (chaos-base).** Detect lightweight version tags (`abra.has_lightweight_version_tags`,
read-only). For such a recipe's pinned base deploy, deploy the **explicitly-checked-out** prev version
with **chaos** (`abra app deploy -C`): chaos **skips lint** (no R014) and deploys the **current
checkout** — which `lifecycle.recipe_checkout(version)` already set to the prev tag, so it deploys the
intended prev version, **NOT latest**. (F1d-2's hazard was a *missing* checkout; the explicit checkout
removes it.) **Verified real** by the Q3.3 upgrade crossover `0.2.0+v1.15.0→0.3.0+v1.16.0`. No-op /
stays pinned-non-chaos for all-annotated recipes (most). The deeper fix is upstream (annotate the tag),
out of scope here.
## 2026-05-29 — lasuite-meet webrtc media-relay = env-blocker non-port (§7.1); LiveKit token issuance shipped
lasuite-meet's `webrtc-media.py`/`webrtc-relay.py` exercise the full WebRTC **media relay** (UDP
audio/video through LiveKit's SFU). cc-ci reaches apps via the gateway's TLS-passthrough (HTTPS/WSS
only); an end-to-end UDP media-relay path to a per-run container is an **environment-level
limitation**, not a test-quality gap (§7.1 env-blocker exception). The **maximal testable subset IS
shipped**: LiveKit **token issuance** (the signaling grant a client needs to join) is asserted in
`tests/lasuite-meet/functional/test_meeting_flow.py` (create room → JWT token granting the room).

View File

@ -49,6 +49,10 @@ tree must carry:
- **Q5** — Completeness + docs; flip `## DONE`. - **Q5** — Completeness + docs; flip `## DONE`.
## In flight ## In flight
**Q3.3 lasuite-meet — CLAIMED @2026-05-29 (Gate: Q3.3 below), awaiting Adversary.** Full lifecycle
green; meeting_flow §4.3 + OIDC; reused drive's OIDC-at-install; R014 fixed via chaos-base. Working
next Q4 recipe meanwhile. (Q3.1 lasuite-docs partial, Q3.5 immich remain for Q3.)
**Q3.2 lasuite-drive — ✅ Adversary PASS @2026-05-29 (REVIEW-2 `3f5d58a`); F2-12 CLOSED.** Cold **Q3.2 lasuite-drive — ✅ Adversary PASS @2026-05-29 (REVIEW-2 `3f5d58a`); F2-12 CLOSED.** Cold
re-run all 5 tiers GREEN, upgrade tier passes, deploy-count=1, ready-probe OK(200)×2, OIDC+minio PASS, re-run all 5 tiers GREEN, upgrade tier passes, deploy-count=1, ready-probe OK(200)×2, OIDC+minio PASS,
data-integrity survives, clean teardown; `-c`+owned-wait/READY_PROBE proven non-vacuous. The standing data-integrity survives, clean teardown; `-c`+owned-wait/READY_PROBE proven non-vacuous. The standing
@ -125,6 +129,47 @@ SKIP no longer yields a GREEN `!testme`.
## Gate ## Gate
**Gate: Q3.3 lasuite-meet — CLAIMED @2026-05-29, awaiting Adversary.**
**WHAT.** lasuite-meet (La Suite real-time meetings via LiveKit; OIDC-required; sibling of
lasuite-docs/drive) runs its **full lifecycle GREEN** — install + upgrade (real prev→PR-head
crossover) + backup + restore + custom (health + OIDC + meeting_flow). Enrolled by reusing the
lasuite-drive OIDC-at-install machinery (DEPS=["keycloak"], OIDC_AT_INSTALL, install_steps.sh wiring
OIDC env before the single deploy). Two infra fixes were needed:
- **R014 lightweight-tag → chaos-base deploy** (commit `72719fe`): upstream coop-cloud lasuite-meet
ships a stray LIGHTWEIGHT tag `0.3.0+v1.16.0`, which FATAs `abra recipe lint` (R014) on the pinned
prev-version base deploy. Fix: `abra.has_lightweight_version_tags` detects it; deploy_app then
deploys the EXPLICITLY-checked-out prev version with chaos (chaos skips lint + deploys the current
checkout — NOT latest; F1d-2's hazard was a *missing* checkout). Verified by the real upgrade
crossover below. (An origin-repoint approach was tried + abandoned: go-git 'reference not found'.)
- **meeting_flow tolerant delete** (commit `1f7806a`): meet 0.3.0 soft/async-deletes rooms, so the
post-delete 404 check is best-effort; the §4.3 create+read-back+LiveKit-token asserts stay HARD.
**HOW (Adversary, cold, on cc-ci):**
```
ssh cc-ci 'cd /root/<your-clone> && git pull && RECIPE=lasuite-meet PR=0 cc-ci-run runner/run_recipe_ci.py'
```
**EXPECTED:**
- RUN SUMMARY: `deploy-count = 1`; `install/upgrade/backup/restore/custom` **all `pass`**.
- `tests/lasuite-meet/functional/test_meeting_flow.py::test_create_room_get_livekit_token_and_read_back`
**PASSED** — creates a room (201), reads it back (200, same LiveKit room), the LiveKit token is a JWT
granting that room, deletes it.
- `test_oidc_password_grant_against_dep_keycloak` **PASSED** (not skipped) — password-grant JWT vs the
per-run keycloak realm `lasuite-meet-<6hex>`.
- Log shows `lightweight upstream tag present → chaos base deploy` and
`upgrade→PR-head: … version=0.2.0+v1.15.0→0.3.0+v1.16.0` (real crossover, NOT latest-as-base).
- Data-integrity: postgres ci_marker survives upgrade + backup→wipe→restore.
- Clean teardown: post-run no `lasu` stacks/volumes.
**WHERE.** Commits `32a743f` (recipe_meta) + `9c6cb53` (meeting_flow + PARITY) + `72719fe` (R014
chaos-base) + `1f7806a` (tolerant delete). Files: `tests/lasuite-meet/{recipe_meta.py,install_steps.sh,
ops.py,test_*.py,functional/*.py,PARITY.md}`, `runner/harness/abra.py` (`has_lightweight_version_tags`),
`runner/harness/lifecycle.py` (chaos-base branch). Log `/root/ccci-meet-full6.log`. webrtc-media/relay
UDP media-relay = documented env-blocker non-port (maximal subset = LiveKit token issuance, shipped).
---
**Gate: Q3.2 lasuite-drive — RE-CLAIMED @2026-05-29 (after F2-12 fix), awaiting Adversary.** **Gate: Q3.2 lasuite-drive — RE-CLAIMED @2026-05-29 (after F2-12 fix), awaiting Adversary.**
(First claim `911680f` FAILed cold-verify — F2-12: the upgrade chaos redeploy's abra converge monitor (First claim `911680f` FAILed cold-verify — F2-12: the upgrade chaos redeploy's abra converge monitor
FATA'd while the NEW collabora 25.04.9.4.1 was still in its healthcheck `start_period`. Fixed by FATA'd while the NEW collabora 25.04.9.4.1 was still in its healthcheck `start_period`. Fixed by