mirror of
https://github.com/Abdess/retroarch_system.git
synced 2026-10-20 18:59:07 -05:00
The resolver reads built_by as the platforms on which a core name means this build. Its definition said platforms that compile a libretro build, which excludes a standalone build a platform installs from the project's release. The field now says what it decides: platforms that ship this build under its core name, compiled or installed from the release.
898 lines
24 KiB
JSON
898 lines
24 KiB
JSON
{
|
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
"title": "Emulator BIOS Profile",
|
|
"description": "One YAML per emulator core or engine, documenting every external file the code loads. Field reference: https://abdess.github.io/retrobios/wiki/profiling/",
|
|
"type": "object",
|
|
"additionalProperties": false,
|
|
"required": [
|
|
"emulator",
|
|
"type"
|
|
],
|
|
"allOf": [
|
|
{
|
|
"comment": "An alias profile points at another profile and carries no files of its own.",
|
|
"if": {
|
|
"properties": {
|
|
"type": {
|
|
"const": "alias"
|
|
}
|
|
},
|
|
"required": [
|
|
"type"
|
|
]
|
|
},
|
|
"then": {
|
|
"required": [
|
|
"alias_of"
|
|
]
|
|
},
|
|
"else": {
|
|
"required": [
|
|
"files"
|
|
]
|
|
}
|
|
},
|
|
{
|
|
"comment": "Per-file mode separates the two builds of a dual profile. A profile with only a standalone build has no libretro side to separate it from, and a file marked standalone there drops out of the gap analysis and of the packs of every platform that lists the emulator without standalone_cores.",
|
|
"if": {
|
|
"properties": {
|
|
"type": {
|
|
"const": "standalone"
|
|
}
|
|
},
|
|
"required": [
|
|
"type"
|
|
]
|
|
},
|
|
"then": {
|
|
"properties": {
|
|
"files": {
|
|
"items": {
|
|
"not": {
|
|
"properties": {
|
|
"mode": {
|
|
"const": "standalone"
|
|
}
|
|
},
|
|
"required": [
|
|
"mode"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
],
|
|
"properties": {
|
|
"emulator": {
|
|
"type": "string"
|
|
},
|
|
"display_name": {
|
|
"type": "string"
|
|
},
|
|
"type": {
|
|
"description": "Operational: resolve_platform_cores() filters on it. Not a classification.",
|
|
"type": "string",
|
|
"enum": [
|
|
"libretro",
|
|
"standalone",
|
|
"standalone + libretro",
|
|
"alias",
|
|
"launcher",
|
|
"game",
|
|
"utility",
|
|
"test"
|
|
]
|
|
},
|
|
"core_classification": {
|
|
"description": "Descriptive only, no effect on tooling.",
|
|
"type": "string",
|
|
"enum": [
|
|
"pure_libretro",
|
|
"official_port",
|
|
"community_fork",
|
|
"frozen_snapshot",
|
|
"enhanced_fork",
|
|
"game_engine",
|
|
"embedded_hle",
|
|
"launcher",
|
|
"alias",
|
|
"other"
|
|
]
|
|
},
|
|
"built_by": {
|
|
"description": "The platforms that ship this build under its core name, compiled by them or installed from the project's own release (Recalbox's mame0278, the GSplus legacy build Recalbox, Batocera and RetroBat run). On those platforms the name resolves to this profile. It is never reached by all_libretro: the libretro buildbot does not publish it.",
|
|
"type": "array",
|
|
"items": {
|
|
"type": "string",
|
|
"minLength": 1
|
|
},
|
|
"minItems": 1,
|
|
"uniqueItems": true
|
|
},
|
|
"source": {
|
|
"type": [
|
|
"string",
|
|
"object"
|
|
]
|
|
},
|
|
"upstream": {
|
|
"type": [
|
|
"string",
|
|
"object",
|
|
"null"
|
|
]
|
|
},
|
|
"source_commit": {
|
|
"oneOf": [
|
|
{
|
|
"type": "string"
|
|
},
|
|
{
|
|
"type": "object"
|
|
}
|
|
],
|
|
"description": "Revision the profile was read at. An object keys it by build mode when the builds live in different repositories."
|
|
},
|
|
"upstream_commit": {
|
|
"oneOf": [
|
|
{
|
|
"type": "string"
|
|
},
|
|
{
|
|
"type": "object"
|
|
}
|
|
],
|
|
"description": "Revision the profile was read at. An object keys it by build mode when the builds live in different repositories."
|
|
},
|
|
"profiled_date": {
|
|
"description": "Quote it: an unquoted YAML date parses to a date object.",
|
|
"type": [
|
|
"string",
|
|
"object"
|
|
]
|
|
},
|
|
"core_version": {
|
|
"type": [
|
|
"string",
|
|
"number",
|
|
"object",
|
|
"null"
|
|
]
|
|
},
|
|
"alias_of": {
|
|
"type": "string"
|
|
},
|
|
"cores": {
|
|
"description": "Upstream names the core is known by. A dict maps each name to per-variant metadata. Names are strings: an unquoted 81 or 2048 parses as a number and stops matching the buildbot name.",
|
|
"oneOf": [
|
|
{
|
|
"type": "array",
|
|
"items": {
|
|
"type": "string",
|
|
"minLength": 1
|
|
},
|
|
"uniqueItems": true
|
|
},
|
|
{
|
|
"type": "object",
|
|
"propertyNames": {
|
|
"minLength": 1
|
|
}
|
|
}
|
|
]
|
|
},
|
|
"systems": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
"mode": {
|
|
"type": "string",
|
|
"enum": [
|
|
"standalone",
|
|
"libretro",
|
|
"both"
|
|
]
|
|
},
|
|
"verification": {
|
|
"type": "string",
|
|
"enum": [
|
|
"existence",
|
|
"md5",
|
|
"sha1",
|
|
"crc32"
|
|
]
|
|
},
|
|
"exclusion_note": {
|
|
"type": "string"
|
|
},
|
|
"analysis": {
|
|
"type": "object"
|
|
},
|
|
"analysis_commit": {
|
|
"type": "string"
|
|
},
|
|
"analysis_date": {
|
|
"type": "string"
|
|
},
|
|
"archive_prefix": {
|
|
"type": "string"
|
|
},
|
|
"author": {
|
|
"type": "string"
|
|
},
|
|
"based_on": {
|
|
"type": "string"
|
|
},
|
|
"bios_directory": {
|
|
"type": "string"
|
|
},
|
|
"bios_identical_to": {
|
|
"type": "string"
|
|
},
|
|
"found_by": {
|
|
"description": "How the code finds the file: by the name it opens, or by content in a folder it scans, the name then being a label. Keyed by build when the libretro and standalone builds differ.",
|
|
"oneOf": [
|
|
{"type": "string", "enum": ["name", "content"]},
|
|
{
|
|
"type": "object",
|
|
"additionalProperties": false,
|
|
"minProperties": 1,
|
|
"properties": {
|
|
"libretro": {"type": "string", "enum": ["name", "content"]},
|
|
"standalone": {"type": "string", "enum": ["name", "content"]}
|
|
}
|
|
}
|
|
]
|
|
},
|
|
"bios_mode": {
|
|
"type": "string"
|
|
},
|
|
"bios_size": {
|
|
"type": "integer",
|
|
"minimum": 0
|
|
},
|
|
"builtin_boot_roms": {
|
|
"type": "object"
|
|
},
|
|
"core": {
|
|
"type": "string"
|
|
},
|
|
"core_name": {
|
|
"type": "string"
|
|
},
|
|
"data_directories": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "object",
|
|
"additionalProperties": false,
|
|
"required": [
|
|
"ref"
|
|
],
|
|
"properties": {
|
|
"ref": {
|
|
"type": "string"
|
|
},
|
|
"destination": {
|
|
"type": "string"
|
|
},
|
|
"mode": {
|
|
"type": "string",
|
|
"enum": [
|
|
"standalone",
|
|
"libretro",
|
|
"both"
|
|
]
|
|
},
|
|
"bundled": {
|
|
"type": "boolean",
|
|
"description": "Installed with the emulator for the build mode names, so packs leave the tree out."
|
|
},
|
|
"installed_on": {
|
|
"type": "array",
|
|
"items": {"type": "string"},
|
|
"description": "Platforms (registry keys) whose own package installs this beside the emulator, so their packs leave it out."
|
|
},
|
|
"not_bundled_on": {
|
|
"type": "array",
|
|
"items": {"type": "string"},
|
|
"description": "Platforms (registry keys) whose package leaves out a file the emulator's release bundles, so their packs bring it."
|
|
},
|
|
"unread_on": {
|
|
"type": "array",
|
|
"items": {"type": "string"},
|
|
"description": "Platforms (registry keys) whose launcher points the emulator at other files, so this entry is never opened there."
|
|
},
|
|
"source_ref": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"dev_flash": {
|
|
"type": "object"
|
|
},
|
|
"dev_flash2": {
|
|
"type": "object"
|
|
},
|
|
"dev_flash3": {
|
|
"type": "object"
|
|
},
|
|
"firmware_titles": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "object"
|
|
}
|
|
},
|
|
"game_count": {
|
|
"type": "integer",
|
|
"minimum": 0
|
|
},
|
|
"logo": {
|
|
"type": "string"
|
|
},
|
|
"machine_directories": {
|
|
"type": "object"
|
|
},
|
|
"machine_properties": {
|
|
"type": "object"
|
|
},
|
|
"mame_version": {
|
|
"type": "string"
|
|
},
|
|
"memory_layout": {
|
|
"type": "object"
|
|
},
|
|
"mlc_structure": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
"model_kickstart_map": {
|
|
"type": "object"
|
|
},
|
|
"note": {
|
|
"type": "string"
|
|
},
|
|
"notes": {
|
|
"type": [
|
|
"string",
|
|
"array",
|
|
"object"
|
|
]
|
|
},
|
|
"pack_structure": {
|
|
"type": "object"
|
|
},
|
|
"platform_details": {
|
|
"type": "object"
|
|
},
|
|
"resources_directory": {
|
|
"type": "string"
|
|
},
|
|
"rom_path": {
|
|
"type": "string"
|
|
},
|
|
"source_ref": {
|
|
"type": "string"
|
|
},
|
|
"valid_bios_crc32": {
|
|
"type": "object"
|
|
},
|
|
"whdload_kickstarts": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
"files": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "object",
|
|
"additionalProperties": false,
|
|
"required": [
|
|
"name"
|
|
],
|
|
"properties": {
|
|
"name": {
|
|
"type": "string"
|
|
},
|
|
"required": {
|
|
"type": "boolean"
|
|
},
|
|
"system": {
|
|
"type": "string"
|
|
},
|
|
"path": {
|
|
"type": [
|
|
"string",
|
|
"null"
|
|
]
|
|
},
|
|
"destination": {
|
|
"type": "string"
|
|
},
|
|
"aliases": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
"archive": {
|
|
"description": "ROM set the file lives in, for arcade entries.",
|
|
"type": "string"
|
|
},
|
|
"category": {
|
|
"type": "string",
|
|
"enum": [
|
|
"bios",
|
|
"game_data",
|
|
"bios_zip"
|
|
]
|
|
},
|
|
"mode": {
|
|
"type": "string",
|
|
"enum": [
|
|
"standalone",
|
|
"libretro",
|
|
"both"
|
|
]
|
|
},
|
|
"storage": {
|
|
"type": "string",
|
|
"enum": [
|
|
"embedded",
|
|
"external",
|
|
"user_provided",
|
|
"large_file",
|
|
"release"
|
|
]
|
|
},
|
|
"hle_fallback": {
|
|
"type": "boolean"
|
|
},
|
|
"adler32_byteswap": {
|
|
"type": "boolean"
|
|
},
|
|
"adler32_pairs_with": {
|
|
"description": "The file hashed together with this one. adler32_pairs lists the combinations the code accepts.",
|
|
"type": "string"
|
|
},
|
|
"adler32_pairs": {
|
|
"description": "Accepted Adler-32 combinations, this file's value first, in the code's table order.",
|
|
"type": "array",
|
|
"items": {
|
|
"type": "array",
|
|
"items": {"type": "string"},
|
|
"minItems": 2,
|
|
"maxItems": 2
|
|
},
|
|
"minItems": 1
|
|
},
|
|
"agnostic": {
|
|
"type": "boolean"
|
|
},
|
|
"bundled": {
|
|
"type": "boolean",
|
|
"description": "Installed with the emulator for the build mode names (all builds when mode is absent): already on the user's machine, so packs and install manifests leave it out."
|
|
},
|
|
"installed_on": {
|
|
"type": "array",
|
|
"items": {"type": "string"},
|
|
"description": "Platforms (registry keys) whose own package installs this beside the emulator, so their packs leave it out."
|
|
},
|
|
"not_bundled_on": {
|
|
"type": "array",
|
|
"items": {"type": "string"},
|
|
"description": "Platforms (registry keys) whose package leaves out a file the emulator's release bundles, so their packs bring it."
|
|
},
|
|
"unread_on": {
|
|
"type": "array",
|
|
"items": {"type": "string"},
|
|
"description": "Platforms (registry keys) whose launcher points the emulator at other files, so this entry is never opened there."
|
|
},
|
|
"config_key": {
|
|
"type": "string"
|
|
},
|
|
"embedded": {
|
|
"type": "boolean"
|
|
},
|
|
"fast_boot": {
|
|
"type": "string"
|
|
},
|
|
"has_builtin": {
|
|
"type": "boolean"
|
|
},
|
|
"found_by": {
|
|
"description": "How the code finds the file: by the name it opens, or by content in a folder it scans, the name then being a label. Keyed by build when the libretro and standalone builds differ.",
|
|
"oneOf": [
|
|
{"type": "string", "enum": ["name", "content"]},
|
|
{
|
|
"type": "object",
|
|
"additionalProperties": false,
|
|
"minProperties": 1,
|
|
"properties": {
|
|
"libretro": {"type": "string", "enum": ["name", "content"]},
|
|
"standalone": {"type": "string", "enum": ["name", "content"]}
|
|
}
|
|
}
|
|
]
|
|
},
|
|
"load_from": {
|
|
"description": "Where the emulator reads the file when not from the system directory, keyed by build when the libretro and standalone builds read it from different places.",
|
|
"oneOf": [
|
|
{
|
|
"type": "string"
|
|
},
|
|
{
|
|
"type": "object",
|
|
"additionalProperties": false,
|
|
"minProperties": 1,
|
|
"properties": {
|
|
"libretro": {
|
|
"type": "string"
|
|
},
|
|
"standalone": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
}
|
|
]
|
|
},
|
|
"priority": {
|
|
"description": "Preference order among the BIOS a system accepts, lowest first. DuckStation's FindBIOSImageInDirectory keeps the image whose priority is lower. A search list the code walks in order maps onto it as 1, 2, 3.",
|
|
"type": "integer",
|
|
"minimum": 0
|
|
},
|
|
"region_check": {
|
|
"type": "boolean"
|
|
},
|
|
"size_note": {
|
|
"type": "string"
|
|
},
|
|
"standalone_path": {
|
|
"type": "string"
|
|
},
|
|
"type": {
|
|
"description": "Set on an entry that names a directory the code reads whole. The entry then stands for every file under path.",
|
|
"type": "string",
|
|
"enum": [
|
|
"directory"
|
|
]
|
|
},
|
|
"variant_group": {
|
|
"type": "string",
|
|
"minLength": 1
|
|
},
|
|
"size": {
|
|
"type": [
|
|
"integer",
|
|
"array",
|
|
"null"
|
|
],
|
|
"minimum": 0,
|
|
"items": {
|
|
"type": "integer",
|
|
"minimum": 0
|
|
},
|
|
"minItems": 1
|
|
},
|
|
"min_size": {
|
|
"type": "integer"
|
|
},
|
|
"max_size": {
|
|
"type": "integer"
|
|
},
|
|
"md5": {
|
|
"oneOf": [
|
|
{
|
|
"type": "null"
|
|
},
|
|
{
|
|
"type": "string",
|
|
"pattern": "^[a-fA-F0-9]{32}$"
|
|
},
|
|
{
|
|
"type": "array",
|
|
"items": {
|
|
"type": "string",
|
|
"pattern": "^[a-fA-F0-9]{32}$"
|
|
}
|
|
}
|
|
]
|
|
},
|
|
"sha1": {
|
|
"oneOf": [
|
|
{
|
|
"type": "string",
|
|
"pattern": "^[a-fA-F0-9]{40}$"
|
|
},
|
|
{
|
|
"type": "array",
|
|
"items": {
|
|
"type": "string",
|
|
"pattern": "^[a-fA-F0-9]{40}$"
|
|
}
|
|
}
|
|
]
|
|
},
|
|
"sha256": {
|
|
"type": "string",
|
|
"pattern": "^[a-fA-F0-9]{64}(,[a-fA-F0-9]{64})*$"
|
|
},
|
|
"crc32": {
|
|
"description": "CRC32 the code accepts, as a list when several dumps pass.",
|
|
"oneOf": [
|
|
{
|
|
"type": "string",
|
|
"pattern": "^[a-fA-F0-9]{8}$"
|
|
},
|
|
{
|
|
"type": "array",
|
|
"items": {
|
|
"type": "string",
|
|
"pattern": "^[a-fA-F0-9]{8}$"
|
|
},
|
|
"minItems": 1
|
|
}
|
|
]
|
|
},
|
|
"known_hash_adler32": {
|
|
"description": "Adler-32 values the code accepts, as a list when several revisions pass.",
|
|
"oneOf": [
|
|
{
|
|
"type": [
|
|
"string",
|
|
"integer"
|
|
]
|
|
},
|
|
{
|
|
"type": "array",
|
|
"items": {
|
|
"type": [
|
|
"string",
|
|
"integer"
|
|
]
|
|
},
|
|
"minItems": 1
|
|
}
|
|
]
|
|
},
|
|
"validation": {
|
|
"description": "Checks the code performs. A dict splits core from upstream when they diverge.",
|
|
"oneOf": [
|
|
{
|
|
"type": "array",
|
|
"items": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
{
|
|
"type": "object"
|
|
}
|
|
]
|
|
},
|
|
"region": {
|
|
"description": "Region the emulator code selects this file for, never the region of the dump.",
|
|
"type": "array",
|
|
"items": {
|
|
"enum": [
|
|
"world",
|
|
"north-america",
|
|
"canada",
|
|
"latin-america",
|
|
"brazil",
|
|
"mexico",
|
|
"argentina",
|
|
"europe",
|
|
"uk",
|
|
"france",
|
|
"germany",
|
|
"italy",
|
|
"spain",
|
|
"netherlands",
|
|
"portugal",
|
|
"greece",
|
|
"poland",
|
|
"russia",
|
|
"sweden",
|
|
"norway",
|
|
"denmark",
|
|
"finland",
|
|
"asia",
|
|
"japan",
|
|
"south-korea",
|
|
"china",
|
|
"taiwan",
|
|
"hong-kong",
|
|
"singapore",
|
|
"india",
|
|
"asia-ntsc",
|
|
"asia-pal",
|
|
"oceania",
|
|
"australia",
|
|
"new-zealand"
|
|
]
|
|
}
|
|
},
|
|
"contents": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "object",
|
|
"additionalProperties": false,
|
|
"required": [
|
|
"name"
|
|
],
|
|
"properties": {
|
|
"name": {
|
|
"type": "string",
|
|
"minLength": 1
|
|
},
|
|
"size": {
|
|
"type": "integer",
|
|
"minimum": 0
|
|
},
|
|
"sha1": {
|
|
"type": "string",
|
|
"pattern": "^[a-fA-F0-9]{40}$"
|
|
},
|
|
"crc32": {
|
|
"type": "string",
|
|
"pattern": "^[a-fA-F0-9]{8}$"
|
|
},
|
|
"description": {
|
|
"type": "string"
|
|
},
|
|
"bad_dump": {
|
|
"type": "boolean"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"source_ref": {
|
|
"description": "A dict splits core from upstream when the two diverge.",
|
|
"type": [
|
|
"string",
|
|
"array",
|
|
"object"
|
|
]
|
|
},
|
|
"description": {
|
|
"type": "string"
|
|
},
|
|
"note": {
|
|
"type": "string"
|
|
},
|
|
"unsourceable": {
|
|
"type": "string"
|
|
},
|
|
"on_mismatch": {
|
|
"description": "What the code does when a declared check fails: reject the file (default) or warn and run with it, for every check or check by check.",
|
|
"oneOf": [
|
|
{
|
|
"enum": [
|
|
"reject",
|
|
"warn"
|
|
]
|
|
},
|
|
{
|
|
"type": "object",
|
|
"minProperties": 1,
|
|
"additionalProperties": false,
|
|
"patternProperties": {
|
|
"^(size|crc32|md5|sha1|sha256|adler32|signature|crypto)$": {
|
|
"enum": [
|
|
"reject",
|
|
"warn"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"allOf": [
|
|
{
|
|
"if": {
|
|
"properties": {
|
|
"name": {
|
|
"pattern": "/$"
|
|
}
|
|
}
|
|
},
|
|
"then": {
|
|
"required": [
|
|
"type"
|
|
]
|
|
}
|
|
},
|
|
{
|
|
"if": {
|
|
"anyOf": [
|
|
{
|
|
"required": [
|
|
"path"
|
|
],
|
|
"properties": {
|
|
"path": {
|
|
"type": "string",
|
|
"pattern": "/$"
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"required": [
|
|
"standalone_path"
|
|
],
|
|
"properties": {
|
|
"standalone_path": {
|
|
"type": "string",
|
|
"pattern": "/$"
|
|
}
|
|
}
|
|
}
|
|
]
|
|
},
|
|
"then": {
|
|
"required": [
|
|
"type"
|
|
]
|
|
}
|
|
},
|
|
{
|
|
"if": {
|
|
"required": [
|
|
"type"
|
|
]
|
|
},
|
|
"then": {
|
|
"properties": {
|
|
"path": {
|
|
"type": "string",
|
|
"pattern": "/$"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"source_branch": {
|
|
"type": "string",
|
|
"description": "Branch the port was read from, when it is not the default one."
|
|
},
|
|
"prose_written_at": {
|
|
"type": "string",
|
|
"pattern": "^[0-9a-f]{40}$",
|
|
"description": "The pin a reader confirmed every prose citation against. When the profile's history shows several pins under one text, profile_sync takes this one as the revision the text describes. It never overrides a single candidate."
|
|
},
|
|
"pin_frozen": {
|
|
"type": "string",
|
|
"description": "Why source_commit is held on purpose rather than followed. The profile is then judged against its own revision, like one pinned to a superseded tag: comparing it to HEAD says nothing and recaling would repoint its refs at code the build it documents never had."
|
|
},
|
|
"version_source": {
|
|
"type": "object",
|
|
"additionalProperties": false,
|
|
"required": ["url", "pattern"],
|
|
"properties": {
|
|
"url": {"type": "string", "format": "uri"},
|
|
"pattern": {"type": "string", "description": "Regular expression whose first group is the latest version the page announces."},
|
|
"no_genuine_copy": {"type": "string", "description": "An announced version a search found only rebuilt or re-signed copies of. While the page announces it, the profile is not stale. A later version makes it stale again."}
|
|
},
|
|
"description": "For a project published outside any forge, the page that announces its releases. profile_sync --check-version compares the version read there with core_version."
|
|
},
|
|
"upstream_gone": {
|
|
"type": "string",
|
|
"description": "Why the declared upstream can no longer be reached, when that is settled rather than transient. Records the death instead of leaving the profile failing every pass. profile_sync reports the contradiction if the forge answers again."
|
|
},
|
|
"source_mirror": {
|
|
"type": "string",
|
|
"description": "Repository carrying the same tree, consulted after source and upstream. The only thing that keeps a profile checkable once its own forge is withdrawn or its host stops resolving."
|
|
}
|
|
}
|
|
}
|