|
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 |
|