Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
952dc6b
feat: integrate Skyvern as optional CloakBrowser CDP harness
Jul 23, 2026
d982b9d
docs: re-verify Skyvern harness R040 proof honesty
Jul 23, 2026
1e5bf43
docs: refresh Skyvern harness R040 re-verify notes
Jul 23, 2026
30eef8b
docs: re-verify Skyvern harness R040 on cloak CDP path
Jul 23, 2026
38564a9
docs: refresh Skyvern harness R040 after cursor-grok re-verify
Jul 23, 2026
c1a50b8
docs: re-verify Skyvern harness R040 (cursor-grok lane)
Jul 23, 2026
46806dd
docs: re-verify Skyvern harness R040 at 03:02 (cursor-grok)
Jul 24, 2026
18e21b8
docs: re-verify Skyvern harness R040 at 03:10 (cursor-grok)
Jul 24, 2026
8928f0b
docs: re-verify Skyvern harness R040 at 03:22 (cursor-grok)
Jul 24, 2026
93520a4
docs: re-verify Skyvern harness R040 at 03:30 (cursor-grok)
Jul 24, 2026
e46e986
docs: re-verify Skyvern harness R040 at 04:06 (cursor-grok)
Jul 24, 2026
a660144
docs: re-verify Skyvern harness R040 at 07:59 (cursor-grok)
Jul 24, 2026
0b891be
docs: re-verify Skyvern harness R040 at 08:37 (cursor-grok)
Jul 24, 2026
a4033d0
docs: re-verify Skyvern harness R040 at 08:47 (cursor-grok)
Jul 24, 2026
52acabc
docs: re-verify Skyvern harness R040 at 09:23 (cursor-grok)
Jul 24, 2026
934c98e
docs: re-verify Skyvern harness R040 at 09:47 (cursor-grok)
Jul 24, 2026
2f9cb87
docs: re-verify Skyvern harness R040 at 13:00 (cursor-grok)
Jul 24, 2026
ec7f310
docs: re-verify Skyvern harness R040 at 13:10 (cursor-grok)
Jul 24, 2026
1535f0c
docs: re-verify Skyvern harness R040 at 13:33 (cursor-grok)
Jul 24, 2026
70975a7
docs: re-verify Skyvern harness R040 at 13:39 (cursor-grok)
Jul 24, 2026
36a0180
docs: re-verify Skyvern harness R040 at 13:44 (cursor-grok)
Jul 24, 2026
c459169
docs: re-verify Skyvern harness R040 at 13:54 (cursor-grok)
Jul 24, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ __pycache__/
*.py[cod]
*.egg-info/
.venv/
.venv-skyvern/

# Node
node_modules/
Expand Down
30 changes: 30 additions & 0 deletions .proof/2026-07-24-skyvern-harness.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
{
"capabilities": {
"harness": "skyvern",
"status": "degraded",
"skyvern_installed": true,
"llm_configured": false,
"cdp_routing": "cloakbrowser-manager",
"skyvern_license": "AGPL-3.0",
"skyvern_repo": "https://github.com/Skyvern-AI/skyvern",
"capabilities": {
"connect_over_cdp": true,
"run_task": false,
"navigate_screenshot": true
},
"notes": "Skyvern remains an optional AGPL-3.0 dependency. Automation attaches to CloakBrowser profiles via Manager CDP; do not launch vanilla Chromium for harness runs."
},
"profile_id": "a8b99a1f-bd77-4249-917f-0ad681ea5519",
"browser_address": "http://127.0.0.1:18115/api/profiles/a8b99a1f-bd77-4249-917f-0ad681ea5519/cdp",
"result": {
"status": "ok",
"mode": "Skyvern.local+SkyvernBrowser.connect_over_cdp",
"url": "https://example.com/",
"title": "Example Domain",
"screenshot": "/home/coder/vk-repos/CloakBrowser-Manager-skyvern/.proof/2026-07-24-skyvern-harness.png",
"browser_address": "http://127.0.0.1:18115/api/profiles/a8b99a1f-bd77-4249-917f-0ad681ea5519/cdp",
"headers_applied": true
},
"screenshot_bytes": 17487,
"vcvm_mirror": "/home/coder/cloakbrowser-manager-vcvm/.proof/2026-07-24-skyvern-harness.png"
}
Binary file added .proof/2026-07-24-skyvern-harness.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
98 changes: 98 additions & 0 deletions SKYVERN-HARNESS-2026-07-24.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,98 @@
[ L-CLOAK · R040 ] 🟣 cursor-grok · Modell: cursor-grok-4.5 · 🧠 IDR: nein · 🕐 2026-07-24T13:54+02:00
> 🧠 NotebookLM: n/a (kein IDR-Auftrag in dieser Lane; Architektur aus Skyvern README + CloakBrowser-Manager CDP API)

