# Desktop certificate proof

AI-assisted; verified with the tests and tools listed above.

Real Linux Electron desktop builds, launched under headless-desktop with --no-sandbox --disable-gpu. No certificate-ignore flags, mocks, or test assertions. Each checkout has separate T3 home and XDG config/data, a fresh database, and no imported history. Light theme, 1440x900 window, Browser panel maximized. A synthetic https-demo Git folder was added through Add project > Local folder. No agent turn is needed for this desktop feature.

Build each checkout with `vp i`, `node apps/desktop/node_modules/electron/install.js`, and `vp run build:desktop`. The Linux build needs libsecret-1-dev. Run create-certificate.sh to start the synthetic local endpoint. Launch `EVIDENCE_DIR=<captures-directory> headless-desktop node desktop-driver.mjs <checkout> <before-or-after> <control-port>`. Control ports were 18552 (base) and 18551 (head).

UI setup: Start without importing projects; add https-demo; hide thread details; open right panel > Browser; Maximize panel. Enter https://127.0.0.1:18443 in the URL field. Base displays ERR_CERT_AUTHORITY_INVALID; head shows the native certificate warning. Cancel leaves it blocked; reload and Trust and Remember loads it. The concise-proof recordings repeat the same reload, Cancel, reload, Trust interaction after clearing Default-profile cookies; reproduce.py is the exact driver for these recordings. Native coordinates are the two buttons in the Xvfb dialog. On base those coordinates have no approval control.

Full app quit/reopen was performed with the driver's /restart endpoint (closes Electron completely, launches a new Electron process), then the Browser panel was opened again in Default and the same URL entered. Head loaded without a prompt; base remained blocked. Preview menu > Clear cache, then revisit: approval remained. Preview menu > Clear cookies, then revisit: head prompted again; Cancel blocked, reload and Trust loaded. profile-lifecycle recordings show the clearing flow.

Close Browser; reopen right panel > Open browser in a profile > Incognito; maximize; enter the same endpoint. Head prompted independently of Default, and Trust loaded it. Fully quit/reopen both apps, open Incognito again, revisit: head prompted again. Cancel blocked. Base never offered approval. Incognito recordings show these visits; startup/setup screens are excluded to keep operational metadata private.

Additional scope checks: with Default approved for 18443, start the same service and same certificate at 18444; visit 18444 and Cancel the new warning. Then generate a second self-signed key/certificate with the same subject and SAN, stop the 18443 service, and restart it with SERVICE_CERT=cert2.pem SERVICE_KEY=key2.pem. Revisit 18443: head prompted with the different fingerprint; Cancel blocked. Base remained blocked for both variants. These are endpoint-isolation and fingerprint-isolation recordings.

Static evidence was saved only after two identical screenshots 500 ms apart. Videos capture the native X11 dialog as well as the app. The loading indicator visible behind a pending native warning is the real app waiting for a certificate decision. No acceptance or TLS behavior was patched.

Not verified: other certificate-error categories, changing the error with the exact same endpoint and fingerprint, subresource/WSS cases, concurrent/abandoned prompts, other operating systems, or a real UniFi device. The reachable synthetic self-signed HTTPS service substitutes for hardware.

## Uploaded evidence

![before-proof-result.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/debfc1cc02c131c4/before-proof-result.png)
![after-proof-result.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/5464b11d45cca9d6/after-proof-result.png)
![after-proof-cancel.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/64b54b59b03d6ab9/after-proof-cancel.png)
![after-certificate-warning.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/f3450c858dfbff60/after-certificate-warning.png)
![after-restart-retained.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/7e0be6a08f32bb42/after-restart-retained.png)
![before-cache-blocked.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/7bde2b545ade432c/before-cache-blocked.png)
![after-cache-preserved.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/800ecee2af634b48/after-cache-preserved.png)
![after-cookies-revoked.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/e504fc897e4c49ac/after-cookies-revoked.png)
![after-incognito-trusted.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/01876a475cfbedb6/after-incognito-trusted.png)
![before-incognito-blocked-final.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/ded7f42f4f0b47ff/before-incognito-blocked-final.png)
![after-incognito-restart-warning.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/339892f25ccf8b8f/after-incognito-restart-warning.png)
![after-different-endpoint.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/9a94fb2e9d0efe8b/after-different-endpoint.png)
![after-changed-fingerprint.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/8d00b6a4ce18c6f7/after-changed-fingerprint.png)
[before-concise-proof.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/3e9c9bdd952eb729/before-concise-proof.mp4)
[before-profile-lifecycle.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/dd2ff2dabed465d8/before-profile-lifecycle.mp4)
[before-incognito-approval.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/be9368af48d32a15/before-incognito-approval.mp4)
[before-incognito-restart.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/d7266b5d1ad5fafe/before-incognito-restart.mp4)
[before-endpoint-isolation.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/e56a7ca44e043f5a/before-endpoint-isolation.mp4)
[before-fingerprint-isolation.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/68cd555be160f895/before-fingerprint-isolation.mp4)
[after-concise-proof.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/0d562e333aad46eb/after-concise-proof.mp4)
[after-profile-lifecycle.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/0a0afd69a86f566c/after-profile-lifecycle.mp4)
[after-incognito-approval.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/f6ac9365e4a04f9f/after-incognito-approval.mp4)
[after-incognito-restart.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/a9c93a53a701c67d/after-incognito-restart.mp4)
[after-endpoint-isolation.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/eb65eef09c01f235/after-endpoint-isolation.mp4)
[after-fingerprint-isolation.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/03f068d3e19effa6/after-fingerprint-isolation.mp4)
[desktop-driver.mjs](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/57a84a2acdca7165/desktop-driver.mjs)
[reproduce.py](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/1b884e0b71a1ac85/reproduce.py)
[service.py](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/28c6eb7adf90e557/service.py)
[create-certificate.sh](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/214831874c160698/create-certificate.sh)
[README.md](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/1e998b6aad939e3e/README.md)
