Real Bridge verifier and issuer qualification (#853)
Real Bridge verifier and issuer qualification (#853)
AIWG PR #2557, commit `38856dc05`, contains the Bridge integration.
The AIWG Bridge Keycloak verifier and its default HTTPS/mTLS transport now pass against the pinned real Keycloak fixture and browser-binding provider. The result records signed delegation verification, two browser bindings sharing one user/session, foreign browser and workspace denial, and logout preventing renewal. The manifest identifies the exact Bridge/fixture sources and log hashes. The owned issuer container was removed and verified absent.
The fixture now supplies a native user-attribute workspace mapper and a private Bridge client-secret file. Synthetic source credentials remain under the private fixture directory. The Bridge obtains a login-client bearer token, derives its browser digest from backend context, and exchanges it over the same configured workload certificate used by the issuer contract. The returned delegation is verified against realm keys, exact audience/client, subject/session/workspace, certificate, browser binding, signed expiry and not-before.
The opt-in live script is `tools/cockpit/qualify-desktop-issuer.mjs` in `roctinam/aiwg`. Start the sandbox fixture with the provider JAR as described in provider qualification, run that script with the owned fixture directory, and stop the fixture afterward. The fixture's own provider regression also passed with the workspace mapping present.
Focused Bridge tests pass with signed issuer responses and a real local HTTPS server requiring client certificates. An initial transport test correctly rejected OpenSSL fixture certificates created with group-write permission by the host umask; their explicit fixture modes were corrected to 0644. The production credential checks were retained. Typecheck and CLI build also passed.
Focused V8 coverage measures the Bridge verifier at 98.63% lines / 85.44% branches and issuer transport at 97.43% / 94.44%. Both meet the requested changed-module targets. This does not resolve the remaining sandbox coverage gaps or unmeasured Java/Python coverage.
This remains component qualification. Password login is synthetic and action/ instance mapping is controlled. Browser authorization-code/PKCE, local/hosted browser integration, the Rust adapter's fresh membership/session API checks, real multi-user RDP and full Cockpit acceptance are not proved. The remaining #853 APIs, #854 lifecycle, #855 accounts/OpenBao, #856 worker, #842 adapter, #843 surfaces, #841 external isolation and #851 loadout gates remain open.
The full AIWG test run passed 12,620 tests, skipped 46, and failed one existing artifact-index status test. That failure reproduced on unchanged base and reported installation identity drift. All 49 tests in the affected suite passed with the supported temporary `AIWG_CONFIG` override; the user's installation was untouched. The new documentation page passes lint; repository-wide lint reports existing errors and is not counted as clean. The final fresh fixture replay created the secret file automatically and passed, after an initial request correctly failed while the same owned container was still starting. Both issuer containers were removed and verified absent. CI remains a separate delivery gate.