# SKYVERN-HARNESS — CloakBrowser × Skyvern (2026-07-24)

Lane: `cloak-skyvern-harness` (cursor grok-4.5)
OpenSpec: `openspec validate skyvern-harness --strict` → **PASS**
Branch: `feat/skyvern-harness`
PR: https://github.com/Martin-Hausleitner/CloakBrowser-Manager/pull/2
Proof: `.proof/2026-07-24-skyvern-harness.png`

## Verdict

Skyvern ist als **optionaler AGPL-Harness** an CloakBrowser Manager angedockt. Automation hängt über Manager-CDP an einem laufenden CloakBrowser-Profil (Fingerprint + Per-Session-Proxy bleiben auf der Cloak-Seite). Kein Vendoring von Skyvern-Quellcode in den MIT-Tree.

| Check | Ergebnis |
|---|---|
| OpenSpec `skyvern-harness --strict` | PASS |
| Unit tests `test_skyvern_harness.py` | **6/6** |
| Backend suite (`AUTH_TOKEN=` clean) | **227 passed**, 1 unrelated env flake (`test_allocate_cdp_port_wraps_around` — Port **5199** locally held) |
| Live CDP proof via `Skyvern.local` + `SkyvernBrowser` | **PASS** → example.com |
| Screenshot non-empty | **17487 bytes**, 664×992 PNG |
| LLM agent `run_task` | **ehrlich blocked/degraded** (keine LLM-Keys) |

## Was integriert wurde

1. **Adapter** `backend/harnesses/skyvern_harness.py`
- Capability probe (`unavailable` / `degraded` / `ready`)
- CDP URL builder + Bearer headers
- Prefer co-located `http://127.0.0.1:{cdp_port}` oder Manager-Proxy `/api/profiles/{id}/cdp`
- `Skyvern.local()` → Playwright CDP mit Auth-Headers → `SkyvernBrowser` Wrap
- Agent `run_task` nur wenn LLM konfiguriert, sonst ehrlich `blocked`
2. **API**
- `GET /api/harnesses/skyvern/capabilities`
- `POST /api/harnesses/skyvern/bind`
- `POST /api/harnesses/skyvern/run`
3. **Proof runner** `scripts/skyvern_harness_proof.py`
4. **OpenSpec change** `openspec/changes/skyvern-harness/`

## Lizenz-Hinweis (AGPL)

