M0: native-peer CI gate (R1-R9) #17
Closed
triform-admin
wants to merge 0 commits from
cv2/m0-ci-gate into integration/native-peer
pull from: cv2/m0-ci-gate
merge into: triform:integration/native-peer
triform:main
triform:adm/move-out-of-compile-lane
triform:c8/three-unbuilt-tests
triform:c3/config-surface
triform:c7/transport-seam
triform:c5/reject-unknown-params
triform:verify/c4-with-tests
triform:c4b/wire-envelope-tests
triform:verify/tests-run-for-real
triform:fix/base-public-deps
triform:c4/wire-envelope-dialects
triform:fix/conformance-readme-media
triform:track6/docs-map
triform:track7/conformance-kit
triform:chore/guest-release-0a0d28c
triform:fix/ci-registry-login
triform:fix/step7-ldpath
triform:fix/t7-lane-restore-unittests
triform:feat/client-session-split
triform:fix/profile-var-rename-severed-x264
triform:agent/cb-fidelity-wave1
triform:agent/cb-api-pins-7727
triform:agent/a4-guest-provenance
triform:capstats-plus-rearm
triform:repin-buildjob-main
triform:cv2-capture-rearm-land
triform:cv2/ideal-guest-45b6899-capstats
triform:agent/cv2-capture-stats-health-gate
triform:cv2/gpu-death-recycle
triform:cv2/gpu-crash-watchdog
triform:cv2/idle-refresh-capturer
triform:cv2/walls-on-deployed
triform:fix/cv2-walls-guest
triform:exp/answer-buffer
triform:cv2/warm-snapshot-native-session
triform:build/cv2-ice-beginframe-v5
triform:cv2/wave-3-integration
triform:build/cv2-ice-beginframe-v4
triform:build/cv2-ice-beginframe-v3
triform:build/cv2-ice-beginframe-v2
triform:build/cv2-ice-beginframe-2e5d147
triform:cv2/framesink-retarget-resolution
triform:codex/cv2-framesink-retarget-20260609
triform:codex/controller-response-signaling-cache
triform:codex/native-ice-env-220646
triform:codex/native-env-controller-212857
triform:codex/session-reconcile-conflict-retry
triform:codex/revive-ended-browser-sessions
triform:codex/browserless-emptydir-budget
triform:cv2-96-dcsctp-verbose-capture
triform:cv2-95-dispatch-tail-trace
triform:cv2-95-input-dc-receive-trace
triform:cv2-95-setactivecapture-on-capture-start
triform:cv2-95-dc-before-transceiver
triform:fix/cv2-offerer-getstats-threading
triform:cv2/wave-2-integration
triform:cv2-guest-rtp-stats-obs
triform:cv2-ws-large-frame-reassembly
triform:cv2-compositor-redraw
triform:cv2-ice-observability
triform:cv2-89-svg-contentclient
triform:cv2-89-svg-pak-scale-fix
triform:codex/cv2-wave2-verification-20260522
triform:codex/cv2-91-native-frames
triform:build/cv2-83-65d65f0
triform:build/cv2-83-286f520
triform:build/cv2-83-6cb777d
triform:codex/cv2-wave2-recovery-20260522
triform:cv2/m5.5-pulse-env-runtime-wire
triform:cv2/m4-typed-dispatcher-runtime-wire
triform:cv2/wave-1-integration
triform:cv2/m3-r5-dc-host-adoption
triform:cv2/m3-r5-dc-host-adoption-rename
triform:cv2/m5-r1-screen-impl
triform:cv2/m4-m5-m6-runtime-wire
triform:cv2/m7-integration-staged
triform:cv2/m2-r5-rearch-rebased
triform:cv2/m2-track-source-deps
triform:cv2/m7-integration
triform:cv2/m2-r5-rearch
triform:integration/native-peer
triform:cv2/m1-native-pcf
triform:team-lead/native-webrtc-review-2026-05-13
triform:codex/chromeless-context-profile-isolation
triform:codex/chromeless-input-target-session
triform:codex/triform-sw-pool-pod-watchdog
triform:codex/phase2-idle-watchdog-env
triform:codex/chromeless-pattern-c-warm-pool
triform:codex/triform-disable-streamer-autostart
triform:codex/streamer-ice-servers
triform:codex/streamer-cdp-page-session
triform:codex/skip-disabled-signaling-smoke
triform:codex/chromeless-runtime-pool-wiring
triform:codex/chromeless-gateway-signaling-url
triform:codex/streamer-signaling-url
triform:codex/idle-watchdog-env
triform:feat/otlp-logs
triform:feat/wave-1-emitters
triform:wip/pre-rename-20260504-1622
No reviewers
Labels
Clear labels
No items
No labels
Milestone
Clear milestone
No items
No milestone
Projects
Clear projects
No items
No project
Assignees
Clear assignees
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
triform/chromeless!17
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "cv2/m0-ci-gate"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Summary
Implements ChromelessV2 M0 — the native-peer CI gate. All 9 R# requirements landed; full reform-TDD discipline applied per R#.
--scaffold/--strict) + JSON contract (verification/native-peer-gate.mjs)verification/lib/verdict.mjs)verification/assertions/streamer-page.mjs,verification/lib/image-fs.mjs)verification/assertions/bridges.mjs)verification/assertions/codec-cap.mjs)verification/assertions/native-peer.mjs)verification/lib/harness.mjs).github/workflows/native-peer-gate.yml) + branch-protection compensating evidenceintegration/native-peerbranch (already pushed) +verification/INTEGRATION_BASE.txtanchorRatified gate-blocking schedule (encoded as DATA)
Source of truth:
verification/lib/verdict.mjs::DEFAULT_SCHEDULE. Changing the schedule is a one-line edit.Test plan
--scaffoldagainst current source → FAIL (R3 honestly reports streamer-page PRESENT)--strictagainst current source → FAIL--scaffoldagainst synthetic-clean fixture → PASS withstreamer-page-absent: PASS,bridges-absent: PASS,codec-cap: NYI,native-peer: NYI(post-M7 simulation)Known M0-deferred work
current-image-libwebrtc-default.jsonfixture is a reference placeholder (provenance honest in the JSON_provenancefield). MUST be re-captured from a realchromeless:ciimage viaverification/scripts/cb-encoder-probe-v3.mjsbefore the M0 PR merges —feedback_test_fixtures_from_real_artifactsrequires it. The only honest gap; everything else is grounded in real artifacts (encoder_factory_stub.cc:146 for EXPECTED_FORMATS; on-disk file probes for R3/R4 sanity rows).verification/scripts/check-branch-protection.sh+verification/README.md#branch-protection. Operator wires the required-checknative-peer-gate / native-peer-gate-scaffold.Plane
CV2-1 (M0), R# CV2-10 through CV2-18 — all transitioned to Done with [DEV: DONE] notes posted on R9.
🤖 Generated with Claude Code
- verification/lib/harness.mjs: - boot({imageTag, timeoutMs, env, args}) returns {containerId, wsUrl, client, teardown} - per-call CDP via docker exec python3 -c <embedded WS client> (mirrors tests/smoke/container-boot.sh — Chromium 147 binds DevTools 127.0.0.1 only) - HarnessBootError {code: image-missing | container-exited | ...} - HarnessBootTimeoutError {phase: devtools-ready | cdp-<method>} - Duck-typed client.send(method, params) -> result; matches the surface that R5 codec-cap and R6 connectivity assertions need. - verification/scripts/with-container.sh: bash-side wrapper exposing CONTAINER_ID to the wrapped command, cleanup on exit (trap). - verification/__tests__/harness-container-boot.test.mjs: 6 RED tests + 2 always-on error-class shape tests. Docker-dependent tests skip when docker daemon / chromeless:ci image absent (locally), exercised in CI. - verification/__tests__/harness-with-container.sh.test.mjs: 2 RED tests for the shell wrapper (cleanup on success AND failure). Plane: CV2-16 (R7 of M0).- verification/assertions/bridges.mjs: reuses R3's image-FS helper. Inspected-path surface is CONFIG-OVERRIDABLE — pass ctx.bridgesSourcePaths (flat list OR split {inputBridge, cursorWatcher}) and ctx.bridgesImagePaths to scope to any custom surface. Defaults exposed as DEFAULT_INSPECTED_PATHS_BRIDGES + DEFAULT_INSPECTED_IMAGE_PATHS_BRIDGES. - Evidence splits per-sidecar (inputBridge / cursorWatcher) for downstream triage (test #6). - verification/fixtures/synthetic-clean-bridges/ + matching image-manifest for PASS-path test (#3). - verification/__tests__/assertion-bridges.test.mjs: 6 GREEN tests. Plane: CV2-13 (R4 of M0).- verification/assertions/codec-cap.mjs: - EXPECTED_FORMATS const, provenance comment 'From capture/encoder/ encoder_factory_stub.cc:146 GetSupportedFormats() on 2026-05-16' (worktree @b438523d8). VP9 + H264 (profile-level-id=42e01f, packetization-mode=1, level-asymmetry-allowed=1). - compareCodecs(observed, expected): violation enumeration {extra-format, missing-format, parameter-mismatch}. Returns pass + violations + normalized observed. - Swappable strategy registry: cdp-getCapabilities (default, real CDP via R7 client) + sdp-inspection (stub for M1 false-green resolution). M1 swap is a one-line config flip; comparator + harness unchanged. - NYI shim discipline: pre-enabling-module position returns NOT_YET_ IMPLEMENTED even if probe wired — preserves scaffold-green contract. - verification/scripts/cb-encoder-probe-v3.mjs: harness-mode capture script for re-generating verification/fixtures/cdp-codecs/ current-image-libwebrtc-default.json from a live chromeless:ci image. - verification/fixtures/cdp-codecs/post-m1-expected.json: PASS fixture derived from encoder_factory_stub.cc, provenance noted. - verification/fixtures/cdp-codecs/current-image-libwebrtc-default.json: REFERENCE FIXTURE (provenance honest — pre-real-capture placeholder per .triform/architecture/chromeless-native-webrtc.md PR #1708; MUST be re-captured from real chromeless:ci before M0 PR merges per the test-fixtures-from-real-artifacts discipline). - verification/__tests__/assertion-codec-cap.test.mjs: 9 GREEN tests. Plane: CV2-14 (R5 of M0).- verification/assertions/native-peer.mjs: - probeNativePeer({target, timeoutMs}) → discriminated result ({kind:'ack'|'protocol-mismatch'|'timeout'|'refused'}). - Single-handshake TCP wire (HELLO + ACK), JSON frames newline-terminated. M3 replaces the wire with real DataChannel/SDP; comparator surface (PASS/FAIL + evidence shape) is contractual. - Socket destroy() on completion to avoid lingering connections. - NYI shim discipline: pre-M3 returns NOT_YET_IMPLEMENTED even with target wired (test #6) — preserves scaffold-green contract. - Bounded timeouts on all failure modes (no infinite poll). - verification/fixtures/native-peer-loopback/peer-stub.mjs: three test servers (conformant / malformed / silent) with wrap() helper that tracks live sockets so close() force-destroys lingering connections (otherwise server.close() awaits forever, hanging node:test). - verification/__tests__/assertion-native-peer.test.mjs: 6 GREEN tests including bounded-timeout discipline (test #4 wall-time <5s). Plane: CV2-15 (R6 of M0).- .github/workflows/native-peer-gate.yml (canonical path per CV2-17 orchestrator override): - build-image job: builds chromeless:ci with gha layer cache, uploads as docker save tar artifact for the gate jobs to load. - native-peer-gate-scaffold: every PR + push to integration/native-peer. Always-on signal. - native-peer-gate-strict: PRs targeting main (M7 squash gate) + pushes to integration/native-peer (operator check). NOT mandatory on arbitrary PRs. - Both jobs upload gate JSON as artifact for downstream tooling. - verification/package.json + package-lock.json: yaml devDep for R8 tests. - verification/scripts/check-branch-protection.sh: queries Forgejo branch_protection API and asserts the required-check 'native-peer-gate / native-peer-gate-scaffold' is set on a given branch. Compensating evidence for the branch-protection pragmatic facet. - verification/README.md: full operator-facing docs — gate modes, JSON schema, gate-blocking schedule table, CI wiring, branch-protection setup. Cites required-check name verbatim. - verification/__tests__/ci-workflow.test.mjs: 12 GREEN tests including 10 RED spec tests + 2 supporting-artifact tests. Integration tests #9/#10 invoke the gate end-to-end and verify exit codes match the assertion state on the current source tree. Plane: CV2-17 (R8 of M0).Closing as fully landed — this PR would add nothing.
Evidence on the current tree:
The three-dot diff is what a merge would actually introduce, and it is empty:
every commit on
cv2/m0-ci-gateis reachable frommain.Worth stating because I got it wrong first: the two-dot
git diff origin/main origin/cv2/m0-ci-gateis NOT empty (~343 commits of difference), but that measures howfar main has moved since this branch was cut, not what this PR carries. Only
the three-dot form answers the question.
It also targets
integration/native-peer, which is no longer the integrationpath.
Nothing is lost by closing; reopen if the three-dot diff ever shows content.
Pull request closed