Files
libretro/schemas/pack-probe.schema.json
T
Abdessamad Derraz f0320a2bd9 feat: test packs the way a user installs them
pack_probe.py lays a platform's BIOS folder out from its pack, or with install.py --dest, and starts each test game through core_probe with that folder, mapping every file the core opened to the pack entry that put it there.
2026-10-27 15:37:40 +01:00

130 lines
6.3 KiB
JSON

{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://abdess.github.io/retrobios/api/v1/schemas/pack-probe.schema.json",
"title": "RetroBIOS pack probe",
"description": "One line of measurements/pack-probes.jsonl: one run of scripts/pack_probe.py, a game started by a libretro core with its system directory taken from a platform's BIOS folder as a user installs it, the pack extracted or install.py run on a scratch root. The core_probe records the line names are in measurements/<emulator>.jsonl. Lines are appended, never rewritten.",
"type": "object",
"additionalProperties": false,
"required": ["schema_version", "id", "probed_at", "platform", "platform_version", "target", "install",
"source", "system", "platform_system", "emulator", "core", "content", "records", "rounds",
"staged", "verdict", "verdict_evidence", "files_opened", "findings", "error"],
"$defs": {
"id": { "type": "string", "pattern": "^\\d{4}-\\d{2}-\\d{2}-[0-9a-f]{12}$" },
"sha1": { "type": "string", "pattern": "^[0-9a-f]{40}$" },
"sha256": { "type": "string", "pattern": "^[0-9a-f]{64}$" },
"pack": {
"type": "object",
"additionalProperties": false,
"required": ["file", "sha256", "size", "members"],
"properties": {
"file": { "type": "string" },
"sha256": { "$ref": "#/$defs/sha256" },
"size": { "type": "integer", "minimum": 0 },
"members": { "type": ["integer", "null"], "minimum": 0 }
}
}
},
"properties": {
"schema_version": { "const": 1 },
"id": { "$ref": "#/$defs/id" },
"probed_at": { "type": "string", "format": "date-time" },
"platform": { "type": "string", "description": "Key of platforms/_registry.yml." },
"platform_version": { "type": "string" },
"target": { "type": ["string", "null"], "description": "Hardware target the cores were chosen for." },
"install": {
"enum": ["pack", "installer"],
"description": "pack: the platform's pack extracted at the root of the BIOS folder. installer: install.py --dest on the folder, from that pack and the published manifest, offline."
},
"source": {
"type": "object",
"additionalProperties": false,
"required": ["pack", "manifest", "repo_commit"],
"properties": {
"pack": { "$ref": "#/$defs/pack" },
"manifest": {
"type": ["object", "null"],
"additionalProperties": false,
"required": ["path", "sha256", "generated", "pack_files"],
"properties": {
"path": { "type": "string" },
"sha256": { "$ref": "#/$defs/sha256" },
"generated": { "type": ["string", "null"] },
"pack_files": { "type": ["integer", "null"] }
}
},
"save_dir_files": {
"type": "integer", "minimum": 0,
"description": "Files the installer put in the save directory, which the core's run does not see."
},
"installer_summary": { "type": "string" },
"repo_commit": { "type": ["string", "null"], "description": "Commit of the checkout the pack was built from." }
}
},
"system": { "type": "string" },
"platform_system": { "type": ["string", "null"], "description": "The platform's own id of the system." },
"emulator": { "type": "string", "description": "Profile key, the file under measurements/ the records are in." },
"core": {
"type": "object",
"additionalProperties": false,
"required": ["file", "sha256", "artifact", "last_modified"],
"properties": {
"file": { "type": "string" },
"sha256": { "$ref": "#/$defs/sha256" },
"artifact": { "type": "string" },
"last_modified": { "type": ["string", "null"] }
}
},
"content": {
"type": "object",
"additionalProperties": false,
"required": ["label", "catalog", "region"],
"properties": {
"label": { "type": "string" },
"catalog": { "type": "string" },
"region": { "type": ["string", "null"] }
}
},
"records": {
"type": "array",
"items": { "$ref": "#/$defs/id" },
"description": "core_probe records of this probe, first run first. A second one ran with the closed staging and supersedes the first."
},
"rounds": { "type": "integer", "minimum": 1, "description": "Runs until the core asked for nothing more the layout holds." },
"staged": { "type": "integer", "minimum": 0, "description": "Files of the layout staged for the last run." },
"verdict": { "enum": ["boots", "bios_error", "crash", "hang", "unknown"] },
"verdict_evidence": { "type": ["object", "null"] },
"files_opened": {
"type": "array",
"items": {
"type": "object",
"additionalProperties": false,
"required": ["path", "entry", "sha1", "created"],
"properties": {
"path": { "type": "string", "description": "Path under the system directory." },
"entry": { "type": ["string", "null"], "description": "The pack member, or the manifest entry, that put the file there." },
"sha1": { "anyOf": [{ "$ref": "#/$defs/sha1" }, { "type": "null" }] },
"created": { "type": "boolean", "description": "Written by the core, not taken from the layout." }
}
}
},
"findings": {
"type": "array",
"items": {
"type": "object",
"additionalProperties": false,
"required": ["kind", "path", "declared_by", "paths"],
"properties": {
"kind": {
"enum": ["missing_declared", "missing_undeclared", "elsewhere", "not_staged", "unlisted"],
"description": "missing_declared: the core looked for a file its profile declares, the layout lacks it. missing_undeclared: the same for a file no entry of the profile names. elsewhere: the layout holds a file of that name under another path. not_staged: the layout holds it but the staging never closed. unlisted: the core opened a file of the layout that no pack or manifest entry names."
},
"path": { "type": "string" },
"declared_by": { "type": "array", "items": { "type": "string" } },
"paths": { "type": "array", "items": { "type": "string" } }
}
}
},
"error": { "type": ["string", "null"], "description": "Why no record was written, when core_probe failed." }
}
}