- **Skyvern** ([Skyvern-AI/skyvern](https://github.com/Skyvern-AI/skyvern)): **GNU Affero General Public License v3.0 (AGPL-3.0)** — bestätigt via upstream `LICENSE` (`/tmp/skyvern`).
- Dieser Manager-GUI-Code bleibt **MIT**.
- Skyvern wird **nicht** in den Repo-Tree vendored; Installation ist optional (`pip install "skyvern[local]"`).
- Wer Skyvern als Netzwerkdienst zusammen mit dem Manager betreibt, muss die AGPL-Pflichten (Corresponding Source für den kombinierten Service) selbst einhalten.
- „1:1 kopieren“ der gesamten Skyvern-Codebasis wäre AGPL-Kontamination des MIT-Trees — bewusst vermieden zugunsten Adapter + optionalem Dependency (Skyvern-Kernfähigkeiten CDP-Attach / Browser-Wrap / optional `run_task` über die public API).

## Kombinations-Architektur

```text
Operator / API
CloakBrowser Manager (/api/harnesses/skyvern/*)
│ bind profile + auth
Skyvern.local() ──CDP + Bearer──► Manager CDP Proxy
│ │
│ ▼
└──────── SkyvernBrowser ──► CloakBrowser profile
(fingerprint, proxy, cookies)
```

Docking-Punkt ist bewusst **CDP**, nicht ein zweiter Chromium-Launch: Skyvern steuert denselben Cloak-Prozess, den noVNC bereits zeigt. Skyvern-Kernfähigkeiten (CDP-Attach, Browser-Wrap, optional `run_task`) werden über den Adapter genutzt — kein 1:1-Vendoring des AGPL-Trees in den MIT-Manager.

## Proof R040 (inline)

![Skyvern harness through CloakBrowser CDP — example.com](.proof/2026-07-24-skyvern-harness.png)

Live-Lauf (re-verified 2026-07-24T13:54+02:00, lane cursor-grok-4.5):

- Manager: `http://127.0.0.1:18115` (container `cloakbrowser-manager-vcvm`)
- Profile: `a8b99a1f-bd77-4249-917f-0ad681ea5519` (VCVM Mobile Demo, running)
- Mode: `Skyvern.local+SkyvernBrowser.connect_over_cdp`
- CDP: `http://127.0.0.1:18115/api/profiles/.../cdp` · `headers_applied: true`
- URL: `https://example.com/` · Title: `Example Domain` · PNG **17487** bytes
- Capability status: `degraded` (`skyvern_installed=true`, `llm_configured=false`)
- Harness API on **running** VCVM image: still `404` until image is rebuilt from this branch (proof uses host-side Skyvern adapter → Manager CDP, which is the cloak docking path)
- OpenSpec / harness unit re-checked this session: `validate --strict` PASS, `test_skyvern_harness.py` 6/6, backend **227 passed** (+1 unrelated CDP wrap flake on port 5199)
- Upstream license re-checked via `/tmp/skyvern` clone: **AGPL-3.0**
- Runtime: `pip install "skyvern[local]"` in dedicated venv (`.venv-skyvern`, PyPI / local skyvern)

JSON: `.proof/2026-07-24-skyvern-harness.json`
VCVM-Spiegel: `~/cloakbrowser-manager-vcvm/.proof/2026-07-24-skyvern-harness.png`

## Limits / ehrlich

- Vollständiger Vision-Agent-`run_task`-Loop braucht LLM-Keys (`OPENAI_*` / Skyvern cloud). Capability meldet dann `run_task: true`; ohne Keys → `blocked`/`degraded`, kein Fake.
- PyPI-`Skyvern.connect_to_browser_over_cdp` ohne Header scheitert an Manager-Auth; der Harness bridged deshalb Skyverns Playwright-Driver **mit** Headers und wrappt `SkyvernBrowser`.
- Laufendes VCVM-Docker-Image ist noch ohne `/api/harnesses/skyvern/*` (vor-PR Build). Adapter + Routes sind im Branch; Skyvern-Runtime bleibt Opt-in (`pip install "skyvern[local]"`), nicht im Core-Image.
- `test_allocate_cdp_port_wraps_around` kann fehlschlagen wenn Port `5199` extern belegt ist — unrelated zum Skyvern-Harness.

## NEXT

- Optional: Compose-Sidecar für Skyvern-Server-Mode
- Optional: Frontend-Toggle „Run with Skyvern“ im Mobile Task Workspace
- Optional: LLM-Keys setzen und echten `run_task`-Agent-Loop durch denselben CDP-Pfad beweisen
- Optional: VCVM-Image aus diesem Branch neu bauen, damit `/api/harnesses/skyvern/*` im Container antwortet
1 change: 1 addition & 0 deletions backend/harnesses/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
"""Optional automation harnesses (Skyvern, etc.)."""
Loading