| |
1 | +<!-- |
| |
2 | + VERIFICATION.md |
| |
3 | + Zyquo Cloud Web |
| |
4 | + |
| |
5 | + Author: Simon-Pierre Boucher |
| |
6 | + Mail: contact@spboucher.ai |
| |
7 | +--> |
| |
8 | + |
| |
9 | +# Phase 7 — Verification Report (real keys, real browser) |
| |
10 | + |
| |
11 | +Run 2026-07-31 against the dev build with the user's real API keys, from an |
| |
12 | +actual Chromium page driving the app's own provider layer |
| |
13 | +(`scripts/verify-matrix.mjs`, `scripts/verify-browsers.mjs`, |
| |
14 | +`scripts/gate-phase2.mjs`, `scripts/gate-phase3.mjs`). Raw per-model JSON: |
| |
15 | +`/tmp/zyquo-verify.json` (not committed — contains timings only, no keys). |
| |
16 | + |
| |
17 | +## 1. Provider / model matrix (streaming, token-by-token) |
| |
18 | + |
| |
19 | +**169 of 170 catalog models verified streaming live — 169 PASS.** |
| |
20 | +1 model deliberately skipped: `sonar-deep-research` (long-running, per-search |
| |
21 | +billing; its sibling `sonar-reasoning-pro` covers the code path). |
| |
22 | + |
| |
23 | +| Provider | Models | Streaming | Non-streaming | Stop/abort | Vision | Reasoning deltas | Citations | CORS | |
| |
24 | +|---|---|---|---|---|---|---|---|---| |
| |
25 | +| OpenAI | 27 | 27/27 ✅ | ✅ | ✅ | ✅ gpt-5-nano | n/a (API omits) | — | direct ✅ | |
| |
26 | +| Anthropic | 11 | 11/11 ✅ | ✅ | ✅ | ✅ haiku-4.5 | n/a (thinking off by default) | — | direct + header ✅ | |
| |
27 | +| xAI | 5 | 5/5 ✅ | ✅ | ✅ | ✅ | ✅ (grok-4.x) | — | direct ✅ | |
| |
28 | +| Mistral | 10 | 10/10 ✅ | ✅ | ✅ | ✅ | ✅ (magistral array-content quirk) | — | direct ✅ | |
| |
29 | +| Gemini | 14 | 14/14 ✅ | ✅ | ✅ | ✅ | n/a | — | direct ✅ | |
| |
30 | +| Qwen/DashScope | 32 | 32/32 ✅ | ✅ | ✅ | ✅ | ✅ (enable_thinking) | — | direct ✅ | |
| |
31 | +| DeepSeek | 2 | 2/2 ✅ | ✅ | ✅ | (no vision models) | ✅ | — | direct ✅ | |
| |
32 | +| Kimi | 12 | 12/12 ✅ | ✅ | ✅ | ✅ | ✅ (K-series) | — | direct ✅ | |
| |
33 | +| Perplexity | 4 | 3/3 ✅ + 1 skip | ✅ | ✅ | (no vision models) | ✅ | ✅ 19 citations | direct ✅ | |
| |
34 | +| Together | 16 | 16/16 ✅ | ✅ ¹ | ✅ | (no vision models) | ✅ | — | direct ✅ | |
| |
35 | +| DeepInfra | 34 | 34/34 ✅ | ✅ | ✅ | ✅ | ✅ | — | direct ✅ | |
| |
36 | +| Cerebras | 3 | 3/3 ✅ | ✅ ² | ✅ ² | ✅ gemma-4-31b | ✅ | — | direct ✅ | |
| |
37 | + |
| |
38 | +¹ Together's first non-streaming probe used `Qwen/Qwen3.5-9B` (a |
| |
39 | +`requiresStreaming` model whose tiny budget went entirely to reasoning); |
| |
40 | +retested green on `Llama-3.3-70B-Instruct-Turbo`. |
| |
41 | +² Cerebras first probes used a 16-token budget on a reasoning model (empty |
| |
42 | +text) and an abort timer slower than Cerebras's ~3000 tok/s (essay finished |
| |
43 | +first). Retested green with a 512-token budget and a 120 ms abort: |
| |
44 | +`Generation stopped.` |
| |
45 | + |
| |
46 | +Notable observations recorded: |
| |
47 | +- Reasoning content arrives via `reasoning_content`/`reasoning` deltas and, |
| |
48 | + for Mistral's magistral, via the array-content thinking chunks — all |
| |
49 | + normalized by the ported parser (verified: 103–1291 reasoning chars on |
| |
50 | + thinking models). |
| |
51 | +- Legacy models (gpt-3.5-turbo, moonshot-v1 family, o1…) all still served. |
| |
52 | +- Perplexity `sonar` returned 19 numbered citations, merged from |
| |
53 | + `citations` + `search_results`. |
| |
54 | + |
| |
55 | +## 2. Persistence |
| |
56 | + |
| |
57 | +Phase 3 gate (`scripts/gate-phase3.mjs`), real Chromium with a persistent |
| |
58 | +profile: **13/13 PASS** — keys/settings/conversations survive reload **and a |
| |
59 | +full browser restart**; export→clear→import restores exactly; passphrase |
| |
60 | +vault encrypts at rest (AES-GCM), rejects wrong passphrase, unlocks, disables. |
| |
61 | + |
| |
62 | +## 3. Security / privacy sanity |
| |
63 | + |
| |
64 | +- **Network audit:** every origin contacted during the full matrix run: |
| |
65 | + `localhost` + exactly the 12 provider API origins. Nothing else — no |
| |
66 | + analytics, no third parties. |
| |
67 | +- **CSP:** `fetch('https://example.com')` from the page → blocked by |
| |
68 | + `connect-src`; provider origins reachable. No inline/third-party scripts. |
| |
69 | +- **First-run notice** present and honest (localStorage, BYOK, passphrase |
| |
70 | + option). |
| |
71 | +- **Prod build:** dev harness (`window.__zyquo`) absent; keys never logged; |
| |
72 | + keys file `.keys.local.json` gitignored (verified never committed). |
| |
73 | + |
| |
74 | +## 4. Responsive / cross-browser |
| |
75 | + |
| |
76 | +`scripts/verify-browsers.mjs`: **15/15 PASS** across **Chromium, WebKit |
| |
77 | +(Safari engine), Firefox** — app loads, **light theme is the default** (bg |
| |
78 | +`rgb(250,251,253)`), real streaming completion renders in every engine, no |
| |
79 | +horizontal overflow at 1240×800 or 390×844, drawer navigation on phone. |
| |
80 | +Visual review at both widths in light + dark: `docs/PLAN.md` Phase 4.4. |
| |
81 | + |
| |
82 | +## 5. Phase gates recap |
| |
83 | + |
| |
84 | +- Phase 2 gate: token-by-token streaming in a real browser (26 incremental |
| |
85 | + snapshots) + cancellation — PASS. |
| |
86 | +- Phase 3 gate: 13/13 persistence checks — PASS. |
| |
87 | +- Phase 7 matrix: 169/169 tested models streaming, 12/12 providers |
| |
88 | + non-streaming + cancel, vision on all 9 providers that have vision models, |
| |
89 | + citations, CORS all-direct — PASS. |
| |
90 | |