{ "$schema": "https://json-schema.org/draft/2020-12/schema", "title": "pi-chrome benchmark manifest", "description": "Manifest for browser-control benchmark pages. Recipes are canonical intent, not guaranteed raw tool JSON: runners may need to adapt descriptive selectors (frame/shadow) and expand path placeholders such as ${REPO_ROOT} before invoking tools.", "type": "array", "items": { "type": "object", "required": ["id", "file", "category", "goal", "expected", "recipe"], "additionalProperties": true, "properties": { "id": { "type": "string" }, "file": { "type": "string" }, "category": { "$ref": "#/$defs/category" }, "difficulty": { "enum": ["L1", "L2", "L3"] }, "gate": { "description": "Ship-gate bucket. core blocks releases, conditional requires declared capability/environment, quality is adversarial/flaky signal and should not block general ship.", "enum": ["core", "conditional", "quality"] }, "tags": { "type": "array", "items": { "type": "string" } }, "goal": { "type": "string" }, "gradeSource": { "enum": ["page", "harness", "both"], "default": "page" }, "expected": { "type": "object", "description": "Expected verdict by execution mode. CONDITIONAL means prerequisites, browser policy, hardware, or missing tool primitives decide outcome.", "required": ["synthetic", "trusted", "manual"], "properties": { "synthetic": { "$ref": "#/$defs/outcome" }, "trusted": { "$ref": "#/$defs/outcome" }, "manual": { "$ref": "#/$defs/outcome" } } }, "manualBaseline": { "description": "Whether human baseline has been explicitly verified in this repo/environment.", "enum": ["unverified", "verified"] }, "manualBaselineVerifiedAt": { "type": "string", "format": "date-time" }, "recipe": { "type": "array", "description": "Ordered tool intent. Params may include descriptive selectors (e.g. frame/shadow notation) or path placeholders for runners to adapt.", "items": { "type": "object", "required": ["tool", "params"], "properties": { "tool": { "type": "string" }, "params": { "type": "object", "description": "Tool params. For upload recipes, paths are strings after runner expansion; ${REPO_ROOT} means repository root." } } } }, "requires": { "type": "object", "additionalProperties": true, "properties": { "cdp": { "type": "boolean" }, "clipboard": { "type": "boolean" }, "touch": { "type": "boolean" }, "secureOrigin": { "type": "boolean" }, "fileSystem": { "type": "boolean" }, "dialogs": { "type": "boolean" }, "downloads": { "type": "boolean" }, "popups": { "type": "boolean" } } }, "prerequisites": { "type": "array", "items": { "type": "string" } }, "notes": { "type": "array", "items": { "type": "string" } }, "thresholds": { "type": "object", "additionalProperties": true }, "timeoutMs": { "type": "number" }, "verdictDelayMs": { "type": "number" }, "flakeRisk": { "enum": ["low", "medium", "high"] } } }, "$defs": { "outcome": { "enum": ["PASS", "FAIL", "SKIP", "WARN", "CONDITIONAL"] }, "category": { "enum": [ "activation-gates", "agent-safety", "aria-snapshot", "canvas-svg", "clipboard", "contextmenu", "csp", "dialogs", "dom-complexity", "downloads", "drag-drop", "editing", "files", "fingerprint", "focus-keyboard", "forms", "frames", "frameworks", "hover", "keyboard", "lazy-loading", "native-controls", "observability", "pointer-humanization", "popups", "scroll", "scroll-visibility", "spa-routing", "task-completion", "timing", "touch", "trusted-input" ] } } }