AiDeepDive ai.deep-dive@1
Generated at from
openvibe-contracts v0.419.0 and
openvibe-sdk v0.161.0.
- Version
- 1.0.0
- Owner
- ai
- Visibility
- public
- Status
- active
- Compatibility
- backward
- Decision
- ADR-015
- Schema
https://openvibe.network/contracts/ai/deep-dive.v1.json
A deep dive: expert design research run by OpenVibe.AI (workflow design.deep_dive) for OpenVibe.Exchange's /deep-dive page and, through the API, OpenVibe.Design. One document holds the question and depth (the input), the seven steps, every source read, every capture (a private Media object per viewport and theme, with its DOM facts and Expert extras), the per-site analysis, the synthesis across sites, the recommendations checked against OpenVibe's own rules, and the receipt of every model call and capture. Every claim carries its evidence: the site, the capture or crop, the URL and the date it was read. Nothing is copied: captures are private to the run's owner and the report shows them as attributed commentary.
Fields
| Field | Type | Required | Description | Constraints |
|---|---|---|---|---|
id | string | yes | The run id; a deep dive is a run (GET /api/v1/deep-dives/{id}). |
|
schema | const | yes |
| |
run_id | string | yes |
| |
status | enum | yes |
| |
input | object | yes |
| |
input.question | string | yes |
| |
input.depth | enum | yes |
| |
input.max_sites | integer | yes |
| |
input.sites | array of string | Sites the person named when starting the run. |
| |
steps | array of object | yes |
| |
steps[].key | enum | yes |
| |
steps[].status | enum | yes |
| |
steps[].detail | string | null |
| ||
steps[].started_at | string | null |
| ||
steps[].finished_at | string | null |
| ||
sources | array of object | yes |
| |
sources[].id | string | yes |
| |
sources[].kind | enum | yes |
| |
sources[].title | string | yes |
| |
sources[].url | string | yes |
| |
sources[].publisher | string | null |
| ||
sources[].engine | string | null |
| ||
sources[].snippet | string | null |
| ||
sources[].license | string | null |
| ||
sources[].read_at | string | yes |
| |
captures | array of object | yes |
| |
captures[].id | string | yes |
| |
captures[].source_id | string | yes |
| |
captures[].url | string | yes |
| |
captures[].final_url | string | null |
| ||
captures[].title | string | null |
| ||
captures[].captured_at | string | yes |
| |
captures[].viewport | enum | yes |
| |
captures[].theme | enum | yes |
| |
captures[].full_page | boolean | yes | ||
captures[].media_id | string | null |
| ||
captures[].width | integer | null |
| ||
captures[].height | integer | null |
| ||
captures[].crops | array of object | yes |
| |
captures[].crops[].id | string | yes |
| |
captures[].crops[].media_id | string | yes |
| |
captures[].crops[].y | integer | yes |
| |
captures[].crops[].height | integer | yes |
| |
captures[].dom | object | null | |||
captures[].extras | object | null | |||
captures[].skip | string | null | Why the capture did not happen: robots_disallowed, not_public, no_chrome, timeout, … |
| |
captures[].cached | boolean | |||
analysis | array of object | yes |
| |
analysis[].source_id | string | yes |
| |
analysis[].url | string | yes |
| |
analysis[].summary | string | yes |
| |
analysis[].first_impression | string |
| ||
analysis[].hierarchy | string |
| ||
analysis[].density | string |
| ||
analysis[].type | string |
| ||
analysis[].colour | string |
| ||
analysis[].motion | string |
| ||
analysis[].words | string |
| ||
analysis[].strengths | array of string | yes |
| |
analysis[].weaknesses | array of string | yes |
| |
analysis[].accessibility | string | null |
| ||
analysis[].speed | string | null |
| ||
analysis[].evidence | https://openvibe.network/contracts/ai/deep-dive.v1.json#/$defs/evidence | yes | ||
synthesis | object | yes |
| |
synthesis.patterns | array of object | yes |
| |
synthesis.patterns[].name | string | yes |
| |
synthesis.patterns[].what | string | yes |
| |
synthesis.patterns[].sites | array of string | yes |
| |
synthesis.patterns[].usage_count | integer |
| ||
synthesis.patterns[].evidence | https://openvibe.network/contracts/ai/deep-dive.v1.json#/$defs/evidence | yes | ||
synthesis.comparison | object | yes |
| |
synthesis.comparison.columns | array of string | yes |
| |
synthesis.comparison.rows | array of array | yes |
| |
synthesis.best | object | yes |
| |
synthesis.best.source_id | string | yes |
| |
synthesis.best.what | string | yes |
| |
synthesis.best.evidence | https://openvibe.network/contracts/ai/deep-dive.v1.json#/$defs/evidence | yes | ||
synthesis.mistakes | array of object | yes |
| |
synthesis.mistakes[].what | string | yes |
| |
synthesis.mistakes[].evidence | https://openvibe.network/contracts/ai/deep-dive.v1.json#/$defs/evidence | yes | ||
synthesis.gap | string | yes |
| |
synthesis.reference_tokens | object | yes |
| |
synthesis.reference_tokens.palettes | array of object | yes |
| |
synthesis.reference_tokens.palettes[].source_id | string | yes |
| |
synthesis.reference_tokens.palettes[].colours | array of string | yes |
| |
synthesis.reference_tokens.type_scales | array of object | yes |
| |
synthesis.reference_tokens.type_scales[].source_id | string | yes |
| |
synthesis.reference_tokens.type_scales[].families | array of string | yes |
| |
synthesis.reference_tokens.type_scales[].sizes | array of string | yes |
| |
synthesis.reference_tokens.spacing | array of object | yes |
| |
synthesis.reference_tokens.spacing[].source_id | string | yes |
| |
synthesis.reference_tokens.spacing[].steps | array of string | yes |
| |
synthesis.do | array of string | yes |
| |
synthesis.dont | array of string | yes |
| |
synthesis.accessibility | array of string | yes |
| |
synthesis.speed | array of string | yes |
| |
recommendations | array of object | yes |
| |
recommendations[].id | string | yes |
| |
recommendations[].what | string | yes |
| |
recommendations[].why | string | yes |
| |
recommendations[].rule | object | yes |
| |
recommendations[].rule.id | string | null |
| ||
recommendations[].rule.status | enum | yes |
| |
recommendations[].rule.text | string | yes |
| |
recommendations[].evidence | https://openvibe.network/contracts/ai/deep-dive.v1.json#/$defs/evidence | yes | ||
receipt | object | yes |
| |
receipt.price_usd | number | yes |
| |
receipt.held_usd | number | yes |
| |
receipt.cost_usd | number | yes |
| |
receipt.captures_count | integer | yes |
| |
receipt.synthetic | boolean | yes | ||
receipt.models | array of object | yes |
| |
receipt.models[].step | enum | yes |
| |
receipt.models[].provider | string | null | yes |
| |
receipt.models[].model | string | null | yes |
| |
receipt.models[].tokens_in | integer | yes |
| |
receipt.models[].tokens_out | integer | yes |
| |
receipt.models[].cost_usd | number | yes |
| |
receipt.models[].ms | integer | yes |
| |
gaps | array of string | yes |
| |
created_at | string | yes |
| |
updated_at | string | yes |
| |
finished_at | string | null |
|
Examples
From the contract's own test fixtures: valid ones validate, rejected ones must fail.
Valid: quick-robot-panel
{
"id": "run_01JAB2C3D4E5F6G7H8J9K0MNPQ",
"schema": "ai.deep-dive@1",
"run_id": "run_01JAB2C3D4E5F6G7H8J9K0MNPQ",
"status": "succeeded",
"input": {
"question": "a phone-first robot control panel",
"depth": "quick",
"max_sites": 6,
"sites": [
"https://example.com/robot"
]
},
"steps": [
{
"key": "plan",
"status": "done",
"detail": "wrote 9 expert questions",
"started_at": "2026-11-11T10:00:00.000Z",
"finished_at": "2026-11-11T10:00:02.000Z"
},
{
"key": "search",
"status": "done",
"detail": "4 engines, 12 sources",
"started_at": "2026-11-11T10:00:02.000Z",
"finished_at": "2026-11-11T10:00:40.000Z"
},
{
"key": "choose",
"status": "done",
"detail": "6 sites chosen",
"started_at": "2026-11-11T10:00:40.000Z",
"finished_at": "2026-11-11T10:00:42.000Z"
},
{
"key": "capture",
"status": "done",
"detail": "12 captures",
"started_at": "2026-11-11T10:00:42.000Z",
"finished_at": "2026-11-11T10:02:30.000Z"
},
{
"key": "analyse",
"status": "done",
"detail": "6 sites read",
"started_at": "2026-11-11T10:02:30.000Z",
"finished_at": "2026-11-11T10:03:05.000Z"
},
{
"key": "synthesise",
"status": "done",
"detail": "8 patterns",
"started_at": "2026-11-11T10:03:05.000Z",
"finished_at": "2026-11-11T10:03:20.000Z"
},
{
"key": "report",
"status": "done",
"detail": "report ready",
"started_at": "2026-11-11T10:03:20.000Z",
"finished_at": "2026-11-11T10:03:21.000Z"
}
],
"sources": [
{
"id": "src_1",
"kind": "web",
"title": "A phone-first robot control panel",
"url": "https://example.com/robot",
"publisher": "example.com",
"engine": "openvibe",
"snippet": "A control panel laid out for one thumb.",
"license": null,
"read_at": "2026-11-11T10:00:10.000Z"
}
],
"captures": [
{
"id": "cap_1",
"source_id": "src_1",
"url": "https://example.com/robot",
"final_url": "https://example.com/robot",
"title": "A phone-first robot control panel",
"captured_at": "2026-11-11T10:00:45.000Z",
"viewport": 390,
"theme": "light",
"full_page": true,
"media_id": "med_01JAB2C3D4E5F6G7H8J9K0MNPQ",
"width": 390,
"height": 2400,
"crops": [
{
"id": "crop_1",
"media_id": "med_01JAB2C3D4E5F6G7H8J9K0MNPR",
"y": 0,
"height": 844
},
{
"id": "crop_2",
"media_id": "med_01JAB2C3D4E5F6G7H8J9K0MNPS",
"y": 844,
"height": 844
}
],
"dom": {
"fonts": {
"families": [
"Inter"
],
"sizes": [
"14px",
"16px",
"28px"
]
},
"colours": [
{
"value": "rgb(12, 14, 18)",
"share": 0.71
}
]
},
"extras": null,
"skip": null,
"cached": false
}
],
"analysis": [
{
"source_id": "src_1",
"url": "https://example.com/robot",
"summary": "One thumb reaches every primary control; the live camera fills the first screen.",
"first_impression": "The robot's camera frame is the page.",
"hierarchy": "One headline, one live frame, then the controls.",
"density": "Spacious; four controls per screen.",
"type": "One family, three sizes.",
"colour": "Near-black on white with a single amber action.",
"motion": "The frame pulses when connected.",
"words": "Verbs on buttons, state in the status line.",
"strengths": [
"Every control sits in the bottom third",
"State is written, not only coloured"
],
"weaknesses": [
"The Stop button is the same size as the rest"
],
"accessibility": "The stop button has no accessible name.",
"speed": "The first frame arrived once the socket opened; no skeleton.",
"evidence": [
{
"claim": "Controls sit in the bottom third",
"source_id": "src_1",
"capture_id": "cap_1",
"crop_id": "crop_2",
"url": "https://example.com/robot",
"read_at": "2026-11-11T10:00:45.000Z"
},
{
"claim": "The stop button has no accessible name",
"source_id": "src_1",
"capture_id": "cap_1",
"crop_id": null,
"url": "https://example.com/robot",
"read_at": "2026-11-11T10:00:45.000Z"
}
]
}
],
"synthesis": {
"patterns": [
{
"name": "Live view first",
"what": "The camera or state view is the whole first screen, controls below it.",
"sites": [
"src_1"
],
"usage_count": 1,
"evidence": [
{
"claim": "The frame is the first screen",
"source_id": "src_1",
"capture_id": "cap_1",
"crop_id": "crop_1",
"url": "https://example.com/robot",
"read_at": "2026-11-11T10:00:45.000Z"
}
]
}
],
"comparison": {
"columns": [
"Site",
"First screen",
"Controls"
],
"rows": [
[
"example.com",
"live frame",
"bottom third"
]
]
},
"best": {
"source_id": "src_1",
"what": "The live frame doubles as the connection state.",
"evidence": [
{
"claim": "The frame carries the status line",
"source_id": "src_1",
"capture_id": "cap_1",
"crop_id": "crop_1",
"url": "https://example.com/robot",
"read_at": "2026-11-11T10:00:45.000Z"
}
]
},
"mistakes": [
{
"what": "The Stop button is not separated from the other controls.",
"evidence": [
{
"claim": "All buttons share one row",
"source_id": "src_1",
"capture_id": "cap_1",
"crop_id": "crop_2",
"url": "https://example.com/robot",
"read_at": "2026-11-11T10:00:45.000Z"
}
]
}
],
"gap": "No control panel shows what the robot is about to do before the tap is sent.",
"reference_tokens": {
"palettes": [
{
"source_id": "src_1",
"colours": [
"#0c0e12",
"#ffffff",
"#f5a623"
]
}
],
"type_scales": [
{
"source_id": "src_1",
"families": [
"Inter"
],
"sizes": [
"14px",
"16px",
"28px"
]
}
],
"spacing": [
{
"source_id": "src_1",
"steps": [
"4px",
"8px",
"16px",
"24px"
]
}
]
},
"do": [
"Keep every primary control in the thumb reach of one hand"
],
"dont": [
"Do not make the stop control share the row of ordinary actions"
],
"accessibility": [
"Name every icon-only control"
],
"speed": [
"Show the frame before the socket finishes connecting"
]
},
"recommendations": [
{
"id": "rec_1",
"what": "Put the Stop button alone, at the bottom.",
"why": "The best panel suggests it by layout; the failure here is that it does not.",
"rule": {
"id": "control.destructive-separation",
"status": "follows",
"text": "Destructive actions are separated from ordinary ones."
},
"evidence": [
{
"claim": "The stop shares the row",
"source_id": "src_1",
"capture_id": "cap_1",
"crop_id": "crop_2",
"url": "https://example.com/robot",
"read_at": "2026-11-11T10:00:45.000Z"
}
]
}
],
"receipt": {
"price_usd": 0.2,
"held_usd": 0.2,
"cost_usd": 0.014,
"captures_count": 12,
"synthetic": false,
"models": [
{
"step": "plan",
"provider": "deepseek",
"model": "deepseek-v4-flash",
"tokens_in": 900,
"tokens_out": 320,
"cost_usd": 0.0004,
"ms": 1800
},
{
"step": "choose",
"provider": "deepseek",
"model": "deepseek-v4-flash",
"tokens_in": 2400,
"tokens_out": 500,
"cost_usd": 0.0007,
"ms": 2100
},
{
"step": "analyse",
"provider": "deepseek",
"model": "deepseek-v4-pro",
"tokens_in": 12000,
"tokens_out": 4000,
"cost_usd": 0.012,
"ms": 26000
},
{
"step": "synthesise",
"provider": "deepseek",
"model": "deepseek-v4-pro",
"tokens_in": 6000,
"tokens_out": 2500,
"cost_usd": 0.007,
"ms": 12000
}
]
},
"gaps": [
"No Expert extras were measured at Quick depth."
],
"created_at": "2026-11-11T10:00:00.000Z",
"updated_at": "2026-11-11T10:03:21.000Z",
"finished_at": "2026-11-11T10:03:21.000Z"
}Rejected: unknown-status
{
"id": "run_01JAB2C3D4E5F6G7H8J9K0MNPQ",
"schema": "ai.deep-dive@1",
"run_id": "run_01JAB2C3D4E5F6G7H8J9K0MNPQ",
"status": "finished",
"input": {
"question": "a phone-first robot control panel",
"depth": "quick",
"max_sites": 6
},
"steps": [],
"sources": [],
"captures": [],
"analysis": [],
"synthesis": {
"patterns": [],
"comparison": {
"columns": [],
"rows": []
},
"best": {
"source_id": "src_1",
"what": "x",
"evidence": []
},
"mistakes": [],
"gap": "",
"reference_tokens": {
"palettes": [],
"type_scales": [],
"spacing": []
},
"do": [],
"dont": [],
"accessibility": [],
"speed": []
},
"recommendations": [],
"receipt": {
"price_usd": 0.2,
"held_usd": 0.2,
"cost_usd": 0,
"models": [],
"captures_count": 0,
"synthetic": false
},
"gaps": [],
"created_at": "2026-11-11T10:00:00.000Z",
"updated_at": "2026-11-11T10:03:21.000Z"
}Validate
const contracts = require('openvibe-contracts');
contracts.validate('ai.deep-dive@1', value); // { valid, errors: [{ path, message }] }